epochs-pdf 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/epochs-pdf.cjs +3 -3
- package/dist/epochs-pdf.cjs.map +1 -1
- package/dist/epochs-pdf.js +43 -43
- package/dist/epochs-pdf.js.map +1 -1
- package/package.json +4 -4
package/dist/epochs-pdf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epochs-pdf.js","sources":["../src/viewer/markup.ts","../src/viewer/signature.ts","../src/viewer/coords.ts","../src/viewer/text.ts","../src/viewer/icons.tsx","../src/viewer/PageCanvas.tsx","../src/viewer/Thumbnail.tsx","../src/viewer/load.ts","../src/viewer/exportPages.ts","../src/viewer/SignaturePad.tsx","../src/viewer/toolbarTools.ts","../src/viewer/ToolbarButtons.tsx","../src/viewer/PdfViewer.tsx","../src/components.tsx","../src/reconciler.ts","../src/utils.ts","../src/layout.ts","../src/pdf-writer.ts","../src/render.ts"],"sourcesContent":["export type MarkupKind = \"highlight\" | \"underline\" | \"redact\";\n\nexport type MarkupTool = \"none\" | MarkupKind | \"erase\" | \"sign\" | \"text\";\n\n/** Opaque cover used when removing existing PDF text. */\nexport const REDACT_COLOR = \"#ffffff\";\n\nexport interface MarkupRect {\n /** Left edge in page CSS pixels at scale = 1. */\n x: number;\n /** Top edge in page CSS pixels at scale = 1. */\n y: number;\n w: number;\n h: number;\n}\n\nexport interface MarkupAnnotation {\n id: string;\n pageNumber: number;\n kind: MarkupKind;\n color: string;\n rects: MarkupRect[];\n text?: string;\n}\n\nexport interface MarkupColorOption {\n id: string;\n label: string;\n /** Solid hex used by the swatch / color input. */\n hex: string;\n}\n\nexport const HIGHLIGHT_PRESETS: MarkupColorOption[] = [\n { id: \"yellow\", label: \"Yellow\", hex: \"#facc15\" },\n { id: \"green\", label: \"Green\", hex: \"#4ade80\" },\n { id: \"pink\", label: \"Pink\", hex: \"#f472b6\" },\n { id: \"blue\", label: \"Blue\", hex: \"#60a5fa\" },\n { id: \"orange\", label: \"Orange\", hex: \"#fb923c\" },\n { id: \"purple\", label: \"Purple\", hex: \"#c084fc\" },\n];\n\nexport const UNDERLINE_PRESETS: MarkupColorOption[] = [\n { id: \"blue\", label: \"Blue\", hex: \"#2563eb\" },\n { id: \"red\", label: \"Red\", hex: \"#dc2626\" },\n { id: \"green\", label: \"Green\", hex: \"#16a34a\" },\n { id: \"orange\", label: \"Orange\", hex: \"#ea580c\" },\n { id: \"purple\", label: \"Purple\", hex: \"#7c3aed\" },\n { id: \"black\", label: \"Black\", hex: \"#111827\" },\n];\n\nexport const DEFAULT_HIGHLIGHT_HEX = HIGHLIGHT_PRESETS[0].hex;\nexport const DEFAULT_UNDERLINE_HEX = UNDERLINE_PRESETS[0].hex;\n\n/** Legacy defaults kept for callers. */\nexport const HIGHLIGHT_COLOR = hexToMarkupColor(DEFAULT_HIGHLIGHT_HEX, \"highlight\");\nexport const UNDERLINE_COLOR = DEFAULT_UNDERLINE_HEX;\n\nexport function createMarkupId(): string {\n return `m_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function normalizeHex(color: string): string {\n const value = color.trim();\n if (/^#[0-9a-fA-F]{6}$/.test(value)) return value.toLowerCase();\n if (/^#[0-9a-fA-F]{3}$/.test(value)) {\n const r = value[1];\n const g = value[2];\n const b = value[3];\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\n }\n return value;\n}\n\n/** Convert a solid hex into the CSS color used for drawing markup. */\nexport function hexToMarkupColor(hex: string, kind: MarkupKind, alpha = 0.45): string {\n const normalized = normalizeHex(hex);\n if (kind === \"underline\" || kind === \"redact\") return normalized;\n\n const match = /^#([0-9a-f]{6})$/i.exec(normalized);\n if (!match) return `rgba(250, 204, 21, ${alpha})`;\n\n const int = Number.parseInt(match[1], 16);\n const r = (int >> 16) & 255;\n const g = (int >> 8) & 255;\n const b = int & 255;\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/** Best-effort extract of a #rrggbb value from a stored markup color. */\nexport function markupColorToHex(color: string, fallback: string): string {\n const normalized = normalizeHex(color);\n if (/^#[0-9a-f]{6}$/i.test(normalized)) return normalized.toLowerCase();\n\n const rgba = color.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i,\n );\n if (!rgba) return normalizeHex(fallback);\n\n const toHex = (n: string) =>\n Math.max(0, Math.min(255, Math.round(Number(n))))\n .toString(16)\n .padStart(2, \"0\");\n\n return `#${toHex(rgba[1])}${toHex(rgba[2])}${toHex(rgba[3])}`;\n}\n\n/** Collect selection client rects relative to a page surface, normalized to scale=1. */\nexport function selectionRectsForPage(\n pageSurface: HTMLElement,\n scale: number,\n): { rects: MarkupRect[]; text: string } | null {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed || selection.rangeCount === 0) {\n return null;\n }\n\n const range = selection.getRangeAt(0);\n if (!pageSurface.contains(range.commonAncestorContainer)) {\n return null;\n }\n\n const pageBox = pageSurface.getBoundingClientRect();\n const clientRects = Array.from(range.getClientRects()).filter(\n (r) => r.width > 0 && r.height > 0,\n );\n\n if (!clientRects.length) return null;\n\n const safeScale = scale || 1;\n const layoutW = pageSurface.clientWidth || pageBox.width;\n const layoutH = pageSurface.clientHeight || pageBox.height;\n const rects: MarkupRect[] = clientRects.map((r) => ({\n x: pageBox.width > 0 ? ((r.left - pageBox.left) / pageBox.width) * (layoutW / safeScale) : 0,\n y: pageBox.height > 0 ? ((r.top - pageBox.top) / pageBox.height) * (layoutH / safeScale) : 0,\n w: pageBox.width > 0 ? (r.width / pageBox.width) * (layoutW / safeScale) : 0,\n h: pageBox.height > 0 ? (r.height / pageBox.height) * (layoutH / safeScale) : 0,\n }));\n\n return { rects, text: selection.toString() };\n}\n\n/** Pick the top-left anchor for replacement text from selection rects. */\nexport function selectionStartPoint(\n rects: MarkupRect[],\n): { x: number; y: number; fontSize: number } {\n const sorted = [...rects].sort((a, b) => a.y - b.y || a.x - b.x);\n const first = sorted[0] ?? { x: 0, y: 0, w: 0, h: 14 };\n return {\n x: first.x,\n y: first.y,\n fontSize: Math.max(8, Math.round(first.h * 0.9) || 14),\n };\n}\n\n/** Slightly expand rects so redaction fully covers glyph ink. */\nexport function expandRedactRects(\n rects: MarkupRect[],\n padding = 2,\n): MarkupRect[] {\n return rects.map((rect) => ({\n x: Math.max(0, rect.x - padding),\n y: Math.max(0, rect.y - padding),\n w: rect.w + padding * 2,\n h: rect.h + padding * 2,\n }));\n}\n\n/** Draw highlight / underline annotations onto a canvas (rects are stored at scale = 1). */\nexport function drawMarkupOnCanvas(\n ctx: CanvasRenderingContext2D,\n annotations: MarkupAnnotation[],\n scale: number,\n): void {\n for (const ann of annotations) {\n for (const rect of ann.rects) {\n const x = rect.x * scale;\n const y = rect.y * scale;\n const w = rect.w * scale;\n const h = rect.h * scale;\n\n if (ann.kind === \"highlight\") {\n ctx.save();\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillStyle = ann.color;\n ctx.fillRect(x, y, w, h);\n ctx.restore();\n } else if (ann.kind === \"redact\") {\n ctx.fillStyle = ann.color || REDACT_COLOR;\n ctx.fillRect(x, y, w, h);\n } else {\n const thickness = Math.max(2, scale * 1.5);\n ctx.fillStyle = ann.color;\n ctx.fillRect(x, y + h - thickness, w, thickness);\n }\n }\n }\n}\n\n","export interface SignatureAnnotation {\n id: string;\n pageNumber: number;\n fieldId?: string;\n /** Top-left X in page CSS pixels at scale = 1. */\n x: number;\n /** Top-left Y in page CSS pixels at scale = 1. */\n y: number;\n /** Width at scale = 1. */\n width: number;\n /** Height at scale = 1. */\n height: number;\n /** PNG data URL of the signature ink. */\n imageDataUrl: string;\n}\n\nexport type SignatureFieldType = \"sign\" | \"date\" | \"text\";\n\nexport interface SignatureField {\n id: string;\n pageNumber: number;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Field behavior: \"sign\" (default), \"date\" (date picker), or \"text\" (text input). */\n type?: SignatureFieldType;\n /** Placeholder text for \"text\" type fields. */\n placeholder?: string;\n}\n\nexport function createSignatureId(): string {\n return `s_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport async function drawSignaturesOnCanvas(\n ctx: CanvasRenderingContext2D,\n signatures: SignatureAnnotation[],\n scale: number,\n): Promise<void> {\n for (const sig of signatures) {\n const img = await loadImage(sig.imageDataUrl);\n ctx.drawImage(\n img,\n sig.x * scale,\n sig.y * scale,\n sig.width * scale,\n sig.height * scale,\n );\n }\n}\n\nexport function drawSignatureFieldsOnCanvas(\n ctx: CanvasRenderingContext2D,\n fields: SignatureField[],\n signedFieldIds: Set<string>,\n scale: number,\n): void {\n ctx.save();\n for (const field of fields) {\n const isFilled = signedFieldIds.has(field.id);\n const x = field.x * scale;\n const y = field.y * scale;\n const w = field.width * scale;\n const h = field.height * scale;\n\n ctx.fillStyle = isFilled\n ? \"rgba(29, 78, 216, 0.08)\"\n : \"rgba(29, 78, 216, 0.18)\";\n ctx.strokeStyle = isFilled\n ? \"rgba(29, 78, 216, 0.45)\"\n : \"#1d4ed8\";\n ctx.lineWidth = 1.5;\n ctx.setLineDash(isFilled ? [] : [4, 3]);\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n }\n ctx.restore();\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(\"Failed to load signature image\"));\n img.src = src;\n });\n}\n\n/** Fit a drawn signature canvas into a target box while keeping aspect ratio. */\nexport function signatureDisplaySize(\n sourceWidth: number,\n sourceHeight: number,\n maxWidth = 180,\n maxHeight = 64,\n): { width: number; height: number } {\n if (sourceWidth <= 0 || sourceHeight <= 0) {\n return { width: maxWidth, height: maxHeight };\n }\n const ratio = Math.min(maxWidth / sourceWidth, maxHeight / sourceHeight);\n return {\n width: Math.max(40, sourceWidth * ratio),\n height: Math.max(20, sourceHeight * ratio),\n };\n}\n","/**\n * Browser zoom changes getBoundingClientRect() but not clientWidth/clientHeight.\n * Convert viewport client coordinates into page CSS pixels at scale = 1.\n */\nexport function clientPointToPage(\n clientX: number,\n clientY: number,\n surface: HTMLElement,\n scale: number,\n): { x: number; y: number } {\n const box = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || box.width;\n const layoutH = surface.clientHeight || box.height;\n if (box.width <= 0 || box.height <= 0 || scale <= 0) {\n return { x: 0, y: 0 };\n }\n return {\n x: ((clientX - box.left) / box.width) * (layoutW / scale),\n y: ((clientY - box.top) / box.height) * (layoutH / scale),\n };\n}\n\n/** Page size in CSS pixels at scale = 1. */\nexport function pageSizeFromSurface(\n surface: HTMLElement,\n scale: number,\n): { width: number; height: number } {\n return {\n width: surface.clientWidth / scale,\n height: surface.clientHeight / scale,\n };\n}\n\n/**\n * Convert a viewport delta (e.g. drag/resize) into page CSS pixels at scale = 1,\n * compensating for browser zoom.\n */\nexport function clientDeltaToPage(\n deltaX: number,\n deltaY: number,\n surface: HTMLElement,\n scale: number,\n): { dx: number; dy: number } {\n const box = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || box.width;\n const layoutH = surface.clientHeight || box.height;\n if (box.width <= 0 || box.height <= 0 || scale <= 0) {\n return { dx: 0, dy: 0 };\n }\n return {\n dx: (deltaX / box.width) * (layoutW / scale),\n dy: (deltaY / box.height) * (layoutH / scale),\n };\n}\n\n/** Map a viewport Y (or rect edge) relative to surface into page coords at scale = 1. */\nexport function viewportRectToPage(\n viewport: DOMRect,\n surface: HTMLElement,\n scale: number,\n): { left: number; top: number; right: number; bottom: number } {\n const surfaceRect = surface.getBoundingClientRect();\n const { width: pageW, height: pageH } = pageSizeFromSurface(surface, scale);\n if (surfaceRect.width <= 0 || surfaceRect.height <= 0) {\n return { left: 0, top: 0, right: pageW, bottom: pageH };\n }\n return {\n left: ((viewport.left - surfaceRect.left) / surfaceRect.width) * pageW,\n top: ((viewport.top - surfaceRect.top) / surfaceRect.height) * pageH,\n right: ((viewport.right - surfaceRect.left) / surfaceRect.width) * pageW,\n bottom: ((viewport.bottom - surfaceRect.top) / surfaceRect.height) * pageH,\n };\n}\n","export interface TextField {\n id: string;\n pageNumber: number;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Shown when the field is empty. */\n placeholder?: string;\n /** Font size at scale = 1. Default 14. */\n fontSize?: number;\n /** CSS color. Default #111827. */\n color?: string;\n}\n\nexport interface TextAnnotation {\n id: string;\n pageNumber: number;\n fieldId?: string;\n /** Left edge in page CSS pixels at scale = 1. */\n x: number;\n /** Top edge in page CSS pixels at scale = 1. */\n y: number;\n /** Width at scale = 1. */\n width: number;\n /** Height at scale = 1. */\n height: number;\n value: string;\n fontSize: number;\n color: string;\n}\n\nexport const DEFAULT_TEXT_FONT_SIZE = 14;\nexport const DEFAULT_TEXT_COLOR = \"#111827\";\nexport const MIN_TEXT_WIDTH = 24;\nexport const MIN_TEXT_HEIGHT = 20;\n\nexport function createTextId(): string {\n return `t_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function measureInlineText(\n value: string,\n fontSize: number,\n): { width: number; height: number } {\n if (typeof document === \"undefined\") {\n return {\n width: Math.max(MIN_TEXT_WIDTH, value.length * fontSize * 0.55),\n height: Math.max(MIN_TEXT_HEIGHT, fontSize * 1.25),\n };\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return {\n width: Math.max(MIN_TEXT_WIDTH, value.length * fontSize * 0.55),\n height: Math.max(MIN_TEXT_HEIGHT, fontSize * 1.25),\n };\n }\n\n ctx.font = `${fontSize}px sans-serif`;\n const lines = value.split(\"\\n\");\n const lineHeight = fontSize * 1.25;\n let maxWidth = MIN_TEXT_WIDTH;\n\n for (const line of lines) {\n maxWidth = Math.max(maxWidth, ctx.measureText(line || \" \").width + 4);\n }\n\n return {\n width: maxWidth,\n height: Math.max(MIN_TEXT_HEIGHT, lines.length * lineHeight),\n };\n}\n\n/** Resolve where inline text should start from a click on/near PDF text. */\nexport function resolveInlineTextPoint(\n clientX: number,\n clientY: number,\n surface: HTMLElement,\n textLayer: HTMLElement,\n scale: number,\n): { x: number; y: number; fontSize: number } {\n const surfaceBox = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || surfaceBox.width;\n const layoutH = surface.clientHeight || surfaceBox.height;\n const toPageX = (client: number) =>\n surfaceBox.width > 0\n ? ((client - surfaceBox.left) / surfaceBox.width) * (layoutW / scale)\n : 0;\n const toPageY = (client: number) =>\n surfaceBox.height > 0\n ? ((client - surfaceBox.top) / surfaceBox.height) * (layoutH / scale)\n : 0;\n const toPageSize = (clientSize: number, axis: \"x\" | \"y\") => {\n const boxSize = axis === \"x\" ? surfaceBox.width : surfaceBox.height;\n const layout = axis === \"x\" ? layoutW : layoutH;\n return boxSize > 0 ? (clientSize / boxSize) * (layout / scale) : 0;\n };\n\n // Default: exact click position (works for gaps between words)\n let x = toPageX(clientX);\n let y = toPageY(clientY);\n let fontSize = DEFAULT_TEXT_FONT_SIZE;\n\n // Prefer a gap between two spans on the same line (e.g. between \"this\" and \"PDF\")\n const gap = findGapBetweenSpans(clientX, clientY, textLayer);\n if (gap) {\n return {\n x: toPageX(gap.x),\n y: toPageY(gap.y),\n fontSize: Math.max(8, Math.round(toPageSize(gap.fontSize, \"y\") * 10) / 10),\n };\n }\n\n const doc = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n\n const range = doc.caretRangeFromPoint?.(clientX, clientY);\n if (range && textLayer.contains(range.startContainer)) {\n const rects = range.getClientRects();\n const rect = rects.length > 0 ? rects[0] : range.getBoundingClientRect();\n if (rect.height > 0) {\n // Keep the clicked X (insert point), snap Y/size to the line\n y = toPageY(rect.top);\n fontSize = inferFontSizeFromNode(range.startContainer, scale, surface);\n // If caret snapped to a glyph edge, use that X for cleaner alignment\n const caretX = toPageX(rect.left);\n if (Math.abs(caretX - x) < toPageSize(8, \"x\")) {\n x = caretX;\n }\n return { x, y, fontSize };\n }\n }\n\n const nearest = findNearestSpanOnLine(clientX, clientY, textLayer);\n if (nearest) {\n y = toPageY(nearest.top);\n fontSize = Math.max(8, Math.round(toPageSize(nearest.height, \"y\") * 10) / 10);\n }\n\n return { x, y, fontSize };\n}\n\n/** Find a click that lands in the horizontal gap between two word spans. */\nfunction findGapBetweenSpans(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement,\n): { x: number; y: number; fontSize: number } | null {\n const spans = Array.from(\n textLayer.querySelectorAll(\"span\"),\n ) as HTMLElement[];\n if (spans.length < 2) return null;\n\n type SpanBox = { left: number; right: number; top: number; bottom: number; height: number };\n const boxes: SpanBox[] = [];\n\n for (const span of spans) {\n if (!span.textContent?.trim()) continue;\n const box = span.getBoundingClientRect();\n if (box.width <= 0 || box.height <= 0) continue;\n // Same visual line as the click\n if (clientY < box.top - 4 || clientY > box.bottom + 4) continue;\n boxes.push({\n left: box.left,\n right: box.right,\n top: box.top,\n bottom: box.bottom,\n height: box.height,\n });\n }\n\n boxes.sort((a, b) => a.left - b.left);\n\n for (let i = 0; i < boxes.length - 1; i += 1) {\n const left = boxes[i];\n const right = boxes[i + 1];\n const gapStart = left.right;\n const gapEnd = right.left;\n if (gapEnd - gapStart < 1) continue;\n if (clientX >= gapStart - 2 && clientX <= gapEnd + 2) {\n return {\n x: clientX,\n y: Math.min(left.top, right.top),\n fontSize: Math.min(left.height, right.height),\n };\n }\n }\n\n return null;\n}\n\nfunction findNearestSpanOnLine(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement,\n): { top: number; height: number } | null {\n const spans = Array.from(\n textLayer.querySelectorAll(\"span\"),\n ) as HTMLElement[];\n\n let best: { top: number; height: number; dist: number } | null = null;\n\n for (const span of spans) {\n if (!span.textContent?.trim()) continue;\n const box = span.getBoundingClientRect();\n if (box.width <= 0 || box.height <= 0) continue;\n if (clientY < box.top - 6 || clientY > box.bottom + 6) continue;\n\n const midX = (box.left + box.right) / 2;\n const dist = Math.abs(clientX - midX);\n if (!best || dist < best.dist) {\n best = { top: box.top, height: box.height, dist };\n }\n }\n\n return best ? { top: best.top, height: best.height } : null;\n}\n\nfunction inferFontSizeFromNode(\n node: Node,\n scale: number,\n surface?: HTMLElement,\n): number {\n const element =\n node.nodeType === Node.ELEMENT_NODE\n ? (node as HTMLElement)\n : node.parentElement;\n if (element) return inferFontSizeFromElement(element, scale, surface);\n return DEFAULT_TEXT_FONT_SIZE;\n}\n\nfunction inferFontSizeFromElement(\n element: HTMLElement,\n scale: number,\n surface?: HTMLElement,\n): number {\n const height = element.getBoundingClientRect().height;\n if (height > 0) {\n if (surface) {\n const surfaceBox = surface.getBoundingClientRect();\n const layoutH = surface.clientHeight || surfaceBox.height;\n if (surfaceBox.height > 0) {\n return Math.max(\n 8,\n Math.round(((height / surfaceBox.height) * (layoutH / scale)) * 10) / 10,\n );\n }\n }\n return Math.max(8, Math.round((height / scale) * 10) / 10);\n }\n\n const computed = window.getComputedStyle(element).fontSize;\n const parsed = Number.parseFloat(computed);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.max(8, Math.round((parsed / scale) * 10) / 10);\n }\n\n return DEFAULT_TEXT_FONT_SIZE;\n}\n\nexport function findTextFieldAtPoint(\n x: number,\n y: number,\n fields: TextField[],\n pageNumber: number,\n): TextField | null {\n for (const field of fields) {\n if (field.pageNumber !== pageNumber) continue;\n if (\n x >= field.x &&\n x <= field.x + field.width &&\n y >= field.y &&\n y <= field.y + field.height\n ) {\n return field;\n }\n }\n return null;\n}\n\n/** Select the word under a point in the PDF text layer (browser selection). */\nexport function selectWordAtPoint(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement | null,\n): string | null {\n if (!textLayer) return null;\n\n const doc = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n const range = doc.caretRangeFromPoint?.(clientX, clientY);\n if (!range || !textLayer.contains(range.startContainer)) return null;\n\n const node = range.startContainer;\n if (node.nodeType !== Node.TEXT_NODE || !node.textContent) return null;\n\n const text = node.textContent;\n let offset = range.startOffset;\n offset = Math.min(Math.max(0, offset), text.length);\n\n const isWordChar = (ch: string) => /[\\p{L}\\p{N}_'-]/u.test(ch);\n let start = offset;\n let end = offset;\n\n while (start > 0 && isWordChar(text[start - 1]!)) start -= 1;\n while (end < text.length && isWordChar(text[end]!)) end += 1;\n\n if (start === end) return null;\n\n const wordRange = document.createRange();\n wordRange.setStart(node, start);\n wordRange.setEnd(node, end);\n\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(wordRange);\n\n return text.slice(start, end);\n}\n\nexport function drawTextsOnCanvas(\n ctx: CanvasRenderingContext2D,\n texts: TextAnnotation[],\n scale: number,\n): void {\n ctx.save();\n for (const text of texts) {\n if (!text.value.trim()) continue;\n\n const x = text.x * scale;\n const y = text.y * scale;\n const fontSize = Math.max(8, text.fontSize * scale);\n\n ctx.fillStyle = text.color;\n ctx.font = `${fontSize}px sans-serif`;\n ctx.textBaseline = \"top\";\n\n const lineHeight = fontSize * 1.25;\n const lines = text.value.split(\"\\n\");\n let cursorY = y;\n\n for (const line of lines) {\n ctx.fillText(line, x, cursorY);\n cursorY += lineHeight;\n }\n }\n ctx.restore();\n}\n\nexport function drawTextFieldsOnCanvas(\n ctx: CanvasRenderingContext2D,\n fields: TextField[],\n filledFieldIds: Set<string>,\n scale: number,\n): void {\n ctx.save();\n for (const field of fields) {\n const isFilled = filledFieldIds.has(field.id);\n const x = field.x * scale;\n const y = field.y * scale;\n const w = field.width * scale;\n const h = field.height * scale;\n\n ctx.fillStyle = isFilled\n ? \"rgba(5, 150, 105, 0.08)\"\n : \"rgba(5, 150, 105, 0.16)\";\n ctx.strokeStyle = isFilled\n ? \"rgba(5, 150, 105, 0.45)\"\n : \"#059669\";\n ctx.lineWidth = 1.5;\n ctx.setLineDash(isFilled ? [] : [4, 3]);\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n }\n ctx.restore();\n}\n","import type { ReactNode } from \"react\";\n\ntype IconProps = {\n size?: number;\n className?: string;\n};\n\nfunction Icon({\n size = 14,\n className,\n children,\n}: IconProps & { children: ReactNode }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\nexport function ChevronLeftIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"15 18 9 12 15 6\" />\n </Icon>\n );\n}\n\nexport function ChevronRightIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"9 18 15 12 9 6\" />\n </Icon>\n );\n}\n\nexport function DownloadIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </Icon>\n );\n}\n\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </Icon>\n );\n}\n\nexport function GridIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" />\n </Icon>\n );\n}\n\nexport function MinusIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </Icon>\n );\n}\n\nexport function PlusIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </Icon>\n );\n}\n\nexport function PrinterIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"6 9 6 2 18 2 18 9\" />\n <path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\" />\n <rect x=\"6\" y=\"14\" width=\"12\" height=\"8\" />\n </Icon>\n );\n}\n\nexport function RefreshIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"23 4 23 10 17 10\" />\n <polyline points=\"1 20 1 14 7 14\" />\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\" />\n </Icon>\n );\n}\n\nexport function RotateIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" />\n </Icon>\n );\n}\n\nexport function HighlightIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </Icon>\n );\n}\n\nexport function UnderlineIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M6 3v7a6 6 0 0 0 12 0V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </Icon>\n );\n}\n\nexport function EraserIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\" />\n <path d=\"M22 21H7\" />\n <path d=\"m5 11 9 9\" />\n </Icon>\n );\n}\n\nexport function SignatureIcon({ size = 16, className }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"12\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M232,172H57.32c4-7.83,8.18-16.11,12.21-24.56,15.14,3.55,34.13-8.06,56.54-34.59,3.67,12.5,12.53,34.83,29.08,35.15h.35c8.71,0,17.64-6.25,27.16-19.06C187.17,137.14,199.31,148,232,148a4,4,0,0,0,0-8c-42.88,0-44-19.24-44-20a4,4,0,0,0-7.35-2.18C168.74,136.1,160.42,140,155.48,140h-.18c-13-.25-21.29-26.52-23.38-36.61a4,4,0,0,0-7-1.69c-20.94,26.27-39.06,39.55-51.8,38.2C97.31,87.5,105.19,53.16,96.49,37.77,94,33.31,88.7,28,77.91,28,64.09,28,52.54,42.41,47,66.54A122.7,122.7,0,0,0,45.46,113c2.64,15.29,8.39,26.05,16.69,31.35-4.58,9.6-9.3,19-13.84,27.68H24a4,4,0,0,0,0,8H44.1c-12.87,24.17-23.37,41.68-23.53,41.94a4,4,0,0,0,1.37,5.49A3.93,3.93,0,0,0,24,228a4,4,0,0,0,3.43-1.94c.16-.27,11.85-19.75,25.72-46.06H232a4,4,0,0,0,0-8ZM53.34,111.61a114.81,114.81,0,0,1,1.49-43.29C58.4,52.7,66.34,36,77.91,36c7.52,0,10.23,3.26,11.61,5.7C99,58.4,79.92,106,65.6,137,59.76,132.69,55.46,123.83,53.34,111.61Z\" />\n </svg>\n );\n}\n\nexport function PencilIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </Icon>\n );\n}\n\nexport function TextIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"4 7 4 4 20 4 20 7\" />\n <line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\" />\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" />\n </Icon>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { RenderTask } from \"pdfjs-dist\";\nimport { TextLayer } from \"pdfjs-dist\";\nimport type { PdfDoc } from \"./types\";\nimport type { MarkupAnnotation, MarkupTool } from \"./markup\";\nimport { createMarkupId, expandRedactRects, REDACT_COLOR, selectionRectsForPage, selectionStartPoint } from \"./markup\";\nimport type { SignatureAnnotation, SignatureField } from \"./signature\";\nimport { createSignatureId } from \"./signature\";\nimport {\n clientDeltaToPage,\n clientPointToPage,\n pageSizeFromSurface,\n} from \"./coords\";\nimport type { TextAnnotation, TextField } from \"./text\";\nimport {\n createTextId,\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE,\n findTextFieldAtPoint,\n measureInlineText,\n resolveInlineTextPoint,\n selectWordAtPoint,\n} from \"./text\";\nimport { PencilIcon } from \"./icons\";\n\ninterface PageCanvasProps {\n pdfDoc: PdfDoc;\n pageNumber: number;\n scale: number;\n rotation: number;\n pageRef?: (el: HTMLDivElement | null) => void;\n onRendered?: (pageNumber: number) => void;\n markupTool?: MarkupTool;\n markupColor?: string;\n annotations?: MarkupAnnotation[];\n onAddAnnotation?: (annotation: MarkupAnnotation) => void;\n onRemoveAnnotation?: (id: string) => void;\n signatures?: SignatureAnnotation[];\n pendingSignature?: { imageDataUrl: string; width: number; height: number } | null;\n onAddSignature?: (signature: SignatureAnnotation) => void;\n onUpdateSignature?: (id: string, patch: Partial<SignatureAnnotation>) => void;\n onRemoveSignature?: (id: string) => void;\n onEditSignature?: (id: string) => void;\n onDuplicateSignature?: (id: string) => void;\n selectedSignatureId?: string | null;\n onSelectSignature?: (id: string | null) => void;\n signatureFields?: SignatureField[];\n selectedSignatureFieldId?: string | null;\n onSelectSignatureField?: (id: string | null) => void;\n hasFixedSignatureFields?: boolean;\n onOpenSignaturePad?: (fieldType?: import(\"./signature\").SignatureFieldType) => void;\n /** Values for date/text fixed fields, keyed by field id. */\n fieldValues?: Record<string, string>;\n onFieldValueChange?: (fieldId: string, value: string) => void;\n onFieldValueCommit?: (fieldId: string) => void;\n pendingFieldValue?: { type: \"date\" | \"text\"; value: string } | null;\n onPlaceFieldValue?: (pageNumber: number, x: number, y: number) => void;\n texts?: TextAnnotation[];\n onAddText?: (text: TextAnnotation) => void;\n onUpdateText?: (id: string, patch: Partial<TextAnnotation>) => void;\n onRemoveText?: (id: string) => void;\n selectedTextId?: string | null;\n onSelectText?: (id: string | null) => void;\n textFields?: TextField[];\n selectedTextFieldId?: string | null;\n onSelectTextField?: (id: string | null) => void;\n hasFixedTextFields?: boolean;\n editingTextId?: string | null;\n onEditingTextIdChange?: (id: string | null) => void;\n}\n\nexport function PageCanvas({\n pdfDoc,\n pageNumber,\n scale,\n rotation,\n pageRef,\n onRendered,\n markupTool = \"none\",\n markupColor,\n annotations = [],\n onAddAnnotation,\n onRemoveAnnotation,\n signatures = [],\n pendingSignature = null,\n onAddSignature,\n onUpdateSignature,\n onRemoveSignature,\n onEditSignature,\n onDuplicateSignature,\n selectedSignatureId = null,\n onSelectSignature,\n signatureFields = [],\n selectedSignatureFieldId = null,\n onSelectSignatureField,\n hasFixedSignatureFields = false,\n onOpenSignaturePad,\n fieldValues = {},\n onFieldValueChange,\n onFieldValueCommit,\n pendingFieldValue = null,\n onPlaceFieldValue,\n texts = [],\n onAddText,\n onUpdateText,\n onRemoveText,\n selectedTextId = null,\n onSelectText,\n textFields = [],\n selectedTextFieldId: _selectedTextFieldId = null,\n onSelectTextField,\n hasFixedTextFields = false,\n editingTextId = null,\n onEditingTextIdChange,\n}: PageCanvasProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const renderTaskRef = useRef<RenderTask | null>(null);\n const textLayerInstanceRef = useRef<TextLayer | null>(null);\n const [dragState, setDragState] = useState<\n | { kind: \"signature\"; id: string; offsetX: number; offsetY: number }\n | { kind: \"resize\"; id: string; startX: number; startY: number; startW: number; startH: number }\n | null\n >(null);\n const inlineEditRef = useRef<HTMLSpanElement>(null);\n const justOpenedEditorRef = useRef(false);\n\n useEffect(() => {\n if (!pdfDoc || !canvasRef.current || !textLayerRef.current || !surfaceRef.current) {\n return;\n }\n\n let cancelled = false;\n const canvas = canvasRef.current;\n const textLayerDiv = textLayerRef.current;\n const surface = surfaceRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const render = async () => {\n try {\n if (renderTaskRef.current) {\n try {\n renderTaskRef.current.cancel();\n } catch {\n // ignore\n }\n renderTaskRef.current = null;\n }\n if (textLayerInstanceRef.current) {\n try {\n textLayerInstanceRef.current.cancel();\n } catch {\n // ignore\n }\n textLayerInstanceRef.current = null;\n }\n\n const page = await pdfDoc.getPage(pageNumber);\n if (cancelled) return;\n\n const viewport = page.getViewport({ scale, rotation });\n const width = Math.floor(viewport.width);\n const height = Math.floor(viewport.height);\n\n canvas.width = width;\n canvas.height = height;\n surface.style.width = `${width}px`;\n surface.style.height = `${height}px`;\n\n const task = page.render({ canvasContext: ctx, viewport });\n renderTaskRef.current = task;\n await task.promise;\n if (cancelled) return;\n\n textLayerDiv.replaceChildren();\n textLayerDiv.style.setProperty(\"--scale-factor\", String(viewport.scale));\n\n const textContent = await page.getTextContent();\n if (cancelled) return;\n\n const textLayer = new TextLayer({\n textContentSource: textContent,\n container: textLayerDiv,\n viewport,\n });\n textLayerInstanceRef.current = textLayer;\n await textLayer.render();\n if (cancelled) return;\n\n onRendered?.(pageNumber);\n } catch {\n // ignore (often cancellation)\n }\n };\n\n void render();\n\n return () => {\n cancelled = true;\n if (renderTaskRef.current) {\n try {\n renderTaskRef.current.cancel();\n } catch {\n // ignore\n }\n renderTaskRef.current = null;\n }\n if (textLayerInstanceRef.current) {\n try {\n textLayerInstanceRef.current.cancel();\n } catch {\n // ignore\n }\n textLayerInstanceRef.current = null;\n }\n };\n }, [pdfDoc, pageNumber, scale, rotation, onRendered]);\n\n useEffect(() => {\n const surface = surfaceRef.current;\n if (!surface) return;\n\n const applySelectionMarkup = (kind: \"highlight\" | \"underline\" | \"redact\") => {\n if (!onAddAnnotation) return false;\n\n const color =\n kind === \"redact\"\n ? REDACT_COLOR\n : markupColor;\n if (!color) return false;\n\n const captured = selectionRectsForPage(surface, scale);\n if (!captured) return false;\n\n const rects =\n kind === \"redact\"\n ? expandRedactRects(captured.rects)\n : captured.rects;\n\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind,\n color,\n rects,\n text: captured.text,\n });\n\n window.getSelection()?.removeAllRanges();\n return true;\n };\n\n const replaceSelectedPdfText = (initialValue: string) => {\n if (!onAddAnnotation || !onAddText) return false;\n\n const captured = selectionRectsForPage(surface, scale);\n if (!captured) return false;\n\n const rects = expandRedactRects(captured.rects);\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind: \"redact\",\n color: REDACT_COLOR,\n rects,\n text: captured.text,\n });\n\n const start = selectionStartPoint(captured.rects);\n const size = measureInlineText(initialValue || \" \", start.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x: start.x,\n y: start.y,\n width: size.width,\n height: size.height,\n value: initialValue,\n fontSize: start.fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n window.getSelection()?.removeAllRanges();\n justOpenedEditorRef.current = true;\n window.setTimeout(() => {\n justOpenedEditorRef.current = false;\n }, 0);\n return true;\n };\n\n const handleMouseUp = () => {\n if (markupTool === \"highlight\" || markupTool === \"underline\") {\n applySelectionMarkup(markupTool);\n return;\n }\n // Erase tool: select PDF words to cover/remove them\n if (markupTool === \"erase\") {\n applySelectionMarkup(\"redact\");\n return;\n }\n // Text tool: select existing PDF text → open it for editing\n if (markupTool === \"text\") {\n const selection = window.getSelection();\n if (\n selection &&\n !selection.isCollapsed &&\n selection.toString().trim() &&\n selection.anchorNode &&\n surface.contains(selection.anchorNode)\n ) {\n replaceSelectedPdfText(selection.toString());\n }\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (\n target?.closest(\"[contenteditable='true']\") ||\n target?.closest(\"[contenteditable='']\") ||\n target?.isContentEditable\n ) {\n return;\n }\n\n const selection = window.getSelection();\n const hasPdfSelection =\n selection != null &&\n !selection.isCollapsed &&\n selection.toString().trim().length > 0 &&\n selection.anchorNode != null &&\n surface.contains(selection.anchorNode);\n\n if (markupTool === \"text\" && hasPdfSelection) {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n replaceSelectedPdfText(selection!.toString());\n return;\n }\n\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n event.preventDefault();\n replaceSelectedPdfText(event.key);\n return;\n }\n }\n\n if (markupTool !== \"text\" && markupTool !== \"erase\") return;\n if (event.key !== \"Backspace\" && event.key !== \"Delete\") return;\n\n if (!hasPdfSelection) return;\n\n event.preventDefault();\n applySelectionMarkup(\"redact\");\n };\n\n surface.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n surface.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n markupTool,\n markupColor,\n onAddAnnotation,\n onAddText,\n onEditingTextIdChange,\n onSelectText,\n pageNumber,\n scale,\n ]);\n\n useEffect(() => {\n if (!dragState) return;\n\n let rafId = 0;\n let lastClientX = 0;\n let lastClientY = 0;\n let scrollDir = 0; // -1 up, 1 down, 0 none\n\n const getScrollContainer = (): HTMLElement | null => {\n return (\n wrapRef.current?.closest(\".epochs-pdf-viewer__body\") as HTMLElement | null\n );\n };\n\n const updateResizeAtPoint = (clientX: number, clientY: number) => {\n if (dragState.kind !== \"resize\") return;\n if (!onUpdateSignature || hasFixedSignatureFields) return;\n const sig = signatures.find((s) => s.id === dragState.id);\n if (!sig) return;\n\n const surface = surfaceRef.current;\n const pageSize = surface\n ? pageSizeFromSurface(surface, scale)\n : { width: Infinity, height: Infinity };\n const { dx, dy } = surface\n ? clientDeltaToPage(\n clientX - dragState.startX,\n clientY - dragState.startY,\n surface,\n scale,\n )\n : { dx: 0, dy: 0 };\n\n const maxW = pageSize.width - sig.x;\n const maxH = pageSize.height - sig.y;\n const newW = Math.min(maxW, Math.max(40, dragState.startW + dx));\n const newH = Math.min(maxH, Math.max(20, dragState.startH + dy));\n onUpdateSignature(dragState.id, { width: newW, height: newH });\n };\n\n const updateSignatureAtPoint = (clientX: number, clientY: number) => {\n if (dragState.kind !== \"signature\") return;\n if (!onUpdateSignature || hasFixedSignatureFields) return;\n\n const sig = signatures.find((s) => s.id === dragState.id);\n if (!sig) return;\n\n // Prefer element under cursor; fall back to previous page when over empty gutter\n let pageEl = document\n .elementFromPoint(clientX, clientY)\n ?.closest(\"[data-page-number]\") as HTMLElement | null;\n\n if (!pageEl) {\n const pages = Array.from(\n document.querySelectorAll(\".epochs-pdf-viewer__page[data-page-number]\"),\n ) as HTMLElement[];\n pageEl =\n pages.find((page) => {\n const box = page.getBoundingClientRect();\n return clientY >= box.top && clientY <= box.bottom;\n }) ?? null;\n }\n\n if (!pageEl) {\n pageEl = wrapRef.current;\n }\n if (!pageEl) return;\n\n const surface = pageEl.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n if (!surface) return;\n\n const targetPage = Number.parseInt(\n pageEl.getAttribute(\"data-page-number\") || String(sig.pageNumber),\n 10,\n );\n\n const point = clientPointToPage(clientX, clientY, surface, scale);\n const pageSize = pageSizeFromSurface(surface, scale);\n let nextX = point.x - dragState.offsetX;\n let nextY = point.y - dragState.offsetY;\n const maxX = Math.max(0, pageSize.width - sig.width);\n const maxY = Math.max(0, pageSize.height - sig.height);\n nextX = Math.min(Math.max(0, nextX), maxX);\n nextY = Math.min(Math.max(0, nextY), maxY);\n\n onUpdateSignature(dragState.id, {\n pageNumber: targetPage,\n x: nextX,\n y: nextY,\n });\n };\n\n const tickScroll = () => {\n rafId = 0;\n if (!scrollDir) return;\n\n const container = getScrollContainer();\n if (!container) return;\n\n const maxScroll = container.scrollHeight - container.clientHeight;\n if (maxScroll <= 0) return;\n\n const edge = 56;\n const box = container.getBoundingClientRect();\n const distTop = lastClientY - box.top;\n const distBottom = box.bottom - lastClientY;\n\n let speed = 0;\n if (scrollDir < 0 && distTop < edge) {\n speed = -Math.max(6, ((edge - distTop) / edge) * 28);\n } else if (scrollDir > 0 && distBottom < edge) {\n speed = Math.max(6, ((edge - distBottom) / edge) * 28);\n } else {\n scrollDir = 0;\n return;\n }\n\n const prev = container.scrollTop;\n container.scrollTop = Math.min(maxScroll, Math.max(0, prev + speed));\n\n if (container.scrollTop !== prev) {\n updateSignatureAtPoint(lastClientX, lastClientY);\n }\n\n if (\n (speed < 0 && container.scrollTop > 0) ||\n (speed > 0 && container.scrollTop < maxScroll)\n ) {\n rafId = window.requestAnimationFrame(tickScroll);\n } else {\n scrollDir = 0;\n }\n };\n\n const handleMove = (event: PointerEvent) => {\n lastClientX = event.clientX;\n lastClientY = event.clientY;\n\n const container = getScrollContainer();\n if (container) {\n const edge = 56;\n const box = container.getBoundingClientRect();\n const distTop = event.clientY - box.top;\n const distBottom = box.bottom - event.clientY;\n\n if (distTop < edge) {\n scrollDir = -1;\n if (!rafId) rafId = window.requestAnimationFrame(tickScroll);\n } else if (distBottom < edge) {\n scrollDir = 1;\n if (!rafId) rafId = window.requestAnimationFrame(tickScroll);\n } else {\n scrollDir = 0;\n }\n }\n\n if (dragState.kind === \"resize\") {\n updateResizeAtPoint(event.clientX, event.clientY);\n } else {\n updateSignatureAtPoint(event.clientX, event.clientY);\n }\n };\n\n const handleUp = () => {\n scrollDir = 0;\n if (rafId) {\n window.cancelAnimationFrame(rafId);\n rafId = 0;\n }\n setDragState(null);\n };\n\n window.addEventListener(\"pointermove\", handleMove);\n window.addEventListener(\"pointerup\", handleUp);\n window.addEventListener(\"pointercancel\", handleUp);\n return () => {\n scrollDir = 0;\n if (rafId) window.cancelAnimationFrame(rafId);\n window.removeEventListener(\"pointermove\", handleMove);\n window.removeEventListener(\"pointerup\", handleUp);\n window.removeEventListener(\"pointercancel\", handleUp);\n };\n }, [\n dragState,\n hasFixedSignatureFields,\n onUpdateSignature,\n scale,\n signatures,\n ]);\n\n useEffect(() => {\n if (!editingTextId || !inlineEditRef.current) return;\n const el = inlineEditRef.current;\n const current = texts.find((t) => t.id === editingTextId);\n // Uncontrolled while editing — set DOM text once so React won't reset the caret\n el.textContent = current?.value ?? \"\";\n el.focus();\n\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n // Only re-run when the edit session starts, not on every keystroke\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editingTextId]);\n\n const setRefs = (el: HTMLDivElement | null) => {\n wrapRef.current = el;\n pageRef?.(el);\n };\n\n const pageAnnotations = annotations.filter((a) => a.pageNumber === pageNumber);\n const pageSignatures = signatures.filter((s) => s.pageNumber === pageNumber);\n const pageSignatureFields = signatureFields.filter((f) => f.pageNumber === pageNumber);\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n\n const commitInlineText = (text: TextAnnotation, value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n onRemoveText?.(text.id);\n onEditingTextIdChange?.(null);\n return;\n }\n\n const size = measureInlineText(trimmed, text.fontSize);\n onUpdateText?.(text.id, {\n value: trimmed,\n width: size.width,\n height: size.height,\n });\n onEditingTextIdChange?.(null);\n };\n\n const beginInlineTextAt = (clientX: number, clientY: number) => {\n if (!onAddText) return;\n\n const surface = surfaceRef.current;\n const textLayer = textLayerRef.current;\n if (!surface || !textLayer) return;\n\n let point = resolveInlineTextPoint(\n clientX,\n clientY,\n surface,\n textLayer,\n scale,\n );\n\n let fieldId: string | undefined;\n let color = DEFAULT_TEXT_COLOR;\n\n if (hasFixedTextFields) {\n const field = findTextFieldAtPoint(\n point.x,\n point.y,\n textFields,\n pageNumber,\n );\n if (!field) return;\n\n const existing = texts.find((t) => t.fieldId === field.id);\n if (existing) {\n onSelectText?.(existing.id);\n onSelectTextField?.(field.id);\n onEditingTextIdChange?.(existing.id);\n return;\n }\n\n fieldId = field.id;\n point = {\n x: field.x,\n y: field.y,\n fontSize: field.fontSize ?? DEFAULT_TEXT_FONT_SIZE,\n };\n color = field.color ?? DEFAULT_TEXT_COLOR;\n onSelectTextField?.(field.id);\n }\n\n const size = measureInlineText(\"\", point.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n fieldId,\n pageNumber,\n x: point.x,\n y: point.y,\n width: size.width,\n height: size.height,\n value: \"\",\n fontSize: point.fontSize,\n color,\n };\n\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n };\n\n const handleInlineTextClick = (event: React.MouseEvent<HTMLElement>) => {\n if (markupTool !== \"text\") return;\n if ((event.target as HTMLElement).closest(\".epochs-pdf-viewer__inline-text\")) {\n return;\n }\n // Skip the click that follows a select-to-edit mouseup\n if (justOpenedEditorRef.current) {\n justOpenedEditorRef.current = false;\n return;\n }\n\n // Selecting existing PDF words opens the editor on mouseup — don't insert here\n const selection = window.getSelection();\n if (selection && !selection.isCollapsed && selection.toString().trim()) {\n return;\n }\n\n // Double-click: select the word under the cursor and edit it\n if (event.detail >= 2) {\n const word = selectWordAtPoint(event.clientX, event.clientY, textLayerRef.current);\n if (word) {\n // mouseup already ran; open editor from the new word selection\n const surface = surfaceRef.current;\n if (surface && onAddAnnotation && onAddText) {\n const captured = selectionRectsForPage(surface, scale);\n if (captured) {\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind: \"redact\",\n color: REDACT_COLOR,\n rects: expandRedactRects(captured.rects),\n text: captured.text,\n });\n const start = selectionStartPoint(captured.rects);\n const size = measureInlineText(captured.text || \" \", start.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x: start.x,\n y: start.y,\n width: size.width,\n height: size.height,\n value: captured.text,\n fontSize: start.fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n window.getSelection()?.removeAllRanges();\n justOpenedEditorRef.current = true;\n }\n }\n return;\n }\n }\n\n event.stopPropagation();\n beginInlineTextAt(event.clientX, event.clientY);\n };\n\n const handleSurfaceClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\".epochs-pdf-viewer__signature\") ||\n target.closest(\".epochs-pdf-viewer__signature-field\") ||\n target.closest(\".epochs-pdf-viewer__inline-text\")\n ) {\n return;\n }\n\n if (markupTool === \"text\") {\n beginInlineTextAt(event.clientX, event.clientY);\n return;\n }\n\n if (\n !hasFixedSignatureFields &&\n markupTool === \"sign\" &&\n pendingFieldValue &&\n onPlaceFieldValue\n ) {\n const surface = surfaceRef.current;\n if (!surface) return;\n const point = clientPointToPage(event.clientX, event.clientY, surface, scale);\n onPlaceFieldValue(pageNumber, Math.max(0, point.x - 75), Math.max(0, point.y - 12));\n return;\n }\n\n if (\n !hasFixedSignatureFields &&\n markupTool === \"sign\" &&\n pendingSignature &&\n onAddSignature\n ) {\n const surface = surfaceRef.current;\n if (!surface) return;\n const pageSize = pageSizeFromSurface(surface, scale);\n const point = clientPointToPage(event.clientX, event.clientY, surface, scale);\n\n let x = point.x - pendingSignature.width / 2;\n let y = point.y - pendingSignature.height / 2;\n\n const maxX = Math.max(0, pageSize.width - pendingSignature.width);\n const maxY = Math.max(0, pageSize.height - pendingSignature.height);\n x = Math.min(Math.max(0, x), maxX);\n y = Math.min(Math.max(0, y), maxY);\n\n onAddSignature({\n id: createSignatureId(),\n pageNumber,\n x,\n y,\n width: pendingSignature.width,\n height: pendingSignature.height,\n imageDataUrl: pendingSignature.imageDataUrl,\n });\n return;\n }\n };\n\n const renderInlineText = (text: TextAnnotation) => {\n const isEditing = editingTextId === text.id;\n\n if (isEditing) {\n return (\n <span\n key={text.id}\n ref={inlineEditRef}\n contentEditable\n suppressContentEditableWarning\n role=\"textbox\"\n aria-label=\"Edit text\"\n className=\"epochs-pdf-viewer__inline-text epochs-pdf-viewer__inline-text--editing\"\n style={{\n left: text.x * scale,\n top: text.y * scale,\n fontSize: text.fontSize * scale,\n color: text.color,\n minWidth: Math.max(12, text.fontSize * scale * 0.5),\n width: Math.max(text.width * scale, text.fontSize * scale * 0.5),\n }}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onInput={(e) => {\n const value = e.currentTarget.textContent ?? \"\";\n const size = measureInlineText(value || \" \", text.fontSize);\n // Update metrics only — do not write value back into the DOM\n onUpdateText?.(text.id, {\n value,\n width: size.width,\n height: size.height,\n });\n }}\n onBlur={(e) => {\n commitInlineText(text, e.currentTarget.textContent ?? \"\");\n }}\n onKeyDown={(e) => {\n // Keep spaces / typing local to this editor\n e.stopPropagation();\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n }}\n />\n );\n }\n\n if (!text.value.trim()) return null;\n\n return (\n <span\n key={text.id}\n className={\n selectedTextId === text.id\n ? \"epochs-pdf-viewer__inline-text epochs-pdf-viewer__inline-text--selected\"\n : \"epochs-pdf-viewer__inline-text\"\n }\n style={{\n left: text.x * scale,\n top: text.y * scale,\n fontSize: text.fontSize * scale,\n color: text.color,\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (markupTool === \"erase\") {\n onRemoveText?.(text.id);\n return;\n }\n if (markupTool === \"text\") {\n onSelectText?.(text.id);\n onEditingTextIdChange?.(text.id);\n }\n }}\n >\n {text.value}\n </span>\n );\n };\n\n return (\n <div\n ref={setRefs}\n data-page-number={pageNumber}\n className=\"epochs-pdf-viewer__page\"\n >\n <div\n ref={surfaceRef}\n className={`epochs-pdf-viewer__surface epochs-pdf-viewer__surface--tool-${markupTool}`}\n onClick={handleSurfaceClick}\n >\n <canvas ref={canvasRef} className=\"epochs-pdf-viewer__canvas\" />\n\n <div className=\"epochs-pdf-viewer__markup-layer\" aria-hidden=\"true\">\n {pageAnnotations.map((ann) =>\n ann.kind === \"redact\"\n ? null\n : ann.rects.map((rect, idx) => {\n if (ann.kind === \"highlight\") {\n return (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--highlight\"\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.w * scale,\n height: rect.h * scale,\n background: ann.color,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n );\n }\n\n return (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--underline\"\n style={{\n left: rect.x * scale,\n top: (rect.y + rect.h) * scale - Math.max(2, scale * 1.5),\n width: rect.w * scale,\n height: Math.max(2, scale * 1.5),\n background: ann.color,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n );\n }),\n )}\n </div>\n\n <div className=\"epochs-pdf-viewer__signature-layer\">\n {pageSignatureFields.map((field) => {\n const filled = pageSignatures.some((sig) => sig.fieldId === field.id);\n return (\n <button\n key={field.id}\n type=\"button\"\n data-signature-field-id={field.id}\n className={\n selectedSignatureFieldId === field.id\n ? \"epochs-pdf-viewer__signature-field epochs-pdf-viewer__signature-field--selected\"\n : filled\n ? \"epochs-pdf-viewer__signature-field epochs-pdf-viewer__signature-field--filled\"\n : \"epochs-pdf-viewer__signature-field\"\n }\n style={{\n left: field.x * scale,\n top: field.y * scale,\n width: field.width * scale,\n height: field.height * scale,\n }}\n onClick={(e) => {\n e.stopPropagation();\n const fType = (field as any).type as string | undefined;\n if (fType === \"date\" || fType === \"text\") return;\n onSelectSignatureField?.(field.id);\n const existing = pageSignatures.find((sig) => sig.fieldId === field.id);\n onSelectSignature?.(existing?.id ?? null);\n if (existing) {\n onEditSignature?.(existing.id);\n } else {\n onOpenSignaturePad?.((field as any).type);\n }\n }}\n title={filled ? \"Signed field\" : \"Signature field\"}\n >\n {(() => {\n const fType = (field as any).type as string | undefined;\n if (fType === \"date\") {\n return (\n <input\n type=\"date\"\n className=\"epochs-pdf-viewer__signature-field-input\"\n value={fieldValues[field.id] ?? \"\"}\n onClick={(ev) => ev.stopPropagation()}\n onChange={(ev) => {\n ev.stopPropagation();\n onFieldValueChange?.(field.id, ev.target.value);\n onFieldValueCommit?.(field.id);\n }}\n style={{ width: \"100%\", height: \"100%\" }}\n />\n );\n }\n if (fType === \"text\") {\n return (\n <input\n type=\"text\"\n className=\"epochs-pdf-viewer__signature-field-input\"\n value={fieldValues[field.id] ?? \"\"}\n placeholder={(field as any).placeholder ?? \"Enter text\"}\n onClick={(ev) => ev.stopPropagation()}\n onChange={(ev) => {\n ev.stopPropagation();\n onFieldValueChange?.(field.id, ev.target.value);\n }}\n onBlur={() => onFieldValueCommit?.(field.id)}\n style={{ width: \"100%\", height: \"100%\" }}\n />\n );\n }\n return !filled ? <span>Sign here</span> : null;\n })()}\n </button>\n );\n })}\n {pageSignatures.map((sig) => (\n <div\n key={sig.id}\n className={\n selectedSignatureId === sig.id\n ? \"epochs-pdf-viewer__signature epochs-pdf-viewer__signature--selected\"\n : \"epochs-pdf-viewer__signature\"\n }\n style={{\n left: sig.x * scale,\n top: sig.y * scale,\n width: sig.width * scale,\n height: sig.height * scale,\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onSelectSignature?.(sig.id);\n\n if (markupTool === \"erase\" && !hasFixedSignatureFields) {\n onRemoveSignature?.(sig.id);\n return;\n }\n\n if (hasFixedSignatureFields) {\n onSelectSignatureField?.(sig.fieldId ?? null);\n onEditSignature?.(sig.id);\n return;\n }\n\n const surface = surfaceRef.current;\n if (!surface) return;\n const point = clientPointToPage(e.clientX, e.clientY, surface, scale);\n setDragState({\n kind: \"signature\",\n id: sig.id,\n offsetX: point.x - sig.x,\n offsetY: point.y - sig.y,\n });\n }}\n >\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-edit\"\n title=\"Edit signature\"\n aria-label=\"Edit signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignature?.(sig.id);\n onEditSignature?.(sig.id);\n }}\n >\n <PencilIcon size={12} />\n </button>\n {!hasFixedSignatureFields ? (\n <>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-duplicate\"\n title=\"Duplicate signature\"\n aria-label=\"Duplicate signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignature?.(sig.id);\n onDuplicateSignature?.(sig.id);\n }}\n >\n ⧉\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-remove\"\n title=\"Remove signature\"\n aria-label=\"Remove signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onRemoveSignature?.(sig.id);\n }}\n >\n ×\n </button>\n </>\n ) : null}\n <img src={sig.imageDataUrl} alt=\"Signature\" draggable={false} />\n {!hasFixedSignatureFields ? (\n <div\n className=\"epochs-pdf-viewer__signature-resize\"\n title=\"Resize\"\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onSelectSignature?.(sig.id);\n setDragState({\n kind: \"resize\",\n id: sig.id,\n startX: e.clientX,\n startY: e.clientY,\n startW: sig.width,\n startH: sig.height,\n });\n }}\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 1L1 7M7 4L4 7\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n </svg>\n </div>\n ) : null}\n </div>\n ))}\n </div>\n\n <div className=\"epochs-pdf-viewer__text-layer-overlay\">\n {pageTexts.map((text) => renderInlineText(text))}\n </div>\n\n <div\n ref={textLayerRef}\n className=\"textLayer epochs-pdf-viewer__text-layer\"\n onClick={handleInlineTextClick}\n />\n\n <div className=\"epochs-pdf-viewer__redact-layer\" aria-hidden=\"true\">\n {pageAnnotations.map((ann) =>\n ann.kind === \"redact\"\n ? ann.rects.map((rect, idx) => (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--redact\"\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.w * scale,\n height: rect.h * scale,\n background: ann.color || REDACT_COLOR,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n ))\n : null,\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { RenderTask } from \"pdfjs-dist\";\nimport { drawMarkupOnCanvas, type MarkupAnnotation } from \"./markup\";\nimport {\n drawSignatureFieldsOnCanvas,\n drawSignaturesOnCanvas,\n type SignatureAnnotation,\n type SignatureField,\n} from \"./signature\";\nimport {\n drawTextFieldsOnCanvas,\n drawTextsOnCanvas,\n type TextAnnotation,\n type TextField,\n} from \"./text\";\nimport type { PdfDoc } from \"./types\";\n\ninterface ThumbnailProps {\n pdfDoc: PdfDoc;\n pageNumber: number;\n isActive?: boolean;\n rotation: number;\n onSelect: (pageNumber: number) => void;\n width?: number;\n annotations?: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n signatureFields?: SignatureField[];\n texts?: TextAnnotation[];\n textFields?: TextField[];\n}\n\nexport function Thumbnail({\n pdfDoc,\n pageNumber,\n isActive,\n rotation,\n onSelect,\n width = 140,\n annotations = [],\n signatures = [],\n signatureFields = [],\n texts = [],\n textFields = [],\n}: ThumbnailProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n if (!pdfDoc || !canvasRef.current) return;\n\n let cancelled = false;\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n let task: RenderTask | null = null;\n\n const render = async () => {\n try {\n const page = await pdfDoc.getPage(pageNumber);\n if (cancelled) return;\n\n const viewportAt1 = page.getViewport({ scale: 1, rotation });\n const scale = width / viewportAt1.width;\n const viewport = page.getViewport({ scale, rotation });\n\n canvas.width = Math.floor(viewport.width);\n canvas.height = Math.floor(viewport.height);\n\n task = page.render({ canvasContext: ctx, viewport });\n await task.promise;\n\n const pageAnnotations = annotations.filter((a) => a.pageNumber === pageNumber);\n if (pageAnnotations.length > 0) {\n drawMarkupOnCanvas(ctx, pageAnnotations, scale);\n }\n\n const pageSignatures = signatures.filter((s) => s.pageNumber === pageNumber);\n const pageSignatureFields = signatureFields.filter(\n (field) => field.pageNumber === pageNumber,\n );\n if (pageSignatureFields.length > 0) {\n drawSignatureFieldsOnCanvas(\n ctx,\n pageSignatureFields,\n new Set(pageSignatures.map((sig) => sig.fieldId).filter(Boolean) as string[]),\n scale,\n );\n }\n if (pageSignatures.length > 0) {\n await drawSignaturesOnCanvas(ctx, pageSignatures, scale);\n }\n\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n const pageTextFields = textFields.filter(\n (field) => field.pageNumber === pageNumber,\n );\n if (pageTextFields.length > 0) {\n drawTextFieldsOnCanvas(\n ctx,\n pageTextFields,\n new Set(\n pageTexts\n .filter((t) => t.fieldId && t.value.trim())\n .map((t) => t.fieldId as string),\n ),\n scale,\n );\n }\n if (pageTexts.length > 0) {\n drawTextsOnCanvas(ctx, pageTexts, scale);\n }\n } catch {\n // ignore\n }\n };\n\n void render();\n\n return () => {\n cancelled = true;\n if (task) {\n try {\n task.cancel();\n } catch {\n // ignore\n }\n }\n };\n }, [\n annotations,\n pdfDoc,\n pageNumber,\n rotation,\n signatureFields,\n signatures,\n textFields,\n texts,\n width,\n ]);\n\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(pageNumber)}\n className={\n isActive\n ? \"epochs-pdf-viewer__thumb epochs-pdf-viewer__thumb--active\"\n : \"epochs-pdf-viewer__thumb\"\n }\n title={`Page ${pageNumber}`}\n >\n <div className=\"epochs-pdf-viewer__thumb-frame\">\n <canvas ref={canvasRef} />\n </div>\n <span className=\"epochs-pdf-viewer__thumb-label\">{pageNumber}</span>\n </button>\n );\n}\n","import * as pdfjsLib from \"pdfjs-dist\";\n\nconst ABSOLUTE_URL_PATTERN = /^(blob:|https?:|data:)/i;\n\nlet workerConfigured = false;\n\n/** Configure pdf.js worker. Call once, or pass `workerSrc` to `<PdfViewer>`. */\nexport function setPdfWorkerSrc(workerSrc: string): void {\n pdfjsLib.GlobalWorkerOptions.workerSrc = workerSrc;\n workerConfigured = true;\n}\n\nexport function ensurePdfWorker(workerSrc?: string): void {\n if (workerSrc) {\n setPdfWorkerSrc(workerSrc);\n return;\n }\n if (workerConfigured || pdfjsLib.GlobalWorkerOptions.workerSrc) return;\n\n setPdfWorkerSrc(\n `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`,\n );\n}\n\nexport function resolvePdfUrl(\n file?: string,\n fileUrl?: string,\n baseUrl = \"\",\n): string {\n const source = fileUrl || file;\n if (!source) return \"\";\n\n if (ABSOLUTE_URL_PATTERN.test(source)) return source;\n\n const path = source.startsWith(\"/\") ? source : `/${source}`;\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n}\n\nexport async function urlToPdfArrayBuffer(\n url: string,\n fetchOptions?: RequestInit,\n): Promise<ArrayBuffer> {\n const res = await fetch(url, fetchOptions);\n\n if (!res.ok) {\n throw new Error(`Failed to fetch PDF (${res.status})`);\n }\n\n return res.arrayBuffer();\n}\n\nexport async function sourceToArrayBuffer(\n source: string | ArrayBuffer | Uint8Array | Blob,\n fetchOptions?: RequestInit,\n): Promise<ArrayBuffer> {\n if (typeof source === \"string\") {\n return urlToPdfArrayBuffer(source, fetchOptions);\n }\n if (source instanceof ArrayBuffer) return source.slice(0);\n if (source instanceof Uint8Array) {\n const copy = new Uint8Array(source.byteLength);\n copy.set(source);\n return copy.buffer;\n }\n return source.arrayBuffer();\n}\n\nexport { pdfjsLib };\n","import type { PDFDocumentProxy } from \"pdfjs-dist\";\nimport type { MarkupAnnotation } from \"./markup\";\nimport { drawMarkupOnCanvas } from \"./markup\";\nimport type { SignatureAnnotation } from \"./signature\";\nimport { drawSignaturesOnCanvas } from \"./signature\";\nimport type { TextAnnotation } from \"./text\";\nimport { drawTextsOnCanvas } from \"./text\";\n\nexport interface RenderedPageImage {\n pageNumber: number;\n /** Canvas pixel size */\n width: number;\n height: number;\n /** PDF page size at scale 1 (points) */\n pageWidth: number;\n pageHeight: number;\n dataUrl: string;\n jpegBytes: Uint8Array;\n}\n\n/** Render a page in the *main* document (iframe canvases break pdf.js fonts). */\nexport async function renderPageWithMarkup(\n pdfDoc: PDFDocumentProxy,\n pageNumber: number,\n options: {\n scale: number;\n rotation: number;\n annotations: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n texts?: TextAnnotation[];\n mimeType?: \"image/png\" | \"image/jpeg\";\n quality?: number;\n },\n): Promise<RenderedPageImage> {\n const {\n scale,\n rotation,\n annotations,\n signatures = [],\n texts = [],\n mimeType = \"image/jpeg\",\n quality = 0.92,\n } = options;\n\n const page = await pdfDoc.getPage(pageNumber);\n const viewport = page.getViewport({ scale, rotation });\n const baseViewport = page.getViewport({ scale: 1, rotation });\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\", { alpha: false });\n if (!ctx) {\n throw new Error(\"Could not create canvas context\");\n }\n\n const width = Math.floor(viewport.width);\n const height = Math.floor(viewport.height);\n canvas.width = width;\n canvas.height = height;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, width, height);\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n const pageMarks = annotations.filter((a) => a.pageNumber === pageNumber);\n if (pageMarks.length > 0) {\n drawMarkupOnCanvas(ctx, pageMarks, scale);\n }\n\n const pageSigs = signatures.filter((s) => s.pageNumber === pageNumber);\n if (pageSigs.length > 0) {\n await drawSignaturesOnCanvas(ctx, pageSigs, scale);\n }\n\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n if (pageTexts.length > 0) {\n drawTextsOnCanvas(ctx, pageTexts, scale);\n }\n\n const dataUrl = canvas.toDataURL(mimeType, quality);\n const jpegBytes = dataUrlToBytes(dataUrl);\n\n canvas.width = 0;\n canvas.height = 0;\n\n return {\n pageNumber,\n width,\n height,\n pageWidth: baseViewport.width,\n pageHeight: baseViewport.height,\n dataUrl,\n jpegBytes,\n };\n}\n\nexport async function renderAllPagesWithMarkup(\n pdfDoc: PDFDocumentProxy,\n options: {\n scale: number;\n rotation: number;\n annotations: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n texts?: TextAnnotation[];\n mimeType?: \"image/png\" | \"image/jpeg\";\n quality?: number;\n },\n): Promise<RenderedPageImage[]> {\n const pages: RenderedPageImage[] = [];\n for (let i = 1; i <= pdfDoc.numPages; i += 1) {\n pages.push(await renderPageWithMarkup(pdfDoc, i, options));\n }\n return pages;\n}\n\nfunction dataUrlToBytes(dataUrl: string): Uint8Array {\n const base64 = dataUrl.split(\",\")[1] ?? \"\";\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction enc(text: string): Uint8Array {\n return new TextEncoder().encode(text);\n}\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((sum, p) => sum + p.byteLength, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.byteLength;\n }\n return out;\n}\n\n/**\n * Build a multi-page PDF embedding each page as a JPEG (includes baked markup).\n */\nexport function buildPdfFromJpegPages(pages: RenderedPageImage[]): Uint8Array {\n type PdfObject = Uint8Array;\n const objects: PdfObject[] = [];\n\n const add = (bytes: Uint8Array): number => {\n objects.push(bytes);\n return objects.length; // 1-indexed id\n };\n\n const pageIds: number[] = [];\n\n for (const page of pages) {\n const imageStream = concat(\n enc(\n `<< /Type /XObject /Subtype /Image /Width ${page.width} /Height ${page.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${page.jpegBytes.byteLength} >>\\nstream\\n`,\n ),\n page.jpegBytes,\n enc(`\\nendstream`),\n );\n const imageId = add(imageStream);\n\n const content = `q\\n${page.pageWidth.toFixed(2)} 0 0 ${page.pageHeight.toFixed(2)} 0 0 cm\\n/Im0 Do\\nQ`;\n const contentId = add(\n enc(`<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`),\n );\n\n // Parent placeholder replaced after pages object exists\n const pageId = add(\n enc(\n `<< /Type /Page /Parent __PAGES__ 0 R /MediaBox [0 0 ${page.pageWidth.toFixed(2)} ${page.pageHeight.toFixed(2)}] /Contents ${contentId} 0 R /Resources << /XObject << /Im0 ${imageId} 0 R >> >> >>`,\n ),\n );\n pageIds.push(pageId);\n }\n\n const kids = pageIds.map((id) => `${id} 0 R`).join(\" \");\n const pagesId = add(\n enc(`<< /Type /Pages /Kids [${kids}] /Count ${pageIds.length} >>`),\n );\n\n for (const pageId of pageIds) {\n const text = new TextDecoder().decode(objects[pageId - 1]);\n objects[pageId - 1] = enc(\n text.replace(\"/Parent __PAGES__ 0 R\", `/Parent ${pagesId} 0 R`),\n );\n }\n\n const catalogId = add(enc(`<< /Type /Catalog /Pages ${pagesId} 0 R >>`));\n\n const chunks: Uint8Array[] = [enc(\"%PDF-1.4\\n\")];\n const offsets: number[] = [0];\n let offset = chunks[0].byteLength;\n\n for (let i = 0; i < objects.length; i += 1) {\n offsets.push(offset);\n const objHeader = enc(`${i + 1} 0 obj\\n`);\n const objFooter = enc(`\\nendobj\\n`);\n chunks.push(objHeader, objects[i], objFooter);\n offset += objHeader.byteLength + objects[i].byteLength + objFooter.byteLength;\n }\n\n const xrefStart = offset;\n let xref = `xref\\n0 ${objects.length + 1}\\n`;\n xref += \"0000000000 65535 f \\n\";\n for (let i = 1; i <= objects.length; i += 1) {\n xref += `${String(offsets[i]).padStart(10, \"0\")} 00000 n \\n`;\n }\n xref += `trailer\\n<< /Size ${objects.length + 1} /Root ${catalogId} 0 R >>\\n`;\n xref += `startxref\\n${xrefStart}\\n%%EOF`;\n chunks.push(enc(xref));\n\n return concat(...chunks);\n}\n\nexport function triggerBlobDownload(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { SignatureFieldType } from \"./signature\";\n\ninterface SignaturePadProps {\n open: boolean;\n onClose: () => void;\n onSave: (imageDataUrl: string, width: number, height: number) => void;\n /** When set, locks the modal to this field type (from a fixed field). */\n fieldType?: SignatureFieldType;\n /** Show Sign/Date/Text tabs when no fixed field type is provided. */\n showFieldTypeTabs?: boolean;\n /** Placeholder for text-type fields. */\n textPlaceholder?: string;\n}\n\ntype PadMode = \"draw\" | \"type\";\n\nconst HANDWRITING_FONTS = [\n { id: \"dancing-script\", label: \"Dancing Script\", family: \"Dancing Script\" },\n { id: \"great-vibes\", label: \"Great Vibes\", family: \"Great Vibes\" },\n { id: \"pacifico\", label: \"Pacifico\", family: \"Pacifico\" },\n { id: \"satisfy\", label: \"Satisfy\", family: \"Satisfy\" },\n { id: \"allura\", label: \"Allura\", family: \"Allura\" },\n] as const;\n\ntype HandwritingFontId = (typeof HANDWRITING_FONTS)[number][\"id\"];\n\nconst HANDWRITING_FONTS_HREF =\n \"https://fonts.googleapis.com/css2?family=Allura&family=Dancing+Script:wght@500;600&family=Great+Vibes&family=Pacifico&family=Satisfy&display=swap\";\n\nlet handwritingFontsPromise: Promise<void> | null = null;\n\nfunction ensureHandwritingFonts(): Promise<void> {\n if (typeof document === \"undefined\") return Promise.resolve();\n if (handwritingFontsPromise) return handwritingFontsPromise;\n\n handwritingFontsPromise = new Promise((resolve) => {\n const existing = document.querySelector(\n `link[data-epochs-signature-fonts=\"true\"]`,\n );\n if (!existing) {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = HANDWRITING_FONTS_HREF;\n link.dataset.epochsSignatureFonts = \"true\";\n document.head.appendChild(link);\n }\n\n const loadFaces = () =>\n Promise.all(\n HANDWRITING_FONTS.map((font) =>\n document.fonts.load(`48px \"${font.family}\"`),\n ),\n ).then(() => undefined);\n\n if (document.fonts?.ready) {\n document.fonts.ready.then(loadFaces).then(resolve).catch(() => resolve());\n } else {\n window.setTimeout(() => {\n loadFaces().then(resolve).catch(() => resolve());\n }, 300);\n }\n });\n\n return handwritingFontsPromise;\n}\n\nexport function SignaturePad({\n open,\n onClose,\n onSave,\n fieldType,\n showFieldTypeTabs = false,\n textPlaceholder,\n}: SignaturePadProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const drawingRef = useRef(false);\n const lastPointRef = useRef<{ x: number; y: number } | null>(null);\n const pathsRef = useRef<{ x: number; y: number }[][]>([]);\n const currentPathRef = useRef<{ x: number; y: number }[]>([]);\n\n const resolvedFieldType: SignatureFieldType = fieldType ?? \"sign\";\n const [activeFieldType, setActiveFieldType] = useState<SignatureFieldType>(resolvedFieldType);\n const [dateValue, setDateValue] = useState(\"\");\n const [textValue, setTextValue] = useState(\"\");\n\n const [mode, setMode] = useState<PadMode>(\"draw\");\n const [typedName, setTypedName] = useState(\"\");\n const [typedInitials, setTypedInitials] = useState(\"\");\n const [initialsTouched, setInitialsTouched] = useState(false);\n const [typeKind, setTypeKind] = useState<\"signature\" | \"initials\">(\"signature\");\n const [inkColor, setInkColor] = useState(\"#111827\");\n const [fontId, setFontId] = useState<HandwritingFontId>(\"dancing-script\");\n const [fontsReady, setFontsReady] = useState(false);\n\n const selectedFont =\n HANDWRITING_FONTS.find((font) => font.id === fontId) ?? HANDWRITING_FONTS[0];\n\n const previewText =\n typeKind === \"initials\" ? typedInitials.trim() : typedName.trim();\n const fontPreviewLabel =\n previewText || (typeKind === \"initials\" ? \"AB\" : \"Signature\");\n\n useEffect(() => {\n if (!open) return;\n setActiveFieldType(resolvedFieldType);\n setDateValue(new Date().toISOString().slice(0, 10));\n setTextValue(\"\");\n }, [open, resolvedFieldType]);\n\n useEffect(() => {\n if (!open || activeFieldType !== \"sign\") return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n canvas.width = 560;\n canvas.height = 200;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = inkColor;\n ctx.lineWidth = 2.5;\n lastPointRef.current = null;\n drawingRef.current = false;\n }, [open, activeFieldType]);\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n setFontsReady(false);\n ensureHandwritingFonts().then(() => {\n if (!cancelled) setFontsReady(true);\n });\n return () => {\n cancelled = true;\n };\n }, [open]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx) return;\n ctx.strokeStyle = inkColor;\n ctx.fillStyle = inkColor;\n }, [inkColor]);\n\n useEffect(() => {\n if (!open || mode !== \"type\") return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n if (!previewText) return;\n\n const size =\n typeKind === \"initials\"\n ? 72\n : selectedFont.family === \"Great Vibes\" || selectedFont.family === \"Allura\"\n ? 56\n : selectedFont.family === \"Pacifico\"\n ? 44\n : 48;\n\n ctx.fillStyle = inkColor;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = `${size}px \"${selectedFont.family}\", cursive`;\n ctx.fillText(previewText, canvas.width / 2, canvas.height / 2);\n }, [\n previewText,\n typeKind,\n mode,\n inkColor,\n open,\n selectedFont,\n fontsReady,\n ]);\n\n if (!open) return null;\n\n const getPoint = (event: React.PointerEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n return {\n x: ((event.clientX - rect.left) / rect.width) * canvas.width,\n y: ((event.clientY - rect.top) / rect.height) * canvas.height,\n };\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLCanvasElement>) => {\n if (mode !== \"draw\") return;\n event.currentTarget.setPointerCapture(event.pointerId);\n drawingRef.current = true;\n const pt = getPoint(event);\n lastPointRef.current = pt;\n currentPathRef.current = [pt];\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLCanvasElement>) => {\n if (!drawingRef.current || mode !== \"draw\") return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n const last = lastPointRef.current;\n if (!ctx || !last) return;\n\n const point = getPoint(event);\n ctx.beginPath();\n ctx.moveTo(last.x, last.y);\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n lastPointRef.current = point;\n currentPathRef.current.push(point);\n };\n\n const handlePointerUp = () => {\n if (currentPathRef.current.length > 1) {\n pathsRef.current.push([...currentPathRef.current]);\n }\n currentPathRef.current = [];\n drawingRef.current = false;\n lastPointRef.current = null;\n };\n\n const clearPad = () => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n pathsRef.current = [];\n currentPathRef.current = [];\n setTypedName(\"\");\n setTypedInitials(\"\");\n setInitialsTouched(false);\n };\n\n const handleNameChange = (value: string) => {\n setTypedName(value);\n if (!initialsTouched) {\n setTypedInitials(deriveInitials(value));\n }\n };\n\n const trimAndSave = () => {\n if (mode === \"draw\") {\n const allPaths = pathsRef.current;\n if (allPaths.length === 0) return;\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const path of allPaths) {\n for (const pt of path) {\n if (pt.x < minX) minX = pt.x;\n if (pt.y < minY) minY = pt.y;\n if (pt.x > maxX) maxX = pt.x;\n if (pt.y > maxY) maxY = pt.y;\n }\n }\n\n const pad = 8;\n minX = Math.max(0, minX - pad);\n minY = Math.max(0, minY - pad);\n maxX += pad;\n maxY += pad;\n const w = maxX - minX;\n const h = maxY - minY;\n\n const pathData = allPaths\n .map((path) => {\n const pts = path.map((pt) => ({ x: pt.x - minX, y: pt.y - minY }));\n return \"M\" + pts.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(\"L\");\n })\n .join(\" \");\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w.toFixed(0)}\" height=\"${h.toFixed(0)}\" viewBox=\"0 0 ${w.toFixed(0)} ${h.toFixed(0)}\"><path d=\"${pathData}\" fill=\"none\" stroke=\"${inkColor}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n const dataUrl = `data:image/svg+xml;base64,${btoa(svg)}`;\n onSave(dataUrl, w, h);\n } else {\n if (!previewText) return;\n\n const dpr = 3;\n const size =\n typeKind === \"initials\"\n ? 72\n : selectedFont.family === \"Great Vibes\" || selectedFont.family === \"Allura\"\n ? 56\n : selectedFont.family === \"Pacifico\"\n ? 44\n : 48;\n\n const measureCanvas = document.createElement(\"canvas\");\n const measureCtx = measureCanvas.getContext(\"2d\")!;\n measureCtx.font = `${size * dpr}px \"${selectedFont.family}\", cursive`;\n const metrics = measureCtx.measureText(previewText);\n const pad = 12 * dpr;\n const canvasW = Math.ceil(metrics.width) + pad * 2;\n const canvasH = size * dpr + pad * 2;\n\n const outCanvas = document.createElement(\"canvas\");\n outCanvas.width = canvasW;\n outCanvas.height = canvasH;\n const outCtx = outCanvas.getContext(\"2d\")!;\n outCtx.clearRect(0, 0, canvasW, canvasH);\n outCtx.font = `${size * dpr}px \"${selectedFont.family}\", cursive`;\n outCtx.fillStyle = inkColor;\n outCtx.textBaseline = \"middle\";\n outCtx.fillText(previewText, pad, canvasH / 2);\n\n const dataUrl = outCanvas.toDataURL(\"image/png\");\n onSave(dataUrl, canvasW / dpr, canvasH / dpr);\n }\n };\n\n const handleFieldValueSave = () => {\n const text =\n activeFieldType === \"date\" ? dateValue : textValue.trim();\n if (!text) return;\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\")!;\n const fontSize = 16;\n ctx.font = `${fontSize}px sans-serif`;\n const metrics = ctx.measureText(text);\n const pad = 8;\n canvas.width = Math.ceil(metrics.width) + pad * 2;\n canvas.height = fontSize + pad * 2;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.font = `${fontSize}px sans-serif`;\n ctx.fillStyle = \"#111827\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, pad, canvas.height / 2);\n\n const dataUrl = canvas.toDataURL(\"image/png\");\n onSave(dataUrl, canvas.width, canvas.height);\n };\n\n const showSignPad = activeFieldType === \"sign\";\n const modalTitle =\n activeFieldType === \"date\"\n ? \"Pick a date\"\n : activeFieldType === \"text\"\n ? \"Enter text\"\n : \"Create e-signature\";\n\n return (\n <div className=\"epochs-pdf-viewer__modal\" role=\"dialog\" aria-modal=\"true\">\n <div className=\"epochs-pdf-viewer__modal-backdrop\" onClick={onClose} />\n <div className=\"epochs-pdf-viewer__modal-card\">\n <div className=\"epochs-pdf-viewer__modal-header\">\n <h3>{modalTitle}</h3>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={onClose}\n title=\"Close\"\n >\n ×\n </button>\n </div>\n\n {showFieldTypeTabs && !fieldType ? (\n <div className=\"epochs-pdf-viewer__field-type-tabs\" role=\"tablist\">\n {([\"sign\", \"date\", \"text\"] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeFieldType === t}\n className={\n activeFieldType === t\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setActiveFieldType(t)}\n >\n {t === \"sign\" ? \"Sign\" : t === \"date\" ? \"Date\" : \"Text\"}\n </button>\n ))}\n </div>\n ) : null}\n\n {showSignPad ? (\n <>\n <div className=\"epochs-pdf-viewer__sign-modes\">\n <button\n type=\"button\"\n className={\n mode === \"draw\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => {\n setMode(\"draw\");\n clearPad();\n }}\n >\n Draw\n </button>\n <button\n type=\"button\"\n className={\n mode === \"type\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setMode(\"type\")}\n >\n Type\n </button>\n <label className=\"epochs-pdf-viewer__sign-ink\">\n Ink\n <input\n type=\"color\"\n value={inkColor}\n onChange={(e) => setInkColor(e.target.value)}\n />\n </label>\n </div>\n\n {mode === \"type\" ? (\n <>\n <div\n className=\"epochs-pdf-viewer__sign-fonts\"\n role=\"group\"\n aria-label=\"Handwriting style\"\n >\n {HANDWRITING_FONTS.map((font) => (\n <button\n key={font.id}\n type=\"button\"\n className={\n fontId === font.id\n ? \"epochs-pdf-viewer__sign-font epochs-pdf-viewer__sign-font--active\"\n : \"epochs-pdf-viewer__sign-font\"\n }\n style={{ fontFamily: `\"${font.family}\", cursive` }}\n onClick={() => setFontId(font.id)}\n title={font.label}\n >\n {fontPreviewLabel}\n </button>\n ))}\n </div>\n\n <div className=\"epochs-pdf-viewer__sign-type-fields\">\n <label className=\"epochs-pdf-viewer__sign-type-field\">\n <span>Full name</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={typedName}\n onChange={(e) => handleNameChange(e.target.value)}\n onFocus={() => setTypeKind(\"signature\")}\n placeholder=\"Type your full name\"\n style={{ fontFamily: `\"${selectedFont.family}\", cursive` }}\n autoFocus\n />\n </label>\n <label className=\"epochs-pdf-viewer__sign-type-field\">\n <span>Initials</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={typedInitials}\n onChange={(e) => {\n setInitialsTouched(true);\n setTypedInitials(e.target.value.toUpperCase());\n }}\n onFocus={() => setTypeKind(\"initials\")}\n placeholder=\"e.g. JD\"\n maxLength={4}\n style={{ fontFamily: `\"${selectedFont.family}\", cursive` }}\n />\n </label>\n </div>\n\n <div\n className=\"epochs-pdf-viewer__sign-type-kind\"\n role=\"group\"\n aria-label=\"Preview type\"\n >\n <button\n type=\"button\"\n className={\n typeKind === \"signature\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setTypeKind(\"signature\")}\n >\n Use full name\n </button>\n <button\n type=\"button\"\n className={\n typeKind === \"initials\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setTypeKind(\"initials\")}\n >\n Use initials\n </button>\n </div>\n </>\n ) : (\n <p className=\"epochs-pdf-viewer__sign-hint\">Draw your signature below</p>\n )}\n\n <canvas\n ref={canvasRef}\n className={\n mode === \"draw\"\n ? \"epochs-pdf-viewer__sign-canvas\"\n : \"epochs-pdf-viewer__sign-canvas epochs-pdf-viewer__sign-canvas--preview\"\n }\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerUp}\n />\n </>\n ) : activeFieldType === \"date\" ? (\n <label className=\"epochs-pdf-viewer__sign-type-field\" style={{ padding: \"1rem\" }}>\n <span>Date</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"date\"\n value={dateValue}\n onChange={(e) => setDateValue(e.target.value)}\n autoFocus\n />\n </label>\n ) : (\n <label className=\"epochs-pdf-viewer__sign-type-field\" style={{ padding: \"1rem\" }}>\n <span>Text</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={textValue}\n onChange={(e) => setTextValue(e.target.value)}\n placeholder={textPlaceholder ?? \"Enter text\"}\n autoFocus\n />\n </label>\n )}\n\n <div className=\"epochs-pdf-viewer__modal-actions\">\n {showSignPad ? (\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={clearPad}\n >\n Clear\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--primary\"\n onClick={showSignPad ? trimAndSave : handleFieldValueSave}\n disabled={\n activeFieldType === \"date\" ? !dateValue\n : activeFieldType === \"text\" ? !textValue.trim()\n : false\n }\n >\n {showSignPad ? \"Use signature\" : \"Place on page\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction deriveInitials(name: string): string {\n const parts = name\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return parts\n .slice(0, 3)\n .map((part) => part[0]?.toUpperCase() ?? \"\")\n .join(\"\");\n}\n\n","/** Brand key used to identify toolbar tool components. */\nexport const TOOLBAR_TOOL_ID = \"__epochsToolbarToolId\" as const;\n\nexport type ToolbarToolId =\n | \"thumbnail\"\n | \"navigation\"\n | \"zoom\"\n | \"rotate\"\n | \"reload\"\n | \"print\"\n | \"open\"\n | \"download\"\n | \"highlight\"\n | \"underline\"\n | \"signature\"\n | \"text\"\n | \"erase\"\n | \"clear\";\n\nexport type ToolbarToolComponent = {\n (props?: Record<string, never>): null;\n displayName: string;\n readonly [TOOLBAR_TOOL_ID]: ToolbarToolId;\n};\n\nfunction createToolbarTool(\n id: ToolbarToolId,\n displayName: string,\n): ToolbarToolComponent {\n const Tool = (() => null) as ToolbarToolComponent;\n Tool.displayName = displayName;\n Object.defineProperty(Tool, TOOLBAR_TOOL_ID, {\n value: id,\n enumerable: true,\n });\n return Tool;\n}\n\nexport function getToolbarToolId(\n tool: ToolbarToolComponent,\n): ToolbarToolId {\n return tool[TOOLBAR_TOOL_ID];\n}\n\nexport function isToolbarTool(\n value: unknown,\n): value is ToolbarToolComponent {\n return (\n typeof value === \"function\" &&\n TOOLBAR_TOOL_ID in value &&\n typeof (value as ToolbarToolComponent)[TOOLBAR_TOOL_ID] === \"string\"\n );\n}\n\n/** Toggle thumbnails sidebar. */\nexport const Thumbnail = createToolbarTool(\"thumbnail\", \"Thumbnail\");\n/** Previous / next page and page number. */\nexport const Navigation = createToolbarTool(\"navigation\", \"Navigation\");\n/** Zoom out, zoom %, zoom in, and fit width. */\nexport const Zoom = createToolbarTool(\"zoom\", \"Zoom\");\n/** Rotate pages. */\nexport const Rotate = createToolbarTool(\"rotate\", \"Rotate\");\n/** Reload the PDF. */\nexport const Reload = createToolbarTool(\"reload\", \"Reload\");\n/** Print (includes markup). */\nexport const Print = createToolbarTool(\"print\", \"Print\");\n/** Open PDF in a new tab. */\nexport const Open = createToolbarTool(\"open\", \"Open\");\n/** Download PDF (with markup when present). */\nexport const Download = createToolbarTool(\"download\", \"Download\");\n/** Highlight text markup tool. */\nexport const Highlight = createToolbarTool(\"highlight\", \"Highlight\");\n/** Underline text markup tool. */\nexport const Underline = createToolbarTool(\"underline\", \"Underline\");\n/** E-signature tool. */\nexport const Signature = createToolbarTool(\"signature\", \"Signature\");\n/** Add / edit free text on the page. */\nexport const AddText = createToolbarTool(\"text\", \"AddText\");\n/** Erase markup annotations. */\nexport const Erase = createToolbarTool(\"erase\", \"Erase\");\n/** Clear all markup. */\nexport const Clear = createToolbarTool(\"clear\", \"Clear\");\n\nexport const ALL_TOOLBAR_TOOLS = [\n Thumbnail,\n Navigation,\n Zoom,\n Rotate,\n Highlight,\n Underline,\n Signature,\n AddText,\n Erase,\n Clear,\n Reload,\n Print,\n Open,\n Download,\n] as const;\n\n/** Default left / right toolbar layout. */\nexport const DEFAULT_TOOLBAR_LAYOUT: [\n ToolbarToolComponent[],\n ToolbarToolComponent[],\n] = [\n [Thumbnail, Navigation],\n [\n Zoom,\n Rotate,\n Highlight,\n Underline,\n Signature,\n AddText,\n Erase,\n Clear,\n Reload,\n Print,\n Open,\n Download,\n ],\n];\n","import type { ReactNode } from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n EraserIcon,\n ExternalLinkIcon,\n GridIcon,\n HighlightIcon,\n MinusIcon,\n PlusIcon,\n PrinterIcon,\n RefreshIcon,\n RotateIcon,\n SignatureIcon,\n TextIcon,\n UnderlineIcon,\n} from \"./icons\";\nimport type { MarkupTool } from \"./markup\";\nimport {\n HIGHLIGHT_PRESETS,\n UNDERLINE_PRESETS,\n normalizeHex,\n} from \"./markup\";\nimport type { ToolbarToolId } from \"./toolbarTools\";\n\nexport type ToolbarRenderContext = {\n status: string;\n showThumbnails: boolean;\n setShowThumbnails: (updater: (v: boolean) => boolean) => void;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n pageNumber: number;\n numPages: number;\n scrollToPage: (page: number) => void;\n scale: number;\n handleZoomOut: () => void;\n handleZoomIn: () => void;\n handleFitWidth: () => void | Promise<void>;\n handleRotate: () => void;\n markupTool: MarkupTool;\n toggleMarkupTool: (tool: Exclude<MarkupTool, \"none\">) => void;\n hasFixedSignatureFields: boolean;\n hasFixedTextFields: boolean;\n pendingSignature: { imageDataUrl: string; width: number; height: number } | null;\n setMarkupTool: (tool: MarkupTool) => void;\n setSignaturePadOpen: (open: boolean) => void;\n annotationsLength: number;\n signaturesLength: number;\n textsLength: number;\n handleClearAnnotations: () => void;\n highlightHex: string;\n underlineHex: string;\n setHighlightHex: (hex: string) => void;\n setUnderlineHex: (hex: string) => void;\n loadDocument: () => void | Promise<void>;\n handlePrint: () => void | Promise<void>;\n isPrinting: boolean;\n pdfDoc: unknown;\n displayUrl: string | null;\n resolvedUrl: string;\n handleDownload: () => void | Promise<void>;\n isDownloading: boolean;\n};\n\nconst MARKUP_TOOLS: ToolbarToolId[] = [\n \"highlight\",\n \"underline\",\n \"signature\",\n \"text\",\n \"erase\",\n \"clear\",\n];\n\nexport function isMarkupToolbarTool(id: ToolbarToolId): boolean {\n return MARKUP_TOOLS.includes(id);\n}\n\nexport function renderToolbarTool(\n id: ToolbarToolId,\n ctx: ToolbarRenderContext,\n options?: { showMarkupSep?: boolean },\n): ReactNode {\n const nodes: ReactNode[] = [];\n\n if (options?.showMarkupSep) {\n nodes.push(\n <span\n key={`${id}-sep`}\n className=\"epochs-pdf-viewer__toolbar-sep\"\n aria-hidden=\"true\"\n />,\n );\n }\n\n switch (id) {\n case \"thumbnail\":\n nodes.push(\n <button\n key=\"thumbnail\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => ctx.setShowThumbnails((v) => !v)}\n title={ctx.showThumbnails ? \"Hide thumbnails\" : \"Show thumbnails\"}\n >\n <GridIcon />\n </button>,\n );\n break;\n\n case \"navigation\":\n nodes.push(\n <button\n key=\"nav-prev\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handlePrev}\n disabled={!ctx.canGoPrev || ctx.status !== \"ready\"}\n title=\"Previous page\"\n >\n <ChevronLeftIcon />\n </button>,\n <div key=\"nav-page\" className=\"epochs-pdf-viewer__page-input\">\n <input\n type=\"number\"\n value={ctx.pageNumber}\n min={1}\n max={ctx.numPages || 1}\n onChange={(e) => {\n const next = Number.parseInt(e.target.value, 10);\n if (!Number.isFinite(next)) return;\n ctx.scrollToPage(\n Math.max(1, Math.min(ctx.numPages || 1, next)),\n );\n }}\n disabled={ctx.status !== \"ready\"}\n aria-label=\"Page number\"\n />\n <span>/ {ctx.numPages || \"-\"}</span>\n </div>,\n <button\n key=\"nav-next\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleNext}\n disabled={!ctx.canGoNext || ctx.status !== \"ready\"}\n title=\"Next page\"\n >\n <ChevronRightIcon />\n </button>,\n );\n break;\n\n case \"zoom\":\n nodes.push(\n <button\n key=\"zoom-out\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleZoomOut}\n disabled={ctx.status !== \"ready\"}\n title=\"Zoom out\"\n >\n <MinusIcon />\n </button>,\n <span key=\"zoom-label\" className=\"epochs-pdf-viewer__zoom-label\">\n {Math.round(ctx.scale * 100)}%\n </span>,\n <button\n key=\"zoom-in\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleZoomIn}\n disabled={ctx.status !== \"ready\"}\n title=\"Zoom in\"\n >\n <PlusIcon />\n </button>,\n <button\n key=\"zoom-fit\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={() => void ctx.handleFitWidth()}\n disabled={ctx.status !== \"ready\"}\n title=\"Fit to width\"\n >\n Fit\n </button>,\n );\n break;\n\n case \"rotate\":\n nodes.push(\n <button\n key=\"rotate\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleRotate}\n disabled={ctx.status !== \"ready\"}\n title=\"Rotate\"\n >\n <RotateIcon />\n </button>,\n );\n break;\n\n case \"highlight\":\n nodes.push(\n <button\n key=\"highlight\"\n type=\"button\"\n className={\n ctx.markupTool === \"highlight\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"highlight\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Highlight text — select text to highlight\"\n >\n <HighlightIcon />\n </button>,\n );\n break;\n\n case \"underline\":\n nodes.push(\n <button\n key=\"underline\"\n type=\"button\"\n className={\n ctx.markupTool === \"underline\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"underline\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Underline text — select text to underline\"\n >\n <UnderlineIcon />\n </button>,\n );\n break;\n\n case \"signature\":\n nodes.push(\n <button\n key=\"signature\"\n type=\"button\"\n className={\n ctx.markupTool === \"sign\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => {\n if (\n !ctx.hasFixedSignatureFields &&\n ctx.pendingSignature &&\n ctx.markupTool !== \"sign\"\n ) {\n ctx.setMarkupTool(\"sign\");\n return;\n }\n ctx.setSignaturePadOpen(true);\n }}\n disabled={ctx.status !== \"ready\"}\n title={\n ctx.hasFixedSignatureFields\n ? \"Create e-signature for a fixed field\"\n : ctx.pendingSignature\n ? \"Place signature — click on the page, then drag to move\"\n : \"Create e-signature\"\n }\n >\n <SignatureIcon />\n </button>,\n );\n break;\n\n case \"text\":\n nodes.push(\n <button\n key=\"text\"\n type=\"button\"\n className={\n ctx.markupTool === \"text\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"text\")}\n disabled={ctx.status !== \"ready\"}\n title={\n ctx.hasFixedTextFields\n ? \"Edit text in predefined areas — click to type\"\n : \"Edit PDF text — select words, then change them\"\n }\n >\n <TextIcon />\n </button>,\n );\n break;\n\n case \"erase\":\n nodes.push(\n <button\n key=\"erase\"\n type=\"button\"\n className={\n ctx.markupTool === \"erase\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"erase\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Remove text — select PDF words to cover them, or click added markup\"\n >\n <EraserIcon />\n </button>,\n );\n break;\n\n case \"clear\":\n nodes.push(\n <button\n key=\"clear\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={ctx.handleClearAnnotations}\n disabled={\n ctx.status !== \"ready\" ||\n (ctx.annotationsLength === 0 &&\n ctx.signaturesLength === 0 &&\n ctx.textsLength === 0)\n }\n title=\"Clear all markup\"\n >\n Clear\n </button>,\n );\n break;\n\n case \"reload\":\n nodes.push(\n <button\n key=\"reload\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.loadDocument()}\n title=\"Reload\"\n >\n <RefreshIcon />\n </button>,\n );\n break;\n\n case \"print\":\n nodes.push(\n <button\n key=\"print\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.handlePrint()}\n disabled={ctx.status !== \"ready\" || !ctx.pdfDoc || ctx.isPrinting}\n title={\n ctx.isPrinting\n ? \"Preparing print…\"\n : \"Print (includes highlights & underlines)\"\n }\n >\n <PrinterIcon />\n </button>,\n );\n break;\n\n case \"open\":\n nodes.push(\n <a\n key=\"open\"\n className=\"epochs-pdf-viewer__btn\"\n href={ctx.displayUrl || ctx.resolvedUrl || undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"Open in new tab\"\n >\n <ExternalLinkIcon />\n </a>,\n );\n break;\n\n case \"download\":\n nodes.push(\n <button\n key=\"download\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.handleDownload()}\n disabled={\n ctx.status !== \"ready\" || !ctx.pdfDoc || ctx.isDownloading\n }\n title={\n ctx.isDownloading\n ? \"Preparing download…\"\n : ctx.annotationsLength > 0 ||\n ctx.signaturesLength > 0 ||\n ctx.textsLength > 0\n ? \"Download PDF with markup\"\n : \"Download PDF\"\n }\n >\n <DownloadIcon />\n </button>,\n );\n break;\n\n default:\n break;\n }\n\n return nodes.length > 0 ? nodes : null;\n}\n\nexport function renderMarkupExtras(\n ctx: ToolbarRenderContext,\n enabledIds: Set<ToolbarToolId>,\n): ReactNode {\n const nodes: ReactNode[] = [];\n\n if (\n ctx.markupTool === \"sign\" &&\n ctx.pendingSignature &&\n !ctx.hasFixedSignatureFields &&\n enabledIds.has(\"signature\")\n ) {\n nodes.push(\n <span key=\"sign-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n Click page to place duplicate/new signature\n </span>,\n );\n }\n\n if (\n ctx.markupTool === \"text\" &&\n enabledIds.has(\"text\")\n ) {\n nodes.push(\n <span key=\"text-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n {ctx.hasFixedTextFields\n ? \"Click in a predefined text area to type\"\n : \"Select text to edit it — e.g. change this PDF to this is PDF\"}\n </span>,\n );\n }\n\n if (\n ctx.markupTool === \"erase\" &&\n enabledIds.has(\"erase\")\n ) {\n nodes.push(\n <span key=\"erase-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n Select PDF words to remove · click added text/markup to erase\n </span>,\n );\n }\n\n if (\n (ctx.markupTool === \"highlight\" && enabledIds.has(\"highlight\")) ||\n (ctx.markupTool === \"underline\" && enabledIds.has(\"underline\"))\n ) {\n const activeMarkupHex =\n ctx.markupTool === \"highlight\" ? ctx.highlightHex : ctx.underlineHex;\n const setActiveMarkupHex =\n ctx.markupTool === \"highlight\" ? ctx.setHighlightHex : ctx.setUnderlineHex;\n const activePresets =\n ctx.markupTool === \"highlight\" ? HIGHLIGHT_PRESETS : UNDERLINE_PRESETS;\n\n nodes.push(\n <div\n key=\"color-picker\"\n className=\"epochs-pdf-viewer__color-picker\"\n role=\"group\"\n aria-label={`${ctx.markupTool} color`}\n >\n {activePresets.map((preset) => (\n <button\n key={preset.id}\n type=\"button\"\n className={\n normalizeHex(activeMarkupHex) === normalizeHex(preset.hex)\n ? \"epochs-pdf-viewer__swatch epochs-pdf-viewer__swatch--active\"\n : \"epochs-pdf-viewer__swatch\"\n }\n style={{ background: preset.hex }}\n title={preset.label}\n aria-label={preset.label}\n aria-pressed={\n normalizeHex(activeMarkupHex) === normalizeHex(preset.hex)\n }\n onClick={() => setActiveMarkupHex(normalizeHex(preset.hex))}\n />\n ))}\n <label\n className=\"epochs-pdf-viewer__custom-color\"\n title=\"Custom color\"\n >\n <span\n className=\"epochs-pdf-viewer__custom-color-chip\"\n style={{ background: activeMarkupHex }}\n />\n <input\n type=\"color\"\n value={normalizeHex(activeMarkupHex)}\n onChange={(e) =>\n setActiveMarkupHex(normalizeHex(e.target.value))\n }\n aria-label=\"Custom color\"\n />\n </label>\n </div>,\n );\n }\n\n return nodes.length > 0 ? nodes : null;\n}\n","import {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from \"react\";\nimport { PageCanvas } from \"./PageCanvas\";\nimport { Thumbnail as ThumbnailStrip } from \"./Thumbnail\";\nimport {\n ensurePdfWorker,\n pdfjsLib,\n resolvePdfUrl,\n sourceToArrayBuffer,\n} from \"./load\";\nimport type { PdfDoc, PdfViewerProps, ToolbarLayout, ViewerStatus } from \"./types\";\nimport type { MarkupAnnotation, MarkupTool } from \"./markup\";\nimport {\n DEFAULT_HIGHLIGHT_HEX,\n DEFAULT_UNDERLINE_HEX,\n hexToMarkupColor,\n} from \"./markup\";\nimport {\n buildPdfFromJpegPages,\n renderAllPagesWithMarkup,\n triggerBlobDownload,\n} from \"./exportPages\";\nimport { SignaturePad } from \"./SignaturePad\";\nimport type { SignatureAnnotation, SignatureField } from \"./signature\";\nimport { createSignatureId, signatureDisplaySize } from \"./signature\";\nimport { pageSizeFromSurface, viewportRectToPage } from \"./coords\";\nimport type { TextAnnotation } from \"./text\";\nimport {\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE,\n} from \"./text\";\nimport {\n DEFAULT_TOOLBAR_LAYOUT,\n getToolbarToolId,\n isToolbarTool,\n type ToolbarToolComponent,\n type ToolbarToolId,\n} from \"./toolbarTools\";\nimport {\n isMarkupToolbarTool,\n renderMarkupExtras,\n renderToolbarTool,\n type ToolbarRenderContext,\n} from \"./ToolbarButtons\";\nimport \"./PdfViewer.css\";\n\nfunction resolveToolbarLayout(\n enableToolbar: boolean | ToolbarLayout | undefined,\n flags: {\n enableThumbnails?: boolean;\n enableNavigation: boolean;\n enableZoom: boolean;\n enableRotate: boolean;\n enableReload: boolean;\n enablePrint: boolean;\n enableOpen: boolean;\n enableDownload: boolean;\n enableHighlight: boolean;\n enableUnderline: boolean;\n enableSignature: boolean;\n enableText: boolean;\n enableErase: boolean;\n enableClear: boolean;\n },\n): { left: ToolbarToolId[]; right: ToolbarToolId[] } | null {\n if (!enableToolbar) return null;\n\n if (Array.isArray(enableToolbar)) {\n const toIds = (side: ToolbarToolComponent[] | undefined) =>\n (side ?? [])\n .filter(isToolbarTool)\n .map(getToolbarToolId);\n\n return {\n left: toIds(enableToolbar[0]),\n right: toIds(enableToolbar[1]),\n };\n }\n\n const showThumbnailsToggle = flags.enableThumbnails;\n const filterByFlag = (\n tools: readonly ToolbarToolComponent[],\n enabled: Partial<Record<ToolbarToolId, boolean>>,\n ) =>\n tools\n .map(getToolbarToolId)\n .filter((id) => enabled[id] !== false);\n\n const flagMap: Partial<Record<ToolbarToolId, boolean>> = {\n thumbnail: showThumbnailsToggle,\n navigation: flags.enableNavigation,\n zoom: flags.enableZoom,\n rotate: flags.enableRotate,\n reload: flags.enableReload,\n print: flags.enablePrint,\n open: flags.enableOpen,\n download: flags.enableDownload,\n highlight: flags.enableHighlight,\n underline: flags.enableUnderline,\n signature: flags.enableSignature,\n text: flags.enableText,\n erase: flags.enableErase,\n clear: flags.enableClear,\n };\n\n return {\n left: filterByFlag(DEFAULT_TOOLBAR_LAYOUT[0], flagMap),\n right: filterByFlag(DEFAULT_TOOLBAR_LAYOUT[1], flagMap),\n };\n}\n\nexport function PdfViewer({\n file,\n fileUrl,\n baseUrl = \"\",\n fetchOptions,\n height = \"80vh\",\n title = \"PDF document\",\n initialScale = 1,\n withThumbnails = false,\n thumbnailWidth = 140,\n maxThumbnails = 60,\n className,\n workerSrc,\n enableToolbar = false,\n enableThumbnails,\n enableNavigation = true,\n enableZoom = true,\n enableRotate = true,\n enableReload = true,\n enablePrint = true,\n enableOpen = true,\n enableDownload = true,\n enableMarkup = true,\n enableHighlight = true,\n enableUnderline = true,\n enableSignature = true,\n enableText = true,\n enableErase = true,\n enableClear = true,\n signatureFields = [],\n textFields = [],\n onSignatureComplete,\n onFieldValueComplete,\n openSignaturePad: externalOpenSignaturePad = false,\n onSignaturePadClose,\n onSubmit,\n submitLabel = \"Submit\",\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const lastBlobUrlRef = useRef<string | null>(null);\n const pageRefsRef = useRef(new Map<number, HTMLDivElement | null>());\n const isProgrammaticScrollRef = useRef(false);\n\n const binarySource = useMemo(() => {\n if (file && typeof file !== \"string\") return file;\n return null;\n }, [file]);\n\n const resolvedUrl = useMemo(() => {\n if (binarySource) return \"\";\n const asString =\n typeof file === \"string\" ? file : undefined;\n return resolvePdfUrl(asString, fileUrl, baseUrl);\n }, [binarySource, file, fileUrl, baseUrl]);\n\n const [status, setStatus] = useState<ViewerStatus>(\"idle\");\n const [pdfDoc, setPdfDoc] = useState<PdfDoc | null>(null);\n const [numPages, setNumPages] = useState(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [scale, setScale] = useState(initialScale);\n const [rotation, setRotation] = useState(0);\n const [displayUrl, setDisplayUrl] = useState<string | null>(null);\n const [showThumbnails, setShowThumbnails] = useState(false);\n const [isPrinting, setIsPrinting] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const [markupTool, setMarkupTool] = useState<MarkupTool>(\"none\");\n const [annotations, setAnnotations] = useState<MarkupAnnotation[]>([]);\n const [signatures, setSignatures] = useState<SignatureAnnotation[]>([]);\n const [texts, setTexts] = useState<TextAnnotation[]>([]);\n const [signaturePadOpen, setSignaturePadOpen] = useState(false);\n const [signaturePadFieldType, setSignaturePadFieldType] = useState<\n import(\"./signature\").SignatureFieldType | undefined\n >(undefined);\n const [pendingSignature, setPendingSignature] = useState<{\n imageDataUrl: string;\n width: number;\n height: number;\n } | null>(null);\n const [selectedSignatureId, setSelectedSignatureId] = useState<string | null>(\n null,\n );\n const [selectedSignatureFieldId, setSelectedSignatureFieldId] = useState<string | null>(\n null,\n );\n const [editingSignatureId, setEditingSignatureId] = useState<string | null>(null);\n const [selectedTextId, setSelectedTextId] = useState<string | null>(null);\n const [selectedTextFieldId, setSelectedTextFieldId] = useState<string | null>(null);\n const [editingTextId, setEditingTextId] = useState<string | null>(null);\n const [highlightHex, setHighlightHex] = useState(DEFAULT_HIGHLIGHT_HEX);\n const [underlineHex, setUnderlineHex] = useState(DEFAULT_UNDERLINE_HEX);\n const hasFixedSignatureFields = signatureFields.length > 0;\n const hasFixedTextFields = textFields.length > 0;\n const [fieldValues, setFieldValues] = useState<Record<string, string>>({});\n\n useEffect(() => {\n if (externalOpenSignaturePad) {\n setSignaturePadOpen(true);\n }\n }, [externalOpenSignaturePad]);\n\n const toolbarSides = useMemo(\n () =>\n resolveToolbarLayout(enableToolbar, {\n enableThumbnails,\n enableNavigation,\n enableZoom,\n enableRotate,\n enableReload,\n enablePrint,\n enableOpen,\n enableDownload,\n enableHighlight,\n enableUnderline,\n enableSignature,\n enableText,\n enableErase,\n enableClear,\n }),\n [\n enableToolbar,\n enableThumbnails,\n enableNavigation,\n enableZoom,\n enableRotate,\n enableReload,\n enablePrint,\n enableOpen,\n enableDownload,\n enableHighlight,\n enableUnderline,\n enableSignature,\n enableText,\n enableErase,\n enableClear,\n ],\n );\n\n const enabledToolIds = useMemo(() => {\n if (!toolbarSides) return new Set<ToolbarToolId>();\n return new Set([...toolbarSides.left, ...toolbarSides.right]);\n }, [toolbarSides]);\n\n useEffect(() => {\n const hasThumbTool = enabledToolIds.has(\"thumbnail\");\n if (!hasThumbTool) {\n setShowThumbnails(false);\n return;\n }\n\n const mq = window.matchMedia(\"(max-width: 720px)\");\n const apply = () => {\n // Mobile: hide thumbnails by default. Desktop: respect withThumbnails.\n setShowThumbnails(mq.matches ? false : withThumbnails);\n };\n apply();\n mq.addEventListener(\"change\", apply);\n return () => mq.removeEventListener(\"change\", apply);\n }, [enabledToolIds, withThumbnails]);\n\n const showHighlight =\n !hasFixedSignatureFields && enabledToolIds.has(\"highlight\");\n const showUnderline =\n !hasFixedSignatureFields && enabledToolIds.has(\"underline\");\n const showSignature = enabledToolIds.has(\"signature\");\n const showText = enabledToolIds.has(\"text\") || hasFixedTextFields;\n const showErase = !hasFixedSignatureFields && enabledToolIds.has(\"erase\");\n\n const revokeDisplayUrl = useCallback(() => {\n if (lastBlobUrlRef.current) {\n URL.revokeObjectURL(lastBlobUrlRef.current);\n lastBlobUrlRef.current = null;\n }\n }, []);\n\n const loadDocument = useCallback(async () => {\n if (!binarySource && !resolvedUrl) return;\n\n ensurePdfWorker(workerSrc);\n setStatus(\"loading\");\n setPdfDoc(null);\n setNumPages(0);\n setPageNumber(1);\n setAnnotations([]);\n setSignatures([]);\n setTexts([]);\n setPendingSignature(null);\n setSelectedSignatureId(null);\n setSelectedSignatureFieldId(null);\n setEditingSignatureId(null);\n setSelectedTextId(null);\n setSelectedTextFieldId(null);\n setEditingTextId(null);\n setMarkupTool(\"none\");\n\n try {\n const buffer = binarySource\n ? await sourceToArrayBuffer(binarySource, fetchOptions)\n : await sourceToArrayBuffer(resolvedUrl, fetchOptions);\n\n const blob = new Blob([buffer], { type: \"application/pdf\" });\n const blobUrl = URL.createObjectURL(blob);\n revokeDisplayUrl();\n lastBlobUrlRef.current = blobUrl;\n setDisplayUrl(blobUrl);\n\n const loadingTask = pdfjsLib.getDocument({\n data: buffer,\n cMapUrl: `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/cmaps/`,\n cMapPacked: true,\n standardFontDataUrl: `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/standard_fonts/`,\n });\n const doc = await loadingTask.promise;\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setStatus(\"ready\");\n } catch {\n setStatus(\"error\");\n }\n }, [\n binarySource,\n resolvedUrl,\n fetchOptions,\n revokeDisplayUrl,\n workerSrc,\n ]);\n\n useEffect(() => {\n if (!binarySource && !resolvedUrl) {\n setStatus(\"idle\");\n setPdfDoc(null);\n setNumPages(0);\n setDisplayUrl(null);\n revokeDisplayUrl();\n return;\n }\n\n void loadDocument();\n\n return () => {\n revokeDisplayUrl();\n };\n }, [binarySource, resolvedUrl, loadDocument, revokeDisplayUrl]);\n\n useEffect(() => {\n if (markupTool === \"highlight\" && !showHighlight) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"underline\" && !showUnderline) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"sign\" && !showSignature) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"text\" && !showText) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"erase\" && !showErase) {\n setMarkupTool(\"none\");\n }\n }, [showHighlight, showUnderline, showSignature, showText, showErase, markupTool]);\n\n const scrollToPage = useCallback(\n (targetPage: number) => {\n const clamped = Math.max(1, Math.min(numPages || 1, targetPage));\n const el = pageRefsRef.current.get(clamped);\n if (!el) {\n setPageNumber(clamped);\n return;\n }\n\n isProgrammaticScrollRef.current = true;\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n setPageNumber(clamped);\n window.setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n }, 500);\n },\n [numPages],\n );\n\n const scrollToSignatureField = useCallback(\n (field: SignatureField) => {\n const pageEl = pageRefsRef.current.get(field.pageNumber);\n if (pageEl) {\n isProgrammaticScrollRef.current = true;\n setPageNumber(field.pageNumber);\n }\n\n const focusField = () => {\n const fieldEl = containerRef.current?.querySelector(\n `[data-signature-field-id=\"${CSS.escape(field.id)}\"]`,\n ) as HTMLElement | null;\n\n if (fieldEl) {\n fieldEl.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n } else if (pageEl) {\n pageEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n\n window.setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n }, 500);\n };\n\n window.requestAnimationFrame(() => {\n window.setTimeout(focusField, 40);\n });\n },\n [],\n );\n\n useEffect(() => {\n if (status !== \"ready\" || !containerRef.current || !numPages) return;\n\n const container = containerRef.current;\n const observer = new IntersectionObserver(\n (entries) => {\n if (isProgrammaticScrollRef.current) return;\n\n let best: { page: number; ratio: number } | null = null;\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n const page = Number.parseInt(\n (e.target as HTMLElement).dataset.pageNumber || \"0\",\n 10,\n );\n if (!page) continue;\n if (!best || e.intersectionRatio > best.ratio) {\n best = { page, ratio: e.intersectionRatio };\n }\n }\n if (best) setPageNumber(best.page);\n },\n {\n root: container,\n threshold: [0.25, 0.5, 0.75],\n },\n );\n\n for (let p = 1; p <= numPages; p += 1) {\n const el = pageRefsRef.current.get(p);\n if (el) observer.observe(el);\n }\n\n return () => observer.disconnect();\n }, [status, numPages]);\n\n const canGoPrev = pageNumber > 1;\n const canGoNext = numPages ? pageNumber < numPages : false;\n\n const handlePrev = useCallback(() => {\n if (!canGoPrev) return;\n scrollToPage(pageNumber - 1);\n }, [canGoPrev, pageNumber, scrollToPage]);\n\n const handleNext = useCallback(() => {\n if (!canGoNext) return;\n scrollToPage(pageNumber + 1);\n }, [canGoNext, pageNumber, scrollToPage]);\n\n const handleRotate = useCallback(() => {\n setRotation((r) => (r + 90) % 360);\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((s) => Math.max(0.25, Math.round((s - 0.1) * 100) / 100));\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setScale((s) => Math.min(5, Math.round((s + 0.1) * 100) / 100));\n }, []);\n\n const handleFitWidth = useCallback(async () => {\n if (!pdfDoc || !containerRef.current) return;\n try {\n const page = await pdfDoc.getPage(pageNumber);\n const viewportAt1 = page.getViewport({ scale: 1, rotation });\n // Body already excludes the thumbnail rail; subtract page padding only.\n const isMobile = window.matchMedia(\"(max-width: 720px)\").matches;\n const pagePadding = isMobile ? 16 : 24;\n const containerWidth = Math.max(\n 0,\n containerRef.current.clientWidth - pagePadding,\n );\n const nextScale = containerWidth / viewportAt1.width;\n setScale(Math.max(0.25, Math.min(5, Math.round(nextScale * 100) / 100)));\n } catch {\n // ignore\n }\n }, [pdfDoc, pageNumber, rotation]);\n\n // On mobile, auto-fit so fixed-field coordinates/dimensions stay aligned.\n useEffect(() => {\n if (status !== \"ready\" || !pdfDoc) return;\n if (!window.matchMedia(\"(max-width: 720px)\").matches) return;\n\n let cancelled = false;\n const run = () => {\n if (!cancelled) void handleFitWidth();\n };\n run();\n\n const container = containerRef.current;\n const observer =\n typeof ResizeObserver !== \"undefined\" && container\n ? new ResizeObserver(() => run())\n : null;\n observer?.observe(container!);\n\n const mq = window.matchMedia(\"(max-width: 720px)\");\n const onMq = () => {\n if (mq.matches) run();\n };\n mq.addEventListener(\"change\", onMq);\n\n return () => {\n cancelled = true;\n observer?.disconnect();\n mq.removeEventListener(\"change\", onMq);\n };\n }, [status, pdfDoc, showThumbnails, rotation, handleFitWidth]);\n\n const handlePrint = useCallback(async () => {\n if (!pdfDoc || status !== \"ready\") return;\n\n setIsPrinting(true);\n try {\n // Render in the main document — pdf.js fonts break on iframe canvases.\n const pages = await renderAllPagesWithMarkup(pdfDoc, {\n scale: 1.5,\n rotation,\n annotations,\n signatures,\n texts,\n mimeType: \"image/png\",\n });\n\n const iframe = document.createElement(\"iframe\");\n iframe.style.position = \"fixed\";\n iframe.style.right = \"0\";\n iframe.style.bottom = \"0\";\n iframe.style.width = \"0\";\n iframe.style.height = \"0\";\n iframe.style.border = \"0\";\n iframe.setAttribute(\"aria-hidden\", \"true\");\n document.body.appendChild(iframe);\n\n const doc = iframe.contentWindow?.document;\n if (!doc) throw new Error(\"print iframe not available\");\n\n doc.open();\n doc.write(`<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <title>${title.replace(/</g, \"<\")}</title>\n <style>\n html, body { margin: 0; padding: 0; }\n img { width: 100%; display: block; }\n .page { page-break-after: always; }\n .page:last-child { page-break-after: auto; }\n @page { margin: 10mm; }\n </style>\n </head>\n <body></body>\n</html>`);\n doc.close();\n\n const body = doc.body;\n for (const page of pages) {\n const img = doc.createElement(\"img\");\n img.src = page.dataUrl;\n const wrapper = doc.createElement(\"div\");\n wrapper.className = \"page\";\n wrapper.appendChild(img);\n body.appendChild(wrapper);\n }\n\n // Wait for images to decode before printing\n await Promise.all(\n Array.from(body.querySelectorAll(\"img\")).map(\n (img) =>\n img.decode?.().catch(() => undefined) ?? Promise.resolve(),\n ),\n );\n\n setTimeout(() => {\n try {\n iframe.contentWindow?.focus();\n iframe.contentWindow?.print();\n } finally {\n setTimeout(() => {\n try {\n document.body.removeChild(iframe);\n } catch {\n // ignore\n }\n }, 1000);\n }\n }, 50);\n } catch {\n try {\n if (displayUrl) {\n window.open(displayUrl, \"_blank\", \"noopener,noreferrer\");\n } else if (resolvedUrl) {\n window.open(resolvedUrl, \"_blank\", \"noopener,noreferrer\");\n }\n } catch {\n // ignore\n }\n } finally {\n setIsPrinting(false);\n }\n }, [pdfDoc, status, rotation, title, displayUrl, resolvedUrl, annotations, signatures, texts]);\n\n const handleDownload = useCallback(async () => {\n if (!pdfDoc || status !== \"ready\") return;\n\n const filename = `${title.replace(/[^\\w.-]+/g, \"_\") || \"document\"}.pdf`;\n const hasLayers =\n annotations.length > 0 || signatures.length > 0 || texts.length > 0;\n\n // No markup → keep original PDF bytes\n if (!hasLayers && displayUrl) {\n triggerBlobDownload(\n await fetch(displayUrl).then((r) => r.blob()),\n filename,\n );\n return;\n }\n\n setIsDownloading(true);\n try {\n const pages = await renderAllPagesWithMarkup(pdfDoc, {\n scale: 2,\n rotation,\n annotations,\n signatures,\n texts,\n mimeType: \"image/jpeg\",\n quality: 0.92,\n });\n const pdfBytes = buildPdfFromJpegPages(pages);\n const copy = new Uint8Array(pdfBytes.byteLength);\n copy.set(pdfBytes);\n triggerBlobDownload(\n new Blob([copy], { type: \"application/pdf\" }),\n filename,\n );\n } catch {\n if (displayUrl) {\n triggerBlobDownload(\n await fetch(displayUrl).then((r) => r.blob()),\n filename,\n );\n }\n } finally {\n setIsDownloading(false);\n }\n }, [pdfDoc, status, rotation, title, displayUrl, annotations, signatures, texts]);\n\n const toggleMarkupTool = useCallback((tool: MarkupTool) => {\n setMarkupTool((current) => (current === tool ? \"none\" : tool));\n }, []);\n\n const activeMarkupHex =\n markupTool === \"highlight\"\n ? highlightHex\n : markupTool === \"underline\"\n ? underlineHex\n : null;\n\n const activeMarkupColor =\n markupTool === \"highlight\" || markupTool === \"underline\"\n ? hexToMarkupColor(activeMarkupHex!, markupTool)\n : undefined;\n\n const selectedSignature =\n selectedSignatureId != null\n ? signatures.find((sig) => sig.id === selectedSignatureId) ?? null\n : null;\n\n const handleAddAnnotation = useCallback((annotation: MarkupAnnotation) => {\n setAnnotations((prev) => [...prev, annotation]);\n }, []);\n\n const handleRemoveAnnotation = useCallback((id: string) => {\n setAnnotations((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n const handleClearAnnotations = useCallback(() => {\n setAnnotations([]);\n setSignatures([]);\n setTexts([]);\n setSelectedSignatureId(null);\n setSelectedTextId(null);\n setSelectedTextFieldId(null);\n setEditingTextId(null);\n }, []);\n\n const handleOpenSignaturePad = useCallback(\n (fieldType?: import(\"./signature\").SignatureFieldType) => {\n setSignaturePadFieldType(fieldType);\n setSignaturePadOpen(true);\n },\n [],\n );\n\n const handleFieldValueChange = useCallback((fieldId: string, value: string) => {\n setFieldValues((prev) => ({ ...prev, [fieldId]: value }));\n }, []);\n\n const handleFieldValueCommit = useCallback(\n (fieldId: string) => {\n const val = fieldValues[fieldId];\n if (val) onFieldValueComplete?.(fieldId, val);\n\n const currentIndex = signatureFields.findIndex((f) => f.id === fieldId);\n const filledIds = new Set(\n Object.keys(fieldValues).filter((k) => fieldValues[k]?.trim()),\n );\n filledIds.add(fieldId);\n const nextField =\n signatureFields.slice(currentIndex + 1).find(\n (f) => !filledIds.has(f.id) && !signatures.some((sig) => sig.fieldId === f.id),\n ) ??\n signatureFields.slice(0, Math.max(0, currentIndex)).find(\n (f) => !filledIds.has(f.id) && !signatures.some((sig) => sig.fieldId === f.id),\n );\n if (nextField) {\n setSelectedSignatureFieldId(nextField.id);\n scrollToSignatureField(nextField);\n const nextType = (nextField as any).type as string | undefined;\n if (nextType === \"sign\" || !nextType) {\n window.setTimeout(() => setSignaturePadOpen(true), 350);\n }\n }\n },\n [signatureFields, fieldValues, signatures, scrollToSignatureField],\n );\n\n const handleSignatureSave = useCallback(\n (imageDataUrl: string, sourceWidth: number, sourceHeight: number) => {\n const size = signatureDisplaySize(sourceWidth, sourceHeight);\n\n if (editingSignatureId) {\n setSignatures((prev) =>\n prev.map((sig) =>\n sig.id === editingSignatureId\n ? {\n ...sig,\n imageDataUrl,\n width: sig.fieldId ? sig.width : size.width,\n height: sig.fieldId ? sig.height : size.height,\n }\n : sig,\n ),\n );\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n return;\n }\n\n if (hasFixedSignatureFields) {\n const targetField =\n signatureFields.find(\n (field) =>\n field.id === selectedSignatureFieldId &&\n !signatures.some((sig) => sig.fieldId === field.id),\n ) ??\n signatureFields.find(\n (field) => !signatures.some((sig) => sig.fieldId === field.id),\n );\n\n if (!targetField) {\n setSignaturePadOpen(false);\n return;\n }\n\n const signature: SignatureAnnotation = {\n id: createSignatureId(),\n fieldId: targetField.id,\n pageNumber: targetField.pageNumber,\n x: targetField.x,\n y: targetField.y,\n width: targetField.width,\n height: targetField.height,\n imageDataUrl,\n };\n\n setSignatures((prev) => [\n ...prev.filter((sig) => sig.fieldId !== targetField.id),\n signature,\n ]);\n onSignatureComplete?.(targetField.id, signature);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n\n const signedFieldIds = new Set(\n signatures\n .filter((sig) => sig.fieldId && sig.fieldId !== targetField.id)\n .map((sig) => sig.fieldId as string),\n );\n signedFieldIds.add(targetField.id);\n\n const currentIndex = signatureFields.findIndex(\n (field) => field.id === targetField.id,\n );\n const nextField =\n signatureFields\n .slice(currentIndex + 1)\n .find((field) => !signedFieldIds.has(field.id)) ??\n signatureFields\n .slice(0, Math.max(0, currentIndex))\n .find((field) => !signedFieldIds.has(field.id));\n\n if (nextField) {\n setSelectedSignatureFieldId(nextField.id);\n setSelectedSignatureId(null);\n scrollToSignatureField(nextField);\n window.setTimeout(() => {\n setSignaturePadOpen(true);\n }, 350);\n } else {\n setSelectedSignatureId(signature.id);\n setSelectedSignatureFieldId(targetField.id);\n }\n return;\n }\n\n const currentPageEl = pageRefsRef.current.get(pageNumber);\n const surface = currentPageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n\n let x = 24;\n let y = 24;\n if (surface) {\n const pageSize = pageSizeFromSurface(surface, scale);\n const scrollContainer = surface.closest(\".epochs-pdf-viewer__body\") as HTMLElement | null;\n\n if (scrollContainer) {\n const visible = viewportRectToPage(\n scrollContainer.getBoundingClientRect(),\n surface,\n scale,\n );\n const visibleTop = Math.max(0, visible.top);\n const visibleBottom = Math.min(pageSize.height, visible.bottom);\n const visibleLeft = Math.max(0, visible.left);\n const visibleRight = Math.min(pageSize.width, visible.right);\n x = Math.max(0, (visibleLeft + visibleRight) / 2 - size.width / 2);\n y = Math.max(0, (visibleTop + visibleBottom) / 2 - size.height / 2);\n x = Math.min(x, Math.max(0, pageSize.width - size.width));\n y = Math.min(y, Math.max(0, pageSize.height - size.height));\n } else {\n x = Math.max(0, (pageSize.width - size.width) / 2);\n y = Math.max(0, (pageSize.height - size.height) / 2);\n }\n }\n\n const signature: SignatureAnnotation = {\n id: createSignatureId(),\n pageNumber,\n x,\n y,\n width: size.width,\n height: size.height,\n imageDataUrl,\n };\n\n setSignatures((prev) => [...prev, signature]);\n onSignatureComplete?.(undefined, signature);\n setSelectedSignatureId(signature.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n },\n [\n editingSignatureId,\n hasFixedSignatureFields,\n pageNumber,\n scale,\n scrollToSignatureField,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n onSignatureComplete,\n ],\n );\n\n const handleAddSignature = useCallback((signature: SignatureAnnotation) => {\n setSignatures((prev) => [...prev, signature]);\n setSelectedSignatureId(signature.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n }, []);\n\n const handleUpdateSignature = useCallback(\n (id: string, patch: Partial<SignatureAnnotation>) => {\n setSignatures((prev) =>\n prev.map((sig) => (sig.id === id ? { ...sig, ...patch } : sig)),\n );\n },\n [],\n );\n\n const handleRemoveSignature = useCallback((id: string) => {\n const removed = signatures.find((sig) => sig.id === id);\n setSignatures((prev) => prev.filter((sig) => sig.id !== id));\n setSelectedSignatureId((current) => (current === id ? null : current));\n if (removed?.fieldId) {\n setSelectedSignatureFieldId(removed.fieldId);\n }\n }, [signatures]);\n\n const handleDuplicateSignature = useCallback((id?: string) => {\n const target = id\n ? signatures.find((sig) => sig.id === id) ?? null\n : selectedSignature;\n if (!target) return;\n\n const pageEl = pageRefsRef.current.get(target.pageNumber);\n const surface = pageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n\n const offset = 18;\n let x = target.x + offset;\n let y = target.y + offset;\n\n if (surface) {\n const pageWidth = surface.clientWidth / scale;\n const pageHeight = surface.clientHeight / scale;\n x = Math.min(\n Math.max(0, x),\n Math.max(0, pageWidth - target.width),\n );\n y = Math.min(\n Math.max(0, y),\n Math.max(0, pageHeight - target.height),\n );\n }\n\n const duplicate: SignatureAnnotation = {\n ...target,\n id: createSignatureId(),\n x,\n y,\n };\n\n setSignatures((prev) => [...prev, duplicate]);\n setSelectedSignatureId(duplicate.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n }, [scale, selectedSignature, signatures]);\n\n const handleEditSignature = useCallback((id?: string) => {\n const targetId = id ?? selectedSignature?.id;\n if (!targetId) return;\n setSelectedSignatureId(targetId);\n setEditingSignatureId(targetId);\n setSignaturePadOpen(true);\n }, [selectedSignature]);\n\n const handleAddText = useCallback((text: TextAnnotation) => {\n setTexts((prev) => {\n if (text.fieldId) {\n return [...prev.filter((item) => item.fieldId !== text.fieldId), text];\n }\n return [...prev, text];\n });\n setSelectedTextId(text.id);\n if (text.fieldId) setSelectedTextFieldId(text.fieldId);\n }, []);\n\n const handleUpdateText = useCallback(\n (id: string, patch: Partial<TextAnnotation>) => {\n setTexts((prev) =>\n prev.map((text) => (text.id === id ? { ...text, ...patch } : text)),\n );\n },\n [],\n );\n\n const handleRemoveText = useCallback((id: string) => {\n const removed = texts.find((text) => text.id === id);\n setTexts((prev) => prev.filter((text) => text.id !== id));\n setSelectedTextId((current) => (current === id ? null : current));\n setEditingTextId((current) => (current === id ? null : current));\n if (removed?.fieldId) {\n setSelectedTextFieldId(removed.fieldId);\n }\n }, [texts]);\n\n // Sync fixed text field geometry if the prop changes\n useEffect(() => {\n if (!hasFixedTextFields) return;\n setTexts((prev) =>\n prev.map((text) => {\n if (!text.fieldId) return text;\n const field = textFields.find((item) => item.id === text.fieldId);\n if (!field) return text;\n return {\n ...text,\n pageNumber: field.pageNumber,\n x: field.x,\n y: field.y,\n width: field.width,\n height: field.height,\n fontSize: field.fontSize ?? text.fontSize ?? DEFAULT_TEXT_FONT_SIZE,\n color: field.color ?? text.color ?? DEFAULT_TEXT_COLOR,\n };\n }),\n );\n }, [hasFixedTextFields, textFields]);\n\n const goToSignatureField = useCallback(\n (direction: -1 | 1) => {\n if (!signatureFields.length) return;\n const from =\n selectedSignatureFieldId != null\n ? signatureFields.findIndex((f) => f.id === selectedSignatureFieldId)\n : -1;\n const nextIndex = Math.min(\n signatureFields.length - 1,\n Math.max(0, (from < 0 ? 0 : from) + direction),\n );\n const field = signatureFields[nextIndex];\n if (!field) return;\n setSelectedSignatureFieldId(field.id);\n setSelectedSignatureId(\n signatures.find((sig) => sig.fieldId === field.id)?.id ?? null,\n );\n scrollToSignatureField(field);\n },\n [\n scrollToSignatureField,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n ],\n );\n\n if (!binarySource && !resolvedUrl) {\n return (\n <div\n data-testid=\"pdf-viewer\"\n className={`epochs-pdf-viewer epochs-pdf-viewer--empty ${className ?? \"\"}`.trim()}\n >\n No PDF file provided.\n </div>\n );\n }\n\n const rootStyle: CSSProperties = {\n height,\n };\n\n const toolbarCtx: ToolbarRenderContext = {\n status,\n showThumbnails,\n setShowThumbnails,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n pageNumber,\n numPages,\n scrollToPage,\n scale,\n handleZoomOut,\n handleZoomIn,\n handleFitWidth,\n handleRotate,\n markupTool,\n toggleMarkupTool: (tool) => toggleMarkupTool(tool),\n hasFixedSignatureFields,\n hasFixedTextFields,\n pendingSignature,\n setMarkupTool,\n setSignaturePadOpen,\n annotationsLength: annotations.length,\n signaturesLength: signatures.length,\n textsLength: texts.length,\n handleClearAnnotations,\n highlightHex,\n underlineHex,\n setHighlightHex,\n setUnderlineHex,\n loadDocument,\n handlePrint,\n isPrinting,\n pdfDoc,\n displayUrl,\n resolvedUrl,\n handleDownload,\n isDownloading,\n };\n\n const visibleToolIds = (ids: ToolbarToolId[]) =>\n ids.filter((id) => {\n if (\n hasFixedSignatureFields &&\n (id === \"highlight\" || id === \"underline\" || id === \"erase\")\n ) {\n return false;\n }\n return true;\n });\n\n const currentFieldIndex = selectedSignatureFieldId\n ? signatureFields.findIndex((field) => field.id === selectedSignatureFieldId)\n : 0;\n\n const filledFieldCount = signatureFields.filter((field) => {\n const fieldType = field.type ?? \"sign\";\n if (fieldType === \"date\" || fieldType === \"text\") {\n return Boolean(fieldValues[field.id]?.trim());\n }\n return signatures.some((sig) => sig.fieldId === field.id);\n }).length;\n\n const fieldProgressPercent =\n signatureFields.length > 0\n ? Math.round((filledFieldCount / signatureFields.length) * 100)\n : 0;\n\n const renderSide = (ids: ToolbarToolId[], alignEnd = false) => {\n const visible = visibleToolIds(ids);\n if (visible.length === 0 && !alignEnd) {\n return <div className=\"epochs-pdf-viewer__toolbar-group\" />;\n }\n if (visible.length === 0) {\n return (\n <div className=\"epochs-pdf-viewer__toolbar-group epochs-pdf-viewer__toolbar-group--end\" />\n );\n }\n\n const nodes = visible.map((id, index) => {\n const prev = visible[index - 1];\n const showMarkupSep =\n isMarkupToolbarTool(id) && (!prev || !isMarkupToolbarTool(prev));\n return (\n <Fragment key={id}>\n {renderToolbarTool(id, toolbarCtx, { showMarkupSep })}\n </Fragment>\n );\n });\n\n return (\n <div\n className={\n alignEnd\n ? \"epochs-pdf-viewer__toolbar-group epochs-pdf-viewer__toolbar-group--end\"\n : \"epochs-pdf-viewer__toolbar-group\"\n }\n >\n {nodes}\n {renderMarkupExtras(toolbarCtx, new Set(visible))}\n </div>\n );\n };\n\n return (\n <div\n data-testid=\"pdf-viewer\"\n data-file-url={resolvedUrl || undefined}\n className={`epochs-pdf-viewer ${className ?? \"\"}`.trim()}\n style={rootStyle}\n >\n {toolbarSides ? (\n <div className=\"epochs-pdf-viewer__toolbar\">\n {renderSide(toolbarSides.left)}\n {renderSide(toolbarSides.right, true)}\n </div>\n ) : null}\n\n {(showSignature || externalOpenSignaturePad) ? (\n <SignaturePad\n open={signaturePadOpen}\n onClose={() => {\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n onSignaturePadClose?.();\n }}\n onSave={handleSignatureSave}\n fieldType={signaturePadFieldType}\n showFieldTypeTabs={!hasFixedSignatureFields}\n />\n ) : null}\n\n <div className=\"epochs-pdf-viewer__content\">\n {showThumbnails ? (\n <div\n className=\"epochs-pdf-viewer__thumbnails\"\n style={{ width: thumbnailWidth + 24 }}\n >\n {status === \"ready\" && pdfDoc ? (\n <>\n {Array.from({\n length: Math.min(numPages || 0, maxThumbnails),\n }).map((_, idx) => {\n const n = idx + 1;\n return (\n <div key={n} className=\"epochs-pdf-viewer__thumb-wrap\">\n <ThumbnailStrip\n pdfDoc={pdfDoc}\n pageNumber={n}\n isActive={n === pageNumber}\n rotation={rotation}\n onSelect={scrollToPage}\n width={thumbnailWidth}\n annotations={annotations}\n signatures={signatures}\n signatureFields={signatureFields}\n texts={texts}\n textFields={textFields}\n />\n </div>\n );\n })}\n {numPages > maxThumbnails ? (\n <div className=\"epochs-pdf-viewer__thumb-more\">\n Showing first {maxThumbnails} pages\n </div>\n ) : null}\n </>\n ) : (\n <div className=\"epochs-pdf-viewer__muted\">Thumbnails</div>\n )}\n </div>\n ) : null}\n\n <div ref={containerRef} className=\"epochs-pdf-viewer__body\">\n {status === \"loading\" ? (\n <div className=\"epochs-pdf-viewer__overlay epochs-pdf-viewer__muted\">\n Loading PDF…\n <span className=\"epochs-pdf-viewer__spinner\" />\n </div>\n ) : null}\n\n {status === \"error\" ? (\n <div className=\"epochs-pdf-viewer__overlay epochs-pdf-viewer__error\">\n Unable to load PDF.\n {resolvedUrl ? (\n <a\n className=\"epochs-pdf-viewer__open-link\"\n href={resolvedUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Open file\n </a>\n ) : null}\n </div>\n ) : null}\n\n {status === \"ready\" && pdfDoc ? (\n <div>\n {Array.from({ length: numPages }).map((_, idx) => {\n const p = idx + 1;\n return (\n <PageCanvas\n key={p}\n pdfDoc={pdfDoc}\n pageNumber={p}\n scale={scale}\n rotation={rotation}\n markupTool={enableMarkup ? markupTool : \"none\"}\n markupColor={activeMarkupColor}\n annotations={annotations}\n onAddAnnotation={handleAddAnnotation}\n onRemoveAnnotation={handleRemoveAnnotation}\n signatures={signatures}\n pendingSignature={pendingSignature}\n onAddSignature={handleAddSignature}\n onUpdateSignature={handleUpdateSignature}\n onRemoveSignature={handleRemoveSignature}\n onEditSignature={handleEditSignature}\n onDuplicateSignature={handleDuplicateSignature}\n selectedSignatureId={selectedSignatureId}\n onSelectSignature={setSelectedSignatureId}\n signatureFields={signatureFields}\n selectedSignatureFieldId={selectedSignatureFieldId}\n onSelectSignatureField={setSelectedSignatureFieldId}\n hasFixedSignatureFields={hasFixedSignatureFields}\n onOpenSignaturePad={handleOpenSignaturePad}\n fieldValues={fieldValues}\n onFieldValueChange={handleFieldValueChange}\n onFieldValueCommit={handleFieldValueCommit}\n texts={texts}\n onAddText={handleAddText}\n onUpdateText={handleUpdateText}\n onRemoveText={handleRemoveText}\n selectedTextId={selectedTextId}\n onSelectText={setSelectedTextId}\n textFields={textFields}\n selectedTextFieldId={selectedTextFieldId}\n onSelectTextField={setSelectedTextFieldId}\n hasFixedTextFields={hasFixedTextFields}\n editingTextId={editingTextId}\n onEditingTextIdChange={setEditingTextId}\n pageRef={(el) => {\n if (el) pageRefsRef.current.set(p, el);\n }}\n />\n );\n })}\n </div>\n ) : null}\n </div>\n </div>\n\n {hasFixedSignatureFields || onSubmit ? (\n <div className=\"epochs-pdf-viewer__footer\" role=\"navigation\" aria-label=\"Viewer actions\">\n {hasFixedSignatureFields ? (\n <>\n <div className=\"epochs-pdf-viewer__footer-nav\">\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n disabled={signatureFields.length <= 1 || currentFieldIndex <= 0}\n onClick={() => goToSignatureField(-1)}\n >\n Prev\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n disabled={\n signatureFields.length <= 1 ||\n currentFieldIndex >= signatureFields.length - 1\n }\n onClick={() => goToSignatureField(1)}\n >\n Next\n </button>\n </div>\n <div className=\"epochs-pdf-viewer__footer-center\">\n <span className=\"epochs-pdf-viewer__footer-label\">\n Field {Math.max(1, currentFieldIndex + 1)} of {signatureFields.length}\n </span>\n <div\n className=\"epochs-pdf-viewer__footer-progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={fieldProgressPercent}\n aria-label=\"Signature progress\"\n >\n <div\n className=\"epochs-pdf-viewer__footer-progress-bar\"\n style={{ width: `${fieldProgressPercent}%` }}\n />\n </div>\n <span className=\"epochs-pdf-viewer__footer-percent\">\n {fieldProgressPercent}%\n </span>\n </div>\n </>\n ) : (\n <div className=\"epochs-pdf-viewer__footer-center\" />\n )}\n {onSubmit ? (\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--primary\"\n onClick={onSubmit}\n >\n {submitLabel}\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport default PdfViewer;\n","import type {\n DocumentProps,\n ImageProps,\n LinkProps,\n PageProps,\n TextProps,\n ViewProps,\n} from \"./types\";\n\n/** Root document container. Must wrap one or more `<Page>` elements. */\nexport function Document(_props: DocumentProps): null {\n return null;\n}\nDocument.displayName = \"Document\";\n\n/** A single PDF page. */\nexport function Page(_props: PageProps): null {\n return null;\n}\nPage.displayName = \"Page\";\n\n/** Flexbox layout container. */\nexport function View(_props: ViewProps): null {\n return null;\n}\nView.displayName = \"View\";\n\n/** Text content. Children are flattened to a string. */\nexport function Text(_props: TextProps): null {\n return null;\n}\nText.displayName = \"Text\";\n\n/** Image placeholder (binary embedding planned). */\nexport function Image(_props: ImageProps): null {\n return null;\n}\nImage.displayName = \"Image\";\n\n/** Linked text. */\nexport function Link(_props: LinkProps): null {\n return null;\n}\nLink.displayName = \"Link\";\n","import { createElement, type ReactElement, type ReactNode } from \"react\";\nimport type { PdfNode, NodeType } from \"./types\";\n\nconst TYPE_MAP: Record<string, NodeType> = {\n Document: \"DOCUMENT\",\n Page: \"PAGE\",\n View: \"VIEW\",\n Text: \"TEXT\",\n Image: \"IMAGE\",\n Link: \"LINK\",\n};\n\nfunction getDisplayName(type: unknown): string | null {\n if (typeof type === \"string\") return type;\n if (typeof type === \"function\") {\n const fn = type as { displayName?: string; name?: string };\n return fn.displayName || fn.name || null;\n }\n return null;\n}\n\nfunction flattenChildren(children: ReactNode): ReactNode[] {\n const result: ReactNode[] = [];\n const visit = (node: ReactNode) => {\n if (node == null || typeof node === \"boolean\") return;\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n result.push(node);\n };\n visit(children);\n return result;\n}\n\nfunction collectText(children: ReactNode): string {\n return flattenChildren(children)\n .map((child) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n return String(child);\n }\n if (\n child &&\n typeof child === \"object\" &&\n \"props\" in (child as ReactElement)\n ) {\n const el = child as ReactElement<{ children?: ReactNode }>;\n return collectText(el.props.children);\n }\n return \"\";\n })\n .join(\"\");\n}\n\nexport function elementToPdfNode(element: ReactElement): PdfNode {\n const name = getDisplayName(element.type);\n const nodeType = name ? TYPE_MAP[name] : undefined;\n\n if (!nodeType) {\n throw new Error(\n `[epochs-pdf] Unsupported element \"${name ?? \"unknown\"}\". Use Document, Page, View, Text, Image, or Link.`,\n );\n }\n\n const props = { ...(element.props as Record<string, unknown>) };\n const childrenProp = props.children as ReactNode;\n delete props.children;\n\n if (nodeType === \"TEXT\" || nodeType === \"LINK\") {\n return {\n type: nodeType,\n props,\n children: [],\n text: collectText(childrenProp),\n };\n }\n\n const childNodes = flattenChildren(childrenProp)\n .filter(\n (child): child is ReactElement =>\n !!child && typeof child === \"object\" && \"type\" in (child as object),\n )\n .map(elementToPdfNode);\n\n return {\n type: nodeType,\n props,\n children: childNodes,\n };\n}\n\nexport function createPdfElement(\n type: NodeType,\n props: Record<string, unknown> = {},\n ...children: ReactNode[]\n): ReactElement {\n const name = Object.entries(TYPE_MAP).find(([, v]) => v === type)?.[0];\n if (!name) throw new Error(`Unknown node type: ${type}`);\n return createElement(name, props, ...children);\n}\n","import type { PageSize, Style } from \"./types\";\n\nexport const PAGE_SIZES: Record<Exclude<PageSize, [number, number]>, [number, number]> = {\n A4: [595.28, 841.89],\n LETTER: [612, 792],\n LEGAL: [612, 1008],\n};\n\nexport function resolvePageSize(\n size: PageSize = \"A4\",\n orientation: \"portrait\" | \"landscape\" = \"portrait\",\n): [number, number] {\n const [w, h] = Array.isArray(size) ? size : PAGE_SIZES[size];\n return orientation === \"landscape\" ? [h, w] : [w, h];\n}\n\nexport function expandPadding(style: Style = {}) {\n const base = style.padding ?? 0;\n return {\n top: style.paddingTop ?? base,\n right: style.paddingRight ?? base,\n bottom: style.paddingBottom ?? base,\n left: style.paddingLeft ?? base,\n };\n}\n\nexport function expandMargin(style: Style = {}) {\n const base = style.margin ?? 0;\n return {\n top: style.marginTop ?? base,\n right: style.marginRight ?? base,\n bottom: style.marginBottom ?? base,\n left: style.marginLeft ?? base,\n };\n}\n\n/** Parse #RRGGBB / #RGB / rgb() into 0–1 RGB components. */\nexport function parseColor(input?: string): [number, number, number] | null {\n if (!input) return null;\n\n const hex = input.trim();\n if (hex.startsWith(\"#\")) {\n const raw = hex.slice(1);\n if (raw.length === 3) {\n const r = parseInt(raw[0] + raw[0], 16) / 255;\n const g = parseInt(raw[1] + raw[1], 16) / 255;\n const b = parseInt(raw[2] + raw[2], 16) / 255;\n return [r, g, b];\n }\n if (raw.length === 6) {\n const r = parseInt(raw.slice(0, 2), 16) / 255;\n const g = parseInt(raw.slice(2, 4), 16) / 255;\n const b = parseInt(raw.slice(4, 6), 16) / 255;\n return [r, g, b];\n }\n }\n\n const rgb = input.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i,\n );\n if (rgb) {\n return [\n Math.min(1, Number(rgb[1]) / 255),\n Math.min(1, Number(rgb[2]) / 255),\n Math.min(1, Number(rgb[3]) / 255),\n ];\n }\n\n return null;\n}\n\nexport function resolveLength(\n value: number | string | undefined,\n parent: number,\n fallback = 0,\n): number {\n if (value == null) return fallback;\n if (typeof value === \"number\") return value;\n if (value.endsWith(\"%\")) {\n const pct = Number.parseFloat(value);\n return Number.isFinite(pct) ? (pct / 100) * parent : fallback;\n }\n const n = Number.parseFloat(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function isBold(weight?: Style[\"fontWeight\"]): boolean {\n if (weight === \"bold\") return true;\n if (typeof weight === \"number\") return weight >= 600;\n return false;\n}\n","import type { LayoutBox, PdfNode, ResolvedDocument, ResolvedPage, Style } from \"./types\";\nimport {\n expandMargin,\n expandPadding,\n isBold,\n resolveLength,\n resolvePageSize,\n} from \"./utils\";\n\nconst DEFAULT_FONT_SIZE = 12;\nconst DEFAULT_LINE_HEIGHT = 1.4;\nconst AVG_CHAR_WIDTH = 0.5;\n\nfunction measureText(text: string, style: Style, maxWidth: number): { width: number; height: number; lines: string[] } {\n const fontSize = style.fontSize ?? DEFAULT_FONT_SIZE;\n const lineHeight = (style.lineHeight ?? DEFAULT_LINE_HEIGHT) * fontSize;\n const charWidth = fontSize * (isBold(style.fontWeight) ? 0.55 : AVG_CHAR_WIDTH);\n\n if (!text) {\n return { width: 0, height: lineHeight, lines: [\"\"] };\n }\n\n const words = text.split(/\\s+/);\n const lines: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n const candidate = current ? `${current} ${word}` : word;\n if (candidate.length * charWidth <= maxWidth || !current) {\n current = candidate;\n } else {\n lines.push(current);\n current = word;\n }\n }\n if (current) lines.push(current);\n\n const widest = Math.max(...lines.map((l) => l.length * charWidth), 0);\n return {\n width: Math.min(widest, maxWidth),\n height: lines.length * lineHeight,\n lines,\n };\n}\n\nfunction layoutNode(\n node: PdfNode,\n x: number,\n y: number,\n availableWidth: number,\n availableHeight: number,\n): LayoutBox {\n const style = (node.props.style as Style | undefined) ?? {};\n const margin = expandMargin(style);\n const padding = expandPadding(style);\n\n const outerX = x + margin.left;\n const outerY = y + margin.top;\n const contentWidth = Math.max(\n 0,\n resolveLength(style.width, availableWidth, availableWidth) - margin.left - margin.right,\n );\n const innerWidth = Math.max(0, contentWidth - padding.left - padding.right);\n\n if (node.type === \"TEXT\" || node.type === \"LINK\") {\n const measured = measureText(node.text ?? \"\", style, innerWidth);\n const height =\n resolveLength(style.height, availableHeight, measured.height + padding.top + padding.bottom);\n return {\n x: outerX,\n y: outerY,\n width: contentWidth,\n height,\n node,\n children: [],\n style,\n text: node.text,\n };\n }\n\n if (node.type === \"IMAGE\") {\n const width = resolveLength(style.width, availableWidth, Math.min(200, availableWidth));\n const height = resolveLength(style.height, availableHeight, 120);\n return {\n x: outerX,\n y: outerY,\n width: width - margin.left - margin.right,\n height,\n node,\n children: [],\n style,\n };\n }\n\n const direction = style.flexDirection ?? \"column\";\n const gap = style.gap ?? 0;\n const childBoxes: LayoutBox[] = [];\n\n let cursorX = outerX + padding.left;\n let cursorY = outerY + padding.top;\n let usedMain = 0;\n let crossSize = 0;\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const remainingW =\n direction === \"row\"\n ? Math.max(0, innerWidth - usedMain - (i > 0 ? gap : 0))\n : innerWidth;\n const remainingH =\n direction === \"column\"\n ? Math.max(0, availableHeight - (cursorY - y) - margin.bottom)\n : availableHeight;\n\n const box = layoutNode(child, cursorX, cursorY, remainingW, remainingH);\n childBoxes.push(box);\n\n if (direction === \"row\") {\n usedMain += box.width + expandMargin((child.props.style as Style) ?? {}).left\n + expandMargin((child.props.style as Style) ?? {}).right;\n if (i < node.children.length - 1) usedMain += gap;\n cursorX = outerX + padding.left + usedMain;\n crossSize = Math.max(crossSize, box.height);\n } else {\n usedMain += box.height + expandMargin((child.props.style as Style) ?? {}).top\n + expandMargin((child.props.style as Style) ?? {}).bottom;\n if (i < node.children.length - 1) usedMain += gap;\n cursorY = outerY + padding.top + usedMain;\n crossSize = Math.max(crossSize, box.width);\n }\n }\n\n const contentHeight =\n resolveLength(\n style.height,\n availableHeight,\n direction === \"column\"\n ? usedMain + padding.top + padding.bottom\n : crossSize + padding.top + padding.bottom,\n );\n\n const finalWidth =\n direction === \"row\"\n ? resolveLength(style.width, availableWidth, usedMain + padding.left + padding.right)\n : contentWidth;\n\n const justify = style.justifyContent ?? \"flex-start\";\n const align = style.alignItems ?? \"stretch\";\n\n const innerMain =\n direction === \"column\"\n ? contentHeight - padding.top - padding.bottom\n : finalWidth - padding.left - padding.right;\n const childrenMain = usedMain;\n const freeSpace = Math.max(0, innerMain - childrenMain);\n\n let mainOffset = 0;\n let betweenGap = gap;\n if (justify === \"center\") mainOffset = freeSpace / 2;\n if (justify === \"flex-end\") mainOffset = freeSpace;\n if (justify === \"space-between\" && childBoxes.length > 1) {\n betweenGap = gap + freeSpace / (childBoxes.length - 1);\n }\n if (justify === \"space-around\" && childBoxes.length > 0) {\n betweenGap = gap + freeSpace / childBoxes.length;\n mainOffset = betweenGap / 2;\n }\n\n let running = 0;\n for (const box of childBoxes) {\n if (direction === \"column\") {\n box.y = outerY + padding.top + mainOffset + running;\n if (align === \"center\") {\n box.x = outerX + padding.left + Math.max(0, (innerWidth - box.width) / 2);\n } else if (align === \"flex-end\") {\n box.x = outerX + padding.left + Math.max(0, innerWidth - box.width);\n } else if (align === \"stretch\" && box.style.width == null) {\n box.width = innerWidth;\n }\n running += box.height + betweenGap;\n } else {\n box.x = outerX + padding.left + mainOffset + running;\n if (align === \"center\") {\n box.y =\n outerY +\n padding.top +\n Math.max(0, (contentHeight - padding.top - padding.bottom - box.height) / 2);\n } else if (align === \"flex-end\") {\n box.y =\n outerY +\n padding.top +\n Math.max(0, contentHeight - padding.top - padding.bottom - box.height);\n } else if (align === \"stretch\" && box.style.height == null) {\n box.height = contentHeight - padding.top - padding.bottom;\n }\n running += box.width + betweenGap;\n }\n }\n\n return {\n x: outerX,\n y: outerY,\n width: finalWidth,\n height: contentHeight,\n node,\n children: childBoxes,\n style,\n };\n}\n\nexport function layoutDocument(root: PdfNode): ResolvedDocument {\n if (root.type !== \"DOCUMENT\") {\n throw new Error(\"[epochs-pdf] Root element must be <Document>.\");\n }\n\n const pages: ResolvedPage[] = [];\n\n for (const pageNode of root.children) {\n if (pageNode.type !== \"PAGE\") {\n throw new Error(\"[epochs-pdf] Direct children of <Document> must be <Page>.\");\n }\n\n const size = pageNode.props.size as Parameters<typeof resolvePageSize>[0];\n const orientation = (pageNode.props.orientation as \"portrait\" | \"landscape\") ?? \"portrait\";\n const [width, height] = resolvePageSize(size, orientation);\n const style = (pageNode.props.style as Style | undefined) ?? {};\n const padding = expandPadding(style);\n\n const contentRoot: PdfNode = {\n type: \"VIEW\",\n props: {\n style: {\n ...style,\n width,\n height,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n },\n },\n children: pageNode.children,\n };\n\n const box = layoutNode(contentRoot, 0, 0, width, height);\n\n pages.push({\n width,\n height,\n boxes: box.children,\n style,\n });\n }\n\n return {\n meta: {\n title: String(root.props.title ?? \"Untitled\"),\n author: String(root.props.author ?? \"\"),\n subject: String(root.props.subject ?? \"\"),\n creator: String(root.props.creator ?? \"epochs-pdf\"),\n },\n pages,\n };\n}\n\nexport { measureText };\n","import type { LayoutBox, ResolvedDocument, Style } from \"./types\";\nimport { isBold, parseColor } from \"./utils\";\nimport { measureText } from \"./layout\";\n\nfunction escapePdfString(value: string): string {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\(/g, \"\\\\(\")\n .replace(/\\)/g, \"\\\\)\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\n/g, \"\\\\n\");\n}\n\nclass PdfWriter {\n private objects: (string | null)[] = [null];\n private offsets: number[] = [0];\n\n addObject(content: string): number {\n this.objects.push(content);\n return this.objects.length - 1;\n }\n\n build(doc: ResolvedDocument): Uint8Array {\n const infoId = this.addObject(\n `<< /Title (${escapePdfString(doc.meta.title)}) /Author (${escapePdfString(doc.meta.author)}) /Subject (${escapePdfString(doc.meta.subject)}) /Creator (${escapePdfString(doc.meta.creator)}) /Producer (epochs-pdf) >>`,\n );\n\n const fontRegular = this.addObject(\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\",\n );\n const fontBold = this.addObject(\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold >>\",\n );\n\n const pageIds: number[] = [];\n\n for (const page of doc.pages) {\n const contentStream = this.renderPageContent(\n page.boxes,\n page.width,\n page.height,\n page.style,\n );\n const contentId = this.addObject(\n `<< /Length ${contentStream.length} >>\\nstream\\n${contentStream}\\nendstream`,\n );\n\n const pageId = this.addObject(\"\"); // placeholder\n pageIds.push(pageId);\n\n this.objects[pageId] =\n `<< /Type /Page /Parent 0 0 R /MediaBox [0 0 ${page.width.toFixed(2)} ${page.height.toFixed(2)}] /Contents ${contentId} 0 R /Resources << /Font << /F1 ${fontRegular} 0 R /F2 ${fontBold} 0 R >> >> >>`;\n }\n\n const kids = pageIds.map((id) => `${id} 0 R`).join(\" \");\n const pagesId = this.addObject(\n `<< /Type /Pages /Kids [${kids}] /Count ${pageIds.length} >>`,\n );\n\n for (const pageId of pageIds) {\n this.objects[pageId] = (this.objects[pageId] as string).replace(\n \"/Parent 0 0 R\",\n `/Parent ${pagesId} 0 R`,\n );\n }\n\n const catalogId = this.addObject(\n `<< /Type /Catalog /Pages ${pagesId} 0 R >>`,\n );\n\n // Serialize\n let body = \"%PDF-1.4\\n\";\n this.offsets = [0];\n\n for (let i = 1; i < this.objects.length; i++) {\n this.offsets[i] = body.length;\n body += `${i} 0 obj\\n${this.objects[i]}\\nendobj\\n`;\n }\n\n const xrefOffset = body.length;\n body += `xref\\n0 ${this.objects.length}\\n`;\n body += \"0000000000 65535 f \\n\";\n for (let i = 1; i < this.objects.length; i++) {\n body += `${String(this.offsets[i]).padStart(10, \"0\")} 00000 n \\n`;\n }\n body += `trailer\\n<< /Size ${this.objects.length} /Root ${catalogId} 0 R /Info ${infoId} 0 R >>\\n`;\n body += `startxref\\n${xrefOffset}\\n%%EOF`;\n\n return new TextEncoder().encode(body);\n }\n\n private renderPageContent(\n boxes: LayoutBox[],\n pageWidth: number,\n pageHeight: number,\n pageStyle: Style,\n ): string {\n const ops: string[] = [];\n\n const pageBg = parseColor(pageStyle.backgroundColor);\n if (pageBg) {\n ops.push(`q`);\n ops.push(\n `${pageBg[0].toFixed(3)} ${pageBg[1].toFixed(3)} ${pageBg[2].toFixed(3)} rg`,\n );\n ops.push(\n `0 0 ${pageWidth.toFixed(2)} ${pageHeight.toFixed(2)} re f`,\n );\n ops.push(`Q`);\n }\n\n const drawBox = (box: LayoutBox) => {\n const { x, y, width, height, style, node, text } = box;\n const pdfY = pageHeight - y - height;\n\n const fill = parseColor(style.backgroundColor);\n if (fill) {\n ops.push(`q`);\n ops.push(`${fill[0].toFixed(3)} ${fill[1].toFixed(3)} ${fill[2].toFixed(3)} rg`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re f`);\n ops.push(`Q`);\n }\n\n if (style.borderWidth && style.borderWidth > 0) {\n const border = parseColor(style.borderColor) ?? [0, 0, 0];\n ops.push(`q`);\n ops.push(`${style.borderWidth} w`);\n ops.push(`${border[0].toFixed(3)} ${border[1].toFixed(3)} ${border[2].toFixed(3)} RG`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re S`);\n ops.push(`Q`);\n }\n\n if ((node.type === \"TEXT\" || node.type === \"LINK\") && text != null) {\n const fontSize = style.fontSize ?? 12;\n const color = parseColor(style.color) ?? [0, 0, 0];\n const font = isBold(style.fontWeight) ? \"F2\" : \"F1\";\n const paddingLeft = style.paddingLeft ?? style.padding ?? 0;\n const paddingTop = style.paddingTop ?? style.padding ?? 0;\n const maxWidth = Math.max(0, width - paddingLeft - (style.paddingRight ?? style.padding ?? 0));\n const measured = measureText(text, style, maxWidth || width);\n const lineHeight = (style.lineHeight ?? 1.4) * fontSize;\n\n ops.push(`q`);\n ops.push(`BT`);\n ops.push(`/${font} ${fontSize} Tf`);\n ops.push(`${color[0].toFixed(3)} ${color[1].toFixed(3)} ${color[2].toFixed(3)} rg`);\n\n measured.lines.forEach((line, index) => {\n let textX = x + paddingLeft;\n const lineWidth = line.length * fontSize * (isBold(style.fontWeight) ? 0.55 : 0.5);\n if (style.textAlign === \"center\") {\n textX = x + (width - lineWidth) / 2;\n } else if (style.textAlign === \"right\") {\n textX = x + width - lineWidth - (style.paddingRight ?? style.padding ?? 0);\n }\n const textY = pageHeight - y - paddingTop - fontSize - index * lineHeight;\n ops.push(`1 0 0 1 ${textX.toFixed(2)} ${textY.toFixed(2)} Tm`);\n ops.push(`(${escapePdfString(line)}) Tj`);\n });\n\n ops.push(`ET`);\n ops.push(`Q`);\n }\n\n if (node.type === \"IMAGE\") {\n // Placeholder rectangle for images (no external deps / binary embedding yet)\n ops.push(`q`);\n ops.push(`0.85 0.85 0.85 rg`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re f`);\n ops.push(`0.6 0.6 0.6 RG 1 w`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re S`);\n ops.push(\n `BT /F1 10 Tf 0.4 0.4 0.4 rg 1 0 0 1 ${(x + 8).toFixed(2)} ${(pdfY + height / 2 - 4).toFixed(2)} Tm (Image) Tj ET`,\n );\n ops.push(`Q`);\n }\n\n for (const child of box.children) {\n drawBox(child);\n }\n };\n\n for (const box of boxes) {\n drawBox(box);\n }\n\n return ops.join(\"\\n\");\n }\n}\n\nexport function serializePdf(doc: ResolvedDocument): Uint8Array {\n return new PdfWriter().build(doc);\n}\n","import type { ReactElement } from \"react\";\nimport { elementToPdfNode } from \"./reconciler\";\nimport { layoutDocument } from \"./layout\";\nimport { serializePdf } from \"./pdf-writer\";\n\nfunction renderToBytes(element: ReactElement): Uint8Array {\n const tree = elementToPdfNode(element);\n const laidOut = layoutDocument(tree);\n return serializePdf(laidOut);\n}\n\n/** Render a `<Document>` tree to a `Uint8Array` PDF. */\nexport function pdf(element: ReactElement): Uint8Array {\n return renderToBytes(element);\n}\n\n/** Render to a Blob (browser). */\nexport function toBlob(element: ReactElement): Blob {\n const bytes = renderToBytes(element);\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return new Blob([copy], { type: \"application/pdf\" });\n}\n\n/** Render to an object URL for iframes / previews. */\nexport function toUrl(element: ReactElement): string {\n return URL.createObjectURL(toBlob(element));\n}\n\n/** Trigger a browser download of the generated PDF. */\nexport function download(\n element: ReactElement,\n filename = \"document.pdf\",\n): void {\n const url = toUrl(element);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\n/** Async-friendly API mirroring common PDF libraries. */\nexport async function renderToBuffer(element: ReactElement): Promise<Uint8Array> {\n return renderToBytes(element);\n}\n\nexport async function renderToBlob(element: ReactElement): Promise<Blob> {\n return toBlob(element);\n}\n"],"names":["REDACT_COLOR","HIGHLIGHT_PRESETS","UNDERLINE_PRESETS","DEFAULT_HIGHLIGHT_HEX","DEFAULT_UNDERLINE_HEX","hexToMarkupColor","createMarkupId","normalizeHex","color","value","r","g","b","hex","kind","alpha","normalized","match","int","selectionRectsForPage","pageSurface","scale","selection","range","pageBox","clientRects","safeScale","layoutW","layoutH","selectionStartPoint","rects","first","a","expandRedactRects","padding","rect","drawMarkupOnCanvas","ctx","annotations","ann","x","y","w","h","thickness","createSignatureId","drawSignaturesOnCanvas","signatures","sig","img","loadImage","drawSignatureFieldsOnCanvas","fields","signedFieldIds","field","isFilled","src","resolve","reject","signatureDisplaySize","sourceWidth","sourceHeight","maxWidth","maxHeight","ratio","clientPointToPage","clientX","clientY","surface","box","pageSizeFromSurface","clientDeltaToPage","deltaX","deltaY","viewportRectToPage","viewport","surfaceRect","pageW","pageH","DEFAULT_TEXT_FONT_SIZE","DEFAULT_TEXT_COLOR","MIN_TEXT_WIDTH","MIN_TEXT_HEIGHT","createTextId","measureInlineText","fontSize","lines","lineHeight","line","resolveInlineTextPoint","textLayer","surfaceBox","toPageX","client","toPageY","toPageSize","clientSize","axis","boxSize","layout","gap","findGapBetweenSpans","doc","_a","inferFontSizeFromNode","caretX","nearest","findNearestSpanOnLine","spans","boxes","span","i","left","right","gapStart","gapEnd","best","midX","dist","node","element","inferFontSizeFromElement","height","computed","parsed","findTextFieldAtPoint","pageNumber","selectWordAtPoint","text","offset","isWordChar","ch","start","end","wordRange","drawTextsOnCanvas","texts","cursorY","drawTextFieldsOnCanvas","filledFieldIds","Icon","size","className","children","jsx","ChevronLeftIcon","props","ChevronRightIcon","DownloadIcon","jsxs","ExternalLinkIcon","GridIcon","MinusIcon","PlusIcon","PrinterIcon","RefreshIcon","RotateIcon","HighlightIcon","UnderlineIcon","EraserIcon","SignatureIcon","PencilIcon","TextIcon","PageCanvas","pdfDoc","rotation","pageRef","onRendered","markupTool","markupColor","onAddAnnotation","onRemoveAnnotation","pendingSignature","onAddSignature","onUpdateSignature","onRemoveSignature","onEditSignature","onDuplicateSignature","selectedSignatureId","onSelectSignature","signatureFields","selectedSignatureFieldId","onSelectSignatureField","hasFixedSignatureFields","onOpenSignaturePad","fieldValues","onFieldValueChange","onFieldValueCommit","pendingFieldValue","onPlaceFieldValue","onAddText","onUpdateText","onRemoveText","selectedTextId","onSelectText","textFields","_selectedTextFieldId","onSelectTextField","hasFixedTextFields","editingTextId","onEditingTextIdChange","wrapRef","useRef","canvasRef","textLayerRef","surfaceRef","renderTaskRef","textLayerInstanceRef","dragState","setDragState","useState","inlineEditRef","justOpenedEditorRef","useEffect","cancelled","canvas","textLayerDiv","page","width","task","textContent","TextLayer","applySelectionMarkup","captured","replaceSelectedPdfText","initialValue","created","handleMouseUp","handleKeyDown","event","target","hasPdfSelection","rafId","lastClientX","lastClientY","scrollDir","getScrollContainer","updateResizeAtPoint","s","pageSize","dx","dy","maxW","maxH","newW","newH","updateSignatureAtPoint","pageEl","targetPage","point","nextX","nextY","maxX","maxY","tickScroll","container","maxScroll","edge","distTop","distBottom","speed","prev","handleMove","handleUp","el","current","t","setRefs","pageAnnotations","pageSignatures","pageSignatureFields","f","pageTexts","commitInlineText","trimmed","beginInlineTextAt","fieldId","existing","handleInlineTextClick","handleSurfaceClick","renderInlineText","e","idx","filled","fType","ev","Fragment","Thumbnail","isActive","onSelect","viewportAt1","pageTextFields","ABSOLUTE_URL_PATTERN","workerConfigured","setPdfWorkerSrc","workerSrc","pdfjsLib","ensurePdfWorker","resolvePdfUrl","file","fileUrl","baseUrl","source","path","urlToPdfArrayBuffer","url","fetchOptions","res","sourceToArrayBuffer","copy","renderPageWithMarkup","options","mimeType","quality","baseViewport","pageMarks","pageSigs","dataUrl","jpegBytes","dataUrlToBytes","renderAllPagesWithMarkup","pages","base64","binary","bytes","enc","concat","parts","total","sum","p","out","part","buildPdfFromJpegPages","objects","add","pageIds","imageStream","imageId","content","contentId","pageId","kids","id","pagesId","catalogId","chunks","offsets","objHeader","objFooter","xrefStart","xref","triggerBlobDownload","blob","filename","anchor","HANDWRITING_FONTS","HANDWRITING_FONTS_HREF","handwritingFontsPromise","ensureHandwritingFonts","link","loadFaces","font","SignaturePad","open","onClose","onSave","fieldType","showFieldTypeTabs","textPlaceholder","drawingRef","lastPointRef","pathsRef","currentPathRef","resolvedFieldType","activeFieldType","setActiveFieldType","dateValue","setDateValue","textValue","setTextValue","mode","setMode","typedName","setTypedName","typedInitials","setTypedInitials","initialsTouched","setInitialsTouched","typeKind","setTypeKind","inkColor","setInkColor","fontId","setFontId","fontsReady","setFontsReady","selectedFont","previewText","fontPreviewLabel","getPoint","handlePointerDown","pt","handlePointerMove","last","handlePointerUp","clearPad","handleNameChange","deriveInitials","trimAndSave","allPaths","minX","minY","pad","pathData","svg","dpr","measureCtx","metrics","canvasW","canvasH","outCanvas","outCtx","handleFieldValueSave","showSignPad","name","TOOLBAR_TOOL_ID","createToolbarTool","displayName","Tool","getToolbarToolId","tool","isToolbarTool","Navigation","Zoom","Rotate","Reload","Print","Open","Download","Highlight","Underline","Signature","AddText","Erase","Clear","ALL_TOOLBAR_TOOLS","DEFAULT_TOOLBAR_LAYOUT","MARKUP_TOOLS","isMarkupToolbarTool","renderToolbarTool","nodes","v","next","renderMarkupExtras","enabledIds","activeMarkupHex","setActiveMarkupHex","activePresets","preset","resolveToolbarLayout","enableToolbar","flags","toIds","side","showThumbnailsToggle","filterByFlag","tools","enabled","flagMap","PdfViewer","title","initialScale","withThumbnails","thumbnailWidth","maxThumbnails","enableThumbnails","enableNavigation","enableZoom","enableRotate","enableReload","enablePrint","enableOpen","enableDownload","enableMarkup","enableHighlight","enableUnderline","enableSignature","enableText","enableErase","enableClear","onSignatureComplete","onFieldValueComplete","externalOpenSignaturePad","onSignaturePadClose","onSubmit","submitLabel","containerRef","lastBlobUrlRef","pageRefsRef","isProgrammaticScrollRef","binarySource","useMemo","resolvedUrl","status","setStatus","setPdfDoc","numPages","setNumPages","setPageNumber","setScale","setRotation","displayUrl","setDisplayUrl","showThumbnails","setShowThumbnails","isPrinting","setIsPrinting","isDownloading","setIsDownloading","setMarkupTool","setAnnotations","setSignatures","setTexts","signaturePadOpen","setSignaturePadOpen","signaturePadFieldType","setSignaturePadFieldType","setPendingSignature","setSelectedSignatureId","setSelectedSignatureFieldId","editingSignatureId","setEditingSignatureId","setSelectedTextId","selectedTextFieldId","setSelectedTextFieldId","setEditingTextId","highlightHex","setHighlightHex","underlineHex","setUnderlineHex","setFieldValues","toolbarSides","enabledToolIds","mq","apply","showHighlight","showUnderline","showSignature","showText","showErase","revokeDisplayUrl","useCallback","loadDocument","buffer","blobUrl","scrollToPage","clamped","scrollToSignatureField","focusField","fieldEl","observer","entries","canGoPrev","canGoNext","handlePrev","handleNext","handleRotate","handleZoomOut","handleZoomIn","handleFitWidth","pagePadding","nextScale","run","onMq","handlePrint","iframe","body","wrapper","_b","handleDownload","pdfBytes","toggleMarkupTool","activeMarkupColor","selectedSignature","handleAddAnnotation","annotation","handleRemoveAnnotation","handleClearAnnotations","handleOpenSignaturePad","handleFieldValueChange","handleFieldValueCommit","val","currentIndex","filledIds","k","nextField","nextType","handleSignatureSave","imageDataUrl","targetField","signature","currentPageEl","scrollContainer","visible","visibleTop","visibleBottom","visibleLeft","visibleRight","handleAddSignature","handleUpdateSignature","patch","handleRemoveSignature","removed","handleDuplicateSignature","pageWidth","pageHeight","duplicate","handleEditSignature","targetId","handleAddText","item","handleUpdateText","handleRemoveText","goToSignatureField","direction","from","nextIndex","rootStyle","toolbarCtx","visibleToolIds","ids","currentFieldIndex","filledFieldCount","fieldProgressPercent","renderSide","alignEnd","index","showMarkupSep","_","n","ThumbnailStrip","Document","_props","Page","View","Text","Image","Link","TYPE_MAP","getDisplayName","type","fn","flattenChildren","result","visit","collectText","child","elementToPdfNode","nodeType","childrenProp","childNodes","PAGE_SIZES","resolvePageSize","orientation","expandPadding","style","base","expandMargin","parseColor","input","raw","rgb","resolveLength","parent","fallback","pct","isBold","weight","DEFAULT_FONT_SIZE","DEFAULT_LINE_HEIGHT","AVG_CHAR_WIDTH","measureText","charWidth","words","word","candidate","widest","l","layoutNode","availableWidth","availableHeight","margin","outerX","outerY","contentWidth","innerWidth","measured","childBoxes","cursorX","usedMain","crossSize","remainingW","remainingH","contentHeight","finalWidth","justify","align","innerMain","freeSpace","mainOffset","betweenGap","running","layoutDocument","root","pageNode","contentRoot","escapePdfString","PdfWriter","__publicField","infoId","fontRegular","fontBold","contentStream","xrefOffset","pageStyle","ops","pageBg","drawBox","pdfY","fill","border","paddingLeft","paddingTop","textX","lineWidth","textY","serializePdf","renderToBytes","tree","laidOut","pdf","toBlob","toUrl","download","renderToBuffer","renderToBlob"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"epochs-pdf.js","sources":["../src/viewer/markup.ts","../src/viewer/signature.ts","../src/viewer/coords.ts","../src/viewer/text.ts","../src/viewer/icons.tsx","../src/viewer/PageCanvas.tsx","../src/viewer/Thumbnail.tsx","../src/viewer/load.ts","../src/viewer/exportPages.ts","../src/viewer/SignaturePad.tsx","../src/viewer/toolbarTools.ts","../src/viewer/ToolbarButtons.tsx","../src/viewer/PdfViewer.tsx","../src/components.tsx","../src/reconciler.ts","../src/utils.ts","../src/layout.ts","../src/pdf-writer.ts","../src/render.ts"],"sourcesContent":["export type MarkupKind = \"highlight\" | \"underline\" | \"redact\";\n\nexport type MarkupTool = \"none\" | MarkupKind | \"erase\" | \"sign\" | \"text\";\n\n/** Opaque cover used when removing existing PDF text. */\nexport const REDACT_COLOR = \"#ffffff\";\n\nexport interface MarkupRect {\n /** Left edge in page CSS pixels at scale = 1. */\n x: number;\n /** Top edge in page CSS pixels at scale = 1. */\n y: number;\n w: number;\n h: number;\n}\n\nexport interface MarkupAnnotation {\n id: string;\n pageNumber: number;\n kind: MarkupKind;\n color: string;\n rects: MarkupRect[];\n text?: string;\n}\n\nexport interface MarkupColorOption {\n id: string;\n label: string;\n /** Solid hex used by the swatch / color input. */\n hex: string;\n}\n\nexport const HIGHLIGHT_PRESETS: MarkupColorOption[] = [\n { id: \"yellow\", label: \"Yellow\", hex: \"#facc15\" },\n { id: \"green\", label: \"Green\", hex: \"#4ade80\" },\n { id: \"pink\", label: \"Pink\", hex: \"#f472b6\" },\n { id: \"blue\", label: \"Blue\", hex: \"#60a5fa\" },\n { id: \"orange\", label: \"Orange\", hex: \"#fb923c\" },\n { id: \"purple\", label: \"Purple\", hex: \"#c084fc\" },\n];\n\nexport const UNDERLINE_PRESETS: MarkupColorOption[] = [\n { id: \"blue\", label: \"Blue\", hex: \"#2563eb\" },\n { id: \"red\", label: \"Red\", hex: \"#dc2626\" },\n { id: \"green\", label: \"Green\", hex: \"#16a34a\" },\n { id: \"orange\", label: \"Orange\", hex: \"#ea580c\" },\n { id: \"purple\", label: \"Purple\", hex: \"#7c3aed\" },\n { id: \"black\", label: \"Black\", hex: \"#111827\" },\n];\n\nexport const DEFAULT_HIGHLIGHT_HEX = HIGHLIGHT_PRESETS[0].hex;\nexport const DEFAULT_UNDERLINE_HEX = UNDERLINE_PRESETS[0].hex;\n\n/** Legacy defaults kept for callers. */\nexport const HIGHLIGHT_COLOR = hexToMarkupColor(DEFAULT_HIGHLIGHT_HEX, \"highlight\");\nexport const UNDERLINE_COLOR = DEFAULT_UNDERLINE_HEX;\n\nexport function createMarkupId(): string {\n return `m_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function normalizeHex(color: string): string {\n const value = color.trim();\n if (/^#[0-9a-fA-F]{6}$/.test(value)) return value.toLowerCase();\n if (/^#[0-9a-fA-F]{3}$/.test(value)) {\n const r = value[1];\n const g = value[2];\n const b = value[3];\n return `#${r}${r}${g}${g}${b}${b}`.toLowerCase();\n }\n return value;\n}\n\n/** Convert a solid hex into the CSS color used for drawing markup. */\nexport function hexToMarkupColor(hex: string, kind: MarkupKind, alpha = 0.45): string {\n const normalized = normalizeHex(hex);\n if (kind === \"underline\" || kind === \"redact\") return normalized;\n\n const match = /^#([0-9a-f]{6})$/i.exec(normalized);\n if (!match) return `rgba(250, 204, 21, ${alpha})`;\n\n const int = Number.parseInt(match[1], 16);\n const r = (int >> 16) & 255;\n const g = (int >> 8) & 255;\n const b = int & 255;\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n\n/** Best-effort extract of a #rrggbb value from a stored markup color. */\nexport function markupColorToHex(color: string, fallback: string): string {\n const normalized = normalizeHex(color);\n if (/^#[0-9a-f]{6}$/i.test(normalized)) return normalized.toLowerCase();\n\n const rgba = color.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i,\n );\n if (!rgba) return normalizeHex(fallback);\n\n const toHex = (n: string) =>\n Math.max(0, Math.min(255, Math.round(Number(n))))\n .toString(16)\n .padStart(2, \"0\");\n\n return `#${toHex(rgba[1])}${toHex(rgba[2])}${toHex(rgba[3])}`;\n}\n\n/** Collect selection client rects relative to a page surface, normalized to scale=1. */\nexport function selectionRectsForPage(\n pageSurface: HTMLElement,\n scale: number,\n): { rects: MarkupRect[]; text: string } | null {\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed || selection.rangeCount === 0) {\n return null;\n }\n\n const range = selection.getRangeAt(0);\n if (!pageSurface.contains(range.commonAncestorContainer)) {\n return null;\n }\n\n const pageBox = pageSurface.getBoundingClientRect();\n const clientRects = Array.from(range.getClientRects()).filter(\n (r) => r.width > 0 && r.height > 0,\n );\n\n if (!clientRects.length) return null;\n\n const safeScale = scale || 1;\n const layoutW = pageSurface.clientWidth || pageBox.width;\n const layoutH = pageSurface.clientHeight || pageBox.height;\n const rects: MarkupRect[] = clientRects.map((r) => ({\n x: pageBox.width > 0 ? ((r.left - pageBox.left) / pageBox.width) * (layoutW / safeScale) : 0,\n y: pageBox.height > 0 ? ((r.top - pageBox.top) / pageBox.height) * (layoutH / safeScale) : 0,\n w: pageBox.width > 0 ? (r.width / pageBox.width) * (layoutW / safeScale) : 0,\n h: pageBox.height > 0 ? (r.height / pageBox.height) * (layoutH / safeScale) : 0,\n }));\n\n return { rects, text: selection.toString() };\n}\n\n/** Pick the top-left anchor for replacement text from selection rects. */\nexport function selectionStartPoint(\n rects: MarkupRect[],\n): { x: number; y: number; fontSize: number } {\n const sorted = [...rects].sort((a, b) => a.y - b.y || a.x - b.x);\n const first = sorted[0] ?? { x: 0, y: 0, w: 0, h: 14 };\n return {\n x: first.x,\n y: first.y,\n fontSize: Math.max(8, Math.round(first.h * 0.9) || 14),\n };\n}\n\n/** Slightly expand rects so redaction fully covers glyph ink. */\nexport function expandRedactRects(\n rects: MarkupRect[],\n padding = 2,\n): MarkupRect[] {\n return rects.map((rect) => ({\n x: Math.max(0, rect.x - padding),\n y: Math.max(0, rect.y - padding),\n w: rect.w + padding * 2,\n h: rect.h + padding * 2,\n }));\n}\n\n/** Draw highlight / underline annotations onto a canvas (rects are stored at scale = 1). */\nexport function drawMarkupOnCanvas(\n ctx: CanvasRenderingContext2D,\n annotations: MarkupAnnotation[],\n scale: number,\n): void {\n for (const ann of annotations) {\n for (const rect of ann.rects) {\n const x = rect.x * scale;\n const y = rect.y * scale;\n const w = rect.w * scale;\n const h = rect.h * scale;\n\n if (ann.kind === \"highlight\") {\n ctx.save();\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillStyle = ann.color;\n ctx.fillRect(x, y, w, h);\n ctx.restore();\n } else if (ann.kind === \"redact\") {\n ctx.fillStyle = ann.color || REDACT_COLOR;\n ctx.fillRect(x, y, w, h);\n } else {\n const thickness = Math.max(2, scale * 1.5);\n ctx.fillStyle = ann.color;\n ctx.fillRect(x, y + h - thickness, w, thickness);\n }\n }\n }\n}\n\n","export interface SignatureAnnotation {\n id: string;\n pageNumber: number;\n fieldId?: string;\n /** Top-left X in page CSS pixels at scale = 1. */\n x: number;\n /** Top-left Y in page CSS pixels at scale = 1. */\n y: number;\n /** Width at scale = 1. */\n width: number;\n /** Height at scale = 1. */\n height: number;\n /** PNG data URL of the signature ink. */\n imageDataUrl: string;\n}\n\nexport type SignatureFieldType = \"sign\" | \"date\" | \"text\";\n\nexport interface SignatureField {\n id: string;\n pageNumber: number;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Field behavior: \"sign\" (default), \"date\" (date picker), or \"text\" (text input). */\n type?: SignatureFieldType;\n /** Placeholder text for \"text\" type fields. */\n placeholder?: string;\n}\n\nexport function createSignatureId(): string {\n return `s_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport async function drawSignaturesOnCanvas(\n ctx: CanvasRenderingContext2D,\n signatures: SignatureAnnotation[],\n scale: number,\n): Promise<void> {\n for (const sig of signatures) {\n const img = await loadImage(sig.imageDataUrl);\n ctx.drawImage(\n img,\n sig.x * scale,\n sig.y * scale,\n sig.width * scale,\n sig.height * scale,\n );\n }\n}\n\nexport function drawSignatureFieldsOnCanvas(\n ctx: CanvasRenderingContext2D,\n fields: SignatureField[],\n signedFieldIds: Set<string>,\n scale: number,\n): void {\n ctx.save();\n for (const field of fields) {\n const isFilled = signedFieldIds.has(field.id);\n const x = field.x * scale;\n const y = field.y * scale;\n const w = field.width * scale;\n const h = field.height * scale;\n\n ctx.fillStyle = isFilled\n ? \"rgba(29, 78, 216, 0.08)\"\n : \"rgba(29, 78, 216, 0.18)\";\n ctx.strokeStyle = isFilled\n ? \"rgba(29, 78, 216, 0.45)\"\n : \"#1d4ed8\";\n ctx.lineWidth = 1.5;\n ctx.setLineDash(isFilled ? [] : [4, 3]);\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n }\n ctx.restore();\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(\"Failed to load signature image\"));\n img.src = src;\n });\n}\n\n/** Fit a drawn signature canvas into a target box while keeping aspect ratio. */\nexport function signatureDisplaySize(\n sourceWidth: number,\n sourceHeight: number,\n maxWidth = 180,\n maxHeight = 64,\n): { width: number; height: number } {\n if (sourceWidth <= 0 || sourceHeight <= 0) {\n return { width: maxWidth, height: maxHeight };\n }\n const ratio = Math.min(maxWidth / sourceWidth, maxHeight / sourceHeight);\n return {\n width: Math.max(40, sourceWidth * ratio),\n height: Math.max(20, sourceHeight * ratio),\n };\n}\n","/**\n * Browser zoom changes getBoundingClientRect() but not clientWidth/clientHeight.\n * Convert viewport client coordinates into page CSS pixels at scale = 1.\n */\nexport function clientPointToPage(\n clientX: number,\n clientY: number,\n surface: HTMLElement,\n scale: number,\n): { x: number; y: number } {\n const box = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || box.width;\n const layoutH = surface.clientHeight || box.height;\n if (box.width <= 0 || box.height <= 0 || scale <= 0) {\n return { x: 0, y: 0 };\n }\n return {\n x: ((clientX - box.left) / box.width) * (layoutW / scale),\n y: ((clientY - box.top) / box.height) * (layoutH / scale),\n };\n}\n\n/** Page size in CSS pixels at scale = 1. */\nexport function pageSizeFromSurface(\n surface: HTMLElement,\n scale: number,\n): { width: number; height: number } {\n return {\n width: surface.clientWidth / scale,\n height: surface.clientHeight / scale,\n };\n}\n\n/**\n * Convert a viewport delta (e.g. drag/resize) into page CSS pixels at scale = 1,\n * compensating for browser zoom.\n */\nexport function clientDeltaToPage(\n deltaX: number,\n deltaY: number,\n surface: HTMLElement,\n scale: number,\n): { dx: number; dy: number } {\n const box = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || box.width;\n const layoutH = surface.clientHeight || box.height;\n if (box.width <= 0 || box.height <= 0 || scale <= 0) {\n return { dx: 0, dy: 0 };\n }\n return {\n dx: (deltaX / box.width) * (layoutW / scale),\n dy: (deltaY / box.height) * (layoutH / scale),\n };\n}\n\n/** Map a viewport Y (or rect edge) relative to surface into page coords at scale = 1. */\nexport function viewportRectToPage(\n viewport: DOMRect,\n surface: HTMLElement,\n scale: number,\n): { left: number; top: number; right: number; bottom: number } {\n const surfaceRect = surface.getBoundingClientRect();\n const { width: pageW, height: pageH } = pageSizeFromSurface(surface, scale);\n if (surfaceRect.width <= 0 || surfaceRect.height <= 0) {\n return { left: 0, top: 0, right: pageW, bottom: pageH };\n }\n return {\n left: ((viewport.left - surfaceRect.left) / surfaceRect.width) * pageW,\n top: ((viewport.top - surfaceRect.top) / surfaceRect.height) * pageH,\n right: ((viewport.right - surfaceRect.left) / surfaceRect.width) * pageW,\n bottom: ((viewport.bottom - surfaceRect.top) / surfaceRect.height) * pageH,\n };\n}\n","export interface TextField {\n id: string;\n pageNumber: number;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Shown when the field is empty. */\n placeholder?: string;\n /** Font size at scale = 1. Default 14. */\n fontSize?: number;\n /** CSS color. Default #111827. */\n color?: string;\n}\n\nexport interface TextAnnotation {\n id: string;\n pageNumber: number;\n fieldId?: string;\n /** Left edge in page CSS pixels at scale = 1. */\n x: number;\n /** Top edge in page CSS pixels at scale = 1. */\n y: number;\n /** Width at scale = 1. */\n width: number;\n /** Height at scale = 1. */\n height: number;\n value: string;\n fontSize: number;\n color: string;\n}\n\nexport const DEFAULT_TEXT_FONT_SIZE = 14;\nexport const DEFAULT_TEXT_COLOR = \"#111827\";\nexport const MIN_TEXT_WIDTH = 24;\nexport const MIN_TEXT_HEIGHT = 20;\n\nexport function createTextId(): string {\n return `t_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\nexport function measureInlineText(\n value: string,\n fontSize: number,\n): { width: number; height: number } {\n if (typeof document === \"undefined\") {\n return {\n width: Math.max(MIN_TEXT_WIDTH, value.length * fontSize * 0.55),\n height: Math.max(MIN_TEXT_HEIGHT, fontSize * 1.25),\n };\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return {\n width: Math.max(MIN_TEXT_WIDTH, value.length * fontSize * 0.55),\n height: Math.max(MIN_TEXT_HEIGHT, fontSize * 1.25),\n };\n }\n\n ctx.font = `${fontSize}px sans-serif`;\n const lines = value.split(\"\\n\");\n const lineHeight = fontSize * 1.25;\n let maxWidth = MIN_TEXT_WIDTH;\n\n for (const line of lines) {\n maxWidth = Math.max(maxWidth, ctx.measureText(line || \" \").width + 4);\n }\n\n return {\n width: maxWidth,\n height: Math.max(MIN_TEXT_HEIGHT, lines.length * lineHeight),\n };\n}\n\n/** Resolve where inline text should start from a click on/near PDF text. */\nexport function resolveInlineTextPoint(\n clientX: number,\n clientY: number,\n surface: HTMLElement,\n textLayer: HTMLElement,\n scale: number,\n): { x: number; y: number; fontSize: number } {\n const surfaceBox = surface.getBoundingClientRect();\n const layoutW = surface.clientWidth || surfaceBox.width;\n const layoutH = surface.clientHeight || surfaceBox.height;\n const toPageX = (client: number) =>\n surfaceBox.width > 0\n ? ((client - surfaceBox.left) / surfaceBox.width) * (layoutW / scale)\n : 0;\n const toPageY = (client: number) =>\n surfaceBox.height > 0\n ? ((client - surfaceBox.top) / surfaceBox.height) * (layoutH / scale)\n : 0;\n const toPageSize = (clientSize: number, axis: \"x\" | \"y\") => {\n const boxSize = axis === \"x\" ? surfaceBox.width : surfaceBox.height;\n const layout = axis === \"x\" ? layoutW : layoutH;\n return boxSize > 0 ? (clientSize / boxSize) * (layout / scale) : 0;\n };\n\n // Default: exact click position (works for gaps between words)\n let x = toPageX(clientX);\n let y = toPageY(clientY);\n let fontSize = DEFAULT_TEXT_FONT_SIZE;\n\n // Prefer a gap between two spans on the same line (e.g. between \"this\" and \"PDF\")\n const gap = findGapBetweenSpans(clientX, clientY, textLayer);\n if (gap) {\n return {\n x: toPageX(gap.x),\n y: toPageY(gap.y),\n fontSize: Math.max(8, Math.round(toPageSize(gap.fontSize, \"y\") * 10) / 10),\n };\n }\n\n const doc = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n\n const range = doc.caretRangeFromPoint?.(clientX, clientY);\n if (range && textLayer.contains(range.startContainer)) {\n const rects = range.getClientRects();\n const rect = rects.length > 0 ? rects[0] : range.getBoundingClientRect();\n if (rect.height > 0) {\n // Keep the clicked X (insert point), snap Y/size to the line\n y = toPageY(rect.top);\n fontSize = inferFontSizeFromNode(range.startContainer, scale, surface);\n // If caret snapped to a glyph edge, use that X for cleaner alignment\n const caretX = toPageX(rect.left);\n if (Math.abs(caretX - x) < toPageSize(8, \"x\")) {\n x = caretX;\n }\n return { x, y, fontSize };\n }\n }\n\n const nearest = findNearestSpanOnLine(clientX, clientY, textLayer);\n if (nearest) {\n y = toPageY(nearest.top);\n fontSize = Math.max(8, Math.round(toPageSize(nearest.height, \"y\") * 10) / 10);\n }\n\n return { x, y, fontSize };\n}\n\n/** Find a click that lands in the horizontal gap between two word spans. */\nfunction findGapBetweenSpans(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement,\n): { x: number; y: number; fontSize: number } | null {\n const spans = Array.from(\n textLayer.querySelectorAll(\"span\"),\n ) as HTMLElement[];\n if (spans.length < 2) return null;\n\n type SpanBox = { left: number; right: number; top: number; bottom: number; height: number };\n const boxes: SpanBox[] = [];\n\n for (const span of spans) {\n if (!span.textContent?.trim()) continue;\n const box = span.getBoundingClientRect();\n if (box.width <= 0 || box.height <= 0) continue;\n // Same visual line as the click\n if (clientY < box.top - 4 || clientY > box.bottom + 4) continue;\n boxes.push({\n left: box.left,\n right: box.right,\n top: box.top,\n bottom: box.bottom,\n height: box.height,\n });\n }\n\n boxes.sort((a, b) => a.left - b.left);\n\n for (let i = 0; i < boxes.length - 1; i += 1) {\n const left = boxes[i];\n const right = boxes[i + 1];\n const gapStart = left.right;\n const gapEnd = right.left;\n if (gapEnd - gapStart < 1) continue;\n if (clientX >= gapStart - 2 && clientX <= gapEnd + 2) {\n return {\n x: clientX,\n y: Math.min(left.top, right.top),\n fontSize: Math.min(left.height, right.height),\n };\n }\n }\n\n return null;\n}\n\nfunction findNearestSpanOnLine(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement,\n): { top: number; height: number } | null {\n const spans = Array.from(\n textLayer.querySelectorAll(\"span\"),\n ) as HTMLElement[];\n\n let best: { top: number; height: number; dist: number } | null = null;\n\n for (const span of spans) {\n if (!span.textContent?.trim()) continue;\n const box = span.getBoundingClientRect();\n if (box.width <= 0 || box.height <= 0) continue;\n if (clientY < box.top - 6 || clientY > box.bottom + 6) continue;\n\n const midX = (box.left + box.right) / 2;\n const dist = Math.abs(clientX - midX);\n if (!best || dist < best.dist) {\n best = { top: box.top, height: box.height, dist };\n }\n }\n\n return best ? { top: best.top, height: best.height } : null;\n}\n\nfunction inferFontSizeFromNode(\n node: Node,\n scale: number,\n surface?: HTMLElement,\n): number {\n const element =\n node.nodeType === Node.ELEMENT_NODE\n ? (node as HTMLElement)\n : node.parentElement;\n if (element) return inferFontSizeFromElement(element, scale, surface);\n return DEFAULT_TEXT_FONT_SIZE;\n}\n\nfunction inferFontSizeFromElement(\n element: HTMLElement,\n scale: number,\n surface?: HTMLElement,\n): number {\n const height = element.getBoundingClientRect().height;\n if (height > 0) {\n if (surface) {\n const surfaceBox = surface.getBoundingClientRect();\n const layoutH = surface.clientHeight || surfaceBox.height;\n if (surfaceBox.height > 0) {\n return Math.max(\n 8,\n Math.round(((height / surfaceBox.height) * (layoutH / scale)) * 10) / 10,\n );\n }\n }\n return Math.max(8, Math.round((height / scale) * 10) / 10);\n }\n\n const computed = window.getComputedStyle(element).fontSize;\n const parsed = Number.parseFloat(computed);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.max(8, Math.round((parsed / scale) * 10) / 10);\n }\n\n return DEFAULT_TEXT_FONT_SIZE;\n}\n\nexport function findTextFieldAtPoint(\n x: number,\n y: number,\n fields: TextField[],\n pageNumber: number,\n): TextField | null {\n for (const field of fields) {\n if (field.pageNumber !== pageNumber) continue;\n if (\n x >= field.x &&\n x <= field.x + field.width &&\n y >= field.y &&\n y <= field.y + field.height\n ) {\n return field;\n }\n }\n return null;\n}\n\n/** Select the word under a point in the PDF text layer (browser selection). */\nexport function selectWordAtPoint(\n clientX: number,\n clientY: number,\n textLayer: HTMLElement | null,\n): string | null {\n if (!textLayer) return null;\n\n const doc = document as Document & {\n caretRangeFromPoint?: (x: number, y: number) => Range | null;\n };\n const range = doc.caretRangeFromPoint?.(clientX, clientY);\n if (!range || !textLayer.contains(range.startContainer)) return null;\n\n const node = range.startContainer;\n if (node.nodeType !== Node.TEXT_NODE || !node.textContent) return null;\n\n const text = node.textContent;\n let offset = range.startOffset;\n offset = Math.min(Math.max(0, offset), text.length);\n\n const isWordChar = (ch: string) => /[\\p{L}\\p{N}_'-]/u.test(ch);\n let start = offset;\n let end = offset;\n\n while (start > 0 && isWordChar(text[start - 1]!)) start -= 1;\n while (end < text.length && isWordChar(text[end]!)) end += 1;\n\n if (start === end) return null;\n\n const wordRange = document.createRange();\n wordRange.setStart(node, start);\n wordRange.setEnd(node, end);\n\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(wordRange);\n\n return text.slice(start, end);\n}\n\nexport function drawTextsOnCanvas(\n ctx: CanvasRenderingContext2D,\n texts: TextAnnotation[],\n scale: number,\n): void {\n ctx.save();\n for (const text of texts) {\n if (!text.value.trim()) continue;\n\n const x = text.x * scale;\n const y = text.y * scale;\n const fontSize = Math.max(8, text.fontSize * scale);\n\n ctx.fillStyle = text.color;\n ctx.font = `${fontSize}px sans-serif`;\n ctx.textBaseline = \"top\";\n\n const lineHeight = fontSize * 1.25;\n const lines = text.value.split(\"\\n\");\n let cursorY = y;\n\n for (const line of lines) {\n ctx.fillText(line, x, cursorY);\n cursorY += lineHeight;\n }\n }\n ctx.restore();\n}\n\nexport function drawTextFieldsOnCanvas(\n ctx: CanvasRenderingContext2D,\n fields: TextField[],\n filledFieldIds: Set<string>,\n scale: number,\n): void {\n ctx.save();\n for (const field of fields) {\n const isFilled = filledFieldIds.has(field.id);\n const x = field.x * scale;\n const y = field.y * scale;\n const w = field.width * scale;\n const h = field.height * scale;\n\n ctx.fillStyle = isFilled\n ? \"rgba(5, 150, 105, 0.08)\"\n : \"rgba(5, 150, 105, 0.16)\";\n ctx.strokeStyle = isFilled\n ? \"rgba(5, 150, 105, 0.45)\"\n : \"#059669\";\n ctx.lineWidth = 1.5;\n ctx.setLineDash(isFilled ? [] : [4, 3]);\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n }\n ctx.restore();\n}\n","import type { ReactNode } from \"react\";\n\ntype IconProps = {\n size?: number;\n className?: string;\n};\n\nfunction Icon({\n size = 14,\n className,\n children,\n}: IconProps & { children: ReactNode }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\nexport function ChevronLeftIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"15 18 9 12 15 6\" />\n </Icon>\n );\n}\n\nexport function ChevronRightIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"9 18 15 12 9 6\" />\n </Icon>\n );\n}\n\nexport function DownloadIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </Icon>\n );\n}\n\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </Icon>\n );\n}\n\nexport function GridIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" />\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" />\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" />\n </Icon>\n );\n}\n\nexport function MinusIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </Icon>\n );\n}\n\nexport function PlusIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </Icon>\n );\n}\n\nexport function PrinterIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"6 9 6 2 18 2 18 9\" />\n <path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\" />\n <rect x=\"6\" y=\"14\" width=\"12\" height=\"8\" />\n </Icon>\n );\n}\n\nexport function RefreshIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"23 4 23 10 17 10\" />\n <polyline points=\"1 20 1 14 7 14\" />\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\" />\n </Icon>\n );\n}\n\nexport function RotateIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" />\n </Icon>\n );\n}\n\nexport function HighlightIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </Icon>\n );\n}\n\nexport function UnderlineIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M6 3v7a6 6 0 0 0 12 0V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </Icon>\n );\n}\n\nexport function EraserIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\" />\n <path d=\"M22 21H7\" />\n <path d=\"m5 11 9 9\" />\n </Icon>\n );\n}\n\nexport function SignatureIcon({ size = 16, className }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 256 256\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"12\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden=\"true\"\n >\n <path d=\"M232,172H57.32c4-7.83,8.18-16.11,12.21-24.56,15.14,3.55,34.13-8.06,56.54-34.59,3.67,12.5,12.53,34.83,29.08,35.15h.35c8.71,0,17.64-6.25,27.16-19.06C187.17,137.14,199.31,148,232,148a4,4,0,0,0,0-8c-42.88,0-44-19.24-44-20a4,4,0,0,0-7.35-2.18C168.74,136.1,160.42,140,155.48,140h-.18c-13-.25-21.29-26.52-23.38-36.61a4,4,0,0,0-7-1.69c-20.94,26.27-39.06,39.55-51.8,38.2C97.31,87.5,105.19,53.16,96.49,37.77,94,33.31,88.7,28,77.91,28,64.09,28,52.54,42.41,47,66.54A122.7,122.7,0,0,0,45.46,113c2.64,15.29,8.39,26.05,16.69,31.35-4.58,9.6-9.3,19-13.84,27.68H24a4,4,0,0,0,0,8H44.1c-12.87,24.17-23.37,41.68-23.53,41.94a4,4,0,0,0,1.37,5.49A3.93,3.93,0,0,0,24,228a4,4,0,0,0,3.43-1.94c.16-.27,11.85-19.75,25.72-46.06H232a4,4,0,0,0,0-8ZM53.34,111.61a114.81,114.81,0,0,1,1.49-43.29C58.4,52.7,66.34,36,77.91,36c7.52,0,10.23,3.26,11.61,5.7C99,58.4,79.92,106,65.6,137,59.76,132.69,55.46,123.83,53.34,111.61Z\" />\n </svg>\n );\n}\n\nexport function PencilIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </Icon>\n );\n}\n\nexport function TextIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <polyline points=\"4 7 4 4 20 4 20 7\" />\n <line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\" />\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" />\n </Icon>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { RenderTask } from \"pdfjs-dist\";\nimport { TextLayer } from \"pdfjs-dist\";\nimport type { PdfDoc } from \"./types\";\nimport type { MarkupAnnotation, MarkupTool } from \"./markup\";\nimport { createMarkupId, expandRedactRects, REDACT_COLOR, selectionRectsForPage, selectionStartPoint } from \"./markup\";\nimport type { SignatureAnnotation, SignatureField } from \"./signature\";\nimport { createSignatureId } from \"./signature\";\nimport {\n clientDeltaToPage,\n clientPointToPage,\n pageSizeFromSurface,\n} from \"./coords\";\nimport type { TextAnnotation, TextField } from \"./text\";\nimport {\n createTextId,\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE,\n findTextFieldAtPoint,\n measureInlineText,\n resolveInlineTextPoint,\n selectWordAtPoint,\n} from \"./text\";\nimport { PencilIcon } from \"./icons\";\n\ninterface PageCanvasProps {\n pdfDoc: PdfDoc;\n pageNumber: number;\n scale: number;\n rotation: number;\n pageRef?: (el: HTMLDivElement | null) => void;\n onRendered?: (pageNumber: number) => void;\n markupTool?: MarkupTool;\n markupColor?: string;\n annotations?: MarkupAnnotation[];\n onAddAnnotation?: (annotation: MarkupAnnotation) => void;\n onRemoveAnnotation?: (id: string) => void;\n signatures?: SignatureAnnotation[];\n pendingSignature?: { imageDataUrl: string; width: number; height: number } | null;\n onAddSignature?: (signature: SignatureAnnotation) => void;\n onUpdateSignature?: (id: string, patch: Partial<SignatureAnnotation>) => void;\n onRemoveSignature?: (id: string) => void;\n onEditSignature?: (id: string) => void;\n onDuplicateSignature?: (id: string) => void;\n selectedSignatureId?: string | null;\n onSelectSignature?: (id: string | null) => void;\n signatureFields?: SignatureField[];\n selectedSignatureFieldId?: string | null;\n onSelectSignatureField?: (id: string | null) => void;\n hasFixedSignatureFields?: boolean;\n onOpenSignaturePad?: (fieldType?: import(\"./signature\").SignatureFieldType) => void;\n /** Values for date/text fixed fields, keyed by field id. */\n fieldValues?: Record<string, string>;\n onFieldValueChange?: (fieldId: string, value: string) => void;\n onFieldValueCommit?: (fieldId: string) => void;\n pendingFieldValue?: { type: \"date\" | \"text\"; value: string } | null;\n onPlaceFieldValue?: (pageNumber: number, x: number, y: number) => void;\n texts?: TextAnnotation[];\n onAddText?: (text: TextAnnotation) => void;\n onUpdateText?: (id: string, patch: Partial<TextAnnotation>) => void;\n onRemoveText?: (id: string) => void;\n selectedTextId?: string | null;\n onSelectText?: (id: string | null) => void;\n textFields?: TextField[];\n selectedTextFieldId?: string | null;\n onSelectTextField?: (id: string | null) => void;\n hasFixedTextFields?: boolean;\n editingTextId?: string | null;\n onEditingTextIdChange?: (id: string | null) => void;\n}\n\nexport function PageCanvas({\n pdfDoc,\n pageNumber,\n scale,\n rotation,\n pageRef,\n onRendered,\n markupTool = \"none\",\n markupColor,\n annotations = [],\n onAddAnnotation,\n onRemoveAnnotation,\n signatures = [],\n pendingSignature = null,\n onAddSignature,\n onUpdateSignature,\n onRemoveSignature,\n onEditSignature,\n onDuplicateSignature,\n selectedSignatureId = null,\n onSelectSignature,\n signatureFields = [],\n selectedSignatureFieldId = null,\n onSelectSignatureField,\n hasFixedSignatureFields = false,\n onOpenSignaturePad,\n fieldValues = {},\n onFieldValueChange,\n onFieldValueCommit,\n pendingFieldValue = null,\n onPlaceFieldValue,\n texts = [],\n onAddText,\n onUpdateText,\n onRemoveText,\n selectedTextId = null,\n onSelectText,\n textFields = [],\n selectedTextFieldId: _selectedTextFieldId = null,\n onSelectTextField,\n hasFixedTextFields = false,\n editingTextId = null,\n onEditingTextIdChange,\n}: PageCanvasProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const surfaceRef = useRef<HTMLDivElement>(null);\n const renderTaskRef = useRef<RenderTask | null>(null);\n const textLayerInstanceRef = useRef<TextLayer | null>(null);\n const [dragState, setDragState] = useState<\n | { kind: \"signature\"; id: string; offsetX: number; offsetY: number }\n | { kind: \"resize\"; id: string; startX: number; startY: number; startW: number; startH: number }\n | null\n >(null);\n const inlineEditRef = useRef<HTMLSpanElement>(null);\n const justOpenedEditorRef = useRef(false);\n\n useEffect(() => {\n if (!pdfDoc || !canvasRef.current || !textLayerRef.current || !surfaceRef.current) {\n return;\n }\n\n let cancelled = false;\n const canvas = canvasRef.current;\n const textLayerDiv = textLayerRef.current;\n const surface = surfaceRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n const render = async () => {\n try {\n if (renderTaskRef.current) {\n try {\n renderTaskRef.current.cancel();\n } catch {\n // ignore\n }\n renderTaskRef.current = null;\n }\n if (textLayerInstanceRef.current) {\n try {\n textLayerInstanceRef.current.cancel();\n } catch {\n // ignore\n }\n textLayerInstanceRef.current = null;\n }\n\n const page = await pdfDoc.getPage(pageNumber);\n if (cancelled) return;\n\n const viewport = page.getViewport({ scale, rotation });\n const width = Math.floor(viewport.width);\n const height = Math.floor(viewport.height);\n\n canvas.width = width;\n canvas.height = height;\n surface.style.width = `${width}px`;\n surface.style.height = `${height}px`;\n\n const task = page.render({ canvasContext: ctx, viewport });\n renderTaskRef.current = task;\n await task.promise;\n if (cancelled) return;\n\n textLayerDiv.replaceChildren();\n textLayerDiv.style.setProperty(\"--scale-factor\", String(viewport.scale));\n\n const textContent = await page.getTextContent();\n if (cancelled) return;\n\n const textLayer = new TextLayer({\n textContentSource: textContent,\n container: textLayerDiv,\n viewport,\n });\n textLayerInstanceRef.current = textLayer;\n await textLayer.render();\n if (cancelled) return;\n\n onRendered?.(pageNumber);\n } catch {\n // ignore (often cancellation)\n }\n };\n\n void render();\n\n return () => {\n cancelled = true;\n if (renderTaskRef.current) {\n try {\n renderTaskRef.current.cancel();\n } catch {\n // ignore\n }\n renderTaskRef.current = null;\n }\n if (textLayerInstanceRef.current) {\n try {\n textLayerInstanceRef.current.cancel();\n } catch {\n // ignore\n }\n textLayerInstanceRef.current = null;\n }\n };\n }, [pdfDoc, pageNumber, scale, rotation, onRendered]);\n\n useEffect(() => {\n const surface = surfaceRef.current;\n if (!surface) return;\n\n const applySelectionMarkup = (kind: \"highlight\" | \"underline\" | \"redact\") => {\n if (!onAddAnnotation) return false;\n\n const color =\n kind === \"redact\"\n ? REDACT_COLOR\n : markupColor;\n if (!color) return false;\n\n const captured = selectionRectsForPage(surface, scale);\n if (!captured) return false;\n\n const rects =\n kind === \"redact\"\n ? expandRedactRects(captured.rects)\n : captured.rects;\n\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind,\n color,\n rects,\n text: captured.text,\n });\n\n window.getSelection()?.removeAllRanges();\n return true;\n };\n\n const replaceSelectedPdfText = (initialValue: string) => {\n if (!onAddAnnotation || !onAddText) return false;\n\n const captured = selectionRectsForPage(surface, scale);\n if (!captured) return false;\n\n const rects = expandRedactRects(captured.rects);\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind: \"redact\",\n color: REDACT_COLOR,\n rects,\n text: captured.text,\n });\n\n const start = selectionStartPoint(captured.rects);\n const size = measureInlineText(initialValue || \" \", start.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x: start.x,\n y: start.y,\n width: size.width,\n height: size.height,\n value: initialValue,\n fontSize: start.fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n window.getSelection()?.removeAllRanges();\n justOpenedEditorRef.current = true;\n window.setTimeout(() => {\n justOpenedEditorRef.current = false;\n }, 0);\n return true;\n };\n\n const handleMouseUp = () => {\n if (markupTool === \"highlight\" || markupTool === \"underline\") {\n applySelectionMarkup(markupTool);\n return;\n }\n // Erase tool: select PDF words to cover/remove them\n if (markupTool === \"erase\") {\n applySelectionMarkup(\"redact\");\n return;\n }\n // Text tool: select existing PDF text → open it for editing\n if (markupTool === \"text\") {\n const selection = window.getSelection();\n if (\n selection &&\n !selection.isCollapsed &&\n selection.toString().trim() &&\n selection.anchorNode &&\n surface.contains(selection.anchorNode)\n ) {\n replaceSelectedPdfText(selection.toString());\n }\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n if (\n target?.closest(\"[contenteditable='true']\") ||\n target?.closest(\"[contenteditable='']\") ||\n target?.isContentEditable\n ) {\n return;\n }\n\n const selection = window.getSelection();\n const hasPdfSelection =\n selection != null &&\n !selection.isCollapsed &&\n selection.toString().trim().length > 0 &&\n selection.anchorNode != null &&\n surface.contains(selection.anchorNode);\n\n if (markupTool === \"text\" && hasPdfSelection) {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n replaceSelectedPdfText(selection!.toString());\n return;\n }\n\n if (\n event.key.length === 1 &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.altKey\n ) {\n event.preventDefault();\n replaceSelectedPdfText(event.key);\n return;\n }\n }\n\n if (markupTool !== \"text\" && markupTool !== \"erase\") return;\n if (event.key !== \"Backspace\" && event.key !== \"Delete\") return;\n\n if (!hasPdfSelection) return;\n\n event.preventDefault();\n applySelectionMarkup(\"redact\");\n };\n\n surface.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n surface.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [\n markupTool,\n markupColor,\n onAddAnnotation,\n onAddText,\n onEditingTextIdChange,\n onSelectText,\n pageNumber,\n scale,\n ]);\n\n useEffect(() => {\n if (!dragState) return;\n\n let rafId = 0;\n let lastClientX = 0;\n let lastClientY = 0;\n let scrollDir = 0; // -1 up, 1 down, 0 none\n\n const getScrollContainer = (): HTMLElement | null => {\n return (\n wrapRef.current?.closest(\".epochs-pdf-viewer__body\") as HTMLElement | null\n );\n };\n\n const updateResizeAtPoint = (clientX: number, clientY: number) => {\n if (dragState.kind !== \"resize\") return;\n if (!onUpdateSignature || hasFixedSignatureFields) return;\n const sig = signatures.find((s) => s.id === dragState.id);\n if (!sig) return;\n\n const surface = surfaceRef.current;\n const pageSize = surface\n ? pageSizeFromSurface(surface, scale)\n : { width: Infinity, height: Infinity };\n const { dx, dy } = surface\n ? clientDeltaToPage(\n clientX - dragState.startX,\n clientY - dragState.startY,\n surface,\n scale,\n )\n : { dx: 0, dy: 0 };\n\n const maxW = pageSize.width - sig.x;\n const maxH = pageSize.height - sig.y;\n const newW = Math.min(maxW, Math.max(40, dragState.startW + dx));\n const newH = Math.min(maxH, Math.max(20, dragState.startH + dy));\n onUpdateSignature(dragState.id, { width: newW, height: newH });\n };\n\n const updateSignatureAtPoint = (clientX: number, clientY: number) => {\n if (dragState.kind !== \"signature\") return;\n if (!onUpdateSignature || hasFixedSignatureFields) return;\n\n const sig = signatures.find((s) => s.id === dragState.id);\n if (!sig) return;\n\n // Prefer element under cursor; fall back to previous page when over empty gutter\n let pageEl = document\n .elementFromPoint(clientX, clientY)\n ?.closest(\"[data-page-number]\") as HTMLElement | null;\n\n if (!pageEl) {\n const pages = Array.from(\n document.querySelectorAll(\".epochs-pdf-viewer__page[data-page-number]\"),\n ) as HTMLElement[];\n pageEl =\n pages.find((page) => {\n const box = page.getBoundingClientRect();\n return clientY >= box.top && clientY <= box.bottom;\n }) ?? null;\n }\n\n if (!pageEl) {\n pageEl = wrapRef.current;\n }\n if (!pageEl) return;\n\n const surface = pageEl.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n if (!surface) return;\n\n const targetPage = Number.parseInt(\n pageEl.getAttribute(\"data-page-number\") || String(sig.pageNumber),\n 10,\n );\n\n const point = clientPointToPage(clientX, clientY, surface, scale);\n const pageSize = pageSizeFromSurface(surface, scale);\n let nextX = point.x - dragState.offsetX;\n let nextY = point.y - dragState.offsetY;\n const maxX = Math.max(0, pageSize.width - sig.width);\n const maxY = Math.max(0, pageSize.height - sig.height);\n nextX = Math.min(Math.max(0, nextX), maxX);\n nextY = Math.min(Math.max(0, nextY), maxY);\n\n onUpdateSignature(dragState.id, {\n pageNumber: targetPage,\n x: nextX,\n y: nextY,\n });\n };\n\n const tickScroll = () => {\n rafId = 0;\n if (!scrollDir) return;\n\n const container = getScrollContainer();\n if (!container) return;\n\n const maxScroll = container.scrollHeight - container.clientHeight;\n if (maxScroll <= 0) return;\n\n const edge = 56;\n const box = container.getBoundingClientRect();\n const distTop = lastClientY - box.top;\n const distBottom = box.bottom - lastClientY;\n\n let speed = 0;\n if (scrollDir < 0 && distTop < edge) {\n speed = -Math.max(6, ((edge - distTop) / edge) * 28);\n } else if (scrollDir > 0 && distBottom < edge) {\n speed = Math.max(6, ((edge - distBottom) / edge) * 28);\n } else {\n scrollDir = 0;\n return;\n }\n\n const prev = container.scrollTop;\n container.scrollTop = Math.min(maxScroll, Math.max(0, prev + speed));\n\n if (container.scrollTop !== prev) {\n updateSignatureAtPoint(lastClientX, lastClientY);\n }\n\n if (\n (speed < 0 && container.scrollTop > 0) ||\n (speed > 0 && container.scrollTop < maxScroll)\n ) {\n rafId = window.requestAnimationFrame(tickScroll);\n } else {\n scrollDir = 0;\n }\n };\n\n const handleMove = (event: PointerEvent) => {\n lastClientX = event.clientX;\n lastClientY = event.clientY;\n\n const container = getScrollContainer();\n if (container) {\n const edge = 56;\n const box = container.getBoundingClientRect();\n const distTop = event.clientY - box.top;\n const distBottom = box.bottom - event.clientY;\n\n if (distTop < edge) {\n scrollDir = -1;\n if (!rafId) rafId = window.requestAnimationFrame(tickScroll);\n } else if (distBottom < edge) {\n scrollDir = 1;\n if (!rafId) rafId = window.requestAnimationFrame(tickScroll);\n } else {\n scrollDir = 0;\n }\n }\n\n if (dragState.kind === \"resize\") {\n updateResizeAtPoint(event.clientX, event.clientY);\n } else {\n updateSignatureAtPoint(event.clientX, event.clientY);\n }\n };\n\n const handleUp = () => {\n scrollDir = 0;\n if (rafId) {\n window.cancelAnimationFrame(rafId);\n rafId = 0;\n }\n setDragState(null);\n };\n\n window.addEventListener(\"pointermove\", handleMove);\n window.addEventListener(\"pointerup\", handleUp);\n window.addEventListener(\"pointercancel\", handleUp);\n return () => {\n scrollDir = 0;\n if (rafId) window.cancelAnimationFrame(rafId);\n window.removeEventListener(\"pointermove\", handleMove);\n window.removeEventListener(\"pointerup\", handleUp);\n window.removeEventListener(\"pointercancel\", handleUp);\n };\n }, [\n dragState,\n hasFixedSignatureFields,\n onUpdateSignature,\n scale,\n signatures,\n ]);\n\n useEffect(() => {\n if (!editingTextId || !inlineEditRef.current) return;\n const el = inlineEditRef.current;\n const current = texts.find((t) => t.id === editingTextId);\n // Uncontrolled while editing — set DOM text once so React won't reset the caret\n el.textContent = current?.value ?? \"\";\n el.focus();\n\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n // Only re-run when the edit session starts, not on every keystroke\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editingTextId]);\n\n const setRefs = (el: HTMLDivElement | null) => {\n wrapRef.current = el;\n pageRef?.(el);\n };\n\n const pageAnnotations = annotations.filter((a) => a.pageNumber === pageNumber);\n const pageSignatures = signatures.filter((s) => s.pageNumber === pageNumber);\n const pageSignatureFields = signatureFields.filter((f) => f.pageNumber === pageNumber);\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n\n const commitInlineText = (text: TextAnnotation, value: string) => {\n const trimmed = value.trim();\n if (!trimmed) {\n onRemoveText?.(text.id);\n onEditingTextIdChange?.(null);\n return;\n }\n\n const size = measureInlineText(trimmed, text.fontSize);\n onUpdateText?.(text.id, {\n value: trimmed,\n width: size.width,\n height: size.height,\n });\n onEditingTextIdChange?.(null);\n };\n\n const beginInlineTextAt = (clientX: number, clientY: number) => {\n if (!onAddText) return;\n\n const surface = surfaceRef.current;\n const textLayer = textLayerRef.current;\n if (!surface || !textLayer) return;\n\n let point = resolveInlineTextPoint(\n clientX,\n clientY,\n surface,\n textLayer,\n scale,\n );\n\n let fieldId: string | undefined;\n let color = DEFAULT_TEXT_COLOR;\n\n if (hasFixedTextFields) {\n const field = findTextFieldAtPoint(\n point.x,\n point.y,\n textFields,\n pageNumber,\n );\n if (!field) return;\n\n const existing = texts.find((t) => t.fieldId === field.id);\n if (existing) {\n onSelectText?.(existing.id);\n onSelectTextField?.(field.id);\n onEditingTextIdChange?.(existing.id);\n return;\n }\n\n fieldId = field.id;\n point = {\n x: field.x,\n y: field.y,\n fontSize: field.fontSize ?? DEFAULT_TEXT_FONT_SIZE,\n };\n color = field.color ?? DEFAULT_TEXT_COLOR;\n onSelectTextField?.(field.id);\n }\n\n const size = measureInlineText(\"\", point.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n fieldId,\n pageNumber,\n x: point.x,\n y: point.y,\n width: size.width,\n height: size.height,\n value: \"\",\n fontSize: point.fontSize,\n color,\n };\n\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n };\n\n const handleInlineTextClick = (event: React.MouseEvent<HTMLElement>) => {\n if (markupTool !== \"text\") return;\n if ((event.target as HTMLElement).closest(\".epochs-pdf-viewer__inline-text\")) {\n return;\n }\n // Skip the click that follows a select-to-edit mouseup\n if (justOpenedEditorRef.current) {\n justOpenedEditorRef.current = false;\n return;\n }\n\n // Selecting existing PDF words opens the editor on mouseup — don't insert here\n const selection = window.getSelection();\n if (selection && !selection.isCollapsed && selection.toString().trim()) {\n return;\n }\n\n // Double-click: select the word under the cursor and edit it\n if (event.detail >= 2) {\n const word = selectWordAtPoint(event.clientX, event.clientY, textLayerRef.current);\n if (word) {\n // mouseup already ran; open editor from the new word selection\n const surface = surfaceRef.current;\n if (surface && onAddAnnotation && onAddText) {\n const captured = selectionRectsForPage(surface, scale);\n if (captured) {\n onAddAnnotation({\n id: createMarkupId(),\n pageNumber,\n kind: \"redact\",\n color: REDACT_COLOR,\n rects: expandRedactRects(captured.rects),\n text: captured.text,\n });\n const start = selectionStartPoint(captured.rects);\n const size = measureInlineText(captured.text || \" \", start.fontSize);\n const created: TextAnnotation = {\n id: createTextId(),\n pageNumber,\n x: start.x,\n y: start.y,\n width: size.width,\n height: size.height,\n value: captured.text,\n fontSize: start.fontSize,\n color: DEFAULT_TEXT_COLOR,\n };\n onAddText(created);\n onSelectText?.(created.id);\n onEditingTextIdChange?.(created.id);\n window.getSelection()?.removeAllRanges();\n justOpenedEditorRef.current = true;\n }\n }\n return;\n }\n }\n\n event.stopPropagation();\n beginInlineTextAt(event.clientX, event.clientY);\n };\n\n const handleSurfaceClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\".epochs-pdf-viewer__signature\") ||\n target.closest(\".epochs-pdf-viewer__signature-field\") ||\n target.closest(\".epochs-pdf-viewer__inline-text\")\n ) {\n return;\n }\n\n if (markupTool === \"text\") {\n beginInlineTextAt(event.clientX, event.clientY);\n return;\n }\n\n if (\n !hasFixedSignatureFields &&\n markupTool === \"sign\" &&\n pendingFieldValue &&\n onPlaceFieldValue\n ) {\n const surface = surfaceRef.current;\n if (!surface) return;\n const point = clientPointToPage(event.clientX, event.clientY, surface, scale);\n onPlaceFieldValue(pageNumber, Math.max(0, point.x - 75), Math.max(0, point.y - 12));\n return;\n }\n\n if (\n !hasFixedSignatureFields &&\n markupTool === \"sign\" &&\n pendingSignature &&\n onAddSignature\n ) {\n const surface = surfaceRef.current;\n if (!surface) return;\n const pageSize = pageSizeFromSurface(surface, scale);\n const point = clientPointToPage(event.clientX, event.clientY, surface, scale);\n\n let x = point.x - pendingSignature.width / 2;\n let y = point.y - pendingSignature.height / 2;\n\n const maxX = Math.max(0, pageSize.width - pendingSignature.width);\n const maxY = Math.max(0, pageSize.height - pendingSignature.height);\n x = Math.min(Math.max(0, x), maxX);\n y = Math.min(Math.max(0, y), maxY);\n\n onAddSignature({\n id: createSignatureId(),\n pageNumber,\n x,\n y,\n width: pendingSignature.width,\n height: pendingSignature.height,\n imageDataUrl: pendingSignature.imageDataUrl,\n });\n return;\n }\n };\n\n const renderInlineText = (text: TextAnnotation) => {\n const isEditing = editingTextId === text.id;\n\n if (isEditing) {\n return (\n <span\n key={text.id}\n ref={inlineEditRef}\n contentEditable\n suppressContentEditableWarning\n role=\"textbox\"\n aria-label=\"Edit text\"\n className=\"epochs-pdf-viewer__inline-text epochs-pdf-viewer__inline-text--editing\"\n style={{\n left: text.x * scale,\n top: text.y * scale,\n fontSize: text.fontSize * scale,\n color: text.color,\n minWidth: Math.max(12, text.fontSize * scale * 0.5),\n width: Math.max(text.width * scale, text.fontSize * scale * 0.5),\n }}\n onClick={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onInput={(e) => {\n const value = e.currentTarget.textContent ?? \"\";\n const size = measureInlineText(value || \" \", text.fontSize);\n // Update metrics only — do not write value back into the DOM\n onUpdateText?.(text.id, {\n value,\n width: size.width,\n height: size.height,\n });\n }}\n onBlur={(e) => {\n commitInlineText(text, e.currentTarget.textContent ?? \"\");\n }}\n onKeyDown={(e) => {\n // Keep spaces / typing local to this editor\n e.stopPropagation();\n if (e.key === \"Escape\") {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n }}\n />\n );\n }\n\n if (!text.value.trim()) return null;\n\n return (\n <span\n key={text.id}\n className={\n selectedTextId === text.id\n ? \"epochs-pdf-viewer__inline-text epochs-pdf-viewer__inline-text--selected\"\n : \"epochs-pdf-viewer__inline-text\"\n }\n style={{\n left: text.x * scale,\n top: text.y * scale,\n fontSize: text.fontSize * scale,\n color: text.color,\n }}\n onClick={(e) => {\n e.stopPropagation();\n if (markupTool === \"erase\") {\n onRemoveText?.(text.id);\n return;\n }\n if (markupTool === \"text\") {\n onSelectText?.(text.id);\n onEditingTextIdChange?.(text.id);\n }\n }}\n >\n {text.value}\n </span>\n );\n };\n\n return (\n <div\n ref={setRefs}\n data-page-number={pageNumber}\n className=\"epochs-pdf-viewer__page\"\n >\n <div\n ref={surfaceRef}\n className={`epochs-pdf-viewer__surface epochs-pdf-viewer__surface--tool-${markupTool}`}\n onClick={handleSurfaceClick}\n >\n <canvas ref={canvasRef} className=\"epochs-pdf-viewer__canvas\" />\n\n <div className=\"epochs-pdf-viewer__markup-layer\" aria-hidden=\"true\">\n {pageAnnotations.map((ann) =>\n ann.kind === \"redact\"\n ? null\n : ann.rects.map((rect, idx) => {\n if (ann.kind === \"highlight\") {\n return (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--highlight\"\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.w * scale,\n height: rect.h * scale,\n background: ann.color,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n );\n }\n\n return (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--underline\"\n style={{\n left: rect.x * scale,\n top: (rect.y + rect.h) * scale - Math.max(2, scale * 1.5),\n width: rect.w * scale,\n height: Math.max(2, scale * 1.5),\n background: ann.color,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n );\n }),\n )}\n </div>\n\n <div className=\"epochs-pdf-viewer__signature-layer\">\n {pageSignatureFields.map((field) => {\n const filled = pageSignatures.some((sig) => sig.fieldId === field.id);\n return (\n <button\n key={field.id}\n type=\"button\"\n data-signature-field-id={field.id}\n className={\n selectedSignatureFieldId === field.id\n ? \"epochs-pdf-viewer__signature-field epochs-pdf-viewer__signature-field--selected\"\n : filled\n ? \"epochs-pdf-viewer__signature-field epochs-pdf-viewer__signature-field--filled\"\n : \"epochs-pdf-viewer__signature-field\"\n }\n style={{\n left: field.x * scale,\n top: field.y * scale,\n width: field.width * scale,\n height: field.height * scale,\n }}\n onClick={(e) => {\n e.stopPropagation();\n const fType = (field as any).type as string | undefined;\n if (fType === \"date\" || fType === \"text\") return;\n onSelectSignatureField?.(field.id);\n const existing = pageSignatures.find((sig) => sig.fieldId === field.id);\n onSelectSignature?.(existing?.id ?? null);\n if (existing) {\n onEditSignature?.(existing.id);\n } else {\n onOpenSignaturePad?.((field as any).type);\n }\n }}\n title={filled ? \"Signed field\" : \"Signature field\"}\n >\n {(() => {\n const fType = (field as any).type as string | undefined;\n if (fType === \"date\") {\n return (\n <input\n type=\"date\"\n className=\"epochs-pdf-viewer__signature-field-input\"\n value={fieldValues[field.id] ?? \"\"}\n onClick={(ev) => ev.stopPropagation()}\n onChange={(ev) => {\n ev.stopPropagation();\n onFieldValueChange?.(field.id, ev.target.value);\n onFieldValueCommit?.(field.id);\n }}\n style={{ width: \"100%\", height: \"100%\" }}\n />\n );\n }\n if (fType === \"text\") {\n return (\n <input\n type=\"text\"\n className=\"epochs-pdf-viewer__signature-field-input\"\n value={fieldValues[field.id] ?? \"\"}\n placeholder={(field as any).placeholder ?? \"Enter text\"}\n onClick={(ev) => ev.stopPropagation()}\n onChange={(ev) => {\n ev.stopPropagation();\n onFieldValueChange?.(field.id, ev.target.value);\n }}\n onBlur={() => onFieldValueCommit?.(field.id)}\n style={{ width: \"100%\", height: \"100%\" }}\n />\n );\n }\n return !filled ? <span>Sign here</span> : null;\n })()}\n </button>\n );\n })}\n {pageSignatures.map((sig) => (\n <div\n key={sig.id}\n className={\n selectedSignatureId === sig.id\n ? \"epochs-pdf-viewer__signature epochs-pdf-viewer__signature--selected\"\n : \"epochs-pdf-viewer__signature\"\n }\n style={{\n left: sig.x * scale,\n top: sig.y * scale,\n width: sig.width * scale,\n height: sig.height * scale,\n }}\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onSelectSignature?.(sig.id);\n\n if (markupTool === \"erase\" && !hasFixedSignatureFields) {\n onRemoveSignature?.(sig.id);\n return;\n }\n\n if (hasFixedSignatureFields) {\n onSelectSignatureField?.(sig.fieldId ?? null);\n onEditSignature?.(sig.id);\n return;\n }\n\n const surface = surfaceRef.current;\n if (!surface) return;\n const point = clientPointToPage(e.clientX, e.clientY, surface, scale);\n setDragState({\n kind: \"signature\",\n id: sig.id,\n offsetX: point.x - sig.x,\n offsetY: point.y - sig.y,\n });\n }}\n >\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-edit\"\n title=\"Edit signature\"\n aria-label=\"Edit signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignature?.(sig.id);\n onEditSignature?.(sig.id);\n }}\n >\n <PencilIcon size={12} />\n </button>\n {!hasFixedSignatureFields ? (\n <>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-duplicate\"\n title=\"Duplicate signature\"\n aria-label=\"Duplicate signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onSelectSignature?.(sig.id);\n onDuplicateSignature?.(sig.id);\n }}\n >\n ⧉\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__signature-remove\"\n title=\"Remove signature\"\n aria-label=\"Remove signature\"\n onPointerDown={(e) => {\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.stopPropagation();\n onRemoveSignature?.(sig.id);\n }}\n >\n ×\n </button>\n </>\n ) : null}\n <img src={sig.imageDataUrl} alt=\"Signature\" draggable={false} />\n {!hasFixedSignatureFields ? (\n <div\n className=\"epochs-pdf-viewer__signature-resize\"\n title=\"Resize\"\n onPointerDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onSelectSignature?.(sig.id);\n setDragState({\n kind: \"resize\",\n id: sig.id,\n startX: e.clientX,\n startY: e.clientY,\n startW: sig.width,\n startH: sig.height,\n });\n }}\n >\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7 1L1 7M7 4L4 7\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\n </svg>\n </div>\n ) : null}\n </div>\n ))}\n </div>\n\n <div className=\"epochs-pdf-viewer__text-layer-overlay\">\n {pageTexts.map((text) => renderInlineText(text))}\n </div>\n\n <div\n ref={textLayerRef}\n className=\"textLayer epochs-pdf-viewer__text-layer\"\n onClick={handleInlineTextClick}\n />\n\n <div className=\"epochs-pdf-viewer__redact-layer\" aria-hidden=\"true\">\n {pageAnnotations.map((ann) =>\n ann.kind === \"redact\"\n ? ann.rects.map((rect, idx) => (\n <div\n key={`${ann.id}_${idx}`}\n className=\"epochs-pdf-viewer__markup epochs-pdf-viewer__markup--redact\"\n style={{\n left: rect.x * scale,\n top: rect.y * scale,\n width: rect.w * scale,\n height: rect.h * scale,\n background: ann.color || REDACT_COLOR,\n }}\n onClick={(e) => {\n if (markupTool !== \"erase\") return;\n e.stopPropagation();\n onRemoveAnnotation?.(ann.id);\n }}\n />\n ))\n : null,\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport type { RenderTask } from \"pdfjs-dist\";\nimport { drawMarkupOnCanvas, type MarkupAnnotation } from \"./markup\";\nimport {\n drawSignatureFieldsOnCanvas,\n drawSignaturesOnCanvas,\n type SignatureAnnotation,\n type SignatureField,\n} from \"./signature\";\nimport {\n drawTextFieldsOnCanvas,\n drawTextsOnCanvas,\n type TextAnnotation,\n type TextField,\n} from \"./text\";\nimport type { PdfDoc } from \"./types\";\n\ninterface ThumbnailProps {\n pdfDoc: PdfDoc;\n pageNumber: number;\n isActive?: boolean;\n rotation: number;\n onSelect: (pageNumber: number) => void;\n width?: number;\n annotations?: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n signatureFields?: SignatureField[];\n texts?: TextAnnotation[];\n textFields?: TextField[];\n}\n\nexport function Thumbnail({\n pdfDoc,\n pageNumber,\n isActive,\n rotation,\n onSelect,\n width = 140,\n annotations = [],\n signatures = [],\n signatureFields = [],\n texts = [],\n textFields = [],\n}: ThumbnailProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n if (!pdfDoc || !canvasRef.current) return;\n\n let cancelled = false;\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n let task: RenderTask | null = null;\n\n const render = async () => {\n try {\n const page = await pdfDoc.getPage(pageNumber);\n if (cancelled) return;\n\n const viewportAt1 = page.getViewport({ scale: 1, rotation });\n const scale = width / viewportAt1.width;\n const viewport = page.getViewport({ scale, rotation });\n\n canvas.width = Math.floor(viewport.width);\n canvas.height = Math.floor(viewport.height);\n\n task = page.render({ canvasContext: ctx, viewport });\n await task.promise;\n\n const pageAnnotations = annotations.filter((a) => a.pageNumber === pageNumber);\n if (pageAnnotations.length > 0) {\n drawMarkupOnCanvas(ctx, pageAnnotations, scale);\n }\n\n const pageSignatures = signatures.filter((s) => s.pageNumber === pageNumber);\n const pageSignatureFields = signatureFields.filter(\n (field) => field.pageNumber === pageNumber,\n );\n if (pageSignatureFields.length > 0) {\n drawSignatureFieldsOnCanvas(\n ctx,\n pageSignatureFields,\n new Set(pageSignatures.map((sig) => sig.fieldId).filter(Boolean) as string[]),\n scale,\n );\n }\n if (pageSignatures.length > 0) {\n await drawSignaturesOnCanvas(ctx, pageSignatures, scale);\n }\n\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n const pageTextFields = textFields.filter(\n (field) => field.pageNumber === pageNumber,\n );\n if (pageTextFields.length > 0) {\n drawTextFieldsOnCanvas(\n ctx,\n pageTextFields,\n new Set(\n pageTexts\n .filter((t) => t.fieldId && t.value.trim())\n .map((t) => t.fieldId as string),\n ),\n scale,\n );\n }\n if (pageTexts.length > 0) {\n drawTextsOnCanvas(ctx, pageTexts, scale);\n }\n } catch {\n // ignore\n }\n };\n\n void render();\n\n return () => {\n cancelled = true;\n if (task) {\n try {\n task.cancel();\n } catch {\n // ignore\n }\n }\n };\n }, [\n annotations,\n pdfDoc,\n pageNumber,\n rotation,\n signatureFields,\n signatures,\n textFields,\n texts,\n width,\n ]);\n\n return (\n <button\n type=\"button\"\n onClick={() => onSelect(pageNumber)}\n className={\n isActive\n ? \"epochs-pdf-viewer__thumb epochs-pdf-viewer__thumb--active\"\n : \"epochs-pdf-viewer__thumb\"\n }\n title={`Page ${pageNumber}`}\n >\n <div className=\"epochs-pdf-viewer__thumb-frame\">\n <canvas ref={canvasRef} />\n </div>\n <span className=\"epochs-pdf-viewer__thumb-label\">{pageNumber}</span>\n </button>\n );\n}\n","import * as pdfjsLib from \"pdfjs-dist\";\n\nconst ABSOLUTE_URL_PATTERN = /^(blob:|https?:|data:)/i;\n\nlet workerConfigured = false;\n\n/** Configure pdf.js worker. Call once, or pass `workerSrc` to `<PdfViewer>`. */\nexport function setPdfWorkerSrc(workerSrc: string): void {\n pdfjsLib.GlobalWorkerOptions.workerSrc = workerSrc;\n workerConfigured = true;\n}\n\nexport function ensurePdfWorker(workerSrc?: string): void {\n if (workerSrc) {\n setPdfWorkerSrc(workerSrc);\n return;\n }\n if (workerConfigured || pdfjsLib.GlobalWorkerOptions.workerSrc) return;\n\n setPdfWorkerSrc(\n `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`,\n );\n}\n\nexport function resolvePdfUrl(\n file?: string,\n fileUrl?: string,\n baseUrl = \"\",\n): string {\n const source = fileUrl || file;\n if (!source) return \"\";\n\n if (ABSOLUTE_URL_PATTERN.test(source)) return source;\n\n const path = source.startsWith(\"/\") ? source : `/${source}`;\n if (!baseUrl) return path;\n return `${baseUrl.replace(/\\/$/, \"\")}${path}`;\n}\n\nexport async function urlToPdfArrayBuffer(\n url: string,\n fetchOptions?: RequestInit,\n): Promise<ArrayBuffer> {\n const res = await fetch(url, fetchOptions);\n\n if (!res.ok) {\n throw new Error(`Failed to fetch PDF (${res.status})`);\n }\n\n return res.arrayBuffer();\n}\n\nexport async function sourceToArrayBuffer(\n source: string | ArrayBuffer | Uint8Array | Blob,\n fetchOptions?: RequestInit,\n): Promise<ArrayBuffer> {\n if (typeof source === \"string\") {\n return urlToPdfArrayBuffer(source, fetchOptions);\n }\n if (source instanceof ArrayBuffer) return source.slice(0);\n if (source instanceof Uint8Array) {\n const copy = new Uint8Array(source.byteLength);\n copy.set(source);\n return copy.buffer;\n }\n return source.arrayBuffer();\n}\n\nexport { pdfjsLib };\n","import type { PDFDocumentProxy } from \"pdfjs-dist\";\nimport type { MarkupAnnotation } from \"./markup\";\nimport { drawMarkupOnCanvas } from \"./markup\";\nimport type { SignatureAnnotation } from \"./signature\";\nimport { drawSignaturesOnCanvas } from \"./signature\";\nimport type { TextAnnotation } from \"./text\";\nimport { drawTextsOnCanvas } from \"./text\";\n\nexport interface RenderedPageImage {\n pageNumber: number;\n /** Canvas pixel size */\n width: number;\n height: number;\n /** PDF page size at scale 1 (points) */\n pageWidth: number;\n pageHeight: number;\n dataUrl: string;\n jpegBytes: Uint8Array;\n}\n\n/** Render a page in the *main* document (iframe canvases break pdf.js fonts). */\nexport async function renderPageWithMarkup(\n pdfDoc: PDFDocumentProxy,\n pageNumber: number,\n options: {\n scale: number;\n rotation: number;\n annotations: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n texts?: TextAnnotation[];\n mimeType?: \"image/png\" | \"image/jpeg\";\n quality?: number;\n },\n): Promise<RenderedPageImage> {\n const {\n scale,\n rotation,\n annotations,\n signatures = [],\n texts = [],\n mimeType = \"image/jpeg\",\n quality = 0.92,\n } = options;\n\n const page = await pdfDoc.getPage(pageNumber);\n const viewport = page.getViewport({ scale, rotation });\n const baseViewport = page.getViewport({ scale: 1, rotation });\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\", { alpha: false });\n if (!ctx) {\n throw new Error(\"Could not create canvas context\");\n }\n\n const width = Math.floor(viewport.width);\n const height = Math.floor(viewport.height);\n canvas.width = width;\n canvas.height = height;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, width, height);\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n const pageMarks = annotations.filter((a) => a.pageNumber === pageNumber);\n if (pageMarks.length > 0) {\n drawMarkupOnCanvas(ctx, pageMarks, scale);\n }\n\n const pageSigs = signatures.filter((s) => s.pageNumber === pageNumber);\n if (pageSigs.length > 0) {\n await drawSignaturesOnCanvas(ctx, pageSigs, scale);\n }\n\n const pageTexts = texts.filter((t) => t.pageNumber === pageNumber);\n if (pageTexts.length > 0) {\n drawTextsOnCanvas(ctx, pageTexts, scale);\n }\n\n const dataUrl = canvas.toDataURL(mimeType, quality);\n const jpegBytes = dataUrlToBytes(dataUrl);\n\n canvas.width = 0;\n canvas.height = 0;\n\n return {\n pageNumber,\n width,\n height,\n pageWidth: baseViewport.width,\n pageHeight: baseViewport.height,\n dataUrl,\n jpegBytes,\n };\n}\n\nexport async function renderAllPagesWithMarkup(\n pdfDoc: PDFDocumentProxy,\n options: {\n scale: number;\n rotation: number;\n annotations: MarkupAnnotation[];\n signatures?: SignatureAnnotation[];\n texts?: TextAnnotation[];\n mimeType?: \"image/png\" | \"image/jpeg\";\n quality?: number;\n },\n): Promise<RenderedPageImage[]> {\n const pages: RenderedPageImage[] = [];\n for (let i = 1; i <= pdfDoc.numPages; i += 1) {\n pages.push(await renderPageWithMarkup(pdfDoc, i, options));\n }\n return pages;\n}\n\nfunction dataUrlToBytes(dataUrl: string): Uint8Array {\n const base64 = dataUrl.split(\",\")[1] ?? \"\";\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nfunction enc(text: string): Uint8Array {\n return new TextEncoder().encode(text);\n}\n\nfunction concat(...parts: Uint8Array[]): Uint8Array {\n const total = parts.reduce((sum, p) => sum + p.byteLength, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const part of parts) {\n out.set(part, offset);\n offset += part.byteLength;\n }\n return out;\n}\n\n/**\n * Build a multi-page PDF embedding each page as a JPEG (includes baked markup).\n */\nexport function buildPdfFromJpegPages(pages: RenderedPageImage[]): Uint8Array {\n type PdfObject = Uint8Array;\n const objects: PdfObject[] = [];\n\n const add = (bytes: Uint8Array): number => {\n objects.push(bytes);\n return objects.length; // 1-indexed id\n };\n\n const pageIds: number[] = [];\n\n for (const page of pages) {\n const imageStream = concat(\n enc(\n `<< /Type /XObject /Subtype /Image /Width ${page.width} /Height ${page.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${page.jpegBytes.byteLength} >>\\nstream\\n`,\n ),\n page.jpegBytes,\n enc(`\\nendstream`),\n );\n const imageId = add(imageStream);\n\n const content = `q\\n${page.pageWidth.toFixed(2)} 0 0 ${page.pageHeight.toFixed(2)} 0 0 cm\\n/Im0 Do\\nQ`;\n const contentId = add(\n enc(`<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`),\n );\n\n // Parent placeholder replaced after pages object exists\n const pageId = add(\n enc(\n `<< /Type /Page /Parent __PAGES__ 0 R /MediaBox [0 0 ${page.pageWidth.toFixed(2)} ${page.pageHeight.toFixed(2)}] /Contents ${contentId} 0 R /Resources << /XObject << /Im0 ${imageId} 0 R >> >> >>`,\n ),\n );\n pageIds.push(pageId);\n }\n\n const kids = pageIds.map((id) => `${id} 0 R`).join(\" \");\n const pagesId = add(\n enc(`<< /Type /Pages /Kids [${kids}] /Count ${pageIds.length} >>`),\n );\n\n for (const pageId of pageIds) {\n const text = new TextDecoder().decode(objects[pageId - 1]);\n objects[pageId - 1] = enc(\n text.replace(\"/Parent __PAGES__ 0 R\", `/Parent ${pagesId} 0 R`),\n );\n }\n\n const catalogId = add(enc(`<< /Type /Catalog /Pages ${pagesId} 0 R >>`));\n\n const chunks: Uint8Array[] = [enc(\"%PDF-1.4\\n\")];\n const offsets: number[] = [0];\n let offset = chunks[0].byteLength;\n\n for (let i = 0; i < objects.length; i += 1) {\n offsets.push(offset);\n const objHeader = enc(`${i + 1} 0 obj\\n`);\n const objFooter = enc(`\\nendobj\\n`);\n chunks.push(objHeader, objects[i], objFooter);\n offset += objHeader.byteLength + objects[i].byteLength + objFooter.byteLength;\n }\n\n const xrefStart = offset;\n let xref = `xref\\n0 ${objects.length + 1}\\n`;\n xref += \"0000000000 65535 f \\n\";\n for (let i = 1; i <= objects.length; i += 1) {\n xref += `${String(offsets[i]).padStart(10, \"0\")} 00000 n \\n`;\n }\n xref += `trailer\\n<< /Size ${objects.length + 1} /Root ${catalogId} 0 R >>\\n`;\n xref += `startxref\\n${xrefStart}\\n%%EOF`;\n chunks.push(enc(xref));\n\n return concat(...chunks);\n}\n\nexport function triggerBlobDownload(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { SignatureFieldType } from \"./signature\";\n\ninterface SignaturePadProps {\n open: boolean;\n onClose: () => void;\n onSave: (imageDataUrl: string, width: number, height: number) => void;\n /** When set, locks the modal to this field type (from a fixed field). */\n fieldType?: SignatureFieldType;\n /** Show Sign/Date/Text tabs when no fixed field type is provided. */\n showFieldTypeTabs?: boolean;\n /** Placeholder for text-type fields. */\n textPlaceholder?: string;\n}\n\ntype PadMode = \"draw\" | \"type\";\n\nconst HANDWRITING_FONTS = [\n { id: \"dancing-script\", label: \"Dancing Script\", family: \"Dancing Script\" },\n { id: \"great-vibes\", label: \"Great Vibes\", family: \"Great Vibes\" },\n { id: \"pacifico\", label: \"Pacifico\", family: \"Pacifico\" },\n { id: \"satisfy\", label: \"Satisfy\", family: \"Satisfy\" },\n { id: \"allura\", label: \"Allura\", family: \"Allura\" },\n] as const;\n\ntype HandwritingFontId = (typeof HANDWRITING_FONTS)[number][\"id\"];\n\nconst HANDWRITING_FONTS_HREF =\n \"https://fonts.googleapis.com/css2?family=Allura&family=Dancing+Script:wght@500;600&family=Great+Vibes&family=Pacifico&family=Satisfy&display=swap\";\n\nlet handwritingFontsPromise: Promise<void> | null = null;\n\nfunction ensureHandwritingFonts(): Promise<void> {\n if (typeof document === \"undefined\") return Promise.resolve();\n if (handwritingFontsPromise) return handwritingFontsPromise;\n\n handwritingFontsPromise = new Promise((resolve) => {\n const existing = document.querySelector(\n `link[data-epochs-signature-fonts=\"true\"]`,\n );\n if (!existing) {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = HANDWRITING_FONTS_HREF;\n link.dataset.epochsSignatureFonts = \"true\";\n document.head.appendChild(link);\n }\n\n const loadFaces = () =>\n Promise.all(\n HANDWRITING_FONTS.map((font) =>\n document.fonts.load(`48px \"${font.family}\"`),\n ),\n ).then(() => undefined);\n\n if (document.fonts?.ready) {\n document.fonts.ready.then(loadFaces).then(resolve).catch(() => resolve());\n } else {\n window.setTimeout(() => {\n loadFaces().then(resolve).catch(() => resolve());\n }, 300);\n }\n });\n\n return handwritingFontsPromise;\n}\n\nexport function SignaturePad({\n open,\n onClose,\n onSave,\n fieldType,\n showFieldTypeTabs = false,\n textPlaceholder,\n}: SignaturePadProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const drawingRef = useRef(false);\n const lastPointRef = useRef<{ x: number; y: number } | null>(null);\n const pathsRef = useRef<{ x: number; y: number }[][]>([]);\n const currentPathRef = useRef<{ x: number; y: number }[]>([]);\n\n const resolvedFieldType: SignatureFieldType = fieldType ?? \"sign\";\n const [activeFieldType, setActiveFieldType] = useState<SignatureFieldType>(resolvedFieldType);\n const [dateValue, setDateValue] = useState(\"\");\n const [textValue, setTextValue] = useState(\"\");\n\n const [mode, setMode] = useState<PadMode>(\"draw\");\n const [typedName, setTypedName] = useState(\"\");\n const [typedInitials, setTypedInitials] = useState(\"\");\n const [initialsTouched, setInitialsTouched] = useState(false);\n const [typeKind, setTypeKind] = useState<\"signature\" | \"initials\">(\"signature\");\n const [inkColor, setInkColor] = useState(\"#111827\");\n const [fontId, setFontId] = useState<HandwritingFontId>(\"dancing-script\");\n const [fontsReady, setFontsReady] = useState(false);\n\n const selectedFont =\n HANDWRITING_FONTS.find((font) => font.id === fontId) ?? HANDWRITING_FONTS[0];\n\n const previewText =\n typeKind === \"initials\" ? typedInitials.trim() : typedName.trim();\n const fontPreviewLabel =\n previewText || (typeKind === \"initials\" ? \"AB\" : \"Signature\");\n\n useEffect(() => {\n if (!open) return;\n setActiveFieldType(resolvedFieldType);\n setDateValue(new Date().toISOString().slice(0, 10));\n setTextValue(\"\");\n }, [open, resolvedFieldType]);\n\n useEffect(() => {\n if (!open || activeFieldType !== \"sign\") return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n canvas.width = 560;\n canvas.height = 200;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.strokeStyle = inkColor;\n ctx.lineWidth = 2.5;\n lastPointRef.current = null;\n drawingRef.current = false;\n }, [open, activeFieldType]);\n\n useEffect(() => {\n if (!open) return;\n let cancelled = false;\n setFontsReady(false);\n ensureHandwritingFonts().then(() => {\n if (!cancelled) setFontsReady(true);\n });\n return () => {\n cancelled = true;\n };\n }, [open]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!ctx) return;\n ctx.strokeStyle = inkColor;\n ctx.fillStyle = inkColor;\n }, [inkColor]);\n\n useEffect(() => {\n if (!open || mode !== \"type\") return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n if (!previewText) return;\n\n const size =\n typeKind === \"initials\"\n ? 72\n : selectedFont.family === \"Great Vibes\" || selectedFont.family === \"Allura\"\n ? 56\n : selectedFont.family === \"Pacifico\"\n ? 44\n : 48;\n\n ctx.fillStyle = inkColor;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.font = `${size}px \"${selectedFont.family}\", cursive`;\n ctx.fillText(previewText, canvas.width / 2, canvas.height / 2);\n }, [\n previewText,\n typeKind,\n mode,\n inkColor,\n open,\n selectedFont,\n fontsReady,\n ]);\n\n if (!open) return null;\n\n const getPoint = (event: React.PointerEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n return {\n x: ((event.clientX - rect.left) / rect.width) * canvas.width,\n y: ((event.clientY - rect.top) / rect.height) * canvas.height,\n };\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLCanvasElement>) => {\n if (mode !== \"draw\") return;\n event.currentTarget.setPointerCapture(event.pointerId);\n drawingRef.current = true;\n const pt = getPoint(event);\n lastPointRef.current = pt;\n currentPathRef.current = [pt];\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLCanvasElement>) => {\n if (!drawingRef.current || mode !== \"draw\") return;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n const last = lastPointRef.current;\n if (!ctx || !last) return;\n\n const point = getPoint(event);\n ctx.beginPath();\n ctx.moveTo(last.x, last.y);\n ctx.lineTo(point.x, point.y);\n ctx.stroke();\n lastPointRef.current = point;\n currentPathRef.current.push(point);\n };\n\n const handlePointerUp = () => {\n if (currentPathRef.current.length > 1) {\n pathsRef.current.push([...currentPathRef.current]);\n }\n currentPathRef.current = [];\n drawingRef.current = false;\n lastPointRef.current = null;\n };\n\n const clearPad = () => {\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext(\"2d\");\n if (!canvas || !ctx) return;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n pathsRef.current = [];\n currentPathRef.current = [];\n setTypedName(\"\");\n setTypedInitials(\"\");\n setInitialsTouched(false);\n };\n\n const handleNameChange = (value: string) => {\n setTypedName(value);\n if (!initialsTouched) {\n setTypedInitials(deriveInitials(value));\n }\n };\n\n const trimAndSave = () => {\n if (mode === \"draw\") {\n const allPaths = pathsRef.current;\n if (allPaths.length === 0) return;\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const path of allPaths) {\n for (const pt of path) {\n if (pt.x < minX) minX = pt.x;\n if (pt.y < minY) minY = pt.y;\n if (pt.x > maxX) maxX = pt.x;\n if (pt.y > maxY) maxY = pt.y;\n }\n }\n\n const pad = 8;\n minX = Math.max(0, minX - pad);\n minY = Math.max(0, minY - pad);\n maxX += pad;\n maxY += pad;\n const w = maxX - minX;\n const h = maxY - minY;\n\n const pathData = allPaths\n .map((path) => {\n const pts = path.map((pt) => ({ x: pt.x - minX, y: pt.y - minY }));\n return \"M\" + pts.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(\"L\");\n })\n .join(\" \");\n\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w.toFixed(0)}\" height=\"${h.toFixed(0)}\" viewBox=\"0 0 ${w.toFixed(0)} ${h.toFixed(0)}\"><path d=\"${pathData}\" fill=\"none\" stroke=\"${inkColor}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`;\n const dataUrl = `data:image/svg+xml;base64,${btoa(svg)}`;\n onSave(dataUrl, w, h);\n } else {\n if (!previewText) return;\n\n const dpr = 3;\n const size =\n typeKind === \"initials\"\n ? 72\n : selectedFont.family === \"Great Vibes\" || selectedFont.family === \"Allura\"\n ? 56\n : selectedFont.family === \"Pacifico\"\n ? 44\n : 48;\n\n const measureCanvas = document.createElement(\"canvas\");\n const measureCtx = measureCanvas.getContext(\"2d\")!;\n measureCtx.font = `${size * dpr}px \"${selectedFont.family}\", cursive`;\n const metrics = measureCtx.measureText(previewText);\n const pad = 12 * dpr;\n const canvasW = Math.ceil(metrics.width) + pad * 2;\n const canvasH = size * dpr + pad * 2;\n\n const outCanvas = document.createElement(\"canvas\");\n outCanvas.width = canvasW;\n outCanvas.height = canvasH;\n const outCtx = outCanvas.getContext(\"2d\")!;\n outCtx.clearRect(0, 0, canvasW, canvasH);\n outCtx.font = `${size * dpr}px \"${selectedFont.family}\", cursive`;\n outCtx.fillStyle = inkColor;\n outCtx.textBaseline = \"middle\";\n outCtx.fillText(previewText, pad, canvasH / 2);\n\n const dataUrl = outCanvas.toDataURL(\"image/png\");\n onSave(dataUrl, canvasW / dpr, canvasH / dpr);\n }\n };\n\n const handleFieldValueSave = () => {\n const text =\n activeFieldType === \"date\" ? dateValue : textValue.trim();\n if (!text) return;\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\")!;\n const fontSize = 16;\n ctx.font = `${fontSize}px sans-serif`;\n const metrics = ctx.measureText(text);\n const pad = 8;\n canvas.width = Math.ceil(metrics.width) + pad * 2;\n canvas.height = fontSize + pad * 2;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.font = `${fontSize}px sans-serif`;\n ctx.fillStyle = \"#111827\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, pad, canvas.height / 2);\n\n const dataUrl = canvas.toDataURL(\"image/png\");\n onSave(dataUrl, canvas.width, canvas.height);\n };\n\n const showSignPad = activeFieldType === \"sign\";\n const modalTitle =\n activeFieldType === \"date\"\n ? \"Pick a date\"\n : activeFieldType === \"text\"\n ? \"Enter text\"\n : \"Create e-signature\";\n\n return (\n <div className=\"epochs-pdf-viewer__modal\" role=\"dialog\" aria-modal=\"true\">\n <div className=\"epochs-pdf-viewer__modal-backdrop\" onClick={onClose} />\n <div className=\"epochs-pdf-viewer__modal-card\">\n <div className=\"epochs-pdf-viewer__modal-header\">\n <h3>{modalTitle}</h3>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={onClose}\n title=\"Close\"\n >\n ×\n </button>\n </div>\n\n {showFieldTypeTabs && !fieldType ? (\n <div className=\"epochs-pdf-viewer__field-type-tabs\" role=\"tablist\">\n {([\"sign\", \"date\", \"text\"] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeFieldType === t}\n className={\n activeFieldType === t\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setActiveFieldType(t)}\n >\n {t === \"sign\" ? \"Sign\" : t === \"date\" ? \"Date\" : \"Text\"}\n </button>\n ))}\n </div>\n ) : null}\n\n {showSignPad ? (\n <>\n <div className=\"epochs-pdf-viewer__sign-modes\">\n <button\n type=\"button\"\n className={\n mode === \"draw\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => {\n setMode(\"draw\");\n clearPad();\n }}\n >\n Draw\n </button>\n <button\n type=\"button\"\n className={\n mode === \"type\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setMode(\"type\")}\n >\n Type\n </button>\n <label className=\"epochs-pdf-viewer__sign-ink\">\n Ink\n <input\n type=\"color\"\n value={inkColor}\n onChange={(e) => setInkColor(e.target.value)}\n />\n </label>\n </div>\n\n {mode === \"type\" ? (\n <>\n <div\n className=\"epochs-pdf-viewer__sign-fonts\"\n role=\"group\"\n aria-label=\"Handwriting style\"\n >\n {HANDWRITING_FONTS.map((font) => (\n <button\n key={font.id}\n type=\"button\"\n className={\n fontId === font.id\n ? \"epochs-pdf-viewer__sign-font epochs-pdf-viewer__sign-font--active\"\n : \"epochs-pdf-viewer__sign-font\"\n }\n style={{ fontFamily: `\"${font.family}\", cursive` }}\n onClick={() => setFontId(font.id)}\n title={font.label}\n >\n {fontPreviewLabel}\n </button>\n ))}\n </div>\n\n <div className=\"epochs-pdf-viewer__sign-type-fields\">\n <label className=\"epochs-pdf-viewer__sign-type-field\">\n <span>Full name</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={typedName}\n onChange={(e) => handleNameChange(e.target.value)}\n onFocus={() => setTypeKind(\"signature\")}\n placeholder=\"Type your full name\"\n style={{ fontFamily: `\"${selectedFont.family}\", cursive` }}\n autoFocus\n />\n </label>\n <label className=\"epochs-pdf-viewer__sign-type-field\">\n <span>Initials</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={typedInitials}\n onChange={(e) => {\n setInitialsTouched(true);\n setTypedInitials(e.target.value.toUpperCase());\n }}\n onFocus={() => setTypeKind(\"initials\")}\n placeholder=\"e.g. JD\"\n maxLength={4}\n style={{ fontFamily: `\"${selectedFont.family}\", cursive` }}\n />\n </label>\n </div>\n\n <div\n className=\"epochs-pdf-viewer__sign-type-kind\"\n role=\"group\"\n aria-label=\"Preview type\"\n >\n <button\n type=\"button\"\n className={\n typeKind === \"signature\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setTypeKind(\"signature\")}\n >\n Use full name\n </button>\n <button\n type=\"button\"\n className={\n typeKind === \"initials\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n }\n onClick={() => setTypeKind(\"initials\")}\n >\n Use initials\n </button>\n </div>\n </>\n ) : (\n <p className=\"epochs-pdf-viewer__sign-hint\">Draw your signature below</p>\n )}\n\n <canvas\n ref={canvasRef}\n className={\n mode === \"draw\"\n ? \"epochs-pdf-viewer__sign-canvas\"\n : \"epochs-pdf-viewer__sign-canvas epochs-pdf-viewer__sign-canvas--preview\"\n }\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerUp}\n />\n </>\n ) : activeFieldType === \"date\" ? (\n <label className=\"epochs-pdf-viewer__sign-type-field\" style={{ padding: \"1rem\" }}>\n <span>Date</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"date\"\n value={dateValue}\n onChange={(e) => setDateValue(e.target.value)}\n autoFocus\n />\n </label>\n ) : (\n <label className=\"epochs-pdf-viewer__sign-type-field\" style={{ padding: \"1rem\" }}>\n <span>Text</span>\n <input\n className=\"epochs-pdf-viewer__sign-type-input\"\n type=\"text\"\n value={textValue}\n onChange={(e) => setTextValue(e.target.value)}\n placeholder={textPlaceholder ?? \"Enter text\"}\n autoFocus\n />\n </label>\n )}\n\n <div className=\"epochs-pdf-viewer__modal-actions\">\n {showSignPad ? (\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={clearPad}\n >\n Clear\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={onClose}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--primary\"\n onClick={showSignPad ? trimAndSave : handleFieldValueSave}\n disabled={\n activeFieldType === \"date\" ? !dateValue\n : activeFieldType === \"text\" ? !textValue.trim()\n : false\n }\n >\n {showSignPad ? \"Use signature\" : \"Place on page\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction deriveInitials(name: string): string {\n const parts = name\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n if (parts.length === 0) return \"\";\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return parts\n .slice(0, 3)\n .map((part) => part[0]?.toUpperCase() ?? \"\")\n .join(\"\");\n}\n\n","/** Brand key used to identify toolbar tool components. */\nexport const TOOLBAR_TOOL_ID = \"__epochsToolbarToolId\" as const;\n\nexport type ToolbarToolId =\n | \"thumbnail\"\n | \"navigation\"\n | \"zoom\"\n | \"rotate\"\n | \"reload\"\n | \"print\"\n | \"open\"\n | \"download\"\n | \"highlight\"\n | \"underline\"\n | \"signature\"\n | \"text\"\n | \"erase\"\n | \"clear\";\n\nexport type ToolbarToolComponent = {\n (props?: Record<string, never>): null;\n displayName: string;\n readonly [TOOLBAR_TOOL_ID]: ToolbarToolId;\n};\n\nfunction createToolbarTool(\n id: ToolbarToolId,\n displayName: string,\n): ToolbarToolComponent {\n const Tool = (() => null) as ToolbarToolComponent;\n Tool.displayName = displayName;\n Object.defineProperty(Tool, TOOLBAR_TOOL_ID, {\n value: id,\n enumerable: true,\n });\n return Tool;\n}\n\nexport function getToolbarToolId(\n tool: ToolbarToolComponent,\n): ToolbarToolId {\n return tool[TOOLBAR_TOOL_ID];\n}\n\nexport function isToolbarTool(\n value: unknown,\n): value is ToolbarToolComponent {\n return (\n typeof value === \"function\" &&\n TOOLBAR_TOOL_ID in value &&\n typeof (value as ToolbarToolComponent)[TOOLBAR_TOOL_ID] === \"string\"\n );\n}\n\n/** Toggle thumbnails sidebar. */\nexport const Thumbnail = createToolbarTool(\"thumbnail\", \"Thumbnail\");\n/** Previous / next page and page number. */\nexport const Navigation = createToolbarTool(\"navigation\", \"Navigation\");\n/** Zoom out, zoom %, zoom in, and fit width. */\nexport const Zoom = createToolbarTool(\"zoom\", \"Zoom\");\n/** Rotate pages. */\nexport const Rotate = createToolbarTool(\"rotate\", \"Rotate\");\n/** Reload the PDF. */\nexport const Reload = createToolbarTool(\"reload\", \"Reload\");\n/** Print (includes markup). */\nexport const Print = createToolbarTool(\"print\", \"Print\");\n/** Open PDF in a new tab. */\nexport const Open = createToolbarTool(\"open\", \"Open\");\n/** Download PDF (with markup when present). */\nexport const Download = createToolbarTool(\"download\", \"Download\");\n/** Highlight text markup tool. */\nexport const Highlight = createToolbarTool(\"highlight\", \"Highlight\");\n/** Underline text markup tool. */\nexport const Underline = createToolbarTool(\"underline\", \"Underline\");\n/** E-signature tool. */\nexport const Signature = createToolbarTool(\"signature\", \"Signature\");\n/** Add / edit free text on the page. */\nexport const AddText = createToolbarTool(\"text\", \"AddText\");\n/** Erase markup annotations. */\nexport const Erase = createToolbarTool(\"erase\", \"Erase\");\n/** Clear all markup. */\nexport const Clear = createToolbarTool(\"clear\", \"Clear\");\n\nexport const ALL_TOOLBAR_TOOLS = [\n Thumbnail,\n Navigation,\n Zoom,\n Rotate,\n Highlight,\n Underline,\n Signature,\n AddText,\n Erase,\n Clear,\n Reload,\n Print,\n Open,\n Download,\n] as const;\n\n/** Default left / right toolbar layout. */\nexport const DEFAULT_TOOLBAR_LAYOUT: [\n ToolbarToolComponent[],\n ToolbarToolComponent[],\n] = [\n [Thumbnail, Navigation],\n [\n Zoom,\n Rotate,\n Highlight,\n Underline,\n Signature,\n AddText,\n Erase,\n Clear,\n Reload,\n Print,\n Open,\n Download,\n ],\n];\n","import type { ReactNode } from \"react\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n EraserIcon,\n ExternalLinkIcon,\n GridIcon,\n HighlightIcon,\n MinusIcon,\n PlusIcon,\n PrinterIcon,\n RefreshIcon,\n RotateIcon,\n SignatureIcon,\n TextIcon,\n UnderlineIcon,\n} from \"./icons\";\nimport type { MarkupTool } from \"./markup\";\nimport {\n HIGHLIGHT_PRESETS,\n UNDERLINE_PRESETS,\n normalizeHex,\n} from \"./markup\";\nimport type { ToolbarToolId } from \"./toolbarTools\";\n\nexport type ToolbarRenderContext = {\n status: string;\n showThumbnails: boolean;\n setShowThumbnails: (updater: (v: boolean) => boolean) => void;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n pageNumber: number;\n numPages: number;\n scrollToPage: (page: number) => void;\n scale: number;\n handleZoomOut: () => void;\n handleZoomIn: () => void;\n handleFitWidth: () => void | Promise<void>;\n handleRotate: () => void;\n markupTool: MarkupTool;\n toggleMarkupTool: (tool: Exclude<MarkupTool, \"none\">) => void;\n hasFixedSignatureFields: boolean;\n hasFixedTextFields: boolean;\n pendingSignature: { imageDataUrl: string; width: number; height: number } | null;\n setMarkupTool: (tool: MarkupTool) => void;\n setSignaturePadOpen: (open: boolean) => void;\n annotationsLength: number;\n signaturesLength: number;\n textsLength: number;\n handleClearAnnotations: () => void;\n highlightHex: string;\n underlineHex: string;\n setHighlightHex: (hex: string) => void;\n setUnderlineHex: (hex: string) => void;\n loadDocument: () => void | Promise<void>;\n handlePrint: () => void | Promise<void>;\n isPrinting: boolean;\n pdfDoc: unknown;\n displayUrl: string | null;\n resolvedUrl: string;\n handleDownload: () => void | Promise<void>;\n isDownloading: boolean;\n};\n\nconst MARKUP_TOOLS: ToolbarToolId[] = [\n \"highlight\",\n \"underline\",\n \"signature\",\n \"text\",\n \"erase\",\n \"clear\",\n];\n\nexport function isMarkupToolbarTool(id: ToolbarToolId): boolean {\n return MARKUP_TOOLS.includes(id);\n}\n\nexport function renderToolbarTool(\n id: ToolbarToolId,\n ctx: ToolbarRenderContext,\n options?: { showMarkupSep?: boolean },\n): ReactNode {\n const nodes: ReactNode[] = [];\n\n if (options?.showMarkupSep) {\n nodes.push(\n <span\n key={`${id}-sep`}\n className=\"epochs-pdf-viewer__toolbar-sep\"\n aria-hidden=\"true\"\n />,\n );\n }\n\n switch (id) {\n case \"thumbnail\":\n nodes.push(\n <button\n key=\"thumbnail\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => ctx.setShowThumbnails((v) => !v)}\n title={ctx.showThumbnails ? \"Hide thumbnails\" : \"Show thumbnails\"}\n >\n <GridIcon />\n </button>,\n );\n break;\n\n case \"navigation\":\n nodes.push(\n <button\n key=\"nav-prev\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handlePrev}\n disabled={!ctx.canGoPrev || ctx.status !== \"ready\"}\n title=\"Previous page\"\n >\n <ChevronLeftIcon />\n </button>,\n <div key=\"nav-page\" className=\"epochs-pdf-viewer__page-input\">\n <input\n type=\"number\"\n value={ctx.pageNumber}\n min={1}\n max={ctx.numPages || 1}\n onChange={(e) => {\n const next = Number.parseInt(e.target.value, 10);\n if (!Number.isFinite(next)) return;\n ctx.scrollToPage(\n Math.max(1, Math.min(ctx.numPages || 1, next)),\n );\n }}\n disabled={ctx.status !== \"ready\"}\n aria-label=\"Page number\"\n />\n <span>/ {ctx.numPages || \"-\"}</span>\n </div>,\n <button\n key=\"nav-next\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleNext}\n disabled={!ctx.canGoNext || ctx.status !== \"ready\"}\n title=\"Next page\"\n >\n <ChevronRightIcon />\n </button>,\n );\n break;\n\n case \"zoom\":\n nodes.push(\n <button\n key=\"zoom-out\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleZoomOut}\n disabled={ctx.status !== \"ready\"}\n title=\"Zoom out\"\n >\n <MinusIcon />\n </button>,\n <span key=\"zoom-label\" className=\"epochs-pdf-viewer__zoom-label\">\n {Math.round(ctx.scale * 100)}%\n </span>,\n <button\n key=\"zoom-in\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleZoomIn}\n disabled={ctx.status !== \"ready\"}\n title=\"Zoom in\"\n >\n <PlusIcon />\n </button>,\n <button\n key=\"zoom-fit\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={() => void ctx.handleFitWidth()}\n disabled={ctx.status !== \"ready\"}\n title=\"Fit to width\"\n >\n Fit\n </button>,\n );\n break;\n\n case \"rotate\":\n nodes.push(\n <button\n key=\"rotate\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={ctx.handleRotate}\n disabled={ctx.status !== \"ready\"}\n title=\"Rotate\"\n >\n <RotateIcon />\n </button>,\n );\n break;\n\n case \"highlight\":\n nodes.push(\n <button\n key=\"highlight\"\n type=\"button\"\n className={\n ctx.markupTool === \"highlight\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"highlight\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Highlight text — select text to highlight\"\n >\n <HighlightIcon />\n </button>,\n );\n break;\n\n case \"underline\":\n nodes.push(\n <button\n key=\"underline\"\n type=\"button\"\n className={\n ctx.markupTool === \"underline\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"underline\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Underline text — select text to underline\"\n >\n <UnderlineIcon />\n </button>,\n );\n break;\n\n case \"signature\":\n nodes.push(\n <button\n key=\"signature\"\n type=\"button\"\n className={\n ctx.markupTool === \"sign\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => {\n if (\n !ctx.hasFixedSignatureFields &&\n ctx.pendingSignature &&\n ctx.markupTool !== \"sign\"\n ) {\n ctx.setMarkupTool(\"sign\");\n return;\n }\n ctx.setSignaturePadOpen(true);\n }}\n disabled={ctx.status !== \"ready\"}\n title={\n ctx.hasFixedSignatureFields\n ? \"Create e-signature for a fixed field\"\n : ctx.pendingSignature\n ? \"Place signature — click on the page, then drag to move\"\n : \"Create e-signature\"\n }\n >\n <SignatureIcon />\n </button>,\n );\n break;\n\n case \"text\":\n nodes.push(\n <button\n key=\"text\"\n type=\"button\"\n className={\n ctx.markupTool === \"text\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"text\")}\n disabled={ctx.status !== \"ready\"}\n title={\n ctx.hasFixedTextFields\n ? \"Edit text in predefined areas — click to type\"\n : \"Edit PDF text — select words, then change them\"\n }\n >\n <TextIcon />\n </button>,\n );\n break;\n\n case \"erase\":\n nodes.push(\n <button\n key=\"erase\"\n type=\"button\"\n className={\n ctx.markupTool === \"erase\"\n ? \"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--active\"\n : \"epochs-pdf-viewer__btn\"\n }\n onClick={() => ctx.toggleMarkupTool(\"erase\")}\n disabled={ctx.status !== \"ready\"}\n title=\"Remove text — select PDF words to cover them, or click added markup\"\n >\n <EraserIcon />\n </button>,\n );\n break;\n\n case \"clear\":\n nodes.push(\n <button\n key=\"clear\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n onClick={ctx.handleClearAnnotations}\n disabled={\n ctx.status !== \"ready\" ||\n (ctx.annotationsLength === 0 &&\n ctx.signaturesLength === 0 &&\n ctx.textsLength === 0)\n }\n title=\"Clear all markup\"\n >\n Clear\n </button>,\n );\n break;\n\n case \"reload\":\n nodes.push(\n <button\n key=\"reload\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.loadDocument()}\n title=\"Reload\"\n >\n <RefreshIcon />\n </button>,\n );\n break;\n\n case \"print\":\n nodes.push(\n <button\n key=\"print\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.handlePrint()}\n disabled={ctx.status !== \"ready\" || !ctx.pdfDoc || ctx.isPrinting}\n title={\n ctx.isPrinting\n ? \"Preparing print…\"\n : \"Print (includes highlights & underlines)\"\n }\n >\n <PrinterIcon />\n </button>,\n );\n break;\n\n case \"open\":\n nodes.push(\n <a\n key=\"open\"\n className=\"epochs-pdf-viewer__btn\"\n href={ctx.displayUrl || ctx.resolvedUrl || undefined}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"Open in new tab\"\n >\n <ExternalLinkIcon />\n </a>,\n );\n break;\n\n case \"download\":\n nodes.push(\n <button\n key=\"download\"\n type=\"button\"\n className=\"epochs-pdf-viewer__btn\"\n onClick={() => void ctx.handleDownload()}\n disabled={\n ctx.status !== \"ready\" || !ctx.pdfDoc || ctx.isDownloading\n }\n title={\n ctx.isDownloading\n ? \"Preparing download…\"\n : ctx.annotationsLength > 0 ||\n ctx.signaturesLength > 0 ||\n ctx.textsLength > 0\n ? \"Download PDF with markup\"\n : \"Download PDF\"\n }\n >\n <DownloadIcon />\n </button>,\n );\n break;\n\n default:\n break;\n }\n\n return nodes.length > 0 ? nodes : null;\n}\n\nexport function renderMarkupExtras(\n ctx: ToolbarRenderContext,\n enabledIds: Set<ToolbarToolId>,\n): ReactNode {\n const nodes: ReactNode[] = [];\n\n if (\n ctx.markupTool === \"sign\" &&\n ctx.pendingSignature &&\n !ctx.hasFixedSignatureFields &&\n enabledIds.has(\"signature\")\n ) {\n nodes.push(\n <span key=\"sign-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n Click page to place duplicate/new signature\n </span>,\n );\n }\n\n if (\n ctx.markupTool === \"text\" &&\n enabledIds.has(\"text\")\n ) {\n nodes.push(\n <span key=\"text-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n {ctx.hasFixedTextFields\n ? \"Click in a predefined text area to type\"\n : \"Select text to edit it — e.g. change this PDF to this is PDF\"}\n </span>,\n );\n }\n\n if (\n ctx.markupTool === \"erase\" &&\n enabledIds.has(\"erase\")\n ) {\n nodes.push(\n <span key=\"erase-hint\" className=\"epochs-pdf-viewer__markup-hint\">\n Select PDF words to remove · click added text/markup to erase\n </span>,\n );\n }\n\n if (\n (ctx.markupTool === \"highlight\" && enabledIds.has(\"highlight\")) ||\n (ctx.markupTool === \"underline\" && enabledIds.has(\"underline\"))\n ) {\n const activeMarkupHex =\n ctx.markupTool === \"highlight\" ? ctx.highlightHex : ctx.underlineHex;\n const setActiveMarkupHex =\n ctx.markupTool === \"highlight\" ? ctx.setHighlightHex : ctx.setUnderlineHex;\n const activePresets =\n ctx.markupTool === \"highlight\" ? HIGHLIGHT_PRESETS : UNDERLINE_PRESETS;\n\n nodes.push(\n <div\n key=\"color-picker\"\n className=\"epochs-pdf-viewer__color-picker\"\n role=\"group\"\n aria-label={`${ctx.markupTool} color`}\n >\n {activePresets.map((preset) => (\n <button\n key={preset.id}\n type=\"button\"\n className={\n normalizeHex(activeMarkupHex) === normalizeHex(preset.hex)\n ? \"epochs-pdf-viewer__swatch epochs-pdf-viewer__swatch--active\"\n : \"epochs-pdf-viewer__swatch\"\n }\n style={{ background: preset.hex }}\n title={preset.label}\n aria-label={preset.label}\n aria-pressed={\n normalizeHex(activeMarkupHex) === normalizeHex(preset.hex)\n }\n onClick={() => setActiveMarkupHex(normalizeHex(preset.hex))}\n />\n ))}\n <label\n className=\"epochs-pdf-viewer__custom-color\"\n title=\"Custom color\"\n >\n <span\n className=\"epochs-pdf-viewer__custom-color-chip\"\n style={{ background: activeMarkupHex }}\n />\n <input\n type=\"color\"\n value={normalizeHex(activeMarkupHex)}\n onChange={(e) =>\n setActiveMarkupHex(normalizeHex(e.target.value))\n }\n aria-label=\"Custom color\"\n />\n </label>\n </div>,\n );\n }\n\n return nodes.length > 0 ? nodes : null;\n}\n","import {\n Fragment,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from \"react\";\nimport { PageCanvas } from \"./PageCanvas\";\nimport { Thumbnail as ThumbnailStrip } from \"./Thumbnail\";\nimport {\n ensurePdfWorker,\n pdfjsLib,\n resolvePdfUrl,\n sourceToArrayBuffer,\n} from \"./load\";\nimport type { PdfDoc, PdfViewerProps, ToolbarLayout, ViewerStatus } from \"./types\";\nimport type { MarkupAnnotation, MarkupTool } from \"./markup\";\nimport {\n DEFAULT_HIGHLIGHT_HEX,\n DEFAULT_UNDERLINE_HEX,\n hexToMarkupColor,\n} from \"./markup\";\nimport {\n buildPdfFromJpegPages,\n renderAllPagesWithMarkup,\n triggerBlobDownload,\n} from \"./exportPages\";\nimport { SignaturePad } from \"./SignaturePad\";\nimport type { SignatureAnnotation, SignatureField } from \"./signature\";\nimport { createSignatureId, signatureDisplaySize } from \"./signature\";\nimport { pageSizeFromSurface, viewportRectToPage } from \"./coords\";\nimport type { TextAnnotation } from \"./text\";\nimport {\n DEFAULT_TEXT_COLOR,\n DEFAULT_TEXT_FONT_SIZE,\n} from \"./text\";\nimport {\n DEFAULT_TOOLBAR_LAYOUT,\n getToolbarToolId,\n isToolbarTool,\n type ToolbarToolComponent,\n type ToolbarToolId,\n} from \"./toolbarTools\";\nimport {\n isMarkupToolbarTool,\n renderMarkupExtras,\n renderToolbarTool,\n type ToolbarRenderContext,\n} from \"./ToolbarButtons\";\nimport \"./PdfViewer.css\";\n\nfunction resolveToolbarLayout(\n enableToolbar: boolean | ToolbarLayout | undefined,\n flags: {\n enableThumbnails?: boolean;\n enableNavigation: boolean;\n enableZoom: boolean;\n enableRotate: boolean;\n enableReload: boolean;\n enablePrint: boolean;\n enableOpen: boolean;\n enableDownload: boolean;\n enableHighlight: boolean;\n enableUnderline: boolean;\n enableSignature: boolean;\n enableText: boolean;\n enableErase: boolean;\n enableClear: boolean;\n },\n): { left: ToolbarToolId[]; right: ToolbarToolId[] } | null {\n if (!enableToolbar) return null;\n\n if (Array.isArray(enableToolbar)) {\n const toIds = (side: ToolbarToolComponent[] | undefined) =>\n (side ?? [])\n .filter(isToolbarTool)\n .map(getToolbarToolId);\n\n return {\n left: toIds(enableToolbar[0]),\n right: toIds(enableToolbar[1]),\n };\n }\n\n const showThumbnailsToggle = flags.enableThumbnails;\n const filterByFlag = (\n tools: readonly ToolbarToolComponent[],\n enabled: Partial<Record<ToolbarToolId, boolean>>,\n ) =>\n tools\n .map(getToolbarToolId)\n .filter((id) => enabled[id] !== false);\n\n const flagMap: Partial<Record<ToolbarToolId, boolean>> = {\n thumbnail: showThumbnailsToggle,\n navigation: flags.enableNavigation,\n zoom: flags.enableZoom,\n rotate: flags.enableRotate,\n reload: flags.enableReload,\n print: flags.enablePrint,\n open: flags.enableOpen,\n download: flags.enableDownload,\n highlight: flags.enableHighlight,\n underline: flags.enableUnderline,\n signature: flags.enableSignature,\n text: flags.enableText,\n erase: flags.enableErase,\n clear: flags.enableClear,\n };\n\n return {\n left: filterByFlag(DEFAULT_TOOLBAR_LAYOUT[0], flagMap),\n right: filterByFlag(DEFAULT_TOOLBAR_LAYOUT[1], flagMap),\n };\n}\n\nexport function PdfViewer({\n file,\n fileUrl,\n baseUrl = \"\",\n fetchOptions,\n height = \"80vh\",\n title = \"PDF document\",\n initialScale = 1,\n withThumbnails = false,\n thumbnailWidth = 140,\n maxThumbnails = 60,\n className,\n workerSrc,\n enableToolbar = false,\n enableThumbnails,\n enableNavigation = true,\n enableZoom = true,\n enableRotate = true,\n enableReload = true,\n enablePrint = true,\n enableOpen = true,\n enableDownload = true,\n enableMarkup = true,\n enableHighlight = true,\n enableUnderline = true,\n enableSignature = true,\n enableText = true,\n enableErase = true,\n enableClear = true,\n signatureFields = [],\n textFields = [],\n onSignatureComplete,\n onFieldValueComplete,\n openSignaturePad: externalOpenSignaturePad = false,\n onSignaturePadClose,\n onSubmit,\n submitLabel = \"Submit\",\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const lastBlobUrlRef = useRef<string | null>(null);\n const pageRefsRef = useRef(new Map<number, HTMLDivElement | null>());\n const isProgrammaticScrollRef = useRef(false);\n\n const binarySource = useMemo(() => {\n if (file && typeof file !== \"string\") return file;\n return null;\n }, [file]);\n\n const resolvedUrl = useMemo(() => {\n if (binarySource) return \"\";\n const asString =\n typeof file === \"string\" ? file : undefined;\n return resolvePdfUrl(asString, fileUrl, baseUrl);\n }, [binarySource, file, fileUrl, baseUrl]);\n\n const [status, setStatus] = useState<ViewerStatus>(\"idle\");\n const [pdfDoc, setPdfDoc] = useState<PdfDoc | null>(null);\n const [numPages, setNumPages] = useState(0);\n const [pageNumber, setPageNumber] = useState(1);\n const [scale, setScale] = useState(initialScale);\n const [rotation, setRotation] = useState(0);\n const [displayUrl, setDisplayUrl] = useState<string | null>(null);\n const [showThumbnails, setShowThumbnails] = useState(false);\n const [isPrinting, setIsPrinting] = useState(false);\n const [isDownloading, setIsDownloading] = useState(false);\n const [markupTool, setMarkupTool] = useState<MarkupTool>(\"none\");\n const [annotations, setAnnotations] = useState<MarkupAnnotation[]>([]);\n const [signatures, setSignatures] = useState<SignatureAnnotation[]>([]);\n const [texts, setTexts] = useState<TextAnnotation[]>([]);\n const [signaturePadOpen, setSignaturePadOpen] = useState(false);\n const [signaturePadFieldType, setSignaturePadFieldType] = useState<\n import(\"./signature\").SignatureFieldType | undefined\n >(undefined);\n const [pendingSignature, setPendingSignature] = useState<{\n imageDataUrl: string;\n width: number;\n height: number;\n } | null>(null);\n const [selectedSignatureId, setSelectedSignatureId] = useState<string | null>(\n null,\n );\n const [selectedSignatureFieldId, setSelectedSignatureFieldId] = useState<string | null>(\n null,\n );\n const [editingSignatureId, setEditingSignatureId] = useState<string | null>(null);\n const [selectedTextId, setSelectedTextId] = useState<string | null>(null);\n const [selectedTextFieldId, setSelectedTextFieldId] = useState<string | null>(null);\n const [editingTextId, setEditingTextId] = useState<string | null>(null);\n const [highlightHex, setHighlightHex] = useState(DEFAULT_HIGHLIGHT_HEX);\n const [underlineHex, setUnderlineHex] = useState(DEFAULT_UNDERLINE_HEX);\n const hasFixedSignatureFields = signatureFields.length > 0;\n const hasFixedTextFields = textFields.length > 0;\n const [fieldValues, setFieldValues] = useState<Record<string, string>>({});\n\n useEffect(() => {\n if (externalOpenSignaturePad) {\n setSignaturePadOpen(true);\n }\n }, [externalOpenSignaturePad]);\n\n const toolbarSides = useMemo(\n () =>\n resolveToolbarLayout(enableToolbar, {\n enableThumbnails,\n enableNavigation,\n enableZoom,\n enableRotate,\n enableReload,\n enablePrint,\n enableOpen,\n enableDownload,\n enableHighlight,\n enableUnderline,\n enableSignature,\n enableText,\n enableErase,\n enableClear,\n }),\n [\n enableToolbar,\n enableThumbnails,\n enableNavigation,\n enableZoom,\n enableRotate,\n enableReload,\n enablePrint,\n enableOpen,\n enableDownload,\n enableHighlight,\n enableUnderline,\n enableSignature,\n enableText,\n enableErase,\n enableClear,\n ],\n );\n\n const enabledToolIds = useMemo(() => {\n if (!toolbarSides) return new Set<ToolbarToolId>();\n return new Set([...toolbarSides.left, ...toolbarSides.right]);\n }, [toolbarSides]);\n\n useEffect(() => {\n const hasThumbTool = enabledToolIds.has(\"thumbnail\");\n if (!hasThumbTool) {\n setShowThumbnails(false);\n return;\n }\n\n const mq = window.matchMedia(\"(max-width: 720px)\");\n const apply = () => {\n // Mobile: hide thumbnails by default. Desktop: respect withThumbnails.\n setShowThumbnails(mq.matches ? false : withThumbnails);\n };\n apply();\n mq.addEventListener(\"change\", apply);\n return () => mq.removeEventListener(\"change\", apply);\n }, [enabledToolIds, withThumbnails]);\n\n const showHighlight =\n !hasFixedSignatureFields && enabledToolIds.has(\"highlight\");\n const showUnderline =\n !hasFixedSignatureFields && enabledToolIds.has(\"underline\");\n const showSignature =\n enabledToolIds.has(\"signature\") || hasFixedSignatureFields;\n const showText = enabledToolIds.has(\"text\") || hasFixedTextFields;\n const showErase = !hasFixedSignatureFields && enabledToolIds.has(\"erase\");\n\n const revokeDisplayUrl = useCallback(() => {\n if (lastBlobUrlRef.current) {\n URL.revokeObjectURL(lastBlobUrlRef.current);\n lastBlobUrlRef.current = null;\n }\n }, []);\n\n const loadDocument = useCallback(async () => {\n if (!binarySource && !resolvedUrl) return;\n\n ensurePdfWorker(workerSrc);\n setStatus(\"loading\");\n setPdfDoc(null);\n setNumPages(0);\n setPageNumber(1);\n setAnnotations([]);\n setSignatures([]);\n setTexts([]);\n setPendingSignature(null);\n setSelectedSignatureId(null);\n setSelectedSignatureFieldId(null);\n setEditingSignatureId(null);\n setSelectedTextId(null);\n setSelectedTextFieldId(null);\n setEditingTextId(null);\n setMarkupTool(\"none\");\n\n try {\n const buffer = binarySource\n ? await sourceToArrayBuffer(binarySource, fetchOptions)\n : await sourceToArrayBuffer(resolvedUrl, fetchOptions);\n\n const blob = new Blob([buffer], { type: \"application/pdf\" });\n const blobUrl = URL.createObjectURL(blob);\n revokeDisplayUrl();\n lastBlobUrlRef.current = blobUrl;\n setDisplayUrl(blobUrl);\n\n const loadingTask = pdfjsLib.getDocument({\n data: buffer,\n cMapUrl: `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/cmaps/`,\n cMapPacked: true,\n standardFontDataUrl: `https://unpkg.com/pdfjs-dist@${pdfjsLib.version}/standard_fonts/`,\n });\n const doc = await loadingTask.promise;\n setPdfDoc(doc);\n setNumPages(doc.numPages);\n setStatus(\"ready\");\n } catch {\n setStatus(\"error\");\n }\n }, [\n binarySource,\n resolvedUrl,\n fetchOptions,\n revokeDisplayUrl,\n workerSrc,\n ]);\n\n useEffect(() => {\n if (!binarySource && !resolvedUrl) {\n setStatus(\"idle\");\n setPdfDoc(null);\n setNumPages(0);\n setDisplayUrl(null);\n revokeDisplayUrl();\n return;\n }\n\n void loadDocument();\n\n return () => {\n revokeDisplayUrl();\n };\n }, [binarySource, resolvedUrl, loadDocument, revokeDisplayUrl]);\n\n useEffect(() => {\n if (markupTool === \"highlight\" && !showHighlight) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"underline\" && !showUnderline) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"sign\" && !showSignature) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"text\" && !showText) {\n setMarkupTool(\"none\");\n } else if (markupTool === \"erase\" && !showErase) {\n setMarkupTool(\"none\");\n }\n }, [showHighlight, showUnderline, showSignature, showText, showErase, markupTool]);\n\n const scrollToPage = useCallback(\n (targetPage: number) => {\n const clamped = Math.max(1, Math.min(numPages || 1, targetPage));\n const el = pageRefsRef.current.get(clamped);\n if (!el) {\n setPageNumber(clamped);\n return;\n }\n\n isProgrammaticScrollRef.current = true;\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n setPageNumber(clamped);\n window.setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n }, 500);\n },\n [numPages],\n );\n\n const scrollToSignatureField = useCallback(\n (field: SignatureField) => {\n const pageEl = pageRefsRef.current.get(field.pageNumber);\n if (pageEl) {\n isProgrammaticScrollRef.current = true;\n setPageNumber(field.pageNumber);\n }\n\n const focusField = () => {\n const fieldEl = containerRef.current?.querySelector(\n `[data-signature-field-id=\"${CSS.escape(field.id)}\"]`,\n ) as HTMLElement | null;\n\n if (fieldEl) {\n fieldEl.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n } else if (pageEl) {\n pageEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n\n window.setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n }, 500);\n };\n\n window.requestAnimationFrame(() => {\n window.setTimeout(focusField, 40);\n });\n },\n [],\n );\n\n useEffect(() => {\n if (status !== \"ready\" || !containerRef.current || !numPages) return;\n\n const container = containerRef.current;\n const observer = new IntersectionObserver(\n (entries) => {\n if (isProgrammaticScrollRef.current) return;\n\n let best: { page: number; ratio: number } | null = null;\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n const page = Number.parseInt(\n (e.target as HTMLElement).dataset.pageNumber || \"0\",\n 10,\n );\n if (!page) continue;\n if (!best || e.intersectionRatio > best.ratio) {\n best = { page, ratio: e.intersectionRatio };\n }\n }\n if (best) setPageNumber(best.page);\n },\n {\n root: container,\n threshold: [0.25, 0.5, 0.75],\n },\n );\n\n for (let p = 1; p <= numPages; p += 1) {\n const el = pageRefsRef.current.get(p);\n if (el) observer.observe(el);\n }\n\n return () => observer.disconnect();\n }, [status, numPages]);\n\n const canGoPrev = pageNumber > 1;\n const canGoNext = numPages ? pageNumber < numPages : false;\n\n const handlePrev = useCallback(() => {\n if (!canGoPrev) return;\n scrollToPage(pageNumber - 1);\n }, [canGoPrev, pageNumber, scrollToPage]);\n\n const handleNext = useCallback(() => {\n if (!canGoNext) return;\n scrollToPage(pageNumber + 1);\n }, [canGoNext, pageNumber, scrollToPage]);\n\n const handleRotate = useCallback(() => {\n setRotation((r) => (r + 90) % 360);\n }, []);\n\n const handleZoomOut = useCallback(() => {\n setScale((s) => Math.max(0.25, Math.round((s - 0.1) * 100) / 100));\n }, []);\n\n const handleZoomIn = useCallback(() => {\n setScale((s) => Math.min(5, Math.round((s + 0.1) * 100) / 100));\n }, []);\n\n const handleFitWidth = useCallback(async () => {\n if (!pdfDoc || !containerRef.current) return;\n try {\n const page = await pdfDoc.getPage(pageNumber);\n const viewportAt1 = page.getViewport({ scale: 1, rotation });\n // Body already excludes the thumbnail rail; subtract page padding only.\n const isMobile = window.matchMedia(\"(max-width: 720px)\").matches;\n const pagePadding = isMobile ? 16 : 24;\n const containerWidth = Math.max(\n 0,\n containerRef.current.clientWidth - pagePadding,\n );\n const nextScale = containerWidth / viewportAt1.width;\n setScale(Math.max(0.25, Math.min(5, Math.round(nextScale * 100) / 100)));\n } catch {\n // ignore\n }\n }, [pdfDoc, pageNumber, rotation]);\n\n // On mobile, auto-fit so fixed-field coordinates/dimensions stay aligned.\n useEffect(() => {\n if (status !== \"ready\" || !pdfDoc) return;\n if (!window.matchMedia(\"(max-width: 720px)\").matches) return;\n\n let cancelled = false;\n const run = () => {\n if (!cancelled) void handleFitWidth();\n };\n run();\n\n const container = containerRef.current;\n const observer =\n typeof ResizeObserver !== \"undefined\" && container\n ? new ResizeObserver(() => run())\n : null;\n observer?.observe(container!);\n\n const mq = window.matchMedia(\"(max-width: 720px)\");\n const onMq = () => {\n if (mq.matches) run();\n };\n mq.addEventListener(\"change\", onMq);\n\n return () => {\n cancelled = true;\n observer?.disconnect();\n mq.removeEventListener(\"change\", onMq);\n };\n }, [status, pdfDoc, showThumbnails, rotation, handleFitWidth]);\n\n const handlePrint = useCallback(async () => {\n if (!pdfDoc || status !== \"ready\") return;\n\n setIsPrinting(true);\n try {\n // Render in the main document — pdf.js fonts break on iframe canvases.\n const pages = await renderAllPagesWithMarkup(pdfDoc, {\n scale: 1.5,\n rotation,\n annotations,\n signatures,\n texts,\n mimeType: \"image/png\",\n });\n\n const iframe = document.createElement(\"iframe\");\n iframe.style.position = \"fixed\";\n iframe.style.right = \"0\";\n iframe.style.bottom = \"0\";\n iframe.style.width = \"0\";\n iframe.style.height = \"0\";\n iframe.style.border = \"0\";\n iframe.setAttribute(\"aria-hidden\", \"true\");\n document.body.appendChild(iframe);\n\n const doc = iframe.contentWindow?.document;\n if (!doc) throw new Error(\"print iframe not available\");\n\n doc.open();\n doc.write(`<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\" />\n <title>${title.replace(/</g, \"<\")}</title>\n <style>\n html, body { margin: 0; padding: 0; }\n img { width: 100%; display: block; }\n .page { page-break-after: always; }\n .page:last-child { page-break-after: auto; }\n @page { margin: 10mm; }\n </style>\n </head>\n <body></body>\n</html>`);\n doc.close();\n\n const body = doc.body;\n for (const page of pages) {\n const img = doc.createElement(\"img\");\n img.src = page.dataUrl;\n const wrapper = doc.createElement(\"div\");\n wrapper.className = \"page\";\n wrapper.appendChild(img);\n body.appendChild(wrapper);\n }\n\n // Wait for images to decode before printing\n await Promise.all(\n Array.from(body.querySelectorAll(\"img\")).map(\n (img) =>\n img.decode?.().catch(() => undefined) ?? Promise.resolve(),\n ),\n );\n\n setTimeout(() => {\n try {\n iframe.contentWindow?.focus();\n iframe.contentWindow?.print();\n } finally {\n setTimeout(() => {\n try {\n document.body.removeChild(iframe);\n } catch {\n // ignore\n }\n }, 1000);\n }\n }, 50);\n } catch {\n try {\n if (displayUrl) {\n window.open(displayUrl, \"_blank\", \"noopener,noreferrer\");\n } else if (resolvedUrl) {\n window.open(resolvedUrl, \"_blank\", \"noopener,noreferrer\");\n }\n } catch {\n // ignore\n }\n } finally {\n setIsPrinting(false);\n }\n }, [pdfDoc, status, rotation, title, displayUrl, resolvedUrl, annotations, signatures, texts]);\n\n const handleDownload = useCallback(async () => {\n if (!pdfDoc || status !== \"ready\") return;\n\n const filename = `${title.replace(/[^\\w.-]+/g, \"_\") || \"document\"}.pdf`;\n const hasLayers =\n annotations.length > 0 || signatures.length > 0 || texts.length > 0;\n\n // No markup → keep original PDF bytes\n if (!hasLayers && displayUrl) {\n triggerBlobDownload(\n await fetch(displayUrl).then((r) => r.blob()),\n filename,\n );\n return;\n }\n\n setIsDownloading(true);\n try {\n const pages = await renderAllPagesWithMarkup(pdfDoc, {\n scale: 2,\n rotation,\n annotations,\n signatures,\n texts,\n mimeType: \"image/jpeg\",\n quality: 0.92,\n });\n const pdfBytes = buildPdfFromJpegPages(pages);\n const copy = new Uint8Array(pdfBytes.byteLength);\n copy.set(pdfBytes);\n triggerBlobDownload(\n new Blob([copy], { type: \"application/pdf\" }),\n filename,\n );\n } catch {\n if (displayUrl) {\n triggerBlobDownload(\n await fetch(displayUrl).then((r) => r.blob()),\n filename,\n );\n }\n } finally {\n setIsDownloading(false);\n }\n }, [pdfDoc, status, rotation, title, displayUrl, annotations, signatures, texts]);\n\n const toggleMarkupTool = useCallback((tool: MarkupTool) => {\n setMarkupTool((current) => (current === tool ? \"none\" : tool));\n }, []);\n\n const activeMarkupHex =\n markupTool === \"highlight\"\n ? highlightHex\n : markupTool === \"underline\"\n ? underlineHex\n : null;\n\n const activeMarkupColor =\n markupTool === \"highlight\" || markupTool === \"underline\"\n ? hexToMarkupColor(activeMarkupHex!, markupTool)\n : undefined;\n\n const selectedSignature =\n selectedSignatureId != null\n ? signatures.find((sig) => sig.id === selectedSignatureId) ?? null\n : null;\n\n const handleAddAnnotation = useCallback((annotation: MarkupAnnotation) => {\n setAnnotations((prev) => [...prev, annotation]);\n }, []);\n\n const handleRemoveAnnotation = useCallback((id: string) => {\n setAnnotations((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n const handleClearAnnotations = useCallback(() => {\n setAnnotations([]);\n setSignatures([]);\n setTexts([]);\n setSelectedSignatureId(null);\n setSelectedTextId(null);\n setSelectedTextFieldId(null);\n setEditingTextId(null);\n }, []);\n\n const handleOpenSignaturePad = useCallback(\n (fieldType?: import(\"./signature\").SignatureFieldType) => {\n setSignaturePadFieldType(fieldType);\n setSignaturePadOpen(true);\n },\n [],\n );\n\n const handleFieldValueChange = useCallback((fieldId: string, value: string) => {\n setFieldValues((prev) => ({ ...prev, [fieldId]: value }));\n }, []);\n\n const handleFieldValueCommit = useCallback(\n (fieldId: string) => {\n const val = fieldValues[fieldId];\n if (val) onFieldValueComplete?.(fieldId, val);\n\n const currentIndex = signatureFields.findIndex((f) => f.id === fieldId);\n const filledIds = new Set(\n Object.keys(fieldValues).filter((k) => fieldValues[k]?.trim()),\n );\n filledIds.add(fieldId);\n const nextField =\n signatureFields.slice(currentIndex + 1).find(\n (f) => !filledIds.has(f.id) && !signatures.some((sig) => sig.fieldId === f.id),\n ) ??\n signatureFields.slice(0, Math.max(0, currentIndex)).find(\n (f) => !filledIds.has(f.id) && !signatures.some((sig) => sig.fieldId === f.id),\n );\n if (nextField) {\n setSelectedSignatureFieldId(nextField.id);\n scrollToSignatureField(nextField);\n const nextType = (nextField as any).type as string | undefined;\n if (nextType === \"sign\" || !nextType) {\n window.setTimeout(() => setSignaturePadOpen(true), 350);\n }\n }\n },\n [signatureFields, fieldValues, signatures, scrollToSignatureField],\n );\n\n const handleSignatureSave = useCallback(\n (imageDataUrl: string, sourceWidth: number, sourceHeight: number) => {\n const size = signatureDisplaySize(sourceWidth, sourceHeight);\n\n if (editingSignatureId) {\n setSignatures((prev) =>\n prev.map((sig) =>\n sig.id === editingSignatureId\n ? {\n ...sig,\n imageDataUrl,\n width: sig.fieldId ? sig.width : size.width,\n height: sig.fieldId ? sig.height : size.height,\n }\n : sig,\n ),\n );\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n return;\n }\n\n if (hasFixedSignatureFields) {\n const targetField =\n signatureFields.find(\n (field) =>\n field.id === selectedSignatureFieldId &&\n !signatures.some((sig) => sig.fieldId === field.id),\n ) ??\n signatureFields.find(\n (field) => !signatures.some((sig) => sig.fieldId === field.id),\n );\n\n if (!targetField) {\n setSignaturePadOpen(false);\n return;\n }\n\n const signature: SignatureAnnotation = {\n id: createSignatureId(),\n fieldId: targetField.id,\n pageNumber: targetField.pageNumber,\n x: targetField.x,\n y: targetField.y,\n width: targetField.width,\n height: targetField.height,\n imageDataUrl,\n };\n\n setSignatures((prev) => [\n ...prev.filter((sig) => sig.fieldId !== targetField.id),\n signature,\n ]);\n onSignatureComplete?.(targetField.id, signature);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n\n const signedFieldIds = new Set(\n signatures\n .filter((sig) => sig.fieldId && sig.fieldId !== targetField.id)\n .map((sig) => sig.fieldId as string),\n );\n signedFieldIds.add(targetField.id);\n\n const currentIndex = signatureFields.findIndex(\n (field) => field.id === targetField.id,\n );\n const nextField =\n signatureFields\n .slice(currentIndex + 1)\n .find((field) => !signedFieldIds.has(field.id)) ??\n signatureFields\n .slice(0, Math.max(0, currentIndex))\n .find((field) => !signedFieldIds.has(field.id));\n\n if (nextField) {\n setSelectedSignatureFieldId(nextField.id);\n setSelectedSignatureId(null);\n scrollToSignatureField(nextField);\n window.setTimeout(() => {\n setSignaturePadOpen(true);\n }, 350);\n } else {\n setSelectedSignatureId(signature.id);\n setSelectedSignatureFieldId(targetField.id);\n }\n return;\n }\n\n const currentPageEl = pageRefsRef.current.get(pageNumber);\n const surface = currentPageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n\n let x = 24;\n let y = 24;\n if (surface) {\n const pageSize = pageSizeFromSurface(surface, scale);\n const scrollContainer = surface.closest(\".epochs-pdf-viewer__body\") as HTMLElement | null;\n\n if (scrollContainer) {\n const visible = viewportRectToPage(\n scrollContainer.getBoundingClientRect(),\n surface,\n scale,\n );\n const visibleTop = Math.max(0, visible.top);\n const visibleBottom = Math.min(pageSize.height, visible.bottom);\n const visibleLeft = Math.max(0, visible.left);\n const visibleRight = Math.min(pageSize.width, visible.right);\n x = Math.max(0, (visibleLeft + visibleRight) / 2 - size.width / 2);\n y = Math.max(0, (visibleTop + visibleBottom) / 2 - size.height / 2);\n x = Math.min(x, Math.max(0, pageSize.width - size.width));\n y = Math.min(y, Math.max(0, pageSize.height - size.height));\n } else {\n x = Math.max(0, (pageSize.width - size.width) / 2);\n y = Math.max(0, (pageSize.height - size.height) / 2);\n }\n }\n\n const signature: SignatureAnnotation = {\n id: createSignatureId(),\n pageNumber,\n x,\n y,\n width: size.width,\n height: size.height,\n imageDataUrl,\n };\n\n setSignatures((prev) => [...prev, signature]);\n onSignatureComplete?.(undefined, signature);\n setSelectedSignatureId(signature.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n },\n [\n editingSignatureId,\n hasFixedSignatureFields,\n pageNumber,\n scale,\n scrollToSignatureField,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n onSignatureComplete,\n ],\n );\n\n const handleAddSignature = useCallback((signature: SignatureAnnotation) => {\n setSignatures((prev) => [...prev, signature]);\n setSelectedSignatureId(signature.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n }, []);\n\n const handleUpdateSignature = useCallback(\n (id: string, patch: Partial<SignatureAnnotation>) => {\n setSignatures((prev) =>\n prev.map((sig) => (sig.id === id ? { ...sig, ...patch } : sig)),\n );\n },\n [],\n );\n\n const handleRemoveSignature = useCallback((id: string) => {\n const removed = signatures.find((sig) => sig.id === id);\n setSignatures((prev) => prev.filter((sig) => sig.id !== id));\n setSelectedSignatureId((current) => (current === id ? null : current));\n if (removed?.fieldId) {\n setSelectedSignatureFieldId(removed.fieldId);\n }\n }, [signatures]);\n\n const handleDuplicateSignature = useCallback((id?: string) => {\n const target = id\n ? signatures.find((sig) => sig.id === id) ?? null\n : selectedSignature;\n if (!target) return;\n\n const pageEl = pageRefsRef.current.get(target.pageNumber);\n const surface = pageEl?.querySelector(\n \".epochs-pdf-viewer__surface\",\n ) as HTMLDivElement | null;\n\n const offset = 18;\n let x = target.x + offset;\n let y = target.y + offset;\n\n if (surface) {\n const pageWidth = surface.clientWidth / scale;\n const pageHeight = surface.clientHeight / scale;\n x = Math.min(\n Math.max(0, x),\n Math.max(0, pageWidth - target.width),\n );\n y = Math.min(\n Math.max(0, y),\n Math.max(0, pageHeight - target.height),\n );\n }\n\n const duplicate: SignatureAnnotation = {\n ...target,\n id: createSignatureId(),\n x,\n y,\n };\n\n setSignatures((prev) => [...prev, duplicate]);\n setSelectedSignatureId(duplicate.id);\n setPendingSignature(null);\n setMarkupTool(\"none\");\n }, [scale, selectedSignature, signatures]);\n\n const handleEditSignature = useCallback((id?: string) => {\n const targetId = id ?? selectedSignature?.id;\n if (!targetId) return;\n setSelectedSignatureId(targetId);\n setEditingSignatureId(targetId);\n setSignaturePadOpen(true);\n }, [selectedSignature]);\n\n const handleAddText = useCallback((text: TextAnnotation) => {\n setTexts((prev) => {\n if (text.fieldId) {\n return [...prev.filter((item) => item.fieldId !== text.fieldId), text];\n }\n return [...prev, text];\n });\n setSelectedTextId(text.id);\n if (text.fieldId) setSelectedTextFieldId(text.fieldId);\n }, []);\n\n const handleUpdateText = useCallback(\n (id: string, patch: Partial<TextAnnotation>) => {\n setTexts((prev) =>\n prev.map((text) => (text.id === id ? { ...text, ...patch } : text)),\n );\n },\n [],\n );\n\n const handleRemoveText = useCallback((id: string) => {\n const removed = texts.find((text) => text.id === id);\n setTexts((prev) => prev.filter((text) => text.id !== id));\n setSelectedTextId((current) => (current === id ? null : current));\n setEditingTextId((current) => (current === id ? null : current));\n if (removed?.fieldId) {\n setSelectedTextFieldId(removed.fieldId);\n }\n }, [texts]);\n\n // Sync fixed text field geometry if the prop changes\n useEffect(() => {\n if (!hasFixedTextFields) return;\n setTexts((prev) =>\n prev.map((text) => {\n if (!text.fieldId) return text;\n const field = textFields.find((item) => item.id === text.fieldId);\n if (!field) return text;\n return {\n ...text,\n pageNumber: field.pageNumber,\n x: field.x,\n y: field.y,\n width: field.width,\n height: field.height,\n fontSize: field.fontSize ?? text.fontSize ?? DEFAULT_TEXT_FONT_SIZE,\n color: field.color ?? text.color ?? DEFAULT_TEXT_COLOR,\n };\n }),\n );\n }, [hasFixedTextFields, textFields]);\n\n const goToSignatureField = useCallback(\n (direction: -1 | 1) => {\n if (!signatureFields.length) return;\n const from =\n selectedSignatureFieldId != null\n ? signatureFields.findIndex((f) => f.id === selectedSignatureFieldId)\n : -1;\n const nextIndex = Math.min(\n signatureFields.length - 1,\n Math.max(0, (from < 0 ? 0 : from) + direction),\n );\n const field = signatureFields[nextIndex];\n if (!field) return;\n setSelectedSignatureFieldId(field.id);\n setSelectedSignatureId(\n signatures.find((sig) => sig.fieldId === field.id)?.id ?? null,\n );\n scrollToSignatureField(field);\n },\n [\n scrollToSignatureField,\n selectedSignatureFieldId,\n signatureFields,\n signatures,\n ],\n );\n\n if (!binarySource && !resolvedUrl) {\n return (\n <div\n data-testid=\"pdf-viewer\"\n className={`epochs-pdf-viewer epochs-pdf-viewer--empty ${className ?? \"\"}`.trim()}\n >\n No PDF file provided.\n </div>\n );\n }\n\n const rootStyle: CSSProperties = {\n height,\n };\n\n const toolbarCtx: ToolbarRenderContext = {\n status,\n showThumbnails,\n setShowThumbnails,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n pageNumber,\n numPages,\n scrollToPage,\n scale,\n handleZoomOut,\n handleZoomIn,\n handleFitWidth,\n handleRotate,\n markupTool,\n toggleMarkupTool: (tool) => toggleMarkupTool(tool),\n hasFixedSignatureFields,\n hasFixedTextFields,\n pendingSignature,\n setMarkupTool,\n setSignaturePadOpen,\n annotationsLength: annotations.length,\n signaturesLength: signatures.length,\n textsLength: texts.length,\n handleClearAnnotations,\n highlightHex,\n underlineHex,\n setHighlightHex,\n setUnderlineHex,\n loadDocument,\n handlePrint,\n isPrinting,\n pdfDoc,\n displayUrl,\n resolvedUrl,\n handleDownload,\n isDownloading,\n };\n\n const visibleToolIds = (ids: ToolbarToolId[]) =>\n ids.filter((id) => {\n if (\n hasFixedSignatureFields &&\n (id === \"highlight\" || id === \"underline\" || id === \"erase\")\n ) {\n return false;\n }\n return true;\n });\n\n const currentFieldIndex = selectedSignatureFieldId\n ? signatureFields.findIndex((field) => field.id === selectedSignatureFieldId)\n : 0;\n\n const filledFieldCount = signatureFields.filter((field) => {\n const fieldType = field.type ?? \"sign\";\n if (fieldType === \"date\" || fieldType === \"text\") {\n return Boolean(fieldValues[field.id]?.trim());\n }\n return signatures.some((sig) => sig.fieldId === field.id);\n }).length;\n\n const fieldProgressPercent =\n signatureFields.length > 0\n ? Math.round((filledFieldCount / signatureFields.length) * 100)\n : 0;\n\n const renderSide = (ids: ToolbarToolId[], alignEnd = false) => {\n const visible = visibleToolIds(ids);\n if (visible.length === 0 && !alignEnd) {\n return <div className=\"epochs-pdf-viewer__toolbar-group\" />;\n }\n if (visible.length === 0) {\n return (\n <div className=\"epochs-pdf-viewer__toolbar-group epochs-pdf-viewer__toolbar-group--end\" />\n );\n }\n\n const nodes = visible.map((id, index) => {\n const prev = visible[index - 1];\n const showMarkupSep =\n isMarkupToolbarTool(id) && (!prev || !isMarkupToolbarTool(prev));\n return (\n <Fragment key={id}>\n {renderToolbarTool(id, toolbarCtx, { showMarkupSep })}\n </Fragment>\n );\n });\n\n return (\n <div\n className={\n alignEnd\n ? \"epochs-pdf-viewer__toolbar-group epochs-pdf-viewer__toolbar-group--end\"\n : \"epochs-pdf-viewer__toolbar-group\"\n }\n >\n {nodes}\n {renderMarkupExtras(toolbarCtx, new Set(visible))}\n </div>\n );\n };\n\n return (\n <div\n data-testid=\"pdf-viewer\"\n data-file-url={resolvedUrl || undefined}\n className={`epochs-pdf-viewer ${className ?? \"\"}`.trim()}\n style={rootStyle}\n >\n {toolbarSides ? (\n <div className=\"epochs-pdf-viewer__toolbar\">\n {renderSide(toolbarSides.left)}\n {renderSide(toolbarSides.right, true)}\n </div>\n ) : null}\n\n {(showSignature || externalOpenSignaturePad || hasFixedSignatureFields) ? (\n <SignaturePad\n open={signaturePadOpen}\n onClose={() => {\n setSignaturePadOpen(false);\n setEditingSignatureId(null);\n onSignaturePadClose?.();\n }}\n onSave={handleSignatureSave}\n fieldType={signaturePadFieldType}\n showFieldTypeTabs={!hasFixedSignatureFields}\n />\n ) : null}\n\n <div className=\"epochs-pdf-viewer__content\">\n {showThumbnails ? (\n <div\n className=\"epochs-pdf-viewer__thumbnails\"\n style={{ width: thumbnailWidth + 24 }}\n >\n {status === \"ready\" && pdfDoc ? (\n <>\n {Array.from({\n length: Math.min(numPages || 0, maxThumbnails),\n }).map((_, idx) => {\n const n = idx + 1;\n return (\n <div key={n} className=\"epochs-pdf-viewer__thumb-wrap\">\n <ThumbnailStrip\n pdfDoc={pdfDoc}\n pageNumber={n}\n isActive={n === pageNumber}\n rotation={rotation}\n onSelect={scrollToPage}\n width={thumbnailWidth}\n annotations={annotations}\n signatures={signatures}\n signatureFields={signatureFields}\n texts={texts}\n textFields={textFields}\n />\n </div>\n );\n })}\n {numPages > maxThumbnails ? (\n <div className=\"epochs-pdf-viewer__thumb-more\">\n Showing first {maxThumbnails} pages\n </div>\n ) : null}\n </>\n ) : (\n <div className=\"epochs-pdf-viewer__muted\">Thumbnails</div>\n )}\n </div>\n ) : null}\n\n <div ref={containerRef} className=\"epochs-pdf-viewer__body\">\n {status === \"loading\" ? (\n <div className=\"epochs-pdf-viewer__overlay epochs-pdf-viewer__muted\">\n Loading PDF…\n <span className=\"epochs-pdf-viewer__spinner\" />\n </div>\n ) : null}\n\n {status === \"error\" ? (\n <div className=\"epochs-pdf-viewer__overlay epochs-pdf-viewer__error\">\n Unable to load PDF.\n {resolvedUrl ? (\n <a\n className=\"epochs-pdf-viewer__open-link\"\n href={resolvedUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Open file\n </a>\n ) : null}\n </div>\n ) : null}\n\n {status === \"ready\" && pdfDoc ? (\n <div>\n {Array.from({ length: numPages }).map((_, idx) => {\n const p = idx + 1;\n return (\n <PageCanvas\n key={p}\n pdfDoc={pdfDoc}\n pageNumber={p}\n scale={scale}\n rotation={rotation}\n markupTool={enableMarkup ? markupTool : \"none\"}\n markupColor={activeMarkupColor}\n annotations={annotations}\n onAddAnnotation={handleAddAnnotation}\n onRemoveAnnotation={handleRemoveAnnotation}\n signatures={signatures}\n pendingSignature={pendingSignature}\n onAddSignature={handleAddSignature}\n onUpdateSignature={handleUpdateSignature}\n onRemoveSignature={handleRemoveSignature}\n onEditSignature={handleEditSignature}\n onDuplicateSignature={handleDuplicateSignature}\n selectedSignatureId={selectedSignatureId}\n onSelectSignature={setSelectedSignatureId}\n signatureFields={signatureFields}\n selectedSignatureFieldId={selectedSignatureFieldId}\n onSelectSignatureField={setSelectedSignatureFieldId}\n hasFixedSignatureFields={hasFixedSignatureFields}\n onOpenSignaturePad={handleOpenSignaturePad}\n fieldValues={fieldValues}\n onFieldValueChange={handleFieldValueChange}\n onFieldValueCommit={handleFieldValueCommit}\n texts={texts}\n onAddText={handleAddText}\n onUpdateText={handleUpdateText}\n onRemoveText={handleRemoveText}\n selectedTextId={selectedTextId}\n onSelectText={setSelectedTextId}\n textFields={textFields}\n selectedTextFieldId={selectedTextFieldId}\n onSelectTextField={setSelectedTextFieldId}\n hasFixedTextFields={hasFixedTextFields}\n editingTextId={editingTextId}\n onEditingTextIdChange={setEditingTextId}\n pageRef={(el) => {\n if (el) pageRefsRef.current.set(p, el);\n }}\n />\n );\n })}\n </div>\n ) : null}\n </div>\n </div>\n\n {hasFixedSignatureFields || onSubmit ? (\n <div className=\"epochs-pdf-viewer__footer\" role=\"navigation\" aria-label=\"Viewer actions\">\n {hasFixedSignatureFields ? (\n <>\n <div className=\"epochs-pdf-viewer__footer-nav\">\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n disabled={signatureFields.length <= 1 || currentFieldIndex <= 0}\n onClick={() => goToSignatureField(-1)}\n >\n Prev\n </button>\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text\"\n disabled={\n signatureFields.length <= 1 ||\n currentFieldIndex >= signatureFields.length - 1\n }\n onClick={() => goToSignatureField(1)}\n >\n Next\n </button>\n </div>\n <div className=\"epochs-pdf-viewer__footer-center\">\n <span className=\"epochs-pdf-viewer__footer-label\">\n Field {Math.max(1, currentFieldIndex + 1)} of {signatureFields.length}\n </span>\n <div\n className=\"epochs-pdf-viewer__footer-progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={fieldProgressPercent}\n aria-label=\"Signature progress\"\n >\n <div\n className=\"epochs-pdf-viewer__footer-progress-bar\"\n style={{ width: `${fieldProgressPercent}%` }}\n />\n </div>\n <span className=\"epochs-pdf-viewer__footer-percent\">\n {fieldProgressPercent}%\n </span>\n </div>\n </>\n ) : (\n <div className=\"epochs-pdf-viewer__footer-center\" />\n )}\n {onSubmit ? (\n <button\n type=\"button\"\n className=\"epochs-pdf-viewer__btn epochs-pdf-viewer__btn--text epochs-pdf-viewer__btn--primary\"\n onClick={onSubmit}\n >\n {submitLabel}\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport default PdfViewer;\n","import type {\n DocumentProps,\n ImageProps,\n LinkProps,\n PageProps,\n TextProps,\n ViewProps,\n} from \"./types\";\n\n/** Root document container. Must wrap one or more `<Page>` elements. */\nexport function Document(_props: DocumentProps): null {\n return null;\n}\nDocument.displayName = \"Document\";\n\n/** A single PDF page. */\nexport function Page(_props: PageProps): null {\n return null;\n}\nPage.displayName = \"Page\";\n\n/** Flexbox layout container. */\nexport function View(_props: ViewProps): null {\n return null;\n}\nView.displayName = \"View\";\n\n/** Text content. Children are flattened to a string. */\nexport function Text(_props: TextProps): null {\n return null;\n}\nText.displayName = \"Text\";\n\n/** Image placeholder (binary embedding planned). */\nexport function Image(_props: ImageProps): null {\n return null;\n}\nImage.displayName = \"Image\";\n\n/** Linked text. */\nexport function Link(_props: LinkProps): null {\n return null;\n}\nLink.displayName = \"Link\";\n","import { createElement, type ReactElement, type ReactNode } from \"react\";\nimport type { PdfNode, NodeType } from \"./types\";\n\nconst TYPE_MAP: Record<string, NodeType> = {\n Document: \"DOCUMENT\",\n Page: \"PAGE\",\n View: \"VIEW\",\n Text: \"TEXT\",\n Image: \"IMAGE\",\n Link: \"LINK\",\n};\n\nfunction getDisplayName(type: unknown): string | null {\n if (typeof type === \"string\") return type;\n if (typeof type === \"function\") {\n const fn = type as { displayName?: string; name?: string };\n return fn.displayName || fn.name || null;\n }\n return null;\n}\n\nfunction flattenChildren(children: ReactNode): ReactNode[] {\n const result: ReactNode[] = [];\n const visit = (node: ReactNode) => {\n if (node == null || typeof node === \"boolean\") return;\n if (Array.isArray(node)) {\n node.forEach(visit);\n return;\n }\n result.push(node);\n };\n visit(children);\n return result;\n}\n\nfunction collectText(children: ReactNode): string {\n return flattenChildren(children)\n .map((child) => {\n if (typeof child === \"string\" || typeof child === \"number\") {\n return String(child);\n }\n if (\n child &&\n typeof child === \"object\" &&\n \"props\" in (child as ReactElement)\n ) {\n const el = child as ReactElement<{ children?: ReactNode }>;\n return collectText(el.props.children);\n }\n return \"\";\n })\n .join(\"\");\n}\n\nexport function elementToPdfNode(element: ReactElement): PdfNode {\n const name = getDisplayName(element.type);\n const nodeType = name ? TYPE_MAP[name] : undefined;\n\n if (!nodeType) {\n throw new Error(\n `[epochs-pdf] Unsupported element \"${name ?? \"unknown\"}\". Use Document, Page, View, Text, Image, or Link.`,\n );\n }\n\n const props = { ...(element.props as Record<string, unknown>) };\n const childrenProp = props.children as ReactNode;\n delete props.children;\n\n if (nodeType === \"TEXT\" || nodeType === \"LINK\") {\n return {\n type: nodeType,\n props,\n children: [],\n text: collectText(childrenProp),\n };\n }\n\n const childNodes = flattenChildren(childrenProp)\n .filter(\n (child): child is ReactElement =>\n !!child && typeof child === \"object\" && \"type\" in (child as object),\n )\n .map(elementToPdfNode);\n\n return {\n type: nodeType,\n props,\n children: childNodes,\n };\n}\n\nexport function createPdfElement(\n type: NodeType,\n props: Record<string, unknown> = {},\n ...children: ReactNode[]\n): ReactElement {\n const name = Object.entries(TYPE_MAP).find(([, v]) => v === type)?.[0];\n if (!name) throw new Error(`Unknown node type: ${type}`);\n return createElement(name, props, ...children);\n}\n","import type { PageSize, Style } from \"./types\";\n\nexport const PAGE_SIZES: Record<Exclude<PageSize, [number, number]>, [number, number]> = {\n A4: [595.28, 841.89],\n LETTER: [612, 792],\n LEGAL: [612, 1008],\n};\n\nexport function resolvePageSize(\n size: PageSize = \"A4\",\n orientation: \"portrait\" | \"landscape\" = \"portrait\",\n): [number, number] {\n const [w, h] = Array.isArray(size) ? size : PAGE_SIZES[size];\n return orientation === \"landscape\" ? [h, w] : [w, h];\n}\n\nexport function expandPadding(style: Style = {}) {\n const base = style.padding ?? 0;\n return {\n top: style.paddingTop ?? base,\n right: style.paddingRight ?? base,\n bottom: style.paddingBottom ?? base,\n left: style.paddingLeft ?? base,\n };\n}\n\nexport function expandMargin(style: Style = {}) {\n const base = style.margin ?? 0;\n return {\n top: style.marginTop ?? base,\n right: style.marginRight ?? base,\n bottom: style.marginBottom ?? base,\n left: style.marginLeft ?? base,\n };\n}\n\n/** Parse #RRGGBB / #RGB / rgb() into 0–1 RGB components. */\nexport function parseColor(input?: string): [number, number, number] | null {\n if (!input) return null;\n\n const hex = input.trim();\n if (hex.startsWith(\"#\")) {\n const raw = hex.slice(1);\n if (raw.length === 3) {\n const r = parseInt(raw[0] + raw[0], 16) / 255;\n const g = parseInt(raw[1] + raw[1], 16) / 255;\n const b = parseInt(raw[2] + raw[2], 16) / 255;\n return [r, g, b];\n }\n if (raw.length === 6) {\n const r = parseInt(raw.slice(0, 2), 16) / 255;\n const g = parseInt(raw.slice(2, 4), 16) / 255;\n const b = parseInt(raw.slice(4, 6), 16) / 255;\n return [r, g, b];\n }\n }\n\n const rgb = input.match(\n /rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i,\n );\n if (rgb) {\n return [\n Math.min(1, Number(rgb[1]) / 255),\n Math.min(1, Number(rgb[2]) / 255),\n Math.min(1, Number(rgb[3]) / 255),\n ];\n }\n\n return null;\n}\n\nexport function resolveLength(\n value: number | string | undefined,\n parent: number,\n fallback = 0,\n): number {\n if (value == null) return fallback;\n if (typeof value === \"number\") return value;\n if (value.endsWith(\"%\")) {\n const pct = Number.parseFloat(value);\n return Number.isFinite(pct) ? (pct / 100) * parent : fallback;\n }\n const n = Number.parseFloat(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function isBold(weight?: Style[\"fontWeight\"]): boolean {\n if (weight === \"bold\") return true;\n if (typeof weight === \"number\") return weight >= 600;\n return false;\n}\n","import type { LayoutBox, PdfNode, ResolvedDocument, ResolvedPage, Style } from \"./types\";\nimport {\n expandMargin,\n expandPadding,\n isBold,\n resolveLength,\n resolvePageSize,\n} from \"./utils\";\n\nconst DEFAULT_FONT_SIZE = 12;\nconst DEFAULT_LINE_HEIGHT = 1.4;\nconst AVG_CHAR_WIDTH = 0.5;\n\nfunction measureText(text: string, style: Style, maxWidth: number): { width: number; height: number; lines: string[] } {\n const fontSize = style.fontSize ?? DEFAULT_FONT_SIZE;\n const lineHeight = (style.lineHeight ?? DEFAULT_LINE_HEIGHT) * fontSize;\n const charWidth = fontSize * (isBold(style.fontWeight) ? 0.55 : AVG_CHAR_WIDTH);\n\n if (!text) {\n return { width: 0, height: lineHeight, lines: [\"\"] };\n }\n\n const words = text.split(/\\s+/);\n const lines: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n const candidate = current ? `${current} ${word}` : word;\n if (candidate.length * charWidth <= maxWidth || !current) {\n current = candidate;\n } else {\n lines.push(current);\n current = word;\n }\n }\n if (current) lines.push(current);\n\n const widest = Math.max(...lines.map((l) => l.length * charWidth), 0);\n return {\n width: Math.min(widest, maxWidth),\n height: lines.length * lineHeight,\n lines,\n };\n}\n\nfunction layoutNode(\n node: PdfNode,\n x: number,\n y: number,\n availableWidth: number,\n availableHeight: number,\n): LayoutBox {\n const style = (node.props.style as Style | undefined) ?? {};\n const margin = expandMargin(style);\n const padding = expandPadding(style);\n\n const outerX = x + margin.left;\n const outerY = y + margin.top;\n const contentWidth = Math.max(\n 0,\n resolveLength(style.width, availableWidth, availableWidth) - margin.left - margin.right,\n );\n const innerWidth = Math.max(0, contentWidth - padding.left - padding.right);\n\n if (node.type === \"TEXT\" || node.type === \"LINK\") {\n const measured = measureText(node.text ?? \"\", style, innerWidth);\n const height =\n resolveLength(style.height, availableHeight, measured.height + padding.top + padding.bottom);\n return {\n x: outerX,\n y: outerY,\n width: contentWidth,\n height,\n node,\n children: [],\n style,\n text: node.text,\n };\n }\n\n if (node.type === \"IMAGE\") {\n const width = resolveLength(style.width, availableWidth, Math.min(200, availableWidth));\n const height = resolveLength(style.height, availableHeight, 120);\n return {\n x: outerX,\n y: outerY,\n width: width - margin.left - margin.right,\n height,\n node,\n children: [],\n style,\n };\n }\n\n const direction = style.flexDirection ?? \"column\";\n const gap = style.gap ?? 0;\n const childBoxes: LayoutBox[] = [];\n\n let cursorX = outerX + padding.left;\n let cursorY = outerY + padding.top;\n let usedMain = 0;\n let crossSize = 0;\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const remainingW =\n direction === \"row\"\n ? Math.max(0, innerWidth - usedMain - (i > 0 ? gap : 0))\n : innerWidth;\n const remainingH =\n direction === \"column\"\n ? Math.max(0, availableHeight - (cursorY - y) - margin.bottom)\n : availableHeight;\n\n const box = layoutNode(child, cursorX, cursorY, remainingW, remainingH);\n childBoxes.push(box);\n\n if (direction === \"row\") {\n usedMain += box.width + expandMargin((child.props.style as Style) ?? {}).left\n + expandMargin((child.props.style as Style) ?? {}).right;\n if (i < node.children.length - 1) usedMain += gap;\n cursorX = outerX + padding.left + usedMain;\n crossSize = Math.max(crossSize, box.height);\n } else {\n usedMain += box.height + expandMargin((child.props.style as Style) ?? {}).top\n + expandMargin((child.props.style as Style) ?? {}).bottom;\n if (i < node.children.length - 1) usedMain += gap;\n cursorY = outerY + padding.top + usedMain;\n crossSize = Math.max(crossSize, box.width);\n }\n }\n\n const contentHeight =\n resolveLength(\n style.height,\n availableHeight,\n direction === \"column\"\n ? usedMain + padding.top + padding.bottom\n : crossSize + padding.top + padding.bottom,\n );\n\n const finalWidth =\n direction === \"row\"\n ? resolveLength(style.width, availableWidth, usedMain + padding.left + padding.right)\n : contentWidth;\n\n const justify = style.justifyContent ?? \"flex-start\";\n const align = style.alignItems ?? \"stretch\";\n\n const innerMain =\n direction === \"column\"\n ? contentHeight - padding.top - padding.bottom\n : finalWidth - padding.left - padding.right;\n const childrenMain = usedMain;\n const freeSpace = Math.max(0, innerMain - childrenMain);\n\n let mainOffset = 0;\n let betweenGap = gap;\n if (justify === \"center\") mainOffset = freeSpace / 2;\n if (justify === \"flex-end\") mainOffset = freeSpace;\n if (justify === \"space-between\" && childBoxes.length > 1) {\n betweenGap = gap + freeSpace / (childBoxes.length - 1);\n }\n if (justify === \"space-around\" && childBoxes.length > 0) {\n betweenGap = gap + freeSpace / childBoxes.length;\n mainOffset = betweenGap / 2;\n }\n\n let running = 0;\n for (const box of childBoxes) {\n if (direction === \"column\") {\n box.y = outerY + padding.top + mainOffset + running;\n if (align === \"center\") {\n box.x = outerX + padding.left + Math.max(0, (innerWidth - box.width) / 2);\n } else if (align === \"flex-end\") {\n box.x = outerX + padding.left + Math.max(0, innerWidth - box.width);\n } else if (align === \"stretch\" && box.style.width == null) {\n box.width = innerWidth;\n }\n running += box.height + betweenGap;\n } else {\n box.x = outerX + padding.left + mainOffset + running;\n if (align === \"center\") {\n box.y =\n outerY +\n padding.top +\n Math.max(0, (contentHeight - padding.top - padding.bottom - box.height) / 2);\n } else if (align === \"flex-end\") {\n box.y =\n outerY +\n padding.top +\n Math.max(0, contentHeight - padding.top - padding.bottom - box.height);\n } else if (align === \"stretch\" && box.style.height == null) {\n box.height = contentHeight - padding.top - padding.bottom;\n }\n running += box.width + betweenGap;\n }\n }\n\n return {\n x: outerX,\n y: outerY,\n width: finalWidth,\n height: contentHeight,\n node,\n children: childBoxes,\n style,\n };\n}\n\nexport function layoutDocument(root: PdfNode): ResolvedDocument {\n if (root.type !== \"DOCUMENT\") {\n throw new Error(\"[epochs-pdf] Root element must be <Document>.\");\n }\n\n const pages: ResolvedPage[] = [];\n\n for (const pageNode of root.children) {\n if (pageNode.type !== \"PAGE\") {\n throw new Error(\"[epochs-pdf] Direct children of <Document> must be <Page>.\");\n }\n\n const size = pageNode.props.size as Parameters<typeof resolvePageSize>[0];\n const orientation = (pageNode.props.orientation as \"portrait\" | \"landscape\") ?? \"portrait\";\n const [width, height] = resolvePageSize(size, orientation);\n const style = (pageNode.props.style as Style | undefined) ?? {};\n const padding = expandPadding(style);\n\n const contentRoot: PdfNode = {\n type: \"VIEW\",\n props: {\n style: {\n ...style,\n width,\n height,\n paddingTop: padding.top,\n paddingRight: padding.right,\n paddingBottom: padding.bottom,\n paddingLeft: padding.left,\n },\n },\n children: pageNode.children,\n };\n\n const box = layoutNode(contentRoot, 0, 0, width, height);\n\n pages.push({\n width,\n height,\n boxes: box.children,\n style,\n });\n }\n\n return {\n meta: {\n title: String(root.props.title ?? \"Untitled\"),\n author: String(root.props.author ?? \"\"),\n subject: String(root.props.subject ?? \"\"),\n creator: String(root.props.creator ?? \"epochs-pdf\"),\n },\n pages,\n };\n}\n\nexport { measureText };\n","import type { LayoutBox, ResolvedDocument, Style } from \"./types\";\nimport { isBold, parseColor } from \"./utils\";\nimport { measureText } from \"./layout\";\n\nfunction escapePdfString(value: string): string {\n return value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\\(/g, \"\\\\(\")\n .replace(/\\)/g, \"\\\\)\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\n/g, \"\\\\n\");\n}\n\nclass PdfWriter {\n private objects: (string | null)[] = [null];\n private offsets: number[] = [0];\n\n addObject(content: string): number {\n this.objects.push(content);\n return this.objects.length - 1;\n }\n\n build(doc: ResolvedDocument): Uint8Array {\n const infoId = this.addObject(\n `<< /Title (${escapePdfString(doc.meta.title)}) /Author (${escapePdfString(doc.meta.author)}) /Subject (${escapePdfString(doc.meta.subject)}) /Creator (${escapePdfString(doc.meta.creator)}) /Producer (epochs-pdf) >>`,\n );\n\n const fontRegular = this.addObject(\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\",\n );\n const fontBold = this.addObject(\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold >>\",\n );\n\n const pageIds: number[] = [];\n\n for (const page of doc.pages) {\n const contentStream = this.renderPageContent(\n page.boxes,\n page.width,\n page.height,\n page.style,\n );\n const contentId = this.addObject(\n `<< /Length ${contentStream.length} >>\\nstream\\n${contentStream}\\nendstream`,\n );\n\n const pageId = this.addObject(\"\"); // placeholder\n pageIds.push(pageId);\n\n this.objects[pageId] =\n `<< /Type /Page /Parent 0 0 R /MediaBox [0 0 ${page.width.toFixed(2)} ${page.height.toFixed(2)}] /Contents ${contentId} 0 R /Resources << /Font << /F1 ${fontRegular} 0 R /F2 ${fontBold} 0 R >> >> >>`;\n }\n\n const kids = pageIds.map((id) => `${id} 0 R`).join(\" \");\n const pagesId = this.addObject(\n `<< /Type /Pages /Kids [${kids}] /Count ${pageIds.length} >>`,\n );\n\n for (const pageId of pageIds) {\n this.objects[pageId] = (this.objects[pageId] as string).replace(\n \"/Parent 0 0 R\",\n `/Parent ${pagesId} 0 R`,\n );\n }\n\n const catalogId = this.addObject(\n `<< /Type /Catalog /Pages ${pagesId} 0 R >>`,\n );\n\n // Serialize\n let body = \"%PDF-1.4\\n\";\n this.offsets = [0];\n\n for (let i = 1; i < this.objects.length; i++) {\n this.offsets[i] = body.length;\n body += `${i} 0 obj\\n${this.objects[i]}\\nendobj\\n`;\n }\n\n const xrefOffset = body.length;\n body += `xref\\n0 ${this.objects.length}\\n`;\n body += \"0000000000 65535 f \\n\";\n for (let i = 1; i < this.objects.length; i++) {\n body += `${String(this.offsets[i]).padStart(10, \"0\")} 00000 n \\n`;\n }\n body += `trailer\\n<< /Size ${this.objects.length} /Root ${catalogId} 0 R /Info ${infoId} 0 R >>\\n`;\n body += `startxref\\n${xrefOffset}\\n%%EOF`;\n\n return new TextEncoder().encode(body);\n }\n\n private renderPageContent(\n boxes: LayoutBox[],\n pageWidth: number,\n pageHeight: number,\n pageStyle: Style,\n ): string {\n const ops: string[] = [];\n\n const pageBg = parseColor(pageStyle.backgroundColor);\n if (pageBg) {\n ops.push(`q`);\n ops.push(\n `${pageBg[0].toFixed(3)} ${pageBg[1].toFixed(3)} ${pageBg[2].toFixed(3)} rg`,\n );\n ops.push(\n `0 0 ${pageWidth.toFixed(2)} ${pageHeight.toFixed(2)} re f`,\n );\n ops.push(`Q`);\n }\n\n const drawBox = (box: LayoutBox) => {\n const { x, y, width, height, style, node, text } = box;\n const pdfY = pageHeight - y - height;\n\n const fill = parseColor(style.backgroundColor);\n if (fill) {\n ops.push(`q`);\n ops.push(`${fill[0].toFixed(3)} ${fill[1].toFixed(3)} ${fill[2].toFixed(3)} rg`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re f`);\n ops.push(`Q`);\n }\n\n if (style.borderWidth && style.borderWidth > 0) {\n const border = parseColor(style.borderColor) ?? [0, 0, 0];\n ops.push(`q`);\n ops.push(`${style.borderWidth} w`);\n ops.push(`${border[0].toFixed(3)} ${border[1].toFixed(3)} ${border[2].toFixed(3)} RG`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re S`);\n ops.push(`Q`);\n }\n\n if ((node.type === \"TEXT\" || node.type === \"LINK\") && text != null) {\n const fontSize = style.fontSize ?? 12;\n const color = parseColor(style.color) ?? [0, 0, 0];\n const font = isBold(style.fontWeight) ? \"F2\" : \"F1\";\n const paddingLeft = style.paddingLeft ?? style.padding ?? 0;\n const paddingTop = style.paddingTop ?? style.padding ?? 0;\n const maxWidth = Math.max(0, width - paddingLeft - (style.paddingRight ?? style.padding ?? 0));\n const measured = measureText(text, style, maxWidth || width);\n const lineHeight = (style.lineHeight ?? 1.4) * fontSize;\n\n ops.push(`q`);\n ops.push(`BT`);\n ops.push(`/${font} ${fontSize} Tf`);\n ops.push(`${color[0].toFixed(3)} ${color[1].toFixed(3)} ${color[2].toFixed(3)} rg`);\n\n measured.lines.forEach((line, index) => {\n let textX = x + paddingLeft;\n const lineWidth = line.length * fontSize * (isBold(style.fontWeight) ? 0.55 : 0.5);\n if (style.textAlign === \"center\") {\n textX = x + (width - lineWidth) / 2;\n } else if (style.textAlign === \"right\") {\n textX = x + width - lineWidth - (style.paddingRight ?? style.padding ?? 0);\n }\n const textY = pageHeight - y - paddingTop - fontSize - index * lineHeight;\n ops.push(`1 0 0 1 ${textX.toFixed(2)} ${textY.toFixed(2)} Tm`);\n ops.push(`(${escapePdfString(line)}) Tj`);\n });\n\n ops.push(`ET`);\n ops.push(`Q`);\n }\n\n if (node.type === \"IMAGE\") {\n // Placeholder rectangle for images (no external deps / binary embedding yet)\n ops.push(`q`);\n ops.push(`0.85 0.85 0.85 rg`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re f`);\n ops.push(`0.6 0.6 0.6 RG 1 w`);\n ops.push(`${x.toFixed(2)} ${pdfY.toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re S`);\n ops.push(\n `BT /F1 10 Tf 0.4 0.4 0.4 rg 1 0 0 1 ${(x + 8).toFixed(2)} ${(pdfY + height / 2 - 4).toFixed(2)} Tm (Image) Tj ET`,\n );\n ops.push(`Q`);\n }\n\n for (const child of box.children) {\n drawBox(child);\n }\n };\n\n for (const box of boxes) {\n drawBox(box);\n }\n\n return ops.join(\"\\n\");\n }\n}\n\nexport function serializePdf(doc: ResolvedDocument): Uint8Array {\n return new PdfWriter().build(doc);\n}\n","import type { ReactElement } from \"react\";\nimport { elementToPdfNode } from \"./reconciler\";\nimport { layoutDocument } from \"./layout\";\nimport { serializePdf } from \"./pdf-writer\";\n\nfunction renderToBytes(element: ReactElement): Uint8Array {\n const tree = elementToPdfNode(element);\n const laidOut = layoutDocument(tree);\n return serializePdf(laidOut);\n}\n\n/** Render a `<Document>` tree to a `Uint8Array` PDF. */\nexport function pdf(element: ReactElement): Uint8Array {\n return renderToBytes(element);\n}\n\n/** Render to a Blob (browser). */\nexport function toBlob(element: ReactElement): Blob {\n const bytes = renderToBytes(element);\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return new Blob([copy], { type: \"application/pdf\" });\n}\n\n/** Render to an object URL for iframes / previews. */\nexport function toUrl(element: ReactElement): string {\n return URL.createObjectURL(toBlob(element));\n}\n\n/** Trigger a browser download of the generated PDF. */\nexport function download(\n element: ReactElement,\n filename = \"document.pdf\",\n): void {\n const url = toUrl(element);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = filename;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\n/** Async-friendly API mirroring common PDF libraries. */\nexport async function renderToBuffer(element: ReactElement): Promise<Uint8Array> {\n return renderToBytes(element);\n}\n\nexport async function renderToBlob(element: ReactElement): Promise<Blob> {\n return toBlob(element);\n}\n"],"names":["REDACT_COLOR","HIGHLIGHT_PRESETS","UNDERLINE_PRESETS","DEFAULT_HIGHLIGHT_HEX","DEFAULT_UNDERLINE_HEX","hexToMarkupColor","createMarkupId","normalizeHex","color","value","r","g","b","hex","kind","alpha","normalized","match","int","selectionRectsForPage","pageSurface","scale","selection","range","pageBox","clientRects","safeScale","layoutW","layoutH","selectionStartPoint","rects","first","a","expandRedactRects","padding","rect","drawMarkupOnCanvas","ctx","annotations","ann","x","y","w","h","thickness","createSignatureId","drawSignaturesOnCanvas","signatures","sig","img","loadImage","drawSignatureFieldsOnCanvas","fields","signedFieldIds","field","isFilled","src","resolve","reject","signatureDisplaySize","sourceWidth","sourceHeight","maxWidth","maxHeight","ratio","clientPointToPage","clientX","clientY","surface","box","pageSizeFromSurface","clientDeltaToPage","deltaX","deltaY","viewportRectToPage","viewport","surfaceRect","pageW","pageH","DEFAULT_TEXT_FONT_SIZE","DEFAULT_TEXT_COLOR","MIN_TEXT_WIDTH","MIN_TEXT_HEIGHT","createTextId","measureInlineText","fontSize","lines","lineHeight","line","resolveInlineTextPoint","textLayer","surfaceBox","toPageX","client","toPageY","toPageSize","clientSize","axis","boxSize","layout","gap","findGapBetweenSpans","doc","_a","inferFontSizeFromNode","caretX","nearest","findNearestSpanOnLine","spans","boxes","span","i","left","right","gapStart","gapEnd","best","midX","dist","node","element","inferFontSizeFromElement","height","computed","parsed","findTextFieldAtPoint","pageNumber","selectWordAtPoint","text","offset","isWordChar","ch","start","end","wordRange","drawTextsOnCanvas","texts","cursorY","drawTextFieldsOnCanvas","filledFieldIds","Icon","size","className","children","jsx","ChevronLeftIcon","props","ChevronRightIcon","DownloadIcon","jsxs","ExternalLinkIcon","GridIcon","MinusIcon","PlusIcon","PrinterIcon","RefreshIcon","RotateIcon","HighlightIcon","UnderlineIcon","EraserIcon","SignatureIcon","PencilIcon","TextIcon","PageCanvas","pdfDoc","rotation","pageRef","onRendered","markupTool","markupColor","onAddAnnotation","onRemoveAnnotation","pendingSignature","onAddSignature","onUpdateSignature","onRemoveSignature","onEditSignature","onDuplicateSignature","selectedSignatureId","onSelectSignature","signatureFields","selectedSignatureFieldId","onSelectSignatureField","hasFixedSignatureFields","onOpenSignaturePad","fieldValues","onFieldValueChange","onFieldValueCommit","pendingFieldValue","onPlaceFieldValue","onAddText","onUpdateText","onRemoveText","selectedTextId","onSelectText","textFields","_selectedTextFieldId","onSelectTextField","hasFixedTextFields","editingTextId","onEditingTextIdChange","wrapRef","useRef","canvasRef","textLayerRef","surfaceRef","renderTaskRef","textLayerInstanceRef","dragState","setDragState","useState","inlineEditRef","justOpenedEditorRef","useEffect","cancelled","canvas","textLayerDiv","page","width","task","textContent","TextLayer","applySelectionMarkup","captured","replaceSelectedPdfText","initialValue","created","handleMouseUp","handleKeyDown","event","target","hasPdfSelection","rafId","lastClientX","lastClientY","scrollDir","getScrollContainer","updateResizeAtPoint","s","pageSize","dx","dy","maxW","maxH","newW","newH","updateSignatureAtPoint","pageEl","targetPage","point","nextX","nextY","maxX","maxY","tickScroll","container","maxScroll","edge","distTop","distBottom","speed","prev","handleMove","handleUp","el","current","t","setRefs","pageAnnotations","pageSignatures","pageSignatureFields","f","pageTexts","commitInlineText","trimmed","beginInlineTextAt","fieldId","existing","handleInlineTextClick","handleSurfaceClick","renderInlineText","e","idx","filled","fType","ev","Fragment","Thumbnail","isActive","onSelect","viewportAt1","pageTextFields","ABSOLUTE_URL_PATTERN","workerConfigured","setPdfWorkerSrc","workerSrc","pdfjsLib","ensurePdfWorker","resolvePdfUrl","file","fileUrl","baseUrl","source","path","urlToPdfArrayBuffer","url","fetchOptions","res","sourceToArrayBuffer","copy","renderPageWithMarkup","options","mimeType","quality","baseViewport","pageMarks","pageSigs","dataUrl","jpegBytes","dataUrlToBytes","renderAllPagesWithMarkup","pages","base64","binary","bytes","enc","concat","parts","total","sum","p","out","part","buildPdfFromJpegPages","objects","add","pageIds","imageStream","imageId","content","contentId","pageId","kids","id","pagesId","catalogId","chunks","offsets","objHeader","objFooter","xrefStart","xref","triggerBlobDownload","blob","filename","anchor","HANDWRITING_FONTS","HANDWRITING_FONTS_HREF","handwritingFontsPromise","ensureHandwritingFonts","link","loadFaces","font","SignaturePad","open","onClose","onSave","fieldType","showFieldTypeTabs","textPlaceholder","drawingRef","lastPointRef","pathsRef","currentPathRef","resolvedFieldType","activeFieldType","setActiveFieldType","dateValue","setDateValue","textValue","setTextValue","mode","setMode","typedName","setTypedName","typedInitials","setTypedInitials","initialsTouched","setInitialsTouched","typeKind","setTypeKind","inkColor","setInkColor","fontId","setFontId","fontsReady","setFontsReady","selectedFont","previewText","fontPreviewLabel","getPoint","handlePointerDown","pt","handlePointerMove","last","handlePointerUp","clearPad","handleNameChange","deriveInitials","trimAndSave","allPaths","minX","minY","pad","pathData","svg","dpr","measureCtx","metrics","canvasW","canvasH","outCanvas","outCtx","handleFieldValueSave","showSignPad","name","TOOLBAR_TOOL_ID","createToolbarTool","displayName","Tool","getToolbarToolId","tool","isToolbarTool","Navigation","Zoom","Rotate","Reload","Print","Open","Download","Highlight","Underline","Signature","AddText","Erase","Clear","ALL_TOOLBAR_TOOLS","DEFAULT_TOOLBAR_LAYOUT","MARKUP_TOOLS","isMarkupToolbarTool","renderToolbarTool","nodes","v","next","renderMarkupExtras","enabledIds","activeMarkupHex","setActiveMarkupHex","activePresets","preset","resolveToolbarLayout","enableToolbar","flags","toIds","side","showThumbnailsToggle","filterByFlag","tools","enabled","flagMap","PdfViewer","title","initialScale","withThumbnails","thumbnailWidth","maxThumbnails","enableThumbnails","enableNavigation","enableZoom","enableRotate","enableReload","enablePrint","enableOpen","enableDownload","enableMarkup","enableHighlight","enableUnderline","enableSignature","enableText","enableErase","enableClear","onSignatureComplete","onFieldValueComplete","externalOpenSignaturePad","onSignaturePadClose","onSubmit","submitLabel","containerRef","lastBlobUrlRef","pageRefsRef","isProgrammaticScrollRef","binarySource","useMemo","resolvedUrl","status","setStatus","setPdfDoc","numPages","setNumPages","setPageNumber","setScale","setRotation","displayUrl","setDisplayUrl","showThumbnails","setShowThumbnails","isPrinting","setIsPrinting","isDownloading","setIsDownloading","setMarkupTool","setAnnotations","setSignatures","setTexts","signaturePadOpen","setSignaturePadOpen","signaturePadFieldType","setSignaturePadFieldType","setPendingSignature","setSelectedSignatureId","setSelectedSignatureFieldId","editingSignatureId","setEditingSignatureId","setSelectedTextId","selectedTextFieldId","setSelectedTextFieldId","setEditingTextId","highlightHex","setHighlightHex","underlineHex","setUnderlineHex","setFieldValues","toolbarSides","enabledToolIds","mq","apply","showHighlight","showUnderline","showSignature","showText","showErase","revokeDisplayUrl","useCallback","loadDocument","buffer","blobUrl","scrollToPage","clamped","scrollToSignatureField","focusField","fieldEl","observer","entries","canGoPrev","canGoNext","handlePrev","handleNext","handleRotate","handleZoomOut","handleZoomIn","handleFitWidth","pagePadding","nextScale","run","onMq","handlePrint","iframe","body","wrapper","_b","handleDownload","pdfBytes","toggleMarkupTool","activeMarkupColor","selectedSignature","handleAddAnnotation","annotation","handleRemoveAnnotation","handleClearAnnotations","handleOpenSignaturePad","handleFieldValueChange","handleFieldValueCommit","val","currentIndex","filledIds","k","nextField","nextType","handleSignatureSave","imageDataUrl","targetField","signature","currentPageEl","scrollContainer","visible","visibleTop","visibleBottom","visibleLeft","visibleRight","handleAddSignature","handleUpdateSignature","patch","handleRemoveSignature","removed","handleDuplicateSignature","pageWidth","pageHeight","duplicate","handleEditSignature","targetId","handleAddText","item","handleUpdateText","handleRemoveText","goToSignatureField","direction","from","nextIndex","rootStyle","toolbarCtx","visibleToolIds","ids","currentFieldIndex","filledFieldCount","fieldProgressPercent","renderSide","alignEnd","index","showMarkupSep","_","n","ThumbnailStrip","Document","_props","Page","View","Text","Image","Link","TYPE_MAP","getDisplayName","type","fn","flattenChildren","result","visit","collectText","child","elementToPdfNode","nodeType","childrenProp","childNodes","PAGE_SIZES","resolvePageSize","orientation","expandPadding","style","base","expandMargin","parseColor","input","raw","rgb","resolveLength","parent","fallback","pct","isBold","weight","DEFAULT_FONT_SIZE","DEFAULT_LINE_HEIGHT","AVG_CHAR_WIDTH","measureText","charWidth","words","word","candidate","widest","l","layoutNode","availableWidth","availableHeight","margin","outerX","outerY","contentWidth","innerWidth","measured","childBoxes","cursorX","usedMain","crossSize","remainingW","remainingH","contentHeight","finalWidth","justify","align","innerMain","freeSpace","mainOffset","betweenGap","running","layoutDocument","root","pageNode","contentRoot","escapePdfString","PdfWriter","__publicField","infoId","fontRegular","fontBold","contentStream","xrefOffset","pageStyle","ops","pageBg","drawBox","pdfY","fill","border","paddingLeft","paddingTop","textX","lineWidth","textY","serializePdf","renderToBytes","tree","laidOut","pdf","toBlob","toUrl","download","renderToBuffer","renderToBlob"],"mappings":"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"}
|