@zerohive/hive-viewer 2.0.0 → 2.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/DocumentViewer.tsx","../src/editors/RichTextEditor.tsx","../src/components/SignatureOverlay.tsx","../src/utils/signature.ts","../src/utils/export.ts","../src/utils/fileSource.ts","../src/utils/sanitize.ts","../src/editors/SpreadsheetEditor.tsx","../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 } from \"../editors/RichTextEditor\";\nimport { SpreadsheetEditor } from \"../editors/SpreadsheetEditor\";\nimport type {\n PptxExportState,\n RichTextExportState,\n SpreadsheetExportState,\n} from \"../internal/exportModels\";\nimport { ImageRenderer } from \"../renderers/ImageRenderer\";\nimport { PdfRenderer } from \"../renderers/PdfRenderer\";\nimport { PptxRenderer } from \"../renderers/PptxRenderer\";\nimport type {\n AnnotationPlacement,\n AnnotationPlacementDraft,\n DocumentSurfaceOverlayState,\n DocumentMode,\n DocumentViewerProps,\n Signature,\n SignatureInkColor,\n SignaturePlacement,\n SupportedFileType,\n} from \"../types\";\nimport {\n exportSignedImageFile,\n exportSignedPdfDocument,\n exportSignedRichTextFile,\n exportSignedSlidesFile,\n exportSignedSpreadsheetFile,\n} from \"../utils/export\";\nimport { defaultLocale } from \"../utils/locale\";\nimport { guessFileType, resolveSource } from \"../utils/fileSource\";\nimport {\n normalizeSignature,\n normalizeSignaturePlacement,\n normalizeSignatureInkColor,\n} from \"../utils/signature\";\nimport { SignaturePanel } from \"./SignaturePanel\";\nimport { ThumbnailsSidebar } from \"./ThumbnailsSidebar\";\nimport { Toolbar } from \"./Toolbar\";\n\nfunction createPlacementId() {\n return `sig-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction createAnnotationId() {\n return `ann-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\ninterface FileModeCapabilities {\n canEdit: boolean;\n canCreate: boolean;\n}\n\nfunction getFileModeCapabilities(fileType: SupportedFileType): FileModeCapabilities {\n switch (fileType) {\n case \"docx\":\n case \"doc\":\n case \"rtf\":\n case \"txt\":\n case \"md\":\n case \"xlsx\":\n case \"xls\":\n case \"csv\":\n return { canEdit: true, canCreate: true };\n default:\n return { canEdit: false, canCreate: false };\n }\n}\n\nfunction getReadableFileTypeLabel(fileType: SupportedFileType) {\n switch (fileType) {\n case \"pdf\":\n return \"PDF\";\n case \"docx\":\n return \"DOCX\";\n case \"doc\":\n return \"DOC\";\n case \"rtf\":\n return \"RTF\";\n case \"txt\":\n return \"TXT\";\n case \"md\":\n return \"Markdown\";\n case \"xlsx\":\n return \"XLSX\";\n case \"xls\":\n return \"XLS\";\n case \"csv\":\n return \"CSV\";\n case \"pptx\":\n return \"PPTX\";\n case \"ppt\":\n return \"PPT\";\n case \"jpg\":\n case \"jpeg\":\n return \"JPEG\";\n case \"png\":\n return \"PNG\";\n case \"gif\":\n return \"GIF\";\n case \"bmp\":\n return \"BMP\";\n case \"svg\":\n return \"SVG\";\n case \"xml\":\n return \"XML\";\n default:\n return String(fileType).toUpperCase();\n }\n}\n\nfunction getReadableModeLabel(mode: Extract<DocumentMode, \"edit\" | \"create\">) {\n return mode === \"edit\" ? \"Edit\" : \"Create\";\n}\n\nfunction getFileNameHint(fileUrl?: string, fileName?: string) {\n if (fileName) {\n return fileName;\n }\n\n if (!fileUrl) {\n return undefined;\n }\n\n try {\n const url = new URL(fileUrl);\n const hintedName = decodeURIComponent(url.pathname.split(\"/\").pop() || \"\");\n return hintedName || undefined;\n } catch {\n return undefined;\n }\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<\"single\" | \"side-by-side\">(\n props.defaultLayout ?? \"single\",\n );\n const [showThumbnails, setShowThumbnails] = useState(\n props.defaultShowThumbnails ?? true,\n );\n const [showHeaderFooterSlots, setShowHeaderFooterSlots] = useState(true);\n const [showSignatures, setShowSignatures] = useState(false);\n const [zoom, setZoom] = useState(1);\n const mainRef = useRef<HTMLElement>(null);\n const zoomStageRef = useRef<HTMLDivElement>(null);\n const exportHeaderRef = useRef<HTMLDivElement>(null);\n const exportFooterRef = useRef<HTMLDivElement>(null);\n const [selectedSignature, setSelectedSignature] = useState<Signature | null>(\n null,\n );\n const [selectedSignatureColor, setSelectedSignatureColor] =\n useState<SignatureInkColor>(\"black\");\n const [isPlacingAnnotation, setIsPlacingAnnotation] = useState(false);\n const [activePlacementId, setActivePlacementId] = useState<string | null>(\n null,\n );\n const [activeAnnotationId, setActiveAnnotationId] = useState<string | null>(\n null,\n );\n\n const [resolved, setResolved] = useState<{\n fileType: SupportedFileType;\n fileName: string;\n url?: string;\n arrayBuffer?: ArrayBuffer;\n cleanup?: () => void;\n } | null>(null);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(\"\");\n const [isSaving, setIsSaving] = useState(false);\n const [pageCount, setPageCount] = useState(1);\n const [currentPage, setCurrentPage] = useState(1);\n const [thumbnails, setThumbnails] = useState<Array<string | undefined>>([]);\n const [richTextExportState, setRichTextExportState] =\n useState<RichTextExportState | null>(null);\n const [spreadsheetExportState, setSpreadsheetExportState] = useState<\n SpreadsheetExportState | null\n >(null);\n const [pptxExportState, setPptxExportState] =\n useState<PptxExportState | null>(null);\n const [internalPlacements, setInternalPlacements] = useState<\n SignaturePlacement[]\n >(props.signaturePlacements ?? []);\n const [internalAnnotations, setInternalAnnotations] = useState<\n AnnotationPlacement[]\n >(props.annotations ?? []);\n const [zoomStageSize, setZoomStageSize] = useState({ width: 0, height: 0 });\n const [mainContentWidth, setMainContentWidth] = useState(0);\n\n const placements = useMemo(\n () =>\n (props.signaturePlacements ?? internalPlacements).map((placement) =>\n normalizeSignaturePlacement(placement),\n ),\n [internalPlacements, props.signaturePlacements],\n );\n const annotations = props.annotations ?? internalAnnotations;\n const availableSignatures = useMemo(\n () => (props.signatures ?? []).map((signature) => normalizeSignature(signature)),\n [props.signatures],\n );\n const sourceNameHint = getFileNameHint(props.fileUrl, props.fileName);\n const requestedFileType = guessFileType(\n sourceNameHint,\n props.fileType,\n props.blob?.type,\n );\n const fileModeCapabilities = getFileModeCapabilities(requestedFileType);\n const isRequestedEditUnsupported =\n mode === \"edit\" && !fileModeCapabilities.canEdit;\n const isRequestedCreateUnsupported =\n mode === \"create\" && !fileModeCapabilities.canCreate;\n const effectiveMode: DocumentMode =\n isRequestedEditUnsupported || isRequestedCreateUnsupported ? \"view\" : mode;\n const hasRenderableSource = Boolean(resolved?.arrayBuffer || resolved?.url);\n const showCreateUnsupportedNotice =\n mode === \"create\" && isRequestedCreateUnsupported;\n const showModeFallbackNotice =\n mode === \"edit\" && isRequestedEditUnsupported;\n const hasIncomingSource = Boolean(props.fileUrl || props.base64 || props.blob);\n const createSupportedFormats =\n \"DOCX, DOC, RTF, TXT, Markdown, XLSX, XLS, and CSV\";\n\n const signingEnabled =\n !props.disableSigning &&\n (props.allowSigning ??\n Boolean(props.onSignRequest || (props.signatures?.length ?? 0) > 0));\n const annotationEnabled =\n !props.disableAnnotations && (props.allowAnnotations ?? true);\n const hasLetterheadTemplate = Boolean(\n props.letterheadTemplate?.header || props.letterheadTemplate?.footer,\n );\n const hasHeaderFooterSlots = Boolean(\n props.headerComponent || props.footerComponent || hasLetterheadTemplate,\n );\n const headerFooterToggleEnabled = Boolean(\n props.enableHeaderFooterToggle && hasHeaderFooterSlots,\n );\n const hasReviewMarks = placements.length > 0 || annotations.length > 0;\n const saveAsPdfByDefault =\n (resolved?.fileType === \"pdf\") ||\n ((props.finalizeSignedDocumentsAsPdf ?? true) && hasReviewMarks);\n const isRichTextAuthoringMode = Boolean(\n resolved &&\n [\"docx\", \"doc\", \"rtf\", \"txt\", \"md\"].includes(resolved.fileType) &&\n effectiveMode !== \"view\",\n );\n const finalizedSignatures = useMemo(() => {\n const seen = new Set<string>();\n return placements.flatMap((placement) => {\n const signature = placement.signature;\n const dedupeKey =\n placement.signatureId ||\n `${signature.signatureImageUrl}:${signature.signedBy || \"\"}:${signature.jobTitle || \"\"}:${signature.dateSigned}`;\n\n if (seen.has(dedupeKey)) {\n return [];\n }\n\n seen.add(dedupeKey);\n return [signature];\n });\n }, [placements]);\n const signatureList = useMemo(\n () =>\n placements.map((placement) => ({\n placementId: placement.id,\n signatureId: placement.signatureId,\n signedBy: placement.signature.signedBy,\n jobTitle: placement.signature.jobTitle,\n dateSigned: placement.signature.dateSigned,\n signatureColor: placement.signatureColor,\n surfaceKind: placement.surfaceKind,\n page: placement.page,\n slide: placement.slide,\n sheetName: placement.sheetName,\n })),\n [placements],\n );\n\n useEffect(() => {\n if (props.signaturePlacements) {\n setInternalPlacements(props.signaturePlacements);\n }\n }, [props.signaturePlacements]);\n\n useEffect(() => {\n if (props.annotations) {\n setInternalAnnotations(props.annotations);\n }\n }, [props.annotations]);\n\n useEffect(() => {\n setShowThumbnails(props.defaultShowThumbnails ?? true);\n }, [props.defaultShowThumbnails]);\n\n useEffect(() => {\n setLayout(props.defaultLayout ?? \"single\");\n }, [props.defaultLayout]);\n\n useEffect(() => {\n if (!signingEnabled) {\n setShowSignatures(false);\n setSelectedSignature(null);\n setActivePlacementId(null);\n }\n }, [signingEnabled]);\n\n useEffect(() => {\n if (!annotationEnabled) {\n setIsPlacingAnnotation(false);\n setActiveAnnotationId(null);\n }\n }, [annotationEnabled]);\n\n useEffect(() => {\n if (!headerFooterToggleEnabled) {\n setShowHeaderFooterSlots(true);\n }\n }, [headerFooterToggleEnabled]);\n\n useEffect(() => {\n let active = true;\n let cleanupSource: (() => void) | undefined;\n\n const loadFile = async () => {\n setLoading(true);\n setError(\"\");\n setResolved(null);\n\n try {\n if (mode === \"create\" && !isRequestedCreateUnsupported) {\n setResolved({\n fileType: requestedFileType,\n fileName: props.fileName ?? `Untitled.${requestedFileType}`,\n });\n } else if (mode === \"create\" && isRequestedCreateUnsupported && !hasIncomingSource) {\n setResolved({\n fileType: requestedFileType,\n fileName: props.fileName ?? `Untitled.${requestedFileType}`,\n });\n } else {\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 (active) {\n cleanupSource = res.cleanup;\n setResolved(res);\n } else {\n res.cleanup?.();\n }\n }\n } catch (err: any) {\n if (active) {\n setError(err.message || \"Failed to load document\");\n }\n } finally {\n if (active) {\n setLoading(false);\n }\n }\n };\n\n loadFile();\n return () => {\n active = false;\n cleanupSource?.();\n };\n }, [\n hasIncomingSource,\n isRequestedCreateUnsupported,\n mode,\n props.base64,\n props.blob,\n props.fileName,\n props.fileType,\n props.fileUrl,\n requestedFileType,\n ]);\n\n useEffect(() => {\n setZoom(1);\n setCurrentPage(1);\n setSelectedSignature(null);\n setSelectedSignatureColor(\"black\");\n setIsPlacingAnnotation(false);\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n setRichTextExportState(null);\n setSpreadsheetExportState(null);\n setPptxExportState(null);\n if (!props.signaturePlacements) {\n setInternalPlacements([]);\n }\n if (!props.annotations) {\n setInternalAnnotations([]);\n }\n }, [mode, props.fileUrl, props.fileName, props.fileType, props.blob, props.base64]);\n\n useEffect(() => {\n const element = zoomStageRef.current;\n if (!element) {\n return;\n }\n\n let frameId = 0;\n\n const measure = () => {\n frameId = 0;\n const nextWidth = Math.max(\n element.scrollWidth,\n element.offsetWidth,\n element.clientWidth,\n 1,\n );\n const nextHeight = Math.max(\n element.scrollHeight,\n element.offsetHeight,\n element.clientHeight,\n 1,\n );\n\n setZoomStageSize((prev) =>\n prev.width === nextWidth && prev.height === nextHeight\n ? prev\n : { width: nextWidth, height: nextHeight },\n );\n };\n\n const scheduleMeasure = () => {\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n frameId = requestAnimationFrame(measure);\n };\n\n scheduleMeasure();\n\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => {\n scheduleMeasure();\n });\n resizeObserver.observe(element);\n }\n\n window.addEventListener(\"resize\", scheduleMeasure);\n\n return () => {\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleMeasure);\n };\n }, [\n currentPage,\n error,\n isRichTextAuthoringMode,\n layout,\n loading,\n pageCount,\n resolved?.fileName,\n resolved?.fileType,\n showSignatures,\n showThumbnails,\n ]);\n\n useEffect(() => {\n const element = mainRef.current;\n if (!element) {\n return;\n }\n\n let frameId = 0;\n\n const measure = () => {\n frameId = 0;\n const nextWidth = Math.max(element.clientWidth, element.offsetWidth, 1);\n setMainContentWidth((prev) => (prev === nextWidth ? prev : nextWidth));\n };\n\n const scheduleMeasure = () => {\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n frameId = requestAnimationFrame(measure);\n };\n\n scheduleMeasure();\n\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => {\n scheduleMeasure();\n });\n resizeObserver.observe(element);\n }\n\n window.addEventListener(\"resize\", scheduleMeasure);\n\n return () => {\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleMeasure);\n };\n }, []);\n\n const zoomShellStyle = useMemo<React.CSSProperties>(\n () => {\n const baseWidth =\n isRichTextAuthoringMode && mainContentWidth > 0\n ? mainContentWidth\n : zoomStageSize.width;\n\n return {\n minWidth: \"100%\",\n width: baseWidth > 0 ? `${Math.round(baseWidth * zoom)}px` : \"100%\",\n minHeight:\n zoomStageSize.height > 0\n ? `${Math.round(zoomStageSize.height * zoom)}px`\n : undefined,\n };\n },\n [isRichTextAuthoringMode, mainContentWidth, zoom, zoomStageSize.height, zoomStageSize.width],\n );\n\n const zoomStageStyle = useMemo<React.CSSProperties>(\n () => {\n const baseWidth =\n isRichTextAuthoringMode && mainContentWidth > 0\n ? mainContentWidth\n : zoomStageSize.width;\n\n return {\n transform: `scale(${zoom})`,\n width: baseWidth > 0 ? `${baseWidth}px` : undefined,\n transformOrigin: isRichTextAuthoringMode ? \"top left\" : \"top center\",\n };\n },\n [isRichTextAuthoringMode, mainContentWidth, zoom, zoomStageSize.width],\n );\n\n const updatePlacements = (updater: SignaturePlacement[] | ((prev: SignaturePlacement[]) => SignaturePlacement[])) => {\n const next =\n typeof updater === \"function\" ? updater(placements) : updater;\n const normalizedNext = next.map((placement) =>\n normalizeSignaturePlacement(placement),\n );\n\n if (!props.signaturePlacements) {\n setInternalPlacements(normalizedNext);\n }\n\n props.onSignaturePlacementsChange?.(normalizedNext);\n };\n\n const updateAnnotations = (\n updater:\n | AnnotationPlacement[]\n | ((prev: AnnotationPlacement[]) => AnnotationPlacement[]),\n ) => {\n const next =\n typeof updater === \"function\" ? updater(annotations) : updater;\n\n if (!props.annotations) {\n setInternalAnnotations(next);\n }\n\n props.onAnnotationsChange?.(next);\n };\n\n const handleSignatureSelect = (signature: Signature) => {\n setSelectedSignature(normalizeSignature(signature));\n setSelectedSignatureColor(\"black\");\n setIsPlacingAnnotation(false);\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n props.onSign?.(normalizeSignature(signature));\n };\n\n const handlePlaceSignature = (placement: {\n signature: Signature;\n signatureColor?: SignatureInkColor;\n surfaceKey: string;\n surfaceKind: SignaturePlacement[\"surfaceKind\"];\n page?: number;\n slide?: number;\n sheetName?: string;\n x: number;\n y: number;\n width: number;\n height: number;\n }) => {\n const nextPlacement: SignaturePlacement = normalizeSignaturePlacement({\n id: createPlacementId(),\n signatureId: placement.signature.id,\n signature: placement.signature,\n signatureColor: placement.signatureColor ?? selectedSignatureColor,\n surfaceKey: placement.surfaceKey,\n surfaceKind: placement.surfaceKind,\n page: placement.page,\n slide: placement.slide,\n sheetName: placement.sheetName,\n x: placement.x,\n y: placement.y,\n width: placement.width,\n height: placement.height,\n });\n\n updatePlacements((prev) => [...prev, nextPlacement]);\n setSelectedSignature(null);\n setSelectedSignatureColor(\"black\");\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n };\n\n const handlePlaceAnnotation = (annotation: AnnotationPlacementDraft) => {\n const nextAnnotation: AnnotationPlacement = {\n id: createAnnotationId(),\n ...annotation,\n };\n\n updateAnnotations((prev) => [...prev, nextAnnotation]);\n setIsPlacingAnnotation(false);\n setSelectedSignature(null);\n setActivePlacementId(null);\n setActiveAnnotationId(nextAnnotation.id);\n };\n\n const handleUpdatePlacement = (\n id: string,\n patch: Partial<\n Pick<SignaturePlacement, \"x\" | \"y\" | \"width\" | \"height\" | \"signatureColor\">\n >,\n ) => {\n updatePlacements((prev) =>\n prev.map((placement) =>\n placement.id === id\n ? normalizeSignaturePlacement({\n ...placement,\n ...patch,\n signatureColor: patch.signatureColor\n ? normalizeSignatureInkColor(patch.signatureColor)\n : placement.signatureColor,\n })\n : placement,\n ),\n );\n };\n\n const handleRemovePlacement = (id: string) => {\n updatePlacements((prev) => prev.filter((placement) => placement.id !== id));\n if (activePlacementId === id) {\n setActivePlacementId(null);\n }\n };\n\n const handleUpdateAnnotation = (\n id: string,\n patch: Partial<\n Pick<AnnotationPlacement, \"x\" | \"y\" | \"width\" | \"height\" | \"text\">\n >,\n ) => {\n updateAnnotations((prev) =>\n prev.map((annotation) =>\n annotation.id === id ? { ...annotation, ...patch } : annotation,\n ),\n );\n };\n\n const handleRemoveAnnotation = (id: string) => {\n updateAnnotations((prev) =>\n prev.filter((annotation) => annotation.id !== id),\n );\n if (activeAnnotationId === id) {\n setActiveAnnotationId(null);\n }\n };\n\n const signatureOverlayProps: DocumentSurfaceOverlayState = {\n placements,\n annotations,\n pendingSignature: selectedSignature,\n pendingAnnotation: isPlacingAnnotation,\n activePlacementId,\n activeAnnotationId,\n placeHint: locale[\"signatures.placeHint\"],\n annotationHint: locale[\"annotations.placeHint\"],\n annotationPlaceholder: locale[\"annotations.placeholder\"],\n signatureAltLabel: locale[\"signatures.alt\"],\n signatureAltByLabel: locale[\"signatures.altBy\"],\n signatureNoteIndicatorLabel: locale[\"signatures.noteIndicator\"],\n signatureColorLabel: locale[\"signatures.color\"],\n signatureColorNames: {\n black: locale[\"signatures.color.black\"],\n blue: locale[\"signatures.color.blue\"],\n red: locale[\"signatures.color.red\"],\n green: locale[\"signatures.color.green\"],\n },\n removeSignatureLabel: locale[\"signatures.remove\"],\n annotationTitle: locale[\"annotations.title\"],\n linkedAnnotationTitle: locale[\"annotations.linkedTitle\"],\n linkedAnnotationBadge: locale[\"annotations.linkedBadge\"],\n openAnnotationLabel: locale[\"annotations.open\"],\n removeAnnotationLabel: locale[\"annotations.remove\"],\n onPlaceSignature: handlePlaceSignature,\n onPlaceAnnotation: handlePlaceAnnotation,\n onUpdatePlacement: handleUpdatePlacement,\n onUpdateAnnotation: handleUpdateAnnotation,\n onRemovePlacement: handleRemovePlacement,\n onRemoveAnnotation: handleRemoveAnnotation,\n onSelectPlacement: (id) => {\n setActivePlacementId(id);\n if (id) {\n setActiveAnnotationId(null);\n }\n },\n onSelectAnnotation: (id) => {\n setActiveAnnotationId(id);\n if (id) {\n setActivePlacementId(null);\n }\n },\n };\n\n const saveReady = useMemo(() => {\n if (!resolved) {\n return false;\n }\n\n if (showCreateUnsupportedNotice) {\n return false;\n }\n\n switch (resolved.fileType) {\n case \"docx\":\n case \"doc\":\n case \"rtf\":\n case \"txt\":\n case \"md\":\n return effectiveMode === \"view\"\n ? Boolean(\n (richTextExportState?.pages?.length ?? 0) > 0 ||\n richTextExportState?.container,\n )\n : Boolean(richTextExportState?.container);\n case \"xlsx\":\n case \"xls\":\n case \"csv\":\n return Boolean(spreadsheetExportState);\n case \"pptx\":\n case \"ppt\":\n return Boolean(pptxExportState);\n default:\n return true;\n }\n }, [\n effectiveMode,\n pptxExportState,\n resolved,\n richTextExportState,\n showCreateUnsupportedNotice,\n spreadsheetExportState,\n ]);\n\n const saveEnabled =\n Boolean(props.onSave) && Boolean(resolved) && !loading && saveReady;\n const exportLabels = useMemo(\n () => ({\n annotationTitle: locale[\"annotations.title\"],\n linkedAnnotationTitle: locale[\"annotations.linkedTitle\"],\n linkedAnnotationBadge: locale[\"annotations.linkedBadge\"],\n annotationAltLabel: locale[\"annotations.title\"],\n linkedAnnotationAltLabel: locale[\"annotations.linkedTitle\"],\n }),\n [locale],\n );\n\n const emitSave = (\n base64: string,\n meta: {\n fileName: string;\n fileType: SupportedFileType;\n exportedAsPdf?: boolean;\n },\n ) => {\n props.onSave?.(base64, {\n fileName: meta.fileName,\n fileType: meta.fileType,\n exportedAsPdf: meta.exportedAsPdf ?? meta.fileType === \"pdf\",\n annotations,\n signaturePlacements: placements,\n signatures: finalizedSignatures,\n signatureList,\n });\n };\n\n const handleSaveAction = async (exportAsPdf: boolean) => {\n if (!resolved || !props.onSave || isSaving) {\n return;\n }\n\n setError(\"\");\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n setIsSaving(true);\n\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n\n try {\n const saveAsPdf = exportAsPdf || saveAsPdfByDefault;\n const pageDecorations =\n showHeaderFooterSlots && hasHeaderFooterSlots\n ? {\n headerElement: exportHeaderRef.current,\n footerElement: exportFooterRef.current,\n letterheadTemplate: props.letterheadTemplate,\n }\n : undefined;\n\n switch (resolved.fileType) {\n case \"pdf\": {\n const exported = await exportSignedPdfDocument({\n arrayBuffer: resolved.arrayBuffer,\n url: resolved.url,\n fileName: resolved.fileName,\n placements,\n annotations,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: true,\n });\n break;\n }\n case \"docx\":\n case \"doc\":\n case \"rtf\":\n case \"txt\":\n case \"md\": {\n const exported = await exportSignedRichTextFile({\n container: richTextExportState?.container ?? null,\n pages: richTextExportState?.pages,\n fileName: resolved.fileName,\n placements,\n annotations,\n asPdf: saveAsPdf,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: saveAsPdf,\n });\n break;\n }\n case \"xlsx\":\n case \"xls\":\n case \"csv\": {\n const exported = await exportSignedSpreadsheetFile({\n exportState: spreadsheetExportState,\n fileName: resolved.fileName,\n placements,\n annotations,\n asPdf: saveAsPdf,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: saveAsPdf,\n });\n break;\n }\n case \"pptx\":\n case \"ppt\": {\n const exported = await exportSignedSlidesFile({\n exportState: pptxExportState,\n fileName: resolved.fileName,\n placements,\n annotations,\n asPdf: saveAsPdf,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: saveAsPdf,\n });\n break;\n }\n case \"jpg\":\n case \"jpeg\":\n case \"png\":\n case \"gif\":\n case \"bmp\":\n case \"svg\": {\n if (!resolved.arrayBuffer) {\n throw new Error(\"The image source is not ready for export.\");\n }\n\n const exported = await exportSignedImageFile({\n arrayBuffer: resolved.arrayBuffer,\n fileType: resolved.fileType,\n fileName: resolved.fileName,\n placements,\n annotations,\n asPdf: saveAsPdf,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: saveAsPdf,\n });\n break;\n }\n default:\n throw new Error(`Saving is not available for ${resolved.fileType}.`);\n }\n } catch (err: any) {\n console.error(\"Save/export failed\", err);\n setError(err?.message || \"Failed to save the document\");\n } finally {\n setIsSaving(false);\n }\n };\n\n const renderContent = () => {\n if (error) {\n return (\n <div className=\"hv-error-banner\">\n <strong>{locale[\"error.title\"]}</strong>\n <p>{error}</p>\n </div>\n );\n }\n\n if (loading || !resolved) {\n return (\n <div className=\"hv-loader\">\n <div className=\"hv-spinner\" />\n <span>{locale.loading}</span>\n </div>\n );\n }\n\n const renderCapabilityNotice = (\n title: string,\n description: string,\n variant: \"info\" | \"warning\" = \"info\",\n ) => (\n <div className={`hv-info-banner${variant === \"warning\" ? \" warning\" : \"\"}`}>\n <strong>{title}</strong>\n <p>{description}</p>\n </div>\n );\n\n const shouldShowModeAdjustedNotice =\n showModeFallbackNotice || (showCreateUnsupportedNotice && hasRenderableSource);\n const modeAdjustedNotice = shouldShowModeAdjustedNotice\n ? renderCapabilityNotice(\n locale[\"documents.modeFallbackTitle\"],\n locale[\"documents.modeFallbackDescription\"]\n .replace(\n \"{mode}\",\n getReadableModeLabel(showModeFallbackNotice ? \"edit\" : \"create\"),\n )\n .replace(\"{fileType}\", getReadableFileTypeLabel(resolved.fileType)),\n )\n : null;\n\n if (showCreateUnsupportedNotice && !hasRenderableSource) {\n return (\n <div className=\"hv-page-container\" style={{ padding: \"32px\" }}>\n {renderCapabilityNotice(\n locale[\"documents.createUnsupportedTitle\"],\n locale[\"documents.createUnsupportedDescription\"].replace(\n \"{formats}\",\n createSupportedFormats,\n ),\n \"warning\",\n )}\n </div>\n );\n }\n\n const commonProps = {\n arrayBuffer: resolved.arrayBuffer,\n fileName: resolved.fileName,\n fileType: resolved.fileType,\n layout,\n currentPage,\n onPageCount: setPageCount,\n onCurrentPageChange: setCurrentPage,\n onThumbs: setThumbnails,\n signatureOverlay: signatureOverlayProps,\n locale,\n };\n\n switch (resolved.fileType) {\n case \"pdf\":\n return (\n <>\n {modeAdjustedNotice}\n <PdfRenderer\n url={resolved.url}\n workerSrc={props.pdfWorkerSrc}\n {...commonProps}\n />\n </>\n );\n case \"docx\":\n case \"doc\":\n case \"rtf\":\n case \"txt\":\n case \"md\":\n return (\n <>\n {modeAdjustedNotice}\n <RichTextEditor\n mode={effectiveMode}\n onExportStateChange={setRichTextExportState}\n {...commonProps}\n />\n </>\n );\n case \"xlsx\":\n case \"csv\":\n case \"xls\":\n return (\n <>\n {modeAdjustedNotice}\n <SpreadsheetEditor\n mode={effectiveMode}\n onExportStateChange={setSpreadsheetExportState}\n {...commonProps}\n />\n </>\n );\n case \"pptx\":\n case \"ppt\":\n return (\n <>\n {modeAdjustedNotice}\n <PptxRenderer\n onExportStateChange={setPptxExportState}\n {...commonProps}\n />\n </>\n );\n case \"jpg\":\n case \"jpeg\":\n case \"png\":\n case \"gif\":\n case \"bmp\":\n case \"svg\":\n return (\n <>\n {modeAdjustedNotice}\n <ImageRenderer {...commonProps} fileType={resolved.fileType} />\n </>\n );\n default:\n return (\n <div className=\"hv-error-banner\">\n {locale[\"documents.unsupportedFileType\"]}: {resolved.fileType}\n </div>\n );\n }\n };\n\n return (\n <div className=\"hv-root\" data-hv-theme={theme}>\n <Toolbar\n fileName={resolved?.fileName}\n pageCount={pageCount}\n currentPage={currentPage}\n onPageChange={setCurrentPage}\n showHeaderFooterToggle={headerFooterToggleEnabled}\n headerFooterVisible={showHeaderFooterSlots}\n onToggleHeaderFooter={() => setShowHeaderFooterSlots((prev) => !prev)}\n layout={layout}\n onLayoutChange={setLayout}\n showThumbnails={showThumbnails}\n onToggleThumbnails={() => setShowThumbnails((prev) => !prev)}\n showSignatures={showSignatures}\n onToggleSignatures={() => setShowSignatures((prev) => !prev)}\n signingEnabled={signingEnabled}\n annotationEnabled={annotationEnabled}\n annotationMode={isPlacingAnnotation}\n onToggleAnnotationMode={() => {\n if (!annotationEnabled) {\n return;\n }\n\n setIsPlacingAnnotation((prev) => {\n const next = !prev;\n if (next) {\n setSelectedSignature(null);\n setShowSignatures(false);\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n }\n return next;\n });\n }}\n zoom={zoom}\n onZoomIn={() =>\n setZoom((prev) => Math.min(2, Number((prev + 0.1).toFixed(2))))\n }\n onZoomOut={() =>\n setZoom((prev) => Math.max(0.5, Number((prev - 0.1).toFixed(2))))\n }\n onZoomReset={() => setZoom(1)}\n saveEnabled={saveEnabled}\n isSaving={isSaving}\n onSave={() => void handleSaveAction(false)}\n onExportPdf={() => void handleSaveAction(true)}\n showExportPdfAction={!saveAsPdfByDefault}\n saveLabel={saveAsPdfByDefault ? locale[\"toolbar.finalizePdf\"] : locale[\"toolbar.save\"]}\n locale={locale}\n />\n\n {(props.headerComponent || props.footerComponent) && (\n <div className=\"hv-export-slot-host\" aria-hidden=\"true\">\n {props.headerComponent && (\n <div\n ref={exportHeaderRef}\n className=\"hv-export-slot hv-export-slot-header\"\n >\n {props.headerComponent}\n </div>\n )}\n {props.footerComponent && (\n <div\n ref={exportFooterRef}\n className=\"hv-export-slot hv-export-slot-footer\"\n >\n {props.footerComponent}\n </div>\n )}\n </div>\n )}\n\n <div className=\"hv-shell\">\n <ThumbnailsSidebar\n isOpen={showThumbnails}\n thumbnails={thumbnails}\n currentPage={currentPage}\n onSelectPage={setCurrentPage}\n locale={locale}\n />\n\n <main\n ref={mainRef}\n className={`hv-main${isRichTextAuthoringMode ? \" hv-main-richtext-authoring\" : \"\"}`}\n >\n <div className=\"hv-zoom-shell\" style={zoomShellStyle}>\n <div ref={zoomStageRef} className=\"hv-zoom-stage\" style={zoomStageStyle}>\n {renderContent()}\n </div>\n </div>\n </main>\n\n {signingEnabled && (\n <SignaturePanel\n isOpen={showSignatures}\n onClose={() => setShowSignatures(false)}\n onSelectSignature={handleSignatureSelect}\n selectedSignature={selectedSignature}\n selectedColor={selectedSignatureColor}\n onSelectedColorChange={setSelectedSignatureColor}\n onClearSelection={() => {\n setSelectedSignature(null);\n setSelectedSignatureColor(\"black\");\n }}\n externalSignatures={availableSignatures}\n onSignRequest={props.onSignRequest}\n locale={locale}\n />\n )}\n </div>\n\n </div>\n );\n}\n","\"use client\";\n\nimport mammoth from \"mammoth\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport MarkdownIt from \"markdown-it\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type {\n RichTextExportState,\n RichTextPageRenderModel,\n} from \"../internal/exportModels\";\nimport type {\n DocumentSurfaceOverlayState,\n DocumentMode,\n SupportedFileType,\n} from \"../types\";\nimport { captureElementCanvas } from \"../utils/export\";\nimport { sanitizeHtml } from \"../utils/sanitize\";\n\nconst DOC_PAGE_WIDTH = 816;\nconst DOC_PAGE_HEIGHT = 1056;\nconst PAGE_RENDER_SCALE = 2;\nconst PAGE_BREAK_MIN_FILL = 0.55;\nconst DOCX_PREVIEW_CLASS_NAME = \"hv-docx-page\";\n\ninterface RichTextEditorProps {\n mode: DocumentMode;\n arrayBuffer?: ArrayBuffer;\n fileName: string;\n fileType?: SupportedFileType;\n locale: Record<string, string>;\n layout: \"single\" | \"side-by-side\";\n currentPage: number;\n onPageCount: (n: number) => void;\n onCurrentPageChange: (p: number) => void;\n onThumbs: (thumbs: Array<string | undefined>) => void;\n onExportStateChange?: (state: RichTextExportState | null) => void;\n signatureOverlay: DocumentSurfaceOverlayState;\n}\n\nfunction createCanvas(width: number, height: number) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(width));\n canvas.height = Math.max(1, Math.round(height));\n return canvas;\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nfunction buildPlainTextHtml(text: string) {\n const normalized = text.replace(/\\r\\n/g, \"\\n\").trim();\n if (!normalized) {\n return '<article class=\"hv-plain-text-doc\"><p></p></article>';\n }\n\n const blocks = normalized.split(/\\n{2,}/).map((block) => block.trim()).filter(Boolean);\n const htmlBlocks = blocks.map((block) => {\n const lines = block.split(\"\\n\").map((line) => line.trimEnd());\n const nonEmptyLines = lines.filter((line) => line.trim().length > 0);\n\n if (\n nonEmptyLines.length > 0\n && nonEmptyLines.every((line) => /^[-*•]\\s+/.test(line))\n ) {\n const items = nonEmptyLines\n .map((line) => line.replace(/^[-*•]\\s+/, \"\"))\n .map((line) => `<li>${escapeHtml(line)}</li>`)\n .join(\"\");\n return `<ul>${items}</ul>`;\n }\n\n if (\n nonEmptyLines.length > 0\n && nonEmptyLines.every((line) => /^\\d+[.)]\\s+/.test(line))\n ) {\n const items = nonEmptyLines\n .map((line) => line.replace(/^\\d+[.)]\\s+/, \"\"))\n .map((line) => `<li>${escapeHtml(line)}</li>`)\n .join(\"\");\n return `<ol>${items}</ol>`;\n }\n\n return `<p>${lines.map((line) => escapeHtml(line)).join(\"<br />\")}</p>`;\n });\n\n return `<article class=\"hv-plain-text-doc\">${htmlBlocks.join(\"\")}</article>`;\n}\n\nasync function waitForContainerImages(container: HTMLElement) {\n const images = Array.from(container.querySelectorAll(\"img\"));\n\n await Promise.all(\n images.map(\n (image) =>\n new Promise<void>((resolve) => {\n if (image.complete) {\n resolve();\n return;\n }\n\n image.addEventListener(\"load\", () => resolve(), { once: true });\n image.addEventListener(\"error\", () => resolve(), { once: true });\n }),\n ),\n );\n}\n\nasync function waitForRenderReady(container: HTMLElement) {\n await waitForContainerImages(container);\n\n if (typeof document !== \"undefined\" && \"fonts\" in document) {\n try {\n await (document as Document & { fonts?: { ready?: Promise<unknown> } }).fonts?.ready;\n } catch {\n // Continue even if font loading information is unavailable.\n }\n }\n\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => resolve());\n });\n });\n}\n\nfunction calculatePageBreakOffsets(container: HTMLElement, pageHeight: number) {\n const totalHeight = Math.max(container.scrollHeight, pageHeight);\n const blocks = Array.from(container.children)\n .flatMap((node) => (node instanceof HTMLElement ? [node] : []))\n .map((node) => ({\n top: node.offsetTop,\n bottom: node.offsetTop + node.offsetHeight,\n }))\n .filter((block) => block.bottom > block.top)\n .sort((left, right) => left.top - right.top);\n\n const offsets: number[] = [];\n let cursor = 0;\n\n while (cursor < totalHeight) {\n const target = cursor + pageHeight;\n\n if (target >= totalHeight) {\n offsets.push(totalHeight);\n break;\n }\n\n const candidate = blocks\n .filter(\n (block) =>\n block.bottom > cursor + pageHeight * PAGE_BREAK_MIN_FILL &&\n block.bottom <= target,\n )\n .map((block) => block.bottom)\n .pop();\n\n const nextOffset =\n candidate && candidate > cursor + pageHeight * 0.35 ? candidate : target;\n\n offsets.push(nextOffset);\n cursor = nextOffset;\n }\n\n return offsets.length > 0 ? offsets : [pageHeight];\n}\n\nfunction createThumbnailDataUrl(canvas: HTMLCanvasElement) {\n const thumbWidth = 160;\n const thumbScale = thumbWidth / canvas.width;\n const thumbCanvas = createCanvas(thumbWidth, canvas.height * thumbScale);\n const thumbCtx = thumbCanvas.getContext(\"2d\");\n\n if (thumbCtx) {\n thumbCtx.fillStyle = \"#ffffff\";\n thumbCtx.fillRect(0, 0, thumbCanvas.width, thumbCanvas.height);\n thumbCtx.drawImage(canvas, 0, 0, thumbCanvas.width, thumbCanvas.height);\n }\n\n return thumbCanvas.toDataURL(\"image/png\");\n}\n\nfunction buildPageModels(\n sourceCanvas: HTMLCanvasElement,\n breakOffsets: number[],\n) {\n const scale = sourceCanvas.width / DOC_PAGE_WIDTH;\n const pageCanvasWidth = DOC_PAGE_WIDTH * scale;\n const pageCanvasHeight = DOC_PAGE_HEIGHT * scale;\n const pages: RichTextPageRenderModel[] = [];\n let previousOffset = 0;\n\n for (const [index, endOffset] of breakOffsets.entries()) {\n const sourceY = previousOffset * scale;\n const sourceHeight = Math.max((endOffset - previousOffset) * scale, 1);\n const pageCanvas = createCanvas(pageCanvasWidth, pageCanvasHeight);\n const pageCtx = pageCanvas.getContext(\"2d\");\n\n if (!pageCtx) {\n previousOffset = endOffset;\n continue;\n }\n\n pageCtx.fillStyle = \"#ffffff\";\n pageCtx.fillRect(0, 0, pageCanvas.width, pageCanvas.height);\n pageCtx.drawImage(\n sourceCanvas,\n 0,\n sourceY,\n sourceCanvas.width,\n sourceHeight,\n 0,\n 0,\n pageCanvas.width,\n sourceHeight,\n );\n\n pages.push({\n pageNumber: index + 1,\n surfaceKey: `document-page:${index + 1}`,\n imageUrl: pageCanvas.toDataURL(\"image/png\"),\n thumbnailUrl: createThumbnailDataUrl(pageCanvas),\n width: pageCanvas.width,\n height: pageCanvas.height,\n });\n previousOffset = endOffset;\n }\n\n if (pages.length === 0) {\n const blankCanvas = createCanvas(\n DOC_PAGE_WIDTH * PAGE_RENDER_SCALE,\n DOC_PAGE_HEIGHT * PAGE_RENDER_SCALE,\n );\n const blankCtx = blankCanvas.getContext(\"2d\");\n if (blankCtx) {\n blankCtx.fillStyle = \"#ffffff\";\n blankCtx.fillRect(0, 0, blankCanvas.width, blankCanvas.height);\n }\n\n return [{\n pageNumber: 1,\n surfaceKey: \"document-page:1\",\n imageUrl: blankCanvas.toDataURL(\"image/png\"),\n thumbnailUrl: blankCanvas.toDataURL(\"image/png\"),\n width: blankCanvas.width,\n height: blankCanvas.height,\n }];\n }\n\n return pages;\n}\n\nasync function captureDocxPageModel(\n pageElement: HTMLElement,\n pageNumber: number,\n): Promise<RichTextPageRenderModel> {\n const originalBoxShadow = pageElement.style.boxShadow;\n const originalMargin = pageElement.style.margin;\n const originalTransform = pageElement.style.transform;\n const width = Math.max(\n Math.round(pageElement.scrollWidth),\n Math.round(pageElement.getBoundingClientRect().width),\n 1,\n );\n const height = Math.max(\n Math.round(pageElement.scrollHeight),\n Math.round(pageElement.getBoundingClientRect().height),\n 1,\n );\n\n pageElement.style.boxShadow = \"none\";\n pageElement.style.margin = \"0\";\n pageElement.style.transform = \"none\";\n\n try {\n const pageCanvas = await captureElementCanvas(pageElement, {\n backgroundColor: \"#ffffff\",\n scale: PAGE_RENDER_SCALE,\n sanitizeStyles: false,\n ignoreElements: (element) =>\n element instanceof HTMLElement &&\n (\n element.closest(\".hv-signature-overlay\") !== null\n || element.closest('[data-hv-source-class~=\"hv-signature-overlay\"]') !== null\n ),\n });\n\n if (!pageCanvas) {\n throw new Error(\"Unable to capture the DOCX page surface.\");\n }\n\n return {\n pageNumber,\n surfaceKey: `document-page:${pageNumber}`,\n imageUrl: pageCanvas.toDataURL(\"image/png\"),\n thumbnailUrl: createThumbnailDataUrl(pageCanvas),\n width: pageCanvas.width,\n height: pageCanvas.height,\n };\n } finally {\n pageElement.style.boxShadow = originalBoxShadow;\n pageElement.style.margin = originalMargin;\n pageElement.style.transform = originalTransform;\n }\n}\n\nfunction getPagesToShow(\n totalPages: number,\n currentPage: number,\n layout: \"single\" | \"side-by-side\",\n) {\n if (totalPages === 0) {\n return [];\n }\n\n const validPage = Math.max(1, Math.min(currentPage, totalPages));\n\n if (layout === \"side-by-side\" && totalPages > 1) {\n if (validPage === 1) {\n return [1];\n }\n\n const left = validPage % 2 === 0 ? validPage : validPage - 1;\n return [left, left + 1].filter((pageNumber) => pageNumber <= totalPages);\n }\n\n return [validPage];\n}\n\ninterface AuthoringTemplate {\n id: string;\n labelKey: string;\n descriptionKey: string;\n html: string;\n}\n\ninterface RichTextToolbarState {\n blockTag: \"p\" | \"h1\" | \"h2\" | \"h3\" | \"blockquote\";\n bold: boolean;\n italic: boolean;\n underline: boolean;\n unorderedList: boolean;\n orderedList: boolean;\n align: \"left\" | \"center\" | \"right\";\n insideTable: boolean;\n hasSelectedImage: boolean;\n imageSrc: string;\n imageAlt: string;\n imageSize: \"sm\" | \"md\" | \"lg\" | \"full\";\n imageCrop: \"original\" | \"wide\" | \"square\" | \"portrait\";\n imageAlign: \"left\" | \"center\" | \"right\";\n imageScale: number;\n imageFocusX: number;\n imageFocusY: number;\n}\n\nfunction createDefaultToolbarState(): RichTextToolbarState {\n return {\n blockTag: \"p\",\n bold: false,\n italic: false,\n underline: false,\n unorderedList: false,\n orderedList: false,\n align: \"left\",\n insideTable: false,\n hasSelectedImage: false,\n imageSrc: \"\",\n imageAlt: \"\",\n imageSize: \"md\",\n imageCrop: \"original\",\n imageAlign: \"center\",\n imageScale: 1,\n imageFocusX: 50,\n imageFocusY: 50,\n };\n}\n\nfunction getClosestEditorElement(node: Node | null, editor: HTMLElement) {\n let current =\n node instanceof HTMLElement\n ? node\n : node instanceof Text\n ? node.parentElement\n : null;\n\n while (current && current !== editor) {\n if (/^(P|H1|H2|H3|BLOCKQUOTE)$/i.test(current.tagName)) {\n return current;\n }\n current = current.parentElement;\n }\n\n return null;\n}\n\nfunction getSelectionHostElement(\n editor: HTMLElement,\n fallbackRange?: Range | null,\n) {\n const selection = typeof window !== \"undefined\" ? window.getSelection() : null;\n const selectionNode = selection?.anchorNode ?? fallbackRange?.startContainer ?? null;\n const hostElement =\n selectionNode instanceof HTMLElement\n ? selectionNode\n : selectionNode instanceof Text\n ? selectionNode.parentElement\n : null;\n\n return hostElement && editor.contains(hostElement) ? hostElement : null;\n}\n\nfunction getSelectedTableCell(editor: HTMLElement, fallbackRange?: Range | null) {\n const hostElement = getSelectionHostElement(editor, fallbackRange);\n return hostElement?.closest(\"td, th\") as HTMLTableCellElement | null;\n}\n\nfunction getSelectedImageFigure(editor: HTMLElement, fallbackRange?: Range | null) {\n const hostElement = getSelectionHostElement(editor, fallbackRange);\n return hostElement?.closest(\"figure.hv-inline-image\") as HTMLElement | null;\n}\n\nfunction getImageSizePreset(figure?: Element | null) {\n if (!figure) {\n return \"md\" as const;\n }\n\n if (figure.classList.contains(\"size-sm\")) {\n return \"sm\" as const;\n }\n if (figure.classList.contains(\"size-lg\")) {\n return \"lg\" as const;\n }\n if (figure.classList.contains(\"size-full\")) {\n return \"full\" as const;\n }\n return \"md\" as const;\n}\n\nfunction getImageCropPreset(figure?: Element | null) {\n if (!figure) {\n return \"original\" as const;\n }\n\n if (figure.classList.contains(\"crop-wide\")) {\n return \"wide\" as const;\n }\n if (figure.classList.contains(\"crop-square\")) {\n return \"square\" as const;\n }\n if (figure.classList.contains(\"crop-portrait\")) {\n return \"portrait\" as const;\n }\n return \"original\" as const;\n}\n\nfunction getImageAlignPreset(figure?: Element | null) {\n if (!figure) {\n return \"center\" as const;\n }\n\n if (figure.classList.contains(\"align-left\")) {\n return \"left\" as const;\n }\n if (figure.classList.contains(\"align-right\")) {\n return \"right\" as const;\n }\n return \"center\" as const;\n}\n\nfunction getImageNumericStyle(figure: HTMLElement | null | undefined, key: string, fallback: number) {\n if (!figure) {\n return fallback;\n }\n\n const raw = figure.style.getPropertyValue(key).trim().replace(\"%\", \"\");\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction readToolbarState(\n editor: HTMLElement,\n fallbackRange?: Range | null,\n): RichTextToolbarState {\n if (typeof document === \"undefined\") {\n return createDefaultToolbarState();\n }\n\n const hostElement = getSelectionHostElement(editor, fallbackRange);\n const blockElement = hostElement\n ? getClosestEditorElement(hostElement, editor)\n : null;\n const selectedImageFigure = getSelectedImageFigure(editor, fallbackRange);\n const selectedImage = selectedImageFigure?.querySelector(\"img\");\n\n const blockTag = (blockElement?.tagName.toLowerCase() ??\n \"p\") as RichTextToolbarState[\"blockTag\"];\n\n const isCommandActive = (command: string) => {\n try {\n return document.queryCommandState(command);\n } catch {\n return false;\n }\n };\n\n return {\n blockTag,\n bold: isCommandActive(\"bold\"),\n italic: isCommandActive(\"italic\"),\n underline: isCommandActive(\"underline\"),\n unorderedList: isCommandActive(\"insertUnorderedList\"),\n orderedList: isCommandActive(\"insertOrderedList\"),\n align: isCommandActive(\"justifyCenter\")\n ? \"center\"\n : isCommandActive(\"justifyRight\")\n ? \"right\"\n : \"left\",\n insideTable: Boolean(getSelectedTableCell(editor, fallbackRange)),\n hasSelectedImage: Boolean(selectedImageFigure),\n imageSrc: selectedImage instanceof HTMLImageElement ? selectedImage.src : \"\",\n imageAlt: selectedImage instanceof HTMLImageElement ? selectedImage.alt : \"\",\n imageSize: getImageSizePreset(selectedImageFigure),\n imageCrop: getImageCropPreset(selectedImageFigure),\n imageAlign: getImageAlignPreset(selectedImageFigure),\n imageScale: getImageNumericStyle(selectedImageFigure, \"--hv-image-scale\", 1),\n imageFocusX: getImageNumericStyle(selectedImageFigure, \"--hv-image-focus-x\", 50),\n imageFocusY: getImageNumericStyle(selectedImageFigure, \"--hv-image-focus-y\", 50),\n };\n}\n\nfunction normalizeLinkTarget(value: string) {\n const trimmed = value.trim();\n if (!trimmed) {\n return \"\";\n }\n\n if (/^(https?:\\/\\/|mailto:|tel:)/i.test(trimmed)) {\n return trimmed;\n }\n\n return `https://${trimmed}`;\n}\n\nfunction createDefaultTableHtml(rows = 3, cols = 3) {\n const headerCells = Array.from({ length: cols }, (_, index) => {\n return `<th>Heading ${index + 1}</th>`;\n }).join(\"\");\n const bodyRows = Array.from({ length: rows }, () => {\n const cells = Array.from({ length: cols }, () => \"<td>Value</td>\").join(\"\");\n return `<tr>${cells}</tr>`;\n }).join(\"\");\n\n return [\n \"<table>\",\n `<thead><tr>${headerCells}</tr></thead>`,\n `<tbody>${bodyRows}</tbody>`,\n \"</table>\",\n ].join(\"\");\n}\n\nfunction createDefaultImageFigureHtml(imageUrl: string, altText: string) {\n return [\n '<figure class=\"hv-inline-image size-md crop-original align-center\">',\n '<div class=\"hv-inline-image-frame\">',\n `<img src=\"${imageUrl}\" alt=\"${altText}\" />`,\n \"</div>\",\n `<figcaption>${altText}</figcaption>`,\n \"</figure>\",\n \"<p></p>\",\n ].join(\"\");\n}\n\nfunction clampImageControl(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction createAuthoringTemplates(): AuthoringTemplate[] {\n return [\n {\n id: \"blank\",\n labelKey: \"documents.richText.template.blank\",\n descriptionKey: \"documents.richText.templateDesc.blank\",\n html: [\n \"<h1>Document Title</h1>\",\n \"<p><strong>Summary:</strong> Add a short statement that explains the purpose of this document.</p>\",\n \"<hr />\",\n \"<h2>Overview</h2>\",\n \"<p>Start with the context, the goal, and the key outcome you want the reader to take away.</p>\",\n \"<h2>Details</h2>\",\n \"<p>Use this section for the main body of the document.</p>\",\n ].join(\"\"),\n },\n {\n id: \"letter\",\n labelKey: \"documents.richText.template.letter\",\n descriptionKey: \"documents.richText.templateDesc.letter\",\n html: [\n \"<h1>Business Letter</h1>\",\n \"<p><strong>Your Company</strong><br />Street Address<br />City, State ZIP<br /><a href=\\\"mailto:team@example.com\\\">team@example.com</a></p>\",\n \"<p><strong>Date:</strong> March 24, 2026</p>\",\n \"<p><strong>Subject:</strong> Project update and next steps</p>\",\n \"<p>Dear Recipient Name,</p>\",\n \"<p>Thank you for the opportunity to support your team. This letter summarizes the current status, the key decisions that need attention, and the recommended next steps.</p>\",\n \"<blockquote>Use this area for a short executive summary, a request for approval, or a single critical instruction.</blockquote>\",\n \"<h2>Key Points</h2>\",\n \"<ul><li>Highlight the main update.</li><li>Clarify what changed since the last version.</li><li>Call out the action needed from the recipient.</li></ul>\",\n \"<p>Please let us know if you would like us to proceed with the recommended plan or if you would prefer an adjusted scope.</p>\",\n \"<p>Sincerely,</p>\",\n \"<p><strong>Your Name</strong><br />Title</p>\",\n ].join(\"\"),\n },\n {\n id: \"notes\",\n labelKey: \"documents.richText.template.notes\",\n descriptionKey: \"documents.richText.templateDesc.notes\",\n html: [\n \"<h1>Meeting Notes</h1>\",\n \"<table><tbody><tr><th>Date</th><td>March 24, 2026</td></tr><tr><th>Time</th><td>10:00 AM</td></tr><tr><th>Facilitator</th><td>Your Name</td></tr><tr><th>Attendees</th><td>List attendees here</td></tr></tbody></table>\",\n \"<h2>Agenda</h2>\",\n \"<ol><li>Opening updates</li><li>Review current blockers</li><li>Confirm next milestones</li></ol>\",\n \"<h2>Discussion Highlights</h2>\",\n \"<ul><li>Summarize the most important discussion points.</li></ul>\",\n \"<h2>Decisions</h2>\",\n \"<ul><li>Capture the decisions made in the meeting.</li></ul>\",\n \"<h2>Action Items</h2>\",\n \"<table><thead><tr><th>Owner</th><th>Action</th><th>Due</th></tr></thead><tbody><tr><td>Name</td><td>Follow-up task</td><td>Date</td></tr></tbody></table>\",\n ].join(\"\"),\n },\n {\n id: \"agreement\",\n labelKey: \"documents.richText.template.agreement\",\n descriptionKey: \"documents.richText.templateDesc.agreement\",\n html: [\n \"<h1>Agreement Summary</h1>\",\n \"<table><tbody><tr><th>Parties</th><td>Company A and Company B</td></tr><tr><th>Effective Date</th><td>March 24, 2026</td></tr><tr><th>Term</th><td>12 months</td></tr><tr><th>Owner</th><td>Department or team</td></tr></tbody></table>\",\n \"<blockquote>Use this document to describe the commercial understanding in plain language before the final contract is prepared or approved.</blockquote>\",\n \"<h2>Scope</h2>\",\n \"<p>Describe what is included, what the expected deliverables are, and what success should look like.</p>\",\n \"<h2>Commercial Terms</h2>\",\n \"<table><thead><tr><th>Item</th><th>Details</th></tr></thead><tbody><tr><td>Pricing</td><td>Describe the fee structure</td></tr><tr><td>Billing</td><td>Describe invoice terms</td></tr><tr><td>Service Levels</td><td>Describe response or delivery commitments</td></tr></tbody></table>\",\n \"<h2>Responsibilities</h2>\",\n \"<ul><li>List each party's major obligations.</li></ul>\",\n \"<h2>Approvals</h2>\",\n \"<p>Record the names, titles, and approval dates for each stakeholder.</p>\",\n ].join(\"\"),\n },\n {\n id: \"proposal\",\n labelKey: \"documents.richText.template.proposal\",\n descriptionKey: \"documents.richText.templateDesc.proposal\",\n html: [\n \"<h1>Project Proposal</h1>\",\n \"<p><strong>Prepared for:</strong> Client Name</p>\",\n \"<p><strong>Prepared by:</strong> Your Company</p>\",\n \"<h2>Executive Summary</h2>\",\n \"<p>Describe the business problem, the recommended solution, and the outcome this engagement is designed to deliver.</p>\",\n \"<blockquote>Keep this section concise and value-focused. Make it easy for an executive reader to understand the proposal in under a minute.</blockquote>\",\n \"<h2>Objectives</h2>\",\n \"<ul><li>State the primary business objective.</li><li>State the operational or user goal.</li><li>State the measurable outcome.</li></ul>\",\n \"<h2>Scope of Work</h2>\",\n \"<ol><li>Discovery and planning</li><li>Implementation and review</li><li>Launch and handoff</li></ol>\",\n \"<h2>Deliverables</h2>\",\n \"<ul><li>List the final outputs the client will receive.</li></ul>\",\n \"<h2>Delivery Plan</h2>\",\n \"<table><thead><tr><th>Phase</th><th>Deliverable</th><th>Timing</th></tr></thead><tbody><tr><td>Phase 1</td><td>Discovery report</td><td>Week 1</td></tr><tr><td>Phase 2</td><td>Implementation</td><td>Weeks 2-4</td></tr><tr><td>Phase 3</td><td>Final handoff</td><td>Week 5</td></tr></tbody></table>\",\n \"<h2>Investment</h2>\",\n \"<table><thead><tr><th>Line Item</th><th>Amount</th></tr></thead><tbody><tr><td>Professional services</td><td>$0.00</td></tr><tr><td>Optional add-on</td><td>$0.00</td></tr></tbody></table>\",\n \"<h2>Assumptions</h2>\",\n \"<ul><li>Document any scope boundaries, client dependencies, or exclusions.</li></ul>\",\n ].join(\"\"),\n },\n ];\n}\n\nexport function RichTextEditor(props: RichTextEditorProps) {\n const createCompactToolbarState = () => ({\n style: true,\n format: true,\n insert: false,\n media: false,\n history: false,\n });\n\n const editorRef = useRef<HTMLDivElement>(null);\n const measureRef = useRef<HTMLDivElement>(null);\n const docxPreviewRef = useRef<HTMLDivElement>(null);\n const imageInputRef = useRef<HTMLInputElement>(null);\n const imagePreviewRef = useRef<HTMLDivElement>(null);\n const savedSelectionRef = useRef<Range | null>(null);\n const imageDragPointerIdRef = useRef<number | null>(null);\n const [contentHtml, setContentHtml] = useState<string>(\"\");\n const [editableContentHtml, setEditableContentHtml] = useState<string>(\"\");\n const [selectedTemplateId, setSelectedTemplateId] = useState<string>(\"blank\");\n const [areTemplatesVisible, setAreTemplatesVisible] = useState(true);\n const [isCompactToolbar, setIsCompactToolbar] = useState(false);\n const [expandedToolbarSections, setExpandedToolbarSections] = useState(\n createCompactToolbarState,\n );\n const [imageEditorState, setImageEditorState] = useState<{\n src: string;\n alt: string;\n scale: number;\n focusX: number;\n focusY: number;\n crop: \"original\" | \"wide\" | \"square\" | \"portrait\";\n } | null>(null);\n const [toolbarState, setToolbarState] = useState<RichTextToolbarState>(\n createDefaultToolbarState(),\n );\n const [loading, setLoading] = useState(false);\n const [isPaginating, setIsPaginating] = useState(false);\n const [pages, setPages] = useState<RichTextPageRenderModel[]>([]);\n const [docxPages, setDocxPages] = useState<RichTextPageRenderModel[]>([]);\n const [isRenderingDocxPreview, setIsRenderingDocxPreview] = useState(false);\n const [docxPreviewFailed, setDocxPreviewFailed] = useState(false);\n\n const mdParser = useRef(new MarkdownIt({ html: true, linkify: true }));\n const authoringTemplates = useMemo(() => createAuthoringTemplates(), []);\n const isAuthoringMode = props.mode === \"edit\" || props.mode === \"create\";\n const isDocxFile =\n props.fileName.toLowerCase().endsWith(\".docx\") || props.fileType === \"docx\";\n const useDocxPreviewView =\n props.mode === \"view\" && isDocxFile && Boolean(props.arrayBuffer);\n\n const syncTemplateSelection = (nextHtml: string) => {\n const matchedTemplate = authoringTemplates.find(\n (template) => template.html === nextHtml,\n );\n setSelectedTemplateId(matchedTemplate?.id ?? \"\");\n };\n\n const captureSelectionRange = () => {\n if (!editorRef.current || typeof window === \"undefined\") {\n return;\n }\n\n const selection = window.getSelection();\n if (\n selection &&\n selection.rangeCount > 0 &&\n editorRef.current.contains(selection.anchorNode)\n ) {\n savedSelectionRef.current = selection.getRangeAt(0).cloneRange();\n }\n };\n\n const restoreSelectionRange = () => {\n if (!editorRef.current || typeof window === \"undefined\") {\n return false;\n }\n\n const selection = window.getSelection();\n if (!selection) {\n return false;\n }\n\n editorRef.current.focus();\n selection.removeAllRanges();\n\n if (\n savedSelectionRef.current &&\n editorRef.current.contains(savedSelectionRef.current.startContainer)\n ) {\n selection.addRange(savedSelectionRef.current);\n return true;\n }\n\n const fallbackRange = document.createRange();\n fallbackRange.selectNodeContents(editorRef.current);\n fallbackRange.collapse(false);\n selection.addRange(fallbackRange);\n savedSelectionRef.current = fallbackRange.cloneRange();\n return true;\n };\n\n const refreshToolbarState = () => {\n if (!editorRef.current || !isAuthoringMode) {\n setToolbarState(createDefaultToolbarState());\n return;\n }\n\n setToolbarState(readToolbarState(editorRef.current, savedSelectionRef.current));\n };\n\n useEffect(() => {\n const loadDoc = async () => {\n if (!props.arrayBuffer) {\n const templateHtml =\n props.mode === \"create\" ? authoringTemplates[0]?.html ?? \"\" : \"\";\n setContentHtml(templateHtml);\n setEditableContentHtml(templateHtml);\n setSelectedTemplateId(props.mode === \"create\" ? authoringTemplates[0]?.id ?? \"\" : \"\");\n setToolbarState(createDefaultToolbarState());\n setPages([]);\n setDocxPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n return;\n }\n\n setLoading(true);\n\n try {\n if (isDocxFile) {\n const result = await mammoth.convertToHtml({\n arrayBuffer: props.arrayBuffer,\n });\n const nextHtml = sanitizeHtml(result.value);\n setContentHtml(nextHtml);\n setEditableContentHtml(nextHtml);\n setSelectedTemplateId(\"\");\n } else {\n const decoder = new TextDecoder(\"utf-8\");\n const text = decoder.decode(props.arrayBuffer);\n\n if (props.fileName.toLowerCase().endsWith(\".md\") || props.fileType === \"md\") {\n const html = mdParser.current.render(text);\n const nextHtml = sanitizeHtml(html);\n setContentHtml(nextHtml);\n setEditableContentHtml(nextHtml);\n setSelectedTemplateId(\"\");\n } else {\n const nextHtml = buildPlainTextHtml(text);\n setContentHtml(nextHtml);\n setEditableContentHtml(nextHtml);\n setSelectedTemplateId(\"\");\n }\n }\n\n props.onPageCount(1);\n } catch (err) {\n console.error(\"Doc Conversion failed\", err);\n const errorHtml = `<p style=\"color:red\">${escapeHtml(props.locale[\"documents.richText.parseError\"])}</p>`;\n setContentHtml(errorHtml);\n setEditableContentHtml(errorHtml);\n setSelectedTemplateId(\"\");\n } finally {\n setLoading(false);\n }\n };\n\n void loadDoc();\n }, [\n authoringTemplates,\n isDocxFile,\n props.arrayBuffer,\n props.fileName,\n props.fileType,\n props.locale,\n props.mode,\n ]);\n\n useEffect(() => {\n if (!isAuthoringMode || !editorRef.current) {\n return;\n }\n\n if (editorRef.current.innerHTML !== editableContentHtml) {\n editorRef.current.innerHTML = editableContentHtml;\n }\n\n refreshToolbarState();\n }, [editableContentHtml, isAuthoringMode]);\n\n useEffect(() => {\n if (!isAuthoringMode || typeof document === \"undefined\") {\n return;\n }\n\n const handleSelectionChange = () => {\n if (!editorRef.current) {\n return;\n }\n\n const selection = window.getSelection();\n const selectionNode = selection?.anchorNode ?? null;\n\n if (!selectionNode || editorRef.current.contains(selectionNode)) {\n captureSelectionRange();\n refreshToolbarState();\n }\n };\n\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n return () => {\n document.removeEventListener(\"selectionchange\", handleSelectionChange);\n };\n }, [isAuthoringMode]);\n\n useEffect(() => {\n if (props.mode === \"create\") {\n setAreTemplatesVisible(true);\n }\n }, [props.mode, props.fileName]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(\"(max-width: 900px)\");\n const syncCompactState = () => {\n setIsCompactToolbar(mediaQuery.matches);\n if (!mediaQuery.matches) {\n setExpandedToolbarSections(createCompactToolbarState());\n }\n };\n\n syncCompactState();\n mediaQuery.addEventListener(\"change\", syncCompactState);\n return () => {\n mediaQuery.removeEventListener(\"change\", syncCompactState);\n };\n }, []);\n\n useEffect(() => {\n if (toolbarState.hasSelectedImage && toolbarState.imageSrc) {\n setImageEditorState({\n src: toolbarState.imageSrc,\n alt: toolbarState.imageAlt,\n scale: toolbarState.imageScale,\n focusX: toolbarState.imageFocusX,\n focusY: toolbarState.imageFocusY,\n crop: toolbarState.imageCrop,\n });\n return;\n }\n\n setImageEditorState(null);\n }, [\n toolbarState.hasSelectedImage,\n toolbarState.imageAlt,\n toolbarState.imageCrop,\n toolbarState.imageFocusX,\n toolbarState.imageFocusY,\n toolbarState.imageScale,\n toolbarState.imageSrc,\n ]);\n\n useEffect(() => {\n if (!useDocxPreviewView || !docxPreviewRef.current || !props.arrayBuffer) {\n setDocxPages([]);\n setDocxPreviewFailed(false);\n setIsRenderingDocxPreview(false);\n if (docxPreviewRef.current) {\n docxPreviewRef.current.innerHTML = \"\";\n }\n return;\n }\n\n let cancelled = false;\n\n const renderDocxPreview = async () => {\n const host = docxPreviewRef.current;\n const arrayBuffer = props.arrayBuffer;\n if (!host) {\n return;\n }\n\n setDocxPreviewFailed(false);\n setIsRenderingDocxPreview(true);\n setDocxPages([]);\n props.onThumbs([]);\n host.innerHTML = \"\";\n\n try {\n const { renderAsync } = await import(\"docx-preview\");\n if (cancelled) {\n return;\n }\n\n if (!arrayBuffer) {\n return;\n }\n\n await renderAsync(arrayBuffer.slice(0), host, undefined, {\n className: DOCX_PREVIEW_CLASS_NAME,\n inWrapper: true,\n breakPages: true,\n ignoreLastRenderedPageBreak: false,\n renderHeaders: true,\n renderFooters: true,\n useBase64URL: true,\n });\n\n await waitForRenderReady(host);\n\n if (cancelled) {\n return;\n }\n\n const pageElements = Array.from(\n host.querySelectorAll<HTMLElement>(`section.${DOCX_PREVIEW_CLASS_NAME}`),\n );\n\n if (pageElements.length === 0) {\n throw new Error(\"No DOCX pages were rendered.\");\n }\n\n const nextPageModels: RichTextPageRenderModel[] = [];\n\n for (const [index, pageElement] of pageElements.entries()) {\n nextPageModels.push(\n await captureDocxPageModel(\n pageElement,\n index + 1,\n ),\n );\n\n if ((index + 1) % 3 === 0) {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n }\n }\n\n if (cancelled) {\n return;\n }\n\n setDocxPages(nextPageModels);\n props.onPageCount(nextPageModels.length);\n props.onThumbs(\n nextPageModels.map((page) => page.thumbnailUrl || page.imageUrl),\n );\n\n if (props.currentPage > nextPageModels.length) {\n props.onCurrentPageChange(1);\n }\n } catch (error) {\n console.error(\"DOCX preview rendering failed\", error);\n if (!cancelled) {\n setDocxPreviewFailed(true);\n setDocxPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n }\n } finally {\n if (!cancelled) {\n setIsRenderingDocxPreview(false);\n }\n }\n };\n\n void renderDocxPreview();\n\n return () => {\n cancelled = true;\n };\n }, [\n props.arrayBuffer,\n props.onCurrentPageChange,\n props.onPageCount,\n props.onThumbs,\n useDocxPreviewView,\n ]);\n\n useEffect(() => {\n if (props.mode !== \"view\") {\n setPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n return;\n }\n\n if (useDocxPreviewView && !docxPreviewFailed) {\n setPages([]);\n return;\n }\n\n if (!contentHtml || !measureRef.current) {\n setPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n return;\n }\n\n let cancelled = false;\n\n const paginate = async () => {\n const measureElement = measureRef.current;\n if (!measureElement) {\n return;\n }\n\n setIsPaginating(true);\n props.onThumbs([]);\n\n try {\n await waitForRenderReady(measureElement);\n\n const totalHeight = Math.max(\n measureElement.scrollHeight,\n DOC_PAGE_HEIGHT,\n );\n const fullCanvas = await captureElementCanvas(measureElement, {\n backgroundColor: \"#ffffff\",\n scale: PAGE_RENDER_SCALE,\n sanitizeStyles: false,\n });\n if (!fullCanvas) {\n throw new Error(\"Unable to capture the rich text document surface.\");\n }\n const breakOffsets = calculatePageBreakOffsets(\n measureElement,\n DOC_PAGE_HEIGHT,\n );\n const nextPages = buildPageModels(fullCanvas, breakOffsets);\n\n if (cancelled) {\n return;\n }\n\n setPages(nextPages);\n props.onPageCount(nextPages.length);\n props.onThumbs(\n nextPages.map((page) => page.thumbnailUrl || page.imageUrl),\n );\n\n if (props.currentPage > nextPages.length) {\n props.onCurrentPageChange(1);\n }\n } catch (error) {\n console.error(\"Rich text pagination failed\", error);\n if (!cancelled) {\n setPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n }\n } finally {\n if (!cancelled) {\n setIsPaginating(false);\n }\n }\n };\n\n void paginate();\n\n return () => {\n cancelled = true;\n };\n }, [\n contentHtml,\n docxPreviewFailed,\n props.mode,\n props.onCurrentPageChange,\n props.onPageCount,\n props.onThumbs,\n useDocxPreviewView,\n ]);\n\n const activeViewPages = useMemo(\n () =>\n props.mode === \"view\"\n ? useDocxPreviewView && !docxPreviewFailed\n ? docxPages\n : pages\n : undefined,\n [docxPages, docxPreviewFailed, pages, props.mode, useDocxPreviewView],\n );\n\n useEffect(() => {\n const container =\n props.mode === \"view\"\n ? useDocxPreviewView && !docxPreviewFailed\n ? docxPreviewRef.current\n : measureRef.current\n : editorRef.current;\n\n props.onExportStateChange?.({\n container,\n contentHtml: props.mode === \"view\" ? contentHtml : editableContentHtml,\n pages: activeViewPages,\n });\n }, [\n activeViewPages,\n contentHtml,\n docxPreviewFailed,\n editableContentHtml,\n props.mode,\n props.onExportStateChange,\n useDocxPreviewView,\n ]);\n\n useEffect(() => {\n return () => {\n props.onExportStateChange?.(null);\n };\n }, [props.onExportStateChange]);\n\n const pagesToShow = useMemo(\n () =>\n getPagesToShow(\n useDocxPreviewView && !docxPreviewFailed\n ? docxPages.length\n : pages.length,\n props.currentPage,\n props.layout,\n ),\n [\n docxPreviewFailed,\n docxPages.length,\n pages.length,\n props.currentPage,\n props.layout,\n useDocxPreviewView,\n ],\n );\n\n const syncEditableSurface = () => {\n const nextHtml = editorRef.current?.innerHTML || \"\";\n setEditableContentHtml(nextHtml);\n setContentHtml(nextHtml);\n syncTemplateSelection(nextHtml);\n captureSelectionRange();\n refreshToolbarState();\n };\n\n const applyAuthoringCommand = (command: string, value?: string) => {\n if (\n !editorRef.current ||\n typeof document === \"undefined\" ||\n typeof document.execCommand !== \"function\"\n ) {\n return;\n }\n\n restoreSelectionRange();\n document.execCommand(command, false, value);\n syncEditableSurface();\n };\n\n const insertAuthoringHtml = (html: string) => {\n if (\n !editorRef.current ||\n typeof document === \"undefined\" ||\n typeof document.execCommand !== \"function\"\n ) {\n return;\n }\n\n restoreSelectionRange();\n document.execCommand(\"insertHTML\", false, html);\n syncEditableSurface();\n };\n\n const insertLink = () => {\n if (\n !editorRef.current ||\n typeof document === \"undefined\" ||\n typeof window === \"undefined\"\n ) {\n return;\n }\n\n const candidateUrl = window.prompt(\n props.locale[\"documents.richText.toolbar.link\"],\n \"https://\",\n );\n\n if (!candidateUrl) {\n return;\n }\n\n const normalizedUrl = normalizeLinkTarget(candidateUrl);\n if (!normalizedUrl) {\n return;\n }\n\n restoreSelectionRange();\n const selectionText = window.getSelection()?.toString().trim() ?? \"\";\n\n if (selectionText) {\n document.execCommand(\"createLink\", false, normalizedUrl);\n } else {\n insertAuthoringHtml(\n `<a href=\"${escapeHtml(normalizedUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${escapeHtml(normalizedUrl)}</a>`,\n );\n return;\n }\n\n syncEditableSurface();\n };\n\n const handleImagePickerOpen = () => {\n captureSelectionRange();\n imageInputRef.current?.click();\n };\n\n const handleInsertImage = async (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const file = event.target.files?.[0];\n event.target.value = \"\";\n\n if (!file) {\n return;\n }\n\n try {\n const imageUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result || \"\"));\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n\n const baseName = file.name.replace(/\\.[^.]+$/, \"\") || \"Image\";\n const safeName = escapeHtml(baseName);\n\n insertAuthoringHtml(createDefaultImageFigureHtml(imageUrl, safeName));\n } catch (error) {\n console.error(\"Image insertion failed\", error);\n }\n };\n\n const reselectImageFigure = (figure: HTMLElement) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(figure);\n selection.removeAllRanges();\n selection.addRange(range);\n savedSelectionRef.current = range.cloneRange();\n }\n };\n\n const applyImageFigureState = (\n figure: HTMLElement,\n patch: Partial<{\n size: \"sm\" | \"md\" | \"lg\" | \"full\";\n crop: \"original\" | \"wide\" | \"square\" | \"portrait\";\n align: \"left\" | \"center\" | \"right\";\n scale: number;\n focusX: number;\n focusY: number;\n }>,\n ) => {\n if (patch.size) {\n figure.classList.remove(\"size-sm\", \"size-md\", \"size-lg\", \"size-full\");\n figure.classList.add(`size-${patch.size}`);\n }\n\n if (patch.crop) {\n figure.classList.remove(\n \"crop-original\",\n \"crop-wide\",\n \"crop-square\",\n \"crop-portrait\",\n );\n figure.classList.add(`crop-${patch.crop}`);\n }\n\n if (patch.align) {\n figure.classList.remove(\"align-left\", \"align-center\", \"align-right\");\n figure.classList.add(`align-${patch.align}`);\n }\n\n if (typeof patch.scale === \"number\") {\n figure.style.setProperty(\"--hv-image-scale\", patch.scale.toFixed(2));\n }\n\n if (typeof patch.focusX === \"number\") {\n figure.style.setProperty(\"--hv-image-focus-x\", `${patch.focusX.toFixed(2)}%`);\n }\n\n if (typeof patch.focusY === \"number\") {\n figure.style.setProperty(\"--hv-image-focus-y\", `${patch.focusY.toFixed(2)}%`);\n }\n };\n\n const updateSelectedImage = (\n patch: Partial<{\n size: \"sm\" | \"md\" | \"lg\" | \"full\";\n crop: \"original\" | \"wide\" | \"square\" | \"portrait\";\n align: \"left\" | \"center\" | \"right\";\n scale: number;\n focusX: number;\n focusY: number;\n }>,\n options?: {\n sync?: boolean;\n },\n ) => {\n if (!editorRef.current) {\n return;\n }\n\n restoreSelectionRange();\n const figure = getSelectedImageFigure(editorRef.current, savedSelectionRef.current);\n const image = figure?.querySelector(\"img\");\n\n if (!figure || !(image instanceof HTMLImageElement)) {\n return;\n }\n\n applyImageFigureState(figure, patch);\n reselectImageFigure(figure);\n\n if (options?.sync === false) {\n refreshToolbarState();\n return;\n }\n\n syncEditableSurface();\n };\n\n const handleSetImageSize = (size: \"sm\" | \"md\" | \"lg\" | \"full\") => {\n updateSelectedImage({ size });\n };\n\n const handleSetImageCrop = (\n crop: \"original\" | \"wide\" | \"square\" | \"portrait\",\n ) => {\n setImageEditorState((prev) =>\n prev\n ? {\n ...prev,\n crop,\n }\n : prev,\n );\n updateSelectedImage({ crop });\n };\n\n const handleSetImageAlign = (align: \"left\" | \"center\" | \"right\") => {\n updateSelectedImage({ align });\n };\n\n const setImageEditorDraft = (patch: Partial<NonNullable<typeof imageEditorState>>) => {\n setImageEditorState((prev) => (prev ? { ...prev, ...patch } : prev));\n };\n\n const handleImageScaleInput = (nextScale: number, sync: boolean) => {\n const scale = clampImageControl(nextScale, 1, 2.5);\n setImageEditorDraft({ scale });\n updateSelectedImage({ scale }, { sync });\n };\n\n const updateImageFocusFromPointer = (\n event: React.PointerEvent<HTMLDivElement>,\n sync: boolean,\n ) => {\n const preview = imagePreviewRef.current;\n if (!preview) {\n return;\n }\n\n const rect = preview.getBoundingClientRect();\n const focusX = clampImageControl(\n ((event.clientX - rect.left) / rect.width) * 100,\n 0,\n 100,\n );\n const focusY = clampImageControl(\n ((event.clientY - rect.top) / rect.height) * 100,\n 0,\n 100,\n );\n\n setImageEditorDraft({ focusX, focusY });\n updateSelectedImage({ focusX, focusY }, { sync });\n };\n\n const handleImagePreviewPointerDown = (\n event: React.PointerEvent<HTMLDivElement>,\n ) => {\n if (!toolbarState.hasSelectedImage) {\n return;\n }\n\n imageDragPointerIdRef.current = event.pointerId;\n event.currentTarget.setPointerCapture(event.pointerId);\n updateImageFocusFromPointer(event, false);\n };\n\n const handleImagePreviewPointerMove = (\n event: React.PointerEvent<HTMLDivElement>,\n ) => {\n if (imageDragPointerIdRef.current !== event.pointerId) {\n return;\n }\n\n updateImageFocusFromPointer(event, false);\n };\n\n const handleImagePreviewPointerUp = (\n event: React.PointerEvent<HTMLDivElement>,\n ) => {\n if (imageDragPointerIdRef.current !== event.pointerId) {\n return;\n }\n\n imageDragPointerIdRef.current = null;\n event.currentTarget.releasePointerCapture(event.pointerId);\n updateImageFocusFromPointer(event, true);\n };\n\n const mutateSelectedTable = (\n mutation: (\n table: HTMLTableElement,\n row: HTMLTableRowElement,\n cell: HTMLTableCellElement,\n cellIndex: number,\n ) => void,\n ) => {\n if (!editorRef.current) {\n return;\n }\n\n restoreSelectionRange();\n const cell = getSelectedTableCell(editorRef.current, savedSelectionRef.current);\n const row = cell?.parentElement;\n const table = cell?.closest(\"table\");\n\n if (\n !cell ||\n !(row instanceof HTMLTableRowElement) ||\n !(table instanceof HTMLTableElement)\n ) {\n return;\n }\n\n const cellIndex = Array.from(row.cells).indexOf(cell);\n if (cellIndex < 0) {\n return;\n }\n\n mutation(table, row, cell, cellIndex);\n syncEditableSurface();\n };\n\n const handleAddTableRow = () => {\n mutateSelectedTable((table, row) => {\n const targetSection =\n row.parentElement?.tagName === \"THEAD\"\n ? table.tBodies[0] ?? table.appendChild(document.createElement(\"tbody\"))\n : row.parentElement;\n\n if (!(targetSection instanceof HTMLElement)) {\n return;\n }\n\n const sourceCells =\n Array.from(row.cells).length > 0\n ? Array.from(row.cells)\n : Array.from(table.rows[0]?.cells ?? []);\n const nextRow = document.createElement(\"tr\");\n\n const newCells =\n sourceCells.length > 0\n ? sourceCells\n : Array.from({ length: 3 }, () => document.createElement(\"td\"));\n\n newCells.forEach((sourceCell, index) => {\n const nextCell = document.createElement(\n targetSection.tagName === \"THEAD\" || sourceCell.tagName === \"TH\"\n ? \"th\"\n : \"td\",\n );\n nextCell.textContent = targetSection.tagName === \"THEAD\"\n ? `Heading ${index + 1}`\n : \"Value\";\n nextRow.appendChild(nextCell);\n });\n\n if (row.parentElement === targetSection && row.nextSibling) {\n targetSection.insertBefore(nextRow, row.nextSibling);\n } else {\n targetSection.appendChild(nextRow);\n }\n });\n };\n\n const handleAddTableColumn = () => {\n mutateSelectedTable((table, _row, _cell, cellIndex) => {\n Array.from(table.rows).forEach((tableRow) => {\n const insertionCell = tableRow.cells[cellIndex];\n const nextCell = document.createElement(\n tableRow.parentElement?.tagName === \"THEAD\" ||\n insertionCell?.tagName === \"TH\"\n ? \"th\"\n : \"td\",\n );\n\n nextCell.textContent =\n nextCell.tagName === \"TH\"\n ? `Heading ${cellIndex + 2}`\n : \"Value\";\n\n if (insertionCell?.nextSibling) {\n tableRow.insertBefore(nextCell, insertionCell.nextSibling);\n } else {\n tableRow.appendChild(nextCell);\n }\n });\n });\n };\n\n const handleDeleteTableRow = () => {\n mutateSelectedTable((table, row) => {\n row.remove();\n if (table.rows.length === 0) {\n table.remove();\n }\n });\n };\n\n const handleDeleteTableColumn = () => {\n mutateSelectedTable((table, _row, _cell, cellIndex) => {\n Array.from(table.rows).forEach((tableRow) => {\n if (tableRow.cells[cellIndex]) {\n tableRow.deleteCell(cellIndex);\n }\n });\n\n const hasCellsRemaining = Array.from(table.rows).some(\n (tableRow) => tableRow.cells.length > 0,\n );\n\n if (!hasCellsRemaining) {\n table.remove();\n }\n });\n };\n\n const isToolbarSectionOpen = (\n section: keyof ReturnType<typeof createCompactToolbarState>,\n ) => {\n return !isCompactToolbar || expandedToolbarSections[section];\n };\n\n const toggleToolbarSection = (\n section: keyof ReturnType<typeof createCompactToolbarState>,\n ) => {\n setExpandedToolbarSections((prev) => ({\n ...prev,\n [section]: !prev[section],\n }));\n };\n\n const renderToolbarSectionHeader = (\n section: keyof ReturnType<typeof createCompactToolbarState>,\n label: string,\n ) => {\n if (!isCompactToolbar) {\n return <span className=\"hv-richtext-toolbar-label\">{label}</span>;\n }\n\n const isOpen = isToolbarSectionOpen(section);\n\n return (\n <button\n type=\"button\"\n className={`hv-richtext-toolbar-section-toggle ${isOpen ? \"open\" : \"\"}`}\n aria-expanded={isOpen}\n onClick={() => toggleToolbarSection(section)}\n >\n <span className=\"hv-richtext-toolbar-label\">{label}</span>\n <span className=\"hv-richtext-toolbar-toggle-copy\">\n {isOpen\n ? props.locale[\"documents.richText.toolbar.collapseSection\"]\n : props.locale[\"documents.richText.toolbar.expandSection\"]}\n </span>\n </button>\n );\n };\n\n const applyTemplate = (templateId: string) => {\n const template = authoringTemplates.find((candidate) => candidate.id === templateId);\n if (!template) {\n return;\n }\n\n setEditableContentHtml(template.html);\n setContentHtml(template.html);\n setSelectedTemplateId(template.id);\n requestAnimationFrame(() => {\n editorRef.current?.focus();\n captureSelectionRange();\n refreshToolbarState();\n });\n };\n\n if (props.mode === \"view\" && useDocxPreviewView && !docxPreviewFailed) {\n return (\n <>\n <div className=\"hv-docx-preview-shell\" aria-hidden=\"true\">\n <div\n ref={docxPreviewRef}\n className=\"hv-docx-preview-host\"\n aria-label=\"DOCX document pages\"\n />\n </div>\n\n <div\n className={\n props.layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"\n }\n >\n {loading || isRenderingDocxPreview ? (\n <div className=\"hv-page-container hv-docx-page-surface\">\n <div className=\"hv-loading-copy\">\n {props.locale[\"documents.richText.renderingPages\"]}\n </div>\n </div>\n ) : (\n pagesToShow.map((pageNumber) => {\n const page = docxPages[pageNumber - 1];\n if (!page) {\n return null;\n }\n\n return (\n <div\n key={page.surfaceKey}\n className=\"hv-page-container hv-docx-page-surface\"\n >\n <img\n src={page.imageUrl}\n alt={`Document page ${pageNumber}`}\n className=\"hv-docx-page-image\"\n />\n <SignatureOverlay\n surfaceKey={page.surfaceKey}\n surfaceKind=\"document\"\n page={pageNumber}\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={\n props.signatureOverlay.annotationPlaceholder\n }\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n );\n })\n )}\n </div>\n </>\n );\n }\n\n if (props.mode === \"view\") {\n return (\n <>\n <div className=\"hv-docx-measure-shell\" aria-hidden=\"true\">\n <div\n ref={measureRef}\n className=\"hv-docx-content hv-docx-measure-content\"\n dangerouslySetInnerHTML={{ __html: contentHtml }}\n />\n </div>\n\n <div\n className={\n props.layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"\n }\n >\n {loading || isPaginating ? (\n <div className=\"hv-page-container hv-docx-page-surface\">\n <div className=\"hv-loading-copy\">\n {props.locale[\"documents.richText.renderingPages\"]}\n </div>\n </div>\n ) : (\n pagesToShow.map((pageNumber) => {\n const page = pages[pageNumber - 1];\n if (!page) {\n return null;\n }\n\n return (\n <div\n key={page.surfaceKey}\n className=\"hv-page-container hv-docx-page-surface\"\n >\n <img\n src={page.imageUrl}\n alt={`Document page ${pageNumber}`}\n className=\"hv-docx-page-image\"\n />\n <SignatureOverlay\n surfaceKey={page.surfaceKey}\n surfaceKind=\"document\"\n page={pageNumber}\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={\n props.signatureOverlay.annotationPlaceholder\n }\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={\n props.signatureOverlay.linkedAnnotationTitle\n }\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n );\n })\n )}\n </div>\n </>\n );\n }\n\n return (\n <div className=\"hv-view-single hv-richtext-authoring-shell\">\n <input\n ref={imageInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hv-richtext-file-input\"\n onChange={handleInsertImage}\n />\n {isAuthoringMode && (\n <div className=\"hv-richtext-authoring-top\">\n <div\n className=\"hv-richtext-toolbar\"\n role=\"toolbar\"\n aria-label={props.locale[\"a11y.ribbon\"]}\n >\n <div className=\"hv-richtext-toolbar-row\">\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"style\",\n props.locale[\"documents.richText.toolbar.styleLabel\"],\n )}\n {isToolbarSectionOpen(\"style\") && (\n <select\n className=\"hv-richtext-select\"\n value={toolbarState.blockTag}\n onChange={(event) =>\n applyAuthoringCommand(\n \"formatBlock\",\n event.target.value === \"blockquote\"\n ? \"BLOCKQUOTE\"\n : event.target.value.toUpperCase(),\n )\n }\n >\n <option value=\"p\">\n {props.locale[\"documents.richText.toolbar.paragraph\"]}\n </option>\n <option value=\"h1\">\n {props.locale[\"documents.richText.toolbar.heading1\"]}\n </option>\n <option value=\"h2\">\n {props.locale[\"documents.richText.toolbar.heading2\"]}\n </option>\n <option value=\"h3\">\n {props.locale[\"documents.richText.toolbar.heading3\"]}\n </option>\n <option value=\"blockquote\">\n {props.locale[\"documents.richText.toolbar.quote\"]}\n </option>\n </select>\n )}\n </div>\n\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"format\",\n props.locale[\"documents.richText.toolbar.formatLabel\"],\n )}\n {isToolbarSectionOpen(\"format\") && (\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.bold ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"bold\")}\n title={props.locale[\"documents.richText.toolbar.bold\"]}\n >\n B\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.italic ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"italic\")}\n title={props.locale[\"documents.richText.toolbar.italic\"]}\n >\n I\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.underline ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"underline\")}\n title={props.locale[\"documents.richText.toolbar.underline\"]}\n >\n U\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.unorderedList ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"insertUnorderedList\")}\n title={props.locale[\"documents.richText.toolbar.bullets\"]}\n >\n UL\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.orderedList ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"insertOrderedList\")}\n title={props.locale[\"documents.richText.toolbar.numbered\"]}\n >\n 1.\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.align === \"left\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"justifyLeft\")}\n title={props.locale[\"documents.richText.toolbar.alignLeft\"]}\n >\n L\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.align === \"center\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"justifyCenter\")}\n title={props.locale[\"documents.richText.toolbar.alignCenter\"]}\n >\n C\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.align === \"right\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"justifyRight\")}\n title={props.locale[\"documents.richText.toolbar.alignRight\"]}\n >\n R\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => applyAuthoringCommand(\"removeFormat\")}\n title={props.locale[\"documents.richText.toolbar.clearFormatting\"]}\n >\n Tx\n </button>\n </div>\n )}\n </div>\n\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"insert\",\n props.locale[\"documents.richText.toolbar.insertLabel\"],\n )}\n {isToolbarSectionOpen(\"insert\") && (\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={insertLink}\n title={props.locale[\"documents.richText.toolbar.link\"]}\n >\n Link\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => insertAuthoringHtml(\"<hr />\")}\n title={props.locale[\"documents.richText.toolbar.divider\"]}\n >\n Rule\n </button>\n </div>\n )}\n </div>\n\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"media\",\n props.locale[\"documents.richText.toolbar.mediaLabel\"],\n )}\n {isToolbarSectionOpen(\"media\") && (\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleImagePickerOpen}\n title={props.locale[\"documents.richText.toolbar.image\"]}\n >\n Image\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => insertAuthoringHtml(createDefaultTableHtml())}\n title={props.locale[\"documents.richText.toolbar.table\"]}\n >\n Table\n </button>\n </div>\n )}\n </div>\n\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"history\",\n props.locale[\"documents.richText.toolbar.historyLabel\"],\n )}\n {isToolbarSectionOpen(\"history\") && (\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => applyAuthoringCommand(\"undo\")}\n title={props.locale[\"documents.richText.toolbar.undo\"]}\n >\n Undo\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => applyAuthoringCommand(\"redo\")}\n title={props.locale[\"documents.richText.toolbar.redo\"]}\n >\n Redo\n </button>\n </div>\n )}\n </div>\n </div>\n\n {toolbarState.hasSelectedImage && imageEditorState && (\n <div className=\"hv-richtext-context-panel\">\n <div className=\"hv-richtext-context-header\">\n <div>\n <strong>{props.locale[\"documents.richText.imageEditorTitle\"]}</strong>\n <p>{props.locale[\"documents.richText.imageEditorHelp\"]}</p>\n </div>\n </div>\n\n <div className=\"hv-richtext-image-editor\">\n <div className=\"hv-richtext-image-preview-card\">\n <div\n ref={imagePreviewRef}\n className={`hv-richtext-image-preview crop-${imageEditorState.crop}`}\n onPointerDown={handleImagePreviewPointerDown}\n onPointerMove={handleImagePreviewPointerMove}\n onPointerUp={handleImagePreviewPointerUp}\n onPointerCancel={handleImagePreviewPointerUp}\n >\n <img\n src={imageEditorState.src}\n alt={imageEditorState.alt}\n style={{\n transform: `scale(${imageEditorState.scale})`,\n objectPosition: `${imageEditorState.focusX}% ${imageEditorState.focusY}%`,\n }}\n />\n <div\n className=\"hv-richtext-image-focus-point\"\n style={{\n left: `${imageEditorState.focusX}%`,\n top: `${imageEditorState.focusY}%`,\n }}\n />\n </div>\n </div>\n\n <div className=\"hv-richtext-image-controls\">\n <div className=\"hv-richtext-toolbar-subgroup\">\n <span className=\"hv-richtext-toolbar-sublabel\">\n {props.locale[\"documents.richText.toolbar.imageSizeLabel\"]}\n </span>\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageSize === \"sm\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageSize(\"sm\")}\n >\n S\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageSize === \"md\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageSize(\"md\")}\n >\n M\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageSize === \"lg\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageSize(\"lg\")}\n >\n L\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageSize === \"full\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageSize(\"full\")}\n >\n Full\n </button>\n </div>\n </div>\n\n <div className=\"hv-richtext-toolbar-subgroup\">\n <span className=\"hv-richtext-toolbar-sublabel\">\n {props.locale[\"documents.richText.toolbar.imageCropLabel\"]}\n </span>\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageCrop === \"original\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageCrop(\"original\")}\n >\n Orig\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageCrop === \"wide\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageCrop(\"wide\")}\n >\n Wide\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageCrop === \"square\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageCrop(\"square\")}\n >\n 1:1\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageCrop === \"portrait\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageCrop(\"portrait\")}\n >\n Tall\n </button>\n </div>\n </div>\n\n <div className=\"hv-richtext-toolbar-subgroup\">\n <span className=\"hv-richtext-toolbar-sublabel\">\n {props.locale[\"documents.richText.toolbar.imageAlignLabel\"]}\n </span>\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageAlign === \"left\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageAlign(\"left\")}\n >\n Left\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageAlign === \"center\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageAlign(\"center\")}\n >\n Center\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageAlign === \"right\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageAlign(\"right\")}\n >\n Right\n </button>\n </div>\n </div>\n\n <label className=\"hv-richtext-range-group\">\n <span>{props.locale[\"documents.richText.imageZoom\"]}</span>\n <input\n type=\"range\"\n min=\"1\"\n max=\"2.5\"\n step=\"0.05\"\n value={imageEditorState.scale}\n onChange={(event) =>\n handleImageScaleInput(Number(event.target.value), false)\n }\n onMouseUp={(event) =>\n handleImageScaleInput(\n Number((event.target as HTMLInputElement).value),\n true,\n )\n }\n onTouchEnd={(event) =>\n handleImageScaleInput(\n Number((event.target as HTMLInputElement).value),\n true,\n )\n }\n onKeyUp={(event) =>\n handleImageScaleInput(\n Number((event.target as HTMLInputElement).value),\n true,\n )\n }\n />\n <strong>{imageEditorState.scale.toFixed(2)}x</strong>\n </label>\n\n <div className=\"hv-richtext-focus-readout\">\n <span>X {Math.round(imageEditorState.focusX)}%</span>\n <span>Y {Math.round(imageEditorState.focusY)}%</span>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {!toolbarState.hasSelectedImage && toolbarState.insideTable && (\n <div className=\"hv-richtext-context-panel hv-richtext-context-panel-compact\">\n <div className=\"hv-richtext-toolbar-subgroup\">\n <span className=\"hv-richtext-toolbar-sublabel\">\n {props.locale[\"documents.richText.toolbar.tableLabel\"]}\n </span>\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleAddTableRow}\n title={props.locale[\"documents.richText.toolbar.tableAddRow\"]}\n >\n +Row\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleAddTableColumn}\n title={props.locale[\"documents.richText.toolbar.tableAddColumn\"]}\n >\n +Col\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleDeleteTableRow}\n title={props.locale[\"documents.richText.toolbar.tableDeleteRow\"]}\n >\n -Row\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleDeleteTableColumn}\n title={props.locale[\"documents.richText.toolbar.tableDeleteColumn\"]}\n >\n -Col\n </button>\n </div>\n </div>\n </div>\n )}\n\n {props.mode === \"create\" && (\n <div className=\"hv-richtext-template-panel\">\n <div className=\"hv-richtext-template-strip\">\n <span className=\"hv-richtext-template-label\">\n {props.locale[\"documents.richText.templates\"]}\n </span>\n <button\n type=\"button\"\n className=\"hv-btn hv-richtext-template-toggle\"\n onClick={() => setAreTemplatesVisible((prev) => !prev)}\n >\n {areTemplatesVisible\n ? props.locale[\"documents.richText.templatesHide\"]\n : props.locale[\"documents.richText.templatesShow\"]}\n </button>\n </div>\n {areTemplatesVisible && (\n <div className=\"hv-richtext-template-grid\">\n {authoringTemplates.map((template) => (\n <button\n key={template.id}\n type=\"button\"\n className={`hv-richtext-template-card ${selectedTemplateId === template.id ? \"active\" : \"\"}`}\n onClick={() => applyTemplate(template.id)}\n >\n <span className=\"hv-richtext-template-title\">\n {props.locale[template.labelKey]}\n </span>\n <span className=\"hv-richtext-template-description\">\n {props.locale[template.descriptionKey]}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n <div className=\"hv-page-container hv-docx-page-surface\">\n {loading ? (\n <div className=\"hv-loading-copy\">\n {props.locale[\"documents.richText.processingText\"]}\n </div>\n ) : (\n <div className=\"hv-docx-editor-stage\">\n <div\n ref={editorRef}\n className=\"hv-docx-content\"\n contentEditable={isAuthoringMode}\n onInput={syncEditableSurface}\n onBlur={syncEditableSurface}\n onKeyUp={() => {\n captureSelectionRange();\n refreshToolbarState();\n }}\n onMouseUp={() => {\n captureSelectionRange();\n refreshToolbarState();\n }}\n onFocus={() => {\n captureSelectionRange();\n refreshToolbarState();\n }}\n suppressContentEditableWarning\n aria-label={props.locale[\"a11y.editor\"]}\n />\n <SignatureOverlay\n surfaceKey=\"document:main\"\n surfaceKind=\"document\"\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={props.signatureOverlay.annotationPlaceholder}\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { MessageSquare } from \"lucide-react\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n AnnotationPlacement,\n DocumentSurfaceOverlayState,\n SignaturePlacement,\n SignatureSurfaceKind,\n} from \"../types\";\nimport {\n normalizeSignatureDate,\n normalizeSignatureInkColor,\n SIGNATURE_INK_COLORS,\n SIGNATURE_INK_COLOR_VALUES,\n} from \"../utils/signature\";\n\ninterface SignatureOverlayProps extends DocumentSurfaceOverlayState {\n surfaceKey: string;\n surfaceKind: SignatureSurfaceKind;\n page?: number;\n slide?: number;\n sheetName?: string;\n}\n\ntype DragMode = \"move\" | \"resize\";\ntype DragTargetType = \"signature\" | \"annotation\";\n\ninterface DragState {\n id: string;\n targetType: DragTargetType;\n mode: DragMode;\n startClientX: number;\n startClientY: number;\n originX: number;\n originY: number;\n originWidth: number;\n originHeight: number;\n aspectRatio?: number;\n rect: DOMRect;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction getDefaultPlacementSize(kind: SignatureSurfaceKind) {\n switch (kind) {\n case \"sheet\":\n return { width: 0.3, height: 0.16 };\n case \"slide\":\n return { width: 0.34, height: 0.18 };\n case \"image\":\n return { width: 0.36, height: 0.18 };\n default:\n return { width: 0.34, height: 0.16 };\n }\n}\n\nfunction getDefaultAnnotationSize(kind: SignatureSurfaceKind) {\n switch (kind) {\n case \"sheet\":\n return { width: 0.2, height: 0.12 };\n case \"slide\":\n return { width: 0.22, height: 0.12 };\n case \"image\":\n return { width: 0.24, height: 0.12 };\n default:\n return { width: 0.26, height: 0.12 };\n }\n}\n\nfunction getLinkedAnnotationIds(annotations: AnnotationPlacement[]) {\n return new Set(\n annotations\n .filter((annotation) => annotation.linkedSignaturePlacementId)\n .map((annotation) => annotation.linkedSignaturePlacementId as string),\n );\n}\n\nfunction buildMaskImageValue(source: string) {\n return `url(\"${source.replaceAll('\"', '\\\\\"')}\")`;\n}\n\nexport function SignatureOverlay(props: SignatureOverlayProps) {\n const {\n surfaceKey,\n surfaceKind,\n page,\n slide,\n sheetName,\n placements,\n annotations,\n pendingSignature,\n pendingAnnotation,\n activePlacementId,\n activeAnnotationId,\n placeHint,\n annotationHint,\n annotationPlaceholder,\n signatureAltLabel,\n signatureAltByLabel,\n signatureNoteIndicatorLabel,\n signatureColorLabel,\n signatureColorNames,\n removeSignatureLabel,\n annotationTitle,\n linkedAnnotationTitle,\n linkedAnnotationBadge,\n openAnnotationLabel,\n removeAnnotationLabel,\n onPlaceSignature,\n onPlaceAnnotation,\n onUpdatePlacement,\n onUpdateAnnotation,\n onRemovePlacement,\n onRemoveAnnotation,\n onSelectPlacement,\n onSelectAnnotation,\n } = props;\n const layerRef = useRef<HTMLDivElement>(null);\n const [dragState, setDragState] = useState<DragState | null>(null);\n\n const visiblePlacements = useMemo(\n () => placements.filter((placement) => placement.surfaceKey === surfaceKey),\n [placements, surfaceKey],\n );\n const visibleAnnotations = useMemo(\n () =>\n annotations.filter((annotation) => annotation.surfaceKey === surfaceKey),\n [annotations, surfaceKey],\n );\n const linkedAnnotationIds = useMemo(\n () => getLinkedAnnotationIds(visibleAnnotations),\n [visibleAnnotations],\n );\n const captureMode = pendingSignature\n ? \"signature\"\n : pendingAnnotation\n ? \"annotation\"\n : null;\n\n useEffect(() => {\n if (captureMode || dragState) {\n return;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as HTMLElement | null;\n if (\n target?.closest(\n \".hv-signature-stamp, .hv-annotation-card, .hv-annotation-chip, .hv-signature-overlay-capture\",\n )\n ) {\n return;\n }\n\n onSelectPlacement(null);\n onSelectAnnotation(null);\n };\n\n window.addEventListener(\"pointerdown\", handlePointerDown, true);\n\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown, true);\n };\n }, [captureMode, dragState, onSelectAnnotation, onSelectPlacement]);\n\n useEffect(() => {\n if (!dragState) {\n return;\n }\n\n const handlePointerMove = (event: PointerEvent) => {\n const rect = dragState.rect;\n const deltaX = (event.clientX - dragState.startClientX) / rect.width;\n const deltaY = (event.clientY - dragState.startClientY) / rect.height;\n\n if (dragState.mode === \"move\") {\n const nextX = clamp(\n dragState.originX + deltaX,\n 0,\n 1 - dragState.originWidth,\n );\n const nextY = clamp(\n dragState.originY + deltaY,\n 0,\n 1 - dragState.originHeight,\n );\n\n if (dragState.targetType === \"signature\") {\n onUpdatePlacement(dragState.id, { x: nextX, y: nextY });\n return;\n }\n\n onUpdateAnnotation(dragState.id, { x: nextX, y: nextY });\n return;\n }\n\n if (dragState.targetType === \"signature\") {\n const nextWidth = clamp(\n dragState.originWidth + deltaX,\n 0.08,\n 1 - dragState.originX,\n );\n const nextHeight = clamp(\n nextWidth / (dragState.aspectRatio || 3.1),\n 0.035,\n 1 - dragState.originY,\n );\n\n onUpdatePlacement(dragState.id, {\n width: nextWidth,\n height: nextHeight,\n });\n return;\n }\n\n const nextWidth = clamp(\n dragState.originWidth + deltaX,\n 0.12,\n 1 - dragState.originX,\n );\n const nextHeight = clamp(\n dragState.originHeight + deltaY,\n 0.08,\n 1 - dragState.originY,\n );\n\n onUpdateAnnotation(dragState.id, {\n width: nextWidth,\n height: nextHeight,\n });\n };\n\n const handlePointerUp = () => {\n setDragState(null);\n };\n\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [dragState, onUpdateAnnotation, onUpdatePlacement]);\n\n const handlePlace = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!layerRef.current || !captureMode) {\n return;\n }\n\n const rect = layerRef.current.getBoundingClientRect();\n const clickX = (event.clientX - rect.left) / rect.width;\n const clickY = (event.clientY - rect.top) / rect.height;\n\n if (captureMode === \"signature\" && pendingSignature) {\n const { width, height } = getDefaultPlacementSize(surfaceKind);\n\n onPlaceSignature({\n signature: pendingSignature,\n surfaceKey,\n surfaceKind,\n page,\n slide,\n sheetName,\n x: clamp(clickX - width / 2, 0, 1 - width),\n y: clamp(clickY - height / 2, 0, 1 - height),\n width,\n height,\n });\n return;\n }\n\n if (captureMode === \"annotation\") {\n const { width, height } = getDefaultAnnotationSize(surfaceKind);\n\n onPlaceAnnotation({\n surfaceKey,\n surfaceKind,\n page,\n slide,\n sheetName,\n x: clamp(clickX - width / 2, 0, 1 - width),\n y: clamp(clickY - height / 2, 0, 1 - height),\n width,\n height,\n text: \"\",\n });\n }\n };\n\n const beginDrag = (\n event: React.PointerEvent<HTMLElement>,\n target:\n | { kind: \"signature\"; item: SignaturePlacement }\n | { kind: \"annotation\"; item: AnnotationPlacement },\n mode: DragMode,\n ) => {\n if (!layerRef.current) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (target.kind === \"signature\") {\n onSelectPlacement(target.item.id);\n onSelectAnnotation(null);\n setDragState({\n id: target.item.id,\n targetType: \"signature\",\n mode,\n startClientX: event.clientX,\n startClientY: event.clientY,\n originX: target.item.x,\n originY: target.item.y,\n originWidth: target.item.width,\n originHeight: target.item.height,\n aspectRatio:\n target.item.width > 0 && target.item.height > 0\n ? target.item.width / target.item.height\n : 3.1,\n rect: layerRef.current.getBoundingClientRect(),\n });\n return;\n }\n\n onSelectAnnotation(target.item.id);\n onSelectPlacement(null);\n setDragState({\n id: target.item.id,\n targetType: \"annotation\",\n mode,\n startClientX: event.clientX,\n startClientY: event.clientY,\n originX: target.item.x,\n originY: target.item.y,\n originWidth: target.item.width,\n originHeight: target.item.height,\n rect: layerRef.current.getBoundingClientRect(),\n });\n };\n\n return (\n <div ref={layerRef} className=\"hv-signature-overlay\">\n {captureMode && (\n <div className=\"hv-signature-overlay-capture\" onClick={handlePlace}>\n <div className=\"hv-signature-overlay-hint\">\n {captureMode === \"annotation\" ? annotationHint : placeHint}\n </div>\n </div>\n )}\n\n {visiblePlacements.map((placement) => {\n const isActive = placement.id === activePlacementId;\n const hasLinkedAnnotation = linkedAnnotationIds.has(placement.id);\n const signer = placement.signature.signedBy?.trim();\n const jobTitle = placement.signature.jobTitle?.trim();\n const signedDate = normalizeSignatureDate(placement.signature.dateSigned);\n const signatureColor = normalizeSignatureInkColor(placement.signatureColor);\n const maskImage = buildMaskImageValue(placement.signature.signatureImageUrl);\n\n return (\n <div\n key={placement.id}\n className={`hv-signature-stamp ${isActive ? \"active\" : \"\"}`}\n style={{\n left: `${placement.x * 100}%`,\n top: `${placement.y * 100}%`,\n width: `${placement.width * 100}%`,\n height: `${placement.height * 100}%`,\n }}\n onPointerDown={(event) => {\n if (!isActive) {\n event.stopPropagation();\n onSelectPlacement(placement.id);\n onSelectAnnotation(null);\n return;\n }\n\n beginDrag(event, { kind: \"signature\", item: placement }, \"move\");\n }}\n onClick={(event) => {\n event.stopPropagation();\n onSelectPlacement(placement.id);\n onSelectAnnotation(null);\n }}\n >\n {isActive && (\n <button\n type=\"button\"\n className=\"hv-signature-remove\"\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.stopPropagation();\n onRemovePlacement(placement.id);\n }}\n aria-label={removeSignatureLabel}\n >\n x\n </button>\n )}\n\n <div className=\"hv-signature-image-wrap\">\n <div\n role=\"img\"\n aria-label={signer ? `${signatureAltByLabel} ${signer}` : signatureAltLabel}\n className=\"hv-signature-image hv-signature-ink\"\n style={{\n backgroundColor: SIGNATURE_INK_COLOR_VALUES[signatureColor],\n maskImage,\n WebkitMaskImage: maskImage,\n }}\n />\n </div>\n\n <div className=\"hv-signature-meta\">\n {signer && <span className=\"hv-signature-meta-name\">{signer}</span>}\n {jobTitle && (\n <span className=\"hv-signature-meta-jobtitle\">{jobTitle}</span>\n )}\n <span className=\"hv-signature-meta-date\">{signedDate}</span>\n </div>\n\n {hasLinkedAnnotation && (\n <div className=\"hv-signature-note-indicator\">\n {signatureNoteIndicatorLabel}\n </div>\n )}\n\n {isActive && (\n <div\n className=\"hv-signature-color-toolbar\"\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <span className=\"hv-signature-color-toolbar-label\">\n {signatureColorLabel}\n </span>\n <div className=\"hv-signature-color-swatch-row\">\n {SIGNATURE_INK_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n className={`hv-signature-color-swatch ${signatureColor === color ? \"active\" : \"\"}`}\n style={{ background: SIGNATURE_INK_COLOR_VALUES[color] }}\n aria-label={`${signatureColorLabel}: ${signatureColorNames[color]}`}\n title={signatureColorNames[color]}\n onClick={() =>\n onUpdatePlacement(placement.id, { signatureColor: color })\n }\n />\n ))}\n </div>\n </div>\n )}\n\n {isActive && (\n <div\n className=\"hv-signature-resize\"\n onPointerDown={(event) =>\n beginDrag(\n event,\n { kind: \"signature\", item: placement },\n \"resize\",\n )\n }\n />\n )}\n </div>\n );\n })}\n\n {visibleAnnotations.map((annotation) => {\n const isActive = annotation.id === activeAnnotationId;\n const isLinked = Boolean(annotation.linkedSignaturePlacementId);\n const hasText = annotation.text.trim().length > 0;\n\n if (!isActive) {\n return (\n <button\n key={annotation.id}\n type=\"button\"\n className={`hv-annotation-chip ${isLinked ? \"linked\" : \"\"} ${hasText ? \"\" : \"empty\"}`}\n style={{\n left: `${annotation.x * 100}%`,\n top: `${annotation.y * 100}%`,\n }}\n aria-label={hasText ? annotation.text : openAnnotationLabel}\n title={hasText ? annotation.text : openAnnotationLabel}\n onClick={(event) => {\n event.stopPropagation();\n onSelectAnnotation(annotation.id);\n onSelectPlacement(null);\n }}\n >\n <MessageSquare size={14} />\n </button>\n );\n }\n\n return (\n <div\n key={annotation.id}\n className={`hv-annotation-card ${isActive ? \"active\" : \"\"} ${isLinked ? \"linked\" : \"\"}`}\n style={{\n left: `${annotation.x * 100}%`,\n top: `${annotation.y * 100}%`,\n width: `${annotation.width * 100}%`,\n height: `${annotation.height * 100}%`,\n }}\n onClick={(event) => {\n event.stopPropagation();\n onSelectAnnotation(annotation.id);\n onSelectPlacement(null);\n }}\n >\n <div\n className=\"hv-annotation-header\"\n onPointerDown={(event) => {\n if (!isActive) {\n event.stopPropagation();\n onSelectAnnotation(annotation.id);\n onSelectPlacement(null);\n return;\n }\n\n beginDrag(\n event,\n { kind: \"annotation\", item: annotation },\n \"move\",\n );\n }}\n >\n <div className=\"hv-annotation-header-copy\">\n <span className=\"hv-annotation-title\">\n {isLinked ? linkedAnnotationTitle : annotationTitle}\n </span>\n {isLinked && (\n <span className=\"hv-annotation-badge\">{linkedAnnotationBadge}</span>\n )}\n </div>\n\n {isActive && (\n <button\n type=\"button\"\n className=\"hv-annotation-remove\"\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.stopPropagation();\n onRemoveAnnotation(annotation.id);\n }}\n aria-label={removeAnnotationLabel}\n >\n x\n </button>\n )}\n </div>\n\n <div className=\"hv-annotation-body\">\n {isActive ? (\n <textarea\n value={annotation.text}\n placeholder={annotationPlaceholder}\n className=\"hv-annotation-input\"\n autoFocus\n onChange={(event) =>\n onUpdateAnnotation(annotation.id, {\n text: event.target.value,\n })\n }\n onClick={(event) => {\n event.stopPropagation();\n }}\n />\n ) : (\n <div\n className={`hv-annotation-preview ${hasText ? \"\" : \"empty\"}`}\n >\n {hasText ? annotation.text : annotationPlaceholder}\n </div>\n )}\n </div>\n\n {isActive && (\n <div\n className=\"hv-annotation-resize\"\n onPointerDown={(event) =>\n beginDrag(\n event,\n { kind: \"annotation\", item: annotation },\n \"resize\",\n )\n }\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport type {\n Signature,\n SignatureInkColor,\n SignaturePlacement,\n SignaturePlacementDraft,\n} from \"../types\";\n\nexport const SIGNATURE_INK_COLORS: SignatureInkColor[] = [\n \"black\",\n \"blue\",\n \"red\",\n \"green\",\n];\n\nexport const SIGNATURE_INK_COLOR_VALUES: Record<SignatureInkColor, string> = {\n black: \"#111827\",\n blue: \"#2563eb\",\n red: \"#dc2626\",\n green: \"#16a34a\",\n};\n\nconst DD_MM_YYYY_PATTERN = /^(\\d{2})-(\\d{2})-(\\d{4})$/;\n\nfunction padDatePart(value: number) {\n return String(value).padStart(2, \"0\");\n}\n\nfunction isValidDdMmYyyy(value: string) {\n const match = value.match(DD_MM_YYYY_PATTERN);\n if (!match) {\n return false;\n }\n\n const [, day, month, year] = match;\n const candidate = new Date(\n Number(year),\n Number(month) - 1,\n Number(day),\n );\n\n return (\n !Number.isNaN(candidate.getTime())\n && candidate.getDate() === Number(day)\n && candidate.getMonth() === Number(month) - 1\n && candidate.getFullYear() === Number(year)\n );\n}\n\nexport function formatDateAsDdMmYyyy(date: Date) {\n return [\n padDatePart(date.getDate()),\n padDatePart(date.getMonth() + 1),\n date.getFullYear(),\n ].join(\"-\");\n}\n\nexport function normalizeSignatureDate(value?: string) {\n const trimmedValue = value?.trim();\n if (!trimmedValue) {\n return formatDateAsDdMmYyyy(new Date());\n }\n\n if (isValidDdMmYyyy(trimmedValue)) {\n return trimmedValue;\n }\n\n const parsed = new Date(trimmedValue);\n if (Number.isNaN(parsed.getTime())) {\n return trimmedValue;\n }\n\n return formatDateAsDdMmYyyy(parsed);\n}\n\nexport function normalizeSignatureInkColor(value?: string | null): SignatureInkColor {\n switch (value) {\n case \"blue\":\n case \"red\":\n case \"green\":\n case \"black\":\n return value;\n default:\n return \"black\";\n }\n}\n\nexport function normalizeSignature(signature: Signature): Signature {\n return {\n ...signature,\n id: signature.id || `sig-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n signedBy: signature.signedBy?.trim() || undefined,\n jobTitle: signature.jobTitle?.trim() || undefined,\n dateSigned: normalizeSignatureDate(signature.dateSigned),\n };\n}\n\nexport function normalizeSignaturePlacement<T extends SignaturePlacement | SignaturePlacementDraft>(\n placement: T,\n): T {\n return {\n ...placement,\n signature: normalizeSignature(placement.signature),\n signatureColor: normalizeSignatureInkColor(placement.signatureColor),\n };\n}\n","\"use client\";\n\nimport { Document, ImageRun, Packer, PageBreak, Paragraph } from \"docx\";\nimport ExcelJS from \"exceljs\";\nimport html2canvas from \"html2canvas\";\nimport JSZip from \"jszip\";\nimport { PDFDocument } from \"pdf-lib\";\nimport { GlobalWorkerOptions, getDocument } from \"pdfjs-dist\";\nimport * as XLSX from \"xlsx\";\nimport type {\n PptxExportState,\n PptxParagraphModel,\n RichTextPageRenderModel,\n SpreadsheetExportState,\n SpreadsheetCellExportModel,\n SpreadsheetMergeModel,\n SpreadsheetSheetExportModel,\n} from \"../internal/exportModels\";\nimport type {\n AnnotationPlacement,\n LetterheadSectionTemplate,\n LetterheadTemplate,\n SignaturePlacement,\n SupportedFileType,\n} from \"../types\";\nimport { arrayBufferToBase64 } from \"./fileSource\";\nimport {\n normalizeSignatureDate,\n normalizeSignatureInkColor,\n SIGNATURE_INK_COLOR_VALUES,\n} from \"./signature\";\n\nconst EMU_PER_INCH = 914400;\nconst EMU_PER_PIXEL = 9525;\nconst SHEET_ROW_HEADER_WIDTH = 48;\nconst SHEET_COLUMN_HEADER_HEIGHT = 34;\nconst NS_PML = \"http://schemas.openxmlformats.org/presentationml/2006/main\";\nconst NS_DML = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst NS_SML = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst NS_XDR = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst NS_REL_OFFICE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst NS_REL_PACKAGE = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst REL_TYPE_IMAGE = `${NS_REL_OFFICE}/image`;\nconst REL_TYPE_DRAWING = `${NS_REL_OFFICE}/drawing`;\nconst REL_TYPE_SLIDE = `${NS_REL_OFFICE}/slide`;\nlet pdfWorkerBlobUrlPromise: Promise<string> | null = null;\n\ntype PptxSlideHandle = {\n background?: { color?: string };\n addImage: (options: Record<string, unknown>) => void;\n addText: (text: string, options: Record<string, unknown>) => void;\n addShape: (shape: string, options: Record<string, unknown>) => void;\n};\n\ntype PptxGenInstance = {\n layout: string;\n author?: string;\n subject?: string;\n title?: string;\n defineLayout: (options: { name: string; width: number; height: number }) => void;\n addSlide: () => PptxSlideHandle;\n write: (options: {\n outputType: \"base64\";\n compression?: boolean;\n }) => Promise<string> | string;\n};\n\ntype PptxGenConstructor = new () => PptxGenInstance;\n\ndeclare global {\n interface Window {\n PptxGenJS?: PptxGenConstructor;\n }\n}\n\nexport interface ExportedDocument {\n base64: string;\n fileName: string;\n fileType: SupportedFileType;\n mimeType: string;\n exportedAsPdf?: boolean;\n}\n\ninterface ExportLocaleLabels {\n annotationTitle: string;\n linkedAnnotationTitle: string;\n linkedAnnotationBadge: string;\n annotationAltLabel: string;\n linkedAnnotationAltLabel: string;\n}\n\nexport interface ExportPageDecorations {\n headerElement?: HTMLElement | null;\n footerElement?: HTMLElement | null;\n letterheadTemplate?: LetterheadTemplate;\n}\n\ninterface PreparedPageDecorations {\n headerCanvas?: HTMLCanvasElement | null;\n footerCanvas?: HTMLCanvasElement | null;\n}\n\ntype DecorationKind = \"header\" | \"footer\";\n\ntype CaptureStyleElement = HTMLElement | SVGElement;\n\nconst defaultExportLocaleLabels: ExportLocaleLabels = {\n annotationTitle: \"Annotation\",\n linkedAnnotationTitle: \"Signature Note\",\n linkedAnnotationBadge: \"Linked\",\n annotationAltLabel: \"Annotation\",\n linkedAnnotationAltLabel: \"Signature annotation\",\n};\n\nasync function ensurePdfWorker() {\n if (GlobalWorkerOptions.workerSrc) {\n return GlobalWorkerOptions.workerSrc;\n }\n\n if (!pdfWorkerBlobUrlPromise) {\n pdfWorkerBlobUrlPromise = import(\"../../generated/pdfWorkerBundle\")\n .then(({ pdfWorkerBundleSource }) =>\n URL.createObjectURL(\n new Blob([pdfWorkerBundleSource], { type: \"text/javascript\" }),\n ),\n )\n .catch((error) => {\n pdfWorkerBlobUrlPromise = null;\n throw error;\n });\n }\n\n GlobalWorkerOptions.workerSrc = await pdfWorkerBlobUrlPromise;\n return GlobalWorkerOptions.workerSrc;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction stripHash(color?: string, fallback = \"000000\") {\n return (color || fallback).replace(/^#/, \"\");\n}\n\nfunction replaceExtension(fileName: string, extension: string) {\n const cleanExtension = extension.replace(/^\\./, \"\");\n if (!fileName.includes(\".\")) {\n return `${fileName}.${cleanExtension}`;\n }\n\n return fileName.replace(/\\.[^.]+$/, `.${cleanExtension}`);\n}\n\nfunction mimeTypeForFileType(fileType: SupportedFileType) {\n switch (fileType) {\n case \"pdf\":\n return \"application/pdf\";\n case \"doc\":\n case \"docx\":\n return \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n case \"xls\":\n case \"xlsx\":\n return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n case \"ppt\":\n case \"pptx\":\n return \"application/vnd.openxmlformats-officedocument.presentationml.presentation\";\n case \"txt\":\n return \"text/plain\";\n case \"md\":\n return \"text/markdown\";\n case \"rtf\":\n return \"application/rtf\";\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n case \"jpeg\":\n return \"image/jpeg\";\n case \"gif\":\n return \"image/gif\";\n case \"bmp\":\n return \"image/bmp\";\n case \"svg\":\n return \"image/svg+xml\";\n case \"csv\":\n return \"text/csv\";\n case \"xml\":\n return \"application/xml\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nfunction toArrayBuffer(value: ArrayBuffer | SharedArrayBuffer | Uint8Array) {\n if (value instanceof ArrayBuffer) {\n return value;\n }\n\n if (value instanceof Uint8Array) {\n return Uint8Array.from(value).buffer;\n }\n\n if (typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer) {\n return new Uint8Array(value).slice().buffer;\n }\n\n return new Uint8Array(value).slice().buffer;\n}\n\nfunction parseXmlDocument(xml: string) {\n return new DOMParser().parseFromString(xml, \"application/xml\");\n}\n\nfunction serializeXmlDocument(document: XMLDocument) {\n const xml = new XMLSerializer().serializeToString(document);\n return xml.startsWith(\"<?xml\")\n ? xml\n : `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${xml}`;\n}\n\nfunction resolveZipPath(basePath: string, target: string) {\n const normalizedBase = basePath.split(\"/\").filter(Boolean);\n normalizedBase.pop();\n\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n\n if (segment === \"..\") {\n normalizedBase.pop();\n } else {\n normalizedBase.push(segment);\n }\n }\n\n return normalizedBase.join(\"/\");\n}\n\nasync function ensureContentTypeDefault(\n zip: JSZip,\n extension: string,\n contentType: string,\n) {\n const contentTypesFile = zip.file(\"[Content_Types].xml\");\n if (!contentTypesFile) {\n return;\n }\n\n const contentTypesDoc = parseXmlDocument(await contentTypesFile.async(\"string\"));\n const root = contentTypesDoc.documentElement;\n if (!root) {\n return;\n }\n const namespace = root.namespaceURI ?? null;\n\n const existing = Array.from(\n root.getElementsByTagNameNS(namespace ?? \"*\", \"Default\"),\n ).some(\n (node) =>\n node.getAttribute(\"Extension\") === extension &&\n node.getAttribute(\"ContentType\") === contentType,\n );\n\n if (!existing) {\n const child = contentTypesDoc.createElementNS(namespace, \"Default\");\n child.setAttribute(\"Extension\", extension);\n child.setAttribute(\"ContentType\", contentType);\n root.appendChild(child);\n zip.file(\"[Content_Types].xml\", serializeXmlDocument(contentTypesDoc));\n }\n}\n\nasync function ensureContentTypeOverride(\n zip: JSZip,\n partName: string,\n contentType: string,\n) {\n const contentTypesFile = zip.file(\"[Content_Types].xml\");\n if (!contentTypesFile) {\n return;\n }\n\n const contentTypesDoc = parseXmlDocument(await contentTypesFile.async(\"string\"));\n const root = contentTypesDoc.documentElement;\n if (!root) {\n return;\n }\n const namespace = root.namespaceURI ?? null;\n\n const existing = Array.from(\n root.getElementsByTagNameNS(namespace ?? \"*\", \"Override\"),\n ).some(\n (node) =>\n node.getAttribute(\"PartName\") === partName &&\n node.getAttribute(\"ContentType\") === contentType,\n );\n\n if (!existing) {\n const child = contentTypesDoc.createElementNS(namespace, \"Override\");\n child.setAttribute(\"PartName\", partName);\n child.setAttribute(\"ContentType\", contentType);\n root.appendChild(child);\n zip.file(\"[Content_Types].xml\", serializeXmlDocument(contentTypesDoc));\n }\n}\n\nfunction getNextSequentialPath(\n zip: JSZip,\n directory: string,\n basename: string,\n extension: string,\n) {\n let index = 1;\n let nextPath = `${directory}/${basename}${index}.${extension}`;\n\n while (zip.file(nextPath)) {\n index += 1;\n nextPath = `${directory}/${basename}${index}.${extension}`;\n }\n\n return nextPath;\n}\n\nasync function getOrCreateRelationshipsDocument(zip: JSZip, relsPath: string) {\n const relsFile = zip.file(relsPath);\n if (relsFile) {\n return parseXmlDocument(await relsFile.async(\"string\"));\n }\n\n return parseXmlDocument(\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>',\n );\n}\n\nfunction getNextRelationshipId(document: XMLDocument) {\n const ids = Array.from(document.getElementsByTagName(\"Relationship\"))\n .map((node) => node.getAttribute(\"Id\") || \"\")\n .map((value) => Number(value.match(/(\\d+)$/)?.[1] || \"0\"));\n const next = (ids.length > 0 ? Math.max(...ids) : 0) + 1;\n return `rId${next}`;\n}\n\nfunction appendRelationship(\n document: XMLDocument,\n type: string,\n target: string,\n) {\n const root = document.documentElement;\n const relationship = document.createElementNS(NS_REL_PACKAGE, \"Relationship\");\n const nextId = getNextRelationshipId(document);\n relationship.setAttribute(\"Id\", nextId);\n relationship.setAttribute(\"Type\", type);\n relationship.setAttribute(\"Target\", target);\n root.appendChild(relationship);\n return nextId;\n}\n\nfunction getMaxAttributeNumber(\n document: XMLDocument,\n tagName: string,\n attribute: string,\n) {\n return Array.from(document.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === tagName)\n .map((element) => Number(element.getAttribute(attribute) || \"0\"))\n .reduce((max, value) => Math.max(max, value), 0);\n}\n\nfunction dataUrlToUint8Array(dataUrl: string) {\n const base64 = dataUrl.split(\",\")[1] || \"\";\n const binary = atob(base64);\n const output = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n output[index] = binary.charCodeAt(index);\n }\n return output;\n}\n\nasync function getOrderedPptSlidePaths(zip: JSZip) {\n const presentationXml = zip.file(\"ppt/presentation.xml\");\n const presentationRelsXml = zip.file(\"ppt/_rels/presentation.xml.rels\");\n if (!presentationXml || !presentationRelsXml) {\n return Object.keys(zip.files)\n .filter((path) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(path))\n .sort((left, right) => {\n const leftNumber = Number(left.match(/slide(\\d+)/)?.[1] || \"0\");\n const rightNumber = Number(right.match(/slide(\\d+)/)?.[1] || \"0\");\n return leftNumber - rightNumber;\n });\n }\n\n const presentationDoc = parseXmlDocument(await presentationXml.async(\"string\"));\n const relsDoc = parseXmlDocument(await presentationRelsXml.async(\"string\"));\n const relMap = new Map<string, string>();\n for (const node of Array.from(relsDoc.getElementsByTagName(\"Relationship\"))) {\n const id = node.getAttribute(\"Id\");\n const target = node.getAttribute(\"Target\");\n const type = node.getAttribute(\"Type\");\n if (!id || !target || type !== REL_TYPE_SLIDE) {\n continue;\n }\n relMap.set(id, resolveZipPath(\"ppt/presentation.xml\", target));\n }\n\n return Array.from(presentationDoc.getElementsByTagNameNS(NS_PML, \"sldId\"))\n .map((node) => node.getAttributeNS(NS_REL_OFFICE, \"id\") || node.getAttribute(\"r:id\"))\n .map((id) => (id ? relMap.get(id) : undefined))\n .filter((path): path is string => Boolean(path));\n}\n\nasync function getWorkbookSheetInfos(zip: JSZip) {\n const workbookXml = zip.file(\"xl/workbook.xml\");\n const workbookRelsXml = zip.file(\"xl/_rels/workbook.xml.rels\");\n if (!workbookXml || !workbookRelsXml) {\n return [];\n }\n\n const workbookDoc = parseXmlDocument(await workbookXml.async(\"string\"));\n const relsDoc = parseXmlDocument(await workbookRelsXml.async(\"string\"));\n const relMap = new Map<string, string>();\n for (const node of Array.from(relsDoc.getElementsByTagName(\"Relationship\"))) {\n const id = node.getAttribute(\"Id\");\n const target = node.getAttribute(\"Target\");\n if (!id || !target) {\n continue;\n }\n relMap.set(id, resolveZipPath(\"xl/workbook.xml\", target));\n }\n\n return Array.from(workbookDoc.getElementsByTagNameNS(NS_SML, \"sheet\"))\n .map((node) => ({\n name: node.getAttribute(\"name\") || \"\",\n path:\n relMap.get(\n node.getAttributeNS(NS_REL_OFFICE, \"id\") || node.getAttribute(\"r:id\") || \"\",\n ) || \"\",\n }))\n .filter((sheet) => sheet.name && sheet.path);\n}\n\nasync function getOrCreateSheetDrawingDocument(zip: JSZip, drawingPath: string) {\n const drawingFile = zip.file(drawingPath);\n if (drawingFile) {\n return parseXmlDocument(await drawingFile.async(\"string\"));\n }\n\n return parseXmlDocument(\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><xdr:wsDr xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"></xdr:wsDr>',\n );\n}\n\nfunction toRelativeZipTarget(fromPath: string, toPath: string) {\n const fromParts = fromPath.split(\"/\").filter(Boolean);\n const toParts = toPath.split(\"/\").filter(Boolean);\n fromParts.pop();\n\n while (fromParts.length > 0 && toParts.length > 0 && fromParts[0] === toParts[0]) {\n fromParts.shift();\n toParts.shift();\n }\n\n return `${\"../\".repeat(fromParts.length)}${toParts.join(\"/\")}`;\n}\n\nfunction pixelOffsetToAnchor(\n offset: number,\n sizes: number[],\n) {\n let remaining = Math.max(offset, 0);\n for (let index = 0; index < sizes.length; index += 1) {\n const size = Math.max(sizes[index] || 0, 1);\n if (remaining <= size || index === sizes.length - 1) {\n return {\n index,\n offsetEmu: Math.round(Math.min(remaining, size) * EMU_PER_PIXEL),\n };\n }\n remaining -= size;\n }\n\n return { index: 0, offsetEmu: 0 };\n}\n\nfunction buildSpreadsheetAnchor(\n x: number,\n y: number,\n width: number,\n height: number,\n colWidths: number[],\n rowHeights: number[],\n) {\n const fromCol = pixelOffsetToAnchor(x, colWidths);\n const fromRow = pixelOffsetToAnchor(y, rowHeights);\n const toCol = pixelOffsetToAnchor(x + width, colWidths);\n const toRow = pixelOffsetToAnchor(y + height, rowHeights);\n\n return {\n from: {\n col: fromCol.index,\n colOff: fromCol.offsetEmu,\n row: fromRow.index,\n rowOff: fromRow.offsetEmu,\n },\n to: {\n col: toCol.index,\n colOff: toCol.offsetEmu,\n row: toRow.index,\n rowOff: toRow.offsetEmu,\n },\n };\n}\n\nfunction appendTextElement(\n document: XMLDocument,\n parent: Element,\n namespace: string,\n qualifiedName: string,\n value: string | number,\n) {\n const element = document.createElementNS(namespace, qualifiedName);\n element.textContent = String(value);\n parent.appendChild(element);\n return element;\n}\n\nfunction createPptOverlayPictureNode(args: {\n document: XMLDocument;\n relationshipId: string;\n shapeId: number;\n name: string;\n x: number;\n y: number;\n width: number;\n height: number;\n description?: string;\n}) {\n const picture = args.document.createElementNS(NS_PML, \"p:pic\");\n const nvPicPr = args.document.createElementNS(NS_PML, \"p:nvPicPr\");\n const cNvPr = args.document.createElementNS(NS_PML, \"p:cNvPr\");\n cNvPr.setAttribute(\"id\", String(args.shapeId));\n cNvPr.setAttribute(\"name\", args.name);\n if (args.description) {\n cNvPr.setAttribute(\"descr\", args.description);\n }\n const cNvPicPr = args.document.createElementNS(NS_PML, \"p:cNvPicPr\");\n const picLocks = args.document.createElementNS(NS_DML, \"a:picLocks\");\n picLocks.setAttribute(\"noChangeAspect\", \"1\");\n cNvPicPr.appendChild(picLocks);\n const nvPr = args.document.createElementNS(NS_PML, \"p:nvPr\");\n nvPicPr.append(cNvPr, cNvPicPr, nvPr);\n\n const blipFill = args.document.createElementNS(NS_PML, \"p:blipFill\");\n const blip = args.document.createElementNS(NS_DML, \"a:blip\");\n blip.setAttributeNS(NS_REL_OFFICE, \"r:embed\", args.relationshipId);\n const stretch = args.document.createElementNS(NS_DML, \"a:stretch\");\n stretch.appendChild(args.document.createElementNS(NS_DML, \"a:fillRect\"));\n blipFill.append(blip, stretch);\n\n const spPr = args.document.createElementNS(NS_PML, \"p:spPr\");\n const xfrm = args.document.createElementNS(NS_DML, \"a:xfrm\");\n const off = args.document.createElementNS(NS_DML, \"a:off\");\n off.setAttribute(\"x\", String(Math.round(args.x)));\n off.setAttribute(\"y\", String(Math.round(args.y)));\n const ext = args.document.createElementNS(NS_DML, \"a:ext\");\n ext.setAttribute(\"cx\", String(Math.round(args.width)));\n ext.setAttribute(\"cy\", String(Math.round(args.height)));\n xfrm.append(off, ext);\n const presetGeometry = args.document.createElementNS(NS_DML, \"a:prstGeom\");\n presetGeometry.setAttribute(\"prst\", \"rect\");\n presetGeometry.appendChild(args.document.createElementNS(NS_DML, \"a:avLst\"));\n spPr.append(xfrm, presetGeometry);\n\n picture.append(nvPicPr, blipFill, spPr);\n return picture;\n}\n\nfunction createWorksheetOverlayNode(args: {\n document: XMLDocument;\n relationshipId: string;\n shapeId: number;\n name: string;\n anchor: ReturnType<typeof buildSpreadsheetAnchor>;\n description?: string;\n}) {\n const anchor = args.document.createElementNS(NS_XDR, \"xdr:twoCellAnchor\");\n anchor.setAttribute(\"editAs\", \"oneCell\");\n\n const from = args.document.createElementNS(NS_XDR, \"xdr:from\");\n appendTextElement(args.document, from, NS_XDR, \"xdr:col\", args.anchor.from.col);\n appendTextElement(args.document, from, NS_XDR, \"xdr:colOff\", args.anchor.from.colOff);\n appendTextElement(args.document, from, NS_XDR, \"xdr:row\", args.anchor.from.row);\n appendTextElement(args.document, from, NS_XDR, \"xdr:rowOff\", args.anchor.from.rowOff);\n\n const to = args.document.createElementNS(NS_XDR, \"xdr:to\");\n appendTextElement(args.document, to, NS_XDR, \"xdr:col\", args.anchor.to.col);\n appendTextElement(args.document, to, NS_XDR, \"xdr:colOff\", args.anchor.to.colOff);\n appendTextElement(args.document, to, NS_XDR, \"xdr:row\", args.anchor.to.row);\n appendTextElement(args.document, to, NS_XDR, \"xdr:rowOff\", args.anchor.to.rowOff);\n\n const pic = args.document.createElementNS(NS_XDR, \"xdr:pic\");\n const nvPicPr = args.document.createElementNS(NS_XDR, \"xdr:nvPicPr\");\n const cNvPr = args.document.createElementNS(NS_XDR, \"xdr:cNvPr\");\n cNvPr.setAttribute(\"id\", String(args.shapeId));\n cNvPr.setAttribute(\"name\", args.name);\n if (args.description) {\n cNvPr.setAttribute(\"descr\", args.description);\n }\n const cNvPicPr = args.document.createElementNS(NS_XDR, \"xdr:cNvPicPr\");\n nvPicPr.append(cNvPr, cNvPicPr);\n\n const blipFill = args.document.createElementNS(NS_XDR, \"xdr:blipFill\");\n const blip = args.document.createElementNS(NS_DML, \"a:blip\");\n blip.setAttributeNS(NS_REL_OFFICE, \"r:embed\", args.relationshipId);\n const stretch = args.document.createElementNS(NS_DML, \"a:stretch\");\n stretch.appendChild(args.document.createElementNS(NS_DML, \"a:fillRect\"));\n blipFill.append(blip, stretch);\n\n const spPr = args.document.createElementNS(NS_XDR, \"xdr:spPr\");\n const presetGeometry = args.document.createElementNS(NS_DML, \"a:prstGeom\");\n presetGeometry.setAttribute(\"prst\", \"rect\");\n presetGeometry.appendChild(args.document.createElementNS(NS_DML, \"a:avLst\"));\n spPr.appendChild(presetGeometry);\n\n pic.append(nvPicPr, blipFill, spPr);\n anchor.append(from, to, pic, args.document.createElementNS(NS_XDR, \"xdr:clientData\"));\n return anchor;\n}\n\nfunction getDirectChildElementsByLocalName(\n parent: ParentNode,\n localName: string,\n) {\n return Array.from(parent.childNodes).filter(\n (node): node is Element =>\n node.nodeType === 1 && (node as Element).localName === localName,\n );\n}\n\nfunction getWorksheetChildElement(worksheet: Element, localName: string) {\n return getDirectChildElementsByLocalName(worksheet, localName)[0];\n}\n\nfunction removeElementChildrenByLocalName(\n parent: Element,\n localNames: string[],\n) {\n for (const child of Array.from(parent.childNodes)) {\n if (\n child.nodeType === 1 &&\n localNames.includes((child as Element).localName || \"\")\n ) {\n parent.removeChild(child);\n }\n }\n}\n\nfunction getOrCreateWorksheetSheetData(\n document: XMLDocument,\n worksheet: Element,\n) {\n const existing = getWorksheetChildElement(worksheet, \"sheetData\");\n if (existing) {\n return existing;\n }\n\n const sheetData = document.createElementNS(NS_SML, \"sheetData\");\n const insertionPointNames = new Set([\n \"sheetCalcPr\",\n \"sheetProtection\",\n \"protectedRanges\",\n \"scenarios\",\n \"autoFilter\",\n \"sortState\",\n \"dataConsolidate\",\n \"customSheetViews\",\n \"mergeCells\",\n \"phoneticPr\",\n \"conditionalFormatting\",\n \"dataValidations\",\n \"hyperlinks\",\n \"printOptions\",\n \"pageMargins\",\n \"pageSetup\",\n \"headerFooter\",\n \"rowBreaks\",\n \"colBreaks\",\n \"customProperties\",\n \"cellWatches\",\n \"ignoredErrors\",\n \"smartTags\",\n \"drawing\",\n \"legacyDrawing\",\n \"legacyDrawingHF\",\n \"picture\",\n \"oleObjects\",\n \"controls\",\n \"webPublishItems\",\n \"tableParts\",\n \"extLst\",\n ]);\n const nextSibling = Array.from(worksheet.childNodes).find(\n (node) =>\n node.nodeType === 1 &&\n insertionPointNames.has((node as Element).localName || \"\"),\n );\n\n if (nextSibling) {\n worksheet.insertBefore(sheetData, nextSibling);\n } else {\n worksheet.appendChild(sheetData);\n }\n\n return sheetData;\n}\n\nfunction getOrCreateWorksheetRow(\n document: XMLDocument,\n sheetData: Element,\n rowNumber: number,\n) {\n const rows = getDirectChildElementsByLocalName(sheetData, \"row\");\n\n for (const row of rows) {\n const existingNumber = Number(row.getAttribute(\"r\") || \"0\");\n if (existingNumber === rowNumber) {\n return row;\n }\n if (existingNumber > rowNumber) {\n const nextRow = document.createElementNS(NS_SML, \"row\");\n nextRow.setAttribute(\"r\", String(rowNumber));\n sheetData.insertBefore(nextRow, row);\n return nextRow;\n }\n }\n\n const newRow = document.createElementNS(NS_SML, \"row\");\n newRow.setAttribute(\"r\", String(rowNumber));\n sheetData.appendChild(newRow);\n return newRow;\n}\n\nfunction getOrCreateWorksheetCell(\n document: XMLDocument,\n row: Element,\n address: string,\n) {\n const targetColumn = XLSX.utils.decode_cell(address).c;\n const cells = getDirectChildElementsByLocalName(row, \"c\");\n\n for (const cell of cells) {\n const reference = cell.getAttribute(\"r\");\n if (reference === address) {\n return cell;\n }\n\n if (!reference) {\n continue;\n }\n\n const currentColumn = XLSX.utils.decode_cell(reference).c;\n if (currentColumn > targetColumn) {\n const nextCell = document.createElementNS(NS_SML, \"c\");\n nextCell.setAttribute(\"r\", address);\n row.insertBefore(nextCell, cell);\n return nextCell;\n }\n }\n\n const newCell = document.createElementNS(NS_SML, \"c\");\n newCell.setAttribute(\"r\", address);\n row.appendChild(newCell);\n return newCell;\n}\n\nfunction createSpreadsheetInlineStringNode(\n document: XMLDocument,\n value: string,\n) {\n const inlineString = document.createElementNS(NS_SML, \"is\");\n const text = document.createElementNS(NS_SML, \"t\");\n if (/^\\s|\\s$|\\n/.test(value)) {\n text.setAttributeNS(\n \"http://www.w3.org/XML/1998/namespace\",\n \"xml:space\",\n \"preserve\",\n );\n }\n text.textContent = value;\n inlineString.appendChild(text);\n return inlineString;\n}\n\nfunction setSpreadsheetCellValue(\n document: XMLDocument,\n cell: Element,\n model: SpreadsheetCellExportModel,\n) {\n removeElementChildrenByLocalName(cell, [\"f\", \"v\", \"is\"]);\n\n if (model.valueKind === \"blank\") {\n cell.removeAttribute(\"t\");\n return;\n }\n\n if (model.valueKind === \"formula\" && model.formula) {\n const formula = document.createElementNS(NS_SML, \"f\");\n formula.textContent = model.formula;\n cell.appendChild(formula);\n\n if (typeof model.result === \"number\") {\n cell.removeAttribute(\"t\");\n appendTextElement(document, cell, NS_SML, \"v\", model.result);\n return;\n }\n\n if (typeof model.result === \"boolean\") {\n cell.setAttribute(\"t\", \"b\");\n appendTextElement(document, cell, NS_SML, \"v\", model.result ? 1 : 0);\n return;\n }\n\n if (typeof model.result === \"string\") {\n cell.setAttribute(\"t\", \"str\");\n appendTextElement(document, cell, NS_SML, \"v\", model.result);\n return;\n }\n\n cell.removeAttribute(\"t\");\n return;\n }\n\n if (model.valueKind === \"number\" && typeof model.value === \"number\") {\n cell.removeAttribute(\"t\");\n appendTextElement(document, cell, NS_SML, \"v\", model.value);\n return;\n }\n\n if (model.valueKind === \"boolean\" && typeof model.value === \"boolean\") {\n cell.setAttribute(\"t\", \"b\");\n appendTextElement(document, cell, NS_SML, \"v\", model.value ? 1 : 0);\n return;\n }\n\n const stringValue =\n typeof model.displayValue === \"string\" && model.displayValue.length > 0\n ? model.displayValue\n : typeof model.value === \"string\"\n ? model.value\n : isRecord(model.value) && typeof model.value.text === \"string\"\n ? model.value.text\n : model.value == null\n ? \"\"\n : String(model.value);\n\n cell.setAttribute(\"t\", \"inlineStr\");\n cell.appendChild(createSpreadsheetInlineStringNode(document, stringValue));\n}\n\nfunction removeWorksheetHyperlinksForAddress(\n worksheet: Element,\n address: string,\n) {\n const hyperlinks = getWorksheetChildElement(worksheet, \"hyperlinks\");\n if (!hyperlinks) {\n return;\n }\n\n for (const hyperlink of getDirectChildElementsByLocalName(\n hyperlinks,\n \"hyperlink\",\n )) {\n if (hyperlink.getAttribute(\"ref\") === address) {\n hyperlinks.removeChild(hyperlink);\n }\n }\n\n if (getDirectChildElementsByLocalName(hyperlinks, \"hyperlink\").length === 0) {\n worksheet.removeChild(hyperlinks);\n }\n}\n\nfunction applySpreadsheetWorksheetEdit(args: {\n document: XMLDocument;\n worksheet: Element;\n sheetData: Element;\n address: string;\n cellModel?: SpreadsheetCellExportModel;\n}) {\n const decoded = XLSX.utils.decode_cell(args.address);\n const rowNumber = decoded.r + 1;\n const existingRow = getDirectChildElementsByLocalName(args.sheetData, \"row\").find(\n (candidate) => Number(candidate.getAttribute(\"r\") || \"0\") === rowNumber,\n );\n const row =\n existingRow ||\n (args.cellModel\n ? getOrCreateWorksheetRow(args.document, args.sheetData, rowNumber)\n : null);\n const existingCell = row\n ? getDirectChildElementsByLocalName(row, \"c\").find(\n (cell) => cell.getAttribute(\"r\") === args.address,\n )\n : undefined;\n\n if (!args.cellModel) {\n if (existingCell) {\n row!.removeChild(existingCell);\n }\n removeWorksheetHyperlinksForAddress(args.worksheet, args.address);\n return;\n }\n\n const cell =\n existingCell ||\n getOrCreateWorksheetCell(args.document, row!, args.address);\n setSpreadsheetCellValue(args.document, cell, args.cellModel);\n\n if (!args.cellModel.hyperlink) {\n removeWorksheetHyperlinksForAddress(args.worksheet, args.address);\n }\n}\n\nasync function markWorkbookForFullCalculation(zip: JSZip) {\n const workbookFile = zip.file(\"xl/workbook.xml\");\n if (!workbookFile) {\n return;\n }\n\n const workbookDoc = parseXmlDocument(await workbookFile.async(\"string\"));\n const workbook = workbookDoc.getElementsByTagNameNS(NS_SML, \"workbook\")[0];\n if (!workbook) {\n return;\n }\n\n let calcPr = getDirectChildElementsByLocalName(workbook, \"calcPr\")[0];\n if (!calcPr) {\n calcPr = workbookDoc.createElementNS(NS_SML, \"calcPr\");\n workbook.appendChild(calcPr);\n }\n\n calcPr.setAttribute(\"calcMode\", \"auto\");\n calcPr.setAttribute(\"calcId\", \"0\");\n calcPr.setAttribute(\"fullCalcOnLoad\", \"1\");\n calcPr.setAttribute(\"forceFullCalc\", \"1\");\n\n zip.file(\"xl/workbook.xml\", serializeXmlDocument(workbookDoc));\n}\n\nfunction ensureImageSource(source: string) {\n const trimmedSource = source.trim();\n if (\n trimmedSource.startsWith(\"data:\") ||\n trimmedSource.startsWith(\"blob:\") ||\n trimmedSource.startsWith(\"http:\")\n || trimmedSource.startsWith(\"https:\")\n ) {\n return trimmedSource;\n }\n\n if (trimmedSource.startsWith(\"//\") && typeof window !== \"undefined\") {\n return `${window.location.protocol}${trimmedSource}`;\n }\n\n if (\n typeof window !== \"undefined\"\n && (\n trimmedSource.startsWith(\"/\")\n || trimmedSource.startsWith(\"./\")\n || trimmedSource.startsWith(\"../\")\n )\n ) {\n return new URL(trimmedSource, window.location.origin).toString();\n }\n\n if (\n trimmedSource.startsWith(\"<svg\")\n || (trimmedSource.startsWith(\"<?xml\") && trimmedSource.includes(\"<svg\"))\n ) {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(trimmedSource)}`;\n }\n\n return `data:image/png;base64,${trimmedSource}`;\n}\n\nfunction createCanvas(width: number, height: number) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(width));\n canvas.height = Math.max(1, Math.round(height));\n return canvas;\n}\n\nfunction roundedRectPath(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n) {\n const safeRadius = Math.min(radius, width / 2, height / 2);\n ctx.beginPath();\n ctx.moveTo(x + safeRadius, y);\n ctx.arcTo(x + width, y, x + width, y + height, safeRadius);\n ctx.arcTo(x + width, y + height, x, y + height, safeRadius);\n ctx.arcTo(x, y + height, x, y, safeRadius);\n ctx.arcTo(x, y, x + width, y, safeRadius);\n ctx.closePath();\n}\n\nasync function loadImage(source: string) {\n const image = new Image();\n image.crossOrigin = \"anonymous\";\n image.decoding = \"async\";\n\n await new Promise<void>((resolve, reject) => {\n image.onload = () => resolve();\n image.onerror = () => reject(new Error(\"Unable to load an image asset.\"));\n image.src = ensureImageSource(source);\n });\n\n if (\"decode\" in image) {\n try {\n await image.decode();\n } catch {\n // The load event already completed successfully.\n }\n }\n\n return image;\n}\n\nasync function tryLoadImage(source: string) {\n try {\n return await loadImage(source);\n } catch {\n return null;\n }\n}\n\nfunction getOpaqueImageBounds(\n image: HTMLImageElement,\n alphaThreshold = 8,\n) {\n const canvas = createCanvas(image.width, image.height);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return {\n sx: 0,\n sy: 0,\n sw: image.width,\n sh: image.height,\n };\n }\n\n ctx.drawImage(image, 0, 0, image.width, image.height);\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\n let minX = canvas.width;\n let minY = canvas.height;\n let maxX = -1;\n let maxY = -1;\n\n for (let y = 0; y < canvas.height; y += 1) {\n for (let x = 0; x < canvas.width; x += 1) {\n const alpha = imageData[(y * canvas.width + x) * 4 + 3];\n if (alpha <= alphaThreshold) {\n continue;\n }\n\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n }\n\n if (maxX < minX || maxY < minY) {\n return {\n sx: 0,\n sy: 0,\n sw: image.width,\n sh: image.height,\n };\n }\n\n const padding = Math.max(6, Math.round(Math.max(image.width, image.height) * 0.04));\n const sx = Math.max(0, minX - padding);\n const sy = Math.max(0, minY - padding);\n\n return {\n sx,\n sy,\n sw: Math.min(image.width - sx, maxX - minX + 1 + padding * 2),\n sh: Math.min(image.height - sy, maxY - minY + 1 + padding * 2),\n };\n}\n\nasync function canvasToBlob(\n canvas: HTMLCanvasElement,\n type: string,\n quality?: number,\n) {\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Unable to generate the export file.\"));\n return;\n }\n\n resolve(blob);\n },\n type,\n quality,\n );\n });\n}\n\nasync function blobToBase64(blob: Blob) {\n return arrayBufferToBase64(await blob.arrayBuffer());\n}\n\nconst UNSUPPORTED_COLOR_FUNCTION_PATTERN = /\\b(?:oklch|oklab|color)\\(/i;\nlet colorNormalizationElement: HTMLDivElement | null = null;\n\nfunction getColorNormalizationElement() {\n if (\n colorNormalizationElement &&\n typeof document !== \"undefined\" &&\n document.body.contains(colorNormalizationElement)\n ) {\n return colorNormalizationElement;\n }\n\n const element = document.createElement(\"div\");\n element.setAttribute(\"aria-hidden\", \"true\");\n element.style.position = \"fixed\";\n element.style.left = \"-200vw\";\n element.style.top = \"0\";\n element.style.opacity = \"0\";\n element.style.pointerEvents = \"none\";\n document.body.appendChild(element);\n colorNormalizationElement = element;\n return colorNormalizationElement;\n}\n\nfunction normalizeColorToken(token: string) {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return token;\n }\n\n const element = getColorNormalizationElement();\n const previous = element.style.color;\n\n try {\n element.style.color = \"\";\n element.style.color = token;\n const normalized = window.getComputedStyle(element).color;\n return normalized || token;\n } catch {\n element.style.color = previous;\n return token;\n } finally {\n element.style.color = previous;\n }\n}\n\nfunction normalizeCssColorFunctions(value: string) {\n if (!UNSUPPORTED_COLOR_FUNCTION_PATTERN.test(value)) {\n return value;\n }\n\n let cursor = 0;\n let normalized = \"\";\n\n while (cursor < value.length) {\n const match = value\n .slice(cursor)\n .match(/\\b(?:oklch|oklab|color)\\(/i);\n\n if (!match || match.index == null) {\n normalized += value.slice(cursor);\n break;\n }\n\n const start = cursor + match.index;\n normalized += value.slice(cursor, start);\n\n let depth = 0;\n let end = start;\n for (; end < value.length; end += 1) {\n const char = value[end];\n if (char === \"(\") {\n depth += 1;\n } else if (char === \")\") {\n depth -= 1;\n if (depth === 0) {\n end += 1;\n break;\n }\n }\n }\n\n const token = value.slice(start, end);\n normalized += normalizeColorToken(token);\n cursor = end;\n }\n\n return normalized;\n}\n\nfunction isCaptureStyleElement(node: Element | null): node is CaptureStyleElement {\n return Boolean(\n node && (node instanceof HTMLElement || node instanceof SVGElement),\n );\n}\n\nfunction applyComputedStylesToClone(\n source: CaptureStyleElement,\n target: CaptureStyleElement,\n) {\n const computed = window.getComputedStyle(source);\n\n for (const propertyName of Array.from(computed)) {\n if (propertyName.startsWith(\"--\")) {\n continue;\n }\n\n const value = computed.getPropertyValue(propertyName);\n if (!value) {\n continue;\n }\n\n target.style.setProperty(\n propertyName,\n normalizeCssColorFunctions(value),\n computed.getPropertyPriority(propertyName),\n );\n }\n\n target.style.setProperty(\"animation\", \"none\");\n target.style.setProperty(\"transition\", \"none\");\n target.style.setProperty(\"caret-color\", \"transparent\");\n}\n\nfunction createCaptureClone(element: HTMLElement) {\n const bounds = element.getBoundingClientRect();\n const width = Math.max(\n 1,\n Math.round(Math.max(bounds.width, element.scrollWidth, element.offsetWidth)),\n );\n const height = Math.max(\n 1,\n Math.round(Math.max(bounds.height, element.scrollHeight, element.offsetHeight)),\n );\n\n const host = document.createElement(\"div\");\n host.style.position = \"fixed\";\n host.style.left = \"-200vw\";\n host.style.top = \"0\";\n host.style.opacity = \"0\";\n host.style.pointerEvents = \"none\";\n host.style.zIndex = \"-1\";\n host.style.width = `${width}px`;\n host.style.height = `${height}px`;\n host.style.overflow = \"hidden\";\n\n const clone = element.cloneNode(true) as HTMLElement;\n host.appendChild(clone);\n document.body.appendChild(host);\n\n const walk = (sourceNode: Element, targetNode: Element) => {\n if (isCaptureStyleElement(sourceNode) && isCaptureStyleElement(targetNode)) {\n if (sourceNode instanceof HTMLElement && targetNode instanceof HTMLElement) {\n targetNode.setAttribute(\"data-hv-source-class\", sourceNode.className);\n }\n targetNode.removeAttribute(\"class\");\n targetNode.removeAttribute(\"style\");\n targetNode.removeAttribute(\"id\");\n applyComputedStylesToClone(sourceNode, targetNode);\n }\n\n const sourceChildren = Array.from(sourceNode.children);\n const targetChildren = Array.from(targetNode.children);\n for (let index = 0; index < sourceChildren.length; index += 1) {\n const sourceChild = sourceChildren[index];\n const targetChild = targetChildren[index];\n if (!sourceChild || !targetChild) {\n continue;\n }\n walk(sourceChild, targetChild);\n }\n };\n\n walk(element, clone);\n\n return {\n clone,\n width,\n height,\n cleanup: () => host.remove(),\n };\n}\n\nfunction createNormalizedStyleDeclaration(\n style: CSSStyleDeclaration,\n): CSSStyleDeclaration {\n return new Proxy(style, {\n get(target, property) {\n if (property === \"getPropertyValue\") {\n return (name: string) => normalizeCssColorFunctions(target.getPropertyValue(name));\n }\n\n if (property === \"item\") {\n return (index: number) => target.item(index);\n }\n\n if (property === Symbol.iterator) {\n return target[Symbol.iterator].bind(target);\n }\n\n const value = Reflect.get(target, property, target);\n if (typeof value === \"string\") {\n return normalizeCssColorFunctions(value);\n }\n\n if (typeof value === \"function\") {\n return value.bind(target);\n }\n\n return value;\n },\n }) as CSSStyleDeclaration;\n}\n\nasync function withNormalizedComputedStyles<T>(action: () => Promise<T>) {\n if (typeof window === \"undefined\") {\n return action();\n }\n\n const originalGetComputedStyle = window.getComputedStyle.bind(window);\n window.getComputedStyle = ((element: Element, pseudoElt?: string | null) =>\n createNormalizedStyleDeclaration(\n originalGetComputedStyle(element, pseudoElt ?? null),\n )) as typeof window.getComputedStyle;\n\n try {\n return await action();\n } finally {\n window.getComputedStyle = originalGetComputedStyle;\n }\n}\n\nexport async function captureElementCanvas(\n element: HTMLElement,\n options?: {\n backgroundColor?: string | null;\n scale?: number;\n ignoreElements?: (element: Element) => boolean;\n sanitizeStyles?: boolean;\n },\n) {\n const bounds = element.getBoundingClientRect();\n const width = Math.max(\n 1,\n Math.round(Math.max(bounds.width, element.scrollWidth, element.offsetWidth)),\n );\n const height = Math.max(\n 1,\n Math.round(Math.max(bounds.height, element.scrollHeight, element.offsetHeight)),\n );\n\n if (width < 2 || height < 2) {\n return null;\n }\n\n const captureOptions = {\n backgroundColor: options?.backgroundColor ?? null,\n scale: options?.scale ?? 2,\n useCORS: true,\n logging: false,\n width,\n height,\n windowWidth: width,\n windowHeight: height,\n ignoreElements: options?.ignoreElements,\n };\n\n if (options?.sanitizeStyles === false) {\n return html2canvas(element, captureOptions);\n }\n\n const snapshot = createCaptureClone(element);\n\n if (snapshot.width < 2 || snapshot.height < 2) {\n snapshot.cleanup();\n return null;\n }\n\n try {\n return await withNormalizedComputedStyles(() =>\n html2canvas(snapshot.clone, {\n ...captureOptions,\n width: snapshot.width,\n height: snapshot.height,\n windowWidth: snapshot.width,\n windowHeight: snapshot.height,\n }),\n );\n } finally {\n snapshot.cleanup();\n }\n}\n\nfunction getSimpleDecorationLines(element: HTMLElement, kind: DecorationKind) {\n const rawText = (element.innerText || element.textContent || \"\").replace(/\\u00a0/g, \" \");\n const maxLines = kind === \"header\" ? 4 : 3;\n\n return rawText\n .split(/\\r?\\n+/)\n .map((line) => line.replace(/\\s+/g, \" \").trim())\n .filter(Boolean)\n .slice(0, maxLines);\n}\n\nasync function loadDecorationLogo(element: HTMLElement) {\n const image = element.querySelector(\"img\");\n const source = image?.getAttribute(\"src\") || image?.getAttribute(\"data-src\") || \"\";\n if (!source || typeof window === \"undefined\") {\n return null;\n }\n\n try {\n return await Promise.race([\n loadImage(source),\n new Promise<null>((resolve) => {\n window.setTimeout(() => resolve(null), 1200);\n }),\n ]);\n } catch {\n return null;\n }\n}\n\nasync function loadDecorationLogoSource(source?: string) {\n if (!source) {\n return null;\n }\n\n try {\n return await Promise.race([\n loadImage(source),\n new Promise<null>((resolve) => {\n window.setTimeout(() => resolve(null), 1200);\n }),\n ]);\n } catch {\n return null;\n }\n}\n\nfunction buildTemplateDecorationModel(\n section: LetterheadSectionTemplate | undefined,\n kind: DecorationKind,\n) {\n if (!section) {\n return null;\n }\n\n const lineQueue = (section.lines || []).map((line) => line.trim()).filter(Boolean);\n const titleSeed = section.brandName?.trim() || section.title?.trim() || lineQueue.shift() || \"\";\n const subtitleLines = [\n ...(section.brandName && section.title ? [section.title.trim()] : []),\n ...(section.subtitle?.trim() ? [section.subtitle.trim()] : []),\n ...lineQueue,\n ].filter(Boolean);\n\n if (!titleSeed && subtitleLines.length === 0 && !section.logoUrl) {\n return null;\n }\n\n return {\n logoUrl: section.logoUrl,\n primaryLine: titleSeed,\n secondaryLines: subtitleLines,\n align: section.align ?? \"left\",\n layout: section.layout ?? (section.logoUrl ? \"logo-left\" : \"text-only\"),\n textColor: section.textColor,\n subtextColor: section.subtextColor,\n accentColor: section.accentColor,\n dividerColor: section.dividerColor,\n backgroundColor: section.backgroundColor,\n badgeText: kind === \"header\" ? section.badgeText?.trim() : undefined,\n };\n}\n\nasync function renderDecorationCanvasFromModel(\n model: ReturnType<typeof buildTemplateDecorationModel>,\n kind: DecorationKind,\n) {\n if (!model) {\n return null;\n }\n\n const logo = await loadDecorationLogoSource(model.logoUrl);\n if (!model.primaryLine && model.secondaryLines.length === 0 && !logo) {\n return null;\n }\n\n const canvasWidth = 1600;\n const canvasHeight = kind === \"header\" ? 146 : 88;\n const canvas = createCanvas(canvasWidth, canvasHeight);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return null;\n }\n\n const accentColor = model.accentColor || \"#bfd4ff\";\n const dividerColor = model.dividerColor || (kind === \"header\" ? \"#dbe7ff\" : \"#d6dee8\");\n const textColor = model.textColor || (kind === \"header\" ? \"#0f172a\" : \"#1f2937\");\n const subtextColor = model.subtextColor || \"#64748b\";\n const background = ctx.createLinearGradient(0, 0, canvas.width, canvas.height);\n background.addColorStop(0, model.backgroundColor || \"#ffffff\");\n background.addColorStop(1, kind === \"header\" ? \"#fbfcff\" : \"#ffffff\");\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n\n const hasLogo = Boolean(logo) && model.layout !== \"text-only\";\n const isStacked = model.layout === \"stacked\";\n const horizontalPadding = 56;\n const logoSlotWidth = hasLogo && !isStacked ? 142 : 0;\n const align = model.align;\n const badgeText = kind === \"header\" ? model.badgeText || \"\" : \"\";\n let badgeMetrics: { width: number; height: number; x: number; y: number } | null = null;\n\n if (badgeText) {\n ctx.save();\n ctx.font = \"600 11px Arial, sans-serif\";\n const badgePaddingX = 11;\n const badgeHeight = 22;\n const badgeWidth = ctx.measureText(badgeText).width + badgePaddingX * 2;\n const badgeX =\n align === \"center\" && !hasLogo\n ? canvas.width / 2 - badgeWidth / 2\n : canvas.width - horizontalPadding - badgeWidth;\n const badgeY = kind === \"header\" ? 24 : 28;\n badgeMetrics = {\n width: badgeWidth,\n height: badgeHeight,\n x: badgeX,\n y: badgeY,\n };\n ctx.restore();\n }\n\n const textX = horizontalPadding + logoSlotWidth;\n const textWidth =\n align === \"center\" && !hasLogo\n ? canvas.width - horizontalPadding * 2\n : canvas.width\n - textX\n - horizontalPadding\n - (badgeMetrics ? badgeMetrics.width + 28 : 0);\n const textAnchor = align === \"center\" && !hasLogo ? canvas.width / 2 : textX;\n\n ctx.fillStyle = kind === \"header\" ? \"#edf4ff\" : \"#f3f6fa\";\n ctx.fillRect(0, 0, canvas.width, kind === \"header\" ? 6 : 3);\n\n if (logo) {\n const maxLogoWidth = kind === \"header\" ? 104 : 72;\n const maxLogoHeight = kind === \"header\" ? 76 : 42;\n const scale = Math.min(maxLogoWidth / logo.width, maxLogoHeight / logo.height, 1);\n const drawWidth = Math.max(1, Math.round(logo.width * scale));\n const drawHeight = Math.max(1, Math.round(logo.height * scale));\n const logoX =\n isStacked || align === \"center\"\n ? canvas.width / 2 - drawWidth / 2\n : horizontalPadding;\n const logoY = kind === \"header\" ? 18 : Math.round((canvas.height - drawHeight) / 2);\n ctx.drawImage(logo, logoX, logoY, drawWidth, drawHeight);\n }\n\n const primaryLine = model.primaryLine;\n const secondaryLines = model.secondaryLines;\n const titleY = kind === \"header\" ? (isStacked && hasLogo ? 108 : 46) : 46;\n const secondaryStartY = kind === \"header\" ? titleY + 24 : 64;\n const titleFont =\n kind === \"header\"\n ? \"700 31px Georgia, 'Times New Roman', serif\"\n : \"600 16px Georgia, 'Times New Roman', serif\";\n const bodyFont =\n kind === \"header\" ? \"500 13px Arial, sans-serif\" : \"500 12px Arial, sans-serif\";\n\n ctx.textAlign = align === \"center\" && !hasLogo ? \"center\" : \"left\";\n ctx.textBaseline = \"alphabetic\";\n\n if (primaryLine) {\n ctx.fillStyle = textColor;\n ctx.font = titleFont;\n ctx.fillText(primaryLine, textAnchor, titleY, textWidth);\n }\n\n if (kind === \"header\") {\n const extraLines = secondaryLines.slice();\n const underlineWidth = Math.min(108, Math.max(52, primaryLine.length * 6.3));\n const underlineStartX =\n align === \"center\" && !hasLogo\n ? canvas.width / 2 - underlineWidth / 2\n : textX;\n\n if (primaryLine) {\n ctx.strokeStyle = accentColor;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(underlineStartX, titleY + 10);\n ctx.lineTo(underlineStartX + underlineWidth, titleY + 10);\n ctx.stroke();\n }\n\n const subtitleStartY = primaryLine ? titleY + 30 : 46;\n const subtitleLineHeight = 17;\n\n ctx.fillStyle = subtextColor;\n ctx.font = bodyFont;\n extraLines.forEach((line, index) => {\n ctx.fillText(line, textAnchor, subtitleStartY + index * subtitleLineHeight, textWidth);\n });\n\n if (badgeText) {\n const safeBadge = badgeMetrics || {\n width: 0,\n height: 22,\n x: canvas.width - horizontalPadding - 80,\n y: 24,\n };\n ctx.save();\n roundedRectPath(\n ctx,\n safeBadge.x,\n safeBadge.y,\n safeBadge.width,\n safeBadge.height,\n safeBadge.height / 2,\n );\n ctx.fillStyle = \"#f4f7ff\";\n ctx.fill();\n ctx.strokeStyle = accentColor;\n ctx.lineWidth = 1;\n ctx.stroke();\n ctx.fillStyle = subtextColor;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = \"600 11px Arial, sans-serif\";\n ctx.fillText(\n badgeText,\n safeBadge.x + safeBadge.width / 2,\n safeBadge.y + safeBadge.height / 2,\n );\n ctx.restore();\n }\n } else {\n ctx.fillStyle = subtextColor;\n ctx.font = bodyFont;\n secondaryLines.forEach((line, index) => {\n ctx.fillText(line, textAnchor, secondaryStartY + index * 16, textWidth);\n });\n }\n\n ctx.strokeStyle = dividerColor;\n ctx.lineWidth = kind === \"header\" ? 1.25 : 1;\n ctx.beginPath();\n if (kind === \"header\") {\n ctx.moveTo(horizontalPadding, canvas.height - 8);\n ctx.lineTo(canvas.width - horizontalPadding, canvas.height - 8);\n } else {\n ctx.moveTo(horizontalPadding, 14);\n ctx.lineTo(canvas.width - horizontalPadding, 14);\n }\n ctx.stroke();\n\n return canvas;\n}\n\nasync function renderSimpleDecorationCanvas(\n element: HTMLElement,\n kind: DecorationKind,\n) {\n const lines = getSimpleDecorationLines(element, kind);\n const align =\n (window.getComputedStyle(element).textAlign || \"\").toLowerCase() === \"center\"\n ? \"center\"\n : \"left\";\n\n return renderDecorationCanvasFromModel(\n buildTemplateDecorationModel(\n {\n logoUrl:\n element.querySelector(\"img\")?.getAttribute(\"src\")\n || element.querySelector(\"img\")?.getAttribute(\"data-src\")\n || undefined,\n brandName: lines[0],\n lines: lines.slice(1),\n align,\n },\n kind,\n ),\n kind,\n );\n}\n\nasync function captureDecorationCanvas(\n element: HTMLElement | null | undefined,\n kind: DecorationKind,\n) {\n if (!element) {\n return null;\n }\n\n const simpleCanvas = await renderSimpleDecorationCanvas(element, kind);\n if (simpleCanvas) {\n return simpleCanvas;\n }\n\n return captureElementCanvas(element, {\n backgroundColor: null,\n scale: 1.5,\n });\n}\n\nasync function preparePageDecorations(\n decorations?: ExportPageDecorations,\n): Promise<PreparedPageDecorations | null> {\n if (\n !decorations?.headerElement\n && !decorations?.footerElement\n && !decorations?.letterheadTemplate?.header\n && !decorations?.letterheadTemplate?.footer\n ) {\n return null;\n }\n\n const [headerCanvas, footerCanvas] = await Promise.all([\n decorations?.letterheadTemplate?.header\n ? renderDecorationCanvasFromModel(\n buildTemplateDecorationModel(decorations.letterheadTemplate.header, \"header\"),\n \"header\",\n )\n : captureDecorationCanvas(decorations?.headerElement, \"header\"),\n decorations?.letterheadTemplate?.footer\n ? renderDecorationCanvasFromModel(\n buildTemplateDecorationModel(decorations.letterheadTemplate.footer, \"footer\"),\n \"footer\",\n )\n : captureDecorationCanvas(decorations?.footerElement, \"footer\"),\n ]);\n\n if (!headerCanvas && !footerCanvas) {\n return null;\n }\n\n return {\n headerCanvas,\n footerCanvas,\n };\n}\n\nfunction getDecorationHeight(\n decorationCanvas: HTMLCanvasElement | null | undefined,\n pageWidth: number,\n maxHeight: number,\n) {\n if (!decorationCanvas || decorationCanvas.width <= 0 || decorationCanvas.height <= 0) {\n return 0;\n }\n\n const scaledHeight = decorationCanvas.height * (pageWidth / decorationCanvas.width);\n return Math.max(1, Math.min(maxHeight, scaledHeight));\n}\n\nfunction applyPageDecorationsToCanvas(\n baseCanvas: HTMLCanvasElement,\n decorations?: PreparedPageDecorations | null,\n) {\n if (!decorations?.headerCanvas && !decorations?.footerCanvas) {\n return baseCanvas;\n }\n\n const pageCanvas = createCanvas(baseCanvas.width, baseCanvas.height);\n const ctx = pageCanvas.getContext(\"2d\");\n\n if (!ctx) {\n return baseCanvas;\n }\n\n const pageWidth = pageCanvas.width;\n const pageHeight = pageCanvas.height;\n const sectionGap = Math.max(3, Math.round(pageHeight * 0.0045));\n const headerHeight = getDecorationHeight(\n decorations.headerCanvas,\n pageWidth,\n pageHeight * 0.105,\n );\n const footerHeight = getDecorationHeight(\n decorations.footerCanvas,\n pageWidth,\n pageHeight * 0.08,\n );\n const reservedHeight =\n headerHeight +\n footerHeight +\n (headerHeight ? sectionGap : 0) +\n (footerHeight ? sectionGap : 0);\n const availableHeight = Math.max(pageHeight - reservedHeight, pageHeight * 0.56);\n const contentScale = Math.min(1, availableHeight / baseCanvas.height);\n const contentWidth = baseCanvas.width * contentScale;\n const contentHeight = baseCanvas.height * contentScale;\n const contentX = (pageWidth - contentWidth) / 2;\n const contentY =\n headerHeight +\n (headerHeight ? sectionGap : 0) +\n Math.max((availableHeight - contentHeight) / 2, 0) * 0.08;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, pageWidth, pageHeight);\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n\n if (decorations.headerCanvas && headerHeight > 0) {\n ctx.drawImage(decorations.headerCanvas, 0, 0, pageWidth, headerHeight);\n }\n\n ctx.drawImage(baseCanvas, contentX, contentY, contentWidth, contentHeight);\n\n if (decorations.footerCanvas && footerHeight > 0) {\n ctx.drawImage(\n decorations.footerCanvas,\n 0,\n pageHeight - footerHeight,\n pageWidth,\n footerHeight,\n );\n }\n\n return pageCanvas;\n}\n\nfunction formatSignedDate(value: string) {\n return normalizeSignatureDate(value);\n}\n\nfunction createTintedImageCanvas(\n image: HTMLImageElement,\n signatureColor: string,\n) {\n const tintedCanvas = createCanvas(image.width, image.height);\n const tintedCtx = tintedCanvas.getContext(\"2d\");\n if (!tintedCtx) {\n return null;\n }\n\n tintedCtx.drawImage(image, 0, 0);\n tintedCtx.globalCompositeOperation = \"source-in\";\n tintedCtx.fillStyle = signatureColor;\n tintedCtx.fillRect(0, 0, tintedCanvas.width, tintedCanvas.height);\n tintedCtx.globalCompositeOperation = \"source-over\";\n return tintedCanvas;\n}\n\nasync function drawSignatureStamp(\n ctx: CanvasRenderingContext2D,\n placement: SignaturePlacement,\n x: number,\n y: number,\n width: number,\n height: number,\n options?: {\n borderless?: boolean;\n },\n) {\n const isSlideStamp = placement.surfaceKind === \"slide\";\n const borderless = options?.borderless ?? false;\n const radius = Math.max(8, Math.min(width, height) * 0.08);\n const padding = isSlideStamp ? Math.max(4, width * 0.026) : Math.max(7, width * 0.048);\n const footerHeight = Math.max(\n isSlideStamp ? 46 : 40,\n height * (isSlideStamp ? 0.36 : 0.32),\n );\n const signatureImage = await loadImage(placement.signature.signatureImageUrl);\n const signatureColor = normalizeSignatureInkColor(placement.signatureColor);\n const tintedSignatureImage = createTintedImageCanvas(\n signatureImage,\n SIGNATURE_INK_COLOR_VALUES[signatureColor],\n );\n const imageBounds = getOpaqueImageBounds(signatureImage);\n const signer = placement.signature.signedBy?.trim() || \"\";\n const jobTitle = placement.signature.jobTitle?.trim() || \"\";\n const signedDate = formatSignedDate(placement.signature.dateSigned);\n\n if (!isSlideStamp && !borderless) {\n ctx.save();\n ctx.shadowColor = \"rgba(15, 23, 42, 0.18)\";\n ctx.shadowBlur = Math.max(8, width * 0.08);\n ctx.shadowOffsetY = Math.max(4, height * 0.03);\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.fillStyle = \"rgba(255, 255, 255, 0.96)\";\n ctx.fill();\n ctx.restore();\n\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.lineWidth = Math.max(1, width * 0.01);\n ctx.strokeStyle = \"rgba(30, 41, 59, 0.22)\";\n ctx.stroke();\n }\n\n const imageAreaWidth = width - padding * 2;\n const imageAreaHeight = height - footerHeight - padding * (isSlideStamp ? 0.8 : 1.2);\n const imageScale = Math.min(\n imageAreaWidth / imageBounds.sw,\n imageAreaHeight / imageBounds.sh,\n );\n const imageWidth = imageBounds.sw * imageScale;\n const imageHeight = imageBounds.sh * imageScale;\n const imageX = x + (width - imageWidth) / 2;\n const imageBaseY = isSlideStamp ? y : y + padding;\n const imageY =\n imageBaseY +\n Math.max(imageAreaHeight - imageHeight, 0) * (isSlideStamp ? 0.7 : 0.18);\n\n ctx.drawImage(\n tintedSignatureImage || signatureImage,\n imageBounds.sx,\n imageBounds.sy,\n imageBounds.sw,\n imageBounds.sh,\n imageX,\n imageY,\n imageWidth,\n imageHeight,\n );\n\n const footerY = y + height - footerHeight;\n const nameFontSize = Math.max(\n isSlideStamp ? 16 : 12,\n height * (isSlideStamp ? 0.102 : 0.08),\n );\n const jobTitleFontSize = Math.max(\n isSlideStamp ? 13 : 10,\n height * (isSlideStamp ? 0.088 : 0.066),\n );\n const dateFontSize = Math.max(\n isSlideStamp ? 12 : 9,\n height * (isSlideStamp ? 0.08 : 0.058),\n );\n const footerLineGap = Math.max(3, height * 0.018);\n let footerTextY = footerY + Math.max(4, padding * 0.16);\n\n ctx.fillStyle = \"#334155\";\n ctx.textBaseline = \"top\";\n if (signer) {\n ctx.font = `700 ${nameFontSize}px Arial, sans-serif`;\n ctx.fillText(signer, x + padding, footerTextY, width * 0.78);\n footerTextY += nameFontSize + footerLineGap;\n }\n\n if (jobTitle) {\n ctx.font = `700 ${jobTitleFontSize}px Arial, sans-serif`;\n ctx.fillText(jobTitle, x + padding, footerTextY, width * 0.78);\n footerTextY += jobTitleFontSize + footerLineGap;\n }\n\n ctx.font = `500 ${dateFontSize}px Arial, sans-serif`;\n ctx.fillText(signedDate, x + padding, footerTextY, width * 0.78);\n}\n\nasync function drawPlacementsOnCanvas(\n ctx: CanvasRenderingContext2D,\n placements: SignaturePlacement[],\n surfaceWidth: number,\n surfaceHeight: number,\n options?: {\n borderless?: boolean;\n },\n) {\n for (const placement of placements) {\n await drawSignatureStamp(\n ctx,\n placement,\n placement.x * surfaceWidth,\n placement.y * surfaceHeight,\n placement.width * surfaceWidth,\n placement.height * surfaceHeight,\n options,\n );\n }\n}\n\nfunction clipRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n) {\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.clip();\n}\n\nfunction wrapTextToWidth(\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number,\n) {\n const lines: string[] = [];\n const paragraphs = text.split(/\\r?\\n/);\n\n for (const paragraph of paragraphs) {\n const words = paragraph.trim().split(/\\s+/).filter(Boolean);\n\n if (words.length === 0) {\n lines.push(\"\");\n continue;\n }\n\n let currentLine = \"\";\n\n for (const word of words) {\n const nextLine = currentLine ? `${currentLine} ${word}` : word;\n if (ctx.measureText(nextLine).width <= maxWidth) {\n currentLine = nextLine;\n continue;\n }\n\n if (currentLine) {\n lines.push(currentLine);\n }\n\n if (ctx.measureText(word).width <= maxWidth) {\n currentLine = word;\n continue;\n }\n\n let remaining = word;\n while (remaining.length > 0) {\n let sliceLength = remaining.length;\n while (\n sliceLength > 1\n && ctx.measureText(remaining.slice(0, sliceLength)).width > maxWidth\n ) {\n sliceLength -= 1;\n }\n lines.push(remaining.slice(0, sliceLength));\n remaining = remaining.slice(sliceLength);\n }\n currentLine = \"\";\n }\n\n if (currentLine) {\n lines.push(currentLine);\n }\n }\n\n return lines;\n}\n\nfunction drawEmptyAnnotationLines(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n lineHeight: number,\n) {\n ctx.save();\n ctx.strokeStyle = \"rgba(180, 83, 9, 0.32)\";\n ctx.lineWidth = Math.max(1, lineHeight * 0.08);\n\n for (let index = 0; index < 3; index += 1) {\n const lineY = y + index * lineHeight;\n ctx.beginPath();\n ctx.moveTo(x, lineY);\n ctx.lineTo(x + width * (index === 2 ? 0.68 : 1), lineY);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\nasync function drawAnnotationCard(\n ctx: CanvasRenderingContext2D,\n annotation: AnnotationPlacement,\n x: number,\n y: number,\n width: number,\n height: number,\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n) {\n const radius = Math.max(10, Math.min(width, height) * 0.08);\n const padding = Math.max(10, width * 0.065);\n const headerHeight = Math.max(26, Math.min(height * 0.28, 42));\n const title = annotation.linkedSignaturePlacementId\n ? labels.linkedAnnotationTitle\n : labels.annotationTitle;\n const bodyText = annotation.text.trim();\n\n ctx.save();\n ctx.shadowColor = \"rgba(15, 23, 42, 0.14)\";\n ctx.shadowBlur = Math.max(8, width * 0.08);\n ctx.shadowOffsetY = Math.max(4, height * 0.03);\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.fillStyle = annotation.linkedSignaturePlacementId\n ? \"rgba(254, 249, 195, 0.98)\"\n : \"rgba(255, 251, 235, 0.98)\";\n ctx.fill();\n ctx.restore();\n\n ctx.save();\n clipRoundedRect(ctx, x, y, width, height, radius);\n ctx.fillStyle = \"rgba(245, 158, 11, 0.18)\";\n ctx.fillRect(x, y, width, headerHeight);\n ctx.restore();\n\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.lineWidth = Math.max(1, width * 0.008);\n ctx.strokeStyle = \"rgba(217, 119, 6, 0.34)\";\n ctx.stroke();\n\n const titleFontSize = Math.max(10, height * 0.085);\n ctx.fillStyle = \"#92400e\";\n ctx.font = `700 ${titleFontSize}px Arial, sans-serif`;\n ctx.textBaseline = \"middle\";\n ctx.fillText(title, x + padding, y + headerHeight / 2);\n\n if (annotation.linkedSignaturePlacementId) {\n const badge = labels.linkedAnnotationBadge;\n const badgeFontSize = Math.max(9, titleFontSize * 0.82);\n ctx.font = `700 ${badgeFontSize}px Arial, sans-serif`;\n const badgeWidth = ctx.measureText(badge).width + 16;\n const badgeHeight = Math.max(18, badgeFontSize * 1.9);\n const badgeX = x + width - padding - badgeWidth;\n const badgeY = y + (headerHeight - badgeHeight) / 2;\n roundedRectPath(ctx, badgeX, badgeY, badgeWidth, badgeHeight, badgeHeight / 2);\n ctx.fillStyle = \"rgba(217, 119, 6, 0.12)\";\n ctx.fill();\n ctx.fillStyle = \"#b45309\";\n ctx.textAlign = \"center\";\n ctx.fillText(badge, badgeX + badgeWidth / 2, badgeY + badgeHeight / 2);\n ctx.textAlign = \"left\";\n }\n\n const bodyFontSize = Math.max(11, height * 0.085);\n const lineHeight = bodyFontSize * 1.35;\n const bodyX = x + padding;\n const bodyY = y + headerHeight + padding * 0.65;\n const maxTextWidth = Math.max(width - padding * 2, 10);\n const maxLines = Math.max(\n 1,\n Math.floor((height - headerHeight - padding * 1.4) / lineHeight),\n );\n\n if (!bodyText) {\n drawEmptyAnnotationLines(\n ctx,\n bodyX,\n bodyY + lineHeight * 0.3,\n maxTextWidth,\n lineHeight,\n );\n return;\n }\n\n const lines = wrapTextToWidth(ctx, bodyText, maxTextWidth).slice(0, maxLines);\n ctx.fillStyle = \"#451a03\";\n ctx.font = `500 ${bodyFontSize}px Arial, sans-serif`;\n ctx.textBaseline = \"top\";\n\n for (const [index, line] of lines.entries()) {\n ctx.fillText(line, bodyX, bodyY + index * lineHeight, maxTextWidth);\n }\n}\n\nasync function drawAnnotationsOnCanvas(\n ctx: CanvasRenderingContext2D,\n annotations: AnnotationPlacement[],\n surfaceWidth: number,\n surfaceHeight: number,\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n) {\n for (const annotation of annotations) {\n await drawAnnotationCard(\n ctx,\n annotation,\n annotation.x * surfaceWidth,\n annotation.y * surfaceHeight,\n annotation.width * surfaceWidth,\n annotation.height * surfaceHeight,\n labels,\n );\n }\n}\n\nasync function createSignatureStampDataUrl(\n placement: SignaturePlacement,\n width?: number,\n height?: number,\n) {\n const aspectRatio =\n placement.width > 0 && placement.height > 0\n ? placement.width / placement.height\n : 3.1;\n const targetHeight = height ?? (placement.surfaceKind === \"slide\" ? 320 : 260);\n const targetWidth = width ?? Math.max(480, Math.round(targetHeight * aspectRatio));\n const canvas = createCanvas(targetWidth, targetHeight);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Unable to render the signature stamp.\");\n }\n\n await drawSignatureStamp(ctx, placement, 0, 0, targetWidth, targetHeight);\n return canvas.toDataURL(\"image/png\");\n}\n\nasync function createAnnotationCardDataUrl(\n annotation: AnnotationPlacement,\n width = 720,\n height = 360,\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n) {\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Unable to render the annotation.\");\n }\n\n await drawAnnotationCard(ctx, annotation, 0, 0, width, height, labels);\n return canvas.toDataURL(\"image/png\");\n}\n\nasync function preserveNativePptxFile(args: {\n sourceArrayBuffer: ArrayBuffer;\n fileName: string;\n exportState: PptxExportState;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n labels: ExportLocaleLabels;\n}) {\n const zip = await JSZip.loadAsync(args.sourceArrayBuffer.slice(0));\n const slidePaths = await getOrderedPptSlidePaths(zip);\n await ensureContentTypeDefault(zip, \"png\", \"image/png\");\n\n for (const [index, slidePath] of slidePaths.entries()) {\n const surfaceKey = `slide:${index + 1}`;\n const slidePlacements = args.placements.filter(\n (placement) => placement.surfaceKey === surfaceKey,\n );\n const slideAnnotations = args.annotations.filter(\n (annotation) => annotation.surfaceKey === surfaceKey,\n );\n\n if (slidePlacements.length === 0 && slideAnnotations.length === 0) {\n continue;\n }\n\n const slideFile = zip.file(slidePath);\n if (!slideFile) {\n continue;\n }\n\n const slideDoc = parseXmlDocument(await slideFile.async(\"string\"));\n const spTree = slideDoc.getElementsByTagNameNS(NS_PML, \"spTree\")[0];\n if (!spTree) {\n continue;\n }\n\n const relsPath = slidePath.replace(\n /ppt\\/slides\\/(slide\\d+\\.xml)$/i,\n \"ppt/slides/_rels/$1.rels\",\n );\n const relsDoc = await getOrCreateRelationshipsDocument(zip, relsPath);\n let nextShapeId = getMaxAttributeNumber(slideDoc, \"cNvPr\", \"id\") + 1;\n\n for (const placement of slidePlacements) {\n const mediaPath = getNextSequentialPath(zip, \"ppt/media\", \"hv-overlay-\", \"png\");\n const mediaFileName = mediaPath.split(\"/\").pop() || \"hv-overlay.png\";\n const imageData = await createSignatureStampDataUrl(placement);\n zip.file(mediaPath, dataUrlToUint8Array(imageData));\n const relationshipId = appendRelationship(\n relsDoc,\n REL_TYPE_IMAGE,\n `../media/${mediaFileName}`,\n );\n\n spTree.appendChild(\n createPptOverlayPictureNode({\n document: slideDoc,\n relationshipId,\n shapeId: nextShapeId,\n name: `HV Signature ${nextShapeId}`,\n x: placement.x * args.exportState.slideSize.width,\n y: placement.y * args.exportState.slideSize.height,\n width: placement.width * args.exportState.slideSize.width,\n height: placement.height * args.exportState.slideSize.height,\n description: placement.signature.signedBy || \"Signature\",\n }),\n );\n nextShapeId += 1;\n }\n\n for (const annotation of slideAnnotations) {\n const mediaPath = getNextSequentialPath(zip, \"ppt/media\", \"hv-overlay-\", \"png\");\n const mediaFileName = mediaPath.split(\"/\").pop() || \"hv-overlay.png\";\n const imageData = await createAnnotationCardDataUrl(\n annotation,\n 720,\n 360,\n args.labels,\n );\n zip.file(mediaPath, dataUrlToUint8Array(imageData));\n const relationshipId = appendRelationship(\n relsDoc,\n REL_TYPE_IMAGE,\n `../media/${mediaFileName}`,\n );\n\n spTree.appendChild(\n createPptOverlayPictureNode({\n document: slideDoc,\n relationshipId,\n shapeId: nextShapeId,\n name: `HV Annotation ${nextShapeId}`,\n x: annotation.x * args.exportState.slideSize.width,\n y: annotation.y * args.exportState.slideSize.height,\n width: annotation.width * args.exportState.slideSize.width,\n height: annotation.height * args.exportState.slideSize.height,\n description: annotation.linkedSignaturePlacementId\n ? args.labels.linkedAnnotationAltLabel\n : args.labels.annotationAltLabel,\n }),\n );\n nextShapeId += 1;\n }\n\n zip.file(slidePath, serializeXmlDocument(slideDoc));\n zip.file(relsPath, serializeXmlDocument(relsDoc));\n }\n\n return {\n base64: arrayBufferToBase64(await zip.generateAsync({ type: \"arraybuffer\" })),\n fileName: replaceExtension(args.fileName, \"pptx\"),\n fileType: \"pptx\" as const,\n mimeType: mimeTypeForFileType(\"pptx\"),\n };\n}\n\nasync function preserveNativeSpreadsheetFile(args: {\n sourceArrayBuffer: ArrayBuffer;\n fileName: string;\n sheets: SpreadsheetSheetExportModel[];\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n labels: ExportLocaleLabels;\n dirtyCellAddressesBySheet?: Record<string, string[]>;\n}) {\n const zip = await JSZip.loadAsync(args.sourceArrayBuffer.slice(0));\n const workbookSheets = await getWorkbookSheetInfos(zip);\n await ensureContentTypeDefault(zip, \"png\", \"image/png\");\n let workbookNeedsRecalc = false;\n\n for (const sheetModel of args.sheets) {\n const sheetInfo = workbookSheets.find((sheet) => sheet.name === sheetModel.name);\n if (!sheetInfo) {\n continue;\n }\n\n const sheetPlacements = args.placements.filter(\n (placement) => placement.surfaceKey === `sheet:${sheetModel.name}`,\n );\n const sheetAnnotations = args.annotations.filter(\n (annotation) => annotation.surfaceKey === `sheet:${sheetModel.name}`,\n );\n const dirtyAddresses = Array.from(\n new Set(args.dirtyCellAddressesBySheet?.[sheetModel.name] ?? []),\n );\n\n if (\n sheetPlacements.length === 0 &&\n sheetAnnotations.length === 0 &&\n dirtyAddresses.length === 0\n ) {\n continue;\n }\n\n const sheetFile = zip.file(sheetInfo.path);\n if (!sheetFile) {\n continue;\n }\n\n const sheetDoc = parseXmlDocument(await sheetFile.async(\"string\"));\n const worksheet = sheetDoc.getElementsByTagNameNS(NS_SML, \"worksheet\")[0];\n if (!worksheet) {\n continue;\n }\n\n let sheetChanged = false;\n\n if (dirtyAddresses.length > 0) {\n const sheetData = getOrCreateWorksheetSheetData(sheetDoc, worksheet);\n for (const address of dirtyAddresses) {\n const decoded = XLSX.utils.decode_cell(address);\n applySpreadsheetWorksheetEdit({\n document: sheetDoc,\n worksheet,\n sheetData,\n address,\n cellModel: sheetModel.cells[makeSheetCellKey(decoded.r, decoded.c)],\n });\n }\n\n workbookNeedsRecalc = true;\n sheetChanged = true;\n }\n\n if (sheetPlacements.length === 0 && sheetAnnotations.length === 0) {\n if (sheetChanged) {\n zip.file(sheetInfo.path, serializeXmlDocument(sheetDoc));\n }\n continue;\n }\n\n const sheetRelsPath = sheetInfo.path.replace(\n /xl\\/worksheets\\/(sheet\\d+\\.xml)$/i,\n \"xl/worksheets/_rels/$1.rels\",\n );\n const sheetRelsDoc = await getOrCreateRelationshipsDocument(zip, sheetRelsPath);\n let drawingRelationship = Array.from(\n sheetRelsDoc.getElementsByTagName(\"Relationship\"),\n ).find((node) => node.getAttribute(\"Type\") === REL_TYPE_DRAWING);\n\n let drawingPath = drawingRelationship\n ? resolveZipPath(sheetRelsPath, drawingRelationship.getAttribute(\"Target\") || \"\")\n : \"\";\n\n if (!drawingPath) {\n drawingPath = getNextSequentialPath(zip, \"xl/drawings\", \"drawing\", \"xml\");\n const target = toRelativeZipTarget(sheetInfo.path, drawingPath);\n const relationshipId = appendRelationship(sheetRelsDoc, REL_TYPE_DRAWING, target);\n drawingRelationship = Array.from(sheetRelsDoc.getElementsByTagName(\"Relationship\")).find(\n (node) => node.getAttribute(\"Id\") === relationshipId,\n );\n await ensureContentTypeOverride(\n zip,\n `/${drawingPath}`,\n \"application/vnd.openxmlformats-officedocument.drawing+xml\",\n );\n\n const drawingNode = sheetDoc.createElementNS(NS_SML, \"drawing\");\n drawingNode.setAttributeNS(NS_REL_OFFICE, \"r:id\", relationshipId);\n worksheet.appendChild(drawingNode);\n }\n\n const drawingDoc = await getOrCreateSheetDrawingDocument(zip, drawingPath);\n const drawingRoot = drawingDoc.documentElement;\n const drawingRelsPath = drawingPath.replace(\n /xl\\/drawings\\/([^/]+\\.xml)$/i,\n \"xl/drawings/_rels/$1.rels\",\n );\n const drawingRelsDoc = await getOrCreateRelationshipsDocument(zip, drawingRelsPath);\n let nextShapeId = getMaxAttributeNumber(drawingDoc, \"cNvPr\", \"id\") + 1;\n\n const totalWidth =\n SHEET_ROW_HEADER_WIDTH +\n sheetModel.colWidths\n .slice(0, sheetModel.renderedColCount)\n .reduce((sum, value) => sum + value, 0);\n const totalHeight =\n SHEET_COLUMN_HEADER_HEIGHT +\n sheetModel.rowHeights\n .slice(0, sheetModel.renderedRowCount)\n .reduce((sum, value) => sum + value, 0);\n\n const visibleColWidths = sheetModel.colWidths.slice(0, sheetModel.renderedColCount);\n const visibleRowHeights = sheetModel.rowHeights.slice(0, sheetModel.renderedRowCount);\n\n for (const placement of sheetPlacements) {\n const mediaPath = getNextSequentialPath(zip, \"xl/media\", \"hv-overlay-\", \"png\");\n const imageData = await createSignatureStampDataUrl(placement);\n zip.file(mediaPath, dataUrlToUint8Array(imageData));\n const relationshipId = appendRelationship(\n drawingRelsDoc,\n REL_TYPE_IMAGE,\n toRelativeZipTarget(drawingPath, mediaPath),\n );\n const pixelX = clamp(\n placement.x * totalWidth - SHEET_ROW_HEADER_WIDTH,\n 0,\n Math.max(totalWidth - SHEET_ROW_HEADER_WIDTH, 0),\n );\n const pixelY = clamp(\n placement.y * totalHeight - SHEET_COLUMN_HEADER_HEIGHT,\n 0,\n Math.max(totalHeight - SHEET_COLUMN_HEADER_HEIGHT, 0),\n );\n const anchor = buildSpreadsheetAnchor(\n pixelX,\n pixelY,\n placement.width * totalWidth,\n placement.height * totalHeight,\n visibleColWidths,\n visibleRowHeights,\n );\n\n drawingRoot.appendChild(\n createWorksheetOverlayNode({\n document: drawingDoc,\n relationshipId,\n shapeId: nextShapeId,\n name: `HV Signature ${nextShapeId}`,\n anchor,\n description: placement.signature.signedBy || \"Signature\",\n }),\n );\n nextShapeId += 1;\n }\n\n for (const annotation of sheetAnnotations) {\n const mediaPath = getNextSequentialPath(zip, \"xl/media\", \"hv-overlay-\", \"png\");\n const imageData = await createAnnotationCardDataUrl(\n annotation,\n 720,\n 360,\n args.labels,\n );\n zip.file(mediaPath, dataUrlToUint8Array(imageData));\n const relationshipId = appendRelationship(\n drawingRelsDoc,\n REL_TYPE_IMAGE,\n toRelativeZipTarget(drawingPath, mediaPath),\n );\n const pixelX = clamp(\n annotation.x * totalWidth - SHEET_ROW_HEADER_WIDTH,\n 0,\n Math.max(totalWidth - SHEET_ROW_HEADER_WIDTH, 0),\n );\n const pixelY = clamp(\n annotation.y * totalHeight - SHEET_COLUMN_HEADER_HEIGHT,\n 0,\n Math.max(totalHeight - SHEET_COLUMN_HEADER_HEIGHT, 0),\n );\n const anchor = buildSpreadsheetAnchor(\n pixelX,\n pixelY,\n annotation.width * totalWidth,\n annotation.height * totalHeight,\n visibleColWidths,\n visibleRowHeights,\n );\n\n drawingRoot.appendChild(\n createWorksheetOverlayNode({\n document: drawingDoc,\n relationshipId,\n shapeId: nextShapeId,\n name: `HV Annotation ${nextShapeId}`,\n anchor,\n description: annotation.linkedSignaturePlacementId\n ? args.labels.linkedAnnotationAltLabel\n : args.labels.annotationAltLabel,\n }),\n );\n nextShapeId += 1;\n }\n\n sheetChanged = true;\n zip.file(sheetInfo.path, serializeXmlDocument(sheetDoc));\n zip.file(sheetRelsPath, serializeXmlDocument(sheetRelsDoc));\n zip.file(drawingPath, serializeXmlDocument(drawingDoc));\n zip.file(drawingRelsPath, serializeXmlDocument(drawingRelsDoc));\n }\n\n if (workbookNeedsRecalc) {\n await markWorkbookForFullCalculation(zip);\n }\n\n return {\n base64: arrayBufferToBase64(await zip.generateAsync({ type: \"arraybuffer\" })),\n fileName: replaceExtension(args.fileName, \"xlsx\"),\n fileType: \"xlsx\" as const,\n mimeType: mimeTypeForFileType(\"xlsx\"),\n };\n}\n\nasync function renderCanvasesToPdf(\n canvases: HTMLCanvasElement[],\n fileName: string,\n pageDecorations?: ExportPageDecorations,\n) {\n const pdf = await PDFDocument.create();\n const preparedDecorations = await preparePageDecorations(pageDecorations);\n\n for (const sourceCanvas of canvases) {\n const canvas = applyPageDecorationsToCanvas(sourceCanvas, preparedDecorations);\n const image = await pdf.embedJpg(canvas.toDataURL(\"image/jpeg\", 0.92));\n const page = pdf.addPage([canvas.width, canvas.height]);\n page.drawImage(image, {\n x: 0,\n y: 0,\n width: canvas.width,\n height: canvas.height,\n });\n }\n\n return {\n base64: await pdf.saveAsBase64(),\n fileName: replaceExtension(fileName, \"pdf\"),\n fileType: \"pdf\" as const,\n mimeType: mimeTypeForFileType(\"pdf\"),\n exportedAsPdf: true,\n };\n}\n\nfunction splitTallCanvas(canvas: HTMLCanvasElement) {\n const canvases: HTMLCanvasElement[] = [];\n const maxSliceHeight = Math.max(\n Math.round(canvas.width * 1.4),\n Math.round(canvas.width),\n );\n\n if (canvas.height <= maxSliceHeight) {\n return [canvas];\n }\n\n for (let offset = 0; offset < canvas.height; offset += maxSliceHeight) {\n const sliceHeight = Math.min(maxSliceHeight, canvas.height - offset);\n const sliceCanvas = createCanvas(canvas.width, sliceHeight);\n const ctx = sliceCanvas.getContext(\"2d\");\n if (!ctx) {\n continue;\n }\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, sliceCanvas.width, sliceCanvas.height);\n ctx.drawImage(\n canvas,\n 0,\n offset,\n canvas.width,\n sliceHeight,\n 0,\n 0,\n sliceCanvas.width,\n sliceCanvas.height,\n );\n canvases.push(sliceCanvas);\n }\n\n return canvases;\n}\n\nasync function createDocxFromCanvases(\n canvases: HTMLCanvasElement[],\n fileName: string,\n) {\n const children: Paragraph[] = [];\n\n for (const [index, canvas] of canvases.entries()) {\n const blob = await canvasToBlob(canvas, \"image/png\");\n const buffer = new Uint8Array(await blob.arrayBuffer());\n const scale = Math.min(1, 560 / canvas.width);\n\n children.push(\n new Paragraph({\n children: [\n new ImageRun({\n data: buffer,\n type: \"png\",\n transformation: {\n width: Math.round(canvas.width * scale),\n height: Math.round(canvas.height * scale),\n },\n }),\n ],\n }),\n );\n\n if (index < canvases.length - 1) {\n children.push(\n new Paragraph({\n children: [new PageBreak()],\n }),\n );\n }\n }\n\n const document = new Document({\n sections: [\n {\n properties: {},\n children,\n },\n ],\n });\n\n return {\n base64: await Packer.toBase64String(document),\n fileName: replaceExtension(fileName, \"docx\"),\n fileType: \"docx\" as const,\n mimeType: mimeTypeForFileType(\"docx\"),\n };\n}\n\nfunction emuToInches(value: number) {\n return value / EMU_PER_INCH;\n}\n\nasync function loadPptxGenJS(): Promise<PptxGenConstructor> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"PowerPoint export is only available in the browser.\");\n }\n\n if (window.PptxGenJS) {\n return window.PptxGenJS;\n }\n\n const existingScript = document.querySelector<HTMLScriptElement>(\n 'script[data-hv-pptxgen=\"true\"]',\n );\n\n if (existingScript) {\n await new Promise<void>((resolve, reject) => {\n if (window.PptxGenJS) {\n resolve();\n return;\n }\n\n existingScript.addEventListener(\"load\", () => resolve(), { once: true });\n existingScript.addEventListener(\n \"error\",\n () => reject(new Error(\"Unable to load the PowerPoint export engine.\")),\n { once: true },\n );\n });\n } else {\n await new Promise<void>((resolve, reject) => {\n void import(\"../../generated/pptxgenBundle\")\n .then(({ pptxgenBundleSource }) => {\n const blob = new Blob([pptxgenBundleSource], {\n type: \"text/javascript\",\n });\n const blobUrl = URL.createObjectURL(blob);\n\n (window as Window & { JSZip?: typeof JSZip }).JSZip = JSZip;\n const script = document.createElement(\"script\");\n script.src = blobUrl;\n script.async = true;\n script.dataset.hvPptxgen = \"true\";\n script.onload = () => {\n URL.revokeObjectURL(blobUrl);\n resolve();\n };\n script.onerror = () => {\n URL.revokeObjectURL(blobUrl);\n reject(new Error(\"Unable to load the PowerPoint export engine.\"));\n };\n document.head.appendChild(script);\n })\n .catch(() => {\n reject(new Error(\"Unable to load the PowerPoint export engine.\"));\n });\n });\n }\n\n if (!window.PptxGenJS) {\n throw new Error(\"The PowerPoint export engine did not initialize.\");\n }\n\n return window.PptxGenJS;\n}\n\nfunction paragraphToText(paragraph: PptxParagraphModel) {\n const text = paragraph.runs.map((run) => run.text).join(\"\");\n const indentation = \" \".repeat(paragraph.level);\n const prefix = paragraph.bullet\n ? `${indentation}${paragraph.bulletText || \"\\u2022\"} `\n : indentation;\n return `${prefix}${text}`;\n}\n\nasync function renderSlidesToCanvases(\n exportState: PptxExportState,\n placements: SignaturePlacement[],\n annotations: AnnotationPlacement[],\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n options?: {\n borderlessSignatures?: boolean;\n },\n) {\n const slideWidth = exportState.slideSize.width || 9144000;\n const slideHeight = exportState.slideSize.height || 5143500;\n const targetWidth = 1280;\n const scale = targetWidth / slideWidth;\n const canvases: HTMLCanvasElement[] = [];\n\n for (const [index, slide] of exportState.slides.entries()) {\n const canvas = createCanvas(slideWidth * scale, slideHeight * scale);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n continue;\n }\n\n ctx.fillStyle = slide.background || \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n for (const element of slide.elements) {\n if (element.width <= 0 || element.height <= 0) {\n continue;\n }\n\n const x = element.x * scale;\n const y = element.y * scale;\n const width = element.width * scale;\n const height = element.height * scale;\n\n ctx.save();\n if (element.rotation) {\n ctx.translate(x + width / 2, y + height / 2);\n ctx.rotate((element.rotation * Math.PI) / 180);\n ctx.translate(-(x + width / 2), -(y + height / 2));\n }\n\n if (element.kind === \"image\" && element.imageSrc) {\n const image = await tryLoadImage(element.imageSrc);\n if (image) {\n ctx.drawImage(image, x, y, width, height);\n } else {\n ctx.fillStyle = \"rgba(241, 245, 249, 0.92)\";\n ctx.fillRect(x, y, width, height);\n ctx.strokeStyle = \"rgba(148, 163, 184, 0.45)\";\n ctx.lineWidth = Math.max(1, width * 0.003);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle = \"#64748b\";\n ctx.font = `${Math.max(11, width * 0.03)}px Arial, sans-serif`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(element.alt || \"Slide image\", x + width / 2, y + height / 2, width - 28);\n }\n ctx.restore();\n continue;\n }\n\n if (element.fill) {\n ctx.fillStyle = element.fill;\n ctx.fillRect(x, y, width, height);\n }\n\n if (element.stroke) {\n ctx.strokeStyle = element.stroke;\n ctx.lineWidth = Math.max(1, width * 0.005);\n ctx.strokeRect(x, y, width, height);\n }\n\n if (element.paragraphs?.length) {\n const paragraphPaddingX = Math.max(12, width * 0.04);\n let cursorY = y + Math.max(14, height * 0.08);\n\n for (const paragraph of element.paragraphs) {\n const primaryRun = paragraph.runs[0];\n const paragraphText = paragraph.runs.map((run) => run.text).join(\"\");\n const prefix = paragraph.bullet ? `${paragraph.bulletText || \"\\u2022\"} ` : \"\";\n const displayText = `${prefix}${paragraphText}`.trimEnd();\n const fontSize = Math.max(\n 12,\n (primaryRun?.fontSize || 18) * scale,\n );\n const lineHeight = fontSize * 1.34;\n const weight = primaryRun?.bold ? \"700\" : \"400\";\n const align =\n paragraph.align === \"ctr\"\n ? \"center\"\n : paragraph.align === \"r\"\n ? \"right\"\n : \"left\";\n const leftIndent = paragraph.level * 18 * scale;\n const availableWidth = Math.max(\n width - paragraphPaddingX * 2 - leftIndent,\n 40,\n );\n\n ctx.font = `${weight} ${fontSize}px Arial, sans-serif`;\n const lines = wrapTextToWidth(ctx, displayText, availableWidth);\n\n for (const line of lines) {\n ctx.font = `${weight} ${fontSize}px Arial, sans-serif`;\n ctx.fillStyle = primaryRun?.color || \"#0f172a\";\n ctx.textBaseline = \"top\";\n ctx.textAlign = align;\n\n let textX = x + paragraphPaddingX + leftIndent;\n const textWidth = ctx.measureText(line).width;\n\n if (align === \"center\") {\n textX = x + width / 2;\n } else if (align === \"right\") {\n textX = x + width - paragraphPaddingX;\n }\n\n ctx.fillText(line, textX, cursorY, availableWidth);\n\n if (primaryRun?.underline) {\n ctx.strokeStyle = primaryRun.color || \"#0f172a\";\n ctx.lineWidth = Math.max(1, fontSize * 0.08);\n ctx.beginPath();\n const underlineStart =\n align === \"center\"\n ? textX - textWidth / 2\n : align === \"right\"\n ? textX - textWidth\n : textX;\n ctx.moveTo(underlineStart, cursorY + fontSize + 2);\n ctx.lineTo(underlineStart + textWidth, cursorY + fontSize + 2);\n ctx.stroke();\n }\n\n cursorY += lineHeight;\n }\n\n cursorY += Math.max(fontSize * 0.35, 8);\n }\n }\n\n ctx.restore();\n }\n\n await drawPlacementsOnCanvas(\n ctx,\n placements.filter((placement) => placement.surfaceKey === `slide:${index + 1}`),\n canvas.width,\n canvas.height,\n options?.borderlessSignatures ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n annotations.filter(\n (annotation) => annotation.surfaceKey === `slide:${index + 1}`,\n ),\n canvas.width,\n canvas.height,\n labels,\n );\n\n canvases.push(canvas);\n }\n\n return canvases.length > 0 ? canvases : [createCanvas(1280, 720)];\n}\n\nfunction createSheetMergeLookup(merges: SpreadsheetMergeModel[]) {\n const starts = new Map<string, SpreadsheetMergeModel>();\n const covered = new Set<string>();\n\n for (const merge of merges) {\n starts.set(`${merge.startRow}:${merge.startCol}`, merge);\n\n for (let row = merge.startRow; row <= merge.endRow; row += 1) {\n for (let col = merge.startCol; col <= merge.endCol; col += 1) {\n if (row === merge.startRow && col === merge.startCol) {\n continue;\n }\n\n covered.add(`${row}:${col}`);\n }\n }\n }\n\n return { starts, covered };\n}\n\nfunction toColumnLabel(index: number) {\n let label = \"\";\n let current = index;\n\n while (current >= 0) {\n label = String.fromCharCode((current % 26) + 65) + label;\n current = Math.floor(current / 26) - 1;\n }\n\n return label;\n}\n\nfunction offsetToGridPosition(offset: number, sizes: number[]) {\n let remaining = offset;\n\n for (let index = 0; index < sizes.length; index += 1) {\n const size = sizes[index];\n if (remaining <= size) {\n return index + clamp(remaining / size, 0, 0.9999);\n }\n remaining -= size;\n }\n\n return sizes.length;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction cloneSpreadsheetSerializable<T>(value: T): T {\n if (value == null) {\n return value;\n }\n\n if (value instanceof Date) {\n return new Date(value) as T;\n }\n\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction makeSheetCellKey(row: number, col: number) {\n return `${row}:${col}`;\n}\n\nfunction stripArgbAlpha(argb?: string) {\n if (!argb) {\n return undefined;\n }\n\n const normalized = argb.replace(\"#\", \"\").trim();\n if (normalized.length === 8) {\n return `#${normalized.slice(2)}`;\n }\n if (normalized.length === 6) {\n return `#${normalized}`;\n }\n return undefined;\n}\n\nfunction getSpreadsheetColor(color: unknown) {\n if (!isRecord(color)) {\n return undefined;\n }\n\n if (typeof color.argb === \"string\") {\n return stripArgbAlpha(color.argb);\n }\n\n return undefined;\n}\n\nfunction getSpreadsheetTextColor(cell?: SpreadsheetCellExportModel) {\n if (!cell?.font || !isRecord(cell.font)) {\n return undefined;\n }\n\n return getSpreadsheetColor(cell.font.color);\n}\n\nfunction getSpreadsheetFillColor(cell?: SpreadsheetCellExportModel) {\n if (!cell?.fill || !isRecord(cell.fill)) {\n return undefined;\n }\n\n return (\n getSpreadsheetColor(cell.fill.fgColor) ||\n getSpreadsheetColor(cell.fill.bgColor)\n );\n}\n\nfunction getSpreadsheetAlignment(cell?: SpreadsheetCellExportModel) {\n if (!cell?.alignment || !isRecord(cell.alignment)) {\n return {};\n }\n\n return {\n horizontal:\n typeof cell.alignment.horizontal === \"string\"\n ? cell.alignment.horizontal\n : undefined,\n vertical:\n typeof cell.alignment.vertical === \"string\"\n ? cell.alignment.vertical\n : undefined,\n wrapText: cell.alignment.wrapText === true,\n };\n}\n\nfunction getSpreadsheetCellValueForExport(cell: SpreadsheetCellExportModel) {\n if (cell.valueKind === \"blank\") {\n return null;\n }\n\n if (cell.valueKind === \"formula\" && cell.formula) {\n const baseValue = isRecord(cell.value)\n ? cloneSpreadsheetSerializable(cell.value)\n : {};\n\n return {\n ...(isRecord(baseValue) ? baseValue : {}),\n formula: cell.formula,\n result: cloneSpreadsheetSerializable(cell.result),\n };\n }\n\n if (cell.valueKind === \"hyperlink\" && cell.hyperlink) {\n if (isRecord(cell.value) && typeof cell.value.hyperlink === \"string\") {\n return cloneSpreadsheetSerializable(cell.value);\n }\n\n return {\n text: cell.displayValue || String(cell.value ?? \"\"),\n hyperlink: cell.hyperlink,\n };\n }\n\n return cloneSpreadsheetSerializable(cell.value);\n}\n\nfunction applySpreadsheetCellFormatting(\n targetCell: ExcelJS.Cell,\n model: SpreadsheetCellExportModel,\n) {\n if (model.numFmt) {\n targetCell.numFmt = model.numFmt;\n }\n if (model.font) {\n targetCell.font = cloneSpreadsheetSerializable(model.font) as unknown as ExcelJS.Font;\n }\n if (model.fill) {\n targetCell.fill = cloneSpreadsheetSerializable(model.fill) as unknown as ExcelJS.Fill;\n }\n if (model.alignment) {\n targetCell.alignment = cloneSpreadsheetSerializable(\n model.alignment,\n ) as unknown as Partial<ExcelJS.Alignment>;\n }\n if (model.border) {\n targetCell.border = cloneSpreadsheetSerializable(\n model.border,\n ) as unknown as Partial<ExcelJS.Borders>;\n }\n if (model.note) {\n targetCell.note = model.note;\n }\n}\n\nasync function renderSheetsToCanvases(\n sheets: SpreadsheetSheetExportModel[],\n placements: SignaturePlacement[],\n annotations: AnnotationPlacement[],\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n options?: {\n borderlessSignatures?: boolean;\n },\n) {\n const canvases: HTMLCanvasElement[] = [];\n const safeSheets =\n sheets.length > 0\n ? sheets\n : [{\n name: \"Sheet1\",\n data: [[\"\"]],\n cells: {},\n merges: [],\n colWidths: [120],\n rowHeights: [32],\n rowCount: 1,\n colCount: 1,\n renderedRowCount: 1,\n renderedColCount: 1,\n }];\n\n for (const sheet of safeSheets) {\n const visibleColWidths = sheet.colWidths.slice(0, sheet.renderedColCount);\n const visibleRowHeights = sheet.rowHeights.slice(0, sheet.renderedRowCount);\n const totalWidth =\n SHEET_ROW_HEADER_WIDTH +\n visibleColWidths.reduce((sum, value) => sum + value, 0);\n const totalHeight =\n SHEET_COLUMN_HEADER_HEIGHT +\n visibleRowHeights.reduce((sum, value) => sum + value, 0);\n const canvas = createCanvas(totalWidth, totalHeight);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n continue;\n }\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = \"#f1f5f9\";\n ctx.fillRect(0, 0, canvas.width, SHEET_COLUMN_HEADER_HEIGHT);\n ctx.fillRect(0, 0, SHEET_ROW_HEADER_WIDTH, canvas.height);\n\n const mergeLookup = createSheetMergeLookup(sheet.merges);\n let cursorX = SHEET_ROW_HEADER_WIDTH;\n\n for (let colIndex = 0; colIndex < visibleColWidths.length; colIndex += 1) {\n const width = visibleColWidths[colIndex];\n ctx.strokeStyle = \"#cbd5e1\";\n ctx.strokeRect(cursorX, 0, width, SHEET_COLUMN_HEADER_HEIGHT);\n ctx.fillStyle = \"#475569\";\n ctx.font = \"700 11px Arial, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(\n toColumnLabel(colIndex),\n cursorX + width / 2,\n SHEET_COLUMN_HEADER_HEIGHT / 2,\n );\n cursorX += width;\n }\n\n let cursorY = SHEET_COLUMN_HEADER_HEIGHT;\n for (let rowIndex = 0; rowIndex < visibleRowHeights.length; rowIndex += 1) {\n const height = visibleRowHeights[rowIndex];\n ctx.strokeStyle = \"#cbd5e1\";\n ctx.strokeRect(0, cursorY, SHEET_ROW_HEADER_WIDTH, height);\n ctx.fillStyle = \"#475569\";\n ctx.font = \"700 11px Arial, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(String(rowIndex + 1), SHEET_ROW_HEADER_WIDTH / 2, cursorY + height / 2);\n cursorY += height;\n }\n\n cursorY = SHEET_COLUMN_HEADER_HEIGHT;\n for (let rowIndex = 0; rowIndex < sheet.data.length; rowIndex += 1) {\n const row = sheet.data[rowIndex] ?? [];\n const rowHeight = visibleRowHeights[rowIndex] ?? 32;\n cursorX = SHEET_ROW_HEADER_WIDTH;\n\n for (let colIndex = 0; colIndex < row.length; colIndex += 1) {\n const colWidth = visibleColWidths[colIndex] ?? 96;\n const cellKey = makeSheetCellKey(rowIndex, colIndex);\n const cellModel = sheet.cells[cellKey];\n\n if (mergeLookup.covered.has(cellKey)) {\n cursorX += colWidth;\n continue;\n }\n\n const merge = mergeLookup.starts.get(cellKey);\n const width = merge\n ? visibleColWidths\n .slice(colIndex, colIndex + (merge.endCol - merge.startCol + 1))\n .reduce((sum, value) => sum + value, 0)\n : colWidth;\n const height = merge\n ? visibleRowHeights\n .slice(rowIndex, rowIndex + (merge.endRow - merge.startRow + 1))\n .reduce((sum, value) => sum + value, 0)\n : rowHeight;\n\n ctx.fillStyle = getSpreadsheetFillColor(cellModel) || \"#ffffff\";\n ctx.fillRect(cursorX, cursorY, width, height);\n ctx.strokeStyle = \"#e2e8f0\";\n ctx.strokeRect(cursorX, cursorY, width, height);\n\n const text = cellModel?.displayValue || row[colIndex] || \"\";\n if (text) {\n const alignment = getSpreadsheetAlignment(cellModel);\n const fontSize =\n cellModel?.font && isRecord(cellModel.font) && typeof cellModel.font.size === \"number\"\n ? cellModel.font.size\n : 13;\n const fontWeight =\n cellModel?.font && isRecord(cellModel.font) && cellModel.font.bold\n ? \"700\"\n : \"400\";\n const fontStyle =\n cellModel?.font && isRecord(cellModel.font) && cellModel.font.italic\n ? \"italic\"\n : \"normal\";\n const fontFamily =\n cellModel?.font && isRecord(cellModel.font) && typeof cellModel.font.name === \"string\"\n ? cellModel.font.name\n : \"Arial\";\n const textColor =\n getSpreadsheetTextColor(cellModel) ||\n (cellModel?.hyperlink ? \"#1d4ed8\" : \"#0f172a\");\n const textPaddingX = 10;\n const textPaddingY = 8;\n\n ctx.fillStyle = textColor;\n ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}, sans-serif`;\n ctx.textBaseline = \"top\";\n ctx.textAlign =\n alignment.horizontal === \"center\"\n ? \"center\"\n : alignment.horizontal === \"right\"\n ? \"right\"\n : \"left\";\n\n const lines = wrapTextToWidth(\n ctx,\n text,\n Math.max(width - textPaddingX * 2, 12),\n );\n const lineHeight = Math.max(fontSize * 1.25, 16);\n const textBlockHeight = lines.length * lineHeight;\n const textX =\n ctx.textAlign === \"center\"\n ? cursorX + width / 2\n : ctx.textAlign === \"right\"\n ? cursorX + width - textPaddingX\n : cursorX + textPaddingX;\n const textY =\n alignment.vertical === \"middle\"\n ? cursorY + Math.max((height - textBlockHeight) / 2, textPaddingY)\n : alignment.vertical === \"bottom\"\n ? cursorY + Math.max(height - textBlockHeight - textPaddingY, textPaddingY)\n : cursorY + textPaddingY;\n\n lines.forEach((line: string, index: number) => {\n ctx.fillText(line, textX, textY + index * lineHeight);\n });\n }\n\n cursorX += colWidth;\n }\n\n cursorY += rowHeight;\n }\n\n await drawPlacementsOnCanvas(\n ctx,\n placements.filter((placement) => placement.surfaceKey === `sheet:${sheet.name}`),\n canvas.width,\n canvas.height,\n options?.borderlessSignatures ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n annotations.filter(\n (annotation) => annotation.surfaceKey === `sheet:${sheet.name}`,\n ),\n canvas.width,\n canvas.height,\n labels,\n );\n\n canvases.push(canvas);\n }\n\n return canvases;\n}\n\nexport async function exportSignedPdfDocument(args: {\n arrayBuffer?: ArrayBuffer;\n url?: string;\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n if (!args.arrayBuffer && !args.url) {\n throw new Error(\"No PDF source is available for export.\");\n }\n\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n await ensurePdfWorker();\n const loadingTask = getDocument(\n args.arrayBuffer ? { data: args.arrayBuffer.slice(0) } : { url: args.url! },\n );\n const pdf = await loadingTask.promise;\n const exportPdf = await PDFDocument.create();\n const preparedDecorations = await preparePageDecorations(args.pageDecorations);\n\n for (let pageNumber = 1; pageNumber <= pdf.numPages; pageNumber += 1) {\n const page = await pdf.getPage(pageNumber);\n const viewport = page.getViewport({ scale: 2 });\n const canvas = createCanvas(viewport.width, viewport.height);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n continue;\n }\n\n await page.render({\n canvasContext: ctx,\n viewport,\n }).promise;\n\n await drawPlacementsOnCanvas(\n ctx,\n args.placements.filter(\n (placement) => placement.surfaceKey === `page:${pageNumber}`,\n ),\n canvas.width,\n canvas.height,\n { borderless: true },\n );\n await drawAnnotationsOnCanvas(\n ctx,\n args.annotations.filter(\n (annotation) => annotation.surfaceKey === `page:${pageNumber}`,\n ),\n canvas.width,\n canvas.height,\n labels,\n );\n\n const finalCanvas = applyPageDecorationsToCanvas(canvas, preparedDecorations);\n const image = await exportPdf.embedJpg(finalCanvas.toDataURL(\"image/jpeg\", 0.92));\n const exportPage = exportPdf.addPage([finalCanvas.width, finalCanvas.height]);\n exportPage.drawImage(image, {\n x: 0,\n y: 0,\n width: finalCanvas.width,\n height: finalCanvas.height,\n });\n }\n\n return {\n base64: await exportPdf.saveAsBase64(),\n fileName: replaceExtension(args.fileName, \"pdf\"),\n fileType: \"pdf\" as const,\n mimeType: mimeTypeForFileType(\"pdf\"),\n };\n}\n\nexport async function exportSignedImageFile(args: {\n arrayBuffer: ArrayBuffer;\n fileType: SupportedFileType;\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n asPdf?: boolean;\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n const imageBlob = new Blob([args.arrayBuffer], {\n type: mimeTypeForFileType(args.fileType),\n });\n const objectUrl = URL.createObjectURL(imageBlob);\n\n try {\n const image = await loadImage(objectUrl);\n const canvas = createCanvas(image.width, image.height);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n throw new Error(\"Unable to render the image document.\");\n }\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n await drawPlacementsOnCanvas(\n ctx,\n args.placements.filter((placement) => placement.surfaceKey === \"image:main\"),\n canvas.width,\n canvas.height,\n args.asPdf ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n args.annotations.filter((annotation) => annotation.surfaceKey === \"image:main\"),\n canvas.width,\n canvas.height,\n labels,\n );\n\n if (args.asPdf) {\n return renderCanvasesToPdf([canvas], args.fileName, args.pageDecorations);\n }\n\n const shouldUseJpeg = args.fileType === \"jpg\" || args.fileType === \"jpeg\";\n const outputType = shouldUseJpeg ? \"image/jpeg\" : \"image/png\";\n const blob = await canvasToBlob(canvas, outputType, shouldUseJpeg ? 0.95 : undefined);\n\n return {\n base64: await blobToBase64(blob),\n fileName: replaceExtension(args.fileName, shouldUseJpeg ? \"jpg\" : \"png\"),\n fileType: shouldUseJpeg ? \"jpg\" as const : \"png\" as const,\n mimeType: outputType,\n };\n } finally {\n URL.revokeObjectURL(objectUrl);\n }\n}\n\nexport async function exportSignedRichTextFile(args: {\n container: HTMLElement | null;\n pages?: RichTextPageRenderModel[];\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n asPdf?: boolean;\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n if (args.pages && args.pages.length > 0) {\n const canvases: HTMLCanvasElement[] = [];\n\n for (const page of args.pages) {\n const image = await loadImage(page.imageUrl);\n const canvas = createCanvas(page.width, page.height);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n continue;\n }\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n await drawPlacementsOnCanvas(\n ctx,\n args.placements.filter(\n (placement) => placement.surfaceKey === page.surfaceKey,\n ),\n canvas.width,\n canvas.height,\n args.asPdf ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n args.annotations.filter(\n (annotation) => annotation.surfaceKey === page.surfaceKey,\n ),\n canvas.width,\n canvas.height,\n labels,\n );\n\n canvases.push(canvas);\n }\n\n if (canvases.length === 0) {\n throw new Error(\"The document pages are not ready to export.\");\n }\n\n if (args.asPdf) {\n return renderCanvasesToPdf(canvases, args.fileName, args.pageDecorations);\n }\n\n return createDocxFromCanvases(canvases, args.fileName);\n }\n\n if (!args.container) {\n throw new Error(\"The document surface is not ready to export.\");\n }\n\n const canvas = await captureElementCanvas(args.container, {\n backgroundColor: \"#ffffff\",\n scale: 2,\n });\n\n if (!canvas) {\n throw new Error(\"Unable to render the document surface.\");\n }\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n throw new Error(\"Unable to render the document surface.\");\n }\n\n await drawPlacementsOnCanvas(\n ctx,\n args.placements.filter((placement) => placement.surfaceKey === \"document:main\"),\n canvas.width,\n canvas.height,\n args.asPdf ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n args.annotations.filter((annotation) => annotation.surfaceKey === \"document:main\"),\n canvas.width,\n canvas.height,\n labels,\n );\n\n const pages = splitTallCanvas(canvas);\n if (args.asPdf) {\n return renderCanvasesToPdf(pages, args.fileName, args.pageDecorations);\n }\n\n return createDocxFromCanvases(pages, args.fileName);\n}\n\nexport async function exportSignedSlidesFile(args: {\n exportState: PptxExportState | null;\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n asPdf?: boolean;\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n const exportState =\n args.exportState && args.exportState.slides.length > 0\n ? args.exportState\n : {\n slideSize: { width: 9144000, height: 5143500 },\n slides: [{\n background: \"#ffffff\",\n elements: [],\n title: \"Slide 1\",\n }],\n };\n\n if (args.asPdf) {\n return renderCanvasesToPdf(\n await renderSlidesToCanvases(\n exportState,\n args.placements,\n args.annotations,\n labels,\n { borderlessSignatures: true },\n ),\n args.fileName,\n args.pageDecorations,\n );\n }\n\n if (\n exportState.sourceArrayBuffer &&\n exportState.sourceFileType === \"pptx\"\n ) {\n return preserveNativePptxFile({\n sourceArrayBuffer: exportState.sourceArrayBuffer,\n fileName: args.fileName,\n exportState,\n placements: args.placements,\n annotations: args.annotations,\n labels,\n });\n }\n\n const PptxGenJS = await loadPptxGenJS();\n const pptx = new PptxGenJS();\n pptx.defineLayout({\n name: \"HV_CUSTOM\",\n width: emuToInches(exportState.slideSize.width),\n height: emuToInches(exportState.slideSize.height),\n });\n pptx.layout = \"HV_CUSTOM\";\n pptx.author = \"Hive Viewer\";\n pptx.subject = \"Signed presentation export\";\n pptx.title = args.fileName;\n\n for (const [index, slideModel] of exportState.slides.entries()) {\n const slide = pptx.addSlide();\n slide.background = { color: stripHash(slideModel.background, \"FFFFFF\") };\n\n for (const element of slideModel.elements) {\n if (element.width <= 0 || element.height <= 0) {\n continue;\n }\n\n const x = emuToInches(element.x);\n const y = emuToInches(element.y);\n const w = emuToInches(element.width);\n const h = emuToInches(element.height);\n\n if (element.kind === \"image\" && element.imageSrc) {\n slide.addImage({\n data: element.imageSrc,\n x,\n y,\n w,\n h,\n rotate: element.rotation || 0,\n altText: element.alt,\n });\n continue;\n }\n\n if (element.paragraphs?.length) {\n const text = element.paragraphs.map(paragraphToText).join(\"\\n\");\n const firstRun = element.paragraphs.flatMap((paragraph) => paragraph.runs)[0];\n\n slide.addText(text, {\n x,\n y,\n w,\n h,\n rotate: element.rotation || 0,\n shape: \"rect\",\n margin: 4,\n fit: \"shrink\",\n valign: \"top\",\n align:\n element.paragraphs[0]?.align === \"ctr\"\n ? \"center\"\n : element.paragraphs[0]?.align === \"r\"\n ? \"right\"\n : \"left\",\n color: stripHash(firstRun?.color, \"0F172A\"),\n fontSize: firstRun?.fontSize,\n bold: firstRun?.bold,\n italic: firstRun?.italic,\n underline: firstRun?.underline\n ? {\n style: \"sng\",\n color: stripHash(firstRun?.color, \"0F172A\"),\n }\n : undefined,\n fill: element.fill\n ? { color: stripHash(element.fill) }\n : undefined,\n line: element.stroke\n ? { color: stripHash(element.stroke), pt: 1 }\n : { color: \"FFFFFF\", transparency: 100 },\n });\n continue;\n }\n\n slide.addShape(\"rect\", {\n x,\n y,\n w,\n h,\n rotate: element.rotation || 0,\n fill: element.fill\n ? { color: stripHash(element.fill) }\n : { color: \"FFFFFF\", transparency: 100 },\n line: element.stroke\n ? { color: stripHash(element.stroke), pt: 1 }\n : { color: \"FFFFFF\", transparency: 100 },\n });\n }\n\n for (const placement of args.placements.filter(\n (candidate) => candidate.surfaceKey === `slide:${index + 1}`,\n )) {\n slide.addImage({\n data: await createSignatureStampDataUrl(placement),\n x: placement.x * emuToInches(exportState.slideSize.width),\n y: placement.y * emuToInches(exportState.slideSize.height),\n w: placement.width * emuToInches(exportState.slideSize.width),\n h: placement.height * emuToInches(exportState.slideSize.height),\n altText: placement.signature.signedBy\n ? `Signature by ${placement.signature.signedBy}`\n : \"Signature\",\n });\n }\n\n for (const annotation of args.annotations.filter(\n (candidate) => candidate.surfaceKey === `slide:${index + 1}`,\n )) {\n slide.addImage({\n data: await createAnnotationCardDataUrl(annotation, 720, 360, labels),\n x: annotation.x * emuToInches(exportState.slideSize.width),\n y: annotation.y * emuToInches(exportState.slideSize.height),\n w: annotation.width * emuToInches(exportState.slideSize.width),\n h: annotation.height * emuToInches(exportState.slideSize.height),\n altText: annotation.linkedSignaturePlacementId\n ? labels.linkedAnnotationAltLabel\n : labels.annotationAltLabel,\n });\n }\n }\n\n return {\n base64: await pptx.write({ outputType: \"base64\", compression: true }) as string,\n fileName: replaceExtension(args.fileName, \"pptx\"),\n fileType: \"pptx\" as const,\n mimeType: mimeTypeForFileType(\"pptx\"),\n };\n}\n\nexport async function exportSignedSpreadsheetFile(args: {\n exportState: SpreadsheetExportState | null;\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n asPdf?: boolean;\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n const sheets =\n args.exportState?.sheets && args.exportState.sheets.length > 0\n ? args.exportState.sheets\n : [{\n name: \"Sheet1\",\n data: [[\"\"]],\n cells: {},\n merges: [],\n colWidths: [120],\n rowHeights: [32],\n rowCount: 1,\n colCount: 1,\n renderedRowCount: 1,\n renderedColCount: 1,\n }];\n\n if (args.asPdf) {\n return renderCanvasesToPdf(\n await renderSheetsToCanvases(\n sheets,\n args.placements,\n args.annotations,\n labels,\n { borderlessSignatures: true },\n ),\n args.fileName,\n args.pageDecorations,\n );\n }\n\n if (\n args.exportState?.sourceArrayBuffer &&\n args.exportState.sourceFileType === \"xlsx\"\n ) {\n return preserveNativeSpreadsheetFile({\n sourceArrayBuffer: args.exportState.sourceArrayBuffer,\n fileName: args.fileName,\n sheets,\n placements: args.placements,\n annotations: args.annotations,\n labels,\n dirtyCellAddressesBySheet: args.exportState.dirtyCellAddressesBySheet,\n });\n }\n\n const workbook = new ExcelJS.Workbook();\n workbook.creator = \"Hive Viewer\";\n workbook.created = new Date();\n\n for (const sheet of sheets) {\n const worksheet = workbook.addWorksheet(sheet.name);\n for (let colIndex = 0; colIndex < sheet.colCount; colIndex += 1) {\n const column = worksheet.getColumn(colIndex + 1);\n const width = sheet.colWidths[colIndex] ?? 96;\n column.hidden = width === 0;\n if (!column.hidden) {\n column.width = Math.max(8, Number((width / 7).toFixed(2)));\n }\n }\n\n for (let rowIndex = 0; rowIndex < sheet.rowCount; rowIndex += 1) {\n const row = worksheet.getRow(rowIndex + 1);\n const height = sheet.rowHeights[rowIndex] ?? 32;\n row.hidden = height === 0;\n if (!row.hidden) {\n row.height = Number((height * 0.75).toFixed(2));\n }\n }\n\n for (const cellModel of Object.values(sheet.cells)) {\n const decoded = XLSX.utils.decode_cell(cellModel.address);\n const cell = worksheet.getCell(decoded.r + 1, decoded.c + 1);\n cell.value = getSpreadsheetCellValueForExport(cellModel) as ExcelJS.CellValue;\n applySpreadsheetCellFormatting(cell, cellModel);\n }\n\n for (const merge of sheet.merges) {\n worksheet.mergeCells(\n merge.startRow + 1,\n merge.startCol + 1,\n merge.endRow + 1,\n merge.endCol + 1,\n );\n }\n\n const totalWidth =\n SHEET_ROW_HEADER_WIDTH +\n sheet.colWidths\n .slice(0, sheet.renderedColCount)\n .reduce((sum, value) => sum + value, 0);\n const totalHeight =\n SHEET_COLUMN_HEADER_HEIGHT +\n sheet.rowHeights\n .slice(0, sheet.renderedRowCount)\n .reduce((sum, value) => sum + value, 0);\n\n for (const placement of args.placements.filter(\n (candidate) => candidate.surfaceKey === `sheet:${sheet.name}`,\n )) {\n const imageId = workbook.addImage({\n base64: await createSignatureStampDataUrl(placement),\n extension: \"png\",\n });\n const pixelX = clamp(\n placement.x * totalWidth - SHEET_ROW_HEADER_WIDTH,\n 0,\n Math.max(totalWidth - SHEET_ROW_HEADER_WIDTH, 0),\n );\n const pixelY = clamp(\n placement.y * totalHeight - SHEET_COLUMN_HEADER_HEIGHT,\n 0,\n Math.max(totalHeight - SHEET_COLUMN_HEADER_HEIGHT, 0),\n );\n\n worksheet.addImage(imageId, {\n tl: {\n col: offsetToGridPosition(pixelX, sheet.colWidths),\n row: offsetToGridPosition(pixelY, sheet.rowHeights),\n },\n ext: {\n width: placement.width * totalWidth,\n height: placement.height * totalHeight,\n },\n });\n }\n\n for (const annotation of args.annotations.filter(\n (candidate) => candidate.surfaceKey === `sheet:${sheet.name}`,\n )) {\n const imageId = workbook.addImage({\n base64: await createAnnotationCardDataUrl(annotation, 720, 360, labels),\n extension: \"png\",\n });\n const pixelX = clamp(\n annotation.x * totalWidth - SHEET_ROW_HEADER_WIDTH,\n 0,\n Math.max(totalWidth - SHEET_ROW_HEADER_WIDTH, 0),\n );\n const pixelY = clamp(\n annotation.y * totalHeight - SHEET_COLUMN_HEADER_HEIGHT,\n 0,\n Math.max(totalHeight - SHEET_COLUMN_HEADER_HEIGHT, 0),\n );\n\n worksheet.addImage(imageId, {\n tl: {\n col: offsetToGridPosition(pixelX, sheet.colWidths),\n row: offsetToGridPosition(pixelY, sheet.rowHeights),\n },\n ext: {\n width: annotation.width * totalWidth,\n height: annotation.height * totalHeight,\n },\n });\n }\n }\n\n const buffer = await workbook.xlsx.writeBuffer();\n\n return {\n base64: arrayBufferToBase64(toArrayBuffer(buffer)),\n fileName: replaceExtension(args.fileName, \"xlsx\"),\n fileType: \"xlsx\" as const,\n mimeType: mimeTypeForFileType(\"xlsx\"),\n };\n}\n","import type { SupportedFileType } from \"../types\";\n\nconst extensionFileTypes: Record<string, SupportedFileType> = {\n pdf: \"pdf\",\n md: \"md\",\n docx: \"docx\",\n doc: \"doc\",\n rtf: \"rtf\",\n txt: \"txt\",\n jpeg: \"jpeg\",\n jpg: \"jpg\",\n png: \"png\",\n gif: \"gif\",\n bmp: \"bmp\",\n svg: \"svg\",\n xlsx: \"xlsx\",\n xls: \"xls\",\n csv: \"csv\",\n pptx: \"pptx\",\n ppt: \"ppt\",\n xml: \"xml\",\n};\n\nconst mimeFileTypes: Record<string, SupportedFileType> = {\n \"application/pdf\": \"pdf\",\n \"text/markdown\": \"md\",\n \"text/plain\": \"txt\",\n \"text/csv\": \"csv\",\n \"text/xml\": \"xml\",\n \"application/xml\": \"xml\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n \"docx\",\n \"application/msword\": \"doc\",\n \"application/rtf\": \"rtf\",\n \"text/rtf\": \"rtf\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\":\n \"xlsx\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n \"pptx\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"image/bmp\": \"bmp\",\n \"image/svg+xml\": \"svg\",\n};\n\nfunction normalizeMimeType(mimeType?: string) {\n return mimeType?.split(\";\")[0]?.trim().toLowerCase();\n}\n\nfunction getFileNameFromUrl(fileUrl?: string) {\n if (!fileUrl) {\n return undefined;\n }\n\n try {\n const url = new URL(fileUrl);\n const name = decodeURIComponent(url.pathname.split(\"/\").pop() || \"\");\n return name || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getFileNameFromBlob(blob?: Blob) {\n if (!blob || typeof File === \"undefined\" || !(blob instanceof File)) {\n return undefined;\n }\n\n return blob.name || undefined;\n}\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 mimeType?: string,\n): SupportedFileType {\n if (explicit) {\n return explicit;\n }\n\n const ext = (name?.split(\".\").pop() || \"\").toLowerCase();\n if (ext && extensionFileTypes[ext]) {\n return extensionFileTypes[ext];\n }\n\n const normalizedMimeType = normalizeMimeType(mimeType);\n if (normalizedMimeType && mimeFileTypes[normalizedMimeType]) {\n return mimeFileTypes[normalizedMimeType];\n }\n\n return \"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++) {\n bytes[i] = bin.charCodeAt(i);\n }\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 cleanup?: () => void;\n}> {\n const inputFileName =\n args.fileName ?? getFileNameFromBlob(args.blob) ?? getFileNameFromUrl(args.fileUrl);\n const fileType = guessFileType(inputFileName, args.fileType, args.blob?.type);\n const fileName = inputFileName ?? `document.${fileType}`;\n\n if (args.blob) {\n const ab = await args.blob.arrayBuffer();\n const url = URL.createObjectURL(args.blob);\n return {\n fileType,\n fileName,\n arrayBuffer: ab,\n url,\n cleanup: () => URL.revokeObjectURL(url),\n };\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) {\n throw new Error(`Failed to fetch file (${res.status})`);\n }\n\n const resolvedFileType = guessFileType(\n inputFileName,\n args.fileType,\n res.headers.get(\"content-type\") || undefined,\n );\n const resolvedFileName = inputFileName ?? `document.${resolvedFileType}`;\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 {\n fileType: resolvedFileType,\n fileName: resolvedFileName,\n arrayBuffer: ab,\n url: args.fileUrl,\n };\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 {\n fileType: resolvedFileType,\n fileName: resolvedFileName,\n arrayBuffer: out.buffer,\n url: args.fileUrl,\n };\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 ExcelJS from \"exceljs\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport * as XLSX from \"xlsx\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type {\n SpreadsheetExportState,\n SpreadsheetCellExportModel,\n SpreadsheetMergeModel,\n SpreadsheetSheetExportModel,\n} from \"../internal/exportModels\";\nimport type {\n DocumentSurfaceOverlayState,\n DocumentMode,\n} from \"../types\";\n\ninterface SpreadsheetEditorProps {\n mode: DocumentMode;\n fileName: string;\n arrayBuffer?: ArrayBuffer;\n currentPage: number;\n onPageCount: (n: number) => void;\n onCurrentPageChange: (p: number) => void;\n onThumbs: (thumbs: Array<string | undefined>) => void;\n onExportStateChange?: (state: SpreadsheetExportState | null) => void;\n signatureOverlay: DocumentSurfaceOverlayState;\n locale: Record<string, string>;\n}\n\ntype SheetModel = SpreadsheetSheetExportModel;\n\nconst MAX_RENDER_ROWS = 400;\nconst MAX_RENDER_COLS = 120;\n\nfunction toColumnLabel(index: number) {\n let label = \"\";\n let current = index;\n\n while (current >= 0) {\n label = String.fromCharCode((current % 26) + 65) + label;\n current = Math.floor(current / 26) - 1;\n }\n\n return label;\n}\n\nfunction makeCellKey(row: number, col: number) {\n return `${row}:${col}`;\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value == null) {\n return value;\n }\n\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction stripArgbAlpha(argb?: string) {\n if (!argb) {\n return undefined;\n }\n\n const normalized = argb.replace(\"#\", \"\").trim();\n if (normalized.length === 8) {\n return `#${normalized.slice(2)}`;\n }\n if (normalized.length === 6) {\n return `#${normalized}`;\n }\n return undefined;\n}\n\nfunction getExcelColor(value: unknown) {\n if (!isRecord(value)) {\n return undefined;\n }\n\n if (typeof value.argb === \"string\") {\n return stripArgbAlpha(value.argb);\n }\n\n return undefined;\n}\n\nfunction noteToString(note: unknown) {\n if (!note) {\n return undefined;\n }\n\n if (typeof note === \"string\") {\n return note;\n }\n\n if (Array.isArray(note)) {\n const parts = note\n .map((entry) => {\n if (typeof entry === \"string\") {\n return entry;\n }\n if (isRecord(entry) && typeof entry.text === \"string\") {\n return entry.text;\n }\n return \"\";\n })\n .filter(Boolean);\n\n return parts.length > 0 ? parts.join(\"\\n\") : undefined;\n }\n\n if (isRecord(note) && Array.isArray(note.texts)) {\n return noteToString(note.texts);\n }\n\n return undefined;\n}\n\nfunction richTextToString(value: unknown) {\n if (!Array.isArray(value)) {\n return \"\";\n }\n\n return value\n .map((entry) => {\n if (isRecord(entry) && typeof entry.text === \"string\") {\n return entry.text;\n }\n return \"\";\n })\n .join(\"\");\n}\n\nfunction inferValueKind(value: unknown): SpreadsheetCellExportModel[\"valueKind\"] {\n if (value == null) {\n return \"blank\";\n }\n if (typeof value === \"string\") {\n return \"string\";\n }\n if (typeof value === \"number\") {\n return \"number\";\n }\n if (typeof value === \"boolean\") {\n return \"boolean\";\n }\n if (value instanceof Date) {\n return \"date\";\n }\n if (isRecord(value)) {\n if (typeof value.formula === \"string\") {\n return \"formula\";\n }\n if (typeof value.hyperlink === \"string\") {\n return \"hyperlink\";\n }\n if (Array.isArray(value.richText)) {\n return \"richText\";\n }\n if (value.error != null) {\n return \"error\";\n }\n }\n return \"unknown\";\n}\n\nfunction isCellMetadataOnly(cell?: SpreadsheetCellExportModel | null) {\n if (!cell) {\n return false;\n }\n\n return Boolean(\n cell.note ||\n cell.numFmt ||\n cell.font ||\n cell.fill ||\n cell.alignment ||\n cell.border,\n );\n}\n\nfunction getCellInputValue(cell?: SpreadsheetCellExportModel | null) {\n if (!cell) {\n return \"\";\n }\n\n if (cell.formula) {\n return `=${cell.formula}`;\n }\n\n if (typeof cell.value === \"string\") {\n return cell.value;\n }\n\n if (typeof cell.value === \"number\" || typeof cell.value === \"boolean\") {\n return String(cell.value);\n }\n\n if (cell.value instanceof Date) {\n return cell.value.toISOString();\n }\n\n return cell.displayValue;\n}\n\nfunction createMergeLookup(merges: SpreadsheetMergeModel[]) {\n const starts = new Map<string, SpreadsheetMergeModel>();\n const covered = new Set<string>();\n\n for (const merge of merges) {\n starts.set(`${merge.startRow}:${merge.startCol}`, merge);\n\n for (let row = merge.startRow; row <= merge.endRow; row += 1) {\n for (let col = merge.startCol; col <= merge.endCol; col += 1) {\n if (row === merge.startRow && col === merge.startCol) {\n continue;\n }\n covered.add(`${row}:${col}`);\n }\n }\n }\n\n return { starts, covered };\n}\n\nfunction makeSheetThumbnail(sheet: SheetModel, index: number) {\n const previewRows = sheet.data.slice(0, 3);\n const previewText = previewRows\n .map((row) => row.slice(0, 3).filter(Boolean).join(\" | \"))\n .filter(Boolean)\n .join(\" | \");\n\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"160\" height=\"96\">\n <rect width=\"100%\" height=\"100%\" fill=\"#eff6ff\" rx=\"12\" ry=\"12\" />\n <rect x=\"12\" y=\"12\" width=\"136\" height=\"18\" fill=\"#2563eb\" rx=\"6\" ry=\"6\" />\n <text x=\"20\" y=\"25\" fill=\"#ffffff\" font-size=\"10\" font-family=\"Arial\">${sheet.name}</text>\n <text x=\"20\" y=\"50\" fill=\"#1e3a8a\" font-size=\"12\" font-family=\"Arial\">Sheet ${index + 1}</text>\n <text x=\"20\" y=\"68\" fill=\"#334155\" font-size=\"9\" font-family=\"Arial\">${previewText || \"Workbook preview\"}</text>\n </svg>`;\n\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nfunction createEmptyGrid(rowCount: number, colCount: number) {\n return Array.from({ length: rowCount }, () =>\n Array.from({ length: colCount }, () => \"\"),\n );\n}\n\nfunction createBlankSheetModel(name: string): SheetModel {\n const rowCount = 40;\n const colCount = 12;\n\n return {\n name,\n data: createEmptyGrid(rowCount, colCount),\n cells: {},\n merges: [],\n colWidths: Array.from({ length: colCount }, () => 96),\n rowHeights: Array.from({ length: rowCount }, () => 32),\n rowCount,\n colCount,\n renderedRowCount: rowCount,\n renderedColCount: colCount,\n };\n}\n\nfunction getNextSheetName(sheets: SheetModel[]) {\n let index = sheets.length + 1;\n let candidate = `Sheet${index}`;\n\n while (sheets.some((sheet) => sheet.name === candidate)) {\n index += 1;\n candidate = `Sheet${index}`;\n }\n\n return candidate;\n}\n\nfunction appendBlankRow(sheet: SheetModel): SheetModel {\n const nextRowCount = sheet.rowCount + 1;\n const nextRenderedRowCount = Math.min(nextRowCount, MAX_RENDER_ROWS);\n const nextData =\n sheet.renderedRowCount < MAX_RENDER_ROWS\n ? [\n ...sheet.data.map((row) => [...row]),\n Array.from({ length: sheet.renderedColCount }, () => \"\"),\n ]\n : sheet.data.map((row) => [...row]);\n\n return {\n ...sheet,\n data: nextData,\n rowCount: nextRowCount,\n renderedRowCount: nextRenderedRowCount,\n rowHeights: [...sheet.rowHeights, 32],\n };\n}\n\nfunction appendBlankColumn(sheet: SheetModel): SheetModel {\n const nextColCount = sheet.colCount + 1;\n const nextRenderedColCount = Math.min(nextColCount, MAX_RENDER_COLS);\n const nextData = sheet.data.map((row) => {\n const nextRow = [...row];\n if (sheet.renderedColCount < MAX_RENDER_COLS) {\n nextRow.push(\"\");\n }\n return nextRow;\n });\n\n return {\n ...sheet,\n data: nextData,\n colCount: nextColCount,\n renderedColCount: nextRenderedColCount,\n colWidths: [...sheet.colWidths, 96],\n };\n}\n\nfunction buildEditedCellModel(\n address: string,\n input: string,\n existing?: SpreadsheetCellExportModel,\n): SpreadsheetCellExportModel | null {\n const base: SpreadsheetCellExportModel = existing\n ? {\n ...existing,\n value: cloneSerializable(existing.value),\n result: cloneSerializable(existing.result),\n font: existing.font ? cloneSerializable(existing.font) : undefined,\n fill: existing.fill ? cloneSerializable(existing.fill) : undefined,\n alignment: existing.alignment\n ? cloneSerializable(existing.alignment)\n : undefined,\n border: existing.border ? cloneSerializable(existing.border) : undefined,\n }\n : {\n address,\n displayValue: \"\",\n value: null,\n valueKind: \"blank\",\n };\n\n if (!input) {\n const cleared: SpreadsheetCellExportModel = {\n ...base,\n address,\n displayValue: \"\",\n value: null,\n valueKind: \"blank\",\n formula: undefined,\n result: undefined,\n hyperlink: existing?.hyperlink,\n };\n\n return isCellMetadataOnly(cleared) ? cleared : null;\n }\n\n if (input.startsWith(\"=\") && input.trim().length > 1) {\n const formula = input.trim().slice(1);\n return {\n ...base,\n address,\n displayValue: input,\n value: { formula },\n valueKind: \"formula\",\n formula,\n result: undefined,\n };\n }\n\n if (/^(true|false)$/i.test(input.trim())) {\n return {\n ...base,\n address,\n displayValue: input,\n value: /^true$/i.test(input.trim()),\n valueKind: \"boolean\",\n formula: undefined,\n result: undefined,\n };\n }\n\n if (/^-?\\d+(\\.\\d+)?$/.test(input.trim())) {\n return {\n ...base,\n address,\n displayValue: input,\n value: Number(input),\n valueKind: \"number\",\n formula: undefined,\n result: undefined,\n };\n }\n\n return {\n ...base,\n address,\n displayValue: input,\n value: input,\n valueKind: \"string\",\n formula: undefined,\n result: undefined,\n };\n}\n\nfunction createCellModelFromExcelCell(\n cell: ExcelJS.Cell,\n): SpreadsheetCellExportModel | null {\n const value = cell.value;\n const valueKind = inferValueKind(value);\n const note = noteToString(cell.note);\n const hasMetadata = Boolean(\n note ||\n cell.numFmt ||\n cell.font ||\n cell.fill ||\n cell.alignment ||\n cell.border,\n );\n\n if (value == null && !hasMetadata) {\n return null;\n }\n\n let formula: string | undefined;\n let result: unknown;\n let hyperlink: string | undefined;\n\n if (isRecord(value)) {\n if (typeof value.formula === \"string\") {\n formula = value.formula;\n result = value.result;\n }\n if (typeof value.hyperlink === \"string\") {\n hyperlink = value.hyperlink;\n }\n }\n\n return {\n address: cell.address,\n displayValue:\n valueKind === \"richText\"\n ? richTextToString(isRecord(value) ? value.richText : undefined)\n : cell.text || \"\",\n value: cloneSerializable(value),\n valueKind,\n formula,\n result: cloneSerializable(result),\n hyperlink,\n note,\n numFmt:\n cell.numFmt == null || cell.numFmt === \"\"\n ? undefined\n : String(cell.numFmt),\n font: cell.font ? cloneSerializable(cell.font) : undefined,\n fill: cell.fill ? cloneSerializable(cell.fill) : undefined,\n alignment: cell.alignment ? cloneSerializable(cell.alignment) : undefined,\n border: cell.border ? cloneSerializable(cell.border) : undefined,\n };\n}\n\nfunction createCellModelFromXlsxCell(\n address: string,\n cell: XLSX.CellObject,\n): SpreadsheetCellExportModel | null {\n if (!cell) {\n return null;\n }\n\n const note = Array.isArray(cell.c)\n ? cell.c.map((comment) => comment.t || \"\").join(\"\\n\")\n : undefined;\n const hyperlink =\n cell.l && typeof cell.l.Target === \"string\" ? cell.l.Target : undefined;\n const valueKind = cell.f\n ? \"formula\"\n : cell.t === \"n\"\n ? \"number\"\n : cell.t === \"b\"\n ? \"boolean\"\n : cell.t === \"d\"\n ? \"date\"\n : hyperlink\n ? \"hyperlink\"\n : cell.t === \"e\"\n ? \"error\"\n : \"string\";\n const displayValue =\n typeof cell.w === \"string\"\n ? cell.w\n : cell.v == null\n ? \"\"\n : String(cell.v);\n\n if (!displayValue && !cell.v && !cell.f && !note && !hyperlink && !cell.z) {\n return null;\n }\n\n return {\n address,\n displayValue,\n value: cloneSerializable(cell.f ? { formula: cell.f, result: cell.v } : cell.v),\n valueKind,\n formula: cell.f || undefined,\n result: cell.f ? cloneSerializable(cell.v) : undefined,\n hyperlink,\n note,\n numFmt: cell.z == null || cell.z === \"\" ? undefined : String(cell.z),\n };\n}\n\nfunction getAlignmentValue(\n value: unknown,\n key: \"horizontal\" | \"vertical\" | \"wrapText\",\n) {\n return isRecord(value) ? value[key] : undefined;\n}\n\nfunction getCellTextColor(cell?: SpreadsheetCellExportModel) {\n if (!cell?.font) {\n return undefined;\n }\n\n return getExcelColor(isRecord(cell.font) ? cell.font.color : undefined);\n}\n\nfunction getCellBackgroundColor(cell?: SpreadsheetCellExportModel) {\n if (!cell?.fill || !isRecord(cell.fill)) {\n return undefined;\n }\n\n return getExcelColor(cell.fill.fgColor) || getExcelColor(cell.fill.bgColor);\n}\n\nfunction getCellStyle(cell?: SpreadsheetCellExportModel): React.CSSProperties {\n const style: React.CSSProperties = {};\n\n const textColor = getCellTextColor(cell);\n if (textColor) {\n style.color = textColor;\n }\n\n const backgroundColor = getCellBackgroundColor(cell);\n if (backgroundColor) {\n style.background = backgroundColor;\n }\n\n if (cell?.font && isRecord(cell.font)) {\n if (typeof cell.font.name === \"string\") {\n style.fontFamily = cell.font.name;\n }\n if (typeof cell.font.size === \"number\") {\n style.fontSize = `${cell.font.size}px`;\n }\n if (cell.font.bold) {\n style.fontWeight = 700;\n }\n if (cell.font.italic) {\n style.fontStyle = \"italic\";\n }\n if (cell.font.underline) {\n style.textDecoration = \"underline\";\n }\n if (cell.font.strike) {\n style.textDecoration = style.textDecoration\n ? `${style.textDecoration} line-through`\n : \"line-through\";\n }\n }\n\n if (cell?.alignment) {\n const horizontal = getAlignmentValue(cell.alignment, \"horizontal\");\n const vertical = getAlignmentValue(cell.alignment, \"vertical\");\n const wrapText = getAlignmentValue(cell.alignment, \"wrapText\");\n\n if (typeof horizontal === \"string\") {\n style.textAlign =\n horizontal === \"center\" ? \"center\" : horizontal === \"right\" ? \"right\" : \"left\";\n }\n\n if (typeof vertical === \"string\") {\n style.verticalAlign =\n vertical === \"middle\" ? \"middle\" : vertical === \"bottom\" ? \"bottom\" : \"top\";\n }\n\n if (wrapText === true) {\n style.whiteSpace = \"pre-wrap\";\n }\n }\n\n if (cell?.hyperlink && !style.color) {\n style.color = \"#1d4ed8\";\n style.textDecoration = style.textDecoration\n ? `${style.textDecoration} underline`\n : \"underline\";\n }\n\n return style;\n}\n\nfunction buildSheetModelFromExcelWorksheet(worksheet: ExcelJS.Worksheet): SheetModel {\n const dimensions = worksheet.dimensions;\n const rowCount = Math.max(dimensions?.bottom ?? worksheet.rowCount ?? 1, 1);\n const colCount = Math.max(dimensions?.right ?? worksheet.columnCount ?? 1, 1);\n const renderedRowCount = Math.min(rowCount, MAX_RENDER_ROWS);\n const renderedColCount = Math.min(colCount, MAX_RENDER_COLS);\n const data = createEmptyGrid(renderedRowCount, renderedColCount);\n const cells: Record<string, SpreadsheetCellExportModel> = {};\n\n worksheet.eachRow({ includeEmpty: true }, (row, rowNumber) => {\n if (rowNumber > rowCount) {\n return;\n }\n\n row.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n if (colNumber > colCount) {\n return;\n }\n\n const model = createCellModelFromExcelCell(cell);\n if (!model) {\n return;\n }\n\n const rowIndex = rowNumber - 1;\n const colIndex = colNumber - 1;\n const key = makeCellKey(rowIndex, colIndex);\n cells[key] = model;\n\n if (rowIndex < renderedRowCount && colIndex < renderedColCount) {\n data[rowIndex][colIndex] = model.displayValue;\n }\n });\n });\n\n const colWidths = Array.from({ length: colCount }, (_, index) => {\n const column = worksheet.getColumn(index + 1);\n if (column.hidden) {\n return 0;\n }\n const width = Number(column.width ?? 12);\n return Math.max(64, Math.round(width * 7));\n });\n\n const rowHeights = Array.from({ length: rowCount }, (_, index) => {\n const row = worksheet.getRow(index + 1);\n if (row.hidden) {\n return 0;\n }\n return row.height\n ? Math.max(20, Math.round(Number(row.height) / 0.75))\n : 32;\n });\n\n const mergeRanges = Array.isArray(worksheet.model?.merges)\n ? worksheet.model.merges\n : [];\n\n return {\n name: worksheet.name,\n data,\n cells,\n rowCount,\n colCount,\n renderedRowCount,\n renderedColCount,\n merges: mergeRanges.map((range) => {\n const decoded = XLSX.utils.decode_range(range);\n return {\n startRow: decoded.s.r,\n startCol: decoded.s.c,\n endRow: decoded.e.r,\n endCol: decoded.e.c,\n };\n }),\n colWidths,\n rowHeights,\n };\n}\n\nfunction buildSheetModelsFromXlsxWorkbook(workbook: XLSX.WorkBook): SheetModel[] {\n return workbook.SheetNames.map((name) => {\n const worksheet = workbook.Sheets[name];\n const decodedRange = worksheet[\"!ref\"]\n ? XLSX.utils.decode_range(worksheet[\"!ref\"])\n : XLSX.utils.decode_range(\"A1\");\n const rowCount = Math.max(decodedRange.e.r + 1, 1);\n const colCount = Math.max(decodedRange.e.c + 1, 1);\n const renderedRowCount = Math.min(rowCount, MAX_RENDER_ROWS);\n const renderedColCount = Math.min(colCount, MAX_RENDER_COLS);\n const data = createEmptyGrid(renderedRowCount, renderedColCount);\n const cells: Record<string, SpreadsheetCellExportModel> = {};\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {\n for (let colIndex = 0; colIndex < colCount; colIndex += 1) {\n const address = XLSX.utils.encode_cell({ r: rowIndex, c: colIndex });\n const cell = worksheet[address];\n if (!cell) {\n continue;\n }\n\n const model = createCellModelFromXlsxCell(address, cell);\n if (!model) {\n continue;\n }\n\n const key = makeCellKey(rowIndex, colIndex);\n cells[key] = model;\n\n if (rowIndex < renderedRowCount && colIndex < renderedColCount) {\n data[rowIndex][colIndex] = model.displayValue;\n }\n }\n }\n\n const colWidths = Array.from({ length: colCount }, (_, index) => {\n const width = worksheet[\"!cols\"]?.[index];\n if (width?.hidden) {\n return 0;\n }\n return width?.wpx ?? Math.max(64, Math.round((width?.wch ?? 12) * 8));\n });\n\n const rowHeights = Array.from({ length: rowCount }, (_, index) => {\n const height = worksheet[\"!rows\"]?.[index];\n if (height?.hidden) {\n return 0;\n }\n return height?.hpx ?? 32;\n });\n\n return {\n name,\n data,\n cells,\n rowCount,\n colCount,\n renderedRowCount,\n renderedColCount,\n merges: (worksheet[\"!merges\"] ?? []).map((merge) => ({\n startRow: merge.s.r,\n startCol: merge.s.c,\n endRow: merge.e.r,\n endCol: merge.e.c,\n })),\n colWidths,\n rowHeights,\n };\n });\n}\n\nasync function buildSheetModels(arrayBuffer: ArrayBuffer, fileName: string) {\n const isNativeXlsx = fileName.toLowerCase().endsWith(\".xlsx\");\n\n if (isNativeXlsx) {\n try {\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(arrayBuffer.slice(0));\n if (workbook.worksheets.length > 0) {\n return workbook.worksheets.map(buildSheetModelFromExcelWorksheet);\n }\n } catch (error) {\n console.warn(\"ExcelJS parse failed, falling back to xlsx\", error);\n }\n }\n\n const workbook = XLSX.read(arrayBuffer, {\n type: \"array\",\n cellStyles: true,\n cellFormula: true,\n cellDates: true,\n sheetStubs: true,\n });\n\n return buildSheetModelsFromXlsxWorkbook(workbook);\n}\n\nexport function SpreadsheetEditor(props: SpreadsheetEditorProps) {\n const readonly = props.mode === \"view\";\n const [sheets, setSheets] = useState<SheetModel[]>([]);\n const [activeCell, setActiveCell] = useState({ row: 0, col: 0 });\n const [hasEdits, setHasEdits] = useState(false);\n const [dirtyCellAddressesBySheet, setDirtyCellAddressesBySheet] = useState<\n Record<string, string[]>\n >({});\n\n useEffect(() => {\n if (!props.arrayBuffer) {\n const nextSheets =\n props.mode === \"create\" ? [createBlankSheetModel(\"Sheet1\")] : [];\n setSheets(nextSheets);\n setHasEdits(false);\n setDirtyCellAddressesBySheet({});\n props.onPageCount(Math.max(nextSheets.length, 1));\n props.onThumbs(nextSheets.map(makeSheetThumbnail));\n return;\n }\n\n let cancelled = false;\n\n const loadSheets = async () => {\n try {\n const nextSheets = await buildSheetModels(props.arrayBuffer!, props.fileName);\n if (cancelled) {\n return;\n }\n\n setSheets(nextSheets);\n setHasEdits(false);\n setDirtyCellAddressesBySheet({});\n props.onPageCount(Math.max(nextSheets.length, 1));\n props.onThumbs(nextSheets.map(makeSheetThumbnail));\n if (props.currentPage > nextSheets.length) {\n props.onCurrentPageChange(1);\n }\n setActiveCell({ row: 0, col: 0 });\n } catch (error) {\n console.error(\"Spreadsheet load error:\", error);\n if (cancelled) {\n return;\n }\n setSheets([]);\n setHasEdits(false);\n setDirtyCellAddressesBySheet({});\n props.onPageCount(1);\n props.onThumbs([]);\n }\n };\n\n void loadSheets();\n\n return () => {\n cancelled = true;\n };\n }, [\n props.arrayBuffer,\n props.fileName,\n props.onCurrentPageChange,\n props.onPageCount,\n props.onThumbs,\n props.mode,\n ]);\n\n useEffect(() => {\n props.onExportStateChange?.(\n sheets.length > 0\n ? {\n sheets,\n sourceArrayBuffer: props.arrayBuffer,\n sourceFileType: props.fileName.toLowerCase().endsWith(\".xlsx\")\n ? \"xlsx\"\n : props.fileName.toLowerCase().endsWith(\".xls\")\n ? \"xls\"\n : props.fileName.toLowerCase().endsWith(\".csv\")\n ? \"csv\"\n : undefined,\n hasEdits,\n dirtyCellAddressesBySheet,\n }\n : null,\n );\n\n return () => {\n props.onExportStateChange?.(null);\n };\n }, [\n dirtyCellAddressesBySheet,\n hasEdits,\n props.arrayBuffer,\n props.fileName,\n props.onExportStateChange,\n sheets,\n ]);\n\n const activeSheetIndex = Math.max(\n 0,\n Math.min(props.currentPage - 1, Math.max(sheets.length - 1, 0)),\n );\n const activeSheet = sheets[activeSheetIndex];\n\n const mergeLookup = useMemo(\n () => createMergeLookup(activeSheet?.merges ?? []),\n [activeSheet],\n );\n\n const activeCellModel = activeSheet?.cells[makeCellKey(activeCell.row, activeCell.col)];\n const activeCellValue = getCellInputValue(activeCellModel);\n\n const addSheet = () => {\n const nextSheets = [...sheets, createBlankSheetModel(getNextSheetName(sheets))];\n setHasEdits(true);\n setSheets(nextSheets);\n props.onPageCount(nextSheets.length);\n props.onThumbs(nextSheets.map(makeSheetThumbnail));\n props.onCurrentPageChange(nextSheets.length);\n setActiveCell({ row: 0, col: 0 });\n };\n\n const addRow = () => {\n if (!activeSheet) {\n return;\n }\n\n setHasEdits(true);\n setSheets((prev) =>\n prev.map((sheet, index) =>\n index === activeSheetIndex ? appendBlankRow(sheet) : sheet,\n ),\n );\n };\n\n const addColumn = () => {\n if (!activeSheet) {\n return;\n }\n\n setHasEdits(true);\n setSheets((prev) =>\n prev.map((sheet, index) =>\n index === activeSheetIndex ? appendBlankColumn(sheet) : sheet,\n ),\n );\n };\n\n const updateCell = (row: number, col: number, value: string) => {\n setHasEdits(true);\n const address = XLSX.utils.encode_cell({ r: row, c: col });\n const activeSheetName = sheets[activeSheetIndex]?.name;\n if (activeSheetName) {\n setDirtyCellAddressesBySheet((prev) => {\n const next = new Set(prev[activeSheetName] ?? []);\n next.add(address);\n return {\n ...prev,\n [activeSheetName]: Array.from(next),\n };\n });\n }\n setSheets((prev) =>\n prev.map((sheet, index) => {\n if (index !== activeSheetIndex) {\n return sheet;\n }\n\n const nextData = sheet.data.map((sheetRow) => [...sheetRow]);\n const nextCells = { ...sheet.cells };\n const cellKey = makeCellKey(row, col);\n const nextCell = buildEditedCellModel(address, value, nextCells[cellKey]);\n\n if (nextCell) {\n nextCells[cellKey] = nextCell;\n } else {\n delete nextCells[cellKey];\n }\n\n if (row < sheet.renderedRowCount && col < sheet.renderedColCount) {\n nextData[row][col] = nextCell?.displayValue ?? \"\";\n }\n\n return {\n ...sheet,\n data: nextData,\n cells: nextCells,\n };\n }),\n );\n };\n\n if (!activeSheet) {\n return (\n <div className=\"hv-view-single\">\n <div className=\"hv-page-container\" style={{ padding: \"48px\" }}>\n <p className=\"hv-empty-state\">{props.locale[\"documents.sheetMissing\"]}</p>\n </div>\n </div>\n );\n }\n\n const isTruncated =\n activeSheet.rowCount > activeSheet.renderedRowCount ||\n activeSheet.colCount > activeSheet.renderedColCount;\n\n return (\n <div className=\"hv-view-single\">\n <div className=\"hv-page-container hv-sheet-container\">\n <div className=\"hv-sheet-tabs\">\n <div className=\"hv-sheet-tab-list\">\n {sheets.map((sheet, index) => (\n <button\n key={sheet.name}\n type=\"button\"\n className={`hv-sheet-tab ${index === activeSheetIndex ? \"active\" : \"\"}`}\n onClick={() => {\n props.onCurrentPageChange(index + 1);\n setActiveCell({ row: 0, col: 0 });\n }}\n >\n {sheet.name}\n </button>\n ))}\n </div>\n\n {!readonly && (\n <div className=\"hv-sheet-actions\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={addSheet}\n >\n {props.locale[\"documents.sheetAddSheet\"]}\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={addRow}\n >\n {props.locale[\"documents.sheetAddRow\"]}\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={addColumn}\n >\n {props.locale[\"documents.sheetAddColumn\"]}\n </button>\n </div>\n )}\n </div>\n\n <div className=\"hv-sheet-formula-bar\">\n <div className=\"hv-sheet-formula-cell\">\n {toColumnLabel(activeCell.col)}\n {activeCell.row + 1}\n </div>\n <input\n value={activeCellValue}\n readOnly={readonly}\n onChange={(event) =>\n updateCell(activeCell.row, activeCell.col, event.target.value)\n }\n className=\"hv-sheet-formula-input\"\n />\n </div>\n\n {isTruncated && (\n <div className=\"hv-sheet-viewport-note\">\n {props.locale[\"documents.sheetTruncated\"]\n .replace(\"{rows}\", String(activeSheet.renderedRowCount))\n .replace(\"{cols}\", String(activeSheet.renderedColCount))}\n </div>\n )}\n\n <div className=\"hv-sheet-scroll\">\n <div className=\"hv-sheet-surface\">\n <table className=\"hv-sheet-table\">\n <thead>\n <tr>\n <th className=\"hv-sheet-corner\" />\n {Array.from(\n { length: activeSheet.renderedColCount },\n (_, colIndex) => (\n <th\n key={toColumnLabel(colIndex)}\n className=\"hv-sheet-column-header\"\n style={{\n minWidth: activeSheet.colWidths[colIndex] ?? 96,\n width: activeSheet.colWidths[colIndex] ?? 96,\n }}\n >\n {toColumnLabel(colIndex)}\n </th>\n ),\n )}\n </tr>\n </thead>\n <tbody>\n {activeSheet.data.map((row, rowIndex) => (\n <tr\n key={rowIndex}\n style={{ height: activeSheet.rowHeights[rowIndex] ?? 32 }}\n >\n <td className=\"hv-sheet-row-header\">{rowIndex + 1}</td>\n {row.map((cellValue, colIndex) => {\n const cellKey = makeCellKey(rowIndex, colIndex);\n if (mergeLookup.covered.has(cellKey)) {\n return null;\n }\n\n const merge = mergeLookup.starts.get(cellKey);\n const cellModel = activeSheet.cells[cellKey];\n const width = activeSheet.colWidths[colIndex] ?? 96;\n\n return (\n <td\n key={cellKey}\n rowSpan={merge ? merge.endRow - merge.startRow + 1 : 1}\n colSpan={merge ? merge.endCol - merge.startCol + 1 : 1}\n className={`hv-sheet-cell ${activeCell.row === rowIndex && activeCell.col === colIndex ? \"active\" : \"\"}`}\n contentEditable={!readonly}\n suppressContentEditableWarning\n onFocus={() => setActiveCell({ row: rowIndex, col: colIndex })}\n onClick={() => setActiveCell({ row: rowIndex, col: colIndex })}\n onBlur={(event) =>\n updateCell(rowIndex, colIndex, event.currentTarget.innerText)\n }\n title={cellModel?.note || cellModel?.hyperlink || cellModel?.formula}\n style={{\n minWidth: width,\n width,\n ...getCellStyle(cellModel),\n }}\n >\n {cellValue}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n\n <SignatureOverlay\n surfaceKey={`sheet:${activeSheet.name}`}\n surfaceKind=\"sheet\"\n sheetName={activeSheet.name}\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={props.signatureOverlay.annotationPlaceholder}\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo } from \"react\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type {\n DocumentSurfaceOverlayState,\n SupportedFileType,\n} from \"../types\";\n\ninterface ImageRendererProps {\n arrayBuffer?: ArrayBuffer;\n fileType: SupportedFileType;\n fileName: string;\n signatureOverlay: DocumentSurfaceOverlayState;\n locale: Record<string, string>;\n}\n\nexport function ImageRenderer(props: ImageRendererProps) {\n const url = useMemo(() => {\n if (!props.arrayBuffer) {\n return undefined;\n }\n\n const mime =\n props.fileType === \"svg\"\n ? \"image/svg+xml\"\n : props.fileType === \"png\"\n ? \"image/png\"\n : \"image/jpeg\";\n\n return URL.createObjectURL(new Blob([props.arrayBuffer], { type: mime }));\n }, [props.arrayBuffer, props.fileType]);\n\n useEffect(() => {\n return () => {\n if (url) {\n URL.revokeObjectURL(url);\n }\n };\n }, [url]);\n\n if (!props.arrayBuffer || !url) {\n return (\n <div className=\"hv-view-single\">\n <div className=\"hv-page-container\" style={{ padding: \"48px\" }}>\n <p className=\"hv-empty-state\">{props.locale[\"documents.imageMissing\"]}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"hv-view-single\">\n <div className=\"hv-page-container hv-image-surface\">\n <img src={url} alt={props.fileName} className=\"hv-image-renderer\" />\n <SignatureOverlay\n surfaceKey=\"image:main\"\n surfaceKind=\"image\"\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={props.signatureOverlay.annotationPlaceholder}\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\r\n\r\nimport {\n getDocument,\n GlobalWorkerOptions,\n type PDFDocumentProxy,\n} from \"pdfjs-dist\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type { DocumentSurfaceOverlayState, PageLayout } from \"../types\";\n\nlet pdfWorkerBlobUrlPromise: Promise<string> | null = null;\n\nfunction yieldToBrowser() {\n return new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n}\n\nasync function resolvePdfWorkerSrc(customWorkerSrc?: string) {\n if (customWorkerSrc) {\n return customWorkerSrc;\n }\n\n if (!pdfWorkerBlobUrlPromise) {\n pdfWorkerBlobUrlPromise = import(\"../../generated/pdfWorkerBundle\")\n .then(({ pdfWorkerBundleSource }) =>\n URL.createObjectURL(\n new Blob([pdfWorkerBundleSource], { type: \"text/javascript\" }),\n ),\n )\n .catch((error) => {\n pdfWorkerBlobUrlPromise = null;\n throw error;\n });\n }\n\n return pdfWorkerBlobUrlPromise;\n}\n\ninterface PdfRendererProps {\n url?: string;\n arrayBuffer?: ArrayBuffer;\n workerSrc?: string;\n locale: Record<string, string>;\n layout: PageLayout;\n currentPage: number;\n onPageCount: (n: number) => void;\n onCurrentPageChange: (p: number) => void;\n onThumbs: (thumbs: Array<string | undefined>) => void;\n signatureOverlay: DocumentSurfaceOverlayState;\n}\n\r\nexport function PdfRenderer(props: PdfRendererProps) {\n const { url, arrayBuffer, layout, currentPage, workerSrc } = props;\n const [doc, setDoc] = useState<PDFDocumentProxy | null>(null);\n const [error, setError] = useState<string | null>(null);\n const thumbnailJobRef = useRef(0);\n\n useEffect(() => {\n let active = true;\n const thumbnailJobId = thumbnailJobRef.current + 1;\n thumbnailJobRef.current = thumbnailJobId;\n\n const loadPdf = async () => {\n // If no source, do nothing\n if (!url && !arrayBuffer) return;\n\r\n setError(null);\r\n\n try {\n GlobalWorkerOptions.workerSrc = await resolvePdfWorkerSrc(workerSrc);\n\n // FIX 2: Clone the ArrayBuffer!\n // PDF.js transfers the buffer to the worker, which \"detaches\" (empties) the original.\n // We pass a slice (copy) so the original data in DocumentViewer remains valid.\n const dataSource = arrayBuffer\r\n ? { data: arrayBuffer.slice(0) }\r\n : { url: url! };\r\n\r\n const loadingTask = getDocument(dataSource);\r\n\r\n const pdf = await loadingTask.promise;\n\n if (active) {\n setDoc(pdf);\n props.onPageCount(pdf.numPages);\n void generateThumbnails(pdf, thumbnailJobId);\n }\n } catch (err: any) {\n // Quietly handle errors (e.g. password protected files)\r\n console.error(\"PDF Load Error:\", err);\r\n if (active) setError(err.message || \"Failed to load PDF\");\r\n }\r\n };\r\n\r\n loadPdf();\n return () => {\n active = false;\n thumbnailJobRef.current += 1;\n };\n }, [url, arrayBuffer, workerSrc]); // Re-run if file changes\n\n const generateThumbnails = async (\n pdf: PDFDocumentProxy,\n thumbnailJobId: number,\n ) => {\n try {\n const thumbs: Array<string | undefined> = Array.from({\n length: pdf.numPages,\n });\n props.onThumbs([...thumbs]);\n\n for (let i = 1; i <= pdf.numPages; i++) {\n if (thumbnailJobRef.current !== thumbnailJobId) {\n return;\n }\n\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale: 0.2 });\n const canvas = document.createElement(\"canvas\");\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\r\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n await page.render({ canvasContext: ctx, viewport }).promise;\n if (thumbnailJobRef.current !== thumbnailJobId) {\n return;\n }\n thumbs[i - 1] = canvas.toDataURL();\n }\n\n if (i === 1 || i === pdf.numPages || i % 4 === 0) {\n props.onThumbs([...thumbs]);\n }\n\n if (i % 4 === 0) {\n await yieldToBrowser();\n }\n }\n\n if (thumbnailJobRef.current === thumbnailJobId) {\n props.onThumbs([...thumbs]);\n }\n } catch (e) {\n /* ignore */\n }\n };\n\r\n const pagesToRender = useMemo(() => {\r\n if (!doc) return [];\r\n const p = Math.max(1, Math.min(currentPage, doc.numPages));\r\n if (layout === \"side-by-side\" && doc.numPages > 1) {\r\n if (p === 1) return [1];\r\n const left = p % 2 === 0 ? p : p - 1;\r\n return left + 1 <= doc.numPages ? [left, left + 1] : [left];\r\n }\r\n return [p];\r\n }, [doc, currentPage, layout]);\r\n\r\n if (error) {\n return (\n <div className=\"hv-page-container\" style={{ padding: \"32px\" }}>\n <div className=\"hv-error-banner\">\n <strong>{props.locale[\"documents.pdfLoadErrorTitle\"]}</strong>\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\r\n return (\r\n <div\r\n className={`hv-doc-scroll ${layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"}`}\n >\n {pagesToRender.map((page) => (\n <PdfPage\n key={page}\n doc={doc}\n pageNum={page}\n signatureOverlay={props.signatureOverlay}\n />\n ))}\n </div>\n );\n}\n\nfunction PdfPage({\n doc,\n pageNum,\n signatureOverlay,\n}: {\n doc: PDFDocumentProxy | null;\n pageNum: number;\n signatureOverlay: PdfRendererProps[\"signatureOverlay\"];\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\r\n useEffect(() => {\r\n if (!doc || !canvasRef.current) return;\r\n let active = true;\r\n\r\n const render = async () => {\r\n try {\r\n const page = await doc.getPage(pageNum);\r\n if (!active) return;\r\n\r\n const scale = 1.5; // High fidelity\r\n const viewport = page.getViewport({ scale });\r\n const canvas = canvasRef.current!;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n canvas.width = viewport.width;\r\n canvas.height = viewport.height;\r\n\r\n canvas.style.width = `${viewport.width / scale}px`;\r\n canvas.style.height = `${viewport.height / scale}px`;\r\n\r\n await page.render({ canvasContext: ctx, viewport }).promise;\r\n } catch (e) {\r\n console.error(\"Page render error:\", e);\r\n }\r\n };\r\n render();\r\n return () => {\r\n active = false;\r\n };\r\n }, [doc, pageNum]);\r\n\r\n return (\n <div\n className=\"hv-page-container\"\n style={{\r\n minHeight: \"600px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\n >\n <canvas ref={canvasRef} className=\"hv-pdf-canvas\" />\n <SignatureOverlay\n surfaceKey={`page:${pageNum}`}\n surfaceKind=\"page\"\n page={pageNum}\n placements={signatureOverlay.placements}\n annotations={signatureOverlay.annotations}\n pendingSignature={signatureOverlay.pendingSignature}\n pendingAnnotation={signatureOverlay.pendingAnnotation}\n activePlacementId={signatureOverlay.activePlacementId}\n activeAnnotationId={signatureOverlay.activeAnnotationId}\n placeHint={signatureOverlay.placeHint}\n annotationHint={signatureOverlay.annotationHint}\n annotationPlaceholder={signatureOverlay.annotationPlaceholder}\n signatureAltLabel={signatureOverlay.signatureAltLabel}\n signatureAltByLabel={signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={signatureOverlay.signatureNoteIndicatorLabel}\n signatureColorLabel={signatureOverlay.signatureColorLabel}\n signatureColorNames={signatureOverlay.signatureColorNames}\n removeSignatureLabel={signatureOverlay.removeSignatureLabel}\n annotationTitle={signatureOverlay.annotationTitle}\n linkedAnnotationTitle={signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={signatureOverlay.onSelectPlacement}\n onSelectAnnotation={signatureOverlay.onSelectAnnotation}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport JSZip from \"jszip\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type {\n PptxExportState,\n PptxParagraphModel,\n PptxRunModel,\n PptxSlideElementModel,\n PptxSlideModel,\n} from \"../internal/exportModels\";\nimport type {\n DocumentSurfaceOverlayState,\n PageLayout,\n} from \"../types\";\n\nconst NS_P = \"http://schemas.openxmlformats.org/presentationml/2006/main\";\nconst NS_A = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst NS_R =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\n\ninterface PptxRendererProps {\n arrayBuffer?: ArrayBuffer;\n fileName?: string;\n locale: Record<string, string>;\n layout: PageLayout;\n currentPage: number;\n onCurrentPageChange: (p: number) => void;\n onPageCount: (n: number) => void;\n onThumbs: (thumbs: Array<string | undefined>) => void;\n onExportStateChange?: (state: PptxExportState | null) => void;\n signatureOverlay: DocumentSurfaceOverlayState;\n}\n\nconst SLIDE_RENDER_BASE_WIDTH = 1280;\nconst SLIDE_RENDER_MAX_VIEW_WIDTH = 1080;\nconst SLIDE_RENDER_MIN_VIEW_WIDTH = 300;\nconst SLIDE_RENDER_GAP = 24;\n\nfunction alignToClassName(align?: string) {\n if (align === \"ctr\") {\n return \"align-ctr\";\n }\n if (align === \"r\") {\n return \"align-r\";\n }\n return \"align-l\";\n}\n\nfunction isBrowserRenderableSlideImage(source: string) {\n return !/^data:image\\/(?:emf|wmf|tiff)/i.test(source);\n}\n\nfunction PresentationImage(props: { src: string; alt: string }) {\n const [failed, setFailed] = useState(!isBrowserRenderableSlideImage(props.src));\n\n if (failed) {\n return <div className=\"hv-slide-image-fallback\">{props.alt}</div>;\n }\n\n return (\n <img\n src={props.src}\n alt={props.alt}\n className=\"hv-slide-image\"\n onError={() => setFailed(true)}\n />\n );\n}\n\nfunction parseColor(solidFill: Element | null): string | undefined {\n if (!solidFill) {\n return undefined;\n }\n\n const srgbClr = solidFill.getElementsByTagNameNS(NS_A, \"srgbClr\")[0];\n if (srgbClr) {\n const value = srgbClr.getAttribute(\"val\");\n return value ? `#${value}` : undefined;\n }\n\n const schemeClr = solidFill.getElementsByTagNameNS(NS_A, \"schemeClr\")[0];\n if (schemeClr) {\n const value = schemeClr.getAttribute(\"val\");\n const colorMap: Record<string, string> = {\n tx1: \"#0f172a\",\n bg1: \"#ffffff\",\n tx2: \"#1e293b\",\n accent1: \"#2563eb\",\n accent2: \"#f97316\",\n accent3: \"#14b8a6\",\n accent4: \"#facc15\",\n accent5: \"#8b5cf6\",\n accent6: \"#22c55e\",\n };\n return colorMap[value || \"\"] || \"#0f172a\";\n }\n\n return undefined;\n}\n\nfunction resolveZipPath(basePath: string, target: string) {\n const normalizedBase = basePath.split(\"/\").filter(Boolean);\n normalizedBase.pop();\n\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n\n if (segment === \"..\") {\n normalizedBase.pop();\n } else {\n normalizedBase.push(segment);\n }\n }\n\n return normalizedBase.join(\"/\");\n}\n\nfunction getMimeType(path: string) {\n const lower = path.toLowerCase();\n if (lower.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (lower.endsWith(\".bmp\")) {\n return \"image/bmp\";\n }\n if (lower.endsWith(\".jpg\") || lower.endsWith(\".jpeg\")) {\n return \"image/jpeg\";\n }\n if (lower.endsWith(\".gif\")) {\n return \"image/gif\";\n }\n if (lower.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (lower.endsWith(\".tif\") || lower.endsWith(\".tiff\")) {\n return \"image/tiff\";\n }\n if (lower.endsWith(\".webp\")) {\n return \"image/webp\";\n }\n if (lower.endsWith(\".avif\")) {\n return \"image/avif\";\n }\n if (lower.endsWith(\".emf\")) {\n return \"image/emf\";\n }\n if (lower.endsWith(\".wmf\")) {\n return \"image/wmf\";\n }\n return \"application/octet-stream\";\n}\n\nfunction parsePresentationSize(xml: string | undefined) {\n if (!xml) {\n return { width: 9144000, height: 5143500 };\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(xml, \"application/xml\");\n const size = doc.getElementsByTagNameNS(NS_P, \"sldSz\")[0];\n\n return {\n width: Number(size?.getAttribute(\"cx\") || \"9144000\"),\n height: Number(size?.getAttribute(\"cy\") || \"5143500\"),\n };\n}\n\nfunction parseRelationships(xml: string | undefined, slidePath: string) {\n if (!xml) {\n return new Map<string, string>();\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(xml, \"application/xml\");\n const relationshipNodes = Array.from(doc.getElementsByTagName(\"Relationship\"));\n const map = new Map<string, string>();\n\n for (const node of relationshipNodes) {\n const target = node.getAttribute(\"Target\");\n const id = node.getAttribute(\"Id\");\n const targetMode = node.getAttribute(\"TargetMode\");\n\n if (!target || !id || targetMode === \"External\") {\n continue;\n }\n\n map.set(id, resolveZipPath(slidePath, target));\n }\n\n return map;\n}\n\nfunction parseTransform(element: Element | null) {\n const xfrm = element?.getElementsByTagNameNS(NS_A, \"xfrm\")[0];\n const off = xfrm?.getElementsByTagNameNS(NS_A, \"off\")[0];\n const ext = xfrm?.getElementsByTagNameNS(NS_A, \"ext\")[0];\n\n return {\n x: Number(off?.getAttribute(\"x\") || \"0\"),\n y: Number(off?.getAttribute(\"y\") || \"0\"),\n width: Number(ext?.getAttribute(\"cx\") || \"0\"),\n height: Number(ext?.getAttribute(\"cy\") || \"0\"),\n rotation: Number(xfrm?.getAttribute(\"rot\") || \"0\") / 60000,\n };\n}\n\nfunction parseParagraphs(txBody: Element | null) {\n if (!txBody) {\n return [];\n }\n\n const paragraphs = Array.from(txBody.getElementsByTagNameNS(NS_A, \"p\"));\n\n return paragraphs\n .map((paragraph, paragraphIndex) => {\n const paragraphProps = paragraph.getElementsByTagNameNS(NS_A, \"pPr\")[0];\n const bulletChar =\n paragraphProps?.getElementsByTagNameNS(NS_A, \"buChar\")[0]?.getAttribute(\"char\")\n || undefined;\n const autoNumbered = Boolean(\n paragraphProps?.getElementsByTagNameNS(NS_A, \"buAutoNum\")[0],\n );\n const runs = Array.from(paragraph.childNodes)\n .flatMap((node) => {\n if (!(node instanceof Element)) {\n return [];\n }\n\n const tagName = node.localName;\n if (tagName === \"r\") {\n const textNode = node.getElementsByTagNameNS(NS_A, \"t\")[0];\n const text = textNode?.textContent || \"\";\n if (!text) {\n return [];\n }\n\n const runProps = node.getElementsByTagNameNS(NS_A, \"rPr\")[0];\n const size = Number(runProps?.getAttribute(\"sz\") || \"1800\");\n\n return [{\n text,\n color:\n parseColor(runProps?.getElementsByTagNameNS(NS_A, \"solidFill\")[0] || null) ||\n \"#0f172a\",\n fontSize: Math.max(12, (size / 100) * 1.333),\n bold: runProps?.getAttribute(\"b\") === \"1\",\n italic: runProps?.getAttribute(\"i\") === \"1\",\n underline: runProps?.getAttribute(\"u\") === \"sng\",\n } satisfies PptxRunModel];\n }\n\n if (tagName === \"br\") {\n return [{ text: \"\\n\" }];\n }\n\n if (tagName === \"fld\") {\n const textNode = node.getElementsByTagNameNS(NS_A, \"t\")[0];\n return textNode?.textContent ? [{ text: textNode.textContent }] : [];\n }\n\n return [];\n })\n .filter((run) => run.text.length > 0);\n\n return {\n runs,\n align: paragraphProps?.getAttribute(\"algn\") || \"l\",\n level: Number(paragraphProps?.getAttribute(\"lvl\") || \"0\"),\n bullet: Boolean(bulletChar) || autoNumbered,\n bulletText: bulletChar || (autoNumbered ? `${paragraphIndex + 1}.` : undefined),\n } satisfies PptxParagraphModel;\n })\n .filter((paragraph) => paragraph.runs.length > 0);\n}\n\nasync function parseSlide(\n zip: JSZip,\n slidePath: string,\n slideXml: string,\n relationships: Map<string, string>,\n) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(slideXml, \"application/xml\");\n const elements: PptxSlideElementModel[] = [];\n const shapeNodes = Array.from(doc.getElementsByTagNameNS(NS_P, \"sp\"));\n const pictureNodes = Array.from(doc.getElementsByTagNameNS(NS_P, \"pic\"));\n const bgNode = doc.getElementsByTagNameNS(NS_P, \"bg\")[0];\n const bgFill = bgNode\n ?.getElementsByTagNameNS(NS_P, \"bgPr\")[0]\n ?.getElementsByTagNameNS(NS_A, \"solidFill\")[0];\n const background = parseColor(bgFill || null) || \"#ffffff\";\n\n for (const shape of shapeNodes) {\n const shapeProps = shape.getElementsByTagNameNS(NS_P, \"spPr\")[0];\n const txBody = shape.getElementsByTagNameNS(NS_P, \"txBody\")[0];\n const paragraphs = parseParagraphs(txBody);\n const fill = parseColor(shapeProps?.getElementsByTagNameNS(NS_A, \"solidFill\")[0] || null);\n const line = parseColor(\n shapeProps\n ?.getElementsByTagNameNS(NS_A, \"ln\")[0]\n ?.getElementsByTagNameNS(NS_A, \"solidFill\")[0] || null,\n );\n const transform = parseTransform(shapeProps);\n\n if (paragraphs.length === 0 && !fill && !line) {\n continue;\n }\n\n elements.push({\n id: `shape-${elements.length + 1}`,\n kind: \"shape\",\n x: transform.x,\n y: transform.y,\n width: transform.width,\n height: transform.height,\n rotation: transform.rotation,\n fill,\n stroke: line,\n paragraphs,\n alt:\n shape\n .getElementsByTagNameNS(NS_P, \"cNvPr\")[0]\n ?.getAttribute(\"name\") || undefined,\n });\n }\n\n for (const picture of pictureNodes) {\n const blip = picture.getElementsByTagNameNS(NS_A, \"blip\")[0];\n const embedId = blip?.getAttributeNS(NS_R, \"embed\");\n const targetPath = embedId ? relationships.get(embedId) : undefined;\n if (!targetPath) {\n continue;\n }\n\n const imageFile = zip.file(targetPath);\n if (!imageFile) {\n continue;\n }\n\n const transform = parseTransform(\n picture.getElementsByTagNameNS(NS_P, \"spPr\")[0],\n );\n const base64 = await imageFile.async(\"base64\");\n\n elements.push({\n id: `image-${elements.length + 1}`,\n kind: \"image\",\n x: transform.x,\n y: transform.y,\n width: transform.width,\n height: transform.height,\n rotation: transform.rotation,\n imageSrc: `data:${getMimeType(targetPath)};base64,${base64}`,\n alt:\n picture\n .getElementsByTagNameNS(NS_P, \"cNvPr\")[0]\n ?.getAttribute(\"name\") || undefined,\n });\n }\n\n const allText = elements\n .flatMap((element) => element.paragraphs || [])\n .flatMap((paragraph) => paragraph.runs)\n .map((run) => run.text.replace(/\\n/g, \" \").trim())\n .filter(Boolean);\n\n return {\n background,\n elements,\n title: allText[0],\n summary: allText.slice(1, 4).join(\" \"),\n } satisfies PptxSlideModel;\n}\n\nfunction makeSlideThumbnail(slide: PptxSlideModel, index: number) {\n const title = slide.title || `Slide ${index + 1}`;\n const summary = slide.summary || \"Presentation preview\";\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"160\" height=\"90\">\n <rect width=\"100%\" height=\"100%\" fill=\"${slide.background || \"#ffffff\"}\" rx=\"10\" ry=\"10\" />\n <rect x=\"10\" y=\"10\" width=\"140\" height=\"18\" fill=\"rgba(15,23,42,0.12)\" rx=\"6\" ry=\"6\" />\n <text x=\"16\" y=\"24\" fill=\"#0f172a\" font-size=\"10\" font-family=\"Arial\">${title}</text>\n <text x=\"16\" y=\"48\" fill=\"#334155\" font-size=\"9\" font-family=\"Arial\">${summary}</text>\n </svg>`;\n\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport function PptxRenderer(props: PptxRendererProps) {\n const [slides, setSlides] = useState<PptxSlideModel[]>([]);\n const [slideSize, setSlideSize] = useState({ width: 9144000, height: 5143500 });\n const [error, setError] = useState<string | null>(null);\n const viewRef = useRef<HTMLDivElement>(null);\n const [viewWidth, setViewWidth] = useState(SLIDE_RENDER_MAX_VIEW_WIDTH);\n\n useEffect(() => {\n if (!props.arrayBuffer) {\n setSlides([]);\n props.onPageCount(1);\n props.onThumbs([]);\n props.onExportStateChange?.(null);\n return;\n }\n\n const loadPptx = async () => {\n try {\n const arrayBuffer = props.arrayBuffer;\n if (!arrayBuffer) {\n return;\n }\n\n const zip = await JSZip.loadAsync(arrayBuffer);\n const presentationXml = await zip.file(\"ppt/presentation.xml\")?.async(\"string\");\n const nextSize = parsePresentationSize(presentationXml);\n setSlideSize(nextSize);\n\n const slidePaths = Object.keys(zip.files)\n .filter((path) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(path))\n .sort((left, right) => {\n const leftNumber = Number(left.match(/slide(\\d+)/)?.[1] || \"0\");\n const rightNumber = Number(right.match(/slide(\\d+)/)?.[1] || \"0\");\n return leftNumber - rightNumber;\n });\n\n const parsedSlides: PptxSlideModel[] = [];\n for (const slidePath of slidePaths) {\n const slideXml = await zip.file(slidePath)?.async(\"string\");\n if (!slideXml) {\n continue;\n }\n\n const relsPath = slidePath.replace(\n /ppt\\/slides\\/(slide\\d+\\.xml)$/,\n \"ppt/slides/_rels/$1.rels\",\n );\n const relationshipsXml = await zip.file(relsPath)?.async(\"string\");\n const relationships = parseRelationships(relationshipsXml, slidePath);\n parsedSlides.push(await parseSlide(zip, slidePath, slideXml, relationships));\n }\n\n setSlides(parsedSlides);\n props.onPageCount(Math.max(parsedSlides.length, 1));\n props.onThumbs(parsedSlides.map(makeSlideThumbnail));\n props.onExportStateChange?.({\n slideSize: nextSize,\n slides: parsedSlides,\n sourceArrayBuffer: arrayBuffer.slice(0),\n sourceFileType: props.fileName?.toLowerCase().endsWith(\".ppt\")\n ? \"ppt\"\n : \"pptx\",\n });\n } catch (err: any) {\n setError(err.message || \"Failed to parse PPTX\");\n }\n };\n\n loadPptx();\n }, [props.arrayBuffer, props.onExportStateChange]);\n\n useEffect(() => {\n const host = viewRef.current;\n if (!host || typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const observer = new ResizeObserver((entries) => {\n const nextWidth = entries[0]?.contentRect.width;\n if (nextWidth) {\n setViewWidth(nextWidth);\n }\n });\n\n observer.observe(host);\n return () => observer.disconnect();\n }, []);\n\n const pagesToShow = useMemo(() => {\n if (slides.length === 0) {\n return [];\n }\n\n const validPage = Math.max(1, Math.min(props.currentPage, slides.length));\n\n if (props.layout === \"side-by-side\" && slides.length > 1) {\n if (validPage === 1) {\n return [1];\n }\n\n const left = validPage % 2 === 0 ? validPage : validPage - 1;\n return [left, left + 1].filter((page) => page <= slides.length);\n }\n\n return [validPage];\n }, [slides.length, props.currentPage, props.layout]);\n\n const slideViewportWidth = useMemo(() => {\n const boundedWidth = Math.max(\n SLIDE_RENDER_MIN_VIEW_WIDTH,\n Math.min(viewWidth, SLIDE_RENDER_MAX_VIEW_WIDTH * 2 + SLIDE_RENDER_GAP),\n );\n\n if (props.layout === \"side-by-side\" && pagesToShow.length > 1) {\n return Math.max(\n (boundedWidth - SLIDE_RENDER_GAP) / 2,\n SLIDE_RENDER_MIN_VIEW_WIDTH,\n );\n }\n\n return Math.max(\n Math.min(boundedWidth, SLIDE_RENDER_MAX_VIEW_WIDTH),\n SLIDE_RENDER_MIN_VIEW_WIDTH,\n );\n }, [pagesToShow.length, props.layout, viewWidth]);\n\n const sceneCoordScale = SLIDE_RENDER_BASE_WIDTH / slideSize.width;\n const sceneHeight = Math.max(1, Math.round(slideSize.height * sceneCoordScale));\n const sceneScale = slideViewportWidth / SLIDE_RENDER_BASE_WIDTH;\n\n if (error) {\n return <div className=\"hv-error-banner\">{error}</div>;\n }\n\n return (\n <div\n ref={viewRef}\n className={props.layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"}\n >\n {pagesToShow.map((pageNumber) => {\n const slide = slides[pageNumber - 1];\n if (!slide) {\n return null;\n }\n\n return (\n <div\n key={pageNumber}\n className=\"hv-page-container hv-slide-surface\"\n style={{\n aspectRatio: `${slideSize.width}/${slideSize.height}`,\n width:\n props.layout === \"side-by-side\" && pagesToShow.length > 1\n ? `${slideViewportWidth}px`\n : undefined,\n }}\n >\n <div\n className=\"hv-slide-stage\"\n style={{ background: slide.background || \"#ffffff\" }}\n >\n <div\n className=\"hv-slide-scene\"\n style={{\n width: `${SLIDE_RENDER_BASE_WIDTH}px`,\n height: `${sceneHeight}px`,\n transform: `scale(${sceneScale})`,\n }}\n >\n {slide.elements.map((element) => (\n <div\n key={element.id}\n className={`hv-slide-element ${element.kind}`}\n style={{\n left: `${element.x * sceneCoordScale}px`,\n top: `${element.y * sceneCoordScale}px`,\n width: `${element.width * sceneCoordScale}px`,\n height: `${element.height * sceneCoordScale}px`,\n transform: element.rotation\n ? `rotate(${element.rotation}deg)`\n : undefined,\n background: element.kind === \"shape\" ? element.fill || \"transparent\" : undefined,\n borderColor: element.stroke,\n }}\n >\n {element.kind === \"image\" && element.imageSrc ? (\n <PresentationImage\n src={element.imageSrc}\n alt={element.alt || \"Slide image\"}\n />\n ) : (\n <div className=\"hv-slide-textbox\">\n {element.paragraphs?.map((paragraph, paragraphIndex) => (\n <p\n key={`${element.id}-${paragraphIndex}`}\n className={`hv-slide-paragraph ${alignToClassName(paragraph.align)}`}\n style={{ paddingInlineStart: `${paragraph.level * 18}px` }}\n >\n {paragraph.bullet && <span className=\"hv-slide-bullet\">•</span>}\n <span className=\"hv-slide-paragraph-copy\">\n {paragraph.runs.map((run, runIndex) => (\n <span\n key={`${element.id}-${paragraphIndex}-${runIndex}`}\n style={{\n color: run.color,\n fontSize: Math.max(\n 12,\n (run.fontSize || 18) * sceneCoordScale,\n ),\n fontWeight: run.bold ? 700 : 400,\n fontStyle: run.italic ? \"italic\" : \"normal\",\n textDecoration: run.underline ? \"underline\" : \"none\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {run.text}\n </span>\n ))}\n </span>\n </p>\n ))}\n </div>\n )}\n </div>\n ))}\n\n <SignatureOverlay\n surfaceKey={`slide:${pageNumber}`}\n surfaceKind=\"slide\"\n slide={pageNumber}\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={props.signatureOverlay.annotationPlaceholder}\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\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.annotate\": \"Add Annotation\",\n \"toolbar.headerFooter\": \"Header & Footer\",\n \"toolbar.save\": \"Save\",\n \"toolbar.finalizePdf\": \"Finalize PDF\",\n \"toolbar.exportPdf\": \"Export as PDF\",\n \"toolbar.zoomIn\": \"Zoom in\",\n \"toolbar.zoomOut\": \"Zoom out\",\n \"toolbar.zoomReset\": \"Reset zoom\",\n \"thumbnails.title\": \"Thumbnails\",\n \"thumbnails.page\": \"Page\",\n \"signatures.title\": \"Signatures\",\n \"signatures.empty\": \"No signatures\",\n \"signatures.new\": \"New Signature\",\n \"signatures.ready\": \"Ready to place\",\n \"signatures.cancelPlacement\": \"Cancel placement\",\n \"signatures.drawTitle\": \"Draw Signature\",\n \"signatures.drawHelp\": \"Sign above using your mouse or finger\",\n \"signatures.clear\": \"Clear\",\n \"signatures.createAndUse\": \"Create & Use\",\n \"signatures.placeHint\": \"Click on the document surface to place the signature.\",\n \"signatures.alt\": \"Signature\",\n \"signatures.altBy\": \"Signature by\",\n \"signatures.noteIndicator\": \"Note\",\n \"signatures.remove\": \"Remove signature\",\n \"signatures.color\": \"Ink color\",\n \"signatures.color.black\": \"Black\",\n \"signatures.color.blue\": \"Blue\",\n \"signatures.color.red\": \"Red\",\n \"signatures.color.green\": \"Green\",\n \"annotations.placeHint\": \"Click on the document surface to place an annotation.\",\n \"annotations.placeholder\": \"Add instruction or review note...\",\n \"annotations.title\": \"Annotation\",\n \"annotations.linkedTitle\": \"Signature Note\",\n \"annotations.linkedBadge\": \"Linked\",\n \"annotations.open\": \"Open annotation\",\n \"annotations.remove\": \"Remove annotation\",\n \"thumbnails.empty\": \"No previews available\",\n \"documents.unsupportedFileType\": \"Unsupported file type\",\n \"documents.imageMissing\": \"No image data provided\",\n \"documents.sheetMissing\": \"No spreadsheet data provided\",\n \"documents.sheetTruncated\":\n \"Showing the first {rows} rows and {cols} columns for performance.\",\n \"documents.sheetAddSheet\": \"Add sheet\",\n \"documents.sheetAddRow\": \"Add row\",\n \"documents.sheetAddColumn\": \"Add column\",\n \"documents.modeFallbackTitle\": \"Mode adjusted\",\n \"documents.modeFallbackDescription\":\n \"{mode} mode is not available for {fileType}. Showing view mode instead.\",\n \"documents.createUnsupportedTitle\": \"Create mode not available\",\n \"documents.createUnsupportedDescription\":\n \"Create mode currently supports {formats}.\",\n \"documents.richText.renderingPages\": \"Rendering pages...\",\n \"documents.richText.processingText\": \"Processing text...\",\n \"documents.richText.parseError\": \"Error parsing document.\",\n \"documents.richText.toolbar.paragraph\": \"Paragraph\",\n \"documents.richText.toolbar.heading1\": \"Heading 1\",\n \"documents.richText.toolbar.heading2\": \"Heading 2\",\n \"documents.richText.toolbar.heading3\": \"Heading 3\",\n \"documents.richText.toolbar.bold\": \"Bold\",\n \"documents.richText.toolbar.italic\": \"Italic\",\n \"documents.richText.toolbar.underline\": \"Underline\",\n \"documents.richText.toolbar.bullets\": \"Bulleted list\",\n \"documents.richText.toolbar.numbered\": \"Numbered list\",\n \"documents.richText.toolbar.quote\": \"Quote\",\n \"documents.richText.toolbar.alignLeft\": \"Align left\",\n \"documents.richText.toolbar.alignCenter\": \"Align center\",\n \"documents.richText.toolbar.alignRight\": \"Align right\",\n \"documents.richText.toolbar.link\": \"Insert link\",\n \"documents.richText.toolbar.image\": \"Insert image\",\n \"documents.richText.toolbar.imageSizeLabel\": \"Image size\",\n \"documents.richText.toolbar.imageCropLabel\": \"Image crop\",\n \"documents.richText.toolbar.imageAlignLabel\": \"Image align\",\n \"documents.richText.toolbar.imageSmall\": \"Small\",\n \"documents.richText.toolbar.imageMedium\": \"Medium\",\n \"documents.richText.toolbar.imageLarge\": \"Large\",\n \"documents.richText.toolbar.imageFull\": \"Full width\",\n \"documents.richText.toolbar.imageCropOriginal\": \"Original\",\n \"documents.richText.toolbar.imageCropWide\": \"Wide\",\n \"documents.richText.toolbar.imageCropSquare\": \"Square\",\n \"documents.richText.toolbar.imageCropPortrait\": \"Portrait\",\n \"documents.richText.toolbar.divider\": \"Insert divider\",\n \"documents.richText.toolbar.table\": \"Insert table\",\n \"documents.richText.toolbar.tableAddRow\": \"Add row\",\n \"documents.richText.toolbar.tableAddColumn\": \"Add column\",\n \"documents.richText.toolbar.tableDeleteRow\": \"Delete row\",\n \"documents.richText.toolbar.tableDeleteColumn\": \"Delete column\",\n \"documents.richText.toolbar.clearFormatting\": \"Clear formatting\",\n \"documents.richText.toolbar.undo\": \"Undo\",\n \"documents.richText.toolbar.redo\": \"Redo\",\n \"documents.richText.toolbar.expandSection\": \"Open\",\n \"documents.richText.toolbar.collapseSection\": \"Hide\",\n \"documents.richText.toolbar.styleLabel\": \"Text style\",\n \"documents.richText.toolbar.formatLabel\": \"Formatting\",\n \"documents.richText.toolbar.insertLabel\": \"Insert\",\n \"documents.richText.toolbar.mediaLabel\": \"Media\",\n \"documents.richText.toolbar.tableLabel\": \"Table tools\",\n \"documents.richText.toolbar.historyLabel\": \"History\",\n \"documents.richText.templates\": \"Templates\",\n \"documents.richText.templatesShow\": \"Show templates\",\n \"documents.richText.templatesHide\": \"Hide templates\",\n \"documents.richText.template.blank\": \"Blank\",\n \"documents.richText.template.letter\": \"Letter\",\n \"documents.richText.template.notes\": \"Meeting notes\",\n \"documents.richText.template.agreement\": \"Agreement\",\n \"documents.richText.template.proposal\": \"Proposal\",\n \"documents.richText.templateDesc.blank\":\n \"A polished starting page with space for a title, summary, and first section.\",\n \"documents.richText.templateDesc.letter\":\n \"A professional business letter with subject line and key-point structure.\",\n \"documents.richText.templateDesc.notes\":\n \"A clean meeting-notes format with agenda, decisions, and follow-ups.\",\n \"documents.richText.templateDesc.agreement\":\n \"A well-structured agreement summary with commercial terms and approvals.\",\n \"documents.richText.templateDesc.proposal\":\n \"A client-ready proposal with scope, delivery plan, pricing, and assumptions.\",\n \"documents.richText.imageEditorTitle\": \"Image editor\",\n \"documents.richText.imageEditorHelp\":\n \"Drag the focus point in the preview to control which part of the image stays centered in cropped layouts.\",\n \"documents.richText.imageZoom\": \"Zoom\",\n \"documents.pdfLoadErrorTitle\": \"Error loading PDF\",\n \"a11y.viewer\": \"Document viewer\",\n \"a11y.ribbon\": \"Ribbon\",\n \"a11y.editor\": \"Document editor\",\n};\n","\"use client\";\n\nimport { Check, Plus, Trash2, X } from \"lucide-react\";\nimport React, { useMemo, useRef, useState } from \"react\";\nimport type { Signature, SignatureInkColor } from \"../types\";\nimport {\n normalizeSignature,\n normalizeSignatureDate,\n SIGNATURE_INK_COLORS,\n SIGNATURE_INK_COLOR_VALUES,\n} from \"../utils/signature\";\n\ninterface SignaturePanelProps {\n isOpen: boolean;\n onClose: () => void;\n onSelectSignature: (sig: Signature) => void;\n selectedSignature?: Signature | null;\n selectedColor: SignatureInkColor;\n onSelectedColorChange: (color: SignatureInkColor) => void;\n onClearSelection: () => void;\n externalSignatures?: Signature[];\n onSignRequest?: () => Promise<Signature>;\n locale: Record<string, string>;\n}\n\nfunction sameSignature(left: Signature, right: Signature) {\n if (left.id && right.id) {\n return left.id === right.id;\n }\n\n return (\n left.signatureImageUrl === right.signatureImageUrl &&\n left.signedBy === right.signedBy &&\n left.jobTitle === right.jobTitle &&\n left.dateSigned === right.dateSigned\n );\n}\n\nfunction trimSignatureCanvas(\n canvas: HTMLCanvasElement,\n padding = 16,\n alphaThreshold = 8,\n) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return canvas.toDataURL(\"image/png\");\n }\n\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height).data;\n let minX = width;\n let minY = height;\n let maxX = -1;\n let maxY = -1;\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const alpha = imageData[(y * width + x) * 4 + 3];\n if (alpha <= alphaThreshold) {\n continue;\n }\n\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n }\n\n if (maxX < minX || maxY < minY) {\n return canvas.toDataURL(\"image/png\");\n }\n\n const cropX = Math.max(0, minX - padding);\n const cropY = Math.max(0, minY - padding);\n const cropWidth = Math.min(width - cropX, maxX - minX + 1 + padding * 2);\n const cropHeight = Math.min(height - cropY, maxY - minY + 1 + padding * 2);\n const trimmedCanvas = document.createElement(\"canvas\");\n trimmedCanvas.width = cropWidth;\n trimmedCanvas.height = cropHeight;\n const trimmedCtx = trimmedCanvas.getContext(\"2d\");\n\n if (!trimmedCtx) {\n return canvas.toDataURL(\"image/png\");\n }\n\n trimmedCtx.drawImage(\n canvas,\n cropX,\n cropY,\n cropWidth,\n cropHeight,\n 0,\n 0,\n cropWidth,\n cropHeight,\n );\n\n return trimmedCanvas.toDataURL(\"image/png\");\n}\n\nexport function SignaturePanel(props: SignaturePanelProps) {\n const {\n isOpen,\n onClose,\n onSelectSignature,\n selectedSignature,\n selectedColor,\n onSelectedColorChange,\n onClearSelection,\n externalSignatures = [],\n onSignRequest,\n locale,\n } = props;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [localSignatures, setLocalSignatures] = useState<Signature[]>([]);\n const [showModal, setShowModal] = useState(false);\n const [isDrawing, setIsDrawing] = useState(false);\n const [hasInk, setHasInk] = useState(false);\n\n const signatures = useMemo(() => {\n const merged: Signature[] = [];\n\n for (const signature of [...externalSignatures, ...localSignatures]) {\n if (!merged.some((item) => sameSignature(item, signature))) {\n merged.push(signature);\n }\n }\n\n return merged;\n }, [externalSignatures, localSignatures]);\n\n const handleCreateClick = async () => {\n if (onSignRequest) {\n try {\n const requestedSignature = await onSignRequest();\n if (!requestedSignature?.signatureImageUrl) {\n return;\n }\n\n const newSignature = normalizeSignature(requestedSignature);\n onSelectSignature(newSignature);\n } catch (error) {\n console.error(\"Custom sign request failed\", error);\n }\n return;\n }\n\n setShowModal(true);\n setHasInk(false);\n requestAnimationFrame(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (canvas && ctx) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.lineWidth = 2.5;\n ctx.lineCap = \"round\";\n ctx.strokeStyle = \"#111827\";\n }\n });\n };\n\n const clearCanvas = () => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (canvas && ctx) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n setHasInk(false);\n }\n };\n\n const saveSignature = () => {\n const canvas = canvasRef.current;\n if (!canvas || !hasInk) {\n return;\n }\n\n const newSignature: Signature = {\n id: Date.now().toString(),\n signatureImageUrl: trimSignatureCanvas(canvas),\n dateSigned: normalizeSignatureDate(),\n };\n\n setLocalSignatures((prev) => [...prev, newSignature]);\n setShowModal(false);\n onSelectSignature(newSignature);\n };\n\n const startDraw = (\n event: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>,\n ) => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) {\n return;\n }\n\n const rect = canvas.getBoundingClientRect();\n const clientX =\n \"touches\" in event ? event.touches[0].clientX : event.clientX;\n const clientY =\n \"touches\" in event ? event.touches[0].clientY : event.clientY;\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n setIsDrawing(true);\n setHasInk(true);\n };\n\n const stopDraw = () => {\n const ctx = canvasRef.current?.getContext(\"2d\");\n ctx?.beginPath();\n setIsDrawing(false);\n };\n\n const draw = (\n event: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>,\n ) => {\n if (!isDrawing) {\n return;\n }\n\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) {\n return;\n }\n\n const rect = canvas.getBoundingClientRect();\n const clientX =\n \"touches\" in event ? event.touches[0].clientX : event.clientX;\n const clientY =\n \"touches\" in event ? event.touches[0].clientY : event.clientY;\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n\n ctx.lineTo(x, y);\n ctx.stroke();\n };\n\n return (\n <>\n <div\n className={`hv-sidebar hv-sidebar-right ${!isOpen ? \"collapsed\" : \"\"}`}\n style={{ width: isOpen ? \"300px\" : \"0\" }}\n >\n <div\n className=\"hv-sidebar-header\"\n style={{ justifyContent: \"space-between\", padding: \"12px 16px\" }}\n >\n <h3 style={{ margin: 0, fontSize: \"15px\", fontWeight: 600 }}>\n {locale[\"signatures.title\"]}\n </h3>\n <button\n onClick={onClose}\n className=\"hv-btn\"\n style={{ padding: \"4px\", border: \"none\" }}\n >\n <X size={18} />\n </button>\n </div>\n\n <div className=\"hv-thumb-list\">\n <button\n onClick={handleCreateClick}\n className=\"hv-btn\"\n style={{\n width: \"100%\",\n justifyContent: \"center\",\n border: \"2px dashed var(--hv-border)\",\n marginBottom: \"8px\",\n color: \"var(--hv-primary)\",\n }}\n >\n <Plus size={18} style={{ marginRight: \"8px\" }} />\n {locale[\"signatures.new\"]}\n </button>\n\n {selectedSignature && (\n <div className=\"hv-signature-selection-card\">\n <div className=\"hv-signature-selection-title\">\n {locale[\"signatures.ready\"]}\n </div>\n <img\n src={selectedSignature.signatureImageUrl}\n alt={\n selectedSignature.signedBy\n ? `Selected signature by ${selectedSignature.signedBy}`\n : \"Selected signature\"\n }\n className=\"hv-signature-selection-image\"\n />\n <div className=\"hv-signature-selection-copy\">\n {locale[\"signatures.placeHint\"]}\n </div>\n <div className=\"hv-signature-color-picker\">\n <span className=\"hv-signature-color-picker-label\">\n {locale[\"signatures.color\"]}\n </span>\n <div className=\"hv-signature-color-swatch-row\">\n {SIGNATURE_INK_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n className={`hv-signature-color-swatch ${selectedColor === color ? \"active\" : \"\"}`}\n style={{ background: SIGNATURE_INK_COLOR_VALUES[color] }}\n aria-label={`${locale[\"signatures.color\"]}: ${locale[`signatures.color.${color}`]}`}\n title={locale[`signatures.color.${color}`]}\n onClick={() => onSelectedColorChange(color)}\n />\n ))}\n </div>\n </div>\n <button\n type=\"button\"\n className=\"hv-btn\"\n style={{ width: \"100%\" }}\n onClick={onClearSelection}\n >\n {locale[\"signatures.cancelPlacement\"]}\n </button>\n </div>\n )}\n\n {signatures.length === 0 && (\n <div className=\"hv-signature-empty\">\n {locale[\"signatures.empty\"]}\n </div>\n )}\n\n {signatures.map((signature, index) => {\n const isLocal = localSignatures.some((item) =>\n sameSignature(item, signature),\n );\n const isSelected = selectedSignature\n ? sameSignature(selectedSignature, signature)\n : false;\n\n return (\n <div\n key={signature.id || `${signature.dateSigned}-${index}`}\n className={`hv-thumb-item hv-signature-item ${isSelected ? \"active\" : \"\"}`}\n >\n <button\n type=\"button\"\n className=\"hv-signature-item-main\"\n onClick={() => onSelectSignature(signature)}\n >\n <div className=\"hv-signature-item-stack\">\n <img\n src={signature.signatureImageUrl}\n alt={signature.signedBy ? `Signature by ${signature.signedBy}` : \"Signature\"}\n className=\"hv-signature-item-image\"\n />\n <div className=\"hv-signature-item-copy\">\n {signature.signedBy && <strong>{signature.signedBy}</strong>}\n {signature.jobTitle && <span>{signature.jobTitle}</span>}\n <span>\n {normalizeSignatureDate(signature.dateSigned)}\n </span>\n {signature.comment && <em>{signature.comment}</em>}\n </div>\n </div>\n {isSelected && (\n <span className=\"hv-signature-item-check\">\n <Check size={14} />\n </span>\n )}\n </button>\n\n {isLocal && (\n <button\n type=\"button\"\n className=\"hv-btn\"\n style={{\n position: \"absolute\",\n top: \"8px\",\n right: \"8px\",\n padding: \"4px\",\n color: \"#ef4444\",\n border: \"none\",\n background: \"var(--hv-paper-bg)\",\n }}\n onClick={(event) => {\n event.stopPropagation();\n setLocalSignatures((prev) =>\n prev.filter((item) => !sameSignature(item, signature)),\n );\n if (selectedSignature && sameSignature(selectedSignature, signature)) {\n onClearSelection();\n }\n }}\n >\n <Trash2 size={12} />\n </button>\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n {showModal && (\n <div className=\"hv-modal-overlay\">\n <div className=\"hv-modal\" style={{ width: \"450px\", maxWidth: \"90vw\" }}>\n <div\n style={{\n padding: \"16px 24px\",\n borderBottom: \"1px solid var(--hv-border)\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <h3 style={{ margin: 0, fontSize: \"18px\", fontWeight: 600 }}>\n {locale[\"signatures.drawTitle\"]}\n </h3>\n <button\n onClick={() => setShowModal(false)}\n className=\"hv-btn\"\n style={{ border: \"none\" }}\n >\n <X size={20} />\n </button>\n </div>\n\n <div\n style={{\n padding: \"24px\",\n background: \"var(--hv-modal-subtle-bg)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n }}\n >\n <div\n style={{\n background: \"var(--hv-page-bg)\",\n border: \"1px solid var(--hv-border)\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n boxShadow: \"inset 0 2px 4px 0 rgba(0,0,0,0.05)\",\n }}\n >\n <canvas\n ref={canvasRef}\n width={400}\n height={200}\n style={{\n display: \"block\",\n cursor: \"crosshair\",\n touchAction: \"none\",\n }}\n onMouseDown={startDraw}\n onMouseUp={stopDraw}\n onMouseLeave={stopDraw}\n onMouseMove={draw}\n onTouchStart={startDraw}\n onTouchEnd={stopDraw}\n onTouchMove={draw}\n />\n </div>\n <p\n style={{\n fontSize: \"12px\",\n color: \"var(--hv-muted)\",\n marginTop: \"8px\",\n }}\n >\n {locale[\"signatures.drawHelp\"]}\n </p>\n </div>\n\n <div\n style={{\n padding: \"16px 24px\",\n borderTop: \"1px solid var(--hv-border)\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"12px\",\n }}\n >\n <button onClick={clearCanvas} className=\"hv-btn\">\n {locale[\"signatures.clear\"]}\n </button>\n <button\n onClick={saveSignature}\n className=\"hv-btn hv-btn-primary\"\n disabled={!hasInk}\n >\n {locale[\"signatures.createAndUse\"]}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\n\nconst THUMB_ITEM_HEIGHT = 184;\nconst THUMB_OVERSCAN = 4;\n\r\ninterface ThumbnailsSidebarProps {\n isOpen: boolean;\n thumbnails: Array<string | undefined>; // Base64 strings\n currentPage: number;\n onSelectPage: (page: number) => void;\n locale: Record<string, string>;\n}\n\nexport function ThumbnailsSidebar(props: ThumbnailsSidebarProps) {\n const { isOpen, thumbnails, currentPage, onSelectPage, locale } = props;\n const listRef = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(0);\n\n useEffect(() => {\n const element = listRef.current;\n if (!element || !isOpen) {\n return;\n }\n\n const nextTop = Math.max((currentPage - 1) * THUMB_ITEM_HEIGHT, 0);\n const nextBottom = nextTop + THUMB_ITEM_HEIGHT;\n const visibleTop = element.scrollTop;\n const visibleBottom = visibleTop + element.clientHeight;\n\n if (nextTop >= visibleTop && nextBottom <= visibleBottom) {\n return;\n }\n\n const targetTop = Math.max(\n nextTop - Math.max((element.clientHeight - THUMB_ITEM_HEIGHT) / 2, 0),\n 0,\n );\n element.scrollTo({\n top: targetTop,\n behavior: \"smooth\",\n });\n }, [currentPage, isOpen]);\n\n useEffect(() => {\n const element = listRef.current;\n if (!element) {\n return;\n }\n\n const updateViewport = () => {\n setViewportHeight(element.clientHeight);\n setScrollTop(element.scrollTop);\n };\n\n updateViewport();\n\n const handleScroll = () => {\n setScrollTop(element.scrollTop);\n };\n\n element.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => {\n updateViewport();\n });\n resizeObserver.observe(element);\n } else {\n window.addEventListener(\"resize\", updateViewport);\n }\n\n return () => {\n element.removeEventListener(\"scroll\", handleScroll);\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", updateViewport);\n };\n }, []);\n\n const virtualWindow = useMemo(() => {\n if (thumbnails.length === 0) {\n return {\n startIndex: 0,\n endIndex: -1,\n totalHeight: 0,\n };\n }\n\n const visibleCount = Math.max(\n Math.ceil((viewportHeight || THUMB_ITEM_HEIGHT) / THUMB_ITEM_HEIGHT),\n 1,\n );\n const startIndex = Math.max(\n Math.floor(scrollTop / THUMB_ITEM_HEIGHT) - THUMB_OVERSCAN,\n 0,\n );\n const endIndex = Math.min(\n startIndex + visibleCount + THUMB_OVERSCAN * 2 - 1,\n thumbnails.length - 1,\n );\n\n return {\n startIndex,\n endIndex,\n totalHeight: thumbnails.length * THUMB_ITEM_HEIGHT,\n };\n }, [scrollTop, thumbnails.length, viewportHeight]);\n\n const visibleItems = useMemo(\n () =>\n thumbnails.slice(\n virtualWindow.startIndex,\n virtualWindow.endIndex >= virtualWindow.startIndex\n ? virtualWindow.endIndex + 1\n : virtualWindow.startIndex,\n ),\n [thumbnails, virtualWindow.endIndex, virtualWindow.startIndex],\n );\n\n return (\n <div className={`hv-sidebar ${!isOpen ? \"collapsed\" : \"\"}`}>\n <div ref={listRef} className=\"hv-thumb-list\">\n {thumbnails.length > 0 && (\n <div\n className=\"hv-thumb-viewport\"\n style={{ height: `${virtualWindow.totalHeight}px` }}\n >\n {visibleItems.map((src, index) => {\n const absoluteIndex = virtualWindow.startIndex + index;\n const pageNum = absoluteIndex + 1;\n const isActive = pageNum === currentPage;\n\n return (\n <div\n key={pageNum}\n className={`hv-thumb-item ${isActive ? \"active\" : \"\"}`}\n style={{ top: `${absoluteIndex * THUMB_ITEM_HEIGHT}px` }}\n onClick={() => onSelectPage(pageNum)}\n >\n <div className=\"hv-thumb-preview\">\n {src ? (\n <img\n src={src}\n alt={`Page ${pageNum}`}\n className=\"hv-thumb-img\"\n />\n ) : (\n <div className=\"hv-thumb-skeleton\">\n <span>...</span>\n </div>\n )}\n </div>\n <span className=\"hv-thumb-label\">\n {locale[\"thumbnails.page\"]} {pageNum}\n </span>\n </div>\n );\n })}\n </div>\n )}\n\n {thumbnails.length === 0 && (\n <div className=\"hv-thumb-empty\">{locale[\"thumbnails.empty\"]}</div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\r\n\r\nimport {\n ChevronLeft,\n ChevronRight,\n FileDown,\n Grid2X2,\n LayoutTemplate,\n MessageSquarePlus,\n PanelLeftClose,\n PanelLeftOpen,\n PenLine, // Changed from Download\n Save,\n ZoomIn,\n ZoomOut,\n} from \"lucide-react\";\nimport React from \"react\";\n\r\ninterface ToolbarProps {\n fileName?: string;\n pageCount: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n showHeaderFooterToggle: boolean;\n headerFooterVisible: boolean;\n onToggleHeaderFooter: () => void;\n layout: \"single\" | \"side-by-side\";\n onLayoutChange: (layout: \"single\" | \"side-by-side\") => void;\n\r\n // Left Sidebar (Thumbnails)\r\n showThumbnails: boolean;\r\n onToggleThumbnails: () => void;\r\n\r\n // Right Sidebar (Signatures)\n showSignatures: boolean;\n onToggleSignatures: () => void;\n signingEnabled: boolean;\n annotationEnabled: boolean;\n annotationMode: boolean;\n onToggleAnnotationMode: () => void;\n\n // Zoom\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onZoomReset: () => void;\n saveEnabled: boolean;\n isSaving: boolean;\n onSave?: () => void;\n onExportPdf?: () => void;\n showExportPdfAction?: boolean;\n saveLabel?: string;\n locale: Record<string, string>;\n}\n\nexport function Toolbar(props: ToolbarProps) {\n const {\n fileName,\n pageCount,\n currentPage,\n onPageChange,\n showHeaderFooterToggle,\n headerFooterVisible,\n onToggleHeaderFooter,\n layout,\n onLayoutChange,\n zoom,\n onZoomIn,\n onZoomOut,\n onZoomReset,\n saveEnabled,\n isSaving,\n onSave,\n onExportPdf,\n showExportPdfAction = true,\n saveLabel,\n locale,\n } = props;\n\r\n const handlePrev = () => {\r\n if (currentPage > 1) onPageChange(currentPage - 1);\r\n };\r\n\r\n const handleNext = () => {\r\n if (currentPage < pageCount) onPageChange(currentPage + 1);\r\n };\r\n\r\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val = parseInt(e.target.value);\r\n if (!isNaN(val) && val >= 1 && val <= pageCount) {\r\n onPageChange(val);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"hv-toolbar\">\r\n {/* Left Group: Thumbnails & Title */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className={`hv-btn ${props.showThumbnails ? \"hv-btn-active\" : \"\"}`}\n onClick={props.onToggleThumbnails}\n title={locale[\"toolbar.thumbs\"]}\n >\n {props.showThumbnails ? (\r\n <PanelLeftClose size={20} />\r\n ) : (\r\n <PanelLeftOpen size={20} />\r\n )}\r\n </button>\r\n <div\r\n className=\"hv-sep\"\r\n style={{\r\n width: 1,\r\n height: 24,\r\n background: \"var(--hv-border)\",\r\n margin: \"0 8px\",\r\n }}\r\n />\r\n <span\r\n style={{\r\n fontWeight: 600,\r\n fontSize: \"14px\",\r\n maxWidth: 200,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {fileName || \"Document\"}\r\n </span>\r\n </div>\r\n\r\n {/* Center Group: Pagination */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className=\"hv-btn\"\r\n disabled={currentPage <= 1}\r\n onClick={handlePrev}\r\n >\r\n <ChevronLeft size={20} />\r\n </button>\r\n\r\n <div className=\"hv-toolbar-page-group\">\n <input\n type=\"number\"\n className=\"hv-toolbar-page-input\"\n value={currentPage}\n onChange={handleInput}\n min={1}\n max={pageCount}\n />\n <span className=\"hv-toolbar-page-sep\">/</span>\n <span>{pageCount}</span>\n </div>\n\r\n <button\r\n className=\"hv-btn\"\r\n disabled={currentPage >= pageCount}\r\n onClick={handleNext}\r\n >\r\n <ChevronRight size={20} />\r\n </button>\r\n </div>\r\n\r\n {/* Right Group: Layout, Save & Signatures */}\n <div className=\"hv-toolbar-group\">\n <button\n className=\"hv-btn\"\n onClick={onZoomOut}\n title={locale[\"toolbar.zoomOut\"]}\n disabled={zoom <= 0.5}\n >\n <ZoomOut size={18} />\n </button>\n <button\n className=\"hv-btn\"\n onClick={onZoomReset}\n title={locale[\"toolbar.zoomReset\"]}\n >\n <span style={{ fontSize: \"12px\", fontWeight: 600 }}>\n {Math.round(zoom * 100)}%\n </span>\n </button>\n <button\n className=\"hv-btn\"\n onClick={onZoomIn}\n title={locale[\"toolbar.zoomIn\"]}\n disabled={zoom >= 2}\n >\n <ZoomIn size={18} />\n </button>\n\n <div\n className=\"hv-sep\"\n style={{\n width: 1,\n height: 24,\n background: \"var(--hv-border)\",\n margin: \"0 8px\",\n }}\n />\n\n <button\n className={`hv-btn ${layout === \"single\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => onLayoutChange(\"single\")}\n title={locale[\"toolbar.layout.single\"]}\n >\n <LayoutTemplate size={18} />\r\n </button>\r\n <button\n className={`hv-btn ${layout === \"side-by-side\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => onLayoutChange(\"side-by-side\")}\n title={locale[\"toolbar.layout.two\"]}\n >\n <Grid2X2 size={18} />\n </button>\n\n {showHeaderFooterToggle && (\n <button\n className={`hv-btn ${headerFooterVisible ? \"hv-btn-active\" : \"\"}`}\n onClick={onToggleHeaderFooter}\n title={locale[\"toolbar.headerFooter\"]}\n >\n <span style={{ fontSize: \"12px\", fontWeight: 700, marginRight: \"8px\" }}>\n HF\n </span>\n <span className=\"hv-btn-label\">{locale[\"toolbar.headerFooter\"]}</span>\n </button>\n )}\n\n <div\n className=\"hv-sep\"\n style={{\r\n width: 1,\r\n height: 24,\r\n background: \"var(--hv-border)\",\r\n margin: \"0 8px\",\r\n }}\r\n />\n\n {saveEnabled && (\n <>\n {showExportPdfAction && (\n <button\n className=\"hv-btn\"\n onClick={onExportPdf}\n title={locale[\"toolbar.exportPdf\"]}\n disabled={isSaving}\n >\n <FileDown size={18} />\n </button>\n )}\n <button\n className=\"hv-btn hv-btn-primary\"\n onClick={onSave}\n title={saveLabel ?? locale[\"toolbar.save\"]}\n disabled={isSaving}\n >\n <Save size={18} style={{ marginRight: \"8px\" }} />\n <span className=\"hv-btn-label\">\n {isSaving ? locale.loading : saveLabel ?? locale[\"toolbar.save\"]}\n </span>\n </button>\n\n <div\n className=\"hv-sep\"\n style={{\n width: 1,\n height: 24,\n background: \"var(--hv-border)\",\n margin: \"0 8px\",\n }}\n />\n </>\n )}\n\n {/* Signature Toggle Button */}\n {props.annotationEnabled && (\n <button\n className={`hv-btn ${props.annotationMode ? \"hv-btn-active\" : \"\"}`}\n onClick={props.onToggleAnnotationMode}\n title={locale[\"toolbar.annotate\"]}\n >\n <MessageSquarePlus size={18} style={{ marginRight: \"8px\" }} />\n <span className=\"hv-btn-label\">{locale[\"toolbar.annotate\"]}</span>\n </button>\n )}\n\n {props.signingEnabled && (\n <button\n className={`hv-btn hv-btn-primary ${props.showSignatures ? \"hv-btn-active\" : \"\"}`}\n onClick={props.onToggleSignatures}\n title={locale[\"toolbar.sign\"]}\n >\n <PenLine size={18} style={{ marginRight: \"8px\" }} />\n <span className=\"hv-btn-label\">{locale[\"toolbar.sign\"]}</span>\n </button>\n )}\n </div>\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["useEffect","useMemo","useRef","useState","useEffect","useMemo","useRef","useState","nextWidth","nextHeight","clamp","document","cell","clamp","document","canvas","ctx","jsx","jsxs","createCanvas","useRef","useState","useMemo","useEffect","ExcelJS","useEffect","useMemo","useState","XLSX","jsx","jsxs","toColumnLabel","isRecord","stripArgbAlpha","workbook","ExcelJS","useState","useEffect","useMemo","useEffect","useMemo","jsx","jsxs","useMemo","useEffect","getDocument","GlobalWorkerOptions","useEffect","useMemo","useRef","useState","jsx","jsxs","pdfWorkerBlobUrlPromise","useState","useRef","useEffect","GlobalWorkerOptions","getDocument","useMemo","useEffect","useMemo","useRef","useState","JSZip","jsx","jsxs","useState","resolveZipPath","useRef","useEffect","JSZip","useMemo","useMemo","useRef","useState","Fragment","jsx","jsxs","useRef","useState","useMemo","useEffect","useMemo","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useMemo","useState","useRef","useEffect"]}
1
+ {"version":3,"sources":["../src/components/DocumentViewer.tsx","../src/editors/RichTextEditor.tsx","../src/components/SignatureOverlay.tsx","../src/utils/signature.ts","../src/utils/export.ts","../src/utils/fileSource.ts","../src/utils/sanitize.ts","../src/editors/SpreadsheetEditor.tsx","../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 } from \"../editors/RichTextEditor\";\nimport { SpreadsheetEditor } from \"../editors/SpreadsheetEditor\";\nimport type {\n PptxExportState,\n RichTextExportState,\n SpreadsheetExportState,\n} from \"../internal/exportModels\";\nimport { ImageRenderer } from \"../renderers/ImageRenderer\";\nimport { PdfRenderer } from \"../renderers/PdfRenderer\";\nimport { PptxRenderer } from \"../renderers/PptxRenderer\";\nimport type {\n AnnotationPlacement,\n AnnotationPlacementDraft,\n DocumentSurfaceOverlayState,\n DocumentMode,\n DocumentViewerProps,\n Signature,\n SignatureInkColor,\n SignaturePlacement,\n SupportedFileType,\n} from \"../types\";\nimport {\n exportSignedImageFile,\n exportSignedPdfDocument,\n exportSignedRichTextFile,\n exportSignedSlidesFile,\n exportSignedSpreadsheetFile,\n} from \"../utils/export\";\nimport { defaultLocale } from \"../utils/locale\";\nimport { guessFileType, resolveSource } from \"../utils/fileSource\";\nimport {\n normalizeSignature,\n normalizeSignaturePlacement,\n normalizeSignatureInkColor,\n} from \"../utils/signature\";\nimport { SignaturePanel } from \"./SignaturePanel\";\nimport { ThumbnailsSidebar } from \"./ThumbnailsSidebar\";\nimport { Toolbar } from \"./Toolbar\";\n\nfunction createPlacementId() {\n return `sig-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\nfunction createAnnotationId() {\n return `ann-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\ninterface FileModeCapabilities {\n canEdit: boolean;\n canCreate: boolean;\n}\n\nfunction getFileModeCapabilities(fileType: SupportedFileType): FileModeCapabilities {\n switch (fileType) {\n case \"docx\":\n case \"doc\":\n case \"rtf\":\n case \"txt\":\n case \"md\":\n case \"xlsx\":\n case \"xls\":\n case \"csv\":\n return { canEdit: true, canCreate: true };\n default:\n return { canEdit: false, canCreate: false };\n }\n}\n\nfunction getReadableFileTypeLabel(fileType: SupportedFileType) {\n switch (fileType) {\n case \"pdf\":\n return \"PDF\";\n case \"docx\":\n return \"DOCX\";\n case \"doc\":\n return \"DOC\";\n case \"rtf\":\n return \"RTF\";\n case \"txt\":\n return \"TXT\";\n case \"md\":\n return \"Markdown\";\n case \"xlsx\":\n return \"XLSX\";\n case \"xls\":\n return \"XLS\";\n case \"csv\":\n return \"CSV\";\n case \"pptx\":\n return \"PPTX\";\n case \"ppt\":\n return \"PPT\";\n case \"jpg\":\n case \"jpeg\":\n return \"JPEG\";\n case \"png\":\n return \"PNG\";\n case \"gif\":\n return \"GIF\";\n case \"bmp\":\n return \"BMP\";\n case \"svg\":\n return \"SVG\";\n case \"xml\":\n return \"XML\";\n default:\n return String(fileType).toUpperCase();\n }\n}\n\nfunction getReadableModeLabel(mode: Extract<DocumentMode, \"edit\" | \"create\">) {\n return mode === \"edit\" ? \"Edit\" : \"Create\";\n}\n\nfunction getFileNameHint(fileUrl?: string, fileName?: string) {\n if (fileName) {\n return fileName;\n }\n\n if (!fileUrl) {\n return undefined;\n }\n\n try {\n const url = new URL(fileUrl);\n const hintedName = decodeURIComponent(url.pathname.split(\"/\").pop() || \"\");\n return hintedName || undefined;\n } catch {\n return undefined;\n }\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<\"single\" | \"side-by-side\">(\n props.defaultLayout ?? \"single\",\n );\n const [showThumbnails, setShowThumbnails] = useState(\n props.defaultShowThumbnails ?? true,\n );\n const [showHeaderFooterSlots, setShowHeaderFooterSlots] = useState(true);\n const [showSignatures, setShowSignatures] = useState(false);\n const [zoom, setZoom] = useState(1);\n const mainRef = useRef<HTMLElement>(null);\n const zoomStageRef = useRef<HTMLDivElement>(null);\n const exportHeaderRef = useRef<HTMLDivElement>(null);\n const exportFooterRef = useRef<HTMLDivElement>(null);\n const [selectedSignature, setSelectedSignature] = useState<Signature | null>(\n null,\n );\n const [selectedSignatureColor, setSelectedSignatureColor] =\n useState<SignatureInkColor>(\"black\");\n const [isPlacingAnnotation, setIsPlacingAnnotation] = useState(false);\n const [activePlacementId, setActivePlacementId] = useState<string | null>(\n null,\n );\n const [activeAnnotationId, setActiveAnnotationId] = useState<string | null>(\n null,\n );\n\n const [resolved, setResolved] = useState<{\n fileType: SupportedFileType;\n fileName: string;\n url?: string;\n arrayBuffer?: ArrayBuffer;\n cleanup?: () => void;\n } | null>(null);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(\"\");\n const [isSaving, setIsSaving] = useState(false);\n const [pageCount, setPageCount] = useState(1);\n const [currentPage, setCurrentPage] = useState(1);\n const [thumbnails, setThumbnails] = useState<Array<string | undefined>>([]);\n const [richTextExportState, setRichTextExportState] =\n useState<RichTextExportState | null>(null);\n const [spreadsheetExportState, setSpreadsheetExportState] = useState<\n SpreadsheetExportState | null\n >(null);\n const [pptxExportState, setPptxExportState] =\n useState<PptxExportState | null>(null);\n const [internalPlacements, setInternalPlacements] = useState<\n SignaturePlacement[]\n >(props.signaturePlacements ?? []);\n const [internalAnnotations, setInternalAnnotations] = useState<\n AnnotationPlacement[]\n >(props.annotations ?? []);\n const [zoomStageSize, setZoomStageSize] = useState({ width: 0, height: 0 });\n const [mainContentWidth, setMainContentWidth] = useState(0);\n\n const placements = useMemo(\n () =>\n (props.signaturePlacements ?? internalPlacements).map((placement) =>\n normalizeSignaturePlacement(placement),\n ),\n [internalPlacements, props.signaturePlacements],\n );\n const annotations = props.annotations ?? internalAnnotations;\n const availableSignatures = useMemo(\n () => (props.signatures ?? []).map((signature) => normalizeSignature(signature)),\n [props.signatures],\n );\n const sourceNameHint = getFileNameHint(props.fileUrl, props.fileName);\n const requestedFileType = guessFileType(\n sourceNameHint,\n props.fileType,\n props.blob?.type,\n );\n const fileModeCapabilities = getFileModeCapabilities(requestedFileType);\n const isRequestedEditUnsupported =\n mode === \"edit\" && !fileModeCapabilities.canEdit;\n const isRequestedCreateUnsupported =\n mode === \"create\" && !fileModeCapabilities.canCreate;\n const effectiveMode: DocumentMode =\n isRequestedEditUnsupported || isRequestedCreateUnsupported ? \"view\" : mode;\n const hasRenderableSource = Boolean(resolved?.arrayBuffer || resolved?.url);\n const showCreateUnsupportedNotice =\n mode === \"create\" && isRequestedCreateUnsupported;\n const showModeFallbackNotice =\n mode === \"edit\" && isRequestedEditUnsupported;\n const hasIncomingSource = Boolean(props.fileUrl || props.base64 || props.blob);\n const createSupportedFormats =\n \"DOCX, DOC, RTF, TXT, Markdown, XLSX, XLS, and CSV\";\n\n const signingEnabled =\n !props.disableSigning &&\n (props.allowSigning ??\n Boolean(props.onSignRequest || (props.signatures?.length ?? 0) > 0));\n const annotationEnabled =\n !props.disableAnnotations && (props.allowAnnotations ?? true);\n const hasLetterheadTemplate = Boolean(\n props.letterheadTemplate?.header || props.letterheadTemplate?.footer,\n );\n const hasHeaderFooterSlots = Boolean(\n props.headerComponent || props.footerComponent || hasLetterheadTemplate,\n );\n const headerFooterToggleEnabled = Boolean(\n props.enableHeaderFooterToggle && hasHeaderFooterSlots,\n );\n const hasReviewMarks = placements.length > 0 || annotations.length > 0;\n const saveAsPdfByDefault =\n (resolved?.fileType === \"pdf\") ||\n ((props.finalizeSignedDocumentsAsPdf ?? true) && hasReviewMarks);\n const isRichTextAuthoringMode = Boolean(\n resolved &&\n [\"docx\", \"doc\", \"rtf\", \"txt\", \"md\"].includes(resolved.fileType) &&\n effectiveMode !== \"view\",\n );\n const finalizedSignatures = useMemo(() => {\n const seen = new Set<string>();\n return placements.flatMap((placement) => {\n const signature = placement.signature;\n const dedupeKey =\n placement.signatureId ||\n `${signature.signatureImageUrl}:${signature.signedBy || \"\"}:${signature.jobTitle || \"\"}:${signature.dateSigned}`;\n\n if (seen.has(dedupeKey)) {\n return [];\n }\n\n seen.add(dedupeKey);\n return [signature];\n });\n }, [placements]);\n const signatureList = useMemo(\n () =>\n placements.map((placement) => ({\n placementId: placement.id,\n signatureId: placement.signatureId,\n signedBy: placement.signature.signedBy,\n jobTitle: placement.signature.jobTitle,\n dateSigned: placement.signature.dateSigned,\n signatureColor: placement.signatureColor,\n surfaceKind: placement.surfaceKind,\n page: placement.page,\n slide: placement.slide,\n sheetName: placement.sheetName,\n })),\n [placements],\n );\n\n useEffect(() => {\n if (props.signaturePlacements) {\n setInternalPlacements(props.signaturePlacements);\n }\n }, [props.signaturePlacements]);\n\n useEffect(() => {\n if (props.annotations) {\n setInternalAnnotations(props.annotations);\n }\n }, [props.annotations]);\n\n useEffect(() => {\n setShowThumbnails(props.defaultShowThumbnails ?? true);\n }, [props.defaultShowThumbnails]);\n\n useEffect(() => {\n setLayout(props.defaultLayout ?? \"single\");\n }, [props.defaultLayout]);\n\n useEffect(() => {\n if (!signingEnabled) {\n setShowSignatures(false);\n setSelectedSignature(null);\n setActivePlacementId(null);\n }\n }, [signingEnabled]);\n\n useEffect(() => {\n if (!annotationEnabled) {\n setIsPlacingAnnotation(false);\n setActiveAnnotationId(null);\n }\n }, [annotationEnabled]);\n\n useEffect(() => {\n if (!headerFooterToggleEnabled) {\n setShowHeaderFooterSlots(true);\n }\n }, [headerFooterToggleEnabled]);\n\n useEffect(() => {\n let active = true;\n let cleanupSource: (() => void) | undefined;\n\n const loadFile = async () => {\n setLoading(true);\n setError(\"\");\n setResolved(null);\n\n try {\n if (mode === \"create\" && !isRequestedCreateUnsupported) {\n setResolved({\n fileType: requestedFileType,\n fileName: props.fileName ?? `Untitled.${requestedFileType}`,\n });\n } else if (mode === \"create\" && isRequestedCreateUnsupported && !hasIncomingSource) {\n setResolved({\n fileType: requestedFileType,\n fileName: props.fileName ?? `Untitled.${requestedFileType}`,\n });\n } else {\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 (active) {\n cleanupSource = res.cleanup;\n setResolved(res);\n } else {\n res.cleanup?.();\n }\n }\n } catch (err: any) {\n if (active) {\n setError(err.message || \"Failed to load document\");\n }\n } finally {\n if (active) {\n setLoading(false);\n }\n }\n };\n\n loadFile();\n return () => {\n active = false;\n cleanupSource?.();\n };\n }, [\n hasIncomingSource,\n isRequestedCreateUnsupported,\n mode,\n props.base64,\n props.blob,\n props.fileName,\n props.fileType,\n props.fileUrl,\n requestedFileType,\n ]);\n\n useEffect(() => {\n setZoom(1);\n setCurrentPage(1);\n setSelectedSignature(null);\n setSelectedSignatureColor(\"black\");\n setIsPlacingAnnotation(false);\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n setRichTextExportState(null);\n setSpreadsheetExportState(null);\n setPptxExportState(null);\n if (!props.signaturePlacements) {\n setInternalPlacements([]);\n }\n if (!props.annotations) {\n setInternalAnnotations([]);\n }\n }, [mode, props.fileUrl, props.fileName, props.fileType, props.blob, props.base64]);\n\n useEffect(() => {\n const element = zoomStageRef.current;\n if (!element) {\n return;\n }\n\n let frameId = 0;\n\n const measure = () => {\n frameId = 0;\n const nextWidth = Math.max(\n element.scrollWidth,\n element.offsetWidth,\n element.clientWidth,\n 1,\n );\n const nextHeight = Math.max(\n element.scrollHeight,\n element.offsetHeight,\n element.clientHeight,\n 1,\n );\n\n setZoomStageSize((prev) =>\n prev.width === nextWidth && prev.height === nextHeight\n ? prev\n : { width: nextWidth, height: nextHeight },\n );\n };\n\n const scheduleMeasure = () => {\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n frameId = requestAnimationFrame(measure);\n };\n\n scheduleMeasure();\n\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => {\n scheduleMeasure();\n });\n resizeObserver.observe(element);\n }\n\n window.addEventListener(\"resize\", scheduleMeasure);\n\n return () => {\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleMeasure);\n };\n }, [\n currentPage,\n error,\n isRichTextAuthoringMode,\n layout,\n loading,\n pageCount,\n resolved?.fileName,\n resolved?.fileType,\n showSignatures,\n showThumbnails,\n ]);\n\n useEffect(() => {\n const element = mainRef.current;\n if (!element) {\n return;\n }\n\n let frameId = 0;\n\n const measure = () => {\n frameId = 0;\n const nextWidth = Math.max(element.clientWidth, element.offsetWidth, 1);\n setMainContentWidth((prev) => (prev === nextWidth ? prev : nextWidth));\n };\n\n const scheduleMeasure = () => {\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n frameId = requestAnimationFrame(measure);\n };\n\n scheduleMeasure();\n\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => {\n scheduleMeasure();\n });\n resizeObserver.observe(element);\n }\n\n window.addEventListener(\"resize\", scheduleMeasure);\n\n return () => {\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleMeasure);\n };\n }, []);\n\n const zoomShellStyle = useMemo<React.CSSProperties>(\n () => {\n const baseWidth =\n isRichTextAuthoringMode && mainContentWidth > 0\n ? mainContentWidth\n : zoomStageSize.width;\n\n return {\n minWidth: \"100%\",\n width: baseWidth > 0 ? `${Math.round(baseWidth * zoom)}px` : \"100%\",\n minHeight:\n zoomStageSize.height > 0\n ? `${Math.round(zoomStageSize.height * zoom)}px`\n : undefined,\n };\n },\n [isRichTextAuthoringMode, mainContentWidth, zoom, zoomStageSize.height, zoomStageSize.width],\n );\n\n const zoomStageStyle = useMemo<React.CSSProperties>(\n () => {\n const baseWidth =\n isRichTextAuthoringMode && mainContentWidth > 0\n ? mainContentWidth\n : zoomStageSize.width;\n\n return {\n transform: `scale(${zoom})`,\n width: baseWidth > 0 ? `${baseWidth}px` : undefined,\n transformOrigin: isRichTextAuthoringMode ? \"top left\" : \"top center\",\n };\n },\n [isRichTextAuthoringMode, mainContentWidth, zoom, zoomStageSize.width],\n );\n\n const updatePlacements = (updater: SignaturePlacement[] | ((prev: SignaturePlacement[]) => SignaturePlacement[])) => {\n const next =\n typeof updater === \"function\" ? updater(placements) : updater;\n const normalizedNext = next.map((placement) =>\n normalizeSignaturePlacement(placement),\n );\n\n if (!props.signaturePlacements) {\n setInternalPlacements(normalizedNext);\n }\n\n props.onSignaturePlacementsChange?.(normalizedNext);\n };\n\n const updateAnnotations = (\n updater:\n | AnnotationPlacement[]\n | ((prev: AnnotationPlacement[]) => AnnotationPlacement[]),\n ) => {\n const next =\n typeof updater === \"function\" ? updater(annotations) : updater;\n\n if (!props.annotations) {\n setInternalAnnotations(next);\n }\n\n props.onAnnotationsChange?.(next);\n };\n\n const handleSignatureSelect = (signature: Signature) => {\n setSelectedSignature(normalizeSignature(signature));\n setSelectedSignatureColor(\"black\");\n setIsPlacingAnnotation(false);\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n props.onSign?.(normalizeSignature(signature));\n };\n\n const handlePlaceSignature = (placement: {\n signature: Signature;\n signatureColor?: SignatureInkColor;\n surfaceKey: string;\n surfaceKind: SignaturePlacement[\"surfaceKind\"];\n page?: number;\n slide?: number;\n sheetName?: string;\n x: number;\n y: number;\n width: number;\n height: number;\n }) => {\n const nextPlacement: SignaturePlacement = normalizeSignaturePlacement({\n id: createPlacementId(),\n signatureId: placement.signature.id,\n signature: placement.signature,\n signatureColor: placement.signatureColor ?? selectedSignatureColor,\n surfaceKey: placement.surfaceKey,\n surfaceKind: placement.surfaceKind,\n page: placement.page,\n slide: placement.slide,\n sheetName: placement.sheetName,\n x: placement.x,\n y: placement.y,\n width: placement.width,\n height: placement.height,\n });\n\n updatePlacements((prev) => [...prev, nextPlacement]);\n setSelectedSignature(null);\n setSelectedSignatureColor(\"black\");\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n };\n\n const handlePlaceAnnotation = (annotation: AnnotationPlacementDraft) => {\n const nextAnnotation: AnnotationPlacement = {\n id: createAnnotationId(),\n ...annotation,\n };\n\n updateAnnotations((prev) => [...prev, nextAnnotation]);\n setIsPlacingAnnotation(false);\n setSelectedSignature(null);\n setActivePlacementId(null);\n setActiveAnnotationId(nextAnnotation.id);\n };\n\n const handleUpdatePlacement = (\n id: string,\n patch: Partial<\n Pick<SignaturePlacement, \"x\" | \"y\" | \"width\" | \"height\" | \"signatureColor\">\n >,\n ) => {\n updatePlacements((prev) =>\n prev.map((placement) =>\n placement.id === id\n ? normalizeSignaturePlacement({\n ...placement,\n ...patch,\n signatureColor: patch.signatureColor\n ? normalizeSignatureInkColor(patch.signatureColor)\n : placement.signatureColor,\n })\n : placement,\n ),\n );\n };\n\n const handleRemovePlacement = (id: string) => {\n updatePlacements((prev) => prev.filter((placement) => placement.id !== id));\n if (activePlacementId === id) {\n setActivePlacementId(null);\n }\n };\n\n const handleUpdateAnnotation = (\n id: string,\n patch: Partial<\n Pick<AnnotationPlacement, \"x\" | \"y\" | \"width\" | \"height\" | \"text\">\n >,\n ) => {\n updateAnnotations((prev) =>\n prev.map((annotation) =>\n annotation.id === id ? { ...annotation, ...patch } : annotation,\n ),\n );\n };\n\n const handleRemoveAnnotation = (id: string) => {\n updateAnnotations((prev) =>\n prev.filter((annotation) => annotation.id !== id),\n );\n if (activeAnnotationId === id) {\n setActiveAnnotationId(null);\n }\n };\n\n const signatureOverlayProps: DocumentSurfaceOverlayState = {\n placements,\n annotations,\n pendingSignature: selectedSignature,\n pendingAnnotation: isPlacingAnnotation,\n activePlacementId,\n activeAnnotationId,\n placeHint: locale[\"signatures.placeHint\"],\n annotationHint: locale[\"annotations.placeHint\"],\n annotationPlaceholder: locale[\"annotations.placeholder\"],\n signatureAltLabel: locale[\"signatures.alt\"],\n signatureAltByLabel: locale[\"signatures.altBy\"],\n signatureNoteIndicatorLabel: locale[\"signatures.noteIndicator\"],\n signatureColorLabel: locale[\"signatures.color\"],\n signatureColorNames: {\n black: locale[\"signatures.color.black\"],\n blue: locale[\"signatures.color.blue\"],\n red: locale[\"signatures.color.red\"],\n green: locale[\"signatures.color.green\"],\n },\n removeSignatureLabel: locale[\"signatures.remove\"],\n annotationTitle: locale[\"annotations.title\"],\n linkedAnnotationTitle: locale[\"annotations.linkedTitle\"],\n linkedAnnotationBadge: locale[\"annotations.linkedBadge\"],\n openAnnotationLabel: locale[\"annotations.open\"],\n removeAnnotationLabel: locale[\"annotations.remove\"],\n onPlaceSignature: handlePlaceSignature,\n onPlaceAnnotation: handlePlaceAnnotation,\n onUpdatePlacement: handleUpdatePlacement,\n onUpdateAnnotation: handleUpdateAnnotation,\n onRemovePlacement: handleRemovePlacement,\n onRemoveAnnotation: handleRemoveAnnotation,\n onSelectPlacement: (id) => {\n setActivePlacementId(id);\n if (id) {\n setActiveAnnotationId(null);\n }\n },\n onSelectAnnotation: (id) => {\n setActiveAnnotationId(id);\n if (id) {\n setActivePlacementId(null);\n }\n },\n };\n\n const saveReady = useMemo(() => {\n if (!resolved) {\n return false;\n }\n\n if (showCreateUnsupportedNotice) {\n return false;\n }\n\n switch (resolved.fileType) {\n case \"docx\":\n case \"doc\":\n case \"rtf\":\n case \"txt\":\n case \"md\":\n return effectiveMode === \"view\"\n ? Boolean(\n (richTextExportState?.pages?.length ?? 0) > 0 ||\n richTextExportState?.container,\n )\n : Boolean(richTextExportState?.container);\n case \"xlsx\":\n case \"xls\":\n case \"csv\":\n return Boolean(spreadsheetExportState);\n case \"pptx\":\n case \"ppt\":\n return Boolean(pptxExportState);\n default:\n return true;\n }\n }, [\n effectiveMode,\n pptxExportState,\n resolved,\n richTextExportState,\n showCreateUnsupportedNotice,\n spreadsheetExportState,\n ]);\n\n const saveEnabled =\n Boolean(props.onSave) && Boolean(resolved) && !loading && saveReady;\n const exportLabels = useMemo(\n () => ({\n annotationTitle: locale[\"annotations.title\"],\n linkedAnnotationTitle: locale[\"annotations.linkedTitle\"],\n linkedAnnotationBadge: locale[\"annotations.linkedBadge\"],\n annotationAltLabel: locale[\"annotations.title\"],\n linkedAnnotationAltLabel: locale[\"annotations.linkedTitle\"],\n }),\n [locale],\n );\n\n const emitSave = (\n base64: string,\n meta: {\n fileName: string;\n fileType: SupportedFileType;\n exportedAsPdf?: boolean;\n },\n ) => {\n props.onSave?.(base64, {\n fileName: meta.fileName,\n fileType: meta.fileType,\n exportedAsPdf: meta.exportedAsPdf ?? meta.fileType === \"pdf\",\n annotations,\n signaturePlacements: placements,\n signatures: finalizedSignatures,\n signatureList,\n });\n };\n\n const handleSaveAction = async (exportAsPdf: boolean) => {\n if (!resolved || !props.onSave || isSaving) {\n return;\n }\n\n setError(\"\");\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n setIsSaving(true);\n\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n\n try {\n const saveAsPdf = exportAsPdf || saveAsPdfByDefault;\n const pageDecorations =\n showHeaderFooterSlots && hasHeaderFooterSlots\n ? {\n headerElement: exportHeaderRef.current,\n footerElement: exportFooterRef.current,\n letterheadTemplate: props.letterheadTemplate,\n }\n : undefined;\n\n switch (resolved.fileType) {\n case \"pdf\": {\n const exported = await exportSignedPdfDocument({\n arrayBuffer: resolved.arrayBuffer,\n url: resolved.url,\n fileName: resolved.fileName,\n placements,\n annotations,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: true,\n });\n break;\n }\n case \"docx\":\n case \"doc\":\n case \"rtf\":\n case \"txt\":\n case \"md\": {\n const exported = await exportSignedRichTextFile({\n container: richTextExportState?.container ?? null,\n pages: richTextExportState?.pages,\n fileName: resolved.fileName,\n placements,\n annotations,\n asPdf: saveAsPdf,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: saveAsPdf,\n });\n break;\n }\n case \"xlsx\":\n case \"xls\":\n case \"csv\": {\n const exported = await exportSignedSpreadsheetFile({\n exportState: spreadsheetExportState,\n fileName: resolved.fileName,\n placements,\n annotations,\n asPdf: saveAsPdf,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: saveAsPdf,\n });\n break;\n }\n case \"pptx\":\n case \"ppt\": {\n const exported = await exportSignedSlidesFile({\n exportState: pptxExportState,\n fileName: resolved.fileName,\n placements,\n annotations,\n asPdf: saveAsPdf,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: saveAsPdf,\n });\n break;\n }\n case \"jpg\":\n case \"jpeg\":\n case \"png\":\n case \"gif\":\n case \"bmp\":\n case \"svg\": {\n if (!resolved.arrayBuffer) {\n throw new Error(\"The image source is not ready for export.\");\n }\n\n const exported = await exportSignedImageFile({\n arrayBuffer: resolved.arrayBuffer,\n fileType: resolved.fileType,\n fileName: resolved.fileName,\n placements,\n annotations,\n asPdf: saveAsPdf,\n labels: exportLabels,\n pageDecorations,\n });\n emitSave(exported.base64, {\n fileName: exported.fileName,\n fileType: exported.fileType,\n exportedAsPdf: saveAsPdf,\n });\n break;\n }\n default:\n throw new Error(`Saving is not available for ${resolved.fileType}.`);\n }\n } catch (err: any) {\n console.error(\"Save/export failed\", err);\n setError(err?.message || \"Failed to save the document\");\n } finally {\n setIsSaving(false);\n }\n };\n\n const renderContent = () => {\n if (error) {\n return (\n <div className=\"hv-status-shell\">\n <div className=\"hv-error-banner\">\n <strong>{locale[\"error.title\"]}</strong>\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\n if (loading || !resolved) {\n return (\n <div className=\"hv-status-shell\">\n <div className=\"hv-loader\">\n <div className=\"hv-spinner\" />\n <span>{locale.loading}</span>\n </div>\n </div>\n );\n }\n\n const renderCapabilityNotice = (\n title: string,\n description: string,\n variant: \"info\" | \"warning\" = \"info\",\n ) => (\n <div className={`hv-info-banner${variant === \"warning\" ? \" warning\" : \"\"}`}>\n <strong>{title}</strong>\n <p>{description}</p>\n </div>\n );\n\n const shouldShowModeAdjustedNotice =\n showModeFallbackNotice || (showCreateUnsupportedNotice && hasRenderableSource);\n const modeAdjustedNotice = shouldShowModeAdjustedNotice\n ? renderCapabilityNotice(\n locale[\"documents.modeFallbackTitle\"],\n locale[\"documents.modeFallbackDescription\"]\n .replace(\n \"{mode}\",\n getReadableModeLabel(showModeFallbackNotice ? \"edit\" : \"create\"),\n )\n .replace(\"{fileType}\", getReadableFileTypeLabel(resolved.fileType)),\n )\n : null;\n\n if (showCreateUnsupportedNotice && !hasRenderableSource) {\n return (\n <div className=\"hv-page-container\" style={{ padding: \"32px\" }}>\n {renderCapabilityNotice(\n locale[\"documents.createUnsupportedTitle\"],\n locale[\"documents.createUnsupportedDescription\"].replace(\n \"{formats}\",\n createSupportedFormats,\n ),\n \"warning\",\n )}\n </div>\n );\n }\n\n const commonProps = {\n arrayBuffer: resolved.arrayBuffer,\n fileName: resolved.fileName,\n fileType: resolved.fileType,\n layout,\n currentPage,\n onPageCount: setPageCount,\n onCurrentPageChange: setCurrentPage,\n onThumbs: setThumbnails,\n signatureOverlay: signatureOverlayProps,\n locale,\n };\n\n switch (resolved.fileType) {\n case \"pdf\":\n return (\n <>\n {modeAdjustedNotice}\n <PdfRenderer\n url={resolved.url}\n workerSrc={props.pdfWorkerSrc}\n {...commonProps}\n />\n </>\n );\n case \"docx\":\n case \"doc\":\n case \"rtf\":\n case \"txt\":\n case \"md\":\n return (\n <>\n {modeAdjustedNotice}\n <RichTextEditor\n mode={effectiveMode}\n onExportStateChange={setRichTextExportState}\n {...commonProps}\n />\n </>\n );\n case \"xlsx\":\n case \"csv\":\n case \"xls\":\n return (\n <>\n {modeAdjustedNotice}\n <SpreadsheetEditor\n mode={effectiveMode}\n onExportStateChange={setSpreadsheetExportState}\n {...commonProps}\n />\n </>\n );\n case \"pptx\":\n case \"ppt\":\n return (\n <>\n {modeAdjustedNotice}\n <PptxRenderer\n onExportStateChange={setPptxExportState}\n {...commonProps}\n />\n </>\n );\n case \"jpg\":\n case \"jpeg\":\n case \"png\":\n case \"gif\":\n case \"bmp\":\n case \"svg\":\n return (\n <>\n {modeAdjustedNotice}\n <ImageRenderer {...commonProps} fileType={resolved.fileType} />\n </>\n );\n default:\n return (\n <div className=\"hv-status-shell\">\n <div className=\"hv-error-banner\">\n {locale[\"documents.unsupportedFileType\"]}: {resolved.fileType}\n </div>\n </div>\n );\n }\n };\n\n return (\n <div className=\"hv-root\" data-hv-theme={theme}>\n <Toolbar\n fileName={resolved?.fileName}\n pageCount={pageCount}\n currentPage={currentPage}\n onPageChange={setCurrentPage}\n showHeaderFooterToggle={headerFooterToggleEnabled}\n headerFooterVisible={showHeaderFooterSlots}\n onToggleHeaderFooter={() => setShowHeaderFooterSlots((prev) => !prev)}\n layout={layout}\n onLayoutChange={setLayout}\n showThumbnails={showThumbnails}\n onToggleThumbnails={() => setShowThumbnails((prev) => !prev)}\n showSignatures={showSignatures}\n onToggleSignatures={() => setShowSignatures((prev) => !prev)}\n signingEnabled={signingEnabled}\n annotationEnabled={annotationEnabled}\n annotationMode={isPlacingAnnotation}\n onToggleAnnotationMode={() => {\n if (!annotationEnabled) {\n return;\n }\n\n setIsPlacingAnnotation((prev) => {\n const next = !prev;\n if (next) {\n setSelectedSignature(null);\n setShowSignatures(false);\n setActivePlacementId(null);\n setActiveAnnotationId(null);\n }\n return next;\n });\n }}\n zoom={zoom}\n onZoomIn={() =>\n setZoom((prev) => Math.min(2, Number((prev + 0.1).toFixed(2))))\n }\n onZoomOut={() =>\n setZoom((prev) => Math.max(0.5, Number((prev - 0.1).toFixed(2))))\n }\n onZoomReset={() => setZoom(1)}\n saveEnabled={saveEnabled}\n isSaving={isSaving}\n onSave={() => void handleSaveAction(false)}\n onExportPdf={() => void handleSaveAction(true)}\n showExportPdfAction={!saveAsPdfByDefault}\n saveLabel={saveAsPdfByDefault ? locale[\"toolbar.finalizePdf\"] : locale[\"toolbar.save\"]}\n locale={locale}\n />\n\n {(props.headerComponent || props.footerComponent) && (\n <div className=\"hv-export-slot-host\" aria-hidden=\"true\">\n {props.headerComponent && (\n <div\n ref={exportHeaderRef}\n className=\"hv-export-slot hv-export-slot-header\"\n >\n {props.headerComponent}\n </div>\n )}\n {props.footerComponent && (\n <div\n ref={exportFooterRef}\n className=\"hv-export-slot hv-export-slot-footer\"\n >\n {props.footerComponent}\n </div>\n )}\n </div>\n )}\n\n <div className=\"hv-shell\">\n <ThumbnailsSidebar\n isOpen={showThumbnails}\n thumbnails={thumbnails}\n currentPage={currentPage}\n onSelectPage={setCurrentPage}\n locale={locale}\n />\n\n <main\n ref={mainRef}\n className={`hv-main${isRichTextAuthoringMode ? \" hv-main-richtext-authoring\" : \"\"}`}\n >\n <div className=\"hv-zoom-shell\" style={zoomShellStyle}>\n <div ref={zoomStageRef} className=\"hv-zoom-stage\" style={zoomStageStyle}>\n {renderContent()}\n </div>\n </div>\n </main>\n\n {signingEnabled && (\n <SignaturePanel\n isOpen={showSignatures}\n onClose={() => setShowSignatures(false)}\n onSelectSignature={handleSignatureSelect}\n selectedSignature={selectedSignature}\n selectedColor={selectedSignatureColor}\n onSelectedColorChange={setSelectedSignatureColor}\n onClearSelection={() => {\n setSelectedSignature(null);\n setSelectedSignatureColor(\"black\");\n }}\n externalSignatures={availableSignatures}\n onSignRequest={props.onSignRequest}\n locale={locale}\n />\n )}\n </div>\n\n </div>\n );\n}\n","\"use client\";\n\nimport mammoth from \"mammoth\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport MarkdownIt from \"markdown-it\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type {\n RichTextExportState,\n RichTextPageRenderModel,\n} from \"../internal/exportModels\";\nimport type {\n DocumentSurfaceOverlayState,\n DocumentMode,\n SupportedFileType,\n} from \"../types\";\nimport { captureElementCanvas } from \"../utils/export\";\nimport { sanitizeHtml } from \"../utils/sanitize\";\n\nconst DOC_PAGE_WIDTH = 816;\nconst DOC_PAGE_HEIGHT = 1056;\nconst PAGE_RENDER_SCALE = 2;\nconst PAGE_BREAK_MIN_FILL = 0.55;\nconst DOCX_PREVIEW_CLASS_NAME = \"hv-docx-page\";\n\ninterface RichTextEditorProps {\n mode: DocumentMode;\n arrayBuffer?: ArrayBuffer;\n fileName: string;\n fileType?: SupportedFileType;\n locale: Record<string, string>;\n layout: \"single\" | \"side-by-side\";\n currentPage: number;\n onPageCount: (n: number) => void;\n onCurrentPageChange: (p: number) => void;\n onThumbs: (thumbs: Array<string | undefined>) => void;\n onExportStateChange?: (state: RichTextExportState | null) => void;\n signatureOverlay: DocumentSurfaceOverlayState;\n}\n\nfunction createCanvas(width: number, height: number) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(width));\n canvas.height = Math.max(1, Math.round(height));\n return canvas;\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\nfunction buildPlainTextHtml(text: string) {\n const normalized = text.replace(/\\r\\n/g, \"\\n\").trim();\n if (!normalized) {\n return '<article class=\"hv-plain-text-doc\"><p></p></article>';\n }\n\n const blocks = normalized.split(/\\n{2,}/).map((block) => block.trim()).filter(Boolean);\n const htmlBlocks = blocks.map((block) => {\n const lines = block.split(\"\\n\").map((line) => line.trimEnd());\n const nonEmptyLines = lines.filter((line) => line.trim().length > 0);\n\n if (\n nonEmptyLines.length > 0\n && nonEmptyLines.every((line) => /^[-*•]\\s+/.test(line))\n ) {\n const items = nonEmptyLines\n .map((line) => line.replace(/^[-*•]\\s+/, \"\"))\n .map((line) => `<li>${escapeHtml(line)}</li>`)\n .join(\"\");\n return `<ul>${items}</ul>`;\n }\n\n if (\n nonEmptyLines.length > 0\n && nonEmptyLines.every((line) => /^\\d+[.)]\\s+/.test(line))\n ) {\n const items = nonEmptyLines\n .map((line) => line.replace(/^\\d+[.)]\\s+/, \"\"))\n .map((line) => `<li>${escapeHtml(line)}</li>`)\n .join(\"\");\n return `<ol>${items}</ol>`;\n }\n\n return `<p>${lines.map((line) => escapeHtml(line)).join(\"<br />\")}</p>`;\n });\n\n return `<article class=\"hv-plain-text-doc\">${htmlBlocks.join(\"\")}</article>`;\n}\n\nasync function waitForContainerImages(container: HTMLElement) {\n const images = Array.from(container.querySelectorAll(\"img\"));\n\n await Promise.all(\n images.map(\n (image) =>\n new Promise<void>((resolve) => {\n if (image.complete) {\n resolve();\n return;\n }\n\n image.addEventListener(\"load\", () => resolve(), { once: true });\n image.addEventListener(\"error\", () => resolve(), { once: true });\n }),\n ),\n );\n}\n\nasync function waitForRenderReady(container: HTMLElement) {\n await waitForContainerImages(container);\n\n if (typeof document !== \"undefined\" && \"fonts\" in document) {\n try {\n await (document as Document & { fonts?: { ready?: Promise<unknown> } }).fonts?.ready;\n } catch {\n // Continue even if font loading information is unavailable.\n }\n }\n\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => resolve());\n });\n });\n}\n\nfunction calculatePageBreakOffsets(container: HTMLElement, pageHeight: number) {\n const totalHeight = Math.max(container.scrollHeight, pageHeight);\n const blocks = Array.from(container.children)\n .flatMap((node) => (node instanceof HTMLElement ? [node] : []))\n .map((node) => ({\n top: node.offsetTop,\n bottom: node.offsetTop + node.offsetHeight,\n }))\n .filter((block) => block.bottom > block.top)\n .sort((left, right) => left.top - right.top);\n\n const offsets: number[] = [];\n let cursor = 0;\n\n while (cursor < totalHeight) {\n const target = cursor + pageHeight;\n\n if (target >= totalHeight) {\n offsets.push(totalHeight);\n break;\n }\n\n const candidate = blocks\n .filter(\n (block) =>\n block.bottom > cursor + pageHeight * PAGE_BREAK_MIN_FILL &&\n block.bottom <= target,\n )\n .map((block) => block.bottom)\n .pop();\n\n const nextOffset =\n candidate && candidate > cursor + pageHeight * 0.35 ? candidate : target;\n\n offsets.push(nextOffset);\n cursor = nextOffset;\n }\n\n return offsets.length > 0 ? offsets : [pageHeight];\n}\n\nfunction createThumbnailDataUrl(canvas: HTMLCanvasElement) {\n const thumbWidth = 160;\n const thumbScale = thumbWidth / canvas.width;\n const thumbCanvas = createCanvas(thumbWidth, canvas.height * thumbScale);\n const thumbCtx = thumbCanvas.getContext(\"2d\");\n\n if (thumbCtx) {\n thumbCtx.fillStyle = \"#ffffff\";\n thumbCtx.fillRect(0, 0, thumbCanvas.width, thumbCanvas.height);\n thumbCtx.drawImage(canvas, 0, 0, thumbCanvas.width, thumbCanvas.height);\n }\n\n return thumbCanvas.toDataURL(\"image/png\");\n}\n\nfunction buildPageModels(\n sourceCanvas: HTMLCanvasElement,\n breakOffsets: number[],\n) {\n const scale = sourceCanvas.width / DOC_PAGE_WIDTH;\n const pageCanvasWidth = DOC_PAGE_WIDTH * scale;\n const pageCanvasHeight = DOC_PAGE_HEIGHT * scale;\n const pages: RichTextPageRenderModel[] = [];\n let previousOffset = 0;\n\n for (const [index, endOffset] of breakOffsets.entries()) {\n const sourceY = previousOffset * scale;\n const sourceHeight = Math.max((endOffset - previousOffset) * scale, 1);\n const pageCanvas = createCanvas(pageCanvasWidth, pageCanvasHeight);\n const pageCtx = pageCanvas.getContext(\"2d\");\n\n if (!pageCtx) {\n previousOffset = endOffset;\n continue;\n }\n\n pageCtx.fillStyle = \"#ffffff\";\n pageCtx.fillRect(0, 0, pageCanvas.width, pageCanvas.height);\n pageCtx.drawImage(\n sourceCanvas,\n 0,\n sourceY,\n sourceCanvas.width,\n sourceHeight,\n 0,\n 0,\n pageCanvas.width,\n sourceHeight,\n );\n\n pages.push({\n pageNumber: index + 1,\n surfaceKey: `document-page:${index + 1}`,\n imageUrl: pageCanvas.toDataURL(\"image/png\"),\n thumbnailUrl: createThumbnailDataUrl(pageCanvas),\n width: pageCanvas.width,\n height: pageCanvas.height,\n });\n previousOffset = endOffset;\n }\n\n if (pages.length === 0) {\n const blankCanvas = createCanvas(\n DOC_PAGE_WIDTH * PAGE_RENDER_SCALE,\n DOC_PAGE_HEIGHT * PAGE_RENDER_SCALE,\n );\n const blankCtx = blankCanvas.getContext(\"2d\");\n if (blankCtx) {\n blankCtx.fillStyle = \"#ffffff\";\n blankCtx.fillRect(0, 0, blankCanvas.width, blankCanvas.height);\n }\n\n return [{\n pageNumber: 1,\n surfaceKey: \"document-page:1\",\n imageUrl: blankCanvas.toDataURL(\"image/png\"),\n thumbnailUrl: blankCanvas.toDataURL(\"image/png\"),\n width: blankCanvas.width,\n height: blankCanvas.height,\n }];\n }\n\n return pages;\n}\n\nasync function captureDocxPageModel(\n pageElement: HTMLElement,\n pageNumber: number,\n): Promise<RichTextPageRenderModel> {\n const originalBoxShadow = pageElement.style.boxShadow;\n const originalMargin = pageElement.style.margin;\n const originalTransform = pageElement.style.transform;\n const width = Math.max(\n Math.round(pageElement.scrollWidth),\n Math.round(pageElement.getBoundingClientRect().width),\n 1,\n );\n const height = Math.max(\n Math.round(pageElement.scrollHeight),\n Math.round(pageElement.getBoundingClientRect().height),\n 1,\n );\n\n pageElement.style.boxShadow = \"none\";\n pageElement.style.margin = \"0\";\n pageElement.style.transform = \"none\";\n\n try {\n const pageCanvas = await captureElementCanvas(pageElement, {\n backgroundColor: \"#ffffff\",\n scale: PAGE_RENDER_SCALE,\n sanitizeStyles: false,\n ignoreElements: (element) =>\n element instanceof HTMLElement &&\n (\n element.closest(\".hv-signature-overlay\") !== null\n || element.closest('[data-hv-source-class~=\"hv-signature-overlay\"]') !== null\n ),\n });\n\n if (!pageCanvas) {\n throw new Error(\"Unable to capture the DOCX page surface.\");\n }\n\n return {\n pageNumber,\n surfaceKey: `document-page:${pageNumber}`,\n imageUrl: pageCanvas.toDataURL(\"image/png\"),\n thumbnailUrl: createThumbnailDataUrl(pageCanvas),\n width: pageCanvas.width,\n height: pageCanvas.height,\n };\n } finally {\n pageElement.style.boxShadow = originalBoxShadow;\n pageElement.style.margin = originalMargin;\n pageElement.style.transform = originalTransform;\n }\n}\n\nfunction getPagesToShow(\n totalPages: number,\n currentPage: number,\n layout: \"single\" | \"side-by-side\",\n) {\n if (totalPages === 0) {\n return [];\n }\n\n const validPage = Math.max(1, Math.min(currentPage, totalPages));\n\n if (layout === \"side-by-side\" && totalPages > 1) {\n if (validPage === 1) {\n return [1];\n }\n\n const left = validPage % 2 === 0 ? validPage : validPage - 1;\n return [left, left + 1].filter((pageNumber) => pageNumber <= totalPages);\n }\n\n return [validPage];\n}\n\ninterface AuthoringTemplate {\n id: string;\n labelKey: string;\n descriptionKey: string;\n html: string;\n}\n\ninterface RichTextToolbarState {\n blockTag: \"p\" | \"h1\" | \"h2\" | \"h3\" | \"blockquote\";\n bold: boolean;\n italic: boolean;\n underline: boolean;\n unorderedList: boolean;\n orderedList: boolean;\n align: \"left\" | \"center\" | \"right\";\n insideTable: boolean;\n hasSelectedImage: boolean;\n imageSrc: string;\n imageAlt: string;\n imageSize: \"sm\" | \"md\" | \"lg\" | \"full\";\n imageCrop: \"original\" | \"wide\" | \"square\" | \"portrait\";\n imageAlign: \"left\" | \"center\" | \"right\";\n imageScale: number;\n imageFocusX: number;\n imageFocusY: number;\n}\n\nfunction createDefaultToolbarState(): RichTextToolbarState {\n return {\n blockTag: \"p\",\n bold: false,\n italic: false,\n underline: false,\n unorderedList: false,\n orderedList: false,\n align: \"left\",\n insideTable: false,\n hasSelectedImage: false,\n imageSrc: \"\",\n imageAlt: \"\",\n imageSize: \"md\",\n imageCrop: \"original\",\n imageAlign: \"center\",\n imageScale: 1,\n imageFocusX: 50,\n imageFocusY: 50,\n };\n}\n\nfunction getClosestEditorElement(node: Node | null, editor: HTMLElement) {\n let current =\n node instanceof HTMLElement\n ? node\n : node instanceof Text\n ? node.parentElement\n : null;\n\n while (current && current !== editor) {\n if (/^(P|H1|H2|H3|BLOCKQUOTE)$/i.test(current.tagName)) {\n return current;\n }\n current = current.parentElement;\n }\n\n return null;\n}\n\nfunction getSelectionHostElement(\n editor: HTMLElement,\n fallbackRange?: Range | null,\n) {\n const selection = typeof window !== \"undefined\" ? window.getSelection() : null;\n const selectionNode = selection?.anchorNode ?? fallbackRange?.startContainer ?? null;\n const hostElement =\n selectionNode instanceof HTMLElement\n ? selectionNode\n : selectionNode instanceof Text\n ? selectionNode.parentElement\n : null;\n\n return hostElement && editor.contains(hostElement) ? hostElement : null;\n}\n\nfunction getSelectedTableCell(editor: HTMLElement, fallbackRange?: Range | null) {\n const hostElement = getSelectionHostElement(editor, fallbackRange);\n return hostElement?.closest(\"td, th\") as HTMLTableCellElement | null;\n}\n\nfunction getSelectedImageFigure(editor: HTMLElement, fallbackRange?: Range | null) {\n const hostElement = getSelectionHostElement(editor, fallbackRange);\n return hostElement?.closest(\"figure.hv-inline-image\") as HTMLElement | null;\n}\n\nfunction getImageSizePreset(figure?: Element | null) {\n if (!figure) {\n return \"md\" as const;\n }\n\n if (figure.classList.contains(\"size-sm\")) {\n return \"sm\" as const;\n }\n if (figure.classList.contains(\"size-lg\")) {\n return \"lg\" as const;\n }\n if (figure.classList.contains(\"size-full\")) {\n return \"full\" as const;\n }\n return \"md\" as const;\n}\n\nfunction getImageCropPreset(figure?: Element | null) {\n if (!figure) {\n return \"original\" as const;\n }\n\n if (figure.classList.contains(\"crop-wide\")) {\n return \"wide\" as const;\n }\n if (figure.classList.contains(\"crop-square\")) {\n return \"square\" as const;\n }\n if (figure.classList.contains(\"crop-portrait\")) {\n return \"portrait\" as const;\n }\n return \"original\" as const;\n}\n\nfunction getImageAlignPreset(figure?: Element | null) {\n if (!figure) {\n return \"center\" as const;\n }\n\n if (figure.classList.contains(\"align-left\")) {\n return \"left\" as const;\n }\n if (figure.classList.contains(\"align-right\")) {\n return \"right\" as const;\n }\n return \"center\" as const;\n}\n\nfunction getImageNumericStyle(figure: HTMLElement | null | undefined, key: string, fallback: number) {\n if (!figure) {\n return fallback;\n }\n\n const raw = figure.style.getPropertyValue(key).trim().replace(\"%\", \"\");\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction readToolbarState(\n editor: HTMLElement,\n fallbackRange?: Range | null,\n): RichTextToolbarState {\n if (typeof document === \"undefined\") {\n return createDefaultToolbarState();\n }\n\n const hostElement = getSelectionHostElement(editor, fallbackRange);\n const blockElement = hostElement\n ? getClosestEditorElement(hostElement, editor)\n : null;\n const selectedImageFigure = getSelectedImageFigure(editor, fallbackRange);\n const selectedImage = selectedImageFigure?.querySelector(\"img\");\n\n const blockTag = (blockElement?.tagName.toLowerCase() ??\n \"p\") as RichTextToolbarState[\"blockTag\"];\n\n const isCommandActive = (command: string) => {\n try {\n return document.queryCommandState(command);\n } catch {\n return false;\n }\n };\n\n return {\n blockTag,\n bold: isCommandActive(\"bold\"),\n italic: isCommandActive(\"italic\"),\n underline: isCommandActive(\"underline\"),\n unorderedList: isCommandActive(\"insertUnorderedList\"),\n orderedList: isCommandActive(\"insertOrderedList\"),\n align: isCommandActive(\"justifyCenter\")\n ? \"center\"\n : isCommandActive(\"justifyRight\")\n ? \"right\"\n : \"left\",\n insideTable: Boolean(getSelectedTableCell(editor, fallbackRange)),\n hasSelectedImage: Boolean(selectedImageFigure),\n imageSrc: selectedImage instanceof HTMLImageElement ? selectedImage.src : \"\",\n imageAlt: selectedImage instanceof HTMLImageElement ? selectedImage.alt : \"\",\n imageSize: getImageSizePreset(selectedImageFigure),\n imageCrop: getImageCropPreset(selectedImageFigure),\n imageAlign: getImageAlignPreset(selectedImageFigure),\n imageScale: getImageNumericStyle(selectedImageFigure, \"--hv-image-scale\", 1),\n imageFocusX: getImageNumericStyle(selectedImageFigure, \"--hv-image-focus-x\", 50),\n imageFocusY: getImageNumericStyle(selectedImageFigure, \"--hv-image-focus-y\", 50),\n };\n}\n\nfunction normalizeLinkTarget(value: string) {\n const trimmed = value.trim();\n if (!trimmed) {\n return \"\";\n }\n\n if (/^(https?:\\/\\/|mailto:|tel:)/i.test(trimmed)) {\n return trimmed;\n }\n\n return `https://${trimmed}`;\n}\n\nfunction createDefaultTableHtml(rows = 3, cols = 3) {\n const headerCells = Array.from({ length: cols }, (_, index) => {\n return `<th>Heading ${index + 1}</th>`;\n }).join(\"\");\n const bodyRows = Array.from({ length: rows }, () => {\n const cells = Array.from({ length: cols }, () => \"<td>Value</td>\").join(\"\");\n return `<tr>${cells}</tr>`;\n }).join(\"\");\n\n return [\n \"<table>\",\n `<thead><tr>${headerCells}</tr></thead>`,\n `<tbody>${bodyRows}</tbody>`,\n \"</table>\",\n ].join(\"\");\n}\n\nfunction createDefaultImageFigureHtml(imageUrl: string, altText: string) {\n return [\n '<figure class=\"hv-inline-image size-md crop-original align-center\">',\n '<div class=\"hv-inline-image-frame\">',\n `<img src=\"${imageUrl}\" alt=\"${altText}\" />`,\n \"</div>\",\n `<figcaption>${altText}</figcaption>`,\n \"</figure>\",\n \"<p></p>\",\n ].join(\"\");\n}\n\nfunction clampImageControl(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction createAuthoringTemplates(): AuthoringTemplate[] {\n return [\n {\n id: \"blank\",\n labelKey: \"documents.richText.template.blank\",\n descriptionKey: \"documents.richText.templateDesc.blank\",\n html: [\n \"<h1>Document Title</h1>\",\n \"<p><strong>Summary:</strong> Add a short statement that explains the purpose of this document.</p>\",\n \"<hr />\",\n \"<h2>Overview</h2>\",\n \"<p>Start with the context, the goal, and the key outcome you want the reader to take away.</p>\",\n \"<h2>Details</h2>\",\n \"<p>Use this section for the main body of the document.</p>\",\n ].join(\"\"),\n },\n {\n id: \"letter\",\n labelKey: \"documents.richText.template.letter\",\n descriptionKey: \"documents.richText.templateDesc.letter\",\n html: [\n \"<h1>Business Letter</h1>\",\n \"<p><strong>Your Company</strong><br />Street Address<br />City, State ZIP<br /><a href=\\\"mailto:team@example.com\\\">team@example.com</a></p>\",\n \"<p><strong>Date:</strong> March 24, 2026</p>\",\n \"<p><strong>Subject:</strong> Project update and next steps</p>\",\n \"<p>Dear Recipient Name,</p>\",\n \"<p>Thank you for the opportunity to support your team. This letter summarizes the current status, the key decisions that need attention, and the recommended next steps.</p>\",\n \"<blockquote>Use this area for a short executive summary, a request for approval, or a single critical instruction.</blockquote>\",\n \"<h2>Key Points</h2>\",\n \"<ul><li>Highlight the main update.</li><li>Clarify what changed since the last version.</li><li>Call out the action needed from the recipient.</li></ul>\",\n \"<p>Please let us know if you would like us to proceed with the recommended plan or if you would prefer an adjusted scope.</p>\",\n \"<p>Sincerely,</p>\",\n \"<p><strong>Your Name</strong><br />Title</p>\",\n ].join(\"\"),\n },\n {\n id: \"notes\",\n labelKey: \"documents.richText.template.notes\",\n descriptionKey: \"documents.richText.templateDesc.notes\",\n html: [\n \"<h1>Meeting Notes</h1>\",\n \"<table><tbody><tr><th>Date</th><td>March 24, 2026</td></tr><tr><th>Time</th><td>10:00 AM</td></tr><tr><th>Facilitator</th><td>Your Name</td></tr><tr><th>Attendees</th><td>List attendees here</td></tr></tbody></table>\",\n \"<h2>Agenda</h2>\",\n \"<ol><li>Opening updates</li><li>Review current blockers</li><li>Confirm next milestones</li></ol>\",\n \"<h2>Discussion Highlights</h2>\",\n \"<ul><li>Summarize the most important discussion points.</li></ul>\",\n \"<h2>Decisions</h2>\",\n \"<ul><li>Capture the decisions made in the meeting.</li></ul>\",\n \"<h2>Action Items</h2>\",\n \"<table><thead><tr><th>Owner</th><th>Action</th><th>Due</th></tr></thead><tbody><tr><td>Name</td><td>Follow-up task</td><td>Date</td></tr></tbody></table>\",\n ].join(\"\"),\n },\n {\n id: \"agreement\",\n labelKey: \"documents.richText.template.agreement\",\n descriptionKey: \"documents.richText.templateDesc.agreement\",\n html: [\n \"<h1>Agreement Summary</h1>\",\n \"<table><tbody><tr><th>Parties</th><td>Company A and Company B</td></tr><tr><th>Effective Date</th><td>March 24, 2026</td></tr><tr><th>Term</th><td>12 months</td></tr><tr><th>Owner</th><td>Department or team</td></tr></tbody></table>\",\n \"<blockquote>Use this document to describe the commercial understanding in plain language before the final contract is prepared or approved.</blockquote>\",\n \"<h2>Scope</h2>\",\n \"<p>Describe what is included, what the expected deliverables are, and what success should look like.</p>\",\n \"<h2>Commercial Terms</h2>\",\n \"<table><thead><tr><th>Item</th><th>Details</th></tr></thead><tbody><tr><td>Pricing</td><td>Describe the fee structure</td></tr><tr><td>Billing</td><td>Describe invoice terms</td></tr><tr><td>Service Levels</td><td>Describe response or delivery commitments</td></tr></tbody></table>\",\n \"<h2>Responsibilities</h2>\",\n \"<ul><li>List each party's major obligations.</li></ul>\",\n \"<h2>Approvals</h2>\",\n \"<p>Record the names, titles, and approval dates for each stakeholder.</p>\",\n ].join(\"\"),\n },\n {\n id: \"proposal\",\n labelKey: \"documents.richText.template.proposal\",\n descriptionKey: \"documents.richText.templateDesc.proposal\",\n html: [\n \"<h1>Project Proposal</h1>\",\n \"<p><strong>Prepared for:</strong> Client Name</p>\",\n \"<p><strong>Prepared by:</strong> Your Company</p>\",\n \"<h2>Executive Summary</h2>\",\n \"<p>Describe the business problem, the recommended solution, and the outcome this engagement is designed to deliver.</p>\",\n \"<blockquote>Keep this section concise and value-focused. Make it easy for an executive reader to understand the proposal in under a minute.</blockquote>\",\n \"<h2>Objectives</h2>\",\n \"<ul><li>State the primary business objective.</li><li>State the operational or user goal.</li><li>State the measurable outcome.</li></ul>\",\n \"<h2>Scope of Work</h2>\",\n \"<ol><li>Discovery and planning</li><li>Implementation and review</li><li>Launch and handoff</li></ol>\",\n \"<h2>Deliverables</h2>\",\n \"<ul><li>List the final outputs the client will receive.</li></ul>\",\n \"<h2>Delivery Plan</h2>\",\n \"<table><thead><tr><th>Phase</th><th>Deliverable</th><th>Timing</th></tr></thead><tbody><tr><td>Phase 1</td><td>Discovery report</td><td>Week 1</td></tr><tr><td>Phase 2</td><td>Implementation</td><td>Weeks 2-4</td></tr><tr><td>Phase 3</td><td>Final handoff</td><td>Week 5</td></tr></tbody></table>\",\n \"<h2>Investment</h2>\",\n \"<table><thead><tr><th>Line Item</th><th>Amount</th></tr></thead><tbody><tr><td>Professional services</td><td>$0.00</td></tr><tr><td>Optional add-on</td><td>$0.00</td></tr></tbody></table>\",\n \"<h2>Assumptions</h2>\",\n \"<ul><li>Document any scope boundaries, client dependencies, or exclusions.</li></ul>\",\n ].join(\"\"),\n },\n ];\n}\n\nexport function RichTextEditor(props: RichTextEditorProps) {\n const createCompactToolbarState = () => ({\n style: true,\n format: true,\n insert: false,\n media: false,\n history: false,\n });\n\n const editorRef = useRef<HTMLDivElement>(null);\n const measureRef = useRef<HTMLDivElement>(null);\n const docxPreviewRef = useRef<HTMLDivElement>(null);\n const imageInputRef = useRef<HTMLInputElement>(null);\n const imagePreviewRef = useRef<HTMLDivElement>(null);\n const savedSelectionRef = useRef<Range | null>(null);\n const imageDragPointerIdRef = useRef<number | null>(null);\n const [contentHtml, setContentHtml] = useState<string>(\"\");\n const [editableContentHtml, setEditableContentHtml] = useState<string>(\"\");\n const [selectedTemplateId, setSelectedTemplateId] = useState<string>(\"blank\");\n const [areTemplatesVisible, setAreTemplatesVisible] = useState(true);\n const [isCompactToolbar, setIsCompactToolbar] = useState(false);\n const [expandedToolbarSections, setExpandedToolbarSections] = useState(\n createCompactToolbarState,\n );\n const [imageEditorState, setImageEditorState] = useState<{\n src: string;\n alt: string;\n scale: number;\n focusX: number;\n focusY: number;\n crop: \"original\" | \"wide\" | \"square\" | \"portrait\";\n } | null>(null);\n const [toolbarState, setToolbarState] = useState<RichTextToolbarState>(\n createDefaultToolbarState(),\n );\n const [loading, setLoading] = useState(false);\n const [isPaginating, setIsPaginating] = useState(false);\n const [pages, setPages] = useState<RichTextPageRenderModel[]>([]);\n const [docxPages, setDocxPages] = useState<RichTextPageRenderModel[]>([]);\n const [isRenderingDocxPreview, setIsRenderingDocxPreview] = useState(false);\n const [docxPreviewFailed, setDocxPreviewFailed] = useState(false);\n\n const mdParser = useRef(new MarkdownIt({ html: true, linkify: true }));\n const authoringTemplates = useMemo(() => createAuthoringTemplates(), []);\n const isAuthoringMode = props.mode === \"edit\" || props.mode === \"create\";\n const isDocxFile =\n props.fileName.toLowerCase().endsWith(\".docx\") || props.fileType === \"docx\";\n const useDocxPreviewView =\n props.mode === \"view\" && isDocxFile && Boolean(props.arrayBuffer);\n\n const syncTemplateSelection = (nextHtml: string) => {\n const matchedTemplate = authoringTemplates.find(\n (template) => template.html === nextHtml,\n );\n setSelectedTemplateId(matchedTemplate?.id ?? \"\");\n };\n\n const captureSelectionRange = () => {\n if (!editorRef.current || typeof window === \"undefined\") {\n return;\n }\n\n const selection = window.getSelection();\n if (\n selection &&\n selection.rangeCount > 0 &&\n editorRef.current.contains(selection.anchorNode)\n ) {\n savedSelectionRef.current = selection.getRangeAt(0).cloneRange();\n }\n };\n\n const restoreSelectionRange = () => {\n if (!editorRef.current || typeof window === \"undefined\") {\n return false;\n }\n\n const selection = window.getSelection();\n if (!selection) {\n return false;\n }\n\n editorRef.current.focus();\n selection.removeAllRanges();\n\n if (\n savedSelectionRef.current &&\n editorRef.current.contains(savedSelectionRef.current.startContainer)\n ) {\n selection.addRange(savedSelectionRef.current);\n return true;\n }\n\n const fallbackRange = document.createRange();\n fallbackRange.selectNodeContents(editorRef.current);\n fallbackRange.collapse(false);\n selection.addRange(fallbackRange);\n savedSelectionRef.current = fallbackRange.cloneRange();\n return true;\n };\n\n const refreshToolbarState = () => {\n if (!editorRef.current || !isAuthoringMode) {\n setToolbarState(createDefaultToolbarState());\n return;\n }\n\n setToolbarState(readToolbarState(editorRef.current, savedSelectionRef.current));\n };\n\n useEffect(() => {\n const loadDoc = async () => {\n if (!props.arrayBuffer) {\n const templateHtml =\n props.mode === \"create\" ? authoringTemplates[0]?.html ?? \"\" : \"\";\n setContentHtml(templateHtml);\n setEditableContentHtml(templateHtml);\n setSelectedTemplateId(props.mode === \"create\" ? authoringTemplates[0]?.id ?? \"\" : \"\");\n setToolbarState(createDefaultToolbarState());\n setPages([]);\n setDocxPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n return;\n }\n\n setLoading(true);\n\n try {\n if (isDocxFile) {\n const result = await mammoth.convertToHtml({\n arrayBuffer: props.arrayBuffer,\n });\n const nextHtml = sanitizeHtml(result.value);\n setContentHtml(nextHtml);\n setEditableContentHtml(nextHtml);\n setSelectedTemplateId(\"\");\n } else {\n const decoder = new TextDecoder(\"utf-8\");\n const text = decoder.decode(props.arrayBuffer);\n\n if (props.fileName.toLowerCase().endsWith(\".md\") || props.fileType === \"md\") {\n const html = mdParser.current.render(text);\n const nextHtml = sanitizeHtml(html);\n setContentHtml(nextHtml);\n setEditableContentHtml(nextHtml);\n setSelectedTemplateId(\"\");\n } else {\n const nextHtml = buildPlainTextHtml(text);\n setContentHtml(nextHtml);\n setEditableContentHtml(nextHtml);\n setSelectedTemplateId(\"\");\n }\n }\n\n props.onPageCount(1);\n } catch (err) {\n console.error(\"Doc Conversion failed\", err);\n const errorHtml = `<p style=\"color:red\">${escapeHtml(props.locale[\"documents.richText.parseError\"])}</p>`;\n setContentHtml(errorHtml);\n setEditableContentHtml(errorHtml);\n setSelectedTemplateId(\"\");\n } finally {\n setLoading(false);\n }\n };\n\n void loadDoc();\n }, [\n authoringTemplates,\n isDocxFile,\n props.arrayBuffer,\n props.fileName,\n props.fileType,\n props.locale,\n props.mode,\n ]);\n\n useEffect(() => {\n if (!isAuthoringMode || !editorRef.current) {\n return;\n }\n\n if (editorRef.current.innerHTML !== editableContentHtml) {\n editorRef.current.innerHTML = editableContentHtml;\n }\n\n refreshToolbarState();\n }, [editableContentHtml, isAuthoringMode]);\n\n useEffect(() => {\n if (!isAuthoringMode || typeof document === \"undefined\") {\n return;\n }\n\n const handleSelectionChange = () => {\n if (!editorRef.current) {\n return;\n }\n\n const selection = window.getSelection();\n const selectionNode = selection?.anchorNode ?? null;\n\n if (!selectionNode || editorRef.current.contains(selectionNode)) {\n captureSelectionRange();\n refreshToolbarState();\n }\n };\n\n document.addEventListener(\"selectionchange\", handleSelectionChange);\n return () => {\n document.removeEventListener(\"selectionchange\", handleSelectionChange);\n };\n }, [isAuthoringMode]);\n\n useEffect(() => {\n if (props.mode === \"create\") {\n setAreTemplatesVisible(true);\n }\n }, [props.mode, props.fileName]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const mediaQuery = window.matchMedia(\"(max-width: 900px)\");\n const syncCompactState = () => {\n setIsCompactToolbar(mediaQuery.matches);\n if (!mediaQuery.matches) {\n setExpandedToolbarSections(createCompactToolbarState());\n }\n };\n\n syncCompactState();\n mediaQuery.addEventListener(\"change\", syncCompactState);\n return () => {\n mediaQuery.removeEventListener(\"change\", syncCompactState);\n };\n }, []);\n\n useEffect(() => {\n if (toolbarState.hasSelectedImage && toolbarState.imageSrc) {\n setImageEditorState({\n src: toolbarState.imageSrc,\n alt: toolbarState.imageAlt,\n scale: toolbarState.imageScale,\n focusX: toolbarState.imageFocusX,\n focusY: toolbarState.imageFocusY,\n crop: toolbarState.imageCrop,\n });\n return;\n }\n\n setImageEditorState(null);\n }, [\n toolbarState.hasSelectedImage,\n toolbarState.imageAlt,\n toolbarState.imageCrop,\n toolbarState.imageFocusX,\n toolbarState.imageFocusY,\n toolbarState.imageScale,\n toolbarState.imageSrc,\n ]);\n\n useEffect(() => {\n if (!useDocxPreviewView || !docxPreviewRef.current || !props.arrayBuffer) {\n setDocxPages([]);\n setDocxPreviewFailed(false);\n setIsRenderingDocxPreview(false);\n if (docxPreviewRef.current) {\n docxPreviewRef.current.innerHTML = \"\";\n }\n return;\n }\n\n let cancelled = false;\n\n const renderDocxPreview = async () => {\n const host = docxPreviewRef.current;\n const arrayBuffer = props.arrayBuffer;\n if (!host) {\n return;\n }\n\n setDocxPreviewFailed(false);\n setIsRenderingDocxPreview(true);\n setDocxPages([]);\n props.onThumbs([]);\n host.innerHTML = \"\";\n\n try {\n const { renderAsync } = await import(\"docx-preview\");\n if (cancelled) {\n return;\n }\n\n if (!arrayBuffer) {\n return;\n }\n\n await renderAsync(arrayBuffer.slice(0), host, undefined, {\n className: DOCX_PREVIEW_CLASS_NAME,\n inWrapper: true,\n breakPages: true,\n ignoreLastRenderedPageBreak: false,\n renderHeaders: true,\n renderFooters: true,\n useBase64URL: true,\n });\n\n await waitForRenderReady(host);\n\n if (cancelled) {\n return;\n }\n\n const pageElements = Array.from(\n host.querySelectorAll<HTMLElement>(`section.${DOCX_PREVIEW_CLASS_NAME}`),\n );\n\n if (pageElements.length === 0) {\n throw new Error(\"No DOCX pages were rendered.\");\n }\n\n const nextPageModels: RichTextPageRenderModel[] = [];\n\n for (const [index, pageElement] of pageElements.entries()) {\n nextPageModels.push(\n await captureDocxPageModel(\n pageElement,\n index + 1,\n ),\n );\n\n if ((index + 1) % 3 === 0) {\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n }\n }\n\n if (cancelled) {\n return;\n }\n\n setDocxPages(nextPageModels);\n props.onPageCount(nextPageModels.length);\n props.onThumbs(\n nextPageModels.map((page) => page.thumbnailUrl || page.imageUrl),\n );\n\n if (props.currentPage > nextPageModels.length) {\n props.onCurrentPageChange(1);\n }\n } catch (error) {\n console.error(\"DOCX preview rendering failed\", error);\n if (!cancelled) {\n setDocxPreviewFailed(true);\n setDocxPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n }\n } finally {\n if (!cancelled) {\n setIsRenderingDocxPreview(false);\n }\n }\n };\n\n void renderDocxPreview();\n\n return () => {\n cancelled = true;\n };\n }, [\n props.arrayBuffer,\n props.onCurrentPageChange,\n props.onPageCount,\n props.onThumbs,\n useDocxPreviewView,\n ]);\n\n useEffect(() => {\n if (props.mode !== \"view\") {\n setPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n return;\n }\n\n if (useDocxPreviewView && !docxPreviewFailed) {\n setPages([]);\n return;\n }\n\n if (!contentHtml || !measureRef.current) {\n setPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n return;\n }\n\n let cancelled = false;\n\n const paginate = async () => {\n const measureElement = measureRef.current;\n if (!measureElement) {\n return;\n }\n\n setIsPaginating(true);\n props.onThumbs([]);\n\n try {\n await waitForRenderReady(measureElement);\n\n const totalHeight = Math.max(\n measureElement.scrollHeight,\n DOC_PAGE_HEIGHT,\n );\n const fullCanvas = await captureElementCanvas(measureElement, {\n backgroundColor: \"#ffffff\",\n scale: PAGE_RENDER_SCALE,\n sanitizeStyles: false,\n });\n if (!fullCanvas) {\n throw new Error(\"Unable to capture the rich text document surface.\");\n }\n const breakOffsets = calculatePageBreakOffsets(\n measureElement,\n DOC_PAGE_HEIGHT,\n );\n const nextPages = buildPageModels(fullCanvas, breakOffsets);\n\n if (cancelled) {\n return;\n }\n\n setPages(nextPages);\n props.onPageCount(nextPages.length);\n props.onThumbs(\n nextPages.map((page) => page.thumbnailUrl || page.imageUrl),\n );\n\n if (props.currentPage > nextPages.length) {\n props.onCurrentPageChange(1);\n }\n } catch (error) {\n console.error(\"Rich text pagination failed\", error);\n if (!cancelled) {\n setPages([]);\n props.onPageCount(1);\n props.onThumbs([]);\n }\n } finally {\n if (!cancelled) {\n setIsPaginating(false);\n }\n }\n };\n\n void paginate();\n\n return () => {\n cancelled = true;\n };\n }, [\n contentHtml,\n docxPreviewFailed,\n props.mode,\n props.onCurrentPageChange,\n props.onPageCount,\n props.onThumbs,\n useDocxPreviewView,\n ]);\n\n const activeViewPages = useMemo(\n () =>\n props.mode === \"view\"\n ? useDocxPreviewView && !docxPreviewFailed\n ? docxPages\n : pages\n : undefined,\n [docxPages, docxPreviewFailed, pages, props.mode, useDocxPreviewView],\n );\n\n useEffect(() => {\n const container =\n props.mode === \"view\"\n ? useDocxPreviewView && !docxPreviewFailed\n ? docxPreviewRef.current\n : measureRef.current\n : editorRef.current;\n\n props.onExportStateChange?.({\n container,\n contentHtml: props.mode === \"view\" ? contentHtml : editableContentHtml,\n pages: activeViewPages,\n });\n }, [\n activeViewPages,\n contentHtml,\n docxPreviewFailed,\n editableContentHtml,\n props.mode,\n props.onExportStateChange,\n useDocxPreviewView,\n ]);\n\n useEffect(() => {\n return () => {\n props.onExportStateChange?.(null);\n };\n }, [props.onExportStateChange]);\n\n const pagesToShow = useMemo(\n () =>\n getPagesToShow(\n useDocxPreviewView && !docxPreviewFailed\n ? docxPages.length\n : pages.length,\n props.currentPage,\n props.layout,\n ),\n [\n docxPreviewFailed,\n docxPages.length,\n pages.length,\n props.currentPage,\n props.layout,\n useDocxPreviewView,\n ],\n );\n\n const syncEditableSurface = () => {\n const nextHtml = editorRef.current?.innerHTML || \"\";\n setEditableContentHtml(nextHtml);\n setContentHtml(nextHtml);\n syncTemplateSelection(nextHtml);\n captureSelectionRange();\n refreshToolbarState();\n };\n\n const applyAuthoringCommand = (command: string, value?: string) => {\n if (\n !editorRef.current ||\n typeof document === \"undefined\" ||\n typeof document.execCommand !== \"function\"\n ) {\n return;\n }\n\n restoreSelectionRange();\n document.execCommand(command, false, value);\n syncEditableSurface();\n };\n\n const insertAuthoringHtml = (html: string) => {\n if (\n !editorRef.current ||\n typeof document === \"undefined\" ||\n typeof document.execCommand !== \"function\"\n ) {\n return;\n }\n\n restoreSelectionRange();\n document.execCommand(\"insertHTML\", false, html);\n syncEditableSurface();\n };\n\n const insertLink = () => {\n if (\n !editorRef.current ||\n typeof document === \"undefined\" ||\n typeof window === \"undefined\"\n ) {\n return;\n }\n\n const candidateUrl = window.prompt(\n props.locale[\"documents.richText.toolbar.link\"],\n \"https://\",\n );\n\n if (!candidateUrl) {\n return;\n }\n\n const normalizedUrl = normalizeLinkTarget(candidateUrl);\n if (!normalizedUrl) {\n return;\n }\n\n restoreSelectionRange();\n const selectionText = window.getSelection()?.toString().trim() ?? \"\";\n\n if (selectionText) {\n document.execCommand(\"createLink\", false, normalizedUrl);\n } else {\n insertAuthoringHtml(\n `<a href=\"${escapeHtml(normalizedUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${escapeHtml(normalizedUrl)}</a>`,\n );\n return;\n }\n\n syncEditableSurface();\n };\n\n const handleImagePickerOpen = () => {\n captureSelectionRange();\n imageInputRef.current?.click();\n };\n\n const handleInsertImage = async (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n const file = event.target.files?.[0];\n event.target.value = \"\";\n\n if (!file) {\n return;\n }\n\n try {\n const imageUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result || \"\"));\n reader.onerror = () => reject(reader.error);\n reader.readAsDataURL(file);\n });\n\n const baseName = file.name.replace(/\\.[^.]+$/, \"\") || \"Image\";\n const safeName = escapeHtml(baseName);\n\n insertAuthoringHtml(createDefaultImageFigureHtml(imageUrl, safeName));\n } catch (error) {\n console.error(\"Image insertion failed\", error);\n }\n };\n\n const reselectImageFigure = (figure: HTMLElement) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(figure);\n selection.removeAllRanges();\n selection.addRange(range);\n savedSelectionRef.current = range.cloneRange();\n }\n };\n\n const applyImageFigureState = (\n figure: HTMLElement,\n patch: Partial<{\n size: \"sm\" | \"md\" | \"lg\" | \"full\";\n crop: \"original\" | \"wide\" | \"square\" | \"portrait\";\n align: \"left\" | \"center\" | \"right\";\n scale: number;\n focusX: number;\n focusY: number;\n }>,\n ) => {\n if (patch.size) {\n figure.classList.remove(\"size-sm\", \"size-md\", \"size-lg\", \"size-full\");\n figure.classList.add(`size-${patch.size}`);\n }\n\n if (patch.crop) {\n figure.classList.remove(\n \"crop-original\",\n \"crop-wide\",\n \"crop-square\",\n \"crop-portrait\",\n );\n figure.classList.add(`crop-${patch.crop}`);\n }\n\n if (patch.align) {\n figure.classList.remove(\"align-left\", \"align-center\", \"align-right\");\n figure.classList.add(`align-${patch.align}`);\n }\n\n if (typeof patch.scale === \"number\") {\n figure.style.setProperty(\"--hv-image-scale\", patch.scale.toFixed(2));\n }\n\n if (typeof patch.focusX === \"number\") {\n figure.style.setProperty(\"--hv-image-focus-x\", `${patch.focusX.toFixed(2)}%`);\n }\n\n if (typeof patch.focusY === \"number\") {\n figure.style.setProperty(\"--hv-image-focus-y\", `${patch.focusY.toFixed(2)}%`);\n }\n };\n\n const updateSelectedImage = (\n patch: Partial<{\n size: \"sm\" | \"md\" | \"lg\" | \"full\";\n crop: \"original\" | \"wide\" | \"square\" | \"portrait\";\n align: \"left\" | \"center\" | \"right\";\n scale: number;\n focusX: number;\n focusY: number;\n }>,\n options?: {\n sync?: boolean;\n },\n ) => {\n if (!editorRef.current) {\n return;\n }\n\n restoreSelectionRange();\n const figure = getSelectedImageFigure(editorRef.current, savedSelectionRef.current);\n const image = figure?.querySelector(\"img\");\n\n if (!figure || !(image instanceof HTMLImageElement)) {\n return;\n }\n\n applyImageFigureState(figure, patch);\n reselectImageFigure(figure);\n\n if (options?.sync === false) {\n refreshToolbarState();\n return;\n }\n\n syncEditableSurface();\n };\n\n const handleSetImageSize = (size: \"sm\" | \"md\" | \"lg\" | \"full\") => {\n updateSelectedImage({ size });\n };\n\n const handleSetImageCrop = (\n crop: \"original\" | \"wide\" | \"square\" | \"portrait\",\n ) => {\n setImageEditorState((prev) =>\n prev\n ? {\n ...prev,\n crop,\n }\n : prev,\n );\n updateSelectedImage({ crop });\n };\n\n const handleSetImageAlign = (align: \"left\" | \"center\" | \"right\") => {\n updateSelectedImage({ align });\n };\n\n const setImageEditorDraft = (patch: Partial<NonNullable<typeof imageEditorState>>) => {\n setImageEditorState((prev) => (prev ? { ...prev, ...patch } : prev));\n };\n\n const handleImageScaleInput = (nextScale: number, sync: boolean) => {\n const scale = clampImageControl(nextScale, 1, 2.5);\n setImageEditorDraft({ scale });\n updateSelectedImage({ scale }, { sync });\n };\n\n const updateImageFocusFromPointer = (\n event: React.PointerEvent<HTMLDivElement>,\n sync: boolean,\n ) => {\n const preview = imagePreviewRef.current;\n if (!preview) {\n return;\n }\n\n const rect = preview.getBoundingClientRect();\n const focusX = clampImageControl(\n ((event.clientX - rect.left) / rect.width) * 100,\n 0,\n 100,\n );\n const focusY = clampImageControl(\n ((event.clientY - rect.top) / rect.height) * 100,\n 0,\n 100,\n );\n\n setImageEditorDraft({ focusX, focusY });\n updateSelectedImage({ focusX, focusY }, { sync });\n };\n\n const handleImagePreviewPointerDown = (\n event: React.PointerEvent<HTMLDivElement>,\n ) => {\n if (!toolbarState.hasSelectedImage) {\n return;\n }\n\n imageDragPointerIdRef.current = event.pointerId;\n event.currentTarget.setPointerCapture(event.pointerId);\n updateImageFocusFromPointer(event, false);\n };\n\n const handleImagePreviewPointerMove = (\n event: React.PointerEvent<HTMLDivElement>,\n ) => {\n if (imageDragPointerIdRef.current !== event.pointerId) {\n return;\n }\n\n updateImageFocusFromPointer(event, false);\n };\n\n const handleImagePreviewPointerUp = (\n event: React.PointerEvent<HTMLDivElement>,\n ) => {\n if (imageDragPointerIdRef.current !== event.pointerId) {\n return;\n }\n\n imageDragPointerIdRef.current = null;\n event.currentTarget.releasePointerCapture(event.pointerId);\n updateImageFocusFromPointer(event, true);\n };\n\n const mutateSelectedTable = (\n mutation: (\n table: HTMLTableElement,\n row: HTMLTableRowElement,\n cell: HTMLTableCellElement,\n cellIndex: number,\n ) => void,\n ) => {\n if (!editorRef.current) {\n return;\n }\n\n restoreSelectionRange();\n const cell = getSelectedTableCell(editorRef.current, savedSelectionRef.current);\n const row = cell?.parentElement;\n const table = cell?.closest(\"table\");\n\n if (\n !cell ||\n !(row instanceof HTMLTableRowElement) ||\n !(table instanceof HTMLTableElement)\n ) {\n return;\n }\n\n const cellIndex = Array.from(row.cells).indexOf(cell);\n if (cellIndex < 0) {\n return;\n }\n\n mutation(table, row, cell, cellIndex);\n syncEditableSurface();\n };\n\n const handleAddTableRow = () => {\n mutateSelectedTable((table, row) => {\n const targetSection =\n row.parentElement?.tagName === \"THEAD\"\n ? table.tBodies[0] ?? table.appendChild(document.createElement(\"tbody\"))\n : row.parentElement;\n\n if (!(targetSection instanceof HTMLElement)) {\n return;\n }\n\n const sourceCells =\n Array.from(row.cells).length > 0\n ? Array.from(row.cells)\n : Array.from(table.rows[0]?.cells ?? []);\n const nextRow = document.createElement(\"tr\");\n\n const newCells =\n sourceCells.length > 0\n ? sourceCells\n : Array.from({ length: 3 }, () => document.createElement(\"td\"));\n\n newCells.forEach((sourceCell, index) => {\n const nextCell = document.createElement(\n targetSection.tagName === \"THEAD\" || sourceCell.tagName === \"TH\"\n ? \"th\"\n : \"td\",\n );\n nextCell.textContent = targetSection.tagName === \"THEAD\"\n ? `Heading ${index + 1}`\n : \"Value\";\n nextRow.appendChild(nextCell);\n });\n\n if (row.parentElement === targetSection && row.nextSibling) {\n targetSection.insertBefore(nextRow, row.nextSibling);\n } else {\n targetSection.appendChild(nextRow);\n }\n });\n };\n\n const handleAddTableColumn = () => {\n mutateSelectedTable((table, _row, _cell, cellIndex) => {\n Array.from(table.rows).forEach((tableRow) => {\n const insertionCell = tableRow.cells[cellIndex];\n const nextCell = document.createElement(\n tableRow.parentElement?.tagName === \"THEAD\" ||\n insertionCell?.tagName === \"TH\"\n ? \"th\"\n : \"td\",\n );\n\n nextCell.textContent =\n nextCell.tagName === \"TH\"\n ? `Heading ${cellIndex + 2}`\n : \"Value\";\n\n if (insertionCell?.nextSibling) {\n tableRow.insertBefore(nextCell, insertionCell.nextSibling);\n } else {\n tableRow.appendChild(nextCell);\n }\n });\n });\n };\n\n const handleDeleteTableRow = () => {\n mutateSelectedTable((table, row) => {\n row.remove();\n if (table.rows.length === 0) {\n table.remove();\n }\n });\n };\n\n const handleDeleteTableColumn = () => {\n mutateSelectedTable((table, _row, _cell, cellIndex) => {\n Array.from(table.rows).forEach((tableRow) => {\n if (tableRow.cells[cellIndex]) {\n tableRow.deleteCell(cellIndex);\n }\n });\n\n const hasCellsRemaining = Array.from(table.rows).some(\n (tableRow) => tableRow.cells.length > 0,\n );\n\n if (!hasCellsRemaining) {\n table.remove();\n }\n });\n };\n\n const isToolbarSectionOpen = (\n section: keyof ReturnType<typeof createCompactToolbarState>,\n ) => {\n return !isCompactToolbar || expandedToolbarSections[section];\n };\n\n const toggleToolbarSection = (\n section: keyof ReturnType<typeof createCompactToolbarState>,\n ) => {\n setExpandedToolbarSections((prev) => ({\n ...prev,\n [section]: !prev[section],\n }));\n };\n\n const renderToolbarSectionHeader = (\n section: keyof ReturnType<typeof createCompactToolbarState>,\n label: string,\n ) => {\n if (!isCompactToolbar) {\n return <span className=\"hv-richtext-toolbar-label\">{label}</span>;\n }\n\n const isOpen = isToolbarSectionOpen(section);\n\n return (\n <button\n type=\"button\"\n className={`hv-richtext-toolbar-section-toggle ${isOpen ? \"open\" : \"\"}`}\n aria-expanded={isOpen}\n onClick={() => toggleToolbarSection(section)}\n >\n <span className=\"hv-richtext-toolbar-label\">{label}</span>\n <span className=\"hv-richtext-toolbar-toggle-copy\">\n {isOpen\n ? props.locale[\"documents.richText.toolbar.collapseSection\"]\n : props.locale[\"documents.richText.toolbar.expandSection\"]}\n </span>\n </button>\n );\n };\n\n const applyTemplate = (templateId: string) => {\n const template = authoringTemplates.find((candidate) => candidate.id === templateId);\n if (!template) {\n return;\n }\n\n setEditableContentHtml(template.html);\n setContentHtml(template.html);\n setSelectedTemplateId(template.id);\n requestAnimationFrame(() => {\n editorRef.current?.focus();\n captureSelectionRange();\n refreshToolbarState();\n });\n };\n\n if (props.mode === \"view\" && useDocxPreviewView && !docxPreviewFailed) {\n return (\n <>\n <div className=\"hv-docx-preview-shell\" aria-hidden=\"true\">\n <div\n ref={docxPreviewRef}\n className=\"hv-docx-preview-host\"\n aria-label=\"DOCX document pages\"\n />\n </div>\n\n <div\n className={\n props.layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"\n }\n >\n {loading || isRenderingDocxPreview ? (\n <div className=\"hv-page-container hv-docx-page-surface\">\n <div className=\"hv-loading-copy\">\n {props.locale[\"documents.richText.renderingPages\"]}\n </div>\n </div>\n ) : (\n pagesToShow.map((pageNumber) => {\n const page = docxPages[pageNumber - 1];\n if (!page) {\n return null;\n }\n\n return (\n <div\n key={page.surfaceKey}\n className=\"hv-page-container hv-docx-page-surface\"\n >\n <img\n src={page.imageUrl}\n alt={`Document page ${pageNumber}`}\n className=\"hv-docx-page-image\"\n />\n <SignatureOverlay\n surfaceKey={page.surfaceKey}\n surfaceKind=\"document\"\n page={pageNumber}\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={\n props.signatureOverlay.annotationPlaceholder\n }\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n );\n })\n )}\n </div>\n </>\n );\n }\n\n if (props.mode === \"view\") {\n return (\n <>\n <div className=\"hv-docx-measure-shell\" aria-hidden=\"true\">\n <div\n ref={measureRef}\n className=\"hv-docx-content hv-docx-measure-content\"\n dangerouslySetInnerHTML={{ __html: contentHtml }}\n />\n </div>\n\n <div\n className={\n props.layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"\n }\n >\n {loading || isPaginating ? (\n <div className=\"hv-page-container hv-docx-page-surface\">\n <div className=\"hv-loading-copy\">\n {props.locale[\"documents.richText.renderingPages\"]}\n </div>\n </div>\n ) : (\n pagesToShow.map((pageNumber) => {\n const page = pages[pageNumber - 1];\n if (!page) {\n return null;\n }\n\n return (\n <div\n key={page.surfaceKey}\n className=\"hv-page-container hv-docx-page-surface\"\n >\n <img\n src={page.imageUrl}\n alt={`Document page ${pageNumber}`}\n className=\"hv-docx-page-image\"\n />\n <SignatureOverlay\n surfaceKey={page.surfaceKey}\n surfaceKind=\"document\"\n page={pageNumber}\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={\n props.signatureOverlay.annotationPlaceholder\n }\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={\n props.signatureOverlay.linkedAnnotationTitle\n }\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n );\n })\n )}\n </div>\n </>\n );\n }\n\n return (\n <div className=\"hv-view-single hv-richtext-authoring-shell\">\n <input\n ref={imageInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hv-richtext-file-input\"\n onChange={handleInsertImage}\n />\n {isAuthoringMode && (\n <div className=\"hv-richtext-authoring-top\">\n <div\n className=\"hv-richtext-toolbar\"\n role=\"toolbar\"\n aria-label={props.locale[\"a11y.ribbon\"]}\n >\n <div className=\"hv-richtext-toolbar-row\">\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"style\",\n props.locale[\"documents.richText.toolbar.styleLabel\"],\n )}\n {isToolbarSectionOpen(\"style\") && (\n <select\n className=\"hv-richtext-select\"\n value={toolbarState.blockTag}\n onChange={(event) =>\n applyAuthoringCommand(\n \"formatBlock\",\n event.target.value === \"blockquote\"\n ? \"BLOCKQUOTE\"\n : event.target.value.toUpperCase(),\n )\n }\n >\n <option value=\"p\">\n {props.locale[\"documents.richText.toolbar.paragraph\"]}\n </option>\n <option value=\"h1\">\n {props.locale[\"documents.richText.toolbar.heading1\"]}\n </option>\n <option value=\"h2\">\n {props.locale[\"documents.richText.toolbar.heading2\"]}\n </option>\n <option value=\"h3\">\n {props.locale[\"documents.richText.toolbar.heading3\"]}\n </option>\n <option value=\"blockquote\">\n {props.locale[\"documents.richText.toolbar.quote\"]}\n </option>\n </select>\n )}\n </div>\n\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"format\",\n props.locale[\"documents.richText.toolbar.formatLabel\"],\n )}\n {isToolbarSectionOpen(\"format\") && (\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.bold ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"bold\")}\n title={props.locale[\"documents.richText.toolbar.bold\"]}\n >\n B\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.italic ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"italic\")}\n title={props.locale[\"documents.richText.toolbar.italic\"]}\n >\n I\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.underline ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"underline\")}\n title={props.locale[\"documents.richText.toolbar.underline\"]}\n >\n U\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.unorderedList ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"insertUnorderedList\")}\n title={props.locale[\"documents.richText.toolbar.bullets\"]}\n >\n UL\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.orderedList ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"insertOrderedList\")}\n title={props.locale[\"documents.richText.toolbar.numbered\"]}\n >\n 1.\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.align === \"left\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"justifyLeft\")}\n title={props.locale[\"documents.richText.toolbar.alignLeft\"]}\n >\n L\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.align === \"center\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"justifyCenter\")}\n title={props.locale[\"documents.richText.toolbar.alignCenter\"]}\n >\n C\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.align === \"right\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => applyAuthoringCommand(\"justifyRight\")}\n title={props.locale[\"documents.richText.toolbar.alignRight\"]}\n >\n R\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => applyAuthoringCommand(\"removeFormat\")}\n title={props.locale[\"documents.richText.toolbar.clearFormatting\"]}\n >\n Tx\n </button>\n </div>\n )}\n </div>\n\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"insert\",\n props.locale[\"documents.richText.toolbar.insertLabel\"],\n )}\n {isToolbarSectionOpen(\"insert\") && (\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={insertLink}\n title={props.locale[\"documents.richText.toolbar.link\"]}\n >\n Link\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => insertAuthoringHtml(\"<hr />\")}\n title={props.locale[\"documents.richText.toolbar.divider\"]}\n >\n Rule\n </button>\n </div>\n )}\n </div>\n\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"media\",\n props.locale[\"documents.richText.toolbar.mediaLabel\"],\n )}\n {isToolbarSectionOpen(\"media\") && (\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleImagePickerOpen}\n title={props.locale[\"documents.richText.toolbar.image\"]}\n >\n Image\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => insertAuthoringHtml(createDefaultTableHtml())}\n title={props.locale[\"documents.richText.toolbar.table\"]}\n >\n Table\n </button>\n </div>\n )}\n </div>\n\n <div className=\"hv-richtext-toolbar-section\">\n {renderToolbarSectionHeader(\n \"history\",\n props.locale[\"documents.richText.toolbar.historyLabel\"],\n )}\n {isToolbarSectionOpen(\"history\") && (\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => applyAuthoringCommand(\"undo\")}\n title={props.locale[\"documents.richText.toolbar.undo\"]}\n >\n Undo\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={() => applyAuthoringCommand(\"redo\")}\n title={props.locale[\"documents.richText.toolbar.redo\"]}\n >\n Redo\n </button>\n </div>\n )}\n </div>\n </div>\n\n {toolbarState.hasSelectedImage && imageEditorState && (\n <div className=\"hv-richtext-context-panel\">\n <div className=\"hv-richtext-context-header\">\n <div>\n <strong>{props.locale[\"documents.richText.imageEditorTitle\"]}</strong>\n <p>{props.locale[\"documents.richText.imageEditorHelp\"]}</p>\n </div>\n </div>\n\n <div className=\"hv-richtext-image-editor\">\n <div className=\"hv-richtext-image-preview-card\">\n <div\n ref={imagePreviewRef}\n className={`hv-richtext-image-preview crop-${imageEditorState.crop}`}\n onPointerDown={handleImagePreviewPointerDown}\n onPointerMove={handleImagePreviewPointerMove}\n onPointerUp={handleImagePreviewPointerUp}\n onPointerCancel={handleImagePreviewPointerUp}\n >\n <img\n src={imageEditorState.src}\n alt={imageEditorState.alt}\n style={{\n transform: `scale(${imageEditorState.scale})`,\n objectPosition: `${imageEditorState.focusX}% ${imageEditorState.focusY}%`,\n }}\n />\n <div\n className=\"hv-richtext-image-focus-point\"\n style={{\n left: `${imageEditorState.focusX}%`,\n top: `${imageEditorState.focusY}%`,\n }}\n />\n </div>\n </div>\n\n <div className=\"hv-richtext-image-controls\">\n <div className=\"hv-richtext-toolbar-subgroup\">\n <span className=\"hv-richtext-toolbar-sublabel\">\n {props.locale[\"documents.richText.toolbar.imageSizeLabel\"]}\n </span>\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageSize === \"sm\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageSize(\"sm\")}\n >\n S\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageSize === \"md\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageSize(\"md\")}\n >\n M\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageSize === \"lg\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageSize(\"lg\")}\n >\n L\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageSize === \"full\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageSize(\"full\")}\n >\n Full\n </button>\n </div>\n </div>\n\n <div className=\"hv-richtext-toolbar-subgroup\">\n <span className=\"hv-richtext-toolbar-sublabel\">\n {props.locale[\"documents.richText.toolbar.imageCropLabel\"]}\n </span>\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageCrop === \"original\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageCrop(\"original\")}\n >\n Orig\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageCrop === \"wide\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageCrop(\"wide\")}\n >\n Wide\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageCrop === \"square\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageCrop(\"square\")}\n >\n 1:1\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageCrop === \"portrait\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageCrop(\"portrait\")}\n >\n Tall\n </button>\n </div>\n </div>\n\n <div className=\"hv-richtext-toolbar-subgroup\">\n <span className=\"hv-richtext-toolbar-sublabel\">\n {props.locale[\"documents.richText.toolbar.imageAlignLabel\"]}\n </span>\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageAlign === \"left\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageAlign(\"left\")}\n >\n Left\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageAlign === \"center\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageAlign(\"center\")}\n >\n Center\n </button>\n <button\n type=\"button\"\n className={`hv-btn ${toolbarState.imageAlign === \"right\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => handleSetImageAlign(\"right\")}\n >\n Right\n </button>\n </div>\n </div>\n\n <label className=\"hv-richtext-range-group\">\n <span>{props.locale[\"documents.richText.imageZoom\"]}</span>\n <input\n type=\"range\"\n min=\"1\"\n max=\"2.5\"\n step=\"0.05\"\n value={imageEditorState.scale}\n onChange={(event) =>\n handleImageScaleInput(Number(event.target.value), false)\n }\n onMouseUp={(event) =>\n handleImageScaleInput(\n Number((event.target as HTMLInputElement).value),\n true,\n )\n }\n onTouchEnd={(event) =>\n handleImageScaleInput(\n Number((event.target as HTMLInputElement).value),\n true,\n )\n }\n onKeyUp={(event) =>\n handleImageScaleInput(\n Number((event.target as HTMLInputElement).value),\n true,\n )\n }\n />\n <strong>{imageEditorState.scale.toFixed(2)}x</strong>\n </label>\n\n <div className=\"hv-richtext-focus-readout\">\n <span>X {Math.round(imageEditorState.focusX)}%</span>\n <span>Y {Math.round(imageEditorState.focusY)}%</span>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {!toolbarState.hasSelectedImage && toolbarState.insideTable && (\n <div className=\"hv-richtext-context-panel hv-richtext-context-panel-compact\">\n <div className=\"hv-richtext-toolbar-subgroup\">\n <span className=\"hv-richtext-toolbar-sublabel\">\n {props.locale[\"documents.richText.toolbar.tableLabel\"]}\n </span>\n <div className=\"hv-richtext-button-group\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleAddTableRow}\n title={props.locale[\"documents.richText.toolbar.tableAddRow\"]}\n >\n +Row\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleAddTableColumn}\n title={props.locale[\"documents.richText.toolbar.tableAddColumn\"]}\n >\n +Col\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleDeleteTableRow}\n title={props.locale[\"documents.richText.toolbar.tableDeleteRow\"]}\n >\n -Row\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={handleDeleteTableColumn}\n title={props.locale[\"documents.richText.toolbar.tableDeleteColumn\"]}\n >\n -Col\n </button>\n </div>\n </div>\n </div>\n )}\n\n {props.mode === \"create\" && (\n <div className=\"hv-richtext-template-panel\">\n <div className=\"hv-richtext-template-strip\">\n <span className=\"hv-richtext-template-label\">\n {props.locale[\"documents.richText.templates\"]}\n </span>\n <button\n type=\"button\"\n className=\"hv-btn hv-richtext-template-toggle\"\n onClick={() => setAreTemplatesVisible((prev) => !prev)}\n >\n {areTemplatesVisible\n ? props.locale[\"documents.richText.templatesHide\"]\n : props.locale[\"documents.richText.templatesShow\"]}\n </button>\n </div>\n {areTemplatesVisible && (\n <div className=\"hv-richtext-template-grid\">\n {authoringTemplates.map((template) => (\n <button\n key={template.id}\n type=\"button\"\n className={`hv-richtext-template-card ${selectedTemplateId === template.id ? \"active\" : \"\"}`}\n onClick={() => applyTemplate(template.id)}\n >\n <span className=\"hv-richtext-template-title\">\n {props.locale[template.labelKey]}\n </span>\n <span className=\"hv-richtext-template-description\">\n {props.locale[template.descriptionKey]}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )}\n\n <div className=\"hv-page-container hv-docx-page-surface\">\n {loading ? (\n <div className=\"hv-loading-copy\">\n {props.locale[\"documents.richText.processingText\"]}\n </div>\n ) : (\n <div className=\"hv-docx-editor-stage\">\n <div\n ref={editorRef}\n className=\"hv-docx-content\"\n contentEditable={isAuthoringMode}\n onInput={syncEditableSurface}\n onBlur={syncEditableSurface}\n onKeyUp={() => {\n captureSelectionRange();\n refreshToolbarState();\n }}\n onMouseUp={() => {\n captureSelectionRange();\n refreshToolbarState();\n }}\n onFocus={() => {\n captureSelectionRange();\n refreshToolbarState();\n }}\n suppressContentEditableWarning\n aria-label={props.locale[\"a11y.editor\"]}\n />\n <SignatureOverlay\n surfaceKey=\"document:main\"\n surfaceKind=\"document\"\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={props.signatureOverlay.annotationPlaceholder}\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { MessageSquare } from \"lucide-react\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n AnnotationPlacement,\n DocumentSurfaceOverlayState,\n SignaturePlacement,\n SignatureSurfaceKind,\n} from \"../types\";\nimport {\n normalizeSignatureDate,\n normalizeSignatureInkColor,\n SIGNATURE_INK_COLORS,\n SIGNATURE_INK_COLOR_VALUES,\n} from \"../utils/signature\";\n\ninterface SignatureOverlayProps extends DocumentSurfaceOverlayState {\n surfaceKey: string;\n surfaceKind: SignatureSurfaceKind;\n page?: number;\n slide?: number;\n sheetName?: string;\n}\n\ntype DragMode = \"move\" | \"resize\";\ntype DragTargetType = \"signature\" | \"annotation\";\n\ninterface DragState {\n id: string;\n targetType: DragTargetType;\n mode: DragMode;\n startClientX: number;\n startClientY: number;\n originX: number;\n originY: number;\n originWidth: number;\n originHeight: number;\n aspectRatio?: number;\n rect: DOMRect;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction getDefaultPlacementSize(kind: SignatureSurfaceKind) {\n switch (kind) {\n case \"sheet\":\n return { width: 0.3, height: 0.16 };\n case \"slide\":\n return { width: 0.34, height: 0.18 };\n case \"image\":\n return { width: 0.36, height: 0.18 };\n default:\n return { width: 0.34, height: 0.16 };\n }\n}\n\nfunction getDefaultAnnotationSize(kind: SignatureSurfaceKind) {\n switch (kind) {\n case \"sheet\":\n return { width: 0.2, height: 0.12 };\n case \"slide\":\n return { width: 0.22, height: 0.12 };\n case \"image\":\n return { width: 0.24, height: 0.12 };\n default:\n return { width: 0.26, height: 0.12 };\n }\n}\n\nfunction getLinkedAnnotationIds(annotations: AnnotationPlacement[]) {\n return new Set(\n annotations\n .filter((annotation) => annotation.linkedSignaturePlacementId)\n .map((annotation) => annotation.linkedSignaturePlacementId as string),\n );\n}\n\nfunction buildMaskImageValue(source: string) {\n return `url(\"${source.replaceAll('\"', '\\\\\"')}\")`;\n}\n\nexport function SignatureOverlay(props: SignatureOverlayProps) {\n const {\n surfaceKey,\n surfaceKind,\n page,\n slide,\n sheetName,\n placements,\n annotations,\n pendingSignature,\n pendingAnnotation,\n activePlacementId,\n activeAnnotationId,\n placeHint,\n annotationHint,\n annotationPlaceholder,\n signatureAltLabel,\n signatureAltByLabel,\n signatureNoteIndicatorLabel,\n signatureColorLabel,\n signatureColorNames,\n removeSignatureLabel,\n annotationTitle,\n linkedAnnotationTitle,\n linkedAnnotationBadge,\n openAnnotationLabel,\n removeAnnotationLabel,\n onPlaceSignature,\n onPlaceAnnotation,\n onUpdatePlacement,\n onUpdateAnnotation,\n onRemovePlacement,\n onRemoveAnnotation,\n onSelectPlacement,\n onSelectAnnotation,\n } = props;\n const layerRef = useRef<HTMLDivElement>(null);\n const [dragState, setDragState] = useState<DragState | null>(null);\n\n const visiblePlacements = useMemo(\n () => placements.filter((placement) => placement.surfaceKey === surfaceKey),\n [placements, surfaceKey],\n );\n const visibleAnnotations = useMemo(\n () =>\n annotations.filter((annotation) => annotation.surfaceKey === surfaceKey),\n [annotations, surfaceKey],\n );\n const linkedAnnotationIds = useMemo(\n () => getLinkedAnnotationIds(visibleAnnotations),\n [visibleAnnotations],\n );\n const captureMode = pendingSignature\n ? \"signature\"\n : pendingAnnotation\n ? \"annotation\"\n : null;\n\n useEffect(() => {\n if (captureMode || dragState) {\n return;\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as HTMLElement | null;\n if (\n target?.closest(\n \".hv-signature-stamp, .hv-annotation-card, .hv-annotation-chip, .hv-signature-overlay-capture\",\n )\n ) {\n return;\n }\n\n onSelectPlacement(null);\n onSelectAnnotation(null);\n };\n\n window.addEventListener(\"pointerdown\", handlePointerDown, true);\n\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown, true);\n };\n }, [captureMode, dragState, onSelectAnnotation, onSelectPlacement]);\n\n useEffect(() => {\n if (!dragState) {\n return;\n }\n\n const handlePointerMove = (event: PointerEvent) => {\n const rect = dragState.rect;\n const deltaX = (event.clientX - dragState.startClientX) / rect.width;\n const deltaY = (event.clientY - dragState.startClientY) / rect.height;\n\n if (dragState.mode === \"move\") {\n const nextX = clamp(\n dragState.originX + deltaX,\n 0,\n 1 - dragState.originWidth,\n );\n const nextY = clamp(\n dragState.originY + deltaY,\n 0,\n 1 - dragState.originHeight,\n );\n\n if (dragState.targetType === \"signature\") {\n onUpdatePlacement(dragState.id, { x: nextX, y: nextY });\n return;\n }\n\n onUpdateAnnotation(dragState.id, { x: nextX, y: nextY });\n return;\n }\n\n if (dragState.targetType === \"signature\") {\n const nextWidth = clamp(\n dragState.originWidth + deltaX,\n 0.08,\n 1 - dragState.originX,\n );\n const nextHeight = clamp(\n nextWidth / (dragState.aspectRatio || 3.1),\n 0.035,\n 1 - dragState.originY,\n );\n\n onUpdatePlacement(dragState.id, {\n width: nextWidth,\n height: nextHeight,\n });\n return;\n }\n\n const nextWidth = clamp(\n dragState.originWidth + deltaX,\n 0.12,\n 1 - dragState.originX,\n );\n const nextHeight = clamp(\n dragState.originHeight + deltaY,\n 0.08,\n 1 - dragState.originY,\n );\n\n onUpdateAnnotation(dragState.id, {\n width: nextWidth,\n height: nextHeight,\n });\n };\n\n const handlePointerUp = () => {\n setDragState(null);\n };\n\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [dragState, onUpdateAnnotation, onUpdatePlacement]);\n\n const handlePlace = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!layerRef.current || !captureMode) {\n return;\n }\n\n const rect = layerRef.current.getBoundingClientRect();\n const clickX = (event.clientX - rect.left) / rect.width;\n const clickY = (event.clientY - rect.top) / rect.height;\n\n if (captureMode === \"signature\" && pendingSignature) {\n const { width, height } = getDefaultPlacementSize(surfaceKind);\n\n onPlaceSignature({\n signature: pendingSignature,\n surfaceKey,\n surfaceKind,\n page,\n slide,\n sheetName,\n x: clamp(clickX - width / 2, 0, 1 - width),\n y: clamp(clickY - height / 2, 0, 1 - height),\n width,\n height,\n });\n return;\n }\n\n if (captureMode === \"annotation\") {\n const { width, height } = getDefaultAnnotationSize(surfaceKind);\n\n onPlaceAnnotation({\n surfaceKey,\n surfaceKind,\n page,\n slide,\n sheetName,\n x: clamp(clickX - width / 2, 0, 1 - width),\n y: clamp(clickY - height / 2, 0, 1 - height),\n width,\n height,\n text: \"\",\n });\n }\n };\n\n const beginDrag = (\n event: React.PointerEvent<HTMLElement>,\n target:\n | { kind: \"signature\"; item: SignaturePlacement }\n | { kind: \"annotation\"; item: AnnotationPlacement },\n mode: DragMode,\n ) => {\n if (!layerRef.current) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (target.kind === \"signature\") {\n onSelectPlacement(target.item.id);\n onSelectAnnotation(null);\n setDragState({\n id: target.item.id,\n targetType: \"signature\",\n mode,\n startClientX: event.clientX,\n startClientY: event.clientY,\n originX: target.item.x,\n originY: target.item.y,\n originWidth: target.item.width,\n originHeight: target.item.height,\n aspectRatio:\n target.item.width > 0 && target.item.height > 0\n ? target.item.width / target.item.height\n : 3.1,\n rect: layerRef.current.getBoundingClientRect(),\n });\n return;\n }\n\n onSelectAnnotation(target.item.id);\n onSelectPlacement(null);\n setDragState({\n id: target.item.id,\n targetType: \"annotation\",\n mode,\n startClientX: event.clientX,\n startClientY: event.clientY,\n originX: target.item.x,\n originY: target.item.y,\n originWidth: target.item.width,\n originHeight: target.item.height,\n rect: layerRef.current.getBoundingClientRect(),\n });\n };\n\n return (\n <div ref={layerRef} className=\"hv-signature-overlay\">\n {captureMode && (\n <div className=\"hv-signature-overlay-capture\" onClick={handlePlace}>\n <div className=\"hv-signature-overlay-hint\">\n {captureMode === \"annotation\" ? annotationHint : placeHint}\n </div>\n </div>\n )}\n\n {visiblePlacements.map((placement) => {\n const isActive = placement.id === activePlacementId;\n const hasLinkedAnnotation = linkedAnnotationIds.has(placement.id);\n const signer = placement.signature.signedBy?.trim();\n const jobTitle = placement.signature.jobTitle?.trim();\n const signedDate = normalizeSignatureDate(placement.signature.dateSigned);\n const signatureColor = normalizeSignatureInkColor(placement.signatureColor);\n const maskImage = buildMaskImageValue(placement.signature.signatureImageUrl);\n\n return (\n <div\n key={placement.id}\n className={`hv-signature-stamp ${isActive ? \"active\" : \"\"}`}\n style={{\n left: `${placement.x * 100}%`,\n top: `${placement.y * 100}%`,\n width: `${placement.width * 100}%`,\n height: `${placement.height * 100}%`,\n }}\n onPointerDown={(event) => {\n if (!isActive) {\n event.stopPropagation();\n onSelectPlacement(placement.id);\n onSelectAnnotation(null);\n return;\n }\n\n beginDrag(event, { kind: \"signature\", item: placement }, \"move\");\n }}\n onClick={(event) => {\n event.stopPropagation();\n onSelectPlacement(placement.id);\n onSelectAnnotation(null);\n }}\n >\n {isActive && (\n <button\n type=\"button\"\n className=\"hv-signature-remove\"\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.stopPropagation();\n onRemovePlacement(placement.id);\n }}\n aria-label={removeSignatureLabel}\n >\n x\n </button>\n )}\n\n <div className=\"hv-signature-image-wrap\">\n <div\n role=\"img\"\n aria-label={signer ? `${signatureAltByLabel} ${signer}` : signatureAltLabel}\n className=\"hv-signature-image hv-signature-ink\"\n style={{\n backgroundColor: SIGNATURE_INK_COLOR_VALUES[signatureColor],\n maskImage,\n WebkitMaskImage: maskImage,\n }}\n />\n </div>\n\n <div className=\"hv-signature-meta\">\n {signer && <span className=\"hv-signature-meta-name\">{signer}</span>}\n {jobTitle && (\n <span className=\"hv-signature-meta-jobtitle\">{jobTitle}</span>\n )}\n <span className=\"hv-signature-meta-date\">{signedDate}</span>\n </div>\n\n {hasLinkedAnnotation && (\n <div className=\"hv-signature-note-indicator\">\n {signatureNoteIndicatorLabel}\n </div>\n )}\n\n {isActive && (\n <div\n className=\"hv-signature-color-toolbar\"\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <span className=\"hv-signature-color-toolbar-label\">\n {signatureColorLabel}\n </span>\n <div className=\"hv-signature-color-swatch-row\">\n {SIGNATURE_INK_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n className={`hv-signature-color-swatch ${signatureColor === color ? \"active\" : \"\"}`}\n style={{ background: SIGNATURE_INK_COLOR_VALUES[color] }}\n aria-label={`${signatureColorLabel}: ${signatureColorNames[color]}`}\n title={signatureColorNames[color]}\n onClick={() =>\n onUpdatePlacement(placement.id, { signatureColor: color })\n }\n />\n ))}\n </div>\n </div>\n )}\n\n {isActive && (\n <div\n className=\"hv-signature-resize\"\n onPointerDown={(event) =>\n beginDrag(\n event,\n { kind: \"signature\", item: placement },\n \"resize\",\n )\n }\n />\n )}\n </div>\n );\n })}\n\n {visibleAnnotations.map((annotation) => {\n const isActive = annotation.id === activeAnnotationId;\n const isLinked = Boolean(annotation.linkedSignaturePlacementId);\n const hasText = annotation.text.trim().length > 0;\n\n if (!isActive) {\n return (\n <button\n key={annotation.id}\n type=\"button\"\n className={`hv-annotation-chip ${isLinked ? \"linked\" : \"\"} ${hasText ? \"\" : \"empty\"}`}\n style={{\n left: `${annotation.x * 100}%`,\n top: `${annotation.y * 100}%`,\n }}\n aria-label={hasText ? annotation.text : openAnnotationLabel}\n title={hasText ? annotation.text : openAnnotationLabel}\n onClick={(event) => {\n event.stopPropagation();\n onSelectAnnotation(annotation.id);\n onSelectPlacement(null);\n }}\n >\n <MessageSquare size={14} />\n </button>\n );\n }\n\n return (\n <div\n key={annotation.id}\n className={`hv-annotation-card ${isActive ? \"active\" : \"\"} ${isLinked ? \"linked\" : \"\"}`}\n style={{\n left: `${annotation.x * 100}%`,\n top: `${annotation.y * 100}%`,\n width: `${annotation.width * 100}%`,\n height: `${annotation.height * 100}%`,\n }}\n onClick={(event) => {\n event.stopPropagation();\n onSelectAnnotation(annotation.id);\n onSelectPlacement(null);\n }}\n >\n <div\n className=\"hv-annotation-header\"\n onPointerDown={(event) => {\n if (!isActive) {\n event.stopPropagation();\n onSelectAnnotation(annotation.id);\n onSelectPlacement(null);\n return;\n }\n\n beginDrag(\n event,\n { kind: \"annotation\", item: annotation },\n \"move\",\n );\n }}\n >\n <div className=\"hv-annotation-header-copy\">\n <span className=\"hv-annotation-title\">\n {isLinked ? linkedAnnotationTitle : annotationTitle}\n </span>\n {isLinked && (\n <span className=\"hv-annotation-badge\">{linkedAnnotationBadge}</span>\n )}\n </div>\n\n {isActive && (\n <button\n type=\"button\"\n className=\"hv-annotation-remove\"\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.stopPropagation();\n onRemoveAnnotation(annotation.id);\n }}\n aria-label={removeAnnotationLabel}\n >\n x\n </button>\n )}\n </div>\n\n <div className=\"hv-annotation-body\">\n {isActive ? (\n <textarea\n value={annotation.text}\n placeholder={annotationPlaceholder}\n className=\"hv-annotation-input\"\n autoFocus\n onChange={(event) =>\n onUpdateAnnotation(annotation.id, {\n text: event.target.value,\n })\n }\n onClick={(event) => {\n event.stopPropagation();\n }}\n />\n ) : (\n <div\n className={`hv-annotation-preview ${hasText ? \"\" : \"empty\"}`}\n >\n {hasText ? annotation.text : annotationPlaceholder}\n </div>\n )}\n </div>\n\n {isActive && (\n <div\n className=\"hv-annotation-resize\"\n onPointerDown={(event) =>\n beginDrag(\n event,\n { kind: \"annotation\", item: annotation },\n \"resize\",\n )\n }\n />\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport type {\n Signature,\n SignatureInkColor,\n SignaturePlacement,\n SignaturePlacementDraft,\n} from \"../types\";\n\nexport const SIGNATURE_INK_COLORS: SignatureInkColor[] = [\n \"black\",\n \"blue\",\n \"red\",\n \"green\",\n];\n\nexport const SIGNATURE_INK_COLOR_VALUES: Record<SignatureInkColor, string> = {\n black: \"#111827\",\n blue: \"#2563eb\",\n red: \"#dc2626\",\n green: \"#16a34a\",\n};\n\nconst DD_MM_YYYY_PATTERN = /^(\\d{2})-(\\d{2})-(\\d{4})$/;\n\nfunction padDatePart(value: number) {\n return String(value).padStart(2, \"0\");\n}\n\nfunction isValidDdMmYyyy(value: string) {\n const match = value.match(DD_MM_YYYY_PATTERN);\n if (!match) {\n return false;\n }\n\n const [, day, month, year] = match;\n const candidate = new Date(\n Number(year),\n Number(month) - 1,\n Number(day),\n );\n\n return (\n !Number.isNaN(candidate.getTime())\n && candidate.getDate() === Number(day)\n && candidate.getMonth() === Number(month) - 1\n && candidate.getFullYear() === Number(year)\n );\n}\n\nexport function formatDateAsDdMmYyyy(date: Date) {\n return [\n padDatePart(date.getDate()),\n padDatePart(date.getMonth() + 1),\n date.getFullYear(),\n ].join(\"-\");\n}\n\nexport function normalizeSignatureDate(value?: string) {\n const trimmedValue = value?.trim();\n if (!trimmedValue) {\n return formatDateAsDdMmYyyy(new Date());\n }\n\n if (isValidDdMmYyyy(trimmedValue)) {\n return trimmedValue;\n }\n\n const parsed = new Date(trimmedValue);\n if (Number.isNaN(parsed.getTime())) {\n return trimmedValue;\n }\n\n return formatDateAsDdMmYyyy(parsed);\n}\n\nexport function normalizeSignatureInkColor(value?: string | null): SignatureInkColor {\n switch (value) {\n case \"blue\":\n case \"red\":\n case \"green\":\n case \"black\":\n return value;\n default:\n return \"black\";\n }\n}\n\nexport function normalizeSignature(signature: Signature): Signature {\n return {\n ...signature,\n id: signature.id || `sig-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n signedBy: signature.signedBy?.trim() || undefined,\n jobTitle: signature.jobTitle?.trim() || undefined,\n dateSigned: normalizeSignatureDate(signature.dateSigned),\n };\n}\n\nexport function normalizeSignaturePlacement<T extends SignaturePlacement | SignaturePlacementDraft>(\n placement: T,\n): T {\n return {\n ...placement,\n signature: normalizeSignature(placement.signature),\n signatureColor: normalizeSignatureInkColor(placement.signatureColor),\n };\n}\n","\"use client\";\n\nimport { Document, ImageRun, Packer, PageBreak, Paragraph } from \"docx\";\nimport ExcelJS from \"exceljs\";\nimport html2canvas from \"html2canvas\";\nimport JSZip from \"jszip\";\nimport { PDFDocument } from \"pdf-lib\";\nimport { GlobalWorkerOptions, getDocument } from \"pdfjs-dist\";\nimport * as XLSX from \"xlsx\";\nimport type {\n PptxExportState,\n PptxParagraphModel,\n RichTextPageRenderModel,\n SpreadsheetExportState,\n SpreadsheetCellExportModel,\n SpreadsheetMergeModel,\n SpreadsheetSheetExportModel,\n} from \"../internal/exportModels\";\nimport type {\n AnnotationPlacement,\n LetterheadSectionTemplate,\n LetterheadTemplate,\n SignaturePlacement,\n SupportedFileType,\n} from \"../types\";\nimport { arrayBufferToBase64 } from \"./fileSource\";\nimport {\n normalizeSignatureDate,\n normalizeSignatureInkColor,\n SIGNATURE_INK_COLOR_VALUES,\n} from \"./signature\";\n\nconst EMU_PER_INCH = 914400;\nconst EMU_PER_PIXEL = 9525;\nconst SHEET_ROW_HEADER_WIDTH = 48;\nconst SHEET_COLUMN_HEADER_HEIGHT = 34;\nconst NS_PML = \"http://schemas.openxmlformats.org/presentationml/2006/main\";\nconst NS_DML = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst NS_SML = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst NS_XDR = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst NS_REL_OFFICE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst NS_REL_PACKAGE = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst REL_TYPE_IMAGE = `${NS_REL_OFFICE}/image`;\nconst REL_TYPE_DRAWING = `${NS_REL_OFFICE}/drawing`;\nconst REL_TYPE_SLIDE = `${NS_REL_OFFICE}/slide`;\nlet pdfWorkerBlobUrlPromise: Promise<string> | null = null;\n\ntype PptxSlideHandle = {\n background?: { color?: string };\n addImage: (options: Record<string, unknown>) => void;\n addText: (text: string, options: Record<string, unknown>) => void;\n addShape: (shape: string, options: Record<string, unknown>) => void;\n};\n\ntype PptxGenInstance = {\n layout: string;\n author?: string;\n subject?: string;\n title?: string;\n defineLayout: (options: { name: string; width: number; height: number }) => void;\n addSlide: () => PptxSlideHandle;\n write: (options: {\n outputType: \"base64\";\n compression?: boolean;\n }) => Promise<string> | string;\n};\n\ntype PptxGenConstructor = new () => PptxGenInstance;\n\ndeclare global {\n interface Window {\n PptxGenJS?: PptxGenConstructor;\n }\n}\n\nexport interface ExportedDocument {\n base64: string;\n fileName: string;\n fileType: SupportedFileType;\n mimeType: string;\n exportedAsPdf?: boolean;\n}\n\ninterface ExportLocaleLabels {\n annotationTitle: string;\n linkedAnnotationTitle: string;\n linkedAnnotationBadge: string;\n annotationAltLabel: string;\n linkedAnnotationAltLabel: string;\n}\n\nexport interface ExportPageDecorations {\n headerElement?: HTMLElement | null;\n footerElement?: HTMLElement | null;\n letterheadTemplate?: LetterheadTemplate;\n}\n\ninterface PreparedPageDecorations {\n headerCanvas?: HTMLCanvasElement | null;\n footerCanvas?: HTMLCanvasElement | null;\n}\n\ntype DecorationKind = \"header\" | \"footer\";\n\ntype CaptureStyleElement = HTMLElement | SVGElement;\n\nconst defaultExportLocaleLabels: ExportLocaleLabels = {\n annotationTitle: \"Annotation\",\n linkedAnnotationTitle: \"Signature Note\",\n linkedAnnotationBadge: \"Linked\",\n annotationAltLabel: \"Annotation\",\n linkedAnnotationAltLabel: \"Signature annotation\",\n};\n\nasync function ensurePdfWorker() {\n if (GlobalWorkerOptions.workerSrc) {\n return GlobalWorkerOptions.workerSrc;\n }\n\n if (!pdfWorkerBlobUrlPromise) {\n pdfWorkerBlobUrlPromise = import(\"../../generated/pdfWorkerBundle\")\n .then(({ pdfWorkerBundleSource }) =>\n URL.createObjectURL(\n new Blob([pdfWorkerBundleSource], { type: \"text/javascript\" }),\n ),\n )\n .catch((error) => {\n pdfWorkerBlobUrlPromise = null;\n throw error;\n });\n }\n\n GlobalWorkerOptions.workerSrc = await pdfWorkerBlobUrlPromise;\n return GlobalWorkerOptions.workerSrc;\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction stripHash(color?: string, fallback = \"000000\") {\n return (color || fallback).replace(/^#/, \"\");\n}\n\nfunction replaceExtension(fileName: string, extension: string) {\n const cleanExtension = extension.replace(/^\\./, \"\");\n if (!fileName.includes(\".\")) {\n return `${fileName}.${cleanExtension}`;\n }\n\n return fileName.replace(/\\.[^.]+$/, `.${cleanExtension}`);\n}\n\nfunction mimeTypeForFileType(fileType: SupportedFileType) {\n switch (fileType) {\n case \"pdf\":\n return \"application/pdf\";\n case \"doc\":\n case \"docx\":\n return \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n case \"xls\":\n case \"xlsx\":\n return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n case \"ppt\":\n case \"pptx\":\n return \"application/vnd.openxmlformats-officedocument.presentationml.presentation\";\n case \"txt\":\n return \"text/plain\";\n case \"md\":\n return \"text/markdown\";\n case \"rtf\":\n return \"application/rtf\";\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n case \"jpeg\":\n return \"image/jpeg\";\n case \"gif\":\n return \"image/gif\";\n case \"bmp\":\n return \"image/bmp\";\n case \"svg\":\n return \"image/svg+xml\";\n case \"csv\":\n return \"text/csv\";\n case \"xml\":\n return \"application/xml\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nfunction toArrayBuffer(value: ArrayBuffer | SharedArrayBuffer | Uint8Array) {\n if (value instanceof ArrayBuffer) {\n return value;\n }\n\n if (value instanceof Uint8Array) {\n return Uint8Array.from(value).buffer;\n }\n\n if (typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer) {\n return new Uint8Array(value).slice().buffer;\n }\n\n return new Uint8Array(value).slice().buffer;\n}\n\nfunction parseXmlDocument(xml: string) {\n return new DOMParser().parseFromString(xml, \"application/xml\");\n}\n\nfunction serializeXmlDocument(document: XMLDocument) {\n const xml = new XMLSerializer().serializeToString(document);\n return xml.startsWith(\"<?xml\")\n ? xml\n : `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${xml}`;\n}\n\nfunction resolveZipPath(basePath: string, target: string) {\n const normalizedBase = basePath.split(\"/\").filter(Boolean);\n normalizedBase.pop();\n\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n\n if (segment === \"..\") {\n normalizedBase.pop();\n } else {\n normalizedBase.push(segment);\n }\n }\n\n return normalizedBase.join(\"/\");\n}\n\nasync function ensureContentTypeDefault(\n zip: JSZip,\n extension: string,\n contentType: string,\n) {\n const contentTypesFile = zip.file(\"[Content_Types].xml\");\n if (!contentTypesFile) {\n return;\n }\n\n const contentTypesDoc = parseXmlDocument(await contentTypesFile.async(\"string\"));\n const root = contentTypesDoc.documentElement;\n if (!root) {\n return;\n }\n const namespace = root.namespaceURI ?? null;\n\n const existing = Array.from(\n root.getElementsByTagNameNS(namespace ?? \"*\", \"Default\"),\n ).some(\n (node) =>\n node.getAttribute(\"Extension\") === extension &&\n node.getAttribute(\"ContentType\") === contentType,\n );\n\n if (!existing) {\n const child = contentTypesDoc.createElementNS(namespace, \"Default\");\n child.setAttribute(\"Extension\", extension);\n child.setAttribute(\"ContentType\", contentType);\n root.appendChild(child);\n zip.file(\"[Content_Types].xml\", serializeXmlDocument(contentTypesDoc));\n }\n}\n\nasync function ensureContentTypeOverride(\n zip: JSZip,\n partName: string,\n contentType: string,\n) {\n const contentTypesFile = zip.file(\"[Content_Types].xml\");\n if (!contentTypesFile) {\n return;\n }\n\n const contentTypesDoc = parseXmlDocument(await contentTypesFile.async(\"string\"));\n const root = contentTypesDoc.documentElement;\n if (!root) {\n return;\n }\n const namespace = root.namespaceURI ?? null;\n\n const existing = Array.from(\n root.getElementsByTagNameNS(namespace ?? \"*\", \"Override\"),\n ).some(\n (node) =>\n node.getAttribute(\"PartName\") === partName &&\n node.getAttribute(\"ContentType\") === contentType,\n );\n\n if (!existing) {\n const child = contentTypesDoc.createElementNS(namespace, \"Override\");\n child.setAttribute(\"PartName\", partName);\n child.setAttribute(\"ContentType\", contentType);\n root.appendChild(child);\n zip.file(\"[Content_Types].xml\", serializeXmlDocument(contentTypesDoc));\n }\n}\n\nfunction getNextSequentialPath(\n zip: JSZip,\n directory: string,\n basename: string,\n extension: string,\n) {\n let index = 1;\n let nextPath = `${directory}/${basename}${index}.${extension}`;\n\n while (zip.file(nextPath)) {\n index += 1;\n nextPath = `${directory}/${basename}${index}.${extension}`;\n }\n\n return nextPath;\n}\n\nasync function getOrCreateRelationshipsDocument(zip: JSZip, relsPath: string) {\n const relsFile = zip.file(relsPath);\n if (relsFile) {\n return parseXmlDocument(await relsFile.async(\"string\"));\n }\n\n return parseXmlDocument(\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>',\n );\n}\n\nfunction getNextRelationshipId(document: XMLDocument) {\n const ids = Array.from(document.getElementsByTagName(\"Relationship\"))\n .map((node) => node.getAttribute(\"Id\") || \"\")\n .map((value) => Number(value.match(/(\\d+)$/)?.[1] || \"0\"));\n const next = (ids.length > 0 ? Math.max(...ids) : 0) + 1;\n return `rId${next}`;\n}\n\nfunction appendRelationship(\n document: XMLDocument,\n type: string,\n target: string,\n) {\n const root = document.documentElement;\n const relationship = document.createElementNS(NS_REL_PACKAGE, \"Relationship\");\n const nextId = getNextRelationshipId(document);\n relationship.setAttribute(\"Id\", nextId);\n relationship.setAttribute(\"Type\", type);\n relationship.setAttribute(\"Target\", target);\n root.appendChild(relationship);\n return nextId;\n}\n\nfunction getMaxAttributeNumber(\n document: XMLDocument,\n tagName: string,\n attribute: string,\n) {\n return Array.from(document.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === tagName)\n .map((element) => Number(element.getAttribute(attribute) || \"0\"))\n .reduce((max, value) => Math.max(max, value), 0);\n}\n\nfunction dataUrlToUint8Array(dataUrl: string) {\n const base64 = dataUrl.split(\",\")[1] || \"\";\n const binary = atob(base64);\n const output = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n output[index] = binary.charCodeAt(index);\n }\n return output;\n}\n\nasync function getOrderedPptSlidePaths(zip: JSZip) {\n const presentationXml = zip.file(\"ppt/presentation.xml\");\n const presentationRelsXml = zip.file(\"ppt/_rels/presentation.xml.rels\");\n if (!presentationXml || !presentationRelsXml) {\n return Object.keys(zip.files)\n .filter((path) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(path))\n .sort((left, right) => {\n const leftNumber = Number(left.match(/slide(\\d+)/)?.[1] || \"0\");\n const rightNumber = Number(right.match(/slide(\\d+)/)?.[1] || \"0\");\n return leftNumber - rightNumber;\n });\n }\n\n const presentationDoc = parseXmlDocument(await presentationXml.async(\"string\"));\n const relsDoc = parseXmlDocument(await presentationRelsXml.async(\"string\"));\n const relMap = new Map<string, string>();\n for (const node of Array.from(relsDoc.getElementsByTagName(\"Relationship\"))) {\n const id = node.getAttribute(\"Id\");\n const target = node.getAttribute(\"Target\");\n const type = node.getAttribute(\"Type\");\n if (!id || !target || type !== REL_TYPE_SLIDE) {\n continue;\n }\n relMap.set(id, resolveZipPath(\"ppt/presentation.xml\", target));\n }\n\n return Array.from(presentationDoc.getElementsByTagNameNS(NS_PML, \"sldId\"))\n .map((node) => node.getAttributeNS(NS_REL_OFFICE, \"id\") || node.getAttribute(\"r:id\"))\n .map((id) => (id ? relMap.get(id) : undefined))\n .filter((path): path is string => Boolean(path));\n}\n\nasync function getWorkbookSheetInfos(zip: JSZip) {\n const workbookXml = zip.file(\"xl/workbook.xml\");\n const workbookRelsXml = zip.file(\"xl/_rels/workbook.xml.rels\");\n if (!workbookXml || !workbookRelsXml) {\n return [];\n }\n\n const workbookDoc = parseXmlDocument(await workbookXml.async(\"string\"));\n const relsDoc = parseXmlDocument(await workbookRelsXml.async(\"string\"));\n const relMap = new Map<string, string>();\n for (const node of Array.from(relsDoc.getElementsByTagName(\"Relationship\"))) {\n const id = node.getAttribute(\"Id\");\n const target = node.getAttribute(\"Target\");\n if (!id || !target) {\n continue;\n }\n relMap.set(id, resolveZipPath(\"xl/workbook.xml\", target));\n }\n\n return Array.from(workbookDoc.getElementsByTagNameNS(NS_SML, \"sheet\"))\n .map((node) => ({\n name: node.getAttribute(\"name\") || \"\",\n path:\n relMap.get(\n node.getAttributeNS(NS_REL_OFFICE, \"id\") || node.getAttribute(\"r:id\") || \"\",\n ) || \"\",\n }))\n .filter((sheet) => sheet.name && sheet.path);\n}\n\nasync function getOrCreateSheetDrawingDocument(zip: JSZip, drawingPath: string) {\n const drawingFile = zip.file(drawingPath);\n if (drawingFile) {\n return parseXmlDocument(await drawingFile.async(\"string\"));\n }\n\n return parseXmlDocument(\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><xdr:wsDr xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"></xdr:wsDr>',\n );\n}\n\nfunction toRelativeZipTarget(fromPath: string, toPath: string) {\n const fromParts = fromPath.split(\"/\").filter(Boolean);\n const toParts = toPath.split(\"/\").filter(Boolean);\n fromParts.pop();\n\n while (fromParts.length > 0 && toParts.length > 0 && fromParts[0] === toParts[0]) {\n fromParts.shift();\n toParts.shift();\n }\n\n return `${\"../\".repeat(fromParts.length)}${toParts.join(\"/\")}`;\n}\n\nfunction pixelOffsetToAnchor(\n offset: number,\n sizes: number[],\n) {\n let remaining = Math.max(offset, 0);\n for (let index = 0; index < sizes.length; index += 1) {\n const size = Math.max(sizes[index] || 0, 1);\n if (remaining <= size || index === sizes.length - 1) {\n return {\n index,\n offsetEmu: Math.round(Math.min(remaining, size) * EMU_PER_PIXEL),\n };\n }\n remaining -= size;\n }\n\n return { index: 0, offsetEmu: 0 };\n}\n\nfunction buildSpreadsheetAnchor(\n x: number,\n y: number,\n width: number,\n height: number,\n colWidths: number[],\n rowHeights: number[],\n) {\n const fromCol = pixelOffsetToAnchor(x, colWidths);\n const fromRow = pixelOffsetToAnchor(y, rowHeights);\n const toCol = pixelOffsetToAnchor(x + width, colWidths);\n const toRow = pixelOffsetToAnchor(y + height, rowHeights);\n\n return {\n from: {\n col: fromCol.index,\n colOff: fromCol.offsetEmu,\n row: fromRow.index,\n rowOff: fromRow.offsetEmu,\n },\n to: {\n col: toCol.index,\n colOff: toCol.offsetEmu,\n row: toRow.index,\n rowOff: toRow.offsetEmu,\n },\n };\n}\n\nfunction appendTextElement(\n document: XMLDocument,\n parent: Element,\n namespace: string,\n qualifiedName: string,\n value: string | number,\n) {\n const element = document.createElementNS(namespace, qualifiedName);\n element.textContent = String(value);\n parent.appendChild(element);\n return element;\n}\n\nfunction createPptOverlayPictureNode(args: {\n document: XMLDocument;\n relationshipId: string;\n shapeId: number;\n name: string;\n x: number;\n y: number;\n width: number;\n height: number;\n description?: string;\n}) {\n const picture = args.document.createElementNS(NS_PML, \"p:pic\");\n const nvPicPr = args.document.createElementNS(NS_PML, \"p:nvPicPr\");\n const cNvPr = args.document.createElementNS(NS_PML, \"p:cNvPr\");\n cNvPr.setAttribute(\"id\", String(args.shapeId));\n cNvPr.setAttribute(\"name\", args.name);\n if (args.description) {\n cNvPr.setAttribute(\"descr\", args.description);\n }\n const cNvPicPr = args.document.createElementNS(NS_PML, \"p:cNvPicPr\");\n const picLocks = args.document.createElementNS(NS_DML, \"a:picLocks\");\n picLocks.setAttribute(\"noChangeAspect\", \"1\");\n cNvPicPr.appendChild(picLocks);\n const nvPr = args.document.createElementNS(NS_PML, \"p:nvPr\");\n nvPicPr.append(cNvPr, cNvPicPr, nvPr);\n\n const blipFill = args.document.createElementNS(NS_PML, \"p:blipFill\");\n const blip = args.document.createElementNS(NS_DML, \"a:blip\");\n blip.setAttributeNS(NS_REL_OFFICE, \"r:embed\", args.relationshipId);\n const stretch = args.document.createElementNS(NS_DML, \"a:stretch\");\n stretch.appendChild(args.document.createElementNS(NS_DML, \"a:fillRect\"));\n blipFill.append(blip, stretch);\n\n const spPr = args.document.createElementNS(NS_PML, \"p:spPr\");\n const xfrm = args.document.createElementNS(NS_DML, \"a:xfrm\");\n const off = args.document.createElementNS(NS_DML, \"a:off\");\n off.setAttribute(\"x\", String(Math.round(args.x)));\n off.setAttribute(\"y\", String(Math.round(args.y)));\n const ext = args.document.createElementNS(NS_DML, \"a:ext\");\n ext.setAttribute(\"cx\", String(Math.round(args.width)));\n ext.setAttribute(\"cy\", String(Math.round(args.height)));\n xfrm.append(off, ext);\n const presetGeometry = args.document.createElementNS(NS_DML, \"a:prstGeom\");\n presetGeometry.setAttribute(\"prst\", \"rect\");\n presetGeometry.appendChild(args.document.createElementNS(NS_DML, \"a:avLst\"));\n spPr.append(xfrm, presetGeometry);\n\n picture.append(nvPicPr, blipFill, spPr);\n return picture;\n}\n\nfunction createWorksheetOverlayNode(args: {\n document: XMLDocument;\n relationshipId: string;\n shapeId: number;\n name: string;\n anchor: ReturnType<typeof buildSpreadsheetAnchor>;\n description?: string;\n}) {\n const anchor = args.document.createElementNS(NS_XDR, \"xdr:twoCellAnchor\");\n anchor.setAttribute(\"editAs\", \"oneCell\");\n\n const from = args.document.createElementNS(NS_XDR, \"xdr:from\");\n appendTextElement(args.document, from, NS_XDR, \"xdr:col\", args.anchor.from.col);\n appendTextElement(args.document, from, NS_XDR, \"xdr:colOff\", args.anchor.from.colOff);\n appendTextElement(args.document, from, NS_XDR, \"xdr:row\", args.anchor.from.row);\n appendTextElement(args.document, from, NS_XDR, \"xdr:rowOff\", args.anchor.from.rowOff);\n\n const to = args.document.createElementNS(NS_XDR, \"xdr:to\");\n appendTextElement(args.document, to, NS_XDR, \"xdr:col\", args.anchor.to.col);\n appendTextElement(args.document, to, NS_XDR, \"xdr:colOff\", args.anchor.to.colOff);\n appendTextElement(args.document, to, NS_XDR, \"xdr:row\", args.anchor.to.row);\n appendTextElement(args.document, to, NS_XDR, \"xdr:rowOff\", args.anchor.to.rowOff);\n\n const pic = args.document.createElementNS(NS_XDR, \"xdr:pic\");\n const nvPicPr = args.document.createElementNS(NS_XDR, \"xdr:nvPicPr\");\n const cNvPr = args.document.createElementNS(NS_XDR, \"xdr:cNvPr\");\n cNvPr.setAttribute(\"id\", String(args.shapeId));\n cNvPr.setAttribute(\"name\", args.name);\n if (args.description) {\n cNvPr.setAttribute(\"descr\", args.description);\n }\n const cNvPicPr = args.document.createElementNS(NS_XDR, \"xdr:cNvPicPr\");\n nvPicPr.append(cNvPr, cNvPicPr);\n\n const blipFill = args.document.createElementNS(NS_XDR, \"xdr:blipFill\");\n const blip = args.document.createElementNS(NS_DML, \"a:blip\");\n blip.setAttributeNS(NS_REL_OFFICE, \"r:embed\", args.relationshipId);\n const stretch = args.document.createElementNS(NS_DML, \"a:stretch\");\n stretch.appendChild(args.document.createElementNS(NS_DML, \"a:fillRect\"));\n blipFill.append(blip, stretch);\n\n const spPr = args.document.createElementNS(NS_XDR, \"xdr:spPr\");\n const presetGeometry = args.document.createElementNS(NS_DML, \"a:prstGeom\");\n presetGeometry.setAttribute(\"prst\", \"rect\");\n presetGeometry.appendChild(args.document.createElementNS(NS_DML, \"a:avLst\"));\n spPr.appendChild(presetGeometry);\n\n pic.append(nvPicPr, blipFill, spPr);\n anchor.append(from, to, pic, args.document.createElementNS(NS_XDR, \"xdr:clientData\"));\n return anchor;\n}\n\nfunction getDirectChildElementsByLocalName(\n parent: ParentNode,\n localName: string,\n) {\n return Array.from(parent.childNodes).filter(\n (node): node is Element =>\n node.nodeType === 1 && (node as Element).localName === localName,\n );\n}\n\nfunction getWorksheetChildElement(worksheet: Element, localName: string) {\n return getDirectChildElementsByLocalName(worksheet, localName)[0];\n}\n\nfunction removeElementChildrenByLocalName(\n parent: Element,\n localNames: string[],\n) {\n for (const child of Array.from(parent.childNodes)) {\n if (\n child.nodeType === 1 &&\n localNames.includes((child as Element).localName || \"\")\n ) {\n parent.removeChild(child);\n }\n }\n}\n\nfunction getOrCreateWorksheetSheetData(\n document: XMLDocument,\n worksheet: Element,\n) {\n const existing = getWorksheetChildElement(worksheet, \"sheetData\");\n if (existing) {\n return existing;\n }\n\n const sheetData = document.createElementNS(NS_SML, \"sheetData\");\n const insertionPointNames = new Set([\n \"sheetCalcPr\",\n \"sheetProtection\",\n \"protectedRanges\",\n \"scenarios\",\n \"autoFilter\",\n \"sortState\",\n \"dataConsolidate\",\n \"customSheetViews\",\n \"mergeCells\",\n \"phoneticPr\",\n \"conditionalFormatting\",\n \"dataValidations\",\n \"hyperlinks\",\n \"printOptions\",\n \"pageMargins\",\n \"pageSetup\",\n \"headerFooter\",\n \"rowBreaks\",\n \"colBreaks\",\n \"customProperties\",\n \"cellWatches\",\n \"ignoredErrors\",\n \"smartTags\",\n \"drawing\",\n \"legacyDrawing\",\n \"legacyDrawingHF\",\n \"picture\",\n \"oleObjects\",\n \"controls\",\n \"webPublishItems\",\n \"tableParts\",\n \"extLst\",\n ]);\n const nextSibling = Array.from(worksheet.childNodes).find(\n (node) =>\n node.nodeType === 1 &&\n insertionPointNames.has((node as Element).localName || \"\"),\n );\n\n if (nextSibling) {\n worksheet.insertBefore(sheetData, nextSibling);\n } else {\n worksheet.appendChild(sheetData);\n }\n\n return sheetData;\n}\n\nfunction getOrCreateWorksheetRow(\n document: XMLDocument,\n sheetData: Element,\n rowNumber: number,\n) {\n const rows = getDirectChildElementsByLocalName(sheetData, \"row\");\n\n for (const row of rows) {\n const existingNumber = Number(row.getAttribute(\"r\") || \"0\");\n if (existingNumber === rowNumber) {\n return row;\n }\n if (existingNumber > rowNumber) {\n const nextRow = document.createElementNS(NS_SML, \"row\");\n nextRow.setAttribute(\"r\", String(rowNumber));\n sheetData.insertBefore(nextRow, row);\n return nextRow;\n }\n }\n\n const newRow = document.createElementNS(NS_SML, \"row\");\n newRow.setAttribute(\"r\", String(rowNumber));\n sheetData.appendChild(newRow);\n return newRow;\n}\n\nfunction getOrCreateWorksheetCell(\n document: XMLDocument,\n row: Element,\n address: string,\n) {\n const targetColumn = XLSX.utils.decode_cell(address).c;\n const cells = getDirectChildElementsByLocalName(row, \"c\");\n\n for (const cell of cells) {\n const reference = cell.getAttribute(\"r\");\n if (reference === address) {\n return cell;\n }\n\n if (!reference) {\n continue;\n }\n\n const currentColumn = XLSX.utils.decode_cell(reference).c;\n if (currentColumn > targetColumn) {\n const nextCell = document.createElementNS(NS_SML, \"c\");\n nextCell.setAttribute(\"r\", address);\n row.insertBefore(nextCell, cell);\n return nextCell;\n }\n }\n\n const newCell = document.createElementNS(NS_SML, \"c\");\n newCell.setAttribute(\"r\", address);\n row.appendChild(newCell);\n return newCell;\n}\n\nfunction createSpreadsheetInlineStringNode(\n document: XMLDocument,\n value: string,\n) {\n const inlineString = document.createElementNS(NS_SML, \"is\");\n const text = document.createElementNS(NS_SML, \"t\");\n if (/^\\s|\\s$|\\n/.test(value)) {\n text.setAttributeNS(\n \"http://www.w3.org/XML/1998/namespace\",\n \"xml:space\",\n \"preserve\",\n );\n }\n text.textContent = value;\n inlineString.appendChild(text);\n return inlineString;\n}\n\nfunction setSpreadsheetCellValue(\n document: XMLDocument,\n cell: Element,\n model: SpreadsheetCellExportModel,\n) {\n removeElementChildrenByLocalName(cell, [\"f\", \"v\", \"is\"]);\n\n if (model.valueKind === \"blank\") {\n cell.removeAttribute(\"t\");\n return;\n }\n\n if (model.valueKind === \"formula\" && model.formula) {\n const formula = document.createElementNS(NS_SML, \"f\");\n formula.textContent = model.formula;\n cell.appendChild(formula);\n\n if (typeof model.result === \"number\") {\n cell.removeAttribute(\"t\");\n appendTextElement(document, cell, NS_SML, \"v\", model.result);\n return;\n }\n\n if (typeof model.result === \"boolean\") {\n cell.setAttribute(\"t\", \"b\");\n appendTextElement(document, cell, NS_SML, \"v\", model.result ? 1 : 0);\n return;\n }\n\n if (typeof model.result === \"string\") {\n cell.setAttribute(\"t\", \"str\");\n appendTextElement(document, cell, NS_SML, \"v\", model.result);\n return;\n }\n\n cell.removeAttribute(\"t\");\n return;\n }\n\n if (model.valueKind === \"number\" && typeof model.value === \"number\") {\n cell.removeAttribute(\"t\");\n appendTextElement(document, cell, NS_SML, \"v\", model.value);\n return;\n }\n\n if (model.valueKind === \"boolean\" && typeof model.value === \"boolean\") {\n cell.setAttribute(\"t\", \"b\");\n appendTextElement(document, cell, NS_SML, \"v\", model.value ? 1 : 0);\n return;\n }\n\n const stringValue =\n typeof model.displayValue === \"string\" && model.displayValue.length > 0\n ? model.displayValue\n : typeof model.value === \"string\"\n ? model.value\n : isRecord(model.value) && typeof model.value.text === \"string\"\n ? model.value.text\n : model.value == null\n ? \"\"\n : String(model.value);\n\n cell.setAttribute(\"t\", \"inlineStr\");\n cell.appendChild(createSpreadsheetInlineStringNode(document, stringValue));\n}\n\nfunction removeWorksheetHyperlinksForAddress(\n worksheet: Element,\n address: string,\n) {\n const hyperlinks = getWorksheetChildElement(worksheet, \"hyperlinks\");\n if (!hyperlinks) {\n return;\n }\n\n for (const hyperlink of getDirectChildElementsByLocalName(\n hyperlinks,\n \"hyperlink\",\n )) {\n if (hyperlink.getAttribute(\"ref\") === address) {\n hyperlinks.removeChild(hyperlink);\n }\n }\n\n if (getDirectChildElementsByLocalName(hyperlinks, \"hyperlink\").length === 0) {\n worksheet.removeChild(hyperlinks);\n }\n}\n\nfunction applySpreadsheetWorksheetEdit(args: {\n document: XMLDocument;\n worksheet: Element;\n sheetData: Element;\n address: string;\n cellModel?: SpreadsheetCellExportModel;\n}) {\n const decoded = XLSX.utils.decode_cell(args.address);\n const rowNumber = decoded.r + 1;\n const existingRow = getDirectChildElementsByLocalName(args.sheetData, \"row\").find(\n (candidate) => Number(candidate.getAttribute(\"r\") || \"0\") === rowNumber,\n );\n const row =\n existingRow ||\n (args.cellModel\n ? getOrCreateWorksheetRow(args.document, args.sheetData, rowNumber)\n : null);\n const existingCell = row\n ? getDirectChildElementsByLocalName(row, \"c\").find(\n (cell) => cell.getAttribute(\"r\") === args.address,\n )\n : undefined;\n\n if (!args.cellModel) {\n if (existingCell) {\n row!.removeChild(existingCell);\n }\n removeWorksheetHyperlinksForAddress(args.worksheet, args.address);\n return;\n }\n\n const cell =\n existingCell ||\n getOrCreateWorksheetCell(args.document, row!, args.address);\n setSpreadsheetCellValue(args.document, cell, args.cellModel);\n\n if (!args.cellModel.hyperlink) {\n removeWorksheetHyperlinksForAddress(args.worksheet, args.address);\n }\n}\n\nasync function markWorkbookForFullCalculation(zip: JSZip) {\n const workbookFile = zip.file(\"xl/workbook.xml\");\n if (!workbookFile) {\n return;\n }\n\n const workbookDoc = parseXmlDocument(await workbookFile.async(\"string\"));\n const workbook = workbookDoc.getElementsByTagNameNS(NS_SML, \"workbook\")[0];\n if (!workbook) {\n return;\n }\n\n let calcPr = getDirectChildElementsByLocalName(workbook, \"calcPr\")[0];\n if (!calcPr) {\n calcPr = workbookDoc.createElementNS(NS_SML, \"calcPr\");\n workbook.appendChild(calcPr);\n }\n\n calcPr.setAttribute(\"calcMode\", \"auto\");\n calcPr.setAttribute(\"calcId\", \"0\");\n calcPr.setAttribute(\"fullCalcOnLoad\", \"1\");\n calcPr.setAttribute(\"forceFullCalc\", \"1\");\n\n zip.file(\"xl/workbook.xml\", serializeXmlDocument(workbookDoc));\n}\n\nfunction ensureImageSource(source: string) {\n const trimmedSource = source.trim();\n if (\n trimmedSource.startsWith(\"data:\") ||\n trimmedSource.startsWith(\"blob:\") ||\n trimmedSource.startsWith(\"http:\")\n || trimmedSource.startsWith(\"https:\")\n ) {\n return trimmedSource;\n }\n\n if (trimmedSource.startsWith(\"//\") && typeof window !== \"undefined\") {\n return `${window.location.protocol}${trimmedSource}`;\n }\n\n if (\n typeof window !== \"undefined\"\n && (\n trimmedSource.startsWith(\"/\")\n || trimmedSource.startsWith(\"./\")\n || trimmedSource.startsWith(\"../\")\n )\n ) {\n return new URL(trimmedSource, window.location.origin).toString();\n }\n\n if (\n trimmedSource.startsWith(\"<svg\")\n || (trimmedSource.startsWith(\"<?xml\") && trimmedSource.includes(\"<svg\"))\n ) {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(trimmedSource)}`;\n }\n\n return `data:image/png;base64,${trimmedSource}`;\n}\n\nfunction createCanvas(width: number, height: number) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(width));\n canvas.height = Math.max(1, Math.round(height));\n return canvas;\n}\n\nfunction roundedRectPath(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n) {\n const safeRadius = Math.min(radius, width / 2, height / 2);\n ctx.beginPath();\n ctx.moveTo(x + safeRadius, y);\n ctx.arcTo(x + width, y, x + width, y + height, safeRadius);\n ctx.arcTo(x + width, y + height, x, y + height, safeRadius);\n ctx.arcTo(x, y + height, x, y, safeRadius);\n ctx.arcTo(x, y, x + width, y, safeRadius);\n ctx.closePath();\n}\n\nasync function loadImage(source: string) {\n const image = new Image();\n image.crossOrigin = \"anonymous\";\n image.decoding = \"async\";\n\n await new Promise<void>((resolve, reject) => {\n image.onload = () => resolve();\n image.onerror = () => reject(new Error(\"Unable to load an image asset.\"));\n image.src = ensureImageSource(source);\n });\n\n if (\"decode\" in image) {\n try {\n await image.decode();\n } catch {\n // The load event already completed successfully.\n }\n }\n\n return image;\n}\n\nasync function tryLoadImage(source: string) {\n try {\n return await loadImage(source);\n } catch {\n return null;\n }\n}\n\nfunction getOpaqueImageBounds(\n image: HTMLImageElement,\n alphaThreshold = 8,\n) {\n const canvas = createCanvas(image.width, image.height);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return {\n sx: 0,\n sy: 0,\n sw: image.width,\n sh: image.height,\n };\n }\n\n ctx.drawImage(image, 0, 0, image.width, image.height);\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\n let minX = canvas.width;\n let minY = canvas.height;\n let maxX = -1;\n let maxY = -1;\n\n for (let y = 0; y < canvas.height; y += 1) {\n for (let x = 0; x < canvas.width; x += 1) {\n const alpha = imageData[(y * canvas.width + x) * 4 + 3];\n if (alpha <= alphaThreshold) {\n continue;\n }\n\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n }\n\n if (maxX < minX || maxY < minY) {\n return {\n sx: 0,\n sy: 0,\n sw: image.width,\n sh: image.height,\n };\n }\n\n const padding = Math.max(6, Math.round(Math.max(image.width, image.height) * 0.04));\n const sx = Math.max(0, minX - padding);\n const sy = Math.max(0, minY - padding);\n\n return {\n sx,\n sy,\n sw: Math.min(image.width - sx, maxX - minX + 1 + padding * 2),\n sh: Math.min(image.height - sy, maxY - minY + 1 + padding * 2),\n };\n}\n\nasync function canvasToBlob(\n canvas: HTMLCanvasElement,\n type: string,\n quality?: number,\n) {\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Unable to generate the export file.\"));\n return;\n }\n\n resolve(blob);\n },\n type,\n quality,\n );\n });\n}\n\nasync function blobToBase64(blob: Blob) {\n return arrayBufferToBase64(await blob.arrayBuffer());\n}\n\nconst UNSUPPORTED_COLOR_FUNCTION_PATTERN = /\\b(?:oklch|oklab|color)\\(/i;\nlet colorNormalizationElement: HTMLDivElement | null = null;\n\nfunction getColorNormalizationElement() {\n if (\n colorNormalizationElement &&\n typeof document !== \"undefined\" &&\n document.body.contains(colorNormalizationElement)\n ) {\n return colorNormalizationElement;\n }\n\n const element = document.createElement(\"div\");\n element.setAttribute(\"aria-hidden\", \"true\");\n element.style.position = \"fixed\";\n element.style.left = \"-200vw\";\n element.style.top = \"0\";\n element.style.opacity = \"0\";\n element.style.pointerEvents = \"none\";\n document.body.appendChild(element);\n colorNormalizationElement = element;\n return colorNormalizationElement;\n}\n\nfunction normalizeColorToken(token: string) {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return token;\n }\n\n const element = getColorNormalizationElement();\n const previous = element.style.color;\n\n try {\n element.style.color = \"\";\n element.style.color = token;\n const normalized = window.getComputedStyle(element).color;\n return normalized || token;\n } catch {\n element.style.color = previous;\n return token;\n } finally {\n element.style.color = previous;\n }\n}\n\nfunction normalizeCssColorFunctions(value: string) {\n if (!UNSUPPORTED_COLOR_FUNCTION_PATTERN.test(value)) {\n return value;\n }\n\n let cursor = 0;\n let normalized = \"\";\n\n while (cursor < value.length) {\n const match = value\n .slice(cursor)\n .match(/\\b(?:oklch|oklab|color)\\(/i);\n\n if (!match || match.index == null) {\n normalized += value.slice(cursor);\n break;\n }\n\n const start = cursor + match.index;\n normalized += value.slice(cursor, start);\n\n let depth = 0;\n let end = start;\n for (; end < value.length; end += 1) {\n const char = value[end];\n if (char === \"(\") {\n depth += 1;\n } else if (char === \")\") {\n depth -= 1;\n if (depth === 0) {\n end += 1;\n break;\n }\n }\n }\n\n const token = value.slice(start, end);\n normalized += normalizeColorToken(token);\n cursor = end;\n }\n\n return normalized;\n}\n\nfunction isCaptureStyleElement(node: Element | null): node is CaptureStyleElement {\n return Boolean(\n node && (node instanceof HTMLElement || node instanceof SVGElement),\n );\n}\n\nfunction applyComputedStylesToClone(\n source: CaptureStyleElement,\n target: CaptureStyleElement,\n) {\n const computed = window.getComputedStyle(source);\n\n for (const propertyName of Array.from(computed)) {\n if (propertyName.startsWith(\"--\")) {\n continue;\n }\n\n const value = computed.getPropertyValue(propertyName);\n if (!value) {\n continue;\n }\n\n target.style.setProperty(\n propertyName,\n normalizeCssColorFunctions(value),\n computed.getPropertyPriority(propertyName),\n );\n }\n\n target.style.setProperty(\"animation\", \"none\");\n target.style.setProperty(\"transition\", \"none\");\n target.style.setProperty(\"caret-color\", \"transparent\");\n}\n\nfunction createCaptureClone(element: HTMLElement) {\n const bounds = element.getBoundingClientRect();\n const width = Math.max(\n 1,\n Math.round(Math.max(bounds.width, element.scrollWidth, element.offsetWidth)),\n );\n const height = Math.max(\n 1,\n Math.round(Math.max(bounds.height, element.scrollHeight, element.offsetHeight)),\n );\n\n const host = document.createElement(\"div\");\n host.style.position = \"fixed\";\n host.style.left = \"-200vw\";\n host.style.top = \"0\";\n host.style.opacity = \"0\";\n host.style.pointerEvents = \"none\";\n host.style.zIndex = \"-1\";\n host.style.width = `${width}px`;\n host.style.height = `${height}px`;\n host.style.overflow = \"hidden\";\n\n const clone = element.cloneNode(true) as HTMLElement;\n host.appendChild(clone);\n document.body.appendChild(host);\n\n const walk = (sourceNode: Element, targetNode: Element) => {\n if (isCaptureStyleElement(sourceNode) && isCaptureStyleElement(targetNode)) {\n if (sourceNode instanceof HTMLElement && targetNode instanceof HTMLElement) {\n targetNode.setAttribute(\"data-hv-source-class\", sourceNode.className);\n }\n targetNode.removeAttribute(\"class\");\n targetNode.removeAttribute(\"style\");\n targetNode.removeAttribute(\"id\");\n applyComputedStylesToClone(sourceNode, targetNode);\n }\n\n const sourceChildren = Array.from(sourceNode.children);\n const targetChildren = Array.from(targetNode.children);\n for (let index = 0; index < sourceChildren.length; index += 1) {\n const sourceChild = sourceChildren[index];\n const targetChild = targetChildren[index];\n if (!sourceChild || !targetChild) {\n continue;\n }\n walk(sourceChild, targetChild);\n }\n };\n\n walk(element, clone);\n\n return {\n clone,\n width,\n height,\n cleanup: () => host.remove(),\n };\n}\n\nfunction createNormalizedStyleDeclaration(\n style: CSSStyleDeclaration,\n): CSSStyleDeclaration {\n return new Proxy(style, {\n get(target, property) {\n if (property === \"getPropertyValue\") {\n return (name: string) => normalizeCssColorFunctions(target.getPropertyValue(name));\n }\n\n if (property === \"item\") {\n return (index: number) => target.item(index);\n }\n\n if (property === Symbol.iterator) {\n return target[Symbol.iterator].bind(target);\n }\n\n const value = Reflect.get(target, property, target);\n if (typeof value === \"string\") {\n return normalizeCssColorFunctions(value);\n }\n\n if (typeof value === \"function\") {\n return value.bind(target);\n }\n\n return value;\n },\n }) as CSSStyleDeclaration;\n}\n\nasync function withNormalizedComputedStyles<T>(action: () => Promise<T>) {\n if (typeof window === \"undefined\") {\n return action();\n }\n\n const originalGetComputedStyle = window.getComputedStyle.bind(window);\n window.getComputedStyle = ((element: Element, pseudoElt?: string | null) =>\n createNormalizedStyleDeclaration(\n originalGetComputedStyle(element, pseudoElt ?? null),\n )) as typeof window.getComputedStyle;\n\n try {\n return await action();\n } finally {\n window.getComputedStyle = originalGetComputedStyle;\n }\n}\n\nexport async function captureElementCanvas(\n element: HTMLElement,\n options?: {\n backgroundColor?: string | null;\n scale?: number;\n ignoreElements?: (element: Element) => boolean;\n sanitizeStyles?: boolean;\n },\n) {\n const bounds = element.getBoundingClientRect();\n const width = Math.max(\n 1,\n Math.round(Math.max(bounds.width, element.scrollWidth, element.offsetWidth)),\n );\n const height = Math.max(\n 1,\n Math.round(Math.max(bounds.height, element.scrollHeight, element.offsetHeight)),\n );\n\n if (width < 2 || height < 2) {\n return null;\n }\n\n const captureOptions = {\n backgroundColor: options?.backgroundColor ?? null,\n scale: options?.scale ?? 2,\n useCORS: true,\n logging: false,\n width,\n height,\n windowWidth: width,\n windowHeight: height,\n ignoreElements: options?.ignoreElements,\n };\n\n if (options?.sanitizeStyles === false) {\n return html2canvas(element, captureOptions);\n }\n\n const snapshot = createCaptureClone(element);\n\n if (snapshot.width < 2 || snapshot.height < 2) {\n snapshot.cleanup();\n return null;\n }\n\n try {\n return await withNormalizedComputedStyles(() =>\n html2canvas(snapshot.clone, {\n ...captureOptions,\n width: snapshot.width,\n height: snapshot.height,\n windowWidth: snapshot.width,\n windowHeight: snapshot.height,\n }),\n );\n } finally {\n snapshot.cleanup();\n }\n}\n\nfunction getSimpleDecorationLines(element: HTMLElement, kind: DecorationKind) {\n const rawText = (element.innerText || element.textContent || \"\").replace(/\\u00a0/g, \" \");\n const maxLines = kind === \"header\" ? 4 : 3;\n\n return rawText\n .split(/\\r?\\n+/)\n .map((line) => line.replace(/\\s+/g, \" \").trim())\n .filter(Boolean)\n .slice(0, maxLines);\n}\n\nasync function loadDecorationLogo(element: HTMLElement) {\n const image = element.querySelector(\"img\");\n const source = image?.getAttribute(\"src\") || image?.getAttribute(\"data-src\") || \"\";\n if (!source || typeof window === \"undefined\") {\n return null;\n }\n\n try {\n return await Promise.race([\n loadImage(source),\n new Promise<null>((resolve) => {\n window.setTimeout(() => resolve(null), 1200);\n }),\n ]);\n } catch {\n return null;\n }\n}\n\nasync function loadDecorationLogoSource(source?: string) {\n if (!source) {\n return null;\n }\n\n try {\n return await Promise.race([\n loadImage(source),\n new Promise<null>((resolve) => {\n window.setTimeout(() => resolve(null), 1200);\n }),\n ]);\n } catch {\n return null;\n }\n}\n\nfunction buildTemplateDecorationModel(\n section: LetterheadSectionTemplate | undefined,\n kind: DecorationKind,\n) {\n if (!section) {\n return null;\n }\n\n const lineQueue = (section.lines || []).map((line) => line.trim()).filter(Boolean);\n const titleSeed = section.brandName?.trim() || section.title?.trim() || lineQueue.shift() || \"\";\n const subtitleLines = [\n ...(section.brandName && section.title ? [section.title.trim()] : []),\n ...(section.subtitle?.trim() ? [section.subtitle.trim()] : []),\n ...lineQueue,\n ].filter(Boolean);\n\n if (!titleSeed && subtitleLines.length === 0 && !section.logoUrl) {\n return null;\n }\n\n return {\n logoUrl: section.logoUrl,\n primaryLine: titleSeed,\n secondaryLines: subtitleLines,\n align: section.align ?? \"left\",\n layout: section.layout ?? (section.logoUrl ? \"logo-left\" : \"text-only\"),\n textColor: section.textColor,\n subtextColor: section.subtextColor,\n accentColor: section.accentColor,\n dividerColor: section.dividerColor,\n backgroundColor: section.backgroundColor,\n badgeText: kind === \"header\" ? section.badgeText?.trim() : undefined,\n };\n}\n\nasync function renderDecorationCanvasFromModel(\n model: ReturnType<typeof buildTemplateDecorationModel>,\n kind: DecorationKind,\n) {\n if (!model) {\n return null;\n }\n\n const logo = await loadDecorationLogoSource(model.logoUrl);\n if (!model.primaryLine && model.secondaryLines.length === 0 && !logo) {\n return null;\n }\n\n const canvasWidth = 1600;\n const canvasHeight = kind === \"header\" ? 146 : 88;\n const canvas = createCanvas(canvasWidth, canvasHeight);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n return null;\n }\n\n const accentColor = model.accentColor || \"#bfd4ff\";\n const dividerColor = model.dividerColor || (kind === \"header\" ? \"#dbe7ff\" : \"#d6dee8\");\n const textColor = model.textColor || (kind === \"header\" ? \"#0f172a\" : \"#1f2937\");\n const subtextColor = model.subtextColor || \"#64748b\";\n const background = ctx.createLinearGradient(0, 0, canvas.width, canvas.height);\n background.addColorStop(0, model.backgroundColor || \"#ffffff\");\n background.addColorStop(1, kind === \"header\" ? \"#fbfcff\" : \"#ffffff\");\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n\n const hasLogo = Boolean(logo) && model.layout !== \"text-only\";\n const isStacked = model.layout === \"stacked\";\n const horizontalPadding = 56;\n const logoSlotWidth = hasLogo && !isStacked ? 142 : 0;\n const align = model.align;\n const badgeText = kind === \"header\" ? model.badgeText || \"\" : \"\";\n let badgeMetrics: { width: number; height: number; x: number; y: number } | null = null;\n\n if (badgeText) {\n ctx.save();\n ctx.font = \"600 11px Arial, sans-serif\";\n const badgePaddingX = 11;\n const badgeHeight = 22;\n const badgeWidth = ctx.measureText(badgeText).width + badgePaddingX * 2;\n const badgeX =\n align === \"center\" && !hasLogo\n ? canvas.width / 2 - badgeWidth / 2\n : canvas.width - horizontalPadding - badgeWidth;\n const badgeY = kind === \"header\" ? 24 : 28;\n badgeMetrics = {\n width: badgeWidth,\n height: badgeHeight,\n x: badgeX,\n y: badgeY,\n };\n ctx.restore();\n }\n\n const textX = horizontalPadding + logoSlotWidth;\n const textWidth =\n align === \"center\" && !hasLogo\n ? canvas.width - horizontalPadding * 2\n : canvas.width\n - textX\n - horizontalPadding\n - (badgeMetrics ? badgeMetrics.width + 28 : 0);\n const textAnchor = align === \"center\" && !hasLogo ? canvas.width / 2 : textX;\n\n ctx.fillStyle = kind === \"header\" ? \"#edf4ff\" : \"#f3f6fa\";\n ctx.fillRect(0, 0, canvas.width, kind === \"header\" ? 6 : 3);\n\n if (logo) {\n const maxLogoWidth = kind === \"header\" ? 104 : 72;\n const maxLogoHeight = kind === \"header\" ? 76 : 42;\n const scale = Math.min(maxLogoWidth / logo.width, maxLogoHeight / logo.height, 1);\n const drawWidth = Math.max(1, Math.round(logo.width * scale));\n const drawHeight = Math.max(1, Math.round(logo.height * scale));\n const logoX =\n isStacked || align === \"center\"\n ? canvas.width / 2 - drawWidth / 2\n : horizontalPadding;\n const logoY = kind === \"header\" ? 18 : Math.round((canvas.height - drawHeight) / 2);\n ctx.drawImage(logo, logoX, logoY, drawWidth, drawHeight);\n }\n\n const primaryLine = model.primaryLine;\n const secondaryLines = model.secondaryLines;\n const titleY = kind === \"header\" ? (isStacked && hasLogo ? 108 : 46) : 46;\n const secondaryStartY = kind === \"header\" ? titleY + 24 : 64;\n const titleFont =\n kind === \"header\"\n ? \"700 31px Georgia, 'Times New Roman', serif\"\n : \"600 16px Georgia, 'Times New Roman', serif\";\n const bodyFont =\n kind === \"header\" ? \"500 13px Arial, sans-serif\" : \"500 12px Arial, sans-serif\";\n\n ctx.textAlign = align === \"center\" && !hasLogo ? \"center\" : \"left\";\n ctx.textBaseline = \"alphabetic\";\n\n if (primaryLine) {\n ctx.fillStyle = textColor;\n ctx.font = titleFont;\n ctx.fillText(primaryLine, textAnchor, titleY, textWidth);\n }\n\n if (kind === \"header\") {\n const extraLines = secondaryLines.slice();\n const underlineWidth = Math.min(108, Math.max(52, primaryLine.length * 6.3));\n const underlineStartX =\n align === \"center\" && !hasLogo\n ? canvas.width / 2 - underlineWidth / 2\n : textX;\n\n if (primaryLine) {\n ctx.strokeStyle = accentColor;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(underlineStartX, titleY + 10);\n ctx.lineTo(underlineStartX + underlineWidth, titleY + 10);\n ctx.stroke();\n }\n\n const subtitleStartY = primaryLine ? titleY + 30 : 46;\n const subtitleLineHeight = 17;\n\n ctx.fillStyle = subtextColor;\n ctx.font = bodyFont;\n extraLines.forEach((line, index) => {\n ctx.fillText(line, textAnchor, subtitleStartY + index * subtitleLineHeight, textWidth);\n });\n\n if (badgeText) {\n const safeBadge = badgeMetrics || {\n width: 0,\n height: 22,\n x: canvas.width - horizontalPadding - 80,\n y: 24,\n };\n ctx.save();\n roundedRectPath(\n ctx,\n safeBadge.x,\n safeBadge.y,\n safeBadge.width,\n safeBadge.height,\n safeBadge.height / 2,\n );\n ctx.fillStyle = \"#f4f7ff\";\n ctx.fill();\n ctx.strokeStyle = accentColor;\n ctx.lineWidth = 1;\n ctx.stroke();\n ctx.fillStyle = subtextColor;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = \"600 11px Arial, sans-serif\";\n ctx.fillText(\n badgeText,\n safeBadge.x + safeBadge.width / 2,\n safeBadge.y + safeBadge.height / 2,\n );\n ctx.restore();\n }\n } else {\n ctx.fillStyle = subtextColor;\n ctx.font = bodyFont;\n secondaryLines.forEach((line, index) => {\n ctx.fillText(line, textAnchor, secondaryStartY + index * 16, textWidth);\n });\n }\n\n ctx.strokeStyle = dividerColor;\n ctx.lineWidth = kind === \"header\" ? 1.25 : 1;\n ctx.beginPath();\n if (kind === \"header\") {\n ctx.moveTo(horizontalPadding, canvas.height - 8);\n ctx.lineTo(canvas.width - horizontalPadding, canvas.height - 8);\n } else {\n ctx.moveTo(horizontalPadding, 14);\n ctx.lineTo(canvas.width - horizontalPadding, 14);\n }\n ctx.stroke();\n\n return canvas;\n}\n\nasync function renderSimpleDecorationCanvas(\n element: HTMLElement,\n kind: DecorationKind,\n) {\n const lines = getSimpleDecorationLines(element, kind);\n const align =\n (window.getComputedStyle(element).textAlign || \"\").toLowerCase() === \"center\"\n ? \"center\"\n : \"left\";\n\n return renderDecorationCanvasFromModel(\n buildTemplateDecorationModel(\n {\n logoUrl:\n element.querySelector(\"img\")?.getAttribute(\"src\")\n || element.querySelector(\"img\")?.getAttribute(\"data-src\")\n || undefined,\n brandName: lines[0],\n lines: lines.slice(1),\n align,\n },\n kind,\n ),\n kind,\n );\n}\n\nasync function captureDecorationCanvas(\n element: HTMLElement | null | undefined,\n kind: DecorationKind,\n) {\n if (!element) {\n return null;\n }\n\n const simpleCanvas = await renderSimpleDecorationCanvas(element, kind);\n if (simpleCanvas) {\n return simpleCanvas;\n }\n\n return captureElementCanvas(element, {\n backgroundColor: null,\n scale: 1.5,\n });\n}\n\nasync function preparePageDecorations(\n decorations?: ExportPageDecorations,\n): Promise<PreparedPageDecorations | null> {\n if (\n !decorations?.headerElement\n && !decorations?.footerElement\n && !decorations?.letterheadTemplate?.header\n && !decorations?.letterheadTemplate?.footer\n ) {\n return null;\n }\n\n const [headerCanvas, footerCanvas] = await Promise.all([\n decorations?.letterheadTemplate?.header\n ? renderDecorationCanvasFromModel(\n buildTemplateDecorationModel(decorations.letterheadTemplate.header, \"header\"),\n \"header\",\n )\n : captureDecorationCanvas(decorations?.headerElement, \"header\"),\n decorations?.letterheadTemplate?.footer\n ? renderDecorationCanvasFromModel(\n buildTemplateDecorationModel(decorations.letterheadTemplate.footer, \"footer\"),\n \"footer\",\n )\n : captureDecorationCanvas(decorations?.footerElement, \"footer\"),\n ]);\n\n if (!headerCanvas && !footerCanvas) {\n return null;\n }\n\n return {\n headerCanvas,\n footerCanvas,\n };\n}\n\nfunction getDecorationHeight(\n decorationCanvas: HTMLCanvasElement | null | undefined,\n pageWidth: number,\n maxHeight: number,\n) {\n if (!decorationCanvas || decorationCanvas.width <= 0 || decorationCanvas.height <= 0) {\n return 0;\n }\n\n const scaledHeight = decorationCanvas.height * (pageWidth / decorationCanvas.width);\n return Math.max(1, Math.min(maxHeight, scaledHeight));\n}\n\nfunction applyPageDecorationsToCanvas(\n baseCanvas: HTMLCanvasElement,\n decorations?: PreparedPageDecorations | null,\n) {\n if (!decorations?.headerCanvas && !decorations?.footerCanvas) {\n return baseCanvas;\n }\n\n const pageCanvas = createCanvas(baseCanvas.width, baseCanvas.height);\n const ctx = pageCanvas.getContext(\"2d\");\n\n if (!ctx) {\n return baseCanvas;\n }\n\n const pageWidth = pageCanvas.width;\n const pageHeight = pageCanvas.height;\n const sectionGap = Math.max(3, Math.round(pageHeight * 0.0045));\n const headerHeight = getDecorationHeight(\n decorations.headerCanvas,\n pageWidth,\n pageHeight * 0.105,\n );\n const footerHeight = getDecorationHeight(\n decorations.footerCanvas,\n pageWidth,\n pageHeight * 0.08,\n );\n const reservedHeight =\n headerHeight +\n footerHeight +\n (headerHeight ? sectionGap : 0) +\n (footerHeight ? sectionGap : 0);\n const availableHeight = Math.max(pageHeight - reservedHeight, pageHeight * 0.56);\n const contentScale = Math.min(1, availableHeight / baseCanvas.height);\n const contentWidth = baseCanvas.width * contentScale;\n const contentHeight = baseCanvas.height * contentScale;\n const contentX = (pageWidth - contentWidth) / 2;\n const contentY =\n headerHeight +\n (headerHeight ? sectionGap : 0) +\n Math.max((availableHeight - contentHeight) / 2, 0) * 0.08;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, pageWidth, pageHeight);\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n\n if (decorations.headerCanvas && headerHeight > 0) {\n ctx.drawImage(decorations.headerCanvas, 0, 0, pageWidth, headerHeight);\n }\n\n ctx.drawImage(baseCanvas, contentX, contentY, contentWidth, contentHeight);\n\n if (decorations.footerCanvas && footerHeight > 0) {\n ctx.drawImage(\n decorations.footerCanvas,\n 0,\n pageHeight - footerHeight,\n pageWidth,\n footerHeight,\n );\n }\n\n return pageCanvas;\n}\n\nfunction formatSignedDate(value: string) {\n return normalizeSignatureDate(value);\n}\n\nfunction createTintedImageCanvas(\n image: HTMLImageElement,\n signatureColor: string,\n) {\n const tintedCanvas = createCanvas(image.width, image.height);\n const tintedCtx = tintedCanvas.getContext(\"2d\");\n if (!tintedCtx) {\n return null;\n }\n\n tintedCtx.drawImage(image, 0, 0);\n tintedCtx.globalCompositeOperation = \"source-in\";\n tintedCtx.fillStyle = signatureColor;\n tintedCtx.fillRect(0, 0, tintedCanvas.width, tintedCanvas.height);\n tintedCtx.globalCompositeOperation = \"source-over\";\n return tintedCanvas;\n}\n\nasync function drawSignatureStamp(\n ctx: CanvasRenderingContext2D,\n placement: SignaturePlacement,\n x: number,\n y: number,\n width: number,\n height: number,\n options?: {\n borderless?: boolean;\n },\n) {\n const isSlideStamp = placement.surfaceKind === \"slide\";\n const borderless = options?.borderless ?? false;\n const radius = Math.max(8, Math.min(width, height) * 0.08);\n const padding = isSlideStamp ? Math.max(4, width * 0.026) : Math.max(7, width * 0.048);\n const footerHeight = Math.max(\n isSlideStamp ? 46 : 40,\n height * (isSlideStamp ? 0.36 : 0.32),\n );\n const signatureImage = await loadImage(placement.signature.signatureImageUrl);\n const signatureColor = normalizeSignatureInkColor(placement.signatureColor);\n const tintedSignatureImage = createTintedImageCanvas(\n signatureImage,\n SIGNATURE_INK_COLOR_VALUES[signatureColor],\n );\n const imageBounds = getOpaqueImageBounds(signatureImage);\n const signer = placement.signature.signedBy?.trim() || \"\";\n const jobTitle = placement.signature.jobTitle?.trim() || \"\";\n const signedDate = formatSignedDate(placement.signature.dateSigned);\n\n if (!isSlideStamp && !borderless) {\n ctx.save();\n ctx.shadowColor = \"rgba(15, 23, 42, 0.18)\";\n ctx.shadowBlur = Math.max(8, width * 0.08);\n ctx.shadowOffsetY = Math.max(4, height * 0.03);\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.fillStyle = \"rgba(255, 255, 255, 0.96)\";\n ctx.fill();\n ctx.restore();\n\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.lineWidth = Math.max(1, width * 0.01);\n ctx.strokeStyle = \"rgba(30, 41, 59, 0.22)\";\n ctx.stroke();\n }\n\n const imageAreaWidth = width - padding * 2;\n const imageAreaHeight = height - footerHeight - padding * (isSlideStamp ? 0.8 : 1.2);\n const imageScale = Math.min(\n imageAreaWidth / imageBounds.sw,\n imageAreaHeight / imageBounds.sh,\n );\n const imageWidth = imageBounds.sw * imageScale;\n const imageHeight = imageBounds.sh * imageScale;\n const imageX = x + (width - imageWidth) / 2;\n const imageBaseY = isSlideStamp ? y : y + padding;\n const imageY =\n imageBaseY +\n Math.max(imageAreaHeight - imageHeight, 0) * (isSlideStamp ? 0.7 : 0.18);\n\n ctx.drawImage(\n tintedSignatureImage || signatureImage,\n imageBounds.sx,\n imageBounds.sy,\n imageBounds.sw,\n imageBounds.sh,\n imageX,\n imageY,\n imageWidth,\n imageHeight,\n );\n\n const footerY = y + height - footerHeight;\n const nameFontSize = Math.max(\n isSlideStamp ? 16 : 12,\n height * (isSlideStamp ? 0.102 : 0.08),\n );\n const jobTitleFontSize = Math.max(\n isSlideStamp ? 13 : 10,\n height * (isSlideStamp ? 0.088 : 0.066),\n );\n const dateFontSize = Math.max(\n isSlideStamp ? 12 : 9,\n height * (isSlideStamp ? 0.08 : 0.058),\n );\n const footerLineGap = Math.max(3, height * 0.018);\n let footerTextY = footerY + Math.max(4, padding * 0.16);\n\n ctx.fillStyle = \"#334155\";\n ctx.textBaseline = \"top\";\n if (signer) {\n ctx.font = `700 ${nameFontSize}px Arial, sans-serif`;\n ctx.fillText(signer, x + padding, footerTextY, width * 0.78);\n footerTextY += nameFontSize + footerLineGap;\n }\n\n if (jobTitle) {\n ctx.font = `700 ${jobTitleFontSize}px Arial, sans-serif`;\n ctx.fillText(jobTitle, x + padding, footerTextY, width * 0.78);\n footerTextY += jobTitleFontSize + footerLineGap;\n }\n\n ctx.font = `500 ${dateFontSize}px Arial, sans-serif`;\n ctx.fillText(signedDate, x + padding, footerTextY, width * 0.78);\n}\n\nasync function drawPlacementsOnCanvas(\n ctx: CanvasRenderingContext2D,\n placements: SignaturePlacement[],\n surfaceWidth: number,\n surfaceHeight: number,\n options?: {\n borderless?: boolean;\n },\n) {\n for (const placement of placements) {\n await drawSignatureStamp(\n ctx,\n placement,\n placement.x * surfaceWidth,\n placement.y * surfaceHeight,\n placement.width * surfaceWidth,\n placement.height * surfaceHeight,\n options,\n );\n }\n}\n\nfunction clipRoundedRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n) {\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.clip();\n}\n\nfunction wrapTextToWidth(\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number,\n) {\n const lines: string[] = [];\n const paragraphs = text.split(/\\r?\\n/);\n\n for (const paragraph of paragraphs) {\n const words = paragraph.trim().split(/\\s+/).filter(Boolean);\n\n if (words.length === 0) {\n lines.push(\"\");\n continue;\n }\n\n let currentLine = \"\";\n\n for (const word of words) {\n const nextLine = currentLine ? `${currentLine} ${word}` : word;\n if (ctx.measureText(nextLine).width <= maxWidth) {\n currentLine = nextLine;\n continue;\n }\n\n if (currentLine) {\n lines.push(currentLine);\n }\n\n if (ctx.measureText(word).width <= maxWidth) {\n currentLine = word;\n continue;\n }\n\n let remaining = word;\n while (remaining.length > 0) {\n let sliceLength = remaining.length;\n while (\n sliceLength > 1\n && ctx.measureText(remaining.slice(0, sliceLength)).width > maxWidth\n ) {\n sliceLength -= 1;\n }\n lines.push(remaining.slice(0, sliceLength));\n remaining = remaining.slice(sliceLength);\n }\n currentLine = \"\";\n }\n\n if (currentLine) {\n lines.push(currentLine);\n }\n }\n\n return lines;\n}\n\nfunction drawEmptyAnnotationLines(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n lineHeight: number,\n) {\n ctx.save();\n ctx.strokeStyle = \"rgba(180, 83, 9, 0.32)\";\n ctx.lineWidth = Math.max(1, lineHeight * 0.08);\n\n for (let index = 0; index < 3; index += 1) {\n const lineY = y + index * lineHeight;\n ctx.beginPath();\n ctx.moveTo(x, lineY);\n ctx.lineTo(x + width * (index === 2 ? 0.68 : 1), lineY);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\nasync function drawAnnotationCard(\n ctx: CanvasRenderingContext2D,\n annotation: AnnotationPlacement,\n x: number,\n y: number,\n width: number,\n height: number,\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n) {\n const radius = Math.max(10, Math.min(width, height) * 0.08);\n const padding = Math.max(10, width * 0.065);\n const headerHeight = Math.max(26, Math.min(height * 0.28, 42));\n const title = annotation.linkedSignaturePlacementId\n ? labels.linkedAnnotationTitle\n : labels.annotationTitle;\n const bodyText = annotation.text.trim();\n\n ctx.save();\n ctx.shadowColor = \"rgba(15, 23, 42, 0.14)\";\n ctx.shadowBlur = Math.max(8, width * 0.08);\n ctx.shadowOffsetY = Math.max(4, height * 0.03);\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.fillStyle = annotation.linkedSignaturePlacementId\n ? \"rgba(254, 249, 195, 0.98)\"\n : \"rgba(255, 251, 235, 0.98)\";\n ctx.fill();\n ctx.restore();\n\n ctx.save();\n clipRoundedRect(ctx, x, y, width, height, radius);\n ctx.fillStyle = \"rgba(245, 158, 11, 0.18)\";\n ctx.fillRect(x, y, width, headerHeight);\n ctx.restore();\n\n roundedRectPath(ctx, x, y, width, height, radius);\n ctx.lineWidth = Math.max(1, width * 0.008);\n ctx.strokeStyle = \"rgba(217, 119, 6, 0.34)\";\n ctx.stroke();\n\n const titleFontSize = Math.max(10, height * 0.085);\n ctx.fillStyle = \"#92400e\";\n ctx.font = `700 ${titleFontSize}px Arial, sans-serif`;\n ctx.textBaseline = \"middle\";\n ctx.fillText(title, x + padding, y + headerHeight / 2);\n\n if (annotation.linkedSignaturePlacementId) {\n const badge = labels.linkedAnnotationBadge;\n const badgeFontSize = Math.max(9, titleFontSize * 0.82);\n ctx.font = `700 ${badgeFontSize}px Arial, sans-serif`;\n const badgeWidth = ctx.measureText(badge).width + 16;\n const badgeHeight = Math.max(18, badgeFontSize * 1.9);\n const badgeX = x + width - padding - badgeWidth;\n const badgeY = y + (headerHeight - badgeHeight) / 2;\n roundedRectPath(ctx, badgeX, badgeY, badgeWidth, badgeHeight, badgeHeight / 2);\n ctx.fillStyle = \"rgba(217, 119, 6, 0.12)\";\n ctx.fill();\n ctx.fillStyle = \"#b45309\";\n ctx.textAlign = \"center\";\n ctx.fillText(badge, badgeX + badgeWidth / 2, badgeY + badgeHeight / 2);\n ctx.textAlign = \"left\";\n }\n\n const bodyFontSize = Math.max(11, height * 0.085);\n const lineHeight = bodyFontSize * 1.35;\n const bodyX = x + padding;\n const bodyY = y + headerHeight + padding * 0.65;\n const maxTextWidth = Math.max(width - padding * 2, 10);\n const maxLines = Math.max(\n 1,\n Math.floor((height - headerHeight - padding * 1.4) / lineHeight),\n );\n\n if (!bodyText) {\n drawEmptyAnnotationLines(\n ctx,\n bodyX,\n bodyY + lineHeight * 0.3,\n maxTextWidth,\n lineHeight,\n );\n return;\n }\n\n const lines = wrapTextToWidth(ctx, bodyText, maxTextWidth).slice(0, maxLines);\n ctx.fillStyle = \"#451a03\";\n ctx.font = `500 ${bodyFontSize}px Arial, sans-serif`;\n ctx.textBaseline = \"top\";\n\n for (const [index, line] of lines.entries()) {\n ctx.fillText(line, bodyX, bodyY + index * lineHeight, maxTextWidth);\n }\n}\n\nasync function drawAnnotationsOnCanvas(\n ctx: CanvasRenderingContext2D,\n annotations: AnnotationPlacement[],\n surfaceWidth: number,\n surfaceHeight: number,\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n) {\n for (const annotation of annotations) {\n await drawAnnotationCard(\n ctx,\n annotation,\n annotation.x * surfaceWidth,\n annotation.y * surfaceHeight,\n annotation.width * surfaceWidth,\n annotation.height * surfaceHeight,\n labels,\n );\n }\n}\n\nasync function createSignatureStampDataUrl(\n placement: SignaturePlacement,\n width?: number,\n height?: number,\n) {\n const aspectRatio =\n placement.width > 0 && placement.height > 0\n ? placement.width / placement.height\n : 3.1;\n const targetHeight = height ?? (placement.surfaceKind === \"slide\" ? 320 : 260);\n const targetWidth = width ?? Math.max(480, Math.round(targetHeight * aspectRatio));\n const canvas = createCanvas(targetWidth, targetHeight);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Unable to render the signature stamp.\");\n }\n\n await drawSignatureStamp(ctx, placement, 0, 0, targetWidth, targetHeight);\n return canvas.toDataURL(\"image/png\");\n}\n\nasync function createAnnotationCardDataUrl(\n annotation: AnnotationPlacement,\n width = 720,\n height = 360,\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n) {\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Unable to render the annotation.\");\n }\n\n await drawAnnotationCard(ctx, annotation, 0, 0, width, height, labels);\n return canvas.toDataURL(\"image/png\");\n}\n\nasync function preserveNativePptxFile(args: {\n sourceArrayBuffer: ArrayBuffer;\n fileName: string;\n exportState: PptxExportState;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n labels: ExportLocaleLabels;\n}) {\n const zip = await JSZip.loadAsync(args.sourceArrayBuffer.slice(0));\n const slidePaths = await getOrderedPptSlidePaths(zip);\n await ensureContentTypeDefault(zip, \"png\", \"image/png\");\n\n for (const [index, slidePath] of slidePaths.entries()) {\n const surfaceKey = `slide:${index + 1}`;\n const slidePlacements = args.placements.filter(\n (placement) => placement.surfaceKey === surfaceKey,\n );\n const slideAnnotations = args.annotations.filter(\n (annotation) => annotation.surfaceKey === surfaceKey,\n );\n\n if (slidePlacements.length === 0 && slideAnnotations.length === 0) {\n continue;\n }\n\n const slideFile = zip.file(slidePath);\n if (!slideFile) {\n continue;\n }\n\n const slideDoc = parseXmlDocument(await slideFile.async(\"string\"));\n const spTree = slideDoc.getElementsByTagNameNS(NS_PML, \"spTree\")[0];\n if (!spTree) {\n continue;\n }\n\n const relsPath = slidePath.replace(\n /ppt\\/slides\\/(slide\\d+\\.xml)$/i,\n \"ppt/slides/_rels/$1.rels\",\n );\n const relsDoc = await getOrCreateRelationshipsDocument(zip, relsPath);\n let nextShapeId = getMaxAttributeNumber(slideDoc, \"cNvPr\", \"id\") + 1;\n\n for (const placement of slidePlacements) {\n const mediaPath = getNextSequentialPath(zip, \"ppt/media\", \"hv-overlay-\", \"png\");\n const mediaFileName = mediaPath.split(\"/\").pop() || \"hv-overlay.png\";\n const imageData = await createSignatureStampDataUrl(placement);\n zip.file(mediaPath, dataUrlToUint8Array(imageData));\n const relationshipId = appendRelationship(\n relsDoc,\n REL_TYPE_IMAGE,\n `../media/${mediaFileName}`,\n );\n\n spTree.appendChild(\n createPptOverlayPictureNode({\n document: slideDoc,\n relationshipId,\n shapeId: nextShapeId,\n name: `HV Signature ${nextShapeId}`,\n x: placement.x * args.exportState.slideSize.width,\n y: placement.y * args.exportState.slideSize.height,\n width: placement.width * args.exportState.slideSize.width,\n height: placement.height * args.exportState.slideSize.height,\n description: placement.signature.signedBy || \"Signature\",\n }),\n );\n nextShapeId += 1;\n }\n\n for (const annotation of slideAnnotations) {\n const mediaPath = getNextSequentialPath(zip, \"ppt/media\", \"hv-overlay-\", \"png\");\n const mediaFileName = mediaPath.split(\"/\").pop() || \"hv-overlay.png\";\n const imageData = await createAnnotationCardDataUrl(\n annotation,\n 720,\n 360,\n args.labels,\n );\n zip.file(mediaPath, dataUrlToUint8Array(imageData));\n const relationshipId = appendRelationship(\n relsDoc,\n REL_TYPE_IMAGE,\n `../media/${mediaFileName}`,\n );\n\n spTree.appendChild(\n createPptOverlayPictureNode({\n document: slideDoc,\n relationshipId,\n shapeId: nextShapeId,\n name: `HV Annotation ${nextShapeId}`,\n x: annotation.x * args.exportState.slideSize.width,\n y: annotation.y * args.exportState.slideSize.height,\n width: annotation.width * args.exportState.slideSize.width,\n height: annotation.height * args.exportState.slideSize.height,\n description: annotation.linkedSignaturePlacementId\n ? args.labels.linkedAnnotationAltLabel\n : args.labels.annotationAltLabel,\n }),\n );\n nextShapeId += 1;\n }\n\n zip.file(slidePath, serializeXmlDocument(slideDoc));\n zip.file(relsPath, serializeXmlDocument(relsDoc));\n }\n\n return {\n base64: arrayBufferToBase64(await zip.generateAsync({ type: \"arraybuffer\" })),\n fileName: replaceExtension(args.fileName, \"pptx\"),\n fileType: \"pptx\" as const,\n mimeType: mimeTypeForFileType(\"pptx\"),\n };\n}\n\nasync function preserveNativeSpreadsheetFile(args: {\n sourceArrayBuffer: ArrayBuffer;\n fileName: string;\n sheets: SpreadsheetSheetExportModel[];\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n labels: ExportLocaleLabels;\n dirtyCellAddressesBySheet?: Record<string, string[]>;\n}) {\n const zip = await JSZip.loadAsync(args.sourceArrayBuffer.slice(0));\n const workbookSheets = await getWorkbookSheetInfos(zip);\n await ensureContentTypeDefault(zip, \"png\", \"image/png\");\n let workbookNeedsRecalc = false;\n\n for (const sheetModel of args.sheets) {\n const sheetInfo = workbookSheets.find((sheet) => sheet.name === sheetModel.name);\n if (!sheetInfo) {\n continue;\n }\n\n const sheetPlacements = args.placements.filter(\n (placement) => placement.surfaceKey === `sheet:${sheetModel.name}`,\n );\n const sheetAnnotations = args.annotations.filter(\n (annotation) => annotation.surfaceKey === `sheet:${sheetModel.name}`,\n );\n const dirtyAddresses = Array.from(\n new Set(args.dirtyCellAddressesBySheet?.[sheetModel.name] ?? []),\n );\n\n if (\n sheetPlacements.length === 0 &&\n sheetAnnotations.length === 0 &&\n dirtyAddresses.length === 0\n ) {\n continue;\n }\n\n const sheetFile = zip.file(sheetInfo.path);\n if (!sheetFile) {\n continue;\n }\n\n const sheetDoc = parseXmlDocument(await sheetFile.async(\"string\"));\n const worksheet = sheetDoc.getElementsByTagNameNS(NS_SML, \"worksheet\")[0];\n if (!worksheet) {\n continue;\n }\n\n let sheetChanged = false;\n\n if (dirtyAddresses.length > 0) {\n const sheetData = getOrCreateWorksheetSheetData(sheetDoc, worksheet);\n for (const address of dirtyAddresses) {\n const decoded = XLSX.utils.decode_cell(address);\n applySpreadsheetWorksheetEdit({\n document: sheetDoc,\n worksheet,\n sheetData,\n address,\n cellModel: sheetModel.cells[makeSheetCellKey(decoded.r, decoded.c)],\n });\n }\n\n workbookNeedsRecalc = true;\n sheetChanged = true;\n }\n\n if (sheetPlacements.length === 0 && sheetAnnotations.length === 0) {\n if (sheetChanged) {\n zip.file(sheetInfo.path, serializeXmlDocument(sheetDoc));\n }\n continue;\n }\n\n const sheetRelsPath = sheetInfo.path.replace(\n /xl\\/worksheets\\/(sheet\\d+\\.xml)$/i,\n \"xl/worksheets/_rels/$1.rels\",\n );\n const sheetRelsDoc = await getOrCreateRelationshipsDocument(zip, sheetRelsPath);\n let drawingRelationship = Array.from(\n sheetRelsDoc.getElementsByTagName(\"Relationship\"),\n ).find((node) => node.getAttribute(\"Type\") === REL_TYPE_DRAWING);\n\n let drawingPath = drawingRelationship\n ? resolveZipPath(sheetRelsPath, drawingRelationship.getAttribute(\"Target\") || \"\")\n : \"\";\n\n if (!drawingPath) {\n drawingPath = getNextSequentialPath(zip, \"xl/drawings\", \"drawing\", \"xml\");\n const target = toRelativeZipTarget(sheetInfo.path, drawingPath);\n const relationshipId = appendRelationship(sheetRelsDoc, REL_TYPE_DRAWING, target);\n drawingRelationship = Array.from(sheetRelsDoc.getElementsByTagName(\"Relationship\")).find(\n (node) => node.getAttribute(\"Id\") === relationshipId,\n );\n await ensureContentTypeOverride(\n zip,\n `/${drawingPath}`,\n \"application/vnd.openxmlformats-officedocument.drawing+xml\",\n );\n\n const drawingNode = sheetDoc.createElementNS(NS_SML, \"drawing\");\n drawingNode.setAttributeNS(NS_REL_OFFICE, \"r:id\", relationshipId);\n worksheet.appendChild(drawingNode);\n }\n\n const drawingDoc = await getOrCreateSheetDrawingDocument(zip, drawingPath);\n const drawingRoot = drawingDoc.documentElement;\n const drawingRelsPath = drawingPath.replace(\n /xl\\/drawings\\/([^/]+\\.xml)$/i,\n \"xl/drawings/_rels/$1.rels\",\n );\n const drawingRelsDoc = await getOrCreateRelationshipsDocument(zip, drawingRelsPath);\n let nextShapeId = getMaxAttributeNumber(drawingDoc, \"cNvPr\", \"id\") + 1;\n\n const totalWidth =\n SHEET_ROW_HEADER_WIDTH +\n sheetModel.colWidths\n .slice(0, sheetModel.renderedColCount)\n .reduce((sum, value) => sum + value, 0);\n const totalHeight =\n SHEET_COLUMN_HEADER_HEIGHT +\n sheetModel.rowHeights\n .slice(0, sheetModel.renderedRowCount)\n .reduce((sum, value) => sum + value, 0);\n\n const visibleColWidths = sheetModel.colWidths.slice(0, sheetModel.renderedColCount);\n const visibleRowHeights = sheetModel.rowHeights.slice(0, sheetModel.renderedRowCount);\n\n for (const placement of sheetPlacements) {\n const mediaPath = getNextSequentialPath(zip, \"xl/media\", \"hv-overlay-\", \"png\");\n const imageData = await createSignatureStampDataUrl(placement);\n zip.file(mediaPath, dataUrlToUint8Array(imageData));\n const relationshipId = appendRelationship(\n drawingRelsDoc,\n REL_TYPE_IMAGE,\n toRelativeZipTarget(drawingPath, mediaPath),\n );\n const pixelX = clamp(\n placement.x * totalWidth - SHEET_ROW_HEADER_WIDTH,\n 0,\n Math.max(totalWidth - SHEET_ROW_HEADER_WIDTH, 0),\n );\n const pixelY = clamp(\n placement.y * totalHeight - SHEET_COLUMN_HEADER_HEIGHT,\n 0,\n Math.max(totalHeight - SHEET_COLUMN_HEADER_HEIGHT, 0),\n );\n const anchor = buildSpreadsheetAnchor(\n pixelX,\n pixelY,\n placement.width * totalWidth,\n placement.height * totalHeight,\n visibleColWidths,\n visibleRowHeights,\n );\n\n drawingRoot.appendChild(\n createWorksheetOverlayNode({\n document: drawingDoc,\n relationshipId,\n shapeId: nextShapeId,\n name: `HV Signature ${nextShapeId}`,\n anchor,\n description: placement.signature.signedBy || \"Signature\",\n }),\n );\n nextShapeId += 1;\n }\n\n for (const annotation of sheetAnnotations) {\n const mediaPath = getNextSequentialPath(zip, \"xl/media\", \"hv-overlay-\", \"png\");\n const imageData = await createAnnotationCardDataUrl(\n annotation,\n 720,\n 360,\n args.labels,\n );\n zip.file(mediaPath, dataUrlToUint8Array(imageData));\n const relationshipId = appendRelationship(\n drawingRelsDoc,\n REL_TYPE_IMAGE,\n toRelativeZipTarget(drawingPath, mediaPath),\n );\n const pixelX = clamp(\n annotation.x * totalWidth - SHEET_ROW_HEADER_WIDTH,\n 0,\n Math.max(totalWidth - SHEET_ROW_HEADER_WIDTH, 0),\n );\n const pixelY = clamp(\n annotation.y * totalHeight - SHEET_COLUMN_HEADER_HEIGHT,\n 0,\n Math.max(totalHeight - SHEET_COLUMN_HEADER_HEIGHT, 0),\n );\n const anchor = buildSpreadsheetAnchor(\n pixelX,\n pixelY,\n annotation.width * totalWidth,\n annotation.height * totalHeight,\n visibleColWidths,\n visibleRowHeights,\n );\n\n drawingRoot.appendChild(\n createWorksheetOverlayNode({\n document: drawingDoc,\n relationshipId,\n shapeId: nextShapeId,\n name: `HV Annotation ${nextShapeId}`,\n anchor,\n description: annotation.linkedSignaturePlacementId\n ? args.labels.linkedAnnotationAltLabel\n : args.labels.annotationAltLabel,\n }),\n );\n nextShapeId += 1;\n }\n\n sheetChanged = true;\n zip.file(sheetInfo.path, serializeXmlDocument(sheetDoc));\n zip.file(sheetRelsPath, serializeXmlDocument(sheetRelsDoc));\n zip.file(drawingPath, serializeXmlDocument(drawingDoc));\n zip.file(drawingRelsPath, serializeXmlDocument(drawingRelsDoc));\n }\n\n if (workbookNeedsRecalc) {\n await markWorkbookForFullCalculation(zip);\n }\n\n return {\n base64: arrayBufferToBase64(await zip.generateAsync({ type: \"arraybuffer\" })),\n fileName: replaceExtension(args.fileName, \"xlsx\"),\n fileType: \"xlsx\" as const,\n mimeType: mimeTypeForFileType(\"xlsx\"),\n };\n}\n\nasync function renderCanvasesToPdf(\n canvases: HTMLCanvasElement[],\n fileName: string,\n pageDecorations?: ExportPageDecorations,\n) {\n const pdf = await PDFDocument.create();\n const preparedDecorations = await preparePageDecorations(pageDecorations);\n\n for (const sourceCanvas of canvases) {\n const canvas = applyPageDecorationsToCanvas(sourceCanvas, preparedDecorations);\n const image = await pdf.embedJpg(canvas.toDataURL(\"image/jpeg\", 0.92));\n const page = pdf.addPage([canvas.width, canvas.height]);\n page.drawImage(image, {\n x: 0,\n y: 0,\n width: canvas.width,\n height: canvas.height,\n });\n }\n\n return {\n base64: await pdf.saveAsBase64(),\n fileName: replaceExtension(fileName, \"pdf\"),\n fileType: \"pdf\" as const,\n mimeType: mimeTypeForFileType(\"pdf\"),\n exportedAsPdf: true,\n };\n}\n\nfunction splitTallCanvas(canvas: HTMLCanvasElement) {\n const canvases: HTMLCanvasElement[] = [];\n const maxSliceHeight = Math.max(\n Math.round(canvas.width * 1.4),\n Math.round(canvas.width),\n );\n\n if (canvas.height <= maxSliceHeight) {\n return [canvas];\n }\n\n for (let offset = 0; offset < canvas.height; offset += maxSliceHeight) {\n const sliceHeight = Math.min(maxSliceHeight, canvas.height - offset);\n const sliceCanvas = createCanvas(canvas.width, sliceHeight);\n const ctx = sliceCanvas.getContext(\"2d\");\n if (!ctx) {\n continue;\n }\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, sliceCanvas.width, sliceCanvas.height);\n ctx.drawImage(\n canvas,\n 0,\n offset,\n canvas.width,\n sliceHeight,\n 0,\n 0,\n sliceCanvas.width,\n sliceCanvas.height,\n );\n canvases.push(sliceCanvas);\n }\n\n return canvases;\n}\n\nasync function createDocxFromCanvases(\n canvases: HTMLCanvasElement[],\n fileName: string,\n) {\n const children: Paragraph[] = [];\n\n for (const [index, canvas] of canvases.entries()) {\n const blob = await canvasToBlob(canvas, \"image/png\");\n const buffer = new Uint8Array(await blob.arrayBuffer());\n const scale = Math.min(1, 560 / canvas.width);\n\n children.push(\n new Paragraph({\n children: [\n new ImageRun({\n data: buffer,\n type: \"png\",\n transformation: {\n width: Math.round(canvas.width * scale),\n height: Math.round(canvas.height * scale),\n },\n }),\n ],\n }),\n );\n\n if (index < canvases.length - 1) {\n children.push(\n new Paragraph({\n children: [new PageBreak()],\n }),\n );\n }\n }\n\n const document = new Document({\n sections: [\n {\n properties: {},\n children,\n },\n ],\n });\n\n return {\n base64: await Packer.toBase64String(document),\n fileName: replaceExtension(fileName, \"docx\"),\n fileType: \"docx\" as const,\n mimeType: mimeTypeForFileType(\"docx\"),\n };\n}\n\nfunction emuToInches(value: number) {\n return value / EMU_PER_INCH;\n}\n\nasync function loadPptxGenJS(): Promise<PptxGenConstructor> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new Error(\"PowerPoint export is only available in the browser.\");\n }\n\n if (window.PptxGenJS) {\n return window.PptxGenJS;\n }\n\n const existingScript = document.querySelector<HTMLScriptElement>(\n 'script[data-hv-pptxgen=\"true\"]',\n );\n\n if (existingScript) {\n await new Promise<void>((resolve, reject) => {\n if (window.PptxGenJS) {\n resolve();\n return;\n }\n\n existingScript.addEventListener(\"load\", () => resolve(), { once: true });\n existingScript.addEventListener(\n \"error\",\n () => reject(new Error(\"Unable to load the PowerPoint export engine.\")),\n { once: true },\n );\n });\n } else {\n await new Promise<void>((resolve, reject) => {\n void import(\"../../generated/pptxgenBundle\")\n .then(({ pptxgenBundleSource }) => {\n const blob = new Blob([pptxgenBundleSource], {\n type: \"text/javascript\",\n });\n const blobUrl = URL.createObjectURL(blob);\n\n (window as Window & { JSZip?: typeof JSZip }).JSZip = JSZip;\n const script = document.createElement(\"script\");\n script.src = blobUrl;\n script.async = true;\n script.dataset.hvPptxgen = \"true\";\n script.onload = () => {\n URL.revokeObjectURL(blobUrl);\n resolve();\n };\n script.onerror = () => {\n URL.revokeObjectURL(blobUrl);\n reject(new Error(\"Unable to load the PowerPoint export engine.\"));\n };\n document.head.appendChild(script);\n })\n .catch(() => {\n reject(new Error(\"Unable to load the PowerPoint export engine.\"));\n });\n });\n }\n\n if (!window.PptxGenJS) {\n throw new Error(\"The PowerPoint export engine did not initialize.\");\n }\n\n return window.PptxGenJS;\n}\n\nfunction paragraphToText(paragraph: PptxParagraphModel) {\n const text = paragraph.runs.map((run) => run.text).join(\"\");\n const indentation = \" \".repeat(paragraph.level);\n const prefix = paragraph.bullet\n ? `${indentation}${paragraph.bulletText || \"\\u2022\"} `\n : indentation;\n return `${prefix}${text}`;\n}\n\nasync function renderSlidesToCanvases(\n exportState: PptxExportState,\n placements: SignaturePlacement[],\n annotations: AnnotationPlacement[],\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n options?: {\n borderlessSignatures?: boolean;\n },\n) {\n const slideWidth = exportState.slideSize.width || 9144000;\n const slideHeight = exportState.slideSize.height || 5143500;\n const targetWidth = 1280;\n const scale = targetWidth / slideWidth;\n const canvases: HTMLCanvasElement[] = [];\n\n for (const [index, slide] of exportState.slides.entries()) {\n const canvas = createCanvas(slideWidth * scale, slideHeight * scale);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n continue;\n }\n\n ctx.fillStyle = slide.background || \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n for (const element of slide.elements) {\n if (element.width <= 0 || element.height <= 0) {\n continue;\n }\n\n const x = element.x * scale;\n const y = element.y * scale;\n const width = element.width * scale;\n const height = element.height * scale;\n\n ctx.save();\n if (element.rotation) {\n ctx.translate(x + width / 2, y + height / 2);\n ctx.rotate((element.rotation * Math.PI) / 180);\n ctx.translate(-(x + width / 2), -(y + height / 2));\n }\n\n if (element.kind === \"image\" && element.imageSrc) {\n const image = await tryLoadImage(element.imageSrc);\n if (image) {\n ctx.drawImage(image, x, y, width, height);\n } else {\n ctx.fillStyle = \"rgba(241, 245, 249, 0.92)\";\n ctx.fillRect(x, y, width, height);\n ctx.strokeStyle = \"rgba(148, 163, 184, 0.45)\";\n ctx.lineWidth = Math.max(1, width * 0.003);\n ctx.strokeRect(x, y, width, height);\n ctx.fillStyle = \"#64748b\";\n ctx.font = `${Math.max(11, width * 0.03)}px Arial, sans-serif`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(element.alt || \"Slide image\", x + width / 2, y + height / 2, width - 28);\n }\n ctx.restore();\n continue;\n }\n\n if (element.fill) {\n ctx.fillStyle = element.fill;\n ctx.fillRect(x, y, width, height);\n }\n\n if (element.stroke) {\n ctx.strokeStyle = element.stroke;\n ctx.lineWidth = Math.max(1, width * 0.005);\n ctx.strokeRect(x, y, width, height);\n }\n\n if (element.paragraphs?.length) {\n const paragraphPaddingX = Math.max(12, width * 0.04);\n let cursorY = y + Math.max(14, height * 0.08);\n\n for (const paragraph of element.paragraphs) {\n const primaryRun = paragraph.runs[0];\n const paragraphText = paragraph.runs.map((run) => run.text).join(\"\");\n const prefix = paragraph.bullet ? `${paragraph.bulletText || \"\\u2022\"} ` : \"\";\n const displayText = `${prefix}${paragraphText}`.trimEnd();\n const fontSize = Math.max(\n 12,\n (primaryRun?.fontSize || 18) * scale,\n );\n const lineHeight = fontSize * 1.34;\n const weight = primaryRun?.bold ? \"700\" : \"400\";\n const align =\n paragraph.align === \"ctr\"\n ? \"center\"\n : paragraph.align === \"r\"\n ? \"right\"\n : \"left\";\n const leftIndent = paragraph.level * 18 * scale;\n const availableWidth = Math.max(\n width - paragraphPaddingX * 2 - leftIndent,\n 40,\n );\n\n ctx.font = `${weight} ${fontSize}px Arial, sans-serif`;\n const lines = wrapTextToWidth(ctx, displayText, availableWidth);\n\n for (const line of lines) {\n ctx.font = `${weight} ${fontSize}px Arial, sans-serif`;\n ctx.fillStyle = primaryRun?.color || \"#0f172a\";\n ctx.textBaseline = \"top\";\n ctx.textAlign = align;\n\n let textX = x + paragraphPaddingX + leftIndent;\n const textWidth = ctx.measureText(line).width;\n\n if (align === \"center\") {\n textX = x + width / 2;\n } else if (align === \"right\") {\n textX = x + width - paragraphPaddingX;\n }\n\n ctx.fillText(line, textX, cursorY, availableWidth);\n\n if (primaryRun?.underline) {\n ctx.strokeStyle = primaryRun.color || \"#0f172a\";\n ctx.lineWidth = Math.max(1, fontSize * 0.08);\n ctx.beginPath();\n const underlineStart =\n align === \"center\"\n ? textX - textWidth / 2\n : align === \"right\"\n ? textX - textWidth\n : textX;\n ctx.moveTo(underlineStart, cursorY + fontSize + 2);\n ctx.lineTo(underlineStart + textWidth, cursorY + fontSize + 2);\n ctx.stroke();\n }\n\n cursorY += lineHeight;\n }\n\n cursorY += Math.max(fontSize * 0.35, 8);\n }\n }\n\n ctx.restore();\n }\n\n await drawPlacementsOnCanvas(\n ctx,\n placements.filter((placement) => placement.surfaceKey === `slide:${index + 1}`),\n canvas.width,\n canvas.height,\n options?.borderlessSignatures ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n annotations.filter(\n (annotation) => annotation.surfaceKey === `slide:${index + 1}`,\n ),\n canvas.width,\n canvas.height,\n labels,\n );\n\n canvases.push(canvas);\n }\n\n return canvases.length > 0 ? canvases : [createCanvas(1280, 720)];\n}\n\nfunction createSheetMergeLookup(merges: SpreadsheetMergeModel[]) {\n const starts = new Map<string, SpreadsheetMergeModel>();\n const covered = new Set<string>();\n\n for (const merge of merges) {\n starts.set(`${merge.startRow}:${merge.startCol}`, merge);\n\n for (let row = merge.startRow; row <= merge.endRow; row += 1) {\n for (let col = merge.startCol; col <= merge.endCol; col += 1) {\n if (row === merge.startRow && col === merge.startCol) {\n continue;\n }\n\n covered.add(`${row}:${col}`);\n }\n }\n }\n\n return { starts, covered };\n}\n\nfunction toColumnLabel(index: number) {\n let label = \"\";\n let current = index;\n\n while (current >= 0) {\n label = String.fromCharCode((current % 26) + 65) + label;\n current = Math.floor(current / 26) - 1;\n }\n\n return label;\n}\n\nfunction offsetToGridPosition(offset: number, sizes: number[]) {\n let remaining = offset;\n\n for (let index = 0; index < sizes.length; index += 1) {\n const size = sizes[index];\n if (remaining <= size) {\n return index + clamp(remaining / size, 0, 0.9999);\n }\n remaining -= size;\n }\n\n return sizes.length;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction cloneSpreadsheetSerializable<T>(value: T): T {\n if (value == null) {\n return value;\n }\n\n if (value instanceof Date) {\n return new Date(value) as T;\n }\n\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction makeSheetCellKey(row: number, col: number) {\n return `${row}:${col}`;\n}\n\nfunction stripArgbAlpha(argb?: string) {\n if (!argb) {\n return undefined;\n }\n\n const normalized = argb.replace(\"#\", \"\").trim();\n if (normalized.length === 8) {\n return `#${normalized.slice(2)}`;\n }\n if (normalized.length === 6) {\n return `#${normalized}`;\n }\n return undefined;\n}\n\nfunction getSpreadsheetColor(color: unknown) {\n if (!isRecord(color)) {\n return undefined;\n }\n\n if (typeof color.argb === \"string\") {\n return stripArgbAlpha(color.argb);\n }\n\n return undefined;\n}\n\nfunction getSpreadsheetTextColor(cell?: SpreadsheetCellExportModel) {\n if (!cell?.font || !isRecord(cell.font)) {\n return undefined;\n }\n\n return getSpreadsheetColor(cell.font.color);\n}\n\nfunction getSpreadsheetFillColor(cell?: SpreadsheetCellExportModel) {\n if (!cell?.fill || !isRecord(cell.fill)) {\n return undefined;\n }\n\n return (\n getSpreadsheetColor(cell.fill.fgColor) ||\n getSpreadsheetColor(cell.fill.bgColor)\n );\n}\n\nfunction getSpreadsheetAlignment(cell?: SpreadsheetCellExportModel) {\n if (!cell?.alignment || !isRecord(cell.alignment)) {\n return {};\n }\n\n return {\n horizontal:\n typeof cell.alignment.horizontal === \"string\"\n ? cell.alignment.horizontal\n : undefined,\n vertical:\n typeof cell.alignment.vertical === \"string\"\n ? cell.alignment.vertical\n : undefined,\n wrapText: cell.alignment.wrapText === true,\n };\n}\n\nfunction getSpreadsheetCellValueForExport(cell: SpreadsheetCellExportModel) {\n if (cell.valueKind === \"blank\") {\n return null;\n }\n\n if (cell.valueKind === \"formula\" && cell.formula) {\n const baseValue = isRecord(cell.value)\n ? cloneSpreadsheetSerializable(cell.value)\n : {};\n\n return {\n ...(isRecord(baseValue) ? baseValue : {}),\n formula: cell.formula,\n result: cloneSpreadsheetSerializable(cell.result),\n };\n }\n\n if (cell.valueKind === \"hyperlink\" && cell.hyperlink) {\n if (isRecord(cell.value) && typeof cell.value.hyperlink === \"string\") {\n return cloneSpreadsheetSerializable(cell.value);\n }\n\n return {\n text: cell.displayValue || String(cell.value ?? \"\"),\n hyperlink: cell.hyperlink,\n };\n }\n\n return cloneSpreadsheetSerializable(cell.value);\n}\n\nfunction applySpreadsheetCellFormatting(\n targetCell: ExcelJS.Cell,\n model: SpreadsheetCellExportModel,\n) {\n if (model.numFmt) {\n targetCell.numFmt = model.numFmt;\n }\n if (model.font) {\n targetCell.font = cloneSpreadsheetSerializable(model.font) as unknown as ExcelJS.Font;\n }\n if (model.fill) {\n targetCell.fill = cloneSpreadsheetSerializable(model.fill) as unknown as ExcelJS.Fill;\n }\n if (model.alignment) {\n targetCell.alignment = cloneSpreadsheetSerializable(\n model.alignment,\n ) as unknown as Partial<ExcelJS.Alignment>;\n }\n if (model.border) {\n targetCell.border = cloneSpreadsheetSerializable(\n model.border,\n ) as unknown as Partial<ExcelJS.Borders>;\n }\n if (model.note) {\n targetCell.note = model.note;\n }\n}\n\nasync function renderSheetsToCanvases(\n sheets: SpreadsheetSheetExportModel[],\n placements: SignaturePlacement[],\n annotations: AnnotationPlacement[],\n labels: ExportLocaleLabels = defaultExportLocaleLabels,\n options?: {\n borderlessSignatures?: boolean;\n },\n) {\n const canvases: HTMLCanvasElement[] = [];\n const safeSheets =\n sheets.length > 0\n ? sheets\n : [{\n name: \"Sheet1\",\n data: [[\"\"]],\n cells: {},\n merges: [],\n colWidths: [120],\n rowHeights: [32],\n rowCount: 1,\n colCount: 1,\n renderedRowCount: 1,\n renderedColCount: 1,\n }];\n\n for (const sheet of safeSheets) {\n const visibleColWidths = sheet.colWidths.slice(0, sheet.renderedColCount);\n const visibleRowHeights = sheet.rowHeights.slice(0, sheet.renderedRowCount);\n const totalWidth =\n SHEET_ROW_HEADER_WIDTH +\n visibleColWidths.reduce((sum, value) => sum + value, 0);\n const totalHeight =\n SHEET_COLUMN_HEADER_HEIGHT +\n visibleRowHeights.reduce((sum, value) => sum + value, 0);\n const canvas = createCanvas(totalWidth, totalHeight);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n continue;\n }\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = \"#f1f5f9\";\n ctx.fillRect(0, 0, canvas.width, SHEET_COLUMN_HEADER_HEIGHT);\n ctx.fillRect(0, 0, SHEET_ROW_HEADER_WIDTH, canvas.height);\n\n const mergeLookup = createSheetMergeLookup(sheet.merges);\n let cursorX = SHEET_ROW_HEADER_WIDTH;\n\n for (let colIndex = 0; colIndex < visibleColWidths.length; colIndex += 1) {\n const width = visibleColWidths[colIndex];\n ctx.strokeStyle = \"#cbd5e1\";\n ctx.strokeRect(cursorX, 0, width, SHEET_COLUMN_HEADER_HEIGHT);\n ctx.fillStyle = \"#475569\";\n ctx.font = \"700 11px Arial, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(\n toColumnLabel(colIndex),\n cursorX + width / 2,\n SHEET_COLUMN_HEADER_HEIGHT / 2,\n );\n cursorX += width;\n }\n\n let cursorY = SHEET_COLUMN_HEADER_HEIGHT;\n for (let rowIndex = 0; rowIndex < visibleRowHeights.length; rowIndex += 1) {\n const height = visibleRowHeights[rowIndex];\n ctx.strokeStyle = \"#cbd5e1\";\n ctx.strokeRect(0, cursorY, SHEET_ROW_HEADER_WIDTH, height);\n ctx.fillStyle = \"#475569\";\n ctx.font = \"700 11px Arial, sans-serif\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(String(rowIndex + 1), SHEET_ROW_HEADER_WIDTH / 2, cursorY + height / 2);\n cursorY += height;\n }\n\n cursorY = SHEET_COLUMN_HEADER_HEIGHT;\n for (let rowIndex = 0; rowIndex < sheet.data.length; rowIndex += 1) {\n const row = sheet.data[rowIndex] ?? [];\n const rowHeight = visibleRowHeights[rowIndex] ?? 32;\n cursorX = SHEET_ROW_HEADER_WIDTH;\n\n for (let colIndex = 0; colIndex < row.length; colIndex += 1) {\n const colWidth = visibleColWidths[colIndex] ?? 96;\n const cellKey = makeSheetCellKey(rowIndex, colIndex);\n const cellModel = sheet.cells[cellKey];\n\n if (mergeLookup.covered.has(cellKey)) {\n cursorX += colWidth;\n continue;\n }\n\n const merge = mergeLookup.starts.get(cellKey);\n const width = merge\n ? visibleColWidths\n .slice(colIndex, colIndex + (merge.endCol - merge.startCol + 1))\n .reduce((sum, value) => sum + value, 0)\n : colWidth;\n const height = merge\n ? visibleRowHeights\n .slice(rowIndex, rowIndex + (merge.endRow - merge.startRow + 1))\n .reduce((sum, value) => sum + value, 0)\n : rowHeight;\n\n ctx.fillStyle = getSpreadsheetFillColor(cellModel) || \"#ffffff\";\n ctx.fillRect(cursorX, cursorY, width, height);\n ctx.strokeStyle = \"#e2e8f0\";\n ctx.strokeRect(cursorX, cursorY, width, height);\n\n const text = cellModel?.displayValue || row[colIndex] || \"\";\n if (text) {\n const alignment = getSpreadsheetAlignment(cellModel);\n const fontSize =\n cellModel?.font && isRecord(cellModel.font) && typeof cellModel.font.size === \"number\"\n ? cellModel.font.size\n : 13;\n const fontWeight =\n cellModel?.font && isRecord(cellModel.font) && cellModel.font.bold\n ? \"700\"\n : \"400\";\n const fontStyle =\n cellModel?.font && isRecord(cellModel.font) && cellModel.font.italic\n ? \"italic\"\n : \"normal\";\n const fontFamily =\n cellModel?.font && isRecord(cellModel.font) && typeof cellModel.font.name === \"string\"\n ? cellModel.font.name\n : \"Arial\";\n const textColor =\n getSpreadsheetTextColor(cellModel) ||\n (cellModel?.hyperlink ? \"#1d4ed8\" : \"#0f172a\");\n const textPaddingX = 10;\n const textPaddingY = 8;\n\n ctx.fillStyle = textColor;\n ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}, sans-serif`;\n ctx.textBaseline = \"top\";\n ctx.textAlign =\n alignment.horizontal === \"center\"\n ? \"center\"\n : alignment.horizontal === \"right\"\n ? \"right\"\n : \"left\";\n\n const lines = wrapTextToWidth(\n ctx,\n text,\n Math.max(width - textPaddingX * 2, 12),\n );\n const lineHeight = Math.max(fontSize * 1.25, 16);\n const textBlockHeight = lines.length * lineHeight;\n const textX =\n ctx.textAlign === \"center\"\n ? cursorX + width / 2\n : ctx.textAlign === \"right\"\n ? cursorX + width - textPaddingX\n : cursorX + textPaddingX;\n const textY =\n alignment.vertical === \"middle\"\n ? cursorY + Math.max((height - textBlockHeight) / 2, textPaddingY)\n : alignment.vertical === \"bottom\"\n ? cursorY + Math.max(height - textBlockHeight - textPaddingY, textPaddingY)\n : cursorY + textPaddingY;\n\n lines.forEach((line: string, index: number) => {\n ctx.fillText(line, textX, textY + index * lineHeight);\n });\n }\n\n cursorX += colWidth;\n }\n\n cursorY += rowHeight;\n }\n\n await drawPlacementsOnCanvas(\n ctx,\n placements.filter((placement) => placement.surfaceKey === `sheet:${sheet.name}`),\n canvas.width,\n canvas.height,\n options?.borderlessSignatures ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n annotations.filter(\n (annotation) => annotation.surfaceKey === `sheet:${sheet.name}`,\n ),\n canvas.width,\n canvas.height,\n labels,\n );\n\n canvases.push(canvas);\n }\n\n return canvases;\n}\n\nexport async function exportSignedPdfDocument(args: {\n arrayBuffer?: ArrayBuffer;\n url?: string;\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n if (!args.arrayBuffer && !args.url) {\n throw new Error(\"No PDF source is available for export.\");\n }\n\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n await ensurePdfWorker();\n const loadingTask = getDocument(\n args.arrayBuffer ? { data: args.arrayBuffer.slice(0) } : { url: args.url! },\n );\n const pdf = await loadingTask.promise;\n const exportPdf = await PDFDocument.create();\n const preparedDecorations = await preparePageDecorations(args.pageDecorations);\n\n for (let pageNumber = 1; pageNumber <= pdf.numPages; pageNumber += 1) {\n const page = await pdf.getPage(pageNumber);\n const viewport = page.getViewport({ scale: 2 });\n const canvas = createCanvas(viewport.width, viewport.height);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n continue;\n }\n\n await page.render({\n canvasContext: ctx,\n viewport,\n }).promise;\n\n await drawPlacementsOnCanvas(\n ctx,\n args.placements.filter(\n (placement) => placement.surfaceKey === `page:${pageNumber}`,\n ),\n canvas.width,\n canvas.height,\n { borderless: true },\n );\n await drawAnnotationsOnCanvas(\n ctx,\n args.annotations.filter(\n (annotation) => annotation.surfaceKey === `page:${pageNumber}`,\n ),\n canvas.width,\n canvas.height,\n labels,\n );\n\n const finalCanvas = applyPageDecorationsToCanvas(canvas, preparedDecorations);\n const image = await exportPdf.embedJpg(finalCanvas.toDataURL(\"image/jpeg\", 0.92));\n const exportPage = exportPdf.addPage([finalCanvas.width, finalCanvas.height]);\n exportPage.drawImage(image, {\n x: 0,\n y: 0,\n width: finalCanvas.width,\n height: finalCanvas.height,\n });\n }\n\n return {\n base64: await exportPdf.saveAsBase64(),\n fileName: replaceExtension(args.fileName, \"pdf\"),\n fileType: \"pdf\" as const,\n mimeType: mimeTypeForFileType(\"pdf\"),\n };\n}\n\nexport async function exportSignedImageFile(args: {\n arrayBuffer: ArrayBuffer;\n fileType: SupportedFileType;\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n asPdf?: boolean;\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n const imageBlob = new Blob([args.arrayBuffer], {\n type: mimeTypeForFileType(args.fileType),\n });\n const objectUrl = URL.createObjectURL(imageBlob);\n\n try {\n const image = await loadImage(objectUrl);\n const canvas = createCanvas(image.width, image.height);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n throw new Error(\"Unable to render the image document.\");\n }\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n await drawPlacementsOnCanvas(\n ctx,\n args.placements.filter((placement) => placement.surfaceKey === \"image:main\"),\n canvas.width,\n canvas.height,\n args.asPdf ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n args.annotations.filter((annotation) => annotation.surfaceKey === \"image:main\"),\n canvas.width,\n canvas.height,\n labels,\n );\n\n if (args.asPdf) {\n return renderCanvasesToPdf([canvas], args.fileName, args.pageDecorations);\n }\n\n const shouldUseJpeg = args.fileType === \"jpg\" || args.fileType === \"jpeg\";\n const outputType = shouldUseJpeg ? \"image/jpeg\" : \"image/png\";\n const blob = await canvasToBlob(canvas, outputType, shouldUseJpeg ? 0.95 : undefined);\n\n return {\n base64: await blobToBase64(blob),\n fileName: replaceExtension(args.fileName, shouldUseJpeg ? \"jpg\" : \"png\"),\n fileType: shouldUseJpeg ? \"jpg\" as const : \"png\" as const,\n mimeType: outputType,\n };\n } finally {\n URL.revokeObjectURL(objectUrl);\n }\n}\n\nexport async function exportSignedRichTextFile(args: {\n container: HTMLElement | null;\n pages?: RichTextPageRenderModel[];\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n asPdf?: boolean;\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n if (args.pages && args.pages.length > 0) {\n const canvases: HTMLCanvasElement[] = [];\n\n for (const page of args.pages) {\n const image = await loadImage(page.imageUrl);\n const canvas = createCanvas(page.width, page.height);\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n continue;\n }\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(image, 0, 0, canvas.width, canvas.height);\n await drawPlacementsOnCanvas(\n ctx,\n args.placements.filter(\n (placement) => placement.surfaceKey === page.surfaceKey,\n ),\n canvas.width,\n canvas.height,\n args.asPdf ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n args.annotations.filter(\n (annotation) => annotation.surfaceKey === page.surfaceKey,\n ),\n canvas.width,\n canvas.height,\n labels,\n );\n\n canvases.push(canvas);\n }\n\n if (canvases.length === 0) {\n throw new Error(\"The document pages are not ready to export.\");\n }\n\n if (args.asPdf) {\n return renderCanvasesToPdf(canvases, args.fileName, args.pageDecorations);\n }\n\n return createDocxFromCanvases(canvases, args.fileName);\n }\n\n if (!args.container) {\n throw new Error(\"The document surface is not ready to export.\");\n }\n\n const canvas = await captureElementCanvas(args.container, {\n backgroundColor: \"#ffffff\",\n scale: 2,\n });\n\n if (!canvas) {\n throw new Error(\"Unable to render the document surface.\");\n }\n const ctx = canvas.getContext(\"2d\");\n\n if (!ctx) {\n throw new Error(\"Unable to render the document surface.\");\n }\n\n await drawPlacementsOnCanvas(\n ctx,\n args.placements.filter((placement) => placement.surfaceKey === \"document:main\"),\n canvas.width,\n canvas.height,\n args.asPdf ? { borderless: true } : undefined,\n );\n await drawAnnotationsOnCanvas(\n ctx,\n args.annotations.filter((annotation) => annotation.surfaceKey === \"document:main\"),\n canvas.width,\n canvas.height,\n labels,\n );\n\n const pages = splitTallCanvas(canvas);\n if (args.asPdf) {\n return renderCanvasesToPdf(pages, args.fileName, args.pageDecorations);\n }\n\n return createDocxFromCanvases(pages, args.fileName);\n}\n\nexport async function exportSignedSlidesFile(args: {\n exportState: PptxExportState | null;\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n asPdf?: boolean;\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n const exportState =\n args.exportState && args.exportState.slides.length > 0\n ? args.exportState\n : {\n slideSize: { width: 9144000, height: 5143500 },\n slides: [{\n background: \"#ffffff\",\n elements: [],\n title: \"Slide 1\",\n }],\n };\n\n if (args.asPdf) {\n return renderCanvasesToPdf(\n await renderSlidesToCanvases(\n exportState,\n args.placements,\n args.annotations,\n labels,\n { borderlessSignatures: true },\n ),\n args.fileName,\n args.pageDecorations,\n );\n }\n\n if (\n exportState.sourceArrayBuffer &&\n exportState.sourceFileType === \"pptx\"\n ) {\n return preserveNativePptxFile({\n sourceArrayBuffer: exportState.sourceArrayBuffer,\n fileName: args.fileName,\n exportState,\n placements: args.placements,\n annotations: args.annotations,\n labels,\n });\n }\n\n const PptxGenJS = await loadPptxGenJS();\n const pptx = new PptxGenJS();\n pptx.defineLayout({\n name: \"HV_CUSTOM\",\n width: emuToInches(exportState.slideSize.width),\n height: emuToInches(exportState.slideSize.height),\n });\n pptx.layout = \"HV_CUSTOM\";\n pptx.author = \"Hive Viewer\";\n pptx.subject = \"Signed presentation export\";\n pptx.title = args.fileName;\n\n for (const [index, slideModel] of exportState.slides.entries()) {\n const slide = pptx.addSlide();\n slide.background = { color: stripHash(slideModel.background, \"FFFFFF\") };\n\n for (const element of slideModel.elements) {\n if (element.width <= 0 || element.height <= 0) {\n continue;\n }\n\n const x = emuToInches(element.x);\n const y = emuToInches(element.y);\n const w = emuToInches(element.width);\n const h = emuToInches(element.height);\n\n if (element.kind === \"image\" && element.imageSrc) {\n slide.addImage({\n data: element.imageSrc,\n x,\n y,\n w,\n h,\n rotate: element.rotation || 0,\n altText: element.alt,\n });\n continue;\n }\n\n if (element.paragraphs?.length) {\n const text = element.paragraphs.map(paragraphToText).join(\"\\n\");\n const firstRun = element.paragraphs.flatMap((paragraph) => paragraph.runs)[0];\n\n slide.addText(text, {\n x,\n y,\n w,\n h,\n rotate: element.rotation || 0,\n shape: \"rect\",\n margin: 4,\n fit: \"shrink\",\n valign: \"top\",\n align:\n element.paragraphs[0]?.align === \"ctr\"\n ? \"center\"\n : element.paragraphs[0]?.align === \"r\"\n ? \"right\"\n : \"left\",\n color: stripHash(firstRun?.color, \"0F172A\"),\n fontSize: firstRun?.fontSize,\n bold: firstRun?.bold,\n italic: firstRun?.italic,\n underline: firstRun?.underline\n ? {\n style: \"sng\",\n color: stripHash(firstRun?.color, \"0F172A\"),\n }\n : undefined,\n fill: element.fill\n ? { color: stripHash(element.fill) }\n : undefined,\n line: element.stroke\n ? { color: stripHash(element.stroke), pt: 1 }\n : { color: \"FFFFFF\", transparency: 100 },\n });\n continue;\n }\n\n slide.addShape(\"rect\", {\n x,\n y,\n w,\n h,\n rotate: element.rotation || 0,\n fill: element.fill\n ? { color: stripHash(element.fill) }\n : { color: \"FFFFFF\", transparency: 100 },\n line: element.stroke\n ? { color: stripHash(element.stroke), pt: 1 }\n : { color: \"FFFFFF\", transparency: 100 },\n });\n }\n\n for (const placement of args.placements.filter(\n (candidate) => candidate.surfaceKey === `slide:${index + 1}`,\n )) {\n slide.addImage({\n data: await createSignatureStampDataUrl(placement),\n x: placement.x * emuToInches(exportState.slideSize.width),\n y: placement.y * emuToInches(exportState.slideSize.height),\n w: placement.width * emuToInches(exportState.slideSize.width),\n h: placement.height * emuToInches(exportState.slideSize.height),\n altText: placement.signature.signedBy\n ? `Signature by ${placement.signature.signedBy}`\n : \"Signature\",\n });\n }\n\n for (const annotation of args.annotations.filter(\n (candidate) => candidate.surfaceKey === `slide:${index + 1}`,\n )) {\n slide.addImage({\n data: await createAnnotationCardDataUrl(annotation, 720, 360, labels),\n x: annotation.x * emuToInches(exportState.slideSize.width),\n y: annotation.y * emuToInches(exportState.slideSize.height),\n w: annotation.width * emuToInches(exportState.slideSize.width),\n h: annotation.height * emuToInches(exportState.slideSize.height),\n altText: annotation.linkedSignaturePlacementId\n ? labels.linkedAnnotationAltLabel\n : labels.annotationAltLabel,\n });\n }\n }\n\n return {\n base64: await pptx.write({ outputType: \"base64\", compression: true }) as string,\n fileName: replaceExtension(args.fileName, \"pptx\"),\n fileType: \"pptx\" as const,\n mimeType: mimeTypeForFileType(\"pptx\"),\n };\n}\n\nexport async function exportSignedSpreadsheetFile(args: {\n exportState: SpreadsheetExportState | null;\n fileName: string;\n placements: SignaturePlacement[];\n annotations: AnnotationPlacement[];\n asPdf?: boolean;\n labels?: Partial<ExportLocaleLabels>;\n pageDecorations?: ExportPageDecorations;\n}) {\n const labels = { ...defaultExportLocaleLabels, ...args.labels };\n const sheets =\n args.exportState?.sheets && args.exportState.sheets.length > 0\n ? args.exportState.sheets\n : [{\n name: \"Sheet1\",\n data: [[\"\"]],\n cells: {},\n merges: [],\n colWidths: [120],\n rowHeights: [32],\n rowCount: 1,\n colCount: 1,\n renderedRowCount: 1,\n renderedColCount: 1,\n }];\n\n if (args.asPdf) {\n return renderCanvasesToPdf(\n await renderSheetsToCanvases(\n sheets,\n args.placements,\n args.annotations,\n labels,\n { borderlessSignatures: true },\n ),\n args.fileName,\n args.pageDecorations,\n );\n }\n\n if (\n args.exportState?.sourceArrayBuffer &&\n args.exportState.sourceFileType === \"xlsx\"\n ) {\n return preserveNativeSpreadsheetFile({\n sourceArrayBuffer: args.exportState.sourceArrayBuffer,\n fileName: args.fileName,\n sheets,\n placements: args.placements,\n annotations: args.annotations,\n labels,\n dirtyCellAddressesBySheet: args.exportState.dirtyCellAddressesBySheet,\n });\n }\n\n const workbook = new ExcelJS.Workbook();\n workbook.creator = \"Hive Viewer\";\n workbook.created = new Date();\n\n for (const sheet of sheets) {\n const worksheet = workbook.addWorksheet(sheet.name);\n for (let colIndex = 0; colIndex < sheet.colCount; colIndex += 1) {\n const column = worksheet.getColumn(colIndex + 1);\n const width = sheet.colWidths[colIndex] ?? 96;\n column.hidden = width === 0;\n if (!column.hidden) {\n column.width = Math.max(8, Number((width / 7).toFixed(2)));\n }\n }\n\n for (let rowIndex = 0; rowIndex < sheet.rowCount; rowIndex += 1) {\n const row = worksheet.getRow(rowIndex + 1);\n const height = sheet.rowHeights[rowIndex] ?? 32;\n row.hidden = height === 0;\n if (!row.hidden) {\n row.height = Number((height * 0.75).toFixed(2));\n }\n }\n\n for (const cellModel of Object.values(sheet.cells)) {\n const decoded = XLSX.utils.decode_cell(cellModel.address);\n const cell = worksheet.getCell(decoded.r + 1, decoded.c + 1);\n cell.value = getSpreadsheetCellValueForExport(cellModel) as ExcelJS.CellValue;\n applySpreadsheetCellFormatting(cell, cellModel);\n }\n\n for (const merge of sheet.merges) {\n worksheet.mergeCells(\n merge.startRow + 1,\n merge.startCol + 1,\n merge.endRow + 1,\n merge.endCol + 1,\n );\n }\n\n const totalWidth =\n SHEET_ROW_HEADER_WIDTH +\n sheet.colWidths\n .slice(0, sheet.renderedColCount)\n .reduce((sum, value) => sum + value, 0);\n const totalHeight =\n SHEET_COLUMN_HEADER_HEIGHT +\n sheet.rowHeights\n .slice(0, sheet.renderedRowCount)\n .reduce((sum, value) => sum + value, 0);\n\n for (const placement of args.placements.filter(\n (candidate) => candidate.surfaceKey === `sheet:${sheet.name}`,\n )) {\n const imageId = workbook.addImage({\n base64: await createSignatureStampDataUrl(placement),\n extension: \"png\",\n });\n const pixelX = clamp(\n placement.x * totalWidth - SHEET_ROW_HEADER_WIDTH,\n 0,\n Math.max(totalWidth - SHEET_ROW_HEADER_WIDTH, 0),\n );\n const pixelY = clamp(\n placement.y * totalHeight - SHEET_COLUMN_HEADER_HEIGHT,\n 0,\n Math.max(totalHeight - SHEET_COLUMN_HEADER_HEIGHT, 0),\n );\n\n worksheet.addImage(imageId, {\n tl: {\n col: offsetToGridPosition(pixelX, sheet.colWidths),\n row: offsetToGridPosition(pixelY, sheet.rowHeights),\n },\n ext: {\n width: placement.width * totalWidth,\n height: placement.height * totalHeight,\n },\n });\n }\n\n for (const annotation of args.annotations.filter(\n (candidate) => candidate.surfaceKey === `sheet:${sheet.name}`,\n )) {\n const imageId = workbook.addImage({\n base64: await createAnnotationCardDataUrl(annotation, 720, 360, labels),\n extension: \"png\",\n });\n const pixelX = clamp(\n annotation.x * totalWidth - SHEET_ROW_HEADER_WIDTH,\n 0,\n Math.max(totalWidth - SHEET_ROW_HEADER_WIDTH, 0),\n );\n const pixelY = clamp(\n annotation.y * totalHeight - SHEET_COLUMN_HEADER_HEIGHT,\n 0,\n Math.max(totalHeight - SHEET_COLUMN_HEADER_HEIGHT, 0),\n );\n\n worksheet.addImage(imageId, {\n tl: {\n col: offsetToGridPosition(pixelX, sheet.colWidths),\n row: offsetToGridPosition(pixelY, sheet.rowHeights),\n },\n ext: {\n width: annotation.width * totalWidth,\n height: annotation.height * totalHeight,\n },\n });\n }\n }\n\n const buffer = await workbook.xlsx.writeBuffer();\n\n return {\n base64: arrayBufferToBase64(toArrayBuffer(buffer)),\n fileName: replaceExtension(args.fileName, \"xlsx\"),\n fileType: \"xlsx\" as const,\n mimeType: mimeTypeForFileType(\"xlsx\"),\n };\n}\n","import type { SupportedFileType } from \"../types\";\n\nconst extensionFileTypes: Record<string, SupportedFileType> = {\n pdf: \"pdf\",\n md: \"md\",\n docx: \"docx\",\n doc: \"doc\",\n rtf: \"rtf\",\n txt: \"txt\",\n jpeg: \"jpeg\",\n jpg: \"jpg\",\n png: \"png\",\n gif: \"gif\",\n bmp: \"bmp\",\n svg: \"svg\",\n xlsx: \"xlsx\",\n xls: \"xls\",\n csv: \"csv\",\n pptx: \"pptx\",\n ppt: \"ppt\",\n xml: \"xml\",\n};\n\nconst mimeFileTypes: Record<string, SupportedFileType> = {\n \"application/pdf\": \"pdf\",\n \"text/markdown\": \"md\",\n \"text/plain\": \"txt\",\n \"text/csv\": \"csv\",\n \"text/xml\": \"xml\",\n \"application/xml\": \"xml\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":\n \"docx\",\n \"application/msword\": \"doc\",\n \"application/rtf\": \"rtf\",\n \"text/rtf\": \"rtf\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\":\n \"xlsx\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\":\n \"pptx\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"image/bmp\": \"bmp\",\n \"image/svg+xml\": \"svg\",\n};\n\nfunction normalizeMimeType(mimeType?: string) {\n return mimeType?.split(\";\")[0]?.trim().toLowerCase();\n}\n\nfunction getFileNameFromUrl(fileUrl?: string) {\n if (!fileUrl) {\n return undefined;\n }\n\n try {\n const url = new URL(fileUrl);\n const name = decodeURIComponent(url.pathname.split(\"/\").pop() || \"\");\n return name || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getFileNameFromBlob(blob?: Blob) {\n if (!blob || typeof File === \"undefined\" || !(blob instanceof File)) {\n return undefined;\n }\n\n return blob.name || undefined;\n}\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 mimeType?: string,\n): SupportedFileType {\n if (explicit) {\n return explicit;\n }\n\n const ext = (name?.split(\".\").pop() || \"\").toLowerCase();\n if (ext && extensionFileTypes[ext]) {\n return extensionFileTypes[ext];\n }\n\n const normalizedMimeType = normalizeMimeType(mimeType);\n if (normalizedMimeType && mimeFileTypes[normalizedMimeType]) {\n return mimeFileTypes[normalizedMimeType];\n }\n\n return \"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++) {\n bytes[i] = bin.charCodeAt(i);\n }\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 cleanup?: () => void;\n}> {\n const inputFileName =\n args.fileName ?? getFileNameFromBlob(args.blob) ?? getFileNameFromUrl(args.fileUrl);\n const fileType = guessFileType(inputFileName, args.fileType, args.blob?.type);\n const fileName = inputFileName ?? `document.${fileType}`;\n\n if (args.blob) {\n const ab = await args.blob.arrayBuffer();\n const url = URL.createObjectURL(args.blob);\n return {\n fileType,\n fileName,\n arrayBuffer: ab,\n url,\n cleanup: () => URL.revokeObjectURL(url),\n };\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) {\n throw new Error(`Failed to fetch file (${res.status})`);\n }\n\n const resolvedFileType = guessFileType(\n inputFileName,\n args.fileType,\n res.headers.get(\"content-type\") || undefined,\n );\n const resolvedFileName = inputFileName ?? `document.${resolvedFileType}`;\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 {\n fileType: resolvedFileType,\n fileName: resolvedFileName,\n arrayBuffer: ab,\n url: args.fileUrl,\n };\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 {\n fileType: resolvedFileType,\n fileName: resolvedFileName,\n arrayBuffer: out.buffer,\n url: args.fileUrl,\n };\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 ExcelJS from \"exceljs\";\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport * as XLSX from \"xlsx\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type {\n SpreadsheetExportState,\n SpreadsheetCellExportModel,\n SpreadsheetMergeModel,\n SpreadsheetSheetExportModel,\n} from \"../internal/exportModels\";\nimport type {\n DocumentSurfaceOverlayState,\n DocumentMode,\n} from \"../types\";\n\ninterface SpreadsheetEditorProps {\n mode: DocumentMode;\n fileName: string;\n arrayBuffer?: ArrayBuffer;\n currentPage: number;\n onPageCount: (n: number) => void;\n onCurrentPageChange: (p: number) => void;\n onThumbs: (thumbs: Array<string | undefined>) => void;\n onExportStateChange?: (state: SpreadsheetExportState | null) => void;\n signatureOverlay: DocumentSurfaceOverlayState;\n locale: Record<string, string>;\n}\n\ntype SheetModel = SpreadsheetSheetExportModel;\n\nconst MAX_RENDER_ROWS = 400;\nconst MAX_RENDER_COLS = 120;\n\nfunction toColumnLabel(index: number) {\n let label = \"\";\n let current = index;\n\n while (current >= 0) {\n label = String.fromCharCode((current % 26) + 65) + label;\n current = Math.floor(current / 26) - 1;\n }\n\n return label;\n}\n\nfunction makeCellKey(row: number, col: number) {\n return `${row}:${col}`;\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value == null) {\n return value;\n }\n\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction stripArgbAlpha(argb?: string) {\n if (!argb) {\n return undefined;\n }\n\n const normalized = argb.replace(\"#\", \"\").trim();\n if (normalized.length === 8) {\n return `#${normalized.slice(2)}`;\n }\n if (normalized.length === 6) {\n return `#${normalized}`;\n }\n return undefined;\n}\n\nfunction getExcelColor(value: unknown) {\n if (!isRecord(value)) {\n return undefined;\n }\n\n if (typeof value.argb === \"string\") {\n return stripArgbAlpha(value.argb);\n }\n\n return undefined;\n}\n\nfunction noteToString(note: unknown) {\n if (!note) {\n return undefined;\n }\n\n if (typeof note === \"string\") {\n return note;\n }\n\n if (Array.isArray(note)) {\n const parts = note\n .map((entry) => {\n if (typeof entry === \"string\") {\n return entry;\n }\n if (isRecord(entry) && typeof entry.text === \"string\") {\n return entry.text;\n }\n return \"\";\n })\n .filter(Boolean);\n\n return parts.length > 0 ? parts.join(\"\\n\") : undefined;\n }\n\n if (isRecord(note) && Array.isArray(note.texts)) {\n return noteToString(note.texts);\n }\n\n return undefined;\n}\n\nfunction richTextToString(value: unknown) {\n if (!Array.isArray(value)) {\n return \"\";\n }\n\n return value\n .map((entry) => {\n if (isRecord(entry) && typeof entry.text === \"string\") {\n return entry.text;\n }\n return \"\";\n })\n .join(\"\");\n}\n\nfunction inferValueKind(value: unknown): SpreadsheetCellExportModel[\"valueKind\"] {\n if (value == null) {\n return \"blank\";\n }\n if (typeof value === \"string\") {\n return \"string\";\n }\n if (typeof value === \"number\") {\n return \"number\";\n }\n if (typeof value === \"boolean\") {\n return \"boolean\";\n }\n if (value instanceof Date) {\n return \"date\";\n }\n if (isRecord(value)) {\n if (typeof value.formula === \"string\") {\n return \"formula\";\n }\n if (typeof value.hyperlink === \"string\") {\n return \"hyperlink\";\n }\n if (Array.isArray(value.richText)) {\n return \"richText\";\n }\n if (value.error != null) {\n return \"error\";\n }\n }\n return \"unknown\";\n}\n\nfunction isCellMetadataOnly(cell?: SpreadsheetCellExportModel | null) {\n if (!cell) {\n return false;\n }\n\n return Boolean(\n cell.note ||\n cell.numFmt ||\n cell.font ||\n cell.fill ||\n cell.alignment ||\n cell.border,\n );\n}\n\nfunction getCellInputValue(cell?: SpreadsheetCellExportModel | null) {\n if (!cell) {\n return \"\";\n }\n\n if (cell.formula) {\n return `=${cell.formula}`;\n }\n\n if (typeof cell.value === \"string\") {\n return cell.value;\n }\n\n if (typeof cell.value === \"number\" || typeof cell.value === \"boolean\") {\n return String(cell.value);\n }\n\n if (cell.value instanceof Date) {\n return cell.value.toISOString();\n }\n\n return cell.displayValue;\n}\n\nfunction createMergeLookup(merges: SpreadsheetMergeModel[]) {\n const starts = new Map<string, SpreadsheetMergeModel>();\n const covered = new Set<string>();\n\n for (const merge of merges) {\n starts.set(`${merge.startRow}:${merge.startCol}`, merge);\n\n for (let row = merge.startRow; row <= merge.endRow; row += 1) {\n for (let col = merge.startCol; col <= merge.endCol; col += 1) {\n if (row === merge.startRow && col === merge.startCol) {\n continue;\n }\n covered.add(`${row}:${col}`);\n }\n }\n }\n\n return { starts, covered };\n}\n\nfunction makeSheetThumbnail(sheet: SheetModel, index: number) {\n const previewRows = sheet.data.slice(0, 3);\n const previewText = previewRows\n .map((row) => row.slice(0, 3).filter(Boolean).join(\" | \"))\n .filter(Boolean)\n .join(\" | \");\n\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"160\" height=\"96\">\n <rect width=\"100%\" height=\"100%\" fill=\"#eff6ff\" rx=\"12\" ry=\"12\" />\n <rect x=\"12\" y=\"12\" width=\"136\" height=\"18\" fill=\"#2563eb\" rx=\"6\" ry=\"6\" />\n <text x=\"20\" y=\"25\" fill=\"#ffffff\" font-size=\"10\" font-family=\"Arial\">${sheet.name}</text>\n <text x=\"20\" y=\"50\" fill=\"#1e3a8a\" font-size=\"12\" font-family=\"Arial\">Sheet ${index + 1}</text>\n <text x=\"20\" y=\"68\" fill=\"#334155\" font-size=\"9\" font-family=\"Arial\">${previewText || \"Workbook preview\"}</text>\n </svg>`;\n\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nfunction createEmptyGrid(rowCount: number, colCount: number) {\n return Array.from({ length: rowCount }, () =>\n Array.from({ length: colCount }, () => \"\"),\n );\n}\n\nfunction createBlankSheetModel(name: string): SheetModel {\n const rowCount = 40;\n const colCount = 12;\n\n return {\n name,\n data: createEmptyGrid(rowCount, colCount),\n cells: {},\n merges: [],\n colWidths: Array.from({ length: colCount }, () => 96),\n rowHeights: Array.from({ length: rowCount }, () => 32),\n rowCount,\n colCount,\n renderedRowCount: rowCount,\n renderedColCount: colCount,\n };\n}\n\nfunction getNextSheetName(sheets: SheetModel[]) {\n let index = sheets.length + 1;\n let candidate = `Sheet${index}`;\n\n while (sheets.some((sheet) => sheet.name === candidate)) {\n index += 1;\n candidate = `Sheet${index}`;\n }\n\n return candidate;\n}\n\nfunction appendBlankRow(sheet: SheetModel): SheetModel {\n const nextRowCount = sheet.rowCount + 1;\n const nextRenderedRowCount = Math.min(nextRowCount, MAX_RENDER_ROWS);\n const nextData =\n sheet.renderedRowCount < MAX_RENDER_ROWS\n ? [\n ...sheet.data.map((row) => [...row]),\n Array.from({ length: sheet.renderedColCount }, () => \"\"),\n ]\n : sheet.data.map((row) => [...row]);\n\n return {\n ...sheet,\n data: nextData,\n rowCount: nextRowCount,\n renderedRowCount: nextRenderedRowCount,\n rowHeights: [...sheet.rowHeights, 32],\n };\n}\n\nfunction appendBlankColumn(sheet: SheetModel): SheetModel {\n const nextColCount = sheet.colCount + 1;\n const nextRenderedColCount = Math.min(nextColCount, MAX_RENDER_COLS);\n const nextData = sheet.data.map((row) => {\n const nextRow = [...row];\n if (sheet.renderedColCount < MAX_RENDER_COLS) {\n nextRow.push(\"\");\n }\n return nextRow;\n });\n\n return {\n ...sheet,\n data: nextData,\n colCount: nextColCount,\n renderedColCount: nextRenderedColCount,\n colWidths: [...sheet.colWidths, 96],\n };\n}\n\nfunction buildEditedCellModel(\n address: string,\n input: string,\n existing?: SpreadsheetCellExportModel,\n): SpreadsheetCellExportModel | null {\n const base: SpreadsheetCellExportModel = existing\n ? {\n ...existing,\n value: cloneSerializable(existing.value),\n result: cloneSerializable(existing.result),\n font: existing.font ? cloneSerializable(existing.font) : undefined,\n fill: existing.fill ? cloneSerializable(existing.fill) : undefined,\n alignment: existing.alignment\n ? cloneSerializable(existing.alignment)\n : undefined,\n border: existing.border ? cloneSerializable(existing.border) : undefined,\n }\n : {\n address,\n displayValue: \"\",\n value: null,\n valueKind: \"blank\",\n };\n\n if (!input) {\n const cleared: SpreadsheetCellExportModel = {\n ...base,\n address,\n displayValue: \"\",\n value: null,\n valueKind: \"blank\",\n formula: undefined,\n result: undefined,\n hyperlink: existing?.hyperlink,\n };\n\n return isCellMetadataOnly(cleared) ? cleared : null;\n }\n\n if (input.startsWith(\"=\") && input.trim().length > 1) {\n const formula = input.trim().slice(1);\n return {\n ...base,\n address,\n displayValue: input,\n value: { formula },\n valueKind: \"formula\",\n formula,\n result: undefined,\n };\n }\n\n if (/^(true|false)$/i.test(input.trim())) {\n return {\n ...base,\n address,\n displayValue: input,\n value: /^true$/i.test(input.trim()),\n valueKind: \"boolean\",\n formula: undefined,\n result: undefined,\n };\n }\n\n if (/^-?\\d+(\\.\\d+)?$/.test(input.trim())) {\n return {\n ...base,\n address,\n displayValue: input,\n value: Number(input),\n valueKind: \"number\",\n formula: undefined,\n result: undefined,\n };\n }\n\n return {\n ...base,\n address,\n displayValue: input,\n value: input,\n valueKind: \"string\",\n formula: undefined,\n result: undefined,\n };\n}\n\nfunction createCellModelFromExcelCell(\n cell: ExcelJS.Cell,\n): SpreadsheetCellExportModel | null {\n const value = cell.value;\n const valueKind = inferValueKind(value);\n const note = noteToString(cell.note);\n const hasMetadata = Boolean(\n note ||\n cell.numFmt ||\n cell.font ||\n cell.fill ||\n cell.alignment ||\n cell.border,\n );\n\n if (value == null && !hasMetadata) {\n return null;\n }\n\n let formula: string | undefined;\n let result: unknown;\n let hyperlink: string | undefined;\n\n if (isRecord(value)) {\n if (typeof value.formula === \"string\") {\n formula = value.formula;\n result = value.result;\n }\n if (typeof value.hyperlink === \"string\") {\n hyperlink = value.hyperlink;\n }\n }\n\n return {\n address: cell.address,\n displayValue:\n valueKind === \"richText\"\n ? richTextToString(isRecord(value) ? value.richText : undefined)\n : cell.text || \"\",\n value: cloneSerializable(value),\n valueKind,\n formula,\n result: cloneSerializable(result),\n hyperlink,\n note,\n numFmt:\n cell.numFmt == null || cell.numFmt === \"\"\n ? undefined\n : String(cell.numFmt),\n font: cell.font ? cloneSerializable(cell.font) : undefined,\n fill: cell.fill ? cloneSerializable(cell.fill) : undefined,\n alignment: cell.alignment ? cloneSerializable(cell.alignment) : undefined,\n border: cell.border ? cloneSerializable(cell.border) : undefined,\n };\n}\n\nfunction createCellModelFromXlsxCell(\n address: string,\n cell: XLSX.CellObject,\n): SpreadsheetCellExportModel | null {\n if (!cell) {\n return null;\n }\n\n const note = Array.isArray(cell.c)\n ? cell.c.map((comment) => comment.t || \"\").join(\"\\n\")\n : undefined;\n const hyperlink =\n cell.l && typeof cell.l.Target === \"string\" ? cell.l.Target : undefined;\n const valueKind = cell.f\n ? \"formula\"\n : cell.t === \"n\"\n ? \"number\"\n : cell.t === \"b\"\n ? \"boolean\"\n : cell.t === \"d\"\n ? \"date\"\n : hyperlink\n ? \"hyperlink\"\n : cell.t === \"e\"\n ? \"error\"\n : \"string\";\n const displayValue =\n typeof cell.w === \"string\"\n ? cell.w\n : cell.v == null\n ? \"\"\n : String(cell.v);\n\n if (!displayValue && !cell.v && !cell.f && !note && !hyperlink && !cell.z) {\n return null;\n }\n\n return {\n address,\n displayValue,\n value: cloneSerializable(cell.f ? { formula: cell.f, result: cell.v } : cell.v),\n valueKind,\n formula: cell.f || undefined,\n result: cell.f ? cloneSerializable(cell.v) : undefined,\n hyperlink,\n note,\n numFmt: cell.z == null || cell.z === \"\" ? undefined : String(cell.z),\n };\n}\n\nfunction getAlignmentValue(\n value: unknown,\n key: \"horizontal\" | \"vertical\" | \"wrapText\",\n) {\n return isRecord(value) ? value[key] : undefined;\n}\n\nfunction getCellTextColor(cell?: SpreadsheetCellExportModel) {\n if (!cell?.font) {\n return undefined;\n }\n\n return getExcelColor(isRecord(cell.font) ? cell.font.color : undefined);\n}\n\nfunction getCellBackgroundColor(cell?: SpreadsheetCellExportModel) {\n if (!cell?.fill || !isRecord(cell.fill)) {\n return undefined;\n }\n\n return getExcelColor(cell.fill.fgColor) || getExcelColor(cell.fill.bgColor);\n}\n\nfunction getCellStyle(cell?: SpreadsheetCellExportModel): React.CSSProperties {\n const style: React.CSSProperties = {};\n\n const textColor = getCellTextColor(cell);\n if (textColor) {\n style.color = textColor;\n }\n\n const backgroundColor = getCellBackgroundColor(cell);\n if (backgroundColor) {\n style.background = backgroundColor;\n }\n\n if (cell?.font && isRecord(cell.font)) {\n if (typeof cell.font.name === \"string\") {\n style.fontFamily = cell.font.name;\n }\n if (typeof cell.font.size === \"number\") {\n style.fontSize = `${cell.font.size}px`;\n }\n if (cell.font.bold) {\n style.fontWeight = 700;\n }\n if (cell.font.italic) {\n style.fontStyle = \"italic\";\n }\n if (cell.font.underline) {\n style.textDecoration = \"underline\";\n }\n if (cell.font.strike) {\n style.textDecoration = style.textDecoration\n ? `${style.textDecoration} line-through`\n : \"line-through\";\n }\n }\n\n if (cell?.alignment) {\n const horizontal = getAlignmentValue(cell.alignment, \"horizontal\");\n const vertical = getAlignmentValue(cell.alignment, \"vertical\");\n const wrapText = getAlignmentValue(cell.alignment, \"wrapText\");\n\n if (typeof horizontal === \"string\") {\n style.textAlign =\n horizontal === \"center\" ? \"center\" : horizontal === \"right\" ? \"right\" : \"left\";\n }\n\n if (typeof vertical === \"string\") {\n style.verticalAlign =\n vertical === \"middle\" ? \"middle\" : vertical === \"bottom\" ? \"bottom\" : \"top\";\n }\n\n if (wrapText === true) {\n style.whiteSpace = \"pre-wrap\";\n }\n }\n\n if (cell?.hyperlink && !style.color) {\n style.color = \"#1d4ed8\";\n style.textDecoration = style.textDecoration\n ? `${style.textDecoration} underline`\n : \"underline\";\n }\n\n return style;\n}\n\nfunction buildSheetModelFromExcelWorksheet(worksheet: ExcelJS.Worksheet): SheetModel {\n const dimensions = worksheet.dimensions;\n const rowCount = Math.max(dimensions?.bottom ?? worksheet.rowCount ?? 1, 1);\n const colCount = Math.max(dimensions?.right ?? worksheet.columnCount ?? 1, 1);\n const renderedRowCount = Math.min(rowCount, MAX_RENDER_ROWS);\n const renderedColCount = Math.min(colCount, MAX_RENDER_COLS);\n const data = createEmptyGrid(renderedRowCount, renderedColCount);\n const cells: Record<string, SpreadsheetCellExportModel> = {};\n\n worksheet.eachRow({ includeEmpty: true }, (row, rowNumber) => {\n if (rowNumber > rowCount) {\n return;\n }\n\n row.eachCell({ includeEmpty: true }, (cell, colNumber) => {\n if (colNumber > colCount) {\n return;\n }\n\n const model = createCellModelFromExcelCell(cell);\n if (!model) {\n return;\n }\n\n const rowIndex = rowNumber - 1;\n const colIndex = colNumber - 1;\n const key = makeCellKey(rowIndex, colIndex);\n cells[key] = model;\n\n if (rowIndex < renderedRowCount && colIndex < renderedColCount) {\n data[rowIndex][colIndex] = model.displayValue;\n }\n });\n });\n\n const colWidths = Array.from({ length: colCount }, (_, index) => {\n const column = worksheet.getColumn(index + 1);\n if (column.hidden) {\n return 0;\n }\n const width = Number(column.width ?? 12);\n return Math.max(64, Math.round(width * 7));\n });\n\n const rowHeights = Array.from({ length: rowCount }, (_, index) => {\n const row = worksheet.getRow(index + 1);\n if (row.hidden) {\n return 0;\n }\n return row.height\n ? Math.max(20, Math.round(Number(row.height) / 0.75))\n : 32;\n });\n\n const mergeRanges = Array.isArray(worksheet.model?.merges)\n ? worksheet.model.merges\n : [];\n\n return {\n name: worksheet.name,\n data,\n cells,\n rowCount,\n colCount,\n renderedRowCount,\n renderedColCount,\n merges: mergeRanges.map((range) => {\n const decoded = XLSX.utils.decode_range(range);\n return {\n startRow: decoded.s.r,\n startCol: decoded.s.c,\n endRow: decoded.e.r,\n endCol: decoded.e.c,\n };\n }),\n colWidths,\n rowHeights,\n };\n}\n\nfunction buildSheetModelsFromXlsxWorkbook(workbook: XLSX.WorkBook): SheetModel[] {\n return workbook.SheetNames.map((name) => {\n const worksheet = workbook.Sheets[name];\n const decodedRange = worksheet[\"!ref\"]\n ? XLSX.utils.decode_range(worksheet[\"!ref\"])\n : XLSX.utils.decode_range(\"A1\");\n const rowCount = Math.max(decodedRange.e.r + 1, 1);\n const colCount = Math.max(decodedRange.e.c + 1, 1);\n const renderedRowCount = Math.min(rowCount, MAX_RENDER_ROWS);\n const renderedColCount = Math.min(colCount, MAX_RENDER_COLS);\n const data = createEmptyGrid(renderedRowCount, renderedColCount);\n const cells: Record<string, SpreadsheetCellExportModel> = {};\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {\n for (let colIndex = 0; colIndex < colCount; colIndex += 1) {\n const address = XLSX.utils.encode_cell({ r: rowIndex, c: colIndex });\n const cell = worksheet[address];\n if (!cell) {\n continue;\n }\n\n const model = createCellModelFromXlsxCell(address, cell);\n if (!model) {\n continue;\n }\n\n const key = makeCellKey(rowIndex, colIndex);\n cells[key] = model;\n\n if (rowIndex < renderedRowCount && colIndex < renderedColCount) {\n data[rowIndex][colIndex] = model.displayValue;\n }\n }\n }\n\n const colWidths = Array.from({ length: colCount }, (_, index) => {\n const width = worksheet[\"!cols\"]?.[index];\n if (width?.hidden) {\n return 0;\n }\n return width?.wpx ?? Math.max(64, Math.round((width?.wch ?? 12) * 8));\n });\n\n const rowHeights = Array.from({ length: rowCount }, (_, index) => {\n const height = worksheet[\"!rows\"]?.[index];\n if (height?.hidden) {\n return 0;\n }\n return height?.hpx ?? 32;\n });\n\n return {\n name,\n data,\n cells,\n rowCount,\n colCount,\n renderedRowCount,\n renderedColCount,\n merges: (worksheet[\"!merges\"] ?? []).map((merge) => ({\n startRow: merge.s.r,\n startCol: merge.s.c,\n endRow: merge.e.r,\n endCol: merge.e.c,\n })),\n colWidths,\n rowHeights,\n };\n });\n}\n\nasync function buildSheetModels(arrayBuffer: ArrayBuffer, fileName: string) {\n const isNativeXlsx = fileName.toLowerCase().endsWith(\".xlsx\");\n\n if (isNativeXlsx) {\n try {\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(arrayBuffer.slice(0));\n if (workbook.worksheets.length > 0) {\n return workbook.worksheets.map(buildSheetModelFromExcelWorksheet);\n }\n } catch (error) {\n console.warn(\"ExcelJS parse failed, falling back to xlsx\", error);\n }\n }\n\n const workbook = XLSX.read(arrayBuffer, {\n type: \"array\",\n cellStyles: true,\n cellFormula: true,\n cellDates: true,\n sheetStubs: true,\n });\n\n return buildSheetModelsFromXlsxWorkbook(workbook);\n}\n\nexport function SpreadsheetEditor(props: SpreadsheetEditorProps) {\n const readonly = props.mode === \"view\";\n const [sheets, setSheets] = useState<SheetModel[]>([]);\n const [activeCell, setActiveCell] = useState({ row: 0, col: 0 });\n const [hasEdits, setHasEdits] = useState(false);\n const [dirtyCellAddressesBySheet, setDirtyCellAddressesBySheet] = useState<\n Record<string, string[]>\n >({});\n\n useEffect(() => {\n if (!props.arrayBuffer) {\n const nextSheets =\n props.mode === \"create\" ? [createBlankSheetModel(\"Sheet1\")] : [];\n setSheets(nextSheets);\n setHasEdits(false);\n setDirtyCellAddressesBySheet({});\n props.onPageCount(Math.max(nextSheets.length, 1));\n props.onThumbs(nextSheets.map(makeSheetThumbnail));\n return;\n }\n\n let cancelled = false;\n\n const loadSheets = async () => {\n try {\n const nextSheets = await buildSheetModels(props.arrayBuffer!, props.fileName);\n if (cancelled) {\n return;\n }\n\n setSheets(nextSheets);\n setHasEdits(false);\n setDirtyCellAddressesBySheet({});\n props.onPageCount(Math.max(nextSheets.length, 1));\n props.onThumbs(nextSheets.map(makeSheetThumbnail));\n if (props.currentPage > nextSheets.length) {\n props.onCurrentPageChange(1);\n }\n setActiveCell({ row: 0, col: 0 });\n } catch (error) {\n console.error(\"Spreadsheet load error:\", error);\n if (cancelled) {\n return;\n }\n setSheets([]);\n setHasEdits(false);\n setDirtyCellAddressesBySheet({});\n props.onPageCount(1);\n props.onThumbs([]);\n }\n };\n\n void loadSheets();\n\n return () => {\n cancelled = true;\n };\n }, [\n props.arrayBuffer,\n props.fileName,\n props.onCurrentPageChange,\n props.onPageCount,\n props.onThumbs,\n props.mode,\n ]);\n\n useEffect(() => {\n props.onExportStateChange?.(\n sheets.length > 0\n ? {\n sheets,\n sourceArrayBuffer: props.arrayBuffer,\n sourceFileType: props.fileName.toLowerCase().endsWith(\".xlsx\")\n ? \"xlsx\"\n : props.fileName.toLowerCase().endsWith(\".xls\")\n ? \"xls\"\n : props.fileName.toLowerCase().endsWith(\".csv\")\n ? \"csv\"\n : undefined,\n hasEdits,\n dirtyCellAddressesBySheet,\n }\n : null,\n );\n\n return () => {\n props.onExportStateChange?.(null);\n };\n }, [\n dirtyCellAddressesBySheet,\n hasEdits,\n props.arrayBuffer,\n props.fileName,\n props.onExportStateChange,\n sheets,\n ]);\n\n const activeSheetIndex = Math.max(\n 0,\n Math.min(props.currentPage - 1, Math.max(sheets.length - 1, 0)),\n );\n const activeSheet = sheets[activeSheetIndex];\n\n const mergeLookup = useMemo(\n () => createMergeLookup(activeSheet?.merges ?? []),\n [activeSheet],\n );\n\n const activeCellModel = activeSheet?.cells[makeCellKey(activeCell.row, activeCell.col)];\n const activeCellValue = getCellInputValue(activeCellModel);\n\n const addSheet = () => {\n const nextSheets = [...sheets, createBlankSheetModel(getNextSheetName(sheets))];\n setHasEdits(true);\n setSheets(nextSheets);\n props.onPageCount(nextSheets.length);\n props.onThumbs(nextSheets.map(makeSheetThumbnail));\n props.onCurrentPageChange(nextSheets.length);\n setActiveCell({ row: 0, col: 0 });\n };\n\n const addRow = () => {\n if (!activeSheet) {\n return;\n }\n\n setHasEdits(true);\n setSheets((prev) =>\n prev.map((sheet, index) =>\n index === activeSheetIndex ? appendBlankRow(sheet) : sheet,\n ),\n );\n };\n\n const addColumn = () => {\n if (!activeSheet) {\n return;\n }\n\n setHasEdits(true);\n setSheets((prev) =>\n prev.map((sheet, index) =>\n index === activeSheetIndex ? appendBlankColumn(sheet) : sheet,\n ),\n );\n };\n\n const updateCell = (row: number, col: number, value: string) => {\n setHasEdits(true);\n const address = XLSX.utils.encode_cell({ r: row, c: col });\n const activeSheetName = sheets[activeSheetIndex]?.name;\n if (activeSheetName) {\n setDirtyCellAddressesBySheet((prev) => {\n const next = new Set(prev[activeSheetName] ?? []);\n next.add(address);\n return {\n ...prev,\n [activeSheetName]: Array.from(next),\n };\n });\n }\n setSheets((prev) =>\n prev.map((sheet, index) => {\n if (index !== activeSheetIndex) {\n return sheet;\n }\n\n const nextData = sheet.data.map((sheetRow) => [...sheetRow]);\n const nextCells = { ...sheet.cells };\n const cellKey = makeCellKey(row, col);\n const nextCell = buildEditedCellModel(address, value, nextCells[cellKey]);\n\n if (nextCell) {\n nextCells[cellKey] = nextCell;\n } else {\n delete nextCells[cellKey];\n }\n\n if (row < sheet.renderedRowCount && col < sheet.renderedColCount) {\n nextData[row][col] = nextCell?.displayValue ?? \"\";\n }\n\n return {\n ...sheet,\n data: nextData,\n cells: nextCells,\n };\n }),\n );\n };\n\n if (!activeSheet) {\n return (\n <div className=\"hv-view-single\">\n <div className=\"hv-page-container\" style={{ padding: \"48px\" }}>\n <p className=\"hv-empty-state\">{props.locale[\"documents.sheetMissing\"]}</p>\n </div>\n </div>\n );\n }\n\n const isTruncated =\n activeSheet.rowCount > activeSheet.renderedRowCount ||\n activeSheet.colCount > activeSheet.renderedColCount;\n\n return (\n <div className=\"hv-view-single\">\n <div className=\"hv-page-container hv-sheet-container\">\n <div className=\"hv-sheet-tabs\">\n <div className=\"hv-sheet-tab-list\">\n {sheets.map((sheet, index) => (\n <button\n key={sheet.name}\n type=\"button\"\n className={`hv-sheet-tab ${index === activeSheetIndex ? \"active\" : \"\"}`}\n onClick={() => {\n props.onCurrentPageChange(index + 1);\n setActiveCell({ row: 0, col: 0 });\n }}\n >\n {sheet.name}\n </button>\n ))}\n </div>\n\n {!readonly && (\n <div className=\"hv-sheet-actions\">\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={addSheet}\n >\n {props.locale[\"documents.sheetAddSheet\"]}\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={addRow}\n >\n {props.locale[\"documents.sheetAddRow\"]}\n </button>\n <button\n type=\"button\"\n className=\"hv-btn\"\n onClick={addColumn}\n >\n {props.locale[\"documents.sheetAddColumn\"]}\n </button>\n </div>\n )}\n </div>\n\n <div className=\"hv-sheet-formula-bar\">\n <div className=\"hv-sheet-formula-cell\">\n {toColumnLabel(activeCell.col)}\n {activeCell.row + 1}\n </div>\n <input\n value={activeCellValue}\n readOnly={readonly}\n onChange={(event) =>\n updateCell(activeCell.row, activeCell.col, event.target.value)\n }\n className=\"hv-sheet-formula-input\"\n />\n </div>\n\n {isTruncated && (\n <div className=\"hv-sheet-viewport-note\">\n {props.locale[\"documents.sheetTruncated\"]\n .replace(\"{rows}\", String(activeSheet.renderedRowCount))\n .replace(\"{cols}\", String(activeSheet.renderedColCount))}\n </div>\n )}\n\n <div className=\"hv-sheet-scroll\">\n <div className=\"hv-sheet-surface\">\n <table className=\"hv-sheet-table\">\n <thead>\n <tr>\n <th className=\"hv-sheet-corner\" />\n {Array.from(\n { length: activeSheet.renderedColCount },\n (_, colIndex) => (\n <th\n key={toColumnLabel(colIndex)}\n className=\"hv-sheet-column-header\"\n style={{\n minWidth: activeSheet.colWidths[colIndex] ?? 96,\n width: activeSheet.colWidths[colIndex] ?? 96,\n }}\n >\n {toColumnLabel(colIndex)}\n </th>\n ),\n )}\n </tr>\n </thead>\n <tbody>\n {activeSheet.data.map((row, rowIndex) => (\n <tr\n key={rowIndex}\n style={{ height: activeSheet.rowHeights[rowIndex] ?? 32 }}\n >\n <td className=\"hv-sheet-row-header\">{rowIndex + 1}</td>\n {row.map((cellValue, colIndex) => {\n const cellKey = makeCellKey(rowIndex, colIndex);\n if (mergeLookup.covered.has(cellKey)) {\n return null;\n }\n\n const merge = mergeLookup.starts.get(cellKey);\n const cellModel = activeSheet.cells[cellKey];\n const width = activeSheet.colWidths[colIndex] ?? 96;\n\n return (\n <td\n key={cellKey}\n rowSpan={merge ? merge.endRow - merge.startRow + 1 : 1}\n colSpan={merge ? merge.endCol - merge.startCol + 1 : 1}\n className={`hv-sheet-cell ${activeCell.row === rowIndex && activeCell.col === colIndex ? \"active\" : \"\"}`}\n contentEditable={!readonly}\n suppressContentEditableWarning\n onFocus={() => setActiveCell({ row: rowIndex, col: colIndex })}\n onClick={() => setActiveCell({ row: rowIndex, col: colIndex })}\n onBlur={(event) =>\n updateCell(rowIndex, colIndex, event.currentTarget.innerText)\n }\n title={cellModel?.note || cellModel?.hyperlink || cellModel?.formula}\n style={{\n minWidth: width,\n width,\n ...getCellStyle(cellModel),\n }}\n >\n {cellValue}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n\n <SignatureOverlay\n surfaceKey={`sheet:${activeSheet.name}`}\n surfaceKind=\"sheet\"\n sheetName={activeSheet.name}\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={props.signatureOverlay.annotationPlaceholder}\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo } from \"react\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type {\n DocumentSurfaceOverlayState,\n SupportedFileType,\n} from \"../types\";\n\ninterface ImageRendererProps {\n arrayBuffer?: ArrayBuffer;\n fileType: SupportedFileType;\n fileName: string;\n signatureOverlay: DocumentSurfaceOverlayState;\n locale: Record<string, string>;\n}\n\nexport function ImageRenderer(props: ImageRendererProps) {\n const url = useMemo(() => {\n if (!props.arrayBuffer) {\n return undefined;\n }\n\n const mime =\n props.fileType === \"svg\"\n ? \"image/svg+xml\"\n : props.fileType === \"png\"\n ? \"image/png\"\n : \"image/jpeg\";\n\n return URL.createObjectURL(new Blob([props.arrayBuffer], { type: mime }));\n }, [props.arrayBuffer, props.fileType]);\n\n useEffect(() => {\n return () => {\n if (url) {\n URL.revokeObjectURL(url);\n }\n };\n }, [url]);\n\n if (!props.arrayBuffer || !url) {\n return (\n <div className=\"hv-view-single\">\n <div className=\"hv-page-container\" style={{ padding: \"48px\" }}>\n <p className=\"hv-empty-state\">{props.locale[\"documents.imageMissing\"]}</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"hv-view-single\">\n <div className=\"hv-page-container hv-image-surface\">\n <img src={url} alt={props.fileName} className=\"hv-image-renderer\" />\n <SignatureOverlay\n surfaceKey=\"image:main\"\n surfaceKind=\"image\"\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={props.signatureOverlay.annotationPlaceholder}\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\r\n\r\nimport {\n getDocument,\n GlobalWorkerOptions,\n type PDFDocumentProxy,\n} from \"pdfjs-dist\";\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type { DocumentSurfaceOverlayState, PageLayout } from \"../types\";\n\nlet pdfWorkerBlobUrlPromise: Promise<string> | null = null;\n\nfunction yieldToBrowser() {\n return new Promise<void>((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n}\n\nasync function resolvePdfWorkerSrc(customWorkerSrc?: string) {\n if (customWorkerSrc) {\n return customWorkerSrc;\n }\n\n if (!pdfWorkerBlobUrlPromise) {\n pdfWorkerBlobUrlPromise = import(\"../../generated/pdfWorkerBundle\")\n .then(({ pdfWorkerBundleSource }) =>\n URL.createObjectURL(\n new Blob([pdfWorkerBundleSource], { type: \"text/javascript\" }),\n ),\n )\n .catch((error) => {\n pdfWorkerBlobUrlPromise = null;\n throw error;\n });\n }\n\n return pdfWorkerBlobUrlPromise;\n}\n\ninterface PdfRendererProps {\n url?: string;\n arrayBuffer?: ArrayBuffer;\n workerSrc?: string;\n locale: Record<string, string>;\n layout: PageLayout;\n currentPage: number;\n onPageCount: (n: number) => void;\n onCurrentPageChange: (p: number) => void;\n onThumbs: (thumbs: Array<string | undefined>) => void;\n signatureOverlay: DocumentSurfaceOverlayState;\n}\n\r\nexport function PdfRenderer(props: PdfRendererProps) {\n const { url, arrayBuffer, layout, currentPage, workerSrc } = props;\n const [doc, setDoc] = useState<PDFDocumentProxy | null>(null);\n const [error, setError] = useState<string | null>(null);\n const thumbnailJobRef = useRef(0);\n\n useEffect(() => {\n let active = true;\n const thumbnailJobId = thumbnailJobRef.current + 1;\n thumbnailJobRef.current = thumbnailJobId;\n\n const loadPdf = async () => {\n // If no source, do nothing\n if (!url && !arrayBuffer) return;\n\r\n setError(null);\r\n\n try {\n GlobalWorkerOptions.workerSrc = await resolvePdfWorkerSrc(workerSrc);\n\n // FIX 2: Clone the ArrayBuffer!\n // PDF.js transfers the buffer to the worker, which \"detaches\" (empties) the original.\n // We pass a slice (copy) so the original data in DocumentViewer remains valid.\n const dataSource = arrayBuffer\r\n ? { data: arrayBuffer.slice(0) }\r\n : { url: url! };\r\n\r\n const loadingTask = getDocument(dataSource);\r\n\r\n const pdf = await loadingTask.promise;\n\n if (active) {\n setDoc(pdf);\n props.onPageCount(pdf.numPages);\n void generateThumbnails(pdf, thumbnailJobId);\n }\n } catch (err: any) {\n // Quietly handle errors (e.g. password protected files)\r\n console.error(\"PDF Load Error:\", err);\r\n if (active) setError(err.message || \"Failed to load PDF\");\r\n }\r\n };\r\n\r\n loadPdf();\n return () => {\n active = false;\n thumbnailJobRef.current += 1;\n };\n }, [url, arrayBuffer, workerSrc]); // Re-run if file changes\n\n const generateThumbnails = async (\n pdf: PDFDocumentProxy,\n thumbnailJobId: number,\n ) => {\n try {\n const thumbs: Array<string | undefined> = Array.from({\n length: pdf.numPages,\n });\n props.onThumbs([...thumbs]);\n\n for (let i = 1; i <= pdf.numPages; i++) {\n if (thumbnailJobRef.current !== thumbnailJobId) {\n return;\n }\n\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale: 0.2 });\n const canvas = document.createElement(\"canvas\");\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n\r\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n await page.render({ canvasContext: ctx, viewport }).promise;\n if (thumbnailJobRef.current !== thumbnailJobId) {\n return;\n }\n thumbs[i - 1] = canvas.toDataURL();\n }\n\n if (i === 1 || i === pdf.numPages || i % 4 === 0) {\n props.onThumbs([...thumbs]);\n }\n\n if (i % 4 === 0) {\n await yieldToBrowser();\n }\n }\n\n if (thumbnailJobRef.current === thumbnailJobId) {\n props.onThumbs([...thumbs]);\n }\n } catch (e) {\n /* ignore */\n }\n };\n\r\n const pagesToRender = useMemo(() => {\r\n if (!doc) return [];\r\n const p = Math.max(1, Math.min(currentPage, doc.numPages));\r\n if (layout === \"side-by-side\" && doc.numPages > 1) {\r\n if (p === 1) return [1];\r\n const left = p % 2 === 0 ? p : p - 1;\r\n return left + 1 <= doc.numPages ? [left, left + 1] : [left];\r\n }\r\n return [p];\r\n }, [doc, currentPage, layout]);\r\n\r\n if (error) {\n return (\n <div className=\"hv-page-container\" style={{ padding: \"32px\" }}>\n <div className=\"hv-error-banner\">\n <strong>{props.locale[\"documents.pdfLoadErrorTitle\"]}</strong>\n <p>{error}</p>\n </div>\n </div>\n );\n }\n\r\n return (\r\n <div\r\n className={`hv-doc-scroll ${layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"}`}\n >\n {pagesToRender.map((page) => (\n <PdfPage\n key={page}\n doc={doc}\n pageNum={page}\n signatureOverlay={props.signatureOverlay}\n />\n ))}\n </div>\n );\n}\n\nfunction PdfPage({\n doc,\n pageNum,\n signatureOverlay,\n}: {\n doc: PDFDocumentProxy | null;\n pageNum: number;\n signatureOverlay: PdfRendererProps[\"signatureOverlay\"];\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\r\n useEffect(() => {\r\n if (!doc || !canvasRef.current) return;\r\n let active = true;\r\n\r\n const render = async () => {\r\n try {\r\n const page = await doc.getPage(pageNum);\r\n if (!active) return;\r\n\r\n const scale = 1.5; // High fidelity\r\n const viewport = page.getViewport({ scale });\r\n const canvas = canvasRef.current!;\r\n const ctx = canvas.getContext(\"2d\");\r\n if (!ctx) return;\r\n\r\n canvas.width = viewport.width;\r\n canvas.height = viewport.height;\r\n\r\n canvas.style.width = `${viewport.width / scale}px`;\r\n canvas.style.height = `${viewport.height / scale}px`;\r\n\r\n await page.render({ canvasContext: ctx, viewport }).promise;\r\n } catch (e) {\r\n console.error(\"Page render error:\", e);\r\n }\r\n };\r\n render();\r\n return () => {\r\n active = false;\r\n };\r\n }, [doc, pageNum]);\r\n\r\n return (\n <div\n className=\"hv-page-container\"\n style={{\r\n minHeight: \"600px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\n >\n <canvas ref={canvasRef} className=\"hv-pdf-canvas\" />\n <SignatureOverlay\n surfaceKey={`page:${pageNum}`}\n surfaceKind=\"page\"\n page={pageNum}\n placements={signatureOverlay.placements}\n annotations={signatureOverlay.annotations}\n pendingSignature={signatureOverlay.pendingSignature}\n pendingAnnotation={signatureOverlay.pendingAnnotation}\n activePlacementId={signatureOverlay.activePlacementId}\n activeAnnotationId={signatureOverlay.activeAnnotationId}\n placeHint={signatureOverlay.placeHint}\n annotationHint={signatureOverlay.annotationHint}\n annotationPlaceholder={signatureOverlay.annotationPlaceholder}\n signatureAltLabel={signatureOverlay.signatureAltLabel}\n signatureAltByLabel={signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={signatureOverlay.signatureNoteIndicatorLabel}\n signatureColorLabel={signatureOverlay.signatureColorLabel}\n signatureColorNames={signatureOverlay.signatureColorNames}\n removeSignatureLabel={signatureOverlay.removeSignatureLabel}\n annotationTitle={signatureOverlay.annotationTitle}\n linkedAnnotationTitle={signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={signatureOverlay.onSelectPlacement}\n onSelectAnnotation={signatureOverlay.onSelectAnnotation}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport JSZip from \"jszip\";\nimport { SignatureOverlay } from \"../components/SignatureOverlay\";\nimport type {\n PptxExportState,\n PptxParagraphModel,\n PptxRunModel,\n PptxSlideElementModel,\n PptxSlideModel,\n} from \"../internal/exportModels\";\nimport type {\n DocumentSurfaceOverlayState,\n PageLayout,\n} from \"../types\";\n\nconst NS_P = \"http://schemas.openxmlformats.org/presentationml/2006/main\";\nconst NS_A = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst NS_R =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\n\ninterface PptxRendererProps {\n arrayBuffer?: ArrayBuffer;\n fileName?: string;\n locale: Record<string, string>;\n layout: PageLayout;\n currentPage: number;\n onCurrentPageChange: (p: number) => void;\n onPageCount: (n: number) => void;\n onThumbs: (thumbs: Array<string | undefined>) => void;\n onExportStateChange?: (state: PptxExportState | null) => void;\n signatureOverlay: DocumentSurfaceOverlayState;\n}\n\nconst SLIDE_RENDER_BASE_WIDTH = 1280;\nconst SLIDE_RENDER_MAX_VIEW_WIDTH = 1080;\nconst SLIDE_RENDER_MIN_VIEW_WIDTH = 300;\nconst SLIDE_RENDER_GAP = 24;\n\nfunction alignToClassName(align?: string) {\n if (align === \"ctr\") {\n return \"align-ctr\";\n }\n if (align === \"r\") {\n return \"align-r\";\n }\n return \"align-l\";\n}\n\nfunction isBrowserRenderableSlideImage(source: string) {\n return !/^data:image\\/(?:emf|wmf|tiff)/i.test(source);\n}\n\nfunction PresentationImage(props: { src: string; alt: string }) {\n const [failed, setFailed] = useState(!isBrowserRenderableSlideImage(props.src));\n\n if (failed) {\n return <div className=\"hv-slide-image-fallback\">{props.alt}</div>;\n }\n\n return (\n <img\n src={props.src}\n alt={props.alt}\n className=\"hv-slide-image\"\n onError={() => setFailed(true)}\n />\n );\n}\n\nfunction parseColor(solidFill: Element | null): string | undefined {\n if (!solidFill) {\n return undefined;\n }\n\n const srgbClr = solidFill.getElementsByTagNameNS(NS_A, \"srgbClr\")[0];\n if (srgbClr) {\n const value = srgbClr.getAttribute(\"val\");\n return value ? `#${value}` : undefined;\n }\n\n const schemeClr = solidFill.getElementsByTagNameNS(NS_A, \"schemeClr\")[0];\n if (schemeClr) {\n const value = schemeClr.getAttribute(\"val\");\n const colorMap: Record<string, string> = {\n tx1: \"#0f172a\",\n bg1: \"#ffffff\",\n tx2: \"#1e293b\",\n accent1: \"#2563eb\",\n accent2: \"#f97316\",\n accent3: \"#14b8a6\",\n accent4: \"#facc15\",\n accent5: \"#8b5cf6\",\n accent6: \"#22c55e\",\n };\n return colorMap[value || \"\"] || \"#0f172a\";\n }\n\n return undefined;\n}\n\nfunction resolveZipPath(basePath: string, target: string) {\n const normalizedBase = basePath.split(\"/\").filter(Boolean);\n normalizedBase.pop();\n\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n\n if (segment === \"..\") {\n normalizedBase.pop();\n } else {\n normalizedBase.push(segment);\n }\n }\n\n return normalizedBase.join(\"/\");\n}\n\nfunction getMimeType(path: string) {\n const lower = path.toLowerCase();\n if (lower.endsWith(\".png\")) {\n return \"image/png\";\n }\n if (lower.endsWith(\".bmp\")) {\n return \"image/bmp\";\n }\n if (lower.endsWith(\".jpg\") || lower.endsWith(\".jpeg\")) {\n return \"image/jpeg\";\n }\n if (lower.endsWith(\".gif\")) {\n return \"image/gif\";\n }\n if (lower.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (lower.endsWith(\".tif\") || lower.endsWith(\".tiff\")) {\n return \"image/tiff\";\n }\n if (lower.endsWith(\".webp\")) {\n return \"image/webp\";\n }\n if (lower.endsWith(\".avif\")) {\n return \"image/avif\";\n }\n if (lower.endsWith(\".emf\")) {\n return \"image/emf\";\n }\n if (lower.endsWith(\".wmf\")) {\n return \"image/wmf\";\n }\n return \"application/octet-stream\";\n}\n\nfunction parsePresentationSize(xml: string | undefined) {\n if (!xml) {\n return { width: 9144000, height: 5143500 };\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(xml, \"application/xml\");\n const size = doc.getElementsByTagNameNS(NS_P, \"sldSz\")[0];\n\n return {\n width: Number(size?.getAttribute(\"cx\") || \"9144000\"),\n height: Number(size?.getAttribute(\"cy\") || \"5143500\"),\n };\n}\n\nfunction parseRelationships(xml: string | undefined, slidePath: string) {\n if (!xml) {\n return new Map<string, string>();\n }\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(xml, \"application/xml\");\n const relationshipNodes = Array.from(doc.getElementsByTagName(\"Relationship\"));\n const map = new Map<string, string>();\n\n for (const node of relationshipNodes) {\n const target = node.getAttribute(\"Target\");\n const id = node.getAttribute(\"Id\");\n const targetMode = node.getAttribute(\"TargetMode\");\n\n if (!target || !id || targetMode === \"External\") {\n continue;\n }\n\n map.set(id, resolveZipPath(slidePath, target));\n }\n\n return map;\n}\n\nfunction parseTransform(element: Element | null) {\n const xfrm = element?.getElementsByTagNameNS(NS_A, \"xfrm\")[0];\n const off = xfrm?.getElementsByTagNameNS(NS_A, \"off\")[0];\n const ext = xfrm?.getElementsByTagNameNS(NS_A, \"ext\")[0];\n\n return {\n x: Number(off?.getAttribute(\"x\") || \"0\"),\n y: Number(off?.getAttribute(\"y\") || \"0\"),\n width: Number(ext?.getAttribute(\"cx\") || \"0\"),\n height: Number(ext?.getAttribute(\"cy\") || \"0\"),\n rotation: Number(xfrm?.getAttribute(\"rot\") || \"0\") / 60000,\n };\n}\n\nfunction parseParagraphs(txBody: Element | null) {\n if (!txBody) {\n return [];\n }\n\n const paragraphs = Array.from(txBody.getElementsByTagNameNS(NS_A, \"p\"));\n\n return paragraphs\n .map((paragraph, paragraphIndex) => {\n const paragraphProps = paragraph.getElementsByTagNameNS(NS_A, \"pPr\")[0];\n const bulletChar =\n paragraphProps?.getElementsByTagNameNS(NS_A, \"buChar\")[0]?.getAttribute(\"char\")\n || undefined;\n const autoNumbered = Boolean(\n paragraphProps?.getElementsByTagNameNS(NS_A, \"buAutoNum\")[0],\n );\n const runs = Array.from(paragraph.childNodes)\n .flatMap((node) => {\n if (!(node instanceof Element)) {\n return [];\n }\n\n const tagName = node.localName;\n if (tagName === \"r\") {\n const textNode = node.getElementsByTagNameNS(NS_A, \"t\")[0];\n const text = textNode?.textContent || \"\";\n if (!text) {\n return [];\n }\n\n const runProps = node.getElementsByTagNameNS(NS_A, \"rPr\")[0];\n const size = Number(runProps?.getAttribute(\"sz\") || \"1800\");\n\n return [{\n text,\n color:\n parseColor(runProps?.getElementsByTagNameNS(NS_A, \"solidFill\")[0] || null) ||\n \"#0f172a\",\n fontSize: Math.max(12, (size / 100) * 1.333),\n bold: runProps?.getAttribute(\"b\") === \"1\",\n italic: runProps?.getAttribute(\"i\") === \"1\",\n underline: runProps?.getAttribute(\"u\") === \"sng\",\n } satisfies PptxRunModel];\n }\n\n if (tagName === \"br\") {\n return [{ text: \"\\n\" }];\n }\n\n if (tagName === \"fld\") {\n const textNode = node.getElementsByTagNameNS(NS_A, \"t\")[0];\n return textNode?.textContent ? [{ text: textNode.textContent }] : [];\n }\n\n return [];\n })\n .filter((run) => run.text.length > 0);\n\n return {\n runs,\n align: paragraphProps?.getAttribute(\"algn\") || \"l\",\n level: Number(paragraphProps?.getAttribute(\"lvl\") || \"0\"),\n bullet: Boolean(bulletChar) || autoNumbered,\n bulletText: bulletChar || (autoNumbered ? `${paragraphIndex + 1}.` : undefined),\n } satisfies PptxParagraphModel;\n })\n .filter((paragraph) => paragraph.runs.length > 0);\n}\n\nasync function parseSlide(\n zip: JSZip,\n slidePath: string,\n slideXml: string,\n relationships: Map<string, string>,\n) {\n const parser = new DOMParser();\n const doc = parser.parseFromString(slideXml, \"application/xml\");\n const elements: PptxSlideElementModel[] = [];\n const shapeNodes = Array.from(doc.getElementsByTagNameNS(NS_P, \"sp\"));\n const pictureNodes = Array.from(doc.getElementsByTagNameNS(NS_P, \"pic\"));\n const bgNode = doc.getElementsByTagNameNS(NS_P, \"bg\")[0];\n const bgFill = bgNode\n ?.getElementsByTagNameNS(NS_P, \"bgPr\")[0]\n ?.getElementsByTagNameNS(NS_A, \"solidFill\")[0];\n const background = parseColor(bgFill || null) || \"#ffffff\";\n\n for (const shape of shapeNodes) {\n const shapeProps = shape.getElementsByTagNameNS(NS_P, \"spPr\")[0];\n const txBody = shape.getElementsByTagNameNS(NS_P, \"txBody\")[0];\n const paragraphs = parseParagraphs(txBody);\n const fill = parseColor(shapeProps?.getElementsByTagNameNS(NS_A, \"solidFill\")[0] || null);\n const line = parseColor(\n shapeProps\n ?.getElementsByTagNameNS(NS_A, \"ln\")[0]\n ?.getElementsByTagNameNS(NS_A, \"solidFill\")[0] || null,\n );\n const transform = parseTransform(shapeProps);\n\n if (paragraphs.length === 0 && !fill && !line) {\n continue;\n }\n\n elements.push({\n id: `shape-${elements.length + 1}`,\n kind: \"shape\",\n x: transform.x,\n y: transform.y,\n width: transform.width,\n height: transform.height,\n rotation: transform.rotation,\n fill,\n stroke: line,\n paragraphs,\n alt:\n shape\n .getElementsByTagNameNS(NS_P, \"cNvPr\")[0]\n ?.getAttribute(\"name\") || undefined,\n });\n }\n\n for (const picture of pictureNodes) {\n const blip = picture.getElementsByTagNameNS(NS_A, \"blip\")[0];\n const embedId = blip?.getAttributeNS(NS_R, \"embed\");\n const targetPath = embedId ? relationships.get(embedId) : undefined;\n if (!targetPath) {\n continue;\n }\n\n const imageFile = zip.file(targetPath);\n if (!imageFile) {\n continue;\n }\n\n const transform = parseTransform(\n picture.getElementsByTagNameNS(NS_P, \"spPr\")[0],\n );\n const base64 = await imageFile.async(\"base64\");\n\n elements.push({\n id: `image-${elements.length + 1}`,\n kind: \"image\",\n x: transform.x,\n y: transform.y,\n width: transform.width,\n height: transform.height,\n rotation: transform.rotation,\n imageSrc: `data:${getMimeType(targetPath)};base64,${base64}`,\n alt:\n picture\n .getElementsByTagNameNS(NS_P, \"cNvPr\")[0]\n ?.getAttribute(\"name\") || undefined,\n });\n }\n\n const allText = elements\n .flatMap((element) => element.paragraphs || [])\n .flatMap((paragraph) => paragraph.runs)\n .map((run) => run.text.replace(/\\n/g, \" \").trim())\n .filter(Boolean);\n\n return {\n background,\n elements,\n title: allText[0],\n summary: allText.slice(1, 4).join(\" \"),\n } satisfies PptxSlideModel;\n}\n\nfunction makeSlideThumbnail(slide: PptxSlideModel, index: number) {\n const title = slide.title || `Slide ${index + 1}`;\n const summary = slide.summary || \"Presentation preview\";\n const svg = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"160\" height=\"90\">\n <rect width=\"100%\" height=\"100%\" fill=\"${slide.background || \"#ffffff\"}\" rx=\"10\" ry=\"10\" />\n <rect x=\"10\" y=\"10\" width=\"140\" height=\"18\" fill=\"rgba(15,23,42,0.12)\" rx=\"6\" ry=\"6\" />\n <text x=\"16\" y=\"24\" fill=\"#0f172a\" font-size=\"10\" font-family=\"Arial\">${title}</text>\n <text x=\"16\" y=\"48\" fill=\"#334155\" font-size=\"9\" font-family=\"Arial\">${summary}</text>\n </svg>`;\n\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\nexport function PptxRenderer(props: PptxRendererProps) {\n const [slides, setSlides] = useState<PptxSlideModel[]>([]);\n const [slideSize, setSlideSize] = useState({ width: 9144000, height: 5143500 });\n const [error, setError] = useState<string | null>(null);\n const viewRef = useRef<HTMLDivElement>(null);\n const [viewWidth, setViewWidth] = useState(SLIDE_RENDER_MAX_VIEW_WIDTH);\n\n useEffect(() => {\n if (!props.arrayBuffer) {\n setSlides([]);\n props.onPageCount(1);\n props.onThumbs([]);\n props.onExportStateChange?.(null);\n return;\n }\n\n const loadPptx = async () => {\n try {\n const arrayBuffer = props.arrayBuffer;\n if (!arrayBuffer) {\n return;\n }\n\n const zip = await JSZip.loadAsync(arrayBuffer);\n const presentationXml = await zip.file(\"ppt/presentation.xml\")?.async(\"string\");\n const nextSize = parsePresentationSize(presentationXml);\n setSlideSize(nextSize);\n\n const slidePaths = Object.keys(zip.files)\n .filter((path) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(path))\n .sort((left, right) => {\n const leftNumber = Number(left.match(/slide(\\d+)/)?.[1] || \"0\");\n const rightNumber = Number(right.match(/slide(\\d+)/)?.[1] || \"0\");\n return leftNumber - rightNumber;\n });\n\n const parsedSlides: PptxSlideModel[] = [];\n for (const slidePath of slidePaths) {\n const slideXml = await zip.file(slidePath)?.async(\"string\");\n if (!slideXml) {\n continue;\n }\n\n const relsPath = slidePath.replace(\n /ppt\\/slides\\/(slide\\d+\\.xml)$/,\n \"ppt/slides/_rels/$1.rels\",\n );\n const relationshipsXml = await zip.file(relsPath)?.async(\"string\");\n const relationships = parseRelationships(relationshipsXml, slidePath);\n parsedSlides.push(await parseSlide(zip, slidePath, slideXml, relationships));\n }\n\n setSlides(parsedSlides);\n props.onPageCount(Math.max(parsedSlides.length, 1));\n props.onThumbs(parsedSlides.map(makeSlideThumbnail));\n props.onExportStateChange?.({\n slideSize: nextSize,\n slides: parsedSlides,\n sourceArrayBuffer: arrayBuffer.slice(0),\n sourceFileType: props.fileName?.toLowerCase().endsWith(\".ppt\")\n ? \"ppt\"\n : \"pptx\",\n });\n } catch (err: any) {\n setError(err.message || \"Failed to parse PPTX\");\n }\n };\n\n loadPptx();\n }, [props.arrayBuffer, props.onExportStateChange]);\n\n useEffect(() => {\n const host = viewRef.current;\n if (!host || typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const observer = new ResizeObserver((entries) => {\n const nextWidth = entries[0]?.contentRect.width;\n if (nextWidth) {\n setViewWidth(nextWidth);\n }\n });\n\n observer.observe(host);\n return () => observer.disconnect();\n }, []);\n\n const pagesToShow = useMemo(() => {\n if (slides.length === 0) {\n return [];\n }\n\n const validPage = Math.max(1, Math.min(props.currentPage, slides.length));\n\n if (props.layout === \"side-by-side\" && slides.length > 1) {\n if (validPage === 1) {\n return [1];\n }\n\n const left = validPage % 2 === 0 ? validPage : validPage - 1;\n return [left, left + 1].filter((page) => page <= slides.length);\n }\n\n return [validPage];\n }, [slides.length, props.currentPage, props.layout]);\n\n const slideViewportWidth = useMemo(() => {\n const boundedWidth = Math.max(\n SLIDE_RENDER_MIN_VIEW_WIDTH,\n Math.min(viewWidth, SLIDE_RENDER_MAX_VIEW_WIDTH * 2 + SLIDE_RENDER_GAP),\n );\n\n if (props.layout === \"side-by-side\" && pagesToShow.length > 1) {\n return Math.max(\n (boundedWidth - SLIDE_RENDER_GAP) / 2,\n SLIDE_RENDER_MIN_VIEW_WIDTH,\n );\n }\n\n return Math.max(\n Math.min(boundedWidth, SLIDE_RENDER_MAX_VIEW_WIDTH),\n SLIDE_RENDER_MIN_VIEW_WIDTH,\n );\n }, [pagesToShow.length, props.layout, viewWidth]);\n\n const sceneCoordScale = SLIDE_RENDER_BASE_WIDTH / slideSize.width;\n const sceneHeight = Math.max(1, Math.round(slideSize.height * sceneCoordScale));\n const sceneScale = slideViewportWidth / SLIDE_RENDER_BASE_WIDTH;\n\n if (error) {\n return <div className=\"hv-error-banner\">{error}</div>;\n }\n\n return (\n <div\n ref={viewRef}\n className={props.layout === \"side-by-side\" ? \"hv-view-double\" : \"hv-view-single\"}\n >\n {pagesToShow.map((pageNumber) => {\n const slide = slides[pageNumber - 1];\n if (!slide) {\n return null;\n }\n\n return (\n <div\n key={pageNumber}\n className=\"hv-page-container hv-slide-surface\"\n style={{\n aspectRatio: `${slideSize.width}/${slideSize.height}`,\n width:\n props.layout === \"side-by-side\" && pagesToShow.length > 1\n ? `${slideViewportWidth}px`\n : undefined,\n }}\n >\n <div\n className=\"hv-slide-stage\"\n style={{ background: slide.background || \"#ffffff\" }}\n >\n <div\n className=\"hv-slide-scene\"\n style={{\n width: `${SLIDE_RENDER_BASE_WIDTH}px`,\n height: `${sceneHeight}px`,\n transform: `scale(${sceneScale})`,\n }}\n >\n {slide.elements.map((element) => (\n <div\n key={element.id}\n className={`hv-slide-element ${element.kind}`}\n style={{\n left: `${element.x * sceneCoordScale}px`,\n top: `${element.y * sceneCoordScale}px`,\n width: `${element.width * sceneCoordScale}px`,\n height: `${element.height * sceneCoordScale}px`,\n transform: element.rotation\n ? `rotate(${element.rotation}deg)`\n : undefined,\n background: element.kind === \"shape\" ? element.fill || \"transparent\" : undefined,\n borderColor: element.stroke,\n }}\n >\n {element.kind === \"image\" && element.imageSrc ? (\n <PresentationImage\n src={element.imageSrc}\n alt={element.alt || \"Slide image\"}\n />\n ) : (\n <div className=\"hv-slide-textbox\">\n {element.paragraphs?.map((paragraph, paragraphIndex) => (\n <p\n key={`${element.id}-${paragraphIndex}`}\n className={`hv-slide-paragraph ${alignToClassName(paragraph.align)}`}\n style={{ paddingInlineStart: `${paragraph.level * 18}px` }}\n >\n {paragraph.bullet && <span className=\"hv-slide-bullet\">•</span>}\n <span className=\"hv-slide-paragraph-copy\">\n {paragraph.runs.map((run, runIndex) => (\n <span\n key={`${element.id}-${paragraphIndex}-${runIndex}`}\n style={{\n color: run.color,\n fontSize: Math.max(\n 12,\n (run.fontSize || 18) * sceneCoordScale,\n ),\n fontWeight: run.bold ? 700 : 400,\n fontStyle: run.italic ? \"italic\" : \"normal\",\n textDecoration: run.underline ? \"underline\" : \"none\",\n whiteSpace: \"pre-wrap\",\n }}\n >\n {run.text}\n </span>\n ))}\n </span>\n </p>\n ))}\n </div>\n )}\n </div>\n ))}\n\n <SignatureOverlay\n surfaceKey={`slide:${pageNumber}`}\n surfaceKind=\"slide\"\n slide={pageNumber}\n placements={props.signatureOverlay.placements}\n annotations={props.signatureOverlay.annotations}\n pendingSignature={props.signatureOverlay.pendingSignature}\n pendingAnnotation={props.signatureOverlay.pendingAnnotation}\n activePlacementId={props.signatureOverlay.activePlacementId}\n activeAnnotationId={props.signatureOverlay.activeAnnotationId}\n placeHint={props.signatureOverlay.placeHint}\n annotationHint={props.signatureOverlay.annotationHint}\n annotationPlaceholder={props.signatureOverlay.annotationPlaceholder}\n signatureAltLabel={props.signatureOverlay.signatureAltLabel}\n signatureAltByLabel={props.signatureOverlay.signatureAltByLabel}\n signatureNoteIndicatorLabel={\n props.signatureOverlay.signatureNoteIndicatorLabel\n }\n signatureColorLabel={props.signatureOverlay.signatureColorLabel}\n signatureColorNames={props.signatureOverlay.signatureColorNames}\n removeSignatureLabel={props.signatureOverlay.removeSignatureLabel}\n annotationTitle={props.signatureOverlay.annotationTitle}\n linkedAnnotationTitle={props.signatureOverlay.linkedAnnotationTitle}\n linkedAnnotationBadge={props.signatureOverlay.linkedAnnotationBadge}\n openAnnotationLabel={props.signatureOverlay.openAnnotationLabel}\n removeAnnotationLabel={props.signatureOverlay.removeAnnotationLabel}\n onPlaceSignature={props.signatureOverlay.onPlaceSignature}\n onPlaceAnnotation={props.signatureOverlay.onPlaceAnnotation}\n onUpdatePlacement={props.signatureOverlay.onUpdatePlacement}\n onUpdateAnnotation={props.signatureOverlay.onUpdateAnnotation}\n onRemovePlacement={props.signatureOverlay.onRemovePlacement}\n onRemoveAnnotation={props.signatureOverlay.onRemoveAnnotation}\n onSelectPlacement={props.signatureOverlay.onSelectPlacement}\n onSelectAnnotation={props.signatureOverlay.onSelectAnnotation}\n />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\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.annotate\": \"Add Annotation\",\n \"toolbar.headerFooter\": \"Header & Footer\",\n \"toolbar.save\": \"Save\",\n \"toolbar.finalizePdf\": \"Finalize PDF\",\n \"toolbar.exportPdf\": \"Export as PDF\",\n \"toolbar.zoomIn\": \"Zoom in\",\n \"toolbar.zoomOut\": \"Zoom out\",\n \"toolbar.zoomReset\": \"Reset zoom\",\n \"thumbnails.title\": \"Thumbnails\",\n \"thumbnails.page\": \"Page\",\n \"signatures.title\": \"Signatures\",\n \"signatures.empty\": \"No signatures\",\n \"signatures.new\": \"New Signature\",\n \"signatures.ready\": \"Ready to place\",\n \"signatures.cancelPlacement\": \"Cancel placement\",\n \"signatures.drawTitle\": \"Draw Signature\",\n \"signatures.drawHelp\": \"Sign above using your mouse or finger\",\n \"signatures.clear\": \"Clear\",\n \"signatures.createAndUse\": \"Create & Use\",\n \"signatures.placeHint\": \"Click on the document surface to place the signature.\",\n \"signatures.alt\": \"Signature\",\n \"signatures.altBy\": \"Signature by\",\n \"signatures.noteIndicator\": \"Note\",\n \"signatures.remove\": \"Remove signature\",\n \"signatures.color\": \"Ink color\",\n \"signatures.color.black\": \"Black\",\n \"signatures.color.blue\": \"Blue\",\n \"signatures.color.red\": \"Red\",\n \"signatures.color.green\": \"Green\",\n \"annotations.placeHint\": \"Click on the document surface to place an annotation.\",\n \"annotations.placeholder\": \"Add instruction or review note...\",\n \"annotations.title\": \"Annotation\",\n \"annotations.linkedTitle\": \"Signature Note\",\n \"annotations.linkedBadge\": \"Linked\",\n \"annotations.open\": \"Open annotation\",\n \"annotations.remove\": \"Remove annotation\",\n \"thumbnails.empty\": \"No previews available\",\n \"documents.unsupportedFileType\": \"Unsupported file type\",\n \"documents.imageMissing\": \"No image data provided\",\n \"documents.sheetMissing\": \"No spreadsheet data provided\",\n \"documents.sheetTruncated\":\n \"Showing the first {rows} rows and {cols} columns for performance.\",\n \"documents.sheetAddSheet\": \"Add sheet\",\n \"documents.sheetAddRow\": \"Add row\",\n \"documents.sheetAddColumn\": \"Add column\",\n \"documents.modeFallbackTitle\": \"Mode adjusted\",\n \"documents.modeFallbackDescription\":\n \"{mode} mode is not available for {fileType}. Showing view mode instead.\",\n \"documents.createUnsupportedTitle\": \"Create mode not available\",\n \"documents.createUnsupportedDescription\":\n \"Create mode currently supports {formats}.\",\n \"documents.richText.renderingPages\": \"Rendering pages...\",\n \"documents.richText.processingText\": \"Processing text...\",\n \"documents.richText.parseError\": \"Error parsing document.\",\n \"documents.richText.toolbar.paragraph\": \"Paragraph\",\n \"documents.richText.toolbar.heading1\": \"Heading 1\",\n \"documents.richText.toolbar.heading2\": \"Heading 2\",\n \"documents.richText.toolbar.heading3\": \"Heading 3\",\n \"documents.richText.toolbar.bold\": \"Bold\",\n \"documents.richText.toolbar.italic\": \"Italic\",\n \"documents.richText.toolbar.underline\": \"Underline\",\n \"documents.richText.toolbar.bullets\": \"Bulleted list\",\n \"documents.richText.toolbar.numbered\": \"Numbered list\",\n \"documents.richText.toolbar.quote\": \"Quote\",\n \"documents.richText.toolbar.alignLeft\": \"Align left\",\n \"documents.richText.toolbar.alignCenter\": \"Align center\",\n \"documents.richText.toolbar.alignRight\": \"Align right\",\n \"documents.richText.toolbar.link\": \"Insert link\",\n \"documents.richText.toolbar.image\": \"Insert image\",\n \"documents.richText.toolbar.imageSizeLabel\": \"Image size\",\n \"documents.richText.toolbar.imageCropLabel\": \"Image crop\",\n \"documents.richText.toolbar.imageAlignLabel\": \"Image align\",\n \"documents.richText.toolbar.imageSmall\": \"Small\",\n \"documents.richText.toolbar.imageMedium\": \"Medium\",\n \"documents.richText.toolbar.imageLarge\": \"Large\",\n \"documents.richText.toolbar.imageFull\": \"Full width\",\n \"documents.richText.toolbar.imageCropOriginal\": \"Original\",\n \"documents.richText.toolbar.imageCropWide\": \"Wide\",\n \"documents.richText.toolbar.imageCropSquare\": \"Square\",\n \"documents.richText.toolbar.imageCropPortrait\": \"Portrait\",\n \"documents.richText.toolbar.divider\": \"Insert divider\",\n \"documents.richText.toolbar.table\": \"Insert table\",\n \"documents.richText.toolbar.tableAddRow\": \"Add row\",\n \"documents.richText.toolbar.tableAddColumn\": \"Add column\",\n \"documents.richText.toolbar.tableDeleteRow\": \"Delete row\",\n \"documents.richText.toolbar.tableDeleteColumn\": \"Delete column\",\n \"documents.richText.toolbar.clearFormatting\": \"Clear formatting\",\n \"documents.richText.toolbar.undo\": \"Undo\",\n \"documents.richText.toolbar.redo\": \"Redo\",\n \"documents.richText.toolbar.expandSection\": \"Open\",\n \"documents.richText.toolbar.collapseSection\": \"Hide\",\n \"documents.richText.toolbar.styleLabel\": \"Text style\",\n \"documents.richText.toolbar.formatLabel\": \"Formatting\",\n \"documents.richText.toolbar.insertLabel\": \"Insert\",\n \"documents.richText.toolbar.mediaLabel\": \"Media\",\n \"documents.richText.toolbar.tableLabel\": \"Table tools\",\n \"documents.richText.toolbar.historyLabel\": \"History\",\n \"documents.richText.templates\": \"Templates\",\n \"documents.richText.templatesShow\": \"Show templates\",\n \"documents.richText.templatesHide\": \"Hide templates\",\n \"documents.richText.template.blank\": \"Blank\",\n \"documents.richText.template.letter\": \"Letter\",\n \"documents.richText.template.notes\": \"Meeting notes\",\n \"documents.richText.template.agreement\": \"Agreement\",\n \"documents.richText.template.proposal\": \"Proposal\",\n \"documents.richText.templateDesc.blank\":\n \"A polished starting page with space for a title, summary, and first section.\",\n \"documents.richText.templateDesc.letter\":\n \"A professional business letter with subject line and key-point structure.\",\n \"documents.richText.templateDesc.notes\":\n \"A clean meeting-notes format with agenda, decisions, and follow-ups.\",\n \"documents.richText.templateDesc.agreement\":\n \"A well-structured agreement summary with commercial terms and approvals.\",\n \"documents.richText.templateDesc.proposal\":\n \"A client-ready proposal with scope, delivery plan, pricing, and assumptions.\",\n \"documents.richText.imageEditorTitle\": \"Image editor\",\n \"documents.richText.imageEditorHelp\":\n \"Drag the focus point in the preview to control which part of the image stays centered in cropped layouts.\",\n \"documents.richText.imageZoom\": \"Zoom\",\n \"documents.pdfLoadErrorTitle\": \"Error loading PDF\",\n \"a11y.viewer\": \"Document viewer\",\n \"a11y.ribbon\": \"Ribbon\",\n \"a11y.editor\": \"Document editor\",\n};\n","\"use client\";\n\nimport { Check, Plus, Trash2, X } from \"lucide-react\";\nimport React, { useMemo, useRef, useState } from \"react\";\nimport type { Signature, SignatureInkColor } from \"../types\";\nimport {\n normalizeSignature,\n normalizeSignatureDate,\n SIGNATURE_INK_COLORS,\n SIGNATURE_INK_COLOR_VALUES,\n} from \"../utils/signature\";\n\ninterface SignaturePanelProps {\n isOpen: boolean;\n onClose: () => void;\n onSelectSignature: (sig: Signature) => void;\n selectedSignature?: Signature | null;\n selectedColor: SignatureInkColor;\n onSelectedColorChange: (color: SignatureInkColor) => void;\n onClearSelection: () => void;\n externalSignatures?: Signature[];\n onSignRequest?: () => Promise<Signature>;\n locale: Record<string, string>;\n}\n\nfunction sameSignature(left: Signature, right: Signature) {\n if (left.id && right.id) {\n return left.id === right.id;\n }\n\n return (\n left.signatureImageUrl === right.signatureImageUrl &&\n left.signedBy === right.signedBy &&\n left.jobTitle === right.jobTitle &&\n left.dateSigned === right.dateSigned\n );\n}\n\nfunction trimSignatureCanvas(\n canvas: HTMLCanvasElement,\n padding = 16,\n alphaThreshold = 8,\n) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return canvas.toDataURL(\"image/png\");\n }\n\n const { width, height } = canvas;\n const imageData = ctx.getImageData(0, 0, width, height).data;\n let minX = width;\n let minY = height;\n let maxX = -1;\n let maxY = -1;\n\n for (let y = 0; y < height; y += 1) {\n for (let x = 0; x < width; x += 1) {\n const alpha = imageData[(y * width + x) * 4 + 3];\n if (alpha <= alphaThreshold) {\n continue;\n }\n\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n }\n\n if (maxX < minX || maxY < minY) {\n return canvas.toDataURL(\"image/png\");\n }\n\n const cropX = Math.max(0, minX - padding);\n const cropY = Math.max(0, minY - padding);\n const cropWidth = Math.min(width - cropX, maxX - minX + 1 + padding * 2);\n const cropHeight = Math.min(height - cropY, maxY - minY + 1 + padding * 2);\n const trimmedCanvas = document.createElement(\"canvas\");\n trimmedCanvas.width = cropWidth;\n trimmedCanvas.height = cropHeight;\n const trimmedCtx = trimmedCanvas.getContext(\"2d\");\n\n if (!trimmedCtx) {\n return canvas.toDataURL(\"image/png\");\n }\n\n trimmedCtx.drawImage(\n canvas,\n cropX,\n cropY,\n cropWidth,\n cropHeight,\n 0,\n 0,\n cropWidth,\n cropHeight,\n );\n\n return trimmedCanvas.toDataURL(\"image/png\");\n}\n\nexport function SignaturePanel(props: SignaturePanelProps) {\n const {\n isOpen,\n onClose,\n onSelectSignature,\n selectedSignature,\n selectedColor,\n onSelectedColorChange,\n onClearSelection,\n externalSignatures = [],\n onSignRequest,\n locale,\n } = props;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [localSignatures, setLocalSignatures] = useState<Signature[]>([]);\n const [showModal, setShowModal] = useState(false);\n const [isDrawing, setIsDrawing] = useState(false);\n const [hasInk, setHasInk] = useState(false);\n\n const signatures = useMemo(() => {\n const merged: Signature[] = [];\n\n for (const signature of [...externalSignatures, ...localSignatures]) {\n if (!merged.some((item) => sameSignature(item, signature))) {\n merged.push(signature);\n }\n }\n\n return merged;\n }, [externalSignatures, localSignatures]);\n\n const handleCreateClick = async () => {\n if (onSignRequest) {\n try {\n const requestedSignature = await onSignRequest();\n if (!requestedSignature?.signatureImageUrl) {\n return;\n }\n\n const newSignature = normalizeSignature(requestedSignature);\n onSelectSignature(newSignature);\n } catch (error) {\n console.error(\"Custom sign request failed\", error);\n }\n return;\n }\n\n setShowModal(true);\n setHasInk(false);\n requestAnimationFrame(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (canvas && ctx) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.lineWidth = 2.5;\n ctx.lineCap = \"round\";\n ctx.strokeStyle = \"#111827\";\n }\n });\n };\n\n const clearCanvas = () => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (canvas && ctx) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n setHasInk(false);\n }\n };\n\n const saveSignature = () => {\n const canvas = canvasRef.current;\n if (!canvas || !hasInk) {\n return;\n }\n\n const newSignature: Signature = {\n id: Date.now().toString(),\n signatureImageUrl: trimSignatureCanvas(canvas),\n dateSigned: normalizeSignatureDate(),\n };\n\n setLocalSignatures((prev) => [...prev, newSignature]);\n setShowModal(false);\n onSelectSignature(newSignature);\n };\n\n const startDraw = (\n event: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>,\n ) => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) {\n return;\n }\n\n const rect = canvas.getBoundingClientRect();\n const clientX =\n \"touches\" in event ? event.touches[0].clientX : event.clientX;\n const clientY =\n \"touches\" in event ? event.touches[0].clientY : event.clientY;\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n setIsDrawing(true);\n setHasInk(true);\n };\n\n const stopDraw = () => {\n const ctx = canvasRef.current?.getContext(\"2d\");\n ctx?.beginPath();\n setIsDrawing(false);\n };\n\n const draw = (\n event: React.MouseEvent<HTMLCanvasElement> | React.TouchEvent<HTMLCanvasElement>,\n ) => {\n if (!isDrawing) {\n return;\n }\n\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) {\n return;\n }\n\n const rect = canvas.getBoundingClientRect();\n const clientX =\n \"touches\" in event ? event.touches[0].clientX : event.clientX;\n const clientY =\n \"touches\" in event ? event.touches[0].clientY : event.clientY;\n const x = clientX - rect.left;\n const y = clientY - rect.top;\n\n ctx.lineTo(x, y);\n ctx.stroke();\n };\n\n return (\n <>\n <div\n className={`hv-sidebar hv-sidebar-right ${!isOpen ? \"collapsed\" : \"\"}`}\n style={{ width: isOpen ? \"300px\" : \"0\" }}\n >\n <div\n className=\"hv-sidebar-header\"\n style={{ justifyContent: \"space-between\", padding: \"12px 16px\" }}\n >\n <h3 style={{ margin: 0, fontSize: \"15px\", fontWeight: 600 }}>\n {locale[\"signatures.title\"]}\n </h3>\n <button\n onClick={onClose}\n className=\"hv-btn\"\n style={{ padding: \"4px\", border: \"none\" }}\n >\n <X size={18} />\n </button>\n </div>\n\n <div className=\"hv-thumb-list\">\n <button\n onClick={handleCreateClick}\n className=\"hv-btn\"\n style={{\n width: \"100%\",\n justifyContent: \"center\",\n border: \"2px dashed var(--hv-border)\",\n marginBottom: \"8px\",\n color: \"var(--hv-primary)\",\n }}\n >\n <Plus size={18} style={{ marginRight: \"8px\" }} />\n {locale[\"signatures.new\"]}\n </button>\n\n {selectedSignature && (\n <div className=\"hv-signature-selection-card\">\n <div className=\"hv-signature-selection-title\">\n {locale[\"signatures.ready\"]}\n </div>\n <img\n src={selectedSignature.signatureImageUrl}\n alt={\n selectedSignature.signedBy\n ? `Selected signature by ${selectedSignature.signedBy}`\n : \"Selected signature\"\n }\n className=\"hv-signature-selection-image\"\n />\n <div className=\"hv-signature-selection-copy\">\n {locale[\"signatures.placeHint\"]}\n </div>\n <div className=\"hv-signature-color-picker\">\n <span className=\"hv-signature-color-picker-label\">\n {locale[\"signatures.color\"]}\n </span>\n <div className=\"hv-signature-color-swatch-row\">\n {SIGNATURE_INK_COLORS.map((color) => (\n <button\n key={color}\n type=\"button\"\n className={`hv-signature-color-swatch ${selectedColor === color ? \"active\" : \"\"}`}\n style={{ background: SIGNATURE_INK_COLOR_VALUES[color] }}\n aria-label={`${locale[\"signatures.color\"]}: ${locale[`signatures.color.${color}`]}`}\n title={locale[`signatures.color.${color}`]}\n onClick={() => onSelectedColorChange(color)}\n />\n ))}\n </div>\n </div>\n <button\n type=\"button\"\n className=\"hv-btn\"\n style={{ width: \"100%\" }}\n onClick={onClearSelection}\n >\n {locale[\"signatures.cancelPlacement\"]}\n </button>\n </div>\n )}\n\n {signatures.length === 0 && (\n <div className=\"hv-signature-empty\">\n {locale[\"signatures.empty\"]}\n </div>\n )}\n\n {signatures.map((signature, index) => {\n const isLocal = localSignatures.some((item) =>\n sameSignature(item, signature),\n );\n const isSelected = selectedSignature\n ? sameSignature(selectedSignature, signature)\n : false;\n\n return (\n <div\n key={signature.id || `${signature.dateSigned}-${index}`}\n className={`hv-thumb-item hv-signature-item ${isSelected ? \"active\" : \"\"}`}\n >\n <button\n type=\"button\"\n className=\"hv-signature-item-main\"\n onClick={() => onSelectSignature(signature)}\n >\n <div className=\"hv-signature-item-stack\">\n <img\n src={signature.signatureImageUrl}\n alt={signature.signedBy ? `Signature by ${signature.signedBy}` : \"Signature\"}\n className=\"hv-signature-item-image\"\n />\n <div className=\"hv-signature-item-copy\">\n {signature.signedBy && <strong>{signature.signedBy}</strong>}\n {signature.jobTitle && <span>{signature.jobTitle}</span>}\n <span>\n {normalizeSignatureDate(signature.dateSigned)}\n </span>\n {signature.comment && <em>{signature.comment}</em>}\n </div>\n </div>\n {isSelected && (\n <span className=\"hv-signature-item-check\">\n <Check size={14} />\n </span>\n )}\n </button>\n\n {isLocal && (\n <button\n type=\"button\"\n className=\"hv-btn\"\n style={{\n position: \"absolute\",\n top: \"8px\",\n right: \"8px\",\n padding: \"4px\",\n color: \"#ef4444\",\n border: \"none\",\n background: \"var(--hv-paper-bg)\",\n }}\n onClick={(event) => {\n event.stopPropagation();\n setLocalSignatures((prev) =>\n prev.filter((item) => !sameSignature(item, signature)),\n );\n if (selectedSignature && sameSignature(selectedSignature, signature)) {\n onClearSelection();\n }\n }}\n >\n <Trash2 size={12} />\n </button>\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n {showModal && (\n <div className=\"hv-modal-overlay\">\n <div className=\"hv-modal\" style={{ width: \"450px\", maxWidth: \"90vw\" }}>\n <div\n style={{\n padding: \"16px 24px\",\n borderBottom: \"1px solid var(--hv-border)\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <h3 style={{ margin: 0, fontSize: \"18px\", fontWeight: 600 }}>\n {locale[\"signatures.drawTitle\"]}\n </h3>\n <button\n onClick={() => setShowModal(false)}\n className=\"hv-btn\"\n style={{ border: \"none\" }}\n >\n <X size={20} />\n </button>\n </div>\n\n <div\n style={{\n padding: \"24px\",\n background: \"var(--hv-modal-subtle-bg)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n }}\n >\n <div\n style={{\n background: \"var(--hv-page-bg)\",\n border: \"1px solid var(--hv-border)\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n boxShadow: \"inset 0 2px 4px 0 rgba(0,0,0,0.05)\",\n }}\n >\n <canvas\n ref={canvasRef}\n width={400}\n height={200}\n style={{\n display: \"block\",\n cursor: \"crosshair\",\n touchAction: \"none\",\n }}\n onMouseDown={startDraw}\n onMouseUp={stopDraw}\n onMouseLeave={stopDraw}\n onMouseMove={draw}\n onTouchStart={startDraw}\n onTouchEnd={stopDraw}\n onTouchMove={draw}\n />\n </div>\n <p\n style={{\n fontSize: \"12px\",\n color: \"var(--hv-muted)\",\n marginTop: \"8px\",\n }}\n >\n {locale[\"signatures.drawHelp\"]}\n </p>\n </div>\n\n <div\n style={{\n padding: \"16px 24px\",\n borderTop: \"1px solid var(--hv-border)\",\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"12px\",\n }}\n >\n <button onClick={clearCanvas} className=\"hv-btn\">\n {locale[\"signatures.clear\"]}\n </button>\n <button\n onClick={saveSignature}\n className=\"hv-btn hv-btn-primary\"\n disabled={!hasInk}\n >\n {locale[\"signatures.createAndUse\"]}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\n\nconst THUMB_ITEM_HEIGHT = 184;\nconst THUMB_OVERSCAN = 4;\n\r\ninterface ThumbnailsSidebarProps {\n isOpen: boolean;\n thumbnails: Array<string | undefined>; // Base64 strings\n currentPage: number;\n onSelectPage: (page: number) => void;\n locale: Record<string, string>;\n}\n\nexport function ThumbnailsSidebar(props: ThumbnailsSidebarProps) {\n const { isOpen, thumbnails, currentPage, onSelectPage, locale } = props;\n const listRef = useRef<HTMLDivElement>(null);\n const [scrollTop, setScrollTop] = useState(0);\n const [viewportHeight, setViewportHeight] = useState(0);\n\n useEffect(() => {\n const element = listRef.current;\n if (!element || !isOpen) {\n return;\n }\n\n const nextTop = Math.max((currentPage - 1) * THUMB_ITEM_HEIGHT, 0);\n const nextBottom = nextTop + THUMB_ITEM_HEIGHT;\n const visibleTop = element.scrollTop;\n const visibleBottom = visibleTop + element.clientHeight;\n\n if (nextTop >= visibleTop && nextBottom <= visibleBottom) {\n return;\n }\n\n const targetTop = Math.max(\n nextTop - Math.max((element.clientHeight - THUMB_ITEM_HEIGHT) / 2, 0),\n 0,\n );\n element.scrollTo({\n top: targetTop,\n behavior: \"smooth\",\n });\n }, [currentPage, isOpen]);\n\n useEffect(() => {\n const element = listRef.current;\n if (!element) {\n return;\n }\n\n const updateViewport = () => {\n setViewportHeight(element.clientHeight);\n setScrollTop(element.scrollTop);\n };\n\n updateViewport();\n\n const handleScroll = () => {\n setScrollTop(element.scrollTop);\n };\n\n element.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => {\n updateViewport();\n });\n resizeObserver.observe(element);\n } else {\n window.addEventListener(\"resize\", updateViewport);\n }\n\n return () => {\n element.removeEventListener(\"scroll\", handleScroll);\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", updateViewport);\n };\n }, []);\n\n const virtualWindow = useMemo(() => {\n if (thumbnails.length === 0) {\n return {\n startIndex: 0,\n endIndex: -1,\n totalHeight: 0,\n };\n }\n\n const visibleCount = Math.max(\n Math.ceil((viewportHeight || THUMB_ITEM_HEIGHT) / THUMB_ITEM_HEIGHT),\n 1,\n );\n const startIndex = Math.max(\n Math.floor(scrollTop / THUMB_ITEM_HEIGHT) - THUMB_OVERSCAN,\n 0,\n );\n const endIndex = Math.min(\n startIndex + visibleCount + THUMB_OVERSCAN * 2 - 1,\n thumbnails.length - 1,\n );\n\n return {\n startIndex,\n endIndex,\n totalHeight: thumbnails.length * THUMB_ITEM_HEIGHT,\n };\n }, [scrollTop, thumbnails.length, viewportHeight]);\n\n const visibleItems = useMemo(\n () =>\n thumbnails.slice(\n virtualWindow.startIndex,\n virtualWindow.endIndex >= virtualWindow.startIndex\n ? virtualWindow.endIndex + 1\n : virtualWindow.startIndex,\n ),\n [thumbnails, virtualWindow.endIndex, virtualWindow.startIndex],\n );\n\n return (\n <div className={`hv-sidebar ${!isOpen ? \"collapsed\" : \"\"}`}>\n <div ref={listRef} className=\"hv-thumb-list\">\n {thumbnails.length > 0 && (\n <div\n className=\"hv-thumb-viewport\"\n style={{ height: `${virtualWindow.totalHeight}px` }}\n >\n {visibleItems.map((src, index) => {\n const absoluteIndex = virtualWindow.startIndex + index;\n const pageNum = absoluteIndex + 1;\n const isActive = pageNum === currentPage;\n\n return (\n <div\n key={pageNum}\n className={`hv-thumb-item ${isActive ? \"active\" : \"\"}`}\n style={{ top: `${absoluteIndex * THUMB_ITEM_HEIGHT}px` }}\n onClick={() => onSelectPage(pageNum)}\n >\n <div className=\"hv-thumb-preview\">\n {src ? (\n <img\n src={src}\n alt={`Page ${pageNum}`}\n className=\"hv-thumb-img\"\n />\n ) : (\n <div className=\"hv-thumb-skeleton\">\n <span>...</span>\n </div>\n )}\n </div>\n <span className=\"hv-thumb-label\">\n {locale[\"thumbnails.page\"]} {pageNum}\n </span>\n </div>\n );\n })}\n </div>\n )}\n\n {thumbnails.length === 0 && (\n <div className=\"hv-thumb-empty\">{locale[\"thumbnails.empty\"]}</div>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\r\n\r\nimport {\n ChevronLeft,\n ChevronRight,\n FileDown,\n Grid2X2,\n LayoutTemplate,\n MessageSquarePlus,\n PanelLeftClose,\n PanelLeftOpen,\n PenLine, // Changed from Download\n Save,\n ZoomIn,\n ZoomOut,\n} from \"lucide-react\";\nimport React from \"react\";\n\r\ninterface ToolbarProps {\n fileName?: string;\n pageCount: number;\n currentPage: number;\n onPageChange: (page: number) => void;\n showHeaderFooterToggle: boolean;\n headerFooterVisible: boolean;\n onToggleHeaderFooter: () => void;\n layout: \"single\" | \"side-by-side\";\n onLayoutChange: (layout: \"single\" | \"side-by-side\") => void;\n\r\n // Left Sidebar (Thumbnails)\r\n showThumbnails: boolean;\r\n onToggleThumbnails: () => void;\r\n\r\n // Right Sidebar (Signatures)\n showSignatures: boolean;\n onToggleSignatures: () => void;\n signingEnabled: boolean;\n annotationEnabled: boolean;\n annotationMode: boolean;\n onToggleAnnotationMode: () => void;\n\n // Zoom\n zoom: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onZoomReset: () => void;\n saveEnabled: boolean;\n isSaving: boolean;\n onSave?: () => void;\n onExportPdf?: () => void;\n showExportPdfAction?: boolean;\n saveLabel?: string;\n locale: Record<string, string>;\n}\n\nexport function Toolbar(props: ToolbarProps) {\n const {\n fileName,\n pageCount,\n currentPage,\n onPageChange,\n showHeaderFooterToggle,\n headerFooterVisible,\n onToggleHeaderFooter,\n layout,\n onLayoutChange,\n zoom,\n onZoomIn,\n onZoomOut,\n onZoomReset,\n saveEnabled,\n isSaving,\n onSave,\n onExportPdf,\n showExportPdfAction = true,\n saveLabel,\n locale,\n } = props;\n\r\n const handlePrev = () => {\r\n if (currentPage > 1) onPageChange(currentPage - 1);\r\n };\r\n\r\n const handleNext = () => {\r\n if (currentPage < pageCount) onPageChange(currentPage + 1);\r\n };\r\n\r\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const val = parseInt(e.target.value);\r\n if (!isNaN(val) && val >= 1 && val <= pageCount) {\r\n onPageChange(val);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"hv-toolbar\">\r\n {/* Left Group: Thumbnails & Title */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className={`hv-btn ${props.showThumbnails ? \"hv-btn-active\" : \"\"}`}\n onClick={props.onToggleThumbnails}\n title={locale[\"toolbar.thumbs\"]}\n >\n {props.showThumbnails ? (\r\n <PanelLeftClose size={20} />\r\n ) : (\r\n <PanelLeftOpen size={20} />\r\n )}\r\n </button>\r\n <div\r\n className=\"hv-sep\"\r\n style={{\r\n width: 1,\r\n height: 24,\r\n background: \"var(--hv-border)\",\r\n margin: \"0 8px\",\r\n }}\r\n />\r\n <span\r\n style={{\r\n fontWeight: 600,\r\n fontSize: \"14px\",\r\n maxWidth: 200,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n {fileName || \"Document\"}\r\n </span>\r\n </div>\r\n\r\n {/* Center Group: Pagination */}\r\n <div className=\"hv-toolbar-group\">\r\n <button\r\n className=\"hv-btn\"\r\n disabled={currentPage <= 1}\r\n onClick={handlePrev}\r\n >\r\n <ChevronLeft size={20} />\r\n </button>\r\n\r\n <div className=\"hv-toolbar-page-group\">\n <input\n type=\"number\"\n className=\"hv-toolbar-page-input\"\n value={currentPage}\n onChange={handleInput}\n min={1}\n max={pageCount}\n />\n <span className=\"hv-toolbar-page-sep\">/</span>\n <span>{pageCount}</span>\n </div>\n\r\n <button\r\n className=\"hv-btn\"\r\n disabled={currentPage >= pageCount}\r\n onClick={handleNext}\r\n >\r\n <ChevronRight size={20} />\r\n </button>\r\n </div>\r\n\r\n {/* Right Group: Layout, Save & Signatures */}\n <div className=\"hv-toolbar-group\">\n <button\n className=\"hv-btn\"\n onClick={onZoomOut}\n title={locale[\"toolbar.zoomOut\"]}\n disabled={zoom <= 0.5}\n >\n <ZoomOut size={18} />\n </button>\n <button\n className=\"hv-btn\"\n onClick={onZoomReset}\n title={locale[\"toolbar.zoomReset\"]}\n >\n <span style={{ fontSize: \"12px\", fontWeight: 600 }}>\n {Math.round(zoom * 100)}%\n </span>\n </button>\n <button\n className=\"hv-btn\"\n onClick={onZoomIn}\n title={locale[\"toolbar.zoomIn\"]}\n disabled={zoom >= 2}\n >\n <ZoomIn size={18} />\n </button>\n\n <div\n className=\"hv-sep\"\n style={{\n width: 1,\n height: 24,\n background: \"var(--hv-border)\",\n margin: \"0 8px\",\n }}\n />\n\n <button\n className={`hv-btn ${layout === \"single\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => onLayoutChange(\"single\")}\n title={locale[\"toolbar.layout.single\"]}\n >\n <LayoutTemplate size={18} />\r\n </button>\r\n <button\n className={`hv-btn ${layout === \"side-by-side\" ? \"hv-btn-active\" : \"\"}`}\n onClick={() => onLayoutChange(\"side-by-side\")}\n title={locale[\"toolbar.layout.two\"]}\n >\n <Grid2X2 size={18} />\n </button>\n\n {showHeaderFooterToggle && (\n <button\n className={`hv-btn ${headerFooterVisible ? \"hv-btn-active\" : \"\"}`}\n onClick={onToggleHeaderFooter}\n title={locale[\"toolbar.headerFooter\"]}\n >\n <span style={{ fontSize: \"12px\", fontWeight: 700, marginRight: \"8px\" }}>\n HF\n </span>\n <span className=\"hv-btn-label\">{locale[\"toolbar.headerFooter\"]}</span>\n </button>\n )}\n\n <div\n className=\"hv-sep\"\n style={{\r\n width: 1,\r\n height: 24,\r\n background: \"var(--hv-border)\",\r\n margin: \"0 8px\",\r\n }}\r\n />\n\n {saveEnabled && (\n <>\n {showExportPdfAction && (\n <button\n className=\"hv-btn\"\n onClick={onExportPdf}\n title={locale[\"toolbar.exportPdf\"]}\n disabled={isSaving}\n >\n <FileDown size={18} />\n </button>\n )}\n <button\n className=\"hv-btn hv-btn-primary\"\n onClick={onSave}\n title={saveLabel ?? locale[\"toolbar.save\"]}\n disabled={isSaving}\n >\n <Save size={18} style={{ marginRight: \"8px\" }} />\n <span className=\"hv-btn-label\">\n {isSaving ? locale.loading : saveLabel ?? locale[\"toolbar.save\"]}\n </span>\n </button>\n\n <div\n className=\"hv-sep\"\n style={{\n width: 1,\n height: 24,\n background: \"var(--hv-border)\",\n margin: \"0 8px\",\n }}\n />\n </>\n )}\n\n {/* Signature Toggle Button */}\n {props.annotationEnabled && (\n <button\n className={`hv-btn ${props.annotationMode ? \"hv-btn-active\" : \"\"}`}\n onClick={props.onToggleAnnotationMode}\n title={locale[\"toolbar.annotate\"]}\n >\n <MessageSquarePlus size={18} style={{ marginRight: \"8px\" }} />\n <span className=\"hv-btn-label\">{locale[\"toolbar.annotate\"]}</span>\n </button>\n )}\n\n {props.signingEnabled && (\n <button\n className={`hv-btn hv-btn-primary ${props.showSignatures ? \"hv-btn-active\" : \"\"}`}\n onClick={props.onToggleSignatures}\n title={locale[\"toolbar.sign\"]}\n >\n <PenLine size={18} style={{ marginRight: \"8px\" }} />\n <span className=\"hv-btn-label\">{locale[\"toolbar.sign\"]}</span>\n </button>\n )}\n </div>\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["useEffect","useMemo","useRef","useState","useEffect","useMemo","useRef","useState","nextWidth","nextHeight","clamp","document","cell","clamp","document","canvas","ctx","jsx","jsxs","createCanvas","useRef","useState","useMemo","useEffect","ExcelJS","useEffect","useMemo","useState","XLSX","jsx","jsxs","toColumnLabel","isRecord","stripArgbAlpha","workbook","ExcelJS","useState","useEffect","useMemo","useEffect","useMemo","jsx","jsxs","useMemo","useEffect","getDocument","GlobalWorkerOptions","useEffect","useMemo","useRef","useState","jsx","jsxs","pdfWorkerBlobUrlPromise","useState","useRef","useEffect","GlobalWorkerOptions","getDocument","useMemo","useEffect","useMemo","useRef","useState","JSZip","jsx","jsxs","useState","resolveZipPath","useRef","useEffect","JSZip","useMemo","useMemo","useRef","useState","Fragment","jsx","jsxs","useRef","useState","useMemo","useEffect","useMemo","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useMemo","useState","useRef","useEffect"]}