@signiphi/pdf-signer 0.1.1
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/INSTALLING_LOCALLY.md +184 -0
- package/LICENSE +2 -0
- package/README.md +1093 -0
- package/assets/viewer.html +314 -0
- package/dist/__tests__/helpers/fixtures.d.ts +43 -0
- package/dist/__tests__/helpers/fixtures.d.ts.map +1 -0
- package/dist/__tests__/helpers/mocks.d.ts +333 -0
- package/dist/__tests__/helpers/mocks.d.ts.map +1 -0
- package/dist/__tests__/setup.d.ts +6 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/components/AttachmentUpload.d.ts +17 -0
- package/dist/components/AttachmentUpload.d.ts.map +1 -0
- package/dist/components/EditableFieldsPanel.d.ts +30 -0
- package/dist/components/EditableFieldsPanel.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +67 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/FormFieldsView.d.ts +42 -0
- package/dist/components/FormFieldsView.d.ts.map +1 -0
- package/dist/components/PdfViewerStyled.d.ts +16 -0
- package/dist/components/PdfViewerStyled.d.ts.map +1 -0
- package/dist/components/PoweredBySigniphi.d.ts +11 -0
- package/dist/components/PoweredBySigniphi.d.ts.map +1 -0
- package/dist/components/SignatureCanvas.d.ts +12 -0
- package/dist/components/SignatureCanvas.d.ts.map +1 -0
- package/dist/components/SignatureInitialsBox.d.ts +23 -0
- package/dist/components/SignatureInitialsBox.d.ts.map +1 -0
- package/dist/components/SignatureModal.d.ts +22 -0
- package/dist/components/SignatureModal.d.ts.map +1 -0
- package/dist/components/SigningInstructions.d.ts +12 -0
- package/dist/components/SigningInstructions.d.ts.map +1 -0
- package/dist/components/SubmissionForm.d.ts +52 -0
- package/dist/components/SubmissionForm.d.ts.map +1 -0
- package/dist/components/ViewToggleToolbar.d.ts +30 -0
- package/dist/components/ViewToggleToolbar.d.ts.map +1 -0
- package/dist/components/form-fields/CheckboxRenderer.d.ts +10 -0
- package/dist/components/form-fields/CheckboxRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/DateFieldRenderer.d.ts +14 -0
- package/dist/components/form-fields/DateFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/DropdownRenderer.d.ts +14 -0
- package/dist/components/form-fields/DropdownRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/FormFieldRenderer.d.ts +20 -0
- package/dist/components/form-fields/FormFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/InitialsFieldRenderer.d.ts +14 -0
- package/dist/components/form-fields/InitialsFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/RadioGroupRenderer.d.ts +10 -0
- package/dist/components/form-fields/RadioGroupRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/SignatureFieldRenderer.d.ts +16 -0
- package/dist/components/form-fields/SignatureFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/TextFieldRenderer.d.ts +14 -0
- package/dist/components/form-fields/TextFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/TextLabelRenderer.d.ts +14 -0
- package/dist/components/form-fields/TextLabelRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/index.d.ts +14 -0
- package/dist/components/form-fields/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +14 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +6297 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +6248 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/core/PdfViewerCore.d.ts +19 -0
- package/dist/core/PdfViewerCore.d.ts.map +1 -0
- package/dist/core/SignatureCaptureCore.d.ts +37 -0
- package/dist/core/SignatureCaptureCore.d.ts.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +907 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +884 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +2167 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +2139 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/hooks/useAttachments.d.ts +25 -0
- package/dist/hooks/useAttachments.d.ts.map +1 -0
- package/dist/hooks/useFieldFiltering.d.ts +29 -0
- package/dist/hooks/useFieldFiltering.d.ts.map +1 -0
- package/dist/hooks/useFormFields.d.ts +23 -0
- package/dist/hooks/useFormFields.d.ts.map +1 -0
- package/dist/hooks/useMultiSignerContext.d.ts +25 -0
- package/dist/hooks/useMultiSignerContext.d.ts.map +1 -0
- package/dist/hooks/usePdfViewer.d.ts +52 -0
- package/dist/hooks/usePdfViewer.d.ts.map +1 -0
- package/dist/hooks/useSignatureCapture.d.ts +17 -0
- package/dist/hooks/useSignatureCapture.d.ts.map +1 -0
- package/dist/hooks/useSignatures.d.ts +25 -0
- package/dist/hooks/useSignatures.d.ts.map +1 -0
- package/dist/index.css +4929 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7220 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +7093 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integrations/index.d.ts +6 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +242 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/index.mjs +218 -0
- package/dist/integrations/index.mjs.map +1 -0
- package/dist/integrations/next-config.d.ts +46 -0
- package/dist/integrations/next-config.d.ts.map +1 -0
- package/dist/integrations/vite-plugin.d.ts +48 -0
- package/dist/integrations/vite-plugin.d.ts.map +1 -0
- package/dist/lib/index.d.ts +3 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/ui/alert.d.ts +9 -0
- package/dist/lib/ui/alert.d.ts.map +1 -0
- package/dist/lib/ui/button.d.ts +12 -0
- package/dist/lib/ui/button.d.ts.map +1 -0
- package/dist/lib/ui/calendar.d.ts +10 -0
- package/dist/lib/ui/calendar.d.ts.map +1 -0
- package/dist/lib/ui/card.d.ts +9 -0
- package/dist/lib/ui/card.d.ts.map +1 -0
- package/dist/lib/ui/checkbox.d.ts +5 -0
- package/dist/lib/ui/checkbox.d.ts.map +1 -0
- package/dist/lib/ui/dialog.d.ts +20 -0
- package/dist/lib/ui/dialog.d.ts.map +1 -0
- package/dist/lib/ui/index.d.ts +12 -0
- package/dist/lib/ui/index.d.ts.map +1 -0
- package/dist/lib/ui/input.d.ts +6 -0
- package/dist/lib/ui/input.d.ts.map +1 -0
- package/dist/lib/ui/label.d.ts +6 -0
- package/dist/lib/ui/label.d.ts.map +1 -0
- package/dist/lib/ui/popover.d.ts +7 -0
- package/dist/lib/ui/popover.d.ts.map +1 -0
- package/dist/lib/ui/radio-group.d.ts +6 -0
- package/dist/lib/ui/radio-group.d.ts.map +1 -0
- package/dist/lib/ui/select.d.ts +14 -0
- package/dist/lib/ui/select.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/styles/index.css +5004 -0
- package/dist/types/index.d.ts +265 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +23 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/utils/attachment-validators.d.ts +118 -0
- package/dist/utils/attachment-validators.d.ts.map +1 -0
- package/dist/utils/audit-trail.d.ts +27 -0
- package/dist/utils/audit-trail.d.ts.map +1 -0
- package/dist/utils/date-validation.d.ts +30 -0
- package/dist/utils/date-validation.d.ts.map +1 -0
- package/dist/utils/errors.d.ts +106 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/field-extraction.d.ts +27 -0
- package/dist/utils/field-extraction.d.ts.map +1 -0
- package/dist/utils/field-visibility.d.ts +104 -0
- package/dist/utils/field-visibility.d.ts.map +1 -0
- package/dist/utils/index.d.ts +17 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2501 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +2404 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/pdf-field-type-helpers.d.ts +78 -0
- package/dist/utils/pdf-field-type-helpers.d.ts.map +1 -0
- package/dist/utils/pdf-helpers.d.ts +38 -0
- package/dist/utils/pdf-helpers.d.ts.map +1 -0
- package/dist/utils/pdf-lib-loader.d.ts +45 -0
- package/dist/utils/pdf-lib-loader.d.ts.map +1 -0
- package/dist/utils/pdf-manipulation.d.ts +93 -0
- package/dist/utils/pdf-manipulation.d.ts.map +1 -0
- package/dist/utils/pdf-validators.d.ts +149 -0
- package/dist/utils/pdf-validators.d.ts.map +1 -0
- package/dist/utils/pdf-viewer-filter.d.ts +35 -0
- package/dist/utils/pdf-viewer-filter.d.ts.map +1 -0
- package/dist/utils/pdf-widget-helpers.d.ts +98 -0
- package/dist/utils/pdf-widget-helpers.d.ts.map +1 -0
- package/dist/utils/pdfjs-config.d.ts +56 -0
- package/dist/utils/pdfjs-config.d.ts.map +1 -0
- package/dist/utils/pdfjs-version-check.d.ts +28 -0
- package/dist/utils/pdfjs-version-check.d.ts.map +1 -0
- package/dist/utils/performance-monitor.d.ts +172 -0
- package/dist/utils/performance-monitor.d.ts.map +1 -0
- package/dist/utils/tracking.d.ts +89 -0
- package/dist/utils/tracking.d.ts.map +1 -0
- package/package.json +180 -0
- package/scripts/analyze-bundle.js +271 -0
- package/scripts/copy-utils.js +227 -0
- package/scripts/copy-utils.test.js +164 -0
- package/scripts/postinstall.js +109 -0
- package/scripts/setup.js +108 -0
- package/src/styles/index.css +139 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/pdfjs-config.ts","../../src/utils/pdfjs-version-check.ts","../../src/utils/logger.ts","../../src/utils/pdf-validators.ts","../../src/utils/pdf-helpers.ts","../../src/utils/pdf-lib-loader.ts","../../src/utils/field-visibility.ts","../../src/utils/pdf-widget-helpers.ts","../../src/utils/pdf-field-type-helpers.ts","../../src/utils/pdf-manipulation.ts","../../src/utils/field-extraction.ts","../../src/utils/audit-trail.ts","../../src/utils/errors.ts","../../src/utils/attachment-validators.ts","../../src/utils/date-validation.ts","../../src/utils/tracking.ts","../../src/core/PdfViewerCore.tsx","../../src/core/SignatureCaptureCore.tsx","../../src/components/PdfViewerStyled.tsx","../../src/lib/utils.ts","../../src/lib/ui/button.tsx","../../src/components/SignatureCanvas.tsx","../../src/lib/ui/dialog.tsx","../../src/components/SignatureModal.tsx","../../src/lib/ui/input.tsx","../../src/lib/ui/label.tsx","../../src/lib/ui/card.tsx","../../src/components/SignatureInitialsBox.tsx","../../src/components/form-fields/TextFieldRenderer.tsx","../../src/lib/ui/select.tsx","../../src/lib/ui/calendar.tsx","../../src/lib/ui/popover.tsx","../../src/components/form-fields/DateFieldRenderer.tsx","../../src/lib/ui/checkbox.tsx","../../src/components/form-fields/CheckboxRenderer.tsx","../../src/lib/ui/radio-group.tsx","../../src/components/form-fields/RadioGroupRenderer.tsx","../../src/components/form-fields/DropdownRenderer.tsx","../../src/components/form-fields/SignatureFieldRenderer.tsx","../../src/components/form-fields/InitialsFieldRenderer.tsx","../../src/components/form-fields/TextLabelRenderer.tsx","../../src/components/form-fields/FormFieldRenderer.tsx","../../src/components/EditableFieldsPanel.tsx","../../src/components/AttachmentUpload.tsx","../../src/components/SigningInstructions.tsx","../../src/components/PoweredBySigniphi.tsx","../../src/components/ViewToggleToolbar.tsx","../../src/lib/ui/alert.tsx","../../src/components/FormFieldsView.tsx","../../src/utils/pdf-viewer-filter.ts","../../src/hooks/usePdfViewer.ts","../../src/hooks/useFormFields.ts","../../src/hooks/useSignatures.ts","../../src/hooks/useFieldFiltering.ts","../../src/hooks/useAttachments.ts","../../src/hooks/useMultiSignerContext.ts","../../src/components/SubmissionForm.tsx","../../src/components/ErrorBoundary.tsx"],"names":["pdfjsLib2","isValidDate","forwardRef","useRef","useState","useEffect","useCallback","useImperativeHandle","jsx","Fragment","React","jsxs","React2","React4","cva","React5","React6","React8","CalendarIcon","React9","Check","React10","CheckCircle","ImageIcon","FileText","FileIcon","X","ChevronLeft","ChevronRight","React11","AlertCircle","PDFDocument","rgb","value","validateSignatures","useMemo","validationErrors","ErrorBoundary","ReactErrorBoundary"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * PDF.js Configuration Provider\r\n * Manages global configuration for PDF.js worker and viewer paths\r\n * \r\n * COMPATIBILITY NOTE: This module is designed to work with both Vite and Next.js/webpack.\r\n * The worker source URL is computed lazily to avoid issues with webpack's handling of import.meta.\r\n */\r\n\r\nimport type { PdfJsConfig } from '../types';\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\n/**\r\n * CDN paths for PDF.js (exported for manual fallback configuration)\r\n * Note: CDN URLs may cause CORS issues in some environments\r\n * \r\n * @example\r\n * // Manually configure CDN (not recommended)\r\n * setPdfJsConfig({ \r\n * viewerBasePath: CDN_VIEWER,\r\n * workerSrc: CDN_WORKER \r\n * });\r\n */\r\nexport const CDN_WORKER = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@5.3.93/build/pdf.worker.mjs';\r\nexport const CDN_VIEWER = 'https://mozilla.github.io/pdf.js';\r\n\r\n/**\r\n * Internal flag to track if worker source has been computed\r\n */\r\nlet _workerSrcComputed = false;\r\nlet _cachedWorkerSrc: string | null = null;\r\n\r\n/**\r\n * Get the worker source URL (computed lazily to avoid webpack import.meta issues)\r\n * - In browser environments, the bundler resolves the URL from node_modules\r\n * - The worker is loaded from the user's bundle (no CORS issues)\r\n * \r\n * This function uses lazy evaluation to avoid triggering webpack's\r\n * \"Critical dependency: Accessing import.meta directly is unsupported\" warning\r\n * at module load time.\r\n */\r\nfunction getDefaultWorkerSrc(): string {\r\n // Return cached value if already computed\r\n if (_workerSrcComputed && _cachedWorkerSrc !== null) {\r\n return _cachedWorkerSrc;\r\n }\r\n\r\n // Default fallback\r\n let workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n\r\n // Only attempt import.meta resolution in browser environment\r\n if (typeof window !== 'undefined' && typeof URL !== 'undefined') {\r\n try {\r\n // Check if import.meta is available (ESM environment like Vite)\r\n // Use indirect access to avoid webpack static analysis issues\r\n const meta = (function() {\r\n try {\r\n // This pattern avoids webpack's direct import.meta detection\r\n return new Function('return import.meta')();\r\n } catch {\r\n return null;\r\n }\r\n })();\r\n\r\n if (meta && meta.url) {\r\n workerSrc = new URL('pdfjs-dist/build/pdf.worker.mjs', meta.url).href;\r\n }\r\n } catch {\r\n // Fallback for environments that don't support import.meta.url (Next.js/webpack)\r\n // Use the public path fallback\r\n }\r\n }\r\n\r\n // Cache the result\r\n _workerSrcComputed = true;\r\n _cachedWorkerSrc = workerSrc;\r\n\r\n return workerSrc;\r\n}\r\n\r\n/**\r\n * Default configuration for PDF.js\r\n * \r\n * By default, the package uses:\r\n * - Worker: Loaded from node_modules (bundled by your build tool)\r\n * - Viewer: Served from /pdfjs/ (automatically copied by postinstall)\r\n * \r\n * The postinstall script automatically copies viewer files to your public/pdfjs/ directory.\r\n * If setup fails, run: npx signiphi-setup\r\n * \r\n * NOTE: workerSrc is initialized to null and computed lazily on first access\r\n * to ensure compatibility with Next.js/webpack environments.\r\n */\r\nlet globalConfig: Required<PdfJsConfig> = {\r\n viewerBasePath: '/pdfjs',\r\n workerSrc: '', // Lazy-initialized below\r\n};\r\n\r\n// Flag to track if globalConfig.workerSrc has been initialized\r\nlet _configInitialized = false;\r\n\r\n/**\r\n * Ensure config is initialized (called lazily)\r\n */\r\nfunction ensureConfigInitialized(): void {\r\n if (!_configInitialized) {\r\n globalConfig.workerSrc = getDefaultWorkerSrc();\r\n _configInitialized = true;\r\n \r\n // Initialize PDF.js worker in browser environment\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = globalConfig.workerSrc;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Set PDF.js configuration\r\n * @param config - Partial configuration to merge with defaults\r\n * \r\n * @example\r\n * // Use self-hosted PDF.js files\r\n * setPdfJsConfig({ viewerBasePath: '/pdfjs' });\r\n * \r\n * @example\r\n * // Use custom CDN\r\n * setPdfJsConfig({ \r\n * viewerBasePath: 'https://my-cdn.com/pdfjs',\r\n * workerSrc: 'https://my-cdn.com/pdfjs/build/pdf.worker.mjs'\r\n * });\r\n */\r\nexport function setPdfJsConfig(config: Partial<PdfJsConfig>): void {\r\n // Ensure default config is computed first\r\n ensureConfigInitialized();\r\n \r\n if (config.viewerBasePath !== undefined) {\r\n globalConfig.viewerBasePath = config.viewerBasePath;\r\n }\r\n \r\n if (config.workerSrc !== undefined) {\r\n globalConfig.workerSrc = config.workerSrc;\r\n } else if (config.viewerBasePath !== undefined) {\r\n // Auto-update workerSrc based on viewerBasePath\r\n globalConfig.workerSrc = `${config.viewerBasePath}/build/pdf.worker.mjs`;\r\n }\r\n\r\n // Update PDF.js worker if in browser environment\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = globalConfig.workerSrc;\r\n }\r\n}\r\n\r\n/**\r\n * Get current PDF.js configuration\r\n * @returns Current configuration\r\n */\r\nexport function getPdfJsConfig(): Required<PdfJsConfig> {\r\n // Ensure config is initialized before returning\r\n ensureConfigInitialized();\r\n return { ...globalConfig };\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults (local files)\r\n */\r\nexport function resetPdfJsConfig(): void {\r\n // Clear cached worker src to force recomputation\r\n _workerSrcComputed = false;\r\n _cachedWorkerSrc = null;\r\n _configInitialized = false;\r\n \r\n // Re-initialize with fresh defaults\r\n ensureConfigInitialized();\r\n}\r\n\r\n/**\r\n * Initialize PDF.js configuration\r\n * This is called automatically when the first PDF operation is attempted,\r\n * but can also be called manually to pre-initialize the configuration.\r\n * \r\n * Unlike previous versions, this does NOT run at module load time to\r\n * ensure compatibility with Next.js/webpack environments.\r\n */\r\nexport function initializePdfJs(): void {\r\n ensureConfigInitialized();\r\n}\r\n\r\n","/**\r\n * PDF.js Version Check Utility\r\n * Detects version mismatches between viewer and worker\r\n */\r\n\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\nexport interface PdfJsVersionCheckResult {\r\n viewerExists: boolean;\r\n versionMatch: boolean;\r\n viewerVersion?: string;\r\n workerVersion: string;\r\n errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Check if PDF.js viewer files exist and versions match\r\n * @param viewerBasePath - Base path for the viewer (e.g., '/pdfjs')\r\n * @returns Version check result\r\n */\r\nexport async function checkPdfJsVersion(\r\n viewerBasePath: string = '/pdfjs'\r\n): Promise<PdfJsVersionCheckResult> {\r\n const workerVersion = pdfjsLib.version;\r\n \r\n try {\r\n // Check if .version file exists\r\n const versionUrl = `${viewerBasePath}/.version`;\r\n const response = await fetch(versionUrl);\r\n \r\n if (!response.ok) {\r\n return {\r\n viewerExists: false,\r\n versionMatch: false,\r\n workerVersion,\r\n errorMessage: 'PDF.js viewer files not found. Run: npx signiphi-setup',\r\n };\r\n }\r\n \r\n const viewerVersion = (await response.text()).trim();\r\n const versionMatch = viewerVersion === workerVersion;\r\n \r\n if (!versionMatch) {\r\n return {\r\n viewerExists: true,\r\n versionMatch: false,\r\n viewerVersion,\r\n workerVersion,\r\n errorMessage: `Version mismatch: viewer=${viewerVersion}, worker=${workerVersion}. Run: npx signiphi-setup`,\r\n };\r\n }\r\n \r\n return {\r\n viewerExists: true,\r\n versionMatch: true,\r\n viewerVersion,\r\n workerVersion,\r\n };\r\n } catch (error) {\r\n return {\r\n viewerExists: false,\r\n versionMatch: false,\r\n workerVersion,\r\n errorMessage: 'Unable to check PDF.js version. Viewer files may not be installed.',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Log version check warnings to console\r\n * @param result - Version check result\r\n */\r\nexport function logVersionCheckWarning(result: PdfJsVersionCheckResult): void {\r\n if (!result.viewerExists) {\r\n console.warn(\r\n '⚠️ PDF.js viewer files not found.\\n' +\r\n 'The PDF viewer requires viewer files to be installed.\\n' +\r\n 'Run: npx signiphi-setup\\n' +\r\n 'Or reinstall the package: npm install @signiphi/pdf-signer'\r\n );\r\n } else if (!result.versionMatch) {\r\n console.warn(\r\n `⚠️ PDF.js version mismatch detected:\\n` +\r\n ` Viewer: ${result.viewerVersion}\\n` +\r\n ` Worker: ${result.workerVersion}\\n` +\r\n 'Run: npx signiphi-setup to sync versions'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Check version and log warnings automatically\r\n * @param viewerBasePath - Base path for the viewer\r\n */\r\nexport async function checkAndLogPdfJsVersion(\r\n viewerBasePath: string = '/pdfjs'\r\n): Promise<PdfJsVersionCheckResult> {\r\n const result = await checkPdfJsVersion(viewerBasePath);\r\n \r\n if (!result.viewerExists || !result.versionMatch) {\r\n logVersionCheckWarning(result);\r\n }\r\n \r\n return result;\r\n}\r\n\r\n","/**\r\n * Logger Utility\r\n * Centralized logging system with environment-based log level control\r\n */\r\n\r\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\r\n\r\ninterface Logger {\r\n debug(message: string, ...args: unknown[]): void;\r\n info(message: string, ...args: unknown[]): void;\r\n warn(message: string, ...args: unknown[]): void;\r\n error(message: string, ...args: unknown[]): void;\r\n}\r\n\r\n/**\r\n * Determines if the current environment is production\r\n */\r\nfunction isProduction(): boolean {\r\n return typeof process !== 'undefined' && process.env.NODE_ENV === 'production';\r\n}\r\n\r\n/**\r\n * Creates a formatted log prefix\r\n */\r\nfunction createPrefix(level: LogLevel): string {\r\n return `[@signiphi/pdf-signer] [${level.toUpperCase()}]`;\r\n}\r\n\r\n/**\r\n * Creates the logger instance with environment-based behavior\r\n */\r\nfunction createLogger(): Logger {\r\n const isProd = isProduction();\r\n\r\n return {\r\n debug(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.log(createPrefix('debug'), message, ...args);\r\n }\r\n },\r\n\r\n info(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.log(createPrefix('info'), message, ...args);\r\n }\r\n },\r\n\r\n warn(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.warn(createPrefix('warn'), message, ...args);\r\n }\r\n },\r\n\r\n error(message: string, ...args: unknown[]): void {\r\n // Errors are shown in both development and production\r\n console.error(createPrefix('error'), message, ...args);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Singleton logger instance\r\n */\r\nexport const logger = createLogger();\r\n\r\n\r\n\r\n","/**\r\n * PDF Validation Utilities\r\n * Common validation functions used across the package\r\n */\r\n\r\nimport type { FormField } from '../types';\r\n\r\n/**\r\n * Validate that bytes represent a valid PDF file\r\n * \r\n * Checks for:\r\n * - Non-empty bytes\r\n * - Valid PDF header (%PDF-)\r\n * \r\n * @param pdfBytes - The PDF bytes to validate\r\n * @returns Validation result with valid flag and optional error message\r\n * \r\n * @example\r\n * ```ts\r\n * const result = validatePdfBytes(pdfBytes);\r\n * if (!result.valid) {\r\n * console.error(result.error);\r\n * return;\r\n * }\r\n * ```\r\n */\r\nexport function validatePdfBytes(pdfBytes: Uint8Array): { \r\n valid: boolean; \r\n error?: string \r\n} {\r\n // Check for empty bytes\r\n if (!pdfBytes || pdfBytes.length === 0) {\r\n return { \r\n valid: false, \r\n error: 'PDF bytes are empty' \r\n };\r\n }\r\n \r\n // Check for valid PDF header\r\n const header = new TextDecoder().decode(pdfBytes.slice(0, 12));\r\n if (!header.startsWith('%PDF-')) {\r\n return { \r\n valid: false, \r\n error: 'Invalid PDF format: Missing PDF header' \r\n };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Check if a label is auto-generated (not user-typed)\r\n * \r\n * Auto-generated labels are simple type names like \"Text\", \"Signature\", etc.\r\n * These are default labels assigned by the form builder and should not be\r\n * displayed to users in the same way as custom labels.\r\n * \r\n * Works identically in both single-signer and multi-signer flows.\r\n * \r\n * @param label - The label to check\r\n * @returns true if the label is auto-generated, false if it's a custom user label\r\n * \r\n * @example\r\n * ```ts\r\n * isAutoGeneratedLabel('Signature') // true\r\n * isAutoGeneratedLabel('Sign here please') // false\r\n * isAutoGeneratedLabel('') // true\r\n * ```\r\n */\r\nexport function isAutoGeneratedLabel(label: string): boolean {\r\n if (!label || !label.trim()) return true;\r\n \r\n const autoLabels = [\r\n 'Signature',\r\n 'Initials',\r\n 'Date',\r\n 'Text',\r\n 'Checkbox',\r\n 'Dropdown',\r\n 'Option',\r\n 'Radio',\r\n ];\r\n \r\n return autoLabels.includes(label.trim());\r\n}\r\n\r\n/**\r\n * Validate field values object\r\n * \r\n * Checks that the values object is properly formatted and contains\r\n * only string values for field IDs.\r\n * \r\n * @param values - Field values to validate\r\n * @returns Validation result with valid flag and errors array\r\n * \r\n * @example\r\n * ```ts\r\n * const result = validateFieldValues({ field1: 'value1', field2: 'value2' });\r\n * if (!result.valid) {\r\n * console.error('Validation errors:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validateFieldValues(values: unknown): {\r\n valid: boolean;\r\n errors: string[];\r\n} {\r\n const errors: string[] = [];\r\n \r\n // Check if values is an object\r\n if (!values || typeof values !== 'object') {\r\n errors.push('Field values must be an object');\r\n return { valid: false, errors };\r\n }\r\n \r\n // Check each value is a string\r\n const valuesObj = values as Record<string, unknown>;\r\n for (const [key, value] of Object.entries(valuesObj)) {\r\n if (typeof value !== 'string') {\r\n errors.push(`Field value for \"${key}\" must be a string, got ${typeof value}`);\r\n }\r\n }\r\n \r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * Validate signatures object\r\n * \r\n * Checks that signatures are properly formatted data URLs.\r\n * \r\n * @param signatures - Signatures to validate\r\n * @returns Validation result with valid flag and errors array\r\n * \r\n * @example\r\n * ```ts\r\n * const result = validateSignatures({\r\n * sig1: 'data:image/png;base64,iVBORw0KG...',\r\n * sig2: 'data:image/png;base64,iVBORw0KG...'\r\n * });\r\n * if (!result.valid) {\r\n * console.error('Invalid signatures:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validateSignatures(signatures: unknown): {\r\n valid: boolean;\r\n errors: string[];\r\n} {\r\n const errors: string[] = [];\r\n \r\n // Check if signatures is an object\r\n if (!signatures || typeof signatures !== 'object') {\r\n errors.push('Signatures must be an object');\r\n return { valid: false, errors };\r\n }\r\n \r\n // Check each signature is a valid data URL\r\n const sigsObj = signatures as Record<string, unknown>;\r\n for (const [key, value] of Object.entries(sigsObj)) {\r\n if (typeof value !== 'string') {\r\n errors.push(`Signature for \"${key}\" must be a string, got ${typeof value}`);\r\n continue;\r\n }\r\n \r\n // Validate data URL format\r\n if (!value.startsWith('data:image/')) {\r\n errors.push(`Signature for \"${key}\" must be a data URL starting with \"data:image/\"`);\r\n }\r\n \r\n // Check for base64 data\r\n const parts = value.split(',');\r\n if (parts.length !== 2 || !parts[1]) {\r\n errors.push(`Signature for \"${key}\" has invalid data URL format (missing base64 data)`);\r\n }\r\n }\r\n \r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * Validate a form field definition\r\n * \r\n * Checks that a field has all required properties and they are valid.\r\n * \r\n * @param field - Form field to validate\r\n * @returns Validation result with valid flag and errors array\r\n * \r\n * @example\r\n * ```ts\r\n * const result = validateFormField({\r\n * id: 'field1',\r\n * name: 'firstName',\r\n * type: FormFieldType.TEXT,\r\n * label: 'First Name',\r\n * position: { x: 100, y: 200, width: 150, height: 30, page: 1 },\r\n * required: true\r\n * });\r\n * if (!result.valid) {\r\n * console.error('Field validation errors:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validateFormField(field: unknown): {\r\n valid: boolean;\r\n errors: string[];\r\n} {\r\n const errors: string[] = [];\r\n \r\n // Check if field is an object\r\n if (!field || typeof field !== 'object') {\r\n errors.push('Form field must be an object');\r\n return { valid: false, errors };\r\n }\r\n \r\n const f = field as Partial<FormField>;\r\n \r\n // Required properties\r\n if (!f.id || typeof f.id !== 'string') {\r\n errors.push('Field must have a valid \"id\" string');\r\n }\r\n \r\n if (!f.type || typeof f.type !== 'string') {\r\n errors.push('Field must have a valid \"type\" string');\r\n }\r\n \r\n if (!f.name || typeof f.name !== 'string') {\r\n errors.push('Field must have a valid \"name\" string');\r\n }\r\n \r\n if (!f.label || typeof f.label !== 'string') {\r\n errors.push('Field must have a valid \"label\" string');\r\n }\r\n \r\n // Validate position\r\n if (!f.position || typeof f.position !== 'object') {\r\n errors.push('Field must have a valid \"position\" object');\r\n } else {\r\n const pos = f.position;\r\n if (typeof pos.x !== 'number') {\r\n errors.push('Field position must have a numeric \"x\" coordinate');\r\n }\r\n if (typeof pos.y !== 'number') {\r\n errors.push('Field position must have a numeric \"y\" coordinate');\r\n }\r\n if (typeof pos.width !== 'number' || pos.width <= 0) {\r\n errors.push('Field position must have a positive \"width\"');\r\n }\r\n if (typeof pos.height !== 'number' || pos.height <= 0) {\r\n errors.push('Field position must have a positive \"height\"');\r\n }\r\n if (typeof pos.page !== 'number' || pos.page < 1) {\r\n errors.push('Field position must have a valid \"page\" number (1-indexed)');\r\n }\r\n }\r\n \r\n if (typeof f.required !== 'boolean') {\r\n errors.push('Field must have a boolean \"required\" property');\r\n }\r\n \r\n // Optional properties validation\r\n if (f.fontSize !== undefined && (typeof f.fontSize !== 'number' || f.fontSize < 8 || f.fontSize > 72)) {\r\n errors.push('Field fontSize must be a number between 8 and 72');\r\n }\r\n \r\n if (f.maxLength !== undefined && (typeof f.maxLength !== 'number' || f.maxLength <= 0)) {\r\n errors.push('Field maxLength must be a positive number');\r\n }\r\n \r\n if (f.options !== undefined && !Array.isArray(f.options)) {\r\n errors.push('Field options must be an array');\r\n }\r\n \r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * Validate PDF URL format\r\n * \r\n * Accepts absolute URLs, relative paths, and data URLs.\r\n * \r\n * @param url - URL to validate\r\n * @returns Validation result with valid flag and optional error message\r\n * \r\n * @example\r\n * ```ts\r\n * // Absolute URLs\r\n * validatePdfUrl('https://example.com/document.pdf'); // valid\r\n * validatePdfUrl('http://localhost:3000/doc.pdf'); // valid\r\n * \r\n * // Relative paths\r\n * validatePdfUrl('/public/document.pdf'); // valid\r\n * validatePdfUrl('./document.pdf'); // valid\r\n * \r\n * // Data URLs and blobs\r\n * validatePdfUrl('data:application/pdf;base64,...'); // valid\r\n * validatePdfUrl('blob:http://localhost/...'); // valid\r\n * \r\n * // Local files\r\n * validatePdfUrl('file:///C:/path/to/file.pdf'); // valid\r\n * ```\r\n */\r\nexport function validatePdfUrl(url: unknown): {\r\n valid: boolean;\r\n error?: string;\r\n} {\r\n if (typeof url !== 'string') {\r\n return { valid: false, error: 'URL must be a string' };\r\n }\r\n \r\n if (!url || url.trim().length === 0) {\r\n return { valid: false, error: 'URL cannot be empty' };\r\n }\r\n \r\n const trimmedUrl = url.trim();\r\n \r\n // Check for absolute URLs with protocols\r\n const validPrefixes = ['http://', 'https://', 'blob:', 'data:', 'file://'];\r\n const hasValidPrefix = validPrefixes.some(prefix => trimmedUrl.startsWith(prefix));\r\n \r\n if (hasValidPrefix) {\r\n return { valid: true };\r\n }\r\n \r\n // Allow relative paths (start with / or ./ or ../)\r\n if (trimmedUrl.startsWith('/') || trimmedUrl.startsWith('./') || trimmedUrl.startsWith('../')) {\r\n return { valid: true };\r\n }\r\n \r\n // Reject URLs that look malformed\r\n return {\r\n valid: false,\r\n error: 'URL must be an absolute URL (http://, https://, blob:, data:, file://) or a relative path (/, ./, ../)',\r\n };\r\n}\r\n\r\n","/**\r\n * PDF utility helper functions\r\n */\r\n\r\nimport { logger } from \"./logger\";\r\nimport { validatePdfBytes } from \"./pdf-validators\";\r\n\r\n/**\r\n * Create a blob URL from PDF bytes for preview\r\n */\r\nexport function createPdfBlobUrl(pdfBytes: Uint8Array): string {\r\n const blob = new Blob([pdfBytes as BlobPart], { type: 'application/pdf' });\r\n return URL.createObjectURL(blob);\r\n}\r\n\r\n/**\r\n * Download PDF file\r\n */\r\nexport function downloadPdf(pdfBytes: Uint8Array, filename: string): void {\r\n const url = createPdfBlobUrl(pdfBytes);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\n/**\r\n * Convert URL to PDF bytes\r\n * @param url - The URL to fetch the PDF from\r\n * @returns PDF bytes as Uint8Array\r\n */\r\nexport async function urlToPdfBytes(url: string): Promise<Uint8Array> {\r\n try {\r\n const response = await fetch(url);\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch PDF: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n\r\n // Create a new Uint8Array and copy the data to avoid detached ArrayBuffer issues\r\n const pdfBytes = new Uint8Array(arrayBuffer.byteLength);\r\n pdfBytes.set(new Uint8Array(arrayBuffer));\r\n\r\n // Validate that we have a PDF\r\n const validation = validatePdfBytes(pdfBytes);\r\n if (!validation.valid) {\r\n throw new Error(validation.error || 'Invalid PDF format');\r\n }\r\n\r\n return pdfBytes;\r\n } catch (error) {\r\n logger.error('Error fetching PDF from URL:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Validate that data is a valid PDF\r\n */\r\nexport function isValidPdf(pdfBytes: Uint8Array): boolean {\r\n const validation = validatePdfBytes(pdfBytes);\r\n return validation.valid;\r\n}\r\n\r\n/**\r\n * Convert base64 data URL to image bytes\r\n */\r\nexport function dataUrlToBytes(dataUrl: string): Uint8Array {\r\n const base64Data = dataUrl.split(',')[1];\r\n if (!base64Data) {\r\n throw new Error('Invalid data URL format: missing base64 data');\r\n }\r\n return Uint8Array.from(atob(base64Data), (c) => c.charCodeAt(0));\r\n}\r\n\r\n/**\r\n * Format field name for display\r\n */\r\nexport function formatFieldName(fieldName: string): string {\r\n return fieldName\r\n .replace(/[_-]/g, ' ')\r\n .replace(/\\b\\w/g, (l) => l.toUpperCase())\r\n .replace('Signature', '')\r\n .replace('Initials', '')\r\n .trim();\r\n}\r\n\r\n/**\r\n * Check if a field is a signature field\r\n */\r\nexport function isSignatureField(fieldName: string): boolean {\r\n return fieldName.toLowerCase().includes('signature');\r\n}\r\n\r\n/**\r\n * Check if a field is an initials field\r\n */\r\nexport function isInitialsField(fieldName: string): boolean {\r\n return fieldName.toLowerCase().includes('initials');\r\n}\r\n\r\n","/**\r\n * Lazy loader for pdf-lib\r\n * \r\n * This module provides a lazy loading mechanism for the pdf-lib library (~150KB).\r\n * By deferring the import until actually needed, we can significantly reduce\r\n * the initial bundle size for consumers who only view PDFs without filling forms.\r\n * \r\n * The pdf-lib library is only loaded when:\r\n * - fillPdf() is called\r\n * - combinePdfs() is called\r\n * - Other PDF manipulation functions are used\r\n */\r\n\r\n// Cache the promise to ensure we only import once\r\nlet pdfLibPromise: Promise<typeof import('pdf-lib')> | null = null;\r\n\r\n/**\r\n * Dynamically import pdf-lib library\r\n * \r\n * This function lazily loads pdf-lib only when needed. The import is cached\r\n * so subsequent calls return the same promise, avoiding multiple imports.\r\n * \r\n * @returns Promise resolving to the pdf-lib module\r\n * \r\n * @example\r\n * ```typescript\r\n * const { PDFDocument, rgb, StandardFonts } = await loadPdfLib();\r\n * const pdfDoc = await PDFDocument.load(pdfBytes);\r\n * ```\r\n */\r\nexport async function loadPdfLib() {\r\n if (!pdfLibPromise) {\r\n pdfLibPromise = import('pdf-lib');\r\n }\r\n return pdfLibPromise;\r\n}\r\n\r\n/**\r\n * Check if pdf-lib has been loaded\r\n * \r\n * Useful for debugging and testing to verify lazy loading behavior.\r\n * \r\n * @returns true if pdf-lib has been loaded, false otherwise\r\n */\r\nexport function isPdfLibLoaded(): boolean {\r\n return pdfLibPromise !== null;\r\n}\r\n\r\n/**\r\n * Reset the pdf-lib cache (primarily for testing)\r\n * \r\n * This should only be used in test environments to reset state\r\n * between tests.\r\n * \r\n * @internal\r\n */\r\nexport function resetPdfLibCache(): void {\r\n pdfLibPromise = null;\r\n}\r\n\r\n","/**\r\n * Field Visibility Utilities\r\n * Core logic for determining which fields are visible/editable in multi-signer mode\r\n * \r\n * CRITICAL: This logic must work identically in both flows:\r\n * - Single-signer flow: isMultiSigner = false, all fields visible\r\n * - Multi-signer flow: isMultiSigner = true, filtered by assignment rules\r\n */\r\n\r\nimport type { EsignFormField, MultiSignerContext } from '../types';\r\n\r\n/**\r\n * Determine if a field should be visible to the current signer\r\n * \r\n * Implements the 5-rule visibility logic used throughout the application:\r\n * - Rule 1: Unassigned fields → only final signer sees them\r\n * - Rule 2: Direct assignment → show if assigned to current signer\r\n * - Rule 3: Recipients group → only primary signers (signOrder === 1)\r\n * - Rule 4: Signers group → only final signer\r\n * - Rule 5: Assigned to different signer → hide\r\n * \r\n * @param field - The form field to check\r\n * @param multiSignerContext - Multi-signer context with current signer info\r\n * @returns true if field should be visible, false if hidden\r\n * \r\n * @example Single-signer flow\r\n * ```ts\r\n * const context = { isMultiSigner: false, ... };\r\n * isFieldVisibleToSigner(anyField, context); // always returns true\r\n * ```\r\n * \r\n * @example Multi-signer flow\r\n * ```ts\r\n * const context = {\r\n * isMultiSigner: true,\r\n * currentSignerEmail: 'signer1@example.com',\r\n * isPrimarySigner: true,\r\n * isFinalSigner: false\r\n * };\r\n * \r\n * // Unassigned field - only final signer sees it\r\n * isFieldVisibleToSigner({ assignedSignerEmail: undefined, ... }, context); // false\r\n * \r\n * // Direct assignment to current signer\r\n * isFieldVisibleToSigner({ assignedSignerEmail: 'signer1@example.com', ... }, context); // true\r\n * \r\n * // Recipients group - primary signer sees it\r\n * isFieldVisibleToSigner({ assignedSignerEmail: 'recipients', ... }, context); // true\r\n * ```\r\n */\r\nexport function isFieldVisibleToSigner(\r\n field: EsignFormField,\r\n multiSignerContext: MultiSignerContext\r\n): boolean {\r\n // Single-signer mode: all fields are visible\r\n if (!multiSignerContext.isMultiSigner) {\r\n return true;\r\n }\r\n\r\n const { currentSignerEmail, isPrimarySigner, isFinalSigner } = multiSignerContext;\r\n\r\n // RULE 1: Unassigned fields - only final signer sees them\r\n if (!field.assignedSignerEmail) {\r\n return isFinalSigner;\r\n }\r\n\r\n // RULE 2: Direct assignment - show if assigned to current signer\r\n if (field.assignedSignerEmail === currentSignerEmail) {\r\n return true;\r\n }\r\n\r\n // RULE 3: Recipients group - only primary signers (signOrder === 1)\r\n if (field.assignedSignerEmail.includes('recipients')) {\r\n return isPrimarySigner;\r\n }\r\n\r\n // RULE 4: Signers group - only final signer\r\n if (field.assignedSignerEmail.includes('signers')) {\r\n return isFinalSigner;\r\n }\r\n\r\n // RULE 5: Assigned to different signer - hide\r\n return false;\r\n}\r\n\r\n/**\r\n * Filter an array of fields to only those visible to the current signer\r\n * \r\n * @param fields - All form fields\r\n * @param multiSignerContext - Multi-signer context\r\n * @returns Filtered array of visible fields\r\n * \r\n * @example\r\n * ```ts\r\n * const allFields = [...]; // 10 fields\r\n * const context = { isMultiSigner: true, isPrimarySigner: true, ... };\r\n * const visible = filterFieldsBySigner(allFields, context); // 5 fields (only primary signer's)\r\n * ```\r\n */\r\nexport function filterFieldsBySigner(\r\n fields: EsignFormField[],\r\n multiSignerContext: MultiSignerContext\r\n): EsignFormField[] {\r\n // Single-signer mode: return all fields\r\n if (!multiSignerContext.isMultiSigner) {\r\n return fields;\r\n }\r\n\r\n // Multi-signer mode: filter using visibility logic\r\n return fields.filter(field => isFieldVisibleToSigner(field, multiSignerContext));\r\n}\r\n\r\n/**\r\n * Determine if a field should be flattened (made non-editable) by the current signer\r\n * \r\n * Used during PDF submission to determine which fields to flatten.\r\n * In multi-signer mode, only flatten fields assigned to current signer.\r\n * In single-signer mode, flatten all fields.\r\n * \r\n * CRITICAL: This affects PDF flattening behavior - must preserve exact logic!\r\n * \r\n * @param field - The form field to check\r\n * @param multiSignerContext - Multi-signer context\r\n * @returns true if current signer should flatten this field\r\n * \r\n * @example Single-signer flow\r\n * ```ts\r\n * const context = { isMultiSigner: false, ... };\r\n * shouldFlattenField(anyField, context); // always returns true\r\n * ```\r\n * \r\n * @example Multi-signer flow\r\n * ```ts\r\n * const context = {\r\n * isMultiSigner: true,\r\n * currentSignerEmail: 'signer1@example.com',\r\n * isPrimarySigner: true,\r\n * isFinalSigner: false\r\n * };\r\n * \r\n * // Current signer's field - flatten it\r\n * shouldFlattenField({ assignedSignerEmail: 'signer1@example.com', ... }, context); // true\r\n * \r\n * // Different signer's field - don't flatten (keep editable for them)\r\n * shouldFlattenField({ assignedSignerEmail: 'signer2@example.com', ... }, context); // false\r\n * \r\n * // Unassigned field - only final signer flattens\r\n * shouldFlattenField({ assignedSignerEmail: undefined, ... }, context); // false (not final)\r\n * ```\r\n */\r\nexport function shouldFlattenField(\r\n field: EsignFormField,\r\n multiSignerContext: MultiSignerContext\r\n): boolean {\r\n // Single-signer mode: flatten all fields\r\n if (!multiSignerContext.isMultiSigner) {\r\n return true;\r\n }\r\n\r\n const { currentSignerEmail, isPrimarySigner, isFinalSigner } = multiSignerContext;\r\n\r\n // RULE 1: Unassigned fields - only final signer flattens them\r\n if (!field.assignedSignerEmail) {\r\n return isFinalSigner;\r\n }\r\n\r\n // RULE 2: Direct assignment - flatten if assigned to current signer\r\n if (field.assignedSignerEmail === currentSignerEmail) {\r\n return true;\r\n }\r\n\r\n // RULE 3: Recipients group - only primaries flatten them\r\n if (field.assignedSignerEmail.includes('recipients')) {\r\n return isPrimarySigner;\r\n }\r\n\r\n // RULE 4: Signers group - only final signer flattens them\r\n if (field.assignedSignerEmail.includes('signers')) {\r\n return isFinalSigner;\r\n }\r\n\r\n // RULE 5: Assigned to different signer - DON'T flatten (keep editable for them)\r\n return false;\r\n}\r\n\r\n","/**\r\n * PDF Widget Helper Utilities\r\n * Common utilities for working with PDF widgets and pages\r\n * \r\n * Used across pdf-manipulation.ts and pdf-viewer-filter.ts\r\n */\r\n\r\nimport type { PDFPage } from 'pdf-lib';\r\n\r\n/**\r\n * Extended type for PDF pages with ref property\r\n */\r\ninterface PDFPageWithRef {\r\n ref: unknown;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Find the page index for a given page reference\r\n * \r\n * This is a common pattern used when working with PDF widgets to determine\r\n * which page a widget belongs to by comparing page references.\r\n * \r\n * @param pages - Array of PDF pages\r\n * @param pageRef - The page reference to search for\r\n * @returns Page index (0-based), or -1 if not found\r\n * \r\n * @example\r\n * ```ts\r\n * const widget = widgets[0];\r\n * const pageRef = widget.P?.();\r\n * const pageIndex = findPageIndexByRef(pages, pageRef);\r\n * if (pageIndex >= 0) {\r\n * const page = pages[pageIndex];\r\n * // Draw on the page\r\n * }\r\n * ```\r\n */\r\nexport function findPageIndexByRef(\r\n pages: PDFPage[],\r\n pageRef: unknown\r\n): number {\r\n if (!pageRef) return -1;\r\n \r\n for (let i = 0; i < pages.length; i++) {\r\n const page = pages[i] as unknown as PDFPageWithRef;\r\n if (page.ref === pageRef) {\r\n return i;\r\n }\r\n }\r\n \r\n return -1;\r\n}\r\n\r\n/**\r\n * Extended type for PDF widgets with rectangle and page methods\r\n */\r\nexport interface PDFWidgetWithExtensions {\r\n getRectangle?: () => { x: number; y: number; width: number; height: number } | undefined;\r\n P?: () => unknown;\r\n}\r\n\r\n/**\r\n * Get widget rectangle and its page\r\n * \r\n * Helper to extract both the rectangle coordinates and the page that a widget\r\n * belongs to in a single operation.\r\n * \r\n * @param widget - The PDF widget\r\n * @param pages - Array of PDF pages\r\n * @returns Object with rect, page, and pageIndex, or null if unable to determine\r\n * \r\n * @example\r\n * ```ts\r\n * for (const widget of widgets) {\r\n * const result = getWidgetRectangleAndPage(widget, pages);\r\n * if (result) {\r\n * const { rect, page, pageIndex } = result;\r\n * // Draw something at rect coordinates on page\r\n * page.drawRectangle({ x: rect.x, y: rect.y, ... });\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport function getWidgetRectangleAndPage(\r\n widget: PDFWidgetWithExtensions,\r\n pages: PDFPage[]\r\n): {\r\n rect: { x: number; y: number; width: number; height: number };\r\n page: PDFPage;\r\n pageIndex: number;\r\n} | null {\r\n const rect = widget.getRectangle?.();\r\n if (!rect) return null;\r\n \r\n const pageRef = widget.P?.();\r\n if (!pageRef) return null;\r\n \r\n const pageIndex = findPageIndexByRef(pages, pageRef);\r\n if (pageIndex === -1) return null;\r\n \r\n const page = pages[pageIndex];\r\n if (!page) return null;\r\n \r\n return { rect, page, pageIndex };\r\n}\r\n\r\n/**\r\n * Find page index with fallback to single-page PDFs\r\n * \r\n * Same as findPageIndexByRef but with a fallback: if pageRef lookup fails\r\n * and there's only one page in the document, returns index 0.\r\n * \r\n * This is useful for label drawing where single-page PDFs might not have\r\n * proper page references but we can safely assume page 0.\r\n * \r\n * @param pages - Array of PDF pages\r\n * @param pageRef - The page reference to search for\r\n * @returns Page index (0-based), 0 if single-page PDF, or -1 if not found\r\n * \r\n * @example\r\n * ```ts\r\n * // Used in pdf-viewer-filter for label drawing\r\n * const pageIndex = findPageIndexWithFallback(pages, pageRef);\r\n * if (pageIndex >= 0) {\r\n * const page = pages[pageIndex];\r\n * page.drawText(label, ...);\r\n * }\r\n * ```\r\n */\r\nexport function findPageIndexWithFallback(\r\n pages: PDFPage[],\r\n pageRef: unknown\r\n): number {\r\n if (!pageRef) {\r\n // No page ref - fallback to page 0 if single-page PDF\r\n return pages.length === 1 ? 0 : -1;\r\n }\r\n \r\n const pageIndex = findPageIndexByRef(pages, pageRef);\r\n \r\n // If not found but single-page PDF, assume page 0\r\n if (pageIndex === -1 && pages.length === 1) {\r\n return 0;\r\n }\r\n \r\n return pageIndex;\r\n}\r\n\r\n","/**\r\n * PDF Field Type Helper Utilities\r\n * Common utilities for detecting field types and extracting values\r\n * \r\n * Used across pdf-manipulation.ts for consistent field processing\r\n */\r\n\r\n/**\r\n * PDF form field type for operations\r\n */\r\ninterface PDFFormField {\r\n getName(): string;\r\n constructor: { name: string };\r\n getText?(): string;\r\n setText?(text: string): void;\r\n isRequired?(): boolean;\r\n isChecked?(): boolean;\r\n getSelected?(): string[];\r\n enableReadOnly?(): void;\r\n}\r\n\r\n/**\r\n * Detect the field type from a PDF field\r\n * \r\n * Maps pdf-lib's field constructor names to standardized type strings.\r\n * \r\n * @param field - The PDF form field\r\n * @returns Standardized field type string\r\n * \r\n * @example\r\n * ```ts\r\n * const fieldType = detectFieldType(field);\r\n * // Returns: 'text', 'checkbox', 'dropdown', 'radiogroup', 'signature', etc.\r\n * ```\r\n */\r\nexport function detectFieldType(field: PDFFormField): string {\r\n const typeName = field.constructor.name;\r\n \r\n if (typeName === 'PDFTextField') {\r\n return 'text';\r\n } else if (typeName === 'PDFCheckBox') {\r\n return 'checkbox';\r\n } else if (typeName === 'PDFDropdown') {\r\n return 'dropdown';\r\n } else if (typeName === 'PDFOptionList') {\r\n return 'optionlist';\r\n } else if (typeName === 'PDFRadioGroup') {\r\n return 'radiogroup';\r\n } else if (typeName === 'PDFSignature') {\r\n return 'signature';\r\n }\r\n \r\n return 'unknown';\r\n}\r\n\r\n/**\r\n * Extract the current value from a PDF field based on its type\r\n * \r\n * Handles different field types appropriately:\r\n * - Text fields: getText()\r\n * - Checkboxes: isChecked() → 'true'/'false'\r\n * - Dropdowns: getSelected()[0]\r\n * - Radio groups: getSelected()[0]\r\n * \r\n * @param field - The PDF form field\r\n * @param fieldType - The field type (from detectFieldType)\r\n * @returns The field value as a string, or empty string if no value\r\n * \r\n * @example\r\n * ```ts\r\n * const fieldType = detectFieldType(field);\r\n * const value = extractFieldValue(field, fieldType);\r\n * ```\r\n */\r\nexport function extractFieldValue(field: PDFFormField, fieldType: string): string {\r\n try {\r\n switch (fieldType) {\r\n case 'text':\r\n return field.getText?.() || '';\r\n \r\n case 'checkbox':\r\n return field.isChecked?.() ? 'true' : 'false';\r\n \r\n case 'dropdown':\r\n case 'optionlist':\r\n case 'radiogroup':\r\n return field.getSelected?.()?.[0] || '';\r\n \r\n default:\r\n return '';\r\n }\r\n } catch (error) {\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Check if a field is required based on field metadata and name patterns\r\n * \r\n * Attempts to determine required status through:\r\n * 1. field.isRequired() method (if available)\r\n * 2. Field name patterns (signature, initials, required)\r\n * 3. Field type (signatures are always required)\r\n * \r\n * @param field - The PDF form field\r\n * @param fieldName - The field name\r\n * @param fieldType - The field type (from detectFieldType)\r\n * @returns true if field is required\r\n * \r\n * @example\r\n * ```ts\r\n * const isRequired = isRequiredField(field, 'signature_1', 'text');\r\n * // Returns: true (signature fields are required)\r\n * ```\r\n */\r\nexport function isRequiredField(\r\n field: PDFFormField,\r\n fieldName: string,\r\n fieldType: string\r\n): boolean {\r\n // Signature fields are always required\r\n if (fieldType === 'signature') {\r\n return true;\r\n }\r\n \r\n // Try the isRequired method if available\r\n try {\r\n if (field.isRequired?.()) {\r\n return true;\r\n }\r\n } catch {\r\n // isRequired() not available or threw error\r\n }\r\n \r\n // Check field name patterns\r\n if (\r\n fieldName.includes('signature') ||\r\n fieldName.includes('initials') ||\r\n fieldName.includes('required')\r\n ) {\r\n return true;\r\n }\r\n \r\n return false;\r\n}\r\n\r\n","/**\r\n * PDF Manipulation Utilities\r\n * Core utilities for PDF processing, page manipulation, and file combining\r\n */\r\n\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\nimport { loadPdfLib } from './pdf-lib-loader';\r\nimport { \r\n PdfPage, \r\n EsignFormField, \r\n FormFieldType, \r\n FormFieldPosition,\r\n MultiSignerContext \r\n} from '../types';\r\nimport { logger } from './logger';\r\nimport { validatePdfBytes, isAutoGeneratedLabel } from './pdf-validators';\r\nimport { isFieldVisibleToSigner, shouldFlattenField } from './field-visibility';\r\nimport { findPageIndexByRef, getWidgetRectangleAndPage, type PDFWidgetWithExtensions } from './pdf-widget-helpers';\r\nimport { detectFieldType, extractFieldValue, isRequiredField } from './pdf-field-type-helpers';\r\n\r\n// PDF.js worker is automatically configured by pdfjs-config module\r\n\r\n// Type definitions for PDF internal structures\r\ninterface PDFFieldWithAcro {\r\n getName(): string;\r\n acroField?: {\r\n getWidgets?: () => PDFWidget[];\r\n };\r\n constructor: { name: string };\r\n}\r\n\r\ninterface PDFWidget {\r\n getRectangle?: () => { x: number; y: number; width: number; height: number };\r\n P?: () => unknown;\r\n}\r\n\r\n/**\r\n * Convert PDF pages to images for rendering in the UI using PDF.js\r\n */\r\nexport async function pdfToImages(\r\n pdfBytes: Uint8Array,\r\n options?: { hideFormFields?: boolean }\r\n): Promise<PdfPage[]> {\r\n try {\r\n // Validate PDF bytes\r\n const validation = validatePdfBytes(pdfBytes);\r\n if (!validation.valid) {\r\n logger.error('Invalid PDF:', validation.error);\r\n throw new Error(validation.error || 'Invalid PDF format');\r\n }\r\n\r\n // Load PDF with PDF.js\r\n const loadingTask = pdfjsLib.getDocument({\r\n data: pdfBytes,\r\n verbosity: 0,\r\n });\r\n const pdfDoc = await loadingTask.promise;\r\n\r\n const pages: PdfPage[] = [];\r\n\r\n // Try to load with pdf-lib for dimension comparison\r\n let pdfLibDoc = null;\r\n try {\r\n const { PDFDocument } = await loadPdfLib();\r\n pdfLibDoc = await PDFDocument.load(pdfBytes);\r\n } catch {\r\n // PDF.js dimensions will be used instead\r\n }\r\n\r\n for (let pageNum = 1; pageNum <= pdfDoc.numPages; pageNum++) {\r\n const page = await pdfDoc.getPage(pageNum);\r\n const viewport = page.getViewport({ scale: 2.0 });\r\n\r\n // Get actual PDF dimensions\r\n let pdfWidth = viewport.width / 2.0;\r\n let pdfHeight = viewport.height / 2.0;\r\n\r\n // Use pdf-lib dimensions if available for consistency\r\n if (pdfLibDoc) {\r\n try {\r\n const pdfLibPage = pdfLibDoc.getPage(pageNum - 1);\r\n pdfWidth = pdfLibPage.getWidth();\r\n pdfHeight = pdfLibPage.getHeight();\r\n } catch {\r\n // Use PDF.js dimensions as fallback\r\n }\r\n }\r\n\r\n // Create canvas at the scaled size for high quality rendering\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d')!;\r\n canvas.height = viewport.height;\r\n canvas.width = viewport.width;\r\n\r\n // Render PDF page to canvas\r\n const hideFormFields = options?.hideFormFields ?? false;\r\n const renderContext: any = {\r\n canvasContext: context,\r\n viewport: viewport,\r\n renderInteractiveForms: !hideFormFields,\r\n ...(hideFormFields && {\r\n annotationMode: 0,\r\n renderAnnotations: false,\r\n renderForms: false,\r\n }),\r\n };\r\n\r\n await page.render(renderContext).promise;\r\n\r\n // Convert canvas to data URL\r\n const imageUrl = canvas.toDataURL('image/png');\r\n\r\n pages.push({\r\n pageNumber: pageNum,\r\n width: pdfWidth,\r\n height: pdfHeight,\r\n imageUrl,\r\n renderWidth: viewport.width,\r\n renderHeight: viewport.height,\r\n });\r\n }\r\n\r\n return pages;\r\n } catch (error) {\r\n logger.error('Error converting PDF to images with PDF.js:', error);\r\n return await fallbackPdfToImages(pdfBytes);\r\n }\r\n}\r\n\r\n/**\r\n * Fallback function to create placeholder images when PDF.js fails\r\n */\r\nasync function fallbackPdfToImages(pdfBytes: Uint8Array): Promise<PdfPage[]> {\r\n try {\r\n const { PDFDocument } = await loadPdfLib();\r\n const pdf = await PDFDocument.load(pdfBytes);\r\n const pages: PdfPage[] = [];\r\n\r\n for (let i = 0; i < pdf.getPageCount(); i++) {\r\n const page = pdf.getPage(i);\r\n const { width, height } = page.getSize();\r\n \r\n // Create placeholder canvas\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d')!;\r\n \r\n const scale = 1.5;\r\n canvas.width = width * scale;\r\n canvas.height = height * scale;\r\n \r\n // Draw placeholder\r\n context.fillStyle = '#ffffff';\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n context.strokeStyle = '#e5e7eb';\r\n context.lineWidth = 2;\r\n context.strokeRect(0, 0, canvas.width, canvas.height);\r\n context.fillStyle = '#6b7280';\r\n context.font = 'bold 24px system-ui';\r\n context.textAlign = 'center';\r\n context.fillText(`Page ${i + 1}`, canvas.width / 2, canvas.height / 2 - 20);\r\n context.font = '16px system-ui';\r\n context.fillStyle = '#9ca3af';\r\n context.fillText('PDF preview not available', canvas.width / 2, canvas.height / 2 + 20);\r\n \r\n const imageUrl = canvas.toDataURL('image/png');\r\n \r\n pages.push({\r\n pageNumber: i + 1,\r\n width,\r\n height,\r\n imageUrl,\r\n renderWidth: canvas.width,\r\n renderHeight: canvas.height,\r\n });\r\n }\r\n\r\n return pages;\r\n } catch (error) {\r\n logger.error('Error with pdf-lib fallback:', error);\r\n // Return single error page\r\n return [createErrorPage()];\r\n }\r\n}\r\n\r\n/**\r\n * Create an error page when all processing fails\r\n */\r\nfunction createErrorPage(): PdfPage {\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d')!;\r\n canvas.width = 600;\r\n canvas.height = 800;\r\n \r\n context.fillStyle = '#ffffff';\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n context.strokeStyle = '#e5e7eb';\r\n context.lineWidth = 2;\r\n context.strokeRect(0, 0, canvas.width, canvas.height);\r\n context.fillStyle = '#ef4444';\r\n context.font = 'bold 20px system-ui';\r\n context.textAlign = 'center';\r\n context.fillText('PDF Processing Error', canvas.width / 2, canvas.height / 2 - 20);\r\n context.font = '14px system-ui';\r\n context.fillStyle = '#6b7280';\r\n context.fillText('Unable to process the uploaded PDF file', canvas.width / 2, canvas.height / 2 + 20);\r\n \r\n return {\r\n pageNumber: 1,\r\n width: 600,\r\n height: 800,\r\n imageUrl: canvas.toDataURL('image/png'),\r\n renderWidth: canvas.width,\r\n renderHeight: canvas.height,\r\n };\r\n}\r\n\r\n// Type definitions for PDF form field operations\r\ninterface PDFFormField {\r\n getName(): string;\r\n constructor: { name: string };\r\n getText?(): string;\r\n setText?(text: string): void;\r\n isRequired?(): boolean;\r\n isChecked?(): boolean;\r\n getSelected?(): string[];\r\n enableReadOnly?(): void;\r\n}\r\n\r\ninterface PDFFormFieldWithAcro extends PDFFormField {\r\n acroField: {\r\n getWidgets(): unknown[];\r\n removeWidget(index: number): void;\r\n };\r\n}\r\n\r\ninterface PDFDict {\r\n get(key: unknown): unknown;\r\n delete(key: unknown): void;\r\n}\r\n\r\n/**\r\n * Remove all existing form fields from a PDF using robust widget cleanup\r\n * @param pdfBytes - The PDF bytes\r\n * @param stripAllAnnotations - If true, removes all annotations from pages (more aggressive cleanup)\r\n * @returns The PDF bytes with all form fields removed\r\n */\r\nexport async function removeAllFormFields(pdfBytes: Uint8Array, stripAllAnnotations = false): Promise<Uint8Array> {\r\n try {\r\n // Validate PDF data first\r\n const validation = validatePdfBytes(pdfBytes);\r\n if (!validation.valid) {\r\n return pdfBytes;\r\n }\r\n \r\n const { PDFDocument } = await loadPdfLib();\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n \r\n if (stripAllAnnotations) {\r\n // More aggressive approach: strip all annotations from all pages\r\n const pages = pdfDoc.getPages();\r\n \r\n for (let i = 0; i < pages.length; i++) {\r\n const page = pages[i];\r\n \r\n try {\r\n // Access the page's annotation array\r\n const pageRef = (page as any).ref;\r\n const pageDictObj = pdfDoc.context.lookup(pageRef);\r\n \r\n if (pageDictObj) {\r\n const pageDict = pageDictObj as unknown as PDFDict;\r\n \r\n if (pageDict && pageDict.get && pageDict.delete) {\r\n const annotsRef = pageDict.get((pdfDoc.context as any).obj('Annots'));\r\n \r\n if (annotsRef) {\r\n pageDict.delete((pdfDoc.context as any).obj('Annots'));\r\n }\r\n } else {\r\n }\r\n } else {\r\n }\r\n } catch (pageError) {\r\n }\r\n }\r\n } else {\r\n // Robust widget-based removal approach\r\n const form = pdfDoc.getForm();\r\n const fields = form.getFields();\r\n \r\n if (fields.length === 0) {\r\n return pdfBytes;\r\n }\r\n \r\n // Remove all fields using robust widget cleanup\r\n for (const field of fields) {\r\n try {\r\n const acroField = (field as unknown as PDFFormFieldWithAcro).acroField;\r\n if (acroField && typeof acroField.getWidgets === 'function') {\r\n let widgets = acroField.getWidgets();\r\n \r\n // Remove widgets one by one with safety counter\r\n let safetyCounter = 0;\r\n const maxIterations = widgets.length + 5;\r\n \r\n while (widgets.length > 0 && safetyCounter < maxIterations) {\r\n try {\r\n const widgetIndex = widgets.length - 1;\r\n acroField.removeWidget(widgetIndex);\r\n widgets = acroField.getWidgets();\r\n } catch (widgetError) {\r\n break;\r\n }\r\n safetyCounter++;\r\n }\r\n \r\n if (safetyCounter >= maxIterations) {\r\n }\r\n }\r\n \r\n form.removeField(field as any);\r\n } catch (error) {\r\n \r\n try {\r\n form.removeField(field as any);\r\n } catch (fallbackError) {\r\n }\r\n }\r\n }\r\n \r\n const remainingFields = form.getFields();\r\n if (remainingFields.length > 0) {\r\n }\r\n }\r\n \r\n const updatedPdfBytes = await pdfDoc.save();\r\n return updatedPdfBytes;\r\n } catch (error) {\r\n logger.error('Error removing form fields from PDF:', error);\r\n return pdfBytes;\r\n }\r\n}\r\n\r\n/**\r\n * Read existing PDF form fields and their properties\r\n */\r\nexport async function readPdfFormFields(pdfBytes: Uint8Array): Promise<{\r\n name: string;\r\n type: string;\r\n required: boolean;\r\n value?: string;\r\n}[]> {\r\n try {\r\n // Validate PDF data first\r\n const validation = validatePdfBytes(pdfBytes);\r\n if (!validation.valid) {\r\n return [];\r\n }\r\n \r\n const { PDFDocument } = await loadPdfLib();\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const form = pdfDoc.getForm();\r\n const fields = form.getFields();\r\n \r\n if (fields.length === 0) {\r\n return [];\r\n }\r\n \r\n const formFields = fields.map(field => {\r\n const fieldName = field.getName();\r\n const pdfField = field as unknown as PDFFormField;\r\n \r\n try {\r\n // Use centralized field type detection and value extraction\r\n const fieldType = detectFieldType(pdfField);\r\n const value = extractFieldValue(pdfField, fieldType);\r\n const required = isRequiredField(pdfField, fieldName, fieldType);\r\n \r\n return {\r\n name: fieldName,\r\n type: fieldType,\r\n required,\r\n value\r\n };\r\n } catch (fieldError) {\r\n // Fallback to defaults on error\r\n return {\r\n name: fieldName,\r\n type: 'text',\r\n required: false,\r\n value: ''\r\n };\r\n }\r\n });\r\n \r\n return formFields;\r\n } catch (error) {\r\n logger.error('Error reading PDF form fields:', error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Read current PDF form field values (including user-filled data)\r\n */\r\nexport async function readCurrentPdfFormValues(pdfBytes: Uint8Array): Promise<Record<string, string>> {\r\n try {\r\n if (!pdfBytes || pdfBytes.length === 0) {\r\n return {};\r\n }\r\n \r\n const { PDFDocument } = await loadPdfLib();\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const form = pdfDoc.getForm();\r\n const fields = form.getFields();\r\n \r\n const currentValues: Record<string, string> = {};\r\n \r\n for (const field of fields) {\r\n const fieldName = field.getName();\r\n const pdfField = field as unknown as PDFFormField;\r\n \r\n try {\r\n // Use centralized field type detection and value extraction\r\n const fieldType = detectFieldType(pdfField);\r\n const value = extractFieldValue(pdfField, fieldType);\r\n \r\n currentValues[fieldName] = value;\r\n } catch (fieldError) {\r\n currentValues[fieldName] = '';\r\n }\r\n }\r\n \r\n return currentValues;\r\n } catch (error) {\r\n logger.error('Error reading current PDF form values:', error);\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Validate PDF form fields against provided values\r\n * In multi-signer mode, only validates fields visible to the current signer\r\n */\r\nexport async function validatePdfFormFields(\r\n pdfBytes: Uint8Array,\r\n fieldValues: Record<string, string>,\r\n signatures: Record<string, string>,\r\n extractedFields?: EsignFormField[], // Pass extracted fields to know which are visible\r\n multiSignerContext?: MultiSignerContext // Pass context to filter validation\r\n): Promise<string[]> {\r\n try {\r\n const pdfFormFields = await readPdfFormFields(pdfBytes);\r\n const errors: string[] = [];\r\n \r\n \r\n for (const field of pdfFormFields) {\r\n if (field.required) {\r\n // In multi-signer mode, only validate fields visible to current signer\r\n if (multiSignerContext?.isMultiSigner && extractedFields) {\r\n const extractedField = extractedFields.find(f => f.name === field.name);\r\n if (!extractedField) {\r\n // Field not in extractedFields means it's not visible to current signer\r\n continue;\r\n }\r\n }\r\n \r\n let hasValue = false;\r\n const fieldValue = fieldValues[field.name];\r\n const signatureValue = signatures[field.name];\r\n const mainSignature = signatures['signature_field_main'];\r\n const mainInitials = signatures['initials_field_main'] || fieldValues['initials_field_main'];\r\n \r\n if (field.name.includes('signature') || field.type === 'signature') {\r\n hasValue = !!(signatureValue || fieldValue || mainSignature);\r\n } else if (field.name.includes('initials')) {\r\n hasValue = !!(signatureValue || fieldValue || mainInitials);\r\n } else {\r\n hasValue = !!(fieldValue || field.value);\r\n }\r\n \r\n if (!hasValue) {\r\n let friendlyName = field.name.replace(/[_-]/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase());\r\n \r\n if (field.name.includes('signature')) {\r\n friendlyName = 'Signature';\r\n } else if (field.name.includes('initials')) {\r\n friendlyName = 'Initials';\r\n }\r\n \r\n errors.push(`${friendlyName} is required`);\r\n }\r\n }\r\n }\r\n \r\n return errors;\r\n } catch (error) {\r\n logger.error('Error validating PDF form fields:', error);\r\n return ['Unable to validate form fields. Please ensure all required fields are completed.'];\r\n }\r\n}\r\n\r\n/**\r\n * Validate PDF form fields against current form state\r\n */\r\nexport async function validateCurrentPdfState(\r\n pdfBytes: Uint8Array,\r\n signatures: Record<string, string>,\r\n formFieldValues: Record<string, string> = {}\r\n): Promise<string[]> {\r\n try {\r\n const pdfFormFields = await readPdfFormFields(pdfBytes);\r\n const currentValues = await readCurrentPdfFormValues(pdfBytes);\r\n const errors: string[] = [];\r\n \r\n for (const field of pdfFormFields) {\r\n const isSignatureField = field.name.includes('signature') && field.type === 'text';\r\n const isInitialsField = field.name.includes('initials') && field.type === 'text';\r\n \r\n if (field.required || isSignatureField || isInitialsField) {\r\n let hasValue = false;\r\n const currentValue = currentValues[field.name] || '';\r\n \r\n if (isSignatureField) {\r\n hasValue = !!signatures[field.name];\r\n } else if (isInitialsField) {\r\n hasValue = !!signatures[field.name] || !!(formFieldValues[field.name]?.trim()) || currentValue.trim() !== '';\r\n } else {\r\n hasValue = currentValue.trim() !== '';\r\n }\r\n \r\n if (!hasValue) {\r\n let friendlyName = field.name.replace(/[_-]/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase());\r\n \r\n if (field.name.includes('signature')) {\r\n friendlyName = 'Signature';\r\n } else if (field.name.includes('initials')) {\r\n friendlyName = 'Initials';\r\n }\r\n \r\n errors.push(`${friendlyName} is required`);\r\n }\r\n }\r\n }\r\n \r\n return errors;\r\n } catch (error) {\r\n logger.error('Error validating current PDF state:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Fill PDF with signature images and form field values, then flatten the form\r\n * @param pdfBytes - The PDF bytes\r\n * @param signatures - The signature data URLs (field name -> base64 PNG)\r\n * @param formFieldValues - The form field values to fill\r\n * @returns The filled and flattened PDF bytes\r\n */\r\nexport async function fillPdfWithSignatures(\r\n pdfBytes: Uint8Array,\r\n signatures: Record<string, string>,\r\n formFieldValues: Record<string, string> = {},\r\n currentSignerEmail?: string,\r\n extractedFormFields?: EsignFormField[],\r\n metadata?: { submissionId?: string; documentId?: string; author?: string; signerEmail?: string; signerInitials?: string; createdAt?: Date },\r\n auditTrail?: { userAgent?: string; screenResolution?: string; timezone?: string; language?: string; platform?: string; ipAddress?: string; geolocation?: { latitude: number; longitude: number; accuracy?: number } },\r\n multiSignerContext?: { isMultiSigner: boolean; currentSigner: any; currentSignerEmail: string; isPrimarySigner: boolean; isFinalSigner: boolean }\r\n): Promise<Uint8Array> {\r\n try {\r\n const { PDFDocument, rgb, StandardFonts } = await loadPdfLib();\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const form = pdfDoc.getForm();\r\n const pages = pdfDoc.getPages();\r\n \r\n // Get field positions and page numbers\r\n const { pageMap: fieldPageMap, positionMap: fieldPositionMap } = await getFieldPageNumbers(pdfBytes);\r\n \r\n // STEP 1: Fill all text form fields\r\n \r\n const fields = form.getFields();\r\n for (const field of fields) {\r\n const fieldName = field.getName();\r\n const fieldValue = formFieldValues[fieldName];\r\n \r\n if (!fieldValue) {\r\n // Log missing values for radio fields to diagnose\r\n if (fieldName.includes('radio')) {\r\n }\r\n continue;\r\n }\r\n \r\n try {\r\n const fieldTypeName = field.constructor.name;\r\n \r\n // Handle text fields\r\n if (fieldTypeName === 'PDFTextField' || fieldTypeName === 'PDFTextField2') {\r\n const textField = field as any;\r\n textField.setText?.(fieldValue);\r\n }\r\n // Handle checkbox fields\r\n else if (fieldTypeName === 'PDFCheckBox' || fieldTypeName === 'PDFCheckBox2') {\r\n const checkBox = field as any;\r\n if (fieldValue === 'true' || fieldValue === 'Yes' || fieldValue === 'checked' || fieldValue === 'On') {\r\n checkBox.check?.();\r\n } else {\r\n checkBox.uncheck?.();\r\n }\r\n }\r\n // Handle radio group fields\r\n else if (fieldTypeName === 'PDFRadioGroup' || fieldTypeName === 'PDFRadioGroup2') {\r\n const radioGroup = field as any;\r\n \r\n // Skip invalid values (boolean strings from checkbox-like behavior)\r\n if (fieldValue === 'true' || fieldValue === 'false') {\r\n continue;\r\n }\r\n \r\n // Handle __RADIO_OPTION_INDEX_ pattern\r\n const idxMatch = fieldValue.match(/__RADIO_OPTION_INDEX_(\\d+)__/);\r\n if (idxMatch && idxMatch[1]) {\r\n const selectedIndex = parseInt(idxMatch[1], 10);\r\n const options = radioGroup.getOptions?.() || [];\r\n if (selectedIndex >= 0 && selectedIndex < options.length) {\r\n radioGroup.select?.(options[selectedIndex]);\r\n }\r\n } else {\r\n // Try to use the value directly if it's a valid option\r\n const options = radioGroup.getOptions?.() || [];\r\n if (options.includes(fieldValue)) {\r\n radioGroup.select?.(fieldValue);\r\n } else {\r\n }\r\n }\r\n }\r\n // Handle dropdown fields\r\n else if (fieldTypeName === 'PDFDropdown' || fieldTypeName === 'PDFDropdown2') {\r\n const dropdown = field as any;\r\n dropdown.select?.(fieldValue);\r\n }\r\n } catch (fieldError) {\r\n logger.error(`Error setting field \"${fieldName}\":`, fieldError);\r\n }\r\n }\r\n\r\n // Update form field appearances to ensure radio button selections render correctly\r\n // This is critical for radio buttons to display properly in PDF viewers\r\n // Fix based on dm-web-frontend commit aafc786 (Oct 29, 2025)\r\n try {\r\n form.updateFieldAppearances();\r\n } catch (appearanceError) {\r\n // Some PDFs may not support this operation - fail gracefully\r\n }\r\n\r\n // STEP 2: Apply signature images to ALL signature fields\r\n const mainSignatureData = signatures['signature_field_main'];\r\n if (mainSignatureData && mainSignatureData.trim()) {\r\n \r\n // Find ALL signature field names (excluding text_ prefix and non-signature fields)\r\n // Match dockmaster patterns including '_es_:signer:signature' for esign integration\r\n const signatureFieldNames = [\r\n 'signature', 'Signature', 'SIGNATURE',\r\n 'sign', 'Sign', 'SIGN',\r\n '_es_:signer:signature'\r\n ];\r\n let foundSignatureFields = Object.keys(fieldPageMap).filter(fieldName => {\r\n const hasSignaturePattern = signatureFieldNames.some(pattern => \r\n fieldName.toLowerCase().includes(pattern.toLowerCase())\r\n );\r\n const isNotTextField = !fieldName.toLowerCase().startsWith('text_');\r\n return hasSignaturePattern && isNotTextField;\r\n });\r\n \r\n // CRITICAL: Filter to only ACTUAL signature fields, not checkbox/radio/dropdown\r\n if (extractedFormFields && extractedFormFields.length > 0) {\r\n const currentSignerSignatureFields = foundSignatureFields.filter(fieldName => {\r\n const fieldInfo = extractedFormFields.find(f => f.name === fieldName);\r\n if (!fieldInfo) {\r\n return false;\r\n }\r\n \r\n // CRITICAL FIX: Only process ACTUAL signature fields, NOT initials\r\n // Signature images should ONLY be applied to signature fields\r\n // Initials are handled separately as text (not images)\r\n // Fix based on dm-web-frontend commit 30895b5 (Oct 29, 2025)\r\n const isActualSignatureField = (fieldInfo.type === 'signature' ||\r\n fieldName.toLowerCase().includes('signature'))\r\n && !fieldName.toLowerCase().includes('initials'); // Explicitly exclude initials\r\n\r\n if (!isActualSignatureField) {\r\n return false;\r\n }\r\n \r\n // Use centralized visibility logic for multi-signer and single-signer modes\r\n const isVisible = multiSignerContext \r\n ? isFieldVisibleToSigner(fieldInfo, multiSignerContext)\r\n : true; // Single signer mode: all fields visible\r\n \r\n return isVisible;\r\n });\r\n foundSignatureFields = currentSignerSignatureFields;\r\n }\r\n \r\n \r\n if (foundSignatureFields.length > 0) {\r\n try {\r\n // Detect image format with binary signature detection\r\n let signatureImage;\r\n if (mainSignatureData.includes('data:image/png')) {\r\n signatureImage = await pdfDoc.embedPng(mainSignatureData);\r\n } else if (mainSignatureData.includes('data:image/jpeg') || mainSignatureData.includes('data:image/jpg')) {\r\n signatureImage = await pdfDoc.embedJpg(mainSignatureData);\r\n } else {\r\n // Fallback: detect by binary signature\r\n const base64Data = mainSignatureData.split(',')[1];\r\n if (!base64Data) {\r\n throw new Error('Invalid signature data format: missing base64 data');\r\n }\r\n const binaryData = atob(base64Data);\r\n \r\n // Check PNG signature (first 8 bytes: 89 50 4E 47 0D 0A 1A 0A)\r\n if (binaryData.charCodeAt(0) === 0x89 && \r\n binaryData.charCodeAt(1) === 0x50 && \r\n binaryData.charCodeAt(2) === 0x4E && \r\n binaryData.charCodeAt(3) === 0x47) {\r\n signatureImage = await pdfDoc.embedPng(mainSignatureData);\r\n } \r\n // Check JPEG signature (first 3 bytes: FF D8 FF)\r\n else if (binaryData.charCodeAt(0) === 0xFF && \r\n binaryData.charCodeAt(1) === 0xD8 && \r\n binaryData.charCodeAt(2) === 0xFF) {\r\n signatureImage = await pdfDoc.embedJpg(mainSignatureData);\r\n } \r\n else {\r\n throw new Error('Unsupported image format. Please use PNG or JPEG.');\r\n }\r\n }\r\n \r\n // Draw signature images using EXACT field coordinates\r\n for (const fieldName of foundSignatureFields) {\r\n \r\n const pageNumber = fieldPageMap[fieldName];\r\n \r\n if (pageNumber && pageNumber <= pages.length) {\r\n const page = pages[pageNumber - 1]; // Convert to 0-based index\r\n if (!page) continue;\r\n \r\n // Get EXACT field position from the map\r\n const fieldPosition = fieldPositionMap[fieldName];\r\n \r\n if (fieldPosition) {\r\n // Use EXACT field coordinates (NO CENTERING)\r\n const x = fieldPosition.x;\r\n const y = fieldPosition.y;\r\n const width = Math.max(fieldPosition.width, 80);\r\n const height = Math.max(fieldPosition.height, 30);\r\n \r\n // Scale signature to fit the field\r\n const signatureDims = signatureImage.scaleToFit(width - 4, height - 4);\r\n \r\n // FIXED POSITIONING: Use exact field coordinates\r\n const finalX = x;\r\n const finalY = y;\r\n \r\n \r\n page.drawImage(signatureImage, {\r\n x: finalX,\r\n y: finalY,\r\n width: signatureDims.width,\r\n height: signatureDims.height,\r\n });\r\n \r\n } else {\r\n }\r\n } else {\r\n }\r\n }\r\n } catch (error) {\r\n logger.error('Error applying signatures:', error);\r\n }\r\n }\r\n }\r\n \r\n // STEP 3: Apply initials to ALL initials fields\r\n const mainInitialsData = formFieldValues['initials_field_main'];\r\n if (mainInitialsData && mainInitialsData.trim()) {\r\n \r\n const initialsFieldNames = ['initials', 'Initials', 'INITIALS'];\r\n let foundInitialsFields = Object.keys(fieldPageMap).filter(fieldName =>\r\n initialsFieldNames.some(pattern => fieldName.toLowerCase().includes(pattern.toLowerCase()))\r\n );\r\n \r\n // Filter by signer if needed\r\n if (extractedFormFields && extractedFormFields.length > 0) {\r\n foundInitialsFields = foundInitialsFields.filter(fieldName => {\r\n const fieldInfo = extractedFormFields.find(f => f.name === fieldName);\r\n if (!fieldInfo) return false;\r\n \r\n const isActualInitialsField = fieldInfo.type === 'initials' || \r\n fieldName.toLowerCase().includes('initials');\r\n if (!isActualInitialsField) return false;\r\n \r\n return !fieldInfo.assignedSignerEmail || fieldInfo.assignedSignerEmail === currentSignerEmail;\r\n });\r\n }\r\n \r\n \r\n if (foundInitialsFields.length > 0) {\r\n try {\r\n const font = await pdfDoc.embedFont(StandardFonts.HelveticaBold);\r\n \r\n for (const fieldName of foundInitialsFields) {\r\n const pageNumber = fieldPageMap[fieldName];\r\n if (pageNumber && pageNumber <= pages.length) {\r\n const page = pages[pageNumber - 1];\r\n if (!page) continue;\r\n \r\n const fieldPosition = fieldPositionMap[fieldName];\r\n if (fieldPosition) {\r\n const x = fieldPosition.x;\r\n const y = fieldPosition.y;\r\n const height = Math.max(fieldPosition.height, 20);\r\n \r\n const fontSize = Math.min(height * 0.7, 14);\r\n \r\n // EXACT positioning (no centering)\r\n const finalX = x + 2;\r\n const finalY = y + (height - fontSize) / 2;\r\n \r\n page.drawText(mainInitialsData, {\r\n x: finalX,\r\n y: finalY,\r\n size: fontSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n });\r\n \r\n }\r\n }\r\n }\r\n } catch (error) {\r\n logger.error('Error applying initials:', error);\r\n }\r\n }\r\n }\r\n \r\n // STEP 4: Flatten form fields based on multi-signer mode\r\n \r\n const allFormFields = form.getFields();\r\n \r\n let fieldsToFlatten;\r\n \r\n if (multiSignerContext?.isMultiSigner) {\r\n // PARTIAL FLATTENING: Only flatten current signer's fields (Dockmaster logic lines 2500-2526)\r\n \r\n fieldsToFlatten = allFormFields.filter(f => {\r\n const fieldName = f.getName();\r\n \r\n if (!extractedFormFields || extractedFormFields.length === 0) {\r\n return true; // Flatten all if no field info\r\n }\r\n \r\n const fieldInfo = extractedFormFields.find(fi => fi.name === fieldName);\r\n if (!fieldInfo) {\r\n return true; // Flatten unknown fields\r\n }\r\n \r\n // Use centralized flattening logic\r\n return shouldFlattenField(fieldInfo, multiSignerContext);\r\n });\r\n } else {\r\n // COMPLETE FLATTENING: Flatten all fields (single signer mode)\r\n fieldsToFlatten = allFormFields;\r\n }\r\n \r\n // Helper interfaces for widget access\r\n interface PDFFieldWithAcro {\r\n acroField?: {\r\n getWidgets?: () => PDFWidget[];\r\n dict?: any;\r\n };\r\n }\r\n \r\n let flattenedCount = 0;\r\n \r\n for (const field of fieldsToFlatten) {\r\n const fieldName = field.getName();\r\n const fieldType = field.constructor.name;\r\n \r\n try {\r\n // Get user entered value\r\n const userEnteredValue = formFieldValues[fieldName];\r\n \r\n // Check if this is a signature/initials field\r\n const isSignatureField = fieldName.toLowerCase().includes('signature') || fieldType.includes('Signature');\r\n const isInitialsField = fieldName.toLowerCase().includes('initials') || fieldType.includes('Initials');\r\n \r\n if (isSignatureField || isInitialsField) {\r\n // Signature/initials fields were already drawn in STEP 2/3, just remove the field\r\n form.removeField(field);\r\n flattenedCount++;\r\n continue;\r\n }\r\n \r\n // Get field widgets for drawing\r\n const fieldWithWidgets = field as unknown as PDFFieldWithAcro;\r\n const widgets = fieldWithWidgets.acroField?.getWidgets?.() || [];\r\n \r\n // Handle different field types - draw their content\r\n if (fieldType === 'PDFCheckBox' || fieldType === 'PDFCheckBox2') {\r\n // Checkbox field - draw checkbox with checkmark if checked\r\n const stringValue = String(userEnteredValue || '');\r\n const isChecked = stringValue === 'true' || stringValue === 'Yes' || \r\n stringValue === 'On' || stringValue === 'checked';\r\n \r\n \r\n if (isChecked) {\r\n for (const widget of widgets) {\r\n const result = getWidgetRectangleAndPage(widget as unknown as PDFWidgetWithExtensions, pages);\r\n if (!result) continue;\r\n \r\n const { rect, page } = result;\r\n \r\n // Draw checkbox border\r\n const checkboxSize = Math.min(rect.width, rect.height) * 0.6;\r\n const checkboxX = rect.x + (rect.width - checkboxSize) / 2;\r\n const checkboxY = rect.y + (rect.height - checkboxSize) / 2;\r\n \r\n page.drawRectangle({\r\n x: checkboxX,\r\n y: checkboxY,\r\n width: checkboxSize,\r\n height: checkboxSize,\r\n borderColor: rgb(0, 0, 0),\r\n borderWidth: 1,\r\n });\r\n \r\n // Draw checkmark using \"X\"\r\n const checkSize = checkboxSize * 0.6;\r\n const textWidth = checkSize * 0.6;\r\n const textHeight = checkSize * 0.8;\r\n \r\n page.drawText('X', {\r\n x: checkboxX + (checkboxSize - textWidth) / 2,\r\n y: checkboxY + (checkboxSize - textHeight) / 2 + textHeight * 0.2,\r\n size: checkSize,\r\n font: await pdfDoc.embedFont(StandardFonts.HelveticaBold),\r\n color: rgb(0, 0, 0),\r\n });\r\n \r\n }\r\n }\r\n } else if (fieldType === 'PDFRadioGroup' || fieldType === 'PDFRadioGroup2') {\r\n // Radio group field - draw all radio buttons, fill the selected one\r\n let selectedValue = userEnteredValue ? String(userEnteredValue) : '';\r\n \r\n // Handle __RADIO_OPTION_INDEX_ pattern\r\n if (selectedValue.startsWith('__RADIO_OPTION_INDEX_')) {\r\n const indexMatch = selectedValue.match(/__RADIO_OPTION_INDEX_(\\d+)__/);\r\n if (indexMatch && indexMatch[1]) {\r\n selectedValue = indexMatch[1];\r\n }\r\n }\r\n \r\n \r\n // Determine selected index\r\n let selectedIndex = -1;\r\n if (selectedValue === 'Option A') selectedIndex = 0;\r\n else if (selectedValue === 'Option B') selectedIndex = 1;\r\n else if (selectedValue === 'Option C') selectedIndex = 2;\r\n else if (/^\\d+$/.test(selectedValue)) {\r\n selectedIndex = parseInt(selectedValue, 10);\r\n }\r\n \r\n // Get field info for labels and options\r\n const fieldInfo = extractedFormFields?.find(f => f.name === fieldName);\r\n const labelFont = await pdfDoc.embedFont('Helvetica-Bold');\r\n const drawnGroupLabels = new Set<string>();\r\n const drawnOptionLabels = new Set<string>();\r\n \r\n // Draw borders for ALL radio buttons\r\n for (let i = 0; i < widgets.length; i++) {\r\n const widget = widgets[i];\r\n const result = getWidgetRectangleAndPage(widget as unknown as PDFWidgetWithExtensions, pages);\r\n if (!result) continue;\r\n \r\n const { rect, page, pageIndex } = result;\r\n \r\n // Draw radio GROUP label (once, above first widget)\r\n // Only draw if it's a user-typed custom label (not auto-generated)\r\n if (i === 0 && fieldInfo?.label && fieldInfo.label.trim() && !isAutoGeneratedLabel(fieldInfo.label)) {\r\n const groupLabelKey = `${pageIndex}-${fieldName}-grouplabel`;\r\n if (!drawnGroupLabels.has(groupLabelKey)) {\r\n const labelY = rect.y + rect.height + 3;\r\n page.drawText(fieldInfo.label, {\r\n x: rect.x,\r\n y: labelY,\r\n size: 8,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n drawnGroupLabels.add(groupLabelKey);\r\n }\r\n } else if (i === 0 && isAutoGeneratedLabel(fieldInfo?.label || '')) {\r\n }\r\n \r\n // Draw radio button border (circle)\r\n const radioSize = Math.min(rect.width, rect.height) * 0.5;\r\n const radioX = rect.x + (rect.width - radioSize) / 2;\r\n const radioY = rect.y + (rect.height - radioSize) / 2;\r\n \r\n page.drawCircle({\r\n x: radioX + radioSize / 2,\r\n y: radioY + radioSize / 2,\r\n size: radioSize,\r\n borderColor: rgb(0, 0, 0),\r\n borderWidth: 1,\r\n });\r\n \r\n // Draw filled circle ONLY for selected option\r\n if (i === selectedIndex) {\r\n const circleSize = radioSize * 0.5;\r\n page.drawCircle({\r\n x: radioX + radioSize / 2,\r\n y: radioY + radioSize / 2,\r\n size: circleSize,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n \r\n // Draw option text next to each radio button\r\n if (fieldInfo?.options && fieldInfo.options.length > i) {\r\n const optionText = fieldInfo.options[i];\r\n const optionKey = `${pageIndex}-${fieldName}-opt-${i}`;\r\n \r\n if (optionText && !drawnOptionLabels.has(optionKey)) {\r\n page.drawText(optionText, {\r\n x: rect.x + rect.width + 4,\r\n y: rect.y + (rect.height - 8) / 2,\r\n size: 8,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n drawnOptionLabels.add(optionKey);\r\n }\r\n }\r\n }\r\n \r\n if (fieldInfo?.options) {\r\n }\r\n } else if (fieldType === 'PDFDropdown' || fieldType === 'PDFDropdown2') {\r\n // Dropdown field - draw the selected value\r\n const selectedValue = userEnteredValue ? String(userEnteredValue) : '';\r\n \r\n \r\n if (selectedValue && selectedValue.trim()) {\r\n for (const widget of widgets) {\r\n const result = getWidgetRectangleAndPage(widget as unknown as PDFWidgetWithExtensions, pages);\r\n if (!result) continue;\r\n \r\n const { rect, page } = result;\r\n \r\n // Draw the selected value\r\n page.drawText(selectedValue, {\r\n x: rect.x + 2,\r\n y: rect.y + 2,\r\n size: 10,\r\n font: await pdfDoc.embedFont(StandardFonts.Helvetica),\r\n color: rgb(0, 0, 0),\r\n });\r\n \r\n }\r\n }\r\n } else {\r\n // Text field or other field types - draw the field value\r\n const fieldValue = userEnteredValue ? String(userEnteredValue) : '';\r\n \r\n \r\n if (fieldValue && fieldValue.trim()) {\r\n for (const widget of widgets) {\r\n const result = getWidgetRectangleAndPage(widget as unknown as PDFWidgetWithExtensions, pages);\r\n if (!result) continue;\r\n \r\n const { rect, page } = result;\r\n \r\n // Draw the field value\r\n page.drawText(fieldValue, {\r\n x: rect.x + 2,\r\n y: rect.y + 2,\r\n size: 10,\r\n font: await pdfDoc.embedFont(StandardFonts.Helvetica),\r\n color: rgb(0, 0, 0),\r\n });\r\n \r\n }\r\n }\r\n }\r\n \r\n // Remove the field to flatten it\r\n form.removeField(field);\r\n flattenedCount++;\r\n } catch (error) {\r\n }\r\n }\r\n \r\n const remainingFields = form.getFields();\r\n \r\n // Verify flattening worked\r\n if (multiSignerContext?.isMultiSigner) {\r\n // MULTI-SIGNER MODE: Remaining fields are EXPECTED (for other signers)\r\n const expectedRemainingCount = allFormFields.length - fieldsToFlatten.length;\r\n if (remainingFields.length === expectedRemainingCount) {\r\n } else {\r\n }\r\n } else {\r\n // SINGLE-SIGNER MODE: All fields should be flattened\r\n if (remainingFields.length > 0) {\r\n logger.error(`MANUAL FLATTENING INCOMPLETE: ${remainingFields.length} fields still exist!`);\r\n logger.error(`Remaining fields:`, remainingFields.map(f => f.getName()));\r\n \r\n // Try basic flattening as final fallback (only in single-signer mode)\r\n try {\r\n form.flatten();\r\n const finalRemainingFields = form.getFields();\r\n \r\n if (finalRemainingFields.length > 0) {\r\n logger.error(`ALL FLATTENING METHODS FAILED: ${finalRemainingFields.length} fields still exist!`);\r\n logger.error(`Final remaining fields:`, finalRemainingFields.map(f => f.getName()));\r\n }\r\n } catch (fallbackError) {\r\n logger.error('Fallback flattening failed:', fallbackError);\r\n }\r\n } else {\r\n }\r\n }\r\n \r\n // STEP 6: Set document metadata for tracking and compliance\r\n try {\r\n // Set document metadata based on submission data\r\n // Set Title (with default if not provided)\r\n const documentTitle = metadata?.documentId \r\n ? `Document ID: ${metadata.documentId}`\r\n : 'Signed Document';\r\n pdfDoc.setTitle(documentTitle);\r\n \r\n // Set Subject (with default if not provided)\r\n const documentSubject = metadata?.submissionId\r\n ? `Submission ID: ${metadata.submissionId}`\r\n : metadata?.signerEmail\r\n ? `Signed by ${metadata.signerEmail}`\r\n : 'Digitally Signed Document';\r\n pdfDoc.setSubject(documentSubject);\r\n \r\n // Set Author (with default if not provided)\r\n const documentAuthor = metadata?.author || metadata?.signerEmail || 'Unknown';\r\n pdfDoc.setAuthor(documentAuthor);\r\n \r\n pdfDoc.setProducer('Created by signiphi (https://signiphi.ai/)');\r\n \r\n if (metadata?.signerEmail) {\r\n pdfDoc.setCreator(`Signer: ${metadata.signerEmail}`);\r\n }\r\n \r\n // Set creation date from submission\r\n if (metadata?.createdAt) {\r\n pdfDoc.setCreationDate(metadata.createdAt);\r\n }\r\n \r\n // Set current date as modification date\r\n pdfDoc.setModificationDate(new Date());\r\n \r\n // Set keywords for searchability and tracking\r\n const keywords: string[] = [];\r\n \r\n // Add signer email if available\r\n if (metadata?.signerEmail) {\r\n keywords.push(metadata.signerEmail);\r\n }\r\n \r\n // Add initials to metadata if available\r\n if (metadata?.signerInitials && metadata.signerInitials.trim()) {\r\n keywords.push(`Initials:${metadata.signerInitials.trim()}`);\r\n }\r\n \r\n // Add audit trail data for compliance and forensics\r\n if (auditTrail) {\r\n try {\r\n // Device/Browser information\r\n if (auditTrail.userAgent) {\r\n keywords.push(`UserAgent:${auditTrail.userAgent}`);\r\n }\r\n \r\n // Screen resolution as device identifier\r\n if (auditTrail.screenResolution) {\r\n keywords.push(`Screen:${auditTrail.screenResolution}`);\r\n }\r\n \r\n // Timezone\r\n if (auditTrail.timezone) {\r\n keywords.push(`Timezone:${auditTrail.timezone}`);\r\n }\r\n \r\n // Language settings\r\n if (auditTrail.language) {\r\n keywords.push(`Language:${auditTrail.language}`);\r\n }\r\n \r\n // Platform information\r\n if (auditTrail.platform) {\r\n keywords.push(`Platform:${auditTrail.platform}`);\r\n }\r\n \r\n // IP address\r\n if (auditTrail.ipAddress) {\r\n keywords.push(`IP:${auditTrail.ipAddress}`);\r\n }\r\n \r\n // Geolocation data\r\n if (auditTrail.geolocation) {\r\n const { latitude, longitude, accuracy } = auditTrail.geolocation;\r\n const lat = latitude.toFixed(4);\r\n const lon = longitude.toFixed(4);\r\n keywords.push(`Location:${lat},${lon}`);\r\n \r\n // Add accuracy if available\r\n if (accuracy !== undefined) {\r\n keywords.push(`LocationAccuracy:${accuracy}m`);\r\n }\r\n }\r\n } catch (auditError) {\r\n logger.warn('⚠️ Error adding audit trail to keywords:', auditError)\r\n }\r\n }\r\n \r\n if (keywords.length > 0) {\r\n pdfDoc.setKeywords(keywords);\r\n }\r\n } catch (error) {\r\n logger.error('Failed to set document metadata:', error);\r\n }\r\n \r\n const finalPdfBytes = await pdfDoc.save();\r\n return finalPdfBytes;\r\n } catch (error) {\r\n logger.error('Error filling PDF with signatures:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Fill form fields and replace signature/initials with actual signature images\r\n * This is used when fields are rendered as overlays on the PDF\r\n * @param pdfBytes - The PDF bytes\r\n * @param formFields - The form fields with their positions\r\n * @param fieldValues - The field values to fill\r\n * @param signatures - The signature images (base64 data URLs)\r\n * @returns The filled PDF bytes\r\n */\r\nexport async function fillFormFieldsWithSignatures(\r\n pdfBytes: Uint8Array,\r\n formFields: EsignFormField[],\r\n fieldValues: Record<string, string>,\r\n signatures: Record<string, string>\r\n): Promise<Uint8Array> {\r\n try {\r\n const { PDFDocument, rgb, StandardFonts } = await loadPdfLib();\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const pages = pdfDoc.getPages();\r\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\r\n\r\n for (const field of formFields) {\r\n const pageIndex = field.position.page - 1;\r\n \r\n if (pageIndex < 0 || pageIndex >= pages.length) {\r\n continue;\r\n }\r\n\r\n const page = pages[pageIndex];\r\n if (!page) continue;\r\n const { height: pageHeight } = page.getSize();\r\n\r\n // Convert coordinates from top-left (UI) to bottom-left (PDF)\r\n const pdfX = field.position.x;\r\n const pdfY = pageHeight - field.position.y - field.position.height;\r\n\r\n try {\r\n switch (field.type) {\r\n case FormFieldType.TEXT: {\r\n const value = fieldValues[field.id] || '';\r\n if (value) {\r\n // Use field fontSize if specified, otherwise calculate based on field height\r\n const fontSize = field.fontSize && field.fontSize >= 8 && field.fontSize <= 72 \r\n ? field.fontSize \r\n : Math.min(12, field.position.height * 0.6);\r\n page.drawText(value, {\r\n x: pdfX + 2, // Small padding\r\n y: pdfY + (field.position.height - fontSize) / 2, // Center vertically\r\n size: fontSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n maxWidth: field.position.width - 4, // Leave padding\r\n });\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.DATE: {\r\n const value = fieldValues[field.id] || '';\r\n if (value) {\r\n const fontSize = field.fontSize && field.fontSize >= 8 && field.fontSize <= 72 \r\n ? field.fontSize \r\n : Math.min(12, field.position.height * 0.6);\r\n page.drawText(value, {\r\n x: pdfX + 2,\r\n y: pdfY + (field.position.height - fontSize) / 2,\r\n size: fontSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n maxWidth: field.position.width - 4,\r\n });\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.CHECKBOX: {\r\n const value = fieldValues[field.id] || '';\r\n if (value === 'true') {\r\n // Draw a checkmark\r\n const checkSize = Math.min(field.position.width, field.position.height) * 0.6;\r\n const checkX = pdfX + (field.position.width - checkSize) / 2;\r\n const checkY = pdfY + (field.position.height - checkSize) / 2;\r\n \r\n page.drawText('✓', {\r\n x: checkX,\r\n y: checkY,\r\n size: checkSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.SIGNATURE: {\r\n const signatureDataUrl = signatures[field.id];\r\n if (signatureDataUrl) {\r\n // Convert base64 data URL to image bytes\r\n const base64Data = signatureDataUrl.split(',')[1];\r\n if (!base64Data) {\r\n logger.error('Invalid signature data URL format for field:', field.id);\r\n break;\r\n }\r\n const imageBytes = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0));\r\n \r\n // Embed the image\r\n const image = await pdfDoc.embedPng(imageBytes);\r\n \r\n // Calculate dimensions to fit within the field while maintaining aspect ratio\r\n const imageSize = image.size();\r\n const fieldAspectRatio = field.position.width / field.position.height;\r\n const imageAspectRatio = imageSize.width / imageSize.height;\r\n \r\n let drawWidth = field.position.width;\r\n let drawHeight = field.position.height;\r\n \r\n if (imageAspectRatio > fieldAspectRatio) {\r\n // Image is wider than field - fit to width\r\n drawHeight = drawWidth / imageAspectRatio;\r\n } else {\r\n // Image is taller than field - fit to height\r\n drawWidth = drawHeight * imageAspectRatio;\r\n }\r\n \r\n // Center the image within the field\r\n const imageX = pdfX + (field.position.width - drawWidth) / 2;\r\n const imageY = pdfY + (field.position.height - drawHeight) / 2;\r\n \r\n // Draw the image\r\n page.drawImage(image, {\r\n x: imageX,\r\n y: imageY,\r\n width: drawWidth,\r\n height: drawHeight,\r\n });\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.INITIALS: {\r\n const value = fieldValues[field.id] || '';\r\n if (value) {\r\n // Use a cursive font for initials\r\n const fontSize = Math.min(18, field.position.height * 0.8);\r\n page.drawText(value, {\r\n x: pdfX + 2,\r\n y: pdfY + (field.position.height - fontSize) / 2,\r\n size: fontSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n maxWidth: field.position.width - 4,\r\n });\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.DROPDOWN: {\r\n const value = fieldValues[field.id] || '';\r\n if (value) {\r\n const fontSize = Math.min(12, field.position.height * 0.6);\r\n page.drawText(value, {\r\n x: pdfX + 2,\r\n y: pdfY + (field.position.height - fontSize) / 2,\r\n size: fontSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n maxWidth: field.position.width - 4,\r\n });\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n break;\r\n }\r\n } catch (fieldError) {\r\n logger.error(`Error processing field ${field.name}:`, fieldError);\r\n }\r\n }\r\n\r\n return await pdfDoc.save();\r\n} catch (error) {\r\n logger.error('Error filling form fields:', error);\r\n throw error;\r\n}\r\n}\r\n\r\n/**\r\n * Extract field positions and page numbers from a PDF document\r\n * Returns maps for field name -> page number and field name -> position\r\n */\r\nexport async function getFieldPageNumbers(\r\n pdfBytes: Uint8Array\r\n): Promise<{\r\n pageMap: Record<string, number>;\r\n positionMap: Record<string, FormFieldPosition>;\r\n}> {\r\n try {\r\n const { PDFDocument } = await loadPdfLib();\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const form = pdfDoc.getForm();\r\n const fields = form.getFields();\r\n const pages = pdfDoc.getPages();\r\n\r\n const pageMap: Record<string, number> = {};\r\n const positionMap: Record<string, FormFieldPosition> = {};\r\n\r\n for (const field of fields) {\r\n const fieldName = field.getName();\r\n const fieldWithAcro = field as unknown as PDFFieldWithAcro;\r\n const widgets = fieldWithAcro.acroField?.getWidgets?.() ?? [];\r\n\r\n if (widgets.length > 0) {\r\n // Use the first widget to determine page and position\r\n const widget = widgets[0];\r\n if (!widget) continue;\r\n const rect = widget.getRectangle?.();\r\n const pageRef = widget.P?.();\r\n\r\n if (rect && pageRef) {\r\n // Find which page this widget belongs to\r\n const pageIndex = findPageIndexByRef(pages, pageRef);\r\n\r\n if (pageIndex !== -1) {\r\n const pageNumber = pageIndex + 1; // Convert to 1-indexed\r\n pageMap[fieldName] = pageNumber;\r\n\r\n // Store position information\r\n positionMap[fieldName] = {\r\n x: rect.x,\r\n y: rect.y,\r\n width: rect.width,\r\n height: rect.height,\r\n page: pageNumber,\r\n };\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { pageMap, positionMap };\r\n} catch (error) {\r\n logger.error('Error extracting field page numbers:', error);\r\n return { pageMap: {}, positionMap: {} };\r\n}\r\n}\r\n\r\n","/**\r\n * PDF Form Field Extraction Utilities\r\n * Functions for extracting and decoding form fields from PDFs\r\n */\r\n\r\nimport { loadPdfLib } from './pdf-lib-loader';\r\nimport { EsignFormField, FormFieldType } from '../types';\r\nimport { logger } from './logger';\r\nimport type { PDFName as PDFNameType } from 'pdf-lib';\r\n\r\n// Module-level variable to hold PDFName after pdf-lib is loaded\r\nlet PDFName: typeof PDFNameType;\r\n\r\n// Type definitions for PDF field extensions\r\ninterface PDFFieldWithExtensions {\r\n acroField?: {\r\n getWidgets?: () => Array<{\r\n hasFlag?: (flag: number) => boolean;\r\n }>;\r\n dict?: {\r\n get: (key: unknown) => unknown;\r\n };\r\n };\r\n getOptions?: () => string[];\r\n isRequired?: () => boolean;\r\n constructor: { name: string };\r\n getName(): string;\r\n}\r\n\r\n/**\r\n * Extract visible form fields from a PDF document\r\n * @param pdfBytes - The PDF bytes to extract fields from\r\n * @param currentSignerEmail - Optional email of the current signer (for multi-signer filtering)\r\n * @returns Array of extracted form fields\r\n */\r\nexport async function extractVisibleFormFields(\r\n pdfBytes: Uint8Array,\r\n currentSignerEmail?: string\r\n): Promise<EsignFormField[]> {\r\n try {\r\n const pdfLibModule = await loadPdfLib();\r\n const { PDFDocument, AnnotationFlags, PDFName: PDFNameClass } = pdfLibModule;\r\n PDFName = PDFNameClass; // Assign to module-level variable for use in helper functions\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n const form = pdfDoc.getForm();\r\n const fields = form.getFields();\r\n const visibleFields: EsignFormField[] = [];\r\n let hasAnyInitialsFields = false; // For single-signer mode\r\n let hasInitialsFieldsForCurrentSigner = false; // For multi-signer mode\r\n \r\n for (const field of fields) {\r\n const fieldName = field.getName();\r\n \r\n // Get widgets for this field to check visibility\r\n const fieldWithExtensions = field as unknown as PDFFieldWithExtensions;\r\n const widgets = fieldWithExtensions.acroField?.getWidgets?.() ?? [];\r\n \r\n let isVisible = true;\r\n \r\n // Check if any widget is hidden using AnnotationFlags\r\n for (const widget of widgets) {\r\n const hasHiddenFlag = widget.hasFlag?.(AnnotationFlags.Hidden) ?? false;\r\n const hasNoViewFlag = widget.hasFlag?.(AnnotationFlags.NoView) ?? false;\r\n \r\n if (hasHiddenFlag || hasNoViewFlag) {\r\n isVisible = false;\r\n break;\r\n }\r\n }\r\n \r\n if (isVisible) {\r\n // Decode field name to extract label, assigned signer, and placeholder\r\n const decodedInfo = decodeFieldName(fieldName);\r\n \r\n // NOTE: We do NOT filter by signer during extraction in multi-signer mode!\r\n // All fields must be extracted so that:\r\n // 1. useFieldFiltering can properly filter fields for display\r\n // 2. Partial flattening knows about all fields (flatten current signer's fields only)\r\n // 3. PDF viewer filtering can remove non-visible fields from the rendered PDF\r\n // The filtering happens at the display level via useFieldFiltering hook.\r\n \r\n // Determine field type based on pdf-lib field type\r\n let fieldType = FormFieldType.TEXT;\r\n const fieldTypeName = field.constructor.name;\r\n \r\n // CRITICAL: Properly detect signature/initials fields (not checkboxes/radios)\r\n // More defensive than dockmaster - explicitly exclude CheckBox/Radio to prevent false positives\r\n const isActualSignatureField = fieldTypeName.includes('Signature') || \r\n (decodedInfo.decodedFieldName.toLowerCase().includes('signature') && \r\n !fieldTypeName.includes('CheckBox') && \r\n !fieldTypeName.includes('Radio'));\r\n const isActualInitialsField = decodedInfo.decodedFieldName.toLowerCase().includes('initials') &&\r\n !fieldTypeName.includes('CheckBox') && \r\n !fieldTypeName.includes('Radio');\r\n \r\n if (isActualSignatureField) {\r\n fieldType = FormFieldType.SIGNATURE;\r\n } else if (isActualInitialsField) {\r\n fieldType = FormFieldType.INITIALS;\r\n \r\n // Track initials fields for proper sidebar display logic:\r\n // - hasAnyInitialsFields: ANY initials exist (for single-signer fallback)\r\n // - hasInitialsFieldsForCurrentSigner: initials assigned to this signer (for multi-signer)\r\n hasAnyInitialsFields = true;\r\n \r\n // Check if this initials field is assigned to current signer\r\n if (currentSignerEmail && decodedInfo.assignedSignerEmail === currentSignerEmail) {\r\n hasInitialsFieldsForCurrentSigner = true;\r\n }\r\n } else if (decodedInfo.decodedFieldName.toLowerCase().includes('date')) {\r\n fieldType = FormFieldType.DATE;\r\n } else if (fieldTypeName.includes('CheckBox')) {\r\n fieldType = FormFieldType.CHECKBOX;\r\n } else if (fieldTypeName.toLowerCase().includes('dropdown')) {\r\n fieldType = FormFieldType.DROPDOWN;\r\n } else if (fieldTypeName.includes('Radio')) {\r\n fieldType = FormFieldType.RADIO;\r\n }\r\n \r\n // Generate display label - Try TU metadata first, then decoded label, then fallback\r\n let displayLabel = decodedInfo.displayLabel;\r\n \r\n // PRIORITY 1: Try to get label from TU (tooltip/user-visible) metadata\r\n if (!displayLabel || !displayLabel.trim()) {\r\n try {\r\n const tuLabel = extractTULabel(fieldWithExtensions);\r\n if (tuLabel && tuLabel.trim()) {\r\n displayLabel = tuLabel;\r\n }\r\n } catch (tuError) {\r\n }\r\n }\r\n \r\n // PRIORITY 2: Use decoded label from field name encoding\r\n // (Already set above from decodedInfo)\r\n \r\n // PRIORITY 3: Generate fallback label from field name\r\n if (!displayLabel || !displayLabel.trim()) {\r\n displayLabel = generateFallbackLabel(decodedInfo.decodedFieldName, fieldType);\r\n }\r\n \r\n // Create EsignFormField\r\n const esignField: EsignFormField = {\r\n id: fieldName, // Keep original encoded name as ID\r\n name: fieldName, // Keep original for removal later\r\n type: fieldType,\r\n label: displayLabel, // Use friendly label for display\r\n position: { x: 0, y: 0, width: 100, height: 30, page: 1 }, // Default position\r\n required: fieldWithExtensions.isRequired?.() ?? false,\r\n placeholder: decodedInfo.fieldPlaceholder || '', // Use extracted placeholder\r\n assignedSignerEmail: decodedInfo.assignedSignerEmail, // Add assigned signer\r\n };\r\n \r\n // Add options for dropdown and radio fields\r\n if (fieldType === FormFieldType.DROPDOWN || fieldType === FormFieldType.RADIO) {\r\n try {\r\n const options = fieldWithExtensions.getOptions?.() ?? [];\r\n esignField.options = options;\r\n if (options.length > 0) {\r\n }\r\n } catch (error) {\r\n logger.warn('Error extracting options for field:', error);\r\n }\r\n }\r\n \r\n visibleFields.push(esignField);\r\n }\r\n }\r\n \r\n // Add main signature and initials fields at the BEGINNING\r\n // Only create if PDF has these fields OR if explicitly required\r\n const mainFields: EsignFormField[] = [];\r\n \r\n // ALWAYS create signature field - it's attached to the document on submission regardless\r\n mainFields.push({\r\n id: 'signature_field_main',\r\n name: 'signature_field_main',\r\n type: FormFieldType.SIGNATURE,\r\n label: 'Your Signature (will be applied to all signature fields)',\r\n position: { x: 0, y: 0, width: 200, height: 60, page: 1 },\r\n required: true,\r\n placeholder: 'Draw or upload your signature',\r\n assignedSignerEmail: currentSignerEmail,\r\n });\r\n \r\n // Create initials field based on mode:\r\n // - Multi-signer mode (currentSignerEmail provided AND matches assigned fields):\r\n // Only create if current signer has initials fields assigned to them\r\n // - Single-signer mode (currentSignerEmail not provided OR doesn't match any assignments):\r\n // Create if ANY initials fields exist in the PDF\r\n // When present, always make it required\r\n const shouldCreateInitialsField = hasInitialsFieldsForCurrentSigner || \r\n (hasAnyInitialsFields && !currentSignerEmail);\r\n \r\n if (shouldCreateInitialsField) {\r\n if (hasInitialsFieldsForCurrentSigner) {\r\n } else {\r\n }\r\n \r\n mainFields.push({\r\n id: 'initials_field_main',\r\n name: 'initials_field_main',\r\n type: FormFieldType.INITIALS,\r\n label: 'Your Initials (will be applied to all initials fields)',\r\n position: { x: 0, y: 0, width: 100, height: 40, page: 1 },\r\n required: true,\r\n placeholder: 'Enter your initials',\r\n assignedSignerEmail: currentSignerEmail,\r\n });\r\n }\r\n \r\n // Return main fields FIRST, then other fields\r\n return [...mainFields, ...visibleFields];\r\n } catch (error) {\r\n logger.error('Error extracting visible form fields from PDF:', error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Decode a field name to extract label, signer email, and placeholder\r\n * Format: fieldName__LABEL__labelText__SIGNER__email__PLACEHOLDER__placeholderText\r\n */\r\nexport function decodeFieldName(fieldName: string): {\r\n decodedFieldName: string;\r\n displayLabel: string;\r\n assignedSignerEmail?: string;\r\n fieldPlaceholder: string;\r\n} {\r\n let decodedFieldName = fieldName;\r\n let displayLabel = '';\r\n let assignedSignerEmail: string | undefined = undefined;\r\n let fieldPlaceholder = '';\r\n \r\n // Extract label if present\r\n if (fieldName.includes('__LABEL__')) {\r\n const labelMarkerIndex = fieldName.indexOf('__LABEL__');\r\n decodedFieldName = fieldName.substring(0, labelMarkerIndex);\r\n \r\n const afterLabel = fieldName.substring(labelMarkerIndex + 9); // Skip \"__LABEL__\"\r\n \r\n // Extract signer email if present\r\n if (afterLabel.includes('__SIGNER__')) {\r\n const signerMarkerIndex = afterLabel.indexOf('__SIGNER__');\r\n displayLabel = afterLabel.substring(0, signerMarkerIndex);\r\n const afterSigner = afterLabel.substring(signerMarkerIndex + 10); // Skip \"__SIGNER__\"\r\n \r\n // Extract placeholder if present\r\n if (afterSigner.includes('__PLACEHOLDER__')) {\r\n const placeholderMarkerIndex = afterSigner.indexOf('__PLACEHOLDER__');\r\n assignedSignerEmail = afterSigner.substring(0, placeholderMarkerIndex);\r\n fieldPlaceholder = afterSigner.substring(placeholderMarkerIndex + 15); // Skip \"__PLACEHOLDER__\"\r\n } else {\r\n assignedSignerEmail = afterSigner;\r\n }\r\n } else if (afterLabel.includes('__PLACEHOLDER__')) {\r\n // Label and placeholder but no signer\r\n const placeholderMarkerIndex = afterLabel.indexOf('__PLACEHOLDER__');\r\n displayLabel = afterLabel.substring(0, placeholderMarkerIndex);\r\n fieldPlaceholder = afterLabel.substring(placeholderMarkerIndex + 15); // Skip \"__PLACEHOLDER__\"\r\n } else {\r\n displayLabel = afterLabel;\r\n }\r\n } else if (fieldName.includes('__SIGNER__')) {\r\n // Old format without label\r\n const signerMarkerIndex = fieldName.indexOf('__SIGNER__');\r\n decodedFieldName = fieldName.substring(0, signerMarkerIndex);\r\n const afterSigner = fieldName.substring(signerMarkerIndex + 10); // Skip \"__SIGNER__\"\r\n \r\n // Extract placeholder if present\r\n if (afterSigner.includes('__PLACEHOLDER__')) {\r\n const placeholderMarkerIndex = afterSigner.indexOf('__PLACEHOLDER__');\r\n assignedSignerEmail = afterSigner.substring(0, placeholderMarkerIndex);\r\n fieldPlaceholder = afterSigner.substring(placeholderMarkerIndex + 15); // Skip \"__PLACEHOLDER__\"\r\n } else {\r\n assignedSignerEmail = afterSigner;\r\n }\r\n } else if (fieldName.includes('__PLACEHOLDER__')) {\r\n // Only placeholder present\r\n const placeholderMarkerIndex = fieldName.indexOf('__PLACEHOLDER__');\r\n decodedFieldName = fieldName.substring(0, placeholderMarkerIndex);\r\n fieldPlaceholder = fieldName.substring(placeholderMarkerIndex + 15); // Skip \"__PLACEHOLDER__\"\r\n }\r\n \r\n return {\r\n decodedFieldName,\r\n displayLabel,\r\n assignedSignerEmail,\r\n fieldPlaceholder,\r\n };\r\n}\r\n\r\n/**\r\n * Generate a fallback label from a decoded field name\r\n */\r\nexport function generateFallbackLabel(decodedFieldName: string, fieldType: FormFieldType): string {\r\n let displayLabel = decodedFieldName;\r\n \r\n // Remove \"_signature\", \"_initials\", \"_date\" suffixes added by pdf-lib\r\n displayLabel = displayLabel.replace(/_signature$/i, '').replace(/_initials$/i, '').replace(/_date$/i, '');\r\n \r\n // Handle different naming patterns:\r\n // 1. Pure timestamp fields: \"text_1234567890\" → \"Text\"\r\n // 2. Descriptive fields: \"text_Primary_1\" → \"Text Primary\"\r\n // 3. Custom fields: \"customer_name\" → \"Customer Name\"\r\n \r\n if (/^(text|signature|initials|date)_\\d+$/i.test(displayLabel)) {\r\n // Pattern 1: Pure timestamp fields\r\n if (fieldType === FormFieldType.SIGNATURE) return 'Signature';\r\n if (fieldType === FormFieldType.INITIALS) return 'Initials';\r\n if (fieldType === FormFieldType.DATE) return 'Date';\r\n if (fieldType === FormFieldType.TEXT) return 'Text';\r\n if (fieldType === FormFieldType.CHECKBOX) return 'Checkbox';\r\n if (fieldType === FormFieldType.DROPDOWN) return 'Dropdown';\r\n if (fieldType === FormFieldType.RADIO) return 'Option';\r\n } else {\r\n // Pattern 2 & 3: Convert underscores to spaces, remove trailing numbers, capitalize\r\n displayLabel = displayLabel\r\n .replace(/_/g, ' ') // Convert underscores to spaces\r\n .replace(/\\s+\\d+$/g, '') // Remove trailing numbers (e.g., \" 1\")\r\n .trim()\r\n .split(' ') // Split into words\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) // Capitalize each word\r\n .join(' ');\r\n }\r\n \r\n return displayLabel;\r\n}\r\n\r\n/**\r\n * Extract label from TU (tooltip) metadata in PDF field\r\n * @param field - The PDF field with extensions\r\n * @returns The extracted label or empty string\r\n */\r\nfunction extractTULabel(field: PDFFieldWithExtensions): string {\r\n try {\r\n if (!field.acroField?.dict) {\r\n return '';\r\n }\r\n \r\n const tuLabel = field.acroField.dict.get(PDFName.of('TU'));\r\n if (!tuLabel) {\r\n return '';\r\n }\r\n \r\n // PDFString has a decodeText() method or toString()\r\n const tuValue = tuLabel.toString();\r\n if (!tuValue || !tuValue.trim()) {\r\n return '';\r\n }\r\n \r\n // Handle PDF string encoding - extract content between parentheses or angle brackets\r\n // PDF strings are encoded as \"(text)\" or \"<hex>\"\r\n if (tuValue.startsWith('(') || tuValue.startsWith('<')) {\r\n const match = tuValue.match(/^\\((.*)\\)$/) || tuValue.match(/^<(.*)>$/);\r\n if (match && match[1]) {\r\n return match[1];\r\n }\r\n }\r\n \r\n // If no special encoding, return as-is\r\n return tuValue;\r\n } catch (error) {\r\n return '';\r\n }\r\n}\r\n\r\n","/**\r\n * Audit Trail Utilities\r\n * Captures device metadata, IP address, and geolocation for compliance and forensics\r\n */\r\n\r\nimport type { AuditTrailMetadata } from '../types';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * Synchronously capture device and browser metadata\r\n */\r\nexport function captureDeviceMetadata(): Partial<AuditTrailMetadata> {\r\n const metadata: Partial<AuditTrailMetadata> = {};\r\n\r\n try {\r\n // User agent (truncated to 100 chars)\r\n if (navigator.userAgent) {\r\n metadata.userAgent = navigator.userAgent.substring(0, 100);\r\n }\r\n\r\n // Screen resolution\r\n if (screen.width && screen.height) {\r\n metadata.screenResolution = `${screen.width}x${screen.height}`;\r\n }\r\n\r\n // Timezone\r\n try {\r\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\r\n if (timezone) {\r\n metadata.timezone = timezone;\r\n }\r\n } catch {\r\n // Timezone unavailable\r\n }\r\n\r\n // Language\r\n if (navigator.language) {\r\n metadata.language = navigator.language;\r\n }\r\n\r\n // Platform\r\n if (navigator.platform) {\r\n metadata.platform = navigator.platform;\r\n }\r\n } catch (error) {\r\n logger.warn('Error capturing device metadata:', error);\r\n }\r\n\r\n return metadata;\r\n}\r\n\r\n/**\r\n * Capture IP address using public API\r\n */\r\nexport async function captureIpAddress(): Promise<string> {\r\n try {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), 5000); // 5 second timeout\r\n\r\n const ipResponse = await fetch('https://api.ipify.org?format=json', {\r\n method: 'GET',\r\n signal: controller.signal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (ipResponse.ok) {\r\n const ipData = await ipResponse.json();\r\n if (ipData.ip) {\r\n return ipData.ip;\r\n }\r\n }\r\n\r\n return 'Unknown';\r\n } catch (error) {\r\n return 'Unknown';\r\n }\r\n}\r\n\r\n/**\r\n * Capture geolocation using browser geolocation API\r\n */\r\nexport async function captureGeolocation(): Promise<{\r\n latitude: number;\r\n longitude: number;\r\n accuracy?: number;\r\n} | null> {\r\n if (!navigator.geolocation) {\r\n return null;\r\n }\r\n\r\n try {\r\n const position = await new Promise<GeolocationPosition>((resolve, reject) => {\r\n navigator.geolocation.getCurrentPosition(resolve, reject, {\r\n timeout: 10000, // 10 second timeout\r\n enableHighAccuracy: false,\r\n maximumAge: 300000, // 5 minutes cache\r\n });\r\n });\r\n\r\n if (position.coords) {\r\n const latitude = parseFloat(position.coords.latitude.toFixed(4));\r\n const longitude = parseFloat(position.coords.longitude.toFixed(4));\r\n const accuracy = position.coords.accuracy\r\n ? Math.round(position.coords.accuracy)\r\n : undefined;\r\n\r\n\r\n return {\r\n latitude,\r\n longitude,\r\n accuracy,\r\n };\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Capture complete audit trail metadata\r\n * Combines device metadata, IP address, and geolocation\r\n */\r\nexport async function captureAuditTrail(): Promise<AuditTrailMetadata> {\r\n\r\n const auditTrail: AuditTrailMetadata = {};\r\n\r\n try {\r\n // Capture device metadata (synchronous)\r\n const deviceMetadata = captureDeviceMetadata();\r\n Object.assign(auditTrail, deviceMetadata);\r\n\r\n // Capture IP address (async, with timeout)\r\n try {\r\n const ipAddress = await captureIpAddress();\r\n auditTrail.ipAddress = ipAddress;\r\n } catch (error) {\r\n logger.warn('Error capturing IP address:', error);\r\n auditTrail.ipAddress = 'Unknown';\r\n }\r\n\r\n // Capture geolocation (async, requires permission)\r\n try {\r\n const geolocation = await captureGeolocation();\r\n if (geolocation) {\r\n auditTrail.geolocation = geolocation;\r\n }\r\n } catch (error) {\r\n logger.warn('Error capturing geolocation:', error);\r\n }\r\n } catch (error) {\r\n logger.warn('Error capturing audit trail:', error);\r\n }\r\n\r\n return auditTrail;\r\n}\r\n\r\n","/**\r\n * Custom Error Classes\r\n * Domain-specific error types for better error handling and debugging\r\n */\r\n\r\n/**\r\n * Error thrown when PDF validation fails\r\n * \r\n * @example\r\n * ```ts\r\n * const validation = validatePdfBytes(bytes);\r\n * if (!validation.valid) {\r\n * throw new PdfValidationError(validation.error || 'Invalid PDF');\r\n * }\r\n * ```\r\n */\r\nexport class PdfValidationError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'PdfValidationError';\r\n // Maintains proper stack trace for where error was thrown (V8 only)\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, PdfValidationError);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown during PDF processing operations\r\n * \r\n * @example\r\n * ```ts\r\n * try {\r\n * const pdfDoc = await PDFDocument.load(bytes);\r\n * } catch (err) {\r\n * throw new PdfProcessingError('Failed to load PDF document', err);\r\n * }\r\n * ```\r\n */\r\nexport class PdfProcessingError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'PdfProcessingError';\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, PdfProcessingError);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown for form field related issues\r\n * \r\n * @example\r\n * ```ts\r\n * if (!field.value && field.required) {\r\n * throw new FormFieldError(\r\n * 'Required field is empty',\r\n * field.name\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport class FormFieldError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly fieldName?: string,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'FormFieldError';\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, FormFieldError);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Error thrown for attachment validation failures\r\n * \r\n * @example\r\n * ```ts\r\n * if (file.size > maxFileSize) {\r\n * throw new AttachmentValidationError(\r\n * `File size exceeds limit: ${file.name}`,\r\n * file.name\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport class AttachmentValidationError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly fileName?: string,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = 'AttachmentValidationError';\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, AttachmentValidationError);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Type guard to check if an error is a PdfValidationError\r\n */\r\nexport function isPdfValidationError(error: unknown): error is PdfValidationError {\r\n return error instanceof PdfValidationError;\r\n}\r\n\r\n/**\r\n * Type guard to check if an error is a PdfProcessingError\r\n */\r\nexport function isPdfProcessingError(error: unknown): error is PdfProcessingError {\r\n return error instanceof PdfProcessingError;\r\n}\r\n\r\n/**\r\n * Type guard to check if an error is a FormFieldError\r\n */\r\nexport function isFormFieldError(error: unknown): error is FormFieldError {\r\n return error instanceof FormFieldError;\r\n}\r\n\r\n/**\r\n * Type guard to check if an error is an AttachmentValidationError\r\n */\r\nexport function isAttachmentValidationError(error: unknown): error is AttachmentValidationError {\r\n return error instanceof AttachmentValidationError;\r\n}\r\n\r\n/**\r\n * Extract error message from unknown error type\r\n * \r\n * @param error - The error to extract message from\r\n * @param defaultMessage - Default message if extraction fails\r\n * @returns Error message string\r\n * \r\n * @example\r\n * ```ts\r\n * try {\r\n * // ... operation\r\n * } catch (err) {\r\n * const message = getErrorMessage(err, 'Operation failed');\r\n * logger.error(message);\r\n * }\r\n * ```\r\n */\r\nexport function getErrorMessage(error: unknown, defaultMessage = 'Unknown error'): string {\r\n if (error instanceof Error) {\r\n return error.message;\r\n }\r\n if (typeof error === 'string') {\r\n return error;\r\n }\r\n return defaultMessage;\r\n}\r\n\r\n","/**\r\n * Attachment Validation Utilities\r\n * Validation functions for file attachments\r\n */\r\n\r\nimport type { AttachmentConstraints, Attachment } from '../types';\r\nimport { AttachmentValidationError } from './errors';\r\n\r\n/**\r\n * Default attachment constraints\r\n */\r\nexport const DEFAULT_ATTACHMENT_CONSTRAINTS: AttachmentConstraints = {\r\n maxFileSize: 10 * 1024 * 1024, // 10MB\r\n maxTotalSize: 50 * 1024 * 1024, // 50MB\r\n maxFiles: 10,\r\n allowedTypes: ['image/*', 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\r\n allowedExtensions: ['.pdf', '.jpg', '.jpeg', '.png', '.gif', '.doc', '.docx'],\r\n};\r\n\r\n/**\r\n * Validate a single file against constraints\r\n * \r\n * @param file - File to validate\r\n * @param constraints - Validation constraints\r\n * @returns Validation result with errors array\r\n * \r\n * @example\r\n * ```ts\r\n * const result = validateFile(file, DEFAULT_ATTACHMENT_CONSTRAINTS);\r\n * if (result.errors.length > 0) {\r\n * console.error('File validation failed:', result.errors);\r\n * }\r\n * ```\r\n */\r\nexport function validateFile(\r\n file: File,\r\n constraints: AttachmentConstraints = DEFAULT_ATTACHMENT_CONSTRAINTS\r\n): {\r\n valid: boolean;\r\n errors: string[];\r\n} {\r\n const errors: string[] = [];\r\n\r\n // Validate file size\r\n if (file.size > constraints.maxFileSize) {\r\n const maxMB = (constraints.maxFileSize / 1024 / 1024).toFixed(1);\r\n const fileMB = (file.size / 1024 / 1024).toFixed(1);\r\n errors.push(`File \"${file.name}\" is too large (${fileMB}MB). Maximum size is ${maxMB}MB.`);\r\n }\r\n\r\n // Validate file type (MIME type)\r\n const isTypeAllowed = constraints.allowedTypes.some((allowedType) => {\r\n if (allowedType.endsWith('/*')) {\r\n // Wildcard type (e.g., 'image/*')\r\n const prefix = allowedType.slice(0, -2);\r\n return file.type.startsWith(prefix);\r\n }\r\n return file.type === allowedType;\r\n });\r\n\r\n if (!isTypeAllowed && constraints.allowedTypes.length > 0) {\r\n errors.push(\r\n `File type \"${file.type}\" is not allowed for \"${file.name}\". Allowed types: ${constraints.allowedTypes.join(', ')}`\r\n );\r\n }\r\n\r\n // Validate file extension\r\n if (constraints.allowedExtensions && constraints.allowedExtensions.length > 0) {\r\n const fileExt = '.' + file.name.split('.').pop()?.toLowerCase();\r\n const isExtAllowed = constraints.allowedExtensions.some(\r\n (ext) => ext.toLowerCase() === fileExt\r\n );\r\n\r\n if (!isExtAllowed) {\r\n errors.push(\r\n `File extension \"${fileExt}\" is not allowed for \"${file.name}\". Allowed extensions: ${constraints.allowedExtensions.join(', ')}`\r\n );\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * Validate multiple files against constraints\r\n * \r\n * @param files - Files to validate\r\n * @param existingAttachments - Existing attachments to consider for total size/count\r\n * @param constraints - Validation constraints\r\n * @returns Validation result with errors array\r\n * \r\n * @example\r\n * ```ts\r\n * const result = validateFiles(newFiles, existingAttachments, DEFAULT_ATTACHMENT_CONSTRAINTS);\r\n * if (result.errors.length > 0) {\r\n * alert('Some files cannot be uploaded: ' + result.errors.join(', '));\r\n * }\r\n * ```\r\n */\r\nexport function validateFiles(\r\n files: File[],\r\n existingAttachments: Attachment[] = [],\r\n constraints: AttachmentConstraints = DEFAULT_ATTACHMENT_CONSTRAINTS\r\n): {\r\n valid: boolean;\r\n errors: string[];\r\n} {\r\n const errors: string[] = [];\r\n\r\n // Validate total number of files\r\n const totalFiles = files.length + existingAttachments.length;\r\n if (totalFiles > constraints.maxFiles) {\r\n errors.push(\r\n `Too many files. Maximum allowed is ${constraints.maxFiles}, you have ${totalFiles} files total.`\r\n );\r\n }\r\n\r\n // Validate total size\r\n const existingSize = existingAttachments.reduce((sum, att) => sum + att.size, 0);\r\n const newFilesSize = files.reduce((sum, file) => sum + file.size, 0);\r\n const totalSize = existingSize + newFilesSize;\r\n\r\n if (totalSize > constraints.maxTotalSize) {\r\n const maxMB = (constraints.maxTotalSize / 1024 / 1024).toFixed(1);\r\n const totalMB = (totalSize / 1024 / 1024).toFixed(1);\r\n errors.push(\r\n `Total size of all files is too large (${totalMB}MB). Maximum total size is ${maxMB}MB.`\r\n );\r\n }\r\n\r\n // Validate each individual file\r\n for (const file of files) {\r\n const fileResult = validateFile(file, constraints);\r\n errors.push(...fileResult.errors);\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n };\r\n}\r\n\r\n/**\r\n * Validate file and throw error if invalid\r\n * \r\n * Convenience function that throws AttachmentValidationError if validation fails.\r\n * \r\n * @param file - File to validate\r\n * @param constraints - Validation constraints\r\n * @throws {AttachmentValidationError} If validation fails\r\n * \r\n * @example\r\n * ```ts\r\n * try {\r\n * validateFileOrThrow(file);\r\n * // File is valid, proceed with upload\r\n * } catch (err) {\r\n * if (err instanceof AttachmentValidationError) {\r\n * alert(err.message);\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport function validateFileOrThrow(\r\n file: File,\r\n constraints: AttachmentConstraints = DEFAULT_ATTACHMENT_CONSTRAINTS\r\n): void {\r\n const result = validateFile(file, constraints);\r\n if (!result.valid) {\r\n throw new AttachmentValidationError(\r\n `File validation failed: ${result.errors.join('; ')}`,\r\n file.name,\r\n { file, errors: result.errors }\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Validate multiple files and throw error if invalid\r\n * \r\n * @param files - Files to validate\r\n * @param existingAttachments - Existing attachments\r\n * @param constraints - Validation constraints\r\n * @throws {AttachmentValidationError} If validation fails\r\n * \r\n * @example\r\n * ```ts\r\n * try {\r\n * validateFilesOrThrow(selectedFiles, currentAttachments);\r\n * // All files are valid\r\n * } catch (err) {\r\n * if (err instanceof AttachmentValidationError) {\r\n * alert(err.message);\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport function validateFilesOrThrow(\r\n files: File[],\r\n existingAttachments: Attachment[] = [],\r\n constraints: AttachmentConstraints = DEFAULT_ATTACHMENT_CONSTRAINTS\r\n): void {\r\n const result = validateFiles(files, existingAttachments, constraints);\r\n if (!result.valid) {\r\n throw new AttachmentValidationError(\r\n `File validation failed: ${result.errors.join('; ')}`,\r\n undefined,\r\n { files, errors: result.errors }\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Check if a file type is an image\r\n * \r\n * @param fileType - MIME type of the file\r\n * @returns true if the file is an image\r\n * \r\n * @example\r\n * ```ts\r\n * if (isImageType(file.type)) {\r\n * // Generate preview\r\n * }\r\n * ```\r\n */\r\nexport function isImageType(fileType: string): boolean {\r\n return fileType.startsWith('image/');\r\n}\r\n\r\n/**\r\n * Format file size for display\r\n * \r\n * @param bytes - File size in bytes\r\n * @returns Formatted size string (e.g., \"1.5 MB\")\r\n * \r\n * @example\r\n * ```ts\r\n * const sizeDisplay = formatFileSize(file.size); // \"1.5 MB\"\r\n * ```\r\n */\r\nexport function formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 Bytes';\r\n \r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n \r\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\r\n}\r\n\r\n","/**\r\n * Date Validation and Parsing Utility\r\n * Handles parsing of various date formats and validation\r\n */\r\n\r\nimport { parse, isValid as isValidDate, parseISO } from 'date-fns';\r\n\r\nexport interface DateValidationResult {\r\n isValid: boolean;\r\n date: Date | null;\r\n isoString: string | null;\r\n originalValue: string;\r\n error?: string;\r\n}\r\n\r\nfunction toIsoDateString(date: Date): string {\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n\r\n/**\r\n * Parse and validate a date string from various formats\r\n * Attempts to parse common formats: ISO, US, EU, timestamps\r\n * \r\n * Format priority:\r\n * 1. ISO 8601 (YYYY-MM-DD)\r\n * 2. US format (MM/DD/YYYY) - assumes US format for ambiguous dates\r\n * 3. EU format (DD/MM/YYYY)\r\n * 4. Timestamp (numeric string)\r\n * \r\n * @param value - The date string to parse\r\n * @returns Validation result with parsed date or error\r\n */\r\nexport function parseAndValidateDate(value: string | null | undefined): DateValidationResult {\r\n const originalValue = String(value || '');\r\n \r\n // Handle empty values\r\n if (!value || value.trim() === '') {\r\n return {\r\n isValid: false,\r\n date: null,\r\n isoString: null,\r\n originalValue,\r\n error: 'Date is required',\r\n };\r\n }\r\n\r\n const trimmedValue = value.trim();\r\n const sanitizedValue = trimmedValue\r\n // Remove ordinal suffixes (1st, 2nd, 3rd, 21st, etc.)\r\n .replace(/(\\d+)(st|nd|rd|th)/gi, '$1')\r\n // Normalize commas to spaces for natural language inputs\r\n .replace(/,/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n\r\n // Try ISO 8601 format first (YYYY-MM-DD)\r\n try {\r\n const isoDate = parseISO(trimmedValue);\r\n if (isValidDate(isoDate) && !isNaN(isoDate.getTime())) {\r\n return {\r\n isValid: true,\r\n date: isoDate,\r\n isoString: trimmedValue,\r\n originalValue,\r\n };\r\n }\r\n } catch {\r\n // Continue to next format\r\n }\r\n\r\n // Handle two-digit year inputs like 01/05/24 by assuming 2000-based year\r\n const shortYearMatch = sanitizedValue.match(/^(\\d{1,2})[\\/.\\-](\\d{1,2})[\\/.\\-](\\d{2})$/);\r\n if (shortYearMatch) {\r\n const [, monthStr, dayStr, yearStr] = shortYearMatch;\r\n const month = parseInt(monthStr ?? '', 10);\r\n const day = parseInt(dayStr ?? '', 10);\r\n const year = 2000 + parseInt(yearStr ?? '', 10);\r\n const candidate = new Date(year, month - 1, day);\r\n if (isValidDate(candidate) && !isNaN(candidate.getTime())) {\r\n return {\r\n isValid: true,\r\n date: candidate,\r\n isoString: toIsoDateString(candidate),\r\n originalValue,\r\n };\r\n }\r\n }\r\n\r\n // Try common date formats\r\n const formats = [\r\n // US formats (MM/DD/YYYY - assume US for ambiguous dates)\r\n { pattern: 'MM/dd/yyyy', name: 'US format (MM/DD/YYYY)' },\r\n { pattern: 'M/d/yyyy', name: 'US format (M/D/YYYY)' },\r\n { pattern: 'MM-dd-yyyy', name: 'US format (MM-DD-YYYY)' },\r\n { pattern: 'M-d-yyyy', name: 'US format (M-D-YYYY)' },\r\n { pattern: 'MM/dd/yy', name: 'US format (MM/DD/YY)' },\r\n { pattern: 'M/d/yy', name: 'US format (M/D/YY)' },\r\n { pattern: 'MM-dd-yy', name: 'US format (MM-DD-YY)' },\r\n { pattern: 'M-d-yy', name: 'US format (M-D-YY)' },\r\n \r\n // EU formats (DD/MM/YYYY)\r\n { pattern: 'dd/MM/yyyy', name: 'EU format (DD/MM/YYYY)' },\r\n { pattern: 'd/M/yyyy', name: 'EU format (D/M/YYYY)' },\r\n { pattern: 'dd.MM.yyyy', name: 'EU format (DD.MM.YYYY)' },\r\n { pattern: 'd.M.yyyy', name: 'EU format (D.M.YYYY)' },\r\n \r\n // Full month names\r\n { pattern: 'MMMM d, yyyy', name: 'Month name format (January 1, 2024)' },\r\n { pattern: 'MMM d, yyyy', name: 'Short month format (Jan 1, 2024)' },\r\n { pattern: 'MMMM d yyyy', name: 'Month name format without comma (January 1 2024)' },\r\n { pattern: 'MMM d yyyy', name: 'Short month without comma (Jan 1 2024)' },\r\n { pattern: 'd MMMM yyyy', name: 'EU month format (1 January 2024)' },\r\n { pattern: 'd MMM yyyy', name: 'EU month short format (1 Jan 2024)' },\r\n { pattern: 'd MMM, yyyy', name: 'EU month short with comma (1 Jan, 2024)' },\r\n \r\n // Year first formats\r\n { pattern: 'yyyy/MM/dd', name: 'ISO-like format (YYYY/MM/DD)' },\r\n { pattern: 'yyyy-MM-dd', name: 'ISO format with dashes' },\r\n ];\r\n\r\n const referenceDate = new Date();\r\n\r\n for (const { pattern } of formats) {\r\n try {\r\n const parsedDate = parse(sanitizedValue, pattern, referenceDate);\r\n if (isValidDate(parsedDate) && !isNaN(parsedDate.getTime())) {\r\n // Convert to ISO string format (YYYY-MM-DD)\r\n const isoString = toIsoDateString(parsedDate);\r\n \r\n return {\r\n isValid: true,\r\n date: parsedDate,\r\n isoString,\r\n originalValue,\r\n };\r\n }\r\n } catch {\r\n // Continue to next format\r\n }\r\n }\r\n\r\n // Try parsing as timestamp (milliseconds)\r\n if (/^\\d+$/.test(trimmedValue)) {\r\n try {\r\n const timestamp = parseInt(trimmedValue, 10);\r\n const date = new Date(timestamp);\r\n if (isValidDate(date) && !isNaN(date.getTime())) {\r\n const isoString = toIsoDateString(date);\r\n \r\n return {\r\n isValid: true,\r\n date,\r\n isoString,\r\n originalValue,\r\n };\r\n }\r\n } catch {\r\n // Not a valid timestamp\r\n }\r\n }\r\n\r\n // Lenient fallback using native Date parsing after sanitization\r\n const nativeParsed = new Date(sanitizedValue);\r\n if (isValidDate(nativeParsed) && !isNaN(nativeParsed.getTime())) {\r\n return {\r\n isValid: true,\r\n date: nativeParsed,\r\n isoString: toIsoDateString(nativeParsed),\r\n originalValue,\r\n };\r\n }\r\n\r\n // All formats failed\r\n return {\r\n isValid: false,\r\n date: null,\r\n isoString: null,\r\n originalValue,\r\n error: `Invalid date format: \"${trimmedValue}\". Please use a date picker or format like MM/DD/YYYY.`,\r\n };\r\n}\r\n\r\n/**\r\n * Validate if a string is a valid ISO date (YYYY-MM-DD)\r\n */\r\nexport function isValidISODate(value: string | null | undefined): boolean {\r\n if (!value || typeof value !== 'string') {\r\n return false;\r\n }\r\n\r\n const isoPattern = /^\\d{4}-\\d{2}-\\d{2}$/;\r\n if (!isoPattern.test(value)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const date = parseISO(value);\r\n return isValidDate(date) && !isNaN(date.getTime());\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n","/**\r\n * Usage tracking utilities for signiphi API integration.\r\n * Enables automatic tracking of document sends and signings via API key.\r\n */\r\n\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * Configuration for the tracking API\r\n */\r\nexport interface TrackingConfig {\r\n /** API key for authentication */\r\n apiKey: string;\r\n /** Custom API endpoint (defaults to https://api.signiphi.ai) */\r\n endpoint?: string;\r\n}\r\n\r\n/**\r\n * Data for tracking a document send event\r\n */\r\nexport interface TrackSendData {\r\n /** Email address of the recipient */\r\n recipientEmail: string;\r\n /** Optional document ID for correlation */\r\n documentId?: string;\r\n /** Optional idempotency key to prevent duplicate tracking */\r\n idempotencyKey?: string;\r\n /** Optional additional metadata */\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Data for tracking a document signing event\r\n */\r\nexport interface TrackSigningData {\r\n /** Email address of the signer */\r\n signerEmail: string;\r\n /** Optional document ID for correlation */\r\n documentId?: string;\r\n /** Optional idempotency key to prevent duplicate tracking */\r\n idempotencyKey?: string;\r\n /** Optional additional metadata */\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Response from tracking API\r\n */\r\nexport interface TrackingResponse {\r\n success: boolean;\r\n eventId: string;\r\n idempotencyKey: string;\r\n usage: {\r\n currentMonth: number;\r\n limit: number;\r\n remaining: number;\r\n };\r\n}\r\n\r\nconst DEFAULT_API_ENDPOINT = 'https://api-dev.signiphi.ai';\r\n// const DEFAULT_API_ENDPOINT = 'http://localhost:4000';\r\nconst API_PREFIX = '/api/v1';\r\n\r\n/**\r\n * Track a document send event.\r\n * Call this when a document is sent to a recipient for signing.\r\n *\r\n * @param config - Tracking configuration with API key\r\n * @param data - Send event data\r\n * @returns Tracking response with usage stats\r\n */\r\nexport async function trackDocumentSent(\r\n config: TrackingConfig,\r\n data: TrackSendData,\r\n): Promise<TrackingResponse> {\r\n const endpoint = config.endpoint || DEFAULT_API_ENDPOINT;\r\n const url = `${endpoint}${API_PREFIX}/usage/track-send`;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n recipientEmail: data.recipientEmail,\r\n documentId: data.documentId,\r\n idempotencyKey: data.idempotencyKey,\r\n metadata: data.metadata,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text();\r\n logger.error(`Track send failed: ${response.status} - ${errorText}`);\r\n throw new Error(`Tracking failed: ${response.status}`);\r\n }\r\n\r\n const result = await response.json();\r\n logger.debug('Document send tracked successfully', { eventId: result.eventId });\r\n return result;\r\n } catch (error) {\r\n logger.error('Failed to track document send:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Track a document signing event.\r\n * Call this when a document is signed by a recipient.\r\n *\r\n * @param config - Tracking configuration with API key\r\n * @param data - Signing event data\r\n * @returns Tracking response with usage stats\r\n */\r\nexport async function trackDocumentSigned(\r\n config: TrackingConfig,\r\n data: TrackSigningData,\r\n): Promise<TrackingResponse> {\r\n const endpoint = config.endpoint || DEFAULT_API_ENDPOINT;\r\n const url = `${endpoint}${API_PREFIX}/usage/track-signing`;\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n signerEmail: data.signerEmail,\r\n documentId: data.documentId,\r\n idempotencyKey: data.idempotencyKey,\r\n metadata: data.metadata,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text();\r\n logger.error(`Track signing failed: ${response.status} - ${errorText}`);\r\n throw new Error(`Tracking failed: ${response.status}`);\r\n }\r\n\r\n const result = await response.json();\r\n logger.debug('Document signing tracked successfully', { eventId: result.eventId });\r\n return result;\r\n } catch (error) {\r\n logger.error('Failed to track document signing:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Silently track a document signing event (non-blocking).\r\n * This version catches errors and logs them without throwing.\r\n * Use this when tracking failure should not affect the main flow.\r\n *\r\n * @param config - Tracking configuration with API key\r\n * @param data - Signing event data\r\n */\r\nexport async function trackDocumentSignedSilent(\r\n config: TrackingConfig,\r\n data: TrackSigningData,\r\n): Promise<void> {\r\n try {\r\n await trackDocumentSigned(config, data);\r\n } catch (error) {\r\n logger.warn('Silent tracking failed (non-critical):', error);\r\n }\r\n}\r\n\r\n/**\r\n * Silently track a document send event (non-blocking).\r\n * This version catches errors and logs them without throwing.\r\n * Use this when tracking failure should not affect the main flow.\r\n *\r\n * @param config - Tracking configuration with API key\r\n * @param data - Send event data\r\n */\r\nexport async function trackDocumentSentSilent(\r\n config: TrackingConfig,\r\n data: TrackSendData,\r\n): Promise<void> {\r\n try {\r\n await trackDocumentSent(config, data);\r\n } catch (error) {\r\n logger.warn('Silent tracking failed (non-critical):', error);\r\n }\r\n}\r\n\r\n","import { useRef, useCallback, forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\nimport type { PdfViewerRef, PDFViewerApplication } from '../types';\r\nimport { getPdfJsConfig, initializePdfJs } from '../utils/pdfjs-config';\r\nimport { checkPdfJsVersion } from '../utils/pdfjs-version-check';\r\nimport { logger } from '../utils';\r\n\r\n/**\r\n * Props for the headless PDF viewer core component\r\n */\r\nexport interface PdfViewerCoreProps {\r\n onLoad?: () => void;\r\n onError?: (error: string) => void;\r\n pdfjsBasePath?: string; // Override default PDF.js path (defaults to CDN)\r\n children: (props: {\r\n iframeRef: React.RefObject<HTMLIFrameElement>;\r\n handleIframeLoad: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Headless PDF viewer core component\r\n * Provides PDF loading and form field extraction logic without any UI\r\n */\r\nexport const PdfViewerCore = forwardRef<PdfViewerRef, PdfViewerCoreProps>(\r\n ({ onLoad, onError, pdfjsBasePath, children }, ref) => {\r\n const iframeRef = useRef<HTMLIFrameElement>(null);\r\n const loadedPdfUrl = useRef<string | null>(null);\r\n const initializationPromise = useRef<Promise<void> | null>(null);\r\n const isLoadingRef = useRef<boolean>(false);\r\n const [versionChecked, setVersionChecked] = useState(false);\r\n const [setupError, setSetupError] = useState<string | null>(null);\r\n\r\n const getPDFViewerApplication = useCallback((): PDFViewerApplication | null => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n return null;\r\n }\r\n\r\n const PDFViewerApplication = (\r\n iframe.contentWindow as Window & { PDFViewerApplication: PDFViewerApplication }\r\n ).PDFViewerApplication;\r\n if (!PDFViewerApplication) {\r\n return null;\r\n }\r\n\r\n return PDFViewerApplication;\r\n } catch (error) {\r\n logger.error('Error accessing PDFViewerApplication:', error);\r\n return null;\r\n }\r\n }, []);\r\n\r\n const waitForInitialization = useCallback(async () => {\r\n const PDFViewerApplication = getPDFViewerApplication();\r\n if (!PDFViewerApplication) {\r\n throw new Error('PDFViewerApplication not available');\r\n }\r\n\r\n // Wait for the viewer to be initialized\r\n if (PDFViewerApplication.initializedPromise) {\r\n await PDFViewerApplication.initializedPromise;\r\n }\r\n\r\n // Wait for the document to be loaded\r\n if (PDFViewerApplication.pdfLoadingTask) {\r\n await PDFViewerApplication.pdfLoadingTask.promise;\r\n }\r\n\r\n return PDFViewerApplication;\r\n }, [getPDFViewerApplication]);\r\n\r\n const loadPdf = useCallback(\r\n async (pdfUrl: string) => {\r\n const iframe = iframeRef.current;\r\n if (!iframe) {\r\n logger.error('PDF viewer iframe not available');\r\n return;\r\n }\r\n\r\n // Prevent loading the same PDF multiple times or loading while already loading\r\n if (isLoadingRef.current || loadedPdfUrl.current === pdfUrl) {\r\n return;\r\n }\r\n\r\n isLoadingRef.current = true;\r\n loadedPdfUrl.current = pdfUrl;\r\n\r\n try {\r\n // Initialize PDF.js configuration (lazy, only runs once)\r\n // This ensures the worker is configured before any PDF operations\r\n initializePdfJs();\r\n \r\n // Fetch the PDF data first to avoid CORS issues\r\n const response = await fetch(pdfUrl);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch PDF: ${response.status}`);\r\n }\r\n\r\n const pdfBytes = await response.arrayBuffer();\r\n\r\n // Create a blob URL for the PDF data\r\n const blob = new Blob([pdfBytes], { type: 'application/pdf' });\r\n const blobUrl = URL.createObjectURL(blob);\r\n\r\n // Get PDF.js base path (use prop override or global config)\r\n const config = getPdfJsConfig();\r\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\r\n\r\n // Load the PDF.js viewer with the blob URL\r\n const viewerUrl = `${basePath}/web/viewer.html?file=${encodeURIComponent(blobUrl)}`;\r\n iframe.src = viewerUrl;\r\n\r\n // Create a new initialization promise\r\n initializationPromise.current = new Promise((resolve, reject) => {\r\n const checkInitialization = () => {\r\n try {\r\n const PDFViewerApplication = getPDFViewerApplication();\r\n if (PDFViewerApplication && PDFViewerApplication.initializedPromise) {\r\n PDFViewerApplication.initializedPromise.then(() => {\r\n resolve();\r\n }).catch(reject);\r\n } else {\r\n // Retry after a short delay\r\n setTimeout(checkInitialization, 100);\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n };\r\n\r\n // Start checking after iframe loads\r\n setTimeout(checkInitialization, 500);\r\n });\r\n } catch (error) {\r\n logger.error('Error fetching PDF:', error);\r\n isLoadingRef.current = false;\r\n onError?.(error instanceof Error ? error.message : 'Unknown error');\r\n }\r\n },\r\n [getPDFViewerApplication, onError, pdfjsBasePath]\r\n );\r\n\r\n const getFormFieldValues = useCallback(async (): Promise<Record<string, string>> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n\r\n if (!PDFViewerApplication.pdfDocument) {\r\n return {};\r\n }\r\n\r\n const pdfDocument = PDFViewerApplication.pdfDocument;\r\n const values: Record<string, string> = {};\r\n\r\n // Use the PDF.js API to extract form field values\r\n if (pdfDocument.annotationStorage) {\r\n const annotationStorage = pdfDocument.annotationStorage;\r\n\r\n // Get field objects to understand form structure\r\n let fieldObjects: Record<string, unknown[]> = {};\r\n try {\r\n if (pdfDocument.getFieldObjects) {\r\n const result = await pdfDocument.getFieldObjects();\r\n fieldObjects = result || {};\r\n }\r\n } catch (error) {\r\n logger.warn('Error getting field objects:', error);\r\n }\r\n\r\n // Create mapping from field IDs to names and store field info with widgets\r\n type PDFField = {\r\n id?: string;\r\n type?: string;\r\n value?: unknown;\r\n exportValue?: string;\r\n buttonValue?: string;\r\n defaultValue?: unknown;\r\n name?: string;\r\n };\r\n \r\n type RadioButtonData = {\r\n id: string;\r\n data: unknown;\r\n widget?: PDFField;\r\n };\r\n\r\n const idToNameMap: Record<string, string> = {};\r\n const fieldInfo: Record<string, { type: string; widgets: PDFField[] }> = {};\r\n \r\n for (const [name, fields] of Object.entries(fieldObjects)) {\r\n const fieldArray = fields as PDFField[];\r\n \r\n // Store field type and ALL widgets (critical for radio buttons)\r\n fieldInfo[name] = {\r\n type: fieldArray[0]?.type || '',\r\n widgets: fieldArray\r\n };\r\n \r\n // Create ID to name mapping\r\n for (const field of fieldArray) {\r\n if (field.id) {\r\n idToNameMap[field.id] = name;\r\n }\r\n }\r\n }\r\n\r\n // Get annotation storage data\r\n let storedData: Record<string, unknown> = {};\r\n if (annotationStorage.serializable && annotationStorage.serializable.map) {\r\n const storageMap = annotationStorage.serializable.map;\r\n for (const [key, value] of storageMap.entries()) {\r\n storedData[key] = value;\r\n }\r\n } else if (typeof annotationStorage.getAll === 'function') {\r\n storedData = annotationStorage.getAll();\r\n }\r\n\r\n // Group radio button widgets by field name (Dockmaster approach)\r\n const radioGroups: Record<string, RadioButtonData[]> = {};\r\n \r\n // First pass: identify and group radio buttons from annotationStorage\r\n for (const [id, data] of Object.entries(storedData)) {\r\n const fieldName = idToNameMap[id];\r\n if (!fieldName) continue;\r\n \r\n const fieldType = fieldInfo[fieldName]?.type;\r\n \r\n // Check if this is a radio button field\r\n const isRadioButton = fieldType && (\r\n fieldType.toLowerCase().includes('radio') ||\r\n fieldType.toLowerCase().includes('radiobutton') ||\r\n fieldType === 'radiobutton'\r\n );\r\n \r\n // Fallback detection: if multiple widgets share the same field name, it's likely a radio group\r\n const widgetCount = fieldInfo[fieldName]?.widgets?.length || 0;\r\n const isLikelyRadioGroup = widgetCount > 1 && fieldName.toLowerCase().includes('radio');\r\n \r\n if (fieldName && (isRadioButton || isLikelyRadioGroup)) {\r\n if (!radioGroups[fieldName]) {\r\n radioGroups[fieldName] = [];\r\n }\r\n \r\n // Find the corresponding widget from fieldInfo\r\n const widget = fieldInfo[fieldName]?.widgets?.find((w: PDFField) => w.id === id);\r\n \r\n radioGroups[fieldName].push({ id, data, widget });\r\n }\r\n }\r\n\r\n // Process radio groups to find selected options\r\n for (const [fieldName, radioButtons] of Object.entries(radioGroups)) {\r\n \r\n // Find the selected radio button (the one with value: true)\r\n const selectedRadio = radioButtons.find(rb => \r\n rb.data && typeof rb.data === 'object' && \r\n (rb.data as { value?: boolean }).value === true\r\n );\r\n \r\n if (selectedRadio) {\r\n // Sort radio buttons by their ID to get consistent ordering\r\n const sortedRadioButtons = [...radioButtons].sort((a, b) => {\r\n const aNum = parseInt(a.id.replace(/\\D/g, ''), 10) || 0;\r\n const bNum = parseInt(b.id.replace(/\\D/g, ''), 10) || 0;\r\n return aNum - bNum;\r\n });\r\n \r\n // Find the position of the selected widget\r\n const selectedIndex = sortedRadioButtons.findIndex(rb => rb.id === selectedRadio.id);\r\n \r\n // Store the widget position for later mapping to actual option values\r\n if (selectedIndex >= 0) {\r\n const exportValue = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\r\n values[fieldName] = exportValue;\r\n } else {\r\n values[fieldName] = 'true';\r\n }\r\n }\r\n }\r\n\r\n // Extract values for non-radio fields from stored data\r\n for (const [id, data] of Object.entries(storedData)) {\r\n const fieldName = idToNameMap[id];\r\n \r\n // Skip if already processed as radio button\r\n if (fieldName && values[fieldName]) {\r\n continue;\r\n }\r\n \r\n if (fieldName) {\r\n let extractedValue: string | undefined;\r\n\r\n if (data && typeof data === 'object') {\r\n const dataObj = data as Record<string, unknown>;\r\n if ('value' in dataObj) {\r\n extractedValue = String(dataObj.value);\r\n } else if ('formValue' in dataObj) {\r\n extractedValue = String(dataObj.formValue);\r\n } else if ('textContent' in dataObj) {\r\n extractedValue = String(dataObj.textContent);\r\n }\r\n } else if (data !== undefined && data !== null) {\r\n extractedValue = String(data);\r\n }\r\n\r\n if (extractedValue !== undefined && extractedValue !== '') {\r\n values[fieldName] = extractedValue;\r\n }\r\n }\r\n }\r\n\r\n // Get default values for fields not in storage\r\n for (const [name, fields] of Object.entries(fieldObjects)) {\r\n if (!values[name]) {\r\n const fieldArray = fields as PDFField[];\r\n const field = fieldArray[0];\r\n \r\n if (field && field.value !== undefined && field.value !== null) {\r\n const fieldValue = String(field.value);\r\n const fieldType = fieldInfo[name]?.type;\r\n \r\n // For radio buttons, convert to index pattern using fieldInfo widgets\r\n const isRadioButton = fieldType && (\r\n fieldType.toLowerCase().includes('radio') ||\r\n fieldType === 'radiobutton'\r\n );\r\n \r\n if (isRadioButton && fieldValue !== 'true' && fieldValue !== 'false') {\r\n // Use widgets from fieldInfo (not field.items which may be missing after filtering)\r\n const widgets = fieldInfo[name]?.widgets || [];\r\n \r\n if (widgets.length > 0) {\r\n // Sort widgets by ID to get consistent ordering\r\n const sortedWidgets = [...widgets].sort((a, b) => {\r\n const aNum = parseInt((a.id || '').replace(/\\D/g, ''), 10) || 0;\r\n const bNum = parseInt((b.id || '').replace(/\\D/g, ''), 10) || 0;\r\n return aNum - bNum;\r\n });\r\n \r\n // Find which widget matches the default value\r\n const selectedIndex = sortedWidgets.findIndex(widget => \r\n widget.exportValue === fieldValue || widget.buttonValue === fieldValue\r\n );\r\n \r\n if (selectedIndex >= 0) {\r\n values[name] = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\r\n } else {\r\n }\r\n }\r\n } else {\r\n // Non-radio fields: use the value as-is\r\n values[name] = fieldValue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return values;\r\n } catch (error) {\r\n logger.error('Error extracting form field values:', error);\r\n return {};\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const setFormFieldValues = useCallback(async (values: Record<string, string>): Promise<void> => {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n logger.warn('Cannot set field values: iframe not available');\r\n return;\r\n }\r\n\r\n try {\r\n // Wait for PDF.js to be ready\r\n await waitForInitialization();\r\n\r\n // Small delay to ensure fields are rendered in the DOM\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n\r\n const iframeDoc = iframe.contentWindow.document;\r\n \r\n // Set values for each field by accessing DOM directly\r\n for (const [fieldName, value] of Object.entries(values)) {\r\n try {\r\n // Try to decode the field name (PDF.js might use decoded names in DOM)\r\n // Extract the base name before __LABEL__, __SIGNER__, or __PLACEHOLDER__\r\n let decodedFieldName = fieldName;\r\n if (fieldName.includes('__LABEL__')) {\r\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__LABEL__'));\r\n } else if (fieldName.includes('__SIGNER__')) {\r\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__SIGNER__'));\r\n } else if (fieldName.includes('__PLACEHOLDER__')) {\r\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__PLACEHOLDER__'));\r\n }\r\n \r\n // Try multiple selectors to find the field\r\n // PDF.js might use either the encoded or decoded name\r\n let elements = iframeDoc.querySelectorAll(\r\n `[data-element-id=\"${fieldName}\"], [name=\"${fieldName}\"], [data-element-id=\"${decodedFieldName}\"], [name=\"${decodedFieldName}\"]`\r\n );\r\n \r\n if (elements.length === 0) {\r\n logger.warn(`Field element not found for: ${fieldName}`);\r\n continue;\r\n }\r\n \r\n // Handle radio buttons (multiple elements with same name)\r\n const firstElement = elements[0] as any;\r\n const isRadioGroup = elements.length > 1 && \r\n (firstElement.tagName || '').toLowerCase() === 'input' && \r\n (firstElement.type || '') === 'radio';\r\n \r\n if (isRadioGroup) {\r\n // Radio button group\r\n if (value.includes('__RADIO_OPTION_INDEX_')) {\r\n const match = value.match(/__RADIO_OPTION_INDEX_(\\d+)__/);\r\n if (match && match[1]) {\r\n const selectedIndex = parseInt(match[1], 10);\r\n if (selectedIndex < elements.length) {\r\n const radioElement = elements[selectedIndex] as any;\r\n radioElement.checked = true;\r\n // Dispatch events to notify PDF.js\r\n radioElement.dispatchEvent(new Event('change', { bubbles: true }));\r\n radioElement.dispatchEvent(new Event('input', { bubbles: true }));\r\n radioElement.dispatchEvent(new Event('click', { bubbles: true }));\r\n } else {\r\n logger.warn(`Radio button index ${selectedIndex} out of range for ${fieldName}`);\r\n }\r\n }\r\n }\r\n } else {\r\n // Single element (text, checkbox, dropdown, date, etc.)\r\n const element = elements[0] as any; // Use any to access properties from iframe context\r\n const tagName = (element.tagName || '').toLowerCase();\r\n \r\n // Check tagName instead of instanceof (iframe has different constructor context)\r\n if (tagName === 'input') {\r\n const inputType = element.type || 'text';\r\n if (inputType === 'checkbox') {\r\n const boolValue = value === 'true' || value === 'Yes' || value === 'On';\r\n element.checked = boolValue;\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('click', { bubbles: true }));\r\n } else if (inputType === 'radio') {\r\n // Single radio button\r\n element.checked = value === 'true' || value === element.value;\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('click', { bubbles: true }));\r\n } else {\r\n // Text, date, etc.\r\n element.value = value;\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n }\r\n } else if (tagName === 'select') {\r\n // Dropdown\r\n element.value = value;\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n } else if (tagName === 'textarea') {\r\n // Textarea\r\n element.value = value;\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n } else {\r\n logger.warn(`Unknown element type for field ${fieldName}: ${tagName}`);\r\n }\r\n }\r\n } catch (fieldError) {\r\n logger.error(`Error setting value for field ${fieldName}:`, fieldError);\r\n }\r\n }\r\n\r\n } catch (error) {\r\n logger.error('Error setting form field values:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const getAllFieldNames = useCallback(async (): Promise<string[]> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n\r\n if (!PDFViewerApplication.pdfDocument) {\r\n return [];\r\n }\r\n\r\n const pdfDocument = PDFViewerApplication.pdfDocument;\r\n\r\n let fieldObjects: Record<string, unknown[]> = {};\r\n try {\r\n if (pdfDocument.getFieldObjects) {\r\n const result = await pdfDocument.getFieldObjects();\r\n fieldObjects = result || {};\r\n }\r\n } catch (error) {\r\n return [];\r\n }\r\n\r\n return Object.keys(fieldObjects);\r\n } catch (error) {\r\n logger.error('Error getting all field names:', error);\r\n return [];\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const saveDocument = useCallback(async (): Promise<Uint8Array | null> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n\r\n if (!PDFViewerApplication.pdfDocument) {\r\n return null;\r\n }\r\n\r\n const pdfDocument = PDFViewerApplication.pdfDocument;\r\n\r\n if (typeof pdfDocument.saveDocument === 'function') {\r\n const savedBytes = await pdfDocument.saveDocument();\r\n return new Uint8Array(savedBytes);\r\n } else if (pdfDocument.getData) {\r\n const originalData = await pdfDocument.getData();\r\n return new Uint8Array(originalData);\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n logger.error('Error saving PDF document:', error);\r\n return null;\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const injectPlaceholders = useCallback((fields: Array<{ id: string; name: string; placeholder?: string }>) => {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n return;\r\n }\r\n\r\n // Wait for PDF.js to render the form fields\r\n setTimeout(() => {\r\n try {\r\n const iframeDoc = iframe.contentWindow!.document;\r\n \r\n // Create a map of field names to placeholders for O(1) lookup\r\n const placeholderMap = new Map<string, string>();\r\n fields.forEach(field => {\r\n if (field.placeholder) {\r\n placeholderMap.set(field.name, field.placeholder);\r\n placeholderMap.set(field.id, field.placeholder);\r\n }\r\n });\r\n\r\n // Query all input fields in the iframe\r\n const inputs = iframeDoc.querySelectorAll('input[data-element-id], input[name]');\r\n \r\n \r\n inputs.forEach((input) => {\r\n const htmlInput = input as HTMLInputElement;\r\n const fieldId = htmlInput.getAttribute('data-element-id') || htmlInput.name;\r\n \r\n if (fieldId) {\r\n const placeholder = placeholderMap.get(fieldId);\r\n if (placeholder) {\r\n htmlInput.placeholder = placeholder;\r\n }\r\n }\r\n });\r\n } catch (error) {\r\n logger.error('Error injecting placeholders:', error);\r\n }\r\n }, 1000); // Wait 1 second for PDF.js to render\r\n }, []);\r\n\r\n const zoomIn = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.increaseScale === 'function') {\r\n PDFViewerApplication.pdfViewer.increaseScale();\r\n }\r\n } catch (error) {\r\n logger.error('Error zooming in:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const zoomOut = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.decreaseScale === 'function') {\r\n PDFViewerApplication.pdfViewer.decreaseScale();\r\n }\r\n } catch (error) {\r\n logger.error('Error zooming out:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const nextPage = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.nextPage === 'function') {\r\n PDFViewerApplication.pdfViewer.nextPage();\r\n }\r\n } catch (error) {\r\n logger.error('Error going to next page:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const previousPage = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.previousPage === 'function') {\r\n PDFViewerApplication.pdfViewer.previousPage();\r\n }\r\n } catch (error) {\r\n logger.error('Error going to previous page:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const getCurrentPage = useCallback(async (): Promise<number | null> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.currentPageNumber === 'number') {\r\n return PDFViewerApplication.pdfViewer.currentPageNumber;\r\n }\r\n return null;\r\n } catch (error) {\r\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\r\n // Only log if it's an unexpected error\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\r\n logger.error('Error getting current page:', error);\r\n }\r\n return null;\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const getTotalPages = useCallback(async (): Promise<number | null> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.pagesCount === 'number') {\r\n return PDFViewerApplication.pdfViewer.pagesCount;\r\n }\r\n return null;\r\n } catch (error) {\r\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\r\n // Only log if it's an unexpected error\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\r\n logger.error('Error getting total pages:', error);\r\n }\r\n return null;\r\n }\r\n }, [waitForInitialization]);\r\n\r\n // Check PDF.js version on mount\r\n useEffect(() => {\r\n if (!versionChecked) {\r\n const config = getPdfJsConfig();\r\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\r\n \r\n checkPdfJsVersion(basePath).then((result) => {\r\n setVersionChecked(true);\r\n \r\n if (!result.viewerExists) {\r\n const errorMsg = `⚠️ PDF.js files not found\\n\\nThe PDF viewer requires PDF.js files to be installed.\\nThis should happen automatically, but you can run:\\n\\n npx signiphi-setup\\n\\nOr reinstall the package:\\n\\n npm install @signiphi/pdf-signer`;\r\n setSetupError(errorMsg);\r\n logger.error(errorMsg);\r\n } else if (!result.versionMatch) {\r\n logger.warn(\r\n `⚠️ PDF.js version mismatch:\\n` +\r\n ` Viewer: ${result.viewerVersion}\\n` +\r\n ` Worker: ${result.workerVersion}\\n` +\r\n `Run: npx signiphi-setup to sync versions`\r\n );\r\n }\r\n }).catch((error) => {\r\n logger.error('Failed to check PDF.js version:', error);\r\n setVersionChecked(true);\r\n });\r\n }\r\n }, [pdfjsBasePath, versionChecked]);\r\n\r\n const handleIframeLoad = useCallback(() => {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n return;\r\n }\r\n\r\n try {\r\n // Check if iframe failed to load (404 error for viewer.html)\r\n if (iframe.contentDocument) {\r\n const title = iframe.contentDocument.title;\r\n const body = iframe.contentDocument.body;\r\n \r\n // Detect common error patterns (404, file not found)\r\n if (\r\n title?.includes('404') || \r\n title?.includes('Not Found') ||\r\n body?.textContent?.includes('404') ||\r\n body?.textContent?.includes('Cannot GET')\r\n ) {\r\n const errorMsg = setupError || `⚠️ PDF.js viewer not found\\n\\nThe viewer.html file could not be loaded from the configured path.\\nRun: npx signiphi-setup\\n\\nOr check your configuration.`;\r\n logger.error(errorMsg);\r\n isLoadingRef.current = false;\r\n onError?.(errorMsg);\r\n return;\r\n }\r\n }\r\n\r\n setTimeout(async () => {\r\n try {\r\n if (initializationPromise.current) {\r\n await initializationPromise.current;\r\n isLoadingRef.current = false;\r\n onLoad?.();\r\n } else {\r\n const PDFViewerApplication = getPDFViewerApplication();\r\n if (PDFViewerApplication) {\r\n isLoadingRef.current = false;\r\n onLoad?.();\r\n } else {\r\n throw new Error('PDFViewerApplication not found after iframe load');\r\n }\r\n }\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Unknown error loading PDF viewer';\r\n logger.error('Error in PDF.js initialization:', error);\r\n isLoadingRef.current = false;\r\n onError?.(errorMessage);\r\n }\r\n }, 1000);\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Unknown error in iframe load handler';\r\n logger.error('Error in iframe load handler:', error);\r\n isLoadingRef.current = false;\r\n onError?.(errorMessage);\r\n }\r\n }, [getPDFViewerApplication, onLoad, onError, setupError]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n loadPdf,\r\n getFormFieldValues,\r\n setFormFieldValues,\r\n getAllFieldNames,\r\n saveDocument,\r\n getPDFViewerApplication,\r\n injectPlaceholders,\r\n zoomIn,\r\n zoomOut,\r\n nextPage,\r\n previousPage,\r\n getCurrentPage,\r\n getTotalPages,\r\n }),\r\n [loadPdf, getFormFieldValues, setFormFieldValues, getAllFieldNames, saveDocument, getPDFViewerApplication, injectPlaceholders, zoomIn, zoomOut, nextPage, previousPage, getCurrentPage, getTotalPages]\r\n );\r\n\r\n return <>{children({ iframeRef, handleIframeLoad })}</>;\r\n }\r\n);\r\n\r\nPdfViewerCore.displayName = 'PdfViewerCore';\r\n\r\n","import {\r\n useRef,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n forwardRef,\r\n useImperativeHandle,\r\n} from 'react';\r\nimport type { SignatureCanvasRef } from '../types';\r\n\r\n/**\r\n * Props for the headless signature capture core component\r\n */\r\nexport interface SignatureCaptureCoreProps {\r\n width?: number;\r\n height?: number;\r\n onSignature?: (dataUrl: string) => void;\r\n children: (props: {\r\n canvasRef: React.RefObject<HTMLCanvasElement>;\r\n containerRef: React.RefObject<HTMLDivElement>;\r\n isEmpty: boolean;\r\n canvasSize: { width: number; height: number };\r\n handlers: {\r\n onMouseDown: (e: React.MouseEvent) => void;\r\n onMouseMove: (e: React.MouseEvent) => void;\r\n onMouseUp: () => void;\r\n onMouseLeave: () => void;\r\n onTouchStart: (e: React.TouchEvent) => void;\r\n onTouchMove: (e: React.TouchEvent) => void;\r\n onTouchEnd: () => void;\r\n };\r\n actions: {\r\n clear: () => void;\r\n save: () => void;\r\n };\r\n }) => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Headless signature capture core component\r\n * Provides canvas drawing logic without any UI\r\n */\r\nexport const SignatureCaptureCore = forwardRef<SignatureCanvasRef, SignatureCaptureCoreProps>(\r\n ({ width = 400, height = 200, onSignature, children }, ref) => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [isDrawing, setIsDrawing] = useState(false);\r\n const [isEmpty, setIsEmpty] = useState(true);\r\n const [lastPoint, setLastPoint] = useState<{ x: number; y: number } | null>(null);\r\n const [canvasSize, setCanvasSize] = useState({ width, height });\r\n\r\n // Handle responsive canvas sizing\r\n useEffect(() => {\r\n const updateCanvasSize = () => {\r\n if (containerRef.current) {\r\n const containerWidth = containerRef.current.offsetWidth;\r\n const maxWidth = Math.max(containerWidth - 16, width);\r\n const aspectRatio = width / height;\r\n const newHeight = maxWidth / aspectRatio;\r\n\r\n setCanvasSize({\r\n width: maxWidth,\r\n height: newHeight,\r\n });\r\n }\r\n };\r\n\r\n setTimeout(updateCanvasSize, 100);\r\n window.addEventListener('resize', updateCanvasSize);\r\n return () => window.removeEventListener('resize', updateCanvasSize);\r\n }, [width, height]);\r\n\r\n const getCanvasContext = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return null;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return null;\r\n\r\n return { canvas, ctx };\r\n }, []);\r\n\r\n const setupCanvas = useCallback(() => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { canvas, ctx } = result;\r\n\r\n // Set canvas size\r\n canvas.width = canvasSize.width;\r\n canvas.height = canvasSize.height;\r\n\r\n // Configure drawing context\r\n ctx.strokeStyle = '#000000';\r\n ctx.lineWidth = window.innerWidth < 768 ? 3 : 2;\r\n ctx.lineCap = 'round';\r\n ctx.lineJoin = 'round';\r\n ctx.imageSmoothingEnabled = true;\r\n\r\n // Clear canvas with white background\r\n ctx.fillStyle = '#ffffff';\r\n ctx.fillRect(0, 0, canvasSize.width, canvasSize.height);\r\n }, [canvasSize, getCanvasContext]);\r\n\r\n const clear = useCallback(() => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { ctx } = result;\r\n ctx.fillStyle = '#ffffff';\r\n ctx.fillRect(0, 0, canvasSize.width, canvasSize.height);\r\n queueMicrotask(() => setIsEmpty(true));\r\n }, [canvasSize, getCanvasContext]);\r\n\r\n const getSignatureDataUrl = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas || isEmpty) return null;\r\n\r\n return canvas.toDataURL('image/png');\r\n }, [isEmpty]);\r\n\r\n const getRelativePosition = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return null;\r\n\r\n const rect = canvas.getBoundingClientRect();\r\n const scaleX = canvas.width / rect.width;\r\n const scaleY = canvas.height / rect.height;\r\n\r\n let clientX: number, clientY: number;\r\n\r\n if ('touches' in e) {\r\n const touch = e.touches[0] || e.changedTouches[0];\r\n if (!touch) return null;\r\n clientX = touch.clientX;\r\n clientY = touch.clientY;\r\n } else {\r\n clientX = e.clientX;\r\n clientY = e.clientY;\r\n }\r\n\r\n return {\r\n x: (clientX - rect.left) * scaleX,\r\n y: (clientY - rect.top) * scaleY,\r\n };\r\n },\r\n []\r\n );\r\n\r\n const drawLine = useCallback(\r\n (from: { x: number; y: number }, to: { x: number; y: number }) => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { ctx } = result;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(from.x, from.y);\r\n ctx.lineTo(to.x, to.y);\r\n ctx.stroke();\r\n\r\n queueMicrotask(() => setIsEmpty(false));\r\n },\r\n [getCanvasContext]\r\n );\r\n\r\n const startDrawing = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n e.preventDefault();\r\n const point = getRelativePosition(e);\r\n if (!point) return;\r\n\r\n setIsDrawing(true);\r\n setLastPoint(point);\r\n },\r\n [getRelativePosition]\r\n );\r\n\r\n const draw = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n if (!isDrawing || !lastPoint) return;\r\n\r\n e.preventDefault();\r\n const point = getRelativePosition(e);\r\n if (!point) return;\r\n\r\n drawLine(lastPoint, point);\r\n setLastPoint(point);\r\n },\r\n [isDrawing, lastPoint, getRelativePosition, drawLine]\r\n );\r\n\r\n const stopDrawing = useCallback(() => {\r\n setIsDrawing(false);\r\n setLastPoint(null);\r\n }, []);\r\n\r\n const handleSave = useCallback(() => {\r\n if (isEmpty) return;\r\n\r\n const dataUrl = getSignatureDataUrl();\r\n if (dataUrl && onSignature) {\r\n onSignature(dataUrl);\r\n }\r\n }, [isEmpty, getSignatureDataUrl, onSignature]);\r\n\r\n // Initialize canvas\r\n useEffect(() => {\r\n setupCanvas();\r\n }, [setupCanvas]);\r\n\r\n // Mouse event handlers\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent) => {\r\n startDrawing(e);\r\n },\r\n [startDrawing]\r\n );\r\n\r\n const handleMouseMove = useCallback(\r\n (e: React.MouseEvent) => {\r\n draw(e);\r\n },\r\n [draw]\r\n );\r\n\r\n const handleMouseUp = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n // Touch event handlers\r\n const handleTouchStart = useCallback(\r\n (e: React.TouchEvent) => {\r\n startDrawing(e);\r\n },\r\n [startDrawing]\r\n );\r\n\r\n const handleTouchMove = useCallback(\r\n (e: React.TouchEvent) => {\r\n draw(e);\r\n },\r\n [draw]\r\n );\r\n\r\n const handleTouchEnd = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n clear,\r\n getSignatureDataUrl,\r\n isEmpty: () => isEmpty,\r\n }),\r\n [clear, getSignatureDataUrl, isEmpty]\r\n );\r\n\r\n return (\r\n <>\r\n {children({\r\n canvasRef,\r\n containerRef,\r\n isEmpty,\r\n canvasSize,\r\n handlers: {\r\n onMouseDown: handleMouseDown,\r\n onMouseMove: handleMouseMove,\r\n onMouseUp: handleMouseUp,\r\n onMouseLeave: handleMouseLeave,\r\n onTouchStart: handleTouchStart,\r\n onTouchMove: handleTouchMove,\r\n onTouchEnd: handleTouchEnd,\r\n },\r\n actions: {\r\n clear,\r\n save: handleSave,\r\n },\r\n })}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nSignatureCaptureCore.displayName = 'SignatureCaptureCore';\r\n\r\n","import { forwardRef } from 'react';\r\nimport { ErrorBoundary } from 'react-error-boundary';\r\nimport { PdfViewerCore } from '../core';\r\nimport type { PdfViewerRef } from '../types';\r\nimport { logger } from '../utils';\r\n\r\n/**\r\n * Props for the styled PDF viewer component\r\n */\r\nexport interface PdfViewerStyledProps {\r\n className?: string;\r\n onLoad?: () => void;\r\n onError?: (error: string) => void;\r\n pdfjsBasePath?: string; // Override default PDF.js path (defaults to CDN)\r\n}\r\n\r\n/**\r\n * Styled PDF viewer component with Tailwind CSS\r\n * Wraps PdfViewerCore with UI styling\r\n */\r\nexport const PdfViewerStyled = forwardRef<PdfViewerRef, PdfViewerStyledProps>(\r\n ({ className = '', onLoad, onError, pdfjsBasePath }, ref) => {\r\n return (\r\n <ErrorBoundary\r\n FallbackComponent={({ error, resetErrorBoundary }) => (\r\n <div className=\"flex flex-col items-center justify-center w-full h-full bg-destructive/10 rounded-lg border border-destructive/30 p-4\">\r\n <div className=\"w-12 h-12 text-destructive mb-4\">\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n strokeWidth={1.5}\r\n stroke=\"currentColor\"\r\n >\r\n <path\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"\r\n />\r\n </svg>\r\n </div>\r\n <h3 className=\"text-lg font-medium text-destructive mb-2\">\r\n PDF Viewer Error\r\n </h3>\r\n <p className=\"text-destructive text-sm text-center max-w-md mb-4\">\r\n {error.message || 'Failed to load the PDF viewer component'}\r\n </p>\r\n <button\r\n onClick={resetErrorBoundary}\r\n className=\"px-4 py-2 text-sm bg-destructive/10 hover:bg-destructive/20 text-destructive rounded border border-destructive/30 transition-colors\"\r\n >\r\n Try Again\r\n </button>\r\n </div>\r\n )}\r\n onError={(error) => {\r\n logger.error('PDF Viewer Error:', error);\r\n onError?.(error.message);\r\n }}\r\n >\r\n <PdfViewerCore ref={ref} onLoad={onLoad} onError={onError} pdfjsBasePath={pdfjsBasePath}>\r\n {({ iframeRef, handleIframeLoad }) => (\r\n <div\r\n className={`w-full h-full relative ${className}`}\r\n style={{ margin: 0, padding: 0 }}\r\n >\r\n <iframe\r\n ref={iframeRef}\r\n className=\"w-full h-full border-0\"\r\n title=\"PDF Viewer\"\r\n onLoad={handleIframeLoad}\r\n sandbox=\"allow-scripts allow-same-origin allow-forms\"\r\n style={{ minHeight: '600px', margin: 0, padding: 0 }}\r\n />\r\n </div>\r\n )}\r\n </PdfViewerCore>\r\n </ErrorBoundary>\r\n );\r\n }\r\n);\r\n\r\nPdfViewerStyled.displayName = 'PdfViewerStyled';\r\n\r\n","import { clsx, type ClassValue } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\n/**\r\n * Utility function to merge Tailwind CSS classes intelligently\r\n * Combines clsx for conditional classes and tailwind-merge for conflict resolution\r\n */\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n\r\n","import * as React from 'react';\r\nimport { Slot } from '@radix-ui/react-slot';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nimport { cn } from '../utils';\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\r\n destructive:\r\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\r\n outline:\r\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\r\n secondary:\r\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\r\n link: \"text-primary underline-offset-4 hover:underline\",\r\n },\r\n size: {\r\n default: \"h-10 px-4 py-2\",\r\n sm: \"h-9 rounded-md px-3\",\r\n lg: \"h-11 rounded-md px-8\",\r\n icon: \"h-10 w-10\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n);\r\n\r\nexport interface ButtonProps\r\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\r\n VariantProps<typeof buttonVariants> {\r\n asChild?: boolean;\r\n}\r\n\r\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\r\n ({ className, variant, size, asChild = false, ...props }, ref) => {\r\n const Comp = asChild ? Slot : 'button';\r\n return (\r\n <Comp\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n ref={ref}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\nButton.displayName = 'Button';\r\n\r\nexport { Button, buttonVariants };\r\n","import { forwardRef } from 'react';\r\nimport { SignatureCaptureCore } from '../core';\r\nimport type { SignatureCanvasRef } from '../types';\r\nimport { Button } from '../lib/ui/button';\r\n\r\nexport interface SignatureCanvasProps {\r\n width?: number;\r\n height?: number;\r\n onSignature?: (dataUrl: string) => void;\r\n onCancel?: () => void;\r\n title?: string;\r\n className?: string;\r\n showActions?: boolean;\r\n}\r\n\r\nexport const SignatureCanvas = forwardRef<SignatureCanvasRef, SignatureCanvasProps>(\r\n (\r\n {\r\n width = 400,\r\n height = 200,\r\n onSignature,\r\n onCancel,\r\n title = 'Please sign here',\r\n className = '',\r\n showActions = true,\r\n },\r\n ref\r\n ) => {\r\n return (\r\n <SignatureCaptureCore\r\n ref={ref}\r\n width={width}\r\n height={height}\r\n onSignature={onSignature}\r\n >\r\n {({ canvasRef, containerRef, isEmpty, canvasSize, handlers, actions }) => (\r\n <div\r\n className={`flex flex-col items-center gap-2 md:gap-3 ${className}`}\r\n ref={containerRef}\r\n >\r\n <div className=\"relative w-full border-2 border-primary/15 rounded-lg p-2 md:p-4 bg-gradient-to-br from-muted/20 to-muted/40\">\r\n <canvas\r\n ref={canvasRef}\r\n className=\"rounded-md cursor-crosshair touch-none w-full block bg-white shadow-inner border border-border/50\"\r\n style={{\r\n maxWidth: '100%',\r\n width: canvasSize.width,\r\n height: canvasSize.height,\r\n }}\r\n onMouseDown={handlers.onMouseDown}\r\n onMouseMove={handlers.onMouseMove}\r\n onMouseUp={handlers.onMouseUp}\r\n onMouseLeave={handlers.onMouseLeave}\r\n onTouchStart={handlers.onTouchStart}\r\n onTouchMove={handlers.onTouchMove}\r\n onTouchEnd={handlers.onTouchEnd}\r\n />\r\n\r\n {isEmpty && (\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center pointer-events-none gap-2 md:gap-3\">\r\n <div className=\"p-2 md:p-3 bg-primary/10 rounded-full\">\r\n <svg className=\"w-6 h-6 md:w-8 md:h-8 text-primary/60\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z\" />\r\n </svg>\r\n </div>\r\n <span className=\"text-xs md:text-sm font-medium text-muted-foreground px-2 text-center\">{title}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <p className=\"text-xs md:text-sm text-muted-foreground text-center flex items-center justify-center gap-1.5 md:gap-2 px-2\">\r\n <span className=\"text-sm md:text-base\">✍️</span>\r\n <span className=\"hidden sm:inline\">Use your mouse or finger to draw your signature</span>\r\n <span className=\"sm:hidden\">Draw your signature</span>\r\n </p>\r\n\r\n {showActions && (\r\n <div className=\"flex gap-2 md:gap-3 w-full\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={actions.clear}\r\n disabled={isEmpty}\r\n className=\"flex-1 h-9 md:h-11 text-xs md:text-sm hover:bg-muted transition-colors\"\r\n >\r\n Clear\r\n </Button>\r\n\r\n {onCancel && (\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={onCancel}\r\n className=\"flex-1 h-9 md:h-11 text-xs md:text-sm hover:bg-muted transition-colors\"\r\n >\r\n Cancel\r\n </Button>\r\n )}\r\n\r\n <Button\r\n type=\"button\"\r\n onClick={actions.save}\r\n disabled={isEmpty}\r\n className=\"flex-1 h-9 md:h-11 text-xs md:text-sm bg-primary hover:bg-primary/90 text-primary-foreground font-semibold shadow-md hover:shadow-lg transition-all\"\r\n >\r\n Save\r\n </Button>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </SignatureCaptureCore>\r\n );\r\n }\r\n);\r\n\r\nSignatureCanvas.displayName = 'SignatureCanvas';\r\n","import * as React from \"react\"\r\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\r\nimport { X } from \"lucide-react\"\r\n\r\nimport { cn } from \"../utils\"\r\n\r\nconst Dialog = DialogPrimitive.Root\r\n\r\nconst DialogTrigger = DialogPrimitive.Trigger\r\n\r\nconst DialogPortal = DialogPrimitive.Portal\r\n\r\nconst DialogClose = DialogPrimitive.Close\r\n\r\nconst DialogOverlay = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Overlay>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Overlay\r\n ref={ref}\r\n className={cn(\r\n \"fixed inset-0 z-[9998] bg-black/80\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\r\n\r\nconst DialogContent = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\r\n>(({ className, children, ...props }, ref) => (\r\n <DialogPortal>\r\n <DialogOverlay />\r\n <DialogPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n \"fixed left-[50%] top-[50%] z-[9999] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:rounded-lg\",\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none\">\r\n <X className=\"h-4 w-4\" />\r\n <span className=\"sr-only\">Close</span>\r\n </DialogPrimitive.Close>\r\n </DialogPrimitive.Content>\r\n </DialogPortal>\r\n))\r\nDialogContent.displayName = DialogPrimitive.Content.displayName\r\n\r\nconst DialogHeader = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogHeader.displayName = \"DialogHeader\"\r\n\r\nconst DialogFooter = ({\r\n className,\r\n ...props\r\n}: React.HTMLAttributes<HTMLDivElement>) => (\r\n <div\r\n className={cn(\r\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n)\r\nDialogFooter.displayName = \"DialogFooter\"\r\n\r\nconst DialogTitle = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Title>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Title\r\n ref={ref}\r\n className={cn(\r\n \"text-lg font-semibold leading-none tracking-tight\",\r\n className\r\n )}\r\n {...props}\r\n />\r\n))\r\nDialogTitle.displayName = DialogPrimitive.Title.displayName\r\n\r\nconst DialogDescription = React.forwardRef<\r\n React.ElementRef<typeof DialogPrimitive.Description>,\r\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\r\n>(({ className, ...props }, ref) => (\r\n <DialogPrimitive.Description\r\n ref={ref}\r\n className={cn(\"text-sm text-muted-foreground\", className)}\r\n {...props}\r\n />\r\n))\r\nDialogDescription.displayName = DialogPrimitive.Description.displayName\r\n\r\nexport {\r\n Dialog,\r\n DialogPortal,\r\n DialogOverlay,\r\n DialogClose,\r\n DialogTrigger,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n DialogTitle,\r\n DialogDescription,\r\n}\r\n\r\n","/**\r\n * Enhanced Signature Modal Component - Using EXACT shadcn Dialog\r\n * Supports both drawing and uploading signatures/initials\r\n */\r\n\r\nimport React, { useRef, useState, useCallback } from 'react';\r\nimport { SignatureCanvas } from './SignatureCanvas';\r\nimport { FormFieldType, type SignatureCanvasRef } from '../types';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../lib/ui/dialog';\r\nimport { Button } from '../lib/ui/button';\r\n\r\nexport interface SignatureModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSave: (dataUrl: string) => void;\r\n fieldType: FormFieldType;\r\n fieldLabel: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Enhanced signature modal with drawing and upload support\r\n */\r\nexport function SignatureModalCore({\r\n isOpen,\r\n onClose,\r\n onSave,\r\n fieldType,\r\n fieldLabel,\r\n}: SignatureModalProps) {\r\n const canvasRef = useRef<SignatureCanvasRef>(null);\r\n const [uploadedImage, setUploadedImage] = useState<string | null>(null);\r\n const [uploadError, setUploadError] = useState<string | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const handleSave = useCallback(\r\n (dataUrl: string) => {\r\n onSave(dataUrl);\r\n onClose();\r\n },\r\n [onSave, onClose]\r\n );\r\n\r\n const handleCancel = useCallback(() => {\r\n onClose();\r\n }, [onClose]);\r\n\r\n const handleUploadClick = useCallback(() => {\r\n fileInputRef.current?.click();\r\n }, []);\r\n\r\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\r\n const file = e.target.files?.[0];\r\n setUploadError(null); // Clear any previous errors\r\n\r\n if (!file) {\r\n return;\r\n }\r\n\r\n // Validate file type (only PNG and JPEG)\r\n const allowedTypes = ['image/png', 'image/jpeg', 'image/jpg'];\r\n if (!allowedTypes.includes(file.type.toLowerCase())) {\r\n setUploadError('Please upload a PNG or JPEG image file.');\r\n e.target.value = '';\r\n return;\r\n }\r\n\r\n // Validate file size (max 5MB)\r\n const maxSizeInBytes = 5 * 1024 * 1024; // 5MB\r\n if (file.size > maxSizeInBytes) {\r\n setUploadError('File size must be less than 5MB. Please choose a smaller image.');\r\n e.target.value = '';\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n if (typeof event.target?.result === 'string') {\r\n setUploadedImage(event.target.result);\r\n setUploadError(null); // Clear errors on successful load\r\n }\r\n };\r\n reader.onerror = () => {\r\n setUploadError('Failed to read the image file. Please try again.');\r\n };\r\n reader.readAsDataURL(file);\r\n\r\n // Reset input value so same file can be re-uploaded if needed\r\n e.target.value = '';\r\n }, []);\r\n\r\n const handleClearUpload = useCallback(() => {\r\n setUploadedImage(null);\r\n setUploadError(null);\r\n }, []);\r\n\r\n const handleSaveUpload = useCallback(() => {\r\n if (uploadedImage) {\r\n onSave(uploadedImage);\r\n onClose();\r\n }\r\n }, [uploadedImage, onSave, onClose]);\r\n\r\n const title = fieldType === FormFieldType.SIGNATURE ? 'Sign Document' : 'Add Initials';\r\n const description =\r\n fieldType === FormFieldType.SIGNATURE\r\n ? 'Please provide your full signature'\r\n : 'Please provide your initials';\r\n\r\n // Responsive canvas sizes based on screen width\r\n const canvasWidth = fieldType === FormFieldType.INITIALS ? 320 : 450;\r\n const canvasHeight = fieldType === FormFieldType.INITIALS ? 120 : 200;\r\n \r\n // Mobile sizes (smaller)\r\n const mobileCanvasWidth = fieldType === FormFieldType.INITIALS ? 280 : 320;\r\n const mobileCanvasHeight = fieldType === FormFieldType.INITIALS ? 100 : 150;\r\n\r\n return (\r\n <Dialog open={isOpen} onOpenChange={onClose}>\r\n <DialogContent>\r\n <DialogHeader className=\"space-y-2 md:space-y-3\">\r\n <DialogTitle className=\"text-lg md:text-xl font-semibold\">{title}</DialogTitle>\r\n <DialogDescription className=\"text-sm md:text-base\">\r\n {description} for: <strong className=\"font-semibold text-foreground\">{fieldLabel}</strong>\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <div className=\"flex flex-col gap-4 md:gap-6\">\r\n {/* Upload Section */}\r\n <div className=\"flex gap-2\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={handleUploadClick}\r\n className=\"flex-1 text-xs md:text-sm h-9 md:h-10\"\r\n >\r\n <svg className=\"w-3.5 h-3.5 md:w-4 md:h-4 mr-1.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\r\n </svg>\r\n Upload Image\r\n </Button>\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\"image/png,image/jpeg,image/jpg\"\r\n className=\"hidden\"\r\n onChange={handleFileChange}\r\n />\r\n {uploadedImage && (\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={handleClearUpload}\r\n className=\"text-xs md:text-sm h-9 md:h-10\"\r\n >\r\n Clear\r\n </Button>\r\n )}\r\n </div>\r\n\r\n {/* File Format Info */}\r\n {!uploadedImage && (\r\n <p className=\"text-xs md:text-sm text-muted-foreground text-center -mt-2 md:-mt-4\">\r\n Supported formats: PNG, JPEG • Maximum size: 5MB\r\n </p>\r\n )}\r\n\r\n {/* Error Display */}\r\n {uploadError && (\r\n <div className=\"bg-destructive/10 border border-destructive/30 text-destructive text-xs md:text-sm p-2 md:p-3 rounded-lg flex items-start gap-2\">\r\n <svg className=\"w-3.5 h-3.5 md:w-4 md:h-4 mt-0.5 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n </svg>\r\n <span>{uploadError}</span>\r\n </div>\r\n )}\r\n\r\n {/* Signature/Upload Area */}\r\n {uploadedImage ? (\r\n <div className=\"flex flex-col gap-3 md:gap-4\">\r\n <div className=\"border-2 border-primary/20 rounded-lg p-3 md:p-6 flex justify-center bg-muted/20\">\r\n <img\r\n src={uploadedImage}\r\n alt=\"Uploaded signature preview\"\r\n className=\"max-w-full\"\r\n style={{\r\n maxWidth: canvasWidth,\r\n maxHeight: canvasHeight,\r\n objectFit: 'contain',\r\n }}\r\n />\r\n </div>\r\n <Button onClick={handleSaveUpload} size=\"lg\" className=\"font-semibold text-sm md:text-base h-10 md:h-11\">\r\n Save Signature\r\n </Button>\r\n </div>\r\n ) : (\r\n <div className=\"block sm:hidden\">\r\n <SignatureCanvas\r\n ref={canvasRef}\r\n width={mobileCanvasWidth}\r\n height={mobileCanvasHeight}\r\n title={title}\r\n onSignature={handleSave}\r\n onCancel={handleCancel}\r\n showActions={true}\r\n />\r\n </div>\r\n )}\r\n {!uploadedImage && (\r\n <div className=\"hidden sm:block\">\r\n <SignatureCanvas\r\n ref={canvasRef}\r\n width={canvasWidth}\r\n height={canvasHeight}\r\n title={title}\r\n onSignature={handleSave}\r\n onCancel={handleCancel}\r\n showActions={true}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\n/**\r\n * Default styled version with basic Tailwind styling\r\n */\r\nexport const SignatureModal = SignatureModalCore;\r\n\r\n","import * as React from 'react';\r\n\r\nimport { cn } from '../utils';\r\n\r\nexport interface InputProps\r\n extends React.InputHTMLAttributes<HTMLInputElement> {}\r\n\r\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\r\n ({ className, type, ...props }, ref) => {\r\n return (\r\n <input\r\n type={type}\r\n className={cn(\r\n \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus:outline-none focus:ring-1 disabled:cursor-not-allowed disabled:opacity-50\",\r\n className\r\n )}\r\n ref={ref}\r\n {...props}\r\n />\r\n );\r\n }\r\n);\r\nInput.displayName = 'Input';\r\n\r\nexport { Input };\r\n","import * as React from 'react';\r\nimport * as LabelPrimitive from '@radix-ui/react-label';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nimport { cn } from '../utils';\r\n\r\nconst labelVariants = cva(\r\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'\r\n);\r\n\r\nconst Label = React.forwardRef<\r\n React.ElementRef<typeof LabelPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\r\n VariantProps<typeof labelVariants>\r\n>(({ className, ...props }, ref) => (\r\n <LabelPrimitive.Root\r\n ref={ref}\r\n className={cn(labelVariants(), className)}\r\n {...props}\r\n />\r\n));\r\nLabel.displayName = LabelPrimitive.Root.displayName;\r\n\r\nexport { Label };\r\n","import * as React from 'react';\r\n\r\nimport { cn } from '../utils';\r\n\r\nconst Card = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn(\r\n 'flex flex-col',\r\n className\r\n )}\r\n {...props}\r\n />\r\n));\r\nCard.displayName = 'Card';\r\n\r\nconst CardHeader = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn('flex flex-col gap-1.5', className)}\r\n {...props}\r\n />\r\n));\r\nCardHeader.displayName = 'CardHeader';\r\n\r\nconst CardTitle = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn('leading-none font-semibold', className)}\r\n {...props}\r\n />\r\n));\r\nCardTitle.displayName = 'CardTitle';\r\n\r\nconst CardDescription = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn('text-muted-foreground text-sm', className)}\r\n {...props}\r\n />\r\n));\r\nCardDescription.displayName = 'CardDescription';\r\n\r\nconst CardContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div ref={ref} className={cn('px-6', className)} {...props} />\r\n));\r\nCardContent.displayName = 'CardContent';\r\n\r\nconst CardFooter = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn('flex items-center px-6', className)}\r\n {...props}\r\n />\r\n));\r\nCardFooter.displayName = 'CardFooter';\r\n\r\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent };\r\n","/**\r\n * SignatureInitialsBox Component\r\n * \r\n * A standalone component that contains ONLY signature and initials fields.\r\n * Developers can place this anywhere in their UI.\r\n * When filled, automatically applies to ALL signature/initials fields in the PDF.\r\n */\r\n\r\nimport { CheckCircle, FileText } from 'lucide-react';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Input } from '../lib/ui/input';\r\nimport { Label } from '../lib/ui/label';\r\nimport { Card } from '../lib/ui/card';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface SignatureInitialsBoxProps {\r\n onSignatureClick: () => void;\r\n onInitialsChange: (value: string) => void;\r\n signatureData?: string;\r\n initialsValue?: string;\r\n signatureRequired?: boolean;\r\n initialsRequired?: boolean;\r\n /** Whether to show the initials field (default: true, but set false if PDF has no initials fields) */\r\n showInitials?: boolean;\r\n className?: string;\r\n signatureLabel?: string;\r\n initialsLabel?: string;\r\n initialsPlaceholder?: string;\r\n}\r\n\r\nexport function SignatureInitialsBox({\r\n onSignatureClick,\r\n onInitialsChange,\r\n signatureData,\r\n initialsValue = '',\r\n signatureRequired = false,\r\n initialsRequired = false,\r\n showInitials = true,\r\n className = '',\r\n signatureLabel = 'Your Signature (will be applied to all signature fields)',\r\n initialsLabel = 'Your Initials (will be applied to all Initials fields)',\r\n initialsPlaceholder = 'Enter your Initials',\r\n}: SignatureInitialsBoxProps) {\r\n return (\r\n <Card className={cn('border-primary/10 px-3 md:px-4', className)}>\r\n {/* Signature Field */}\r\n <div className={cn(\"space-y-2 py-3 md:py-4\", showInitials && \"border-b\")}>\r\n <Label className=\"flex items-start gap-2 text-xs md:text-sm font-semibold\">\r\n <div className=\"p-0.5 md:p-1 bg-primary/10 rounded-md\">\r\n <FileText className=\"size-3 md:size-3.5 text-primary\" />\r\n </div>\r\n <span className=\"leading-tight\">{signatureLabel}</span>\r\n {signatureRequired && <span className=\"text-destructive ml-0.5\">*</span>}\r\n </Label>\r\n <Button\r\n type=\"button\"\r\n onClick={onSignatureClick}\r\n variant={signatureData ? 'default' : 'outline'}\r\n className={cn(\r\n \"w-full h-10 md:h-11 text-xs md:text-sm font-medium transition-all duration-200\",\r\n signatureData \r\n ? \"bg-green-600 hover:bg-green-700 text-white shadow-md hover:shadow-lg\" \r\n : \"hover:bg-primary/5 hover:border-primary/40\"\r\n )}\r\n >\r\n {signatureData ? (\r\n <>\r\n <CheckCircle className=\"mr-1.5 md:mr-2 size-3.5 md:size-4\" />\r\n <span className=\"truncate\">Signature Added</span>\r\n </>\r\n ) : (\r\n <>\r\n <FileText className=\"mr-1.5 md:mr-2 size-3.5 md:size-4\" />\r\n <span className=\"truncate\">Click to Sign</span>\r\n </>\r\n )}\r\n </Button>\r\n </div>\r\n\r\n {/* Initials Field - Only show if PDF has initials fields */}\r\n {showInitials && (\r\n <div className=\"space-y-2 py-3 md:py-4\">\r\n <Label className=\"text-xs md:text-sm font-semibold\">\r\n {initialsLabel}\r\n {initialsRequired && <span className=\"text-destructive ml-0.5\">*</span>}\r\n </Label>\r\n <Input\r\n type=\"text\"\r\n value={initialsValue}\r\n onChange={(e) => onInitialsChange(e.target.value)}\r\n placeholder={initialsPlaceholder}\r\n // maxLength={5}\r\n autoComplete=\"off\"\r\n className=\"!text-md md:!text-lg font-serif italic text-center h-10 md:h-12 border-2 focus:border-primary/50 transition-colors\"\r\n style={{ fontFamily: \"'Dancing Script', 'Brush Script MT', cursive\" }}\r\n />\r\n </div>\r\n )}\r\n </Card>\r\n );\r\n}\r\n\r\n","/**\r\n * Text Field Renderer Component\r\n * Handles single-line and multi-line text inputs\r\n */\r\n\r\nimport { EsignFormField } from '../../types';\r\nimport { Input } from '../../lib/ui/input';\r\nimport { cn } from '../../lib/utils';\r\n\r\nexport interface TextFieldRendererProps {\r\n field: EsignFormField;\r\n value: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\nexport function TextFieldRenderer({\r\n field,\r\n value,\r\n onChange,\r\n error,\r\n className = '',\r\n}: TextFieldRendererProps) {\r\n // Use textarea for multiline fields\r\n if (field.multiline) {\r\n return (\r\n <div className=\"w-full\">\r\n <textarea\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n placeholder={field.placeholder || `Enter ${field.label}`}\r\n className={cn(\r\n 'flex min-h-[100px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring disabled:cursor-not-allowed disabled:opacity-50 resize-vertical transition-all duration-200',\r\n error && 'border-destructive focus-visible:ring-destructive',\r\n className\r\n )}\r\n maxLength={field.maxLength}\r\n required={field.required}\r\n autoComplete=\"off\"\r\n style={{\r\n fontSize: field.fontSize ? `${field.fontSize}px` : undefined,\r\n }}\r\n />\r\n {field.maxLength && (\r\n <div className=\"text-xs text-muted-foreground mt-1.5 text-right\">\r\n {value.length} / {field.maxLength}\r\n </div>\r\n )}\r\n {error && (\r\n <div className=\"text-sm text-destructive mt-1\">{error}</div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // Single-line text input\r\n return (\r\n <div className=\"w-full\">\r\n <Input\r\n type=\"text\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n placeholder={field.placeholder || `Enter ${field.label}`}\r\n className={cn(\r\n 'transition-all duration-200 shadow-sm hover:border-ring/50',\r\n error && 'border-destructive focus-visible:ring-destructive',\r\n className\r\n )}\r\n maxLength={field.maxLength}\r\n required={field.required}\r\n autoComplete=\"off\"\r\n style={{\r\n fontSize: field.fontSize ? `${field.fontSize}px` : undefined,\r\n }}\r\n />\r\n {field.maxLength && (\r\n <div className=\"text-xs text-muted-foreground mt-1.5 text-right\">\r\n {value.length} / {field.maxLength}\r\n </div>\r\n )}\r\n {error && (\r\n <div className=\"text-sm text-destructive mt-1\">{error}</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","import * as React from 'react';\r\nimport * as SelectPrimitive from '@radix-ui/react-select';\r\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\r\n\r\nimport { cn } from '../utils';\r\n\r\nconst Select = SelectPrimitive.Root;\r\n\r\nconst SelectGroup = SelectPrimitive.Group;\r\n\r\nconst SelectValue = SelectPrimitive.Value;\r\n\r\nconst SelectTrigger = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Trigger>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Trigger\r\n ref={ref}\r\n className={cn(\r\n 'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\r\n className\r\n )}\r\n {...props}\r\n >\r\n {children}\r\n <SelectPrimitive.Icon asChild>\r\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\r\n </SelectPrimitive.Icon>\r\n </SelectPrimitive.Trigger>\r\n));\r\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\r\n\r\nconst SelectScrollUpButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollUpButton\r\n ref={ref}\r\n className={cn(\r\n 'flex cursor-default items-center justify-center py-1',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronUp className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollUpButton>\r\n));\r\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\r\n\r\nconst SelectScrollDownButton = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.ScrollDownButton\r\n ref={ref}\r\n className={cn(\r\n 'flex cursor-default items-center justify-center py-1',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <ChevronDown className=\"h-4 w-4\" />\r\n </SelectPrimitive.ScrollDownButton>\r\n));\r\nSelectScrollDownButton.displayName =\r\n SelectPrimitive.ScrollDownButton.displayName;\r\n\r\nconst SelectContent = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\r\n>(({ className, children, position = 'popper', ...props }, ref) => (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={ref}\r\n className={cn(\r\n 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\r\n position === 'popper' &&\r\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\r\n className\r\n )}\r\n position={position}\r\n {...props}\r\n >\r\n <SelectScrollUpButton />\r\n <SelectPrimitive.Viewport\r\n className={cn(\r\n 'p-1',\r\n position === 'popper' &&\r\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\r\n )}\r\n >\r\n {children}\r\n </SelectPrimitive.Viewport>\r\n <SelectScrollDownButton />\r\n </SelectPrimitive.Content>\r\n </SelectPrimitive.Portal>\r\n));\r\nSelectContent.displayName = SelectPrimitive.Content.displayName;\r\n\r\nconst SelectLabel = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Label>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Label\r\n ref={ref}\r\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\r\n {...props}\r\n />\r\n));\r\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\r\n\r\nconst SelectItem = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\r\n>(({ className, children, ...props }, ref) => (\r\n <SelectPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\r\n <SelectPrimitive.ItemIndicator>\r\n <Check className=\"h-4 w-4\" />\r\n </SelectPrimitive.ItemIndicator>\r\n </span>\r\n\r\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\r\n </SelectPrimitive.Item>\r\n));\r\nSelectItem.displayName = SelectPrimitive.Item.displayName;\r\n\r\nconst SelectSeparator = React.forwardRef<\r\n React.ElementRef<typeof SelectPrimitive.Separator>,\r\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\r\n>(({ className, ...props }, ref) => (\r\n <SelectPrimitive.Separator\r\n ref={ref}\r\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\r\n {...props}\r\n />\r\n));\r\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\r\n\r\nexport {\r\n Select,\r\n SelectGroup,\r\n SelectValue,\r\n SelectTrigger,\r\n SelectContent,\r\n SelectLabel,\r\n SelectItem,\r\n SelectSeparator,\r\n SelectScrollUpButton,\r\n SelectScrollDownButton,\r\n};\r\n\r\n","import * as React from 'react';\r\nimport { DayPicker, useDayPicker, type MonthCaptionProps } from 'react-day-picker';\r\nimport 'react-day-picker/dist/style.css';\r\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\r\n\r\nimport { cn } from '../utils';\r\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './select';\r\n\r\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>;\r\n\r\n/**\r\n * Custom Caption Component with styled dropdowns using Radix Select\r\n */\r\nfunction CustomCaption({ calendarMonth }: MonthCaptionProps) {\r\n const { goToMonth } = useDayPicker();\r\n const currentMonth = calendarMonth.date;\r\n \r\n const currentYear = currentMonth.getFullYear();\r\n const monthIndex = currentMonth.getMonth();\r\n\r\n // Generate year options (1900-2100)\r\n const years = Array.from({ length: 201 }, (_, i) => 1900 + i);\r\n const months = [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December'\r\n ];\r\n\r\n const handleMonthChange = (value: string) => {\r\n const newMonth = parseInt(value);\r\n const newDate = new Date(currentYear, newMonth, 1);\r\n goToMonth(newDate);\r\n };\r\n\r\n const handleYearChange = (value: string) => {\r\n const newYear = parseInt(value);\r\n const newDate = new Date(newYear, monthIndex, 1);\r\n goToMonth(newDate);\r\n };\r\n\r\n const handlePrevClick = () => {\r\n const newDate = new Date(currentYear, monthIndex - 1, 1);\r\n goToMonth(newDate);\r\n };\r\n\r\n const handleNextClick = () => {\r\n const newDate = new Date(currentYear, monthIndex + 1, 1);\r\n goToMonth(newDate);\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center justify-between py-3 border-b border-border/50 mb-3\">\r\n {/* Navigation Buttons */}\r\n <button\r\n type=\"button\"\r\n onClick={handlePrevClick}\r\n className=\"h-8 w-8 flex items-center justify-center rounded-lg hover:bg-accent transition-colors\"\r\n aria-label=\"Go to previous month\"\r\n >\r\n <ChevronLeft className=\"h-4 w-4\" />\r\n </button>\r\n\r\n {/* Month and Year Dropdowns */}\r\n <div className=\"flex items-center gap-2\">\r\n {/* Month Dropdown */}\r\n <Select value={monthIndex.toString()} onValueChange={handleMonthChange}>\r\n <SelectTrigger className=\"w-[130px] h-9 text-sm font-semibold\">\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {months.map((month, index) => (\r\n <SelectItem key={month} value={index.toString()}>\r\n {month}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n\r\n {/* Year Dropdown */}\r\n <Select value={currentYear.toString()} onValueChange={handleYearChange}>\r\n <SelectTrigger className=\"w-[100px] h-9 text-sm font-semibold\">\r\n <SelectValue />\r\n </SelectTrigger>\r\n <SelectContent className=\"max-h-[300px]\">\r\n {years.map((year) => (\r\n <SelectItem key={year} value={year.toString()}>\r\n {year}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n </div>\r\n\r\n {/* Navigation Buttons */}\r\n <button\r\n type=\"button\"\r\n onClick={handleNextClick}\r\n className=\"h-8 w-8 flex items-center justify-center rounded-lg hover:bg-accent transition-colors\"\r\n aria-label=\"Go to next month\"\r\n >\r\n <ChevronRight className=\"h-4 w-4\" />\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\nfunction Calendar({\r\n className,\r\n classNames,\r\n showOutsideDays = true,\r\n ...props\r\n}: CalendarProps) {\r\n return (\r\n <DayPicker\r\n showOutsideDays={showOutsideDays}\r\n className={cn('', className)}\r\n classNames={{\r\n months: 'flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-4',\r\n month: 'space-y-0',\r\n caption: 'flex justify-center pt-0 relative items-center mb-0',\r\n caption_label: 'hidden', // Hide default label, we use custom caption\r\n nav: 'hidden', // Hide default nav, we use custom caption\r\n table: 'w-full border-collapse',\r\n head_row: 'flex mt-2 justify-center',\r\n head_cell:\r\n 'text-muted-foreground rounded-lg w-10 font-semibold text-sm',\r\n row: 'flex w-full mt-1 justify-center last:mb-4',\r\n cell: cn(\r\n 'relative p-0 text-center text-sm focus-within:relative focus-within:z-20',\r\n props.mode === 'range'\r\n ? '[&:has(>.day-range-end)]:rounded-r-lg [&:has(>.day-range-start)]:rounded-l-lg first:[&:has([aria-selected])]:rounded-l-lg last:[&:has([aria-selected])]:rounded-r-lg'\r\n : ''\r\n ),\r\n day: cn(\r\n 'h-10 w-10 p-0 font-normal rounded-lg hover:bg-accent hover:text-accent-foreground transition-all duration-150',\r\n 'aria-selected:opacity-100'\r\n ),\r\n day_range_start: 'day-range-start rounded-l-lg',\r\n day_range_end: 'day-range-end rounded-r-lg',\r\n day_selected:\r\n '!bg-yellow-400 !text-yellow-950 hover:!bg-yellow-500 hover:!text-yellow-950 focus:!bg-yellow-400 focus:!text-yellow-950 rounded-lg font-semibold shadow-md !border-2 !border-yellow-500',\r\n day_today: 'text-accent-foreground font-semibold rounded-lg ring-2 ring-primary/30',\r\n day_outside:\r\n 'day-outside text-muted-foreground/40 opacity-50 aria-selected:!bg-yellow-400/50 aria-selected:!text-yellow-950',\r\n day_disabled: 'text-muted-foreground/30 opacity-40 cursor-not-allowed',\r\n day_range_middle:\r\n 'aria-selected:bg-accent aria-selected:text-accent-foreground aria-selected:rounded-none',\r\n day_hidden: 'invisible',\r\n ...classNames,\r\n }}\r\n components={{\r\n MonthCaption: CustomCaption,\r\n }}\r\n {...props}\r\n />\r\n );\r\n}\r\nCalendar.displayName = 'Calendar';\r\n\r\nexport { Calendar };\r\n","import * as React from 'react';\r\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\r\n\r\nimport { cn } from '../utils';\r\n\r\nconst Popover = PopoverPrimitive.Root;\r\n\r\nconst PopoverTrigger = PopoverPrimitive.Trigger;\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ElementRef<typeof PopoverPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n ref={ref}\r\n align={align}\r\n sideOffset={sideOffset}\r\n className={cn(\r\n 'z-50 w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\r\n className\r\n )}\r\n {...props}\r\n />\r\n </PopoverPrimitive.Portal>\r\n));\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\r\n\r\nexport { Popover, PopoverTrigger, PopoverContent };\r\n\r\n","/**\r\n * Date Field Renderer Component\r\n * Handles date input fields with a calendar picker\r\n */\r\n\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport { format } from 'date-fns';\r\nimport { Calendar as CalendarIcon, AlertCircle } from 'lucide-react';\r\nimport { EsignFormField } from '../../types';\r\nimport { Button } from '../../lib/ui/button';\r\nimport { Calendar } from '../../lib/ui/calendar';\r\nimport { Popover, PopoverContent, PopoverTrigger } from '../../lib/ui/popover';\r\nimport { cn } from '../../lib/utils';\r\nimport { parseAndValidateDate } from '../../utils/date-validation';\r\n\r\nexport interface DateFieldRendererProps {\r\n field: EsignFormField;\r\n value: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\nexport function DateFieldRenderer({\r\n field,\r\n value,\r\n onChange,\r\n error,\r\n className = '',\r\n}: DateFieldRendererProps) {\r\n // Parse the value to a Date object (value is ISO string or empty)\r\n const [date, setDate] = useState<Date | undefined>(undefined);\r\n const [invalidDateValue, setInvalidDateValue] = useState<string | null>(null);\r\n const [validationError, setValidationError] = useState<string | null>(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n const buttonRef = useRef<HTMLButtonElement>(null);\r\n const wasUserClickRef = useRef(false);\r\n\r\n // Sync internal state when value prop changes (for PDF → Form sync)\r\n useEffect(() => {\r\n if (value) {\r\n const validation = parseAndValidateDate(value);\r\n \r\n if (validation.isValid && validation.date) {\r\n // Valid date - update the date state\r\n if (!date || validation.date.getTime() !== date.getTime()) {\r\n setDate(validation.date);\r\n setInvalidDateValue(null);\r\n setValidationError(null);\r\n }\r\n } else {\r\n // Invalid date - store the raw value and show error\r\n setDate(undefined);\r\n setInvalidDateValue(validation.originalValue);\r\n setValidationError(validation.error || 'Invalid date format');\r\n }\r\n } else {\r\n // Empty value\r\n setDate(undefined);\r\n setInvalidDateValue(null);\r\n setValidationError(null);\r\n }\r\n }, [value]);\r\n\r\n const handleSelect = (selectedDate: Date | undefined) => {\r\n setDate(selectedDate);\r\n if (selectedDate) {\r\n // Clear any validation errors when user picks a valid date\r\n setInvalidDateValue(null);\r\n setValidationError(null);\r\n // Convert to ISO date string (YYYY-MM-DD)\r\n onChange(format(selectedDate, 'yyyy-MM-dd'));\r\n // Close calendar after selection and mark that we just closed\r\n justClosedRef.current = true;\r\n setIsOpen(false);\r\n } else {\r\n onChange('');\r\n }\r\n };\r\n\r\n // const handleDone = () => {\r\n // justClosedRef.current = true;\r\n // setIsOpen(false);\r\n // };\r\n\r\n // Track if we just closed to prevent re-opening\r\n const justClosedRef = useRef(false);\r\n\r\n // Auto-open calendar on focus (when navigated to programmatically)\r\n useEffect(() => {\r\n const button = buttonRef.current;\r\n if (!button) return;\r\n\r\n const handleFocus = () => {\r\n // Don't auto-open if we just closed (prevents re-opening after selection)\r\n if (justClosedRef.current) {\r\n justClosedRef.current = false;\r\n return;\r\n }\r\n \r\n // Check if this was programmatic focus by looking for the data attribute\r\n const isProgrammatic = button.hasAttribute('data-programmatic-focus');\r\n \r\n // Only auto-open if it was programmatic focus (not user click)\r\n if (isProgrammatic && !isOpen) {\r\n setIsOpen(true);\r\n }\r\n };\r\n\r\n const handleMouseDown = () => {\r\n // Mark that this was a user interaction, don't auto-open\r\n wasUserClickRef.current = true;\r\n };\r\n\r\n button.addEventListener('focus', handleFocus);\r\n button.addEventListener('mousedown', handleMouseDown);\r\n\r\n return () => {\r\n button.removeEventListener('focus', handleFocus);\r\n button.removeEventListener('mousedown', handleMouseDown);\r\n };\r\n }, [isOpen]);\r\n\r\n const hasInvalidDate = !!invalidDateValue;\r\n const displayError = error || validationError;\r\n\r\n return (\r\n <div className=\"w-full\">\r\n <Popover \r\n open={isOpen} \r\n onOpenChange={(open) => {\r\n setIsOpen(open);\r\n // If closing, mark that we just closed to prevent auto-reopen\r\n if (!open) {\r\n justClosedRef.current = true;\r\n setTimeout(() => {\r\n justClosedRef.current = false;\r\n }, 200);\r\n }\r\n }}\r\n >\r\n <PopoverTrigger asChild>\r\n <Button\r\n ref={buttonRef}\r\n variant=\"outline\"\r\n className={cn(\r\n 'w-full justify-start text-left font-normal h-10',\r\n !date && 'text-muted-foreground',\r\n (error || hasInvalidDate) && 'border-destructive focus-visible:ring-destructive',\r\n hasInvalidDate && 'bg-destructive/10',\r\n className\r\n )}\r\n aria-required={field.required}\r\n >\r\n {hasInvalidDate ? (\r\n <>\r\n <AlertCircle className=\"mr-2 h-4 w-4 text-destructive\" />\r\n <span className=\"text-destructive\">{invalidDateValue}</span>\r\n </>\r\n ) : (\r\n <>\r\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\r\n {date ? format(date, 'PPP') : <span>Pick a date</span>}\r\n </>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n <PopoverContent \r\n className=\"w-auto p-0 max-w-[calc(100vw-2rem)] sm:max-w-none\" \r\n align=\"center\"\r\n alignOffset={0}\r\n sideOffset={4}\r\n >\r\n <Calendar\r\n mode=\"single\"\r\n selected={date}\r\n onSelect={handleSelect}\r\n initialFocus\r\n required={field.required}\r\n />\r\n {/* <div className=\"p-3 border-t border-border\">\r\n <Button\r\n onClick={handleDone}\r\n className=\"w-full\"\r\n size=\"sm\"\r\n >\r\n Done\r\n </Button>\r\n </div> */}\r\n </PopoverContent>\r\n </Popover>\r\n {displayError && (\r\n <div className=\"text-sm text-destructive mt-1 flex items-start gap-1\">\r\n <AlertCircle className=\"h-4 w-4 mt-0.5 flex-shrink-0\" />\r\n <span>{displayError}</span>\r\n </div>\r\n )}\r\n {hasInvalidDate && !displayError && (\r\n <div className=\"text-sm text-muted-foreground mt-1\">\r\n Invalid date format. Please use the date picker to select a valid date.\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\r\nimport { Check } from 'lucide-react';\r\n\r\nimport { cn } from '../utils';\r\n\r\nconst Checkbox = React.forwardRef<\r\n React.ElementRef<typeof CheckboxPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\r\n>(({ className, ...props }, ref) => (\r\n <CheckboxPrimitive.Root\r\n ref={ref}\r\n className={cn(\r\n 'peer h-5 w-5 shrink-0 rounded-md border-2 border-input bg-background ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=checked]:text-primary-foreground transition-all duration-150',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <CheckboxPrimitive.Indicator\r\n className={cn('flex items-center justify-center text-current')}\r\n >\r\n <Check className=\"h-4 w-4 font-bold stroke-[3]\" />\r\n </CheckboxPrimitive.Indicator>\r\n </CheckboxPrimitive.Root>\r\n));\r\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\r\n\r\nexport { Checkbox };\r\n\r\n","import { EsignFormField } from '../../types';\r\nimport { Checkbox } from '../../lib/ui/checkbox';\r\nimport { Label } from '../../lib/ui/label';\r\nimport { cn } from '../../lib/utils';\r\n\r\nexport interface CheckboxRendererProps {\r\n field: EsignFormField;\r\n value: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\nexport function CheckboxRenderer({\r\n field,\r\n value,\r\n onChange,\r\n error,\r\n className = '',\r\n}: CheckboxRendererProps) {\r\n const isChecked = value === 'true';\r\n\r\n const handleToggle = () => {\r\n const newValue = isChecked ? 'false' : 'true';\r\n onChange(newValue);\r\n };\r\n\r\n return (\r\n <div className={cn('w-full', className)}>\r\n <div\r\n onClick={handleToggle}\r\n className=\"flex items-center space-x-3 p-3 -ml-3 -mr-3 rounded-lg hover:bg-muted/50 cursor-pointer transition-colors duration-200\"\r\n >\r\n <Checkbox\r\n id={field.id}\r\n checked={isChecked}\r\n onCheckedChange={() => {}} // Prevent double-toggle, handled by parent div\r\n required={field.required}\r\n className={cn(error && 'border-destructive', 'pointer-events-none')}\r\n />\r\n <Label\r\n htmlFor={field.id}\r\n className=\"text-sm text-foreground cursor-pointer select-none flex-1 pointer-events-none\"\r\n >\r\n {field.label}\r\n </Label>\r\n </div>\r\n {error && (\r\n <div className=\"text-sm text-destructive mt-1\">{error}</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\r\nimport { Circle } from 'lucide-react';\r\n\r\nimport { cn } from '../utils';\r\n\r\nconst RadioGroup = React.forwardRef<\r\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\r\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <RadioGroupPrimitive.Root\r\n className={cn('grid', className)}\r\n {...props}\r\n ref={ref}\r\n />\r\n );\r\n});\r\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\r\n\r\nconst RadioGroupItem = React.forwardRef<\r\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\r\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\r\n>(({ className, ...props }, ref) => {\r\n return (\r\n <RadioGroupPrimitive.Item\r\n ref={ref}\r\n className={cn(\r\n 'aspect-square h-5 w-5 rounded-full border-2 border-input bg-background text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-primary data-[state=checked]:bg-primary transition-all duration-150',\r\n className\r\n )}\r\n {...props}\r\n >\r\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\r\n <Circle className=\"h-2.5 w-2.5 fill-primary-foreground text-primary-foreground\" />\r\n </RadioGroupPrimitive.Indicator>\r\n </RadioGroupPrimitive.Item>\r\n );\r\n});\r\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\r\n\r\nexport { RadioGroup, RadioGroupItem };\r\n\r\n","import { EsignFormField } from '../../types';\r\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\r\nimport { Label } from '../../lib/ui/label';\r\nimport { cn } from '../../lib/utils';\r\n\r\nexport interface RadioGroupRendererProps {\r\n field: EsignFormField;\r\n value: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\nexport function RadioGroupRenderer({\r\n field,\r\n value,\r\n onChange,\r\n error,\r\n className = '',\r\n}: RadioGroupRendererProps) {\r\n const options = field.options || [];\r\n\r\n return (\r\n <div className={cn('w-full', className)}>\r\n <RadioGroup\r\n value={value}\r\n onValueChange={onChange}\r\n required={field.required}\r\n className=\"\"\r\n >\r\n {options.map((option) => {\r\n const optionId = `${field.id}-${option}`;\r\n\r\n return (\r\n <div\r\n key={option}\r\n className=\"flex items-center space-x-3 p-3 -ml-3 -mr-3 rounded-lg hover:bg-muted/50 cursor-pointer transition-colors duration-200\"\r\n onClick={() => onChange(option)}\r\n >\r\n <RadioGroupItem\r\n value={option}\r\n id={optionId}\r\n className={cn(error && 'border-destructive')}\r\n />\r\n <Label\r\n htmlFor={optionId}\r\n className=\"text-sm text-foreground cursor-pointer select-none flex-1\"\r\n >\r\n {option}\r\n </Label>\r\n </div>\r\n );\r\n })}\r\n </RadioGroup>\r\n {error && (\r\n <div className=\"text-sm text-destructive mt-1\">{error}</div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Dropdown Renderer Component\r\n * Handles dropdown/select input fields using Radix UI\r\n */\r\n\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport { EsignFormField } from '../../types';\r\nimport {\r\n Select,\r\n SelectContent,\r\n SelectItem,\r\n SelectTrigger,\r\n SelectValue,\r\n} from '../../lib/ui/select';\r\nimport { cn } from '../../lib/utils';\r\n\r\nexport interface DropdownRendererProps {\r\n field: EsignFormField;\r\n value: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\nexport function DropdownRenderer({\r\n field,\r\n value,\r\n onChange,\r\n error,\r\n className = '',\r\n}: DropdownRendererProps) {\r\n const options = field.options || [];\r\n const placeholder = field.placeholder || `Select ${field.label}`;\r\n const [isOpen, setIsOpen] = useState(false);\r\n const triggerRef = useRef<HTMLButtonElement>(null);\r\n const wasUserClickRef = useRef(false);\r\n const justClosedRef = useRef(false);\r\n\r\n // Handle value change - close dropdown after selection\r\n const handleValueChange = (newValue: string) => {\r\n onChange(newValue);\r\n // Mark that we just closed to prevent re-opening\r\n justClosedRef.current = true;\r\n // Close dropdown - Radix UI will handle this, but we ensure it's closed\r\n setTimeout(() => {\r\n setIsOpen(false);\r\n // Reset flag after a delay to allow normal operation\r\n setTimeout(() => {\r\n justClosedRef.current = false;\r\n }, 200);\r\n }, 50);\r\n };\r\n\r\n // Auto-open dropdown on focus (when navigated to programmatically)\r\n useEffect(() => {\r\n const trigger = triggerRef.current;\r\n if (!trigger) return;\r\n\r\n const handleFocus = () => {\r\n // Don't auto-open if we just closed (prevents re-opening after selection)\r\n if (justClosedRef.current) {\r\n return;\r\n }\r\n \r\n // Check if this was programmatic focus by looking for the data attribute\r\n const isProgrammatic = trigger.hasAttribute('data-programmatic-focus');\r\n \r\n // Only auto-open if it was programmatic focus\r\n if (isProgrammatic && !isOpen && options.length > 0) {\r\n setIsOpen(true);\r\n }\r\n };\r\n\r\n const handleMouseDown = () => {\r\n // Mark that this was a user interaction, don't auto-open\r\n wasUserClickRef.current = true;\r\n };\r\n\r\n trigger.addEventListener('focus', handleFocus);\r\n trigger.addEventListener('mousedown', handleMouseDown);\r\n\r\n return () => {\r\n trigger.removeEventListener('focus', handleFocus);\r\n trigger.removeEventListener('mousedown', handleMouseDown);\r\n };\r\n }, [isOpen, options.length]);\r\n\r\n return (\r\n <div className=\"w-full\">\r\n <Select \r\n value={value} \r\n onValueChange={handleValueChange} \r\n required={field.required}\r\n open={isOpen}\r\n onOpenChange={(open) => {\r\n // Allow normal open/close behavior\r\n setIsOpen(open);\r\n // If closing, mark that we just closed to prevent auto-reopen\r\n if (!open) {\r\n justClosedRef.current = true;\r\n setTimeout(() => {\r\n justClosedRef.current = false;\r\n }, 200);\r\n }\r\n }}\r\n >\r\n <SelectTrigger\r\n ref={triggerRef}\r\n className={cn(\r\n error && 'border-destructive focus:ring-destructive',\r\n className\r\n )}\r\n >\r\n <SelectValue placeholder={placeholder} />\r\n </SelectTrigger>\r\n <SelectContent>\r\n {options.map((option) => (\r\n <SelectItem key={option} value={option}>\r\n {option}\r\n </SelectItem>\r\n ))}\r\n </SelectContent>\r\n </Select>\r\n {error && <div className=\"text-sm text-destructive mt-1\">{error}</div>}\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Signature Field Renderer Component\r\n * Handles signature input fields with modal trigger\r\n */\r\n\r\nimport { EsignFormField } from '../../types';\r\nimport { Button } from '../../lib/ui/button';\r\nimport { CheckCircle, Pen } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\r\n\r\nexport interface SignatureFieldRendererProps {\r\n field: EsignFormField;\r\n value: string;\r\n onChange: (value: string) => void;\r\n onSignatureClick: () => void;\r\n hasSignature: boolean;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\nexport function SignatureFieldRenderer({\r\n field,\r\n onSignatureClick,\r\n hasSignature,\r\n error,\r\n className = '',\r\n}: SignatureFieldRendererProps) {\r\n return (\r\n <div className=\"w-full\">\r\n <Button\r\n type=\"button\"\r\n onClick={onSignatureClick}\r\n variant={hasSignature ? 'default' : 'outline'}\r\n className={cn(\r\n 'w-full',\r\n hasSignature && 'bg-green-600 hover:bg-green-700',\r\n className\r\n )}\r\n aria-label={`${hasSignature ? 'View' : 'Add'} signature for ${field.label}`}\r\n >\r\n {hasSignature ? (\r\n <>\r\n <CheckCircle className=\"w-4 h-4 mr-2\" />\r\n <span>Signature Added</span>\r\n </>\r\n ) : (\r\n <>\r\n <Pen className=\"w-4 h-4 mr-2\" />\r\n <span>Click to Sign</span>\r\n </>\r\n )}\r\n </Button>\r\n {error && (\r\n <div className=\"text-sm text-destructive mt-1\">{error}</div>\r\n )}\r\n {field.required && !hasSignature && (\r\n <div className=\"text-sm text-muted-foreground mt-1\">\r\n * Signature required\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","/**\r\n * Initials Field Renderer Component\r\n * Handles initials input fields (text input with special styling)\r\n */\r\n\r\nimport { EsignFormField } from '../../types';\r\nimport { Input } from '../../lib/ui/input';\r\nimport { cn } from '../../lib/utils';\r\n\r\nexport interface InitialsFieldRendererProps {\r\n field: EsignFormField;\r\n value: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\nexport function InitialsFieldRenderer({\r\n field,\r\n value,\r\n onChange,\r\n error,\r\n className = '',\r\n}: InitialsFieldRendererProps) {\r\n return (\r\n <div className=\"w-full\">\r\n <Input\r\n type=\"text\"\r\n value={value}\r\n onChange={(e) => onChange(e.target.value)}\r\n placeholder={field.placeholder || 'Enter your Initials'}\r\n className={cn(\r\n 'font-serif italic !text-2xl',\r\n error && 'border-destructive focus-visible:ring-destructive',\r\n className\r\n )}\r\n maxLength={5}\r\n required={field.required}\r\n autoComplete=\"off\"\r\n style={{\r\n fontFamily: \"'Dancing Script', 'Brush Script MT', cursive\",\r\n }}\r\n />\r\n {error && (\r\n <div className=\"text-sm text-destructive mt-1\">{error}</div>\r\n )}\r\n <div className=\"text-sm text-muted-foreground mt-1\">\r\n Maximum 5 characters\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n","/**\r\n * Text Label Renderer Component\r\n * Displays static text (non-editable)\r\n */\r\n\r\nimport { EsignFormField } from '../../types';\r\n\r\nexport interface TextLabelRendererProps {\r\n field: EsignFormField;\r\n value: string;\r\n onChange: (value: string) => void;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\nexport function TextLabelRenderer({\r\n field,\r\n className = '',\r\n}: TextLabelRendererProps) {\r\n // Use defaultValue or label as the text to display\r\n const displayText = field.defaultValue || field.label || 'Label';\r\n\r\n const textStyle = {\r\n fontSize: field.fontSize ? `${field.fontSize}px` : '16px',\r\n };\r\n\r\n return (\r\n <div className={`w-full ${className}`}>\r\n <div\r\n className=\"px-2 py-1 text-foreground\"\r\n style={textStyle}\r\n >\r\n {displayText}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n","/**\r\n * Form Field Renderer Component\r\n * Switches between appropriate field type renderers\r\n */\r\n\r\nimport { EsignFormField, FormFieldType } from '../../types';\r\nimport { TextFieldRenderer } from './TextFieldRenderer';\r\nimport { DateFieldRenderer } from './DateFieldRenderer';\r\nimport { CheckboxRenderer } from './CheckboxRenderer';\r\nimport { RadioGroupRenderer } from './RadioGroupRenderer';\r\nimport { DropdownRenderer } from './DropdownRenderer';\r\nimport { SignatureFieldRenderer } from './SignatureFieldRenderer';\r\nimport { InitialsFieldRenderer } from './InitialsFieldRenderer';\r\nimport { TextLabelRenderer } from './TextLabelRenderer';\r\n\r\nexport interface FormFieldRendererProps {\r\n field: EsignFormField;\r\n value: string;\r\n onChange: (value: string) => void;\r\n onSignatureClick?: () => void;\r\n hasSignature?: boolean;\r\n readOnly?: boolean;\r\n error?: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Main field renderer that delegates to specific field type components\r\n */\r\nexport function FormFieldRenderer({\r\n field,\r\n value,\r\n onChange,\r\n onSignatureClick,\r\n hasSignature = false,\r\n error,\r\n className,\r\n}: FormFieldRendererProps) {\r\n const commonProps = {\r\n field,\r\n value,\r\n onChange,\r\n error,\r\n className,\r\n };\r\n\r\n switch (field.type) {\r\n case FormFieldType.TEXT:\r\n return <TextFieldRenderer {...commonProps} />;\r\n\r\n case FormFieldType.DATE:\r\n return <DateFieldRenderer {...commonProps} />;\r\n\r\n case FormFieldType.CHECKBOX:\r\n return <CheckboxRenderer {...commonProps} />;\r\n\r\n case FormFieldType.RADIO:\r\n return <RadioGroupRenderer {...commonProps} />;\r\n\r\n case FormFieldType.DROPDOWN:\r\n return <DropdownRenderer {...commonProps} />;\r\n\r\n case FormFieldType.SIGNATURE:\r\n return (\r\n <SignatureFieldRenderer\r\n {...commonProps}\r\n onSignatureClick={onSignatureClick || (() => {})}\r\n hasSignature={hasSignature}\r\n />\r\n );\r\n\r\n case FormFieldType.INITIALS:\r\n return <InitialsFieldRenderer {...commonProps} />;\r\n\r\n case FormFieldType.TEXT_LABEL:\r\n return <TextLabelRenderer {...commonProps} />;\r\n\r\n default:\r\n // Fallback to text input\r\n return <TextFieldRenderer {...commonProps} />;\r\n }\r\n}\r\n\r\n","/**\r\n * Editable Fields Panel\r\n * Optional panel to display extracted form fields for developer debugging and future enhancement\r\n */\r\n\r\nimport type { EsignFormField, FormFieldType } from '../types';\r\n\r\nexport interface EditableFieldsPanelProps {\r\n /**\r\n * Array of extracted form fields to display\r\n */\r\n fields: EsignFormField[];\r\n \r\n /**\r\n * Current field values\r\n */\r\n fieldValues: Record<string, string>;\r\n \r\n /**\r\n * Whether the panel is collapsed\r\n */\r\n collapsed?: boolean;\r\n \r\n /**\r\n * Callback when collapse state changes\r\n */\r\n onCollapseChange?: (collapsed: boolean) => void;\r\n}\r\n\r\n/**\r\n * Get field type badge color\r\n */\r\nfunction getFieldTypeBadgeColor(type: FormFieldType): string {\r\n switch (type) {\r\n case 'signature':\r\n return 'bg-purple-100 text-purple-800';\r\n case 'initials':\r\n return 'bg-indigo-100 text-indigo-800';\r\n case 'text':\r\n return 'bg-blue-100 text-blue-800';\r\n case 'date':\r\n return 'bg-green-100 text-green-800';\r\n case 'checkbox':\r\n return 'bg-yellow-100 text-yellow-800';\r\n case 'radio':\r\n return 'bg-orange-100 text-orange-800';\r\n case 'dropdown':\r\n return 'bg-pink-100 text-pink-800';\r\n case 'text_label':\r\n return 'bg-muted text-foreground';\r\n default:\r\n return 'bg-muted text-foreground';\r\n }\r\n}\r\n\r\n/**\r\n * Editable Fields Panel Component\r\n * Displays extracted form fields in a structured, readable format\r\n * Fields are shown with input components (disabled for now) that can be enabled in future\r\n */\r\nexport function EditableFieldsPanel({\r\n fields,\r\n fieldValues,\r\n collapsed = false,\r\n onCollapseChange,\r\n}: EditableFieldsPanelProps) {\r\n const handleToggleCollapse = () => {\r\n onCollapseChange?.(!collapsed);\r\n };\r\n\r\n return (\r\n <div className=\"border border-border rounded-lg bg-muted/50 overflow-hidden\">\r\n {/* Header */}\r\n <button\r\n type=\"button\"\r\n onClick={handleToggleCollapse}\r\n className=\"w-full px-4 py-3 flex items-center justify-between bg-muted hover:bg-muted/80 transition-colors\"\r\n >\r\n <div className=\"flex items-center gap-2\">\r\n <span className=\"text-sm font-semibold text-foreground\">\r\n Form Fields ({fields.length})\r\n </span>\r\n <span className=\"text-sm text-muted-foreground\">\r\n (Read-only preview)\r\n </span>\r\n </div>\r\n <svg\r\n className={`w-5 h-5 text-muted-foreground transition-transform ${collapsed ? '' : 'rotate-180'}`}\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\r\n </svg>\r\n </button>\r\n\r\n {/* Content */}\r\n {!collapsed && (\r\n <div className=\"p-4 space-y-3 max-h-96 overflow-y-auto\">\r\n {fields.length === 0 ? (\r\n <p className=\"text-sm text-muted-foreground text-center py-4\">\r\n No form fields found in the PDF\r\n </p>\r\n ) : (\r\n fields.map((field) => {\r\n const value = fieldValues[field.id] || '';\r\n \r\n return (\r\n <div\r\n key={field.id}\r\n className=\"bg-card border border-border rounded-md p-3 space-y-2\"\r\n >\r\n {/* Field Header */}\r\n <div className=\"flex items-start justify-between gap-2\">\r\n <div className=\"flex-1 min-w-0\">\r\n <div className=\"flex items-center gap-2 flex-wrap\">\r\n <span className=\"text-sm font-medium text-foreground truncate\">\r\n {field.label}\r\n </span>\r\n {field.required && (\r\n <span className=\"text-sm font-medium text-destructive\">*</span>\r\n )}\r\n </div>\r\n <div className=\"text-sm text-muted-foreground truncate mt-0.5\">\r\n {field.name}\r\n </div>\r\n </div>\r\n <span\r\n className={`text-sm font-medium px-2 py-0.5 rounded ${getFieldTypeBadgeColor(\r\n field.type\r\n )}`}\r\n >\r\n {field.type}\r\n </span>\r\n </div>\r\n\r\n {/* Field Value Display (disabled input for future enhancement) */}\r\n <div>\r\n {field.type === 'signature' || field.type === 'initials' ? (\r\n <div className=\"text-sm text-muted-foreground italic\">\r\n {value ? '✓ Signature provided' : 'No signature yet'}\r\n </div>\r\n ) : field.type === 'checkbox' ? (\r\n <div className=\"flex items-center gap-2\">\r\n <input\r\n type=\"checkbox\"\r\n checked={value === 'true'}\r\n disabled\r\n className=\"rounded border-input text-primary focus:ring-ring disabled:opacity-60\"\r\n />\r\n <span className=\"text-sm text-muted-foreground\">\r\n {value === 'true' ? 'Checked' : 'Unchecked'}\r\n </span>\r\n </div>\r\n ) : field.type === 'radio' ? (\r\n <div className=\"text-sm text-muted-foreground\">\r\n {value || <span className=\"italic text-muted-foreground/60\">No option selected</span>}\r\n </div>\r\n ) : field.type === 'dropdown' ? (\r\n <select\r\n value={value}\r\n disabled\r\n className=\"w-full px-3 py-2 text-sm border border-input rounded-md bg-background disabled:bg-muted disabled:text-muted-foreground\"\r\n >\r\n <option value=\"\">Select...</option>\r\n {field.options?.map((option) => (\r\n <option key={option} value={option}>\r\n {option}\r\n </option>\r\n ))}\r\n </select>\r\n ) : (\r\n <input\r\n type={field.type === 'date' ? 'date' : 'text'}\r\n value={value}\r\n placeholder={field.placeholder || ''}\r\n disabled\r\n className=\"w-full px-3 py-2 text-sm border border-input rounded-md bg-background disabled:bg-muted disabled:text-muted-foreground\"\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Field Metadata */}\r\n {(field.assignedSignerEmail || field.placeholder) && (\r\n <div className=\"text-sm text-muted-foreground space-y-1 pt-1 border-t border-border\">\r\n {field.assignedSignerEmail && (\r\n <div className=\"flex items-center gap-1\">\r\n <span className=\"font-medium\">Assigned to:</span>\r\n <span className=\"truncate\">{field.assignedSignerEmail}</span>\r\n </div>\r\n )}\r\n {field.placeholder && (\r\n <div className=\"flex items-center gap-1\">\r\n <span className=\"font-medium\">Placeholder:</span>\r\n <span className=\"italic truncate\">{field.placeholder}</span>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n\r\n","/**\r\n * Attachment Upload Component\r\n * Provides file upload with drag-and-drop support and preview\r\n */\r\n\r\nimport { useCallback, useRef, useState } from 'react';\r\nimport { Upload, X, FileText, Image as ImageIcon, File as FileIcon } from 'lucide-react';\r\nimport type { Attachment } from '../types';\r\n\r\nexport interface AttachmentUploadProps {\r\n attachments: Attachment[];\r\n onAdd: (files: File[]) => void;\r\n onRemove: (attachmentId: string) => void;\r\n isUploading?: boolean;\r\n disabled?: boolean;\r\n maxFiles?: number;\r\n formatSize: (bytes: number) => string;\r\n className?: string;\r\n}\r\n\r\nexport function AttachmentUpload({\r\n attachments,\r\n onAdd,\r\n onRemove,\r\n isUploading = false,\r\n disabled = false,\r\n maxFiles = 10,\r\n formatSize,\r\n className = '',\r\n}: AttachmentUploadProps) {\r\n const [isDragging, setIsDragging] = useState(false);\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const dragCounterRef = useRef(0);\r\n\r\n /**\r\n * Handle file selection from input\r\n */\r\n const handleFileSelect = useCallback(\r\n (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const files = event.target.files;\r\n if (files && files.length > 0) {\r\n onAdd(Array.from(files));\r\n }\r\n // Reset input value to allow selecting the same file again\r\n event.target.value = '';\r\n },\r\n [onAdd]\r\n );\r\n\r\n /**\r\n * Handle drag enter\r\n */\r\n const handleDragEnter = useCallback((event: React.DragEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n dragCounterRef.current++;\r\n if (event.dataTransfer.items && event.dataTransfer.items.length > 0) {\r\n setIsDragging(true);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Handle drag leave\r\n */\r\n const handleDragLeave = useCallback((event: React.DragEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n dragCounterRef.current--;\r\n if (dragCounterRef.current === 0) {\r\n setIsDragging(false);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Handle drag over\r\n */\r\n const handleDragOver = useCallback((event: React.DragEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }, []);\r\n\r\n /**\r\n * Handle drop\r\n */\r\n const handleDrop = useCallback(\r\n (event: React.DragEvent) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n setIsDragging(false);\r\n dragCounterRef.current = 0;\r\n\r\n if (disabled || isUploading) return;\r\n\r\n const files = event.dataTransfer.files;\r\n if (files && files.length > 0) {\r\n onAdd(Array.from(files));\r\n }\r\n },\r\n [disabled, isUploading, onAdd]\r\n );\r\n\r\n /**\r\n * Get icon for file type\r\n */\r\n const getFileIcon = (fileType: string) => {\r\n if (fileType.startsWith('image/')) {\r\n return <ImageIcon className=\"w-6 h-6\" />;\r\n }\r\n if (fileType === 'application/pdf') {\r\n return <FileText className=\"w-6 h-6\" />;\r\n }\r\n return <FileIcon className=\"w-6 h-6\" />;\r\n };\r\n\r\n const canAddMore = attachments.length < maxFiles;\r\n\r\n return (\r\n <div className={`space-y-3 md:space-y-4 ${className}`}>\r\n {/* Upload Area */}\r\n {canAddMore && (\r\n <div\r\n onDragEnter={handleDragEnter}\r\n onDragLeave={handleDragLeave}\r\n onDragOver={handleDragOver}\r\n onDrop={handleDrop}\r\n className={`relative border-2 border-dashed rounded-lg p-4 md:p-8 text-center transition-colors ${\r\n isDragging\r\n ? 'border-primary bg-primary/10'\r\n : disabled\r\n ? 'border-border bg-muted cursor-not-allowed'\r\n : 'border-border bg-background hover:border-border/80'\r\n }`}\r\n >\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n multiple\r\n onChange={handleFileSelect}\r\n disabled={disabled || isUploading}\r\n className=\"hidden\"\r\n aria-label=\"Upload files\"\r\n />\r\n\r\n <div className=\"flex flex-col items-center space-y-2 md:space-y-3\">\r\n <div\r\n className={`rounded-full p-2 md:p-3 ${\r\n isDragging ? 'bg-primary/20' : 'bg-muted'\r\n }`}\r\n >\r\n <Upload\r\n className={`w-6 h-6 md:w-8 md:h-8 ${\r\n isDragging ? 'text-primary' : 'text-muted-foreground'\r\n }`}\r\n />\r\n </div>\r\n\r\n <div className=\"space-y-1\">\r\n <p className=\"text-xs md:text-sm font-medium text-foreground\">\r\n {isDragging ? 'Drop files here' : 'Upload Attachments'}\r\n </p>\r\n <p className=\"text-xs md:text-sm text-muted-foreground px-2\">\r\n <span className=\"hidden sm:inline\">Drag and drop or </span>\r\n <button\r\n type=\"button\"\r\n onClick={() => fileInputRef.current?.click()}\r\n disabled={disabled || isUploading}\r\n className=\"text-primary hover:text-primary/80 font-medium focus:outline-none focus:underline disabled:text-muted-foreground disabled:cursor-not-allowed\"\r\n >\r\n <span className=\"sm:hidden\">Tap to </span>browse files\r\n </button>\r\n </p>\r\n <p className=\"text-xs md:text-sm text-muted-foreground\">\r\n PDF, Word, Images • Max {maxFiles} files\r\n </p>\r\n </div>\r\n </div>\r\n\r\n {isUploading && (\r\n <div className=\"absolute inset-0 bg-white bg-opacity-75 flex items-center justify-center rounded-lg\">\r\n <div className=\"flex items-center space-x-2\">\r\n <div className=\"animate-spin rounded-full h-4 w-4 md:h-5 md:w-5 border-b-2 border-primary\" />\r\n <span className=\"text-xs md:text-sm text-foreground\">Uploading...</span>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Attachment List */}\r\n {attachments.length > 0 && (\r\n <div className=\"space-y-2\">\r\n <p className=\"text-xs md:text-sm font-medium text-foreground\">\r\n Attached Files ({attachments.length}/{maxFiles})\r\n </p>\r\n\r\n <div className=\"space-y-2\">\r\n {attachments.map(attachment => (\r\n <div\r\n key={attachment.id}\r\n className=\"flex items-center space-x-2 md:space-x-3 p-2 md:p-3 bg-muted/50 rounded-lg border border-border hover:border-border/80 transition-colors\"\r\n >\r\n {/* File Icon or Preview */}\r\n <div className=\"flex-shrink-0\">\r\n {attachment.preview ? (\r\n <img\r\n src={attachment.preview}\r\n alt={attachment.name}\r\n className=\"w-10 h-10 md:w-12 md:h-12 object-cover rounded\"\r\n />\r\n ) : (\r\n <div className=\"w-10 h-10 md:w-12 md:h-12 bg-muted rounded flex items-center justify-center text-muted-foreground\">\r\n {getFileIcon(attachment.type)}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* File Info */}\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-xs md:text-sm font-medium text-foreground truncate\">\r\n {attachment.name}\r\n </p>\r\n <p className=\"text-xs md:text-sm text-muted-foreground truncate\">\r\n {formatSize(attachment.size)}\r\n {attachment.type && (\r\n <span className=\"hidden sm:inline ml-2\">• {attachment.type}</span>\r\n )}\r\n </p>\r\n </div>\r\n\r\n {/* Remove Button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => onRemove(attachment.id)}\r\n disabled={disabled}\r\n className=\"flex-shrink-0 p-1 rounded-full text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-destructive\"\r\n aria-label={`Remove ${attachment.name}`}\r\n >\r\n <X className=\"w-3.5 h-3.5 md:w-4 md:h-4\" />\r\n </button>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Max Files Warning */}\r\n {attachments.length >= maxFiles && (\r\n <div className=\"p-2 md:p-3 bg-yellow-50 border border-yellow-200 rounded-lg\">\r\n <p className=\"text-xs md:text-sm text-yellow-800\">\r\n Maximum number of files ({maxFiles}) reached. Remove some files to add more.\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","import { useMemo } from 'react';\r\n\r\nexport interface SigningInstructionsProps {\r\n /** HTML string with signing instructions */\r\n html: string;\r\n /** Custom className for the container */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Sanitizes HTML to allow only safe tags and attributes\r\n * Removes script tags, event handlers, and dangerous attributes\r\n */\r\nfunction sanitizeHtml(html: string): string {\r\n if (!html) return '';\r\n\r\n // Remove script tags and their content\r\n let sanitized = html.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\r\n \r\n // Remove event handler attributes (onclick, onload, etc.)\r\n sanitized = sanitized.replace(/\\s*on\\w+\\s*=\\s*[\"'][^\"']*[\"']/gi, '');\r\n sanitized = sanitized.replace(/\\s*on\\w+\\s*=\\s*[^\\s>]*/gi, '');\r\n \r\n // Remove javascript: protocol from links\r\n sanitized = sanitized.replace(/href\\s*=\\s*[\"']javascript:[^\"']*[\"']/gi, 'href=\"#\"');\r\n \r\n // Remove data: protocol (can be used for XSS)\r\n sanitized = sanitized.replace(/href\\s*=\\s*[\"']data:[^\"']*[\"']/gi, 'href=\"#\"');\r\n sanitized = sanitized.replace(/src\\s*=\\s*[\"']data:[^\"']*[\"']/gi, '');\r\n \r\n // Remove style attributes (can be used for CSS injection)\r\n sanitized = sanitized.replace(/\\s*style\\s*=\\s*[\"'][^\"']*[\"']/gi, '');\r\n \r\n // Allow only safe tags: p, ul, li, ol, strong, b, em, i, a, br, span, div\r\n // Remove all other tags\r\n const allowedTags = ['p', 'ul', 'li', 'ol', 'strong', 'b', 'em', 'i', 'a', 'br', 'span', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\r\n const tagPattern = /<\\/?(\\w+)(\\s[^>]*)?>/g;\r\n \r\n sanitized = sanitized.replace(tagPattern, (match, tagName) => {\r\n if (allowedTags.includes(tagName.toLowerCase())) {\r\n return match;\r\n }\r\n return '';\r\n });\r\n \r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Component to safely render HTML signing instructions\r\n * Sanitizes HTML to prevent XSS attacks while allowing basic formatting\r\n */\r\nexport function SigningInstructions({ html, className = '' }: SigningInstructionsProps) {\r\n const sanitizedHtml = useMemo(() => sanitizeHtml(html), [html]);\r\n \r\n if (!sanitizedHtml) {\r\n return null;\r\n }\r\n \r\n return (\r\n <div\r\n className={`prose prose-sm max-w-none ${className} [&_ul]:list-disc [&_ul]:pl-5 [&_ul]:space-y-1 [&_ul]:mt-2 [&_li]:leading-relaxed [&_ol]:list-decimal [&_ol]:pl-5 [&_ol]:space-y-1 [&_ol]:mt-2 [&_p]:mb-2 [&_p:last-child]:mb-0`}\r\n dangerouslySetInnerHTML={{ __html: sanitizedHtml }}\r\n style={{\r\n lineHeight: '1.75',\r\n }}\r\n />\r\n );\r\n}\r\n\r\n","export interface PoweredBySigniphiProps {\r\n /** Custom className for the container */\r\n className?: string;\r\n /** Custom link URL (default: https://signiphi.ai/) */\r\n linkUrl?: string; // default: https://signiphi.ai/\r\n}\r\n\r\n/**\r\n * Displays \"Powered by Signiphi\" branding with link\r\n */\r\nexport function PoweredBySigniphi({ \r\n className = '', \r\n linkUrl = 'https://signiphi.ai/' \r\n}: PoweredBySigniphiProps) {\r\n return (\r\n <div className={className}>\r\n <a\r\n href={linkUrl}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"text-sm text-muted-foreground transition-all duration-200 inline-flex items-center gap-1.5 group px-2 py-1 rounded-md hover:bg-muted/50\"\r\n >\r\n <div className=\"p-1 bg-primary/10 rounded group-hover:bg-primary/20 transition-colors\">\r\n <svg className=\"w-3 h-3 text-primary\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" />\r\n </svg>\r\n </div>\r\n <span className=\"font-medium text-sm\">Powered by</span>\r\n <span className=\"font-bold text-primary text-sm\">Signiphi</span>\r\n </a>\r\n </div>\r\n );\r\n}\r\n\r\n","/**\r\n * View Toggle Toolbar Component\r\n * Toolbar with iPhone-style toggle switch to switch between PDF view and form fields view\r\n * Designed to be extensible for additional buttons in the future\r\n */\r\n\r\nimport { useState, useEffect } from 'react';\r\nimport { FileText, ListChecks, ZoomIn, ZoomOut, ChevronLeft, ChevronRight } from 'lucide-react';\r\nimport { cn } from '../lib/utils';\r\nimport { Button } from '../lib/ui/button';\r\nimport type { PdfViewerRef } from '../types';\r\nimport type { FormFieldsViewRef } from './FormFieldsView';\r\n\r\nexport type ViewMode = 'pdf' | 'form';\r\n\r\nexport interface ViewToggleToolbarProps {\r\n /** Current view mode */\r\n currentView: ViewMode;\r\n /** Callback when view changes */\r\n onViewChange: (view: ViewMode) => void;\r\n /** PDF viewer ref for controlling zoom and page navigation */\r\n viewerRef?: React.RefObject<PdfViewerRef>;\r\n /** Form fields view ref for controlling field navigation */\r\n formFieldsViewRef?: React.RefObject<FormFieldsViewRef>;\r\n /** Show PDF-specific controls (zoom, page navigation) */\r\n showPdfControls?: boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * ViewToggleToolbar Component\r\n * \r\n * Displays a toolbar with an iPhone-style toggle switch to switch between PDF and form views.\r\n * The container uses flexbox to allow for additional buttons in the future.\r\n */\r\nexport function ViewToggleToolbar({\r\n currentView,\r\n onViewChange,\r\n viewerRef,\r\n formFieldsViewRef,\r\n showPdfControls = true,\r\n className,\r\n}: ViewToggleToolbarProps) {\r\n const [currentPage, setCurrentPage] = useState<number | null>(null);\r\n const [totalPages, setTotalPages] = useState<number | null>(null);\r\n const [isViewerReady, setIsViewerReady] = useState(false);\r\n const [currentFieldIndex, setCurrentFieldIndex] = useState<number | null>(null);\r\n const [totalFields, setTotalFields] = useState<number>(0);\r\n\r\n // Update page info when PDF view is active and viewer is available\r\n useEffect(() => {\r\n if (currentView !== 'pdf' || !viewerRef?.current || !showPdfControls) {\r\n setIsViewerReady(false);\r\n setCurrentPage(null);\r\n setTotalPages(null);\r\n return;\r\n }\r\n\r\n const updatePageInfo = async () => {\r\n try {\r\n const viewer = viewerRef.current;\r\n if (!viewer) return;\r\n\r\n const [page, total] = await Promise.all([\r\n viewer.getCurrentPage(),\r\n viewer.getTotalPages(),\r\n ]);\r\n\r\n if (page !== null && total !== null) {\r\n setCurrentPage(page);\r\n setTotalPages(total);\r\n setIsViewerReady(true);\r\n } else {\r\n setIsViewerReady(false);\r\n }\r\n } catch (error) {\r\n setIsViewerReady(false);\r\n }\r\n };\r\n\r\n // Initial check\r\n updatePageInfo();\r\n\r\n // Poll for page updates while in PDF view (PDF.js may not be ready immediately)\r\n // Continue polling to keep page info up to date\r\n const interval = setInterval(updatePageInfo, 1000);\r\n\r\n return () => {\r\n clearInterval(interval);\r\n };\r\n }, [currentView, viewerRef, showPdfControls]);\r\n\r\n // Update form field info when form view is active\r\n useEffect(() => {\r\n if (currentView !== 'form' || !formFieldsViewRef?.current) {\r\n setCurrentFieldIndex(null);\r\n setTotalFields(0);\r\n return;\r\n }\r\n\r\n const updateFieldInfo = () => {\r\n try {\r\n const formView = formFieldsViewRef.current;\r\n if (!formView) return;\r\n\r\n const index = formView.getCurrentFieldIndex();\r\n const total = formView.getTotalFields();\r\n\r\n setCurrentFieldIndex(index);\r\n setTotalFields(total);\r\n } catch (error) {\r\n // Error handling\r\n }\r\n };\r\n\r\n // Initial check\r\n updateFieldInfo();\r\n\r\n // Poll for field updates while in form view\r\n const interval = setInterval(updateFieldInfo, 500);\r\n\r\n return () => {\r\n clearInterval(interval);\r\n };\r\n }, [currentView, formFieldsViewRef]);\r\n\r\n const handleZoomOut = async () => {\r\n if (!viewerRef?.current || !isViewerReady) return;\r\n try {\r\n await viewerRef.current.zoomOut();\r\n } catch (error) {\r\n // Error handling is done in the core method\r\n }\r\n };\r\n\r\n const handleZoomIn = async () => {\r\n if (!viewerRef?.current || !isViewerReady) return;\r\n try {\r\n await viewerRef.current.zoomIn();\r\n } catch (error) {\r\n // Error handling is done in the core method\r\n }\r\n };\r\n\r\n const handlePreviousPage = async () => {\r\n if (!viewerRef?.current || !isViewerReady || currentPage === null || currentPage <= 1) return;\r\n try {\r\n await viewerRef.current.previousPage();\r\n // Update current page after navigation\r\n setTimeout(async () => {\r\n const viewer = viewerRef.current;\r\n if (!viewer) return;\r\n const page = await viewer.getCurrentPage();\r\n if (page !== null && page !== undefined) setCurrentPage(page);\r\n }, 100);\r\n } catch (error) {\r\n // Error handling is done in the core method\r\n }\r\n };\r\n\r\n const handleNextPage = async () => {\r\n if (!viewerRef?.current || !isViewerReady || currentPage === null || totalPages === null || currentPage >= totalPages) return;\r\n try {\r\n await viewerRef.current.nextPage();\r\n // Update current page after navigation\r\n setTimeout(async () => {\r\n const viewer = viewerRef.current;\r\n if (!viewer) return;\r\n const page = await viewer.getCurrentPage();\r\n if (page !== null && page !== undefined) setCurrentPage(page);\r\n }, 100);\r\n } catch (error) {\r\n // Error handling is done in the core method\r\n }\r\n };\r\n\r\n const handlePreviousField = () => {\r\n if (!formFieldsViewRef?.current) return;\r\n try {\r\n formFieldsViewRef.current.navigateToPrevious();\r\n // Update field index after navigation\r\n setTimeout(() => {\r\n const index = formFieldsViewRef.current?.getCurrentFieldIndex();\r\n if (index !== null && index !== undefined) setCurrentFieldIndex(index);\r\n }, 100);\r\n } catch (error) {\r\n // Error handling is done in the component\r\n }\r\n };\r\n\r\n const handleNextField = () => {\r\n if (!formFieldsViewRef?.current) return;\r\n try {\r\n formFieldsViewRef.current.navigateToNext();\r\n // Update field index after navigation\r\n setTimeout(() => {\r\n const index = formFieldsViewRef.current?.getCurrentFieldIndex();\r\n if (index !== null && index !== undefined) setCurrentFieldIndex(index);\r\n }, 100);\r\n } catch (error) {\r\n // Error handling is done in the component\r\n }\r\n };\r\n\r\n const showPdfControlsGroup = currentView === 'pdf' && showPdfControls && viewerRef;\r\n const showFormControlsGroup = currentView === 'form' && formFieldsViewRef && totalFields > 0;\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'flex flex-wrap items-center justify-center sm:justify-between gap-2 sm:gap-4 px-3 sm:px-6 py-3 sm:py-4 from-card to-muted/20 border-b border-border relative z-20 bg-background',\r\n className\r\n )}\r\n >\r\n {/* iPhone-Style Toggle Switch */}\r\n <div className=\"relative inline-flex items-center bg-muted/80 rounded-full shadow-inner border border-border/50 h-[32px] sm:h-[36px] w-fit\">\r\n {/* Sliding Background Indicator */}\r\n <div\r\n className={cn(\r\n 'absolute h-[32px] sm:h-[36px] rounded-full bg-primary shadow-lg transition-all duration-300 ease-out',\r\n currentView === 'pdf'\r\n ? 'left-0 w-[85px] sm:w-[118px]'\r\n : 'left-[85px] sm:left-[118px] w-[85px] sm:w-[128px]'\r\n )}\r\n style={{\r\n transitionProperty: 'left, width',\r\n }}\r\n />\r\n\r\n {/* PDF View Button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => onViewChange('pdf')}\r\n className={cn(\r\n 'relative z-10 flex items-center justify-center gap-1.5 sm:gap-2 px-3 sm:px-5 h-[32px] sm:h-[36px] rounded-full text-xs sm:text-sm font-semibold transition-all duration-300 w-[85px] sm:w-[118px]',\r\n currentView === 'pdf'\r\n ? 'text-primary-foreground'\r\n : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n >\r\n <FileText className=\"h-3.5 w-3.5 sm:h-4 sm:w-4 flex-shrink-0\" />\r\n <span className=\"hidden sm:inline flex-shrink-0\">PDF View</span>\r\n <span className=\"sm:hidden\">PDF</span>\r\n </button>\r\n\r\n {/* Form View Button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => onViewChange('form')}\r\n className={cn(\r\n 'relative z-10 flex items-center justify-center gap-1.5 sm:gap-2 px-3 sm:px-5 h-[32px] sm:h-[36px] rounded-full text-xs sm:text-sm font-semibold transition-all duration-300 w-[85px] sm:w-[128px]',\r\n currentView === 'form'\r\n ? 'text-primary-foreground'\r\n : 'text-muted-foreground hover:text-foreground'\r\n )}\r\n >\r\n <ListChecks className=\"h-3.5 w-3.5 sm:h-4 sm:w-4 flex-shrink-0\" />\r\n <span className=\"hidden sm:inline flex-shrink-0\">Form View</span>\r\n <span className=\"sm:hidden\">Form</span>\r\n </button>\r\n </div>\r\n\r\n {/* PDF Controls */}\r\n {showPdfControlsGroup && (\r\n <div className=\"flex items-center gap-1.5 sm:gap-3 flex-shrink-0 w-full sm:w-auto justify-center sm:justify-start\">\r\n {/* Zoom Controls Group */}\r\n <div className=\"flex items-center gap-0.5 sm:gap-1 bg-muted/60 rounded-lg p-0.5 sm:p-1 border border-border/50 shadow-sm\">\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={handleZoomOut}\r\n disabled={!isViewerReady}\r\n className={cn(\r\n \"h-7 w-7 sm:h-8 sm:w-8 rounded-md transition-all duration-200\",\r\n \"hover:bg-background/80 hover:shadow-sm\",\r\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\r\n \"active:scale-95\"\r\n )}\r\n aria-label=\"Zoom out\"\r\n >\r\n <ZoomOut className=\"h-3.5 w-3.5 sm:h-4 sm:w-4 text-foreground/80\" />\r\n </Button>\r\n\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={handleZoomIn}\r\n disabled={!isViewerReady}\r\n className={cn(\r\n \"h-7 w-7 sm:h-8 sm:w-8 rounded-md transition-all duration-200\",\r\n \"hover:bg-background/80 hover:shadow-sm\",\r\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\r\n \"active:scale-95\"\r\n )}\r\n aria-label=\"Zoom in\"\r\n >\r\n <ZoomIn className=\"h-3.5 w-3.5 sm:h-4 sm:w-4 text-foreground/80\" />\r\n </Button>\r\n </div>\r\n\r\n {/* Divider */}\r\n <div className=\"h-5 sm:h-6 w-px bg-border/60 hidden sm:block\" />\r\n\r\n {/* Page Navigation Controls Group */}\r\n <div className=\"flex items-center gap-0.5 sm:gap-1 bg-muted/60 rounded-lg p-0.5 sm:p-1 border border-border/50 shadow-sm\">\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={handlePreviousPage}\r\n disabled={!isViewerReady || currentPage === null || currentPage <= 1}\r\n className={cn(\r\n \"h-7 w-7 sm:h-8 sm:w-8 rounded-md transition-all duration-200\",\r\n \"hover:bg-background/80 hover:shadow-sm\",\r\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\r\n \"active:scale-95\"\r\n )}\r\n aria-label=\"Previous page\"\r\n >\r\n <ChevronLeft className=\"h-3.5 w-3.5 sm:h-4 sm:w-4 text-foreground/80\" />\r\n </Button>\r\n\r\n {/* Page Indicator */}\r\n {currentPage !== null && totalPages !== null && (\r\n <div className=\"px-2 sm:px-3 py-1 sm:py-1.5 min-w-[3rem] sm:min-w-[4rem] text-center text-[10px] sm:text-xs font-medium text-foreground/70 bg-background/50 rounded-md border border-border/30\">\r\n <span className=\"tabular-nums\">{currentPage}</span>\r\n <span className=\"mx-0.5 sm:mx-1 text-foreground/40\">/</span>\r\n <span className=\"tabular-nums\">{totalPages}</span>\r\n </div>\r\n )}\r\n\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={handleNextPage}\r\n disabled={!isViewerReady || currentPage === null || totalPages === null || currentPage >= totalPages}\r\n className={cn(\r\n \"h-7 w-7 sm:h-8 sm:w-8 rounded-md transition-all duration-200\",\r\n \"hover:bg-background/80 hover:shadow-sm\",\r\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\r\n \"active:scale-95\"\r\n )}\r\n aria-label=\"Next page\"\r\n >\r\n <ChevronRight className=\"h-3.5 w-3.5 sm:h-4 sm:w-4 text-foreground/80\" />\r\n </Button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Form Field Navigation Controls */}\r\n {showFormControlsGroup && (\r\n <div className=\"flex items-center gap-1.5 sm:gap-3 flex-shrink-0 w-full sm:w-auto justify-center sm:justify-start\">\r\n <div className=\"flex items-center gap-0.5 sm:gap-1 bg-muted/60 rounded-lg p-0.5 sm:p-1 border border-border/50 shadow-sm\">\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={handlePreviousField}\r\n disabled={totalFields === 0 || (currentFieldIndex !== null && currentFieldIndex <= 0)}\r\n className={cn(\r\n \"h-7 w-7 sm:h-8 sm:w-8 rounded-md transition-all duration-200\",\r\n \"hover:bg-background/80 hover:shadow-sm\",\r\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\r\n \"active:scale-95\"\r\n )}\r\n aria-label=\"Previous field\"\r\n >\r\n <ChevronLeft className=\"h-3.5 w-3.5 sm:h-4 sm:w-4 text-foreground/80\" />\r\n </Button>\r\n\r\n {/* Field Indicator */}\r\n {currentFieldIndex !== null && totalFields > 0 && (\r\n <div className=\"px-2 sm:px-3 py-1 sm:py-1.5 min-w-[3rem] sm:min-w-[4rem] text-center text-[10px] sm:text-xs font-medium text-foreground/70 bg-background/50 rounded-md border border-border/30\">\r\n <span className=\"tabular-nums\">{currentFieldIndex + 1}</span>\r\n <span className=\"mx-0.5 sm:mx-1 text-foreground/40\">/</span>\r\n <span className=\"tabular-nums\">{totalFields}</span>\r\n </div>\r\n )}\r\n\r\n <Button\r\n type=\"button\"\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={handleNextField}\r\n disabled={totalFields === 0 || (currentFieldIndex !== null && currentFieldIndex >= totalFields - 1)}\r\n className={cn(\r\n \"h-7 w-7 sm:h-8 sm:w-8 rounded-md transition-all duration-200\",\r\n \"hover:bg-background/80 hover:shadow-sm\",\r\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\r\n \"active:scale-95\"\r\n )}\r\n aria-label=\"Next field\"\r\n >\r\n <ChevronRight className=\"h-3.5 w-3.5 sm:h-4 sm:w-4 text-foreground/80\" />\r\n </Button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import * as React from 'react';\r\nimport { cva, type VariantProps } from 'class-variance-authority';\r\n\r\nimport { cn } from '../utils';\r\n\r\nconst alertVariants = cva(\r\n 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7',\r\n {\r\n variants: {\r\n variant: {\r\n default: 'bg-background text-foreground',\r\n destructive:\r\n 'border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive',\r\n },\r\n },\r\n defaultVariants: {\r\n variant: 'default',\r\n },\r\n }\r\n);\r\n\r\nconst Alert = React.forwardRef<\r\n HTMLDivElement,\r\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\r\n>(({ className, variant, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n role=\"alert\"\r\n className={cn(alertVariants({ variant }), className)}\r\n {...props}\r\n />\r\n));\r\nAlert.displayName = 'Alert';\r\n\r\nconst AlertTitle = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLHeadingElement>\r\n>(({ className, ...props }, ref) => (\r\n <h5\r\n ref={ref}\r\n className={cn('mb-1 font-medium leading-none tracking-tight', className)}\r\n {...props}\r\n />\r\n));\r\nAlertTitle.displayName = 'AlertTitle';\r\n\r\nconst AlertDescription = React.forwardRef<\r\n HTMLParagraphElement,\r\n React.HTMLAttributes<HTMLParagraphElement>\r\n>(({ className, ...props }, ref) => (\r\n <div\r\n ref={ref}\r\n className={cn('text-sm [&_p]:leading-relaxed', className)}\r\n {...props}\r\n />\r\n));\r\nAlertDescription.displayName = 'AlertDescription';\r\n\r\nexport { Alert, AlertTitle, AlertDescription };\r\n\r\n","/**\r\n * Form Fields View Component\r\n * Displays form fields in a comfortable, scrollable layout as an alternative to PDF view\r\n */\r\n\r\nimport { forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\nimport type { EsignFormField, FormFieldType } from '../types';\r\nimport { FormFieldRenderer } from './form-fields';\r\nimport { Card, CardContent } from '../lib/ui/card';\r\nimport { Label } from '../lib/ui/label';\r\nimport { AlertCircle } from 'lucide-react';\r\nimport { cn } from '../lib';\r\n\r\nexport interface FormFieldsViewProps {\r\n /** Array of form fields to display (already filtered for current signer) */\r\n fields: EsignFormField[];\r\n /** Current field values */\r\n fieldValues: Record<string, string>;\r\n /** Callback when field value changes */\r\n onFieldChange: (fieldId: string, value: string) => void;\r\n /** Callback when signature field is clicked */\r\n onSignatureClick: (field: EsignFormField) => void;\r\n /** Check if field has a signature */\r\n hasSignature: (fieldId: string) => boolean;\r\n /** Get validation error for field */\r\n getFieldError: (fieldId: string) => string | undefined;\r\n /** Check if field has been touched (for validation display) */\r\n isFieldTouched: (fieldId: string) => boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\nexport interface FormFieldsViewRef {\r\n /** Navigate to next field */\r\n navigateToNext: () => void;\r\n /** Navigate to previous field */\r\n navigateToPrevious: () => void;\r\n /** Get current focused field index */\r\n getCurrentFieldIndex: () => number | null;\r\n /** Get total number of fields */\r\n getTotalFields: () => number;\r\n}\r\n\r\n/**\r\n * Format field type to human-readable label\r\n * Matches dm-web-frontend's getFieldTypeName() function (submission.page.tsx line 350)\r\n */\r\nfunction formatFieldType(type: FormFieldType): string {\r\n const typeMap: Record<FormFieldType, string> = {\r\n text: 'Text Field',\r\n date: 'Date Field',\r\n checkbox: 'Checkbox',\r\n radio: 'Radio Button',\r\n dropdown: 'Dropdown',\r\n signature: 'Signature',\r\n initials: 'Initials',\r\n text_label: 'Label',\r\n };\r\n return typeMap[type] || 'Field';\r\n}\r\n\r\n/**\r\n * Get color styling for field type badge\r\n * Returns Tailwind classes for distinct, classy, muted colors\r\n */\r\nfunction getFieldTypeColors(type: FormFieldType): {\r\n bg: string;\r\n text: string;\r\n border: string;\r\n cardBorder: string;\r\n} {\r\n const colorMap: Record<FormFieldType, { bg: string; text: string; border: string; cardBorder: string }> = {\r\n text: {\r\n bg: 'bg-blue-50/50 dark:bg-blue-950/20',\r\n text: 'text-blue-600 dark:text-blue-400',\r\n border: 'border-blue-200/60 dark:border-blue-800/40',\r\n cardBorder: 'border-l-4 border-l-blue-400 dark:border-l-blue-600',\r\n },\r\n date: {\r\n bg: 'bg-emerald-50/50 dark:bg-emerald-950/20',\r\n text: 'text-emerald-600 dark:text-emerald-400',\r\n border: 'border-emerald-200/60 dark:border-emerald-800/40',\r\n cardBorder: 'border-l-4 border-l-emerald-400 dark:border-l-emerald-600',\r\n },\r\n checkbox: {\r\n bg: 'bg-fuchsia-50/50 dark:bg-fuchsia-950/20',\r\n text: 'text-fuchsia-600 dark:text-fuchsia-400',\r\n border: 'border-fuchsia-200/60 dark:border-fuchsia-800/40',\r\n cardBorder: 'border-l-4 border-l-fuchsia-400 dark:border-l-fuchsia-600',\r\n },\r\n radio: {\r\n bg: 'bg-amber-50/50 dark:bg-amber-950/20',\r\n text: 'text-amber-600 dark:text-amber-400',\r\n border: 'border-amber-200/60 dark:border-amber-800/40',\r\n cardBorder: 'border-l-4 border-l-amber-400 dark:border-l-amber-600',\r\n },\r\n dropdown: {\r\n bg: 'bg-indigo-50/50 dark:bg-indigo-950/20',\r\n text: 'text-indigo-600 dark:text-indigo-400',\r\n border: 'border-indigo-200/60 dark:border-indigo-800/40',\r\n cardBorder: 'border-l-4 border-l-indigo-400 dark:border-l-indigo-600',\r\n },\r\n signature: {\r\n bg: 'bg-pink-50/50 dark:bg-pink-950/20',\r\n text: 'text-pink-600 dark:text-pink-400',\r\n border: 'border-pink-200/60 dark:border-pink-800/40',\r\n cardBorder: 'border-l-4 border-l-pink-400 dark:border-l-pink-600',\r\n },\r\n initials: {\r\n bg: 'bg-cyan-50/50 dark:bg-cyan-950/20',\r\n text: 'text-cyan-600 dark:text-cyan-400',\r\n border: 'border-cyan-200/60 dark:border-cyan-800/40',\r\n cardBorder: 'border-l-4 border-l-cyan-400 dark:border-l-cyan-600',\r\n },\r\n text_label: {\r\n bg: 'bg-slate-50/50 dark:bg-slate-950/20',\r\n text: 'text-slate-600 dark:text-slate-400',\r\n border: 'border-slate-200/60 dark:border-slate-800/40',\r\n cardBorder: 'border-l-4 border-l-slate-400 dark:border-l-slate-600',\r\n },\r\n };\r\n return colorMap[type] || {\r\n bg: 'bg-gray-50/50 dark:bg-gray-950/20',\r\n text: 'text-gray-600 dark:text-gray-400',\r\n border: 'border-gray-200/60 dark:border-gray-800/40',\r\n cardBorder: 'border-l-4 border-l-gray-400 dark:border-l-gray-600',\r\n };\r\n}\r\n\r\n/**\r\n * FormFieldsView Component\r\n * \r\n * Renders form fields in a comfortable scrollable layout.\r\n * Excludes signature_field_main and initials_field_main (those stay in sidebar).\r\n * Fields are already filtered by the parent component for multi-signer compatibility.\r\n */\r\nexport const FormFieldsView = forwardRef<FormFieldsViewRef, FormFieldsViewProps>(({\r\n fields,\r\n fieldValues,\r\n onFieldChange,\r\n onSignatureClick,\r\n hasSignature,\r\n getFieldError,\r\n isFieldTouched,\r\n className = '',\r\n}, ref) => {\r\n // Filter out main signature and initials fields (they stay in sidebar)\r\n const displayFields = fields.filter(\r\n (f) => f.id !== 'signature_field_main' && f.id !== 'initials_field_main'\r\n );\r\n\r\n // Track current focused field index (-1 means not started, 0+ means active field)\r\n const [currentFieldIndex, setCurrentFieldIndex] = useState<number>(-1);\r\n // Track currently focused field ID for styling\r\n const [focusedFieldId, setFocusedFieldId] = useState<string | null>(null);\r\n\r\n // Navigate to a specific field by index\r\n const navigateToField = (index: number) => {\r\n if (index < 0 || index >= displayFields.length) return;\r\n \r\n const field = displayFields[index];\r\n if (!field) return;\r\n \r\n const fieldId = field.id;\r\n const fieldElement = document.querySelector(`[data-field-id=\"${fieldId}\"]`);\r\n \r\n if (fieldElement) {\r\n // Clear previous focus style\r\n setFocusedFieldId(null);\r\n \r\n fieldElement.scrollIntoView({ \r\n behavior: 'smooth', \r\n block: 'center',\r\n inline: 'nearest'\r\n });\r\n \r\n // Focus the input element within the field\r\n const inputElement = fieldElement.querySelector('input, textarea, select, button') as HTMLElement;\r\n if (inputElement && typeof inputElement.focus === 'function') {\r\n // Mark that this is programmatic focus so calendar/dropdown can auto-open\r\n inputElement.setAttribute('data-programmatic-focus', 'true');\r\n setTimeout(() => {\r\n inputElement.focus();\r\n // Set focus style after focusing\r\n setFocusedFieldId(fieldId);\r\n // Remove the attribute after a short delay\r\n setTimeout(() => {\r\n inputElement.removeAttribute('data-programmatic-focus');\r\n }, 100);\r\n }, 100);\r\n }\r\n \r\n setCurrentFieldIndex(index);\r\n }\r\n };\r\n\r\n // Track focus when user manually interacts with fields\r\n useEffect(() => {\r\n const handleFocus = (e: Event) => {\r\n const target = e.target as HTMLElement;\r\n const fieldCard = target.closest('[data-field-id]') as HTMLElement;\r\n \r\n if (fieldCard) {\r\n const fieldId = fieldCard.getAttribute('data-field-id');\r\n if (fieldId) {\r\n const index = displayFields.findIndex(f => f.id === fieldId);\r\n if (index !== -1) {\r\n setCurrentFieldIndex(index);\r\n setFocusedFieldId(fieldId);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleBlur = () => {\r\n // Keep focus style for a moment, then clear (allows for smooth transitions)\r\n // We'll keep it until next focus to show which field was last active\r\n };\r\n\r\n // Add focus listeners to all input elements\r\n const inputs = document.querySelectorAll('[data-field-id] input, [data-field-id] textarea, [data-field-id] select, [data-field-id] button');\r\n inputs.forEach(input => {\r\n input.addEventListener('focus', handleFocus as EventListener);\r\n input.addEventListener('blur', handleBlur);\r\n });\r\n\r\n return () => {\r\n inputs.forEach(input => {\r\n input.removeEventListener('focus', handleFocus as EventListener);\r\n input.removeEventListener('blur', handleBlur);\r\n });\r\n };\r\n }, [displayFields]);\r\n\r\n const navigateToNext = () => {\r\n // -1 means not started, so start at first field (0)\r\n const nextIndex = currentFieldIndex === -1 ? 0 : Math.min(currentFieldIndex + 1, displayFields.length - 1);\r\n navigateToField(nextIndex);\r\n };\r\n\r\n const navigateToPrevious = () => {\r\n // -1 means not started, so go to last field\r\n const prevIndex = currentFieldIndex === -1 ? displayFields.length - 1 : Math.max(currentFieldIndex - 1, 0);\r\n navigateToField(prevIndex);\r\n };\r\n\r\n const getCurrentFieldIndex = () => currentFieldIndex === -1 ? null : currentFieldIndex;\r\n const getTotalFields = () => displayFields.length;\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(ref, () => ({\r\n navigateToNext,\r\n navigateToPrevious,\r\n getCurrentFieldIndex,\r\n getTotalFields,\r\n }));\r\n\r\n return (\r\n <div\r\n className={cn(\r\n \"bg-background p-3 sm:p-4 md:p-6 overflow-y-auto\",\r\n \"min-h-[400px] sm:min-h-[800px] max-h-[600px] md:max-h-[800px]\",\r\n className\r\n )}\r\n >\r\n {/* Empty State */}\r\n {displayFields.length === 0 && (\r\n <div className=\"flex flex-col items-center justify-center h-full text-center py-12\">\r\n <div className=\"w-16 h-16 bg-muted rounded-full flex items-center justify-center mb-4\">\r\n <AlertCircle className=\"w-8 h-8 text-muted-foreground\" />\r\n </div>\r\n <h3 className=\"text-lg font-semibold text-foreground mb-2\">\r\n No Additional Fields\r\n </h3>\r\n <p className=\"text-sm text-muted-foreground max-w-md\">\r\n This document only requires your signature and initials, which can be\r\n provided in the sidebar.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Fields Grid - Responsive layout */}\r\n {displayFields.length > 0 && (\r\n <div className=\"grid grid-cols-1 xl:grid-cols-2 gap-3 sm:gap-4 md:gap-6\">\r\n {displayFields.map((field) => {\r\n const value = fieldValues[field.id] || '';\r\n const hasFieldSignature = hasSignature(field.id);\r\n const error = getFieldError(field.id);\r\n const isTouched = isFieldTouched(field.id);\r\n\r\n const isFocused = focusedFieldId === field.id;\r\n const typeColors = getFieldTypeColors(field.type);\r\n \r\n return (\r\n <Card\r\n key={field.id}\r\n data-field-id={field.id}\r\n className={cn(\r\n \"border border-border bg-card hover:shadow-md transition-all duration-200 rounded-lg relative overflow-hidden\",\r\n isFocused && \"shadow-lg shadow-primary/20 dark:shadow-primary/30\",\r\n typeColors.cardBorder\r\n )}\r\n >\r\n <CardContent className=\"p-3 sm:p-4 space-y-2\">\r\n {/* Field Label */}\r\n <div className=\"flex items-center justify-between gap-2 flex-wrap\">\r\n <Label className=\"text-xs sm:text-sm font-semibold text-foreground break-words\">\r\n {field.label || formatFieldType(field.type)}\r\n {field.required && (\r\n <span className=\"text-destructive ml-1\">*</span>\r\n )}\r\n </Label>\r\n {/* Field Type Badge */}\r\n <span className={cn(\r\n \"text-[10px] sm:text-xs font-medium px-1.5 sm:px-2 py-0.5 sm:py-1 rounded-md border whitespace-nowrap flex-shrink-0\",\r\n typeColors.bg,\r\n typeColors.text,\r\n typeColors.border\r\n )}>\r\n {formatFieldType(field.type)}\r\n </span>\r\n </div>\r\n\r\n {/* Field Input */}\r\n <FormFieldRenderer\r\n field={field}\r\n value={value}\r\n hasSignature={hasFieldSignature}\r\n error={isTouched ? error : undefined}\r\n onChange={(newValue) => onFieldChange(field.id, newValue)}\r\n onSignatureClick={() => onSignatureClick(field)}\r\n className=\"mt-2\"\r\n />\r\n </CardContent>\r\n </Card>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\nFormFieldsView.displayName = 'FormFieldsView';\r\n","/**\r\n * PDF Viewer Filtering Utility\r\n * Removes other signers' fields from PDF for viewer display\r\n * Based on Dockmaster's field removal logic (lines 977-1037)\r\n */\r\n\r\nimport { loadPdfLib } from './pdf-lib-loader';\r\nimport type { PDFDocument } from 'pdf-lib';\r\nimport type { EsignFormField, MultiSignerContext } from '../types';\r\nimport { FormFieldType } from '../types';\r\nimport { logger } from './logger';\r\nimport { isAutoGeneratedLabel } from './pdf-validators';\r\nimport { isFieldVisibleToSigner } from './field-visibility';\r\nimport { findPageIndexWithFallback, type PDFWidgetWithExtensions } from './pdf-widget-helpers';\r\n\r\n// Extended types for pdf-lib widgets (for label drawing)\r\ninterface PDFFieldWithExtensions {\r\n acroField?: {\r\n getWidgets?: () => unknown[];\r\n };\r\n}\r\n\r\n/**\r\n * Draw cosmetic labels on PDF fields for viewer display\r\n * Based on dm-web-frontend's label drawing logic (commit aafc786)\r\n * \r\n * @param pdfDoc - The PDF document to draw labels on\r\n * @param fieldsToLabel - Fields visible to current signer that need labels\r\n * @param rgb - The rgb function from pdf-lib\r\n */\r\nasync function drawFieldLabelsOnPdf(\r\n pdfDoc: PDFDocument,\r\n fieldsToLabel: EsignFormField[],\r\n rgb: (r: number, g: number, b: number) => any\r\n): Promise<void> {\r\n\r\n try {\r\n // Embed font for labels\r\n const labelFont = await pdfDoc.embedFont('Helvetica-Bold');\r\n const pages = pdfDoc.getPages();\r\n const form = pdfDoc.getForm();\r\n const drawnOnce = new Set<string>();\r\n\r\n for (const field of fieldsToLabel) {\r\n // Skip fields without labels EXCEPT radio fields which need option texts drawn\r\n // Fix from dm-web-frontend commit aafc786 (Oct 29, 2025)\r\n // Match dm-web-frontend submission.page.tsx lines 1427-1433\r\n const isRadioField = field.type === FormFieldType.RADIO;\r\n const hasRadioOptions = isRadioField && field.options && field.options.length > 0;\r\n \r\n // Skip fields without custom labels EXCEPT radio fields which need option texts drawn\r\n const hasCustomLabel = field.label && field.label.trim() && !isAutoGeneratedLabel(field.label);\r\n \r\n if (!hasCustomLabel && !hasRadioOptions) {\r\n continue;\r\n }\r\n\r\n const pdfField = form.getFieldMaybe(field.name);\r\n if (!pdfField) {\r\n continue;\r\n }\r\n\r\n // Get widgets for this field\r\n const fieldWithExtensions = pdfField as unknown as PDFFieldWithExtensions;\r\n const widgets = (fieldWithExtensions.acroField?.getWidgets?.() || []) as PDFWidgetWithExtensions[];\r\n \r\n if (widgets.length === 0) continue;\r\n\r\n // Handle radio fields specially\r\n // Match dm-web-frontend submission.page.tsx lines 1440-1496\r\n if (isRadioField) {\r\n // Draw radio GROUP label (once per field)\r\n if (field.label && field.label.trim() && !isAutoGeneratedLabel(field.label)) {\r\n const firstWidget = widgets[0];\r\n if (!firstWidget) continue;\r\n const firstRect = firstWidget.getRectangle?.();\r\n \r\n if (firstRect) {\r\n const pageRef = firstWidget.P?.();\r\n const pageIndex = findPageIndexWithFallback(pages, pageRef);\r\n \r\n if (pageIndex >= 0) {\r\n const page = pages[pageIndex];\r\n if (!page) continue;\r\n const groupLabelKey = `${pageIndex}-${field.name}-grouplabel`;\r\n \r\n // Only draw if not already drawn\r\n if (!drawnOnce.has(groupLabelKey)) {\r\n // Match dm-web-frontend: size 10, position y + height + 5\r\n const labelY = firstRect.y + firstRect.height + 5;\r\n page.drawText(field.label, {\r\n x: firstRect.x,\r\n y: labelY,\r\n size: 10,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n drawnOnce.add(groupLabelKey);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Draw each option text ONLY if explicit options exist\r\n // Match dm-web-frontend: size 10, position x + width + 6, centered vertically\r\n if (field.options && field.options.length > 0) {\r\n for (let i = 0; i < widgets.length; i++) {\r\n const widget = widgets[i];\r\n if (!widget) continue;\r\n const rect = widget.getRectangle?.();\r\n if (!rect) continue;\r\n\r\n const pageRef = widget.P?.();\r\n const pageIndex = findPageIndexWithFallback(pages, pageRef);\r\n \r\n if (pageIndex >= 0) {\r\n const page = pages[pageIndex];\r\n if (!page) continue;\r\n const optionTexts = field.options;\r\n const optionText = optionTexts[i] || optionTexts[0];\r\n const optionKey = `${pageIndex}-${field.name}-opt-${i}`;\r\n \r\n if (optionText && !drawnOnce.has(optionKey)) {\r\n page.drawText(optionText, {\r\n x: rect.x + rect.width + 6,\r\n y: rect.y + (rect.height - 10) / 2,\r\n size: 10,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n drawnOnce.add(optionKey);\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // For other fields, draw label once\r\n // Match dm-web-frontend submission.page.tsx lines 1498-1534\r\n const widget = widgets[0];\r\n if (!widget) continue;\r\n const rect = widget.getRectangle?.();\r\n if (!rect) continue;\r\n\r\n const pageRef = widget.P?.();\r\n const pageIndex = findPageIndexWithFallback(pages, pageRef);\r\n \r\n if (pageIndex >= 0 && pageIndex < pages.length) {\r\n const page = pages[pageIndex];\r\n if (!page) continue;\r\n const key = `${pageIndex}-${field.name}`;\r\n \r\n if (!drawnOnce.has(key)) {\r\n // Only draw if it's a user-typed custom label (not auto-generated)\r\n if (!isAutoGeneratedLabel(field.label)) {\r\n // Match dm-web-frontend: checkbox size 10, other fields size 9\r\n if (field.type === FormFieldType.CHECKBOX) {\r\n // Checkbox label to the right - size 10, position x + width + 5\r\n page.drawText(field.label, {\r\n x: rect.x + rect.width + 5,\r\n y: rect.y + (rect.height * 0.2),\r\n size: 10,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n } else {\r\n // Other field labels above the field - size 9, position y + height + 5\r\n const labelY = rect.y + rect.height + 5;\r\n page.drawText(field.label, {\r\n x: rect.x,\r\n y: labelY,\r\n size: 9,\r\n font: labelFont,\r\n color: rgb(0.3, 0.3, 0.3),\r\n });\r\n }\r\n drawnOnce.add(key);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Update form field appearances to ensure radio button selections render correctly\r\n // Fix from dm-web-frontend commit aafc786 (Oct 29, 2025)\r\n try {\r\n form.updateFieldAppearances();\r\n } catch (appearanceError) {\r\n // Non-critical error - just log and continue\r\n }\r\n\r\n } catch (error) {\r\n // Non-critical error - just log and continue without labels\r\n logger.error('Error drawing field labels:', error);\r\n // Don't throw - allow the PDF to be used without labels\r\n }\r\n}\r\n\r\n/**\r\n * Filter PDF for current signer by removing other signers' fields\r\n * This creates a modified PDF for the viewer while preserving the original\r\n * \r\n * @param pdfBytes - Original PDF bytes with ALL fields\r\n * @param allFields - All form fields extracted from the PDF\r\n * @param multiSignerContext - Multi-signer context\r\n * @returns Modified PDF bytes with other signers' fields removed (for viewer only)\r\n * \r\n * @example\r\n * ```ts\r\n * const originalPdfBytes = await urlToPdfBytes(pdfUrl);\r\n * const allFields = await extractFormFields(originalPdfBytes);\r\n * \r\n * if (multiSignerContext.isMultiSigner) {\r\n * // Create filtered PDF for viewer\r\n * const viewerPdfBytes = await filterPdfForCurrentSigner(\r\n * originalPdfBytes,\r\n * allFields,\r\n * multiSignerContext\r\n * );\r\n * loadPdfIntoViewer(viewerPdfBytes);\r\n * \r\n * // CRITICAL: Keep originalPdfBytes for submission\r\n * }\r\n * ```\r\n */\r\nexport async function filterPdfForCurrentSigner(\r\n pdfBytes: Uint8Array,\r\n allFields: EsignFormField[],\r\n multiSignerContext: MultiSignerContext\r\n): Promise<Uint8Array> {\r\n // Single signer mode: no filtering needed, but we still draw labels\r\n if (!multiSignerContext.isMultiSigner) {\r\n \r\n try {\r\n const { PDFDocument, rgb } = await loadPdfLib();\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n \r\n // Draw labels on all fields (no filtering in single-signer mode)\r\n await drawFieldLabelsOnPdf(pdfDoc, allFields, rgb);\r\n \r\n // Save and return the labeled PDF\r\n const labeledBytes = await pdfDoc.save();\r\n return labeledBytes;\r\n } catch (error) {\r\n return pdfBytes;\r\n }\r\n }\r\n\r\n // Determine which fields to remove using centralized visibility logic\r\n const otherSignersFields = allFields.filter(f => {\r\n // RULE 0: TEXT_LABEL fields are ALWAYS visible to all signers\r\n // They are flattened into the PDF and should never be hidden\r\n // Fix based on dm-web-frontend commit e81bbdd (Oct 29, 2025)\r\n if (f.type === FormFieldType.TEXT_LABEL) {\r\n return false; // Never remove TEXT_LABEL fields\r\n }\r\n\r\n // Use centralized visibility logic: if NOT visible, should be removed\r\n return !isFieldVisibleToSigner(f, multiSignerContext);\r\n });\r\n\r\n\r\n // If no fields to remove, still draw labels on remaining fields\r\n // Match dm-web-frontend submission.page.tsx lines 1588-1730\r\n if (otherSignersFields.length === 0) {\r\n try {\r\n const { PDFDocument, rgb } = await loadPdfLib();\r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n \r\n // Draw labels on all visible fields (no removal needed)\r\n const fieldsToLabel = allFields.filter(f => {\r\n // Include TEXT_LABEL fields (always visible)\r\n if (f.type === FormFieldType.TEXT_LABEL) {\r\n return true;\r\n }\r\n // Use centralized visibility logic\r\n return isFieldVisibleToSigner(f, multiSignerContext);\r\n });\r\n \r\n await drawFieldLabelsOnPdf(pdfDoc, fieldsToLabel, rgb);\r\n \r\n // Save and return the labeled PDF\r\n const labeledBytes = await pdfDoc.save();\r\n return labeledBytes;\r\n } catch (error) {\r\n // If label drawing fails, return original\r\n return pdfBytes;\r\n }\r\n }\r\n\r\n // Load a fresh copy of the PDF for modification\r\n const { PDFDocument, rgb } = await loadPdfLib();\r\n const freshPdfDoc = await PDFDocument.load(pdfBytes);\r\n const form = freshPdfDoc.getForm();\r\n\r\n // Remove other signers' fields from the form\r\n let removedCount = 0;\r\n let notFoundCount = 0;\r\n\r\n for (const field of otherSignersFields) {\r\n try {\r\n const pdfField = form.getFieldMaybe(field.name);\r\n if (pdfField) {\r\n form.removeField(pdfField);\r\n removedCount++;\r\n } else {\r\n notFoundCount++;\r\n }\r\n } catch (error) {\r\n const errorMsg = error instanceof Error ? error.message : 'Unknown error';\r\n logger.error('Error removing field:', errorMsg);\r\n }\r\n }\r\n\r\n // Draw labels on remaining fields (cosmetic enhancement for viewer)\r\n // Based on dm-web-frontend's label drawing logic (commit aafc786)\r\n try {\r\n // Determine which fields to label (fields visible to current signer)\r\n const fieldsToLabel = allFields.filter(f => {\r\n // Include TEXT_LABEL fields (always visible)\r\n if (f.type === FormFieldType.TEXT_LABEL) {\r\n return true;\r\n }\r\n\r\n // Use centralized visibility logic\r\n return isFieldVisibleToSigner(f, multiSignerContext);\r\n });\r\n\r\n await drawFieldLabelsOnPdf(freshPdfDoc, fieldsToLabel, rgb);\r\n } catch (labelError) {\r\n // Continue without labels - not critical for functionality\r\n }\r\n\r\n // Save the modified PDF\r\n const modifiedPdfBytes = await freshPdfDoc.save();\r\n\r\n\r\n return modifiedPdfBytes;\r\n}\r\n\r\n","import { useRef, useState, useCallback } from 'react';\r\nimport type { PdfViewerRef, EsignFormField, MultiSignerContext } from '../types';\r\nimport {\r\n extractVisibleFormFields,\r\n fillPdfWithSignatures,\r\n validatePdfFormFields,\r\n urlToPdfBytes,\r\n createPdfBlobUrl,\r\n logger,\r\n validatePdfUrl,\r\n validateFieldValues,\r\n validateSignatures,\r\n PdfValidationError,\r\n PdfProcessingError,\r\n initializePdfJs,\r\n} from '../utils';\r\nimport { filterPdfForCurrentSigner } from '../utils/pdf-viewer-filter';\r\nimport { loadPdfLib } from '../utils/pdf-lib-loader';\r\n\r\n/**\r\n * Hook to manage PDF viewer state and operations with multi-signer support\r\n * \r\n * @param multiSignerContext - Multi-signer context (from useMultiSignerContext)\r\n */\r\nexport function usePdfViewer(\r\n multiSignerContext?: MultiSignerContext\r\n) {\r\n const viewerRef = useRef<PdfViewerRef>(null);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n const [pdfUrl, setPdfUrl] = useState<string | null>(null);\r\n \r\n // CRITICAL: Store both original and viewer PDF bytes\r\n // Original PDF has ALL fields (used for submission/flattening)\r\n // Viewer PDF has only current signer's fields (used for display)\r\n const [originalPdfBytes, setOriginalPdfBytes] = useState<Uint8Array | null>(null);\r\n const [_viewerPdfBytes, setViewerPdfBytes] = useState<Uint8Array | null>(null);\r\n const [extractedFields, setExtractedFields] = useState<EsignFormField[]>([]);\r\n\r\n const loadPdf = useCallback(async (url: string) => {\r\n setIsLoading(true);\r\n setError(null);\r\n setIsLoaded(false);\r\n setPdfUrl(url);\r\n\r\n try {\r\n // Initialize PDF.js configuration (lazy, only runs once)\r\n // This ensures the worker is configured before any PDF operations\r\n initializePdfJs();\r\n \r\n // Validate URL format\r\n const urlValidation = validatePdfUrl(url);\r\n if (!urlValidation.valid) {\r\n throw new PdfValidationError(urlValidation.error || 'Invalid PDF URL');\r\n }\r\n\r\n // Load PDF bytes for processing\r\n const bytes = await urlToPdfBytes(url);\r\n \r\n // Store as original PDF (with ALL fields)\r\n setOriginalPdfBytes(bytes);\r\n setViewerPdfBytes(bytes); // Initially same as original\r\n \r\n // Load PDF in viewer\r\n await viewerRef.current?.loadPdf(url);\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to load PDF';\r\n logger.error('Error loading PDF:', err);\r\n setError(errorMessage);\r\n setOriginalPdfBytes(null);\r\n setViewerPdfBytes(null);\r\n }\r\n }, []);\r\n\r\n const handleLoad = useCallback(() => {\r\n setIsLoading(false);\r\n setIsLoaded(true);\r\n setError(null);\r\n }, []);\r\n\r\n const handleError = useCallback((errorMessage: string) => {\r\n setIsLoading(false);\r\n setIsLoaded(false);\r\n setError(errorMessage);\r\n }, []);\r\n\r\n const getFormFieldValues = useCallback(async () => {\r\n if (!viewerRef.current) {\r\n return {};\r\n }\r\n return await viewerRef.current.getFormFieldValues();\r\n }, []);\r\n\r\n const setFormFieldValues = useCallback(async (values: Record<string, string>) => {\r\n if (!viewerRef.current) {\r\n return;\r\n }\r\n return await viewerRef.current.setFormFieldValues(values);\r\n }, []);\r\n\r\n const getAllFieldNames = useCallback(async () => {\r\n if (!viewerRef.current) {\r\n return [];\r\n }\r\n return await viewerRef.current.getAllFieldNames();\r\n }, []);\r\n\r\n const saveDocument = useCallback(async () => {\r\n if (!viewerRef.current) {\r\n return null;\r\n }\r\n return await viewerRef.current.saveDocument();\r\n }, []);\r\n\r\n /**\r\n * Extract form fields from the current PDF\r\n * If multi-signer, creates a filtered PDF for the viewer\r\n */\r\n const extractFormFields = useCallback(\r\n async (currentSignerEmail?: string) => {\r\n if (!originalPdfBytes) {\r\n throw new Error('No PDF loaded');\r\n }\r\n\r\n try {\r\n \r\n // Extract fields from original PDF (with ALL fields)\r\n const fields = await extractVisibleFormFields(\r\n originalPdfBytes, \r\n currentSignerEmail\r\n );\r\n setExtractedFields(fields);\r\n \r\n\r\n // If multi-signer mode, create a filtered PDF for the viewer\r\n if (multiSignerContext?.isMultiSigner) {\r\n \r\n // Create filtered PDF with other signers' fields removed\r\n const filteredBytes = await filterPdfForCurrentSigner(\r\n originalPdfBytes,\r\n fields,\r\n multiSignerContext\r\n );\r\n \r\n setViewerPdfBytes(filteredBytes);\r\n \r\n // Reload viewer with filtered PDF\r\n const filteredBlobUrl = createPdfBlobUrl(filteredBytes);\r\n await viewerRef.current?.loadPdf(filteredBlobUrl);\r\n \r\n } else {\r\n \r\n // Single-signer mode: call filterPdfForCurrentSigner to draw labels\r\n // (it will skip filtering but draw labels)\r\n const labeledBytes = await filterPdfForCurrentSigner(\r\n originalPdfBytes,\r\n fields,\r\n multiSignerContext || { \r\n isMultiSigner: false,\r\n currentSigner: null,\r\n currentSignerEmail: '', \r\n isPrimarySigner: true, \r\n isFinalSigner: true \r\n }\r\n );\r\n \r\n setViewerPdfBytes(labeledBytes);\r\n \r\n // Reload viewer with labeled PDF\r\n const labeledBlobUrl = createPdfBlobUrl(labeledBytes);\r\n await viewerRef.current?.loadPdf(labeledBlobUrl);\r\n \r\n }\r\n \r\n // Inject placeholders into PDF.js viewer (after reload if filtered)\r\n if (viewerRef.current && fields.length > 0) {\r\n // Small delay to ensure viewer has loaded\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n viewerRef.current.injectPlaceholders(fields);\r\n }\r\n \r\n return fields;\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to extract form fields';\r\n throw new Error(errorMessage);\r\n }\r\n },\r\n [originalPdfBytes, multiSignerContext]\r\n );\r\n\r\n /**\r\n * Fill the PDF with form values and signatures, then return the filled PDF bytes\r\n * CRITICAL: Always uses originalPdfBytes (with ALL fields) for proper flattening\r\n */\r\n const fillPdf = useCallback(\r\n async (\r\n fieldValues: Record<string, string>,\r\n signatures: Record<string, string>,\r\n currentSignerEmail?: string,\r\n metadata?: { submissionId?: string; documentId?: string; author?: string; signerEmail?: string; signerInitials?: string; createdAt?: Date },\r\n auditTrail?: { userAgent?: string; screenResolution?: string; timezone?: string; language?: string; platform?: string; ipAddress?: string; geolocation?: { latitude: number; longitude: number; accuracy?: number } }\r\n ): Promise<Uint8Array> => {\r\n if (!originalPdfBytes) {\r\n throw new PdfProcessingError('No PDF loaded');\r\n }\r\n\r\n try {\r\n // Validate inputs\r\n const valuesValidation = validateFieldValues(fieldValues);\r\n if (!valuesValidation.valid) {\r\n logger.warn('Field values validation warnings:', valuesValidation.errors);\r\n // Don't throw - allow submission with warnings\r\n }\r\n\r\n const sigsValidation = validateSignatures(signatures);\r\n if (!sigsValidation.valid) {\r\n logger.warn('Signatures validation warnings:', sigsValidation.errors);\r\n // Don't throw - allow submission with warnings\r\n }\r\n\r\n const filledPdfBytes = await fillPdfWithSignatures(\r\n originalPdfBytes, // CRITICAL: Use original PDF with ALL fields\r\n signatures,\r\n fieldValues,\r\n currentSignerEmail,\r\n extractedFields, // Pass extracted fields for proper signature filtering\r\n metadata,\r\n auditTrail,\r\n multiSignerContext // Pass multi-signer context for partial flattening\r\n );\r\n return filledPdfBytes;\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to fill PDF';\r\n logger.error('Error filling PDF:', err);\r\n throw new PdfProcessingError(errorMessage, err);\r\n }\r\n },\r\n [originalPdfBytes, extractedFields, multiSignerContext]\r\n );\r\n\r\n /**\r\n * Validate that all required fields are filled\r\n */\r\n const validatePdf = useCallback(\r\n async (\r\n fieldValues: Record<string, string>,\r\n signatures: Record<string, string>,\r\n visibleFields?: EsignFormField[] // Optional: pass filtered fields for multi-signer validation\r\n ): Promise<{ isValid: boolean; errors: string[] }> => {\r\n if (!originalPdfBytes) {\r\n throw new Error('No PDF loaded');\r\n }\r\n\r\n try {\r\n // Use visibleFields if provided (for multi-signer), otherwise use extractedFields\r\n const fieldsToValidate = visibleFields || extractedFields;\r\n const errors = await validatePdfFormFields(\r\n originalPdfBytes, \r\n fieldValues, \r\n signatures,\r\n fieldsToValidate, // Pass visible/filtered fields for validation\r\n multiSignerContext // Pass multi-signer context for validation filtering\r\n );\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n };\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to validate PDF';\r\n throw new Error(errorMessage);\r\n }\r\n },\r\n [originalPdfBytes, extractedFields, multiSignerContext]\r\n );\r\n\r\n /**\r\n * Get required field status from PDF metadata using pdf-lib\r\n * Returns a map of field names to their required status\r\n */\r\n const getRequiredFieldsMap = useCallback(async (): Promise<Record<string, boolean>> => {\r\n if (!originalPdfBytes) {\r\n return {};\r\n }\r\n\r\n try {\r\n const { PDFDocument } = await loadPdfLib();\r\n const pdfDoc = await PDFDocument.load(originalPdfBytes);\r\n const form = pdfDoc.getForm();\r\n const fields = form.getFields();\r\n\r\n const requiredMap: Record<string, boolean> = {};\r\n for (const field of fields) {\r\n const fieldName = field.getName();\r\n const isRequired = field.isRequired();\r\n requiredMap[fieldName] = isRequired;\r\n }\r\n\r\n return requiredMap;\r\n } catch (err) {\r\n logger.error('Failed to get required fields map:', err);\r\n return {};\r\n }\r\n }, [originalPdfBytes]);\r\n\r\n /**\r\n * Get the current PDF bytes (original with ALL fields)\r\n */\r\n const getCurrentPdfBytes = useCallback(() => {\r\n return originalPdfBytes;\r\n }, [originalPdfBytes]);\r\n\r\n /**\r\n * Reload the PDF with new bytes (for preview after filling)\r\n */\r\n const reloadPdfWithBytes = useCallback(\r\n async (newPdfBytes: Uint8Array) => {\r\n try {\r\n // Create a blob URL from the new PDF bytes\r\n const blobUrl = createPdfBlobUrl(newPdfBytes);\r\n \r\n // Update state\r\n setOriginalPdfBytes(newPdfBytes);\r\n setViewerPdfBytes(newPdfBytes);\r\n setPdfUrl(blobUrl);\r\n \r\n // Reload in viewer\r\n await viewerRef.current?.loadPdf(blobUrl);\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to reload PDF';\r\n setError(errorMessage);\r\n }\r\n },\r\n []\r\n );\r\n\r\n /**\r\n * Reset the hook state\r\n */\r\n const reset = useCallback(() => {\r\n setIsLoading(false);\r\n setError(null);\r\n setIsLoaded(false);\r\n setPdfUrl(null);\r\n setOriginalPdfBytes(null);\r\n setViewerPdfBytes(null);\r\n setExtractedFields([]);\r\n }, []);\r\n\r\n return {\r\n // Ref and state\r\n viewerRef,\r\n isLoading,\r\n error,\r\n isLoaded,\r\n pdfUrl,\r\n pdfBytes: originalPdfBytes, // Expose as pdfBytes for backward compatibility\r\n extractedFields,\r\n \r\n // Basic operations\r\n loadPdf,\r\n handleLoad,\r\n handleError,\r\n getFormFieldValues,\r\n setFormFieldValues,\r\n getAllFieldNames,\r\n saveDocument,\r\n \r\n // Enhanced operations\r\n extractFormFields,\r\n fillPdf,\r\n validatePdf,\r\n getRequiredFieldsMap,\r\n getCurrentPdfBytes,\r\n reloadPdfWithBytes,\r\n reset,\r\n };\r\n}\r\n\r\n","import { useState, useCallback } from 'react';\r\nimport type { FormField, ValidationError, FormFieldType } from '../types';\r\nimport { isValidISODate } from '../utils/date-validation';\r\n\r\n/**\r\n * Hook to manage form field state and validation\r\n */\r\nexport function useFormFields(fields: FormField[] = []) {\r\n const [fieldValues, setFieldValues] = useState<Record<string, string>>({});\r\n const [errors, setErrors] = useState<ValidationError[]>([]);\r\n const [touched, setTouched] = useState<Record<string, boolean>>({});\r\n\r\n const updateField = useCallback((fieldId: string, value: string) => {\r\n setFieldValues((prev) => ({\r\n ...prev,\r\n [fieldId]: value,\r\n }));\r\n // Mark field as touched\r\n setTouched((prev) => ({\r\n ...prev,\r\n [fieldId]: true,\r\n }));\r\n // Clear error for this field when value is updated\r\n setErrors((prev) => prev.filter((err) => err.field !== fieldId));\r\n }, []);\r\n\r\n const updateMultipleFields = useCallback((values: Record<string, string>) => {\r\n setFieldValues((prev) => ({\r\n ...prev,\r\n ...values,\r\n }));\r\n // Mark all updated fields as touched\r\n const touchedFields = Object.keys(values).reduce((acc, key) => {\r\n acc[key] = true;\r\n return acc;\r\n }, {} as Record<string, boolean>);\r\n setTouched((prev) => ({\r\n ...prev,\r\n ...touchedFields,\r\n }));\r\n // Clear errors for updated fields\r\n const updatedFieldIds = Object.keys(values);\r\n setErrors((prev) => prev.filter((err) => !updatedFieldIds.includes(err.field)));\r\n }, []);\r\n\r\n const validateField = useCallback(\r\n (fieldId: string) => {\r\n const field = fields.find((f) => f.id === fieldId);\r\n if (!field) return true;\r\n\r\n const value = fieldValues[fieldId];\r\n const newErrors = errors.filter((e) => e.field !== fieldId);\r\n\r\n if (field.required) {\r\n if (!value || value.trim() === '') {\r\n newErrors.push({\r\n field: fieldId,\r\n message: `${field.label || field.name} is required`,\r\n });\r\n }\r\n }\r\n\r\n // Additional validation for specific field types\r\n if (value && field.maxLength && value.length > field.maxLength) {\r\n newErrors.push({\r\n field: fieldId,\r\n message: `${field.label || field.name} must be at most ${field.maxLength} characters`,\r\n });\r\n }\r\n\r\n // Date validation\r\n if (value && field.type === ('date' as FormFieldType)) {\r\n if (!isValidISODate(value)) {\r\n newErrors.push({\r\n field: fieldId,\r\n message: 'Please enter a valid date',\r\n });\r\n }\r\n }\r\n\r\n setErrors(newErrors);\r\n return newErrors.length === errors.length - newErrors.filter((e) => e.field === fieldId).length;\r\n },\r\n [fields, fieldValues, errors]\r\n );\r\n\r\n const validateFields = useCallback(\r\n (signatures?: Record<string, string>) => {\r\n const newErrors: ValidationError[] = [];\r\n\r\n for (const field of fields) {\r\n if (field.required) {\r\n const value = fieldValues[field.id];\r\n \r\n // Check signature fields separately\r\n if (\r\n (field.type === 'signature' as FormFieldType || field.type === 'initials' as FormFieldType) &&\r\n signatures\r\n ) {\r\n if (!signatures[field.id]) {\r\n newErrors.push({\r\n field: field.id,\r\n message: `${field.label || field.name} is required`,\r\n });\r\n }\r\n } else if (!value || value.trim() === '') {\r\n newErrors.push({\r\n field: field.id,\r\n message: `${field.label || field.name} is required`,\r\n });\r\n }\r\n }\r\n\r\n // Validate maxLength\r\n const value = fieldValues[field.id];\r\n if (value && field.maxLength && value.length > field.maxLength) {\r\n newErrors.push({\r\n field: field.id,\r\n message: `${field.label || field.name} must be at most ${field.maxLength} characters`,\r\n });\r\n }\r\n\r\n // Date validation\r\n if (value && field.type === ('date' as FormFieldType)) {\r\n if (!isValidISODate(value)) {\r\n newErrors.push({\r\n field: field.id,\r\n message: 'Please enter a valid date',\r\n });\r\n }\r\n }\r\n }\r\n\r\n setErrors(newErrors);\r\n return newErrors.length === 0;\r\n },\r\n [fields, fieldValues]\r\n );\r\n\r\n const resetFields = useCallback(() => {\r\n setFieldValues({});\r\n setErrors([]);\r\n setTouched({});\r\n }, []);\r\n\r\n const resetValidation = useCallback(() => {\r\n setErrors([]);\r\n }, []);\r\n\r\n const getFieldValue = useCallback(\r\n (fieldId: string) => {\r\n return fieldValues[fieldId] || '';\r\n },\r\n [fieldValues]\r\n );\r\n\r\n const getFieldError = useCallback(\r\n (fieldId: string) => {\r\n const error = errors.find((e) => e.field === fieldId);\r\n return error?.message;\r\n },\r\n [errors]\r\n );\r\n\r\n const isFieldTouched = useCallback(\r\n (fieldId: string) => {\r\n return touched[fieldId] || false;\r\n },\r\n [touched]\r\n );\r\n\r\n const setFieldValue = updateField; // Alias for consistency\r\n const setMultipleFieldValues = updateMultipleFields; // Alias for consistency\r\n const clearFields = resetFields; // Alias for consistency\r\n\r\n const hasErrors = errors.length > 0;\r\n\r\n return {\r\n fieldValues,\r\n errors,\r\n hasErrors,\r\n touched,\r\n updateField,\r\n updateMultipleFields,\r\n validateField,\r\n validateFields,\r\n resetFields,\r\n resetValidation,\r\n getFieldValue,\r\n getFieldError,\r\n isFieldTouched,\r\n // Aliases\r\n setFieldValue,\r\n setMultipleFieldValues,\r\n clearFields,\r\n };\r\n}\r\n\r\n","/**\r\n * Hook to manage signature and initials state\r\n */\r\n\r\nimport { useState, useCallback } from 'react';\r\nimport type { FormField, FormFieldType } from '../types';\r\n\r\nexport interface SignatureData {\r\n [fieldId: string]: string; // Base64 data URL\r\n}\r\n\r\n/**\r\n * Hook for managing signatures and initials\r\n */\r\nexport function useSignatures() {\r\n const [signatures, setSignatures] = useState<SignatureData>({});\r\n\r\n /**\r\n * Add or update a signature for a field\r\n */\r\n const setSignature = useCallback((fieldId: string, dataUrl: string) => {\r\n setSignatures((prev) => ({\r\n ...prev,\r\n [fieldId]: dataUrl,\r\n }));\r\n }, []);\r\n\r\n /**\r\n * Remove a signature for a field\r\n */\r\n const clearSignature = useCallback((fieldId: string) => {\r\n setSignatures((prev) => {\r\n const newSignatures = { ...prev };\r\n delete newSignatures[fieldId];\r\n return newSignatures;\r\n });\r\n }, []);\r\n\r\n /**\r\n * Clear all signatures\r\n */\r\n const clearAllSignatures = useCallback(() => {\r\n setSignatures({});\r\n }, []);\r\n\r\n /**\r\n * Check if a field has a signature\r\n */\r\n const hasSignature = useCallback(\r\n (fieldId: string) => {\r\n return !!signatures[fieldId];\r\n },\r\n [signatures]\r\n );\r\n\r\n /**\r\n * Get signature data URL for a field\r\n */\r\n const getSignature = useCallback(\r\n (fieldId: string) => {\r\n return signatures[fieldId] || null;\r\n },\r\n [signatures]\r\n );\r\n\r\n /**\r\n * Validate that all required signature fields have signatures\r\n */\r\n const validateSignatures = useCallback(\r\n (fields: FormField[], currentSignatures?: SignatureData) => {\r\n const signaturesToCheck = currentSignatures ?? signatures;\r\n const errors: string[] = [];\r\n\r\n for (const field of fields) {\r\n if (field.required && (field.type === 'signature' as FormFieldType || field.type === 'initials' as FormFieldType)) {\r\n if (!signaturesToCheck[field.id]) {\r\n errors.push(`${field.label || field.name} is required`);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n };\r\n },\r\n [signatures]\r\n );\r\n\r\n /**\r\n * Get count of signatures\r\n */\r\n const signatureCount = Object.keys(signatures).length;\r\n\r\n /**\r\n * Check if any signatures exist\r\n */\r\n const hasAnySignatures = signatureCount > 0;\r\n\r\n return {\r\n signatures,\r\n setSignature,\r\n clearSignature,\r\n clearAllSignatures,\r\n hasSignature,\r\n getSignature,\r\n validateSignatures,\r\n signatureCount,\r\n hasAnySignatures,\r\n };\r\n}\r\n\r\n","/**\r\n * Hook for filtering form fields by signer with multi-signer support\r\n * Implements Dockmaster's exact field visibility logic\r\n */\r\n\r\nimport { useMemo } from 'react';\r\nimport type { EsignFormField, MultiSignerContext } from '../types';\r\nimport { isFieldVisibleToSigner, filterFieldsBySigner } from '../utils/field-visibility';\r\n\r\n/**\r\n * Hook for filtering form fields based on multi-signer context\r\n * \r\n * @param allFields - All form fields extracted from the PDF\r\n * @param multiSignerContext - Multi-signer context (from useMultiSignerContext)\r\n * @returns Filtered fields and utility functions\r\n * \r\n * @example\r\n * ```tsx\r\n * const context = useMultiSignerContext(currentSigner, isMultipleSignature, totalSigners);\r\n * const { filteredFields } = useFieldFiltering(allFields, context);\r\n * ```\r\n */\r\nexport function useFieldFiltering(\r\n allFields: EsignFormField[],\r\n multiSignerContext: MultiSignerContext\r\n) {\r\n /**\r\n * Filtered fields based on Dockmaster's multi-signer visibility logic\r\n */\r\n const filteredFields = useMemo(() => {\r\n // First, hide non-main signature/initials fields from UI\r\n // Only show signature_field_main and initials_field_main\r\n let fields = allFields.filter((field) => {\r\n // Keep signature_field_main and initials_field_main\r\n if (field.id === 'signature_field_main' || field.id === 'initials_field_main') {\r\n return true;\r\n }\r\n \r\n // Hide other signature/initials fields (they're not meant for UI display)\r\n if (field.type === 'signature' || field.type === 'initials') {\r\n return false;\r\n }\r\n \r\n return true;\r\n });\r\n\r\n // Apply multi-signer filtering using centralized visibility logic\r\n return filterFieldsBySigner(fields, multiSignerContext);\r\n }, [allFields, multiSignerContext]);\r\n\r\n /**\r\n * Required fields from filtered set\r\n */\r\n const requiredFields = useMemo(() => {\r\n return filteredFields.filter((field) => field.required);\r\n }, [filteredFields]);\r\n\r\n /**\r\n * Optional fields from filtered set\r\n */\r\n const optionalFields = useMemo(() => {\r\n return filteredFields.filter((field) => !field.required);\r\n }, [filteredFields]);\r\n\r\n /**\r\n * Check if a field is visible to current signer\r\n * Uses the same logic as filteredFields for consistency\r\n */\r\n const isFieldVisible = (field: EsignFormField): boolean => {\r\n return isFieldVisibleToSigner(field, multiSignerContext);\r\n };\r\n\r\n return {\r\n // Filtered fields\r\n filteredFields,\r\n requiredFields,\r\n optionalFields,\r\n \r\n // Utilities\r\n isFieldVisible,\r\n \r\n // Counts\r\n totalFields: allFields.length,\r\n filteredCount: filteredFields.length,\r\n requiredCount: requiredFields.length,\r\n optionalCount: optionalFields.length,\r\n };\r\n}\r\n\r\n","/**\r\n * Hook for managing file attachments\r\n * Handles file uploads, validation, and state management\r\n */\r\n\r\nimport { useState, useCallback } from 'react';\r\nimport type {\r\n Attachment,\r\n AttachmentConstraints,\r\n AttachmentValidationResult,\r\n} from '../types';\r\nimport { logger, validateFile, isImageType, formatFileSize, DEFAULT_ATTACHMENT_CONSTRAINTS } from '../utils';\r\n\r\n/**\r\n * Generate a unique ID for attachments\r\n */\r\nfunction generateAttachmentId(): string {\r\n return `att_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\r\n}\r\n\r\n/**\r\n * Create a preview for image files\r\n */\r\nasync function createPreview(file: File): Promise<string | undefined> {\r\n if (!isImageType(file.type)) {\r\n return undefined;\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(reader.result as string);\r\n reader.onerror = reject;\r\n reader.readAsDataURL(file);\r\n });\r\n}\r\n\r\nexport interface UseAttachmentsOptions {\r\n constraints?: Partial<AttachmentConstraints>;\r\n onError?: (errors: string[]) => void;\r\n}\r\n\r\nexport function useAttachments(options: UseAttachmentsOptions = {}) {\r\n const [attachments, setAttachments] = useState<Attachment[]>([]);\r\n const [isUploading, setIsUploading] = useState(false);\r\n const [validationErrors, setValidationErrors] = useState<string[]>([]);\r\n\r\n const constraints: AttachmentConstraints = {\r\n ...DEFAULT_ATTACHMENT_CONSTRAINTS,\r\n ...options.constraints,\r\n };\r\n\r\n /**\r\n * Add files to attachments\r\n */\r\n const addFiles = useCallback(\r\n async (files: File[] | FileList) => {\r\n setIsUploading(true);\r\n setValidationErrors([]);\r\n\r\n const fileArray = Array.from(files);\r\n const errors: string[] = [];\r\n const newAttachments: Attachment[] = [];\r\n\r\n for (const file of fileArray) {\r\n // Validate file\r\n const validation = validateFile(file, constraints);\r\n\r\n if (!validation.valid) {\r\n errors.push(...validation.errors);\r\n continue;\r\n }\r\n \r\n // Check total constraints manually\r\n const currentTotalSize = [...attachments, ...newAttachments].reduce((sum, att) => sum + att.size, 0);\r\n if (currentTotalSize + file.size > constraints.maxTotalSize) {\r\n const maxTotalMB = (constraints.maxTotalSize / 1024 / 1024).toFixed(1);\r\n errors.push(`Adding \"${file.name}\" would exceed total size limit of ${maxTotalMB}MB`);\r\n continue;\r\n }\r\n \r\n if ([...attachments, ...newAttachments].length >= constraints.maxFiles) {\r\n errors.push(`Maximum of ${constraints.maxFiles} files allowed`);\r\n continue;\r\n }\r\n\r\n // Create attachment\r\n try {\r\n const preview = await createPreview(file);\r\n const attachment: Attachment = {\r\n id: generateAttachmentId(),\r\n file,\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n uploadedAt: new Date(),\r\n preview,\r\n };\r\n newAttachments.push(attachment);\r\n } catch (error) {\r\n logger.error('Error creating attachment:', error);\r\n errors.push(`Failed to process file \"${file.name}\"`);\r\n }\r\n }\r\n\r\n // Update state\r\n if (newAttachments.length > 0) {\r\n setAttachments(prev => [...prev, ...newAttachments]);\r\n }\r\n\r\n if (errors.length > 0) {\r\n setValidationErrors(errors);\r\n options.onError?.(errors);\r\n }\r\n\r\n setIsUploading(false);\r\n\r\n return {\r\n added: newAttachments.length,\r\n errors,\r\n };\r\n },\r\n [attachments, constraints, options]\r\n );\r\n\r\n /**\r\n * Remove an attachment by ID\r\n */\r\n const removeAttachment = useCallback((attachmentId: string) => {\r\n setAttachments(prev => prev.filter(att => att.id !== attachmentId));\r\n setValidationErrors([]);\r\n }, []);\r\n\r\n /**\r\n * Clear all attachments\r\n */\r\n const clearAttachments = useCallback(() => {\r\n setAttachments([]);\r\n setValidationErrors([]);\r\n }, []);\r\n\r\n /**\r\n * Get total size of all attachments\r\n */\r\n const getTotalSize = useCallback(() => {\r\n return attachments.reduce((sum, att) => sum + att.size, 0);\r\n }, [attachments]);\r\n\r\n /**\r\n * Format bytes to human-readable string\r\n */\r\n const formatSize = useCallback((bytes: number): string => {\r\n return formatFileSize(bytes);\r\n }, []);\r\n\r\n /**\r\n * Validate all current attachments\r\n */\r\n const validateAll = useCallback((): AttachmentValidationResult => {\r\n const errors: string[] = [];\r\n\r\n // Check total size\r\n const totalSize = getTotalSize();\r\n if (totalSize > constraints.maxTotalSize) {\r\n const maxTotalMB = (constraints.maxTotalSize / 1024 / 1024).toFixed(1);\r\n errors.push(`Total file size (${formatSize(totalSize)}) exceeds ${maxTotalMB}MB limit`);\r\n }\r\n\r\n // Check number of files\r\n if (attachments.length > constraints.maxFiles) {\r\n errors.push(`Maximum of ${constraints.maxFiles} files allowed (currently ${attachments.length})`);\r\n }\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n };\r\n }, [attachments, constraints, getTotalSize, formatSize]);\r\n\r\n return {\r\n // State\r\n attachments,\r\n isUploading,\r\n validationErrors,\r\n constraints,\r\n\r\n // Actions\r\n addFiles,\r\n removeAttachment,\r\n clearAttachments,\r\n\r\n // Utilities\r\n getTotalSize,\r\n formatSize,\r\n validateAll,\r\n };\r\n}\r\n\r\n","/**\r\n * Hook for managing multi-signer context and determining signer roles\r\n */\r\n\r\nimport { useMemo } from 'react';\r\nimport type { Signer, MultiSignerContext } from '../types';\r\n\r\n/**\r\n * Calculate multi-signer context from simplified props\r\n * \r\n * @param currentSigner - The signer who is currently viewing/signing (if multi-signer)\r\n * @param isMultipleSignature - Whether this is a multi-signer document\r\n * @param totalSigners - Total number of signers (for determining if current is final)\r\n * @returns MultiSignerContext with calculated roles and flags\r\n * \r\n * @example\r\n * ```tsx\r\n * const context = useMultiSignerContext(\r\n * { id: '1', email: 'user@example.com', name: 'John', signOrder: 1, status: 'pending' },\r\n * true,\r\n * 3\r\n * );\r\n * // context.isPrimarySigner === true (signOrder === 1)\r\n * // context.isFinalSigner === false (signOrder !== totalSigners)\r\n * ```\r\n */\r\nexport function useMultiSignerContext(\r\n currentSigner?: Signer,\r\n isMultipleSignature?: boolean,\r\n totalSigners?: number\r\n): MultiSignerContext {\r\n return useMemo(() => {\r\n // Single signer mode (default)\r\n if (!isMultipleSignature || !currentSigner) {\r\n return {\r\n isMultiSigner: false,\r\n currentSigner: null,\r\n currentSignerEmail: '',\r\n isPrimarySigner: false,\r\n isFinalSigner: false,\r\n };\r\n }\r\n \r\n // Multi-signer mode - calculate roles based on signOrder\r\n const isPrimarySigner = currentSigner.signOrder === 1;\r\n \r\n // If totalSigners is provided, check if current signer is the last one\r\n // If not provided, assume current signer is final (safe default)\r\n const isFinalSigner = totalSigners \r\n ? currentSigner.signOrder === totalSigners \r\n : true;\r\n \r\n \r\n return {\r\n isMultiSigner: true,\r\n currentSigner,\r\n currentSignerEmail: currentSigner.email,\r\n isPrimarySigner,\r\n isFinalSigner,\r\n };\r\n }, [currentSigner, isMultipleSignature, totalSigners]);\r\n}\r\n\r\n","import { useState, useEffect, useCallback, useMemo, useRef } from 'react';\r\nimport type { EsignFormField, SubmissionData, DocumentMetadata, AuditTrailMetadata, Signer } from '../types';\r\nimport { PdfViewerStyled } from './PdfViewerStyled';\r\nimport { SignatureModalCore } from './SignatureModal';\r\nimport { SignatureInitialsBox } from './SignatureInitialsBox';\r\nimport { FormFieldRenderer } from './form-fields';\r\nimport { EditableFieldsPanel } from './EditableFieldsPanel';\r\nimport { AttachmentUpload } from './AttachmentUpload';\r\nimport { SigningInstructions } from './SigningInstructions';\r\nimport { PoweredBySigniphi } from './PoweredBySigniphi';\r\nimport { ViewToggleToolbar } from './ViewToggleToolbar';\r\nimport { FormFieldsView, type FormFieldsViewRef } from './FormFieldsView';\r\nimport type { ViewMode } from './ViewToggleToolbar';\r\nimport { usePdfViewer, useFormFields, useSignatures, useFieldFiltering, useAttachments, useMultiSignerContext } from '../hooks';\r\nimport { captureAuditTrail } from '../utils/audit-trail';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../lib/ui/card';\r\nimport { Alert, AlertDescription, AlertTitle } from '../lib/ui/alert';\r\nimport { cn } from '../lib/utils';\r\nimport { AlertCircle, CheckCircle, FileText, Loader2 } from 'lucide-react';\r\nimport { logger, parseAndValidateDate, trackDocumentSignedSilent } from '../utils';\r\n\r\nexport interface SubmissionFormProps {\r\n /** URL of the PDF to load */\r\n pdfUrl: string;\r\n \r\n // Multi-signer support (simplified API)\r\n /** Current signer information (enables multi-signer mode) */\r\n currentSigner?: Signer;\r\n /** Whether this is a multi-signer document */\r\n isMultipleSignature?: boolean;\r\n /** Total number of signers (for determining if current is final) */\r\n totalSigners?: number;\r\n \r\n // Backward compatibility\r\n /** Email of the current signer (for multi-signer filtering) - DEPRECATED: use currentSigner instead */\r\n currentSignerEmail?: string;\r\n \r\n /** Document title to display above the PDF viewer */\r\n documentTitle?: string;\r\n /** HTML string with signing instructions (supports p, ul, li, strong, em, a, br tags) */\r\n signingInstructions?: string;\r\n /** Show \"Powered by signiphi\" branding (default: true) */\r\n showPoweredBy?: boolean;\r\n /** Custom message to display at the top */\r\n customMessage?: string;\r\n /** Callback when form is submitted */\r\n onSubmit: (data: SubmissionData) => Promise<void>;\r\n /** Callback when user cancels */\r\n onCancel?: () => void;\r\n /** Read-only mode (preview only) */\r\n readOnly?: boolean;\r\n /** Custom className for the container */\r\n className?: string;\r\n /** Show PDF viewer (default: true) */\r\n showPdfViewer?: boolean;\r\n /** Custom form fields (if not extracted from PDF) */\r\n customFormFields?: EsignFormField[];\r\n /** Show editable fields panel for debugging/future enhancement (default: false) */\r\n showEditableFields?: boolean;\r\n /** Show full fields sidebar with all form fields (default: false) */\r\n showFullFieldsSidebar?: boolean;\r\n /** Where to place the signature/initials box: 'top', 'bottom', or 'none' (default: 'top') */\r\n signatureBoxPlacement?: 'top' | 'bottom' | 'none';\r\n /** Enable file attachments (default: false) */\r\n enableAttachments?: boolean;\r\n /** Maximum number of attachments (default: 10) */\r\n maxAttachments?: number;\r\n \r\n // Usage tracking (API key integration)\r\n /** API key for automatic usage tracking (enables tracking on submit) */\r\n apiKey?: string;\r\n /** Custom tracking API endpoint (defaults to https://api.signiphi.ai) */\r\n trackingEndpoint?: string;\r\n /** Document ID for tracking correlation */\r\n documentId?: string;\r\n}\r\n\r\nexport function SubmissionForm({\r\n pdfUrl,\r\n currentSigner,\r\n isMultipleSignature,\r\n totalSigners,\r\n currentSignerEmail, // Backward compatibility\r\n documentTitle,\r\n signingInstructions,\r\n showPoweredBy = true,\r\n customMessage,\r\n onSubmit,\r\n onCancel,\r\n readOnly = false,\r\n className = '',\r\n showPdfViewer = true,\r\n customFormFields,\r\n showEditableFields = false,\r\n showFullFieldsSidebar = false,\r\n signatureBoxPlacement = 'top',\r\n enableAttachments = false,\r\n maxAttachments = 10,\r\n apiKey,\r\n trackingEndpoint,\r\n documentId,\r\n}: SubmissionFormProps) {\r\n // Multi-signer context (Phase 1: Calculate context)\r\n const multiSignerContext = useMultiSignerContext(\r\n currentSigner,\r\n isMultipleSignature,\r\n totalSigners\r\n );\r\n\r\n // Effective signer email for backward compatibility\r\n const effectiveSignerEmail = multiSignerContext.currentSignerEmail || currentSignerEmail;\r\n\r\n // PDF viewer state (Phase 2: Pass context to PDF viewer)\r\n const {\r\n viewerRef,\r\n isLoading: isPdfLoading,\r\n error: pdfError,\r\n isLoaded: isPdfLoaded,\r\n loadPdf,\r\n handleLoad: handlePdfLoad,\r\n handleError: handlePdfError,\r\n extractFormFields,\r\n fillPdf,\r\n validatePdf,\r\n getFormFieldValues,\r\n setFormFieldValues,\r\n extractedFields,\r\n } = usePdfViewer(multiSignerContext);\r\n\r\n // Form state\r\n const {\r\n fieldValues,\r\n setFieldValue,\r\n validateFields,\r\n getFieldError,\r\n isFieldTouched,\r\n clearFields,\r\n } = useFormFields();\r\n\r\n // Signature state\r\n const {\r\n signatures,\r\n setSignature,\r\n validateSignatures,\r\n hasSignature,\r\n } = useSignatures();\r\n\r\n // Keep stable references to avoid stale closures in validation/submit\r\n const signaturesRef = useRef(signatures);\r\n const fieldValuesRef = useRef(fieldValues);\r\n\r\n useEffect(() => {\r\n signaturesRef.current = signatures;\r\n }, [signatures]);\r\n\r\n useEffect(() => {\r\n fieldValuesRef.current = fieldValues;\r\n }, [fieldValues]);\r\n\r\n // Field filtering (Phase 3: Pass context to field filtering)\r\n const formFields = customFormFields || extractedFields;\r\n const { filteredFields, isFieldVisible } = useFieldFiltering(formFields, multiSignerContext);\r\n\r\n // Attachments\r\n const {\r\n attachments,\r\n isUploading: isUploadingAttachments,\r\n validationErrors: attachmentErrors,\r\n addFiles,\r\n removeAttachment,\r\n formatSize,\r\n validateAll: validateAttachments,\r\n } = useAttachments({\r\n constraints: {\r\n maxFiles: maxAttachments,\r\n },\r\n onError: (errors) => {\r\n setValidationErrors(prev => [...prev, ...errors]);\r\n },\r\n });\r\n\r\n // Modal state\r\n const [signatureModalOpen, setSignatureModalOpen] = useState(false);\r\n const [currentSignatureField, setCurrentSignatureField] = useState<EsignFormField | null>(\r\n null\r\n );\r\n\r\n // Submission state\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [submitError, setSubmitError] = useState<string | null>(null);\r\n const [validationErrors, setValidationErrors] = useState<string[]>([]);\r\n \r\n // Editable fields panel state\r\n const [editableFieldsCollapsed, setEditableFieldsCollapsed] = useState(true);\r\n \r\n // View mode state (PDF view or Form view)\r\n const [viewMode, setViewMode] = useState<ViewMode>('pdf');\r\n \r\n // Form fields view ref for navigation\r\n const formFieldsViewRef = useRef<FormFieldsViewRef>(null);\r\n\r\n // Load PDF on mount\r\n useEffect(() => {\r\n if (pdfUrl) {\r\n loadPdf(pdfUrl);\r\n }\r\n }, [pdfUrl, loadPdf]);\r\n\r\n // Extract form fields after PDF loads\r\n useEffect(() => {\r\n if (isPdfLoaded && !customFormFields) {\r\n // Only pass signer email in multi-signer mode for proper field assignment filtering\r\n // In single-signer mode, pass undefined so ALL initials fields are included\r\n const signerEmailForExtraction = multiSignerContext.isMultiSigner ? effectiveSignerEmail : undefined;\r\n extractFormFields(signerEmailForExtraction).catch((error) => {\r\n logger.error('Failed to extract form fields:', error);\r\n });\r\n }\r\n }, [isPdfLoaded, effectiveSignerEmail, extractFormFields, customFormFields, multiSignerContext.isMultiSigner]);\r\n\r\n // Track previous view mode to detect view switches\r\n const prevViewModeRef = useRef<ViewMode>(viewMode);\r\n \r\n // Sync field values ONLY when switching between PDF and Form views\r\n useEffect(() => {\r\n const syncFieldsOnViewChange = async () => {\r\n // Only sync if view mode actually changed\r\n if (prevViewModeRef.current === viewMode) {\r\n return;\r\n }\r\n \r\n if (!isPdfLoaded) {\r\n prevViewModeRef.current = viewMode;\r\n return;\r\n }\r\n\r\n try {\r\n // Capture current field values at sync time (avoid stale closure)\r\n const currentFieldValues = fieldValues;\r\n \r\n // Sync FROM PDF TO React when switching to Form view\r\n if (viewMode === 'form') {\r\n const pdfValues = await getFormFieldValues();\r\n const invalidDates: Array<{ fieldId: string; value: string; label?: string }> = [];\r\n \r\n // Merge PDF values into React state\r\n // For each PDF value, update React state if:\r\n // 1. The field exists in filteredFields (multi-signer compatibility)\r\n // 2. The value is different from current React state\r\n // 3. Skip signature/initials fields (stored separately)\r\n for (const field of filteredFields) {\r\n // Skip signature and initials fields - they're stored in signatures state\r\n if (field.type === 'signature' || field.type === 'initials') {\r\n continue;\r\n }\r\n\r\n const pdfValue = pdfValues[field.id];\r\n const currentReactValue = currentFieldValues[field.id];\r\n\r\n // Handle special field types\r\n let normalizedPdfValue = pdfValue;\r\n \r\n // Checkbox normalization: PDF.js may return \"Yes\"/\"No\" or boolean\r\n if (field.type === 'checkbox' && pdfValue !== undefined && pdfValue !== null) {\r\n const pdfValueStr = String(pdfValue);\r\n if (pdfValueStr === 'Yes' || pdfValueStr === 'true') {\r\n normalizedPdfValue = 'true';\r\n } else if (pdfValueStr === 'No' || pdfValueStr === 'false') {\r\n normalizedPdfValue = 'false';\r\n }\r\n }\r\n\r\n // Radio button handling: convert __RADIO_OPTION_INDEX_X__ to actual option value\r\n if (field.type === 'radio' && pdfValue && pdfValue.includes('__RADIO_OPTION_INDEX_')) {\r\n const match = pdfValue.match(/__RADIO_OPTION_INDEX_(\\d+)__/);\r\n if (match && match[1] && field.options) {\r\n const index = parseInt(match[1], 10);\r\n if (index >= 0 && index < field.options.length) {\r\n normalizedPdfValue = field.options[index];\r\n }\r\n }\r\n }\r\n\r\n // Date handling: validate and parse common formats\r\n if (field.type === 'date' && pdfValue) {\r\n const validation = parseAndValidateDate(pdfValue);\r\n if (!validation.isValid) {\r\n // Track invalid date\r\n invalidDates.push({\r\n fieldId: field.id,\r\n value: pdfValue,\r\n label: field.label,\r\n });\r\n // Still pass the value through so user can see what was entered\r\n normalizedPdfValue = pdfValue;\r\n } else if (validation.isoString) {\r\n // Use the parsed ISO string\r\n normalizedPdfValue = validation.isoString;\r\n }\r\n }\r\n\r\n // Text/Dropdown: pass through as-is\r\n\r\n // Update React state if PDF has a value and it's different from React\r\n if (normalizedPdfValue && normalizedPdfValue !== currentReactValue) {\r\n setFieldValue(field.id, normalizedPdfValue);\r\n }\r\n }\r\n\r\n // Show warning if invalid dates were detected\r\n if (invalidDates.length > 0) {\r\n logger.warn('Invalid dates detected during PDF → Form sync:', invalidDates);\r\n const fieldLabels = invalidDates\r\n .map((d) => d.label || d.fieldId)\r\n .join(', ');\r\n setValidationErrors((prev) => [\r\n ...prev,\r\n `${invalidDates.length} date field(s) contain invalid values (${fieldLabels}). Please review and correct them.`,\r\n ]);\r\n }\r\n }\r\n\r\n // Sync FROM React TO PDF when switching to PDF view\r\n if (viewMode === 'pdf') {\r\n const currentPdfValues = await getFormFieldValues();\r\n const valuesToSet: Record<string, string> = {};\r\n\r\n // For each field in filteredFields, push React state to PDF\r\n for (const field of filteredFields) {\r\n // Skip signature and initials fields - they're not in PDF form fields\r\n if (field.type === 'signature' || field.type === 'initials') {\r\n continue;\r\n }\r\n\r\n const reactValue = currentFieldValues[field.id];\r\n const pdfValue = currentPdfValues[field.id];\r\n\r\n // Handle special field types\r\n let valueToSet = reactValue;\r\n\r\n // Checkbox: convert to proper format for PDF.js\r\n if (field.type === 'checkbox' && reactValue) {\r\n // PDF.js expects boolean for checkboxes\r\n valueToSet = reactValue === 'true' ? 'true' : 'false';\r\n }\r\n\r\n // Radio buttons: convert option value to __RADIO_OPTION_INDEX_X__ format\r\n if (field.type === 'radio' && reactValue && field.options) {\r\n const optionIndex = field.options.indexOf(reactValue);\r\n if (optionIndex >= 0) {\r\n valueToSet = `__RADIO_OPTION_INDEX_${optionIndex}__`;\r\n } else {\r\n // If value doesn't match any option, skip this field\r\n logger.warn(`Radio button value \"${reactValue}\" not found in options for field ${field.id}`);\r\n valueToSet = '';\r\n }\r\n }\r\n\r\n // Date: pass through as-is (should be in YYYY-MM-DD format)\r\n // Text/Dropdown: pass through as-is\r\n\r\n // Priority: React state if filled, otherwise keep PDF value\r\n if (valueToSet && valueToSet.trim() !== '') {\r\n valuesToSet[field.id] = valueToSet;\r\n } else if (pdfValue && pdfValue.trim() !== '') {\r\n // Keep PDF value if React is empty\r\n valuesToSet[field.id] = pdfValue;\r\n }\r\n }\r\n\r\n // Set all values in one batch\r\n if (Object.keys(valuesToSet).length > 0) {\r\n await setFormFieldValues(valuesToSet);\r\n }\r\n }\r\n \r\n // Update ref after successful sync\r\n prevViewModeRef.current = viewMode;\r\n } catch (error) {\r\n logger.error('Error syncing field values on view change:', error);\r\n // Still update ref even on error to prevent infinite retries\r\n prevViewModeRef.current = viewMode;\r\n }\r\n };\r\n\r\n syncFieldsOnViewChange();\r\n }, [viewMode, isPdfLoaded, filteredFields, fieldValues, getFormFieldValues, setFormFieldValues, setFieldValue]);\r\n\r\n // Handle field change\r\n const handleFieldChange = useCallback(\r\n (fieldId: string, value: string) => {\r\n setFieldValue(fieldId, value);\r\n \r\n // Clear date validation errors from sidebar when a valid date is entered\r\n const field = filteredFields.find(f => f.id === fieldId);\r\n if (field && field.type === 'date' && value) {\r\n const validation = parseAndValidateDate(value);\r\n if (validation.isValid) {\r\n // Remove any date validation errors mentioning this field\r\n setValidationErrors((prev) => \r\n prev.filter(error => \r\n !error.includes('date field(s) contain invalid values') ||\r\n !(error.includes(field.label || fieldId))\r\n )\r\n );\r\n }\r\n }\r\n },\r\n [setFieldValue, filteredFields]\r\n );\r\n\r\n // Handle signature click\r\n const handleSignatureClick = useCallback((field: EsignFormField) => {\r\n if (readOnly) return;\r\n setCurrentSignatureField(field);\r\n setSignatureModalOpen(true);\r\n }, [readOnly]);\r\n\r\n // Handle signature save\r\n const handleSignatureSave = useCallback(\r\n (dataUrl: string) => {\r\n if (!currentSignatureField) return;\r\n \r\n if (currentSignatureField.type === 'signature' || currentSignatureField.type === 'initials') {\r\n setSignature(currentSignatureField.id, dataUrl);\r\n }\r\n \r\n setCurrentSignatureField(null);\r\n setSignatureModalOpen(false);\r\n },\r\n [currentSignatureField, setSignature]\r\n );\r\n\r\n // Validate all fields\r\n const validateForm = useCallback(async (): Promise<boolean> => {\r\n const validationErrors: string[] = [];\r\n const currentFieldValues = fieldValuesRef.current;\r\n const currentSignatures = signaturesRef.current;\r\n\r\n\r\n // CRITICAL: Extract field values from PDF viewer for validation\r\n // This ensures we validate against actual values typed in the PDF, not just React state\r\n const pdfFieldValues = await getFormFieldValues();\r\n \r\n // Merge: PDF viewer values + React form state\r\n // CRITICAL: For radio buttons, prefer PDF viewer values (properly formatted as __RADIO_OPTION_INDEX_X__)\r\n // For other fields, prefer React state (more up-to-date)\r\n const allFieldValues = { ...pdfFieldValues, ...currentFieldValues };\r\n \r\n // Override: If PDF viewer has a valid radio button value and React has a boolean, use PDF value\r\n for (const [key, pdfValue] of Object.entries(pdfFieldValues)) {\r\n if (key.includes('radio')) {\r\n const reactValue = currentFieldValues[key];\r\n // If React state has a boolean string but PDF has a proper value, use PDF value\r\n if ((reactValue === 'true' || reactValue === 'false') && \r\n pdfValue && \r\n pdfValue !== 'true' && \r\n pdfValue !== 'false') {\r\n allFieldValues[key] = pdfValue;\r\n } else if (!pdfValue && (reactValue === 'true' || reactValue === 'false')) {\r\n }\r\n }\r\n }\r\n \r\n \r\n // Check for any remaining radio button fields with boolean values\r\n for (const [key, value] of Object.entries(allFieldValues)) {\r\n if ((value === 'true' || value === 'false') && key.includes('radio')) {\r\n }\r\n }\r\n\r\n // Validate date fields for proper format\r\n // This prevents submission with invalid dates even when filled only in PDF view\r\n const dateFields = filteredFields.filter(f => f.type === 'date');\r\n for (const field of dateFields) {\r\n const value = allFieldValues[field.id];\r\n if (value && value.trim() !== '') {\r\n const validation = parseAndValidateDate(value);\r\n if (!validation.isValid) {\r\n const fieldLabel = field.label || field.id;\r\n validationErrors.push(\r\n `${fieldLabel}: Invalid date format. Please use MM/DD/YYYY, YYYY-MM-DD, or similar standard format.`\r\n );\r\n }\r\n } else if (field.required) {\r\n // Check if required date field is empty\r\n validationErrors.push(`${field.label || field.id} is required`);\r\n }\r\n }\r\n\r\n // Validate signature fields only (not initials - they're stored as field values)\r\n const signatureFields = filteredFields.filter(f => f.type === 'signature');\r\n const signatureValidation = validateSignatures(signatureFields, currentSignatures);\r\n if (!signatureValidation.isValid) {\r\n validationErrors.push(...signatureValidation.errors);\r\n }\r\n\r\n // Validate initials fields separately as field values\r\n const initialsFields = filteredFields.filter(f => f.type === 'initials');\r\n for (const field of initialsFields) {\r\n if (field.required) {\r\n const value = allFieldValues[field.id]; // Use merged values\r\n if (!value || value.trim() === '') {\r\n validationErrors.push(`${field.label} is required`);\r\n }\r\n }\r\n }\r\n\r\n // Validate other form fields\r\n const isFieldsValid = validateFields(currentSignatures);\r\n if (!isFieldsValid) {\r\n // Collect error messages from individual fields (excluding initials, already checked)\r\n for (const field of filteredFields) {\r\n if (field.type === 'initials') continue; // Skip initials, already validated above\r\n const error = getFieldError(field.id);\r\n if (error) {\r\n validationErrors.push(error);\r\n }\r\n }\r\n }\r\n\r\n // NOTE: We do NOT validate against requiredFieldsMap here because:\r\n // 1. filteredFields already contains only fields visible to current signer\r\n // 2. Each field in filteredFields has the correct 'required' property from the PDF\r\n // 3. In multi-signer mode, requiredFieldsMap would include OTHER signers' required fields\r\n // 4. The validation above (signatures, initials, and form fields) covers all visible fields\r\n\r\n // Validate against PDF (if available) - this is a safety check\r\n // Pass filteredFields to only validate fields visible to current signer\r\n // CRITICAL: Pass allFieldValues (includes PDF viewer values) not just fieldValues\r\n try {\r\n const pdfValidation = await validatePdf(allFieldValues, currentSignatures, filteredFields);\r\n if (!pdfValidation.isValid) {\r\n validationErrors.push(...pdfValidation.errors);\r\n }\r\n } catch (error) {\r\n logger.error('PDF validation error:', error);\r\n }\r\n\r\n setValidationErrors(validationErrors);\r\n return validationErrors.length === 0;\r\n }, [\r\n filteredFields,\r\n validateFields,\r\n validateSignatures,\r\n validatePdf,\r\n getFieldError,\r\n getFormFieldValues,\r\n ]);\r\n\r\n // Handle submit\r\n const handleSubmit = useCallback(async () => {\r\n if (readOnly) return;\r\n\r\n try {\r\n setIsSubmitting(true);\r\n setSubmitError(null);\r\n setValidationErrors([]);\r\n\r\n // Validate form\r\n const isValid = await validateForm();\r\n if (!isValid) {\r\n setIsSubmitting(false);\r\n return;\r\n }\r\n\r\n // CRITICAL: Extract field values from PDF.js viewer before flattening\r\n // This captures values entered directly in the PDF viewer\r\n const pdfFieldValues = await getFormFieldValues();\r\n const currentFieldValues = fieldValuesRef.current;\r\n const currentSignatures = signaturesRef.current;\r\n \r\n // Merge PDF.js values with React form values (React values take priority)\r\n // This ensures we use both:\r\n // - Values entered directly in PDF viewer (pdfFieldValues)\r\n // - Values from React form state (fieldValues - signatures, initials)\r\n const finalFieldValues = { ...pdfFieldValues, ...currentFieldValues };\r\n \r\n // CRITICAL FIX: For radio buttons, prefer PDF viewer values (properly formatted as __RADIO_OPTION_INDEX_X__)\r\n // React state stores boolean strings which pdf-lib can't interpret\r\n for (const [key, pdfValue] of Object.entries(pdfFieldValues)) {\r\n if (key.includes('radio')) {\r\n const reactValue = currentFieldValues[key];\r\n // If React state has a boolean string but PDF has a proper value, use PDF value\r\n if ((reactValue === 'true' || reactValue === 'false') && \r\n pdfValue && \r\n pdfValue !== 'true' && \r\n pdfValue !== 'false') {\r\n finalFieldValues[key] = pdfValue;\r\n }\r\n }\r\n }\r\n\r\n // Validate attachments if enabled\r\n if (enableAttachments) {\r\n const attachmentValidation = validateAttachments();\r\n if (!attachmentValidation.isValid) {\r\n setValidationErrors(attachmentValidation.errors);\r\n setIsSubmitting(false);\r\n return;\r\n }\r\n }\r\n\r\n // Capture audit trail data for compliance and forensics\r\n const auditTrail: AuditTrailMetadata = await captureAuditTrail();\r\n\r\n // Build document metadata\r\n const metadata: DocumentMetadata = {\r\n signerEmail: effectiveSignerEmail,\r\n signerInitials: finalFieldValues['initials_field_main'],\r\n createdAt: new Date(),\r\n };\r\n\r\n // Fill PDF with merged values and signatures\r\n const filledPdfBytes = await fillPdf(\r\n finalFieldValues, \r\n currentSignatures, \r\n effectiveSignerEmail,\r\n metadata,\r\n auditTrail\r\n );\r\n\r\n // Call user-provided onSubmit\r\n await onSubmit({\r\n pdfBytes: filledPdfBytes,\r\n formFieldValues: finalFieldValues,\r\n signatures: currentSignatures,\r\n attachments: enableAttachments ? attachments : undefined,\r\n auditTrail,\r\n metadata,\r\n });\r\n\r\n // Auto-track signing if API key is provided (non-blocking)\r\n if (apiKey && effectiveSignerEmail) {\r\n trackDocumentSignedSilent(\r\n { apiKey, endpoint: trackingEndpoint },\r\n { \r\n signerEmail: effectiveSignerEmail, \r\n documentId,\r\n metadata: {\r\n documentTitle,\r\n signedAt: new Date().toISOString(),\r\n },\r\n }\r\n );\r\n }\r\n\r\n // Success - clear form\r\n clearFields();\r\n setValidationErrors([]);\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Submission failed';\r\n setSubmitError(errorMessage);\r\n logger.error('Submission error:', error);\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n }, [\r\n readOnly,\r\n validateForm,\r\n fillPdf,\r\n getFormFieldValues,\r\n currentSignerEmail,\r\n onSubmit,\r\n clearFields,\r\n enableAttachments,\r\n validateAttachments,\r\n attachments,\r\n apiKey,\r\n trackingEndpoint,\r\n documentId,\r\n documentTitle,\r\n effectiveSignerEmail,\r\n ]);\r\n\r\n // Check if form is complete\r\n const isFormComplete = useMemo(() => {\r\n if (filteredFields.length === 0) return false;\r\n\r\n // When showFullFieldsSidebar is false, only check signature/initials fields\r\n // Other fields will be filled directly in the PDF viewer\r\n if (!showFullFieldsSidebar) {\r\n // Only check signature_field_main and initials_field_main\r\n const signatureField = filteredFields.find(f => f.id === 'signature_field_main');\r\n const initialsField = filteredFields.find(f => f.id === 'initials_field_main');\r\n\r\n // Check signature (stored as signature data)\r\n if (signatureField?.required && !hasSignature('signature_field_main')) {\r\n return false;\r\n }\r\n\r\n // Check initials (stored as field value, not signature)\r\n if (initialsField?.required) {\r\n const initialsValue = fieldValues['initials_field_main'];\r\n if (!initialsValue || initialsValue.trim() === '') {\r\n return false;\r\n }\r\n }\r\n\r\n // All required fields (signature/initials) are filled\r\n return true;\r\n }\r\n\r\n // When showFullFieldsSidebar is true, check all required fields in the sidebar\r\n for (const field of filteredFields) {\r\n if (!field.required) continue;\r\n\r\n // Skip signature/initials main fields - they're in the box\r\n if (field.id === 'signature_field_main' || field.id === 'initials_field_main') {\r\n if (!hasSignature(field.id)) return false;\r\n continue;\r\n }\r\n\r\n if (field.type === 'signature' || field.type === 'initials') {\r\n if (!hasSignature(field.id)) return false;\r\n } else {\r\n const value = fieldValues[field.id];\r\n if (!value || value.trim() === '') return false;\r\n }\r\n }\r\n\r\n return true;\r\n }, [filteredFields, fieldValues, hasSignature, showFullFieldsSidebar]);\r\n\r\n return (\r\n <div className={cn('flex flex-col gap-4 md:gap-6 h-full overflow-auto px-2 md:px-0', className)}>\r\n {/* Document Title - Above everything */}\r\n {documentTitle && (\r\n <Card className=\"flex-shrink-0 border-0 shadow-none\">\r\n <CardHeader className=\"space-y-2 p-0 pb-3 md:pb-4\">\r\n <div className=\"flex flex-col sm:flex-row items-start justify-between gap-3 sm:gap-4\">\r\n <CardTitle className=\"text-2xl sm:text-3xl md:text-4xl font-bold text-primary tracking-tight flex-1\">\r\n {documentTitle}\r\n </CardTitle>\r\n {showPoweredBy && (\r\n <div className=\"flex-shrink-0\">\r\n <PoweredBySigniphi />\r\n </div>\r\n )}\r\n </div>\r\n </CardHeader>\r\n </Card>\r\n )}\r\n\r\n {/* Main Content: PDF Viewer + Form Sidebar */}\r\n <div className=\"flex flex-col lg:flex-row gap-4\">\r\n {/* PDF Viewer Column - Takes remaining space, naturally extends */}\r\n {showPdfViewer && (\r\n <div className=\"flex-1 flex flex-col bg-muted/30 rounded-lg overflow-hidden relative min-w-0 border-2\">\r\n {/* View Toggle Toolbar */}\r\n <ViewToggleToolbar\r\n currentView={viewMode}\r\n onViewChange={setViewMode}\r\n viewerRef={viewerRef}\r\n formFieldsViewRef={formFieldsViewRef}\r\n />\r\n\r\n {/* Loading Overlay */}\r\n {isPdfLoading && (\r\n <div className=\"absolute inset-x-0 top-[48px] sm:top-[52px] bottom-0 flex items-center justify-center bg-background z-10\">\r\n <div className=\"text-center\">\r\n <Loader2 className=\"h-12 w-12 animate-spin text-primary mx-auto mb-4\" />\r\n <p className=\"text-muted-foreground\">Loading PDF...</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Error Overlay */}\r\n {pdfError && (\r\n <div className=\"absolute inset-x-0 top-[48px] sm:top-[52px] bottom-0 flex items-center justify-center bg-background z-10 p-4\">\r\n <Alert variant=\"destructive\" className=\"max-w-md\">\r\n <AlertCircle className=\"h-4 w-4\" />\r\n <AlertTitle>Error Loading PDF</AlertTitle>\r\n <AlertDescription>{pdfError}</AlertDescription>\r\n </Alert>\r\n </div>\r\n )}\r\n\r\n {/* PDF Viewer - Always mounted, hidden when not active */}\r\n <div \r\n className={cn(\r\n \"w-full min-h-[400px] sm:min-h-[500px] md:min-h-[600px] lg:min-h-[800px]\",\r\n viewMode === 'form' && 'hidden'\r\n )}\r\n >\r\n <PdfViewerStyled\r\n ref={viewerRef}\r\n onLoad={handlePdfLoad}\r\n onError={handlePdfError}\r\n className=\"w-full h-full\"\r\n />\r\n </div>\r\n\r\n {/* Form Fields View - Always mounted, hidden when not active */}\r\n <div className={cn(viewMode === 'pdf' && 'hidden')}>\r\n <FormFieldsView\r\n ref={formFieldsViewRef}\r\n fields={filteredFields}\r\n fieldValues={fieldValues}\r\n onFieldChange={handleFieldChange}\r\n onSignatureClick={handleSignatureClick}\r\n hasSignature={hasSignature}\r\n getFieldError={getFieldError}\r\n isFieldTouched={isFieldTouched}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Form Column - Responsive width, adapts to screen size */}\r\n <Card className=\"w-full lg:w-96 flex-shrink-0 flex flex-col border-card border-2 border-primary/25 bg-card max-h-none lg:max-h-[800px] rounded-xl h-fit overflow-y-auto\">\r\n {/* Header - Fixed */}\r\n <CardHeader className=\"flex-shrink-0 pb-4 md:pb-6 pt-5 md:pt-7 px-4 md:px-6\">\r\n <CardTitle className=\"text-xl md:text-2xl font-bold flex items-center gap-2 md:gap-3 mb-2\">\r\n <div className=\"p-1.5 md:p-2 bg-primary/10 rounded-lg\">\r\n <FileText className=\"h-5 w-5 md:h-6 md:w-6 text-primary\" />\r\n </div>\r\n Sign Document\r\n </CardTitle>\r\n <CardDescription className=\"text-muted-foreground text-sm md:text-base leading-relaxed text-primary\">\r\n {customMessage || 'Complete the fields in the PDF and sign below'}\r\n </CardDescription>\r\n {signingInstructions && (\r\n <div className=\"mt-2 md:mt-3 text-xs md:text-sm leading-relaxed text-muted-foreground\">\r\n <SigningInstructions html={signingInstructions} />\r\n </div>\r\n )}\r\n </CardHeader>\r\n\r\n {/* Content Area - Scrollable when content exceeds available height */}\r\n <CardContent className=\"space-y-4 md:space-y-6 px-4 md:px-6\">\r\n {/* Validation Errors */}\r\n {validationErrors.length > 0 && (\r\n <Alert variant=\"destructive\">\r\n <AlertCircle className=\"h-4 w-4\" />\r\n <AlertTitle className=\"text-sm md:text-base\">Please fix the following errors:</AlertTitle>\r\n <AlertDescription>\r\n <ul className=\"list-disc list-inside space-y-1 mt-2 text-xs md:text-sm\">\r\n {validationErrors.map((error, index) => (\r\n <li key={index}>{error}</li>\r\n ))}\r\n </ul>\r\n </AlertDescription>\r\n </Alert>\r\n )}\r\n\r\n {/* Submit Error */}\r\n {submitError && (\r\n <Alert variant=\"destructive\">\r\n <AlertCircle className=\"h-4 w-4\" />\r\n <AlertDescription className=\"text-xs md:text-sm\">{submitError}</AlertDescription>\r\n </Alert>\r\n )}\r\n\r\n {/* Signature/Initials Box (Top Placement) */}\r\n {signatureBoxPlacement === 'top' && (\r\n <div className=\"mb-4 md:mb-6\">\r\n <SignatureInitialsBox\r\n onSignatureClick={() => {\r\n const signatureField = filteredFields.find(f => f.id === 'signature_field_main');\r\n if (signatureField) {\r\n handleSignatureClick(signatureField);\r\n }\r\n }}\r\n onInitialsChange={(value) => {\r\n const initialsField = filteredFields.find(f => f.id === 'initials_field_main');\r\n if (initialsField) {\r\n handleFieldChange(initialsField.id, value);\r\n }\r\n }}\r\n signatureData={signatures['signature_field_main']}\r\n initialsValue={fieldValues['initials_field_main'] || ''}\r\n signatureRequired={filteredFields.find(f => f.id === 'signature_field_main')?.required}\r\n initialsRequired={filteredFields.find(f => f.id === 'initials_field_main')?.required}\r\n showInitials={!!filteredFields.find(f => f.id === 'initials_field_main')}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Form Fields */}\r\n <div className=\"space-y-3 md:space-y-4\">\r\n {filteredFields.length === 0 && isPdfLoaded && (\r\n <div className=\"text-center text-muted-foreground py-6 md:py-8\">\r\n <p className=\"text-sm md:text-base\">No form fields found in this document.</p>\r\n </div>\r\n )}\r\n\r\n {filteredFields.map((field) => {\r\n if (!isFieldVisible(field)) return null;\r\n\r\n // Hide signature/initials main fields - they're always in the SignatureInitialsBox\r\n if (field.id === 'signature_field_main' || field.id === 'initials_field_main') {\r\n return null;\r\n }\r\n\r\n // Hide all other fields unless showFullFieldsSidebar is enabled\r\n if (!showFullFieldsSidebar) {\r\n return null;\r\n }\r\n\r\n const value = fieldValues[field.id] || '';\r\n const hasFieldSignature = hasSignature(field.id);\r\n const error = getFieldError(field.id);\r\n const isTouched = isFieldTouched(field.id);\r\n\r\n return (\r\n <div key={field.id} className=\"space-y-1\">\r\n <FormFieldRenderer\r\n field={field}\r\n value={value}\r\n hasSignature={hasFieldSignature}\r\n error={isTouched ? error : undefined}\r\n onChange={(newValue) => handleFieldChange(field.id, newValue)}\r\n onSignatureClick={() => handleSignatureClick(field)}\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Signature/Initials Box (Bottom Placement) */}\r\n {signatureBoxPlacement === 'bottom' && (\r\n <div className=\"mt-4 md:mt-6\">\r\n <SignatureInitialsBox\r\n onSignatureClick={() => {\r\n const signatureField = filteredFields.find(f => f.id === 'signature_field_main');\r\n if (signatureField) {\r\n handleSignatureClick(signatureField);\r\n }\r\n }}\r\n onInitialsChange={(value) => {\r\n const initialsField = filteredFields.find(f => f.id === 'initials_field_main');\r\n if (initialsField) {\r\n handleFieldChange(initialsField.id, value);\r\n }\r\n }}\r\n signatureData={signatures['signature_field_main']}\r\n initialsValue={fieldValues['initials_field_main'] || ''}\r\n signatureRequired={filteredFields.find(f => f.id === 'signature_field_main')?.required}\r\n initialsRequired={filteredFields.find(f => f.id === 'initials_field_main')?.required}\r\n showInitials={!!filteredFields.find(f => f.id === 'initials_field_main')}\r\n />\r\n </div>\r\n )}\r\n \r\n {/* Editable Fields Panel (Optional) */}\r\n {showEditableFields && formFields.length > 0 && (\r\n <div className=\"mt-4 md:mt-6\">\r\n <EditableFieldsPanel\r\n fields={formFields}\r\n fieldValues={fieldValues}\r\n collapsed={editableFieldsCollapsed}\r\n onCollapseChange={setEditableFieldsCollapsed}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Attachments (Optional) */}\r\n {enableAttachments && (\r\n <div className=\"mt-4 md:mt-6\">\r\n <AttachmentUpload\r\n attachments={attachments}\r\n onAdd={addFiles}\r\n onRemove={removeAttachment}\r\n isUploading={isUploadingAttachments}\r\n disabled={readOnly || isSubmitting}\r\n maxFiles={maxAttachments}\r\n formatSize={formatSize}\r\n />\r\n {attachmentErrors.length > 0 && (\r\n <div className=\"mt-2 p-2 md:p-3 bg-destructive/10 border border-destructive/30 rounded-lg\">\r\n <ul className=\"list-disc list-inside text-xs md:text-sm text-destructive space-y-1\">\r\n {attachmentErrors.map((error, index) => (\r\n <li key={index}>{error}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </CardContent>\r\n\r\n {/* Action Buttons - Fixed Footer */}\r\n {!readOnly && (\r\n <div className=\"flex-shrink-0 p-4 md:p-6 border-t bg-gradient-to-b from-background to-muted/20\">\r\n <div className=\"flex flex-col sm:flex-row gap-2 md:gap-3\">\r\n {onCancel && (\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={onCancel}\r\n disabled={isSubmitting}\r\n className=\"flex-1 h-11 md:h-12 font-medium hover:bg-muted transition-colors text-sm md:text-base\"\r\n >\r\n Cancel\r\n </Button>\r\n )}\r\n <Button\r\n type=\"button\"\r\n onClick={handleSubmit}\r\n disabled={isSubmitting || !isFormComplete}\r\n className=\"flex-1 h-11 md:h-12 font-semibold bg-primary hover:bg-primary/90 text-primary-foreground shadow-lg hover:shadow-xl transition-all duration-200 text-sm md:text-base\"\r\n >\r\n {isSubmitting ? (\r\n <>\r\n <Loader2 className=\"mr-2 h-4 w-4 md:h-5 md:w-5 animate-spin\" />\r\n Submitting...\r\n </>\r\n ) : (\r\n <>\r\n <CheckCircle className=\"mr-2 h-4 w-4 md:h-5 md:w-5\" />\r\n Submit Document\r\n </>\r\n )}\r\n </Button>\r\n </div>\r\n\r\n {/* Form Status */}\r\n <div className=\"mt-4 md:mt-5 text-center\">\r\n {isFormComplete ? (\r\n <div className=\"inline-flex items-center gap-2 px-3 md:px-4 py-1.5 md:py-2 bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-400 rounded-full text-xs md:text-sm font-medium\">\r\n <CheckCircle className=\"h-3 w-3 md:h-4 md:w-4\" />\r\n Ready to submit\r\n </div>\r\n ) : (\r\n <p className=\"text-xs md:text-sm text-muted-foreground\">\r\n Complete all required fields to submit\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </Card>\r\n </div>\r\n\r\n {/* Signature Modal */}\r\n {signatureModalOpen && currentSignatureField && (\r\n <SignatureModalCore\r\n isOpen={signatureModalOpen}\r\n onClose={() => {\r\n setSignatureModalOpen(false);\r\n setCurrentSignatureField(null);\r\n }}\r\n onSave={handleSignatureSave}\r\n fieldType={currentSignatureField.type}\r\n fieldLabel={currentSignatureField.label || 'Add Signature'}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n","/**\r\n * Error Boundary Component\r\n * Catches React errors and displays user-friendly fallback UI\r\n * Uses react-error-boundary library for better error handling\r\n */\r\n\r\nimport React from 'react';\r\nimport { ErrorBoundary as ReactErrorBoundary, FallbackProps } from 'react-error-boundary';\r\nimport { logger } from '../utils/logger';\r\nimport {\r\n isPdfValidationError,\r\n isPdfProcessingError,\r\n isFormFieldError,\r\n getErrorMessage,\r\n} from '../utils/errors';\r\n\r\n/**\r\n * Error information passed to error handlers\r\n */\r\nexport interface ErrorInfo {\r\n componentStack?: string | null;\r\n}\r\n\r\n/**\r\n * Error fallback component with user-friendly messages\r\n */\r\nfunction ErrorFallback({ error, resetErrorBoundary }: FallbackProps) {\r\n // Determine user-friendly error message based on error type\r\n let userMessage = 'An unexpected error occurred';\r\n let technicalMessage = getErrorMessage(error, 'Unknown error');\r\n \r\n if (isPdfValidationError(error)) {\r\n userMessage = 'Invalid PDF file';\r\n } else if (isPdfProcessingError(error)) {\r\n userMessage = 'Failed to process PDF';\r\n } else if (isFormFieldError(error)) {\r\n userMessage = 'Form field error';\r\n }\r\n\r\n return (\r\n <div\r\n role=\"alert\"\r\n style={{\r\n padding: '20px',\r\n border: '1px solid #ef4444',\r\n borderRadius: '8px',\r\n backgroundColor: '#fef2f2',\r\n color: '#991b1b',\r\n maxWidth: '600px',\r\n margin: '20px auto',\r\n }}\r\n >\r\n <h2 style={{ margin: '0 0 12px 0', fontSize: '18px', fontWeight: 600 }}>\r\n {userMessage}\r\n </h2>\r\n <p style={{ margin: '0 0 16px 0', color: '#7f1d1d', fontSize: '14px' }}>\r\n {technicalMessage}\r\n </p>\r\n <button\r\n onClick={resetErrorBoundary}\r\n style={{\r\n padding: '8px 16px',\r\n backgroundColor: '#dc2626',\r\n color: 'white',\r\n border: 'none',\r\n borderRadius: '4px',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n fontWeight: 500,\r\n }}\r\n onMouseOver={(e) => {\r\n e.currentTarget.style.backgroundColor = '#b91c1c';\r\n }}\r\n onMouseOut={(e) => {\r\n e.currentTarget.style.backgroundColor = '#dc2626';\r\n }}\r\n >\r\n Try Again\r\n </button>\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Error handler that logs errors\r\n */\r\nfunction errorHandler(error: Error, info: ErrorInfo) {\r\n // Log the error with component stack trace\r\n logger.error('React Error Boundary caught an error:', {\r\n error,\r\n componentStack: info.componentStack,\r\n });\r\n}\r\n\r\n/**\r\n * Props for ErrorBoundary component\r\n */\r\nexport interface ErrorBoundaryProps {\r\n /** Child components to wrap */\r\n children: React.ReactNode;\r\n /** Custom fallback component (optional) */\r\n FallbackComponent?: React.ComponentType<FallbackProps>;\r\n /** Callback when error boundary catches an error (optional) */\r\n onError?: (error: Error, info: ErrorInfo) => void;\r\n /** Callback when error boundary is reset (optional) */\r\n onReset?: () => void;\r\n}\r\n\r\n/**\r\n * ErrorBoundary component that wraps children and catches React errors\r\n * \r\n * @example Basic usage\r\n * ```tsx\r\n * <ErrorBoundary>\r\n * <PdfViewerStyled pdfUrl={url} />\r\n * </ErrorBoundary>\r\n * ```\r\n * \r\n * @example With custom error handler\r\n * ```tsx\r\n * import { ErrorInfo } from 'react-error-boundary';\r\n * \r\n * <ErrorBoundary\r\n * onError={(error: Error, info: ErrorInfo) => {\r\n * // Send to error tracking service\r\n * trackError(error, info);\r\n * }}\r\n * >\r\n * <PdfViewerStyled pdfUrl={url} />\r\n * </ErrorBoundary>\r\n * ```\r\n * \r\n * @example With custom fallback\r\n * ```tsx\r\n * <ErrorBoundary\r\n * FallbackComponent={({ error, resetErrorBoundary }) => (\r\n * <div>\r\n * <h1>Custom Error UI</h1>\r\n * <p>{error.message}</p>\r\n * <button onClick={resetErrorBoundary}>Reset</button>\r\n * </div>\r\n * )}\r\n * >\r\n * <PdfViewerStyled pdfUrl={url} />\r\n * </ErrorBoundary>\r\n * ```\r\n */\r\nexport function ErrorBoundary({\r\n children,\r\n FallbackComponent = ErrorFallback,\r\n onError = errorHandler,\r\n onReset,\r\n}: ErrorBoundaryProps) {\r\n return (\r\n <ReactErrorBoundary\r\n FallbackComponent={FallbackComponent}\r\n onError={onError}\r\n onReset={onReset}\r\n >\r\n {children}\r\n </ReactErrorBoundary>\r\n );\r\n}\r\n\r\n// ErrorInfo type is exported above\r\n\r\n"]}
|