@unlev/exeq 0.2.2 → 0.3.0
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 +246 -3
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +31 -3
- package/dist/index.d.ts +31 -3
- package/dist/index.js +1059 -356
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1065 -362
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/components/pdf-builder/FieldNavigator.tsx","../src/utils/formulaResolver.ts","../src/components/pdf-builder/SignerRoleSelector.tsx"],"sourcesContent":["'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 } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldPropertyPanel } from './FieldPropertyPanel';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport { isValidApiKey } from '@/utils/apiKey';\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 /** 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 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 [fields, setFields] = useState<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 [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 // 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 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 setRightTab('properties');\n }, [activeFieldType, activeRole, fields]);\n\n const handleFieldMove = useCallback((id: string, page: number, x: number, y: number) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, page, x, y } : f));\n }, []);\n\n const handleFieldResize = useCallback((id: string, width: number, height: number) => {\n setFields(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 }, []);\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 handleFieldDelete = useCallback((id: string) => {\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 setFields(prev => prev.map(f => {\n if (!ids.includes(f.id)) 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 }, []);\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 const count = selectedFieldIds.size;\n if (window.confirm(`Delete ${count > 1 ? `${count} fields` : 'this field'}?`)) {\n setFields(prev => prev.filter(f => !selectedFieldIds.has(f.id)));\n setSelectedFieldIds(new Set());\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldIds]);\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 // 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 // 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 // Sort fields by document position: page, then top-to-bottom, then left-to-right\n const sortedFields = [...fields].sort((a, b) => {\n if (a.page !== b.page) return a.page - b.page;\n // Fields within ~2% vertical distance are in the same \"band\"\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 // 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 (field.type === 'blackout' || field.type === 'whiteout') {\n return null; // Rendered purely via background color on the overlay\n }\n if (field.type === 'signature' || field.type === 'initials') {\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 = field.fontFamily === 'Courier' ? '\"Courier New\", Courier, monospace' :\n field.fontFamily === 'TimesRoman' ? '\"Times New Roman\", Times, serif' :\n field.fontFamily === 'Helvetica' ? 'Helvetica, Arial, sans-serif' : undefined;\n return (\n <div\n className=\"field-overlay-placeholder\"\n style={{\n color: field.value ? inkColor : undefined,\n fontSize: `${field.fontSize * 0.6}px`,\n fontFamily: cssFontFamily,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing * 0.6}px` : 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 className=\"designer-pdf-area\">\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 onPageClick={handlePageClick}\n onDropField={handleDropOnPage}\n mode=\"designer\"\n renderFieldContent={renderFieldContent}\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=\"signer-role-indicator\">\n <span className=\"signer-role-indicator-label\">Editing as</span>\n <strong>{activeRole}</strong>\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 <div className=\"panel-empty\">\n <strong>{selectedFieldIds.size} fields selected</strong>\n <p>Drag to move as a group. Press Delete to remove all. Cmd/Ctrl+C to copy.</p>\n </div>\n ) : selectedField ? (\n <>\n <FieldPropertyPanel\n field={selectedField}\n signerRoles={signerRoles}\n onUpdate={handleFieldUpdate}\n onDelete={handleFieldDelete}\n />\n {/* Pre-fill area (not for redact fields) */}\n {selectedField.type !== 'blackout' && selectedField.type !== 'whiteout' && (\n <div className=\"prefill-section\">\n <h4>Pre-fill Value</h4>\n {(selectedField.type === 'signature' || selectedField.type === 'initials') ? (\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 )}\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 => (\n <div\n key={f.id}\n className={`field-list-item ${selectedFieldIds.has(f.id) ? 'active' : ''}`}\n onClick={() => { setSelectedFieldIds(new Set([f.id])); setRightTab('properties'); }}\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 <span className=\"field-list-page\">p{f.page + 1}</span>\n {f.required && <span className=\"field-list-required\">*</span>}\n </div>\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 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}\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\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 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 pages.push({\n pageNumber: i,\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height,\n });\n }\n\n return pages;\n}\n","'use client';\n\nimport { useRef, useCallback } from 'react';\nimport type { FormField, FieldType } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { getSignerColor } 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 mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldIds,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n onDropField,\n onGroupMove,\n mode,\n currentSigner,\n renderFieldContent,\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handlePageClick = useCallback((e: React.MouseEvent<HTMLDivElement>, pageIndex: number) => {\n const target = e.target as HTMLElement;\n if (target.closest('.field-overlay')) return;\n\n if (onPageClick) {\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 onPageClick(pageIndex, x, y);\n } else {\n onSelectField(null);\n }\n }, [onPageClick, onSelectField]);\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\" ref={containerRef}>\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={{ aspectRatio: `${page.width} / ${page.height}` }}\n onClick={(e) => handlePageClick(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 selectedIds={selectedFieldIds}\n mode={mode}\n currentSigner={currentSigner}\n renderContent={renderFieldContent}\n />\n ))}\n </div>\n );\n })}\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 selectedIds: Set<string>;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n isMultiSelected,\n onSelect,\n onMove,\n onResize,\n onGroupMove,\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 resizeStartRef = useRef<{ startX: number; startY: number; fieldW: number; fieldH: number } | null>(null);\n\n const isRedact = field.type === 'blackout' || field.type === 'whiteout';\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\n const isInactiveSigner = mode === 'signer' && !isRedact && field.assignee !== currentSigner;\n const color = isInactiveSigner ? '#cccccc' : 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 onSelect(e);\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\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 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 // Move all selected fields as a group\n onGroupMove(Array.from(selectedIds), dx, dy);\n // Reset start so delta stays relative\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 onMove(field.id, field.page, newX, newY);\n }\n };\n\n const handleMouseUp = () => {\n dragStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onMove, onSelect, isMultiSelected, onGroupMove, selectedIds]);\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onResize) return;\n e.preventDefault();\n e.stopPropagation();\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 };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onResize]);\n\n return (\n <div\n ref={overlayRef}\n className={`field-overlay ${isSelected ? 'selected' : ''} ${isEditable ? 'editable' : 'readonly'} ${isPreFilled ? 'prefilled' : ''} ${isRedact ? 'redact' : ''} ${isInactiveSigner ? 'inactive-signer' : ''}`}\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' ? 'move' : (isInactiveSigner ? 'default' : 'default'),\n pointerEvents: (mode === 'signer' && (isRedact || isInactiveSigner)) ? 'none' : undefined,\n }}\n onClick={(e) => { e.stopPropagation(); 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 && (\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 } 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}\n\nexport function FieldPropertyPanel({ field, signerRoles, onUpdate, onDelete }: FieldPropertyPanelProps) {\n const color = getSignerColor(field.assignee);\n const isRedactField = field.type === 'blackout' || field.type === 'whiteout';\n const isTextField = field.type === 'text' || field.type === 'signed-date' || field.type === 'dropdown';\n const showInkColor = field.type === 'text' || field.type === 'dropdown' || field.type === 'signature' || field.type === 'initials' || field.type === 'signed-date';\n const [newOption, setNewOption] = useState('');\n\n return (\n <div className=\"field-property-panel\">\n <div className=\"panel-header\">\n <h3 style={{ color }}>\n {field.label}\n </h3>\n <button onClick={() => onDelete(field.id)} className=\"panel-delete-btn\">\n Delete\n </button>\n </div>\n\n <div className=\"panel-field\">\n <label>Label</label>\n <input\n type=\"text\"\n value={field.label}\n onChange={e => onUpdate(field.id, { label: e.target.value })}\n />\n </div>\n\n {!isRedactField && (\n <div className=\"panel-field\">\n <label>Field Type</label>\n <select\n value={field.type}\n onChange={e => onUpdate(field.id, { type: e.target.value as FieldType })}\n >\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\n value={field.textSubtype || 'freeform'}\n onChange={e => onUpdate(field.id, { textSubtype: e.target.value as TextSubtype })}\n >\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 {!isRedactField && (\n <div className=\"panel-field\">\n <label>Assigned To</label>\n <select\n value={field.assignee}\n onChange={e => onUpdate(field.id, { assignee: e.target.value })}\n >\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 {!isRedactField && (\n <div className=\"panel-field\">\n <label>Placeholder</label>\n <input\n type=\"text\"\n value={field.placeholder}\n onChange={e => onUpdate(field.id, { placeholder: e.target.value })}\n />\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field\">\n <label>Formula</label>\n <input\n type=\"text\"\n value={field.formula || ''}\n onChange={e => onUpdate(field.id, { formula: e.target.value || undefined })}\n placeholder='e.g. {{Date Field | month}}'\n />\n {field.formula && (\n <span className=\"panel-hint\">This field auto-computes from other fields. Signer cannot edit it.</span>\n )}\n </div>\n )}\n\n {!isRedactField && field.type !== 'checkbox' && (\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={e => onUpdate(field.id, { required: e.target.checked })}\n />\n Required\n </label>\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field\">\n <label>Font</label>\n <select\n value={field.fontFamily || 'Helvetica'}\n onChange={e => onUpdate(field.id, { fontFamily: e.target.value })}\n >\n {FONT_FAMILIES.map(f => (\n <option key={f.value} value={f.value}>{f.label}</option>\n ))}\n </select>\n </div>\n )}\n\n {isTextField && (\n <div className=\"panel-field\">\n <label>Font Size (pt)</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={field.fontSize}\n onChange={e => onUpdate(field.id, { fontSize: Number(e.target.value) })}\n />\n </div>\n )}\n\n {isTextField && (\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={field.letterSpacing || 0}\n onChange={e => onUpdate(field.id, { 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={field.lineHeight || 1.2}\n onChange={e => onUpdate(field.id, { lineHeight: Number(e.target.value) })}\n />\n </div>\n </div>\n )}\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Max Characters (0 = unlimited)</label>\n <input\n type=\"number\"\n min=\"0\"\n max=\"9999\"\n value={field.maxLength || 0}\n onChange={e => onUpdate(field.id, { maxLength: Number(e.target.value) })}\n />\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\n key={c.value}\n className={`ink-color-swatch ${(field.inkColor || '#000000') === c.value ? 'active' : ''}`}\n style={{ backgroundColor: c.value }}\n onClick={() => onUpdate(field.id, { inkColor: c.value })}\n title={c.label}\n />\n ))}\n </div>\n </div>\n )}\n\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\n className=\"panel-option-remove\"\n onClick={() => {\n const updated = (field.options || []).filter((_, j) => j !== i);\n onUpdate(field.id, { options: updated.length > 0 ? updated : undefined });\n }}\n >\n ×\n </button>\n </div>\n ))}\n <div className=\"panel-option-add\">\n <input\n type=\"text\"\n value={newOption}\n onChange={e => setNewOption(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter' && newOption.trim()) {\n onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] });\n setNewOption('');\n }\n }}\n placeholder=\"Add option...\"\n />\n <button\n onClick={() => {\n if (newOption.trim()) {\n onUpdate(field.id, { options: [...(field.options || []), newOption.trim()] });\n setNewOption('');\n }\n }}\n >\n +\n </button>\n </div>\n </div>\n {field.type === 'dropdown' && (field.options?.length ?? 0) === 0 && (\n <span className=\"panel-hint\" style={{ color: '#c44' }}>Add at least one option</span>\n )}\n {field.type === 'text' && (field.options?.length ?? 0) > 0 && (\n <span className=\"panel-hint\">Signer will choose from these options via dropdown</span>\n )}\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","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { FormField, Template } 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}\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}: 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 [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 && f.type !== 'blackout' && f.type !== 'whiteout'\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 = fields.filter(f => f.assignee === signer && f.type !== 'blackout' && f.type !== 'whiteout' && !f.formula).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 const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n const isFieldEditable = selectedField\n ? selectedField.assignee === signer && selectedField.type !== 'blackout' && selectedField.type !== 'whiteout' && !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 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; // checkbox is always \"filled\"\n return !!f.value;\n });\n\n const handleAdvanceOrSubmit = useCallback(async () => {\n if (!allRequiredFilled) return;\n\n // Intermediate signer: advance to next\n if (!isLastSigner) {\n setCurrentSignerIndex(prev => prev + 1);\n setSelectedFieldId(null);\n // Scroll PDF area to top\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 const pdfBytes = await generateFilledPdf(pdfSource, finalFields);\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\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]);\n\n const renderFieldContent = useCallback((field: FormField) => {\n // Redact fields are visual-only — no interaction in signer mode\n if (field.type === 'blackout' || field.type === 'whiteout') {\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 (field.type === 'signature' || field.type === 'initials') {\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 (field.type === 'signature' || field.type === 'initials') {\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 * 0.6}px`,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing * 0.6}px` : undefined,\n lineHeight: field.lineHeight ? `${field.lineHeight}` : undefined,\n fontFamily: field.fontFamily === 'Courier' ? '\"Courier New\", Courier, monospace' :\n field.fontFamily === 'TimesRoman' ? '\"Times New Roman\", Times, serif' :\n field.fontFamily === 'Helvetica' ? 'Helvetica, Arial, sans-serif' : undefined,\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 when signature is filled\n useEffect(() => {\n const sigFields = fields.filter(f => f.assignee === signer && f.type === 'signature' && f.value);\n if (sigFields.length > 0) {\n const dateStr = new Date().toLocaleDateString();\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 }, [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 {(selectedField.type === 'signature' || selectedField.type === 'initials') && (\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 { PDFDocument, PDFFont, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\n\nconst FONT_MAP: Record<string, string> = {\n 'Helvetica': StandardFonts.Helvetica,\n 'Courier': StandardFonts.Courier,\n 'TimesRoman': StandardFonts.TimesRoman,\n};\n\nexport async function generateFilledPdf(\n pdfSource: string | ArrayBuffer,\n fields: FormField[],\n): Promise<Uint8Array> {\n let pdfBytes: ArrayBuffer;\n if (typeof pdfSource === 'string') {\n const res = await fetch(pdfSource);\n pdfBytes = await res.arrayBuffer();\n } else {\n pdfBytes = pdfSource;\n }\n\n const pdfDoc = await PDFDocument.load(pdfBytes);\n\n // Embed all needed fonts upfront\n const fontCache = new Map<string, PDFFont>();\n const usedFontKeys = new Set(fields.map(f => f.fontFamily || 'Helvetica'));\n for (const key of usedFontKeys) {\n const stdFont = FONT_MAP[key] || StandardFonts.Helvetica;\n fontCache.set(key, await pdfDoc.embedFont(stdFont));\n }\n\n const pages = pdfDoc.getPages();\n\n function 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\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 // Convert percentage coordinates to PDF points\n const x = (field.x / 100) * pageWidth;\n const y = pageHeight - ((field.y / 100) * pageHeight) - ((field.height / 100) * pageHeight);\n const w = (field.width / 100) * pageWidth;\n const h = (field.height / 100) * pageHeight;\n\n // Redact fields always render (no value needed)\n if (field.type === 'blackout' || field.type === 'whiteout') {\n page.drawRectangle({\n x, y, width: w, 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 // Draw an X checkmark (WinAnsi-safe, no unicode)\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 (field.type === 'signature' || field.type === 'initials') {\n // Value is a data URL from the canvas\n if (field.value.startsWith('data:image/png')) {\n const pngBytes = Uint8Array.from(\n atob(field.value.split(',')[1]),\n c => c.charCodeAt(0),\n );\n const pngImage = await pdfDoc.embedPng(pngBytes);\n page.drawImage(pngImage, {\n x,\n y,\n width: w,\n height: h,\n });\n }\n } else {\n // Text fields (including signed-date)\n const font = fontCache.get(field.fontFamily || 'Helvetica')!;\n const spacing = field.letterSpacing || 0;\n\n // Calculate text width including letter spacing\n const textWidthAtSize = (text: string, size: number) => {\n const baseWidth = font.widthOfTextAtSize(text, size);\n return baseWidth + spacing * (text.length - 1);\n };\n\n // Auto-shrink font to fit within the field width (single line)\n const maxFontSize = Math.min(field.fontSize, h * 0.7);\n let fontSize = maxFontSize;\n const padding = 4;\n while (fontSize > 4) {\n if (textWidthAtSize(field.value, fontSize) <= w - padding) break;\n fontSize -= 0.5;\n }\n\n if (spacing > 0) {\n // Draw each character individually with custom spacing\n let cx = x + 2;\n const cy = y + h * 0.3;\n for (const char of field.value) {\n page.drawText(char, { x: cx, y: cy, size: fontSize, font, color: inkColor });\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 return pdfDoc.save();\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","'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","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 { 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":["useState","useCallback","useEffect","useRef","e","jsx","jsxs","useRef","useState","useCallback","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","e","useState","useCallback","useEffect","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","jsx","jsxs","useState"]}
|
|
1
|
+
{"version":3,"sources":["../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/components/pdf-builder/FieldNavigator.tsx","../src/utils/formulaResolver.ts","../src/components/pdf-builder/SignerRoleSelector.tsx"],"sourcesContent":["'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 } 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 /** 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 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, snapshot: snapshotFields, 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 // 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 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 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 // Sort fields by document position: page, then top-to-bottom, then left-to-right\n const sortedFields = [...fields].sort((a, b) => {\n if (a.page !== b.page) return a.page - b.page;\n // Fields within ~2% vertical distance are in the same \"band\"\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 // 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 (field.type === 'blackout' || field.type === 'whiteout') {\n return null; // Rendered purely via background color on the overlay\n }\n if (field.type === 'signature' || field.type === 'initials') {\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 = field.fontFamily === 'Courier' ? '\"Courier New\", Courier, monospace' :\n field.fontFamily === 'TimesRoman' ? '\"Times New Roman\", Times, serif' :\n field.fontFamily === 'Helvetica' ? 'Helvetica, Arial, sans-serif' : undefined;\n return (\n <div\n className=\"field-overlay-placeholder\"\n style={{\n color: field.value ? inkColor : undefined,\n fontSize: `${field.fontSize * 0.6}px`,\n fontFamily: cssFontFamily,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing * 0.6}px` : 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 onMoveEnd={snapshotFields}\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={selectedField.type !== 'blackout' && selectedField.type !== 'whiteout' ? (\n <div className=\"prefill-section\">\n <label>Pre-fill Value</label>\n {(selectedField.type === 'signature' || selectedField.type === 'initials') ? (\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}\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\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 } 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 ends (for undo history snapshots). */\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 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={{ 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 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 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 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 = field.type === 'blackout' || field.type === 'whiteout';\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 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, 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\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, 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 } 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 isRedactField = field.type === 'blackout' || field.type === 'whiteout';\n const isTextField = field.type === 'text' || field.type === 'signed-date' || field.type === 'dropdown';\n const showInkColor = field.type === 'text' || field.type === 'dropdown' || field.type === 'signature' || field.type === 'initials' || field.type === 'signed-date';\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 {!isRedactField && (\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 {!isRedactField && (\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 {!isRedactField && (\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 {!isRedactField && 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 {isTextField && (\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 {/* 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 {(isTextField || showInkColor) && (\n <div className=\"panel-section\">\n <div className=\"panel-section-heading\">Style</div>\n\n {isTextField && (\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 {isTextField && (\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 {isTextField && (\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 skipRef = useRef(false);\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 // Don't push to history if nothing changed\n if (newPresent === prev.present) return prev;\n if (skipRef.current) {\n skipRef.current = false;\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 skipRef.current = true;\n set(updater);\n }, [set]);\n\n /** Snapshot the current state to history (call after drag ends, etc.) */\n const snapshot = useCallback(() => {\n setState(prev => ({\n past: [...prev.past.slice(-maxHistory), prev.present],\n present: prev.present,\n future: [],\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 snapshot,\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 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 && f.type !== 'blackout' && f.type !== 'whiteout'\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 = fields.filter(f => f.assignee === signer && f.type !== 'blackout' && f.type !== 'whiteout' && !f.formula).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 const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n const isFieldEditable = selectedField\n ? selectedField.assignee === signer && selectedField.type !== 'blackout' && selectedField.type !== 'whiteout' && !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 (f.type !== 'blackout' && f.type !== 'whiteout') 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 getFieldValues = useCallback(() => {\n const values: Record<string, string> = {};\n fields.forEach(f => { if (f.type !== 'blackout' && f.type !== 'whiteout') values[f.label] = f.value || ''; });\n return values;\n }, [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, getFieldValues());\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, 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, 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 = getFieldValues();\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, getFieldValues, transforms]);\n\n const renderFieldContent = useCallback((field: FormField) => {\n // Redact fields are visual-only — no interaction in signer mode\n if (field.type === 'blackout' || field.type === 'whiteout') {\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 (field.type === 'signature' || field.type === 'initials') {\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 (field.type === 'signature' || field.type === 'initials') {\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 * 0.6}px`,\n letterSpacing: field.letterSpacing ? `${field.letterSpacing * 0.6}px` : undefined,\n lineHeight: field.lineHeight ? `${field.lineHeight}` : undefined,\n fontFamily: field.fontFamily === 'Courier' ? '\"Courier New\", Courier, monospace' :\n field.fontFamily === 'TimesRoman' ? '\"Times New Roman\", Times, serif' :\n field.fontFamily === 'Helvetica' ? 'Helvetica, Arial, sans-serif' : undefined,\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 when signature is filled\n useEffect(() => {\n const sigFields = fields.filter(f => f.assignee === signer && f.type === 'signature' && f.value);\n if (sigFields.length > 0) {\n const dateStr = new Date().toLocaleDateString();\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 }, [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 {(selectedField.type === 'signature' || selectedField.type === 'initials') && (\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 { PDFDocument, PDFFont, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\n\nconst FONT_MAP: Record<string, string> = {\n 'Helvetica': StandardFonts.Helvetica,\n 'Courier': StandardFonts.Courier,\n 'TimesRoman': StandardFonts.TimesRoman,\n};\n\nexport async function generateFilledPdf(\n pdfSource: string | ArrayBuffer,\n fields: FormField[],\n): Promise<Uint8Array> {\n let pdfBytes: ArrayBuffer;\n if (typeof pdfSource === 'string') {\n const res = await fetch(pdfSource);\n pdfBytes = await res.arrayBuffer();\n } else {\n pdfBytes = pdfSource;\n }\n\n const pdfDoc = await PDFDocument.load(pdfBytes);\n\n // Embed all needed fonts upfront\n const fontCache = new Map<string, PDFFont>();\n const usedFontKeys = new Set(fields.map(f => f.fontFamily || 'Helvetica'));\n for (const key of usedFontKeys) {\n const stdFont = FONT_MAP[key] || StandardFonts.Helvetica;\n fontCache.set(key, await pdfDoc.embedFont(stdFont));\n }\n\n const pages = pdfDoc.getPages();\n\n function 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\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 // Convert percentage coordinates to PDF points\n const x = (field.x / 100) * pageWidth;\n const y = pageHeight - ((field.y / 100) * pageHeight) - ((field.height / 100) * pageHeight);\n const w = (field.width / 100) * pageWidth;\n const h = (field.height / 100) * pageHeight;\n\n // Redact fields always render (no value needed)\n if (field.type === 'blackout' || field.type === 'whiteout') {\n page.drawRectangle({\n x, y, width: w, 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 // Draw an X checkmark (WinAnsi-safe, no unicode)\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 (field.type === 'signature' || field.type === 'initials') {\n // Value is a data URL from the canvas\n if (field.value.startsWith('data:image/png')) {\n const pngBytes = Uint8Array.from(\n atob(field.value.split(',')[1]),\n c => c.charCodeAt(0),\n );\n const pngImage = await pdfDoc.embedPng(pngBytes);\n page.drawImage(pngImage, {\n x,\n y,\n width: w,\n height: h,\n });\n }\n } else {\n // Text fields (including signed-date)\n const font = fontCache.get(field.fontFamily || 'Helvetica')!;\n const spacing = field.letterSpacing || 0;\n\n // Calculate text width including letter spacing\n const textWidthAtSize = (text: string, size: number) => {\n const baseWidth = font.widthOfTextAtSize(text, size);\n return baseWidth + spacing * (text.length - 1);\n };\n\n // Auto-shrink font to fit within the field width (single line)\n const maxFontSize = Math.min(field.fontSize, h * 0.7);\n let fontSize = maxFontSize;\n const padding = 4;\n while (fontSize > 4) {\n if (textWidthAtSize(field.value, fontSize) <= w - padding) break;\n fontSize -= 0.5;\n }\n\n if (spacing > 0) {\n // Draw each character individually with custom spacing\n let cx = x + 2;\n const cy = y + h * 0.3;\n for (const char of field.value) {\n page.drawText(char, { x: cx, y: cy, size: fontSize, font, color: inkColor });\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 return pdfDoc.save();\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","'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","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 { 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":["useState","useCallback","useEffect","useRef","e","useState","jsx","jsxs","useState","useRef","useState","useCallback","jsx","jsxs","useState","useCallback","useRef","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","e","useState","useCallback","useEffect","useRef","useState","jsx","jsxs","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","PDFDocument","StandardFonts","rgb","useState","jsx","jsxs","useState"]}
|