@unlev/exeq 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -81
- package/dist/index.css +289 -5
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +31 -8
- package/dist/index.d.ts +31 -8
- package/dist/index.js +651 -351
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +623 -324
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -4
- package/dist/embed.css +0 -1
- package/dist/embed.global.js +0 -419
- package/dist/styles.css +0 -566
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/SignerRoleSelector.tsx","../src/components/pdf-builder/SignatureCanvas.tsx","../src/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/components/pdf-builder/FieldNavigator.tsx"],"sourcesContent":["// Components\nexport { DesignerView } from '../components/pdf-builder/DesignerView';\nexport { SignerView } 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} 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 } from 'react';\nimport type { FormField, FieldType, Template } from '@/types/pdf-builder';\nimport { DEFAULT_SIGNER_ROLES, createField, getSignerColor } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldPropertyPanel } from './FieldPropertyPanel';\nimport { SignerRoleSelector } from './SignerRoleSelector';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport '@/styles/pdf-builder.css';\n\nexport function DesignerView() {\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>([]);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signerRoles, setSignerRoles] = useState<string[]>([...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\n // Load PDF from URL params or postMessage\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const pdfUrl = params.get('pdf');\n if (pdfUrl) {\n loadPdf(pdfUrl);\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 }, []);\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);\n setFields(prev => [...prev, field]);\n setSelectedFieldId(field.id);\n }, [activeFieldType, activeRole]);\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 => prev.map(f => f.id === id ? { ...f, ...updates } : f));\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((role: string) => {\n if (!signerRoles.includes(role)) {\n setSignerRoles(prev => [...prev, role]);\n }\n }, [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 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 // Also post to parent if embedded\n window.parent?.postMessage({ type: 'template-saved', template }, '*');\n }, [fields, signerRoles, pdfSource]);\n\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n\n const renderFieldContent = useCallback((field: FormField) => {\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 return (\n <div className=\"field-overlay-placeholder\">\n {field.value || field.placeholder}\n </div>\n );\n }, []);\n\n return (\n <div className=\"designer-layout\">\n <div className=\"designer-toolbar\">\n <div className=\"toolbar-left\">\n {!pages.length && (\n <label className=\"upload-btn\">\n Upload PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n )}\n {pages.length > 0 && (\n <>\n <label className=\"upload-btn upload-btn-small\">\n Change PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n <div className=\"field-type-selector\">\n {(['text', 'signature', 'signed-date', 'checkbox', 'initials'] as FieldType[]).map(type => (\n <button\n key={type}\n className={`field-type-btn ${activeFieldType === type ? 'active' : ''}`}\n onClick={() => setActiveFieldType(type)}\n >\n {type === 'text' ? 'Text' :\n type === 'signature' ? 'Signature' :\n type === 'signed-date' ? 'Date' :\n type === 'checkbox' ? 'Checkbox' : 'Initials'}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n <div className=\"toolbar-right\">\n {pages.length > 0 && (\n <button onClick={handleExport} className=\"export-btn\">\n Export Template\n </button>\n )}\n </div>\n </div>\n\n {pages.length > 0 && (\n <SignerRoleSelector\n roles={signerRoles}\n activeRole={activeRole}\n onSetActiveRole={setActiveRole}\n onAddRole={handleAddRole}\n onRemoveRole={handleRemoveRole}\n />\n )}\n\n <div className=\"designer-content\">\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>Upload a PDF to get started</h2>\n <p>Upload a template PDF, then click on the page to place form fields.</p>\n <label className=\"upload-btn upload-btn-large\">\n Choose PDF File\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={setSelectedFieldId}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\n onPageClick={handlePageClick}\n mode=\"designer\"\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"designer-panel\">\n {selectedField ? (\n <>\n <FieldPropertyPanel\n field={selectedField}\n signerRoles={signerRoles}\n onUpdate={handleFieldUpdate}\n onDelete={handleFieldDelete}\n />\n {/* Pre-fill area for Sender fields */}\n {selectedField.assignee === activeRole && (\n <div className=\"prefill-section\">\n <h4>Pre-fill Value</h4>\n {(selectedField.type === 'signature' || selectedField.type === 'initials') ? (\n <SignatureCanvas\n width={300}\n height={selectedField.type === 'initials' ? 100 : 150}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, { value: dataUrl })}\n initialValue={selectedField.value}\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 />\n )}\n </div>\n )}\n </>\n ) : (\n <div className=\"panel-empty\">\n {pages.length > 0\n ? 'Click on the PDF to place a field, or select an existing field to edit its properties.'\n : 'Upload a PDF to begin designing your template.'}\n </div>\n )}\n\n {fields.length > 0 && (\n <div className=\"field-list\">\n <h4>All Fields ({fields.length})</h4>\n {fields.map((f, i) => (\n <div\n key={f.id}\n className={`field-list-item ${f.id === selectedFieldId ? 'active' : ''}`}\n onClick={() => setSelectedFieldId(f.id)}\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 </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","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';\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}\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};\n\nexport function createField(\n type: FieldType,\n assignee: string,\n page: number,\n x: number,\n y: number,\n): FormField {\n const defaults = FIELD_DEFAULTS[type];\n return {\n id: generateId(),\n type,\n label: type === 'text' ? 'Text Field' : type === 'signature' ? 'Signature' : type === 'signed-date' ? 'Signed Date' : type === 'checkbox' ? 'Checkbox' : 'Initials',\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 } 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 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 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 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 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 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' : ''}`}\n style={{\n left: `${field.x}%`,\n top: `${field.y}%`,\n width: `${field.width}%`,\n height: `${field.height}%`,\n borderColor: color,\n backgroundColor: 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' && (\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\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\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 <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 {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 <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 <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 <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 {field.type !== 'checkbox' && (\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 <div className=\"panel-field-group\">\n <div className=\"panel-field\">\n <label>Width (%)</label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"100\"\n step=\"0.5\"\n value={field.width}\n onChange={e => onUpdate(field.id, { width: Number(e.target.value) })}\n />\n </div>\n <div className=\"panel-field\">\n <label>Height (%)</label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"100\"\n step=\"0.5\"\n value={field.height}\n onChange={e => onUpdate(field.id, { height: Number(e.target.value) })}\n />\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n ×\n </span>\n )}\n </button>\n ))}\n {isAdding ? (\n <div className=\"signer-role-add-input\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAdd()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAdd}>Add</button>\n <button onClick={() => setIsAdding(false)}>Cancel</button>\n </div>\n ) : (\n <button\n className=\"signer-role-add-btn\"\n onClick={() => setIsAdding(true)}\n >\n + Add Role\n </button>\n )}\n </div>\n </div>\n );\n}\n","'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}\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}: 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 = '#000';\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","'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 '@/styles/pdf-builder.css';\n\ninterface SignerViewProps {\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}\n\nexport function SignerView({\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n}: SignerViewProps = {}) {\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 setFields(initialTemplate.fields);\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\n const editableFields = fields.filter(f => f.assignee === signer);\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 for (const field of fields) {\n if (!field.value) continue;\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 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: rgb(0, 0, 0),\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: rgb(0, 0, 0),\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: rgb(0, 0, 0),\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"],"mappings":"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","names":["import_react","e","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","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","// 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 ×\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"]}
|