@unlev/exeq 0.1.3 → 0.1.5

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.js CHANGED
@@ -629,9 +629,10 @@ function SignatureCanvas({
629
629
  }
630
630
 
631
631
  // src/utils/apiKey.ts
632
- var VALID_KEYS = /* @__PURE__ */ new Set([
633
- "exeq_live_2024"
634
- ]);
632
+ var VALID_KEYS = new Set([
633
+ "exeq_live_2024",
634
+ process.env.NEXT_PUBLIC_EXEQ_API_KEY
635
+ ].filter(Boolean));
635
636
  function isValidApiKey(key) {
636
637
  if (!key) return false;
637
638
  return VALID_KEYS.has(key);
@@ -1373,13 +1374,15 @@ function SignerView({
1373
1374
  try {
1374
1375
  const pdfBytes = await generateFilledPdf(pdfSource, fields);
1375
1376
  const blob = new Blob([pdfBytes.slice().buffer], { type: "application/pdf" });
1376
- downloadPdf(pdfBytes, "signed-document.pdf");
1377
1377
  if (callbackUrl) {
1378
1378
  await postPdfToCallback(pdfBytes, callbackUrl, "signed-document.pdf");
1379
1379
  }
1380
1380
  if (onComplete) {
1381
1381
  onComplete(blob);
1382
1382
  }
1383
+ if (!callbackUrl && !onComplete) {
1384
+ downloadPdf(pdfBytes, "signed-document.pdf");
1385
+ }
1383
1386
  window.parent?.postMessage({ type: "signing-complete" }, "*");
1384
1387
  } catch (err) {
1385
1388
  console.error("Failed to generate PDF:", err);
@@ -1428,11 +1431,12 @@ function SignerView({
1428
1431
  value: field.value,
1429
1432
  placeholder: field.placeholder,
1430
1433
  onChange: (e) => handleFieldUpdate(field.id, e.target.value),
1434
+ onFocus: () => setSelectedFieldId(field.id),
1431
1435
  onClick: (e) => e.stopPropagation(),
1432
1436
  style: { fontSize: `${field.fontSize * 0.6}px` }
1433
1437
  }
1434
1438
  );
1435
- }, [signer, handleFieldUpdate]);
1439
+ }, [signer, handleFieldUpdate, setSelectedFieldId]);
1436
1440
  (0, import_react4.useEffect)(() => {
1437
1441
  const sigFields = fields.filter((f) => f.assignee === signer && f.type === "signature" && f.value);
1438
1442
  if (sigFields.length > 0) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/index.ts","../src/components/pdf-builder/DesignerView.tsx","../src/types/pdf-builder.ts","../src/utils/pdfRenderer.ts","../src/components/pdf-builder/PdfViewer.tsx","../src/components/pdf-builder/FieldPropertyPanel.tsx","../src/components/pdf-builder/SignatureCanvas.tsx","../src/utils/apiKey.ts","../src/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/components/pdf-builder/FieldNavigator.tsx","../src/components/pdf-builder/SignerRoleSelector.tsx"],"sourcesContent":["// Components\nexport { DesignerView } from '../components/pdf-builder/DesignerView';\nexport type { DesignerViewProps } from '../components/pdf-builder/DesignerView';\nexport { SignerView } from '../components/pdf-builder/SignerView';\nexport type { SignerViewProps } from '../components/pdf-builder/SignerView';\nexport { PdfViewer } from '../components/pdf-builder/PdfViewer';\nexport { SignatureCanvas } from '../components/pdf-builder/SignatureCanvas';\nexport { FieldPropertyPanel } from '../components/pdf-builder/FieldPropertyPanel';\nexport { FieldNavigator } from '../components/pdf-builder/FieldNavigator';\nexport { SignerRoleSelector } from '../components/pdf-builder/SignerRoleSelector';\n\n// Types\nexport type { FormField, FieldType, TextSubtype, Template } from '../types/pdf-builder';\n\n// Type helpers & constants\nexport {\n DEFAULT_SIGNER_ROLES,\n SIGNER_ROLE_COLORS,\n FIELD_DEFAULTS,\n getSignerColor,\n createField,\n uniqueLabel,\n} from '../types/pdf-builder';\n\n// Utilities\nexport { renderPdfPages } from '../utils/pdfRenderer';\nexport type { RenderedPage } from '../utils/pdfRenderer';\nexport { generateFilledPdf, downloadPdf, postPdfToCallback } from '../utils/pdfFiller';\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { FormField, FieldType, Template } from '@/types/pdf-builder';\nimport { DEFAULT_SIGNER_ROLES, FIELD_DEFAULTS, createField, getSignerColor, uniqueLabel } 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: '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 [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\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 dragGhostRef = useRef<HTMLDivElement | null>(null);\n const resizingRef = useRef(false);\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 setFields(prev => [...prev, field]);\n setSelectedFieldId(field.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 => prev.map(f => f.id === id ? { ...f, width, height } : f));\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 return prev.map(f => f.id === id ? { ...f, ...updates } : f);\n });\n }, []);\n\n const handleFieldDelete = useCallback((id: string) => {\n setFields(prev => prev.filter(f => f.id !== id));\n if (selectedFieldId === id) setSelectedFieldId(null);\n }, [selectedFieldId]);\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 setFields(prev => [...prev, field]);\n setSelectedFieldId(field.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 (!selectedFieldId) 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 if (window.confirm('Delete this field?')) {\n handleFieldDelete(selectedFieldId);\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldId, handleFieldDelete]);\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 const selectedField = fields.find(f => f.id === selectedFieldId) || 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 return (\n <div\n className=\"field-overlay-placeholder\"\n style={{ color: field.value ? inkColor : undefined, fontSize: `${field.fontSize * 0.6}px` }}\n >\n {field.value || field.placeholder}\n </div>\n );\n }, []);\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 selectedFieldId={selectedFieldId}\n onSelectField={(id) => { setSelectedFieldId(id); if (id) setRightTab('properties'); }}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\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 {/* 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 {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 ${f.id === selectedFieldId ? 'active' : ''}`}\n onClick={() => { setSelectedFieldId(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","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' | '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}\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 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 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 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: 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 selectedFieldId: string | null;\n onSelectField: (id: string | null) => 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 mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldId,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n onDropField,\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={field.id === selectedFieldId}\n onSelect={() => onSelectField(field.id)}\n onMove={onFieldMove}\n onResize={onFieldResize}\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 onSelect: () => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n onSelect,\n onMove,\n onResize,\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 color = getSignerColor(field.assignee);\n const isRedact = field.type === 'blackout' || field.type === 'whiteout';\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\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();\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 = (e: MouseEvent) => {\n if (!dragStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((e.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((e.clientY - dragStartRef.current.startY) / rect.height) * 100;\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 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]);\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' : ''}`}\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 : (isSelected ? `${color}22` : `${color}11`),\n cursor: mode === 'designer' ? 'move' : 'default',\n }}\n onClick={(e) => { e.stopPropagation(); onSelect(); }}\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 type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor } 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 showFontSize = field.type === 'text' || field.type === 'signed-date';\n const showInkColor = field.type === 'text' || field.type === 'signature' || field.type === 'initials' || field.type === 'signed-date';\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=\"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 {!isRedactField && (\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 {showFontSize && (\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 {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 </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 rect = canvasRef.current!.getBoundingClientRect();\n return [\n e.clientX - rect.left,\n e.clientY - rect.top,\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","// Hardcoded valid API keys. In the future this will validate against a server.\nconst VALID_KEYS = new Set([\n 'exeq_live_2024',\n]);\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 '@/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}\n\nexport function SignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n initialValues,\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 [signer, setSigner] = useState(initialSigner || 'Signer 1');\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 // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n let templateFields = initialTemplate.fields;\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 setFields(templateFields);\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 signerParam = params.get('signer');\n const cbUrl = params.get('callbackUrl');\n\n if (signerParam) setSigner(signerParam);\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) => setFields(template.fields))\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) setFields(e.data.fields);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) setSigner(e.data.signer);\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\n const editableFields = fields.filter(f => f.assignee === signer).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 ? selectedField.assignee === signer : 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 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 handleSubmit = useCallback(async () => {\n if (!pdfSource || !allRequiredFilled) return;\n setSubmitting(true);\n try {\n const pdfBytes = await generateFilledPdf(pdfSource, fields);\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n // Always allow download\n downloadPdf(pdfBytes, 'signed-document.pdf');\n\n // Post to callback if provided\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n // Notify parent via callback prop\n if (onComplete) {\n onComplete(blob);\n }\n\n // Notify parent window via postMessage\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]);\n\n const renderFieldContent = useCallback((field: FormField) => {\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\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 onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n style={{ fontSize: `${field.fontSize * 0.6}px` }}\n />\n );\n }, [signer, handleFieldUpdate]);\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 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 selectedFieldId={selectedFieldId}\n onSelectField={setSelectedFieldId}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\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' && (\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 className=\"signer-text-input\"\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\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onSubmit={handleSubmit}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n </div>\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","import { PDFDocument, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\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 const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\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 fontSize = Math.min(field.fontSize, h * 0.7);\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: inkColor,\n maxWidth: w - 4,\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 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 onSubmit: () => void;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onSubmit,\n}: FieldNavigatorProps) {\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(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n }).length;\n\n return (\n <div className=\"field-navigator\">\n <div className=\"field-navigator-progress\">\n {filledCount} of {fields.length} fields completed\n </div>\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 <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n </div>\n <button\n onClick={onSubmit}\n disabled={!allRequiredFilled}\n className=\"submit-btn\"\n >\n Complete & Download\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n &times;\n </span>\n )}\n </button>\n ))}\n {isAdding ? (\n <div className=\"signer-role-add-input\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAdd()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAdd}>Add</button>\n <button onClick={() => setIsAdding(false)}>Cancel</button>\n </div>\n ) : (\n <button\n className=\"signer-role-add-btn\"\n onClick={() => setIsAdding(true)}\n >\n + Add Role\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","e","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","e","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/lib/index.ts","../src/components/pdf-builder/DesignerView.tsx","../src/types/pdf-builder.ts","../src/utils/pdfRenderer.ts","../src/components/pdf-builder/PdfViewer.tsx","../src/components/pdf-builder/FieldPropertyPanel.tsx","../src/components/pdf-builder/SignatureCanvas.tsx","../src/utils/apiKey.ts","../src/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/components/pdf-builder/FieldNavigator.tsx","../src/components/pdf-builder/SignerRoleSelector.tsx"],"sourcesContent":["// Components\nexport { DesignerView } from '../components/pdf-builder/DesignerView';\nexport type { DesignerViewProps } from '../components/pdf-builder/DesignerView';\nexport { SignerView } from '../components/pdf-builder/SignerView';\nexport type { SignerViewProps } from '../components/pdf-builder/SignerView';\nexport { PdfViewer } from '../components/pdf-builder/PdfViewer';\nexport { SignatureCanvas } from '../components/pdf-builder/SignatureCanvas';\nexport { FieldPropertyPanel } from '../components/pdf-builder/FieldPropertyPanel';\nexport { FieldNavigator } from '../components/pdf-builder/FieldNavigator';\nexport { SignerRoleSelector } from '../components/pdf-builder/SignerRoleSelector';\n\n// Types\nexport type { FormField, FieldType, TextSubtype, Template } from '../types/pdf-builder';\n\n// Type helpers & constants\nexport {\n DEFAULT_SIGNER_ROLES,\n SIGNER_ROLE_COLORS,\n FIELD_DEFAULTS,\n getSignerColor,\n createField,\n uniqueLabel,\n} from '../types/pdf-builder';\n\n// Utilities\nexport { renderPdfPages } from '../utils/pdfRenderer';\nexport type { RenderedPage } from '../utils/pdfRenderer';\nexport { generateFilledPdf, downloadPdf, postPdfToCallback } from '../utils/pdfFiller';\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { FormField, FieldType, Template } from '@/types/pdf-builder';\nimport { DEFAULT_SIGNER_ROLES, FIELD_DEFAULTS, createField, getSignerColor, uniqueLabel } 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: '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 [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\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 dragGhostRef = useRef<HTMLDivElement | null>(null);\n const resizingRef = useRef(false);\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 setFields(prev => [...prev, field]);\n setSelectedFieldId(field.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 => prev.map(f => f.id === id ? { ...f, width, height } : f));\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 return prev.map(f => f.id === id ? { ...f, ...updates } : f);\n });\n }, []);\n\n const handleFieldDelete = useCallback((id: string) => {\n setFields(prev => prev.filter(f => f.id !== id));\n if (selectedFieldId === id) setSelectedFieldId(null);\n }, [selectedFieldId]);\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 setFields(prev => [...prev, field]);\n setSelectedFieldId(field.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 (!selectedFieldId) 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 if (window.confirm('Delete this field?')) {\n handleFieldDelete(selectedFieldId);\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldId, handleFieldDelete]);\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 const selectedField = fields.find(f => f.id === selectedFieldId) || 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 return (\n <div\n className=\"field-overlay-placeholder\"\n style={{ color: field.value ? inkColor : undefined, fontSize: `${field.fontSize * 0.6}px` }}\n >\n {field.value || field.placeholder}\n </div>\n );\n }, []);\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 selectedFieldId={selectedFieldId}\n onSelectField={(id) => { setSelectedFieldId(id); if (id) setRightTab('properties'); }}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\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 {/* 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 {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 ${f.id === selectedFieldId ? 'active' : ''}`}\n onClick={() => { setSelectedFieldId(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","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' | '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}\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 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 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 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: 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 selectedFieldId: string | null;\n onSelectField: (id: string | null) => 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 mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldId,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n onDropField,\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={field.id === selectedFieldId}\n onSelect={() => onSelectField(field.id)}\n onMove={onFieldMove}\n onResize={onFieldResize}\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 onSelect: () => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n onSelect,\n onMove,\n onResize,\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 color = getSignerColor(field.assignee);\n const isRedact = field.type === 'blackout' || field.type === 'whiteout';\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\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();\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 = (e: MouseEvent) => {\n if (!dragStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((e.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((e.clientY - dragStartRef.current.startY) / rect.height) * 100;\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 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]);\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' : ''}`}\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 : (isSelected ? `${color}22` : `${color}11`),\n cursor: mode === 'designer' ? 'move' : 'default',\n }}\n onClick={(e) => { e.stopPropagation(); onSelect(); }}\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 type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor } 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 showFontSize = field.type === 'text' || field.type === 'signed-date';\n const showInkColor = field.type === 'text' || field.type === 'signature' || field.type === 'initials' || field.type === 'signed-date';\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=\"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 {!isRedactField && (\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 {showFontSize && (\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 {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 </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 rect = canvasRef.current!.getBoundingClientRect();\n return [\n e.clientX - rect.left,\n e.clientY - rect.top,\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 '@/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}\n\nexport function SignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n initialValues,\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 [signer, setSigner] = useState(initialSigner || 'Signer 1');\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 // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n let templateFields = initialTemplate.fields;\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 setFields(templateFields);\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 signerParam = params.get('signer');\n const cbUrl = params.get('callbackUrl');\n\n if (signerParam) setSigner(signerParam);\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) => setFields(template.fields))\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) setFields(e.data.fields);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) setSigner(e.data.signer);\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\n const editableFields = fields.filter(f => f.assignee === signer).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 ? selectedField.assignee === signer : 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 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 handleSubmit = useCallback(async () => {\n if (!pdfSource || !allRequiredFilled) return;\n setSubmitting(true);\n try {\n const pdfBytes = await generateFilledPdf(pdfSource, fields);\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n // Post to callback if provided\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n // Notify parent via callback prop\n if (onComplete) {\n onComplete(blob);\n }\n\n // Only download if no callback or onComplete handler is set\n if (!callbackUrl && !onComplete) {\n downloadPdf(pdfBytes, 'signed-document.pdf');\n }\n\n // Notify parent window via postMessage\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]);\n\n const renderFieldContent = useCallback((field: FormField) => {\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\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 onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={{ fontSize: `${field.fontSize * 0.6}px` }}\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 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 selectedFieldId={selectedFieldId}\n onSelectField={setSelectedFieldId}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\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' && (\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 className=\"signer-text-input\"\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\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onSubmit={handleSubmit}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n </div>\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","import { PDFDocument, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\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 const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\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 fontSize = Math.min(field.fontSize, h * 0.7);\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: inkColor,\n maxWidth: w - 4,\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 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 onSubmit: () => void;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onSubmit,\n}: FieldNavigatorProps) {\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(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n }).length;\n\n return (\n <div className=\"field-navigator\">\n <div className=\"field-navigator-progress\">\n {filledCount} of {fields.length} fields completed\n </div>\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 <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n </div>\n <button\n onClick={onSubmit}\n disabled={!allRequiredFilled}\n className=\"submit-btn\"\n >\n Complete & Download\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n &times;\n </span>\n )}\n </button>\n ))}\n {isAdding ? (\n <div className=\"signer-role-add-input\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAdd()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAdd}>Add</button>\n <button onClick={() => setIsAdding(false)}>Cancel</button>\n </div>\n ) : (\n <button\n className=\"signer-role-add-btn\"\n onClick={() => setIsAdding(true)}\n >\n + Add Role\n </button>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","e","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","e","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime"]}
package/dist/index.mjs CHANGED
@@ -577,9 +577,10 @@ function SignatureCanvas({
577
577
  }
578
578
 
579
579
  // src/utils/apiKey.ts
580
- var VALID_KEYS = /* @__PURE__ */ new Set([
581
- "exeq_live_2024"
582
- ]);
580
+ var VALID_KEYS = new Set([
581
+ "exeq_live_2024",
582
+ process.env.NEXT_PUBLIC_EXEQ_API_KEY
583
+ ].filter(Boolean));
583
584
  function isValidApiKey(key) {
584
585
  if (!key) return false;
585
586
  return VALID_KEYS.has(key);
@@ -1321,13 +1322,15 @@ function SignerView({
1321
1322
  try {
1322
1323
  const pdfBytes = await generateFilledPdf(pdfSource, fields);
1323
1324
  const blob = new Blob([pdfBytes.slice().buffer], { type: "application/pdf" });
1324
- downloadPdf(pdfBytes, "signed-document.pdf");
1325
1325
  if (callbackUrl) {
1326
1326
  await postPdfToCallback(pdfBytes, callbackUrl, "signed-document.pdf");
1327
1327
  }
1328
1328
  if (onComplete) {
1329
1329
  onComplete(blob);
1330
1330
  }
1331
+ if (!callbackUrl && !onComplete) {
1332
+ downloadPdf(pdfBytes, "signed-document.pdf");
1333
+ }
1331
1334
  window.parent?.postMessage({ type: "signing-complete" }, "*");
1332
1335
  } catch (err) {
1333
1336
  console.error("Failed to generate PDF:", err);
@@ -1376,11 +1379,12 @@ function SignerView({
1376
1379
  value: field.value,
1377
1380
  placeholder: field.placeholder,
1378
1381
  onChange: (e) => handleFieldUpdate(field.id, e.target.value),
1382
+ onFocus: () => setSelectedFieldId(field.id),
1379
1383
  onClick: (e) => e.stopPropagation(),
1380
1384
  style: { fontSize: `${field.fontSize * 0.6}px` }
1381
1385
  }
1382
1386
  );
1383
- }, [signer, handleFieldUpdate]);
1387
+ }, [signer, handleFieldUpdate, setSelectedFieldId]);
1384
1388
  useEffect3(() => {
1385
1389
  const sigFields = fields.filter((f) => f.assignee === signer && f.type === "signature" && f.value);
1386
1390
  if (sigFields.length > 0) {
@@ -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/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 } 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: '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 [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\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 dragGhostRef = useRef<HTMLDivElement | null>(null);\n const resizingRef = useRef(false);\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 setFields(prev => [...prev, field]);\n setSelectedFieldId(field.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 => prev.map(f => f.id === id ? { ...f, width, height } : f));\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 return prev.map(f => f.id === id ? { ...f, ...updates } : f);\n });\n }, []);\n\n const handleFieldDelete = useCallback((id: string) => {\n setFields(prev => prev.filter(f => f.id !== id));\n if (selectedFieldId === id) setSelectedFieldId(null);\n }, [selectedFieldId]);\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 setFields(prev => [...prev, field]);\n setSelectedFieldId(field.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 (!selectedFieldId) 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 if (window.confirm('Delete this field?')) {\n handleFieldDelete(selectedFieldId);\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldId, handleFieldDelete]);\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 const selectedField = fields.find(f => f.id === selectedFieldId) || 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 return (\n <div\n className=\"field-overlay-placeholder\"\n style={{ color: field.value ? inkColor : undefined, fontSize: `${field.fontSize * 0.6}px` }}\n >\n {field.value || field.placeholder}\n </div>\n );\n }, []);\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 selectedFieldId={selectedFieldId}\n onSelectField={(id) => { setSelectedFieldId(id); if (id) setRightTab('properties'); }}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\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 {/* 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 {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 ${f.id === selectedFieldId ? 'active' : ''}`}\n onClick={() => { setSelectedFieldId(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","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' | '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}\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 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 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 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: 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 selectedFieldId: string | null;\n onSelectField: (id: string | null) => 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 mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldId,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n onDropField,\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={field.id === selectedFieldId}\n onSelect={() => onSelectField(field.id)}\n onMove={onFieldMove}\n onResize={onFieldResize}\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 onSelect: () => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n onSelect,\n onMove,\n onResize,\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 color = getSignerColor(field.assignee);\n const isRedact = field.type === 'blackout' || field.type === 'whiteout';\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\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();\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 = (e: MouseEvent) => {\n if (!dragStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((e.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((e.clientY - dragStartRef.current.startY) / rect.height) * 100;\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 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]);\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' : ''}`}\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 : (isSelected ? `${color}22` : `${color}11`),\n cursor: mode === 'designer' ? 'move' : 'default',\n }}\n onClick={(e) => { e.stopPropagation(); onSelect(); }}\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 type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor } 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 showFontSize = field.type === 'text' || field.type === 'signed-date';\n const showInkColor = field.type === 'text' || field.type === 'signature' || field.type === 'initials' || field.type === 'signed-date';\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=\"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 {!isRedactField && (\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 {showFontSize && (\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 {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 </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 rect = canvasRef.current!.getBoundingClientRect();\n return [\n e.clientX - rect.left,\n e.clientY - rect.top,\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","// Hardcoded valid API keys. In the future this will validate against a server.\nconst VALID_KEYS = new Set([\n 'exeq_live_2024',\n]);\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 '@/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}\n\nexport function SignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n initialValues,\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 [signer, setSigner] = useState(initialSigner || 'Signer 1');\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 // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n let templateFields = initialTemplate.fields;\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 setFields(templateFields);\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 signerParam = params.get('signer');\n const cbUrl = params.get('callbackUrl');\n\n if (signerParam) setSigner(signerParam);\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) => setFields(template.fields))\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) setFields(e.data.fields);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) setSigner(e.data.signer);\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\n const editableFields = fields.filter(f => f.assignee === signer).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 ? selectedField.assignee === signer : 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 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 handleSubmit = useCallback(async () => {\n if (!pdfSource || !allRequiredFilled) return;\n setSubmitting(true);\n try {\n const pdfBytes = await generateFilledPdf(pdfSource, fields);\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n // Always allow download\n downloadPdf(pdfBytes, 'signed-document.pdf');\n\n // Post to callback if provided\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n // Notify parent via callback prop\n if (onComplete) {\n onComplete(blob);\n }\n\n // Notify parent window via postMessage\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]);\n\n const renderFieldContent = useCallback((field: FormField) => {\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\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 onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n style={{ fontSize: `${field.fontSize * 0.6}px` }}\n />\n );\n }, [signer, handleFieldUpdate]);\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 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 selectedFieldId={selectedFieldId}\n onSelectField={setSelectedFieldId}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\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' && (\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 className=\"signer-text-input\"\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\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onSubmit={handleSubmit}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n </div>\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","import { PDFDocument, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\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 const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\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 fontSize = Math.min(field.fontSize, h * 0.7);\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: inkColor,\n maxWidth: w - 4,\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 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 onSubmit: () => void;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onSubmit,\n}: FieldNavigatorProps) {\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(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n }).length;\n\n return (\n <div className=\"field-navigator\">\n <div className=\"field-navigator-progress\">\n {filledCount} of {fields.length} fields completed\n </div>\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 <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n </div>\n <button\n onClick={onSubmit}\n disabled={!allRequiredFilled}\n className=\"submit-btn\"\n >\n Complete & Download\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n &times;\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","useCallback","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","e","useState","useCallback","useEffect","useRef","jsx","jsxs","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/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/components/pdf-builder/FieldNavigator.tsx","../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 } 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: '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 [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\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 dragGhostRef = useRef<HTMLDivElement | null>(null);\n const resizingRef = useRef(false);\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 setFields(prev => [...prev, field]);\n setSelectedFieldId(field.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 => prev.map(f => f.id === id ? { ...f, width, height } : f));\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 return prev.map(f => f.id === id ? { ...f, ...updates } : f);\n });\n }, []);\n\n const handleFieldDelete = useCallback((id: string) => {\n setFields(prev => prev.filter(f => f.id !== id));\n if (selectedFieldId === id) setSelectedFieldId(null);\n }, [selectedFieldId]);\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 setFields(prev => [...prev, field]);\n setSelectedFieldId(field.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 (!selectedFieldId) 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 if (window.confirm('Delete this field?')) {\n handleFieldDelete(selectedFieldId);\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [selectedFieldId, handleFieldDelete]);\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 const selectedField = fields.find(f => f.id === selectedFieldId) || 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 return (\n <div\n className=\"field-overlay-placeholder\"\n style={{ color: field.value ? inkColor : undefined, fontSize: `${field.fontSize * 0.6}px` }}\n >\n {field.value || field.placeholder}\n </div>\n );\n }, []);\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 selectedFieldId={selectedFieldId}\n onSelectField={(id) => { setSelectedFieldId(id); if (id) setRightTab('properties'); }}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\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 {/* 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 {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 ${f.id === selectedFieldId ? 'active' : ''}`}\n onClick={() => { setSelectedFieldId(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","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' | '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}\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 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 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 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: 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 selectedFieldId: string | null;\n onSelectField: (id: string | null) => 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 mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldId,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n onDropField,\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={field.id === selectedFieldId}\n onSelect={() => onSelectField(field.id)}\n onMove={onFieldMove}\n onResize={onFieldResize}\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 onSelect: () => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n onSelect,\n onMove,\n onResize,\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 color = getSignerColor(field.assignee);\n const isRedact = field.type === 'blackout' || field.type === 'whiteout';\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\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();\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 = (e: MouseEvent) => {\n if (!dragStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((e.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((e.clientY - dragStartRef.current.startY) / rect.height) * 100;\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 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]);\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' : ''}`}\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 : (isSelected ? `${color}22` : `${color}11`),\n cursor: mode === 'designer' ? 'move' : 'default',\n }}\n onClick={(e) => { e.stopPropagation(); onSelect(); }}\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 type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor } 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 showFontSize = field.type === 'text' || field.type === 'signed-date';\n const showInkColor = field.type === 'text' || field.type === 'signature' || field.type === 'initials' || field.type === 'signed-date';\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=\"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 {!isRedactField && (\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 {showFontSize && (\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 {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 </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 rect = canvasRef.current!.getBoundingClientRect();\n return [\n e.clientX - rect.left,\n e.clientY - rect.top,\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 '@/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}\n\nexport function SignerView({\n apiKey,\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n initialValues,\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 [signer, setSigner] = useState(initialSigner || 'Signer 1');\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 // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n let templateFields = initialTemplate.fields;\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 setFields(templateFields);\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 signerParam = params.get('signer');\n const cbUrl = params.get('callbackUrl');\n\n if (signerParam) setSigner(signerParam);\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) => setFields(template.fields))\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) setFields(e.data.fields);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) setSigner(e.data.signer);\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\n const editableFields = fields.filter(f => f.assignee === signer).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 ? selectedField.assignee === signer : 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 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 handleSubmit = useCallback(async () => {\n if (!pdfSource || !allRequiredFilled) return;\n setSubmitting(true);\n try {\n const pdfBytes = await generateFilledPdf(pdfSource, fields);\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n // Post to callback if provided\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n // Notify parent via callback prop\n if (onComplete) {\n onComplete(blob);\n }\n\n // Only download if no callback or onComplete handler is set\n if (!callbackUrl && !onComplete) {\n downloadPdf(pdfBytes, 'signed-document.pdf');\n }\n\n // Notify parent window via postMessage\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]);\n\n const renderFieldContent = useCallback((field: FormField) => {\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\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 onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onFocus={() => setSelectedFieldId(field.id)}\n onClick={(e) => e.stopPropagation()}\n style={{ fontSize: `${field.fontSize * 0.6}px` }}\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 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 selectedFieldId={selectedFieldId}\n onSelectField={setSelectedFieldId}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\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' && (\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 className=\"signer-text-input\"\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\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onSubmit={handleSubmit}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n </div>\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","import { PDFDocument, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\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 const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\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 fontSize = Math.min(field.fontSize, h * 0.7);\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: inkColor,\n maxWidth: w - 4,\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 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 onSubmit: () => void;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onSubmit,\n}: FieldNavigatorProps) {\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(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n }).length;\n\n return (\n <div className=\"field-navigator\">\n <div className=\"field-navigator-progress\">\n {filledCount} of {fields.length} fields completed\n </div>\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 <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n </div>\n <button\n onClick={onSubmit}\n disabled={!allRequiredFilled}\n className=\"submit-btn\"\n >\n Complete & Download\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n &times;\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","useCallback","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","e","useState","useCallback","useEffect","useRef","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","jsx","jsxs","useState"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unlev/exeq",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Embeddable PDF form builder and document signing — client-side, no backend required",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",