@unlev/exeq 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.css +13 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/index.ts","../src/components/pdf-builder/DesignerView.tsx","../src/types/pdf-builder.ts","../src/utils/pdfRenderer.ts","../src/components/pdf-builder/PdfViewer.tsx","../src/components/pdf-builder/FieldPropertyPanel.tsx","../src/components/pdf-builder/SignatureCanvas.tsx","../src/utils/apiKey.ts","../src/hooks/useHistory.ts","../src/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/utils/formulaResolver.ts","../src/components/pdf-builder/FieldNavigator.tsx","../src/components/pdf-builder/SignerRoleSelector.tsx"],"sourcesContent":["// Components\nexport { DesignerView } from '../components/pdf-builder/DesignerView';\nexport type { DesignerViewProps } from '../components/pdf-builder/DesignerView';\nexport { SignerView } from '../components/pdf-builder/SignerView';\nexport type { SignerViewProps } from '../components/pdf-builder/SignerView';\nexport { PdfViewer } from '../components/pdf-builder/PdfViewer';\nexport { SignatureCanvas } from '../components/pdf-builder/SignatureCanvas';\nexport { FieldPropertyPanel } from '../components/pdf-builder/FieldPropertyPanel';\nexport { FieldNavigator } from '../components/pdf-builder/FieldNavigator';\nexport { SignerRoleSelector } from '../components/pdf-builder/SignerRoleSelector';\n\n// Types\nexport type { FormField, FieldType, TextSubtype, Template } from '../types/pdf-builder';\n\n// Type helpers & constants\nexport {\n DEFAULT_SIGNER_ROLES,\n SIGNER_ROLE_COLORS,\n FIELD_DEFAULTS,\n FONT_FAMILIES,\n getSignerColor,\n createField,\n uniqueLabel,\n generateId,\n isRedactField,\n isSignatureField,\n isTextLikeField,\n getInputType,\n getCssFontFamily,\n sortFieldsByPosition,\n preserveFieldValues,\n getFieldValues,\n} from '../types/pdf-builder';\n\n// Utilities\nexport { renderPdfPages } from '../utils/pdfRenderer';\nexport type { RenderedPage } from '../utils/pdfRenderer';\nexport {\n generateFilledPdf,\n createPdfBuilder,\n applyCalibration,\n downloadPdf,\n postPdfToCallback,\n DEFAULT_CALIBRATION,\n US_LETTER,\n US_LEGAL,\n A4,\n} from '../utils/pdfFiller';\nexport type {\n FillPdfOptions,\n CreatePdfBuilderOptions,\n PdfBuilder,\n Calibration,\n} from '../utils/pdfFiller';\nexport { resolveFormula, resolveAllFormulas, BUILTIN_TRANSFORMS } from '../utils/formulaResolver';\nexport type { TransformFn, TransformMap } from '../utils/formulaResolver';\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { FormField, FieldType, Template } from '@/types/pdf-builder';\nimport { DEFAULT_SIGNER_ROLES, FIELD_DEFAULTS, createField, getSignerColor, uniqueLabel, generateId, isRedactField, isSignatureField, getCssFontFamily, sortFieldsByPosition } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldPropertyPanel, BulkPropertyPanel } from './FieldPropertyPanel';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport { isValidApiKey } from '@/utils/apiKey';\nimport { useHistory } from '@/hooks/useHistory';\nimport '@/styles/pdf-builder.css';\n\nexport interface DesignerViewProps {\n /** API key for authentication */\n apiKey?: string;\n /** URL to a PDF to pre-load */\n initialPdfUrl?: string;\n /** Existing template to load (fields, signer roles, and PDF URL) */\n initialTemplate?: Template;\n /** Called when the user clicks \"Export Template\" */\n onSave?: (template: Template) => void;\n /** Called whenever the template changes (field added/moved/edited, signer\n * role changed, PDF loaded). Use for draft persistence — e.g. save to\n * localStorage so a refresh or accidental tab close doesn't lose work.\n * Fires on every change, including programmatic ones from `initialTemplate`.\n * Debounce on the caller side if you want fewer writes. */\n onChange?: (template: Template) => void;\n /** When true, the built-in header bar is hidden (use headerPortalRef to place buttons externally) */\n hideHeader?: boolean;\n /** Ref to an element where the header action buttons should be portalled into */\n headerPortalRef?: React.RefObject<HTMLElement | null>;\n}\n\nconst FIELD_TYPE_META: { type: FieldType; label: string; icon: string; group?: string }[] = [\n { type: 'text', label: 'Text', icon: 'T' },\n { type: 'dropdown', label: 'Dropdown', icon: '▾' },\n { type: 'signature', label: 'Signature', icon: '✍' },\n { type: 'signed-date', label: 'Date', icon: '📅' },\n { type: 'checkbox', label: 'Checkbox', icon: '☑' },\n { type: 'initials', label: 'Initials', icon: 'IN' },\n { type: 'blackout', label: 'Blackout', icon: '■', group: 'redact' },\n { type: 'whiteout', label: 'Whiteout', icon: '□', group: 'redact' },\n];\n\nexport function DesignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n onSave,\n onChange,\n hideHeader,\n headerPortalRef,\n}: DesignerViewProps = {}) {\n if (!isValidApiKey(apiKey)) {\n return (\n <div className=\"designer-layout\">\n <div className=\"empty-state\">\n <h2>Invalid API Key</h2>\n <p>A valid API key is required to use Exeq. Visit <a href=\"https://exeq.org\">exeq.org</a> to get one.</p>\n </div>\n </div>\n );\n }\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const { state: fields, set: setFields, setWithoutHistory: setFieldsSilent, beginBatch, commitBatch, undo: undoFields, redo: redoFields, canUndo, canRedo } = useHistory<FormField[]>(initialTemplate?.fields ?? []);\n const [selectedFieldIds, setSelectedFieldIds] = useState<Set<string>>(new Set());\n const [signerRoles, setSignerRoles] = useState<string[]>(initialTemplate?.signerRoles ?? [...DEFAULT_SIGNER_ROLES]);\n const [activeRole, setActiveRole] = useState('Sender');\n const [activeFieldType, setActiveFieldType] = useState<FieldType>('text');\n const [loading, setLoading] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [rightTab, setRightTab] = useState<'properties' | 'fields'>('properties');\n const [isAddingRole, setIsAddingRole] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n const [draggingFieldType, setDraggingFieldType] = useState<FieldType | null>(null);\n const [panelWidth, setPanelWidth] = useState(380);\n const [zoom, setZoom] = useState(1);\n const [isPanning, setIsPanning] = useState(false);\n const panRef = useRef<{ startX: number; startY: number; scrollLeft: number; scrollTop: number } | null>(null);\n const pdfAreaRef = useRef<HTMLDivElement>(null);\n const [clipboardFields, setClipboardFields] = useState<FormField[]>([]);\n const dragGhostRef = useRef<HTMLDivElement | null>(null);\n const resizingRef = useRef(false);\n const lastStylesRef = useRef<Partial<Record<FieldType, { width: number; height: number; fontSize: number; inkColor?: string }>>>({});\n\n // Fire onChange whenever any part of the template state changes.\n // Skip the very first synchronous run so we don't echo back the initialTemplate\n // before the consumer has had a chance to mount.\n const onChangeMountedRef = useRef(false);\n useEffect(() => {\n if (!onChange) return;\n if (!onChangeMountedRef.current) {\n onChangeMountedRef.current = true;\n return;\n }\n const template: Template = {\n fields,\n signerRoles,\n pdfUrl: typeof pdfSource === 'string' ? pdfSource : '',\n };\n onChange(template);\n }, [fields, signerRoles, pdfSource, onChange]);\n\n // Load PDF from props, URL params, or postMessage\n useEffect(() => {\n const pdfUrl = initialPdfUrl || initialTemplate?.pdfUrl;\n if (pdfUrl) {\n loadPdf(pdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const paramPdf = params.get('pdf');\n if (paramPdf) {\n loadPdf(paramPdf);\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-pdf' && e.data.url) {\n loadPdf(e.data.url);\n }\n if (e.data?.type === 'load-template') {\n if (e.data.fields) setFields(e.data.fields);\n if (e.data.signerRoles) setSignerRoles(e.data.signerRoles);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialPdfUrl, initialTemplate]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const handleFileUpload = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (reader.result) loadPdf(reader.result as ArrayBuffer);\n };\n reader.readAsArrayBuffer(file);\n }, [loadPdf]);\n\n const handlePageClick = useCallback((page: number, x: number, y: number) => {\n // Preserve scroll position — creating a field shouldn't jump the view\n const scrollEl = pdfAreaRef.current;\n const scrollTop = scrollEl?.scrollTop ?? 0;\n const field = createField(activeFieldType, activeRole, page, x, y, fields);\n const sticky = lastStylesRef.current[activeFieldType];\n const styledField = sticky ? { ...field, ...sticky } : field;\n setFields(prev => [...prev, styledField]);\n setSelectedFieldIds(new Set([styledField.id]));\n // Restore after React renders\n requestAnimationFrame(() => { if (scrollEl) scrollEl.scrollTop = scrollTop; });\n setRightTab('properties');\n }, [activeFieldType, activeRole, fields]);\n\n const handleFieldMove = useCallback((id: string, page: number, x: number, y: number) => {\n setFieldsSilent(prev => prev.map(f => {\n if (f.id !== id || f.locked) return f;\n return { ...f, page, x, y };\n }));\n }, [setFieldsSilent]);\n\n const handleFieldResize = useCallback((id: string, width: number, height: number) => {\n setFieldsSilent(prev => {\n const field = prev.find(f => f.id === id);\n if (field) {\n const existing = lastStylesRef.current[field.type] || {};\n lastStylesRef.current[field.type] = { ...existing, width, height, fontSize: field.fontSize };\n }\n return prev.map(f => f.id === id ? { ...f, width, height } : f);\n });\n }, [setFieldsSilent]);\n\n const handleFieldUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => {\n if (updates.label !== undefined) {\n const otherLabels = prev.filter(f => f.id !== id).map(f => f.label);\n updates.label = uniqueLabel(updates.label, otherLabels);\n }\n const updated = prev.map(f => f.id === id ? { ...f, ...updates } : f);\n\n // Track style changes as sticky defaults for new fields of the same type\n const field = prev.find(f => f.id === id);\n if (field && (updates.fontSize !== undefined || updates.width !== undefined || updates.height !== undefined || updates.inkColor !== undefined)) {\n const merged = { ...field, ...updates };\n lastStylesRef.current[field.type] = {\n width: merged.width,\n height: merged.height,\n fontSize: merged.fontSize,\n inkColor: merged.inkColor,\n };\n }\n\n return updated;\n });\n }, []);\n\n const handleBulkUpdate = useCallback((updates: Partial<FormField>) => {\n setFields(prev => prev.map(f => selectedFieldIds.has(f.id) ? { ...f, ...updates } : f));\n }, [selectedFieldIds]);\n\n const handleAlign = useCallback((type: 'left' | 'right' | 'top' | 'bottom' | 'center-h' | 'center-v' | 'distribute-h' | 'distribute-v') => {\n setFields(prev => {\n const selected = prev.filter(f => selectedFieldIds.has(f.id));\n if (selected.length < 2) return prev;\n\n let updates: Record<string, { x?: number; y?: number }> = {};\n\n if (type === 'left') {\n const minX = Math.min(...selected.map(f => f.x));\n selected.forEach(f => { updates[f.id] = { x: minX }; });\n } else if (type === 'right') {\n const maxRight = Math.max(...selected.map(f => f.x + f.width));\n selected.forEach(f => { updates[f.id] = { x: maxRight - f.width }; });\n } else if (type === 'top') {\n const minY = Math.min(...selected.map(f => f.y));\n selected.forEach(f => { updates[f.id] = { y: minY }; });\n } else if (type === 'bottom') {\n const maxBottom = Math.max(...selected.map(f => f.y + f.height));\n selected.forEach(f => { updates[f.id] = { y: maxBottom - f.height }; });\n } else if (type === 'center-h') {\n const centers = selected.map(f => f.x + f.width / 2);\n const avgCenter = centers.reduce((a, b) => a + b, 0) / centers.length;\n selected.forEach(f => { updates[f.id] = { x: avgCenter - f.width / 2 }; });\n } else if (type === 'center-v') {\n const centers = selected.map(f => f.y + f.height / 2);\n const avgCenter = centers.reduce((a, b) => a + b, 0) / centers.length;\n selected.forEach(f => { updates[f.id] = { y: avgCenter - f.height / 2 }; });\n } else if (type === 'distribute-h') {\n const sorted = [...selected].sort((a, b) => a.x - b.x);\n const first = sorted[0], last = sorted[sorted.length - 1];\n const totalSpan = (last.x + last.width) - first.x;\n const totalFieldWidth = sorted.reduce((s, f) => s + f.width, 0);\n const gap = (totalSpan - totalFieldWidth) / (sorted.length - 1);\n let cx = first.x;\n sorted.forEach(f => { updates[f.id] = { x: cx }; cx += f.width + gap; });\n } else if (type === 'distribute-v') {\n const sorted = [...selected].sort((a, b) => a.y - b.y);\n const first = sorted[0], last = sorted[sorted.length - 1];\n const totalSpan = (last.y + last.height) - first.y;\n const totalFieldHeight = sorted.reduce((s, f) => s + f.height, 0);\n const gap = (totalSpan - totalFieldHeight) / (sorted.length - 1);\n let cy = first.y;\n sorted.forEach(f => { updates[f.id] = { y: cy }; cy += f.height + gap; });\n }\n\n return prev.map(f => updates[f.id] ? { ...f, ...updates[f.id] } : f);\n });\n }, [selectedFieldIds]);\n\n const handleFieldDelete = useCallback((id: string) => {\n const field = fields.find(f => f.id === id);\n if (field?.locked) return;\n setFields(prev => prev.filter(f => f.id !== id));\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const handleSelectField = useCallback((id: string | null, e?: React.MouseEvent) => {\n if (!id) {\n setSelectedFieldIds(new Set());\n return;\n }\n if (e && (e.metaKey || e.ctrlKey)) {\n // Cmd/Ctrl+click: toggle in/out of selection\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n } else if (e && e.shiftKey && selectedFieldIds.size > 0) {\n // Shift+click: range select in document order\n const lastId = Array.from(selectedFieldIds).pop()!;\n const sorted = sortedFields.map(f => f.id);\n const a = sorted.indexOf(lastId);\n const b = sorted.indexOf(id);\n if (a >= 0 && b >= 0) {\n const start = Math.min(a, b);\n const end = Math.max(a, b);\n const range = sorted.slice(start, end + 1);\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n range.forEach(fid => next.add(fid));\n return next;\n });\n } else {\n setSelectedFieldIds(new Set([id]));\n }\n } else {\n setSelectedFieldIds(new Set([id]));\n }\n setRightTab('properties');\n }, [selectedFieldIds]);\n\n const handleGroupMove = useCallback((ids: string[], dx: number, dy: number) => {\n setFieldsSilent(prev => prev.map(f => {\n if (!ids.includes(f.id) || f.locked) return f;\n const newX = Math.max(0, Math.min(100 - f.width, f.x + dx));\n const newY = Math.max(0, Math.min(100 - f.height, f.y + dy));\n return { ...f, x: newX, y: newY };\n }));\n }, [setFieldsSilent]);\n\n const handleAddRole = useCallback(() => {\n const name = newRoleName.trim();\n if (name && !signerRoles.includes(name)) {\n setSignerRoles(prev => [...prev, name]);\n }\n setNewRoleName('');\n setIsAddingRole(false);\n }, [newRoleName, signerRoles]);\n\n const handleRemoveRole = useCallback((role: string) => {\n setSignerRoles(prev => prev.filter(r => r !== role));\n setFields(prev => prev.map(f => f.assignee === role ? { ...f, assignee: signerRoles[0] } : f));\n if (activeRole === role) setActiveRole(signerRoles[0]);\n }, [signerRoles, activeRole]);\n\n const handleExport = useCallback(() => {\n const template: Template = {\n fields,\n signerRoles,\n pdfUrl: typeof pdfSource === 'string' ? pdfSource : '',\n };\n\n if (onSave) {\n onSave(template);\n } else {\n const json = JSON.stringify(template, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'template.json';\n a.click();\n URL.revokeObjectURL(url);\n }\n\n window.parent?.postMessage({ type: 'template-saved', template }, '*');\n }, [fields, signerRoles, pdfSource, onSave]);\n\n // Drag from palette\n const handlePaletteDragStart = useCallback((e: React.DragEvent, type: FieldType) => {\n setDraggingFieldType(type);\n e.dataTransfer.setData('application/exeq-field-type', type);\n e.dataTransfer.effectAllowed = 'copy';\n\n // Create a styled drag ghost\n const ghost = document.createElement('div');\n ghost.className = 'palette-drag-ghost';\n ghost.textContent = FIELD_TYPE_META.find(f => f.type === type)?.label || type;\n ghost.style.cssText = `\n position: fixed; top: -200px; left: -200px;\n padding: 6px 16px; background: ${getSignerColor(activeRole)};\n color: #fff; border-radius: 4px; font-size: 12px;\n font-family: system-ui; pointer-events: none; white-space: nowrap;\n `;\n document.body.appendChild(ghost);\n e.dataTransfer.setDragImage(ghost, 40, 16);\n dragGhostRef.current = ghost;\n }, [activeRole]);\n\n const handlePaletteDragEnd = useCallback(() => {\n setDraggingFieldType(null);\n if (dragGhostRef.current) {\n document.body.removeChild(dragGhostRef.current);\n dragGhostRef.current = null;\n }\n }, []);\n\n const handleDropOnPage = useCallback((page: number, x: number, y: number, fieldType: FieldType) => {\n const field = createField(fieldType, activeRole, page, x, y, fields);\n const sticky = lastStylesRef.current[fieldType];\n const styledField = sticky ? { ...field, ...sticky } : field;\n setFields(prev => [...prev, styledField]);\n setSelectedFieldIds(new Set([styledField.id]));\n setRightTab('properties');\n }, [activeRole, fields]);\n\n // Delete key handler — only when no input/textarea/select is focused\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Delete' && e.key !== 'Backspace') return;\n if (selectedFieldIds.size === 0) return;\n\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n if ((document.activeElement as HTMLElement)?.isContentEditable) return;\n\n e.preventDefault();\n setFields(prev => prev.filter(f => !selectedFieldIds.has(f.id) || f.locked));\n setSelectedFieldIds(prev => {\n const remaining = new Set<string>();\n fields.forEach(f => { if (selectedFieldIds.has(f.id) && f.locked) remaining.add(f.id); });\n return remaining;\n });\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldIds, fields]);\n\n // Copy/paste handler\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n if ((document.activeElement as HTMLElement)?.isContentEditable) return;\n\n const isMod = e.metaKey || e.ctrlKey;\n\n // Select All (Cmd/Ctrl+A)\n if (isMod && e.key === 'a') {\n e.preventDefault();\n setSelectedFieldIds(new Set(fields.map(f => f.id)));\n return;\n }\n\n // Undo (Cmd/Ctrl+Z)\n if (isMod && e.key === 'z' && !e.shiftKey) {\n e.preventDefault();\n undoFields();\n return;\n }\n\n // Redo (Cmd/Ctrl+Y or Cmd/Ctrl+Shift+Z)\n if (isMod && (e.key === 'y' || (e.key === 'z' && e.shiftKey))) {\n e.preventDefault();\n redoFields();\n return;\n }\n\n // Copy (Cmd/Ctrl+C)\n if (isMod && e.key === 'c' && selectedFieldIds.size > 0) {\n const selected = fields.filter(f => selectedFieldIds.has(f.id));\n if (selected.length > 0) {\n e.preventDefault();\n setClipboardFields(selected);\n }\n }\n\n // Paste (Cmd/Ctrl+V)\n if (isMod && e.key === 'v' && clipboardFields.length > 0) {\n e.preventDefault();\n let existingLabels = fields.map(f => f.label);\n const newIds = new Set<string>();\n const newFields = clipboardFields.map(cf => {\n const label = uniqueLabel(cf.label, existingLabels);\n existingLabels.push(label);\n const id = generateId();\n newIds.add(id);\n return { ...cf, id, label, x: cf.x + 2, y: cf.y + 2, value: '' };\n });\n setFields(prev => [...prev, ...newFields]);\n setSelectedFieldIds(newIds);\n setRightTab('properties');\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldIds, fields, clipboardFields]);\n\n // Keyboard zoom (Cmd/Ctrl + / -) and spacebar pan\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMod = e.metaKey || e.ctrlKey;\n if (isMod && (e.key === '=' || e.key === '+')) {\n e.preventDefault();\n setZoom(z => Math.min(3, z + 0.25));\n }\n if (isMod && e.key === '-') {\n e.preventDefault();\n setZoom(z => Math.max(0.75, z - 0.25));\n }\n if (isMod && e.key === '0') {\n e.preventDefault();\n setZoom(1);\n }\n if (e.key === ' ') {\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n e.preventDefault();\n e.stopPropagation();\n setIsPanning(true);\n }\n };\n const handleKeyUp = (e: KeyboardEvent) => {\n if (e.key === ' ') {\n e.preventDefault();\n setIsPanning(false);\n panRef.current = null;\n }\n };\n window.addEventListener('keydown', handleKeyDown, { capture: true });\n window.addEventListener('keyup', handleKeyUp, { capture: true });\n return () => {\n window.removeEventListener('keydown', handleKeyDown, { capture: true });\n window.removeEventListener('keyup', handleKeyUp, { capture: true });\n };\n }, []);\n\n // Mouse wheel zoom\n useEffect(() => {\n const el = pdfAreaRef.current;\n if (!el) return;\n const handleWheel = (e: WheelEvent) => {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n const delta = e.deltaY > 0 ? -0.1 : 0.1;\n setZoom(z => Math.max(0.75, Math.min(3, z + delta)));\n }\n };\n el.addEventListener('wheel', handleWheel, { passive: false });\n return () => el.removeEventListener('wheel', handleWheel);\n }, [pages.length]);\n\n // Spacebar pan handlers\n const handlePanMouseDown = useCallback((e: React.MouseEvent) => {\n if (!isPanning || !pdfAreaRef.current) return;\n e.preventDefault();\n panRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n scrollLeft: pdfAreaRef.current.scrollLeft,\n scrollTop: pdfAreaRef.current.scrollTop,\n };\n }, [isPanning]);\n\n const handlePanMouseMove = useCallback((e: React.MouseEvent) => {\n if (!panRef.current || !pdfAreaRef.current) return;\n pdfAreaRef.current.scrollLeft = panRef.current.scrollLeft - (e.clientX - panRef.current.startX);\n pdfAreaRef.current.scrollTop = panRef.current.scrollTop - (e.clientY - panRef.current.startY);\n }, []);\n\n const handlePanMouseUp = useCallback(() => {\n panRef.current = null;\n }, []);\n\n // Resize handle for right panel\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n resizingRef.current = true;\n const startX = e.clientX;\n const startWidth = panelWidth;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizingRef.current) return;\n const delta = startX - e.clientX;\n setPanelWidth(Math.max(280, Math.min(600, startWidth + delta)));\n };\n\n const handleMouseUp = () => {\n resizingRef.current = false;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [panelWidth]);\n\n const sortedFields = sortFieldsByPosition(fields);\n\n // For property panel, show the last selected field (or null if multi/none)\n const selectedField = selectedFieldIds.size === 1\n ? fields.find(f => f.id === Array.from(selectedFieldIds)[0]) || null\n : null;\n\n const renderFieldContent = useCallback((field: FormField) => {\n if (isRedactField(field)) {\n return null; // Rendered purely via background color on the overlay\n }\n if (isSignatureField(field)) {\n if (field.value) {\n return <img src={field.value} alt={field.label} className=\"field-signature-preview\" />;\n }\n }\n const inkColor = field.inkColor || '#000000';\n const cssFontFamily = getCssFontFamily(field.fontFamily);\n return (\n <div\n className=\"field-overlay-placeholder\"\n style={{\n color: field.value ? inkColor : undefined,\n fontSize: `${field.fontSize}pt`,\n fontFamily: cssFontFamily,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing}pt` : undefined,\n lineHeight: field.lineHeight ? `${field.lineHeight}` : undefined,\n }}\n >\n {field.value || field.placeholder}\n </div>\n );\n }, [fields]);\n\n const headerButtons = pages.length > 0 ? (\n <>\n <label className=\"header-btn header-btn-outline\">\n Change PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n <button onClick={handleExport} className=\"header-btn header-btn-primary\">\n Export Template\n </button>\n </>\n ) : null;\n\n return (\n <div className=\"designer-layout\">\n {/* Portal header buttons into external container if provided */}\n {headerPortalRef?.current && headerButtons && createPortal(headerButtons, headerPortalRef.current)}\n\n {/* Built-in header (hidden when hideHeader or headerPortalRef is used) */}\n {!hideHeader && !headerPortalRef && (\n <div className=\"designer-header\">\n <div className=\"designer-header-right\">\n {headerButtons}\n </div>\n </div>\n )}\n\n <div className=\"designer-body\">\n {/* ── Left palette ──────────────────────── */}\n {pages.length > 0 && (\n <div className=\"designer-palette\">\n {/* Role selector first */}\n <div className=\"palette-heading\">New Field Role</div>\n <div className=\"palette-role-section\">\n <select\n className=\"palette-role-select\"\n value={activeRole}\n onChange={e => setActiveRole(e.target.value)}\n style={{ borderColor: getSignerColor(activeRole), color: getSignerColor(activeRole) }}\n >\n {signerRoles.map(role => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n {isAddingRole ? (\n <div className=\"palette-role-add-inline\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAddRole()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAddRole}>Add</button>\n <button onClick={() => { setIsAddingRole(false); setNewRoleName(''); }}>Cancel</button>\n </div>\n ) : (\n <button className=\"palette-role-add-link\" onClick={() => setIsAddingRole(true)}>\n + Add Role\n </button>\n )}\n </div>\n\n <div className=\"palette-divider\" />\n <div className=\"palette-heading\">Fields</div>\n {FIELD_TYPE_META.filter(f => !f.group).map(({ type, label, icon }) => (\n <div\n key={type}\n className={`palette-item ${activeFieldType === type ? 'active' : ''}`}\n draggable\n onClick={() => setActiveFieldType(type)}\n onDragStart={(e) => handlePaletteDragStart(e, type)}\n onDragEnd={handlePaletteDragEnd}\n >\n <span className=\"palette-item-icon\">{icon}</span>\n <span className=\"palette-item-label\">{label}</span>\n </div>\n ))}\n\n <div className=\"palette-divider\" />\n <div className=\"palette-heading\">Redact</div>\n {FIELD_TYPE_META.filter(f => f.group === 'redact').map(({ type, label, icon }) => (\n <div\n key={type}\n className={`palette-item ${activeFieldType === type ? 'active' : ''}`}\n draggable\n onClick={() => setActiveFieldType(type)}\n onDragStart={(e) => handlePaletteDragStart(e, type)}\n onDragEnd={handlePaletteDragEnd}\n >\n <span className=\"palette-item-icon\">{icon}</span>\n <span className=\"palette-item-label\">{label}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* ── Center: PDF area ─────────────────── */}\n <div\n className={`designer-pdf-area ${isPanning ? 'panning' : ''}`}\n ref={pdfAreaRef}\n onMouseDown={isPanning ? handlePanMouseDown : undefined}\n onMouseMove={isPanning ? handlePanMouseMove : undefined}\n onMouseUp={isPanning ? handlePanMouseUp : undefined}\n onMouseLeave={isPanning ? handlePanMouseUp : undefined}\n >\n {loading && <div className=\"loading-indicator\">Loading PDF...</div>}\n {!pages.length && !loading && (\n <div className=\"empty-state\">\n <h2>Open a PDF to get started</h2>\n <p>Select a PDF from your device to begin. Your file stays on your computer — nothing is uploaded.</p>\n <label className=\"upload-btn upload-btn-large\">\n Select PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n </div>\n )}\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldIds={selectedFieldIds}\n onSelectField={handleSelectField}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\n onGroupMove={handleGroupMove}\n onMoveStart={beginBatch}\n onMoveEnd={commitBatch}\n onPageClick={handlePageClick}\n onDropField={handleDropOnPage}\n onMarqueeSelect={(ids) => setSelectedFieldIds(new Set(ids))}\n mode=\"designer\"\n renderFieldContent={renderFieldContent}\n zoom={zoom}\n />\n )}\n </div>\n\n {/* ── Right panel ──────────────────────── */}\n {pages.length > 0 && (\n <>\n <div className=\"panel-resize-handle\" onMouseDown={handleResizeStart} />\n <div className=\"designer-panel\" style={{ width: panelWidth }}>\n <div className=\"designer-panel-header\">\n <div className=\"signer-role-indicator\">\n <span className=\"signer-role-indicator-label\">Editing as</span>\n <strong>{activeRole}</strong>\n </div>\n <div className=\"zoom-slider\">\n <button onClick={() => setZoom(z => Math.max(0.75, z - 0.25))} disabled={zoom <= 0.75}>−</button>\n <input\n type=\"range\"\n min=\"75\"\n max=\"300\"\n step=\"25\"\n value={Math.round(zoom * 100)}\n onChange={e => setZoom(Number(e.target.value) / 100)}\n />\n <button onClick={() => setZoom(z => Math.min(3, z + 0.25))} disabled={zoom >= 3}>+</button>\n <div className=\"zoom-dropdown-wrapper\">\n <select\n className=\"zoom-dropdown\"\n value={Math.round(zoom * 100)}\n onChange={e => setZoom(Number(e.target.value) / 100)}\n >\n <option value=\"75\">75%</option>\n <option value=\"100\">100%</option>\n <option value=\"125\">125%</option>\n <option value=\"150\">150%</option>\n <option value=\"200\">200%</option>\n <option value=\"250\">250%</option>\n <option value=\"300\">300%</option>\n {![75,100,125,150,200,250,300].includes(Math.round(zoom * 100)) && (\n <option value={Math.round(zoom * 100)}>{Math.round(zoom * 100)}%</option>\n )}\n </select>\n </div>\n </div>\n </div>\n {/* Tabs */}\n <div className=\"panel-tabs\">\n <button\n className={`panel-tab ${rightTab === 'properties' ? 'active' : ''}`}\n onClick={() => setRightTab('properties')}\n >\n Properties\n </button>\n <button\n className={`panel-tab ${rightTab === 'fields' ? 'active' : ''}`}\n onClick={() => setRightTab('fields')}\n >\n All Fields{fields.length > 0 ? ` (${fields.length})` : ''}\n </button>\n </div>\n\n {/* Tab content */}\n <div className=\"panel-tab-content\">\n {rightTab === 'properties' && (\n <>\n {selectedFieldIds.size > 1 ? (\n <BulkPropertyPanel\n fields={fields.filter(f => selectedFieldIds.has(f.id))}\n signerRoles={signerRoles}\n onUpdate={handleBulkUpdate}\n onAlign={handleAlign}\n onDelete={() => {\n setFields(prev => prev.filter(f => !selectedFieldIds.has(f.id) || f.locked));\n setSelectedFieldIds(prev => {\n const remaining = new Set<string>();\n fields.forEach(f => { if (prev.has(f.id) && f.locked) remaining.add(f.id); });\n return remaining;\n });\n }}\n />\n ) : selectedField ? (\n <>\n <FieldPropertyPanel\n field={selectedField}\n signerRoles={signerRoles}\n onUpdate={handleFieldUpdate}\n onDelete={handleFieldDelete}\n pageSize={pages[selectedField.page] ? { width: pages[selectedField.page].pdfWidth, height: pages[selectedField.page].pdfHeight } : undefined}\n prefillContent={!isRedactField(selectedField) ? (\n <div className=\"prefill-section\">\n <label>Pre-fill Value</label>\n {(isSignatureField(selectedField)) ? (\n <SignatureCanvas\n width={panelWidth - 40}\n height={selectedField.type === 'initials' ? 100 : 150}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, { value: dataUrl })}\n initialValue={selectedField.value}\n inkColor={selectedField.inkColor}\n />\n ) : selectedField.type === 'checkbox' ? (\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.checked ? 'true' : '' })}\n />\n Checked\n </label>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.value })}\n placeholder={`Pre-fill ${selectedField.label}`}\n className=\"prefill-input\"\n style={{ color: selectedField.inkColor || '#000000' }}\n />\n )}\n </div>\n ) : undefined}\n />\n </>\n ) : (\n <div className=\"panel-empty\">\n Click on the PDF to place a field, or select an existing field to edit its properties.\n </div>\n )}\n </>\n )}\n\n {rightTab === 'fields' && (\n <>\n {fields.length === 0 ? (\n <div className=\"panel-empty\">\n No fields yet. Drag a field from the left palette onto the PDF, or click on the PDF to place one.\n </div>\n ) : (\n <div className=\"field-list\">\n {sortedFields.map((f, idx) => {\n const isSel = selectedFieldIds.has(f.id);\n const isSingleSel = isSel && selectedFieldIds.size === 1;\n const isTextLike = f.type === 'text' || f.type === 'dropdown' || f.type === 'signed-date';\n return (\n <div\n key={f.id}\n className={`field-list-item ${isSel ? 'active' : ''}`}\n onClick={(e) => {\n if ((e.target as HTMLElement).tagName === 'INPUT') return;\n if (e.metaKey || e.ctrlKey) {\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n if (next.has(f.id)) next.delete(f.id); else next.add(f.id);\n return next;\n });\n } else if (e.shiftKey && selectedFieldIds.size > 0) {\n const ids = sortedFields.map(sf => sf.id);\n const lastId = Array.from(selectedFieldIds).pop()!;\n const a = ids.indexOf(lastId);\n const b = ids.indexOf(f.id);\n if (a >= 0 && b >= 0) {\n const start = Math.min(a, b);\n const end = Math.max(a, b);\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n ids.slice(start, end + 1).forEach(id => next.add(id));\n return next;\n });\n }\n } else {\n setSelectedFieldIds(new Set([f.id]));\n }\n }}\n >\n <span\n className=\"field-list-dot\"\n style={{ backgroundColor: getSignerColor(f.assignee) }}\n />\n <span className=\"field-list-name\">{f.label}</span>\n {f.locked && <span className=\"field-list-lock\" title=\"Locked\">🔒</span>}\n <span className=\"field-list-page\">p{f.page + 1}</span>\n {f.required && <span className=\"field-list-required\">*</span>}\n {isSingleSel && isTextLike && (\n <input\n className=\"field-list-input\"\n type=\"text\"\n value={f.value}\n placeholder={f.placeholder}\n maxLength={f.maxLength || undefined}\n autoFocus\n onChange={e => handleFieldUpdate(f.id, { value: e.target.value })}\n onKeyDown={e => {\n if (e.key === 'Tab') {\n e.preventDefault();\n const dir = e.shiftKey ? -1 : 1;\n const nextIdx = idx + dir;\n if (nextIdx >= 0 && nextIdx < sortedFields.length) {\n setSelectedFieldIds(new Set([sortedFields[nextIdx].id]));\n }\n }\n }}\n onClick={e => e.stopPropagation()}\n />\n )}\n {isSingleSel && f.type === 'checkbox' && (\n <label className=\"field-list-checkbox\" onClick={e => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={f.value === 'true'}\n onChange={e => handleFieldUpdate(f.id, { value: e.target.checked ? 'true' : '' })}\n onKeyDown={e => {\n if (e.key === 'Tab') {\n e.preventDefault();\n const dir = e.shiftKey ? -1 : 1;\n const nextIdx = idx + dir;\n if (nextIdx >= 0 && nextIdx < sortedFields.length) {\n setSelectedFieldIds(new Set([sortedFields[nextIdx].id]));\n }\n }\n }}\n />\n </label>\n )}\n </div>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","export function generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport type FieldType = 'text' | 'dropdown' | 'signature' | 'signed-date' | 'checkbox' | 'initials' | 'blackout' | 'whiteout';\n\nexport type TextSubtype = 'freeform' | 'number' | 'date' | 'email' | 'phone';\n\nexport interface FormField {\n id: string;\n type: FieldType;\n textSubtype?: TextSubtype;\n label: string;\n placeholder: string;\n required: boolean;\n assignee: string; // signer role e.g. \"Sender\", \"Signer 1\"\n page: number; // 0-indexed page number\n x: number; // percentage of page width (0-100)\n y: number; // percentage of page height (0-100)\n width: number; // percentage of page width\n height: number; // percentage of page height\n fontSize: number; // in points\n value: string; // pre-filled value or current value\n inkColor?: string; // ink color for text/signature fields (default: '#000000')\n letterSpacing?: number; // extra spacing between characters in points (default: 0)\n lineHeight?: number; // line height multiplier (default: 1.2)\n minLength?: number; // min character count (0 = no minimum)\n maxLength?: number; // max character count (0 = unlimited)\n fontFamily?: string; // font family (default: 'Helvetica')\n options?: string[]; // predefined options for dropdown/radio selection\n formula?: string; // template expression e.g. \"{{Date Field | month}}\" — auto-computed from other fields\n locked?: boolean; // when true, field cannot be moved or edited in designer\n autoShrink?: boolean; // when true, font auto-shrinks to fit field width (default: false)\n}\n\nexport interface Template {\n fields: FormField[];\n signerRoles: string[];\n pdfUrl: string;\n}\n\nexport const DEFAULT_SIGNER_ROLES = ['Sender', 'Signer 1'];\n\nexport const SIGNER_ROLE_COLORS: Record<string, string> = {\n 'Sender': '#6366f1',\n 'Signer 1': '#22c55e',\n 'Signer 2': '#f59e0b',\n 'Signer 3': '#ef4444',\n 'Signer 4': '#06b6d4',\n 'Signer 5': '#d946ef',\n};\n\nexport function getSignerColor(role: string): string {\n return SIGNER_ROLE_COLORS[role] || '#888888';\n}\n\n// ── Field type helpers ──────────────────────\n\nexport function isRedactField(f: FormField | { type: FieldType }): boolean {\n return f.type === 'blackout' || f.type === 'whiteout';\n}\n\nexport function isSignatureField(f: FormField | { type: FieldType }): boolean {\n return f.type === 'signature' || f.type === 'initials';\n}\n\nexport function isTextLikeField(f: FormField | { type: FieldType }): boolean {\n return f.type === 'text' || f.type === 'dropdown' || f.type === 'signed-date';\n}\n\nexport function getInputType(subtype?: TextSubtype): string {\n switch (subtype) {\n case 'email': return 'email';\n case 'number': return 'number';\n case 'phone': return 'tel';\n case 'date': return 'date';\n default: return 'text';\n }\n}\n\nconst CSS_FONT_MAP: Record<string, string> = {\n Courier: '\"Courier New\", Courier, monospace',\n TimesRoman: '\"Times New Roman\", Times, serif',\n Helvetica: 'Helvetica, Arial, sans-serif',\n};\n\nexport function getCssFontFamily(fontFamily?: string): string | undefined {\n return fontFamily ? CSS_FONT_MAP[fontFamily] : undefined;\n}\n\nexport function sortFieldsByPosition(fields: FormField[]): FormField[] {\n return [...fields].sort((a, b) => {\n if (a.page !== b.page) return a.page - b.page;\n const bandThreshold = 2;\n if (Math.abs(a.y - b.y) > bandThreshold) return a.y - b.y;\n return a.x - b.x;\n });\n}\n\nexport function preserveFieldValues(oldFields: FormField[], newFields: FormField[]): FormField[] {\n const valueMap = new Map(oldFields.filter(f => f.value).map(f => [f.id, f.value]));\n return newFields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n}\n\nexport function getFieldValues(fields: FormField[]): Record<string, string> {\n const values: Record<string, string> = {};\n fields.forEach(f => { if (!isRedactField(f)) values[f.label] = f.value || ''; });\n return values;\n}\n\nexport const FONT_FAMILIES = [\n { value: 'Helvetica', label: 'Helvetica' },\n { value: 'Courier', label: 'Courier New' },\n { value: 'TimesRoman', label: 'Times New Roman' },\n] as const;\n\nexport const FIELD_DEFAULTS: Record<FieldType, Partial<FormField>> = {\n text: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: 'Enter text',\n textSubtype: 'freeform',\n },\n dropdown: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: 'Select...',\n },\n signature: {\n width: 20,\n height: 6,\n fontSize: 12,\n placeholder: 'Sign here',\n },\n 'signed-date': {\n width: 15,\n height: 3,\n fontSize: 12,\n placeholder: 'Date',\n },\n checkbox: {\n width: 2.5,\n height: 2.5,\n fontSize: 12,\n placeholder: '',\n },\n initials: {\n width: 8,\n height: 5,\n fontSize: 12,\n placeholder: 'Initials',\n },\n blackout: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: '',\n },\n whiteout: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: '',\n },\n};\n\nconst TYPE_LABELS: Record<FieldType, string> = {\n text: 'Text Field',\n dropdown: 'Dropdown',\n signature: 'Signature',\n 'signed-date': 'Signed Date',\n checkbox: 'Checkbox',\n initials: 'Initials',\n blackout: 'Blackout',\n whiteout: 'Whiteout',\n};\n\n/** Given a desired label and a list of existing labels, return a unique label by appending a number if needed. */\nexport function uniqueLabel(desired: string, existingLabels: string[]): string {\n const lower = desired.toLowerCase();\n if (!existingLabels.some(l => l.toLowerCase() === lower)) return desired;\n let i = 2;\n while (existingLabels.some(l => l.toLowerCase() === `${lower} ${i}`)) i++;\n return `${desired} ${i}`;\n}\n\nexport function createField(\n type: FieldType,\n assignee: string,\n page: number,\n x: number,\n y: number,\n existingFields?: FormField[],\n): FormField {\n const defaults = FIELD_DEFAULTS[type];\n const baseLabel = TYPE_LABELS[type];\n const existingLabels = existingFields?.map(f => f.label) ?? [];\n return {\n id: generateId(),\n type,\n label: uniqueLabel(baseLabel, existingLabels),\n placeholder: defaults.placeholder || '',\n required: type === 'checkbox' || type === 'blackout' || type === 'whiteout' ? false : true,\n assignee,\n page,\n x,\n y,\n width: defaults.width || 20,\n height: defaults.height || 3,\n fontSize: defaults.fontSize || 12,\n value: '',\n ...(type === 'text' ? { textSubtype: defaults.textSubtype as TextSubtype } : {}),\n };\n}\n","import * as pdfjsLib from 'pdfjs-dist';\n\n// Configure the worker\nif (typeof window !== 'undefined') {\n pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.mjs`;\n}\n\nexport interface RenderedPage {\n pageNumber: number;\n dataUrl: string;\n width: number;\n /** Original PDF page width in points */\n pdfWidth: number;\n /** Original PDF page height in points */\n pdfHeight: number;\n height: number;\n}\n\nexport async function renderPdfPages(\n source: string | ArrayBuffer,\n scale: number = 2,\n): Promise<RenderedPage[]> {\n const loadingTask = pdfjsLib.getDocument(\n typeof source === 'string' ? { url: source } : { data: source }\n );\n const pdf = await loadingTask.promise;\n const pages: RenderedPage[] = [];\n\n for (let i = 1; i <= pdf.numPages; i++) {\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d')!;\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n const unscaledViewport = page.getViewport({ scale: 1 });\n pages.push({\n pageNumber: i,\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height,\n pdfWidth: unscaledViewport.width,\n pdfHeight: unscaledViewport.height,\n });\n }\n\n return pages;\n}\n","'use client';\n\nimport { useRef, useCallback, useState } from 'react';\nimport type { FormField, FieldType } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { getSignerColor, isRedactField } from '@/types/pdf-builder';\n\ninterface PdfViewerProps {\n pages: RenderedPage[];\n fields: FormField[];\n selectedFieldIds: Set<string>;\n onSelectField: (id: string | null, e?: React.MouseEvent) => void;\n onFieldMove?: (id: string, page: number, x: number, y: number) => void;\n onFieldResize?: (id: string, width: number, height: number) => void;\n onPageClick?: (page: number, x: number, y: number) => void;\n onDropField?: (page: number, x: number, y: number, fieldType: FieldType) => void;\n /** Move multiple fields as a group. Called with dx/dy in percentage units. */\n onGroupMove?: (ids: string[], dx: number, dy: number) => void;\n /** Called when a drag/resize operation starts (for undo history batching). */\n onMoveStart?: () => void;\n /** Called when a drag/resize operation ends (for undo history commit). */\n onMoveEnd?: () => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n zoom?: number;\n /** Called with field IDs inside a drag-selection rectangle */\n onMarqueeSelect?: (ids: string[]) => void;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldIds,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n onDropField,\n onGroupMove,\n onMoveStart,\n onMoveEnd,\n mode,\n currentSigner,\n renderFieldContent,\n zoom = 1,\n onMarqueeSelect,\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [guides, setGuides] = useState<{ page: number; x?: number; y?: number }[]>([]);\n const [marquee, setMarquee] = useState<{ page: number; x1: number; y1: number; x2: number; y2: number } | null>(null);\n const marqueeRef = useRef<{ startX: number; startY: number; page: number; didDrag: boolean } | null>(null);\n\n // Replaced onClick with mousedown/up to distinguish click vs drag-select\n const handlePageMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement>, pageIndex: number) => {\n const target = e.target as HTMLElement;\n if (target.closest('.field-overlay')) return;\n if (mode !== 'designer') return;\n e.preventDefault();\n\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n\n marqueeRef.current = { startX: x, startY: y, page: pageIndex, didDrag: false };\n\n const handleMouseMove = (ev: MouseEvent) => {\n if (!marqueeRef.current) return;\n const mx = ((ev.clientX - rect.left) / rect.width) * 100;\n const my = ((ev.clientY - rect.top) / rect.height) * 100;\n const dx = Math.abs(mx - marqueeRef.current.startX);\n const dy = Math.abs(my - marqueeRef.current.startY);\n if (dx > 1 || dy > 1) {\n marqueeRef.current.didDrag = true;\n setMarquee({\n page: pageIndex,\n x1: Math.min(marqueeRef.current.startX, mx),\n y1: Math.min(marqueeRef.current.startY, my),\n x2: Math.max(marqueeRef.current.startX, mx),\n y2: Math.max(marqueeRef.current.startY, my),\n });\n }\n };\n\n const handleMouseUp = (ev: MouseEvent) => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n\n if (marqueeRef.current?.didDrag && onMarqueeSelect) {\n const mx1 = Math.min(marqueeRef.current.startX, ((ev.clientX - rect.left) / rect.width) * 100);\n const my1 = Math.min(marqueeRef.current.startY, ((ev.clientY - rect.top) / rect.height) * 100);\n const mx2 = Math.max(marqueeRef.current.startX, ((ev.clientX - rect.left) / rect.width) * 100);\n const my2 = Math.max(marqueeRef.current.startY, ((ev.clientY - rect.top) / rect.height) * 100);\n const pageFields = fields.filter(f => f.page === pageIndex);\n const hits = pageFields.filter(f => {\n return f.x < mx2 && f.x + f.width > mx1 && f.y < my2 && f.y + f.height > my1;\n }).map(f => f.id);\n onMarqueeSelect(hits);\n } else if (!marqueeRef.current?.didDrag) {\n // Simple click — create a new field\n if (onPageClick) {\n onPageClick(pageIndex, x, y);\n } else {\n onSelectField(null);\n }\n }\n\n marqueeRef.current = null;\n setMarquee(null);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [mode, fields, onPageClick, onSelectField, onMarqueeSelect]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n if (e.dataTransfer.types.includes('application/exeq-field-type')) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n }\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, pageIndex: number) => {\n const fieldType = e.dataTransfer.getData('application/exeq-field-type') as FieldType;\n if (!fieldType || !onDropField) return;\n e.preventDefault();\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n onDropField(pageIndex, x, y, fieldType);\n }, [onDropField]);\n\n return (\n <div className=\"pdf-viewer-zoom-wrapper\" ref={containerRef} style={zoom !== 1 ? { width: `${zoom * 100}%`, minHeight: 'min-content' } : undefined}>\n <div className=\"pdf-viewer\" style={zoom !== 1 ? { transform: `scale(${zoom})`, transformOrigin: 'top left', width: `${100 / zoom}%` } : undefined}>\n {pages.map((page, pageIndex) => {\n const pageFields = fields.filter(f => f.page === pageIndex);\n return (\n <div\n key={pageIndex}\n className=\"pdf-page\"\n style={{ width: `${page.pdfWidth || 612}pt`, maxWidth: '100%', aspectRatio: `${page.width} / ${page.height}` }}\n onMouseDown={(e) => handlePageMouseDown(e, pageIndex)}\n onDragOver={handleDragOver}\n onDrop={(e) => handleDrop(e, pageIndex)}\n data-page={pageIndex}\n >\n <img\n src={page.dataUrl}\n alt={`Page ${pageIndex + 1}`}\n className=\"pdf-page-image\"\n draggable={false}\n />\n {pageFields.map(field => (\n <FieldOverlayItem\n key={field.id}\n field={field}\n isSelected={selectedFieldIds.has(field.id)}\n isMultiSelected={selectedFieldIds.size > 1 && selectedFieldIds.has(field.id)}\n onSelect={(e) => onSelectField(field.id, e)}\n onMove={onFieldMove}\n onResize={onFieldResize}\n onGroupMove={selectedFieldIds.size > 1 && selectedFieldIds.has(field.id) ? onGroupMove : undefined}\n onMoveStart={onMoveStart}\n onMoveEnd={onMoveEnd}\n otherFields={mode === 'designer' ? pageFields.filter(f => f.id !== field.id && !selectedFieldIds.has(f.id)) : undefined}\n setGuides={mode === 'designer' ? setGuides : undefined}\n pageIndex={pageIndex}\n selectedIds={selectedFieldIds}\n mode={mode}\n currentSigner={currentSigner}\n renderContent={renderFieldContent}\n />\n ))}\n {/* Snap alignment guides */}\n {guides.filter(g => g.page === pageIndex).map((g, i) => (\n g.x !== undefined ? (\n <div key={`gx${i}`} className=\"snap-guide snap-guide-v\" style={{ left: `${g.x}%` }} />\n ) : (\n <div key={`gy${i}`} className=\"snap-guide snap-guide-h\" style={{ top: `${g.y}%` }} />\n )\n ))}\n {/* Marquee selection rectangle */}\n {marquee && marquee.page === pageIndex && (\n <div className=\"marquee-rect\" style={{\n left: `${marquee.x1}%`,\n top: `${marquee.y1}%`,\n width: `${marquee.x2 - marquee.x1}%`,\n height: `${marquee.y2 - marquee.y1}%`,\n }} />\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface FieldOverlayItemProps {\n field: FormField;\n isSelected: boolean;\n isMultiSelected: boolean;\n onSelect: (e: React.MouseEvent) => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n onGroupMove?: (ids: string[], dx: number, dy: number) => void;\n onMoveStart?: () => void;\n onMoveEnd?: () => void;\n otherFields?: FormField[];\n setGuides?: (guides: { page: number; x?: number; y?: number }[]) => void;\n pageIndex?: number;\n selectedIds: Set<string>;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nconst SNAP_THRESHOLD = 1.2; // percentage units\n\nfunction snapAndGuide(\n field: { x: number; y: number; width: number; height: number },\n others: FormField[],\n page: number,\n): { x: number; y: number; guides: { page: number; x?: number; y?: number }[] } {\n const fx = field.x, fy = field.y, fw = field.width, fh = field.height;\n const fcx = fx + fw / 2, fcy = fy + fh / 2;\n\n // Find the closest snap on each axis independently\n let bestSnapX: { offset: number; guideX: number; dist: number } | null = null;\n let bestSnapY: { offset: number; guideY: number; dist: number } | null = null;\n\n for (const o of others) {\n const ox = o.x, oy = o.y, ow = o.width, oh = o.height;\n const ocx = ox + ow / 2, ocy = oy + oh / 2;\n\n // X candidates: [fieldEdge, targetEdge, guideLineX]\n const xCandidates = [\n [fx, ox, ox], // left ↔ left\n [fx + fw, ox + ow, ox + ow], // right ↔ right\n [fcx, ocx, ocx], // center ↔ center\n [fx, ox + ow, ox + ow], // left ↔ right\n [fx + fw, ox, ox], // right ↔ left\n ];\n for (const [fe, te, gx] of xCandidates) {\n const d = Math.abs(fe - te);\n if (d < SNAP_THRESHOLD && (!bestSnapX || d < bestSnapX.dist)) {\n bestSnapX = { offset: te - fe, guideX: gx, dist: d };\n }\n }\n\n // Y candidates\n const yCandidates = [\n [fy, oy, oy], // top ↔ top\n [fy + fh, oy + oh, oy + oh], // bottom ↔ bottom\n [fcy, ocy, ocy], // center ↔ center\n [fy, oy + oh, oy + oh], // top ↔ bottom\n [fy + fh, oy, oy], // bottom ↔ top\n ];\n for (const [fe, te, gy] of yCandidates) {\n const d = Math.abs(fe - te);\n if (d < SNAP_THRESHOLD && (!bestSnapY || d < bestSnapY.dist)) {\n bestSnapY = { offset: te - fe, guideY: gy, dist: d };\n }\n }\n }\n\n const snappedX = bestSnapX ? fx + bestSnapX.offset : fx;\n const snappedY = bestSnapY ? fy + bestSnapY.offset : fy;\n\n const guides: { page: number; x?: number; y?: number }[] = [];\n if (bestSnapX) guides.push({ page, x: bestSnapX.guideX });\n if (bestSnapY) guides.push({ page, y: bestSnapY.guideY });\n\n return {\n x: Math.max(0, Math.min(100 - fw, snappedX)),\n y: Math.max(0, Math.min(100 - fh, snappedY)),\n guides,\n };\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n isMultiSelected,\n onSelect,\n onMove,\n onResize,\n onGroupMove,\n onMoveStart,\n onMoveEnd,\n otherFields,\n setGuides,\n pageIndex,\n selectedIds,\n mode,\n currentSigner,\n renderContent,\n}: FieldOverlayItemProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const dragStartRef = useRef<{ startX: number; startY: number; fieldX: number; fieldY: number } | null>(null);\n const dragPosRef = useRef<{ x: number; y: number }>({ x: field.x, y: field.y });\n const didDragRef = useRef(false);\n const resizeStartRef = useRef<{ startX: number; startY: number; fieldW: number; fieldH: number } | null>(null);\n\n const isRedact = isRedactField(field);\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\n const isInactiveSigner = mode === 'signer' && !isRedact && field.assignee !== currentSigner;\n const isFilled = mode === 'signer' && isEditable && !isRedact && (\n field.type === 'checkbox' ? true :\n field.formula ? true :\n !!field.value\n );\n const color = isInactiveSigner ? '#cccccc' : (isFilled ? '#22c55e' : getSignerColor(field.assignee));\n const isPreFilled = !isEditable && !!field.value;\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onMove) return;\n e.preventDefault();\n e.stopPropagation();\n\n // If this field is already selected in a group, don't deselect others on mousedown\n // (wait for mouseup to decide if it was a click or a drag)\n const alreadyInSelection = selectedIds.has(field.id) && selectedIds.size > 1;\n if (!alreadyInSelection) {\n onSelect(e);\n }\n if (field.locked) return;\n\n onMoveStart?.();\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n didDragRef.current = false;\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldX: field.x,\n fieldY: field.y,\n };\n\n const handleMouseMove = (ev: MouseEvent) => {\n if (!dragStartRef.current) return;\n didDragRef.current = true;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((ev.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((ev.clientY - dragStartRef.current.startY) / rect.height) * 100;\n\n if (isMultiSelected && onGroupMove) {\n onGroupMove(Array.from(selectedIds), dx, dy);\n dragStartRef.current.startX = ev.clientX;\n dragStartRef.current.startY = ev.clientY;\n } else {\n const newX = Math.max(0, Math.min(100 - field.width, dragStartRef.current.fieldX + dx));\n const newY = Math.max(0, Math.min(100 - field.height, dragStartRef.current.fieldY + dy));\n dragPosRef.current = { x: newX, y: newY };\n onMove(field.id, field.page, newX, newY);\n // Show guides only when Shift is held\n if (ev.shiftKey && otherFields && setGuides && pageIndex !== undefined) {\n const { guides: g } = snapAndGuide({ x: newX, y: newY, width: field.width, height: field.height }, otherFields, pageIndex);\n setGuides(g);\n } else {\n setGuides?.([]);\n }\n }\n };\n\n const handleMouseUp = (ev: MouseEvent) => {\n // Snap only when Shift is held and an actual drag occurred\n if (ev.shiftKey && didDragRef.current && otherFields && onMove && pageIndex !== undefined && !isMultiSelected) {\n const pos = dragPosRef.current;\n const snap = snapAndGuide({ x: pos.x, y: pos.y, width: field.width, height: field.height }, otherFields, pageIndex);\n if (snap.x !== pos.x || snap.y !== pos.y) {\n onMove(field.id, field.page, snap.x, snap.y);\n }\n }\n dragStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n setGuides?.([]);\n onMoveEnd?.();\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onMove, onSelect, isMultiSelected, onGroupMove, onMoveStart, onMoveEnd, selectedIds, otherFields, setGuides, pageIndex]);\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onResize || field.locked) return;\n e.preventDefault();\n e.stopPropagation();\n onMoveStart?.();\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n resizeStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldW: field.width,\n fieldH: field.height,\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dw = ((e.clientX - resizeStartRef.current.startX) / rect.width) * 100;\n const dh = ((e.clientY - resizeStartRef.current.startY) / rect.height) * 100;\n const newW = Math.max(2, Math.min(100 - field.x, resizeStartRef.current.fieldW + dw));\n const newH = Math.max(1.5, Math.min(100 - field.y, resizeStartRef.current.fieldH + dh));\n onResize(field.id, newW, newH);\n };\n\n const handleMouseUp = () => {\n resizeStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n onMoveEnd?.();\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onResize, onMoveStart, onMoveEnd]);\n\n return (\n <div\n ref={overlayRef}\n className={`field-overlay ${isSelected ? 'selected' : ''} ${isEditable ? 'editable' : 'readonly'} ${isPreFilled ? 'prefilled' : ''} ${isRedact ? 'redact' : ''} ${isInactiveSigner ? 'inactive-signer' : ''} ${field.locked ? 'locked' : ''}`}\n style={{\n left: `${field.x}%`,\n top: `${field.y}%`,\n width: `${field.width}%`,\n height: `${field.height}%`,\n borderColor: isRedact ? (field.type === 'blackout' ? '#666' : '#bbb') : color,\n borderStyle: isRedact ? 'dashed' : 'solid',\n backgroundColor: isRedact\n ? (field.type === 'blackout' ? '#000000' : '#ffffff')\n : isInactiveSigner ? '#f5f5f5' : (isSelected ? `${color}22` : `${color}11`),\n cursor: mode === 'designer' ? (field.locked ? 'not-allowed' : 'move') : 'default',\n pointerEvents: (mode === 'signer' && (isRedact || isInactiveSigner)) ? 'none' : undefined,\n }}\n onClick={(e) => { e.stopPropagation(); if (!didDragRef.current) onSelect(e); }}\n onMouseDown={handleMouseDown}\n >\n {mode === 'designer' && !isRedact && (\n <div className=\"field-overlay-label\" style={{ backgroundColor: color }}>\n {field.label}\n </div>\n )}\n\n {renderContent ? renderContent(field) : (\n <div className=\"field-overlay-placeholder\">\n {field.value || field.placeholder}\n </div>\n )}\n\n {mode === 'designer' && isSelected && !field.locked && (\n <div\n className=\"field-resize-handle\"\n onMouseDown={handleResizeMouseDown}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor, FONT_FAMILIES, isRedactField, isSignatureField, isTextLikeField } from '@/types/pdf-builder';\n\nconst INK_COLORS = [\n { value: '#000000', label: 'Black' },\n { value: '#1a56db', label: 'Blue' },\n];\n\ninterface FieldPropertyPanelProps {\n field: FormField;\n signerRoles: string[];\n onUpdate: (id: string, updates: Partial<FormField>) => void;\n onDelete: (id: string) => void;\n /** Rendered in the Content section, after options and before Style */\n prefillContent?: React.ReactNode;\n /** Page dimensions in points for converting % to pt in the Advanced panel */\n pageSize?: { width: number; height: number };\n}\n\nexport function FieldPropertyPanel({ field, signerRoles, onUpdate, onDelete, prefillContent, pageSize }: FieldPropertyPanelProps) {\n const color = getSignerColor(field.assignee);\n const isRedact = isRedactField(field);\n const isText = isTextLikeField(field);\n const showInkColor = isText || isSignatureField(field);\n const [newOption, setNewOption] = useState('');\n\n return (\n <div className=\"field-property-panel\">\n {/* ── Header ── */}\n <div className=\"panel-header\">\n <input\n className=\"panel-header-label\"\n style={{ color }}\n value={field.label}\n onChange={e => onUpdate(field.id, { label: e.target.value })}\n />\n <div className=\"panel-header-actions\">\n <button\n onClick={() => onUpdate(field.id, { locked: !field.locked })}\n className={`panel-icon-btn ${field.locked ? 'active' : ''}`}\n title={field.locked ? 'Unlock' : 'Lock'}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n {field.locked ? (\n <><rect x=\"2\" y=\"6\" width=\"10\" height=\"7\" rx=\"1.5\"/><path d=\"M4.5 6V4.5a2.5 2.5 0 015 0V6\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\"/></>\n ) : (\n <><rect x=\"2\" y=\"6\" width=\"10\" height=\"7\" rx=\"1.5\"/><path d=\"M4.5 6V4.5a2.5 2.5 0 015 0\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\"/></>\n )}\n </svg>\n </button>\n <button onClick={() => onDelete(field.id)} className=\"panel-icon-btn panel-icon-btn-danger\" title=\"Delete\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n <path d=\"M5 1h4v1H5V1zM2 3v1h1v8.5A1.5 1.5 0 004.5 14h5a1.5 1.5 0 001.5-1.5V4h1V3H2zm2 1h6v8.5a.5.5 0 01-.5.5h-5a.5.5 0 01-.5-.5V4z\"/>\n </svg>\n </button>\n </div>\n </div>\n\n {/* ── Assigned To ── */}\n {!isRedact && (\n <div className=\"panel-section\">\n <div className=\"panel-section-heading\">Assigned To</div>\n <select\n className=\"panel-assignee-select\"\n value={field.assignee}\n onChange={e => onUpdate(field.id, { assignee: e.target.value })}\n style={{ borderColor: color, color }}\n >\n {signerRoles.map(role => (\n <option key={role} value={role} style={{ color: getSignerColor(role) }}>{role}</option>\n ))}\n </select>\n </div>\n )}\n\n {/* ── Content Section ── */}\n <div className=\"panel-section\">\n <div className=\"panel-section-heading\">Content</div>\n\n {!isRedact && (\n <div className=\"panel-field\">\n <label>Field Type</label>\n <select value={field.type} onChange={e => onUpdate(field.id, { type: e.target.value as FieldType })}>\n <option value=\"text\">Text</option>\n <option value=\"dropdown\">Dropdown</option>\n <option value=\"signature\">Signature</option>\n <option value=\"signed-date\">Signed Date</option>\n <option value=\"checkbox\">Checkbox</option>\n <option value=\"initials\">Initials</option>\n </select>\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Text Type</label>\n <select value={field.textSubtype || 'freeform'} onChange={e => onUpdate(field.id, { textSubtype: e.target.value as TextSubtype })}>\n <option value=\"freeform\">Freeform</option>\n <option value=\"number\">Number</option>\n <option value=\"date\">Date</option>\n <option value=\"email\">Email</option>\n <option value=\"phone\">Phone</option>\n </select>\n </div>\n )}\n\n {!isRedact && (\n <div className=\"panel-field\">\n <label>Placeholder</label>\n <input type=\"text\" value={field.placeholder} onChange={e => onUpdate(field.id, { placeholder: e.target.value })} />\n </div>\n )}\n\n {!isRedact && field.type !== 'checkbox' && (\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input type=\"checkbox\" checked={field.required} onChange={e => onUpdate(field.id, { required: e.target.checked })} />\n Required\n </label>\n </div>\n )}\n\n {isText && (\n <div className=\"panel-field\">\n <label>Formula</label>\n <input type=\"text\" value={field.formula || ''} onChange={e => onUpdate(field.id, { formula: e.target.value || undefined })} placeholder='e.g. {{Date Field | month}}' />\n {field.formula && <span className=\"panel-hint\">Auto-computed. Signer cannot edit.</span>}\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Min Chars</label>\n <input type=\"number\" min=\"0\" max=\"9999\" value={field.minLength || 0} onChange={e => onUpdate(field.id, { minLength: Number(e.target.value) })} />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Max Chars</label>\n <input type=\"number\" min=\"0\" max=\"9999\" value={field.maxLength || 0} onChange={e => onUpdate(field.id, { maxLength: Number(e.target.value) })} />\n </div>\n </div>\n )}\n\n {isText && (\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input type=\"checkbox\" checked={field.autoShrink || false} onChange={e => onUpdate(field.id, { autoShrink: e.target.checked })} />\n Auto-shrink to fit\n </label>\n {field.autoShrink && <span className=\"panel-hint\">Font size reduces to fit text within the field width</span>}\n </div>\n )}\n\n {/* Predefined Options */}\n {(field.type === 'text' || field.type === 'dropdown') && (\n <div className=\"panel-field\">\n <label>{field.type === 'dropdown' ? 'Options' : 'Predefined Options'}</label>\n <div className=\"panel-options-list\">\n {(field.options || []).map((opt, i) => (\n <div key={i} className=\"panel-option-item\">\n <span>{opt}</span>\n <button className=\"panel-option-remove\" onClick={() => {\n const updated = (field.options || []).filter((_, j) => j !== i);\n onUpdate(field.id, { options: updated.length > 0 ? updated : undefined });\n }}>×</button>\n </div>\n ))}\n <div className=\"panel-option-add\">\n <input type=\"text\" value={newOption} onChange={e => setNewOption(e.target.value)} onKeyDown={e => {\n if (e.key === 'Enter' && newOption.trim()) { onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] }); setNewOption(''); }\n }} placeholder=\"Add option...\" />\n <button onClick={() => { if (newOption.trim()) { onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] }); setNewOption(''); } }}>+</button>\n </div>\n </div>\n {field.type === 'dropdown' && (field.options?.length ?? 0) === 0 && <span className=\"panel-hint\" style={{ color: '#c44' }}>Add at least one option</span>}\n {field.type === 'text' && (field.options?.length ?? 0) > 0 && <span className=\"panel-hint\">Signer will choose from these options via dropdown</span>}\n </div>\n )}\n\n {prefillContent}\n </div>\n\n {/* ── Style Section ── */}\n {(isText || showInkColor) && (\n <div className=\"panel-section\">\n <div className=\"panel-section-heading\">Style</div>\n\n {isText && (\n <div className=\"panel-field\">\n <label>Font</label>\n <select value={field.fontFamily || 'Helvetica'} onChange={e => onUpdate(field.id, { fontFamily: e.target.value })}>\n {FONT_FAMILIES.map(f => <option key={f.value} value={f.value}>{f.label}</option>)}\n </select>\n </div>\n )}\n\n {isText && (\n <div className=\"panel-field\">\n <label>Font Size (pt)</label>\n <input type=\"number\" min=\"6\" max=\"72\" value={field.fontSize} onChange={e => onUpdate(field.id, { fontSize: Number(e.target.value) })} />\n </div>\n )}\n\n {isText && (\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Letter Spacing</label>\n <input type=\"number\" min=\"0\" max=\"20\" step=\"0.5\" value={field.letterSpacing || 0} onChange={e => onUpdate(field.id, { letterSpacing: Number(e.target.value) })} />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Line Height</label>\n <input type=\"number\" min=\"0.8\" max=\"3\" step=\"0.1\" value={field.lineHeight || 1.2} onChange={e => onUpdate(field.id, { lineHeight: Number(e.target.value) })} />\n </div>\n </div>\n )}\n\n {showInkColor && (\n <div className=\"panel-field\">\n <label>Ink Color</label>\n <div className=\"ink-color-picker\">\n {INK_COLORS.map(c => (\n <button key={c.value} className={`ink-color-swatch ${(field.inkColor || '#000000') === c.value ? 'active' : ''}`} style={{ backgroundColor: c.value }} onClick={() => onUpdate(field.id, { inkColor: c.value })} title={c.label} />\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* ── Position & Size Section ── */}\n <div className=\"panel-section\">\n <div className=\"panel-section-heading\">Position & Size</div>\n {(() => {\n const pw = pageSize?.width || 612;\n const ph = pageSize?.height || 792;\n const toPt = (pct: number, dim: number) => Math.round(pct / 100 * dim * 10) / 10;\n const fromPt = (pt: number, dim: number) => pt / dim * 100;\n return (\n <>\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>X (pt)</label>\n <input type=\"number\" min=\"0\" step=\"0.5\" value={toPt(field.x, pw)} onChange={e => onUpdate(field.id, { x: fromPt(Number(e.target.value), pw) })} />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Y (pt)</label>\n <input type=\"number\" min=\"0\" step=\"0.5\" value={toPt(field.y, ph)} onChange={e => onUpdate(field.id, { y: fromPt(Number(e.target.value), ph) })} />\n </div>\n </div>\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Width (pt)</label>\n <input type=\"number\" min=\"1\" step=\"0.5\" value={toPt(field.width, pw)} onChange={e => onUpdate(field.id, { width: fromPt(Number(e.target.value), pw) })} />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Height (pt)</label>\n <input type=\"number\" min=\"1\" step=\"0.5\" value={toPt(field.height, ph)} onChange={e => onUpdate(field.id, { height: fromPt(Number(e.target.value), ph) })} />\n </div>\n </div>\n <div className=\"panel-hint\">{pw} × {ph} pt · Page {field.page + 1} · {field.id.slice(0, 8)}</div>\n </>\n );\n })()}\n </div>\n </div>\n );\n}\n\n// ── Bulk Property Panel (multi-select) ─────────────\n\ninterface BulkPropertyPanelProps {\n fields: FormField[];\n signerRoles: string[];\n onUpdate: (updates: Partial<FormField>) => void;\n onAlign: (type: 'left' | 'right' | 'top' | 'bottom' | 'center-h' | 'center-v' | 'distribute-h' | 'distribute-v') => void;\n onDelete: () => void;\n}\n\n/** Returns the shared value if all items agree, or undefined if mixed. */\nfunction sharedValue<T>(items: T[]): T | undefined {\n if (items.length === 0) return undefined;\n return items.every(v => v === items[0]) ? items[0] : undefined;\n}\n\nexport function BulkPropertyPanel({ fields, signerRoles, onUpdate, onAlign, onDelete }: BulkPropertyPanelProps) {\n const count = fields.length;\n const hasText = fields.some(f => f.type === 'text' || f.type === 'dropdown' || f.type === 'signed-date');\n const allNonRedact = fields.every(f => f.type !== 'blackout' && f.type !== 'whiteout');\n\n const sharedAssignee = sharedValue(fields.map(f => f.assignee));\n const sharedRequired = sharedValue(fields.map(f => f.required));\n const sharedFontSize = sharedValue(fields.map(f => f.fontSize));\n const sharedFontFamily = sharedValue(fields.map(f => f.fontFamily || 'Helvetica'));\n const sharedInkColor = sharedValue(fields.map(f => f.inkColor || '#000000'));\n const sharedLetterSpacing = sharedValue(fields.map(f => f.letterSpacing || 0));\n const sharedLineHeight = sharedValue(fields.map(f => f.lineHeight || 1.2));\n\n return (\n <div className=\"field-property-panel\">\n <div className=\"panel-header\">\n <h3>{count} fields selected</h3>\n <button onClick={onDelete} className=\"panel-delete-btn\">\n Delete All\n </button>\n </div>\n\n <div className=\"panel-field\">\n <label>Align</label>\n <div className=\"align-buttons\">\n <button onClick={() => onAlign('left')} title=\"Align left edges\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"1\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"4\" y=\"2\" width=\"8\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"4\" y=\"7\" width=\"5\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('center-h')} title=\"Align centers horizontally\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"6.25\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"2\" y=\"2\" width=\"10\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"3.5\" y=\"7\" width=\"7\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('right')} title=\"Align right edges\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"11.5\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"2\" y=\"2\" width=\"8\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"5\" y=\"7\" width=\"5\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('top')} title=\"Align top edges\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"1\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"2\" y=\"4\" width=\"3\" height=\"8\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"7\" y=\"4\" width=\"3\" height=\"5\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('center-v')} title=\"Align centers vertically\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"6.25\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"2\" y=\"1\" width=\"3\" height=\"12\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"7\" y=\"3\" width=\"3\" height=\"8\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('bottom')} title=\"Align bottom edges\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"11.5\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"2\" y=\"2\" width=\"3\" height=\"8\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"7\" y=\"5\" width=\"3\" height=\"5\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n </div>\n {count > 2 && (\n <>\n <label style={{ marginTop: '0.4rem' }}>Distribute</label>\n <div className=\"align-buttons\">\n <button onClick={() => onAlign('distribute-h')} title=\"Distribute horizontally\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"12.5\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"5\" y=\"3\" width=\"4\" height=\"8\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('distribute-v')} title=\"Distribute vertically\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"0\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"0\" y=\"12.5\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"3\" y=\"5\" width=\"8\" height=\"4\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n </div>\n </>\n )}\n </div>\n\n {allNonRedact && (\n <div className=\"panel-field\">\n <label>Assigned To</label>\n <select\n value={sharedAssignee || ''}\n onChange={e => onUpdate({ assignee: e.target.value })}\n >\n {!sharedAssignee && <option value=\"\" disabled>Mixed</option>}\n {signerRoles.map(role => (\n <option key={role} value={role} style={{ color: getSignerColor(role) }}>\n {role}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {allNonRedact && (\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={sharedRequired ?? false}\n ref={el => { if (el) el.indeterminate = sharedRequired === undefined; }}\n onChange={e => onUpdate({ required: e.target.checked })}\n />\n Required\n </label>\n </div>\n )}\n\n {hasText && (\n <div className=\"panel-field\">\n <label>Font</label>\n <select\n value={sharedFontFamily || ''}\n onChange={e => onUpdate({ fontFamily: e.target.value })}\n >\n {!sharedFontFamily && <option value=\"\" disabled>Mixed</option>}\n {FONT_FAMILIES.map(f => (\n <option key={f.value} value={f.value}>{f.label}</option>\n ))}\n </select>\n </div>\n )}\n\n {hasText && (\n <div className=\"panel-field\">\n <label>Font Size (pt)</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={sharedFontSize ?? ''}\n placeholder=\"Mixed\"\n onChange={e => onUpdate({ fontSize: Number(e.target.value) })}\n />\n </div>\n )}\n\n {hasText && (\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Letter Spacing</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"20\"\n step=\"0.5\"\n value={sharedLetterSpacing ?? ''}\n placeholder=\"Mixed\"\n onChange={e => onUpdate({ letterSpacing: Number(e.target.value) })}\n />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Line Height</label>\n <input\n type=\"number\"\n min=\"0.8\"\n max=\"3\"\n step=\"0.1\"\n value={sharedLineHeight ?? ''}\n placeholder=\"Mixed\"\n onChange={e => onUpdate({ lineHeight: Number(e.target.value) })}\n />\n </div>\n </div>\n )}\n\n {allNonRedact && (\n <div className=\"panel-field\">\n <label>Ink Color</label>\n <div className=\"ink-color-picker\">\n {INK_COLORS.map(c => (\n <button\n key={c.value}\n className={`ink-color-swatch ${sharedInkColor === c.value ? 'active' : ''}`}\n style={{ backgroundColor: c.value }}\n onClick={() => onUpdate({ inkColor: c.value })}\n title={c.label}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\nimport { getStroke } from 'perfect-freehand';\n\ninterface SignatureCanvasProps {\n width?: number;\n height?: number;\n onSign: (dataUrl: string) => void;\n initialValue?: string;\n className?: string;\n inkColor?: string;\n}\n\nfunction getSvgPathFromStroke(stroke: number[][]) {\n if (!stroke.length) return '';\n\n const d = stroke.reduce(\n (acc, [x0, y0], i, arr) => {\n const [x1, y1] = arr[(i + 1) % arr.length];\n acc.push(x0, y0, (x0 + x1) / 2, (y0 + y1) / 2);\n return acc;\n },\n ['M', ...stroke[0], 'Q'],\n );\n\n d.push('Z');\n return d.join(' ');\n}\n\nexport function SignatureCanvas({\n width = 400,\n height = 150,\n onSign,\n initialValue,\n className,\n inkColor = '#000000',\n}: SignatureCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [paths, setPaths] = useState<number[][][]>([]);\n const [currentPath, setCurrentPath] = useState<number[][] | null>(null);\n const [isEmpty, setIsEmpty] = useState(!initialValue);\n\n // Draw initial value if provided\n useEffect(() => {\n if (initialValue && canvasRef.current) {\n const ctx = canvasRef.current.getContext('2d')!;\n const img = new Image();\n img.onload = () => {\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0, width, height);\n };\n img.src = initialValue;\n }\n }, [initialValue, width, height]);\n\n // Redraw all paths whenever they change\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n\n const allPaths = currentPath ? [...paths, currentPath] : paths;\n\n for (const path of allPaths) {\n const stroke = getStroke(path, {\n size: 3,\n thinning: 0.5,\n smoothing: 0.5,\n streamline: 0.5,\n });\n const pathStr = getSvgPathFromStroke(stroke);\n const path2d = new Path2D(pathStr);\n ctx.fillStyle = inkColor;\n ctx.fill(path2d);\n }\n }, [paths, currentPath, width, height]);\n\n const getPoint = useCallback((e: React.PointerEvent) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n const style = getComputedStyle(canvas);\n const borderL = parseFloat(style.borderLeftWidth) || 0;\n const borderT = parseFloat(style.borderTopWidth) || 0;\n const borderR = parseFloat(style.borderRightWidth) || 0;\n const borderB = parseFloat(style.borderBottomWidth) || 0;\n // Content area excludes borders\n const contentW = rect.width - borderL - borderR;\n const contentH = rect.height - borderT - borderB;\n const scaleX = canvas.width / contentW;\n const scaleY = canvas.height / contentH;\n return [\n (e.clientX - rect.left - borderL) * scaleX,\n (e.clientY - rect.top - borderT) * scaleY,\n e.pressure,\n ];\n }, []);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n setCurrentPath([getPoint(e)]);\n }, [getPoint]);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n if (!currentPath) return;\n e.preventDefault();\n setCurrentPath([...currentPath, getPoint(e)]);\n }, [currentPath, getPoint]);\n\n const handlePointerUp = useCallback(() => {\n if (!currentPath) return;\n setPaths(prev => [...prev, currentPath]);\n setCurrentPath(null);\n setIsEmpty(false);\n\n // Export after state updates\n requestAnimationFrame(() => {\n if (canvasRef.current) {\n onSign(canvasRef.current.toDataURL('image/png'));\n }\n });\n }, [currentPath, onSign]);\n\n const handleClear = useCallback(() => {\n setPaths([]);\n setCurrentPath(null);\n setIsEmpty(true);\n const canvas = canvasRef.current;\n if (canvas) {\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n onSign('');\n }\n }, [width, height, onSign]);\n\n return (\n <div className={`signature-canvas-wrapper ${className || ''}`}>\n <canvas\n ref={canvasRef}\n width={width}\n height={height}\n className=\"signature-canvas\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{ touchAction: 'none' }}\n />\n <div className=\"signature-canvas-actions\">\n {!isEmpty && (\n <button type=\"button\" onClick={handleClear} className=\"signature-clear-btn\">\n Clear\n </button>\n )}\n {isEmpty && <span className=\"signature-hint\">Draw your signature above</span>}\n </div>\n </div>\n );\n}\n","// Valid API keys. In the future this will validate against a server.\nconst VALID_KEYS = new Set([\n 'exeq_live_2024',\n process.env.NEXT_PUBLIC_EXEQ_API_KEY,\n].filter(Boolean));\n\nexport function isValidApiKey(key: string | undefined): boolean {\n if (!key) return false;\n return VALID_KEYS.has(key);\n}\n","import { useState, useCallback, useRef } from 'react';\n\ninterface HistoryState<T> {\n past: T[];\n present: T;\n future: T[];\n}\n\nexport function useHistory<T>(initialState: T, maxHistory = 50) {\n const [state, setState] = useState<HistoryState<T>>({\n past: [],\n present: initialState,\n future: [],\n });\n const batchRef = useRef(false);\n const batchStartRef = useRef<T | null>(null);\n\n const set = useCallback((updater: T | ((prev: T) => T)) => {\n setState(prev => {\n const newPresent = typeof updater === 'function'\n ? (updater as (prev: T) => T)(prev.present)\n : updater;\n if (newPresent === prev.present) return prev;\n // During a batch, update present without pushing history\n if (batchRef.current) {\n return { ...prev, present: newPresent };\n }\n return {\n past: [...prev.past.slice(-maxHistory), prev.present],\n present: newPresent,\n future: [],\n };\n });\n }, [maxHistory]);\n\n /** Update present without recording in history (for drag-in-progress, etc.) */\n const setWithoutHistory = useCallback((updater: T | ((prev: T) => T)) => {\n setState(prev => {\n const newPresent = typeof updater === 'function'\n ? (updater as (prev: T) => T)(prev.present)\n : updater;\n if (newPresent === prev.present) return prev;\n return { ...prev, present: newPresent };\n });\n }, []);\n\n /** Start a batch — all set() calls become silent until commitBatch(). */\n const beginBatch = useCallback(() => {\n batchRef.current = true;\n setState(prev => {\n batchStartRef.current = prev.present;\n return prev;\n });\n }, []);\n\n /** End the batch — push one undo entry from the state before beginBatch to now. */\n const commitBatch = useCallback(() => {\n batchRef.current = false;\n setState(prev => {\n const startState = batchStartRef.current;\n batchStartRef.current = null;\n if (!startState || startState === prev.present) return prev;\n return {\n past: [...prev.past.slice(-maxHistory), startState],\n present: prev.present,\n future: [],\n };\n });\n }, [maxHistory]);\n\n const undo = useCallback(() => {\n setState(prev => {\n if (prev.past.length === 0) return prev;\n const previous = prev.past[prev.past.length - 1];\n return {\n past: prev.past.slice(0, -1),\n present: previous,\n future: [prev.present, ...prev.future],\n };\n });\n }, []);\n\n const redo = useCallback(() => {\n setState(prev => {\n if (prev.future.length === 0) return prev;\n const next = prev.future[0];\n return {\n past: [...prev.past, prev.present],\n present: next,\n future: prev.future.slice(1),\n };\n });\n }, []);\n\n return {\n state: state.present,\n set,\n setWithoutHistory,\n beginBatch,\n commitBatch,\n undo,\n redo,\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n };\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { FormField, Template } from '@/types/pdf-builder';\nimport { isRedactField, isSignatureField, getCssFontFamily, sortFieldsByPosition, getFieldValues as getFieldValuesUtil } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { generateFilledPdf, downloadPdf, postPdfToCallback } from '@/utils/pdfFiller';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldNavigator } from './FieldNavigator';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport { isValidApiKey } from '@/utils/apiKey';\nimport { resolveAllFormulas } from '@/utils/formulaResolver';\nimport type { TransformMap } from '@/utils/formulaResolver';\nimport '@/styles/pdf-builder.css';\n\nexport interface SignerViewProps {\n /** API key for authentication */\n apiKey?: string;\n /** If provided, use these instead of URL params / postMessage */\n initialPdfUrl?: string;\n initialTemplate?: Template;\n initialSigner?: string;\n callbackUrl?: string;\n onComplete?: (pdfBlob: Blob) => void;\n /** Pre-fill field values by label or ID. Keys are matched against field labels (case-insensitive) first, then field IDs. */\n initialValues?: Record<string, string>;\n /** Label for the final submit button (default: \"Complete\") */\n submitLabel?: string;\n /** Signing order for multi-party documents. Signers complete sequentially; only the current signer's fields are active. If omitted, non-Sender roles go first, then Sender last. */\n signerOrder?: string[];\n /** Custom transform functions for formula fields. Keys are transform names referenced in formulas like {{Field | name}}. Merges with built-in transforms. */\n transforms?: TransformMap;\n /** Called whenever any field value changes. Receives the current field values as a Record<label, value>. */\n onChange?: (values: Record<string, string>) => void;\n /** Called when an individual signer completes their fields (before the final PDF is generated). */\n onSignerComplete?: (signer: string, values: Record<string, string>) => void;\n /** When true, appends an audit trail page to the final PDF documenting each signer's completion. */\n includeAuditTrail?: boolean;\n /** Output format for field values alongside the PDF. */\n exportFormat?: 'json' | 'csv';\n /** Called with exported field values when the document is completed. */\n onExport?: (data: string, format: 'json' | 'csv') => void;\n}\n\nexport function SignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n initialValues,\n submitLabel,\n signerOrder: signerOrderProp,\n transforms,\n onChange,\n onSignerComplete,\n includeAuditTrail,\n exportFormat,\n onExport,\n}: SignerViewProps = {}) {\n if (!isValidApiKey(apiKey)) {\n return (\n <div className=\"signer-layout\">\n <div className=\"empty-state\">\n <h2>Invalid API Key</h2>\n <p>A valid API key is required to use Exeq. Visit <a href=\"https://exeq.org\">exeq.org</a> to get one.</p>\n </div>\n </div>\n );\n }\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>([]);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signerRoles, setSignerRoles] = useState<string[]>([]);\n const [currentSignerIndex, setCurrentSignerIndex] = useState(() => {\n if (initialSigner && signerOrderProp) {\n const idx = signerOrderProp.indexOf(initialSigner);\n return idx >= 0 ? idx : 0;\n }\n return 0;\n });\n const initializedRef = useRef(false);\n const auditLogRef = useRef<{ signer: string; completedAt: string }[]>([]);\n const [loading, setLoading] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [callbackUrl, setCallbackUrl] = useState(initialCallbackUrl || '');\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Derive the signing order: use explicit prop, or default to non-Sender roles first, Sender last\n const signerOrder = signerOrderProp\n || (signerRoles.length > 0\n ? [...signerRoles.filter(r => r !== 'Sender'), ...signerRoles.filter(r => r === 'Sender')]\n : [initialSigner || 'Signer 1']);\n const signer = signerOrder[currentSignerIndex] || signerOrder[0] || 'Signer 1';\n const isLastSigner = currentSignerIndex >= signerOrder.length - 1;\n const isMultiSigner = signerOrder.length > 1;\n\n // Skip signers whose fields are all already filled (e.g. via initialValues/pre-fill)\n useEffect(() => {\n if (fields.length === 0 || !isMultiSigner) return;\n const signerFields = fields.filter(f =>\n f.assignee === signer && !isRedactField(f)\n );\n const allFilled = signerFields.length > 0 && signerFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n });\n if (allFilled && !isLastSigner) {\n setCurrentSignerIndex(prev => prev + 1);\n setSelectedFieldId(null);\n }\n }, [currentSignerIndex, fields, signer, isLastSigner, isMultiSigner]);\n\n // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n let templateFields = initialTemplate.fields;\n if (initialTemplate.signerRoles) setSignerRoles(initialTemplate.signerRoles);\n\n // Apply initialValues by matching label (case-insensitive) or ID\n if (initialValues) {\n templateFields = templateFields.map(f => {\n const byLabel = Object.entries(initialValues).find(\n ([key]) => key.toLowerCase() === f.label.toLowerCase()\n );\n const byId = initialValues[f.id];\n const value = byLabel?.[1] ?? byId;\n return value !== undefined ? { ...f, value } : f;\n });\n }\n\n // On re-init (e.g. remount), preserve values already filled by any signer\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return templateFields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(templateFields);\n initializedRef.current = true;\n }\n\n if (initialPdfUrl) loadPdf(initialPdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const pdfUrl = params.get('pdf');\n const fieldsUrl = params.get('fields');\n const cbUrl = params.get('callbackUrl');\n\n if (cbUrl) setCallbackUrl(cbUrl);\n\n if (pdfUrl) loadPdf(pdfUrl);\n if (fieldsUrl) {\n fetch(fieldsUrl)\n .then(r => r.json())\n .then((template: Template) => {\n if (template.signerRoles) setSignerRoles(template.signerRoles);\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return template.fields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(template.fields);\n initializedRef.current = true;\n }\n })\n .catch(err => console.error('Failed to load fields:', err));\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-signing') {\n if (e.data.fields) {\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return e.data.fields.map((f: FormField) => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(e.data.fields);\n initializedRef.current = true;\n }\n }\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) {\n const idx = signerOrder.indexOf(e.data.signer);\n if (idx >= 0) setCurrentSignerIndex(idx);\n }\n if (e.data.callbackUrl) setCallbackUrl(e.data.callbackUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialTemplate, initialPdfUrl]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Fields this signer needs to fill, sorted by document position (excludes redact fields)\n const editableFields = sortFieldsByPosition(fields.filter(f => f.assignee === signer && !isRedactField(f) && !f.formula));\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n const isFieldEditable = selectedField\n ? selectedField.assignee === signer && !isRedactField(selectedField) && !selectedField.formula\n : false;\n\n const handleFieldUpdate = useCallback((id: string, value: string) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, value } : f));\n }, []);\n\n const handleFieldPropertyUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, ...updates } : f));\n }, []);\n\n // Fire onChange whenever field values change\n const fieldValuesKey = fields.map(f => `${f.id}:${f.value}`).join('|');\n useEffect(() => {\n if (!onChange) return;\n const values: Record<string, string> = {};\n fields.forEach(f => { if (!isRedactField(f)) values[f.label] = f.value || ''; });\n onChange(values);\n }, [fieldValuesKey]);\n\n const handleNavigate = useCallback((fieldId: string) => {\n setSelectedFieldId(fieldId);\n // Scroll to that field's page\n const field = fields.find(f => f.id === fieldId);\n if (field && containerRef.current) {\n const pageEl = containerRef.current.querySelector(`[data-page=\"${field.page}\"]`);\n if (pageEl) {\n pageEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n }, [fields]);\n\n const allRequiredFilled = editableFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n if (!f.value) return false;\n if (f.minLength && f.value.length < f.minLength) return false;\n return true;\n });\n\n const getValues = useCallback(() => getFieldValuesUtil(fields), [fields]);\n\n const handleAdvanceOrSubmit = useCallback(async () => {\n if (!allRequiredFilled) return;\n\n // Log completion for audit trail\n auditLogRef.current.push({ signer, completedAt: new Date().toISOString() });\n\n // Fire onSignerComplete callback\n if (onSignerComplete) {\n onSignerComplete(signer, getValues());\n }\n\n // Intermediate signer: advance to next\n if (!isLastSigner) {\n setCurrentSignerIndex(prev => prev + 1);\n setSelectedFieldId(null);\n const pdfArea = containerRef.current?.querySelector('.signer-pdf-area');\n if (pdfArea) {\n pdfArea.scrollTo({ top: 0, behavior: 'smooth' });\n }\n return;\n }\n\n // Final signer: generate PDF\n if (!pdfSource) return;\n setSubmitting(true);\n try {\n const finalFields = resolveAllFormulas(fields, transforms);\n\n // Optionally add audit trail page\n let pdfBytes: Uint8Array;\n if (includeAuditTrail) {\n const { PDFDocument, StandardFonts, rgb } = await import('pdf-lib');\n const basePdf = await generateFilledPdf({ pdfSource, fields: finalFields });\n const pdfDoc = await PDFDocument.load(basePdf);\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\n const boldFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold);\n const auditPage = pdfDoc.addPage([612, 792]);\n let cy = 742;\n auditPage.drawText('Signing Audit Trail', { x: 50, y: cy, size: 18, font: boldFont, color: rgb(0, 0, 0) });\n cy -= 30;\n auditPage.drawText(`Document completed: ${new Date().toLocaleString()}`, { x: 50, y: cy, size: 10, font, color: rgb(0.4, 0.4, 0.4) });\n cy -= 30;\n for (const entry of auditLogRef.current) {\n auditPage.drawText(`${entry.signer}`, { x: 50, y: cy, size: 12, font: boldFont, color: rgb(0, 0, 0) });\n auditPage.drawText(`Completed: ${new Date(entry.completedAt).toLocaleString()}`, { x: 200, y: cy, size: 10, font, color: rgb(0.3, 0.3, 0.3) });\n cy -= 22;\n }\n pdfBytes = await pdfDoc.save();\n } else {\n pdfBytes = await generateFilledPdf({ pdfSource, fields: finalFields });\n }\n\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n // Export field values as JSON or CSV\n if (onExport && exportFormat) {\n const values = getValues();\n if (exportFormat === 'json') {\n onExport(JSON.stringify(values, null, 2), 'json');\n } else {\n const headers = Object.keys(values);\n const row = headers.map(h => `\"${(values[h] || '').replace(/\"/g, '\"\"')}\"`);\n onExport(`${headers.join(',')}\\n${row.join(',')}`, 'csv');\n }\n }\n\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n if (onComplete) {\n onComplete(blob);\n }\n\n if (!callbackUrl && !onComplete) {\n downloadPdf(pdfBytes, 'signed-document.pdf');\n }\n\n window.parent?.postMessage({ type: 'signing-complete' }, '*');\n } catch (err) {\n console.error('Failed to generate PDF:', err);\n } finally {\n setSubmitting(false);\n }\n }, [pdfSource, fields, callbackUrl, allRequiredFilled, onComplete, isLastSigner, signer, onSignerComplete, includeAuditTrail, exportFormat, onExport, getValues, transforms]);\n\n const renderFieldContent = useCallback((field: FormField) => {\n // Redact fields are visual-only — no interaction in signer mode\n if (isRedactField(field)) {\n return null;\n }\n\n // Formula fields are always read-only (auto-computed)\n if (field.formula) {\n return (\n <div className=\"field-overlay-value formula\">\n {field.value || '...'}\n </div>\n );\n }\n\n const editable = field.assignee === signer;\n\n if (!editable) {\n // Show pre-filled content as read-only\n if (isSignatureField(field)) {\n return field.value ? (\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n ) : (\n <div className=\"field-overlay-placeholder readonly\">{field.placeholder}</div>\n );\n }\n if (field.type === 'checkbox') {\n return (\n <div className=\"field-checkbox-display readonly\">\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder readonly\">\n {field.value || field.placeholder}\n </div>\n );\n }\n\n // Editable fields\n if (isSignatureField(field)) {\n if (field.value) {\n return (\n <div className=\"field-signature-filled\" onClick={() => handleFieldUpdate(field.id, '')}>\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder editable\">\n {field.placeholder}\n </div>\n );\n }\n\n if (field.type === 'checkbox') {\n return (\n <div\n className=\"field-checkbox-display editable\"\n onClick={(e) => {\n e.stopPropagation();\n handleFieldUpdate(field.id, field.value === 'true' ? '' : 'true');\n }}\n >\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n\n if (field.type === 'signed-date') {\n return (\n <div className=\"field-overlay-value\">\n {field.value || new Date().toLocaleDateString()}\n </div>\n );\n }\n\n // Text field — dropdown if options are defined, otherwise input\n const fontStyle = {\n fontSize: `${field.fontSize}pt`,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing}pt` : undefined,\n lineHeight: field.lineHeight ? `${field.lineHeight}` : undefined,\n fontFamily: getCssFontFamily(field.fontFamily),\n };\n\n if (field.type === 'dropdown' || (field.options && field.options.length > 0)) {\n return (\n <select\n className=\"field-inline-input\"\n value={field.value}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={fontStyle}\n >\n <option value=\"\">{field.placeholder || 'Select...'}</option>\n {(field.options || []).map(opt => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n );\n }\n\n return (\n <input\n type={field.textSubtype === 'email' ? 'email' :\n field.textSubtype === 'number' ? 'number' :\n field.textSubtype === 'phone' ? 'tel' :\n field.textSubtype === 'date' ? 'date' : 'text'}\n className=\"field-inline-input\"\n value={field.value}\n placeholder={field.placeholder}\n maxLength={field.maxLength || undefined}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={fontStyle}\n />\n );\n }, [signer, handleFieldUpdate, setSelectedFieldId]);\n\n // Auto-fill signed-date fields — immediately for the current signer,\n // and also when a signature is filled\n useEffect(() => {\n const dateStr = new Date().toLocaleDateString();\n const needsFill = fields.some(f => f.assignee === signer && f.type === 'signed-date' && !f.value);\n if (needsFill) {\n setFields(prev => prev.map(f => {\n if (f.assignee === signer && f.type === 'signed-date' && !f.value) {\n return { ...f, value: dateStr };\n }\n return f;\n }));\n }\n }, [signer, fields.filter(f => f.type === 'signature' && f.value).length]);\n\n // Resolve formula fields whenever any field value changes\n useEffect(() => {\n const hasFormulas = fields.some(f => f.formula);\n if (!hasFormulas) return;\n const resolved = resolveAllFormulas(fields, transforms);\n // Only update if any computed values actually changed\n const changed = resolved.some((f, i) => f.value !== fields[i].value);\n if (changed) setFields(resolved);\n }, [fields, transforms]);\n\n return (\n <div className=\"signer-layout\" ref={containerRef}>\n {loading && <div className=\"loading-indicator\">Loading document...</div>}\n\n <div className=\"signer-content\">\n <div className=\"signer-pdf-area\">\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldIds={new Set(selectedFieldId ? [selectedFieldId] : [])}\n onSelectField={(id) => setSelectedFieldId(id)}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\n <div className=\"signer-panel-header\">\n <div className=\"signer-role-indicator\">\n <span className=\"signer-role-indicator-label\">Signing as</span>\n <strong>{signer}</strong>\n </div>\n {isMultiSigner && (\n <div className=\"signer-step-badge\">\n Step {currentSignerIndex + 1} of {signerOrder.length}\n </div>\n )}\n </div>\n\n <div className=\"signer-panel-body\">\n {selectedField && isFieldEditable && (\n <div className=\"signer-field-input\">\n <h3>{selectedField.label}</h3>\n {selectedField.required && <span className=\"required-badge\">Required</span>}\n\n {(isSignatureField(selectedField)) && (\n <SignatureCanvas\n width={280}\n height={selectedField.type === 'initials' ? 80 : 120}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, dataUrl)}\n initialValue={selectedField.value}\n />\n )}\n\n {(selectedField.type === 'text' || selectedField.type === 'dropdown') && (\n <>\n {selectedField.type === 'dropdown' || (selectedField.options && selectedField.options.length > 0) ? (\n <select\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n className=\"signer-text-input\"\n >\n <option value=\"\">{selectedField.placeholder || 'Select...'}</option>\n {(selectedField.options || []).map(opt => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n placeholder={selectedField.placeholder}\n maxLength={selectedField.maxLength || undefined}\n className=\"signer-text-input\"\n />\n )}\n <div className=\"signer-font-size\">\n <label>Font Size</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={selectedField.fontSize}\n onChange={e => handleFieldPropertyUpdate(selectedField.id, { fontSize: Number(e.target.value) })}\n />\n <span>pt</span>\n </div>\n </>\n )}\n\n {selectedField.type === 'checkbox' && (\n <label className=\"signer-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.checked ? 'true' : '')}\n />\n {selectedField.placeholder || 'Check this box'}\n </label>\n )}\n\n {selectedField.type === 'signed-date' && (\n <div className=\"signer-date-display\">\n {selectedField.value || 'Will auto-fill when you sign'}\n </div>\n )}\n </div>\n )}\n\n {selectedField && !isFieldEditable && (\n <div className=\"signer-field-readonly\">\n <h3>{selectedField.label}</h3>\n <p>This field belongs to another signer.</p>\n </div>\n )}\n\n {!selectedField && editableFields.length > 0 && (\n <div className=\"panel-empty\">\n Select a field to fill it in, or use the navigation below.\n </div>\n )}\n </div>\n\n <div className=\"signer-panel-footer\">\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onComplete={handleAdvanceOrSubmit}\n completeLabel={isLastSigner ? (submitLabel || 'Complete') : `Next: ${signerOrder[currentSignerIndex + 1]}`}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import {\n PDFDocument,\n PDFEmbeddedPage,\n PDFFont,\n PDFImage,\n PDFPage,\n rgb,\n StandardFonts,\n} from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\nimport { isRedactField, isSignatureField } from '@/types/pdf-builder';\nimport { resolveAllFormulas, type TransformMap } from './formulaResolver';\n\nconst FONT_MAP: Record<string, string> = {\n Helvetica: StandardFonts.Helvetica,\n Courier: StandardFonts.Courier,\n TimesRoman: StandardFonts.TimesRoman,\n};\n\n/** US Letter in PDF points (72pt = 1 in). */\nexport const US_LETTER: [number, number] = [612, 792];\n/** US Legal in PDF points. */\nexport const US_LEGAL: [number, number] = [612, 1008];\n/** A4 in PDF points. */\nexport const A4: [number, number] = [595.28, 841.89];\n\n// ---------------------------------------------------------------------------\n// Calibration\n// ---------------------------------------------------------------------------\n\n/**\n * Linear calibration applied to every field's percentage position and size.\n * Use to align rendered output with a physical pre-printed form when the\n * template's source PDF and the real paper don't exactly agree on crop or\n * scale.\n *\n * Math (for an output page of size [pW, pH] pt):\n * xPctOff = (xOffset / pW) * 100\n * yPctOff = (yOffset / pH) * 100\n * x' = x_pct * xScale + xPctOff\n * y' = y_pct * yScale + yPctOff\n * width' = width_pct * xScale\n * height' = height_pct * yScale\n *\n * Defaults (scale=1, offsets=0) are a no-op.\n */\nexport interface Calibration {\n /** Horizontal offset in PDF points; positive = right. */\n xOffset: number;\n /** Vertical offset in PDF points; positive = down (screen coords). */\n yOffset: number;\n /** Horizontal multiplier applied to x and width. */\n xScale: number;\n /** Vertical multiplier applied to y and height. */\n yScale: number;\n}\n\nexport const DEFAULT_CALIBRATION: Calibration = {\n xOffset: 0,\n yOffset: 0,\n xScale: 1,\n yScale: 1,\n};\n\n/**\n * Returns a copy of `fields` with calibration applied to x / y / width /\n * height. The math is page-size-aware so an `xOffset` of 5pt actually\n * shifts the rendered output 5pt to the right.\n *\n * @param pageSize Output page size in pt used to convert pt offsets to\n * percent offsets. Defaults to US Letter.\n */\nexport function applyCalibration(\n fields: FormField[],\n calibration: Calibration,\n pageSize: [number, number] = US_LETTER,\n): FormField[] {\n if (\n calibration.xOffset === 0 &&\n calibration.yOffset === 0 &&\n calibration.xScale === 1 &&\n calibration.yScale === 1\n ) {\n return fields;\n }\n const xPctOff = (calibration.xOffset / pageSize[0]) * 100;\n const yPctOff = (calibration.yOffset / pageSize[1]) * 100;\n return fields.map((f) => ({\n ...f,\n x: f.x * calibration.xScale + xPctOff,\n y: f.y * calibration.yScale + yPctOff,\n width: f.width * calibration.xScale,\n height: f.height * calibration.yScale,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Field rendering — shared by single-shot and builder\n// ---------------------------------------------------------------------------\n\nfunction hexToRgb(hex: string) {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n return rgb(r, g, b);\n}\n\nasync function renderFieldsOnPages(\n pages: PDFPage[],\n fields: FormField[],\n getFont: (family: string) => Promise<PDFFont>,\n getSignature: (dataUrl: string) => Promise<PDFImage>,\n): Promise<void> {\n for (const field of fields) {\n const page = pages[field.page];\n if (!page) continue;\n\n const pageWidth = page.getWidth();\n const pageHeight = page.getHeight();\n\n const x = (field.x / 100) * pageWidth;\n const y =\n pageHeight -\n (field.y / 100) * pageHeight -\n (field.height / 100) * pageHeight;\n const w = (field.width / 100) * pageWidth;\n const h = (field.height / 100) * pageHeight;\n\n if (isRedactField(field)) {\n page.drawRectangle({\n x,\n y,\n width: w,\n height: h,\n color: field.type === 'blackout' ? rgb(0, 0, 0) : rgb(1, 1, 1),\n });\n continue;\n }\n\n if (!field.value) continue;\n\n const inkColor = field.inkColor ? hexToRgb(field.inkColor) : rgb(0, 0, 0);\n\n if (field.type === 'checkbox') {\n if (field.value === 'true') {\n const inset = Math.min(w, h) * 0.2;\n const lineWidth = Math.min(w, h) * 0.08;\n page.drawLine({\n start: { x: x + inset, y: y + inset },\n end: { x: x + w - inset, y: y + h - inset },\n thickness: lineWidth,\n color: inkColor,\n });\n page.drawLine({\n start: { x: x + w - inset, y: y + inset },\n end: { x: x + inset, y: y + h - inset },\n thickness: lineWidth,\n color: inkColor,\n });\n }\n } else if (isSignatureField(field)) {\n if (field.value.startsWith('data:image/png')) {\n const img = await getSignature(field.value);\n page.drawImage(img, { x, y, width: w, height: h });\n }\n } else {\n // Text fields (including signed-date)\n const font = await getFont(field.fontFamily || 'Helvetica');\n const spacing = field.letterSpacing || 0;\n\n const textWidthAtSize = (text: string, size: number) =>\n font.widthOfTextAtSize(text, size) + spacing * (text.length - 1);\n\n let fontSize = field.autoShrink ? Math.min(field.fontSize, h * 0.7) : field.fontSize;\n if (field.autoShrink) {\n const padding = 4;\n while (fontSize > 4) {\n if (textWidthAtSize(field.value, fontSize) <= w - padding) break;\n fontSize -= 0.5;\n }\n }\n\n if (spacing > 0) {\n let cx = x + 2;\n const cy = y + h * 0.3;\n for (const char of field.value) {\n page.drawText(char, {\n x: cx,\n y: cy,\n size: fontSize,\n font,\n color: inkColor,\n });\n cx += font.widthOfTextAtSize(char, fontSize) + spacing;\n }\n } else {\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: inkColor,\n });\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Unified record options — used by both generateFilledPdf and addRecord\n// ---------------------------------------------------------------------------\n\nexport interface FillPdfOptions {\n /** Source PDF used as the background.\n * - `string` (URL): fetched, embedded once per URL across the document.\n * - `ArrayBuffer`: embedded uniquely each call.\n * - `null`: render onto blank pages (overlay-only output). */\n pdfSource: string | ArrayBuffer | null;\n /** Fields to render on top of the background. */\n fields: FormField[];\n /** Override the output page size in PDF points.\n * - With a `pdfSource`, source pages are drawn stretched to fit.\n * - With `pdfSource: null`, blank pages of this size are created.\n * - When omitted with a source, output uses the source's page sizes.\n * - When omitted with `pdfSource: null`, defaults to US Letter. */\n pageSize?: [number, number];\n /** When `pdfSource` is null, how many blank pages to render. Default `1`.\n * Fields with out-of-range `page` indices are skipped. */\n pageCount?: number;\n /** Run `resolveAllFormulas` on fields before rendering. */\n resolveFormulas?: boolean;\n /** Custom transforms merged with `BUILTIN_TRANSFORMS` during formula\n * resolution. Only meaningful when `resolveFormulas` is true. */\n customTransforms?: TransformMap;\n /** Linear calibration applied to field positions before rendering. */\n calibration?: Calibration;\n}\n\n// ---------------------------------------------------------------------------\n// Single-record API\n// ---------------------------------------------------------------------------\n\n/**\n * Generates one filled PDF.\n *\n * const bytes = await generateFilledPdf({\n * pdfSource: '/forms/template.pdf',\n * fields: template.fields,\n * pageSize: US_LETTER,\n * resolveFormulas: true,\n * });\n *\n * For multi-record output that shares a background, use `createPdfBuilder`\n * — it dedupes the embedded source across all pages.\n */\nexport async function generateFilledPdf(\n opts: FillPdfOptions,\n): Promise<Uint8Array> {\n const builder = await createPdfBuilder({ pageSize: opts.pageSize });\n await builder.addRecord(opts);\n return builder.save();\n}\n\n// ---------------------------------------------------------------------------\n// Batch API\n// ---------------------------------------------------------------------------\n\nexport interface PdfBuilder {\n /** Underlying pdf-lib document — exposed for advanced post-processing\n * (audit-trail pages, custom metadata, etc.). */\n readonly doc: PDFDocument;\n /** Append one record's pages to the output. */\n addRecord(opts: FillPdfOptions): Promise<void>;\n /** Finalize and return the merged PDF bytes. */\n save(): Promise<Uint8Array>;\n}\n\nexport interface CreatePdfBuilderOptions {\n /** Default `pageSize` for any `addRecord` call that doesn't set its own. */\n pageSize?: [number, number];\n}\n\n/**\n * Creates a builder that merges multiple filled records into one PDF.\n *\n * Resources (source PDFs indexed by URL, embedded fonts, signature PNGs) are\n * embedded once across the whole document and reused — critical for\n * mail-merge style batches where dozens of records share the same background.\n *\n * const builder = await createPdfBuilder({ pageSize: US_LETTER });\n * for (const record of records) {\n * await builder.addRecord({\n * pdfSource: '/forms/template.pdf',\n * fields: record.fields,\n * resolveFormulas: true,\n * });\n * }\n * const bytes = await builder.save();\n * downloadPdf(bytes, 'merged.pdf');\n */\nexport async function createPdfBuilder(\n defaults: CreatePdfBuilderOptions = {},\n): Promise<PdfBuilder> {\n const doc = await PDFDocument.create();\n const fontCache = new Map<string, PDFFont>();\n const embeddedPagesByUrl = new Map<string, PDFEmbeddedPage[]>();\n const signatureCache = new Map<string, PDFImage>();\n\n async function getFont(family: string): Promise<PDFFont> {\n let f = fontCache.get(family);\n if (!f) {\n const stdName = FONT_MAP[family] || StandardFonts.Helvetica;\n f = await doc.embedFont(stdName);\n fontCache.set(family, f);\n }\n return f;\n }\n\n async function ensureFonts(fields: FormField[]) {\n const keys = new Set(fields.map((f) => f.fontFamily || 'Helvetica'));\n for (const k of keys) await getFont(k);\n }\n\n async function embedSource(\n source: string | ArrayBuffer,\n ): Promise<PDFEmbeddedPage[]> {\n if (typeof source === 'string') {\n let pages = embeddedPagesByUrl.get(source);\n if (!pages) {\n const res = await fetch(source);\n const bytes = await res.arrayBuffer();\n const srcDoc = await PDFDocument.load(bytes);\n pages = await Promise.all(\n srcDoc.getPages().map((p) => doc.embedPage(p)),\n );\n embeddedPagesByUrl.set(source, pages);\n }\n return pages;\n }\n // ArrayBuffer sources are treated as unique per call.\n const srcDoc = await PDFDocument.load(source);\n return Promise.all(srcDoc.getPages().map((p) => doc.embedPage(p)));\n }\n\n async function getSignature(dataUrl: string): Promise<PDFImage> {\n let img = signatureCache.get(dataUrl);\n if (!img) {\n const b64 = dataUrl.split(',')[1] ?? '';\n const pngBytes = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0));\n img = await doc.embedPng(pngBytes);\n signatureCache.set(dataUrl, img);\n }\n return img;\n }\n\n return {\n doc,\n async addRecord(opts: FillPdfOptions) {\n const pageSize = opts.pageSize ?? defaults.pageSize;\n\n let fields = opts.resolveFormulas\n ? resolveAllFormulas(opts.fields, opts.customTransforms)\n : opts.fields;\n\n if (opts.calibration) {\n fields = applyCalibration(\n fields,\n opts.calibration,\n pageSize ?? US_LETTER,\n );\n }\n\n await ensureFonts(fields);\n\n let sourcePages: PDFEmbeddedPage[] = [];\n let pageCount: number;\n if (opts.pdfSource !== null) {\n sourcePages = await embedSource(opts.pdfSource);\n pageCount = sourcePages.length;\n } else {\n pageCount = opts.pageCount ?? 1;\n }\n\n const newPages: PDFPage[] = [];\n for (let i = 0; i < pageCount; i++) {\n const size: [number, number] = pageSize\n ? pageSize\n : sourcePages[i]\n ? [sourcePages[i].width, sourcePages[i].height]\n : US_LETTER;\n const page = doc.addPage(size);\n newPages.push(page);\n if (sourcePages[i]) {\n page.drawPage(sourcePages[i], {\n x: 0,\n y: 0,\n width: size[0],\n height: size[1],\n });\n }\n }\n\n await renderFieldsOnPages(newPages, fields, getFont, getSignature);\n },\n async save() {\n return doc.save();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Browser helpers\n// ---------------------------------------------------------------------------\n\nexport function downloadPdf(bytes: Uint8Array, filename: string) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport async function postPdfToCallback(\n bytes: Uint8Array,\n callbackUrl: string,\n filename: string,\n) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const formData = new FormData();\n formData.append('file', blob, filename);\n\n await fetch(callbackUrl, {\n method: 'POST',\n body: formData,\n });\n}\n","import type { FormField } from '@/types/pdf-builder';\n\nexport type TransformFn = (value: string) => string;\nexport type TransformMap = Record<string, TransformFn>;\n\n/** Built-in transforms that ship with exeq. */\nexport const BUILTIN_TRANSFORMS: TransformMap = {\n // Date transforms (expects a parseable date string)\n month: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getMonth() + 1); },\n month2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getMonth() + 1).padStart(2, '0'); },\n monthname: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : d.toLocaleString('en', { month: 'long' }); },\n monthshort: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : d.toLocaleString('en', { month: 'short' }); },\n day: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getDate()); },\n day2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getDate()).padStart(2, '0'); },\n year: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getFullYear()); },\n year2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getFullYear()).slice(-2); },\n\n // String transforms\n upper: (v) => v.toUpperCase(),\n lower: (v) => v.toLowerCase(),\n trim: (v) => v.trim(),\n first: (v) => v.split(/\\s+/)[0] || '',\n last: (v) => { const parts = v.split(/\\s+/); return parts[parts.length - 1] || ''; },\n initials: (v) => v.split(/\\s+/).map(w => w[0] || '').join('').toUpperCase(),\n\n // Numeric / substring\n last4: (v) => v.slice(-4),\n last2: (v) => v.slice(-2),\n first4: (v) => v.slice(0, 4),\n first2: (v) => v.slice(0, 2),\n digits: (v) => v.replace(/\\D/g, ''),\n number: (v) => { const n = parseFloat(v); return isNaN(n) ? '' : String(n); },\n currency: (v) => { const n = parseFloat(v.replace(/[^0-9.-]/g, '')); return isNaN(n) ? '' : `$${n.toFixed(2)}`; },\n};\n\nconst FORMULA_RE = /\\{\\{(.+?)\\}\\}/g;\nconst PIPE_RE = /^(.+?)\\s*\\|\\s*(.+)$/;\n\n/**\n * Resolve a single formula string against a set of fields and transforms.\n * Formula format: \"{{Source Field Label | transform}}\" or \"{{Source Field Label}}\" (no transform = raw value).\n * Multiple expressions can appear in one formula: \"{{First}} {{Last}}\" → \"Jane Smith\"\n */\nexport function resolveFormula(\n formula: string,\n fields: FormField[],\n customTransforms?: TransformMap,\n): string {\n const transforms = { ...BUILTIN_TRANSFORMS, ...customTransforms };\n\n return formula.replace(FORMULA_RE, (_match, expr: string) => {\n const pipeMatch = expr.match(PIPE_RE);\n const sourceLabel = (pipeMatch ? pipeMatch[1] : expr).trim();\n const transformName = pipeMatch ? pipeMatch[2].trim() : null;\n\n // Find source field by label (case-insensitive) or ID\n const sourceField = fields.find(f => f.label.toLowerCase() === sourceLabel.toLowerCase())\n || fields.find(f => f.id === sourceLabel);\n\n if (!sourceField) return '';\n\n const rawValue = sourceField.value || '';\n if (!transformName) return rawValue;\n\n const fn = transforms[transformName];\n if (!fn) return rawValue; // unknown transform → return raw value\n\n try {\n return fn(rawValue);\n } catch {\n return rawValue;\n }\n });\n}\n\n/**\n * Resolve all formula fields in a fields array.\n * Returns a new array with computed values filled in.\n */\nexport function resolveAllFormulas(\n fields: FormField[],\n customTransforms?: TransformMap,\n): FormField[] {\n return fields.map(f => {\n if (!f.formula) return f;\n const computed = resolveFormula(f.formula, fields, customTransforms);\n return computed !== f.value ? { ...f, value: computed } : f;\n });\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { FormField } from '@/types/pdf-builder';\n\ninterface FieldNavigatorProps {\n fields: FormField[];\n currentFieldId: string | null;\n onNavigate: (fieldId: string) => void;\n allRequiredFilled: boolean;\n onComplete: () => void;\n completeLabel?: string;\n}\n\nfunction isFieldFilled(f: FormField): boolean {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onComplete,\n completeLabel = 'Complete',\n}: FieldNavigatorProps) {\n const [showIncomplete, setShowIncomplete] = useState(false);\n const currentIndex = fields.findIndex(f => f.id === currentFieldId);\n const hasPrev = currentIndex > 0;\n const hasNext = currentIndex < fields.length - 1;\n\n const handlePrev = () => {\n if (hasPrev) {\n onNavigate(fields[currentIndex - 1].id);\n }\n };\n\n const handleNext = () => {\n if (hasNext) {\n onNavigate(fields[currentIndex + 1].id);\n }\n };\n\n const filledCount = fields.filter(isFieldFilled).length;\n const incompleteFields = fields.filter(f => !isFieldFilled(f));\n\n // When on the last field (or none selected) and all filled, the forward action is complete/advance\n const showCompleteAsNext = !hasNext && allRequiredFilled;\n\n return (\n <div className=\"field-navigator\">\n <div\n className={`field-navigator-progress ${incompleteFields.length > 0 ? 'clickable' : ''}`}\n onClick={() => incompleteFields.length > 0 && setShowIncomplete(!showIncomplete)}\n >\n {filledCount} of {fields.length} fields completed\n {incompleteFields.length > 0 && (\n <span className=\"field-navigator-toggle\">{showIncomplete ? '\\u25B2' : '\\u25BC'}</span>\n )}\n </div>\n\n {showIncomplete && incompleteFields.length > 0 && (\n <div className=\"incomplete-fields-list\">\n {incompleteFields.map(f => (\n <button\n key={f.id}\n className=\"incomplete-field-item\"\n onClick={() => {\n onNavigate(f.id);\n setShowIncomplete(false);\n }}\n >\n {f.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"field-navigator-controls\">\n <button\n onClick={handlePrev}\n disabled={!hasPrev}\n className=\"nav-btn\"\n >\n Prev\n </button>\n <span className=\"field-navigator-position\">\n {currentIndex >= 0 ? `${currentIndex + 1} / ${fields.length}` : '-'}\n </span>\n {showCompleteAsNext ? (\n <button\n onClick={onComplete}\n className=\"nav-btn nav-btn-complete\"\n >\n {completeLabel}\n </button>\n ) : (\n <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n ×\n </span>\n )}\n </button>\n ))}\n {isAdding ? (\n <div className=\"signer-role-add-input\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAdd()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAdd}>Add</button>\n <button onClick={() => setIsAdding(false)}>Cancel</button>\n </div>\n ) : (\n <button\n className=\"signer-role-add-btn\"\n onClick={() => setIsAdding(true)}\n >\n + Add Role\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","e","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","e","import_react","srcDoc","import_react","import_jsx_runtime","import_jsx_runtime","PDFDocument","StandardFonts","rgb","import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/index.ts","../src/components/pdf-builder/DesignerView.tsx","../src/types/pdf-builder.ts","../src/utils/pdfRenderer.ts","../src/components/pdf-builder/PdfViewer.tsx","../src/components/pdf-builder/FieldPropertyPanel.tsx","../src/components/pdf-builder/SignatureCanvas.tsx","../src/utils/apiKey.ts","../src/hooks/useHistory.ts","../src/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/utils/formulaResolver.ts","../src/components/pdf-builder/FieldNavigator.tsx","../src/components/pdf-builder/SignerRoleSelector.tsx"],"sourcesContent":["// Components\nexport { DesignerView } from '../components/pdf-builder/DesignerView';\nexport type { DesignerViewProps } from '../components/pdf-builder/DesignerView';\nexport { SignerView } from '../components/pdf-builder/SignerView';\nexport type { SignerViewProps } from '../components/pdf-builder/SignerView';\nexport { PdfViewer } from '../components/pdf-builder/PdfViewer';\nexport { SignatureCanvas } from '../components/pdf-builder/SignatureCanvas';\nexport { FieldPropertyPanel } from '../components/pdf-builder/FieldPropertyPanel';\nexport { FieldNavigator } from '../components/pdf-builder/FieldNavigator';\nexport { SignerRoleSelector } from '../components/pdf-builder/SignerRoleSelector';\n\n// Types\nexport type { FormField, FieldType, TextSubtype, Template } from '../types/pdf-builder';\n\n// Type helpers & constants\nexport {\n DEFAULT_SIGNER_ROLES,\n SIGNER_ROLE_COLORS,\n FIELD_DEFAULTS,\n FONT_FAMILIES,\n getSignerColor,\n createField,\n uniqueLabel,\n generateId,\n isRedactField,\n isSignatureField,\n isTextLikeField,\n getInputType,\n getCssFontFamily,\n sortFieldsByPosition,\n preserveFieldValues,\n getFieldValues,\n} from '../types/pdf-builder';\n\n// Utilities\nexport { renderPdfPages } from '../utils/pdfRenderer';\nexport type { RenderedPage } from '../utils/pdfRenderer';\nexport {\n generateFilledPdf,\n createPdfBuilder,\n applyCalibration,\n downloadPdf,\n postPdfToCallback,\n DEFAULT_CALIBRATION,\n US_LETTER,\n US_LEGAL,\n A4,\n} from '../utils/pdfFiller';\nexport type {\n FillPdfOptions,\n CreatePdfBuilderOptions,\n PdfBuilder,\n Calibration,\n} from '../utils/pdfFiller';\nexport { resolveFormula, resolveAllFormulas, BUILTIN_TRANSFORMS } from '../utils/formulaResolver';\nexport type { TransformFn, TransformMap } from '../utils/formulaResolver';\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { FormField, FieldType, Template } from '@/types/pdf-builder';\nimport { DEFAULT_SIGNER_ROLES, FIELD_DEFAULTS, createField, getSignerColor, uniqueLabel, generateId, isRedactField, isSignatureField, getCssFontFamily, sortFieldsByPosition } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldPropertyPanel, BulkPropertyPanel } from './FieldPropertyPanel';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport { isValidApiKey } from '@/utils/apiKey';\nimport { useHistory } from '@/hooks/useHistory';\nimport '@/styles/pdf-builder.css';\n\nexport interface DesignerViewProps {\n /** API key for authentication */\n apiKey?: string;\n /** URL to a PDF to pre-load */\n initialPdfUrl?: string;\n /** Existing template to load (fields, signer roles, and PDF URL) */\n initialTemplate?: Template;\n /** Called when the user clicks \"Export Template\" */\n onSave?: (template: Template) => void;\n /** Called whenever the template changes (field added/moved/edited, signer\n * role changed, PDF loaded). Use for draft persistence — e.g. save to\n * localStorage so a refresh or accidental tab close doesn't lose work.\n * Fires on every change, including programmatic ones from `initialTemplate`.\n * Debounce on the caller side if you want fewer writes. */\n onChange?: (template: Template) => void;\n /** When true, the built-in header bar is hidden (use headerPortalRef to place buttons externally) */\n hideHeader?: boolean;\n /** Ref to an element where the header action buttons should be portalled into */\n headerPortalRef?: React.RefObject<HTMLElement | null>;\n}\n\nconst FIELD_TYPE_META: { type: FieldType; label: string; icon: string; group?: string }[] = [\n { type: 'text', label: 'Text', icon: 'T' },\n { type: 'dropdown', label: 'Dropdown', icon: '▾' },\n { type: 'signature', label: 'Signature', icon: '✍' },\n { type: 'signed-date', label: 'Date', icon: '📅' },\n { type: 'checkbox', label: 'Checkbox', icon: '☑' },\n { type: 'initials', label: 'Initials', icon: 'IN' },\n { type: 'blackout', label: 'Blackout', icon: '■', group: 'redact' },\n { type: 'whiteout', label: 'Whiteout', icon: '□', group: 'redact' },\n];\n\nexport function DesignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n onSave,\n onChange,\n hideHeader,\n headerPortalRef,\n}: DesignerViewProps = {}) {\n if (!isValidApiKey(apiKey)) {\n return (\n <div className=\"designer-layout\">\n <div className=\"empty-state\">\n <h2>Invalid API Key</h2>\n <p>A valid API key is required to use Exeq. Visit <a href=\"https://exeq.org\">exeq.org</a> to get one.</p>\n </div>\n </div>\n );\n }\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const { state: fields, set: setFields, setWithoutHistory: setFieldsSilent, beginBatch, commitBatch, undo: undoFields, redo: redoFields, canUndo, canRedo } = useHistory<FormField[]>(initialTemplate?.fields ?? []);\n const [selectedFieldIds, setSelectedFieldIds] = useState<Set<string>>(new Set());\n const [signerRoles, setSignerRoles] = useState<string[]>(initialTemplate?.signerRoles ?? [...DEFAULT_SIGNER_ROLES]);\n const [activeRole, setActiveRole] = useState('Sender');\n const [activeFieldType, setActiveFieldType] = useState<FieldType>('text');\n const [loading, setLoading] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [rightTab, setRightTab] = useState<'properties' | 'fields'>('properties');\n const [isAddingRole, setIsAddingRole] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n const [draggingFieldType, setDraggingFieldType] = useState<FieldType | null>(null);\n const [panelWidth, setPanelWidth] = useState(380);\n const [zoom, setZoom] = useState(1);\n const [isPanning, setIsPanning] = useState(false);\n const panRef = useRef<{ startX: number; startY: number; scrollLeft: number; scrollTop: number } | null>(null);\n const pdfAreaRef = useRef<HTMLDivElement>(null);\n const [clipboardFields, setClipboardFields] = useState<FormField[]>([]);\n const dragGhostRef = useRef<HTMLDivElement | null>(null);\n const resizingRef = useRef(false);\n const lastStylesRef = useRef<Partial<Record<FieldType, { width: number; height: number; fontSize: number; inkColor?: string }>>>({});\n\n // Fire onChange whenever any part of the template state changes.\n // Skip the very first synchronous run so we don't echo back the initialTemplate\n // before the consumer has had a chance to mount.\n const onChangeMountedRef = useRef(false);\n useEffect(() => {\n if (!onChange) return;\n if (!onChangeMountedRef.current) {\n onChangeMountedRef.current = true;\n return;\n }\n const template: Template = {\n fields,\n signerRoles,\n pdfUrl: typeof pdfSource === 'string' ? pdfSource : '',\n };\n onChange(template);\n }, [fields, signerRoles, pdfSource, onChange]);\n\n // Load PDF from props, URL params, or postMessage\n useEffect(() => {\n const pdfUrl = initialPdfUrl || initialTemplate?.pdfUrl;\n if (pdfUrl) {\n loadPdf(pdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const paramPdf = params.get('pdf');\n if (paramPdf) {\n loadPdf(paramPdf);\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-pdf' && e.data.url) {\n loadPdf(e.data.url);\n }\n if (e.data?.type === 'load-template') {\n if (e.data.fields) setFields(e.data.fields);\n if (e.data.signerRoles) setSignerRoles(e.data.signerRoles);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialPdfUrl, initialTemplate]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const handleFileUpload = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (reader.result) loadPdf(reader.result as ArrayBuffer);\n };\n reader.readAsArrayBuffer(file);\n }, [loadPdf]);\n\n const handlePageClick = useCallback((page: number, x: number, y: number) => {\n // Preserve scroll position — creating a field shouldn't jump the view\n const scrollEl = pdfAreaRef.current;\n const scrollTop = scrollEl?.scrollTop ?? 0;\n const field = createField(activeFieldType, activeRole, page, x, y, fields);\n const sticky = lastStylesRef.current[activeFieldType];\n const styledField = sticky ? { ...field, ...sticky } : field;\n setFields(prev => [...prev, styledField]);\n setSelectedFieldIds(new Set([styledField.id]));\n // Restore after React renders\n requestAnimationFrame(() => { if (scrollEl) scrollEl.scrollTop = scrollTop; });\n setRightTab('properties');\n }, [activeFieldType, activeRole, fields]);\n\n const handleFieldMove = useCallback((id: string, page: number, x: number, y: number) => {\n setFieldsSilent(prev => prev.map(f => {\n if (f.id !== id || f.locked) return f;\n return { ...f, page, x, y };\n }));\n }, [setFieldsSilent]);\n\n const handleFieldResize = useCallback((id: string, width: number, height: number) => {\n setFieldsSilent(prev => {\n const field = prev.find(f => f.id === id);\n if (field) {\n const existing = lastStylesRef.current[field.type] || {};\n lastStylesRef.current[field.type] = { ...existing, width, height, fontSize: field.fontSize };\n }\n return prev.map(f => f.id === id ? { ...f, width, height } : f);\n });\n }, [setFieldsSilent]);\n\n const handleFieldUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => {\n if (updates.label !== undefined) {\n const otherLabels = prev.filter(f => f.id !== id).map(f => f.label);\n updates.label = uniqueLabel(updates.label, otherLabels);\n }\n const updated = prev.map(f => f.id === id ? { ...f, ...updates } : f);\n\n // Track style changes as sticky defaults for new fields of the same type\n const field = prev.find(f => f.id === id);\n if (field && (updates.fontSize !== undefined || updates.width !== undefined || updates.height !== undefined || updates.inkColor !== undefined)) {\n const merged = { ...field, ...updates };\n lastStylesRef.current[field.type] = {\n width: merged.width,\n height: merged.height,\n fontSize: merged.fontSize,\n inkColor: merged.inkColor,\n };\n }\n\n return updated;\n });\n }, []);\n\n const handleBulkUpdate = useCallback((updates: Partial<FormField>) => {\n setFields(prev => prev.map(f => selectedFieldIds.has(f.id) ? { ...f, ...updates } : f));\n }, [selectedFieldIds]);\n\n const handleAlign = useCallback((type: 'left' | 'right' | 'top' | 'bottom' | 'center-h' | 'center-v' | 'distribute-h' | 'distribute-v') => {\n setFields(prev => {\n const selected = prev.filter(f => selectedFieldIds.has(f.id));\n if (selected.length < 2) return prev;\n\n let updates: Record<string, { x?: number; y?: number }> = {};\n\n if (type === 'left') {\n const minX = Math.min(...selected.map(f => f.x));\n selected.forEach(f => { updates[f.id] = { x: minX }; });\n } else if (type === 'right') {\n const maxRight = Math.max(...selected.map(f => f.x + f.width));\n selected.forEach(f => { updates[f.id] = { x: maxRight - f.width }; });\n } else if (type === 'top') {\n const minY = Math.min(...selected.map(f => f.y));\n selected.forEach(f => { updates[f.id] = { y: minY }; });\n } else if (type === 'bottom') {\n const maxBottom = Math.max(...selected.map(f => f.y + f.height));\n selected.forEach(f => { updates[f.id] = { y: maxBottom - f.height }; });\n } else if (type === 'center-h') {\n const centers = selected.map(f => f.x + f.width / 2);\n const avgCenter = centers.reduce((a, b) => a + b, 0) / centers.length;\n selected.forEach(f => { updates[f.id] = { x: avgCenter - f.width / 2 }; });\n } else if (type === 'center-v') {\n const centers = selected.map(f => f.y + f.height / 2);\n const avgCenter = centers.reduce((a, b) => a + b, 0) / centers.length;\n selected.forEach(f => { updates[f.id] = { y: avgCenter - f.height / 2 }; });\n } else if (type === 'distribute-h') {\n const sorted = [...selected].sort((a, b) => a.x - b.x);\n const first = sorted[0], last = sorted[sorted.length - 1];\n const totalSpan = (last.x + last.width) - first.x;\n const totalFieldWidth = sorted.reduce((s, f) => s + f.width, 0);\n const gap = (totalSpan - totalFieldWidth) / (sorted.length - 1);\n let cx = first.x;\n sorted.forEach(f => { updates[f.id] = { x: cx }; cx += f.width + gap; });\n } else if (type === 'distribute-v') {\n const sorted = [...selected].sort((a, b) => a.y - b.y);\n const first = sorted[0], last = sorted[sorted.length - 1];\n const totalSpan = (last.y + last.height) - first.y;\n const totalFieldHeight = sorted.reduce((s, f) => s + f.height, 0);\n const gap = (totalSpan - totalFieldHeight) / (sorted.length - 1);\n let cy = first.y;\n sorted.forEach(f => { updates[f.id] = { y: cy }; cy += f.height + gap; });\n }\n\n return prev.map(f => updates[f.id] ? { ...f, ...updates[f.id] } : f);\n });\n }, [selectedFieldIds]);\n\n const handleFieldDelete = useCallback((id: string) => {\n const field = fields.find(f => f.id === id);\n if (field?.locked) return;\n setFields(prev => prev.filter(f => f.id !== id));\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const handleSelectField = useCallback((id: string | null, e?: React.MouseEvent) => {\n if (!id) {\n setSelectedFieldIds(new Set());\n return;\n }\n if (e && (e.metaKey || e.ctrlKey)) {\n // Cmd/Ctrl+click: toggle in/out of selection\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n } else if (e && e.shiftKey && selectedFieldIds.size > 0) {\n // Shift+click: range select in document order\n const lastId = Array.from(selectedFieldIds).pop()!;\n const sorted = sortedFields.map(f => f.id);\n const a = sorted.indexOf(lastId);\n const b = sorted.indexOf(id);\n if (a >= 0 && b >= 0) {\n const start = Math.min(a, b);\n const end = Math.max(a, b);\n const range = sorted.slice(start, end + 1);\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n range.forEach(fid => next.add(fid));\n return next;\n });\n } else {\n setSelectedFieldIds(new Set([id]));\n }\n } else {\n setSelectedFieldIds(new Set([id]));\n }\n setRightTab('properties');\n }, [selectedFieldIds]);\n\n const handleGroupMove = useCallback((ids: string[], dx: number, dy: number) => {\n setFieldsSilent(prev => prev.map(f => {\n if (!ids.includes(f.id) || f.locked) return f;\n const newX = Math.max(0, Math.min(100 - f.width, f.x + dx));\n const newY = Math.max(0, Math.min(100 - f.height, f.y + dy));\n return { ...f, x: newX, y: newY };\n }));\n }, [setFieldsSilent]);\n\n const handleAddRole = useCallback(() => {\n const name = newRoleName.trim();\n if (name && !signerRoles.includes(name)) {\n setSignerRoles(prev => [...prev, name]);\n }\n setNewRoleName('');\n setIsAddingRole(false);\n }, [newRoleName, signerRoles]);\n\n const handleRemoveRole = useCallback((role: string) => {\n setSignerRoles(prev => prev.filter(r => r !== role));\n setFields(prev => prev.map(f => f.assignee === role ? { ...f, assignee: signerRoles[0] } : f));\n if (activeRole === role) setActiveRole(signerRoles[0]);\n }, [signerRoles, activeRole]);\n\n const handleExport = useCallback(() => {\n const template: Template = {\n fields,\n signerRoles,\n pdfUrl: typeof pdfSource === 'string' ? pdfSource : '',\n };\n\n if (onSave) {\n onSave(template);\n } else {\n const json = JSON.stringify(template, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'template.json';\n a.click();\n URL.revokeObjectURL(url);\n }\n\n window.parent?.postMessage({ type: 'template-saved', template }, '*');\n }, [fields, signerRoles, pdfSource, onSave]);\n\n // Drag from palette\n const handlePaletteDragStart = useCallback((e: React.DragEvent, type: FieldType) => {\n setDraggingFieldType(type);\n e.dataTransfer.setData('application/exeq-field-type', type);\n e.dataTransfer.effectAllowed = 'copy';\n\n // Create a styled drag ghost\n const ghost = document.createElement('div');\n ghost.className = 'palette-drag-ghost';\n ghost.textContent = FIELD_TYPE_META.find(f => f.type === type)?.label || type;\n ghost.style.cssText = `\n position: fixed; top: -200px; left: -200px;\n padding: 6px 16px; background: ${getSignerColor(activeRole)};\n color: #fff; border-radius: 4px; font-size: 12px;\n font-family: system-ui; pointer-events: none; white-space: nowrap;\n `;\n document.body.appendChild(ghost);\n e.dataTransfer.setDragImage(ghost, 40, 16);\n dragGhostRef.current = ghost;\n }, [activeRole]);\n\n const handlePaletteDragEnd = useCallback(() => {\n setDraggingFieldType(null);\n if (dragGhostRef.current) {\n document.body.removeChild(dragGhostRef.current);\n dragGhostRef.current = null;\n }\n }, []);\n\n const handleDropOnPage = useCallback((page: number, x: number, y: number, fieldType: FieldType) => {\n const field = createField(fieldType, activeRole, page, x, y, fields);\n const sticky = lastStylesRef.current[fieldType];\n const styledField = sticky ? { ...field, ...sticky } : field;\n setFields(prev => [...prev, styledField]);\n setSelectedFieldIds(new Set([styledField.id]));\n setRightTab('properties');\n }, [activeRole, fields]);\n\n // Delete key handler — only when no input/textarea/select is focused\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Delete' && e.key !== 'Backspace') return;\n if (selectedFieldIds.size === 0) return;\n\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n if ((document.activeElement as HTMLElement)?.isContentEditable) return;\n\n e.preventDefault();\n setFields(prev => prev.filter(f => !selectedFieldIds.has(f.id) || f.locked));\n setSelectedFieldIds(prev => {\n const remaining = new Set<string>();\n fields.forEach(f => { if (selectedFieldIds.has(f.id) && f.locked) remaining.add(f.id); });\n return remaining;\n });\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldIds, fields]);\n\n // Copy/paste handler\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n if ((document.activeElement as HTMLElement)?.isContentEditable) return;\n\n const isMod = e.metaKey || e.ctrlKey;\n\n // Select All (Cmd/Ctrl+A)\n if (isMod && e.key === 'a') {\n e.preventDefault();\n setSelectedFieldIds(new Set(fields.map(f => f.id)));\n return;\n }\n\n // Undo (Cmd/Ctrl+Z)\n if (isMod && e.key === 'z' && !e.shiftKey) {\n e.preventDefault();\n undoFields();\n return;\n }\n\n // Redo (Cmd/Ctrl+Y or Cmd/Ctrl+Shift+Z)\n if (isMod && (e.key === 'y' || (e.key === 'z' && e.shiftKey))) {\n e.preventDefault();\n redoFields();\n return;\n }\n\n // Copy (Cmd/Ctrl+C)\n if (isMod && e.key === 'c' && selectedFieldIds.size > 0) {\n const selected = fields.filter(f => selectedFieldIds.has(f.id));\n if (selected.length > 0) {\n e.preventDefault();\n setClipboardFields(selected);\n }\n }\n\n // Paste (Cmd/Ctrl+V)\n if (isMod && e.key === 'v' && clipboardFields.length > 0) {\n e.preventDefault();\n let existingLabels = fields.map(f => f.label);\n const newIds = new Set<string>();\n const newFields = clipboardFields.map(cf => {\n const label = uniqueLabel(cf.label, existingLabels);\n existingLabels.push(label);\n const id = generateId();\n newIds.add(id);\n return { ...cf, id, label, x: cf.x + 2, y: cf.y + 2, value: '' };\n });\n setFields(prev => [...prev, ...newFields]);\n setSelectedFieldIds(newIds);\n setRightTab('properties');\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldIds, fields, clipboardFields]);\n\n // Keyboard zoom (Cmd/Ctrl + / -) and spacebar pan\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMod = e.metaKey || e.ctrlKey;\n if (isMod && (e.key === '=' || e.key === '+')) {\n e.preventDefault();\n setZoom(z => Math.min(3, z + 0.25));\n }\n if (isMod && e.key === '-') {\n e.preventDefault();\n setZoom(z => Math.max(0.75, z - 0.25));\n }\n if (isMod && e.key === '0') {\n e.preventDefault();\n setZoom(1);\n }\n if (e.key === ' ') {\n const tag = (document.activeElement?.tagName || '').toLowerCase();\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\n e.preventDefault();\n e.stopPropagation();\n setIsPanning(true);\n }\n };\n const handleKeyUp = (e: KeyboardEvent) => {\n if (e.key === ' ') {\n e.preventDefault();\n setIsPanning(false);\n panRef.current = null;\n }\n };\n window.addEventListener('keydown', handleKeyDown, { capture: true });\n window.addEventListener('keyup', handleKeyUp, { capture: true });\n return () => {\n window.removeEventListener('keydown', handleKeyDown, { capture: true });\n window.removeEventListener('keyup', handleKeyUp, { capture: true });\n };\n }, []);\n\n // Mouse wheel zoom\n useEffect(() => {\n const el = pdfAreaRef.current;\n if (!el) return;\n const handleWheel = (e: WheelEvent) => {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n const delta = e.deltaY > 0 ? -0.1 : 0.1;\n setZoom(z => Math.max(0.75, Math.min(3, z + delta)));\n }\n };\n el.addEventListener('wheel', handleWheel, { passive: false });\n return () => el.removeEventListener('wheel', handleWheel);\n }, [pages.length]);\n\n // Spacebar pan handlers\n const handlePanMouseDown = useCallback((e: React.MouseEvent) => {\n if (!isPanning || !pdfAreaRef.current) return;\n e.preventDefault();\n panRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n scrollLeft: pdfAreaRef.current.scrollLeft,\n scrollTop: pdfAreaRef.current.scrollTop,\n };\n }, [isPanning]);\n\n const handlePanMouseMove = useCallback((e: React.MouseEvent) => {\n if (!panRef.current || !pdfAreaRef.current) return;\n pdfAreaRef.current.scrollLeft = panRef.current.scrollLeft - (e.clientX - panRef.current.startX);\n pdfAreaRef.current.scrollTop = panRef.current.scrollTop - (e.clientY - panRef.current.startY);\n }, []);\n\n const handlePanMouseUp = useCallback(() => {\n panRef.current = null;\n }, []);\n\n // Resize handle for right panel\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n resizingRef.current = true;\n const startX = e.clientX;\n const startWidth = panelWidth;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizingRef.current) return;\n const delta = startX - e.clientX;\n setPanelWidth(Math.max(280, Math.min(600, startWidth + delta)));\n };\n\n const handleMouseUp = () => {\n resizingRef.current = false;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [panelWidth]);\n\n const sortedFields = sortFieldsByPosition(fields);\n\n // For property panel, show the last selected field (or null if multi/none)\n const selectedField = selectedFieldIds.size === 1\n ? fields.find(f => f.id === Array.from(selectedFieldIds)[0]) || null\n : null;\n\n const renderFieldContent = useCallback((field: FormField) => {\n if (isRedactField(field)) {\n return null; // Rendered purely via background color on the overlay\n }\n if (isSignatureField(field)) {\n if (field.value) {\n return <img src={field.value} alt={field.label} className=\"field-signature-preview\" />;\n }\n }\n const inkColor = field.inkColor || '#000000';\n const cssFontFamily = getCssFontFamily(field.fontFamily);\n return (\n <div\n className=\"field-overlay-placeholder\"\n style={{\n color: field.value ? inkColor : undefined,\n fontSize: `${field.fontSize}pt`,\n fontFamily: cssFontFamily,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing}pt` : undefined,\n lineHeight: field.lineHeight ? `${field.lineHeight}` : undefined,\n }}\n >\n {field.value || field.placeholder}\n </div>\n );\n }, [fields]);\n\n const headerButtons = pages.length > 0 ? (\n <>\n <label className=\"header-btn header-btn-outline\">\n Change PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n <button onClick={handleExport} className=\"header-btn header-btn-primary\">\n Export Template\n </button>\n </>\n ) : null;\n\n // Default placement of the action buttons (Change PDF, Export Template) is\n // a sticky bar at the top of the right panel — keeps them visible without\n // eating a full row of vertical space across the entire designer. When\n // `headerPortalRef` is set, the buttons are portalled there instead. When\n // `hideHeader` is true, they're hidden entirely (consumer is expected to\n // wire its own UI to trigger Export, etc.).\n return (\n <div className=\"designer-layout\">\n {/* Portal header buttons into external container if provided */}\n {headerPortalRef?.current && headerButtons && createPortal(headerButtons, headerPortalRef.current)}\n\n <div className=\"designer-body\">\n {/* ── Left palette ──────────────────────── */}\n {pages.length > 0 && (\n <div className=\"designer-palette\">\n {/* Role selector first */}\n <div className=\"palette-heading\">New Field Role</div>\n <div className=\"palette-role-section\">\n <select\n className=\"palette-role-select\"\n value={activeRole}\n onChange={e => setActiveRole(e.target.value)}\n style={{ borderColor: getSignerColor(activeRole), color: getSignerColor(activeRole) }}\n >\n {signerRoles.map(role => (\n <option key={role} value={role}>{role}</option>\n ))}\n </select>\n {isAddingRole ? (\n <div className=\"palette-role-add-inline\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAddRole()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAddRole}>Add</button>\n <button onClick={() => { setIsAddingRole(false); setNewRoleName(''); }}>Cancel</button>\n </div>\n ) : (\n <button className=\"palette-role-add-link\" onClick={() => setIsAddingRole(true)}>\n + Add Role\n </button>\n )}\n </div>\n\n <div className=\"palette-divider\" />\n <div className=\"palette-heading\">Fields</div>\n {FIELD_TYPE_META.filter(f => !f.group).map(({ type, label, icon }) => (\n <div\n key={type}\n className={`palette-item ${activeFieldType === type ? 'active' : ''}`}\n draggable\n onClick={() => setActiveFieldType(type)}\n onDragStart={(e) => handlePaletteDragStart(e, type)}\n onDragEnd={handlePaletteDragEnd}\n >\n <span className=\"palette-item-icon\">{icon}</span>\n <span className=\"palette-item-label\">{label}</span>\n </div>\n ))}\n\n <div className=\"palette-divider\" />\n <div className=\"palette-heading\">Redact</div>\n {FIELD_TYPE_META.filter(f => f.group === 'redact').map(({ type, label, icon }) => (\n <div\n key={type}\n className={`palette-item ${activeFieldType === type ? 'active' : ''}`}\n draggable\n onClick={() => setActiveFieldType(type)}\n onDragStart={(e) => handlePaletteDragStart(e, type)}\n onDragEnd={handlePaletteDragEnd}\n >\n <span className=\"palette-item-icon\">{icon}</span>\n <span className=\"palette-item-label\">{label}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* ── Center: PDF area ─────────────────── */}\n <div\n className={`designer-pdf-area ${isPanning ? 'panning' : ''}`}\n ref={pdfAreaRef}\n onMouseDown={isPanning ? handlePanMouseDown : undefined}\n onMouseMove={isPanning ? handlePanMouseMove : undefined}\n onMouseUp={isPanning ? handlePanMouseUp : undefined}\n onMouseLeave={isPanning ? handlePanMouseUp : undefined}\n >\n {loading && <div className=\"loading-indicator\">Loading PDF...</div>}\n {!pages.length && !loading && (\n <div className=\"empty-state\">\n <h2>Open a PDF to get started</h2>\n <p>Select a PDF from your device to begin. Your file stays on your computer — nothing is uploaded.</p>\n <label className=\"upload-btn upload-btn-large\">\n Select PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n </div>\n )}\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldIds={selectedFieldIds}\n onSelectField={handleSelectField}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\n onGroupMove={handleGroupMove}\n onMoveStart={beginBatch}\n onMoveEnd={commitBatch}\n onPageClick={handlePageClick}\n onDropField={handleDropOnPage}\n onMarqueeSelect={(ids) => setSelectedFieldIds(new Set(ids))}\n mode=\"designer\"\n renderFieldContent={renderFieldContent}\n zoom={zoom}\n />\n )}\n </div>\n\n {/* ── Right panel ──────────────────────── */}\n {pages.length > 0 && (\n <>\n <div className=\"panel-resize-handle\" onMouseDown={handleResizeStart} />\n <div className=\"designer-panel\" style={{ width: panelWidth }}>\n {!hideHeader && !headerPortalRef && headerButtons && (\n <div className=\"designer-panel-actions\">{headerButtons}</div>\n )}\n <div className=\"designer-panel-header\">\n <div className=\"signer-role-indicator\">\n <span className=\"signer-role-indicator-label\">Editing as</span>\n <strong>{activeRole}</strong>\n </div>\n <div className=\"zoom-slider\">\n <button onClick={() => setZoom(z => Math.max(0.75, z - 0.25))} disabled={zoom <= 0.75}>−</button>\n <input\n type=\"range\"\n min=\"75\"\n max=\"300\"\n step=\"25\"\n value={Math.round(zoom * 100)}\n onChange={e => setZoom(Number(e.target.value) / 100)}\n />\n <button onClick={() => setZoom(z => Math.min(3, z + 0.25))} disabled={zoom >= 3}>+</button>\n <div className=\"zoom-dropdown-wrapper\">\n <select\n className=\"zoom-dropdown\"\n value={Math.round(zoom * 100)}\n onChange={e => setZoom(Number(e.target.value) / 100)}\n >\n <option value=\"75\">75%</option>\n <option value=\"100\">100%</option>\n <option value=\"125\">125%</option>\n <option value=\"150\">150%</option>\n <option value=\"200\">200%</option>\n <option value=\"250\">250%</option>\n <option value=\"300\">300%</option>\n {![75,100,125,150,200,250,300].includes(Math.round(zoom * 100)) && (\n <option value={Math.round(zoom * 100)}>{Math.round(zoom * 100)}%</option>\n )}\n </select>\n </div>\n </div>\n </div>\n {/* Tabs */}\n <div className=\"panel-tabs\">\n <button\n className={`panel-tab ${rightTab === 'properties' ? 'active' : ''}`}\n onClick={() => setRightTab('properties')}\n >\n Properties\n </button>\n <button\n className={`panel-tab ${rightTab === 'fields' ? 'active' : ''}`}\n onClick={() => setRightTab('fields')}\n >\n All Fields{fields.length > 0 ? ` (${fields.length})` : ''}\n </button>\n </div>\n\n {/* Tab content */}\n <div className=\"panel-tab-content\">\n {rightTab === 'properties' && (\n <>\n {selectedFieldIds.size > 1 ? (\n <BulkPropertyPanel\n fields={fields.filter(f => selectedFieldIds.has(f.id))}\n signerRoles={signerRoles}\n onUpdate={handleBulkUpdate}\n onAlign={handleAlign}\n onDelete={() => {\n setFields(prev => prev.filter(f => !selectedFieldIds.has(f.id) || f.locked));\n setSelectedFieldIds(prev => {\n const remaining = new Set<string>();\n fields.forEach(f => { if (prev.has(f.id) && f.locked) remaining.add(f.id); });\n return remaining;\n });\n }}\n />\n ) : selectedField ? (\n <>\n <FieldPropertyPanel\n field={selectedField}\n signerRoles={signerRoles}\n onUpdate={handleFieldUpdate}\n onDelete={handleFieldDelete}\n pageSize={pages[selectedField.page] ? { width: pages[selectedField.page].pdfWidth, height: pages[selectedField.page].pdfHeight } : undefined}\n prefillContent={!isRedactField(selectedField) ? (\n <div className=\"prefill-section\">\n <label>Pre-fill Value</label>\n {(isSignatureField(selectedField)) ? (\n <SignatureCanvas\n width={panelWidth - 40}\n height={selectedField.type === 'initials' ? 100 : 150}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, { value: dataUrl })}\n initialValue={selectedField.value}\n inkColor={selectedField.inkColor}\n />\n ) : selectedField.type === 'checkbox' ? (\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.checked ? 'true' : '' })}\n />\n Checked\n </label>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.value })}\n placeholder={`Pre-fill ${selectedField.label}`}\n className=\"prefill-input\"\n style={{ color: selectedField.inkColor || '#000000' }}\n />\n )}\n </div>\n ) : undefined}\n />\n </>\n ) : (\n <div className=\"panel-empty\">\n Click on the PDF to place a field, or select an existing field to edit its properties.\n </div>\n )}\n </>\n )}\n\n {rightTab === 'fields' && (\n <>\n {fields.length === 0 ? (\n <div className=\"panel-empty\">\n No fields yet. Drag a field from the left palette onto the PDF, or click on the PDF to place one.\n </div>\n ) : (\n <div className=\"field-list\">\n {sortedFields.map((f, idx) => {\n const isSel = selectedFieldIds.has(f.id);\n const isSingleSel = isSel && selectedFieldIds.size === 1;\n const isTextLike = f.type === 'text' || f.type === 'dropdown' || f.type === 'signed-date';\n return (\n <div\n key={f.id}\n className={`field-list-item ${isSel ? 'active' : ''}`}\n onClick={(e) => {\n if ((e.target as HTMLElement).tagName === 'INPUT') return;\n if (e.metaKey || e.ctrlKey) {\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n if (next.has(f.id)) next.delete(f.id); else next.add(f.id);\n return next;\n });\n } else if (e.shiftKey && selectedFieldIds.size > 0) {\n const ids = sortedFields.map(sf => sf.id);\n const lastId = Array.from(selectedFieldIds).pop()!;\n const a = ids.indexOf(lastId);\n const b = ids.indexOf(f.id);\n if (a >= 0 && b >= 0) {\n const start = Math.min(a, b);\n const end = Math.max(a, b);\n setSelectedFieldIds(prev => {\n const next = new Set(prev);\n ids.slice(start, end + 1).forEach(id => next.add(id));\n return next;\n });\n }\n } else {\n setSelectedFieldIds(new Set([f.id]));\n }\n }}\n >\n <span\n className=\"field-list-dot\"\n style={{ backgroundColor: getSignerColor(f.assignee) }}\n />\n <span className=\"field-list-name\">{f.label}</span>\n {f.locked && <span className=\"field-list-lock\" title=\"Locked\">🔒</span>}\n <span className=\"field-list-page\">p{f.page + 1}</span>\n {f.required && <span className=\"field-list-required\">*</span>}\n {isSingleSel && isTextLike && (\n <input\n className=\"field-list-input\"\n type=\"text\"\n value={f.value}\n placeholder={f.placeholder}\n maxLength={f.maxLength || undefined}\n autoFocus\n onChange={e => handleFieldUpdate(f.id, { value: e.target.value })}\n onKeyDown={e => {\n if (e.key === 'Tab') {\n e.preventDefault();\n const dir = e.shiftKey ? -1 : 1;\n const nextIdx = idx + dir;\n if (nextIdx >= 0 && nextIdx < sortedFields.length) {\n setSelectedFieldIds(new Set([sortedFields[nextIdx].id]));\n }\n }\n }}\n onClick={e => e.stopPropagation()}\n />\n )}\n {isSingleSel && f.type === 'checkbox' && (\n <label className=\"field-list-checkbox\" onClick={e => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={f.value === 'true'}\n onChange={e => handleFieldUpdate(f.id, { value: e.target.checked ? 'true' : '' })}\n onKeyDown={e => {\n if (e.key === 'Tab') {\n e.preventDefault();\n const dir = e.shiftKey ? -1 : 1;\n const nextIdx = idx + dir;\n if (nextIdx >= 0 && nextIdx < sortedFields.length) {\n setSelectedFieldIds(new Set([sortedFields[nextIdx].id]));\n }\n }\n }}\n />\n </label>\n )}\n </div>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","export function generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport type FieldType = 'text' | 'dropdown' | 'signature' | 'signed-date' | 'checkbox' | 'initials' | 'blackout' | 'whiteout';\n\nexport type TextSubtype = 'freeform' | 'number' | 'date' | 'email' | 'phone';\n\nexport interface FormField {\n id: string;\n type: FieldType;\n textSubtype?: TextSubtype;\n label: string;\n placeholder: string;\n required: boolean;\n assignee: string; // signer role e.g. \"Sender\", \"Signer 1\"\n page: number; // 0-indexed page number\n x: number; // percentage of page width (0-100)\n y: number; // percentage of page height (0-100)\n width: number; // percentage of page width\n height: number; // percentage of page height\n fontSize: number; // in points\n value: string; // pre-filled value or current value\n inkColor?: string; // ink color for text/signature fields (default: '#000000')\n letterSpacing?: number; // extra spacing between characters in points (default: 0)\n lineHeight?: number; // line height multiplier (default: 1.2)\n minLength?: number; // min character count (0 = no minimum)\n maxLength?: number; // max character count (0 = unlimited)\n fontFamily?: string; // font family (default: 'Helvetica')\n options?: string[]; // predefined options for dropdown/radio selection\n formula?: string; // template expression e.g. \"{{Date Field | month}}\" — auto-computed from other fields\n locked?: boolean; // when true, field cannot be moved or edited in designer\n autoShrink?: boolean; // when true, font auto-shrinks to fit field width (default: false)\n}\n\nexport interface Template {\n fields: FormField[];\n signerRoles: string[];\n pdfUrl: string;\n}\n\nexport const DEFAULT_SIGNER_ROLES = ['Sender', 'Signer 1'];\n\nexport const SIGNER_ROLE_COLORS: Record<string, string> = {\n 'Sender': '#6366f1',\n 'Signer 1': '#22c55e',\n 'Signer 2': '#f59e0b',\n 'Signer 3': '#ef4444',\n 'Signer 4': '#06b6d4',\n 'Signer 5': '#d946ef',\n};\n\nexport function getSignerColor(role: string): string {\n return SIGNER_ROLE_COLORS[role] || '#888888';\n}\n\n// ── Field type helpers ──────────────────────\n\nexport function isRedactField(f: FormField | { type: FieldType }): boolean {\n return f.type === 'blackout' || f.type === 'whiteout';\n}\n\nexport function isSignatureField(f: FormField | { type: FieldType }): boolean {\n return f.type === 'signature' || f.type === 'initials';\n}\n\nexport function isTextLikeField(f: FormField | { type: FieldType }): boolean {\n return f.type === 'text' || f.type === 'dropdown' || f.type === 'signed-date';\n}\n\nexport function getInputType(subtype?: TextSubtype): string {\n switch (subtype) {\n case 'email': return 'email';\n case 'number': return 'number';\n case 'phone': return 'tel';\n case 'date': return 'date';\n default: return 'text';\n }\n}\n\nconst CSS_FONT_MAP: Record<string, string> = {\n Courier: '\"Courier New\", Courier, monospace',\n TimesRoman: '\"Times New Roman\", Times, serif',\n Helvetica: 'Helvetica, Arial, sans-serif',\n};\n\nexport function getCssFontFamily(fontFamily?: string): string | undefined {\n return fontFamily ? CSS_FONT_MAP[fontFamily] : undefined;\n}\n\nexport function sortFieldsByPosition(fields: FormField[]): FormField[] {\n return [...fields].sort((a, b) => {\n if (a.page !== b.page) return a.page - b.page;\n const bandThreshold = 2;\n if (Math.abs(a.y - b.y) > bandThreshold) return a.y - b.y;\n return a.x - b.x;\n });\n}\n\nexport function preserveFieldValues(oldFields: FormField[], newFields: FormField[]): FormField[] {\n const valueMap = new Map(oldFields.filter(f => f.value).map(f => [f.id, f.value]));\n return newFields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n}\n\nexport function getFieldValues(fields: FormField[]): Record<string, string> {\n const values: Record<string, string> = {};\n fields.forEach(f => { if (!isRedactField(f)) values[f.label] = f.value || ''; });\n return values;\n}\n\nexport const FONT_FAMILIES = [\n { value: 'Helvetica', label: 'Helvetica' },\n { value: 'Courier', label: 'Courier New' },\n { value: 'TimesRoman', label: 'Times New Roman' },\n] as const;\n\nexport const FIELD_DEFAULTS: Record<FieldType, Partial<FormField>> = {\n text: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: 'Enter text',\n textSubtype: 'freeform',\n },\n dropdown: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: 'Select...',\n },\n signature: {\n width: 20,\n height: 6,\n fontSize: 12,\n placeholder: 'Sign here',\n },\n 'signed-date': {\n width: 15,\n height: 3,\n fontSize: 12,\n placeholder: 'Date',\n },\n checkbox: {\n width: 2.5,\n height: 2.5,\n fontSize: 12,\n placeholder: '',\n },\n initials: {\n width: 8,\n height: 5,\n fontSize: 12,\n placeholder: 'Initials',\n },\n blackout: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: '',\n },\n whiteout: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: '',\n },\n};\n\nconst TYPE_LABELS: Record<FieldType, string> = {\n text: 'Text Field',\n dropdown: 'Dropdown',\n signature: 'Signature',\n 'signed-date': 'Signed Date',\n checkbox: 'Checkbox',\n initials: 'Initials',\n blackout: 'Blackout',\n whiteout: 'Whiteout',\n};\n\n/** Given a desired label and a list of existing labels, return a unique label by appending a number if needed. */\nexport function uniqueLabel(desired: string, existingLabels: string[]): string {\n const lower = desired.toLowerCase();\n if (!existingLabels.some(l => l.toLowerCase() === lower)) return desired;\n let i = 2;\n while (existingLabels.some(l => l.toLowerCase() === `${lower} ${i}`)) i++;\n return `${desired} ${i}`;\n}\n\nexport function createField(\n type: FieldType,\n assignee: string,\n page: number,\n x: number,\n y: number,\n existingFields?: FormField[],\n): FormField {\n const defaults = FIELD_DEFAULTS[type];\n const baseLabel = TYPE_LABELS[type];\n const existingLabels = existingFields?.map(f => f.label) ?? [];\n return {\n id: generateId(),\n type,\n label: uniqueLabel(baseLabel, existingLabels),\n placeholder: defaults.placeholder || '',\n required: type === 'checkbox' || type === 'blackout' || type === 'whiteout' ? false : true,\n assignee,\n page,\n x,\n y,\n width: defaults.width || 20,\n height: defaults.height || 3,\n fontSize: defaults.fontSize || 12,\n value: '',\n ...(type === 'text' ? { textSubtype: defaults.textSubtype as TextSubtype } : {}),\n };\n}\n","import * as pdfjsLib from 'pdfjs-dist';\n\n// Configure the worker\nif (typeof window !== 'undefined') {\n pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.mjs`;\n}\n\nexport interface RenderedPage {\n pageNumber: number;\n dataUrl: string;\n width: number;\n /** Original PDF page width in points */\n pdfWidth: number;\n /** Original PDF page height in points */\n pdfHeight: number;\n height: number;\n}\n\nexport async function renderPdfPages(\n source: string | ArrayBuffer,\n scale: number = 2,\n): Promise<RenderedPage[]> {\n const loadingTask = pdfjsLib.getDocument(\n typeof source === 'string' ? { url: source } : { data: source }\n );\n const pdf = await loadingTask.promise;\n const pages: RenderedPage[] = [];\n\n for (let i = 1; i <= pdf.numPages; i++) {\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d')!;\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n const unscaledViewport = page.getViewport({ scale: 1 });\n pages.push({\n pageNumber: i,\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height,\n pdfWidth: unscaledViewport.width,\n pdfHeight: unscaledViewport.height,\n });\n }\n\n return pages;\n}\n","'use client';\n\nimport { useRef, useCallback, useState } from 'react';\nimport type { FormField, FieldType } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { getSignerColor, isRedactField } from '@/types/pdf-builder';\n\ninterface PdfViewerProps {\n pages: RenderedPage[];\n fields: FormField[];\n selectedFieldIds: Set<string>;\n onSelectField: (id: string | null, e?: React.MouseEvent) => void;\n onFieldMove?: (id: string, page: number, x: number, y: number) => void;\n onFieldResize?: (id: string, width: number, height: number) => void;\n onPageClick?: (page: number, x: number, y: number) => void;\n onDropField?: (page: number, x: number, y: number, fieldType: FieldType) => void;\n /** Move multiple fields as a group. Called with dx/dy in percentage units. */\n onGroupMove?: (ids: string[], dx: number, dy: number) => void;\n /** Called when a drag/resize operation starts (for undo history batching). */\n onMoveStart?: () => void;\n /** Called when a drag/resize operation ends (for undo history commit). */\n onMoveEnd?: () => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n zoom?: number;\n /** Called with field IDs inside a drag-selection rectangle */\n onMarqueeSelect?: (ids: string[]) => void;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldIds,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n onDropField,\n onGroupMove,\n onMoveStart,\n onMoveEnd,\n mode,\n currentSigner,\n renderFieldContent,\n zoom = 1,\n onMarqueeSelect,\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [guides, setGuides] = useState<{ page: number; x?: number; y?: number }[]>([]);\n const [marquee, setMarquee] = useState<{ page: number; x1: number; y1: number; x2: number; y2: number } | null>(null);\n const marqueeRef = useRef<{ startX: number; startY: number; page: number; didDrag: boolean } | null>(null);\n\n // Replaced onClick with mousedown/up to distinguish click vs drag-select\n const handlePageMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement>, pageIndex: number) => {\n const target = e.target as HTMLElement;\n if (target.closest('.field-overlay')) return;\n if (mode !== 'designer') return;\n e.preventDefault();\n\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n\n marqueeRef.current = { startX: x, startY: y, page: pageIndex, didDrag: false };\n\n const handleMouseMove = (ev: MouseEvent) => {\n if (!marqueeRef.current) return;\n const mx = ((ev.clientX - rect.left) / rect.width) * 100;\n const my = ((ev.clientY - rect.top) / rect.height) * 100;\n const dx = Math.abs(mx - marqueeRef.current.startX);\n const dy = Math.abs(my - marqueeRef.current.startY);\n if (dx > 1 || dy > 1) {\n marqueeRef.current.didDrag = true;\n setMarquee({\n page: pageIndex,\n x1: Math.min(marqueeRef.current.startX, mx),\n y1: Math.min(marqueeRef.current.startY, my),\n x2: Math.max(marqueeRef.current.startX, mx),\n y2: Math.max(marqueeRef.current.startY, my),\n });\n }\n };\n\n const handleMouseUp = (ev: MouseEvent) => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n\n if (marqueeRef.current?.didDrag && onMarqueeSelect) {\n const mx1 = Math.min(marqueeRef.current.startX, ((ev.clientX - rect.left) / rect.width) * 100);\n const my1 = Math.min(marqueeRef.current.startY, ((ev.clientY - rect.top) / rect.height) * 100);\n const mx2 = Math.max(marqueeRef.current.startX, ((ev.clientX - rect.left) / rect.width) * 100);\n const my2 = Math.max(marqueeRef.current.startY, ((ev.clientY - rect.top) / rect.height) * 100);\n const pageFields = fields.filter(f => f.page === pageIndex);\n const hits = pageFields.filter(f => {\n return f.x < mx2 && f.x + f.width > mx1 && f.y < my2 && f.y + f.height > my1;\n }).map(f => f.id);\n onMarqueeSelect(hits);\n } else if (!marqueeRef.current?.didDrag) {\n // Simple click — create a new field\n if (onPageClick) {\n onPageClick(pageIndex, x, y);\n } else {\n onSelectField(null);\n }\n }\n\n marqueeRef.current = null;\n setMarquee(null);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [mode, fields, onPageClick, onSelectField, onMarqueeSelect]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n if (e.dataTransfer.types.includes('application/exeq-field-type')) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n }\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent, pageIndex: number) => {\n const fieldType = e.dataTransfer.getData('application/exeq-field-type') as FieldType;\n if (!fieldType || !onDropField) return;\n e.preventDefault();\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n onDropField(pageIndex, x, y, fieldType);\n }, [onDropField]);\n\n return (\n <div className=\"pdf-viewer-zoom-wrapper\" ref={containerRef} style={zoom !== 1 ? { width: `${zoom * 100}%`, minHeight: 'min-content' } : undefined}>\n <div className=\"pdf-viewer\" style={zoom !== 1 ? { transform: `scale(${zoom})`, transformOrigin: 'top left', width: `${100 / zoom}%` } : undefined}>\n {pages.map((page, pageIndex) => {\n const pageFields = fields.filter(f => f.page === pageIndex);\n return (\n <div\n key={pageIndex}\n className=\"pdf-page\"\n style={{ width: `${page.pdfWidth || 612}pt`, maxWidth: '100%', aspectRatio: `${page.width} / ${page.height}` }}\n onMouseDown={(e) => handlePageMouseDown(e, pageIndex)}\n onDragOver={handleDragOver}\n onDrop={(e) => handleDrop(e, pageIndex)}\n data-page={pageIndex}\n >\n <img\n src={page.dataUrl}\n alt={`Page ${pageIndex + 1}`}\n className=\"pdf-page-image\"\n draggable={false}\n />\n {pageFields.map(field => (\n <FieldOverlayItem\n key={field.id}\n field={field}\n isSelected={selectedFieldIds.has(field.id)}\n isMultiSelected={selectedFieldIds.size > 1 && selectedFieldIds.has(field.id)}\n onSelect={(e) => onSelectField(field.id, e)}\n onMove={onFieldMove}\n onResize={onFieldResize}\n onGroupMove={selectedFieldIds.size > 1 && selectedFieldIds.has(field.id) ? onGroupMove : undefined}\n onMoveStart={onMoveStart}\n onMoveEnd={onMoveEnd}\n otherFields={mode === 'designer' ? pageFields.filter(f => f.id !== field.id && !selectedFieldIds.has(f.id)) : undefined}\n setGuides={mode === 'designer' ? setGuides : undefined}\n pageIndex={pageIndex}\n selectedIds={selectedFieldIds}\n mode={mode}\n currentSigner={currentSigner}\n renderContent={renderFieldContent}\n />\n ))}\n {/* Snap alignment guides */}\n {guides.filter(g => g.page === pageIndex).map((g, i) => (\n g.x !== undefined ? (\n <div key={`gx${i}`} className=\"snap-guide snap-guide-v\" style={{ left: `${g.x}%` }} />\n ) : (\n <div key={`gy${i}`} className=\"snap-guide snap-guide-h\" style={{ top: `${g.y}%` }} />\n )\n ))}\n {/* Marquee selection rectangle */}\n {marquee && marquee.page === pageIndex && (\n <div className=\"marquee-rect\" style={{\n left: `${marquee.x1}%`,\n top: `${marquee.y1}%`,\n width: `${marquee.x2 - marquee.x1}%`,\n height: `${marquee.y2 - marquee.y1}%`,\n }} />\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\ninterface FieldOverlayItemProps {\n field: FormField;\n isSelected: boolean;\n isMultiSelected: boolean;\n onSelect: (e: React.MouseEvent) => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n onGroupMove?: (ids: string[], dx: number, dy: number) => void;\n onMoveStart?: () => void;\n onMoveEnd?: () => void;\n otherFields?: FormField[];\n setGuides?: (guides: { page: number; x?: number; y?: number }[]) => void;\n pageIndex?: number;\n selectedIds: Set<string>;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nconst SNAP_THRESHOLD = 1.2; // percentage units\n\nfunction snapAndGuide(\n field: { x: number; y: number; width: number; height: number },\n others: FormField[],\n page: number,\n): { x: number; y: number; guides: { page: number; x?: number; y?: number }[] } {\n const fx = field.x, fy = field.y, fw = field.width, fh = field.height;\n const fcx = fx + fw / 2, fcy = fy + fh / 2;\n\n // Find the closest snap on each axis independently\n let bestSnapX: { offset: number; guideX: number; dist: number } | null = null;\n let bestSnapY: { offset: number; guideY: number; dist: number } | null = null;\n\n for (const o of others) {\n const ox = o.x, oy = o.y, ow = o.width, oh = o.height;\n const ocx = ox + ow / 2, ocy = oy + oh / 2;\n\n // X candidates: [fieldEdge, targetEdge, guideLineX]\n const xCandidates = [\n [fx, ox, ox], // left ↔ left\n [fx + fw, ox + ow, ox + ow], // right ↔ right\n [fcx, ocx, ocx], // center ↔ center\n [fx, ox + ow, ox + ow], // left ↔ right\n [fx + fw, ox, ox], // right ↔ left\n ];\n for (const [fe, te, gx] of xCandidates) {\n const d = Math.abs(fe - te);\n if (d < SNAP_THRESHOLD && (!bestSnapX || d < bestSnapX.dist)) {\n bestSnapX = { offset: te - fe, guideX: gx, dist: d };\n }\n }\n\n // Y candidates\n const yCandidates = [\n [fy, oy, oy], // top ↔ top\n [fy + fh, oy + oh, oy + oh], // bottom ↔ bottom\n [fcy, ocy, ocy], // center ↔ center\n [fy, oy + oh, oy + oh], // top ↔ bottom\n [fy + fh, oy, oy], // bottom ↔ top\n ];\n for (const [fe, te, gy] of yCandidates) {\n const d = Math.abs(fe - te);\n if (d < SNAP_THRESHOLD && (!bestSnapY || d < bestSnapY.dist)) {\n bestSnapY = { offset: te - fe, guideY: gy, dist: d };\n }\n }\n }\n\n const snappedX = bestSnapX ? fx + bestSnapX.offset : fx;\n const snappedY = bestSnapY ? fy + bestSnapY.offset : fy;\n\n const guides: { page: number; x?: number; y?: number }[] = [];\n if (bestSnapX) guides.push({ page, x: bestSnapX.guideX });\n if (bestSnapY) guides.push({ page, y: bestSnapY.guideY });\n\n return {\n x: Math.max(0, Math.min(100 - fw, snappedX)),\n y: Math.max(0, Math.min(100 - fh, snappedY)),\n guides,\n };\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n isMultiSelected,\n onSelect,\n onMove,\n onResize,\n onGroupMove,\n onMoveStart,\n onMoveEnd,\n otherFields,\n setGuides,\n pageIndex,\n selectedIds,\n mode,\n currentSigner,\n renderContent,\n}: FieldOverlayItemProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const dragStartRef = useRef<{ startX: number; startY: number; fieldX: number; fieldY: number } | null>(null);\n const dragPosRef = useRef<{ x: number; y: number }>({ x: field.x, y: field.y });\n const didDragRef = useRef(false);\n const resizeStartRef = useRef<{ startX: number; startY: number; fieldW: number; fieldH: number } | null>(null);\n\n const isRedact = isRedactField(field);\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\n const isInactiveSigner = mode === 'signer' && !isRedact && field.assignee !== currentSigner;\n const isFilled = mode === 'signer' && isEditable && !isRedact && (\n field.type === 'checkbox' ? true :\n field.formula ? true :\n !!field.value\n );\n const color = isInactiveSigner ? '#cccccc' : (isFilled ? '#22c55e' : getSignerColor(field.assignee));\n const isPreFilled = !isEditable && !!field.value;\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onMove) return;\n e.preventDefault();\n e.stopPropagation();\n\n // If this field is already selected in a group, don't deselect others on mousedown\n // (wait for mouseup to decide if it was a click or a drag)\n const alreadyInSelection = selectedIds.has(field.id) && selectedIds.size > 1;\n if (!alreadyInSelection) {\n onSelect(e);\n }\n if (field.locked) return;\n\n onMoveStart?.();\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n didDragRef.current = false;\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldX: field.x,\n fieldY: field.y,\n };\n\n const handleMouseMove = (ev: MouseEvent) => {\n if (!dragStartRef.current) return;\n didDragRef.current = true;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((ev.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((ev.clientY - dragStartRef.current.startY) / rect.height) * 100;\n\n if (isMultiSelected && onGroupMove) {\n onGroupMove(Array.from(selectedIds), dx, dy);\n dragStartRef.current.startX = ev.clientX;\n dragStartRef.current.startY = ev.clientY;\n } else {\n const newX = Math.max(0, Math.min(100 - field.width, dragStartRef.current.fieldX + dx));\n const newY = Math.max(0, Math.min(100 - field.height, dragStartRef.current.fieldY + dy));\n dragPosRef.current = { x: newX, y: newY };\n onMove(field.id, field.page, newX, newY);\n // Show guides only when Shift is held\n if (ev.shiftKey && otherFields && setGuides && pageIndex !== undefined) {\n const { guides: g } = snapAndGuide({ x: newX, y: newY, width: field.width, height: field.height }, otherFields, pageIndex);\n setGuides(g);\n } else {\n setGuides?.([]);\n }\n }\n };\n\n const handleMouseUp = (ev: MouseEvent) => {\n // Snap only when Shift is held and an actual drag occurred\n if (ev.shiftKey && didDragRef.current && otherFields && onMove && pageIndex !== undefined && !isMultiSelected) {\n const pos = dragPosRef.current;\n const snap = snapAndGuide({ x: pos.x, y: pos.y, width: field.width, height: field.height }, otherFields, pageIndex);\n if (snap.x !== pos.x || snap.y !== pos.y) {\n onMove(field.id, field.page, snap.x, snap.y);\n }\n }\n dragStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n setGuides?.([]);\n onMoveEnd?.();\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onMove, onSelect, isMultiSelected, onGroupMove, onMoveStart, onMoveEnd, selectedIds, otherFields, setGuides, pageIndex]);\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onResize || field.locked) return;\n e.preventDefault();\n e.stopPropagation();\n onMoveStart?.();\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n resizeStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldW: field.width,\n fieldH: field.height,\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dw = ((e.clientX - resizeStartRef.current.startX) / rect.width) * 100;\n const dh = ((e.clientY - resizeStartRef.current.startY) / rect.height) * 100;\n const newW = Math.max(2, Math.min(100 - field.x, resizeStartRef.current.fieldW + dw));\n const newH = Math.max(1.5, Math.min(100 - field.y, resizeStartRef.current.fieldH + dh));\n onResize(field.id, newW, newH);\n };\n\n const handleMouseUp = () => {\n resizeStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n onMoveEnd?.();\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onResize, onMoveStart, onMoveEnd]);\n\n return (\n <div\n ref={overlayRef}\n className={`field-overlay ${isSelected ? 'selected' : ''} ${isEditable ? 'editable' : 'readonly'} ${isPreFilled ? 'prefilled' : ''} ${isRedact ? 'redact' : ''} ${isInactiveSigner ? 'inactive-signer' : ''} ${field.locked ? 'locked' : ''}`}\n style={{\n left: `${field.x}%`,\n top: `${field.y}%`,\n width: `${field.width}%`,\n height: `${field.height}%`,\n borderColor: isRedact ? (field.type === 'blackout' ? '#666' : '#bbb') : color,\n borderStyle: isRedact ? 'dashed' : 'solid',\n backgroundColor: isRedact\n ? (field.type === 'blackout' ? '#000000' : '#ffffff')\n : isInactiveSigner ? '#f5f5f5' : (isSelected ? `${color}22` : `${color}11`),\n cursor: mode === 'designer' ? (field.locked ? 'not-allowed' : 'move') : 'default',\n pointerEvents: (mode === 'signer' && (isRedact || isInactiveSigner)) ? 'none' : undefined,\n }}\n onClick={(e) => { e.stopPropagation(); if (!didDragRef.current) onSelect(e); }}\n onMouseDown={handleMouseDown}\n >\n {mode === 'designer' && !isRedact && (\n <div className=\"field-overlay-label\" style={{ backgroundColor: color }}>\n {field.label}\n </div>\n )}\n\n {renderContent ? renderContent(field) : (\n <div className=\"field-overlay-placeholder\">\n {field.value || field.placeholder}\n </div>\n )}\n\n {mode === 'designer' && isSelected && !field.locked && (\n <div\n className=\"field-resize-handle\"\n onMouseDown={handleResizeMouseDown}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor, FONT_FAMILIES, isRedactField, isSignatureField, isTextLikeField } from '@/types/pdf-builder';\n\nconst INK_COLORS = [\n { value: '#000000', label: 'Black' },\n { value: '#1a56db', label: 'Blue' },\n];\n\ninterface FieldPropertyPanelProps {\n field: FormField;\n signerRoles: string[];\n onUpdate: (id: string, updates: Partial<FormField>) => void;\n onDelete: (id: string) => void;\n /** Rendered in the Content section, after options and before Style */\n prefillContent?: React.ReactNode;\n /** Page dimensions in points for converting % to pt in the Advanced panel */\n pageSize?: { width: number; height: number };\n}\n\nexport function FieldPropertyPanel({ field, signerRoles, onUpdate, onDelete, prefillContent, pageSize }: FieldPropertyPanelProps) {\n const color = getSignerColor(field.assignee);\n const isRedact = isRedactField(field);\n const isText = isTextLikeField(field);\n const showInkColor = isText || isSignatureField(field);\n const [newOption, setNewOption] = useState('');\n\n return (\n <div className=\"field-property-panel\">\n {/* ── Header ── */}\n <div className=\"panel-header\">\n <input\n className=\"panel-header-label\"\n style={{ color }}\n value={field.label}\n onChange={e => onUpdate(field.id, { label: e.target.value })}\n />\n <div className=\"panel-header-actions\">\n <button\n onClick={() => onUpdate(field.id, { locked: !field.locked })}\n className={`panel-icon-btn ${field.locked ? 'active' : ''}`}\n title={field.locked ? 'Unlock' : 'Lock'}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n {field.locked ? (\n <><rect x=\"2\" y=\"6\" width=\"10\" height=\"7\" rx=\"1.5\"/><path d=\"M4.5 6V4.5a2.5 2.5 0 015 0V6\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\"/></>\n ) : (\n <><rect x=\"2\" y=\"6\" width=\"10\" height=\"7\" rx=\"1.5\"/><path d=\"M4.5 6V4.5a2.5 2.5 0 015 0\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\"/></>\n )}\n </svg>\n </button>\n <button onClick={() => onDelete(field.id)} className=\"panel-icon-btn panel-icon-btn-danger\" title=\"Delete\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n <path d=\"M5 1h4v1H5V1zM2 3v1h1v8.5A1.5 1.5 0 004.5 14h5a1.5 1.5 0 001.5-1.5V4h1V3H2zm2 1h6v8.5a.5.5 0 01-.5.5h-5a.5.5 0 01-.5-.5V4z\"/>\n </svg>\n </button>\n </div>\n </div>\n\n {/* ── Assigned To ── */}\n {!isRedact && (\n <div className=\"panel-section\">\n <div className=\"panel-section-heading\">Assigned To</div>\n <select\n className=\"panel-assignee-select\"\n value={field.assignee}\n onChange={e => onUpdate(field.id, { assignee: e.target.value })}\n style={{ borderColor: color, color }}\n >\n {signerRoles.map(role => (\n <option key={role} value={role} style={{ color: getSignerColor(role) }}>{role}</option>\n ))}\n </select>\n </div>\n )}\n\n {/* ── Content Section ── */}\n <div className=\"panel-section\">\n <div className=\"panel-section-heading\">Content</div>\n\n {!isRedact && (\n <div className=\"panel-field\">\n <label>Field Type</label>\n <select value={field.type} onChange={e => onUpdate(field.id, { type: e.target.value as FieldType })}>\n <option value=\"text\">Text</option>\n <option value=\"dropdown\">Dropdown</option>\n <option value=\"signature\">Signature</option>\n <option value=\"signed-date\">Signed Date</option>\n <option value=\"checkbox\">Checkbox</option>\n <option value=\"initials\">Initials</option>\n </select>\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Text Type</label>\n <select value={field.textSubtype || 'freeform'} onChange={e => onUpdate(field.id, { textSubtype: e.target.value as TextSubtype })}>\n <option value=\"freeform\">Freeform</option>\n <option value=\"number\">Number</option>\n <option value=\"date\">Date</option>\n <option value=\"email\">Email</option>\n <option value=\"phone\">Phone</option>\n </select>\n </div>\n )}\n\n {!isRedact && (\n <div className=\"panel-field\">\n <label>Placeholder</label>\n <input type=\"text\" value={field.placeholder} onChange={e => onUpdate(field.id, { placeholder: e.target.value })} />\n </div>\n )}\n\n {!isRedact && field.type !== 'checkbox' && (\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input type=\"checkbox\" checked={field.required} onChange={e => onUpdate(field.id, { required: e.target.checked })} />\n Required\n </label>\n </div>\n )}\n\n {isText && (\n <div className=\"panel-field\">\n <label>Formula</label>\n <input type=\"text\" value={field.formula || ''} onChange={e => onUpdate(field.id, { formula: e.target.value || undefined })} placeholder='e.g. {{Date Field | month}}' />\n {field.formula && <span className=\"panel-hint\">Auto-computed. Signer cannot edit.</span>}\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Min Chars</label>\n <input type=\"number\" min=\"0\" max=\"9999\" value={field.minLength || 0} onChange={e => onUpdate(field.id, { minLength: Number(e.target.value) })} />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Max Chars</label>\n <input type=\"number\" min=\"0\" max=\"9999\" value={field.maxLength || 0} onChange={e => onUpdate(field.id, { maxLength: Number(e.target.value) })} />\n </div>\n </div>\n )}\n\n {isText && (\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input type=\"checkbox\" checked={field.autoShrink || false} onChange={e => onUpdate(field.id, { autoShrink: e.target.checked })} />\n Auto-shrink to fit\n </label>\n {field.autoShrink && <span className=\"panel-hint\">Font size reduces to fit text within the field width</span>}\n </div>\n )}\n\n {/* Predefined Options */}\n {(field.type === 'text' || field.type === 'dropdown') && (\n <div className=\"panel-field\">\n <label>{field.type === 'dropdown' ? 'Options' : 'Predefined Options'}</label>\n <div className=\"panel-options-list\">\n {(field.options || []).map((opt, i) => (\n <div key={i} className=\"panel-option-item\">\n <span>{opt}</span>\n <button className=\"panel-option-remove\" onClick={() => {\n const updated = (field.options || []).filter((_, j) => j !== i);\n onUpdate(field.id, { options: updated.length > 0 ? updated : undefined });\n }}>×</button>\n </div>\n ))}\n <div className=\"panel-option-add\">\n <input type=\"text\" value={newOption} onChange={e => setNewOption(e.target.value)} onKeyDown={e => {\n if (e.key === 'Enter' && newOption.trim()) { onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] }); setNewOption(''); }\n }} placeholder=\"Add option...\" />\n <button onClick={() => { if (newOption.trim()) { onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] }); setNewOption(''); } }}>+</button>\n </div>\n </div>\n {field.type === 'dropdown' && (field.options?.length ?? 0) === 0 && <span className=\"panel-hint\" style={{ color: '#c44' }}>Add at least one option</span>}\n {field.type === 'text' && (field.options?.length ?? 0) > 0 && <span className=\"panel-hint\">Signer will choose from these options via dropdown</span>}\n </div>\n )}\n\n {prefillContent}\n </div>\n\n {/* ── Style Section ── */}\n {(isText || showInkColor) && (\n <div className=\"panel-section\">\n <div className=\"panel-section-heading\">Style</div>\n\n {isText && (\n <div className=\"panel-field\">\n <label>Font</label>\n <select value={field.fontFamily || 'Helvetica'} onChange={e => onUpdate(field.id, { fontFamily: e.target.value })}>\n {FONT_FAMILIES.map(f => <option key={f.value} value={f.value}>{f.label}</option>)}\n </select>\n </div>\n )}\n\n {isText && (\n <div className=\"panel-field\">\n <label>Font Size (pt)</label>\n <input type=\"number\" min=\"6\" max=\"72\" value={field.fontSize} onChange={e => onUpdate(field.id, { fontSize: Number(e.target.value) })} />\n </div>\n )}\n\n {isText && (\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Letter Spacing</label>\n <input type=\"number\" min=\"0\" max=\"20\" step=\"0.5\" value={field.letterSpacing || 0} onChange={e => onUpdate(field.id, { letterSpacing: Number(e.target.value) })} />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Line Height</label>\n <input type=\"number\" min=\"0.8\" max=\"3\" step=\"0.1\" value={field.lineHeight || 1.2} onChange={e => onUpdate(field.id, { lineHeight: Number(e.target.value) })} />\n </div>\n </div>\n )}\n\n {showInkColor && (\n <div className=\"panel-field\">\n <label>Ink Color</label>\n <div className=\"ink-color-picker\">\n {INK_COLORS.map(c => (\n <button key={c.value} className={`ink-color-swatch ${(field.inkColor || '#000000') === c.value ? 'active' : ''}`} style={{ backgroundColor: c.value }} onClick={() => onUpdate(field.id, { inkColor: c.value })} title={c.label} />\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* ── Position & Size Section ── */}\n <div className=\"panel-section\">\n <div className=\"panel-section-heading\">Position & Size</div>\n {(() => {\n const pw = pageSize?.width || 612;\n const ph = pageSize?.height || 792;\n const toPt = (pct: number, dim: number) => Math.round(pct / 100 * dim * 10) / 10;\n const fromPt = (pt: number, dim: number) => pt / dim * 100;\n return (\n <>\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>X (pt)</label>\n <input type=\"number\" min=\"0\" step=\"0.5\" value={toPt(field.x, pw)} onChange={e => onUpdate(field.id, { x: fromPt(Number(e.target.value), pw) })} />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Y (pt)</label>\n <input type=\"number\" min=\"0\" step=\"0.5\" value={toPt(field.y, ph)} onChange={e => onUpdate(field.id, { y: fromPt(Number(e.target.value), ph) })} />\n </div>\n </div>\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Width (pt)</label>\n <input type=\"number\" min=\"1\" step=\"0.5\" value={toPt(field.width, pw)} onChange={e => onUpdate(field.id, { width: fromPt(Number(e.target.value), pw) })} />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Height (pt)</label>\n <input type=\"number\" min=\"1\" step=\"0.5\" value={toPt(field.height, ph)} onChange={e => onUpdate(field.id, { height: fromPt(Number(e.target.value), ph) })} />\n </div>\n </div>\n <div className=\"panel-hint\">{pw} × {ph} pt · Page {field.page + 1} · {field.id.slice(0, 8)}</div>\n </>\n );\n })()}\n </div>\n </div>\n );\n}\n\n// ── Bulk Property Panel (multi-select) ─────────────\n\ninterface BulkPropertyPanelProps {\n fields: FormField[];\n signerRoles: string[];\n onUpdate: (updates: Partial<FormField>) => void;\n onAlign: (type: 'left' | 'right' | 'top' | 'bottom' | 'center-h' | 'center-v' | 'distribute-h' | 'distribute-v') => void;\n onDelete: () => void;\n}\n\n/** Returns the shared value if all items agree, or undefined if mixed. */\nfunction sharedValue<T>(items: T[]): T | undefined {\n if (items.length === 0) return undefined;\n return items.every(v => v === items[0]) ? items[0] : undefined;\n}\n\nexport function BulkPropertyPanel({ fields, signerRoles, onUpdate, onAlign, onDelete }: BulkPropertyPanelProps) {\n const count = fields.length;\n const hasText = fields.some(f => f.type === 'text' || f.type === 'dropdown' || f.type === 'signed-date');\n const allNonRedact = fields.every(f => f.type !== 'blackout' && f.type !== 'whiteout');\n\n const sharedAssignee = sharedValue(fields.map(f => f.assignee));\n const sharedRequired = sharedValue(fields.map(f => f.required));\n const sharedFontSize = sharedValue(fields.map(f => f.fontSize));\n const sharedFontFamily = sharedValue(fields.map(f => f.fontFamily || 'Helvetica'));\n const sharedInkColor = sharedValue(fields.map(f => f.inkColor || '#000000'));\n const sharedLetterSpacing = sharedValue(fields.map(f => f.letterSpacing || 0));\n const sharedLineHeight = sharedValue(fields.map(f => f.lineHeight || 1.2));\n\n return (\n <div className=\"field-property-panel\">\n <div className=\"panel-header\">\n <h3>{count} fields selected</h3>\n <button onClick={onDelete} className=\"panel-delete-btn\">\n Delete All\n </button>\n </div>\n\n <div className=\"panel-field\">\n <label>Align</label>\n <div className=\"align-buttons\">\n <button onClick={() => onAlign('left')} title=\"Align left edges\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"1\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"4\" y=\"2\" width=\"8\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"4\" y=\"7\" width=\"5\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('center-h')} title=\"Align centers horizontally\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"6.25\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"2\" y=\"2\" width=\"10\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"3.5\" y=\"7\" width=\"7\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('right')} title=\"Align right edges\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"11.5\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"2\" y=\"2\" width=\"8\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"5\" y=\"7\" width=\"5\" height=\"3\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('top')} title=\"Align top edges\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"1\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"2\" y=\"4\" width=\"3\" height=\"8\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"7\" y=\"4\" width=\"3\" height=\"5\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('center-v')} title=\"Align centers vertically\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"6.25\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"2\" y=\"1\" width=\"3\" height=\"12\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"7\" y=\"3\" width=\"3\" height=\"8\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('bottom')} title=\"Align bottom edges\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"11.5\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"2\" y=\"2\" width=\"3\" height=\"8\" fill=\"currentColor\" opacity=\"0.5\"/><rect x=\"7\" y=\"5\" width=\"3\" height=\"5\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n </div>\n {count > 2 && (\n <>\n <label style={{ marginTop: '0.4rem' }}>Distribute</label>\n <div className=\"align-buttons\">\n <button onClick={() => onAlign('distribute-h')} title=\"Distribute horizontally\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"12.5\" y=\"0\" width=\"1.5\" height=\"14\" fill=\"currentColor\"/><rect x=\"5\" y=\"3\" width=\"4\" height=\"8\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n <button onClick={() => onAlign('distribute-v')} title=\"Distribute vertically\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><rect x=\"0\" y=\"0\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"0\" y=\"12.5\" width=\"14\" height=\"1.5\" fill=\"currentColor\"/><rect x=\"3\" y=\"5\" width=\"8\" height=\"4\" fill=\"currentColor\" opacity=\"0.5\"/></svg>\n </button>\n </div>\n </>\n )}\n </div>\n\n {allNonRedact && (\n <div className=\"panel-field\">\n <label>Assigned To</label>\n <select\n value={sharedAssignee || ''}\n onChange={e => onUpdate({ assignee: e.target.value })}\n >\n {!sharedAssignee && <option value=\"\" disabled>Mixed</option>}\n {signerRoles.map(role => (\n <option key={role} value={role} style={{ color: getSignerColor(role) }}>\n {role}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {allNonRedact && (\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={sharedRequired ?? false}\n ref={el => { if (el) el.indeterminate = sharedRequired === undefined; }}\n onChange={e => onUpdate({ required: e.target.checked })}\n />\n Required\n </label>\n </div>\n )}\n\n {hasText && (\n <div className=\"panel-field\">\n <label>Font</label>\n <select\n value={sharedFontFamily || ''}\n onChange={e => onUpdate({ fontFamily: e.target.value })}\n >\n {!sharedFontFamily && <option value=\"\" disabled>Mixed</option>}\n {FONT_FAMILIES.map(f => (\n <option key={f.value} value={f.value}>{f.label}</option>\n ))}\n </select>\n </div>\n )}\n\n {hasText && (\n <div className=\"panel-field\">\n <label>Font Size (pt)</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={sharedFontSize ?? ''}\n placeholder=\"Mixed\"\n onChange={e => onUpdate({ fontSize: Number(e.target.value) })}\n />\n </div>\n )}\n\n {hasText && (\n <div className=\"panel-field-row\">\n <div className=\"panel-field panel-field-half\">\n <label>Letter Spacing</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"20\"\n step=\"0.5\"\n value={sharedLetterSpacing ?? ''}\n placeholder=\"Mixed\"\n onChange={e => onUpdate({ letterSpacing: Number(e.target.value) })}\n />\n </div>\n <div className=\"panel-field panel-field-half\">\n <label>Line Height</label>\n <input\n type=\"number\"\n min=\"0.8\"\n max=\"3\"\n step=\"0.1\"\n value={sharedLineHeight ?? ''}\n placeholder=\"Mixed\"\n onChange={e => onUpdate({ lineHeight: Number(e.target.value) })}\n />\n </div>\n </div>\n )}\n\n {allNonRedact && (\n <div className=\"panel-field\">\n <label>Ink Color</label>\n <div className=\"ink-color-picker\">\n {INK_COLORS.map(c => (\n <button\n key={c.value}\n className={`ink-color-swatch ${sharedInkColor === c.value ? 'active' : ''}`}\n style={{ backgroundColor: c.value }}\n onClick={() => onUpdate({ inkColor: c.value })}\n title={c.label}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\nimport { getStroke } from 'perfect-freehand';\n\ninterface SignatureCanvasProps {\n width?: number;\n height?: number;\n onSign: (dataUrl: string) => void;\n initialValue?: string;\n className?: string;\n inkColor?: string;\n}\n\nfunction getSvgPathFromStroke(stroke: number[][]) {\n if (!stroke.length) return '';\n\n const d = stroke.reduce(\n (acc, [x0, y0], i, arr) => {\n const [x1, y1] = arr[(i + 1) % arr.length];\n acc.push(x0, y0, (x0 + x1) / 2, (y0 + y1) / 2);\n return acc;\n },\n ['M', ...stroke[0], 'Q'],\n );\n\n d.push('Z');\n return d.join(' ');\n}\n\nexport function SignatureCanvas({\n width = 400,\n height = 150,\n onSign,\n initialValue,\n className,\n inkColor = '#000000',\n}: SignatureCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [paths, setPaths] = useState<number[][][]>([]);\n const [currentPath, setCurrentPath] = useState<number[][] | null>(null);\n const [isEmpty, setIsEmpty] = useState(!initialValue);\n\n // Draw initial value if provided\n useEffect(() => {\n if (initialValue && canvasRef.current) {\n const ctx = canvasRef.current.getContext('2d')!;\n const img = new Image();\n img.onload = () => {\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0, width, height);\n };\n img.src = initialValue;\n }\n }, [initialValue, width, height]);\n\n // Redraw all paths whenever they change\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n\n const allPaths = currentPath ? [...paths, currentPath] : paths;\n\n for (const path of allPaths) {\n const stroke = getStroke(path, {\n size: 3,\n thinning: 0.5,\n smoothing: 0.5,\n streamline: 0.5,\n });\n const pathStr = getSvgPathFromStroke(stroke);\n const path2d = new Path2D(pathStr);\n ctx.fillStyle = inkColor;\n ctx.fill(path2d);\n }\n }, [paths, currentPath, width, height]);\n\n const getPoint = useCallback((e: React.PointerEvent) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n const style = getComputedStyle(canvas);\n const borderL = parseFloat(style.borderLeftWidth) || 0;\n const borderT = parseFloat(style.borderTopWidth) || 0;\n const borderR = parseFloat(style.borderRightWidth) || 0;\n const borderB = parseFloat(style.borderBottomWidth) || 0;\n // Content area excludes borders\n const contentW = rect.width - borderL - borderR;\n const contentH = rect.height - borderT - borderB;\n const scaleX = canvas.width / contentW;\n const scaleY = canvas.height / contentH;\n return [\n (e.clientX - rect.left - borderL) * scaleX,\n (e.clientY - rect.top - borderT) * scaleY,\n e.pressure,\n ];\n }, []);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n setCurrentPath([getPoint(e)]);\n }, [getPoint]);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n if (!currentPath) return;\n e.preventDefault();\n setCurrentPath([...currentPath, getPoint(e)]);\n }, [currentPath, getPoint]);\n\n const handlePointerUp = useCallback(() => {\n if (!currentPath) return;\n setPaths(prev => [...prev, currentPath]);\n setCurrentPath(null);\n setIsEmpty(false);\n\n // Export after state updates\n requestAnimationFrame(() => {\n if (canvasRef.current) {\n onSign(canvasRef.current.toDataURL('image/png'));\n }\n });\n }, [currentPath, onSign]);\n\n const handleClear = useCallback(() => {\n setPaths([]);\n setCurrentPath(null);\n setIsEmpty(true);\n const canvas = canvasRef.current;\n if (canvas) {\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n onSign('');\n }\n }, [width, height, onSign]);\n\n return (\n <div className={`signature-canvas-wrapper ${className || ''}`}>\n <canvas\n ref={canvasRef}\n width={width}\n height={height}\n className=\"signature-canvas\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{ touchAction: 'none' }}\n />\n <div className=\"signature-canvas-actions\">\n {!isEmpty && (\n <button type=\"button\" onClick={handleClear} className=\"signature-clear-btn\">\n Clear\n </button>\n )}\n {isEmpty && <span className=\"signature-hint\">Draw your signature above</span>}\n </div>\n </div>\n );\n}\n","// Valid API keys. In the future this will validate against a server.\nconst VALID_KEYS = new Set([\n 'exeq_live_2024',\n process.env.NEXT_PUBLIC_EXEQ_API_KEY,\n].filter(Boolean));\n\nexport function isValidApiKey(key: string | undefined): boolean {\n if (!key) return false;\n return VALID_KEYS.has(key);\n}\n","import { useState, useCallback, useRef } from 'react';\n\ninterface HistoryState<T> {\n past: T[];\n present: T;\n future: T[];\n}\n\nexport function useHistory<T>(initialState: T, maxHistory = 50) {\n const [state, setState] = useState<HistoryState<T>>({\n past: [],\n present: initialState,\n future: [],\n });\n const batchRef = useRef(false);\n const batchStartRef = useRef<T | null>(null);\n\n const set = useCallback((updater: T | ((prev: T) => T)) => {\n setState(prev => {\n const newPresent = typeof updater === 'function'\n ? (updater as (prev: T) => T)(prev.present)\n : updater;\n if (newPresent === prev.present) return prev;\n // During a batch, update present without pushing history\n if (batchRef.current) {\n return { ...prev, present: newPresent };\n }\n return {\n past: [...prev.past.slice(-maxHistory), prev.present],\n present: newPresent,\n future: [],\n };\n });\n }, [maxHistory]);\n\n /** Update present without recording in history (for drag-in-progress, etc.) */\n const setWithoutHistory = useCallback((updater: T | ((prev: T) => T)) => {\n setState(prev => {\n const newPresent = typeof updater === 'function'\n ? (updater as (prev: T) => T)(prev.present)\n : updater;\n if (newPresent === prev.present) return prev;\n return { ...prev, present: newPresent };\n });\n }, []);\n\n /** Start a batch — all set() calls become silent until commitBatch(). */\n const beginBatch = useCallback(() => {\n batchRef.current = true;\n setState(prev => {\n batchStartRef.current = prev.present;\n return prev;\n });\n }, []);\n\n /** End the batch — push one undo entry from the state before beginBatch to now. */\n const commitBatch = useCallback(() => {\n batchRef.current = false;\n setState(prev => {\n const startState = batchStartRef.current;\n batchStartRef.current = null;\n if (!startState || startState === prev.present) return prev;\n return {\n past: [...prev.past.slice(-maxHistory), startState],\n present: prev.present,\n future: [],\n };\n });\n }, [maxHistory]);\n\n const undo = useCallback(() => {\n setState(prev => {\n if (prev.past.length === 0) return prev;\n const previous = prev.past[prev.past.length - 1];\n return {\n past: prev.past.slice(0, -1),\n present: previous,\n future: [prev.present, ...prev.future],\n };\n });\n }, []);\n\n const redo = useCallback(() => {\n setState(prev => {\n if (prev.future.length === 0) return prev;\n const next = prev.future[0];\n return {\n past: [...prev.past, prev.present],\n present: next,\n future: prev.future.slice(1),\n };\n });\n }, []);\n\n return {\n state: state.present,\n set,\n setWithoutHistory,\n beginBatch,\n commitBatch,\n undo,\n redo,\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n };\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { FormField, Template } from '@/types/pdf-builder';\nimport { isRedactField, isSignatureField, getCssFontFamily, sortFieldsByPosition, getFieldValues as getFieldValuesUtil } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { generateFilledPdf, downloadPdf, postPdfToCallback } from '@/utils/pdfFiller';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldNavigator } from './FieldNavigator';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport { isValidApiKey } from '@/utils/apiKey';\nimport { resolveAllFormulas } from '@/utils/formulaResolver';\nimport type { TransformMap } from '@/utils/formulaResolver';\nimport '@/styles/pdf-builder.css';\n\nexport interface SignerViewProps {\n /** API key for authentication */\n apiKey?: string;\n /** If provided, use these instead of URL params / postMessage */\n initialPdfUrl?: string;\n initialTemplate?: Template;\n initialSigner?: string;\n callbackUrl?: string;\n onComplete?: (pdfBlob: Blob) => void;\n /** Pre-fill field values by label or ID. Keys are matched against field labels (case-insensitive) first, then field IDs. */\n initialValues?: Record<string, string>;\n /** Label for the final submit button (default: \"Complete\") */\n submitLabel?: string;\n /** Signing order for multi-party documents. Signers complete sequentially; only the current signer's fields are active. If omitted, non-Sender roles go first, then Sender last. */\n signerOrder?: string[];\n /** Custom transform functions for formula fields. Keys are transform names referenced in formulas like {{Field | name}}. Merges with built-in transforms. */\n transforms?: TransformMap;\n /** Called whenever any field value changes. Receives the current field values as a Record<label, value>. */\n onChange?: (values: Record<string, string>) => void;\n /** Called when an individual signer completes their fields (before the final PDF is generated). */\n onSignerComplete?: (signer: string, values: Record<string, string>) => void;\n /** When true, appends an audit trail page to the final PDF documenting each signer's completion. */\n includeAuditTrail?: boolean;\n /** Output format for field values alongside the PDF. */\n exportFormat?: 'json' | 'csv';\n /** Called with exported field values when the document is completed. */\n onExport?: (data: string, format: 'json' | 'csv') => void;\n}\n\nexport function SignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n initialValues,\n submitLabel,\n signerOrder: signerOrderProp,\n transforms,\n onChange,\n onSignerComplete,\n includeAuditTrail,\n exportFormat,\n onExport,\n}: SignerViewProps = {}) {\n if (!isValidApiKey(apiKey)) {\n return (\n <div className=\"signer-layout\">\n <div className=\"empty-state\">\n <h2>Invalid API Key</h2>\n <p>A valid API key is required to use Exeq. Visit <a href=\"https://exeq.org\">exeq.org</a> to get one.</p>\n </div>\n </div>\n );\n }\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>([]);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signerRoles, setSignerRoles] = useState<string[]>([]);\n const [currentSignerIndex, setCurrentSignerIndex] = useState(() => {\n if (initialSigner && signerOrderProp) {\n const idx = signerOrderProp.indexOf(initialSigner);\n return idx >= 0 ? idx : 0;\n }\n return 0;\n });\n const initializedRef = useRef(false);\n const auditLogRef = useRef<{ signer: string; completedAt: string }[]>([]);\n const [loading, setLoading] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [callbackUrl, setCallbackUrl] = useState(initialCallbackUrl || '');\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Derive the signing order: use explicit prop, or default to non-Sender roles first, Sender last\n const signerOrder = signerOrderProp\n || (signerRoles.length > 0\n ? [...signerRoles.filter(r => r !== 'Sender'), ...signerRoles.filter(r => r === 'Sender')]\n : [initialSigner || 'Signer 1']);\n const signer = signerOrder[currentSignerIndex] || signerOrder[0] || 'Signer 1';\n const isLastSigner = currentSignerIndex >= signerOrder.length - 1;\n const isMultiSigner = signerOrder.length > 1;\n\n // Skip signers whose fields are all already filled (e.g. via initialValues/pre-fill)\n useEffect(() => {\n if (fields.length === 0 || !isMultiSigner) return;\n const signerFields = fields.filter(f =>\n f.assignee === signer && !isRedactField(f)\n );\n const allFilled = signerFields.length > 0 && signerFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n });\n if (allFilled && !isLastSigner) {\n setCurrentSignerIndex(prev => prev + 1);\n setSelectedFieldId(null);\n }\n }, [currentSignerIndex, fields, signer, isLastSigner, isMultiSigner]);\n\n // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n let templateFields = initialTemplate.fields;\n if (initialTemplate.signerRoles) setSignerRoles(initialTemplate.signerRoles);\n\n // Apply initialValues by matching label (case-insensitive) or ID\n if (initialValues) {\n templateFields = templateFields.map(f => {\n const byLabel = Object.entries(initialValues).find(\n ([key]) => key.toLowerCase() === f.label.toLowerCase()\n );\n const byId = initialValues[f.id];\n const value = byLabel?.[1] ?? byId;\n return value !== undefined ? { ...f, value } : f;\n });\n }\n\n // On re-init (e.g. remount), preserve values already filled by any signer\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return templateFields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(templateFields);\n initializedRef.current = true;\n }\n\n if (initialPdfUrl) loadPdf(initialPdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const pdfUrl = params.get('pdf');\n const fieldsUrl = params.get('fields');\n const cbUrl = params.get('callbackUrl');\n\n if (cbUrl) setCallbackUrl(cbUrl);\n\n if (pdfUrl) loadPdf(pdfUrl);\n if (fieldsUrl) {\n fetch(fieldsUrl)\n .then(r => r.json())\n .then((template: Template) => {\n if (template.signerRoles) setSignerRoles(template.signerRoles);\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return template.fields.map(f => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(template.fields);\n initializedRef.current = true;\n }\n })\n .catch(err => console.error('Failed to load fields:', err));\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-signing') {\n if (e.data.fields) {\n if (initializedRef.current) {\n setFields(prev => {\n const valueMap = new Map(prev.filter(f => f.value).map(f => [f.id, f.value]));\n return e.data.fields.map((f: FormField) => valueMap.has(f.id) ? { ...f, value: valueMap.get(f.id)! } : f);\n });\n } else {\n setFields(e.data.fields);\n initializedRef.current = true;\n }\n }\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) {\n const idx = signerOrder.indexOf(e.data.signer);\n if (idx >= 0) setCurrentSignerIndex(idx);\n }\n if (e.data.callbackUrl) setCallbackUrl(e.data.callbackUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialTemplate, initialPdfUrl]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Fields this signer needs to fill, sorted by document position (excludes redact fields)\n const editableFields = sortFieldsByPosition(fields.filter(f => f.assignee === signer && !isRedactField(f) && !f.formula));\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n const isFieldEditable = selectedField\n ? selectedField.assignee === signer && !isRedactField(selectedField) && !selectedField.formula\n : false;\n\n const handleFieldUpdate = useCallback((id: string, value: string) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, value } : f));\n }, []);\n\n const handleFieldPropertyUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, ...updates } : f));\n }, []);\n\n // Fire onChange whenever field values change\n const fieldValuesKey = fields.map(f => `${f.id}:${f.value}`).join('|');\n useEffect(() => {\n if (!onChange) return;\n const values: Record<string, string> = {};\n fields.forEach(f => { if (!isRedactField(f)) values[f.label] = f.value || ''; });\n onChange(values);\n }, [fieldValuesKey]);\n\n const handleNavigate = useCallback((fieldId: string) => {\n setSelectedFieldId(fieldId);\n // Scroll to that field's page\n const field = fields.find(f => f.id === fieldId);\n if (field && containerRef.current) {\n const pageEl = containerRef.current.querySelector(`[data-page=\"${field.page}\"]`);\n if (pageEl) {\n pageEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n }, [fields]);\n\n const allRequiredFilled = editableFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n if (!f.value) return false;\n if (f.minLength && f.value.length < f.minLength) return false;\n return true;\n });\n\n const getValues = useCallback(() => getFieldValuesUtil(fields), [fields]);\n\n const handleAdvanceOrSubmit = useCallback(async () => {\n if (!allRequiredFilled) return;\n\n // Log completion for audit trail\n auditLogRef.current.push({ signer, completedAt: new Date().toISOString() });\n\n // Fire onSignerComplete callback\n if (onSignerComplete) {\n onSignerComplete(signer, getValues());\n }\n\n // Intermediate signer: advance to next\n if (!isLastSigner) {\n setCurrentSignerIndex(prev => prev + 1);\n setSelectedFieldId(null);\n const pdfArea = containerRef.current?.querySelector('.signer-pdf-area');\n if (pdfArea) {\n pdfArea.scrollTo({ top: 0, behavior: 'smooth' });\n }\n return;\n }\n\n // Final signer: generate PDF\n if (!pdfSource) return;\n setSubmitting(true);\n try {\n const finalFields = resolveAllFormulas(fields, transforms);\n\n // Optionally add audit trail page\n let pdfBytes: Uint8Array;\n if (includeAuditTrail) {\n const { PDFDocument, StandardFonts, rgb } = await import('pdf-lib');\n const basePdf = await generateFilledPdf({ pdfSource, fields: finalFields });\n const pdfDoc = await PDFDocument.load(basePdf);\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\n const boldFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold);\n const auditPage = pdfDoc.addPage([612, 792]);\n let cy = 742;\n auditPage.drawText('Signing Audit Trail', { x: 50, y: cy, size: 18, font: boldFont, color: rgb(0, 0, 0) });\n cy -= 30;\n auditPage.drawText(`Document completed: ${new Date().toLocaleString()}`, { x: 50, y: cy, size: 10, font, color: rgb(0.4, 0.4, 0.4) });\n cy -= 30;\n for (const entry of auditLogRef.current) {\n auditPage.drawText(`${entry.signer}`, { x: 50, y: cy, size: 12, font: boldFont, color: rgb(0, 0, 0) });\n auditPage.drawText(`Completed: ${new Date(entry.completedAt).toLocaleString()}`, { x: 200, y: cy, size: 10, font, color: rgb(0.3, 0.3, 0.3) });\n cy -= 22;\n }\n pdfBytes = await pdfDoc.save();\n } else {\n pdfBytes = await generateFilledPdf({ pdfSource, fields: finalFields });\n }\n\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n // Export field values as JSON or CSV\n if (onExport && exportFormat) {\n const values = getValues();\n if (exportFormat === 'json') {\n onExport(JSON.stringify(values, null, 2), 'json');\n } else {\n const headers = Object.keys(values);\n const row = headers.map(h => `\"${(values[h] || '').replace(/\"/g, '\"\"')}\"`);\n onExport(`${headers.join(',')}\\n${row.join(',')}`, 'csv');\n }\n }\n\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n if (onComplete) {\n onComplete(blob);\n }\n\n if (!callbackUrl && !onComplete) {\n downloadPdf(pdfBytes, 'signed-document.pdf');\n }\n\n window.parent?.postMessage({ type: 'signing-complete' }, '*');\n } catch (err) {\n console.error('Failed to generate PDF:', err);\n } finally {\n setSubmitting(false);\n }\n }, [pdfSource, fields, callbackUrl, allRequiredFilled, onComplete, isLastSigner, signer, onSignerComplete, includeAuditTrail, exportFormat, onExport, getValues, transforms]);\n\n const renderFieldContent = useCallback((field: FormField) => {\n // Redact fields are visual-only — no interaction in signer mode\n if (isRedactField(field)) {\n return null;\n }\n\n // Formula fields are always read-only (auto-computed)\n if (field.formula) {\n return (\n <div className=\"field-overlay-value formula\">\n {field.value || '...'}\n </div>\n );\n }\n\n const editable = field.assignee === signer;\n\n if (!editable) {\n // Show pre-filled content as read-only\n if (isSignatureField(field)) {\n return field.value ? (\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n ) : (\n <div className=\"field-overlay-placeholder readonly\">{field.placeholder}</div>\n );\n }\n if (field.type === 'checkbox') {\n return (\n <div className=\"field-checkbox-display readonly\">\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder readonly\">\n {field.value || field.placeholder}\n </div>\n );\n }\n\n // Editable fields\n if (isSignatureField(field)) {\n if (field.value) {\n return (\n <div className=\"field-signature-filled\" onClick={() => handleFieldUpdate(field.id, '')}>\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder editable\">\n {field.placeholder}\n </div>\n );\n }\n\n if (field.type === 'checkbox') {\n return (\n <div\n className=\"field-checkbox-display editable\"\n onClick={(e) => {\n e.stopPropagation();\n handleFieldUpdate(field.id, field.value === 'true' ? '' : 'true');\n }}\n >\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n\n if (field.type === 'signed-date') {\n return (\n <div className=\"field-overlay-value\">\n {field.value || new Date().toLocaleDateString()}\n </div>\n );\n }\n\n // Text field — dropdown if options are defined, otherwise input\n const fontStyle = {\n fontSize: `${field.fontSize}pt`,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing}pt` : undefined,\n lineHeight: field.lineHeight ? `${field.lineHeight}` : undefined,\n fontFamily: getCssFontFamily(field.fontFamily),\n };\n\n if (field.type === 'dropdown' || (field.options && field.options.length > 0)) {\n return (\n <select\n className=\"field-inline-input\"\n value={field.value}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={fontStyle}\n >\n <option value=\"\">{field.placeholder || 'Select...'}</option>\n {(field.options || []).map(opt => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n );\n }\n\n return (\n <input\n type={field.textSubtype === 'email' ? 'email' :\n field.textSubtype === 'number' ? 'number' :\n field.textSubtype === 'phone' ? 'tel' :\n field.textSubtype === 'date' ? 'date' : 'text'}\n className=\"field-inline-input\"\n value={field.value}\n placeholder={field.placeholder}\n maxLength={field.maxLength || undefined}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={fontStyle}\n />\n );\n }, [signer, handleFieldUpdate, setSelectedFieldId]);\n\n // Auto-fill signed-date fields — immediately for the current signer,\n // and also when a signature is filled\n useEffect(() => {\n const dateStr = new Date().toLocaleDateString();\n const needsFill = fields.some(f => f.assignee === signer && f.type === 'signed-date' && !f.value);\n if (needsFill) {\n setFields(prev => prev.map(f => {\n if (f.assignee === signer && f.type === 'signed-date' && !f.value) {\n return { ...f, value: dateStr };\n }\n return f;\n }));\n }\n }, [signer, fields.filter(f => f.type === 'signature' && f.value).length]);\n\n // Resolve formula fields whenever any field value changes\n useEffect(() => {\n const hasFormulas = fields.some(f => f.formula);\n if (!hasFormulas) return;\n const resolved = resolveAllFormulas(fields, transforms);\n // Only update if any computed values actually changed\n const changed = resolved.some((f, i) => f.value !== fields[i].value);\n if (changed) setFields(resolved);\n }, [fields, transforms]);\n\n return (\n <div className=\"signer-layout\" ref={containerRef}>\n {loading && <div className=\"loading-indicator\">Loading document...</div>}\n\n <div className=\"signer-content\">\n <div className=\"signer-pdf-area\">\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldIds={new Set(selectedFieldId ? [selectedFieldId] : [])}\n onSelectField={(id) => setSelectedFieldId(id)}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\n <div className=\"signer-panel-header\">\n <div className=\"signer-role-indicator\">\n <span className=\"signer-role-indicator-label\">Signing as</span>\n <strong>{signer}</strong>\n </div>\n {isMultiSigner && (\n <div className=\"signer-step-badge\">\n Step {currentSignerIndex + 1} of {signerOrder.length}\n </div>\n )}\n </div>\n\n <div className=\"signer-panel-body\">\n {selectedField && isFieldEditable && (\n <div className=\"signer-field-input\">\n <h3>{selectedField.label}</h3>\n {selectedField.required && <span className=\"required-badge\">Required</span>}\n\n {(isSignatureField(selectedField)) && (\n <SignatureCanvas\n width={280}\n height={selectedField.type === 'initials' ? 80 : 120}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, dataUrl)}\n initialValue={selectedField.value}\n />\n )}\n\n {(selectedField.type === 'text' || selectedField.type === 'dropdown') && (\n <>\n {selectedField.type === 'dropdown' || (selectedField.options && selectedField.options.length > 0) ? (\n <select\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n className=\"signer-text-input\"\n >\n <option value=\"\">{selectedField.placeholder || 'Select...'}</option>\n {(selectedField.options || []).map(opt => (\n <option key={opt} value={opt}>{opt}</option>\n ))}\n </select>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n placeholder={selectedField.placeholder}\n maxLength={selectedField.maxLength || undefined}\n className=\"signer-text-input\"\n />\n )}\n <div className=\"signer-font-size\">\n <label>Font Size</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={selectedField.fontSize}\n onChange={e => handleFieldPropertyUpdate(selectedField.id, { fontSize: Number(e.target.value) })}\n />\n <span>pt</span>\n </div>\n </>\n )}\n\n {selectedField.type === 'checkbox' && (\n <label className=\"signer-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.checked ? 'true' : '')}\n />\n {selectedField.placeholder || 'Check this box'}\n </label>\n )}\n\n {selectedField.type === 'signed-date' && (\n <div className=\"signer-date-display\">\n {selectedField.value || 'Will auto-fill when you sign'}\n </div>\n )}\n </div>\n )}\n\n {selectedField && !isFieldEditable && (\n <div className=\"signer-field-readonly\">\n <h3>{selectedField.label}</h3>\n <p>This field belongs to another signer.</p>\n </div>\n )}\n\n {!selectedField && editableFields.length > 0 && (\n <div className=\"panel-empty\">\n Select a field to fill it in, or use the navigation below.\n </div>\n )}\n </div>\n\n <div className=\"signer-panel-footer\">\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onComplete={handleAdvanceOrSubmit}\n completeLabel={isLastSigner ? (submitLabel || 'Complete') : `Next: ${signerOrder[currentSignerIndex + 1]}`}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import {\n PDFDocument,\n PDFEmbeddedPage,\n PDFFont,\n PDFImage,\n PDFPage,\n rgb,\n StandardFonts,\n} from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\nimport { isRedactField, isSignatureField } from '@/types/pdf-builder';\nimport { resolveAllFormulas, type TransformMap } from './formulaResolver';\n\nconst FONT_MAP: Record<string, string> = {\n Helvetica: StandardFonts.Helvetica,\n Courier: StandardFonts.Courier,\n TimesRoman: StandardFonts.TimesRoman,\n};\n\n/** US Letter in PDF points (72pt = 1 in). */\nexport const US_LETTER: [number, number] = [612, 792];\n/** US Legal in PDF points. */\nexport const US_LEGAL: [number, number] = [612, 1008];\n/** A4 in PDF points. */\nexport const A4: [number, number] = [595.28, 841.89];\n\n// ---------------------------------------------------------------------------\n// Calibration\n// ---------------------------------------------------------------------------\n\n/**\n * Linear calibration applied to every field's percentage position and size.\n * Use to align rendered output with a physical pre-printed form when the\n * template's source PDF and the real paper don't exactly agree on crop or\n * scale.\n *\n * Math (for an output page of size [pW, pH] pt):\n * xPctOff = (xOffset / pW) * 100\n * yPctOff = (yOffset / pH) * 100\n * x' = x_pct * xScale + xPctOff\n * y' = y_pct * yScale + yPctOff\n * width' = width_pct * xScale\n * height' = height_pct * yScale\n *\n * Defaults (scale=1, offsets=0) are a no-op.\n */\nexport interface Calibration {\n /** Horizontal offset in PDF points; positive = right. */\n xOffset: number;\n /** Vertical offset in PDF points; positive = down (screen coords). */\n yOffset: number;\n /** Horizontal multiplier applied to x and width. */\n xScale: number;\n /** Vertical multiplier applied to y and height. */\n yScale: number;\n}\n\nexport const DEFAULT_CALIBRATION: Calibration = {\n xOffset: 0,\n yOffset: 0,\n xScale: 1,\n yScale: 1,\n};\n\n/**\n * Returns a copy of `fields` with calibration applied to x / y / width /\n * height. The math is page-size-aware so an `xOffset` of 5pt actually\n * shifts the rendered output 5pt to the right.\n *\n * @param pageSize Output page size in pt used to convert pt offsets to\n * percent offsets. Defaults to US Letter.\n */\nexport function applyCalibration(\n fields: FormField[],\n calibration: Calibration,\n pageSize: [number, number] = US_LETTER,\n): FormField[] {\n if (\n calibration.xOffset === 0 &&\n calibration.yOffset === 0 &&\n calibration.xScale === 1 &&\n calibration.yScale === 1\n ) {\n return fields;\n }\n const xPctOff = (calibration.xOffset / pageSize[0]) * 100;\n const yPctOff = (calibration.yOffset / pageSize[1]) * 100;\n return fields.map((f) => ({\n ...f,\n x: f.x * calibration.xScale + xPctOff,\n y: f.y * calibration.yScale + yPctOff,\n width: f.width * calibration.xScale,\n height: f.height * calibration.yScale,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Field rendering — shared by single-shot and builder\n// ---------------------------------------------------------------------------\n\nfunction hexToRgb(hex: string) {\n const r = parseInt(hex.slice(1, 3), 16) / 255;\n const g = parseInt(hex.slice(3, 5), 16) / 255;\n const b = parseInt(hex.slice(5, 7), 16) / 255;\n return rgb(r, g, b);\n}\n\nasync function renderFieldsOnPages(\n pages: PDFPage[],\n fields: FormField[],\n getFont: (family: string) => Promise<PDFFont>,\n getSignature: (dataUrl: string) => Promise<PDFImage>,\n): Promise<void> {\n for (const field of fields) {\n const page = pages[field.page];\n if (!page) continue;\n\n const pageWidth = page.getWidth();\n const pageHeight = page.getHeight();\n\n const x = (field.x / 100) * pageWidth;\n const y =\n pageHeight -\n (field.y / 100) * pageHeight -\n (field.height / 100) * pageHeight;\n const w = (field.width / 100) * pageWidth;\n const h = (field.height / 100) * pageHeight;\n\n if (isRedactField(field)) {\n page.drawRectangle({\n x,\n y,\n width: w,\n height: h,\n color: field.type === 'blackout' ? rgb(0, 0, 0) : rgb(1, 1, 1),\n });\n continue;\n }\n\n if (!field.value) continue;\n\n const inkColor = field.inkColor ? hexToRgb(field.inkColor) : rgb(0, 0, 0);\n\n if (field.type === 'checkbox') {\n if (field.value === 'true') {\n const inset = Math.min(w, h) * 0.2;\n const lineWidth = Math.min(w, h) * 0.08;\n page.drawLine({\n start: { x: x + inset, y: y + inset },\n end: { x: x + w - inset, y: y + h - inset },\n thickness: lineWidth,\n color: inkColor,\n });\n page.drawLine({\n start: { x: x + w - inset, y: y + inset },\n end: { x: x + inset, y: y + h - inset },\n thickness: lineWidth,\n color: inkColor,\n });\n }\n } else if (isSignatureField(field)) {\n if (field.value.startsWith('data:image/png')) {\n const img = await getSignature(field.value);\n page.drawImage(img, { x, y, width: w, height: h });\n }\n } else {\n // Text fields (including signed-date)\n const font = await getFont(field.fontFamily || 'Helvetica');\n const spacing = field.letterSpacing || 0;\n\n const textWidthAtSize = (text: string, size: number) =>\n font.widthOfTextAtSize(text, size) + spacing * (text.length - 1);\n\n let fontSize = field.autoShrink ? Math.min(field.fontSize, h * 0.7) : field.fontSize;\n if (field.autoShrink) {\n const padding = 4;\n while (fontSize > 4) {\n if (textWidthAtSize(field.value, fontSize) <= w - padding) break;\n fontSize -= 0.5;\n }\n }\n\n if (spacing > 0) {\n let cx = x + 2;\n const cy = y + h * 0.3;\n for (const char of field.value) {\n page.drawText(char, {\n x: cx,\n y: cy,\n size: fontSize,\n font,\n color: inkColor,\n });\n cx += font.widthOfTextAtSize(char, fontSize) + spacing;\n }\n } else {\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: inkColor,\n });\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Unified record options — used by both generateFilledPdf and addRecord\n// ---------------------------------------------------------------------------\n\nexport interface FillPdfOptions {\n /** Source PDF used as the background.\n * - `string` (URL): fetched, embedded once per URL across the document.\n * - `ArrayBuffer`: embedded uniquely each call.\n * - `null`: render onto blank pages (overlay-only output). */\n pdfSource: string | ArrayBuffer | null;\n /** Fields to render on top of the background. */\n fields: FormField[];\n /** Override the output page size in PDF points.\n * - With a `pdfSource`, source pages are drawn stretched to fit.\n * - With `pdfSource: null`, blank pages of this size are created.\n * - When omitted with a source, output uses the source's page sizes.\n * - When omitted with `pdfSource: null`, defaults to US Letter. */\n pageSize?: [number, number];\n /** When `pdfSource` is null, how many blank pages to render. Default `1`.\n * Fields with out-of-range `page` indices are skipped. */\n pageCount?: number;\n /** Run `resolveAllFormulas` on fields before rendering. */\n resolveFormulas?: boolean;\n /** Custom transforms merged with `BUILTIN_TRANSFORMS` during formula\n * resolution. Only meaningful when `resolveFormulas` is true. */\n customTransforms?: TransformMap;\n /** Linear calibration applied to field positions before rendering. */\n calibration?: Calibration;\n}\n\n// ---------------------------------------------------------------------------\n// Single-record API\n// ---------------------------------------------------------------------------\n\n/**\n * Generates one filled PDF.\n *\n * const bytes = await generateFilledPdf({\n * pdfSource: '/forms/template.pdf',\n * fields: template.fields,\n * pageSize: US_LETTER,\n * resolveFormulas: true,\n * });\n *\n * For multi-record output that shares a background, use `createPdfBuilder`\n * — it dedupes the embedded source across all pages.\n */\nexport async function generateFilledPdf(\n opts: FillPdfOptions,\n): Promise<Uint8Array> {\n const builder = await createPdfBuilder({ pageSize: opts.pageSize });\n await builder.addRecord(opts);\n return builder.save();\n}\n\n// ---------------------------------------------------------------------------\n// Batch API\n// ---------------------------------------------------------------------------\n\nexport interface PdfBuilder {\n /** Underlying pdf-lib document — exposed for advanced post-processing\n * (audit-trail pages, custom metadata, etc.). */\n readonly doc: PDFDocument;\n /** Append one record's pages to the output. */\n addRecord(opts: FillPdfOptions): Promise<void>;\n /** Finalize and return the merged PDF bytes. */\n save(): Promise<Uint8Array>;\n}\n\nexport interface CreatePdfBuilderOptions {\n /** Default `pageSize` for any `addRecord` call that doesn't set its own. */\n pageSize?: [number, number];\n}\n\n/**\n * Creates a builder that merges multiple filled records into one PDF.\n *\n * Resources (source PDFs indexed by URL, embedded fonts, signature PNGs) are\n * embedded once across the whole document and reused — critical for\n * mail-merge style batches where dozens of records share the same background.\n *\n * const builder = await createPdfBuilder({ pageSize: US_LETTER });\n * for (const record of records) {\n * await builder.addRecord({\n * pdfSource: '/forms/template.pdf',\n * fields: record.fields,\n * resolveFormulas: true,\n * });\n * }\n * const bytes = await builder.save();\n * downloadPdf(bytes, 'merged.pdf');\n */\nexport async function createPdfBuilder(\n defaults: CreatePdfBuilderOptions = {},\n): Promise<PdfBuilder> {\n const doc = await PDFDocument.create();\n const fontCache = new Map<string, PDFFont>();\n const embeddedPagesByUrl = new Map<string, PDFEmbeddedPage[]>();\n const signatureCache = new Map<string, PDFImage>();\n\n async function getFont(family: string): Promise<PDFFont> {\n let f = fontCache.get(family);\n if (!f) {\n const stdName = FONT_MAP[family] || StandardFonts.Helvetica;\n f = await doc.embedFont(stdName);\n fontCache.set(family, f);\n }\n return f;\n }\n\n async function ensureFonts(fields: FormField[]) {\n const keys = new Set(fields.map((f) => f.fontFamily || 'Helvetica'));\n for (const k of keys) await getFont(k);\n }\n\n async function embedSource(\n source: string | ArrayBuffer,\n ): Promise<PDFEmbeddedPage[]> {\n if (typeof source === 'string') {\n let pages = embeddedPagesByUrl.get(source);\n if (!pages) {\n const res = await fetch(source);\n const bytes = await res.arrayBuffer();\n const srcDoc = await PDFDocument.load(bytes);\n pages = await Promise.all(\n srcDoc.getPages().map((p) => doc.embedPage(p)),\n );\n embeddedPagesByUrl.set(source, pages);\n }\n return pages;\n }\n // ArrayBuffer sources are treated as unique per call.\n const srcDoc = await PDFDocument.load(source);\n return Promise.all(srcDoc.getPages().map((p) => doc.embedPage(p)));\n }\n\n async function getSignature(dataUrl: string): Promise<PDFImage> {\n let img = signatureCache.get(dataUrl);\n if (!img) {\n const b64 = dataUrl.split(',')[1] ?? '';\n const pngBytes = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0));\n img = await doc.embedPng(pngBytes);\n signatureCache.set(dataUrl, img);\n }\n return img;\n }\n\n return {\n doc,\n async addRecord(opts: FillPdfOptions) {\n const pageSize = opts.pageSize ?? defaults.pageSize;\n\n let fields = opts.resolveFormulas\n ? resolveAllFormulas(opts.fields, opts.customTransforms)\n : opts.fields;\n\n if (opts.calibration) {\n fields = applyCalibration(\n fields,\n opts.calibration,\n pageSize ?? US_LETTER,\n );\n }\n\n await ensureFonts(fields);\n\n let sourcePages: PDFEmbeddedPage[] = [];\n let pageCount: number;\n if (opts.pdfSource !== null) {\n sourcePages = await embedSource(opts.pdfSource);\n pageCount = sourcePages.length;\n } else {\n pageCount = opts.pageCount ?? 1;\n }\n\n const newPages: PDFPage[] = [];\n for (let i = 0; i < pageCount; i++) {\n const size: [number, number] = pageSize\n ? pageSize\n : sourcePages[i]\n ? [sourcePages[i].width, sourcePages[i].height]\n : US_LETTER;\n const page = doc.addPage(size);\n newPages.push(page);\n if (sourcePages[i]) {\n page.drawPage(sourcePages[i], {\n x: 0,\n y: 0,\n width: size[0],\n height: size[1],\n });\n }\n }\n\n await renderFieldsOnPages(newPages, fields, getFont, getSignature);\n },\n async save() {\n return doc.save();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Browser helpers\n// ---------------------------------------------------------------------------\n\nexport function downloadPdf(bytes: Uint8Array, filename: string) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport async function postPdfToCallback(\n bytes: Uint8Array,\n callbackUrl: string,\n filename: string,\n) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const formData = new FormData();\n formData.append('file', blob, filename);\n\n await fetch(callbackUrl, {\n method: 'POST',\n body: formData,\n });\n}\n","import type { FormField } from '@/types/pdf-builder';\n\nexport type TransformFn = (value: string) => string;\nexport type TransformMap = Record<string, TransformFn>;\n\n/** Built-in transforms that ship with exeq. */\nexport const BUILTIN_TRANSFORMS: TransformMap = {\n // Date transforms (expects a parseable date string)\n month: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getMonth() + 1); },\n month2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getMonth() + 1).padStart(2, '0'); },\n monthname: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : d.toLocaleString('en', { month: 'long' }); },\n monthshort: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : d.toLocaleString('en', { month: 'short' }); },\n day: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getDate()); },\n day2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getDate()).padStart(2, '0'); },\n year: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getFullYear()); },\n year2: (v) => { const d = new Date(v); return isNaN(d.getTime()) ? '' : String(d.getFullYear()).slice(-2); },\n\n // String transforms\n upper: (v) => v.toUpperCase(),\n lower: (v) => v.toLowerCase(),\n trim: (v) => v.trim(),\n first: (v) => v.split(/\\s+/)[0] || '',\n last: (v) => { const parts = v.split(/\\s+/); return parts[parts.length - 1] || ''; },\n initials: (v) => v.split(/\\s+/).map(w => w[0] || '').join('').toUpperCase(),\n\n // Numeric / substring\n last4: (v) => v.slice(-4),\n last2: (v) => v.slice(-2),\n first4: (v) => v.slice(0, 4),\n first2: (v) => v.slice(0, 2),\n digits: (v) => v.replace(/\\D/g, ''),\n number: (v) => { const n = parseFloat(v); return isNaN(n) ? '' : String(n); },\n currency: (v) => { const n = parseFloat(v.replace(/[^0-9.-]/g, '')); return isNaN(n) ? '' : `$${n.toFixed(2)}`; },\n};\n\nconst FORMULA_RE = /\\{\\{(.+?)\\}\\}/g;\nconst PIPE_RE = /^(.+?)\\s*\\|\\s*(.+)$/;\n\n/**\n * Resolve a single formula string against a set of fields and transforms.\n * Formula format: \"{{Source Field Label | transform}}\" or \"{{Source Field Label}}\" (no transform = raw value).\n * Multiple expressions can appear in one formula: \"{{First}} {{Last}}\" → \"Jane Smith\"\n */\nexport function resolveFormula(\n formula: string,\n fields: FormField[],\n customTransforms?: TransformMap,\n): string {\n const transforms = { ...BUILTIN_TRANSFORMS, ...customTransforms };\n\n return formula.replace(FORMULA_RE, (_match, expr: string) => {\n const pipeMatch = expr.match(PIPE_RE);\n const sourceLabel = (pipeMatch ? pipeMatch[1] : expr).trim();\n const transformName = pipeMatch ? pipeMatch[2].trim() : null;\n\n // Find source field by label (case-insensitive) or ID\n const sourceField = fields.find(f => f.label.toLowerCase() === sourceLabel.toLowerCase())\n || fields.find(f => f.id === sourceLabel);\n\n if (!sourceField) return '';\n\n const rawValue = sourceField.value || '';\n if (!transformName) return rawValue;\n\n const fn = transforms[transformName];\n if (!fn) return rawValue; // unknown transform → return raw value\n\n try {\n return fn(rawValue);\n } catch {\n return rawValue;\n }\n });\n}\n\n/**\n * Resolve all formula fields in a fields array.\n * Returns a new array with computed values filled in.\n */\nexport function resolveAllFormulas(\n fields: FormField[],\n customTransforms?: TransformMap,\n): FormField[] {\n return fields.map(f => {\n if (!f.formula) return f;\n const computed = resolveFormula(f.formula, fields, customTransforms);\n return computed !== f.value ? { ...f, value: computed } : f;\n });\n}\n","'use client';\n\nimport { useState } from 'react';\nimport type { FormField } from '@/types/pdf-builder';\n\ninterface FieldNavigatorProps {\n fields: FormField[];\n currentFieldId: string | null;\n onNavigate: (fieldId: string) => void;\n allRequiredFilled: boolean;\n onComplete: () => void;\n completeLabel?: string;\n}\n\nfunction isFieldFilled(f: FormField): boolean {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onComplete,\n completeLabel = 'Complete',\n}: FieldNavigatorProps) {\n const [showIncomplete, setShowIncomplete] = useState(false);\n const currentIndex = fields.findIndex(f => f.id === currentFieldId);\n const hasPrev = currentIndex > 0;\n const hasNext = currentIndex < fields.length - 1;\n\n const handlePrev = () => {\n if (hasPrev) {\n onNavigate(fields[currentIndex - 1].id);\n }\n };\n\n const handleNext = () => {\n if (hasNext) {\n onNavigate(fields[currentIndex + 1].id);\n }\n };\n\n const filledCount = fields.filter(isFieldFilled).length;\n const incompleteFields = fields.filter(f => !isFieldFilled(f));\n\n // When on the last field (or none selected) and all filled, the forward action is complete/advance\n const showCompleteAsNext = !hasNext && allRequiredFilled;\n\n return (\n <div className=\"field-navigator\">\n <div\n className={`field-navigator-progress ${incompleteFields.length > 0 ? 'clickable' : ''}`}\n onClick={() => incompleteFields.length > 0 && setShowIncomplete(!showIncomplete)}\n >\n {filledCount} of {fields.length} fields completed\n {incompleteFields.length > 0 && (\n <span className=\"field-navigator-toggle\">{showIncomplete ? '\\u25B2' : '\\u25BC'}</span>\n )}\n </div>\n\n {showIncomplete && incompleteFields.length > 0 && (\n <div className=\"incomplete-fields-list\">\n {incompleteFields.map(f => (\n <button\n key={f.id}\n className=\"incomplete-field-item\"\n onClick={() => {\n onNavigate(f.id);\n setShowIncomplete(false);\n }}\n >\n {f.label}\n </button>\n ))}\n </div>\n )}\n\n <div className=\"field-navigator-controls\">\n <button\n onClick={handlePrev}\n disabled={!hasPrev}\n className=\"nav-btn\"\n >\n Prev\n </button>\n <span className=\"field-navigator-position\">\n {currentIndex >= 0 ? `${currentIndex + 1} / ${fields.length}` : '-'}\n </span>\n {showCompleteAsNext ? (\n <button\n onClick={onComplete}\n className=\"nav-btn nav-btn-complete\"\n >\n {completeLabel}\n </button>\n ) : (\n <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n ×\n </span>\n )}\n </button>\n ))}\n {isAdding ? (\n <div className=\"signer-role-add-input\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAdd()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAdd}>Add</button>\n <button onClick={() => setIsAdding(false)}>Cancel</button>\n </div>\n ) : (\n <button\n className=\"signer-role-add-btn\"\n onClick={() => setIsAdding(true)}\n >\n + Add Role\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","e","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","e","import_react","srcDoc","import_react","import_jsx_runtime","import_jsx_runtime","PDFDocument","StandardFonts","rgb","import_react","import_jsx_runtime"]}
|