@signiphi/pdf-signer 0.2.0-beta.2 → 0.2.0-beta.21
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/assets/viewer.html +1 -5
- package/dist/components/index.js +2746 -901
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +2513 -669
- package/dist/components/index.mjs.map +1 -1
- package/dist/core/index.js +420 -20
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +420 -20
- package/dist/core/index.mjs.map +1 -1
- package/dist/hooks/index.js +506 -211
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +507 -212
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/index.css +214 -191
- package/dist/index.css.map +1 -1
- package/dist/index.js +3019 -893
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2762 -653
- package/dist/index.mjs.map +1 -1
- package/dist/styles/index.css +202 -172
- package/dist/types/index.js.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/dist/utils/index.js +792 -147
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +777 -148
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +2 -2
- package/scripts/copy-utils.js +14 -3
- package/src/styles/index.css +33 -3
- package/dist/__tests__/helpers/fixtures.d.ts +0 -43
- package/dist/__tests__/helpers/fixtures.d.ts.map +0 -1
- package/dist/__tests__/helpers/mocks.d.ts +0 -333
- package/dist/__tests__/helpers/mocks.d.ts.map +0 -1
- package/dist/__tests__/setup.d.ts +0 -6
- package/dist/__tests__/setup.d.ts.map +0 -1
- package/dist/components/AcknowledgementModal.d.ts +0 -21
- package/dist/components/AcknowledgementModal.d.ts.map +0 -1
- package/dist/components/AcknowledgementsSidebar.d.ts +0 -22
- package/dist/components/AcknowledgementsSidebar.d.ts.map +0 -1
- package/dist/components/AttachmentUpload.d.ts +0 -17
- package/dist/components/AttachmentUpload.d.ts.map +0 -1
- package/dist/components/EditableFieldsPanel.d.ts +0 -30
- package/dist/components/EditableFieldsPanel.d.ts.map +0 -1
- package/dist/components/ErrorBoundary.d.ts +0 -67
- package/dist/components/ErrorBoundary.d.ts.map +0 -1
- package/dist/components/FormFieldsView.d.ts +0 -46
- package/dist/components/FormFieldsView.d.ts.map +0 -1
- package/dist/components/InitialsModal.d.ts +0 -16
- package/dist/components/InitialsModal.d.ts.map +0 -1
- package/dist/components/PdfViewerStyled.d.ts +0 -16
- package/dist/components/PdfViewerStyled.d.ts.map +0 -1
- package/dist/components/PoweredBySigniphi.d.ts +0 -11
- package/dist/components/PoweredBySigniphi.d.ts.map +0 -1
- package/dist/components/RequiredFieldNavigation.d.ts +0 -18
- package/dist/components/RequiredFieldNavigation.d.ts.map +0 -1
- package/dist/components/SignatureCanvas.d.ts +0 -12
- package/dist/components/SignatureCanvas.d.ts.map +0 -1
- package/dist/components/SignatureInitialsBox.d.ts +0 -25
- package/dist/components/SignatureInitialsBox.d.ts.map +0 -1
- package/dist/components/SignatureModal.d.ts +0 -21
- package/dist/components/SignatureModal.d.ts.map +0 -1
- package/dist/components/SigningInstructions.d.ts +0 -12
- package/dist/components/SigningInstructions.d.ts.map +0 -1
- package/dist/components/SubmissionForm.d.ts +0 -52
- package/dist/components/SubmissionForm.d.ts.map +0 -1
- package/dist/components/UnacknowledgedFieldsModal.d.ts +0 -23
- package/dist/components/UnacknowledgedFieldsModal.d.ts.map +0 -1
- package/dist/components/ViewToggleToolbar.d.ts +0 -38
- package/dist/components/ViewToggleToolbar.d.ts.map +0 -1
- package/dist/components/form-fields/CheckboxRenderer.d.ts +0 -10
- package/dist/components/form-fields/CheckboxRenderer.d.ts.map +0 -1
- package/dist/components/form-fields/DateFieldRenderer.d.ts +0 -14
- package/dist/components/form-fields/DateFieldRenderer.d.ts.map +0 -1
- package/dist/components/form-fields/DropdownRenderer.d.ts +0 -14
- package/dist/components/form-fields/DropdownRenderer.d.ts.map +0 -1
- package/dist/components/form-fields/FormFieldRenderer.d.ts +0 -22
- package/dist/components/form-fields/FormFieldRenderer.d.ts.map +0 -1
- package/dist/components/form-fields/InitialsFieldRenderer.d.ts +0 -16
- package/dist/components/form-fields/InitialsFieldRenderer.d.ts.map +0 -1
- package/dist/components/form-fields/RadioGroupRenderer.d.ts +0 -10
- package/dist/components/form-fields/RadioGroupRenderer.d.ts.map +0 -1
- package/dist/components/form-fields/SignatureFieldRenderer.d.ts +0 -16
- package/dist/components/form-fields/SignatureFieldRenderer.d.ts.map +0 -1
- package/dist/components/form-fields/TextFieldRenderer.d.ts +0 -14
- package/dist/components/form-fields/TextFieldRenderer.d.ts.map +0 -1
- package/dist/components/form-fields/TextLabelRenderer.d.ts +0 -14
- package/dist/components/form-fields/TextLabelRenderer.d.ts.map +0 -1
- package/dist/components/form-fields/index.d.ts +0 -14
- package/dist/components/form-fields/index.d.ts.map +0 -1
- package/dist/components/index.d.ts +0 -17
- package/dist/components/index.d.ts.map +0 -1
- package/dist/core/PdfViewerCore.d.ts +0 -19
- package/dist/core/PdfViewerCore.d.ts.map +0 -1
- package/dist/core/SignatureCaptureCore.d.ts +0 -37
- package/dist/core/SignatureCaptureCore.d.ts.map +0 -1
- package/dist/core/index.d.ts +0 -3
- package/dist/core/index.d.ts.map +0 -1
- package/dist/hooks/index.d.ts +0 -9
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/useAcknowledgements.d.ts +0 -50
- package/dist/hooks/useAcknowledgements.d.ts.map +0 -1
- package/dist/hooks/useAttachments.d.ts +0 -25
- package/dist/hooks/useAttachments.d.ts.map +0 -1
- package/dist/hooks/useFieldFiltering.d.ts +0 -29
- package/dist/hooks/useFieldFiltering.d.ts.map +0 -1
- package/dist/hooks/useFormFields.d.ts +0 -23
- package/dist/hooks/useFormFields.d.ts.map +0 -1
- package/dist/hooks/useMultiSignerContext.d.ts +0 -25
- package/dist/hooks/useMultiSignerContext.d.ts.map +0 -1
- package/dist/hooks/usePdfViewer.d.ts +0 -52
- package/dist/hooks/usePdfViewer.d.ts.map +0 -1
- package/dist/hooks/useRequiredFieldNavigation.d.ts +0 -16
- package/dist/hooks/useRequiredFieldNavigation.d.ts.map +0 -1
- package/dist/hooks/useSignatureCapture.d.ts +0 -17
- package/dist/hooks/useSignatureCapture.d.ts.map +0 -1
- package/dist/hooks/useSignatures.d.ts +0 -29
- package/dist/hooks/useSignatures.d.ts.map +0 -1
- package/dist/index.d.ts +0 -17
- package/dist/index.d.ts.map +0 -1
- package/dist/integrations/index.d.ts +0 -6
- package/dist/integrations/index.d.ts.map +0 -1
- package/dist/integrations/next-config.d.ts +0 -46
- package/dist/integrations/next-config.d.ts.map +0 -1
- package/dist/integrations/vite-plugin.d.ts +0 -48
- package/dist/integrations/vite-plugin.d.ts.map +0 -1
- package/dist/lib/index.d.ts +0 -3
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/ui/accordion.d.ts +0 -8
- package/dist/lib/ui/accordion.d.ts.map +0 -1
- package/dist/lib/ui/alert.d.ts +0 -9
- package/dist/lib/ui/alert.d.ts.map +0 -1
- package/dist/lib/ui/button.d.ts +0 -12
- package/dist/lib/ui/button.d.ts.map +0 -1
- package/dist/lib/ui/calendar.d.ts +0 -10
- package/dist/lib/ui/calendar.d.ts.map +0 -1
- package/dist/lib/ui/card.d.ts +0 -9
- package/dist/lib/ui/card.d.ts.map +0 -1
- package/dist/lib/ui/checkbox.d.ts +0 -5
- package/dist/lib/ui/checkbox.d.ts.map +0 -1
- package/dist/lib/ui/dialog.d.ts +0 -20
- package/dist/lib/ui/dialog.d.ts.map +0 -1
- package/dist/lib/ui/index.d.ts +0 -13
- package/dist/lib/ui/index.d.ts.map +0 -1
- package/dist/lib/ui/input.d.ts +0 -6
- package/dist/lib/ui/input.d.ts.map +0 -1
- package/dist/lib/ui/label.d.ts +0 -6
- package/dist/lib/ui/label.d.ts.map +0 -1
- package/dist/lib/ui/popover.d.ts +0 -7
- package/dist/lib/ui/popover.d.ts.map +0 -1
- package/dist/lib/ui/radio-group.d.ts +0 -6
- package/dist/lib/ui/radio-group.d.ts.map +0 -1
- package/dist/lib/ui/select.d.ts +0 -14
- package/dist/lib/ui/select.d.ts.map +0 -1
- package/dist/lib/utils.d.ts +0 -7
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -278
- package/dist/types/index.d.ts.map +0 -1
- package/dist/utils/attachment-validators.d.ts +0 -118
- package/dist/utils/attachment-validators.d.ts.map +0 -1
- package/dist/utils/audit-trail.d.ts +0 -27
- package/dist/utils/audit-trail.d.ts.map +0 -1
- package/dist/utils/date-validation.d.ts +0 -30
- package/dist/utils/date-validation.d.ts.map +0 -1
- package/dist/utils/errors.d.ts +0 -106
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/field-extraction.d.ts +0 -36
- package/dist/utils/field-extraction.d.ts.map +0 -1
- package/dist/utils/field-visibility.d.ts +0 -104
- package/dist/utils/field-visibility.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -18
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/logger.d.ts +0 -16
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/pdf-field-type-helpers.d.ts +0 -78
- package/dist/utils/pdf-field-type-helpers.d.ts.map +0 -1
- package/dist/utils/pdf-helpers.d.ts +0 -38
- package/dist/utils/pdf-helpers.d.ts.map +0 -1
- package/dist/utils/pdf-lib-loader.d.ts +0 -45
- package/dist/utils/pdf-lib-loader.d.ts.map +0 -1
- package/dist/utils/pdf-manipulation.d.ts +0 -93
- package/dist/utils/pdf-manipulation.d.ts.map +0 -1
- package/dist/utils/pdf-metadata.d.ts +0 -41
- package/dist/utils/pdf-metadata.d.ts.map +0 -1
- package/dist/utils/pdf-validators.d.ts +0 -149
- package/dist/utils/pdf-validators.d.ts.map +0 -1
- package/dist/utils/pdf-viewer-filter.d.ts +0 -35
- package/dist/utils/pdf-viewer-filter.d.ts.map +0 -1
- package/dist/utils/pdf-widget-helpers.d.ts +0 -98
- package/dist/utils/pdf-widget-helpers.d.ts.map +0 -1
- package/dist/utils/pdfjs-config.d.ts +0 -56
- package/dist/utils/pdfjs-config.d.ts.map +0 -1
- package/dist/utils/pdfjs-version-check.d.ts +0 -28
- package/dist/utils/pdfjs-version-check.d.ts.map +0 -1
- package/dist/utils/performance-monitor.d.ts +0 -172
- package/dist/utils/performance-monitor.d.ts.map +0 -1
- package/dist/utils/tracking.d.ts +0 -89
- package/dist/utils/tracking.d.ts.map +0 -1
|
@@ -1 +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-metadata.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/components/InitialsModal.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/RequiredFieldNavigation.tsx","../../src/components/ViewToggleToolbar.tsx","../../src/lib/ui/alert.tsx","../../src/components/FormFieldsView.tsx","../../src/components/AcknowledgementModal.tsx","../../src/components/UnacknowledgedFieldsModal.tsx","../../src/components/AcknowledgementsSidebar.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/hooks/useAcknowledgements.ts","../../src/hooks/useRequiredFieldNavigation.ts","../../src/components/SubmissionForm.tsx","../../src/components/ErrorBoundary.tsx"],"names":["pdfjsLib2","PDFName","isValidDate","forwardRef","useRef","useState","useEffect","useCallback","useImperativeHandle","jsx","Fragment","React","jsxs","React2","React4","cva","React5","React7","React9","CalendarIcon","React10","Check","React11","CheckCircle","ImageIcon","FileText","FileIcon","X","ChevronLeft","ChevronRight","React12","AlertCircle","CheckCircle2","ChevronDown","Clock","PDFDocument","rgb","value","validateSignatures","useMemo","indicatorType","allowedFieldIds","isAcknowledged","formFields","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 * PDF Metadata Utilities\r\n * Functions for storing and retrieving Signiphi metadata in PDF documents\r\n */\r\n\r\nimport type { PDFDocument, PDFName as PDFNameType, PDFString as PDFStringType } from 'pdf-lib';\r\nimport { Acknowledgement } from '../types';\r\n\r\n// Module-level variables for pdf-lib classes (loaded dynamically)\r\nlet PDFName: typeof PDFNameType;\r\nlet PDFString: typeof PDFStringType;\r\n\r\n/**\r\n * Initialize PDF classes from dynamically loaded pdf-lib module\r\n * Must be called before using getSigniphiMetadata or setSigniphiMetadata\r\n */\r\nexport function initPdfMetadata(pdfLibModule: any): void {\r\n PDFName = pdfLibModule.PDFName;\r\n PDFString = pdfLibModule.PDFString;\r\n}\r\n\r\n/**\r\n * Metadata for a single form field\r\n */\r\nexport interface FieldMetadata {\r\n fieldId?: string; // Immutable UUID for reliable field identification\r\n label?: string;\r\n signer?: string;\r\n placeholder?: string;\r\n acknowledgements?: Acknowledgement[];\r\n}\r\n\r\n/**\r\n * Complete metadata structure stored in PDF\r\n */\r\nexport interface SigniphiMetadata {\r\n version: string;\r\n fields: Record<string, FieldMetadata>; // Key is the clean field name\r\n}\r\n\r\n/**\r\n * Stores Signiphi metadata in the PDF's document information dictionary\r\n * @param pdfDoc - The PDF document to store metadata in\r\n * @param metadata - The metadata object to store\r\n */\r\nexport function setSigniphiMetadata(pdfDoc: PDFDocument, metadata: SigniphiMetadata): void {\r\n try {\r\n if (!PDFName || !PDFString) {\r\n console.error('PDF metadata classes not initialized. Call initPdfMetadata first.');\r\n return;\r\n }\r\n \r\n const infoRef = pdfDoc.context.trailerInfo.Info;\r\n const infoObj = pdfDoc.context.lookup(infoRef);\r\n if (!infoObj || typeof (infoObj as any).set !== 'function') {\r\n throw new Error('Info object is not a PDFDict or does not have set method');\r\n }\r\n const infoDict = infoObj as any;\r\n const metadataString = JSON.stringify(metadata);\r\n \r\n // Set the metadata\r\n infoDict.set(PDFName.of('SigniphiMetadata'), PDFString.of(metadataString));\r\n } catch (error) {\r\n console.error('Failed to set Signiphi metadata:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves Signiphi metadata from the PDF's document information dictionary\r\n * @param pdfDoc - The PDF document to read metadata from\r\n * @returns The metadata object if found, null otherwise\r\n */\r\nexport function getSigniphiMetadata(pdfDoc: PDFDocument): SigniphiMetadata | null {\r\n try {\r\n if (!PDFName || !PDFString) {\r\n console.error('PDF metadata classes not initialized. Call initPdfMetadata first.');\r\n return null;\r\n }\r\n \r\n const infoRef = pdfDoc.context.trailerInfo.Info;\r\n const infoObj = pdfDoc.context.lookup(infoRef);\r\n \r\n if (!infoObj || typeof (infoObj as any).get !== 'function' || !(infoObj as any).dict) {\r\n return null;\r\n }\r\n \r\n const infoDict = infoObj as any;\r\n const metadataObj = infoDict.get(PDFName.of('SigniphiMetadata'));\r\n \r\n if (!metadataObj) {\r\n return null;\r\n }\r\n \r\n // PDFString objects are encoded as \"(content)\" in their toString() representation\r\n const metadataStr = metadataObj.toString();\r\n \r\n // Extract content from PDF string format: (content) or <hex>\r\n let jsonStr = metadataStr;\r\n const parenMatch = metadataStr.match(/^\\((.*)\\)$/);\r\n if (parenMatch && parenMatch[1]) {\r\n jsonStr = parenMatch[1];\r\n } else {\r\n const hexMatch = metadataStr.match(/^<(.*)>$/);\r\n if (hexMatch && hexMatch[1]) {\r\n // Convert hex to string if needed\r\n jsonStr = hexMatch[1];\r\n }\r\n }\r\n \r\n const metadata = JSON.parse(jsonStr);\r\n return metadata;\r\n } catch (error) {\r\n console.error('Failed to load Signiphi metadata:', error);\r\n return null;\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 \r\n // CRITICAL: Set NeedAppearances to false to tell PDF viewers to use the appearance streams we generated\r\n // This is essential for Chrome's PDF viewer which strictly requires appearance dictionaries\r\n const PDFName = pdfLib.PDFName;\r\n const acroForm = pdfDoc.catalog.lookup(PDFName.of('AcroForm'));\r\n if (acroForm && typeof acroForm === 'object' && 'set' in acroForm) {\r\n (acroForm as any).set(PDFName.of('NeedAppearances'), false);\r\n }\r\n } catch (appearanceError) {\r\n // Some PDFs may not support this operation - fail gracefully\r\n logger.warn('Could not update field appearances:', appearanceError);\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 console.log('[FLATTEN] === APPLYING INITIALS ===');\r\n console.log('[FLATTEN] formFieldValues keys:', Object.keys(formFieldValues));\r\n console.log('[FLATTEN] Initials fields in formFieldValues:', Object.keys(formFieldValues).filter(k => k.toLowerCase().includes('initials')));\r\n const mainInitialsData = formFieldValues['initials_field_main'];\r\n console.log('[FLATTEN] mainInitialsData from initials_field_main:', mainInitialsData ? mainInitialsData.substring(0, 50) : '(MISSING)');\r\n if (mainInitialsData && mainInitialsData.trim()) {\r\n \r\n console.log('[FLATTEN] fieldPageMap keys:', Object.keys(fieldPageMap));\r\n console.log('[FLATTEN] Looking for initials fields in fieldPageMap...');\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 console.log('[FLATTEN] After pattern matching in fieldPageMap:', foundInitialsFields);\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 // 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 }\r\n\r\n console.log('[FLATTEN] Found', foundInitialsFields.length, 'initials fields to flatten:', foundInitialsFields);\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 console.log('[FLATTEN] Processing initials field:', fieldName);\r\n const pageNumber = fieldPageMap[fieldName];\r\n console.log('[FLATTEN] Page number:', pageNumber);\r\n if (pageNumber && pageNumber <= pages.length) {\r\n const page = pages[pageNumber - 1];\r\n if (!page) {\r\n console.log('[FLATTEN] ❌ Page not found');\r\n continue;\r\n }\r\n\r\n const fieldPosition = fieldPositionMap[fieldName];\r\n console.log('[FLATTEN] Field position:', fieldPosition);\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 console.log('[FLATTEN] ✅ Drawing initials at:', { x: finalX, y: finalY, fontSize, text: mainInitialsData });\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 } else {\r\n console.log('[FLATTEN] ❌ Field position not found in position map');\r\n }\r\n } else {\r\n console.log('[FLATTEN] ❌ Invalid page number or page out of bounds');\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 const radioGroup = field as any;\r\n \r\n // Get field info for labels and options (need this before determining selectedIndex)\r\n const fieldInfo = extractedFormFields?.find(f => f.name === fieldName);\r\n \r\n // Get the ACTUAL selected value from the PDF field (after it was set)\r\n let actualSelectedValue = '';\r\n try {\r\n actualSelectedValue = radioGroup.getSelected?.() || '';\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: radioGroup.getSelected() returned: \"${actualSelectedValue}\"`);\r\n } catch (e) {\r\n // Fallback to user entered value if we can't read the field\r\n actualSelectedValue = userEnteredValue ? String(userEnteredValue) : '';\r\n logger.warn(`[FLATTEN RADIO] Field ${fieldName}: could not read selected value, using userEnteredValue: \"${actualSelectedValue}\"`);\r\n }\r\n \r\n // Determine selected index\r\n let selectedIndex = -1;\r\n \r\n // Get all options from the radio group\r\n const radioOptions = radioGroup.getOptions?.() || [];\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: radioGroup.getOptions() returned ${radioOptions.length} options:`, radioOptions);\r\n \r\n // If we have an actual selected value from the field, find its index\r\n if (actualSelectedValue && radioOptions.length > 0) {\r\n selectedIndex = radioOptions.findIndex((opt: string) => opt === actualSelectedValue);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: found actualSelectedValue \"${actualSelectedValue}\" at index ${selectedIndex}`);\r\n }\r\n \r\n // Fallback: try to parse from user entered value if we didn't find it above\r\n if (selectedIndex === -1 && userEnteredValue) {\r\n const selectedValue = String(userEnteredValue);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: selectedIndex still -1, trying to parse from userEnteredValue: \"${selectedValue}\"`);\r\n \r\n // Handle __RADIO_OPTION_INDEX_ pattern directly\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 selectedIndex = parseInt(indexMatch[1], 10);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: extracted index ${selectedIndex} from __RADIO_OPTION_INDEX_ pattern`);\r\n }\r\n } \r\n // Handle numeric string (just an index)\r\n else if (/^\\d+$/.test(selectedValue)) {\r\n selectedIndex = parseInt(selectedValue, 10);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: parsed numeric index ${selectedIndex}`);\r\n }\r\n // Match against actual option values from field info\r\n else if (fieldInfo?.options && selectedValue) {\r\n selectedIndex = fieldInfo.options.findIndex(option => option === selectedValue);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: matched \"${selectedValue}\" in fieldInfo.options at index ${selectedIndex}`);\r\n }\r\n // Match against radio group options\r\n else if (radioOptions.length > 0) {\r\n selectedIndex = radioOptions.findIndex((opt: string) => opt === selectedValue);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: matched \"${selectedValue}\" in radioOptions at index ${selectedIndex}`);\r\n }\r\n }\r\n \r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: FINAL selectedIndex = ${selectedIndex}, will draw filled circle at this index`);\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\nimport { getSigniphiMetadata, initPdfMetadata, type FieldMetadata } from './pdf-metadata';\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 \r\n // Initialize pdf-metadata module with PDFName and PDFString\r\n initPdfMetadata(pdfLibModule);\r\n \r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n \r\n // Load metadata from PDF document information dictionary\r\n const metadata = getSigniphiMetadata(pdfDoc);\r\n \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 // Extract the clean field name (without suffixes) for metadata lookup\r\n const cleanFieldNameForMetadata = fieldName.replace(/_signature$|_initials$|_date$/i, '');\r\n\r\n // Get field metadata from PDF metadata or fall back to parsing field name (for old PDFs)\r\n // CRITICAL: Try both the suffixed name and the clean name for metadata lookup\r\n const fieldMetadata: FieldMetadata = metadata?.fields[fieldName]\r\n || metadata?.fields[cleanFieldNameForMetadata]\r\n || (() => {\r\n // Backward compatibility: decode from field name if no metadata exists\r\n const decoded = decodeFieldName(fieldName);\r\n return {\r\n label: decoded.displayLabel,\r\n signer: decoded.assignedSignerEmail,\r\n placeholder: decoded.fieldPlaceholder,\r\n acknowledgements: decoded.acknowledgements\r\n };\r\n })();\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 // Extract the clean field name (without suffixes for type detection)\r\n const cleanFieldName = fieldName.replace(/_signature$|_initials$|_date$/i, '');\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 (cleanFieldName.toLowerCase().includes('signature') && \r\n !fieldTypeName.includes('CheckBox') && \r\n !fieldTypeName.includes('Radio'));\r\n const isActualInitialsField = cleanFieldName.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 && fieldMetadata.signer === currentSignerEmail) {\r\n hasInitialsFieldsForCurrentSigner = true;\r\n }\r\n } else if (cleanFieldName.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 metadata label, then fallback\r\n let displayLabel = fieldMetadata.label || '';\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 label from metadata (already set above from fieldMetadata.label)\r\n \r\n // PRIORITY 3: Generate fallback label from field name\r\n if (!displayLabel || !displayLabel.trim()) {\r\n displayLabel = generateFallbackLabel(cleanFieldName, 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 fieldId: fieldMetadata.fieldId || fieldName, // Use fieldId from metadata, fallback to fieldName for backward compatibility\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: fieldMetadata.placeholder || '', // Use metadata placeholder\r\n assignedSignerEmail: fieldMetadata.signer, // Add assigned signer from metadata\r\n acknowledgements: fieldMetadata.acknowledgements, // Add acknowledgements from metadata\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 fieldId: 'signature_field_main', // Fixed ID for main signature field\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 fieldId: 'initials_field_main', // Fixed ID for main initials field\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\n * @deprecated This function is deprecated and kept only for backward compatibility with old PDFs.\r\n * New PDFs store metadata in the PDF's document information dictionary instead of encoding it in field names.\r\n * Use getSigniphiMetadata() for new PDFs.\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 acknowledgements?: Array<{id: string; title: string; description: 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 let acknowledgements: Array<{id: string; title: string; description: string}> | undefined = undefined;\r\n \r\n // Extract acknowledgements if present (must be last)\r\n if (fieldName.includes('__ACK__')) {\r\n const ackMarkerIndex = fieldName.indexOf('__ACK__');\r\n const beforeAck = fieldName.substring(0, ackMarkerIndex);\r\n const ackEncoded = fieldName.substring(ackMarkerIndex + 7); // Skip \"__ACK__\"\r\n \r\n try {\r\n // Decode base64 and parse JSON\r\n const ackData = atob(ackEncoded);\r\n acknowledgements = JSON.parse(ackData);\r\n } catch (e) {\r\n console.warn('Failed to decode acknowledgements:', e);\r\n }\r\n \r\n // Continue processing the rest of the field name\r\n fieldName = beforeAck;\r\n decodedFieldName = fieldName;\r\n }\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 acknowledgements\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';\nimport type { PdfViewerRef, PDFViewerApplication } from '../types';\nimport { getPdfJsConfig, initializePdfJs } from '../utils/pdfjs-config';\nimport { checkPdfJsVersion } from '../utils/pdfjs-version-check';\nimport { logger } from '../utils';\n\n/**\n * Props for the headless PDF viewer core component\n */\nexport interface PdfViewerCoreProps {\n onLoad?: () => void;\n onError?: (error: string) => void;\n pdfjsBasePath?: string; // Override default PDF.js path (defaults to CDN)\n children: (props: {\n iframeRef: React.RefObject<HTMLIFrameElement>;\n handleIframeLoad: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless PDF viewer core component\n * Provides PDF loading and form field extraction logic without any UI\n */\nexport const PdfViewerCore = forwardRef<PdfViewerRef, PdfViewerCoreProps>(\n ({ onLoad, onError, pdfjsBasePath, children }, ref) => {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const loadedPdfUrl = useRef<string | null>(null);\n const initializationPromise = useRef<Promise<void> | null>(null);\n const isLoadingRef = useRef<boolean>(false);\n const [versionChecked, setVersionChecked] = useState(false);\n const [setupError, setSetupError] = useState<string | null>(null);\n\n const getPDFViewerApplication = useCallback((): PDFViewerApplication | null => {\n try {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n return null;\n }\n\n const PDFViewerApplication = (\n iframe.contentWindow as Window & { PDFViewerApplication: PDFViewerApplication }\n ).PDFViewerApplication;\n if (!PDFViewerApplication) {\n return null;\n }\n\n return PDFViewerApplication;\n } catch (error) {\n logger.error('Error accessing PDFViewerApplication:', error);\n return null;\n }\n }, []);\n\n const waitForInitialization = useCallback(async () => {\n const PDFViewerApplication = getPDFViewerApplication();\n if (!PDFViewerApplication) {\n throw new Error('PDFViewerApplication not available');\n }\n\n // Wait for the viewer to be initialized\n if (PDFViewerApplication.initializedPromise) {\n await PDFViewerApplication.initializedPromise;\n }\n\n // Wait for the document to be loaded\n if (PDFViewerApplication.pdfLoadingTask) {\n await PDFViewerApplication.pdfLoadingTask.promise;\n }\n\n return PDFViewerApplication;\n }, [getPDFViewerApplication]);\n\n const loadPdf = useCallback(\n async (pdfUrl: string) => {\n const iframe = iframeRef.current;\n if (!iframe) {\n logger.error('PDF viewer iframe not available');\n return;\n }\n\n // Prevent loading the same PDF multiple times or loading while already loading\n if (isLoadingRef.current || loadedPdfUrl.current === pdfUrl) {\n return;\n }\n\n isLoadingRef.current = true;\n loadedPdfUrl.current = pdfUrl;\n\n try {\n // Initialize PDF.js configuration (lazy, only runs once)\n // This ensures the worker is configured before any PDF operations\n initializePdfJs();\n \n // Fetch the PDF data first to avoid CORS issues\n const response = await fetch(pdfUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch PDF: ${response.status}`);\n }\n\n const pdfBytes = await response.arrayBuffer();\n\n // Create a blob URL for the PDF data\n const blob = new Blob([pdfBytes], { type: 'application/pdf' });\n const blobUrl = URL.createObjectURL(blob);\n\n // Get PDF.js base path (use prop override or global config)\n const config = getPdfJsConfig();\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\n\n // Load the PDF.js viewer with the blob URL\n const viewerUrl = `${basePath}/web/viewer.html?file=${encodeURIComponent(blobUrl)}`;\n iframe.src = viewerUrl;\n\n // Create a new initialization promise\n initializationPromise.current = new Promise((resolve, reject) => {\n const checkInitialization = () => {\n try {\n const PDFViewerApplication = getPDFViewerApplication();\n if (PDFViewerApplication && PDFViewerApplication.initializedPromise) {\n PDFViewerApplication.initializedPromise.then(() => {\n resolve();\n }).catch(reject);\n } else {\n // Retry after a short delay\n setTimeout(checkInitialization, 100);\n }\n } catch (error) {\n reject(error);\n }\n };\n\n // Start checking after iframe loads\n setTimeout(checkInitialization, 500);\n });\n } catch (error) {\n logger.error('Error fetching PDF:', error);\n isLoadingRef.current = false;\n onError?.(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n [getPDFViewerApplication, onError, pdfjsBasePath]\n );\n\n const getFormFieldValues = useCallback(async (): Promise<Record<string, string>> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n\n if (!PDFViewerApplication.pdfDocument) {\n return {};\n }\n\n const pdfDocument = PDFViewerApplication.pdfDocument;\n const values: Record<string, string> = {};\n\n // Use the PDF.js API to extract form field values\n if (pdfDocument.annotationStorage) {\n const annotationStorage = pdfDocument.annotationStorage;\n\n // Get field objects to understand form structure\n let fieldObjects: Record<string, unknown[]> = {};\n try {\n if (pdfDocument.getFieldObjects) {\n const result = await pdfDocument.getFieldObjects();\n fieldObjects = result || {};\n }\n } catch (error) {\n logger.warn('Error getting field objects:', error);\n }\n\n // Create mapping from field IDs to names and store field info with widgets\n type PDFField = {\n id?: string;\n type?: string;\n value?: unknown;\n exportValue?: string;\n buttonValue?: string;\n defaultValue?: unknown;\n name?: string;\n };\n \n type RadioButtonData = {\n id: string;\n data: unknown;\n widget?: PDFField;\n };\n\n const idToNameMap: Record<string, string> = {};\n const fieldInfo: Record<string, { type: string; widgets: PDFField[] }> = {};\n \n for (const [name, fields] of Object.entries(fieldObjects)) {\n const fieldArray = fields as PDFField[];\n \n // Store field type and ALL widgets (critical for radio buttons)\n fieldInfo[name] = {\n type: fieldArray[0]?.type || '',\n widgets: fieldArray\n };\n \n // Create ID to name mapping\n for (const field of fieldArray) {\n if (field.id) {\n idToNameMap[field.id] = name;\n }\n }\n }\n\n // Get annotation storage data\n let storedData: Record<string, unknown> = {};\n if (annotationStorage.serializable && annotationStorage.serializable.map) {\n const storageMap = annotationStorage.serializable.map;\n for (const [key, value] of storageMap.entries()) {\n storedData[key] = value;\n }\n } else if (typeof annotationStorage.getAll === 'function') {\n storedData = annotationStorage.getAll();\n }\n\n // Group radio button widgets by field name (Dockmaster approach)\n const radioGroups: Record<string, RadioButtonData[]> = {};\n \n // First pass: identify and group radio buttons from annotationStorage\n for (const [id, data] of Object.entries(storedData)) {\n const fieldName = idToNameMap[id];\n if (!fieldName) continue;\n \n const fieldType = fieldInfo[fieldName]?.type;\n \n // Check if this is a radio button field\n const isRadioButton = fieldType && (\n fieldType.toLowerCase().includes('radio') ||\n fieldType.toLowerCase().includes('radiobutton') ||\n fieldType === 'radiobutton'\n );\n \n // Fallback detection: if multiple widgets share the same field name, it's likely a radio group\n const widgetCount = fieldInfo[fieldName]?.widgets?.length || 0;\n const isLikelyRadioGroup = widgetCount > 1 && fieldName.toLowerCase().includes('radio');\n \n if (fieldName && (isRadioButton || isLikelyRadioGroup)) {\n if (!radioGroups[fieldName]) {\n radioGroups[fieldName] = [];\n }\n \n // Find the corresponding widget from fieldInfo\n const widget = fieldInfo[fieldName]?.widgets?.find((w: PDFField) => w.id === id);\n \n radioGroups[fieldName].push({ id, data, widget });\n logger.info(`[RADIO DETECT] Added widget ${id} to group ${fieldName}, data:`, data);\n }\n }\n \n logger.info(`[RADIO DETECT] Found ${Object.keys(radioGroups).length} radio groups:`, Object.keys(radioGroups));\n\n // Process radio groups to find selected options\n for (const [fieldName, radioButtons] of Object.entries(radioGroups)) {\n \n // Find the selected radio button (the one with value: true)\n const selectedRadio = radioButtons.find(rb => \n rb.data && typeof rb.data === 'object' && \n (rb.data as { value?: boolean }).value === true\n );\n \n if (selectedRadio) {\n // Sort radio buttons by their ID to get consistent ordering\n const sortedRadioButtons = [...radioButtons].sort((a, b) => {\n const aNum = parseInt(a.id.replace(/\\D/g, ''), 10) || 0;\n const bNum = parseInt(b.id.replace(/\\D/g, ''), 10) || 0;\n return aNum - bNum;\n });\n \n // Find the position of the selected widget\n const selectedIndex = sortedRadioButtons.findIndex(rb => rb.id === selectedRadio.id);\n \n // Store the widget position for later mapping to actual option values\n if (selectedIndex >= 0) {\n const exportValue = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\n values[fieldName] = exportValue;\n logger.info(`[RADIO] Field ${fieldName}: selected index ${selectedIndex}, stored as ${exportValue}`);\n } else {\n values[fieldName] = 'true';\n logger.warn(`[RADIO] Field ${fieldName}: could not determine index, defaulting to 'true'`);\n }\n } else {\n logger.info(`[RADIO] Field ${fieldName}: no selection found in ${radioButtons.length} widgets`);\n }\n }\n\n // Extract values for non-radio fields from stored data\n for (const [id, data] of Object.entries(storedData)) {\n const fieldName = idToNameMap[id];\n \n // Skip if already processed as radio button\n if (fieldName && values[fieldName]) {\n continue;\n }\n \n if (fieldName) {\n let extractedValue: string | undefined;\n\n if (data && typeof data === 'object') {\n const dataObj = data as Record<string, unknown>;\n if ('value' in dataObj) {\n extractedValue = String(dataObj.value);\n } else if ('formValue' in dataObj) {\n extractedValue = String(dataObj.formValue);\n } else if ('textContent' in dataObj) {\n extractedValue = String(dataObj.textContent);\n }\n } else if (data !== undefined && data !== null) {\n extractedValue = String(data);\n }\n\n if (extractedValue !== undefined && extractedValue !== '') {\n values[fieldName] = extractedValue;\n }\n }\n }\n\n // Get default values for fields not in storage\n for (const [name, fields] of Object.entries(fieldObjects)) {\n if (!values[name]) {\n const fieldArray = fields as PDFField[];\n const field = fieldArray[0];\n \n if (field && field.value !== undefined && field.value !== null) {\n const fieldValue = String(field.value);\n const fieldType = fieldInfo[name]?.type;\n \n // For radio buttons, convert to index pattern using fieldInfo widgets\n const isRadioButton = fieldType && (\n fieldType.toLowerCase().includes('radio') ||\n fieldType === 'radiobutton'\n );\n \n if (isRadioButton && fieldValue !== 'true' && fieldValue !== 'false') {\n // Use widgets from fieldInfo (not field.items which may be missing after filtering)\n const widgets = fieldInfo[name]?.widgets || [];\n \n if (widgets.length > 0) {\n // Sort widgets by ID to get consistent ordering\n const sortedWidgets = [...widgets].sort((a, b) => {\n const aNum = parseInt((a.id || '').replace(/\\D/g, ''), 10) || 0;\n const bNum = parseInt((b.id || '').replace(/\\D/g, ''), 10) || 0;\n return aNum - bNum;\n });\n \n // Find which widget matches the default value\n const selectedIndex = sortedWidgets.findIndex(widget => \n widget.exportValue === fieldValue || widget.buttonValue === fieldValue\n );\n \n if (selectedIndex >= 0) {\n values[name] = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\n } else {\n }\n }\n } else {\n // Non-radio fields: use the value as-is\n values[name] = fieldValue;\n }\n }\n }\n }\n }\n\n return values;\n } catch (error) {\n logger.error('Error extracting form field values:', error);\n return {};\n }\n }, [waitForInitialization]);\n\n const setFormFieldValues = useCallback(async (values: Record<string, string>): Promise<void> => {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n logger.warn('Cannot set field values: iframe not available');\n return;\n }\n\n try {\n // Wait for PDF.js to be ready\n await waitForInitialization();\n\n // Small delay to ensure fields are rendered in the DOM\n await new Promise(resolve => setTimeout(resolve, 200));\n\n const iframeDoc = iframe.contentWindow.document;\n \n // Set values for each field by accessing DOM directly\n for (const [fieldName, value] of Object.entries(values)) {\n try {\n // Try to decode the field name (PDF.js might use decoded names in DOM)\n // Extract the base name before __LABEL__, __SIGNER__, or __PLACEHOLDER__\n let decodedFieldName = fieldName;\n if (fieldName.includes('__LABEL__')) {\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__LABEL__'));\n } else if (fieldName.includes('__SIGNER__')) {\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__SIGNER__'));\n } else if (fieldName.includes('__PLACEHOLDER__')) {\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__PLACEHOLDER__'));\n }\n \n // Try multiple selectors to find the field\n // PDF.js might use either the encoded or decoded name\n let elements = iframeDoc.querySelectorAll(\n `[data-element-id=\"${fieldName}\"], [name=\"${fieldName}\"], [data-element-id=\"${decodedFieldName}\"], [name=\"${decodedFieldName}\"]`\n );\n \n if (elements.length === 0) {\n logger.warn(`Field element not found for: ${fieldName}`);\n continue;\n }\n \n // Handle radio buttons (multiple elements with same name)\n const firstElement = elements[0] as any;\n const isRadioGroup = elements.length > 1 && \n (firstElement.tagName || '').toLowerCase() === 'input' && \n (firstElement.type || '') === 'radio';\n \n if (isRadioGroup) {\n // Radio button group\n if (value.includes('__RADIO_OPTION_INDEX_')) {\n const match = value.match(/__RADIO_OPTION_INDEX_(\\d+)__/);\n if (match && match[1]) {\n const selectedIndex = parseInt(match[1], 10);\n if (selectedIndex < elements.length) {\n // First, uncheck all radio buttons in the group\n for (let i = 0; i < elements.length; i++) {\n const radioEl = elements[i] as any;\n if (radioEl.checked) {\n radioEl.checked = false;\n }\n }\n \n // Then check the selected one\n const radioElement = elements[selectedIndex] as any;\n radioElement.checked = true;\n \n // Dispatch events to notify PDF.js\n radioElement.dispatchEvent(new Event('change', { bubbles: true }));\n radioElement.dispatchEvent(new Event('input', { bubbles: true }));\n radioElement.dispatchEvent(new Event('click', { bubbles: true }));\n } else {\n logger.warn(`Radio button index ${selectedIndex} out of range for ${fieldName}`);\n }\n }\n }\n } else {\n // Single element (text, checkbox, dropdown, date, etc.)\n const element = elements[0] as any; // Use any to access properties from iframe context\n const tagName = (element.tagName || '').toLowerCase();\n \n // Check tagName instead of instanceof (iframe has different constructor context)\n if (tagName === 'input') {\n const inputType = element.type || 'text';\n if (inputType === 'checkbox') {\n const boolValue = value === 'true' || value === 'Yes' || value === 'On';\n element.checked = boolValue;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('click', { bubbles: true }));\n } else if (inputType === 'radio') {\n // Single radio button\n element.checked = value === 'true' || value === element.value;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('click', { bubbles: true }));\n } else {\n // Text, date, etc.\n element.value = value;\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n } else if (tagName === 'select') {\n // Dropdown\n element.value = value;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n element.dispatchEvent(new Event('input', { bubbles: true }));\n } else if (tagName === 'textarea') {\n // Textarea\n element.value = value;\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n } else {\n logger.warn(`Unknown element type for field ${fieldName}: ${tagName}`);\n }\n }\n } catch (fieldError) {\n logger.error(`Error setting value for field ${fieldName}:`, fieldError);\n }\n }\n\n } catch (error) {\n logger.error('Error setting form field values:', error);\n }\n }, [waitForInitialization]);\n\n const getAllFieldNames = useCallback(async (): Promise<string[]> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n\n if (!PDFViewerApplication.pdfDocument) {\n return [];\n }\n\n const pdfDocument = PDFViewerApplication.pdfDocument;\n\n let fieldObjects: Record<string, unknown[]> = {};\n try {\n if (pdfDocument.getFieldObjects) {\n const result = await pdfDocument.getFieldObjects();\n fieldObjects = result || {};\n }\n } catch (error) {\n return [];\n }\n\n return Object.keys(fieldObjects);\n } catch (error) {\n logger.error('Error getting all field names:', error);\n return [];\n }\n }, [waitForInitialization]);\n\n const saveDocument = useCallback(async (): Promise<Uint8Array | null> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n\n if (!PDFViewerApplication.pdfDocument) {\n return null;\n }\n\n const pdfDocument = PDFViewerApplication.pdfDocument;\n\n if (typeof pdfDocument.saveDocument === 'function') {\n const savedBytes = await pdfDocument.saveDocument();\n return new Uint8Array(savedBytes);\n } else if (pdfDocument.getData) {\n const originalData = await pdfDocument.getData();\n return new Uint8Array(originalData);\n }\n\n return null;\n } catch (error) {\n logger.error('Error saving PDF document:', error);\n return null;\n }\n }, [waitForInitialization]);\n\n const injectPlaceholders = useCallback((fields: Array<{ id: string; name: string; placeholder?: string }>) => {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n return;\n }\n\n // Wait for PDF.js to render the form fields\n setTimeout(() => {\n try {\n const iframeDoc = iframe.contentWindow!.document;\n \n // Create a map of field names to placeholders for O(1) lookup\n const placeholderMap = new Map<string, string>();\n fields.forEach(field => {\n if (field.placeholder) {\n placeholderMap.set(field.name, field.placeholder);\n placeholderMap.set(field.id, field.placeholder);\n }\n });\n\n // Query all input fields in the iframe\n const inputs = iframeDoc.querySelectorAll('input[data-element-id], input[name]');\n \n \n inputs.forEach((input) => {\n const htmlInput = input as HTMLInputElement;\n const fieldId = htmlInput.getAttribute('data-element-id') || htmlInput.name;\n \n if (fieldId) {\n const placeholder = placeholderMap.get(fieldId);\n if (placeholder) {\n htmlInput.placeholder = placeholder;\n }\n }\n });\n } catch (error) {\n logger.error('Error injecting placeholders:', error);\n }\n }, 1000); // Wait 1 second for PDF.js to render\n }, []);\n\n const zoomIn = useCallback(async () => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.increaseScale === 'function') {\n PDFViewerApplication.pdfViewer.increaseScale();\n }\n } catch (error) {\n logger.error('Error zooming in:', error);\n }\n }, [waitForInitialization]);\n\n const zoomOut = useCallback(async () => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.decreaseScale === 'function') {\n PDFViewerApplication.pdfViewer.decreaseScale();\n }\n } catch (error) {\n logger.error('Error zooming out:', error);\n }\n }, [waitForInitialization]);\n\n const nextPage = useCallback(async () => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.nextPage === 'function') {\n PDFViewerApplication.pdfViewer.nextPage();\n }\n } catch (error) {\n logger.error('Error going to next page:', error);\n }\n }, [waitForInitialization]);\n\n const previousPage = useCallback(async () => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.previousPage === 'function') {\n PDFViewerApplication.pdfViewer.previousPage();\n }\n } catch (error) {\n logger.error('Error going to previous page:', error);\n }\n }, [waitForInitialization]);\n\n const getCurrentPage = useCallback(async (): Promise<number | null> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.currentPageNumber === 'number') {\n return PDFViewerApplication.pdfViewer.currentPageNumber;\n }\n return null;\n } catch (error) {\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\n // Only log if it's an unexpected error\n const errorMsg = error instanceof Error ? error.message : String(error);\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\n logger.error('Error getting current page:', error);\n }\n return null;\n }\n }, [waitForInitialization]);\n\n const getTotalPages = useCallback(async (): Promise<number | null> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.pagesCount === 'number') {\n return PDFViewerApplication.pdfViewer.pagesCount;\n }\n return null;\n } catch (error) {\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\n // Only log if it's an unexpected error\n const errorMsg = error instanceof Error ? error.message : String(error);\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\n logger.error('Error getting total pages:', error);\n }\n return null;\n }\n }, [waitForInitialization]);\n\n /**\n * Attaches click interceptors to PDF form fields\n * Allows blocking interaction if custom validation fails\n * @param onFieldClick - Callback that receives field name and returns true to allow interaction, false to block\n */\n const attachFieldClickInterceptors = useCallback((\n onFieldClick: (fieldName: string) => boolean\n ) => {\n const iframe = iframeRef.current;\n if (!iframe?.contentDocument) {\n logger.warn('Cannot attach field interceptors: iframe not ready');\n return;\n }\n\n try {\n // Use event delegation instead of attaching to individual elements\n // This survives PDF.js re-renders\n const doc = iframe.contentDocument;\n\n // Inject CSS styles for click highlighting (if not already present)\n const clickHighlightStyleId = 'signiphi-click-highlight-style';\n if (!doc.getElementById(clickHighlightStyleId)) {\n const style = doc.createElement('style');\n style.id = clickHighlightStyleId;\n style.textContent = `\n .clicked-field-annotation {\n outline: 2px solid #3b82f6 !important;\n outline-offset: 1px !important;\n box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15) !important;\n border-radius: 3px !important;\n z-index: 999 !important;\n position: relative !important;\n }\n .clicked-field {\n outline: none !important;\n border-color: #3b82f6 !important;\n background-color: rgba(59, 130, 246, 0.05) !important;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1) !important;\n }\n `;\n doc.head.appendChild(style);\n logger.info('[CLICK HIGHLIGHT] Injected CSS styles');\n }\n\n // Remove existing delegated listener if any\n if ((doc as any)._signiphiDelegatedHandler) {\n ['pointerdown', 'focusin', 'click', 'mousedown'].forEach(event => {\n doc.removeEventListener(event, (doc as any)._signiphiDelegatedHandler, true);\n });\n }\n\n // Create delegated handler\n const delegatedHandler = (e: Event) => {\n const target = e.target as HTMLElement;\n\n // Log ALL clicks in PDF for debugging\n logger.info(`[PDF CLICK] Element clicked:`, {\n tag: target.tagName,\n className: target.className,\n id: target.id,\n name: target.getAttribute('name'),\n eventType: e.type\n });\n\n // Check if target is a form field OR button (signature fields might be buttons)\n if (!['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(target.tagName)) {\n logger.info(`[PDF CLICK] Not a form field (${target.tagName}), checking for child/parent...`);\n\n // First check if this is a PDF.js widget annotation wrapper (SECTION with class containing \"Annotation\")\n let formElement: Element | null = null;\n if (target.tagName === 'SECTION' && target.className.includes('Annotation')) {\n // Look for input/select/textarea/button INSIDE this section\n formElement = target.querySelector('input, select, textarea, button');\n if (formElement) {\n logger.info(`[PDF CLICK] Found child form field in annotation:`, formElement.tagName);\n }\n }\n\n // If not found, try parent elements\n if (!formElement) {\n formElement = target.closest('input, select, textarea, button');\n if (formElement) {\n logger.info(`[PDF CLICK] Found parent form field:`, formElement.tagName);\n }\n }\n\n if (formElement) {\n // Recurse with the actual form element\n const newEvent = new Event(e.type, { bubbles: true, cancelable: true });\n Object.defineProperty(newEvent, 'target', { value: formElement, enumerable: true });\n delegatedHandler(newEvent);\n if (newEvent.defaultPrevented) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n return;\n }\n\n // Get field name\n const fieldName = target.getAttribute('name')\n || target.getAttribute('data-element-id')\n || target.getAttribute('id');\n\n if (!fieldName) {\n logger.info('[PDF CLICK] No field name found');\n return; // No identifier, ignore\n }\n\n logger.info(`Field click intercepted: ${fieldName}`, e.type);\n\n // Call callback first to determine if we should block\n const shouldProceed = onFieldClick(fieldName);\n logger.info(`Field ${fieldName} shouldProceed: ${shouldProceed}`);\n\n // Only process pointerdown and mousedown events for highlighting and blocking\n // Let focusin and click events pass through for normal field behavior\n if (e.type !== 'pointerdown' && e.type !== 'mousedown') {\n // For focusin and click, only block if field is not allowed\n if (!shouldProceed) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n logger.info(`Blocked ${e.type} event for field: ${fieldName}`);\n }\n return; // Don't apply highlights on these events\n }\n\n // Apply click highlighting on the FIRST blocking event (when modal will open)\n if (!shouldProceed && e.type === 'pointerdown') {\n // Remove previous click highlights from all fields\n const previousClickHighlights = doc.querySelectorAll('.clicked-field');\n previousClickHighlights.forEach(el => el.classList.remove('clicked-field'));\n const previousAnnotationClickHighlights = doc.querySelectorAll('.clicked-field-annotation');\n previousAnnotationClickHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\n\n // Add click highlight to current field\n target.classList.add('clicked-field');\n\n // Also highlight the parent widget annotation if it exists\n const widgetAnnotation = target.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation, .buttonWidgetAnnotation');\n if (widgetAnnotation) {\n widgetAnnotation.classList.add('clicked-field-annotation');\n }\n\n logger.info(`[CLICK HIGHLIGHT] Applied to blocked field: ${fieldName}`, {\n hasAnnotation: !!widgetAnnotation,\n elementTag: target.tagName,\n eventType: e.type\n });\n\n // Block the interaction\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n logger.info(`Blocked interaction with field: ${fieldName}`);\n } \n // Apply on mousedown for allowed fields (normal interaction)\n else if (shouldProceed && e.type === 'mousedown') {\n // Remove previous click highlights from all fields\n const previousClickHighlights = doc.querySelectorAll('.clicked-field');\n previousClickHighlights.forEach(el => el.classList.remove('clicked-field'));\n const previousAnnotationClickHighlights = doc.querySelectorAll('.clicked-field-annotation');\n previousAnnotationClickHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\n\n // Add click highlight to current field\n target.classList.add('clicked-field');\n\n // Also highlight the parent widget annotation if it exists\n const widgetAnnotation = target.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation, .buttonWidgetAnnotation');\n if (widgetAnnotation) {\n widgetAnnotation.classList.add('clicked-field-annotation');\n }\n\n logger.info(`[CLICK HIGHLIGHT] Applied to allowed field: ${fieldName}`, {\n hasAnnotation: !!widgetAnnotation,\n elementTag: target.tagName,\n eventType: e.type\n });\n \n // DO NOT prevent default for allowed fields - let them focus and accept input\n }\n // Handle blocked pointerdown that's not the first one (shouldn't happen, but be safe)\n else if (!shouldProceed) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n logger.info(`Blocked ${e.type} event for field: ${fieldName}`);\n }\n };\n\n // Store reference for cleanup\n (doc as any)._signiphiDelegatedHandler = delegatedHandler;\n\n // Attach delegated listener to document\n ['pointerdown', 'focusin', 'click', 'mousedown'].forEach(event => {\n doc.addEventListener(event, delegatedHandler, {\n capture: true,\n passive: false\n });\n });\n\n // Log how many fields we found (for diagnostics)\n let formElements = doc.querySelectorAll(\n 'input[data-element-id], select[data-element-id], textarea[data-element-id]'\n );\n if (formElements.length === 0) {\n formElements = doc.querySelectorAll('input[id], select[id], textarea[id]');\n }\n\n logger.info(`Attached delegated interceptor. Found ${formElements.length} form fields in PDF`);\n\n // Just log field names for diagnostics\n formElements.forEach((element) => {\n const fieldName = element.getAttribute('name')\n || element.getAttribute('data-element-id')\n || element.getAttribute('id');\n\n if (fieldName) {\n logger.info(`Found field: ${fieldName} (name: ${element.getAttribute('name')}, id: ${element.getAttribute('id')})`);\n }\n });\n } catch (error) {\n logger.error('Error attaching field click interceptors:', error);\n }\n }, []);\n\n /**\n * Add visual indicator to a PDF form field\n * Shows user the field's acknowledgement/completion state\n * @param fieldName - The field name (e.g., 'signature_field_main')\n * @param indicatorType - Type of indicator: 'completed' (green checkmark), 'pending-ack' (amber badge), or 'info' (subtle info icon)\n * @param allowedFieldIds - Comma-separated list of fieldIds (UUIDs) that should show indicators\n */\n /**\n * Add a visual indicator badge to a field's annotation section\n * \n * Field Indicator System - Three-state visual feedback for acknowledgement status:\n * - 'info' (gray 'i', 20x20px): Field has acknowledgements but is unfilled\n * - 'pending-ack' (amber '!', 24x24px): Field is filled but needs acknowledgement \n * - 'completed' (green '✓', 24x24px): Field is filled AND fully acknowledged\n * \n * Indicators are positioned in the top-right corner of the field annotation.\n * Only fields with acknowledgements will display indicators.\n * \n * @param fieldName - Name of the field to add indicator to\n * @param indicatorType - Type of indicator badge to display\n * @param allowedFieldIds - Optional comma-separated list of fieldIds (UUIDs) to filter which fields get indicators\n */\n const addFieldIndicator = useCallback(async (\n fieldName: string, \n indicatorType: 'completed' | 'pending-ack' | 'info' = 'completed',\n allowedFieldIds?: string\n ) => {\n try {\n const iframe = iframeRef.current;\n if (!iframe?.contentDocument) {\n logger.warn('Cannot add field indicator: iframe not ready');\n return;\n }\n\n const doc = iframe.contentDocument;\n\n // Parse allowed fieldIds (UUIDs)\n const allowedIds = allowedFieldIds ? allowedFieldIds.split(',').map(id => id.trim()).filter(id => id) : null;\n\n logger.info(`Adding indicators for ${fieldName}, allowedFieldIds:`, allowedIds);\n\n // If no allowed IDs provided or empty, don't add any indicators\n if (allowedIds !== null && allowedIds.length === 0) {\n logger.info(`No fields allowed for indicators (${fieldName}), skipping`);\n return;\n }\n\n // Get PDF metadata to map fieldIds to PDF field names\n const pdfApp = getPDFViewerApplication();\n let fieldIdToPdfNameMap: Record<string, string> = {};\n\n if (pdfApp?.pdfDocument?.getData && allowedIds) {\n try {\n const pdfDoc = pdfApp.pdfDocument;\n\n // Get PDF bytes\n const pdfBytesRaw = await pdfDoc.getData!();\n logger.info('Got PDF bytes, type:', typeof pdfBytesRaw, 'isArrayBuffer:', pdfBytesRaw instanceof ArrayBuffer, 'isUint8Array:', pdfBytesRaw instanceof Uint8Array);\n logger.info('PDF bytes constructor:', pdfBytesRaw?.constructor?.name);\n logger.info('PDF bytes has buffer?:', !!(pdfBytesRaw as any)?.buffer);\n\n // Ensure we have a Uint8Array for pdf-lib\n let pdfBytes: Uint8Array;\n const rawData = pdfBytesRaw as any;\n\n if (pdfBytesRaw instanceof Uint8Array) {\n pdfBytes = pdfBytesRaw;\n } else if (rawData instanceof ArrayBuffer) {\n pdfBytes = new Uint8Array(rawData);\n } else if (rawData?.buffer instanceof ArrayBuffer) {\n // It's a typed array view (like Uint8Array from a different realm/iframe)\n pdfBytes = new Uint8Array(rawData.buffer, rawData.byteOffset || 0, rawData.byteLength || rawData.length);\n } else {\n logger.warn('Unexpected PDF bytes type, attempting direct conversion');\n pdfBytes = new Uint8Array(rawData);\n }\n\n logger.info('Converted to Uint8Array, length:', pdfBytes.length);\n\n // Use pdf-lib to read metadata\n const { PDFDocument, PDFName } = await import('pdf-lib');\n const pdfLibDoc = await PDFDocument.load(pdfBytes);\n logger.info('Successfully loaded PDF with pdf-lib');\n\n // Get the Info dictionary\n const infoRef = pdfLibDoc.context.trailerInfo.Info;\n if (infoRef) {\n const infoObj = pdfLibDoc.context.lookup(infoRef) as any;\n\n // Try to get SigniphiMetadata\n const metadataObj = infoObj?.get(PDFName.of('SigniphiMetadata'));\n\n if (metadataObj) {\n const signiphiMetadataStr = metadataObj.toString();\n\n // Parse the metadata (it's stored as a PDF string in format (JSON))\n let jsonStr = signiphiMetadataStr;\n const parenMatch = signiphiMetadataStr.match(/^\\((.*)\\)$/);\n if (parenMatch && parenMatch[1]) {\n jsonStr = parenMatch[1];\n }\n\n const signiphiMetadata = JSON.parse(jsonStr);\n logger.info('Parsed Signiphi metadata:', signiphiMetadata);\n\n // Create fieldId → PDF field name mapping\n if (signiphiMetadata.fields) {\n Object.entries(signiphiMetadata.fields).forEach(([pdfFieldName, fieldData]: [string, any]) => {\n if (fieldData.fieldId) {\n fieldIdToPdfNameMap[fieldData.fieldId] = pdfFieldName;\n }\n });\n }\n\n logger.info('FieldId to PDF name mapping:', fieldIdToPdfNameMap);\n }\n }\n } catch (metadataError) {\n logger.warn('Could not read PDF metadata for field mapping:', metadataError);\n }\n }\n\n // Special handling for signature_field_main and initials_field_main\n // These are synthetic fields - we need to find ALL actual signature/initials fields\n let targetElements: Element[] = [];\n\n if (fieldName === 'signature_field_main') {\n // Find ALL signature fields in the PDF\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\n\n // Get allowed PDF field names from the mapping\n const allowedPdfNames = allowedIds\n ? allowedIds.map(fieldId => fieldIdToPdfNameMap[fieldId]).filter(Boolean)\n : null;\n\n logger.info(`Allowed PDF field names for signature indicators:`, allowedPdfNames);\n\n allInputs.forEach(input => {\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\n if (name.toLowerCase().includes('signature') && !name.toLowerCase().includes('initials')) {\n // If we have a filter, only include fields in the allowed list\n if (allowedPdfNames === null) {\n targetElements.push(input);\n } else {\n // Check if the DOM field name starts with any allowed metadata name\n // (DOM names have suffixes like \"_signature\" added during encoding)\n const isAllowed = allowedPdfNames.some(allowedName => allowedName && name.startsWith(allowedName));\n if (isAllowed) {\n targetElements.push(input);\n }\n }\n }\n });\n logger.info(`Found ${targetElements.length} signature fields for indicator (filtered by acknowledgements)`);\n } else if (fieldName === 'initials_field_main') {\n // Find ALL initials fields in the PDF\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\n\n // Get allowed PDF field names from the mapping\n const allowedPdfNames = allowedIds\n ? allowedIds.map(fieldId => fieldIdToPdfNameMap[fieldId]).filter(Boolean)\n : null;\n\n logger.info(`Allowed PDF field names for initials indicators:`, allowedPdfNames);\n\n allInputs.forEach(input => {\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\n if (name.toLowerCase().includes('initials')) {\n // If we have a filter, only include fields in the allowed list\n if (allowedPdfNames === null) {\n targetElements.push(input);\n } else {\n // Check if the DOM field name starts with any allowed metadata name\n // (DOM names have suffixes like \"_initials\" added during encoding)\n const isAllowed = allowedPdfNames.some(allowedName => allowedName && name.startsWith(allowedName));\n if (isAllowed) {\n targetElements.push(input);\n }\n }\n }\n });\n logger.info(`Found ${targetElements.length} initials fields for indicator (filtered by acknowledgements)`);\n } else {\n // Regular field - try to find by exact name\n const formElement = doc.querySelector(\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\n `select[name=\"${fieldName}\"], select[data-element-id=\"${fieldName}\"], ` +\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\n );\n if (formElement) {\n targetElements.push(formElement);\n }\n }\n\n if (targetElements.length === 0) {\n logger.warn(`Cannot add indicator: no fields found for \"${fieldName}\"`);\n return;\n }\n\n // Add indicator to each target element (showMode is 'all')\n let indicatorsAdded = 0;\n\n targetElements.forEach(formElement => {\n\n // Find the parent annotation section\n const annotationSection = formElement.closest('section');\n if (!annotationSection) {\n return;\n }\n\n // Remove existing indicator if any (to allow updating indicator type)\n const existingIndicator = annotationSection.querySelector('.signiphi-field-indicator');\n if (existingIndicator) {\n existingIndicator.remove();\n }\n\n // Create indicator based on type\n const indicator = doc.createElement('div');\n indicator.className = 'signiphi-field-indicator';\n \n // Add ARIA attributes for accessibility\n indicator.setAttribute('role', 'status');\n indicator.setAttribute('aria-live', 'polite');\n \n if (indicatorType === 'completed') {\n // Green checkmark (existing style)\n indicator.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#10b981\" stroke=\"white\" stroke-width=\"2\"/>\n <path d=\"M7 12l4 4 6-8\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n `;\n indicator.setAttribute('title', 'Acknowledgement complete');\n indicator.setAttribute('aria-label', 'Acknowledgement status: Complete');\n } else if (indicatorType === 'pending-ack') {\n // Amber badge with exclamation mark\n indicator.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#f59e0b\" stroke=\"white\" stroke-width=\"2\"/>\n <text x=\"12\" y=\"17\" font-size=\"16\" font-weight=\"bold\" fill=\"white\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\">!</text>\n </svg>\n `;\n indicator.setAttribute('title', 'Acknowledgement required');\n indicator.setAttribute('aria-label', 'Acknowledgement status: Pending acknowledgement');\n } else if (indicatorType === 'info') {\n // Subtle info icon for unfilled fields with acknowledgements\n indicator.innerHTML = `\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"9\" fill=\"#94a3b8\" stroke=\"white\" stroke-width=\"1.5\"/>\n <text x=\"10\" y=\"14\" font-size=\"12\" font-weight=\"bold\" fill=\"white\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\">i</text>\n </svg>\n `;\n indicator.setAttribute('title', 'Has acknowledgement requirements');\n indicator.setAttribute('aria-label', 'Acknowledgement status: Has acknowledgement requirements');\n }\n\n // Style the indicator - positioned in top-right corner\n // Info indicators are slightly smaller to be more subtle\n const isInfoIndicator = indicatorType === 'info';\n Object.assign(indicator.style, {\n position: 'absolute',\n top: '-8px',\n right: '-8px',\n width: isInfoIndicator ? '20px' : '24px',\n height: isInfoIndicator ? '20px' : '24px',\n display: 'block',\n zIndex: '1000',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'opacity 0.3s ease-in-out',\n margin: '0',\n padding: '0',\n lineHeight: '0',\n fontSize: '0',\n });\n\n // Ensure SVG doesn't cause layout shifts\n const svg = indicator.querySelector('svg');\n if (svg) {\n (svg as SVGElement).style.display = 'block';\n (svg as SVGElement).style.width = '24px';\n (svg as SVGElement).style.height = '24px';\n }\n\n // Add to annotation section (ensure no layout shift)\n const currentPosition = window.getComputedStyle(annotationSection).position;\n if (currentPosition === 'static') {\n annotationSection.style.position = 'relative';\n }\n annotationSection.appendChild(indicator);\n\n // Fade in animation\n requestAnimationFrame(() => {\n indicator.style.opacity = '1';\n });\n\n indicatorsAdded++;\n });\n\n logger.info(`Added ${indicatorsAdded} ${indicatorType} indicator(s) for field: ${fieldName}`);\n } catch (error) {\n logger.error('Error adding field indicator:', error);\n }\n }, []);\n\n /**\n * Remove visual indicator from a PDF form field\n */\n const removeFieldIndicator = useCallback((fieldName: string) => {\n try {\n const iframe = iframeRef.current;\n if (!iframe?.contentDocument) return;\n\n const doc = iframe.contentDocument;\n\n const formElement = doc.querySelector(\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\n `select[name=\"${fieldName}\"], select[data-element-id=\"${fieldName}\"], ` +\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\n );\n\n if (!formElement) return;\n\n const annotationSection = formElement.closest('section');\n if (!annotationSection) return;\n\n const indicator = annotationSection.querySelector('.signiphi-field-indicator');\n if (indicator) {\n indicator.remove();\n logger.info(`Removed indicator from field: ${fieldName}`);\n }\n } catch (error) {\n logger.error('Error removing field indicator:', error);\n }\n }, []);\n\n // Check PDF.js version on mount\n useEffect(() => {\n if (!versionChecked) {\n const config = getPdfJsConfig();\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\n \n checkPdfJsVersion(basePath).then((result) => {\n setVersionChecked(true);\n \n if (!result.viewerExists) {\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`;\n setSetupError(errorMsg);\n logger.error(errorMsg);\n } else if (!result.versionMatch) {\n logger.warn(\n `⚠️ PDF.js version mismatch:\\n` +\n ` Viewer: ${result.viewerVersion}\\n` +\n ` Worker: ${result.workerVersion}\\n` +\n `Run: npx signiphi-setup to sync versions`\n );\n }\n }).catch((error) => {\n logger.error('Failed to check PDF.js version:', error);\n setVersionChecked(true);\n });\n }\n }, [pdfjsBasePath, versionChecked]);\n\n const handleIframeLoad = useCallback(() => {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n return;\n }\n\n try {\n // Check if iframe failed to load (404 error for viewer.html)\n if (iframe.contentDocument) {\n const title = iframe.contentDocument.title;\n const body = iframe.contentDocument.body;\n \n // Detect common error patterns (404, file not found)\n if (\n title?.includes('404') || \n title?.includes('Not Found') ||\n body?.textContent?.includes('404') ||\n body?.textContent?.includes('Cannot GET')\n ) {\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.`;\n logger.error(errorMsg);\n isLoadingRef.current = false;\n onError?.(errorMsg);\n return;\n }\n }\n\n setTimeout(async () => {\n try {\n if (initializationPromise.current) {\n await initializationPromise.current;\n isLoadingRef.current = false;\n onLoad?.();\n } else {\n const PDFViewerApplication = getPDFViewerApplication();\n if (PDFViewerApplication) {\n isLoadingRef.current = false;\n onLoad?.();\n } else {\n throw new Error('PDFViewerApplication not found after iframe load');\n }\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error loading PDF viewer';\n logger.error('Error in PDF.js initialization:', error);\n isLoadingRef.current = false;\n onError?.(errorMessage);\n }\n }, 1000);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error in iframe load handler';\n logger.error('Error in iframe load handler:', error);\n isLoadingRef.current = false;\n onError?.(errorMessage);\n }\n }, [getPDFViewerApplication, onLoad, onError, setupError]);\n\n // Expose methods via ref\n useImperativeHandle(\n ref,\n () => ({\n loadPdf,\n getFormFieldValues,\n setFormFieldValues,\n getAllFieldNames,\n saveDocument,\n getPDFViewerApplication,\n injectPlaceholders,\n zoomIn,\n zoomOut,\n nextPage,\n previousPage,\n getCurrentPage,\n getTotalPages,\n attachFieldClickInterceptors,\n addFieldIndicator,\n removeFieldIndicator,\n }),\n [loadPdf, getFormFieldValues, setFormFieldValues, getAllFieldNames, saveDocument, getPDFViewerApplication, injectPlaceholders, zoomIn, zoomOut, nextPage, previousPage, getCurrentPage, getTotalPages, attachFieldClickInterceptors, addFieldIndicator, removeFieldIndicator]\n );\n\n return <>{children({ iframeRef, handleIframeLoad })}</>;\n }\n);\n\nPdfViewerCore.displayName = 'PdfViewerCore';\n\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 transparent background\r\n ctx.clearRect(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.clearRect(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={`signiphi-pdf-signer 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 <div className=\"signiphi-pdf-signer\">\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 </div>\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 <div className=\"signiphi-pdf-signer\">\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 </div>\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 * Signature Modal Component - For SIGNATURES ONLY\r\n * Supports drawing and uploading signatures\r\n * For initials, use InitialsModal instead\r\n */\r\n\r\nimport React, { useRef, useState, useCallback } from 'react';\r\nimport { SignatureCanvas } from './SignatureCanvas';\r\nimport { 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 fieldLabel: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Signature modal - FOR SIGNATURES ONLY\r\n */\r\nexport function SignatureModalCore({\r\n isOpen,\r\n onClose,\r\n onSave,\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 // Signature-specific canvas sizes\r\n const canvasWidth = 450;\r\n const canvasHeight = 200;\r\n\r\n // Mobile sizes (smaller)\r\n const mobileCanvasWidth = 320;\r\n const mobileCanvasHeight = 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\">Sign Document</DialogTitle>\r\n <DialogDescription className=\"text-sm md:text-base\">\r\n Please provide your full signature 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=\"Sign Document\"\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=\"Sign Document\"\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","/**\r\n * Initials Modal Component - FOR INITIALS ONLY\r\n * Uses TEXT INPUT for initials (NOT drawing canvas like signatures)\r\n */\r\n\r\nimport React, { useState, useCallback } from 'react';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogFooter,\r\n} from '../lib/ui/dialog';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Input } from '../lib/ui/input';\r\nimport { Label } from '../lib/ui/label';\r\n\r\nexport interface InitialsModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSave: (initialsText: string) => void;\r\n fieldLabel: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Initials modal - FOR INITIALS ONLY (TEXT INPUT)\r\n */\r\nexport function InitialsModal({\r\n isOpen,\r\n onClose,\r\n onSave,\r\n fieldLabel,\r\n}: InitialsModalProps) {\r\n const [initialsText, setInitialsText] = useState('');\r\n\r\n const handleSave = useCallback(() => {\r\n if (initialsText.trim()) {\r\n onSave(initialsText.trim());\r\n setInitialsText(''); // Clear for next time\r\n onClose();\r\n }\r\n }, [initialsText, onSave, onClose]);\r\n\r\n const handleCancel = useCallback(() => {\r\n setInitialsText(''); // Clear on cancel\r\n onClose();\r\n }, [onClose]);\r\n\r\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' && initialsText.trim()) {\r\n handleSave();\r\n }\r\n }, [initialsText, handleSave]);\r\n\r\n return (\r\n <Dialog open={isOpen} onOpenChange={onClose}>\r\n <DialogContent className=\"sm:max-w-md\">\r\n <DialogHeader className=\"space-y-2 md:space-y-3\">\r\n <DialogTitle className=\"text-lg md:text-xl font-semibold\">Add Initials</DialogTitle>\r\n <DialogDescription className=\"text-sm md:text-base\">\r\n Please type your initials 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 py-4\">\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"initials-input\" className=\"text-sm font-medium\">\r\n Your Initials\r\n </Label>\r\n <Input\r\n id=\"initials-input\"\r\n type=\"text\"\r\n value={initialsText}\r\n onChange={(e) => setInitialsText(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder=\"Enter your initials\"\r\n autoFocus\r\n autoComplete=\"off\"\r\n className=\"text-lg md:text-xl font-serif italic text-center h-12 md:h-14 border-2 focus:border-primary/50 transition-colors\"\r\n style={{ fontFamily: \"'Dancing Script', 'Brush Script MT', cursive\" }}\r\n />\r\n <p className=\"text-xs text-muted-foreground text-center\">\r\n Typically 2-3 letters (e.g., \"JD\" for John Doe)\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <DialogFooter className=\"gap-2\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={handleCancel}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={!initialsText.trim()}\r\n >\r\n Save Initials\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\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 onInitialsClick?: () => void; // Optional - if provided, initials becomes a button; otherwise text input\r\n onInitialsChange: (value: string) => void;\r\n signatureData?: string;\r\n initialsValue?: string;\r\n initialsData?: string; // For button mode - shows if initials signature has been captured\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 onInitialsClick,\r\n onInitialsChange,\r\n signatureData,\r\n initialsValue = '',\r\n initialsData,\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', 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=\"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\">{initialsLabel}</span>\r\n {initialsRequired && <span className=\"text-destructive ml-0.5\">*</span>}\r\n </Label>\r\n {onInitialsClick ? (\r\n // Button mode - opens signature modal for initials\r\n <Button\r\n type=\"button\"\r\n onClick={onInitialsClick}\r\n variant={initialsData ? '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 initialsData\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 {initialsData ? (\r\n <>\r\n <CheckCircle className=\"mr-1.5 md:mr-2 size-3.5 md:size-4\" />\r\n <span className=\"truncate\">Initials 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 Add Initials</span>\r\n </>\r\n )}\r\n </Button>\r\n ) : (\r\n // Text input mode - traditional initials entry\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 )}\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 'signiphi-pdf-signer', // Add scoping class to portal content\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 'signiphi-pdf-signer', // Add scoping class to portal content\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 // Log what we received\r\n console.log('[SIGNATURE RENDERER] Component rendered:', {\r\n fieldId: field.id,\r\n hasOnSignatureClick: !!onSignatureClick,\r\n onSignatureClickType: typeof onSignatureClick\r\n });\r\n\r\n const handleClick = () => {\r\n console.log('[SIGNATURE RENDERER] Button clicked for field:', field.id);\r\n onSignatureClick();\r\n };\r\n\r\n return (\r\n <div className=\"w-full\">\r\n <Button\r\n type=\"button\"\r\n onClick={handleClick}\r\n onPointerDown={() => console.log('[SIGNATURE RENDERER] PointerDown event')}\r\n onMouseDown={() => console.log('[SIGNATURE RENDERER] MouseDown event')}\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 onSignatureClick?: () => void; // For acknowledgement handling\r\n hasSignature?: boolean;\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 onSignatureClick,\r\n error,\r\n className = '',\r\n}: InitialsFieldRendererProps) {\r\n // Log what we received\r\n console.log('[INITIALS RENDERER] Component rendered:', {\r\n fieldId: field.id,\r\n hasOnSignatureClick: !!onSignatureClick,\r\n onSignatureClickType: typeof onSignatureClick,\r\n hasAcknowledgements: !!(field.acknowledgements && field.acknowledgements.length > 0)\r\n });\r\n\r\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\r\n console.log('[INITIALS RENDERER] Input focused for field:', field.id);\r\n // If field has acknowledgements and onSignatureClick is provided, trigger it\r\n // This will show the acknowledgement modal before allowing input\r\n if (onSignatureClick && field.acknowledgements && field.acknowledgements.length > 0) {\r\n console.log('[INITIALS RENDERER] Field with acknowledgements focused:', field.id);\r\n e.target.blur(); // Remove focus immediately\r\n onSignatureClick(); // Trigger acknowledgement modal\r\n }\r\n };\r\n\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 onFocus={handleFocus}\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","/**\n * Form Field Renderer Component\n * Switches between appropriate field type renderers\n */\n\nimport { EsignFormField, FormFieldType } from '../../types';\nimport { TextFieldRenderer } from './TextFieldRenderer';\nimport { DateFieldRenderer } from './DateFieldRenderer';\nimport { CheckboxRenderer } from './CheckboxRenderer';\nimport { RadioGroupRenderer } from './RadioGroupRenderer';\nimport { DropdownRenderer } from './DropdownRenderer';\nimport { SignatureFieldRenderer } from './SignatureFieldRenderer';\nimport { InitialsFieldRenderer } from './InitialsFieldRenderer';\nimport { TextLabelRenderer } from './TextLabelRenderer';\nimport { Lock } from 'lucide-react';\nimport { cn } from '../../lib/utils';\n\nexport interface FormFieldRendererProps {\n field: EsignFormField;\n value: string;\n onChange: (value: string) => void;\n onSignatureClick?: () => void;\n hasSignature?: boolean;\n readOnly?: boolean;\n error?: string;\n className?: string;\n // Acknowledgement props\n isFieldFullyAcknowledged?: (fieldId: string) => boolean;\n onAcknowledgementRequired?: (field: EsignFormField) => void;\n}\n\n/**\n * Main field renderer that delegates to specific field type components\n */\nexport function FormFieldRenderer({\n field,\n value,\n onChange,\n onSignatureClick,\n hasSignature = false,\n error,\n className,\n isFieldFullyAcknowledged,\n onAcknowledgementRequired,\n}: FormFieldRendererProps) {\n // Check if field has acknowledgements and they're not fully acknowledged\n const hasAcknowledgements = field.acknowledgements && field.acknowledgements.length > 0;\n const needsAcknowledgement = hasAcknowledgements &&\n isFieldFullyAcknowledged &&\n !isFieldFullyAcknowledged(field.id);\n\n // Log when rendering signature/initials with acknowledgements\n if ((field.type === 'signature' || field.type === 'initials') && hasAcknowledgements) {\n console.log('[FORM FIELD RENDERER] Rendering:', {\n id: field.id,\n type: field.type,\n hasAcknowledgements,\n needsAcknowledgement,\n hasOnSignatureClick: !!onSignatureClick,\n hasOnAckRequired: !!onAcknowledgementRequired,\n isFieldFullyAcknowledgedFunc: !!isFieldFullyAcknowledged\n });\n }\n\n const commonProps = {\n field,\n value,\n onChange,\n error,\n className,\n };\n\n // If acknowledgements are needed, wrap in a disabled container\n // BUT: Don't block signature/initials fields - they need to open their modals\n const isSignatureType = field.type === FormFieldType.SIGNATURE || field.type === FormFieldType.INITIALS;\n \n if (needsAcknowledgement && !isSignatureType) {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (onAcknowledgementRequired) {\n onAcknowledgementRequired(field);\n }\n };\n\n return (\n <div className=\"relative\">\n <div\n className={cn(\n \"relative cursor-pointer\",\n className\n )}\n onClick={handleClick}\n >\n {/* Render the field in disabled state */}\n <div className=\"pointer-events-none opacity-50\">\n {renderFieldComponent(field, commonProps, onSignatureClick, hasSignature)}\n </div>\n \n {/* Overlay with lock icon */}\n <div className=\"absolute inset-0 flex items-center justify-center bg-orange-100/50 dark:bg-orange-950/30 border-2 border-orange-500 rounded-md backdrop-blur-[1px]\">\n <div className=\"flex items-center gap-2 text-orange-700 dark:text-orange-400 font-medium text-sm\">\n <Lock className=\"h-4 w-4\" />\n <span>Acknowledgement Required</span>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n // For signature/initials fields with acknowledgements, show acknowledgement modal BEFORE opening signature pad\n if (needsAcknowledgement && isSignatureType) {\n console.log('[FORM FIELD RENDERER] Wrapping signature field with acknowledgement check:', field.id);\n const wrappedSignatureClick = () => {\n console.log('[FORM FIELD RENDERER] Wrapped click triggered for field:', field.id);\n if (onAcknowledgementRequired) {\n console.log('[FORM FIELD RENDERER] Calling onAcknowledgementRequired');\n onAcknowledgementRequired(field);\n } else {\n console.log('[FORM FIELD RENDERER] WARNING: onAcknowledgementRequired not provided!');\n }\n };\n\n return (\n <div\n className=\"relative\"\n onClick={(e) => {\n console.log('[FORM FIELD RENDERER] Wrapper div clicked!', e.target);\n }}\n >\n <div className={cn(\"relative border-2 border-orange-500 rounded-md\", className)}>\n {renderFieldComponent(field, commonProps, wrappedSignatureClick, hasSignature)}\n </div>\n <div className=\"flex items-center gap-1 text-orange-600 text-xs mt-1\">\n <Lock className=\"h-3 w-3\" />\n <span>Acknowledge before signing</span>\n </div>\n </div>\n );\n }\n\n return renderFieldComponent(field, commonProps, onSignatureClick, hasSignature);\n}\n\nfunction renderFieldComponent(\n field: EsignFormField,\n commonProps: any,\n onSignatureClick?: () => void,\n hasSignature?: boolean\n) {\n switch (field.type) {\n case FormFieldType.TEXT:\n return <TextFieldRenderer {...commonProps} />;\n\n case FormFieldType.DATE:\n return <DateFieldRenderer {...commonProps} />;\n\n case FormFieldType.CHECKBOX:\n return <CheckboxRenderer {...commonProps} />;\n\n case FormFieldType.RADIO:\n return <RadioGroupRenderer {...commonProps} />;\n\n case FormFieldType.DROPDOWN:\n return <DropdownRenderer {...commonProps} />;\n\n case FormFieldType.SIGNATURE:\n return (\n <SignatureFieldRenderer\n {...commonProps}\n onSignatureClick={onSignatureClick || (() => {})}\n hasSignature={hasSignature}\n />\n );\n\n case FormFieldType.INITIALS:\n return (\n <InitialsFieldRenderer\n {...commonProps}\n onSignatureClick={onSignatureClick}\n hasSignature={hasSignature}\n />\n );\n\n case FormFieldType.TEXT_LABEL:\n return <TextLabelRenderer {...commonProps} />;\n\n default:\n // Fallback to text input\n return <TextFieldRenderer {...commonProps} />;\n }\n}\n\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","import { Button } from '../lib/ui/button';\r\nimport { ChevronLeft, ChevronRight, Star } from 'lucide-react';\r\n\r\nexport interface RequiredFieldNavigationProps {\r\n /** Current index in the required fields list (0-indexed) */\r\n currentIndex: number;\r\n /** Total number of required fields */\r\n totalRequired: number;\r\n /** Callback when next button is clicked */\r\n onNext: () => void;\r\n /** Callback when previous button is clicked */\r\n onPrevious: () => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Navigation controls for cycling through required fields only\r\n * Shows current position and provides next/previous buttons\r\n */\r\nexport function RequiredFieldNavigation({\r\n currentIndex,\r\n totalRequired,\r\n onNext,\r\n onPrevious,\r\n className = ''\r\n}: RequiredFieldNavigationProps) {\r\n if (totalRequired === 0) return null;\r\n\r\n return (\r\n <div className={`flex items-center gap-2 ${className}`}>\r\n <Star size={16} className=\"text-amber-500\" />\r\n <span className=\"text-sm font-medium\">Required Fields</span>\r\n <div className=\"flex items-center gap-1\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={onPrevious}\r\n className=\"h-8 w-8\"\r\n aria-label=\"Previous required field\"\r\n >\r\n <ChevronLeft size={16} />\r\n </Button>\r\n <span className=\"text-sm text-muted-foreground px-2\">\r\n {currentIndex + 1} / {totalRequired}\r\n </span>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={onNext}\r\n className=\"h-8 w-8\"\r\n aria-label=\"Next required field\"\r\n >\r\n <ChevronRight size={16} />\r\n </Button>\r\n </div>\r\n </div>\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\nimport { RequiredFieldNavigation } from './RequiredFieldNavigation';\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 /** Required field navigation props (for PDF view only) */\r\n requiredFieldNavigation?: {\r\n hasRequiredFields: boolean;\r\n currentRequiredIndex: number;\r\n requiredFieldCount: number;\r\n onNext: () => void;\r\n onPrevious: () => void;\r\n };\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 requiredFieldNavigation,\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\r\n {/* Required Field Navigation - Only in PDF view */}\r\n {requiredFieldNavigation?.hasRequiredFields && (\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 <RequiredFieldNavigation\r\n currentIndex={requiredFieldNavigation.currentRequiredIndex}\r\n totalRequired={requiredFieldNavigation.requiredFieldCount}\r\n onNext={requiredFieldNavigation.onNext}\r\n onPrevious={requiredFieldNavigation.onPrevious}\r\n />\r\n </>\r\n )}\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 /** Check if field acknowledgements are fully acknowledged */\r\n isFieldFullyAcknowledged?: (fieldId: string) => boolean;\r\n /** Callback when acknowledgement is required for a field */\r\n onAcknowledgementRequired?: (field: EsignFormField) => void;\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 ALL signature and initials fields (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 isFieldFullyAcknowledged,\r\n onAcknowledgementRequired,\r\n}, ref) => {\r\n // Filter out ALL signature and initials fields (they stay in sidebar)\r\n const displayFields = fields.filter(\r\n (f) => f.type !== 'signature' && f.type !== 'initials'\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 isFieldFullyAcknowledged={isFieldFullyAcknowledged}\r\n onAcknowledgementRequired={onAcknowledgementRequired}\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","import { useState, useEffect } from 'react';\nimport type { EsignFormField } from '../types';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '../lib/ui/dialog';\nimport { Button } from '../lib/ui/button';\nimport { Checkbox } from '../lib/ui/checkbox';\nimport { Label } from '../lib/ui/label';\nimport { AlertCircle } from 'lucide-react';\nimport { cn } from '../lib/utils';\n\nexport interface AcknowledgementModalProps {\n /** Whether the modal is open */\n open: boolean;\n /** Callback when modal close is requested */\n onOpenChange: (open: boolean) => void;\n /** The field with acknowledgements to display */\n field: EsignFormField | null;\n /** Callback when an acknowledgement item is checked/unchecked */\n onAcknowledge: (fieldId: string, ackId: string) => void;\n /** Check if an acknowledgement is already acknowledged */\n isAcknowledged: (fieldId: string, ackId: string) => boolean;\n /** Callback when all acknowledgements are acknowledged */\n onComplete?: (fieldId: string) => void;\n}\n\n/**\n * Modal that displays acknowledgements for a field\n * Requires explicit acceptance before allowing field interaction\n */\nexport function AcknowledgementModal({\n open,\n onOpenChange,\n field,\n onAcknowledge,\n isAcknowledged,\n onComplete,\n}: AcknowledgementModalProps) {\n const [localChecked, setLocalChecked] = useState<Set<string>>(new Set());\n\n // Reset local state when field changes or modal opens\n useEffect(() => {\n if (open && field && field.acknowledgements) {\n const alreadyAcknowledged = new Set(\n field.acknowledgements\n .filter(ack => isAcknowledged(field.id, ack.id))\n .map(ack => ack.id)\n );\n setLocalChecked(alreadyAcknowledged);\n }\n }, [open, field, isAcknowledged]);\n\n if (!field || !field.acknowledgements || !Array.isArray(field.acknowledgements) || field.acknowledgements.length === 0) {\n return null;\n }\n\n const allChecked = field.acknowledgements.every(ack => localChecked.has(ack.id));\n\n const handleCheckboxChange = (ackId: string, checked: boolean) => {\n setLocalChecked(prev => {\n const newSet = new Set(prev);\n if (checked) {\n newSet.add(ackId);\n } else {\n newSet.delete(ackId);\n }\n return newSet;\n });\n };\n\n const handleAcknowledgeAll = () => {\n // Mark all as checked locally\n const allIds = new Set(field.acknowledgements!.map(ack => ack.id));\n setLocalChecked(allIds);\n\n // Acknowledge all in parent state\n field.acknowledgements!.forEach(ack => {\n if (!isAcknowledged(field.id, ack.id)) {\n onAcknowledge(field.id, ack.id);\n }\n });\n\n // Call completion callback and close modal\n onComplete?.(field.id);\n onOpenChange(false);\n };\n\n const handleClose = () => {\n // Only close if all are acknowledged\n if (allChecked) {\n // Sync local state to parent\n field.acknowledgements!.forEach(ack => {\n if (localChecked.has(ack.id) && !isAcknowledged(field.id, ack.id)) {\n onAcknowledge(field.id, ack.id);\n }\n });\n\n onComplete?.(field.id);\n onOpenChange(false);\n }\n };\n\n const handleCancel = () => {\n // Reset local state and close without saving\n onOpenChange(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={(newOpen) => {\n if (!newOpen) {\n handleCancel();\n }\n }}>\n <DialogContent className=\"max-w-2xl max-h-[80vh] flex flex-col\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2 text-xl\">\n <AlertCircle className=\"h-5 w-5 text-orange-600\" />\n Acknowledgements Required\n </DialogTitle>\n <DialogDescription className=\"text-base\">\n Please review and acknowledge the following before interacting with this field:\n <span className=\"font-semibold block mt-1\">{field.label || field.name}</span>\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex-1 overflow-y-auto space-y-4 py-4\">\n {field.acknowledgements.map((ack, index) => {\n const checked = localChecked.has(ack.id);\n return (\n <div\n key={ack.id}\n className={cn(\n \"p-4 border rounded-lg transition-colors\",\n checked\n ? \"border-green-500 bg-green-50 dark:bg-green-950/20\"\n : \"border-border bg-muted/30\"\n )}\n >\n <div className=\"flex items-start gap-3\">\n <Checkbox\n id={`ack-${ack.id}`}\n checked={checked}\n onCheckedChange={(isChecked) =>\n handleCheckboxChange(ack.id, isChecked === true)\n }\n className=\"mt-1\"\n />\n <div className=\"flex-1\">\n <Label\n htmlFor={`ack-${ack.id}`}\n className=\"text-base font-semibold cursor-pointer\"\n >\n {index + 1}. {ack.title}\n </Label>\n {ack.description && (\n <p className=\"text-sm text-muted-foreground mt-2 whitespace-pre-wrap\">\n {ack.description}\n </p>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n <DialogFooter className=\"flex-row justify-end gap-2 sm:gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleCancel}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={handleAcknowledgeAll}\n disabled={allChecked && field.acknowledgements.every(ack => isAcknowledged(field.id, ack.id))}\n className=\"min-w-[140px]\"\n >\n {allChecked ? 'Continue' : 'Acknowledge All'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n","import { useState, useEffect } from 'react';\r\nimport type { EsignFormField } from '../types';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../lib/ui/dialog';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Checkbox } from '../lib/ui/checkbox';\r\nimport { Label } from '../lib/ui/label';\r\nimport { AlertCircle, ChevronDown, CheckCircle2, Clock } from 'lucide-react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface UnacknowledgedFieldInfo {\r\n field: EsignFormField;\r\n unacknowledgedCount: number;\r\n}\r\n\r\nexport interface UnacknowledgedFieldsModalProps {\r\n /** Whether the modal is open */\r\n open: boolean;\r\n /** Callback when modal close is requested */\r\n onOpenChange: (open: boolean) => void;\r\n /** List of fields with unacknowledged items */\r\n unacknowledgedFields: UnacknowledgedFieldInfo[];\r\n /** Callback when an acknowledgement item is checked */\r\n onAcknowledge: (fieldId: string, ackId: string) => void;\r\n /** Check if an acknowledgement is already acknowledged */\r\n isAcknowledged: (fieldId: string, ackId: string) => boolean;\r\n}\r\n\r\n/**\r\n * Modal that displays all fields with unacknowledged items\r\n * Uses accordion UI to allow inline acknowledgement without opening separate modals\r\n */\r\nexport function UnacknowledgedFieldsModal({\r\n open,\r\n onOpenChange,\r\n unacknowledgedFields,\r\n onAcknowledge,\r\n isAcknowledged,\r\n}: UnacknowledgedFieldsModalProps) {\r\n const [expandedItem, setExpandedItem] = useState<string>('');\r\n const [isManuallyClosing, setIsManuallyClosing] = useState(false);\r\n\r\n // Auto-expand first field when modal opens\r\n useEffect(() => {\r\n if (open && unacknowledgedFields.length > 0 && expandedItem === '') {\r\n const firstField = unacknowledgedFields[0];\r\n if (firstField) {\r\n setExpandedItem(firstField.field.id);\r\n }\r\n }\r\n }, [open, unacknowledgedFields, expandedItem]);\r\n\r\n // Auto-close if all acknowledgements are complete (but not if manually closing)\r\n useEffect(() => {\r\n if (open && unacknowledgedFields.length === 0 && !isManuallyClosing) {\r\n onOpenChange(false);\r\n }\r\n }, [open, unacknowledgedFields.length, onOpenChange, isManuallyClosing]);\r\n\r\n const handleCheckboxChange = (fieldId: string, ackId: string, checked: boolean) => {\r\n if (checked) {\r\n onAcknowledge(fieldId, ackId);\r\n\r\n // Check if this field is now fully acknowledged\r\n const fieldInfo = unacknowledgedFields.find(f => f.field.id === fieldId);\r\n if (fieldInfo && fieldInfo.field.acknowledgements) {\r\n const allAcknowledged = fieldInfo.field.acknowledgements.every(ack =>\r\n ack.id === ackId || isAcknowledged(fieldId, ack.id)\r\n );\r\n\r\n if (allAcknowledged) {\r\n // Collapse current and expand next unacknowledged\r\n const currentIndex = unacknowledgedFields.findIndex(f => f.field.id === fieldId);\r\n const nextUnacknowledged = unacknowledgedFields[currentIndex + 1];\r\n\r\n if (nextUnacknowledged) {\r\n setTimeout(() => {\r\n setExpandedItem(nextUnacknowledged.field.id);\r\n }, 300);\r\n } else {\r\n // All done, modal will auto-close via useEffect\r\n setTimeout(() => setExpandedItem(''), 300);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const toggleExpanded = (fieldId: string) => {\r\n setExpandedItem(prev => prev === fieldId ? '' : fieldId);\r\n };\r\n\r\n const handleAcknowledgeAll = async () => {\r\n setIsManuallyClosing(true);\r\n\r\n // Acknowledge all items for all fields\r\n unacknowledgedFields.forEach(({ field }) => {\r\n if (field.acknowledgements) {\r\n field.acknowledgements.forEach(ack => {\r\n if (!isAcknowledged(field.id, ack.id)) {\r\n onAcknowledge(field.id, ack.id);\r\n }\r\n });\r\n }\r\n });\r\n\r\n // Wait for state updates to propagate before closing\r\n // This ensures the parent component sees the updated acknowledgement state\r\n await new Promise(resolve => setTimeout(resolve, 150));\r\n\r\n // Close modal after acknowledgements have been processed\r\n onOpenChange(false);\r\n setIsManuallyClosing(false);\r\n };\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-2xl max-h-[80vh] flex flex-col\">\r\n <DialogHeader>\r\n <DialogTitle className=\"flex items-center gap-2 text-xl\">\r\n <AlertCircle className=\"h-5 w-5 text-orange-600\" />\r\n Acknowledgements Required\r\n </DialogTitle>\r\n <DialogDescription className=\"text-base\">\r\n The following fields require acknowledgements before you can submit this document.\r\n Review and check each acknowledgement below.\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <div className=\"flex-1 overflow-y-auto space-y-3 py-4\">\r\n {unacknowledgedFields.map(({ field }) => {\r\n if (!field.acknowledgements) return null;\r\n\r\n const isExpanded = expandedItem === field.id;\r\n const totalCount = field.acknowledgements.length;\r\n const acknowledgedCount = field.acknowledgements.filter(ack =>\r\n isAcknowledged(field.id, ack.id)\r\n ).length;\r\n const isFullyAcknowledged = acknowledgedCount === totalCount;\r\n const isPartiallyAcknowledged = acknowledgedCount > 0 && acknowledgedCount < totalCount;\r\n\r\n let StatusIcon = AlertCircle;\r\n let statusColor = 'text-orange-600';\r\n let borderColor = 'border-orange-500';\r\n\r\n if (isFullyAcknowledged) {\r\n StatusIcon = CheckCircle2;\r\n statusColor = 'text-green-600';\r\n borderColor = 'border-green-500';\r\n } else if (isPartiallyAcknowledged) {\r\n StatusIcon = Clock;\r\n statusColor = 'text-blue-600';\r\n borderColor = 'border-blue-500';\r\n }\r\n\r\n return (\r\n <div\r\n key={field.id}\r\n className={cn('border rounded-lg', borderColor)}\r\n >\r\n {/* Header/Trigger */}\r\n <button\r\n onClick={() => toggleExpanded(field.id)}\r\n className=\"w-full px-4 py-3 flex items-center gap-3 text-left hover:bg-muted/50 transition-colors\"\r\n type=\"button\"\r\n >\r\n <StatusIcon className={cn('h-5 w-5 flex-shrink-0', statusColor)} />\r\n <span className=\"flex-1 text-base font-semibold line-clamp-1\">\r\n {field.label || field.name}\r\n </span>\r\n <span className=\"text-sm text-muted-foreground bg-muted px-2.5 py-1 rounded-full flex-shrink-0\">\r\n {acknowledgedCount}/{totalCount}\r\n </span>\r\n <ChevronDown\r\n className={cn(\r\n 'h-5 w-5 flex-shrink-0 transition-transform duration-200',\r\n isExpanded && 'rotate-180'\r\n )}\r\n />\r\n </button>\r\n\r\n {/* Content */}\r\n {isExpanded && (\r\n <div className=\"px-4 pb-4 space-y-3 pt-1\">\r\n {field.acknowledgements.map((ack, index) => {\r\n const checked = isAcknowledged(field.id, ack.id);\r\n return (\r\n <div\r\n key={ack.id}\r\n className={cn(\r\n 'p-3 border rounded-md transition-colors',\r\n checked\r\n ? 'border-green-500 bg-green-50 dark:bg-green-950/20'\r\n : 'border-border bg-background'\r\n )}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <Checkbox\r\n id={`modal-ack-${field.id}-${ack.id}`}\r\n checked={checked}\r\n onCheckedChange={(isChecked) =>\r\n handleCheckboxChange(field.id, ack.id, isChecked === true)\r\n }\r\n className=\"mt-1\"\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <Label\r\n htmlFor={`modal-ack-${field.id}-${ack.id}`}\r\n className=\"text-sm font-semibold cursor-pointer block\"\r\n >\r\n {index + 1}. {ack.title}\r\n </Label>\r\n {ack.description && (\r\n <p className=\"text-sm text-muted-foreground mt-2 whitespace-pre-wrap\">\r\n {ack.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <DialogFooter className=\"flex-row justify-between gap-2 sm:gap-2\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={() => onOpenChange(false)}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n onClick={handleAcknowledgeAll}\r\n disabled={unacknowledgedFields.length === 0}\r\n >\r\n Acknowledge All & Continue\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { EsignFormField } from '../types';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '../lib/ui/card';\r\nimport { Checkbox } from '../lib/ui/checkbox';\r\nimport { Label } from '../lib/ui/label';\r\nimport { AlertCircle, CheckCircle2, Clock, ChevronDown } from 'lucide-react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface AcknowledgementsSidebarProps {\r\n /** Fields that have acknowledgements */\r\n fields: EsignFormField[];\r\n /** Callback when an acknowledgement item is checked */\r\n onAcknowledge: (fieldId: string, ackId: string) => void;\r\n /** Check if an acknowledgement is already acknowledged */\r\n isAcknowledged: (fieldId: string, ackId: string) => boolean;\r\n /** Get progress for a field */\r\n getProgress: (fieldId: string) => { current: number; total: number };\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Sidebar section for acknowledging all field acknowledgements\r\n * Displays fields with acknowledgements and allows batch acknowledgement\r\n */\r\nexport function AcknowledgementsSidebar({\r\n fields,\r\n onAcknowledge,\r\n isAcknowledged,\r\n getProgress,\r\n className = '',\r\n}: AcknowledgementsSidebarProps) {\r\n const [expandedItem, setExpandedItem] = useState<string>('');\r\n\r\n // Filter fields that have acknowledgements - with safety checks\r\n const fieldsWithAcknowledgements = fields.filter(\r\n field => field?.acknowledgements && Array.isArray(field.acknowledgements) && field.acknowledgements.length > 0\r\n );\r\n\r\n // Auto-expand first unacknowledged field on mount\r\n useEffect(() => {\r\n if (fieldsWithAcknowledgements.length === 0) return;\r\n \r\n if (expandedItem === '' && fieldsWithAcknowledgements.length > 0) {\r\n const firstUnacknowledged = fieldsWithAcknowledgements.find(field => {\r\n const progress = getProgress(field.id);\r\n return progress.current < progress.total;\r\n });\r\n\r\n if (firstUnacknowledged) {\r\n setExpandedItem(firstUnacknowledged.id);\r\n }\r\n }\r\n }, [fieldsWithAcknowledgements, getProgress, expandedItem]);\r\n\r\n if (fieldsWithAcknowledgements.length === 0) {\r\n return null;\r\n }\r\n\r\n const handleCheckboxChange = (fieldId: string, ackId: string, checked: boolean) => {\r\n if (checked) {\r\n onAcknowledge(fieldId, ackId);\r\n\r\n // Check if this field is now fully acknowledged\r\n const field = fieldsWithAcknowledgements.find(f => f.id === fieldId);\r\n if (field && field.acknowledgements) {\r\n const allAcknowledged = field.acknowledgements.every(ack =>\r\n ack.id === ackId || isAcknowledged(fieldId, ack.id)\r\n );\r\n\r\n if (allAcknowledged) {\r\n // Collapse current and expand next unacknowledged\r\n const currentIndex = fieldsWithAcknowledgements.findIndex(f => f.id === fieldId);\r\n const nextUnacknowledged = fieldsWithAcknowledgements\r\n .slice(currentIndex + 1)\r\n .find(f => {\r\n const progress = getProgress(f.id);\r\n return progress.current < progress.total;\r\n });\r\n\r\n if (nextUnacknowledged) {\r\n setTimeout(() => {\r\n setExpandedItem(nextUnacknowledged.id);\r\n }, 300);\r\n } else {\r\n // All done, collapse current\r\n setTimeout(() => setExpandedItem(''), 300);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const toggleExpanded = (fieldId: string) => {\r\n setExpandedItem(prev => prev === fieldId ? '' : fieldId);\r\n };\r\n\r\n return (\r\n <Card className={cn('mb-4', className)}>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-base flex items-center gap-2\">\r\n <AlertCircle className=\"h-4 w-4 text-orange-600\" />\r\n Acknowledgements\r\n </CardTitle>\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n Review and acknowledge before signing\r\n </p>\r\n </CardHeader>\r\n <CardContent className=\"pt-0 px-0\">\r\n <div className=\"space-y-2 px-0\">\r\n {fieldsWithAcknowledgements.map((field) => {\r\n const progress = getProgress(field.id);\r\n const isFullyAcknowledged = progress.current === progress.total;\r\n const isPartiallyAcknowledged = progress.current > 0 && progress.current < progress.total;\r\n const isExpanded = expandedItem === field.id;\r\n\r\n let StatusIcon = AlertCircle;\r\n let statusColor = 'text-orange-600';\r\n let borderColor = 'border-orange-500';\r\n\r\n if (isFullyAcknowledged) {\r\n StatusIcon = CheckCircle2;\r\n statusColor = 'text-green-600';\r\n borderColor = 'border-green-500';\r\n } else if (isPartiallyAcknowledged) {\r\n StatusIcon = Clock;\r\n statusColor = 'text-blue-600';\r\n borderColor = 'border-blue-500';\r\n }\r\n\r\n return (\r\n <div\r\n key={field.id}\r\n className={cn('border rounded-lg', borderColor)}\r\n data-field-ack-id={field.id}\r\n >\r\n {/* Header/Trigger */}\r\n <button\r\n onClick={() => toggleExpanded(field.id)}\r\n className=\"w-full px-3 py-3 flex items-center gap-2 text-left hover:bg-muted/50 transition-colors\"\r\n type=\"button\"\r\n >\r\n <StatusIcon className={cn('h-4 w-4 flex-shrink-0', statusColor)} />\r\n <span className=\"flex-1 text-sm font-medium line-clamp-1\">\r\n {field.label || field.name}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground bg-muted px-2 py-0.5 rounded-full flex-shrink-0\">\r\n {progress.current}/{progress.total}\r\n </span>\r\n <ChevronDown \r\n className={cn(\r\n 'h-4 w-4 flex-shrink-0 transition-transform duration-200',\r\n isExpanded && 'rotate-180'\r\n )} \r\n />\r\n </button>\r\n\r\n {/* Content */}\r\n {isExpanded && (\r\n <div className=\"px-3 pb-3 space-y-3 pt-2\">\r\n {field.acknowledgements!.map((ack, index) => {\r\n const checked = isAcknowledged(field.id, ack.id);\r\n return (\r\n <div\r\n key={ack.id}\r\n className={cn(\r\n 'p-3 border rounded-md transition-colors',\r\n checked\r\n ? 'border-green-500 bg-green-50 dark:bg-green-950/20'\r\n : 'border-border bg-background'\r\n )}\r\n >\r\n <div className=\"flex items-start gap-2\">\r\n <Checkbox\r\n id={`sidebar-ack-${field.id}-${ack.id}`}\r\n checked={checked}\r\n onCheckedChange={(isChecked) =>\r\n handleCheckboxChange(field.id, ack.id, isChecked === true)\r\n }\r\n className=\"mt-1\"\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <Label\r\n htmlFor={`sidebar-ack-${field.id}-${ack.id}`}\r\n className=\"text-sm font-semibold cursor-pointer block\"\r\n >\r\n {index + 1}. {ack.title}\r\n </Label>\r\n {ack.description && (\r\n <p className=\"text-xs text-muted-foreground mt-1.5 whitespace-pre-wrap\">\r\n {ack.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\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';\nimport type { PdfViewerRef, EsignFormField, MultiSignerContext } from '../types';\nimport {\n extractVisibleFormFields,\n fillPdfWithSignatures,\n validatePdfFormFields,\n urlToPdfBytes,\n createPdfBlobUrl,\n logger,\n validatePdfUrl,\n validateFieldValues,\n validateSignatures,\n PdfValidationError,\n PdfProcessingError,\n initializePdfJs,\n} from '../utils';\nimport { filterPdfForCurrentSigner } from '../utils/pdf-viewer-filter';\nimport { loadPdfLib } from '../utils/pdf-lib-loader';\n\n/**\n * Hook to manage PDF viewer state and operations with multi-signer support\n * \n * @param multiSignerContext - Multi-signer context (from useMultiSignerContext)\n */\nexport function usePdfViewer(\n multiSignerContext?: MultiSignerContext\n) {\n const viewerRef = useRef<PdfViewerRef>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isLoaded, setIsLoaded] = useState(false);\n const [pdfUrl, setPdfUrl] = useState<string | null>(null);\n \n // CRITICAL: Store both original and viewer PDF bytes\n // Original PDF has ALL fields (used for submission/flattening)\n // Viewer PDF has only current signer's fields (used for display)\n const [originalPdfBytes, setOriginalPdfBytes] = useState<Uint8Array | null>(null);\n const [_viewerPdfBytes, setViewerPdfBytes] = useState<Uint8Array | null>(null);\n const [extractedFields, setExtractedFields] = useState<EsignFormField[]>([]);\n\n const loadPdf = useCallback(async (url: string) => {\n setIsLoading(true);\n setError(null);\n setIsLoaded(false);\n setPdfUrl(url);\n\n try {\n // Initialize PDF.js configuration (lazy, only runs once)\n // This ensures the worker is configured before any PDF operations\n initializePdfJs();\n \n // Validate URL format\n const urlValidation = validatePdfUrl(url);\n if (!urlValidation.valid) {\n throw new PdfValidationError(urlValidation.error || 'Invalid PDF URL');\n }\n\n // Load PDF bytes for processing\n const bytes = await urlToPdfBytes(url);\n \n // Store as original PDF (with ALL fields)\n setOriginalPdfBytes(bytes);\n setViewerPdfBytes(bytes); // Initially same as original\n \n // Load PDF in viewer\n await viewerRef.current?.loadPdf(url);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to load PDF';\n logger.error('Error loading PDF:', err);\n setError(errorMessage);\n setOriginalPdfBytes(null);\n setViewerPdfBytes(null);\n }\n }, []);\n\n const handleLoad = useCallback(() => {\n setIsLoading(false);\n setIsLoaded(true);\n setError(null);\n }, []);\n\n const handleError = useCallback((errorMessage: string) => {\n setIsLoading(false);\n setIsLoaded(false);\n setError(errorMessage);\n }, []);\n\n const getFormFieldValues = useCallback(async () => {\n if (!viewerRef.current) {\n return {};\n }\n return await viewerRef.current.getFormFieldValues();\n }, []);\n\n const setFormFieldValues = useCallback(async (values: Record<string, string>) => {\n if (!viewerRef.current) {\n return;\n }\n return await viewerRef.current.setFormFieldValues(values);\n }, []);\n\n const getAllFieldNames = useCallback(async () => {\n if (!viewerRef.current) {\n return [];\n }\n return await viewerRef.current.getAllFieldNames();\n }, []);\n\n const saveDocument = useCallback(async () => {\n if (!viewerRef.current) {\n return null;\n }\n return await viewerRef.current.saveDocument();\n }, []);\n\n /**\n * Extract form fields from the current PDF\n * If multi-signer, creates a filtered PDF for the viewer\n */\n const extractFormFields = useCallback(\n async (currentSignerEmail?: string) => {\n if (!originalPdfBytes) {\n throw new Error('No PDF loaded');\n }\n\n try {\n \n // Extract fields from original PDF (with ALL fields)\n const fields = await extractVisibleFormFields(\n originalPdfBytes, \n currentSignerEmail\n );\n setExtractedFields(fields);\n \n\n // If multi-signer mode, create a filtered PDF for the viewer\n if (multiSignerContext?.isMultiSigner) {\n \n // Create filtered PDF with other signers' fields removed\n const filteredBytes = await filterPdfForCurrentSigner(\n originalPdfBytes,\n fields,\n multiSignerContext\n );\n \n setViewerPdfBytes(filteredBytes);\n \n // Reload viewer with filtered PDF\n const filteredBlobUrl = createPdfBlobUrl(filteredBytes);\n await viewerRef.current?.loadPdf(filteredBlobUrl);\n \n } else {\n \n // Single-signer mode: call filterPdfForCurrentSigner to draw labels\n // (it will skip filtering but draw labels)\n const labeledBytes = await filterPdfForCurrentSigner(\n originalPdfBytes,\n fields,\n multiSignerContext || { \n isMultiSigner: false,\n currentSigner: null,\n currentSignerEmail: '', \n isPrimarySigner: true, \n isFinalSigner: true \n }\n );\n \n setViewerPdfBytes(labeledBytes);\n \n // Reload viewer with labeled PDF\n const labeledBlobUrl = createPdfBlobUrl(labeledBytes);\n await viewerRef.current?.loadPdf(labeledBlobUrl);\n \n }\n \n // Inject placeholders into PDF.js viewer (after reload if filtered)\n if (viewerRef.current && fields.length > 0) {\n // Small delay to ensure viewer has loaded\n await new Promise(resolve => setTimeout(resolve, 100));\n viewerRef.current.injectPlaceholders(fields);\n }\n \n return fields;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to extract form fields';\n throw new Error(errorMessage);\n }\n },\n [originalPdfBytes, multiSignerContext]\n );\n\n /**\n * Fill the PDF with form values and signatures, then return the filled PDF bytes\n * CRITICAL: Always uses originalPdfBytes (with ALL fields) for proper flattening\n */\n const fillPdf = useCallback(\n async (\n fieldValues: Record<string, string>,\n signatures: Record<string, string>,\n currentSignerEmail?: string,\n metadata?: { submissionId?: string; documentId?: string; author?: string; signerEmail?: string; signerInitials?: string; createdAt?: Date },\n auditTrail?: { userAgent?: string; screenResolution?: string; timezone?: string; language?: string; platform?: string; ipAddress?: string; geolocation?: { latitude: number; longitude: number; accuracy?: number } }\n ): Promise<Uint8Array> => {\n if (!originalPdfBytes) {\n throw new PdfProcessingError('No PDF loaded');\n }\n\n try {\n // Validate inputs\n const valuesValidation = validateFieldValues(fieldValues);\n if (!valuesValidation.valid) {\n logger.warn('Field values validation warnings:', valuesValidation.errors);\n // Don't throw - allow submission with warnings\n }\n\n const sigsValidation = validateSignatures(signatures);\n if (!sigsValidation.valid) {\n logger.warn('Signatures validation warnings:', sigsValidation.errors);\n // Don't throw - allow submission with warnings\n }\n\n const filledPdfBytes = await fillPdfWithSignatures(\n originalPdfBytes, // CRITICAL: Use original PDF with ALL fields\n signatures,\n fieldValues,\n currentSignerEmail,\n extractedFields, // Pass extracted fields for proper signature filtering\n metadata,\n auditTrail,\n multiSignerContext // Pass multi-signer context for partial flattening\n );\n return filledPdfBytes;\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fill PDF';\n logger.error('Error filling PDF:', err);\n throw new PdfProcessingError(errorMessage, err);\n }\n },\n [originalPdfBytes, extractedFields, multiSignerContext]\n );\n\n /**\n * Validate that all required fields are filled\n */\n const validatePdf = useCallback(\n async (\n fieldValues: Record<string, string>,\n signatures: Record<string, string>,\n visibleFields?: EsignFormField[] // Optional: pass filtered fields for multi-signer validation\n ): Promise<{ isValid: boolean; errors: string[] }> => {\n if (!originalPdfBytes) {\n throw new Error('No PDF loaded');\n }\n\n try {\n // Use visibleFields if provided (for multi-signer), otherwise use extractedFields\n const fieldsToValidate = visibleFields || extractedFields;\n const errors = await validatePdfFormFields(\n originalPdfBytes, \n fieldValues, \n signatures,\n fieldsToValidate, // Pass visible/filtered fields for validation\n multiSignerContext // Pass multi-signer context for validation filtering\n );\n return {\n isValid: errors.length === 0,\n errors,\n };\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to validate PDF';\n throw new Error(errorMessage);\n }\n },\n [originalPdfBytes, extractedFields, multiSignerContext]\n );\n\n /**\n * Get required field status from PDF metadata using pdf-lib\n * Returns a map of field names to their required status\n */\n const getRequiredFieldsMap = useCallback(async (): Promise<Record<string, boolean>> => {\n if (!originalPdfBytes) {\n return {};\n }\n\n try {\n const { PDFDocument } = await loadPdfLib();\n const pdfDoc = await PDFDocument.load(originalPdfBytes);\n const form = pdfDoc.getForm();\n const fields = form.getFields();\n\n const requiredMap: Record<string, boolean> = {};\n for (const field of fields) {\n const fieldName = field.getName();\n const isRequired = field.isRequired();\n requiredMap[fieldName] = isRequired;\n }\n\n return requiredMap;\n } catch (err) {\n logger.error('Failed to get required fields map:', err);\n return {};\n }\n }, [originalPdfBytes]);\n\n /**\n * Get the current PDF bytes (original with ALL fields)\n */\n const getCurrentPdfBytes = useCallback(() => {\n return originalPdfBytes;\n }, [originalPdfBytes]);\n\n /**\n * Reload the PDF with new bytes (for preview after filling)\n */\n const reloadPdfWithBytes = useCallback(\n async (newPdfBytes: Uint8Array) => {\n try {\n // Create a blob URL from the new PDF bytes\n const blobUrl = createPdfBlobUrl(newPdfBytes);\n \n // Update state\n setOriginalPdfBytes(newPdfBytes);\n setViewerPdfBytes(newPdfBytes);\n setPdfUrl(blobUrl);\n \n // Reload in viewer\n await viewerRef.current?.loadPdf(blobUrl);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to reload PDF';\n setError(errorMessage);\n }\n },\n []\n );\n\n /**\n * Reset the hook state\n */\n const reset = useCallback(() => {\n setIsLoading(false);\n setError(null);\n setIsLoaded(false);\n setPdfUrl(null);\n setOriginalPdfBytes(null);\n setViewerPdfBytes(null);\n setExtractedFields([]);\n }, []);\n\n return {\n // Ref and state\n viewerRef,\n isLoading,\n error,\n isLoaded,\n pdfUrl,\n pdfBytes: originalPdfBytes, // Expose as pdfBytes for backward compatibility\n extractedFields,\n \n // Basic operations\n loadPdf,\n handleLoad,\n handleError,\n getFormFieldValues,\n setFormFieldValues,\n getAllFieldNames,\n saveDocument,\n \n // Enhanced operations\n extractFormFields,\n fillPdf,\n validatePdf,\n getRequiredFieldsMap,\n getCurrentPdfBytes,\n reloadPdfWithBytes,\n reset,\n };\n}\n\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 // State for collected signatures (for auto-placement)\r\n const [collectedSignature, setCollectedSignature] = useState<string | null>(null);\r\n const [collectedInitials, setCollectedInitials] = useState<string | null>(null);\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 /**\r\n * Collect a signature or initials for auto-placement\r\n */\r\n const collectSignature = useCallback((type: 'signature' | 'initials', dataUrl: string) => {\r\n if (type === 'signature') {\r\n setCollectedSignature(dataUrl);\r\n } else {\r\n setCollectedInitials(dataUrl);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Check if we have a collected signature or initials\r\n */\r\n const hasCollectedSignature = useCallback((type: 'signature' | 'initials'): boolean => {\r\n return type === 'signature'\r\n ? collectedSignature !== null\r\n : collectedInitials !== null;\r\n }, [collectedSignature, collectedInitials]);\r\n\r\n /**\r\n * Get the collected signature or initials\r\n */\r\n const getCollectedSignature = useCallback((type: 'signature' | 'initials'): string | null => {\r\n return type === 'signature' ? collectedSignature : collectedInitials;\r\n }, [collectedSignature, collectedInitials]);\r\n\r\n /**\r\n * Clear collected signatures\r\n */\r\n const clearCollectedSignatures = useCallback(() => {\r\n setCollectedSignature(null);\r\n setCollectedInitials(null);\r\n }, []);\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 // Auto-place functionality\r\n collectSignature,\r\n hasCollectedSignature,\r\n getCollectedSignature,\r\n clearCollectedSignatures,\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 // EXCEPTION: Keep ALL signature/initials fields (they need visual indicators even without acknowledgements)\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 // Keep ALL signature/initials fields (for acknowledgements AND visual indicators)\r\n // Previously we only kept fields with acknowledgements, but fields without acknowledgements\r\n // also need to be tracked so they can show visual indicators when signed\r\n if (field.type === 'signature' || field.type === 'initials') {\r\n return true;\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, useCallback, useMemo } from 'react';\r\nimport type { EsignFormField, Acknowledgement } from '../types';\r\n\r\ninterface AcknowledgementProgress {\r\n current: number;\r\n total: number;\r\n}\r\n\r\ninterface UnacknowledgedFieldDetail {\r\n field: EsignFormField;\r\n unacknowledgedItems: Acknowledgement[];\r\n}\r\n\r\ninterface UseAcknowledgementsReturn {\r\n acknowledgeItem: (fieldId: string, ackId: string) => void;\r\n isAcknowledged: (fieldId: string, ackId?: string) => boolean;\r\n isFieldFullyAcknowledged: (fieldId: string) => boolean;\r\n getFieldAcknowledgementProgress: (fieldId: string) => AcknowledgementProgress;\r\n acknowledgeAllForField: (fieldId: string) => void;\r\n getFieldsWithAcknowledgements: (fields: EsignFormField[]) => EsignFormField[];\r\n hasUnacknowledgedFields: (fields: EsignFormField[]) => boolean;\r\n getUnacknowledgedFields: (fields: EsignFormField[]) => EsignFormField[];\r\n getUnacknowledgedFieldsDetailed: (fields: EsignFormField[]) => UnacknowledgedFieldDetail[];\r\n resetAcknowledgements: () => void;\r\n}\r\n\r\n/**\r\n * Hook for managing acknowledgement state across form fields\r\n * \r\n * Tracks which acknowledgements have been accepted by the signer.\r\n * Acknowledgements are field-level requirements that must be explicitly\r\n * accepted before the field can be interacted with or submitted.\r\n * \r\n * State is stored in memory and resets on component unmount/page refresh.\r\n * \r\n * @param fields - Array of form fields that may contain acknowledgements\r\n * @returns Object with acknowledgement state management functions\r\n * \r\n * @example\r\n * ```tsx\r\n * const {\r\n * acknowledgeItem,\r\n * isFieldFullyAcknowledged,\r\n * hasUnacknowledgedFields\r\n * } = useAcknowledgements(fields);\r\n * \r\n * // Check if field can be submitted\r\n * if (hasUnacknowledgedFields(fields)) {\r\n * // Show acknowledgement modal\r\n * }\r\n * ```\r\n */\r\nexport function useAcknowledgements(\r\n fields: EsignFormField[]\r\n): UseAcknowledgementsReturn {\r\n // Map of fieldId -> Set of acknowledged acknowledgement IDs\r\n const [acknowledgedMap, setAcknowledgedMap] = useState<Map<string, Set<string>>>(\r\n new Map()\r\n );\r\n\r\n // Get all fields that have acknowledgements\r\n const getFieldsWithAcknowledgements = useCallback((fieldsToFilter: EsignFormField[]) => {\r\n return fieldsToFilter.filter(\r\n field => field.acknowledgements && field.acknowledgements.length > 0\r\n );\r\n }, []);\r\n\r\n // Acknowledge a specific acknowledgement item for a field\r\n const acknowledgeItem = useCallback((fieldId: string, ackId: string) => {\r\n setAcknowledgedMap(prev => {\r\n const newMap = new Map(prev);\r\n const fieldAcks = newMap.get(fieldId) || new Set<string>();\r\n fieldAcks.add(ackId);\r\n newMap.set(fieldId, fieldAcks);\r\n return newMap;\r\n });\r\n }, []);\r\n\r\n // Check if a specific acknowledgement or all acknowledgements are acknowledged\r\n const isAcknowledged = useCallback((fieldId: string, ackId?: string) => {\r\n const fieldAcks = acknowledgedMap.get(fieldId);\r\n if (!fieldAcks) return false;\r\n \r\n if (ackId) {\r\n return fieldAcks.has(ackId);\r\n }\r\n \r\n // If no ackId provided, check if any are acknowledged\r\n return fieldAcks.size > 0;\r\n }, [acknowledgedMap]);\r\n\r\n // Check if all acknowledgements for a field are acknowledged\r\n const isFieldFullyAcknowledged = useCallback((fieldId: string) => {\r\n const field = fields.find(f => f.id === fieldId);\r\n if (!field || !field.acknowledgements || field.acknowledgements.length === 0) {\r\n return true; // No acknowledgements means fully acknowledged\r\n }\r\n\r\n const fieldAcks = acknowledgedMap.get(fieldId);\r\n if (!fieldAcks) return false;\r\n\r\n return field.acknowledgements.every(ack => fieldAcks.has(ack.id));\r\n }, [fields, acknowledgedMap]);\r\n\r\n // Get acknowledgement progress for a field\r\n const getFieldAcknowledgementProgress = useCallback((fieldId: string): AcknowledgementProgress => {\r\n const field = fields.find(f => f.id === fieldId);\r\n if (!field || !field.acknowledgements || field.acknowledgements.length === 0) {\r\n return { current: 0, total: 0 };\r\n }\r\n\r\n const fieldAcks = acknowledgedMap.get(fieldId) || new Set<string>();\r\n return {\r\n current: fieldAcks.size,\r\n total: field.acknowledgements.length\r\n };\r\n }, [fields, acknowledgedMap]);\r\n\r\n // Acknowledge all acknowledgements for a field\r\n const acknowledgeAllForField = useCallback((fieldId: string) => {\r\n const field = fields.find(f => f.id === fieldId);\r\n if (!field || !field.acknowledgements) return;\r\n\r\n setAcknowledgedMap(prev => {\r\n const newMap = new Map(prev);\r\n const allAckIds = new Set(field.acknowledgements!.map(ack => ack.id));\r\n newMap.set(fieldId, allAckIds);\r\n return newMap;\r\n });\r\n }, [fields]);\r\n\r\n // Check if there are any unacknowledged fields\r\n const hasUnacknowledgedFields = useCallback((fieldsToCheck: EsignFormField[]) => {\r\n const fieldsWithAcks = getFieldsWithAcknowledgements(fieldsToCheck);\r\n return fieldsWithAcks.some(field => !isFieldFullyAcknowledged(field.id));\r\n }, [getFieldsWithAcknowledgements, isFieldFullyAcknowledged]);\r\n\r\n // Get list of fields that have unacknowledged items\r\n const getUnacknowledgedFields = useCallback((fieldsToCheck: EsignFormField[]) => {\r\n const fieldsWithAcks = getFieldsWithAcknowledgements(fieldsToCheck);\r\n return fieldsWithAcks.filter(field => !isFieldFullyAcknowledged(field.id));\r\n }, [getFieldsWithAcknowledgements, isFieldFullyAcknowledged]);\r\n\r\n // Get detailed information about fields with unacknowledged items\r\n const getUnacknowledgedFieldsDetailed = useCallback((fieldsToCheck: EsignFormField[]) => {\r\n return fieldsToCheck\r\n .filter(field => field.acknowledgements && field.acknowledgements.length > 0)\r\n .map(field => ({\r\n field,\r\n unacknowledgedItems: field.acknowledgements!.filter(\r\n ack => !isAcknowledged(field.id, ack.id)\r\n )\r\n }))\r\n .filter(({ unacknowledgedItems }) => unacknowledgedItems.length > 0);\r\n }, [isAcknowledged]);\r\n\r\n // Reset all acknowledgements (for testing or form reset)\r\n const resetAcknowledgements = useCallback(() => {\r\n setAcknowledgedMap(new Map());\r\n }, []);\r\n\r\n return {\r\n acknowledgeItem,\r\n isAcknowledged,\r\n isFieldFullyAcknowledged,\r\n getFieldAcknowledgementProgress,\r\n acknowledgeAllForField,\r\n getFieldsWithAcknowledgements,\r\n hasUnacknowledgedFields,\r\n getUnacknowledgedFields,\r\n getUnacknowledgedFieldsDetailed,\r\n resetAcknowledgements,\r\n };\r\n}\r\n\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport type { EsignFormField } from '../types';\r\n\r\nexport interface UseRequiredFieldNavigationReturn {\r\n requiredFields: EsignFormField[];\r\n hasRequiredFields: boolean;\r\n currentRequiredField: EsignFormField | null;\r\n currentRequiredIndex: number;\r\n goToNextRequired: () => EsignFormField | null;\r\n goToPreviousRequired: () => EsignFormField | null;\r\n requiredFieldCount: number;\r\n}\r\n\r\n/**\r\n * Hook for navigating through required fields only\r\n * Provides next/previous navigation that cycles through required fields\r\n */\r\nexport function useRequiredFieldNavigation(\r\n fields: EsignFormField[]\r\n): UseRequiredFieldNavigationReturn {\r\n const [currentRequiredIndex, setCurrentRequiredIndex] = useState(0);\r\n\r\n // Get only required fields (excluding sidebar-only fields)\r\n const requiredFields = useMemo(() => {\r\n return fields.filter(f => {\r\n // Exclude sidebar-only signature/initials fields\r\n if (f.id === 'signature_field_main' || f.id === 'initials_field_main') {\r\n return false;\r\n }\r\n return f.required;\r\n });\r\n }, [fields]);\r\n\r\n const hasRequiredFields = requiredFields.length > 0;\r\n\r\n // Navigate to next required field\r\n const goToNextRequired = useCallback((): EsignFormField | null => {\r\n if (!hasRequiredFields) return null;\r\n\r\n const nextIndex = (currentRequiredIndex + 1) % requiredFields.length;\r\n setCurrentRequiredIndex(nextIndex);\r\n return requiredFields[nextIndex] || null;\r\n }, [currentRequiredIndex, requiredFields, hasRequiredFields]);\r\n\r\n // Navigate to previous required field\r\n const goToPreviousRequired = useCallback((): EsignFormField | null => {\r\n if (!hasRequiredFields) return null;\r\n\r\n const prevIndex = currentRequiredIndex === 0\r\n ? requiredFields.length - 1\r\n : currentRequiredIndex - 1;\r\n setCurrentRequiredIndex(prevIndex);\r\n return requiredFields[prevIndex] || null;\r\n }, [currentRequiredIndex, requiredFields, hasRequiredFields]);\r\n\r\n // Get current required field\r\n const currentRequiredField = useMemo(() => {\r\n if (!hasRequiredFields) return null;\r\n return requiredFields[currentRequiredIndex] || null;\r\n }, [requiredFields, currentRequiredIndex, hasRequiredFields]);\r\n\r\n return {\r\n requiredFields,\r\n hasRequiredFields,\r\n currentRequiredField,\r\n currentRequiredIndex,\r\n goToNextRequired,\r\n goToPreviousRequired,\r\n requiredFieldCount: requiredFields.length\r\n };\r\n}\r\n","import { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport type { EsignFormField, SubmissionData, DocumentMetadata, AuditTrailMetadata, Signer } from '../types';\nimport { PdfViewerStyled } from './PdfViewerStyled';\nimport { SignatureModalCore } from './SignatureModal';\nimport { InitialsModal } from './InitialsModal';\nimport { SignatureInitialsBox } from './SignatureInitialsBox';\nimport { FormFieldRenderer } from './form-fields';\nimport { EditableFieldsPanel } from './EditableFieldsPanel';\nimport { AttachmentUpload } from './AttachmentUpload';\nimport { SigningInstructions } from './SigningInstructions';\nimport { PoweredBySigniphi } from './PoweredBySigniphi';\nimport { ViewToggleToolbar } from './ViewToggleToolbar';\nimport { FormFieldsView, type FormFieldsViewRef } from './FormFieldsView';\nimport { AcknowledgementModal } from './AcknowledgementModal';\nimport { UnacknowledgedFieldsModal } from './UnacknowledgedFieldsModal';\nimport { AcknowledgementsSidebar } from './AcknowledgementsSidebar';\nimport type { ViewMode } from './ViewToggleToolbar';\nimport { usePdfViewer, useFormFields, useSignatures, useFieldFiltering, useAttachments, useMultiSignerContext, useAcknowledgements } from '../hooks';\nimport { useRequiredFieldNavigation } from '../hooks/useRequiredFieldNavigation';\nimport { captureAuditTrail } from '../utils/audit-trail';\nimport { Button } from '../lib/ui/button';\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../lib/ui/card';\nimport { Alert, AlertDescription, AlertTitle } from '../lib/ui/alert';\nimport { cn } from '../lib/utils';\nimport { AlertCircle, CheckCircle, FileText, Loader2 } from 'lucide-react';\nimport { logger, parseAndValidateDate, trackDocumentSignedSilent } from '../utils';\n\nexport interface SubmissionFormProps {\n /** URL of the PDF to load */\n pdfUrl: string;\n \n // Multi-signer support (simplified API)\n /** Current signer information (enables multi-signer mode) */\n currentSigner?: Signer;\n /** Whether this is a multi-signer document */\n isMultipleSignature?: boolean;\n /** Total number of signers (for determining if current is final) */\n totalSigners?: number;\n \n // Backward compatibility\n /** Email of the current signer (for multi-signer filtering) - DEPRECATED: use currentSigner instead */\n currentSignerEmail?: string;\n \n /** Document title to display above the PDF viewer */\n documentTitle?: string;\n /** HTML string with signing instructions (supports p, ul, li, strong, em, a, br tags) */\n signingInstructions?: string;\n /** Show \"Powered by signiphi\" branding (default: true) */\n showPoweredBy?: boolean;\n /** Custom message to display at the top */\n customMessage?: string;\n /** Callback when form is submitted */\n onSubmit: (data: SubmissionData) => Promise<void>;\n /** Callback when user cancels */\n onCancel?: () => void;\n /** Read-only mode (preview only) */\n readOnly?: boolean;\n /** Custom className for the container */\n className?: string;\n /** Show PDF viewer (default: true) */\n showPdfViewer?: boolean;\n /** Custom form fields (if not extracted from PDF) */\n customFormFields?: EsignFormField[];\n /** Show editable fields panel for debugging/future enhancement (default: false) */\n showEditableFields?: boolean;\n /** Show full fields sidebar with all form fields (default: false) */\n showFullFieldsSidebar?: boolean;\n /** Where to place the signature/initials box: 'top', 'bottom', or 'none' (default: 'top') */\n signatureBoxPlacement?: 'top' | 'bottom' | 'none';\n /** Enable file attachments (default: false) */\n enableAttachments?: boolean;\n /** Maximum number of attachments (default: 10) */\n maxAttachments?: number;\n \n // Usage tracking (API key integration)\n /** API key for automatic usage tracking (enables tracking on submit) */\n apiKey?: string;\n /** Custom tracking API endpoint (defaults to https://api.signiphi.ai) */\n trackingEndpoint?: string;\n /** Document ID for tracking correlation */\n documentId?: string;\n}\n\nexport function SubmissionForm({\n pdfUrl,\n currentSigner,\n isMultipleSignature,\n totalSigners,\n currentSignerEmail, // Backward compatibility\n documentTitle,\n signingInstructions,\n showPoweredBy = true,\n customMessage,\n onSubmit,\n onCancel,\n readOnly = false,\n className = '',\n showPdfViewer = true,\n customFormFields,\n showEditableFields = false,\n showFullFieldsSidebar = false,\n signatureBoxPlacement = 'top',\n enableAttachments = false,\n maxAttachments = 10,\n apiKey,\n trackingEndpoint,\n documentId,\n}: SubmissionFormProps) {\n // Multi-signer context (Phase 1: Calculate context)\n const multiSignerContext = useMultiSignerContext(\n currentSigner,\n isMultipleSignature,\n totalSigners\n );\n\n // Effective signer email for backward compatibility\n const effectiveSignerEmail = multiSignerContext.currentSignerEmail || currentSignerEmail;\n\n // PDF viewer state (Phase 2: Pass context to PDF viewer)\n const {\n viewerRef,\n isLoading: isPdfLoading,\n error: pdfError,\n isLoaded: isPdfLoaded,\n loadPdf,\n handleLoad: handlePdfLoad,\n handleError: handlePdfError,\n extractFormFields,\n fillPdf,\n validatePdf,\n getFormFieldValues,\n setFormFieldValues,\n extractedFields,\n } = usePdfViewer(multiSignerContext);\n\n // Form state\n const {\n fieldValues,\n setFieldValue,\n validateFields,\n getFieldError,\n isFieldTouched,\n clearFields,\n } = useFormFields();\n\n // Signature state\n const {\n signatures,\n setSignature: setSignatureOriginal,\n validateSignatures,\n hasSignature,\n collectSignature,\n hasCollectedSignature,\n getCollectedSignature,\n } = useSignatures();\n\n // Keep stable references to avoid stale closures in validation/submit\n const signaturesRef = useRef(signatures);\n const fieldValuesRef = useRef(fieldValues);\n\n useEffect(() => {\n signaturesRef.current = signatures;\n }, [signatures]);\n\n useEffect(() => {\n fieldValuesRef.current = fieldValues;\n }, [fieldValues]);\n\n // Field filtering (Phase 3: Pass context to field filtering)\n const formFields = customFormFields || extractedFields;\n const { filteredFields, isFieldVisible } = useFieldFiltering(formFields, multiSignerContext);\n\n // Acknowledgement state (must come after filteredFields is defined)\n const {\n acknowledgeItem: acknowledgeItemOriginal,\n isAcknowledged,\n isFieldFullyAcknowledged,\n getFieldAcknowledgementProgress,\n acknowledgeAllForField,\n getFieldsWithAcknowledgements,\n hasUnacknowledgedFields,\n getUnacknowledgedFields,\n getUnacknowledgedFieldsDetailed,\n } = useAcknowledgements(filteredFields);\n\n // Required field navigation (must come after filteredFields is defined)\n const {\n hasRequiredFields,\n currentRequiredField,\n currentRequiredIndex,\n goToNextRequired,\n goToPreviousRequired,\n requiredFieldCount,\n } = useRequiredFieldNavigation(filteredFields);\n\n // Acknowledgement modal state\n const [acknowledgementModalOpen, setAcknowledgementModalOpen] = useState(false);\n const [currentAcknowledgementField, setCurrentAcknowledgementField] = useState<EsignFormField | null>(null);\n const [unacknowledgedModalOpen, setUnacknowledgedModalOpen] = useState(false);\n\n // Helper to get PDF field names that should show indicators\n // Memoized to avoid expensive filtering on every render\n // Returns comma-separated list of fieldIds (UUIDs) for fields that can show indicators\n const realPdfFieldsByType = useMemo(() => {\n return {\n signature: filteredFields.filter(f => \n f.type === 'signature' && \n f.id !== 'signature_field_main'\n ),\n initials: filteredFields.filter(f => \n f.type === 'initials' && \n f.id !== 'initials_field_main'\n )\n };\n }, [filteredFields]);\n\n const getPdfFieldNamesForIndicators = useCallback((fieldType: 'signature' | 'initials'): string => {\n // Get all REAL PDF fields (not the synthetic _main fields) - pre-filtered\n const realPdfFields = realPdfFieldsByType[fieldType];\n\n console.log(`[SubmissionForm] Total filteredFields count:`, filteredFields.length);\n console.log(`[SubmissionForm] All ${fieldType} in filteredFields (including _main):`, filteredFields.filter(f =>\n f.type === fieldType || f.id.toLowerCase().includes(fieldType)\n ).map(f => ({\n id: f.id,\n fieldId: f.fieldId,\n hasAcks: !!f.acknowledgements?.length,\n })));\n\n console.log(`[SubmissionForm] Real PDF ${fieldType} fields (excluding _main):`, realPdfFields.map(f => ({\n id: f.id,\n fieldId: f.fieldId,\n name: f.name,\n hasAcks: !!f.acknowledgements?.length,\n ackCount: f.acknowledgements?.length || 0\n })));\n\n // Filter to only fields that can show indicators\n const fieldsToIndicate = realPdfFields.filter(field => {\n if (!field.acknowledgements || field.acknowledgements.length === 0) {\n console.log(`[SubmissionForm] Field ${field.id} has NO acks - CAN show indicator`);\n return true; // No acks - can show\n }\n const isFullyAcked = isFieldFullyAcknowledged(field.id);\n console.log(`[SubmissionForm] Field ${field.id} has acks - fully acknowledged? ${isFullyAcked}`);\n return isFullyAcked; // Has acks - can show if fully acked\n });\n\n // Return comma-separated fieldIds (UUIDs) from PDF metadata\n const result = fieldsToIndicate.map(f => f.fieldId).join(',');\n console.log(`[SubmissionForm] Allowed fieldIds (UUIDs) for ${fieldType} indicators:`, result);\n console.log(`[SubmissionForm] Fields that will show indicators:`, fieldsToIndicate.map(f => ({\n id: f.id,\n fieldId: f.fieldId,\n name: f.name\n })));\n\n return result;\n }, [realPdfFieldsByType, filteredFields, isFieldFullyAcknowledged]);\n\n // Helper to refresh indicators for a given field type\n // Track pending indicator updates to prevent blinking\n const indicatorUpdateTimers = useRef<Map<string, NodeJS.Timeout>>(new Map());\n\n // Unified function to add/update indicator for any field type\n // Debounced to prevent blinking on rapid updates\n /**\n * Update field indicator based on acknowledgement status and field value\n * \n * Field Indicator System - Three-state visual feedback:\n * - 'info' (gray 'i'): Field has acknowledgements but is unfilled\n * - 'pending-ack' (amber '!'): Field is filled but needs acknowledgement\n * - 'completed' (green '✓'): Field is filled AND fully acknowledged\n * \n * Indicators only appear for fields with acknowledgements.\n * Updates are debounced (200ms) to prevent flickering during rapid state changes.\n * \n * @param fieldId - The ID of the field to update indicator for\n */\n const updateFieldIndicator = useCallback((fieldId: string) => {\n // Clear any pending update for this field to prevent duplicate updates\n const existingTimer = indicatorUpdateTimers.current.get(fieldId);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Schedule the update with debouncing\n const timer = setTimeout(() => {\n const field = filteredFields.find(f => f.id === fieldId);\n if (!field || !viewerRef.current?.addFieldIndicator) {\n return;\n }\n\n // Special handling for signature_field_main and initials_field_main:\n // These are synthetic sidebar fields that collect signatures/initials\n // But acknowledgements are on the REAL PDF fields (signature_1767..., initials_1767...)\n // So we need to check if ANY real PDF field of this type has acknowledgements\n if (fieldId === 'signature_field_main' || fieldId === 'initials_field_main') {\n const fieldType = field.type; // 'signature' or 'initials'\n \n // Find all real PDF fields of this type (not the _main synthetic field)\n const realPdfFields = filteredFields.filter(f => \n f.type === fieldType && \n f.id !== fieldId && \n f.id !== 'signature_field_main' && \n f.id !== 'initials_field_main'\n );\n \n // Check if ANY of the real PDF fields have acknowledgements\n const anyFieldHasAcks = realPdfFields.some(f => f.acknowledgements && f.acknowledgements.length > 0);\n \n if (!anyFieldHasAcks) {\n // No real PDF fields have acknowledgements - no indicator needed\n viewerRef.current?.removeFieldIndicator(field.name);\n logger.info(`[FIELD INDICATOR] No acks on any real PDF ${fieldType} fields for ${field.id}, removing indicator`, {\n fieldName: field.name,\n hasValue: true,\n realFieldsCount: realPdfFields.length\n });\n indicatorUpdateTimers.current.delete(fieldId);\n return;\n }\n \n // At least one real PDF field has acknowledgements\n // Check if ALL fields with acknowledgements are fully acknowledged\n const allAcknowledged = realPdfFields\n .filter(f => f.acknowledgements && f.acknowledgements.length > 0)\n .every(f => isFieldFullyAcknowledged(f.id));\n \n const indicatorType = allAcknowledged ? 'completed' : 'pending-ack';\n const allowedFieldIds = getPdfFieldNamesForIndicators(fieldType === 'signature' ? 'signature' : 'initials');\n \n try {\n viewerRef.current?.addFieldIndicator(field.name, indicatorType, allowedFieldIds);\n logger.info(`[FIELD INDICATOR] Added ${indicatorType} indicator for field: ${field.id} (checked real PDF fields)`, {\n fieldName: field.name,\n hasValue: true,\n realFieldsCount: realPdfFields.length,\n anyFieldHasAcks,\n allAcknowledged\n });\n } catch (error) {\n logger.error(`[FIELD INDICATOR] Failed to add ${indicatorType} indicator for ${field.id}:`, error);\n }\n \n indicatorUpdateTimers.current.delete(fieldId);\n return;\n }\n\n // For regular fields (non-synthetic), use the standard logic\n // Determine if field has a value\n // Special case: For signature/initials fields (not _main), check if signature_field_main has a value\n // because signatures/initials are collected once in the sidebar and applied to all fields\n let hasValue: boolean;\n if (field.type === 'signature' && fieldId !== 'signature_field_main') {\n // Real PDF signature field - check if signature_field_main has a signature\n hasValue = hasSignature('signature_field_main');\n } else if (field.type === 'initials' && fieldId !== 'initials_field_main') {\n // Real PDF initials field - check if initials_field_main has a value\n hasValue = !!(fieldValues['initials_field_main'] && String(fieldValues['initials_field_main']).trim() !== '');\n } else {\n // Regular field or _main field - check its own value\n hasValue = field.type === 'signature'\n ? hasSignature(field.id)\n : !!(fieldValues[field.id] && String(fieldValues[field.id]).trim() !== '');\n }\n\n // HYBRID APPROACH: Show different indicators based on state\n const hasAcknowledgements = field.acknowledgements && field.acknowledgements.length > 0;\n \n if (!hasValue && !hasAcknowledgements) {\n // No value, no acknowledgements - no indicator needed\n viewerRef.current?.removeFieldIndicator(field.name);\n logger.info(`[FIELD INDICATOR] No value or acks for ${field.id}, removing indicator`);\n indicatorUpdateTimers.current.delete(fieldId);\n return;\n }\n \n if (!hasValue && hasAcknowledgements) {\n // No value BUT has acknowledgements - show subtle info indicator\n // For signature_field_main and initials_field_main, get the allowed PDF field IDs\n let allowedFieldIds: string | undefined = undefined;\n if (fieldId === 'signature_field_main' || fieldId === 'initials_field_main') {\n const fieldType = fieldId === 'signature_field_main' ? 'signature' : 'initials';\n allowedFieldIds = getPdfFieldNamesForIndicators(fieldType);\n }\n \n try {\n viewerRef.current?.addFieldIndicator(field.name, 'info', allowedFieldIds);\n logger.info(`[FIELD INDICATOR] Added info indicator (unfilled + has acks): ${field.id}`, {\n fieldName: field.name,\n ackCount: field.acknowledgements?.length\n });\n } catch (error) {\n logger.error(`[FIELD INDICATOR] Failed to add info indicator for ${field.id}:`, error);\n }\n \n indicatorUpdateTimers.current.delete(fieldId);\n return;\n }\n\n // Field has value - only show indicator if it has acknowledgements\n if (!hasAcknowledgements) {\n // Has value but NO acknowledgements - no indicator needed\n viewerRef.current?.removeFieldIndicator(field.name);\n logger.info(`[FIELD INDICATOR] Field has value but no acks for ${field.id}, removing indicator`);\n indicatorUpdateTimers.current.delete(fieldId);\n return;\n }\n \n // Field has value AND acknowledgements - determine indicator type\n const isAcknowledged = isFieldFullyAcknowledged(field.id);\n const indicatorType = isAcknowledged ? 'completed' : 'pending-ack';\n\n // For signature_field_main and initials_field_main, get the allowed PDF field IDs\n let allowedFieldIds: string | undefined = undefined;\n if (fieldId === 'signature_field_main' || fieldId === 'initials_field_main') {\n const fieldType = fieldId === 'signature_field_main' ? 'signature' : 'initials';\n allowedFieldIds = getPdfFieldNamesForIndicators(fieldType);\n }\n\n // Add/update indicator with error handling\n try {\n viewerRef.current?.addFieldIndicator(field.name, indicatorType, allowedFieldIds);\n logger.info(`[FIELD INDICATOR] Added ${indicatorType} indicator for field: ${field.id}`, {\n fieldName: field.name,\n hasValue,\n hasAcks: true,\n isAcknowledged\n });\n } catch (error) {\n logger.error(`[FIELD INDICATOR] Failed to add ${indicatorType} indicator for ${field.id}:`, error);\n }\n \n indicatorUpdateTimers.current.delete(fieldId);\n }, 200); // Increased debounce delay to ensure React state updates are complete\n\n indicatorUpdateTimers.current.set(fieldId, timer);\n }, [filteredFields, fieldValues, hasSignature, isFieldFullyAcknowledged, viewerRef, getPdfFieldNamesForIndicators]);\n\n // Wrapper for acknowledgeItem that refreshes indicators after acknowledgement\n const acknowledgeItem = useCallback((fieldId: string, ackId: string) => {\n acknowledgeItemOriginal(fieldId, ackId);\n\n // Refresh indicator for this field (debounced internally)\n updateFieldIndicator(fieldId);\n }, [acknowledgeItemOriginal, updateFieldIndicator]);\n\n // Wrapper for setSignature that also updates visual indicator\n const setSignature = useCallback((fieldId: string, dataUrl: string) => {\n // Set the signature data\n setSignatureOriginal(fieldId, dataUrl);\n\n // Update indicator using the unified debounced function\n // This will check acknowledgements and show the correct indicator type\n updateFieldIndicator(fieldId);\n }, [setSignatureOriginal, updateFieldIndicator]);\n\n // Attachments\n const {\n attachments,\n isUploading: isUploadingAttachments,\n validationErrors: attachmentErrors,\n addFiles,\n removeAttachment,\n formatSize,\n validateAll: validateAttachments,\n } = useAttachments({\n constraints: {\n maxFiles: maxAttachments,\n },\n onError: (errors) => {\n setValidationErrors(prev => [...prev, ...errors]);\n },\n });\n\n // Modal state - SEPARATE modals for signature and initials\n const [signatureModalOpen, setSignatureModalOpen] = useState(false);\n const [currentSignatureField, setCurrentSignatureField] = useState<EsignFormField | null>(null);\n const [initialsModalOpen, setInitialsModalOpen] = useState(false);\n const [currentInitialsField, setCurrentInitialsField] = useState<EsignFormField | null>(null);\n\n // Submission state\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [validationErrors, setValidationErrors] = useState<string[]>([]);\n \n // Editable fields panel state\n const [editableFieldsCollapsed, setEditableFieldsCollapsed] = useState(true);\n \n // View mode state (PDF view or Form view)\n const [viewMode, setViewMode] = useState<ViewMode>('pdf');\n \n // Form fields view ref for navigation\n const formFieldsViewRef = useRef<FormFieldsViewRef>(null);\n\n // Load PDF on mount\n useEffect(() => {\n if (pdfUrl) {\n loadPdf(pdfUrl);\n }\n }, [pdfUrl, loadPdf]);\n\n // Extract form fields after PDF loads\n useEffect(() => {\n if (isPdfLoaded && !customFormFields) {\n // Only pass signer email in multi-signer mode for proper field assignment filtering\n // In single-signer mode, pass undefined so ALL initials fields are included\n const signerEmailForExtraction = multiSignerContext.isMultiSigner ? effectiveSignerEmail : undefined;\n extractFormFields(signerEmailForExtraction).catch((error) => {\n logger.error('Failed to extract form fields:', error);\n });\n }\n }, [isPdfLoaded, effectiveSignerEmail, extractFormFields, customFormFields, multiSignerContext.isMultiSigner]);\n\n // Note: Mousedown listeners are now set up in the click interceptor useEffect below\n // with a 500ms timeout to ensure PDF fields are fully rendered\n\n // Auto-refresh all field indicators when PDF loads and when field values or acknowledgements change\n useEffect(() => {\n if (!isPdfLoaded || !viewerRef.current) {\n return;\n }\n\n logger.info('[FIELD INDICATOR] Auto-refreshing all field indicators');\n\n // Refresh indicators for ALL fields (not just ones with values)\n // This enables the hybrid approach: show info icons for unfilled fields with acks\n // Use a longer delay to ensure all data (acknowledgements, field values) is ready\n const timeoutId = setTimeout(() => {\n filteredFields.forEach(field => {\n // Skip synthetic main fields (handled by the effect below)\n if (field.id === 'signature_field_main' || field.id === 'initials_field_main') {\n return;\n }\n\n // Update indicator for every field (hybrid logic handles empty fields)\n updateFieldIndicator(field.id);\n });\n }, 700); // Increased delay to ensure all data is ready before showing indicators\n\n return () => clearTimeout(timeoutId);\n }, [isPdfLoaded, filteredFields, updateFieldIndicator, viewerRef]);\n\n // Separately handle signature/initials indicators when they're added\n // Use a longer delay to ensure acknowledgement state is fully synced\n useEffect(() => {\n if (!isPdfLoaded || !viewerRef.current) {\n return;\n }\n\n // Delay indicator updates for signature/initials to prevent showing wrong state\n const timeoutId = setTimeout(() => {\n if (signatures['signature_field_main']) {\n updateFieldIndicator('signature_field_main');\n }\n if (fieldValues['initials_field_main']) {\n updateFieldIndicator('initials_field_main');\n }\n }, 250); // Delay to ensure state is synced\n\n return () => clearTimeout(timeoutId);\n }, [signatures, fieldValues, updateFieldIndicator, isPdfLoaded, viewerRef]); // Removed fieldValues and hasSignature to prevent re-runs on every change\n\n // Listen for PDF field changes and update indicators in real-time\n useEffect(() => {\n if (!isPdfLoaded || !viewerRef.current || viewMode !== 'pdf') {\n return;\n }\n\n const iframe = document.querySelector('iframe');\n if (!iframe?.contentDocument) {\n return;\n }\n\n const doc = iframe.contentDocument;\n\n // Create a handler that syncs PDF field changes to React and updates indicators\n const handlePdfFieldChange = async (event: Event) => {\n const target = event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n \n // Get the field name from the element\n const fieldName = target.getAttribute('name') || target.getAttribute('data-element-id') || '';\n if (!fieldName) return;\n\n // Find the corresponding field in filteredFields\n let field = filteredFields.find(f => f.fieldId === fieldName);\n if (!field) {\n field = filteredFields.find(f => f.id === fieldName);\n }\n if (!field) {\n field = filteredFields.find(f => f.name === fieldName);\n }\n\n if (field) {\n // Get the new value\n let value = '';\n if (target.tagName === 'INPUT') {\n const inputElement = target as HTMLInputElement;\n if (inputElement.type === 'checkbox') {\n value = inputElement.checked ? 'true' : 'false';\n } else if (inputElement.type === 'radio') {\n if (inputElement.checked) {\n value = inputElement.value || 'true';\n }\n } else {\n value = inputElement.value;\n }\n } else if (target.tagName === 'SELECT') {\n value = (target as HTMLSelectElement).value;\n } else if (target.tagName === 'TEXTAREA') {\n value = (target as HTMLTextAreaElement).value;\n }\n\n // Update React state\n setFieldValue(field.id, value);\n\n // Update indicator immediately\n logger.info(`[PDF FIELD CHANGE] Field ${field.id} changed to: \"${value}\"`);\n // Update indicator (debounced internally)\n updateFieldIndicator(field.id);\n }\n };\n\n // Attach listeners to all form fields in the PDF\n const formFields = doc.querySelectorAll('input, select, textarea');\n formFields.forEach(field => {\n field.addEventListener('change', handlePdfFieldChange);\n field.addEventListener('input', handlePdfFieldChange);\n });\n\n logger.info('[PDF FIELD CHANGE] Attached change listeners to', formFields.length, 'PDF form fields');\n\n // Cleanup\n return () => {\n formFields.forEach(field => {\n field.removeEventListener('change', handlePdfFieldChange);\n field.removeEventListener('input', handlePdfFieldChange);\n });\n };\n }, [isPdfLoaded, viewMode, filteredFields, setFieldValue, updateFieldIndicator]);\n\n // Log fields with acknowledgements when they change\n useEffect(() => {\n const fieldsWithAcks = filteredFields.filter(f => f.acknowledgements && f.acknowledgements.length > 0);\n if (fieldsWithAcks.length > 0) {\n logger.info('[FIELDS DEBUG] Fields with acknowledgements:', fieldsWithAcks.map(f => ({\n id: f.id,\n fieldId: f.fieldId,\n type: f.type,\n label: f.label,\n ackCount: f.acknowledgements?.length || 0,\n acks: f.acknowledgements\n })));\n } else {\n logger.info('[FIELDS DEBUG] No fields with acknowledgements found in filteredFields');\n }\n\n // Also log ALL signature/initials fields (to see if they're being extracted)\n const sigFields = filteredFields.filter(f => f.type === 'signature' || f.type === 'initials');\n logger.info('[FIELDS DEBUG] All signature/initials fields:', sigFields.map(f => ({\n id: f.id,\n fieldId: f.fieldId,\n type: f.type,\n ackCount: f.acknowledgements?.length || 0\n })));\n }, [filteredFields]);\n\n // Attach PDF field click interceptors for acknowledgement checking\n useEffect(() => {\n if (!isPdfLoaded || !viewerRef.current?.attachFieldClickInterceptors) {\n return;\n }\n\n // Add delay to ensure PDF.js has fully rendered the form fields\n const timeoutId = setTimeout(() => {\n viewerRef.current?.attachFieldClickInterceptors((fieldName) => {\n logger.info(`[PDF Click] Checking field: ${fieldName}`);\n logger.info(`[PDF Click] Available fields:`, filteredFields.map(f => ({ id: f.id, fieldId: f.fieldId, name: f.name, acks: f.acknowledgements?.length || 0 })));\n\n // PRIORITY 1: Try matching by fieldId (most reliable, immutable UUID)\n let field = filteredFields.find(f => f.fieldId === fieldName);\n\n // PRIORITY 2: Try matching by field ID\n if (!field) {\n field = filteredFields.find(f => f.id === fieldName);\n }\n\n // PRIORITY 3: Try matching by name (in case id differs from name)\n if (!field) {\n field = filteredFields.find(f => f.name === fieldName);\n }\n\n // PRIORITY 4: Try without suffixes (for date/signature/initials fields)\n if (!field) {\n const cleanFieldName = fieldName.replace(/_signature$|_initials$|_date$/i, '');\n field = filteredFields.find(f => f.fieldId === cleanFieldName || f.id === cleanFieldName || f.name === cleanFieldName);\n }\n\n if (!field) {\n logger.info(`[PDF Click] Field not found: ${fieldName}`);\n return true; // Unknown field, allow interaction\n }\n\n logger.info(`[PDF Click] Found field:`, { id: field.id, name: field.name, type: field.type, acks: field.acknowledgements?.length || 0 });\n\n // Special handling for signature/initials fields\n if (field.type === 'signature' || field.type === 'initials') {\n logger.info(`[PDF Click] Field is ${field.type}`);\n \n // Check if field has acknowledgements\n const hasAcknowledgements = field.acknowledgements && field.acknowledgements.length > 0;\n \n if (hasAcknowledgements) {\n // Has acknowledgements - check if fully acknowledged\n const isAcked = isFieldFullyAcknowledged(field.id);\n logger.info(`[PDF Click] ${field.type} field has acknowledgements, is fully acknowledged: ${isAcked}`);\n \n if (!isAcked) {\n // Block and show acknowledgement modal\n logger.info(`[PDF Click] Blocking ${field.type} field and showing acknowledgement modal`);\n setCurrentAcknowledgementField(field);\n setAcknowledgementModalOpen(true);\n return false;\n }\n }\n \n // Either no acknowledgements OR fully acknowledged - open signature/initials modal\n logger.info(`[PDF Click] Opening ${field.type} modal`);\n \n // Check if we already have a collected signature/initials\n const fieldType = field.type as 'signature' | 'initials';\n if (hasCollectedSignature(fieldType)) {\n // Auto-place the collected signature/initials\n const collected = getCollectedSignature(fieldType);\n if (collected) {\n logger.info(`[PDF Click] Auto-placing ${fieldType} for field ${field.id}`);\n // Signature = image (use setSignature), Initials = text (use setFieldValue)\n if (field.type === 'signature') {\n setSignature(field.id, collected);\n } else if (field.type === 'initials') {\n setFieldValue(field.id, collected);\n }\n // Update indicator for this field (debounced internally)\n updateFieldIndicator(field.id);\n }\n } else {\n // First time - open the CORRECT modal based on field type\n logger.info(`[PDF Click] Opening ${fieldType} modal to collect`);\n if (field.type === 'signature') {\n setCurrentSignatureField(field);\n setSignatureModalOpen(true);\n } else if (field.type === 'initials') {\n setCurrentInitialsField(field);\n setInitialsModalOpen(true);\n }\n }\n \n // Clear navigation highlights\n try {\n const iframe = document.querySelector('iframe');\n if (iframe?.contentDocument) {\n const navigationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field');\n navigationHighlights.forEach(el => el.classList.remove('active-required-field'));\n const navigationAnnotationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field-annotation');\n navigationAnnotationHighlights.forEach(el => el.classList.remove('active-required-field-annotation'));\n logger.info('[PDF Click] Cleared navigation highlights');\n }\n } catch (error) {\n logger.warn('[PDF Click] Failed to clear navigation highlights:', error);\n }\n \n return false; // Block default PDF interaction (we're handling it with our modal)\n }\n\n // For non-signature/initials fields, check acknowledgements\n let shouldBlock = false;\n \n // Check if field has acknowledgements\n if (!field.acknowledgements || field.acknowledgements.length === 0) {\n logger.info(`[PDF Click] Field has no acknowledgements`);\n shouldBlock = false;\n } else {\n // Check if fully acknowledged\n const isAcked = isFieldFullyAcknowledged(field.id);\n logger.info(`[PDF Click] Field is fully acknowledged: ${isAcked}`);\n shouldBlock = !isAcked;\n }\n\n // Clear navigation highlights ONLY when interaction is allowed (not blocked)\n if (!shouldBlock) {\n try {\n const iframe = document.querySelector('iframe');\n if (iframe?.contentDocument) {\n const navigationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field');\n navigationHighlights.forEach(el => el.classList.remove('active-required-field'));\n const navigationAnnotationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field-annotation');\n navigationAnnotationHighlights.forEach(el => el.classList.remove('active-required-field-annotation'));\n logger.info('[PDF Click] Cleared navigation highlights (interaction allowed)');\n }\n } catch (error) {\n logger.warn('[PDF Click] Failed to clear navigation highlights:', error);\n }\n }\n\n // If blocking, show modal\n if (shouldBlock) {\n logger.info(`[PDF Click] Blocking field and showing modal`);\n setCurrentAcknowledgementField(field);\n setAcknowledgementModalOpen(true);\n return false;\n }\n\n return true; // Allow interaction\n });\n }, 500); // 500ms delay to ensure fields are rendered\n\n return () => clearTimeout(timeoutId);\n }, [isPdfLoaded, filteredFields, isFieldFullyAcknowledged, hasCollectedSignature, getCollectedSignature, setSignature, setFieldValue, updateFieldIndicator]);\n\n // Track previous view mode to detect view switches\n const prevViewModeRef = useRef<ViewMode>(viewMode);\n \n // Sync field values ONLY when switching between PDF and Form views\n useEffect(() => {\n const syncFieldsOnViewChange = async () => {\n // Only sync if view mode actually changed\n if (prevViewModeRef.current === viewMode) {\n return;\n }\n \n if (!isPdfLoaded) {\n prevViewModeRef.current = viewMode;\n return;\n }\n\n try {\n // Capture current field values at sync time (avoid stale closure)\n const currentFieldValues = fieldValues;\n \n // Sync FROM PDF TO React when switching to Form view\n if (viewMode === 'form') {\n const pdfValues = await getFormFieldValues();\n const invalidDates: Array<{ fieldId: string; value: string; label?: string }> = [];\n \n // Merge PDF values into React state\n // For each PDF value, update React state if:\n // 1. The field exists in filteredFields (multi-signer compatibility)\n // 2. The value is different from current React state\n // 3. Skip signature/initials fields (stored separately)\n for (const field of filteredFields) {\n // Skip signature and initials fields - they're stored in signatures state\n if (field.type === 'signature' || field.type === 'initials') {\n continue;\n }\n\n const pdfValue = pdfValues[field.id];\n const currentReactValue = currentFieldValues[field.id];\n\n // Handle special field types\n let normalizedPdfValue = pdfValue;\n \n // Checkbox normalization: PDF.js may return \"Yes\"/\"No\" or boolean\n if (field.type === 'checkbox' && pdfValue !== undefined && pdfValue !== null) {\n const pdfValueStr = String(pdfValue);\n if (pdfValueStr === 'Yes' || pdfValueStr === 'true') {\n normalizedPdfValue = 'true';\n } else if (pdfValueStr === 'No' || pdfValueStr === 'false') {\n normalizedPdfValue = 'false';\n }\n }\n\n // Radio button handling: convert __RADIO_OPTION_INDEX_X__ to actual option value\n if (field.type === 'radio' && pdfValue && pdfValue.includes('__RADIO_OPTION_INDEX_')) {\n const match = pdfValue.match(/__RADIO_OPTION_INDEX_(\\d+)__/);\n if (match && match[1] && field.options) {\n const index = parseInt(match[1], 10);\n if (index >= 0 && index < field.options.length) {\n normalizedPdfValue = field.options[index];\n }\n }\n }\n\n // Date handling: validate and parse common formats\n if (field.type === 'date' && pdfValue) {\n const validation = parseAndValidateDate(pdfValue);\n if (!validation.isValid) {\n // Track invalid date\n invalidDates.push({\n fieldId: field.id,\n value: pdfValue,\n label: field.label,\n });\n // Still pass the value through so user can see what was entered\n normalizedPdfValue = pdfValue;\n } else if (validation.isoString) {\n // Use the parsed ISO string\n normalizedPdfValue = validation.isoString;\n }\n }\n\n // Text/Dropdown: pass through as-is\n\n // Update React state if PDF has a value and it's different from React\n if (normalizedPdfValue && normalizedPdfValue !== currentReactValue) {\n setFieldValue(field.id, normalizedPdfValue);\n }\n }\n\n // Show warning if invalid dates were detected\n if (invalidDates.length > 0) {\n logger.warn('Invalid dates detected during PDF → Form sync:', invalidDates);\n const fieldLabels = invalidDates\n .map((d) => d.label || d.fieldId)\n .join(', ');\n setValidationErrors((prev) => [\n ...prev,\n `${invalidDates.length} date field(s) contain invalid values (${fieldLabels}). Please review and correct them.`,\n ]);\n }\n }\n\n // Sync FROM React TO PDF when switching to PDF view\n if (viewMode === 'pdf') {\n const currentPdfValues = await getFormFieldValues();\n const valuesToSet: Record<string, string> = {};\n\n // For each field in filteredFields, push React state to PDF\n for (const field of filteredFields) {\n // Skip signature and initials fields - they're not in PDF form fields\n if (field.type === 'signature' || field.type === 'initials') {\n continue;\n }\n\n const reactValue = currentFieldValues[field.id];\n const pdfValue = currentPdfValues[field.id];\n\n // Handle special field types\n let valueToSet = reactValue;\n\n // Checkbox: convert to proper format for PDF.js\n if (field.type === 'checkbox' && reactValue) {\n // PDF.js expects boolean for checkboxes\n valueToSet = reactValue === 'true' ? 'true' : 'false';\n }\n\n // Radio buttons: convert option value to __RADIO_OPTION_INDEX_X__ format\n if (field.type === 'radio' && reactValue && field.options) {\n const optionIndex = field.options.indexOf(reactValue);\n if (optionIndex >= 0) {\n valueToSet = `__RADIO_OPTION_INDEX_${optionIndex}__`;\n } else {\n // If value doesn't match any option, skip this field\n logger.warn(`Radio button value \"${reactValue}\" not found in options for field ${field.id}`);\n valueToSet = '';\n }\n }\n\n // Date: pass through as-is (should be in YYYY-MM-DD format)\n // Text/Dropdown: pass through as-is\n\n // Priority: React state if filled, otherwise keep PDF value\n if (valueToSet && valueToSet.trim() !== '') {\n valuesToSet[field.id] = valueToSet;\n } else if (pdfValue && pdfValue.trim() !== '') {\n // Keep PDF value if React is empty\n valuesToSet[field.id] = pdfValue;\n }\n }\n\n // Set all values in one batch\n if (Object.keys(valuesToSet).length > 0) {\n await setFormFieldValues(valuesToSet);\n }\n }\n \n // Update ref after successful sync\n prevViewModeRef.current = viewMode;\n } catch (error) {\n logger.error('Error syncing field values on view change:', error);\n // Still update ref even on error to prevent infinite retries\n prevViewModeRef.current = viewMode;\n }\n };\n\n syncFieldsOnViewChange();\n }, [viewMode, isPdfLoaded, filteredFields, fieldValues, getFormFieldValues, setFormFieldValues, setFieldValue]);\n\n // Handle field change\n const handleFieldChange = useCallback(\n (fieldId: string, value: string) => {\n setFieldValue(fieldId, value);\n\n // Clear date validation errors from sidebar when a valid date is entered\n const field = filteredFields.find(f => f.id === fieldId);\n if (field && field.type === 'date' && value) {\n const validation = parseAndValidateDate(value);\n if (validation.isValid) {\n // Remove any date validation errors mentioning this field\n setValidationErrors((prev) =>\n prev.filter(error =>\n !error.includes('date field(s) contain invalid values') ||\n !(error.includes(field.label || fieldId))\n )\n );\n }\n }\n\n // Update field indicator (debounced internally)\n updateFieldIndicator(fieldId);\n },\n [setFieldValue, filteredFields, updateFieldIndicator]\n );\n\n // Handle acknowledgement required\n const handleAcknowledgementRequired = useCallback((field: EsignFormField) => {\n if (readOnly) return;\n setCurrentAcknowledgementField(field);\n setAcknowledgementModalOpen(true);\n }, [readOnly]);\n\n // Handle signature/initials click - assumes acknowledgements are already handled\n const handleSignatureClick = useCallback((field: EsignFormField) => {\n if (readOnly) return;\n\n logger.info(`[SIGNATURE CLICK] Field:`, {\n id: field.id,\n name: field.name,\n type: field.type,\n });\n\n const fieldType = field.type as 'signature' | 'initials';\n\n // Check if we already have a collected signature/initials\n if (hasCollectedSignature(fieldType)) {\n // Auto-place the collected signature/initials\n const collected = getCollectedSignature(fieldType);\n if (collected) {\n // Signature = image (use setSignature), Initials = text (use setFieldValue)\n if (field.type === 'signature') {\n setSignature(field.id, collected);\n } else if (field.type === 'initials') {\n setFieldValue(field.id, collected);\n }\n logger.info(`[SIGNATURE CLICK] Auto-placed ${fieldType} for field ${field.id}`);\n \n // Update indicator for this field (debounced internally)\n updateFieldIndicator(field.id);\n }\n } else {\n // First time - open the CORRECT modal based on field type\n logger.info(`[SIGNATURE CLICK] Opening ${fieldType} modal to collect`);\n\n if (field.type === 'signature') {\n setCurrentSignatureField(field);\n setSignatureModalOpen(true);\n } else if (field.type === 'initials') {\n setCurrentInitialsField(field);\n setInitialsModalOpen(true);\n }\n }\n }, [readOnly, hasCollectedSignature, getCollectedSignature, setSignature, setFieldValue, updateFieldIndicator]);\n\n // Handle required field navigation with intelligent interaction\n const navigateToRequiredField = useCallback(async (field: EsignFormField) => {\n if (!field) return;\n\n logger.info(`[REQUIRED NAV] Navigating to field:`, {\n id: field.id,\n name: field.name,\n type: field.type,\n page: field.position?.page,\n hasAcknowledgements: !!field.acknowledgements?.length,\n isAcknowledged: field.acknowledgements?.length ? isFieldFullyAcknowledged(field.id) : true\n });\n\n // Step 1: Navigate to the field's page in PDF viewer\n if (field.position?.page && viewerRef.current) {\n try {\n const currentPage = await viewerRef.current.getCurrentPage();\n if (currentPage !== field.position.page) {\n // Navigate to the page (PDF.js uses 1-indexed pages)\n const pdfApp = viewerRef.current.getPDFViewerApplication();\n if (pdfApp?.pdfViewer) {\n pdfApp.pdfViewer.currentPageNumber = field.position.page;\n logger.info(`[REQUIRED NAV] Navigated to page ${field.position.page}`);\n // Wait for page render\n await new Promise(resolve => setTimeout(resolve, 300));\n }\n }\n } catch (error) {\n logger.warn('[REQUIRED NAV] Failed to navigate to page:', error);\n }\n }\n\n // Step 1.5: Add visual highlight to the active field\n let highlightedFieldElement: HTMLElement | null = null;\n try {\n const iframe = document.querySelector('iframe');\n if (iframe?.contentDocument) {\n // Remove previous highlights\n const previousHighlights = iframe.contentDocument.querySelectorAll('.active-required-field');\n previousHighlights.forEach(el => el.classList.remove('active-required-field'));\n const previousAnnotationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field-annotation');\n previousAnnotationHighlights.forEach(el => el.classList.remove('active-required-field-annotation'));\n\n // Remove click highlights (navigation takes priority)\n const clickHighlights = iframe.contentDocument.querySelectorAll('.clicked-field');\n clickHighlights.forEach(el => el.classList.remove('clicked-field'));\n const clickAnnotationHighlights = iframe.contentDocument.querySelectorAll('.clicked-field-annotation');\n clickAnnotationHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\n logger.info('[REQUIRED NAV] Cleared click highlights');\n\n // Ensure CSS styles are present (defensive - also added in useEffect)\n const styleId = 'active-field-highlight-style';\n if (!iframe.contentDocument.getElementById(styleId)) {\n const style = iframe.contentDocument.createElement('style');\n style.id = styleId;\n style.textContent = `\n .active-required-field-annotation {\n outline: 3px solid #3b82f6 !important;\n outline-offset: 2px !important;\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4), 0 4px 12px rgba(59, 130, 246, 0.3) !important;\n animation: pulse-glow 2s ease-in-out infinite !important;\n z-index: 9999 !important;\n position: relative !important;\n border-radius: 4px !important;\n }\n input.active-required-field,\n select.active-required-field,\n textarea.active-required-field {\n border-color: #3b82f6 !important;\n background-color: rgba(59, 130, 246, 0.08) !important;\n }\n .clicked-field-annotation {\n outline: 2px solid #3b82f6 !important;\n outline-offset: 1px !important;\n box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15) !important;\n border-radius: 3px !important;\n z-index: 999 !important;\n position: relative !important;\n }\n .clicked-field {\n outline: none !important;\n border-color: #3b82f6 !important;\n background-color: rgba(59, 130, 246, 0.05) !important;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1) !important;\n }\n @keyframes pulse-glow {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4), 0 4px 12px rgba(59, 130, 246, 0.3);\n outline-offset: 2px;\n }\n 50% {\n box-shadow: 0 0 0 6px rgba(59, 130, 246, 0.2), 0 6px 16px rgba(59, 130, 246, 0.4);\n outline-offset: 3px;\n }\n }\n `;\n iframe.contentDocument.head.appendChild(style);\n logger.info('[REQUIRED NAV] Added CSS styles');\n }\n\n // Get PDF field name from metadata using fieldId\n let pdfFieldName = field.name; // Fallback to field name\n\n // Try to read metadata to get the correct PDF field name\n const pdfApp = viewerRef.current?.getPDFViewerApplication?.();\n if (pdfApp?.pdfDocument?.getData) {\n try {\n const pdfBytesRaw = await pdfApp.pdfDocument.getData();\n let pdfBytes: Uint8Array;\n\n if (pdfBytesRaw instanceof Uint8Array) {\n pdfBytes = pdfBytesRaw;\n } else if ((pdfBytesRaw as any)?.buffer instanceof ArrayBuffer) {\n const rawData = pdfBytesRaw as any;\n pdfBytes = new Uint8Array(rawData.buffer, rawData.byteOffset || 0, rawData.byteLength || rawData.length);\n } else {\n pdfBytes = new Uint8Array(pdfBytesRaw as any);\n }\n\n const { PDFDocument, PDFName } = await import('pdf-lib');\n const pdfLibDoc = await PDFDocument.load(pdfBytes);\n const infoRef = pdfLibDoc.context.trailerInfo.Info;\n\n if (infoRef) {\n const infoObj = pdfLibDoc.context.lookup(infoRef) as any;\n const metadataObj = infoObj?.get(PDFName.of('SigniphiMetadata'));\n\n if (metadataObj) {\n const signiphiMetadataStr = metadataObj.toString();\n let jsonStr = signiphiMetadataStr;\n const parenMatch = signiphiMetadataStr.match(/^\\((.*)\\)$/);\n if (parenMatch && parenMatch[1]) {\n jsonStr = parenMatch[1];\n }\n\n const signiphiMetadata = JSON.parse(jsonStr);\n if (signiphiMetadata.fields) {\n // Find the PDF field name that has this fieldId\n for (const [pdfName, fieldData] of Object.entries(signiphiMetadata.fields) as [string, any][]) {\n if (fieldData.fieldId === field.id) {\n pdfFieldName = pdfName;\n logger.info(`[REQUIRED NAV] Mapped fieldId ${field.id} to PDF name ${pdfName}`);\n break;\n }\n }\n }\n }\n }\n } catch (metadataError) {\n logger.warn('[REQUIRED NAV] Could not read PDF metadata:', metadataError);\n }\n }\n\n // Try multiple selectors to find the field element\n let fieldElement: HTMLElement | null = null;\n\n // Try 1: Using PDF field name from metadata\n fieldElement = iframe.contentDocument.querySelector(\n `input[data-element-id=\"${pdfFieldName}\"], ` +\n `select[data-element-id=\"${pdfFieldName}\"], ` +\n `textarea[data-element-id=\"${pdfFieldName}\"]`\n ) as HTMLElement;\n\n // Try 2: If not found, try using field.name directly\n if (!fieldElement && field.name !== pdfFieldName) {\n fieldElement = iframe.contentDocument.querySelector(\n `input[data-element-id=\"${field.name}\"], ` +\n `select[data-element-id=\"${field.name}\"], ` +\n `textarea[data-element-id=\"${field.name}\"]`\n ) as HTMLElement;\n if (fieldElement) {\n logger.info(`[REQUIRED NAV] Found field using field.name instead of metadata name`);\n }\n }\n\n // Try 3: If still not found, try using name attribute instead of data-element-id\n if (!fieldElement) {\n fieldElement = iframe.contentDocument.querySelector(\n `input[name=\"${pdfFieldName}\"], ` +\n `select[name=\"${pdfFieldName}\"], ` +\n `textarea[name=\"${pdfFieldName}\"]`\n ) as HTMLElement;\n if (fieldElement) {\n logger.info(`[REQUIRED NAV] Found field using name attribute`);\n }\n }\n\n if (fieldElement) {\n fieldElement.classList.add('active-required-field');\n\n // Also highlight the parent widget annotation if it exists\n const widgetAnnotation = fieldElement.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation');\n if (widgetAnnotation) {\n widgetAnnotation.classList.add('active-required-field-annotation');\n }\n\n // Scroll field into view using PDF.js viewer container\n try {\n // Get the PDF viewer's scroll container\n const viewerContainer = iframe.contentDocument.querySelector('#viewerContainer');\n if (viewerContainer && widgetAnnotation) {\n // Get the field's position relative to the container\n const fieldRect = (widgetAnnotation as HTMLElement).getBoundingClientRect();\n const containerRect = viewerContainer.getBoundingClientRect();\n \n // Calculate the scroll position to center the field\n const scrollTop = viewerContainer.scrollTop + fieldRect.top - containerRect.top - (containerRect.height / 2) + (fieldRect.height / 2);\n \n // Smooth scroll to the field\n viewerContainer.scrollTo({\n top: scrollTop,\n behavior: 'smooth'\n });\n \n logger.info(`[REQUIRED NAV] Scrolled to field`, {\n fieldRect: { top: fieldRect.top, height: fieldRect.height },\n containerRect: { top: containerRect.top, height: containerRect.height },\n scrollTop\n });\n } else {\n // Fallback to regular scrollIntoView if viewer container not found\n fieldElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n logger.info(`[REQUIRED NAV] Used fallback scrollIntoView`);\n }\n } catch (scrollError) {\n logger.warn('[REQUIRED NAV] Error scrolling to field:', scrollError);\n // Final fallback\n fieldElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n \n // Store reference for later focus\n highlightedFieldElement = fieldElement;\n \n logger.info(`[REQUIRED NAV] Added visual highlight to field`, {\n fieldId: field.id,\n fieldName: field.name,\n pdfFieldName,\n hasAnnotation: !!widgetAnnotation,\n elementTag: fieldElement.tagName,\n dataElementId: fieldElement.getAttribute('data-element-id'),\n nameAttr: fieldElement.getAttribute('name')\n });\n } else {\n logger.warn(`[REQUIRED NAV] Could not find field element`, {\n fieldId: field.id,\n fieldName: field.name,\n pdfFieldName,\n availableInputs: Array.from(iframe.contentDocument.querySelectorAll('input, select, textarea')).slice(0, 5).map(el => ({\n tag: el.tagName,\n dataElementId: el.getAttribute('data-element-id'),\n name: el.getAttribute('name')\n }))\n });\n }\n }\n } catch (error) {\n logger.warn('[REQUIRED NAV] Failed to add visual highlight:', error);\n }\n\n // Step 2: Determine appropriate action based on field state\n // Priority: Acknowledgements > Signature/Initials > Regular Field\n\n // Check if field has unacknowledged acknowledgements\n if (field.acknowledgements && field.acknowledgements.length > 0) {\n if (!isFieldFullyAcknowledged(field.id)) {\n logger.info(`[REQUIRED NAV] Field has unacknowledged items, opening acknowledgement modal`);\n handleAcknowledgementRequired(field);\n return;\n }\n }\n\n // Handle signature/initials fields (both modal-based)\n if (field.type === 'signature' || field.type === 'initials') {\n logger.info(`[REQUIRED NAV] Field is ${field.type}, triggering handler`);\n handleSignatureClick(field);\n return;\n }\n\n // Handle regular text fields - try to focus the field in PDF\n logger.info(`[REQUIRED NAV] Regular field, attempting to focus in PDF`);\n try {\n // Wait a bit for scroll animation to complete\n await new Promise(resolve => setTimeout(resolve, 300));\n\n // Use the field element we already found during highlighting\n if (highlightedFieldElement) {\n highlightedFieldElement.focus();\n logger.info(`[REQUIRED NAV] Focused field in PDF`, {\n elementTag: highlightedFieldElement.tagName,\n dataElementId: highlightedFieldElement.getAttribute('data-element-id')\n });\n } else {\n logger.warn(`[REQUIRED NAV] No field element available to focus`);\n }\n } catch (error) {\n logger.warn('[REQUIRED NAV] Failed to focus field:', error);\n }\n }, [viewerRef, isFieldFullyAcknowledged, handleAcknowledgementRequired, handleSignatureClick]);\n\n // Handle required field navigation\n const handleNextRequired = useCallback(() => {\n const field = goToNextRequired();\n if (field) {\n navigateToRequiredField(field);\n }\n }, [goToNextRequired, navigateToRequiredField]);\n\n const handlePreviousRequired = useCallback(() => {\n const field = goToPreviousRequired();\n if (field) {\n navigateToRequiredField(field);\n }\n }, [goToPreviousRequired, navigateToRequiredField]);\n\n // Handle SIGNATURE save (signature modal only)\n const handleSignatureSave = useCallback(\n (dataUrl: string) => {\n if (!currentSignatureField) return;\n\n // Collect the signature for future auto-placement\n collectSignature('signature', dataUrl);\n\n // Set signature for the current field\n setSignature(currentSignatureField.id, dataUrl);\n\n // SYNC: Also update the main sidebar signature field\n setSignature('signature_field_main', dataUrl);\n\n setCurrentSignatureField(null);\n setSignatureModalOpen(false);\n },\n [currentSignatureField, setSignature, collectSignature]\n );\n\n // Handle INITIALS save (initials modal only - TEXT INPUT)\n const handleInitialsSave = useCallback(\n (initialsText: string) => {\n if (!currentInitialsField) return;\n\n // Initials are TEXT, not images - save to field value\n setFieldValue(currentInitialsField.id, initialsText);\n\n // Store for auto-placement to other initials fields\n collectSignature('initials', initialsText);\n\n // SYNC: Also update the main sidebar initials field\n setFieldValue('initials_field_main', initialsText);\n\n setCurrentInitialsField(null);\n setInitialsModalOpen(false);\n },\n [currentInitialsField, setFieldValue, collectSignature]\n );\n\n // Handle acknowledgement complete - continue the interaction flow\n const handleAcknowledgementComplete = useCallback(async (fieldId: string) => {\n logger.info(`[ACK COMPLETE] Field ${fieldId} fully acknowledged, continuing interaction`);\n\n // Find the field\n const field = filteredFields.find(f => f.id === fieldId);\n if (!field) {\n logger.warn(`[ACK COMPLETE] Field ${fieldId} not found`);\n return;\n }\n\n // Now that acknowledgements are done, continue with the appropriate action\n if (field.type === 'signature' || field.type === 'initials') {\n // For signature/initials fields: check if we need to collect or can auto-place\n const fieldType = field.type as 'signature' | 'initials';\n\n if (hasCollectedSignature(fieldType)) {\n // Auto-place the collected signature/initials\n const collected = getCollectedSignature(fieldType);\n if (collected) {\n // Signature = image (use setSignature), Initials = text (use setFieldValue)\n if (field.type === 'signature') {\n setSignature(field.id, collected);\n } else if (field.type === 'initials') {\n setFieldValue(field.id, collected);\n }\n logger.info(`[ACK COMPLETE] Auto-placed ${fieldType} for field ${field.id}`);\n }\n } else {\n // Open the CORRECT modal to collect signature/initials\n logger.info(`[ACK COMPLETE] Opening ${fieldType} modal to collect`);\n\n if (field.type === 'signature') {\n setCurrentSignatureField(field);\n setSignatureModalOpen(true);\n } else if (field.type === 'initials') {\n setCurrentInitialsField(field);\n setInitialsModalOpen(true);\n }\n }\n } else {\n // For regular fields: try to focus the field in PDF\n logger.info(`[ACK COMPLETE] Regular field, attempting to focus in PDF`);\n try {\n await new Promise(resolve => setTimeout(resolve, 100));\n\n const iframe = document.querySelector('iframe');\n if (iframe?.contentDocument) {\n const fieldElement = iframe.contentDocument.querySelector(`[data-element-id=\"${field.id}\"]`) as HTMLElement;\n if (fieldElement) {\n fieldElement.focus();\n fieldElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n logger.info(`[ACK COMPLETE] Focused field in PDF`);\n }\n }\n } catch (error) {\n logger.warn('[ACK COMPLETE] Failed to focus field:', error);\n }\n }\n }, [filteredFields, hasCollectedSignature, getCollectedSignature, setSignature]);\n\n // Validate all fields\n const validateForm = useCallback(async (): Promise<boolean> => {\n const validationErrors: string[] = [];\n const currentFieldValues = fieldValuesRef.current;\n const currentSignatures = signaturesRef.current;\n\n\n // CRITICAL: Extract field values from PDF viewer for validation\n // This ensures we validate against actual values typed in the PDF, not just React state\n const pdfFieldValues = await getFormFieldValues();\n \n // Merge: PDF viewer values + React form state\n // CRITICAL: For radio buttons, prefer PDF viewer values (properly formatted as __RADIO_OPTION_INDEX_X__)\n // For other fields, prefer React state (more up-to-date)\n const allFieldValues = { ...pdfFieldValues, ...currentFieldValues };\n\n // CRITICAL: Merge signatures (including auto-filled initials) into allFieldValues\n // This ensures validation can find initials that were auto-filled into signaturesRef.current\n console.log('[VALIDATION] === MERGING SIGNATURES INTO allFieldValues ===');\n console.log('[VALIDATION] currentSignatures:', currentSignatures);\n for (const [fieldId, signatureValue] of Object.entries(currentSignatures)) {\n if (signatureValue) {\n allFieldValues[fieldId] = signatureValue;\n console.log('[VALIDATION] Merged signature for field:', fieldId, '(truncated):', signatureValue.substring(0, 50));\n }\n }\n console.log('[VALIDATION] allFieldValues after merge has', Object.keys(allFieldValues).length, 'entries');\n\n // Override: If PDF viewer has a valid radio button value and React has a boolean, use PDF value\n for (const [key, pdfValue] of Object.entries(pdfFieldValues)) {\n if (key.includes('radio')) {\n const reactValue = currentFieldValues[key];\n // If React state has a boolean string but PDF has a proper value, use PDF value\n if ((reactValue === 'true' || reactValue === 'false') &&\n pdfValue &&\n pdfValue !== 'true' &&\n pdfValue !== 'false') {\n allFieldValues[key] = pdfValue;\n } else if (!pdfValue && (reactValue === 'true' || reactValue === 'false')) {\n }\n }\n }\n \n \n // Check for any remaining radio button fields with boolean values\n for (const [key, value] of Object.entries(allFieldValues)) {\n if ((value === 'true' || value === 'false') && key.includes('radio')) {\n }\n }\n\n // Validate date fields for proper format\n // This prevents submission with invalid dates even when filled only in PDF view\n const dateFields = filteredFields.filter(f => f.type === 'date');\n for (const field of dateFields) {\n const value = allFieldValues[field.id];\n if (value && value.trim() !== '') {\n const validation = parseAndValidateDate(value);\n if (!validation.isValid) {\n const fieldLabel = field.label || field.id;\n validationErrors.push(\n `${fieldLabel}: Invalid date format. Please use MM/DD/YYYY, YYYY-MM-DD, or similar standard format.`\n );\n }\n } else if (field.required) {\n // Check if required date field is empty\n validationErrors.push(`${field.label || field.id} is required`);\n }\n }\n\n // Validate signature fields only (not initials - they're stored as field values)\n const signatureFields = filteredFields.filter(f => f.type === 'signature');\n const signatureValidation = validateSignatures(signatureFields, currentSignatures);\n if (!signatureValidation.isValid) {\n validationErrors.push(...signatureValidation.errors);\n }\n\n // Validate initials fields separately as field values\n const initialsFields = filteredFields.filter(f => f.type === 'initials');\n console.log('[VALIDATION] === VALIDATING INITIALS FIELDS ===');\n console.log('[VALIDATION] Found', initialsFields.length, 'initials fields');\n for (const field of initialsFields) {\n if (field.required) {\n const value = allFieldValues[field.id]; // Use merged values (now includes signatures!)\n console.log('[VALIDATION] Checking field:', field.id, 'Label:', field.label);\n console.log('[VALIDATION] Value from allFieldValues:', value ? '(found, truncated): ' + value.substring(0, 50) : '(MISSING)');\n if (!value || value.trim() === '') {\n console.log('[VALIDATION] ERROR: Field is required but missing!');\n validationErrors.push(`${field.label} is required`);\n } else {\n console.log('[VALIDATION] OK: Field has value');\n }\n }\n }\n\n // Validate other form fields\n const isFieldsValid = validateFields(currentSignatures);\n if (!isFieldsValid) {\n // Collect error messages from individual fields (excluding initials, already checked)\n for (const field of filteredFields) {\n if (field.type === 'initials') continue; // Skip initials, already validated above\n const error = getFieldError(field.id);\n if (error) {\n validationErrors.push(error);\n }\n }\n }\n\n // Validate acknowledgements - all fields with acknowledgements must be fully acknowledged\n const unacknowledgedFields = getUnacknowledgedFields(filteredFields);\n if (unacknowledgedFields.length > 0) {\n // Open the unacknowledged fields modal instead of showing a text error\n setUnacknowledgedModalOpen(true);\n return false; // Stop validation and return invalid\n }\n\n // NOTE: We do NOT validate against requiredFieldsMap here because:\n // 1. filteredFields already contains only fields visible to current signer\n // 2. Each field in filteredFields has the correct 'required' property from the PDF\n // 3. In multi-signer mode, requiredFieldsMap would include OTHER signers' required fields\n // 4. The validation above (signatures, initials, and form fields) covers all visible fields\n\n // Validate against PDF (if available) - this is a safety check\n // Pass filteredFields to only validate fields visible to current signer\n // CRITICAL: Pass allFieldValues (includes PDF viewer values) not just fieldValues\n try {\n const pdfValidation = await validatePdf(allFieldValues, currentSignatures, filteredFields);\n if (!pdfValidation.isValid) {\n validationErrors.push(...pdfValidation.errors);\n }\n } catch (error) {\n logger.error('PDF validation error:', error);\n }\n\n setValidationErrors(validationErrors);\n return validationErrors.length === 0;\n }, [\n filteredFields,\n validateFields,\n validateSignatures,\n validatePdf,\n getFieldError,\n getFormFieldValues,\n ]);\n\n // Handle submit\n const handleSubmit = useCallback(async () => {\n if (readOnly) return;\n\n try {\n setIsSubmitting(true);\n setSubmitError(null);\n setValidationErrors([]);\n\n // Auto-fill remaining signatures/initials IF all acknowledgements are complete\n // This improves UX by not requiring users to click every signature field\n // However, if ANY field has UNACKNOWLEDGED items, we disable auto-fill to ensure\n // users explicitly interact with each field and see acknowledgements\n const hasUnacknowledgedItems = hasUnacknowledgedFields(filteredFields);\n\n console.log('[SUBMIT] === ACKNOWLEDGEMENT CHECK ===');\n console.log('[SUBMIT] hasUnacknowledgedItems:', hasUnacknowledgedItems);\n console.log('[SUBMIT] Current signatures:', signaturesRef.current);\n console.log('[SUBMIT] Has collected signature:', hasCollectedSignature('signature'));\n console.log('[SUBMIT] Has collected initials:', hasCollectedSignature('initials'));\n\n if (!hasUnacknowledgedItems) {\n // Safe to auto-fill - no unacknowledged items remaining\n console.log('[SUBMIT] ✅ No unacknowledged items - proceeding with auto-fill');\n let filledCount = 0;\n const updatedSignatures = { ...signaturesRef.current };\n\n // Auto-fill signature fields if we have a collected signature\n if (hasCollectedSignature('signature')) {\n const collectedSig = getCollectedSignature('signature');\n console.log('[SUBMIT] Got collected signature:', !!collectedSig);\n if (collectedSig) {\n const emptySignatureFields = filteredFields.filter(\n field => field.type === 'signature' && !updatedSignatures[field.id]\n );\n console.log('[SUBMIT] Empty signature fields:', emptySignatureFields.length, emptySignatureFields.map(f => f.id));\n emptySignatureFields.forEach(field => {\n setSignature(field.id, collectedSig);\n updatedSignatures[field.id] = collectedSig; // Update local copy\n filledCount++;\n console.log(`[SUBMIT] ✅ Auto-filled signature for field ${field.id}`);\n });\n }\n }\n\n // Auto-fill initials fields\n // Check for collected canvas initials first, then fall back to text-based initials from main field\n let initialsValue = null;\n if (hasCollectedSignature('initials')) {\n initialsValue = getCollectedSignature('initials');\n console.log('[SUBMIT] Got collected canvas initials:', !!initialsValue);\n } else if (fieldValuesRef.current['initials_field_main']) {\n // Fall back to text-based initials from the main initials input field\n initialsValue = fieldValuesRef.current['initials_field_main'];\n console.log('[SUBMIT] Got text-based initials from field:', !!initialsValue, initialsValue);\n }\n\n if (initialsValue) {\n const emptyInitialsFields = filteredFields.filter(\n field => field.type === 'initials' && !updatedSignatures[field.id]\n );\n console.log('[SUBMIT] Empty initials fields:', emptyInitialsFields.length, emptyInitialsFields.map(f => f.id));\n emptyInitialsFields.forEach(field => {\n setSignature(field.id, initialsValue);\n updatedSignatures[field.id] = initialsValue; // Update local copy\n filledCount++;\n console.log(`[SUBMIT] ✅ Auto-filled initials for field ${field.id}`);\n });\n } else {\n console.log('[SUBMIT] ⚠️ No initials value found (neither canvas nor text-based)');\n }\n\n // CRITICAL: Manually update the ref immediately to avoid waiting for useEffect\n // This ensures validation sees the auto-filled values right away\n if (filledCount > 0) {\n console.log(`[SUBMIT] ✅ Auto-filled ${filledCount} fields total`);\n console.log('[SUBMIT] Final signatures:', updatedSignatures);\n signaturesRef.current = updatedSignatures;\n // Small delay to ensure setSignature state updates are queued\n await new Promise(resolve => setTimeout(resolve, 50));\n } else {\n console.log('[SUBMIT] ⚠️ No fields were auto-filled');\n }\n } else {\n console.log('[SUBMIT] ❌ Unacknowledged items present - auto-fill DISABLED');\n const unackFields = getUnacknowledgedFields(filteredFields);\n console.log('[SUBMIT] Unacknowledged fields:', unackFields.map(f => ({ id: f.id, label: f.label })));\n }\n\n // Validate form\n const isValid = await validateForm();\n if (!isValid) {\n setIsSubmitting(false);\n return;\n }\n\n // CRITICAL: Extract field values from PDF.js viewer before flattening\n // This captures values entered directly in the PDF viewer\n const pdfFieldValues = await getFormFieldValues();\n const currentFieldValues = fieldValuesRef.current;\n const currentSignatures = signaturesRef.current;\n\n // Merge PDF.js values with React form values (React values take priority)\n // This ensures we use both:\n // - Values entered directly in PDF viewer (pdfFieldValues)\n // - Values from React form state (fieldValues - signatures, initials)\n const finalFieldValues = { ...pdfFieldValues, ...currentFieldValues };\n\n // CRITICAL: Merge signatures (including auto-filled initials) into finalFieldValues\n // This ensures auto-filled initials are flattened to the PDF\n console.log('[SUBMIT] === MERGING SIGNATURES INTO finalFieldValues FOR FLATTENING ===');\n console.log('[SUBMIT] currentSignatures:', currentSignatures);\n for (const [fieldId, signatureValue] of Object.entries(currentSignatures)) {\n if (signatureValue) {\n finalFieldValues[fieldId] = signatureValue;\n console.log('[SUBMIT] Merged signature for field:', fieldId, '(truncated):', signatureValue.substring(0, 50));\n }\n }\n console.log('[SUBMIT] finalFieldValues after merge has', Object.keys(finalFieldValues).length, 'entries');\n\n // CRITICAL FIX: For radio buttons, prefer PDF viewer values (properly formatted as __RADIO_OPTION_INDEX_X__)\n // React state stores boolean strings or generic values like \"on\" which pdf-lib can't interpret\n for (const [key, pdfValue] of Object.entries(pdfFieldValues)) {\n if (key.includes('radio')) {\n const reactValue = currentFieldValues[key];\n // If React state has a generic value but PDF has a proper __RADIO_OPTION_INDEX_ value, use PDF value\n if (pdfValue && pdfValue.includes('__RADIO_OPTION_INDEX_')) {\n // Always prefer the properly formatted PDF value for radio buttons\n finalFieldValues[key] = pdfValue;\n logger.info(`[SUBMIT] Radio button ${key}: using PDF value \"${pdfValue}\" instead of React value \"${reactValue}\"`);\n } else if ((reactValue === 'true' || reactValue === 'false' || reactValue === 'on') &&\n pdfValue &&\n pdfValue !== 'true' &&\n pdfValue !== 'false' &&\n pdfValue !== 'on') {\n // Fallback: If React has a boolean/generic string but PDF has a proper value, use PDF value\n finalFieldValues[key] = pdfValue;\n logger.info(`[SUBMIT] Radio button ${key}: using PDF value \"${pdfValue}\" instead of generic React value \"${reactValue}\"`);\n }\n }\n }\n\n // Validate attachments if enabled\n if (enableAttachments) {\n const attachmentValidation = validateAttachments();\n if (!attachmentValidation.isValid) {\n setValidationErrors(attachmentValidation.errors);\n setIsSubmitting(false);\n return;\n }\n }\n\n // Capture audit trail data for compliance and forensics\n const auditTrail: AuditTrailMetadata = await captureAuditTrail();\n\n // Build document metadata\n const metadata: DocumentMetadata = {\n signerEmail: effectiveSignerEmail,\n signerInitials: finalFieldValues['initials_field_main'],\n createdAt: new Date(),\n };\n\n // Fill PDF with merged values and signatures\n console.log('[SUBMIT] === CALLING fillPdf ===');\n console.log('[SUBMIT] finalFieldValues keys:', Object.keys(finalFieldValues));\n console.log('[SUBMIT] finalFieldValues has initials_field_main:', !!finalFieldValues['initials_field_main']);\n console.log('[SUBMIT] Initials fields in finalFieldValues:', Object.keys(finalFieldValues).filter(k => k.toLowerCase().includes('initials')));\n const filledPdfBytes = await fillPdf(\n finalFieldValues,\n currentSignatures,\n effectiveSignerEmail,\n metadata,\n auditTrail\n );\n console.log('[SUBMIT] ✅ fillPdf completed');\n\n // Call user-provided onSubmit\n await onSubmit({\n pdfBytes: filledPdfBytes,\n formFieldValues: finalFieldValues,\n signatures: currentSignatures,\n attachments: enableAttachments ? attachments : undefined,\n auditTrail,\n metadata,\n });\n\n // Auto-track signing if API key is provided (non-blocking)\n if (apiKey && effectiveSignerEmail) {\n trackDocumentSignedSilent(\n { apiKey, endpoint: trackingEndpoint },\n { \n signerEmail: effectiveSignerEmail, \n documentId,\n metadata: {\n documentTitle,\n signedAt: new Date().toISOString(),\n },\n }\n );\n }\n\n // Success - clear form\n clearFields();\n setValidationErrors([]);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Submission failed';\n setSubmitError(errorMessage);\n logger.error('Submission error:', error);\n } finally {\n setIsSubmitting(false);\n }\n }, [\n readOnly,\n filteredFields,\n hasCollectedSignature,\n getCollectedSignature,\n hasSignature,\n setSignature,\n validateForm,\n fillPdf,\n getFormFieldValues,\n currentSignerEmail,\n onSubmit,\n clearFields,\n enableAttachments,\n validateAttachments,\n attachments,\n apiKey,\n trackingEndpoint,\n documentId,\n documentTitle,\n effectiveSignerEmail,\n ]);\n\n // Check if form is complete\n const isFormComplete = useMemo(() => {\n if (filteredFields.length === 0) return false;\n\n // When showFullFieldsSidebar is false, only check signature/initials fields\n // Other fields will be filled directly in the PDF viewer\n if (!showFullFieldsSidebar) {\n // Only check signature_field_main and initials_field_main\n const signatureField = filteredFields.find(f => f.id === 'signature_field_main');\n const initialsField = filteredFields.find(f => f.id === 'initials_field_main');\n\n // Check signature (stored as signature data)\n if (signatureField?.required && !hasSignature('signature_field_main')) {\n return false;\n }\n\n // Check initials (stored as field value, not signature)\n if (initialsField?.required) {\n const initialsValue = fieldValues['initials_field_main'];\n if (!initialsValue || initialsValue.trim() === '') {\n return false;\n }\n }\n\n // All required fields (signature/initials) are filled\n return true;\n }\n\n // When showFullFieldsSidebar is true, check all required fields in the sidebar\n for (const field of filteredFields) {\n if (!field.required) continue;\n\n // Skip signature/initials main fields - they're in the box\n if (field.id === 'signature_field_main' || field.id === 'initials_field_main') {\n if (!hasSignature(field.id)) return false;\n continue;\n }\n\n if (field.type === 'signature' || field.type === 'initials') {\n if (!hasSignature(field.id)) return false;\n } else {\n const value = fieldValues[field.id];\n if (!value || value.trim() === '') return false;\n }\n }\n\n return true;\n }, [filteredFields, fieldValues, hasSignature, showFullFieldsSidebar]);\n\n return (\n <div className={cn('signiphi-pdf-signer flex flex-col gap-4 md:gap-6 h-full overflow-auto px-2 md:px-0', className)}>\n {/* Document Title - Above everything */}\n {documentTitle && (\n <Card className=\"flex-shrink-0 border-0 shadow-none\">\n <CardHeader className=\"space-y-2 p-0 pb-3 md:pb-4\">\n <div className=\"flex flex-col sm:flex-row items-start justify-between gap-3 sm:gap-4\">\n <CardTitle className=\"text-2xl sm:text-3xl md:text-4xl font-bold text-primary tracking-tight flex-1\">\n {documentTitle}\n </CardTitle>\n {showPoweredBy && (\n <div className=\"flex-shrink-0\">\n <PoweredBySigniphi />\n </div>\n )}\n </div>\n </CardHeader>\n </Card>\n )}\n\n {/* Main Content: PDF Viewer + Form Sidebar */}\n <div className=\"flex flex-col lg:flex-row gap-4\">\n {/* PDF Viewer Column - Takes remaining space, naturally extends */}\n {showPdfViewer && (\n <div className=\"flex-1 flex flex-col bg-muted/30 rounded-lg overflow-hidden relative min-w-0 border-2\">\n {/* View Toggle Toolbar */}\n <ViewToggleToolbar\n currentView={viewMode}\n onViewChange={setViewMode}\n viewerRef={viewerRef}\n formFieldsViewRef={formFieldsViewRef}\n requiredFieldNavigation={{\n hasRequiredFields,\n currentRequiredIndex,\n requiredFieldCount,\n onNext: handleNextRequired,\n onPrevious: handlePreviousRequired,\n }}\n />\n\n {/* Loading Overlay */}\n {isPdfLoading && (\n <div className=\"absolute inset-x-0 top-[48px] sm:top-[52px] bottom-0 flex items-center justify-center bg-background z-10\">\n <div className=\"text-center\">\n <Loader2 className=\"h-12 w-12 animate-spin text-primary mx-auto mb-4\" />\n <p className=\"text-muted-foreground\">Loading PDF...</p>\n </div>\n </div>\n )}\n\n {/* Error Overlay */}\n {pdfError && (\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\">\n <Alert variant=\"destructive\" className=\"max-w-md\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle>Error Loading PDF</AlertTitle>\n <AlertDescription>{pdfError}</AlertDescription>\n </Alert>\n </div>\n )}\n\n {/* PDF Viewer - Always mounted, hidden when not active */}\n <div \n className={cn(\n \"w-full min-h-[400px] sm:min-h-[500px] md:min-h-[600px] lg:min-h-[800px]\",\n viewMode === 'form' && 'hidden'\n )}\n >\n <PdfViewerStyled\n ref={viewerRef}\n onLoad={handlePdfLoad}\n onError={handlePdfError}\n className=\"w-full h-full\"\n />\n </div>\n\n {/* Form Fields View - Always mounted, hidden when not active */}\n <div className={cn(viewMode === 'pdf' && 'hidden')}>\n <FormFieldsView\n ref={formFieldsViewRef}\n fields={filteredFields}\n fieldValues={fieldValues}\n onFieldChange={handleFieldChange}\n onSignatureClick={handleSignatureClick}\n hasSignature={hasSignature}\n getFieldError={getFieldError}\n isFieldTouched={isFieldTouched}\n isFieldFullyAcknowledged={isFieldFullyAcknowledged}\n onAcknowledgementRequired={handleAcknowledgementRequired}\n />\n </div>\n </div>\n )}\n\n {/* Form Column - Responsive width, adapts to screen size */}\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\">\n {/* Header - Fixed */}\n <CardHeader className=\"flex-shrink-0 pb-4 md:pb-6 pt-5 md:pt-7 px-4 md:px-6\">\n <CardTitle className=\"text-xl md:text-2xl font-bold flex items-center gap-2 md:gap-3 mb-2\">\n <div className=\"p-1.5 md:p-2 bg-primary/10 rounded-lg\">\n <FileText className=\"h-5 w-5 md:h-6 md:w-6 text-primary\" />\n </div>\n Sign Document\n </CardTitle>\n <CardDescription className=\"text-muted-foreground text-sm md:text-base leading-relaxed text-primary\">\n {customMessage || 'Complete the fields in the PDF and sign below'}\n </CardDescription>\n {signingInstructions && (\n <div className=\"mt-2 md:mt-3 text-xs md:text-sm leading-relaxed text-muted-foreground\">\n <SigningInstructions html={signingInstructions} />\n </div>\n )}\n </CardHeader>\n\n {/* Content Area - Scrollable when content exceeds available height */}\n <CardContent className=\"space-y-4 md:space-y-6 px-4 md:px-6\">\n {/* Validation Errors */}\n {validationErrors.length > 0 && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertTitle className=\"text-sm md:text-base\">Please fix the following errors:</AlertTitle>\n <AlertDescription>\n <ul className=\"list-disc list-inside space-y-1 mt-2 text-xs md:text-sm\">\n {validationErrors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n )}\n\n {/* Submit Error */}\n {submitError && (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"h-4 w-4\" />\n <AlertDescription className=\"text-xs md:text-sm\">{submitError}</AlertDescription>\n </Alert>\n )}\n\n {/* Acknowledgements Sidebar - At the top */}\n <AcknowledgementsSidebar\n fields={filteredFields.filter(f => {\n // Show ALL fields with acknowledgements (including signature/initials)\n return f.acknowledgements && f.acknowledgements.length > 0;\n })}\n onAcknowledge={acknowledgeItem}\n isAcknowledged={isAcknowledged}\n getProgress={getFieldAcknowledgementProgress}\n />\n\n {/* Signature/Initials Box (Top Placement) */}\n {signatureBoxPlacement === 'top' && (\n <div className=\"mb-4 md:mb-6\">\n <SignatureInitialsBox\n onSignatureClick={() => {\n const signatureField = filteredFields.find(f => f.id === 'signature_field_main');\n if (signatureField) {\n handleSignatureClick(signatureField);\n }\n }}\n onInitialsChange={(value) => {\n const initialsField = filteredFields.find(f => f.id === 'initials_field_main');\n if (initialsField) {\n handleFieldChange(initialsField.id, value);\n }\n }}\n signatureData={signatures['signature_field_main']}\n initialsValue={fieldValues['initials_field_main'] || ''}\n signatureRequired={filteredFields.find(f => f.id === 'signature_field_main')?.required}\n initialsRequired={filteredFields.find(f => f.id === 'initials_field_main')?.required}\n showInitials={!!filteredFields.find(f => f.id === 'initials_field_main')}\n />\n </div>\n )}\n\n {/* Form Fields */}\n <div className=\"space-y-3 md:space-y-4\">\n {filteredFields.length === 0 && isPdfLoaded && (\n <div className=\"text-center text-muted-foreground py-6 md:py-8\">\n <p className=\"text-sm md:text-base\">No form fields found in this document.</p>\n </div>\n )}\n\n {filteredFields.map((field) => {\n if (!isFieldVisible(field)) return null;\n\n // Hide signature/initials main fields - they're always in the SignatureInitialsBox\n if (field.id === 'signature_field_main' || field.id === 'initials_field_main') {\n return null;\n }\n\n // NEVER show signature/initials fields in the regular sidebar\n // They are handled by SignatureInitialsBox and AcknowledgementsSidebar\n const isSignatureOrInitials = field.type === 'signature' || field.type === 'initials';\n if (isSignatureOrInitials) {\n return null;\n }\n\n // Hide all other fields unless showFullFieldsSidebar is enabled\n if (!showFullFieldsSidebar) {\n return null;\n }\n\n const value = fieldValues[field.id] || '';\n const hasFieldSignature = hasSignature(field.id);\n const error = getFieldError(field.id);\n const isTouched = isFieldTouched(field.id);\n\n // Log rendering of signature/initials fields with acknowledgements\n if ((field.type === 'signature' || field.type === 'initials') &&\n field.acknowledgements && field.acknowledgements.length > 0) {\n console.log('[SUBMISSION FORM RENDER] Rendering field with acks:', {\n id: field.id,\n type: field.type,\n ackCount: field.acknowledgements.length,\n hasOnSignatureClick: typeof handleSignatureClick === 'function',\n hasOnAckRequired: typeof handleAcknowledgementRequired === 'function'\n });\n }\n\n return (\n <div key={field.id} className=\"space-y-1\">\n <FormFieldRenderer\n field={field}\n value={value}\n hasSignature={hasFieldSignature}\n error={isTouched ? error : undefined}\n onChange={(newValue) => handleFieldChange(field.id, newValue)}\n onSignatureClick={() => handleSignatureClick(field)}\n isFieldFullyAcknowledged={isFieldFullyAcknowledged}\n onAcknowledgementRequired={handleAcknowledgementRequired}\n />\n </div>\n );\n })}\n </div>\n\n {/* Signature/Initials Box (Bottom Placement) */}\n {signatureBoxPlacement === 'bottom' && (\n <div className=\"mt-4 md:mt-6\">\n <SignatureInitialsBox\n onSignatureClick={() => {\n const signatureField = filteredFields.find(f => f.id === 'signature_field_main');\n if (signatureField) {\n handleSignatureClick(signatureField);\n }\n }}\n onInitialsChange={(value) => {\n const initialsField = filteredFields.find(f => f.id === 'initials_field_main');\n if (initialsField) {\n handleFieldChange(initialsField.id, value);\n }\n }}\n signatureData={signatures['signature_field_main']}\n initialsValue={fieldValues['initials_field_main'] || ''}\n signatureRequired={filteredFields.find(f => f.id === 'signature_field_main')?.required}\n initialsRequired={filteredFields.find(f => f.id === 'initials_field_main')?.required}\n showInitials={!!filteredFields.find(f => f.id === 'initials_field_main')}\n />\n </div>\n )}\n \n {/* Editable Fields Panel (Optional) */}\n {showEditableFields && formFields.length > 0 && (\n <div className=\"mt-4 md:mt-6\">\n <EditableFieldsPanel\n fields={formFields}\n fieldValues={fieldValues}\n collapsed={editableFieldsCollapsed}\n onCollapseChange={setEditableFieldsCollapsed}\n />\n </div>\n )}\n\n {/* Attachments (Optional) */}\n {enableAttachments && (\n <div className=\"mt-4 md:mt-6\">\n <AttachmentUpload\n attachments={attachments}\n onAdd={addFiles}\n onRemove={removeAttachment}\n isUploading={isUploadingAttachments}\n disabled={readOnly || isSubmitting}\n maxFiles={maxAttachments}\n formatSize={formatSize}\n />\n {attachmentErrors.length > 0 && (\n <div className=\"mt-2 p-2 md:p-3 bg-destructive/10 border border-destructive/30 rounded-lg\">\n <ul className=\"list-disc list-inside text-xs md:text-sm text-destructive space-y-1\">\n {attachmentErrors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n </CardContent>\n\n {/* Action Buttons - Fixed Footer */}\n {!readOnly && (\n <div className=\"flex-shrink-0 p-4 md:p-6 border-t bg-gradient-to-b from-background to-muted/20\">\n <div className=\"flex flex-col sm:flex-row gap-2 md:gap-3\">\n {onCancel && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onCancel}\n disabled={isSubmitting}\n className=\"flex-1 h-11 md:h-12 font-medium hover:bg-muted transition-colors text-sm md:text-base\"\n >\n Cancel\n </Button>\n )}\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !isFormComplete}\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\"\n >\n {isSubmitting ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 md:h-5 md:w-5 animate-spin\" />\n Submitting...\n </>\n ) : (\n <>\n <CheckCircle className=\"mr-2 h-4 w-4 md:h-5 md:w-5\" />\n Submit Document\n </>\n )}\n </Button>\n </div>\n\n {/* Form Status */}\n <div className=\"mt-4 md:mt-5 text-center\">\n {isFormComplete ? (\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\">\n <CheckCircle className=\"h-3 w-3 md:h-4 md:w-4\" />\n Ready to submit\n </div>\n ) : (\n <p className=\"text-xs md:text-sm text-muted-foreground\">\n Complete all required fields to submit\n </p>\n )}\n </div>\n </div>\n )}\n </Card>\n </div>\n\n {/* Signature Modal - FOR SIGNATURES ONLY */}\n {signatureModalOpen && currentSignatureField && (\n <SignatureModalCore\n isOpen={signatureModalOpen}\n onClose={() => {\n setSignatureModalOpen(false);\n setCurrentSignatureField(null);\n }}\n onSave={handleSignatureSave}\n fieldLabel={currentSignatureField.label || currentSignatureField.name || 'Signature'}\n />\n )}\n\n {/* Initials Modal - FOR INITIALS ONLY */}\n {initialsModalOpen && currentInitialsField && (\n <InitialsModal\n isOpen={initialsModalOpen}\n onClose={() => {\n setInitialsModalOpen(false);\n setCurrentInitialsField(null);\n }}\n onSave={handleInitialsSave}\n fieldLabel={currentInitialsField.label || currentInitialsField.name || 'Initials'}\n />\n )}\n\n {/* Acknowledgement Modal */}\n <AcknowledgementModal\n open={acknowledgementModalOpen}\n onOpenChange={setAcknowledgementModalOpen}\n field={currentAcknowledgementField}\n onAcknowledge={acknowledgeItem}\n isAcknowledged={isAcknowledged}\n onComplete={handleAcknowledgementComplete}\n />\n\n {/* Unacknowledged Fields Modal */}\n <UnacknowledgedFieldsModal\n open={unacknowledgedModalOpen}\n onOpenChange={setUnacknowledgedModalOpen}\n unacknowledgedFields={getUnacknowledgedFieldsDetailed(filteredFields).map(({ field, unacknowledgedItems }) => ({\n field,\n unacknowledgedCount: unacknowledgedItems.length,\n }))}\n onAcknowledge={acknowledgeItem}\n isAcknowledged={isAcknowledged}\n />\n </div>\n );\n}\n\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"]}
|
|
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-metadata.ts","../../src/utils/font-loader.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-iso.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/input.tsx","../../src/components/SignatureTypeInput.tsx","../../src/lib/ui/dialog.tsx","../../src/components/SignatureModal.tsx","../../src/lib/ui/label.tsx","../../src/components/InitialsModal.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/RequiredFieldNavigation.tsx","../../src/components/ViewToggleToolbar.tsx","../../src/lib/ui/alert.tsx","../../src/components/FormFieldsView.tsx","../../src/components/AcknowledgementModal.tsx","../../src/components/UnacknowledgedFieldsModal.tsx","../../src/components/AcknowledgementsSidebar.tsx","../../src/components/DateFieldCalendarPopup.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/hooks/useAcknowledgements.ts","../../src/hooks/useRequiredFieldNavigation.ts","../../src/components/SubmissionForm.tsx","../../src/components/ErrorBoundary.tsx"],"names":["pdfjsLib2","f","PDFName","isValidDate","parseISO","forwardRef","useRef","useState","useEffect","useCallback","useImperativeHandle","jsx","Fragment","React","jsxs","React2","React4","cva","React6","React8","React10","CalendarIcon","React11","Check","React12","CheckCircle","ImageIcon","FileText","FileIcon","AlertCircle","X","useMemo","ChevronLeft","ChevronRight","React13","CheckCircle2","ChevronDown","Clock","format","PDFDocument","rgb","value","validateSignatures","indicatorType","allowedFieldIds","isAcknowledged","hasInitialsFields","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 (use version.txt, not dotfile — Next.js blocks dotfiles)\r\n const versionUrl = `${viewerBasePath}/version.txt`;\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 include:\r\n * - Simple type names: \"Text\", \"Signature\", etc.\r\n * - Type + timestamp: \"Dropdown 12413423423\", \"Text 1768236803505\"\r\n * - Pure timestamps: \"12413423423\"\r\n * - Type + numbers: \"Dropdown1\", \"Text_2\"\r\n *\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('Dropdown 12413423423') // 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 trimmed = label.trim();\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 // Check for simple type names\r\n if (autoLabels.includes(trimmed)) return true;\r\n\r\n // Check for pure timestamps (10+ digit numbers)\r\n if (/^\\d{10,}$/.test(trimmed)) return true;\r\n\r\n // Check for type + timestamp pattern: \"Dropdown 12413423423\" or \"Text_1768236803505\"\r\n const typeTimestampPattern = new RegExp(\r\n `^(${autoLabels.join('|')})[\\\\s_-]?\\\\d{10,}$`,\r\n 'i'\r\n );\r\n if (typeTimestampPattern.test(trimmed)) return true;\r\n\r\n // Check for type + short number: \"Dropdown1\", \"Text_2\", \"Signature 3\"\r\n const typeNumberPattern = new RegExp(\r\n `^(${autoLabels.join('|')})[\\\\s_-]?\\\\d{1,3}$`,\r\n 'i'\r\n );\r\n if (typeNumberPattern.test(trimmed)) return true;\r\n\r\n // Check for corrupted labels with repeated type words: \"Date 1767730185976 Date Date Date...\"\r\n // These occur when PDFs are saved multiple times and field names get concatenated\r\n const typeWordsJoined = autoLabels.join('|');\r\n const corruptedPattern = new RegExp(\r\n `^(${typeWordsJoined})[\\\\s_-]?\\\\d{10,}[\\\\s_-]?(${typeWordsJoined})+`,\r\n 'i'\r\n );\r\n if (corruptedPattern.test(trimmed)) return true;\r\n\r\n // Check for labels that are just repeated type words: \"Date Date Date\" or \"Signature Signature\"\r\n const repeatedTypePattern = new RegExp(\r\n `^((${typeWordsJoined})[\\\\s_-]+)+(${typeWordsJoined})$`,\r\n 'i'\r\n );\r\n if (repeatedTypePattern.test(trimmed)) return true;\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Check if a field has a drawable label (user-set custom label that should be rendered on the PDF)\r\n *\r\n * Returns false when:\r\n * - Label is empty or whitespace\r\n * - Label was auto-generated from field name during extraction (isLabelAutoGenerated flag)\r\n * - Label matches known auto-generated patterns (e.g., \"Text\", \"Signature 1\")\r\n *\r\n * @param field - Object with label and optional isLabelAutoGenerated flag\r\n * @returns true if the label should be drawn on the PDF\r\n */\r\nexport function hasDrawableLabel(field: { label?: string; isLabelAutoGenerated?: boolean }): boolean {\r\n if (!field.label || !field.label.trim()) return false;\r\n if (field.isLabelAutoGenerated) return false;\r\n if (isAutoGeneratedLabel(field.label)) return false;\r\n return true;\r\n}\r\n\r\n/**\r\n * Get a user-friendly display name for a field\r\n *\r\n * If the label is meaningful (not auto-generated), returns the label.\r\n * Otherwise, returns a clean field type name.\r\n *\r\n * @param field - Object with label and type properties\r\n * @returns A user-friendly name for display in error messages\r\n */\r\nexport function getFieldDisplayName(field: { label?: string; type?: string; name?: string }): string {\r\n // If label exists and is not auto-generated, use it\r\n if (field.label && !isAutoGeneratedLabel(field.label)) {\r\n return field.label;\r\n }\r\n\r\n // Map field types to friendly names\r\n const typeNames: Record<string, string> = {\r\n 'text': 'Text field',\r\n 'signature': 'Signature',\r\n 'initials': 'Initials',\r\n 'date': 'Date field',\r\n 'checkbox': 'Checkbox',\r\n 'dropdown': 'Dropdown',\r\n 'radio': 'Radio selection',\r\n 'radiogroup': 'Radio selection',\r\n 'text_label': 'Text label',\r\n };\r\n\r\n if (field.type) {\r\n const typeName = typeNames[field.type.toLowerCase()];\r\n if (typeName) {\r\n return typeName;\r\n }\r\n }\r\n\r\n // Fallback: clean up the field name\r\n if (field.name) {\r\n // Remove timestamps and clean up\r\n let cleaned = field.name\r\n .replace(/_?(signature|initials|date)$/i, '') // Remove type suffixes\r\n .replace(/[_-]\\d{10,}$/, '') // Remove timestamps\r\n .replace(/[_-]/g, ' ') // Replace separators with spaces\r\n .trim();\r\n\r\n if (cleaned && !isAutoGeneratedLabel(cleaned)) {\r\n return cleaned.replace(/\\b\\w/g, l => l.toUpperCase()); // Title case\r\n }\r\n }\r\n\r\n return 'This field';\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 * PDF Metadata Utilities\r\n * Functions for storing and retrieving Signiphi metadata in PDF documents\r\n */\r\n\r\nimport type { PDFDocument, PDFName as PDFNameType, PDFString as PDFStringType } from 'pdf-lib';\r\nimport { Acknowledgement } from '../types';\r\n\r\n// Module-level variables for pdf-lib classes (loaded dynamically)\r\nlet PDFName: typeof PDFNameType;\r\nlet PDFString: typeof PDFStringType;\r\n\r\n/**\r\n * Initialize PDF classes from dynamically loaded pdf-lib module\r\n * Must be called before using getSigniphiMetadata or setSigniphiMetadata\r\n */\r\nexport function initPdfMetadata(pdfLibModule: any): void {\r\n PDFName = pdfLibModule.PDFName;\r\n PDFString = pdfLibModule.PDFString;\r\n}\r\n\r\n/**\r\n * Metadata for a single form field\r\n */\r\nexport interface FieldMetadata {\r\n fieldId?: string; // Immutable UUID for reliable field identification\r\n label?: string;\r\n signer?: string;\r\n placeholder?: string;\r\n acknowledgements?: Acknowledgement[];\r\n required?: boolean;\r\n options?: string[]; // For radio and dropdown fields\r\n}\r\n\r\n/**\r\n * Complete metadata structure stored in PDF\r\n */\r\nexport interface SigniphiMetadata {\r\n version: string;\r\n fields: Record<string, FieldMetadata>; // Key is the actual PDF field name (with suffixes for date/signature/initials)\r\n fieldIdIndex?: Record<string, string>; // UUID → field name mapping for fast lookups\r\n}\r\n\r\n/**\r\n * Stores Signiphi metadata in the PDF's document information dictionary\r\n * @param pdfDoc - The PDF document to store metadata in\r\n * @param metadata - The metadata object to store\r\n */\r\nexport function setSigniphiMetadata(pdfDoc: PDFDocument, metadata: SigniphiMetadata): void {\r\n try {\r\n if (!PDFName || !PDFString) {\r\n console.error('PDF metadata classes not initialized. Call initPdfMetadata first.');\r\n return;\r\n }\r\n \r\n const infoRef = pdfDoc.context.trailerInfo.Info;\r\n const infoObj = pdfDoc.context.lookup(infoRef);\r\n if (!infoObj || typeof (infoObj as any).set !== 'function') {\r\n throw new Error('Info object is not a PDFDict or does not have set method');\r\n }\r\n const infoDict = infoObj as any;\r\n const metadataString = JSON.stringify(metadata);\r\n \r\n // Set the metadata\r\n infoDict.set(PDFName.of('SigniphiMetadata'), PDFString.of(metadataString));\r\n } catch (error) {\r\n console.error('Failed to set Signiphi metadata:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves Signiphi metadata from the PDF's document information dictionary\r\n * @param pdfDoc - The PDF document to read metadata from\r\n * @returns The metadata object if found, null otherwise\r\n */\r\nexport function getSigniphiMetadata(pdfDoc: PDFDocument): SigniphiMetadata | null {\r\n try {\r\n if (!PDFName || !PDFString) {\r\n console.error('PDF metadata classes not initialized. Call initPdfMetadata first.');\r\n return null;\r\n }\r\n \r\n const infoRef = pdfDoc.context.trailerInfo.Info;\r\n const infoObj = pdfDoc.context.lookup(infoRef);\r\n \r\n if (!infoObj || typeof (infoObj as any).get !== 'function' || !(infoObj as any).dict) {\r\n return null;\r\n }\r\n \r\n const infoDict = infoObj as any;\r\n const metadataObj = infoDict.get(PDFName.of('SigniphiMetadata'));\r\n \r\n if (!metadataObj) {\r\n return null;\r\n }\r\n \r\n // PDFString objects are encoded as \"(content)\" in their toString() representation\r\n const metadataStr = metadataObj.toString();\r\n \r\n // Extract content from PDF string format: (content) or <hex>\r\n let jsonStr = metadataStr;\r\n const parenMatch = metadataStr.match(/^\\((.*)\\)$/);\r\n if (parenMatch && parenMatch[1]) {\r\n jsonStr = parenMatch[1];\r\n } else {\r\n const hexMatch = metadataStr.match(/^<(.*)>$/);\r\n if (hexMatch && hexMatch[1]) {\r\n // Convert hex to string if needed\r\n jsonStr = hexMatch[1];\r\n }\r\n }\r\n \r\n const metadata = JSON.parse(jsonStr);\r\n return metadata;\r\n } catch (error) {\r\n console.error('Failed to load Signiphi metadata:', error);\r\n return null;\r\n }\r\n}\r\n","/**\r\n * Font loading and text-to-signature generation utilities\r\n * Uses Google Fonts for cursive/handwritten signature styles\r\n */\r\n\r\nexport interface SignatureFont {\r\n name: string;\r\n family: string;\r\n label: string;\r\n}\r\n\r\n/**\r\n * Available signature fonts from Google Fonts\r\n */\r\nexport const SIGNATURE_FONTS: SignatureFont[] = [\r\n { name: 'dancing-script', family: 'Dancing Script', label: 'Elegant' },\r\n { name: 'great-vibes', family: 'Great Vibes', label: 'Formal' },\r\n { name: 'caveat', family: 'Caveat', label: 'Casual' },\r\n { name: 'homemade-apple', family: 'Homemade Apple', label: 'Natural' },\r\n { name: 'sacramento', family: 'Sacramento', label: 'Flowing' },\r\n];\r\n\r\n/**\r\n * Default font to use\r\n */\r\nexport const DEFAULT_SIGNATURE_FONT: SignatureFont = {\r\n name: 'dancing-script',\r\n family: 'Dancing Script',\r\n label: 'Elegant',\r\n};\r\n\r\n/**\r\n * Google Fonts URL for all signature fonts\r\n */\r\nconst GOOGLE_FONTS_URL =\r\n 'https://fonts.googleapis.com/css2?family=Dancing+Script&family=Great+Vibes&family=Caveat&family=Homemade+Apple&family=Sacramento&display=swap';\r\n\r\nlet fontsLoaded = false;\r\nlet fontsLoadingPromise: Promise<void> | null = null;\r\n\r\n/**\r\n * Load all signature fonts from Google Fonts\r\n * This function is idempotent - it will only load fonts once\r\n */\r\nexport async function loadSignatureFonts(): Promise<void> {\r\n if (fontsLoaded) {\r\n return;\r\n }\r\n\r\n if (fontsLoadingPromise) {\r\n return fontsLoadingPromise;\r\n }\r\n\r\n fontsLoadingPromise = new Promise<void>((resolve, reject) => {\r\n // Check if fonts link already exists\r\n const existingLink = document.querySelector(\r\n `link[href=\"${GOOGLE_FONTS_URL}\"]`\r\n );\r\n if (existingLink) {\r\n fontsLoaded = true;\r\n resolve();\r\n return;\r\n }\r\n\r\n const link = document.createElement('link');\r\n link.href = GOOGLE_FONTS_URL;\r\n link.rel = 'stylesheet';\r\n\r\n link.onload = () => {\r\n fontsLoaded = true;\r\n resolve();\r\n };\r\n\r\n link.onerror = () => {\r\n fontsLoadingPromise = null;\r\n reject(new Error('Failed to load signature fonts from Google Fonts'));\r\n };\r\n\r\n document.head.appendChild(link);\r\n });\r\n\r\n return fontsLoadingPromise;\r\n}\r\n\r\n/**\r\n * Check if a specific font is available/loaded\r\n */\r\nexport function isFontLoaded(fontFamily: string): boolean {\r\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n return document.fonts.check(`48px \"${fontFamily}\"`);\r\n}\r\n\r\n/**\r\n * Wait for a specific font to be ready\r\n */\r\nexport async function waitForFont(fontFamily: string): Promise<boolean> {\r\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n\r\n try {\r\n await document.fonts.load(`48px \"${fontFamily}\"`);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport interface GenerateSignatureOptions {\r\n text: string;\r\n fontFamily: string;\r\n width?: number;\r\n height?: number;\r\n fontSize?: number;\r\n color?: string;\r\n backgroundColor?: string | null;\r\n}\r\n\r\n/**\r\n * Generate a signature image from text using a canvas\r\n * @returns PNG data URL (data:image/png;base64,...)\r\n */\r\nexport function generateSignatureFromText(\r\n options: GenerateSignatureOptions\r\n): string {\r\n const {\r\n text,\r\n fontFamily,\r\n width = 450,\r\n height = 200,\r\n fontSize = 48,\r\n color = '#000000',\r\n backgroundColor = null,\r\n } = options;\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = width;\r\n canvas.height = height;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) {\r\n throw new Error('Failed to get canvas 2d context');\r\n }\r\n\r\n // Clear canvas or fill with background color\r\n if (backgroundColor) {\r\n ctx.fillStyle = backgroundColor;\r\n ctx.fillRect(0, 0, width, height);\r\n } else {\r\n ctx.clearRect(0, 0, width, height);\r\n }\r\n\r\n // Configure text rendering\r\n ctx.font = `${fontSize}px \"${fontFamily}\"`;\r\n ctx.fillStyle = color;\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n\r\n // Measure text and adjust font size if needed to fit\r\n let adjustedFontSize = fontSize;\r\n let textMetrics = ctx.measureText(text);\r\n\r\n // If text is too wide, reduce font size\r\n const maxWidth = width * 0.9; // Leave 5% padding on each side\r\n while (textMetrics.width > maxWidth && adjustedFontSize > 16) {\r\n adjustedFontSize -= 2;\r\n ctx.font = `${adjustedFontSize}px \"${fontFamily}\"`;\r\n textMetrics = ctx.measureText(text);\r\n }\r\n\r\n // Draw text centered\r\n ctx.fillText(text, width / 2, height / 2);\r\n\r\n return canvas.toDataURL('image/png');\r\n}\r\n\r\n/**\r\n * Generate signature with automatic font loading\r\n * Ensures the font is loaded before rendering\r\n */\r\nexport async function generateSignatureFromTextAsync(\r\n options: GenerateSignatureOptions\r\n): Promise<string> {\r\n // Load fonts first\r\n await loadSignatureFonts();\r\n\r\n // Wait for the specific font to be ready\r\n await waitForFont(options.fontFamily);\r\n\r\n return generateSignatureFromText(options);\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","/**\n * Field Visibility Utilities\n * Core logic for determining which fields are visible/editable in multi-signer mode\n * \n * XIGNIPHI MODEL: All signers are equal - no primary/secondary hierarchy\n * Signers are ordered by signOrder for sequential signing only\n * \n * CRITICAL: This logic must work identically in both flows:\n * - Single-signer flow: isMultiSigner = false, all fields visible\n * - Multi-signer flow: isMultiSigner = true, filtered by assignment rules\n */\n\nimport type { EsignFormField, MultiSignerContext } from '../types';\n\n/**\n * Determine if a field should be visible to the current signer\n * \n * Implements signiphi's simple 4-rule visibility logic:\n * - Rule 1: Unassigned fields → visible to all signers\n * - Rule 2: Direct assignment → show if assigned to current signer\n * - Rule 3: Grouped assignments (\"to-recipients\", \"additional-signers\") → visible to all signers\n * - Rule 4: Assigned to different specific signer → hide\n * \n * @param field - The form field to check\n * @param multiSignerContext - Multi-signer context with current signer info\n * @returns true if field should be visible, false if hidden\n * \n * @example Single-signer flow\n * ```ts\n * const context = { isMultiSigner: false, ... };\n * isFieldVisibleToSigner(anyField, context); // always returns true\n * ```\n * \n * @example Multi-signer flow\n * ```ts\n * const context = {\n * isMultiSigner: true,\n * currentSignerEmail: 'signer1@example.com',\n * isPrimarySigner: false, // Not used in signiphi\n * isFinalSigner: false // Not used in signiphi\n * };\n * \n * // Unassigned field - all signers see it\n * isFieldVisibleToSigner({ assignedSignerEmail: undefined, ... }, context); // true\n * \n * // Direct assignment to current signer\n * isFieldVisibleToSigner({ assignedSignerEmail: 'signer1@example.com', ... }, context); // true\n * \n * // Grouped assignment - all signers see it\n * isFieldVisibleToSigner({ assignedSignerEmail: 'to-recipients', ... }, context); // true\n * ```\n */\nexport function isFieldVisibleToSigner(\n field: EsignFormField,\n multiSignerContext: MultiSignerContext\n): boolean {\n // Single-signer mode: all fields are visible\n if (!multiSignerContext.isMultiSigner) {\n return true;\n }\n\n const { currentSignerEmail } = multiSignerContext;\n\n // RULE 1: Unassigned fields - visible to all signers (signiphi's flat model)\n if (!field.assignedSignerEmail) {\n return true;\n }\n\n // RULE 2: Direct assignment - show if assigned to current signer\n if (field.assignedSignerEmail === currentSignerEmail) {\n return true;\n }\n\n // RULE 3: Grouped assignments - visible to all signers (convenience feature)\n // \"to-recipients\" means field assigned to ALL signers\n // \"additional-signers\" is legacy but works the same way\n if (field.assignedSignerEmail === 'to-recipients' || \n field.assignedSignerEmail === 'additional-signers') {\n return true;\n }\n\n // RULE 4: Assigned to different specific signer - hide\n return false;\n}\n\n/**\n * Filter an array of fields to only those visible to the current signer\n * \n * @param fields - All form fields\n * @param multiSignerContext - Multi-signer context\n * @returns Filtered array of visible fields\n * \n * @example\n * ```ts\n * const allFields = [...]; // 10 fields\n * const context = { isMultiSigner: true, isPrimarySigner: true, ... };\n * const visible = filterFieldsBySigner(allFields, context); // 5 fields (only primary signer's)\n * ```\n */\nexport function filterFieldsBySigner(\n fields: EsignFormField[],\n multiSignerContext: MultiSignerContext\n): EsignFormField[] {\n // Single-signer mode: return all fields\n if (!multiSignerContext.isMultiSigner) {\n return fields;\n }\n\n // Multi-signer mode: filter using visibility logic\n return fields.filter(field => isFieldVisibleToSigner(field, multiSignerContext));\n}\n\n/**\n * Determine if a field should be flattened (made non-editable) by the current signer\n * \n * Used during PDF submission to determine which fields to flatten.\n * In multi-signer mode, only flatten fields assigned to current signer.\n * In single-signer mode, flatten all fields.\n * \n * XIGNIPHI MODEL: Flatten fields visible/assigned to current signer\n * \n * CRITICAL: This affects PDF flattening behavior - must preserve exact logic!\n * \n * @param field - The form field to check\n * @param multiSignerContext - Multi-signer context\n * @returns true if current signer should flatten this field\n * \n * @example Single-signer flow\n * ```ts\n * const context = { isMultiSigner: false, ... };\n * shouldFlattenField(anyField, context); // always returns true\n * ```\n * \n * @example Multi-signer flow\n * ```ts\n * const context = {\n * isMultiSigner: true,\n * currentSignerEmail: 'signer1@example.com',\n * isPrimarySigner: false, // Not used in signiphi\n * isFinalSigner: false // Not used in signiphi\n * };\n * \n * // Current signer's field - flatten it\n * shouldFlattenField({ assignedSignerEmail: 'signer1@example.com', ... }, context); // true\n * \n * // Different signer's field - don't flatten (keep editable for them)\n * shouldFlattenField({ assignedSignerEmail: 'signer2@example.com', ... }, context); // false\n * \n * // Unassigned field - all signers flatten (visible to all)\n * shouldFlattenField({ assignedSignerEmail: undefined, ... }, context); // true\n * ```\n */\nexport function shouldFlattenField(\n field: EsignFormField,\n multiSignerContext: MultiSignerContext\n): boolean {\n // Single-signer mode: flatten all fields\n if (!multiSignerContext.isMultiSigner) {\n return true;\n }\n\n const { currentSignerEmail } = multiSignerContext;\n\n // RULE 1: Unassigned fields - all signers flatten them (visible to all)\n if (!field.assignedSignerEmail) {\n return true;\n }\n\n // RULE 2: Direct assignment - flatten if assigned to current signer\n if (field.assignedSignerEmail === currentSignerEmail) {\n return true;\n }\n\n // RULE 3: Grouped assignments - all signers flatten them (visible to all)\n if (field.assignedSignerEmail === 'to-recipients' || \n field.assignedSignerEmail === 'additional-signers') {\n return true;\n }\n\n // RULE 4: Assigned to different specific signer - DON'T flatten (keep editable for them)\n return false;\n}\n\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 * IMPORTANT: Uses duck typing (method detection) instead of constructor.name\r\n * to ensure minification-safe field type detection. Constructor names are\r\n * renamed during minification, breaking string comparisons.\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 getText?(): string;\r\n setText?(text: string): void;\r\n isRequired?(): boolean;\r\n isChecked?(): boolean;\r\n check?(): void;\r\n uncheck?(): void;\r\n getSelected?(): string[];\r\n getOptions?(): string[];\r\n select?(value: string): void;\r\n setOptions?(options: string[]): void;\r\n addOptions?(options: string[]): void;\r\n enableReadOnly?(): void;\r\n}\r\n\r\n/**\r\n * Detect the field type from a PDF field using duck typing\r\n *\r\n * Uses method presence detection instead of constructor.name to ensure\r\n * minification-safe field type detection. Each pdf-lib field type has\r\n * unique methods that can be used to identify it.\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 f = field as any;\r\n\r\n // Checkbox: has check/uncheck methods (unique to checkboxes)\r\n if (typeof f.check === 'function' && typeof f.uncheck === 'function') {\r\n return 'checkbox';\r\n }\r\n\r\n // Radio: has select/getOptions but NOT check (distinguishes from checkbox)\r\n // and NOT setOptions (distinguishes from dropdown)\r\n if (typeof f.select === 'function' &&\r\n typeof f.getOptions === 'function' &&\r\n typeof f.check !== 'function' &&\r\n typeof f.setOptions !== 'function') {\r\n return 'radiogroup';\r\n }\r\n\r\n // Dropdown: has select/getOptions AND setOptions or addOptions\r\n if (typeof f.select === 'function' &&\r\n typeof f.getOptions === 'function' &&\r\n (typeof f.setOptions === 'function' || typeof f.addOptions === 'function')) {\r\n return 'dropdown';\r\n }\r\n\r\n // OptionList: has getOptions and setOptions but no select\r\n if (typeof f.getOptions === 'function' &&\r\n typeof f.setOptions === 'function' &&\r\n typeof f.select !== 'function') {\r\n return 'optionlist';\r\n }\r\n\r\n // Text: has getText/setText methods\r\n if (typeof f.getText === 'function' && typeof f.setText === 'function') {\r\n return 'text';\r\n }\r\n\r\n // Signature: no editable methods (no getText, no check, no select)\r\n if (typeof f.getText !== 'function' &&\r\n typeof f.check !== 'function' &&\r\n typeof f.select !== 'function') {\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 case 'date':\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 // Dropdowns return an array from getSelected()\r\n const selected = field.getSelected?.();\r\n return Array.isArray(selected) ? selected[0] || '' : String(selected || '');\r\n }\r\n\r\n case 'radiogroup':\r\n case 'radio': {\r\n // Radio groups return a string from getSelected(), not an array\r\n const radioSelected = field.getSelected?.();\r\n return radioSelected ? String(radioSelected) : '';\r\n }\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, hasDrawableLabel, getFieldDisplayName } 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 dict?: any; // PDF dictionary for accessing metadata\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 // Look up the matching extracted field for proper label/type info\r\n const extractedField = extractedFields?.find(f => f.name === field.name);\r\n\r\n // In multi-signer mode, only validate fields visible to current signer\r\n if (multiSignerContext?.isMultiSigner && extractedFields) {\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 // Skip fields already validated at the SubmissionForm level (date, signature, initials)\r\n // to avoid duplicate error messages. The raw PDF type for dates is 'text', so we\r\n // use the extractedField type which has the correct logical type.\r\n const logicalType = extractedField?.type || field.type;\r\n if (logicalType === 'date' || logicalType === 'signature' || logicalType === 'initials') {\r\n continue;\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 if (field.type === 'checkbox' || logicalType === 'checkbox') {\r\n // Checkbox: value is 'true'/'false' string - must be specifically 'true' (checked)\r\n hasValue = fieldValue === 'true' || field.value === 'true';\r\n } else {\r\n hasValue = !!(fieldValue || field.value);\r\n }\r\n\r\n if (!hasValue) {\r\n // Use extractedField label and type for proper display names\r\n const friendlyName = getFieldDisplayName({\r\n label: extractedField?.label,\r\n name: field.name,\r\n type: logicalType\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 // Use centralized friendly name logic that handles auto-generated labels\r\n const friendlyName = getFieldDisplayName({\r\n name: field.name,\r\n type: field.type\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 * Helper function to extract font size from a field\r\n * Priority: 1) extractedFormFields metadata, 2) DA field, 3) TU field, 4) default 10px\r\n */\r\nfunction extractFieldFontSize(\r\n fieldName: string,\r\n field: any,\r\n extractedFormFields?: EsignFormField[]\r\n): number {\r\n const DEFAULT_FONT_SIZE = 10;\r\n const MIN_FONT_SIZE = 8;\r\n const MAX_FONT_SIZE = 72;\r\n\r\n // 1. Try extractedFormFields metadata first (runtime information)\r\n const fieldInfo = extractedFormFields?.find(f => f.name === fieldName);\r\n if (fieldInfo?.fontSize && fieldInfo.fontSize >= MIN_FONT_SIZE && fieldInfo.fontSize <= MAX_FONT_SIZE) {\r\n return fieldInfo.fontSize;\r\n }\r\n\r\n // 2. Try DA (Default Appearance) field - standard PDF font size location\r\n const daFontSize = extractFromDAField(field);\r\n if (daFontSize !== null) {\r\n return daFontSize;\r\n }\r\n\r\n // 3. Try TU (alternate text) field - custom fontSize metadata format\r\n const tuFontSize = extractFromTUField(field);\r\n if (tuFontSize !== null) {\r\n return tuFontSize;\r\n }\r\n\r\n // 4. Default fallback\r\n return DEFAULT_FONT_SIZE;\r\n}\r\n\r\n/**\r\n * Extract font size from DA (Default Appearance) field\r\n * Format: \"0 0 0 rg\\n/Helvetica 16 Tf\"\r\n */\r\nfunction extractFromDAField(field: any): number | null {\r\n try {\r\n const fieldWithAcro = field as unknown as PDFFieldWithAcro;\r\n const dict = fieldWithAcro.acroField?.dict;\r\n if (!dict) return null;\r\n\r\n const daKey = dict.context?.obj?.('DA') || 'DA';\r\n const daEntry = dict.lookup?.(daKey) || dict.get?.(daKey);\r\n if (!daEntry) return null;\r\n\r\n // Get DA string value\r\n let daValue = '';\r\n if (typeof daEntry.decodeText === 'function') {\r\n daValue = daEntry.decodeText();\r\n } else if (typeof daEntry.asString === 'function') {\r\n daValue = daEntry.asString();\r\n } else {\r\n daValue = String(daEntry);\r\n }\r\n\r\n // Match pattern like \"/Helvetica 24 Tf\" or \"24 Tf\"\r\n const daMatch = daValue.match(/\\s+(\\d+)\\s+Tf/i);\r\n if (daMatch?.[1]) {\r\n const fontSize = parseInt(daMatch[1], 10);\r\n if (fontSize >= 8 && fontSize <= 72) {\r\n return fontSize;\r\n }\r\n }\r\n } catch {\r\n // Silently fail\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Extract font size from TU (alternate text) field\r\n * Format: \"Label Text|fontSize:16\"\r\n */\r\nfunction extractFromTUField(field: any): number | null {\r\n try {\r\n const fieldWithAcro = field as unknown as PDFFieldWithAcro;\r\n const dict = fieldWithAcro.acroField?.dict;\r\n if (!dict) return null;\r\n\r\n const tuKey = dict.context?.obj?.('TU') || 'TU';\r\n const tuEntry = dict.lookup?.(tuKey) || dict.get?.(tuKey);\r\n if (!tuEntry) return null;\r\n\r\n // Get TU string value\r\n let tuValue = '';\r\n if (typeof tuEntry.decodeText === 'function') {\r\n tuValue = tuEntry.decodeText();\r\n } else if (typeof tuEntry.asString === 'function') {\r\n tuValue = tuEntry.asString();\r\n } else {\r\n tuValue = String(tuEntry);\r\n }\r\n\r\n // Parse custom format: \"Label|fontSize:16\"\r\n tuValue = tuValue.replace(/^\\(|\\)$|^<|>$/g, '');\r\n const match = tuValue.match(/\\|fontSize:(\\d+)$/);\r\n if (match?.[1]) {\r\n const fontSize = parseInt(match[1], 10);\r\n if (fontSize >= 8 && fontSize <= 72) {\r\n return fontSize;\r\n }\r\n }\r\n } catch {\r\n // Silently fail\r\n }\r\n return null;\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, // Deprecated: use multiSignerContext.currentSignerEmail instead\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 // Use duck typing for field type detection (minification-safe)\r\n // Constructor names get renamed during minification, breaking string comparisons\r\n const f = field as any;\r\n const isTextField = typeof f.getText === 'function' && typeof f.setText === 'function';\r\n const isCheckbox = typeof f.check === 'function' && typeof f.uncheck === 'function';\r\n const isRadio = typeof f.select === 'function' &&\r\n typeof f.getOptions === 'function' &&\r\n typeof f.check !== 'function' &&\r\n typeof f.setOptions !== 'function';\r\n const isDropdown = typeof f.select === 'function' &&\r\n (typeof f.setOptions === 'function' || typeof f.addOptions === 'function');\r\n\r\n // Handle text fields\r\n if (isTextField) {\r\n f.setText?.(fieldValue);\r\n }\r\n // Handle checkbox fields\r\n else if (isCheckbox) {\r\n if (fieldValue === 'true' || fieldValue === 'Yes' || fieldValue === 'checked' || fieldValue === 'On') {\r\n f.check?.();\r\n } else {\r\n f.uncheck?.();\r\n }\r\n }\r\n // Handle radio group fields\r\n else if (isRadio) {\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 = f.getOptions?.() || [];\r\n if (selectedIndex >= 0 && selectedIndex < options.length) {\r\n f.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 = f.getOptions?.() || [];\r\n if (options.includes(fieldValue)) {\r\n f.select?.(fieldValue);\r\n } else {\r\n }\r\n }\r\n }\r\n // Handle dropdown fields\r\n else if (isDropdown) {\r\n f.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 \r\n // NOTE: We skip setting NeedAppearances to false because accessing the catalog\r\n // can corrupt the PDF structure. Modern PDF viewers handle this correctly without it.\r\n \r\n } catch (appearanceError) {\r\n // Some PDFs may not support this operation - fail gracefully\r\n logger.warn('Could not update field appearances:', appearanceError);\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 // Draw label above signature field (same sizing as text fields)\r\n const fieldInfo = extractedFormFields?.find(f => f.name === fieldName);\r\n if (fieldInfo && hasDrawableLabel(fieldInfo)) {\r\n const labelFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold);\r\n const labelFontSize = Math.min(10, height * 0.4);\r\n const labelX = x;\r\n const labelY = y + height + 5; // Above the field\r\n page.drawText(fieldInfo.label, {\r\n x: labelX,\r\n y: labelY,\r\n size: labelFontSize,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\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 console.log('[FLATTEN] === APPLYING INITIALS ===');\r\n console.log('[FLATTEN] formFieldValues keys:', Object.keys(formFieldValues));\r\n console.log('[FLATTEN] Initials fields in formFieldValues:', Object.keys(formFieldValues).filter(k => k.toLowerCase().includes('initials')));\r\n const mainInitialsData = formFieldValues['initials_field_main'];\r\n console.log('[FLATTEN] mainInitialsData from initials_field_main:', mainInitialsData ? mainInitialsData.substring(0, 50) : '(MISSING)');\r\n if (mainInitialsData && mainInitialsData.trim()) {\r\n \r\n console.log('[FLATTEN] fieldPageMap keys:', Object.keys(fieldPageMap));\r\n console.log('[FLATTEN] Looking for initials fields in fieldPageMap...');\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 console.log('[FLATTEN] After pattern matching in fieldPageMap:', foundInitialsFields);\r\n\r\n // Filter by signer if needed\r\n if (extractedFormFields && extractedFormFields.length > 0) {\r\n foundInitialsFields = foundInitialsFields.filter(fieldName => {\r\n // Try exact name match first, then strip suffix for fallback\r\n const fieldInfo = extractedFormFields.find(f => f.name === fieldName)\r\n || extractedFormFields.find(f => f.name === fieldName.replace(/_initials$/i, ''))\r\n || extractedFormFields.find(f => fieldName.startsWith(f.name));\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 // 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 }\r\n\r\n console.log('[FLATTEN] Found', foundInitialsFields.length, 'initials fields to flatten:', foundInitialsFields);\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 console.log('[FLATTEN] Processing initials field:', fieldName);\r\n const pageNumber = fieldPageMap[fieldName];\r\n console.log('[FLATTEN] Page number:', pageNumber);\r\n if (pageNumber && pageNumber <= pages.length) {\r\n const page = pages[pageNumber - 1];\r\n if (!page) {\r\n console.log('[FLATTEN] ❌ Page not found');\r\n continue;\r\n }\r\n\r\n const fieldPosition = fieldPositionMap[fieldName];\r\n console.log('[FLATTEN] Field position:', fieldPosition);\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 // Draw label above initials field\r\n // Try multiple matching strategies: exact name, stripped suffix, prefix, fieldId\r\n const fieldInfo = extractedFormFields?.find(f => f.name === fieldName)\r\n || extractedFormFields?.find(f => f.name === fieldName.replace(/_initials$/i, ''))\r\n || extractedFormFields?.find(f => fieldName.startsWith(f.name))\r\n || extractedFormFields?.find(f => f.fieldId && fieldName.includes(f.fieldId))\r\n || extractedFormFields?.find(f => f.type === 'initials' && f.name !== 'initials_field_main');\r\n if (fieldInfo && hasDrawableLabel(fieldInfo)) {\r\n const labelFontSize = Math.min(10, height * 0.4);\r\n const labelX = x;\r\n const labelY = y + height + 5; // Above the field\r\n page.drawText(fieldInfo.label, {\r\n x: labelX,\r\n y: labelY,\r\n size: labelFontSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\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 console.log('[FLATTEN] ✅ Drawing initials at:', { x: finalX, y: finalY, fontSize, text: mainInitialsData });\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 } else {\r\n console.log('[FLATTEN] ❌ Field position not found in position map');\r\n }\r\n } else {\r\n console.log('[FLATTEN] ❌ Invalid page number or page out of bounds');\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\r\n // Use duck typing for field type detection (minification-safe)\r\n // Constructor names get renamed during minification, breaking string comparisons\r\n const f = field as any;\r\n const isCheckboxField = typeof f.check === 'function' && typeof f.uncheck === 'function';\r\n const isRadioField = typeof f.select === 'function' &&\r\n typeof f.getOptions === 'function' &&\r\n typeof f.check !== 'function' &&\r\n typeof f.setOptions !== 'function';\r\n const isDropdownField = typeof f.select === 'function' &&\r\n (typeof f.setOptions === 'function' || typeof f.addOptions === 'function');\r\n const isTextField = typeof f.getText === 'function' && typeof f.setText === 'function';\r\n // Signature fields have no editable methods\r\n const isSignatureType = !isCheckboxField && !isRadioField && !isDropdownField && !isTextField;\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') || isSignatureType;\r\n const isInitialsField = fieldName.toLowerCase().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 (isCheckboxField) {\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 // Get field info for label\r\n const fieldInfo = extractedFormFields?.find(f => f.name === fieldName);\r\n const labelFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold);\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 label to the right\r\n if (fieldInfo && hasDrawableLabel(fieldInfo)) {\r\n const labelFontSize = Math.min(10, rect.height * 0.4);\r\n const labelX = rect.x + rect.width + 5; // To the right of checkbox\r\n const labelY = rect.y + (rect.height - labelFontSize) / 2;\r\n page.drawText(fieldInfo.label, {\r\n x: labelX,\r\n y: labelY,\r\n size: labelFontSize,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n \r\n // Draw checkbox border - use full field rect size\r\n const checkboxSize = Math.min(rect.width, rect.height);\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 X using proper font metrics for centering\r\n const checkFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold);\r\n const checkFontSize = checkboxSize * 0.7;\r\n const textWidth = checkFont.widthOfTextAtSize('X', checkFontSize);\r\n const textHeight = checkFont.heightAtSize(checkFontSize);\r\n\r\n page.drawText('X', {\r\n x: checkboxX + (checkboxSize - textWidth) / 2,\r\n y: checkboxY + (checkboxSize - textHeight) / 2 + textHeight * 0.15,\r\n size: checkFontSize,\r\n font: checkFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n \r\n }\r\n } else {\r\n // Draw checkbox border and label even when unchecked\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 (empty, no checkmark) - use full field rect size\r\n const checkboxSize = Math.min(rect.width, rect.height);\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 label if present\r\n if (fieldInfo && hasDrawableLabel(fieldInfo)) {\r\n const labelFontSize = Math.min(12, rect.height * 0.6);\r\n const labelX = rect.x + rect.width + 5;\r\n const labelY = rect.y + (rect.height - labelFontSize) / 2;\r\n page.drawText(fieldInfo.label, {\r\n x: labelX,\r\n y: labelY,\r\n size: labelFontSize,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n }\r\n }\r\n } else if (isRadioField) {\r\n // Radio group field - draw all radio buttons, fill the selected one\r\n const radioGroup = f;\r\n \r\n // Get field info for labels and options (need this before determining selectedIndex)\r\n const fieldInfo = extractedFormFields?.find(f => f.name === fieldName);\r\n \r\n // Get the ACTUAL selected value from the PDF field (after it was set)\r\n let actualSelectedValue = '';\r\n try {\r\n actualSelectedValue = radioGroup.getSelected?.() || '';\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: radioGroup.getSelected() returned: \"${actualSelectedValue}\"`);\r\n } catch (e) {\r\n // Fallback to user entered value if we can't read the field\r\n actualSelectedValue = userEnteredValue ? String(userEnteredValue) : '';\r\n logger.warn(`[FLATTEN RADIO] Field ${fieldName}: could not read selected value, using userEnteredValue: \"${actualSelectedValue}\"`);\r\n }\r\n \r\n // Determine selected index\r\n let selectedIndex = -1;\r\n \r\n // Get all options from the radio group\r\n const radioOptions = radioGroup.getOptions?.() || [];\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: radioGroup.getOptions() returned ${radioOptions.length} options:`, radioOptions);\r\n \r\n // If we have an actual selected value from the field, find its index\r\n if (actualSelectedValue && radioOptions.length > 0) {\r\n selectedIndex = radioOptions.findIndex((opt: string) => opt === actualSelectedValue);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: found actualSelectedValue \"${actualSelectedValue}\" at index ${selectedIndex}`);\r\n }\r\n \r\n // Fallback: try to parse from user entered value if we didn't find it above\r\n if (selectedIndex === -1 && userEnteredValue) {\r\n const selectedValue = String(userEnteredValue);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: selectedIndex still -1, trying to parse from userEnteredValue: \"${selectedValue}\"`);\r\n \r\n // Handle __RADIO_OPTION_INDEX_ pattern directly\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 selectedIndex = parseInt(indexMatch[1], 10);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: extracted index ${selectedIndex} from __RADIO_OPTION_INDEX_ pattern`);\r\n }\r\n } \r\n // Handle numeric string (just an index)\r\n else if (/^\\d+$/.test(selectedValue)) {\r\n selectedIndex = parseInt(selectedValue, 10);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: parsed numeric index ${selectedIndex}`);\r\n }\r\n // Match against actual option values from field info\r\n else if (fieldInfo?.options && selectedValue) {\r\n selectedIndex = fieldInfo.options.findIndex(option => option === selectedValue);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: matched \"${selectedValue}\" in fieldInfo.options at index ${selectedIndex}`);\r\n }\r\n // Match against radio group options\r\n else if (radioOptions.length > 0) {\r\n selectedIndex = radioOptions.findIndex((opt: string) => opt === selectedValue);\r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: matched \"${selectedValue}\" in radioOptions at index ${selectedIndex}`);\r\n }\r\n }\r\n \r\n logger.info(`[FLATTEN RADIO] Field ${fieldName}: FINAL selectedIndex = ${selectedIndex}, will draw filled circle at this index`);\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 && hasDrawableLabel(fieldInfo)) {\r\n const groupLabelKey = `${pageIndex}-${fieldName}-grouplabel`;\r\n if (!drawnGroupLabels.has(groupLabelKey)) {\r\n const labelFontSize = Math.min(10, rect.height * 0.4);\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: labelFontSize,\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);\r\n const centerX = rect.x + rect.width / 2;\r\n const centerY = rect.y + rect.height / 2;\r\n\r\n page.drawCircle({\r\n x: centerX,\r\n y: centerY,\r\n size: radioSize / 2,\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 page.drawCircle({\r\n x: centerX,\r\n y: centerY,\r\n size: radioSize / 4,\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 // Same positioning as preview (pdf-viewer-filter.ts)\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 - 7) / 2,\r\n size: 7,\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 (isDropdownField) {\r\n // Dropdown field - draw the selected value with 14px font\r\n const selectedValue = userEnteredValue ? String(userEnteredValue) : '';\r\n \r\n // Get field info for label\r\n const fieldInfo = extractedFormFields?.find(f => f.name === fieldName);\r\n const labelFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold);\r\n \r\n // Draw label for dropdown fields (even when empty)\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 label above the field\r\n if (fieldInfo && hasDrawableLabel(fieldInfo)) {\r\n const labelFontSize = Math.min(10, rect.height * 0.4);\r\n const labelX = rect.x;\r\n const labelY = rect.y + rect.height + 5;\r\n page.drawText(fieldInfo.label, {\r\n x: labelX,\r\n y: labelY,\r\n size: labelFontSize,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n \r\n // Draw value only if present\r\n if (selectedValue && selectedValue.trim()) {\r\n page.drawText(selectedValue, {\r\n x: rect.x + 2,\r\n y: rect.y + 2,\r\n size: 14,\r\n font: await pdfDoc.embedFont(StandardFonts.Helvetica),\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n }\r\n } else {\r\n // Text field or other field types (including date) - draw the field value\r\n const fieldValue = userEnteredValue ? String(userEnteredValue) : '';\r\n \r\n // Get field info for label\r\n const fieldInfo = extractedFormFields?.find(f => f.name === fieldName);\r\n const labelFont = await pdfDoc.embedFont(StandardFonts.HelveticaBold);\r\n \r\n // Draw label for text/date fields (even when empty)\r\n // Check if this is a date field\r\n const isDateField = fieldName.toLowerCase().includes('date') || fieldName.toLowerCase().includes('_date');\r\n \r\n // Use 14px for date fields, otherwise extract font size\r\n const fontSize = isDateField ? 14 : extractFieldFontSize(fieldName, field, extractedFormFields);\r\n \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 label above the field (dm-web-frontend pattern)\r\n if (fieldInfo && hasDrawableLabel(fieldInfo)) {\r\n const labelFontSize = Math.min(10, rect.height * 0.4);\r\n const labelX = rect.x;\r\n const labelY = rect.y + rect.height + 5; // Above the field\r\n page.drawText(fieldInfo.label, {\r\n x: labelX,\r\n y: labelY,\r\n size: labelFontSize,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n \r\n // Draw value only if present\r\n if (fieldValue && fieldValue.trim()) {\r\n page.drawText(fieldValue, {\r\n x: rect.x + 2,\r\n y: rect.y + 2,\r\n size: fontSize,\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 // 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 \r\n // Draw label above field\r\n if (hasDrawableLabel(field)) {\r\n const labelFontSize = Math.min(10, field.position.height * 0.4);\r\n const labelX = pdfX;\r\n const labelY = pdfY + field.position.height + 5;\r\n page.drawText(field.label, {\r\n x: labelX,\r\n y: labelY,\r\n size: labelFontSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n \r\n // Draw value if present\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.DATE: {\r\n const value = fieldValues[field.id] || '';\r\n \r\n // Draw label above field\r\n if (hasDrawableLabel(field)) {\r\n const labelFontSize = Math.min(10, field.position.height * 0.4);\r\n const labelX = pdfX;\r\n const labelY = pdfY + field.position.height + 5;\r\n page.drawText(field.label, {\r\n x: labelX,\r\n y: labelY,\r\n size: labelFontSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n \r\n // Draw value if present\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 \r\n // Draw checkbox border for both checked and unchecked states\r\n const checkboxSize = Math.min(field.position.width, field.position.height) * 0.7;\r\n const checkboxX = pdfX + (field.position.width - checkboxSize) / 2;\r\n const checkboxY = pdfY + (field.position.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 color: rgb(1, 1, 1),\r\n });\r\n \r\n // Draw checkmark if checked\r\n if (value === 'true') {\r\n const checkSize = checkboxSize * 0.7;\r\n const checkX = checkboxX + (checkboxSize - checkSize) / 2;\r\n const checkY = checkboxY + (checkboxSize - 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 \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 \r\n // Draw label above field\r\n if (hasDrawableLabel(field)) {\r\n const labelFontSize = Math.min(10, field.position.height * 0.4);\r\n const labelX = pdfX;\r\n const labelY = pdfY + field.position.height + 5; // Above the field\r\n page.drawText(field.label, {\r\n x: labelX,\r\n y: labelY,\r\n size: labelFontSize,\r\n font: font,\r\n color: rgb(0, 0, 0),\r\n });\r\n }\r\n \r\n // Draw value if present\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\nimport { getSigniphiMetadata, initPdfMetadata, type FieldMetadata } from './pdf-metadata';\r\nimport { extractFieldValue } from './pdf-field-type-helpers';\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 \r\n // Initialize pdf-metadata module with PDFName and PDFString\r\n initPdfMetadata(pdfLibModule);\r\n \r\n const pdfDoc = await PDFDocument.load(pdfBytes);\r\n \r\n // Load metadata from PDF document information dictionary\r\n const metadata = getSigniphiMetadata(pdfDoc);\r\n \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 \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 // Extract the clean field name (without suffixes) for metadata lookup\r\n const cleanFieldNameForMetadata = fieldName.replace(/_signature$|_initials$|_date$/i, '');\r\n\r\n // Get field metadata from PDF metadata or fall back to parsing field name (for old PDFs)\r\n // CRITICAL: Try both the suffixed name and the clean name for metadata lookup\r\n const fieldMetadata: FieldMetadata = metadata?.fields[fieldName]\r\n || metadata?.fields[cleanFieldNameForMetadata]\r\n || (() => {\r\n // Backward compatibility: decode from field name if no metadata exists\r\n const decoded = decodeFieldName(fieldName);\r\n return {\r\n label: decoded.displayLabel,\r\n signer: decoded.assignedSignerEmail,\r\n placeholder: decoded.fieldPlaceholder,\r\n acknowledgements: decoded.acknowledgements\r\n };\r\n })();\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 using duck typing (minification-safe)\r\n // Constructor names get renamed during minification, breaking string comparisons\r\n let fieldType = FormFieldType.TEXT;\r\n const f = field as any;\r\n\r\n // Duck typing: detect field type by method presence\r\n const isCheckboxField = typeof f.check === 'function' && typeof f.uncheck === 'function';\r\n const isRadioField = typeof f.select === 'function' &&\r\n typeof f.getOptions === 'function' &&\r\n typeof f.check !== 'function' &&\r\n typeof f.setOptions !== 'function';\r\n const isDropdownField = typeof f.select === 'function' &&\r\n (typeof f.setOptions === 'function' || typeof f.addOptions === 'function');\r\n const isTextField = typeof f.getText === 'function' && typeof f.setText === 'function';\r\n // Signature fields have no editable methods\r\n const isSignatureType = !isCheckboxField && !isRadioField && !isDropdownField && !isTextField;\r\n\r\n // Extract the clean field name (without suffixes for type detection)\r\n const cleanFieldName = fieldName.replace(/_signature$|_initials$|_date$/i, '');\r\n\r\n // CRITICAL: Properly detect signature/initials fields (not checkboxes/radios)\r\n // Use duck typing to exclude checkbox/radio fields\r\n const isActualSignatureField = isSignatureType ||\r\n (cleanFieldName.toLowerCase().includes('signature') &&\r\n !isCheckboxField &&\r\n !isRadioField);\r\n const isActualInitialsField = cleanFieldName.toLowerCase().includes('initials') &&\r\n !isCheckboxField &&\r\n !isRadioField;\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 = true;\r\n } else if (cleanFieldName.toLowerCase().includes('date')) {\r\n fieldType = FormFieldType.DATE;\r\n } else if (isCheckboxField) {\r\n fieldType = FormFieldType.CHECKBOX;\r\n } else if (isDropdownField) {\r\n fieldType = FormFieldType.DROPDOWN;\r\n } else if (isRadioField) {\r\n fieldType = FormFieldType.RADIO;\r\n }\r\n \r\n // Generate display label - Try TU metadata first, then metadata label, then fallback\r\n let displayLabel = fieldMetadata.label || '';\r\n let isLabelAutoGenerated = false;\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 label from metadata (already set above from fieldMetadata.label)\r\n\r\n // PRIORITY 3: Generate fallback label from field name\r\n // This provides a display label for the UI sidebar, but should NOT be drawn on the PDF\r\n if (!displayLabel || !displayLabel.trim()) {\r\n displayLabel = generateFallbackLabel(cleanFieldName, fieldType);\r\n isLabelAutoGenerated = true;\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 fieldId: fieldMetadata.fieldId || fieldName, // Use fieldId from metadata, fallback to fieldName for backward compatibility\r\n name: fieldName, // Keep original for removal later\r\n type: fieldType,\r\n label: displayLabel, // Use friendly label for display\r\n isLabelAutoGenerated, // True when label was generated from field name (should not be drawn on PDF)\r\n position: { x: 0, y: 0, width: 100, height: 30, page: 1 }, // Default position\r\n required: fieldWithExtensions.isRequired?.() ?? false,\r\n placeholder: fieldMetadata.placeholder || '', // Use metadata placeholder\r\n assignedSignerEmail: fieldMetadata.signer, // Add assigned signer from metadata\r\n acknowledgements: fieldMetadata.acknowledgements, // Add acknowledgements from metadata\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 // Read current field value from PDF (for pre-filled fields)\r\n try {\r\n const currentValue = extractFieldValue(f as any, esignField.type);\r\n if (currentValue) {\r\n esignField.defaultValue = currentValue;\r\n }\r\n } catch {\r\n // Ignore errors reading field values\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 fieldId: 'signature_field_main', // Fixed ID for main signature field\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 if ANY initials fields exist in the PDF\r\n // The UI layer (useFieldFiltering) handles filtering fields by signer assignment\r\n // This ensures the initials section always appears when initials fields are present\r\n const shouldCreateInitialsField = hasAnyInitialsFields;\r\n \r\n if (shouldCreateInitialsField) {\r\n mainFields.push({\r\n id: 'initials_field_main',\r\n fieldId: 'initials_field_main', // Fixed ID for main initials field\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\n * @deprecated This function is deprecated and kept only for backward compatibility with old PDFs.\r\n * New PDFs store metadata in the PDF's document information dictionary instead of encoding it in field names.\r\n * Use getSigniphiMetadata() for new PDFs.\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 acknowledgements?: Array<{id: string; title: string; description: 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 let acknowledgements: Array<{id: string; title: string; description: string}> | undefined = undefined;\r\n \r\n // Extract acknowledgements if present (must be last)\r\n if (fieldName.includes('__ACK__')) {\r\n const ackMarkerIndex = fieldName.indexOf('__ACK__');\r\n const beforeAck = fieldName.substring(0, ackMarkerIndex);\r\n const ackEncoded = fieldName.substring(ackMarkerIndex + 7); // Skip \"__ACK__\"\r\n \r\n try {\r\n // Decode base64 and parse JSON\r\n const ackData = atob(ackEncoded);\r\n acknowledgements = JSON.parse(ackData);\r\n } catch (e) {\r\n console.warn('Failed to decode acknowledgements:', e);\r\n }\r\n \r\n // Continue processing the rest of the field name\r\n fieldName = beforeAck;\r\n decodedFieldName = fieldName;\r\n }\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 acknowledgements\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 ALL consecutive \"_signature\", \"_initials\", \"_date\" suffixes added by pdf-lib\r\n // This handles multiple suffixes from repeated PDF exports\r\n let prevLabel = '';\r\n while (displayLabel !== prevLabel) {\r\n prevLabel = displayLabel;\r\n displayLabel = displayLabel.replace(/_signature$/i, '').replace(/_initials$/i, '').replace(/_date$/i, '');\r\n }\r\n \r\n // Handle different naming patterns:\r\n // 1. Pure timestamp fields: \"text_1234567890\" → \"Text\"\r\n // 2. Timestamp with repeated type: \"Signature_1768236781866_Signature_Signature\" → \"Signature\"\r\n // 3. Descriptive fields: \"text_Primary_1\" → \"Text Primary\"\r\n // 4. Custom fields: \"customer_name\" → \"Customer Name\"\r\n \r\n // Pattern 1 & 2: Field name starts with type_timestamp (regardless of what follows)\r\n // This catches both \"text_1234567890\" and \"Signature_1768236781866_Signature_Signature\"\r\n if (/^(text|signature|initials|date|checkbox|radio|dropdown)_\\d+/i.test(displayLabel)) {\r\n // Auto-generated field name - return simple type name based on actual field type\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 if (fieldType === FormFieldType.TEXT_LABEL) return 'Text Label';\r\n }\r\n \r\n // Pattern 3 & 4: 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 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 * Find field by UUID using the fieldIdIndex\r\n * This is the SECURE way to lookup fields in multi-signer workflows\r\n * @param fields - Array of fields to search\r\n * @param uuid - The UUID to find\r\n * @returns The field or undefined\r\n */\r\nexport function findFieldByUuid(fields: EsignFormField[], uuid: string): EsignFormField | undefined {\r\n return fields.find(f => f.fieldId === uuid);\r\n}\r\n\r\n/**\r\n * Resolve a field name or UUID to the actual field\r\n * Priority: UUID lookup first (secure), then field name fallback\r\n * @param fields - Array of fields\r\n * @param identifier - Either a UUID or field name\r\n * @returns The field or undefined\r\n */\r\nexport function resolveField(fields: EsignFormField[], identifier: string): EsignFormField | undefined {\r\n // PRIORITY 1: Try UUID lookup (most secure, works across renames)\r\n let field = findFieldByUuid(fields, identifier);\r\n if (field) {\r\n return field;\r\n }\r\n \r\n // PRIORITY 2: Try by field.id\r\n field = fields.find(f => f.id === identifier);\r\n if (field) {\r\n return field;\r\n }\r\n \r\n // PRIORITY 3: Try by field.name\r\n field = fields.find(f => f.name === identifier);\r\n if (field) {\r\n return field;\r\n }\r\n \r\n // PRIORITY 4: Try without suffixes (for date/signature/initials fields)\r\n const cleanIdentifier = identifier.replace(/_signature$|_initials$|_date$/i, '');\r\n return fields.find(f => f.fieldId === cleanIdentifier || f.id === cleanIdentifier || f.name === cleanIdentifier);\r\n}\r\n\r\n/**\r\n * Get all fields assigned to a specific signer by UUID\r\n * @param fields - Array of fields\r\n * @param signerEmail - Email of the signer\r\n * @returns Array of field UUIDs assigned to this signer\r\n */\r\nexport function getFieldUuidsForSigner(fields: EsignFormField[], signerEmail: string): string[] {\r\n return fields\r\n .filter(f => f.assignedSignerEmail === signerEmail && f.fieldId)\r\n .map(f => f.fieldId!);\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: 25 * 1024 * 1024, // 25MB\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', '.bmp', '.webp', '.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 * ISO Date Validation Utility\r\n * Lightweight validation for ISO 8601 date strings (YYYY-MM-DD)\r\n * Separated from full date-validation to avoid pulling in the heavier `parse` dependency\r\n * from date-fns when only ISO validation is needed.\r\n */\r\n\r\nimport { isValid as isValidDate, parseISO } from 'date-fns';\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 * 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\n// Re-export isValidISODate from its own module so consumers that only need ISO\r\n// validation (e.g. hooks) can import from date-validation-iso directly and avoid\r\n// pulling in the heavier `parse` dependency.\r\nexport { isValidISODate } from './date-validation-iso';\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","/**\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, FormField } from '../types';\r\nimport { FormFieldType } 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 // Store field metadata for font size information\r\n const fieldMetadataRef = useRef<FormField[]>([]);\r\n\r\n /**\r\n * Set field metadata to be used for font size and other field properties\r\n */\r\n const setFieldMetadata = useCallback((fields: FormField[]) => {\r\n fieldMetadataRef.current = fields;\r\n logger.info('[FIELD METADATA] Updated field metadata:', fields.map(f => ({ name: f.name, fontSize: f.fontSize, type: f.type })));\r\n }, []);\r\n\r\n /**\r\n * Extracts font sizes from stored field metadata or PDF field objects.\r\n * @returns A map of field names to font sizes in points.\r\n */\r\n const extractFieldFontSizes = useCallback(async (): Promise<Record<string, number>> => {\r\n const fontSizeMap: Record<string, number> = {};\r\n \r\n // First, try to get from stored field metadata (if available)\r\n for (const field of fieldMetadataRef.current) {\r\n if (field.type === FormFieldType.TEXT) { // Only TEXT fields\r\n if (field.fontSize && field.fontSize >= 8 && field.fontSize <= 72) {\r\n fontSizeMap[field.name] = field.fontSize;\r\n }\r\n }\r\n }\r\n \r\n // If no metadata available, try extracting from PDF field objects\r\n if (Object.keys(fontSizeMap).length === 0) {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication?.pdfDocument?.getFieldObjects) {\r\n const fieldObjects = await PDFViewerApplication.pdfDocument.getFieldObjects();\r\n \r\n for (const [fieldName, fields] of Object.entries(fieldObjects)) {\r\n const fieldArray = fields as any[];\r\n // Check all widgets (not just [0])\r\n for (const field of fieldArray) {\r\n // Extract from alternateText (TU field) if it has the format \"label|fontSize:XX\"\r\n if (field.alternateText) {\r\n const match = field.alternateText.match(/\\|fontSize:(\\d+)$/);\r\n if (match) {\r\n fontSizeMap[fieldName] = parseInt(match[1], 10);\r\n break; // Found it, no need to check other widgets\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n logger.warn('[FONT SIZE] Error extracting from PDF:', error);\r\n }\r\n }\r\n \r\n return fontSizeMap;\r\n }, [waitForInitialization]);\r\n\r\n /**\r\n * Injects CSS into the iframe's document to control the font size of PDF form fields.\r\n * This is necessary because PDF.js often applies inline styles that override external CSS,\r\n * and we need to ensure a consistent, readable font size for user-entered data.\r\n * Extracts font sizes from the PDF metadata to respect per-field fontSize properties.\r\n * @param doc The iframe's contentDocument.\r\n */\r\n const injectFormFieldFontSizeCSS = useCallback(async (doc: Document) => {\r\n const styleId = 'signiphi-pdf-font-size-style';\r\n \r\n // Remove existing style if present\r\n const existingStyle = doc.getElementById(styleId);\r\n if (existingStyle) {\r\n existingStyle.remove();\r\n }\r\n \r\n // Extract font sizes from field metadata or PDF\r\n const fontSizeMap = await extractFieldFontSizes();\r\n \r\n // Generate per-field CSS rules\r\n const cssRules: string[] = [];\r\n \r\n for (const [fieldName, fontSize] of Object.entries(fontSizeMap)) {\r\n cssRules.push(`\r\n input[name=\"${fieldName}\"],\r\n input[name=\"${fieldName}_date\"],\r\n select[name=\"${fieldName}\"] {\r\n font-size: ${fontSize}px !important;\r\n }\r\n `);\r\n }\r\n \r\n // Date and dropdown fields get 18px font size (they don't have fontSize setting in document-prepare)\r\n cssRules.push(`\r\n input[data-element-id][name*=\"date\"],\r\n select[data-element-id] {\r\n font-size: 18px !important;\r\n }\r\n `);\r\n \r\n // Fallback for other fields without explicit font size\r\n cssRules.push(`\r\n input[type=\"text\"][data-element-id]:not([style*=\"font-size\"]),\r\n select[data-element-id]:not([style*=\"font-size\"]) {\r\n font-size: 12px !important; /* Default fallback */\r\n }\r\n `);\r\n \r\n const style = doc.createElement('style');\r\n style.id = styleId;\r\n style.textContent = `/* Dynamic font sizes from PDF metadata */\\n${cssRules.join('\\n')}`;\r\n doc.head.appendChild(style);\r\n }, [extractFieldFontSizes]);\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(async () => {\r\n // Inject CSS for dynamic font sizes in PDF form fields\r\n if (iframe.contentDocument) {\r\n await injectFormFieldFontSizeCSS(iframe.contentDocument);\r\n }\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 logger.info(`[RADIO DETECT] Added widget ${id} to group ${fieldName}, data:`, data);\r\n }\r\n }\r\n \r\n logger.info(`[RADIO DETECT] Found ${Object.keys(radioGroups).length} radio groups:`, Object.keys(radioGroups));\r\n\r\n // Track all field names identified as radio groups so their widget\r\n // data doesn't leak into the non-radio processing loop below.\r\n // Without this, a radio group with no selection in annotationStorage\r\n // would have individual widget data ({value: false}) extracted as\r\n // the field value \"false\", overwriting seeded defaults.\r\n const processedRadioFieldNames = new Set(Object.keys(radioGroups));\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 logger.info(`[RADIO] Field ${fieldName}: selected index ${selectedIndex}, stored as ${exportValue}`);\r\n } else {\r\n values[fieldName] = 'true';\r\n logger.warn(`[RADIO] Field ${fieldName}: could not determine index, defaulting to 'true'`);\r\n }\r\n } else {\r\n logger.info(`[RADIO] Field ${fieldName}: no selection found in ${radioButtons.length} widgets`);\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 this field was identified as a radio group (regardless of\r\n // whether a selection was found) or already has a value (including \"\").\r\n if (fieldName && (fieldName in values || processedRadioFieldNames.has(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) {\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 // Use `in` check so that an explicit empty string from annotationStorage\r\n // (user cleared a pre-filled field) is not overwritten by the default.\r\n for (const [name, fields] of Object.entries(fieldObjects)) {\r\n if (!(name in values)) {\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 // First, uncheck all radio buttons in the group\r\n for (let i = 0; i < elements.length; i++) {\r\n const radioEl = elements[i] as any;\r\n if (radioEl.checked) {\r\n radioEl.checked = false;\r\n }\r\n }\r\n \r\n // Then check the selected one\r\n const radioElement = elements[selectedIndex] as any;\r\n radioElement.checked = true;\r\n \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 /**\r\n * Radio labels are now drawn on the PDF canvas in pdf-viewer-filter.ts\r\n * This function is kept for backwards compatibility but does nothing.\r\n * Labels drawn on canvas scale naturally with zoom - no special handling needed.\r\n */\r\n const injectRadioLabels = useCallback((_fields: Array<{ id: string; name: string; type: string; options?: string[] }>) => {\r\n // No-op: Radio option labels are now drawn on the PDF canvas in pdf-viewer-filter.ts\r\n // This provides natural zoom scaling like all other field labels\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 /**\r\n * Attaches click interceptors to PDF form fields\r\n * Allows blocking interaction if custom validation fails\r\n * @param onFieldClick - Callback that receives field name and returns true to allow interaction, false to block\r\n */\r\n const attachFieldClickInterceptors = useCallback(async (\r\n onFieldClick: (fieldName: string, element?: HTMLElement) => boolean\r\n ) => {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot attach field interceptors: iframe not ready');\r\n return;\r\n }\r\n\r\n try {\r\n // Use event delegation instead of attaching to individual elements\r\n // This survives PDF.js re-renders\r\n const doc = iframe.contentDocument;\r\n\r\n // Inject CSS for form field font size\r\n await injectFormFieldFontSizeCSS(doc);\r\n\r\n // Inject CSS styles for click highlighting (if not already present)\r\n const clickHighlightStyleId = 'signiphi-click-highlight-style';\r\n if (!doc.getElementById(clickHighlightStyleId)) {\r\n const style = doc.createElement('style');\r\n style.id = clickHighlightStyleId;\r\n style.textContent = `\r\n .clicked-field-annotation {\r\n outline: 2px solid #3b82f6 !important;\r\n outline-offset: 1px !important;\r\n box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15) !important;\r\n border-radius: 3px !important;\r\n z-index: 999 !important;\r\n position: relative !important;\r\n }\r\n .clicked-field {\r\n outline: none !important;\r\n border-color: #3b82f6 !important;\r\n background-color: rgba(59, 130, 246, 0.05) !important;\r\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1) !important;\r\n }\r\n `;\r\n doc.head.appendChild(style);\r\n logger.info('[CLICK HIGHLIGHT] Injected CSS styles');\r\n }\r\n\r\n // Remove existing delegated listener if any\r\n if ((doc as any)._signiphiDelegatedHandler) {\r\n ['pointerdown', 'focusin', 'click', 'mousedown'].forEach(event => {\r\n doc.removeEventListener(event, (doc as any)._signiphiDelegatedHandler, true);\r\n });\r\n }\r\n\r\n // Create delegated handler\r\n const delegatedHandler = (e: Event) => {\r\n const target = e.target as HTMLElement;\r\n\r\n // Log ALL clicks in PDF for debugging\r\n logger.info(`[PDF CLICK] Element clicked:`, {\r\n tag: target.tagName,\r\n className: target.className,\r\n id: target.id,\r\n name: target.getAttribute('name'),\r\n eventType: e.type\r\n });\r\n\r\n // Check if target is a form field OR button (signature fields might be buttons)\r\n if (!['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(target.tagName)) {\r\n logger.info(`[PDF CLICK] Not a form field (${target.tagName}), checking for child/parent...`);\r\n\r\n // First check if this is a PDF.js widget annotation wrapper (SECTION with class containing \"Annotation\")\r\n let formElement: Element | null = null;\r\n if (target.tagName === 'SECTION' && target.className.includes('Annotation')) {\r\n // Look for input/select/textarea/button INSIDE this section\r\n formElement = target.querySelector('input, select, textarea, button');\r\n if (formElement) {\r\n logger.info(`[PDF CLICK] Found child form field in annotation:`, formElement.tagName);\r\n }\r\n }\r\n\r\n // If not found, try parent elements\r\n if (!formElement) {\r\n formElement = target.closest('input, select, textarea, button');\r\n if (formElement) {\r\n logger.info(`[PDF CLICK] Found parent form field:`, formElement.tagName);\r\n }\r\n }\r\n\r\n if (formElement) {\r\n // Recurse with the actual form element\r\n const newEvent = new Event(e.type, { bubbles: true, cancelable: true });\r\n Object.defineProperty(newEvent, 'target', { value: formElement, enumerable: true });\r\n delegatedHandler(newEvent);\r\n if (newEvent.defaultPrevented) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Get field name\r\n const fieldName = target.getAttribute('name')\r\n || target.getAttribute('data-element-id')\r\n || target.getAttribute('id');\r\n\r\n if (!fieldName) {\r\n logger.info('[PDF CLICK] No field name found');\r\n return; // No identifier, ignore\r\n }\r\n\r\n logger.info(`Field click intercepted: ${fieldName}`, e.type);\r\n\r\n // Call callback first to determine if we should block (pass the element too)\r\n const shouldProceed = onFieldClick(fieldName, target);\r\n logger.info(`Field ${fieldName} shouldProceed: ${shouldProceed}`);\r\n\r\n // Only process pointerdown and mousedown events for highlighting and blocking\r\n // Let focusin and click events pass through for normal field behavior\r\n if (e.type !== 'pointerdown' && e.type !== 'mousedown') {\r\n // For focusin and click, only block if field is not allowed\r\n if (!shouldProceed) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n logger.info(`Blocked ${e.type} event for field: ${fieldName}`);\r\n }\r\n return; // Don't apply highlights on these events\r\n }\r\n\r\n // Apply click highlighting on the FIRST blocking event (when modal will open)\r\n if (!shouldProceed && e.type === 'pointerdown') {\r\n // Remove previous click highlights from all fields\r\n const previousClickHighlights = doc.querySelectorAll('.clicked-field');\r\n previousClickHighlights.forEach(el => el.classList.remove('clicked-field'));\r\n const previousAnnotationClickHighlights = doc.querySelectorAll('.clicked-field-annotation');\r\n previousAnnotationClickHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\r\n\r\n // Add click highlight to current field\r\n target.classList.add('clicked-field');\r\n\r\n // Also highlight the parent widget annotation if it exists\r\n const widgetAnnotation = target.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation, .buttonWidgetAnnotation');\r\n if (widgetAnnotation) {\r\n widgetAnnotation.classList.add('clicked-field-annotation');\r\n }\r\n\r\n logger.info(`[CLICK HIGHLIGHT] Applied to blocked field: ${fieldName}`, {\r\n hasAnnotation: !!widgetAnnotation,\r\n elementTag: target.tagName,\r\n eventType: e.type\r\n });\r\n\r\n // Block the interaction\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n logger.info(`Blocked interaction with field: ${fieldName}`);\r\n } \r\n // Apply on mousedown for allowed fields (normal interaction)\r\n else if (shouldProceed && e.type === 'mousedown') {\r\n // Remove previous click highlights from all fields\r\n const previousClickHighlights = doc.querySelectorAll('.clicked-field');\r\n previousClickHighlights.forEach(el => el.classList.remove('clicked-field'));\r\n const previousAnnotationClickHighlights = doc.querySelectorAll('.clicked-field-annotation');\r\n previousAnnotationClickHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\r\n\r\n // Add click highlight to current field\r\n target.classList.add('clicked-field');\r\n\r\n // Also highlight the parent widget annotation if it exists\r\n const widgetAnnotation = target.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation, .buttonWidgetAnnotation');\r\n if (widgetAnnotation) {\r\n widgetAnnotation.classList.add('clicked-field-annotation');\r\n }\r\n\r\n logger.info(`[CLICK HIGHLIGHT] Applied to allowed field: ${fieldName}`, {\r\n hasAnnotation: !!widgetAnnotation,\r\n elementTag: target.tagName,\r\n eventType: e.type\r\n });\r\n \r\n // DO NOT prevent default for allowed fields - let them focus and accept input\r\n }\r\n // Handle blocked pointerdown that's not the first one (shouldn't happen, but be safe)\r\n else if (!shouldProceed) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n logger.info(`Blocked ${e.type} event for field: ${fieldName}`);\r\n }\r\n };\r\n\r\n // Store reference for cleanup\r\n (doc as any)._signiphiDelegatedHandler = delegatedHandler;\r\n\r\n // Attach delegated listener to document\r\n ['pointerdown', 'focusin', 'click', 'mousedown'].forEach(event => {\r\n doc.addEventListener(event, delegatedHandler, {\r\n capture: true,\r\n passive: false\r\n });\r\n });\r\n\r\n // Log how many fields we found (for diagnostics)\r\n let formElements = doc.querySelectorAll(\r\n 'input[data-element-id], select[data-element-id], textarea[data-element-id]'\r\n );\r\n if (formElements.length === 0) {\r\n formElements = doc.querySelectorAll('input[id], select[id], textarea[id]');\r\n }\r\n\r\n logger.info(`Attached delegated interceptor. Found ${formElements.length} form fields in PDF`);\r\n\r\n // Just log field names for diagnostics\r\n formElements.forEach((element) => {\r\n const fieldName = element.getAttribute('name')\r\n || element.getAttribute('data-element-id')\r\n || element.getAttribute('id');\r\n\r\n if (fieldName) {\r\n logger.info(`Found field: ${fieldName} (name: ${element.getAttribute('name')}, id: ${element.getAttribute('id')})`);\r\n }\r\n });\r\n } catch (error) {\r\n logger.error('Error attaching field click interceptors:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Attach change/input listeners to PDF form fields\r\n * Uses the correct iframe reference to ensure listeners work after PDF.js initialization\r\n * @param onFieldChange - Callback when a field value changes\r\n * @returns Cleanup function to remove the listeners\r\n */\r\n const attachFieldChangeListeners = useCallback(async (\r\n onFieldChange: (fieldName: string, value: string, element: HTMLElement) => void\r\n ): Promise<() => void> => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot attach field change listeners: iframe not ready');\r\n return () => {};\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n // Handler that extracts field info and calls the callback\r\n const handleChange = (event: Event) => {\r\n const target = event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!target || !['INPUT', 'SELECT', 'TEXTAREA'].includes(target.tagName)) {\r\n return;\r\n }\r\n\r\n const fieldName = target.getAttribute('name')\r\n || target.getAttribute('data-element-id')\r\n || target.getAttribute('id')\r\n || '';\r\n\r\n if (!fieldName) return;\r\n\r\n let value = '';\r\n if (target.tagName === 'INPUT') {\r\n const inputElement = target as HTMLInputElement;\r\n if (inputElement.type === 'checkbox') {\r\n value = inputElement.checked ? 'true' : 'false';\r\n } else if (inputElement.type === 'radio') {\r\n if (inputElement.checked) {\r\n value = inputElement.value || 'true';\r\n } else {\r\n return; // Don't fire for unchecked radios\r\n }\r\n } else {\r\n value = inputElement.value;\r\n }\r\n } else if (target.tagName === 'SELECT') {\r\n value = (target as HTMLSelectElement).value;\r\n } else if (target.tagName === 'TEXTAREA') {\r\n value = (target as HTMLTextAreaElement).value;\r\n }\r\n\r\n onFieldChange(fieldName, value, target as HTMLElement);\r\n };\r\n\r\n // Attach listeners with capture phase\r\n doc.addEventListener('change', handleChange, true);\r\n doc.addEventListener('input', handleChange, true);\r\n\r\n logger.info('Attached field change listeners to iframe document');\r\n\r\n // Return cleanup function\r\n return () => {\r\n doc.removeEventListener('change', handleChange, true);\r\n doc.removeEventListener('input', handleChange, true);\r\n logger.info('Removed field change listeners from iframe document');\r\n };\r\n } catch (error) {\r\n logger.error('Error attaching field change listeners:', error);\r\n return () => {};\r\n }\r\n }, []);\r\n\r\n /**\r\n * Add visual indicator to a PDF form field\r\n * Shows user the field's acknowledgement/completion state\r\n * @param fieldName - The field name (e.g., 'signature_field_main')\r\n * @param indicatorType - Type of indicator: 'completed' (green checkmark), 'pending-ack' (amber badge), or 'info' (subtle info icon)\r\n * @param allowedFieldIds - Comma-separated list of fieldIds (UUIDs) that should show indicators\r\n */\r\n /**\r\n * Add a visual indicator badge to a field's annotation section\r\n * \r\n * Field Indicator System - Three-state visual feedback for acknowledgement status:\r\n * - 'info' (gray 'i', 20x20px): Field has acknowledgements but is unfilled\r\n * - 'pending-ack' (amber '!', 24x24px): Field is filled but needs acknowledgement \r\n * - 'completed' (green '✓', 24x24px): Field is filled AND fully acknowledged\r\n * \r\n * Indicators are positioned in the top-right corner of the field annotation.\r\n * Only fields with acknowledgements will display indicators.\r\n * \r\n * @param fieldName - Name of the field to add indicator to\r\n * @param indicatorType - Type of indicator badge to display\r\n * @param allowedFieldIds - Optional comma-separated list of fieldIds (UUIDs) to filter which fields get indicators\r\n */\r\n const addFieldIndicator = useCallback(async (\r\n fieldName: string, \r\n indicatorType: 'completed' | 'pending-ack' | 'info' = 'completed',\r\n allowedFieldIds?: string\r\n ) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot add field indicator: iframe not ready');\r\n return;\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n // Parse allowed fieldIds (UUIDs)\r\n const allowedIds = allowedFieldIds ? allowedFieldIds.split(',').map(id => id.trim()).filter(id => id) : null;\r\n\r\n logger.info(`Adding indicators for ${fieldName}, allowedFieldIds:`, allowedIds);\r\n\r\n // If no allowed IDs provided or empty, don't add any indicators\r\n if (allowedIds !== null && allowedIds.length === 0) {\r\n logger.info(`No fields allowed for indicators (${fieldName}), skipping`);\r\n return;\r\n }\r\n\r\n // Get PDF metadata to map fieldIds to PDF field names\r\n const pdfApp = getPDFViewerApplication();\r\n let fieldIdToPdfNameMap: Record<string, string> = {};\r\n\r\n if (pdfApp?.pdfDocument?.getData && allowedIds) {\r\n try {\r\n const pdfDoc = pdfApp.pdfDocument;\r\n\r\n // Get PDF bytes\r\n const pdfBytesRaw = await pdfDoc.getData!();\r\n logger.info('Got PDF bytes, type:', typeof pdfBytesRaw, 'isArrayBuffer:', pdfBytesRaw instanceof ArrayBuffer, 'isUint8Array:', pdfBytesRaw instanceof Uint8Array);\r\n logger.info('PDF bytes constructor:', pdfBytesRaw?.constructor?.name);\r\n logger.info('PDF bytes has buffer?:', !!(pdfBytesRaw as any)?.buffer);\r\n\r\n // Ensure we have a Uint8Array for pdf-lib\r\n let pdfBytes: Uint8Array;\r\n const rawData = pdfBytesRaw as any;\r\n\r\n if (pdfBytesRaw instanceof Uint8Array) {\r\n pdfBytes = pdfBytesRaw;\r\n } else if (rawData instanceof ArrayBuffer) {\r\n pdfBytes = new Uint8Array(rawData);\r\n } else if (rawData?.buffer instanceof ArrayBuffer) {\r\n // It's a typed array view (like Uint8Array from a different realm/iframe)\r\n pdfBytes = new Uint8Array(rawData.buffer, rawData.byteOffset || 0, rawData.byteLength || rawData.length);\r\n } else {\r\n logger.warn('Unexpected PDF bytes type, attempting direct conversion');\r\n pdfBytes = new Uint8Array(rawData);\r\n }\r\n\r\n logger.info('Converted to Uint8Array, length:', pdfBytes.length);\r\n\r\n // Use pdf-lib to read metadata\r\n const { PDFDocument, PDFName } = await import('pdf-lib');\r\n const pdfLibDoc = await PDFDocument.load(pdfBytes);\r\n logger.info('Successfully loaded PDF with pdf-lib');\r\n\r\n // Get the Info dictionary\r\n const infoRef = pdfLibDoc.context.trailerInfo.Info;\r\n if (infoRef) {\r\n const infoObj = pdfLibDoc.context.lookup(infoRef) as any;\r\n\r\n // Try to get SigniphiMetadata\r\n const metadataObj = infoObj?.get(PDFName.of('SigniphiMetadata'));\r\n\r\n if (metadataObj) {\r\n const signiphiMetadataStr = metadataObj.toString();\r\n\r\n // Parse the metadata (it's stored as a PDF string in format (JSON))\r\n let jsonStr = signiphiMetadataStr;\r\n const parenMatch = signiphiMetadataStr.match(/^\\((.*)\\)$/);\r\n if (parenMatch && parenMatch[1]) {\r\n jsonStr = parenMatch[1];\r\n }\r\n\r\n const signiphiMetadata = JSON.parse(jsonStr);\r\n logger.info('Parsed Signiphi metadata:', signiphiMetadata);\r\n\r\n // Create fieldId → PDF field name mapping\r\n if (signiphiMetadata.fields) {\r\n Object.entries(signiphiMetadata.fields).forEach(([pdfFieldName, fieldData]: [string, any]) => {\r\n if (fieldData.fieldId) {\r\n fieldIdToPdfNameMap[fieldData.fieldId] = pdfFieldName;\r\n }\r\n });\r\n }\r\n\r\n logger.info('FieldId to PDF name mapping:', fieldIdToPdfNameMap);\r\n }\r\n }\r\n } catch (metadataError) {\r\n logger.warn('Could not read PDF metadata for field mapping:', metadataError);\r\n }\r\n }\r\n\r\n // Special handling for signature_field_main and initials_field_main\r\n // These are synthetic fields - we need to find ALL actual signature/initials fields\r\n let targetElements: Element[] = [];\r\n\r\n if (fieldName === 'signature_field_main') {\r\n // Find ALL signature fields in the PDF\r\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\r\n\r\n // Get allowed PDF field names from the mapping\r\n const allowedPdfNames = allowedIds\r\n ? allowedIds.map(fieldId => fieldIdToPdfNameMap[fieldId]).filter(Boolean)\r\n : null;\r\n\r\n logger.info(`Allowed PDF field names for signature indicators:`, allowedPdfNames);\r\n\r\n allInputs.forEach(input => {\r\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\r\n if (name.toLowerCase().includes('signature') && !name.toLowerCase().includes('initials')) {\r\n // If we have a filter, only include fields in the allowed list\r\n if (allowedPdfNames === null) {\r\n targetElements.push(input);\r\n } else {\r\n // Check if the DOM field name starts with any allowed metadata name\r\n // (DOM names have suffixes like \"_signature\" added during encoding)\r\n const isAllowed = allowedPdfNames.some(allowedName => allowedName && name.startsWith(allowedName));\r\n if (isAllowed) {\r\n targetElements.push(input);\r\n }\r\n }\r\n }\r\n });\r\n logger.info(`Found ${targetElements.length} signature fields for indicator (filtered by acknowledgements)`);\r\n } else if (fieldName === 'initials_field_main') {\r\n // Find ALL initials fields in the PDF\r\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\r\n\r\n // Get allowed PDF field names from the mapping\r\n const allowedPdfNames = allowedIds\r\n ? allowedIds.map(fieldId => fieldIdToPdfNameMap[fieldId]).filter(Boolean)\r\n : null;\r\n\r\n logger.info(`Allowed PDF field names for initials indicators:`, allowedPdfNames);\r\n\r\n allInputs.forEach(input => {\r\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\r\n if (name.toLowerCase().includes('initials')) {\r\n // If we have a filter, only include fields in the allowed list\r\n if (allowedPdfNames === null) {\r\n targetElements.push(input);\r\n } else {\r\n // Check if the DOM field name starts with any allowed metadata name\r\n // (DOM names have suffixes like \"_initials\" added during encoding)\r\n const isAllowed = allowedPdfNames.some(allowedName => allowedName && name.startsWith(allowedName));\r\n if (isAllowed) {\r\n targetElements.push(input);\r\n }\r\n }\r\n }\r\n });\r\n logger.info(`Found ${targetElements.length} initials fields for indicator (filtered by acknowledgements)`);\r\n } else {\r\n // Regular field - try to find by exact name\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\r\n `select[name=\"${fieldName}\"], select[data-element-id=\"${fieldName}\"], ` +\r\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\r\n );\r\n if (formElement) {\r\n targetElements.push(formElement);\r\n }\r\n }\r\n\r\n if (targetElements.length === 0) {\r\n logger.warn(`Cannot add indicator: no fields found for \"${fieldName}\"`);\r\n return;\r\n }\r\n\r\n // Add indicator to each target element (showMode is 'all')\r\n let indicatorsAdded = 0;\r\n\r\n targetElements.forEach(formElement => {\r\n\r\n // Find the parent annotation section\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) {\r\n return;\r\n }\r\n\r\n // Remove existing indicator if any (to allow updating indicator type)\r\n const existingIndicator = annotationSection.querySelector('.signiphi-field-indicator');\r\n if (existingIndicator) {\r\n existingIndicator.remove();\r\n }\r\n\r\n // Create indicator based on type\r\n const indicator = doc.createElement('div');\r\n indicator.className = 'signiphi-field-indicator';\r\n \r\n // Add ARIA attributes for accessibility\r\n indicator.setAttribute('role', 'status');\r\n indicator.setAttribute('aria-live', 'polite');\r\n \r\n if (indicatorType === 'completed') {\r\n // Green checkmark (existing style)\r\n indicator.innerHTML = `\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#10b981\" stroke=\"white\" stroke-width=\"2\"/>\r\n <path d=\"M7 12l4 4 6-8\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n `;\r\n indicator.setAttribute('title', 'Acknowledgement complete');\r\n indicator.setAttribute('aria-label', 'Acknowledgement status: Complete');\r\n } else if (indicatorType === 'pending-ack') {\r\n // Amber badge with exclamation mark\r\n indicator.innerHTML = `\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#f59e0b\" stroke=\"white\" stroke-width=\"2\"/>\r\n <text x=\"12\" y=\"17\" font-size=\"16\" font-weight=\"bold\" fill=\"white\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\">!</text>\r\n </svg>\r\n `;\r\n indicator.setAttribute('title', 'Acknowledgement required');\r\n indicator.setAttribute('aria-label', 'Acknowledgement status: Pending acknowledgement');\r\n } else if (indicatorType === 'info') {\r\n // Subtle info icon for unfilled fields with acknowledgements\r\n indicator.innerHTML = `\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"10\" cy=\"10\" r=\"9\" fill=\"#94a3b8\" stroke=\"white\" stroke-width=\"1.5\"/>\r\n <text x=\"10\" y=\"14\" font-size=\"12\" font-weight=\"bold\" fill=\"white\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\">i</text>\r\n </svg>\r\n `;\r\n indicator.setAttribute('title', 'Has acknowledgement requirements');\r\n indicator.setAttribute('aria-label', 'Acknowledgement status: Has acknowledgement requirements');\r\n }\r\n\r\n // Style the indicator - positioned in top-right corner\r\n // Info indicators are slightly smaller to be more subtle\r\n const isInfoIndicator = indicatorType === 'info';\r\n Object.assign(indicator.style, {\r\n position: 'absolute',\r\n top: '-8px',\r\n right: '-8px',\r\n width: isInfoIndicator ? '20px' : '24px',\r\n height: isInfoIndicator ? '20px' : '24px',\r\n display: 'block',\r\n zIndex: '1000',\r\n pointerEvents: 'none',\r\n opacity: '0',\r\n transition: 'opacity 0.3s ease-in-out',\r\n margin: '0',\r\n padding: '0',\r\n lineHeight: '0',\r\n fontSize: '0',\r\n });\r\n\r\n // Ensure SVG doesn't cause layout shifts\r\n const svg = indicator.querySelector('svg');\r\n if (svg) {\r\n (svg as SVGElement).style.display = 'block';\r\n (svg as SVGElement).style.width = '24px';\r\n (svg as SVGElement).style.height = '24px';\r\n }\r\n\r\n // Add to annotation section (ensure no layout shift)\r\n const currentPosition = window.getComputedStyle(annotationSection).position;\r\n if (currentPosition === 'static') {\r\n annotationSection.style.position = 'relative';\r\n }\r\n annotationSection.appendChild(indicator);\r\n\r\n // Fade in animation\r\n requestAnimationFrame(() => {\r\n indicator.style.opacity = '1';\r\n });\r\n\r\n indicatorsAdded++;\r\n });\r\n\r\n logger.info(`Added ${indicatorsAdded} ${indicatorType} indicator(s) for field: ${fieldName}`);\r\n } catch (error) {\r\n logger.error('Error adding field indicator:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Remove visual indicator from a PDF form field\r\n */\r\n const removeFieldIndicator = useCallback((fieldName: string) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) return;\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\r\n `select[name=\"${fieldName}\"], select[data-element-id=\"${fieldName}\"], ` +\r\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\r\n );\r\n\r\n if (!formElement) return;\r\n\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) return;\r\n\r\n const indicator = annotationSection.querySelector('.signiphi-field-indicator');\r\n if (indicator) {\r\n indicator.remove();\r\n logger.info(`Removed indicator from field: ${fieldName}`);\r\n }\r\n } catch (error) {\r\n logger.error('Error removing field indicator:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Add a calendar icon indicator to a date field\r\n * Shows a small calendar icon in the top-right corner of the field\r\n * Clicking the icon will trigger the calendar popup\r\n * \r\n * @param fieldName - Name of the date field to add indicator to\r\n */\r\n const addDateFieldIndicator = useCallback((fieldName: string) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot add date field indicator: iframe not ready');\r\n return;\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n // Find the date field\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\r\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\r\n );\r\n\r\n if (!formElement) {\r\n logger.warn(`Cannot add date indicator: field not found for \"${fieldName}\"`);\r\n return;\r\n }\r\n\r\n // Find the parent annotation section\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) {\r\n logger.warn(`Cannot add date indicator: no annotation section for \"${fieldName}\"`);\r\n return;\r\n }\r\n\r\n // Remove existing date indicator if any\r\n const existingIndicator = annotationSection.querySelector('.signiphi-date-field-indicator');\r\n if (existingIndicator) {\r\n existingIndicator.remove();\r\n }\r\n\r\n // Create calendar icon indicator\r\n const indicator = doc.createElement('div');\r\n indicator.className = 'signiphi-date-field-indicator';\r\n \r\n // Add ARIA attributes for accessibility\r\n indicator.setAttribute('role', 'button');\r\n indicator.setAttribute('aria-label', 'Open calendar picker');\r\n indicator.setAttribute('tabindex', '0');\r\n \r\n // Calendar icon SVG\r\n indicator.innerHTML = `\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"3\" width=\"14\" height=\"13\" rx=\"2\" stroke=\"#6b7280\" stroke-width=\"1.5\" fill=\"white\"/>\r\n <line x1=\"2\" y1=\"6.5\" x2=\"16\" y2=\"6.5\" stroke=\"#6b7280\" stroke-width=\"1.5\"/>\r\n <line x1=\"5.5\" y1=\"1\" x2=\"5.5\" y2=\"5\" stroke=\"#6b7280\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n <line x1=\"12.5\" y1=\"1\" x2=\"12.5\" y2=\"5\" stroke=\"#6b7280\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n <circle cx=\"5.5\" cy=\"9.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"9\" cy=\"9.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"12.5\" cy=\"9.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"5.5\" cy=\"12.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"9\" cy=\"12.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"12.5\" cy=\"12.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n </svg>\r\n `;\r\n\r\n // Style the indicator\r\n Object.assign(indicator.style, {\r\n position: 'absolute',\r\n top: '50%',\r\n right: '4px',\r\n transform: 'translateY(-50%)',\r\n width: '24px',\r\n height: '24px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '1000',\r\n cursor: 'pointer',\r\n opacity: '0.7',\r\n transition: 'opacity 0.2s ease-in-out',\r\n pointerEvents: 'auto',\r\n padding: '3px',\r\n borderRadius: '4px',\r\n });\r\n\r\n // Add hover effect\r\n indicator.addEventListener('mouseenter', () => {\r\n indicator.style.opacity = '1';\r\n indicator.style.backgroundColor = '#f3f4f6';\r\n });\r\n indicator.addEventListener('mouseleave', () => {\r\n indicator.style.opacity = '0.7';\r\n indicator.style.backgroundColor = 'transparent';\r\n });\r\n\r\n // Add keyboard support (Enter or Space to activate)\r\n indicator.addEventListener('keydown', (e: KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n indicator.click();\r\n }\r\n });\r\n\r\n // Ensure parent annotation has relative positioning\r\n const currentPosition = window.getComputedStyle(annotationSection).position;\r\n if (currentPosition === 'static') {\r\n annotationSection.style.position = 'relative';\r\n }\r\n \r\n annotationSection.appendChild(indicator);\r\n logger.info(`Added date field indicator for: ${fieldName}`);\r\n } catch (error) {\r\n logger.error('Error adding date field indicator:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Remove date field indicator from a PDF form field\r\n */\r\n const removeDateFieldIndicator = useCallback((fieldName: string) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) return;\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\r\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\r\n );\r\n\r\n if (!formElement) return;\r\n\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) return;\r\n\r\n const indicator = annotationSection.querySelector('.signiphi-date-field-indicator');\r\n if (indicator) {\r\n indicator.remove();\r\n logger.info(`Removed date field indicator from: ${fieldName}`);\r\n }\r\n } catch (error) {\r\n logger.error('Error removing date field indicator:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Find target field elements in the PDF iframe for signature or initials fields.\r\n * Reuses the same discovery logic as addFieldIndicator.\r\n */\r\n const findFieldElements = useCallback((fieldName: string): Element[] => {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) return [];\r\n\r\n const doc = iframe.contentDocument;\r\n const targetElements: Element[] = [];\r\n\r\n if (fieldName === 'signature_field_main') {\r\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\r\n allInputs.forEach(input => {\r\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\r\n if (name.toLowerCase().includes('signature') && !name.toLowerCase().includes('initials')) {\r\n targetElements.push(input);\r\n }\r\n });\r\n } else if (fieldName === 'initials_field_main') {\r\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\r\n allInputs.forEach(input => {\r\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\r\n if (name.toLowerCase().includes('initials')) {\r\n targetElements.push(input);\r\n }\r\n });\r\n } else {\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"]`\r\n );\r\n if (formElement) {\r\n targetElements.push(formElement);\r\n }\r\n }\r\n\r\n return targetElements;\r\n }, []);\r\n\r\n /**\r\n * Preview a signature image on the PDF viewer at the field position.\r\n * Creates an overlay inside the annotation section — purely visual, no PDF modification.\r\n */\r\n const previewSignature = useCallback((fieldName: string, dataUrl: string | null) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot preview signature: iframe not ready');\r\n return;\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n const targetElements = findFieldElements(fieldName);\r\n\r\n targetElements.forEach(formElement => {\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) return;\r\n\r\n // Remove existing preview\r\n const existing = annotationSection.querySelector('.signiphi-signature-preview');\r\n if (existing) existing.remove();\r\n\r\n if (!dataUrl) return;\r\n\r\n // Create preview overlay\r\n const preview = doc.createElement('div');\r\n preview.className = 'signiphi-signature-preview';\r\n preview.setAttribute('aria-hidden', 'true');\r\n\r\n const img = doc.createElement('img');\r\n img.src = dataUrl;\r\n img.alt = '';\r\n Object.assign(img.style, {\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'contain',\r\n pointerEvents: 'none',\r\n });\r\n preview.appendChild(img);\r\n\r\n Object.assign(preview.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '999',\r\n pointerEvents: 'none',\r\n padding: '2px',\r\n boxSizing: 'border-box',\r\n backgroundColor: 'rgba(255, 255, 255, 0.85)',\r\n opacity: '0',\r\n transition: 'opacity 0.3s ease-in-out',\r\n });\r\n\r\n const currentPosition = (annotationSection as HTMLElement).style.position || getComputedStyle(annotationSection).position;\r\n if (currentPosition === 'static' || !currentPosition) {\r\n (annotationSection as HTMLElement).style.position = 'relative';\r\n }\r\n\r\n annotationSection.appendChild(preview);\r\n\r\n requestAnimationFrame(() => {\r\n preview.style.opacity = '1';\r\n });\r\n });\r\n\r\n logger.info(`Previewed signature on ${targetElements.length} field(s) for: ${fieldName}`);\r\n } catch (error) {\r\n logger.error('Error previewing signature:', error);\r\n }\r\n }, [findFieldElements]);\r\n\r\n /**\r\n * Preview initials text on the PDF viewer at the field position.\r\n * Creates an overlay inside the annotation section — purely visual, no PDF modification.\r\n */\r\n const previewInitials = useCallback((fieldName: string, text: string | null) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot preview initials: iframe not ready');\r\n return;\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n const targetElements = findFieldElements(fieldName);\r\n\r\n targetElements.forEach(formElement => {\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) return;\r\n\r\n // Remove existing preview\r\n const existing = annotationSection.querySelector('.signiphi-initials-preview');\r\n if (existing) existing.remove();\r\n\r\n if (!text) return;\r\n\r\n const preview = doc.createElement('div');\r\n preview.className = 'signiphi-initials-preview';\r\n preview.setAttribute('aria-hidden', 'true');\r\n preview.textContent = text;\r\n\r\n Object.assign(preview.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '999',\r\n pointerEvents: 'none',\r\n fontFamily: \"'Dancing Script', 'Brush Script MT', cursive\",\r\n fontStyle: 'italic',\r\n fontSize: '70%',\r\n color: '#000000',\r\n backgroundColor: 'rgba(255, 255, 255, 0.85)',\r\n overflow: 'hidden',\r\n opacity: '0',\r\n transition: 'opacity 0.3s ease-in-out',\r\n });\r\n\r\n const currentPosition = (annotationSection as HTMLElement).style.position || getComputedStyle(annotationSection).position;\r\n if (currentPosition === 'static' || !currentPosition) {\r\n (annotationSection as HTMLElement).style.position = 'relative';\r\n }\r\n\r\n annotationSection.appendChild(preview);\r\n\r\n requestAnimationFrame(() => {\r\n preview.style.opacity = '1';\r\n });\r\n });\r\n\r\n logger.info(`Previewed initials on ${targetElements.length} field(s) for: ${fieldName}`);\r\n } catch (error) {\r\n logger.error('Error previewing initials:', error);\r\n }\r\n }, [findFieldElements]);\r\n\r\n /**\r\n * Clear signature/initials previews from the PDF viewer.\r\n * If fieldName is provided, clears only that field's previews; otherwise clears all.\r\n */\r\n const clearFieldPreviews = useCallback((fieldName?: string) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) return;\r\n\r\n const doc = iframe.contentDocument;\r\n const selectors = '.signiphi-signature-preview, .signiphi-initials-preview';\r\n\r\n if (fieldName) {\r\n const targetElements = findFieldElements(fieldName);\r\n targetElements.forEach(el => {\r\n const section = el.closest('section');\r\n if (section) {\r\n section.querySelectorAll(selectors).forEach(p => p.remove());\r\n }\r\n });\r\n } else {\r\n doc.querySelectorAll(selectors).forEach(el => el.remove());\r\n }\r\n } catch (error) {\r\n logger.error('Error clearing field previews:', error);\r\n }\r\n }, [findFieldElements]);\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 }\r\n // If no initializationPromise, loadPdf hasn't been called yet\r\n // so we don't signal onLoad - the loadPdf flow handles initialization\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Failed to load PDF viewer';\r\n logger.error('Error in handleIframeLoad:', errorMessage);\r\n isLoadingRef.current = false;\r\n onError?.(errorMessage);\r\n }\r\n }, 100);\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 injectRadioLabels,\r\n setFieldMetadata,\r\n zoomIn,\r\n zoomOut,\r\n nextPage,\r\n previousPage,\r\n getCurrentPage,\r\n getTotalPages,\r\n attachFieldClickInterceptors,\r\n attachFieldChangeListeners,\r\n addFieldIndicator,\r\n removeFieldIndicator,\r\n addDateFieldIndicator,\r\n removeDateFieldIndicator,\r\n previewSignature,\r\n previewInitials,\r\n clearFieldPreviews,\r\n }),\r\n [loadPdf, getFormFieldValues, setFormFieldValues, getAllFieldNames, saveDocument, getPDFViewerApplication, injectPlaceholders, injectRadioLabels, setFieldMetadata, zoomIn, zoomOut, nextPage, previousPage, getCurrentPage, getTotalPages, attachFieldClickInterceptors, attachFieldChangeListeners, addFieldIndicator, removeFieldIndicator, addDateFieldIndicator, removeDateFieldIndicator, previewSignature, previewInitials, clearFieldPreviews]\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 transparent background\r\n ctx.clearRect(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.clearRect(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={`signiphi-pdf-signer 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\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","/**\r\n * SignatureTypeInput Component\r\n * Allows users to type their name and generate a signature using cursive fonts\r\n */\r\n\r\nimport React, { useState, useEffect, useCallback, useRef } from 'react';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Input } from '../lib/ui/input';\r\nimport {\r\n loadSignatureFonts,\r\n generateSignatureFromText,\r\n SIGNATURE_FONTS,\r\n DEFAULT_SIGNATURE_FONT,\r\n type SignatureFont,\r\n} from '../utils/font-loader';\r\n\r\nexport interface SignatureTypeInputProps {\r\n /** Callback when user saves their typed signature */\r\n onSave: (dataUrl: string) => void;\r\n /** Callback when user cancels */\r\n onCancel: () => void;\r\n /** Width of the generated signature canvas */\r\n width?: number;\r\n /** Height of the generated signature canvas */\r\n height?: number;\r\n /** Initial text value */\r\n initialText?: string;\r\n /** Initial font */\r\n initialFont?: SignatureFont;\r\n /** Additional class name */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Component for creating text-based signatures with cursive fonts\r\n */\r\nexport function SignatureTypeInput({\r\n onSave,\r\n onCancel,\r\n width = 450,\r\n height = 200,\r\n initialText = '',\r\n initialFont,\r\n className,\r\n}: SignatureTypeInputProps) {\r\n const resolvedInitialFont: SignatureFont =\r\n initialFont ?? DEFAULT_SIGNATURE_FONT;\r\n const [text, setText] = useState(initialText);\r\n const [selectedFont, setSelectedFont] =\r\n useState<SignatureFont>(resolvedInitialFont);\r\n const [fontsReady, setFontsReady] = useState(false);\r\n const [previewDataUrl, setPreviewDataUrl] = useState<string | null>(null);\r\n const previewCanvasRef = useRef<HTMLCanvasElement>(null);\r\n\r\n // Load fonts on mount\r\n useEffect(() => {\r\n loadSignatureFonts()\r\n .then(() => {\r\n setFontsReady(true);\r\n })\r\n .catch((error) => {\r\n console.error('Failed to load signature fonts:', error);\r\n // Still allow usage, fonts might load from browser cache\r\n setFontsReady(true);\r\n });\r\n }, []);\r\n\r\n // Generate preview whenever text or font changes\r\n useEffect(() => {\r\n if (!fontsReady || !text.trim()) {\r\n setPreviewDataUrl(null);\r\n return;\r\n }\r\n\r\n // Small delay to ensure font is rendered\r\n const timeoutId = setTimeout(() => {\r\n try {\r\n const dataUrl = generateSignatureFromText({\r\n text: text.trim(),\r\n fontFamily: selectedFont.family,\r\n width,\r\n height,\r\n });\r\n setPreviewDataUrl(dataUrl);\r\n } catch (error) {\r\n console.error('Failed to generate signature preview:', error);\r\n setPreviewDataUrl(null);\r\n }\r\n }, 50);\r\n\r\n return () => clearTimeout(timeoutId);\r\n }, [text, selectedFont, fontsReady, width, height]);\r\n\r\n const handleTextChange = useCallback(\r\n (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setText(e.target.value);\r\n },\r\n []\r\n );\r\n\r\n const handleFontSelect = useCallback((font: SignatureFont) => {\r\n setSelectedFont(font);\r\n }, []);\r\n\r\n const handleSave = useCallback(() => {\r\n if (!text.trim() || !previewDataUrl) {\r\n return;\r\n }\r\n onSave(previewDataUrl);\r\n }, [text, previewDataUrl, onSave]);\r\n\r\n const hasValidSignature = text.trim().length > 0 && previewDataUrl !== null;\r\n\r\n return (\r\n <div className={className}>\r\n <div className=\"flex flex-col gap-4\">\r\n {/* Text Input */}\r\n <div className=\"space-y-2\">\r\n <label\r\n htmlFor=\"signature-text\"\r\n className=\"text-sm font-medium text-foreground\"\r\n >\r\n Enter your name:\r\n </label>\r\n <Input\r\n id=\"signature-text\"\r\n type=\"text\"\r\n value={text}\r\n onChange={handleTextChange}\r\n placeholder=\"Type your name here\"\r\n maxLength={50}\r\n autoComplete=\"off\"\r\n className=\"text-base\"\r\n />\r\n </div>\r\n\r\n {/* Font Selector */}\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium text-foreground\">\r\n Select style:\r\n </label>\r\n <div className=\"flex flex-wrap gap-2\">\r\n {SIGNATURE_FONTS.map((font) => (\r\n <Button\r\n key={font.name}\r\n type=\"button\"\r\n variant={selectedFont.name === font.name ? 'default' : 'outline'}\r\n size=\"sm\"\r\n onClick={() => handleFontSelect(font)}\r\n className=\"text-xs md:text-sm\"\r\n style={{\r\n fontFamily: fontsReady ? `\"${font.family}\", cursive` : undefined,\r\n }}\r\n >\r\n {font.label}\r\n </Button>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Preview Area */}\r\n <div className=\"space-y-2\">\r\n <label className=\"text-sm font-medium text-foreground\">Preview:</label>\r\n <div\r\n className=\"border-2 border-dashed border-border rounded-lg bg-muted/30 flex items-center justify-center overflow-hidden\"\r\n style={{ minHeight: Math.min(height, 150), maxHeight: height }}\r\n >\r\n {!fontsReady ? (\r\n <span className=\"text-sm text-muted-foreground\">\r\n Loading fonts...\r\n </span>\r\n ) : !text.trim() ? (\r\n <span className=\"text-sm text-muted-foreground\">\r\n Start typing to see preview\r\n </span>\r\n ) : previewDataUrl ? (\r\n <img\r\n src={previewDataUrl}\r\n alt=\"Signature preview\"\r\n className=\"max-w-full max-h-full object-contain\"\r\n />\r\n ) : (\r\n <span className=\"text-sm text-muted-foreground\">\r\n Generating preview...\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Hidden canvas for rendering */}\r\n <canvas ref={previewCanvasRef} className=\"hidden\" />\r\n\r\n {/* Actions */}\r\n <div className=\"flex gap-3\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={onCancel}\r\n className=\"flex-1\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={!hasValidSignature}\r\n className=\"flex-1 font-semibold\"\r\n >\r\n Save Signature\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default SignatureTypeInput;\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 <div className=\"signiphi-pdf-signer\">\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 </div>\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 <div className=\"signiphi-pdf-signer\">\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 </div>\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 * Signature Modal Component - For SIGNATURES ONLY\r\n * Supports drawing, uploading, and typing signatures\r\n * For initials, use InitialsModal instead\r\n */\r\n\r\nimport React, { useRef, useState, useCallback } from 'react';\r\nimport { SignatureCanvas } from './SignatureCanvas';\r\nimport { SignatureTypeInput } from './SignatureTypeInput';\r\nimport { 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 fieldLabel: string;\r\n className?: string;\r\n}\r\n\r\ntype TabType = 'draw' | 'upload' | 'type';\r\n\r\n/**\r\n * Signature modal - FOR SIGNATURES ONLY\r\n */\r\nexport function SignatureModalCore({\r\n isOpen,\r\n onClose,\r\n onSave,\r\n fieldLabel,\r\n}: SignatureModalProps) {\r\n const canvasRef = useRef<SignatureCanvasRef>(null);\r\n const [activeTab, setActiveTab] = useState<TabType>('draw');\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 handleTabChange = useCallback((tab: TabType) => {\r\n setActiveTab(tab);\r\n }, []);\r\n\r\n // Signature-specific canvas sizes\r\n const canvasWidth = 450;\r\n const canvasHeight = 200;\r\n\r\n // Mobile sizes (smaller)\r\n const mobileCanvasWidth = 320;\r\n const mobileCanvasHeight = 150;\r\n\r\n const tabs: { id: TabType; label: string; icon: React.ReactNode }[] = [\r\n {\r\n id: 'draw',\r\n label: 'Draw',\r\n icon: (\r\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} 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 ),\r\n },\r\n {\r\n id: 'upload',\r\n label: 'Upload',\r\n icon: (\r\n <svg className=\"w-4 h-4\" 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 ),\r\n },\r\n {\r\n id: 'type',\r\n label: 'Type',\r\n icon: (\r\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\r\n </svg>\r\n ),\r\n },\r\n ];\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\">Sign Document</DialogTitle>\r\n <DialogDescription className=\"text-sm md:text-base\">\r\n Please provide your full signature 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 {/* Tab Navigation */}\r\n <div className=\"flex gap-1 p-1 bg-muted rounded-lg\">\r\n {tabs.map((tab) => (\r\n <Button\r\n key={tab.id}\r\n type=\"button\"\r\n variant={activeTab === tab.id ? 'default' : 'ghost'}\r\n size=\"sm\"\r\n onClick={() => handleTabChange(tab.id)}\r\n className={`flex-1 gap-1.5 text-xs md:text-sm ${\r\n activeTab === tab.id ? '' : 'hover:bg-background/50'\r\n }`}\r\n >\r\n {tab.icon}\r\n {tab.label}\r\n </Button>\r\n ))}\r\n </div>\r\n\r\n {/* Draw Tab Content */}\r\n {activeTab === 'draw' && (\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=\"Sign Document\"\r\n onSignature={handleSave}\r\n onCancel={handleCancel}\r\n showActions={true}\r\n />\r\n </div>\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=\"Sign Document\"\r\n onSignature={handleSave}\r\n onCancel={handleCancel}\r\n showActions={true}\r\n />\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* Upload Tab Content */}\r\n {activeTab === 'upload' && (\r\n <div className=\"flex flex-col gap-4\">\r\n {/* Upload Button */}\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 Choose 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\">\r\n Supported formats: PNG, JPEG (Max 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 {/* Upload Preview or Placeholder */}\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 <div className=\"flex gap-3\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={handleCancel}\r\n className=\"flex-1\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n onClick={handleSaveUpload}\r\n className=\"flex-1 font-semibold\"\r\n >\r\n Save Signature\r\n </Button>\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"flex flex-col gap-3 md:gap-4\">\r\n <div\r\n className=\"border-2 border-dashed border-border rounded-lg flex items-center justify-center bg-muted/30\"\r\n style={{ minHeight: mobileCanvasHeight }}\r\n >\r\n <span className=\"text-sm text-muted-foreground\">\r\n Upload an image of your signature\r\n </span>\r\n </div>\r\n <div className=\"flex gap-3\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={handleCancel}\r\n className=\"flex-1\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button disabled className=\"flex-1 font-semibold\">\r\n Save Signature\r\n </Button>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Type Tab Content */}\r\n {activeTab === 'type' && (\r\n <SignatureTypeInput\r\n onSave={handleSave}\r\n onCancel={handleCancel}\r\n width={canvasWidth}\r\n height={canvasHeight}\r\n />\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","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","/**\r\n * Initials Modal Component - FOR INITIALS ONLY\r\n * Uses TEXT INPUT for initials (NOT drawing canvas like signatures)\r\n */\r\n\r\nimport React, { useState, useCallback } from 'react';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogHeader,\r\n DialogTitle,\r\n DialogFooter,\r\n} from '../lib/ui/dialog';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Input } from '../lib/ui/input';\r\nimport { Label } from '../lib/ui/label';\r\n\r\nexport interface InitialsModalProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSave: (initialsText: string) => void;\r\n fieldLabel: string;\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Initials modal - FOR INITIALS ONLY (TEXT INPUT)\r\n */\r\nexport function InitialsModal({\r\n isOpen,\r\n onClose,\r\n onSave,\r\n fieldLabel,\r\n}: InitialsModalProps) {\r\n const [initialsText, setInitialsText] = useState('');\r\n\r\n const handleSave = useCallback(() => {\r\n if (initialsText.trim()) {\r\n onSave(initialsText.trim());\r\n setInitialsText(''); // Clear for next time\r\n onClose();\r\n }\r\n }, [initialsText, onSave, onClose]);\r\n\r\n const handleCancel = useCallback(() => {\r\n setInitialsText(''); // Clear on cancel\r\n onClose();\r\n }, [onClose]);\r\n\r\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' && initialsText.trim()) {\r\n handleSave();\r\n }\r\n }, [initialsText, handleSave]);\r\n\r\n return (\r\n <Dialog open={isOpen} onOpenChange={onClose}>\r\n <DialogContent className=\"sm:max-w-md\">\r\n <DialogHeader className=\"space-y-2 md:space-y-3\">\r\n <DialogTitle className=\"text-lg md:text-xl font-semibold\">Add Initials</DialogTitle>\r\n <DialogDescription className=\"text-sm md:text-base\">\r\n Please type your initials 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 py-4\">\r\n <div className=\"space-y-2\">\r\n <Label htmlFor=\"initials-input\" className=\"text-sm font-medium\">\r\n Your Initials\r\n </Label>\r\n <Input\r\n id=\"initials-input\"\r\n type=\"text\"\r\n value={initialsText}\r\n onChange={(e) => setInitialsText(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder=\"Enter your initials\"\r\n autoFocus\r\n autoComplete=\"off\"\r\n className=\"text-lg md:text-xl font-serif italic text-center h-12 md:h-14 border-2 focus:border-primary/50 transition-colors\"\r\n style={{ fontFamily: \"'Dancing Script', 'Brush Script MT', cursive\" }}\r\n />\r\n <p className=\"text-xs text-muted-foreground text-center\">\r\n Typically 2-3 letters (e.g., \"JD\" for John Doe)\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <DialogFooter className=\"gap-2\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={handleCancel}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n onClick={handleSave}\r\n disabled={!initialsText.trim()}\r\n >\r\n Save Initials\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\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 onInitialsClick?: () => void; // Optional - if provided, initials becomes a button; otherwise text input\r\n onInitialsChange: (value: string) => void;\r\n signatureData?: string;\r\n initialsValue?: string;\r\n initialsData?: string; // For button mode - shows if initials signature has been captured\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 onInitialsClick,\r\n onInitialsChange,\r\n signatureData,\r\n initialsValue = '',\r\n initialsData,\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', 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=\"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\">{initialsLabel}</span>\r\n {initialsRequired && <span className=\"text-destructive ml-0.5\">*</span>}\r\n </Label>\r\n {onInitialsClick ? (\r\n // Button mode - opens signature modal for initials\r\n <Button\r\n type=\"button\"\r\n onClick={onInitialsClick}\r\n variant={initialsData ? '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 initialsData\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 {initialsData ? (\r\n <>\r\n <CheckCircle className=\"mr-1.5 md:mr-2 size-3.5 md:size-4\" />\r\n <span className=\"truncate\">Initials 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 Add Initials</span>\r\n </>\r\n )}\r\n </Button>\r\n ) : (\r\n // Text input mode - traditional initials entry\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 )}\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 // Merge the forwarded ref with internal ref and apply z-index immediately\r\n const mergedRef = React.useCallback(\r\n (node: HTMLDivElement | null) => {\r\n // Apply z-index immediately when node is mounted\r\n // This ensures dropdown appears above calendar (z-index: 10000) from the start\r\n if (node) {\r\n node.style.setProperty('z-index', '10001', 'important');\r\n }\r\n \r\n // Set forwarded ref\r\n if (typeof ref === 'function') {\r\n ref(node);\r\n } else if (ref) {\r\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\r\n }\r\n },\r\n [ref]\r\n );\r\n\r\n return (\r\n <SelectPrimitive.Portal>\r\n <SelectPrimitive.Content\r\n ref={mergedRef}\r\n className={cn(\r\n 'signiphi-pdf-signer', // Add scoping class to portal content\r\n '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 style={{ backgroundColor: 'var(--sps-popover, white)', ...props.style }}\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\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 'signiphi-pdf-signer', // Add scoping class to portal content\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 style={{ backgroundColor: 'var(--sps-popover, white)', ...props.style }}\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 text-sm\">{invalidDateValue}</span>\r\n </>\r\n ) : (\r\n <>\r\n <CalendarIcon className=\"mr-2 h-4 w-4\" />\r\n {date ? <span className=\"text-sm\">{format(date, 'PPP')}</span> : <span className=\"text-sm\">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 { useState, useEffect } from 'react';\r\nimport { 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 // Local state to work around Radix RadioGroup not reflecting\r\n // controlled value changes that arrive after initial mount.\r\n const [localValue, setLocalValue] = useState(value);\r\n\r\n useEffect(() => {\r\n if (value && value !== localValue) {\r\n setLocalValue(value);\r\n }\r\n }, [value]);\r\n\r\n const handleChange = (newValue: string) => {\r\n setLocalValue(newValue);\r\n onChange(newValue);\r\n };\r\n\r\n return (\r\n <div className={cn('w-full', className)}>\r\n <RadioGroup\r\n value={localValue}\r\n onValueChange={handleChange}\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={() => handleChange(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 // Log what we received\r\n console.log('[SIGNATURE RENDERER] Component rendered:', {\r\n fieldId: field.id,\r\n hasOnSignatureClick: !!onSignatureClick,\r\n onSignatureClickType: typeof onSignatureClick\r\n });\r\n\r\n const handleClick = () => {\r\n console.log('[SIGNATURE RENDERER] Button clicked for field:', field.id);\r\n onSignatureClick();\r\n };\r\n\r\n return (\r\n <div className=\"w-full\">\r\n <Button\r\n type=\"button\"\r\n onClick={handleClick}\r\n onPointerDown={() => console.log('[SIGNATURE RENDERER] PointerDown event')}\r\n onMouseDown={() => console.log('[SIGNATURE RENDERER] MouseDown event')}\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 onSignatureClick?: () => void; // For acknowledgement handling\r\n hasSignature?: boolean;\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 onSignatureClick,\r\n error,\r\n className = '',\r\n}: InitialsFieldRendererProps) {\r\n // Log what we received\r\n console.log('[INITIALS RENDERER] Component rendered:', {\r\n fieldId: field.id,\r\n hasOnSignatureClick: !!onSignatureClick,\r\n onSignatureClickType: typeof onSignatureClick,\r\n hasAcknowledgements: !!(field.acknowledgements && field.acknowledgements.length > 0)\r\n });\r\n\r\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\r\n console.log('[INITIALS RENDERER] Input focused for field:', field.id);\r\n // If field has acknowledgements and onSignatureClick is provided, trigger it\r\n // This will show the acknowledgement modal before allowing input\r\n if (onSignatureClick && field.acknowledgements && field.acknowledgements.length > 0) {\r\n console.log('[INITIALS RENDERER] Field with acknowledgements focused:', field.id);\r\n e.target.blur(); // Remove focus immediately\r\n onSignatureClick(); // Trigger acknowledgement modal\r\n }\r\n };\r\n\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 onFocus={handleFocus}\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\nimport { Lock } from 'lucide-react';\r\nimport { cn } from '../../lib/utils';\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 // Acknowledgement props\r\n isFieldFullyAcknowledged?: (fieldId: string) => boolean;\r\n onAcknowledgementRequired?: (field: EsignFormField) => void;\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 isFieldFullyAcknowledged,\r\n onAcknowledgementRequired,\r\n}: FormFieldRendererProps) {\r\n // Check if field has acknowledgements and they're not fully acknowledged\r\n const hasAcknowledgements = field.acknowledgements && field.acknowledgements.length > 0;\r\n const needsAcknowledgement = hasAcknowledgements &&\r\n isFieldFullyAcknowledged &&\r\n !isFieldFullyAcknowledged(field.id);\r\n\r\n // Log when rendering signature/initials with acknowledgements\r\n if ((field.type === 'signature' || field.type === 'initials') && hasAcknowledgements) {\r\n console.log('[FORM FIELD RENDERER] Rendering:', {\r\n id: field.id,\r\n type: field.type,\r\n hasAcknowledgements,\r\n needsAcknowledgement,\r\n hasOnSignatureClick: !!onSignatureClick,\r\n hasOnAckRequired: !!onAcknowledgementRequired,\r\n isFieldFullyAcknowledgedFunc: !!isFieldFullyAcknowledged\r\n });\r\n }\r\n\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 // If acknowledgements are needed, wrap in a disabled container\r\n // BUT: Don't block signature/initials fields - they need to open their modals\r\n const isSignatureType = field.type === FormFieldType.SIGNATURE || field.type === FormFieldType.INITIALS;\r\n \r\n if (needsAcknowledgement && !isSignatureType) {\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (onAcknowledgementRequired) {\r\n onAcknowledgementRequired(field);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"relative\">\r\n <div\r\n className={cn(\r\n \"relative cursor-pointer\",\r\n className\r\n )}\r\n onClick={handleClick}\r\n >\r\n {/* Render the field in disabled state */}\r\n <div className=\"pointer-events-none opacity-50\">\r\n {renderFieldComponent(field, commonProps, onSignatureClick, hasSignature)}\r\n </div>\r\n \r\n {/* Overlay with lock icon */}\r\n <div className=\"absolute inset-0 flex items-center justify-center bg-orange-100/50 dark:bg-orange-950/30 border-2 border-orange-500 rounded-md backdrop-blur-[1px]\">\r\n <div className=\"flex items-center gap-2 text-orange-700 dark:text-orange-400 font-medium text-sm\">\r\n <Lock className=\"h-4 w-4\" />\r\n <span>Acknowledgement Required</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // For signature/initials fields with acknowledgements, show acknowledgement modal BEFORE opening signature pad\r\n if (needsAcknowledgement && isSignatureType) {\r\n console.log('[FORM FIELD RENDERER] Wrapping signature field with acknowledgement check:', field.id);\r\n const wrappedSignatureClick = () => {\r\n console.log('[FORM FIELD RENDERER] Wrapped click triggered for field:', field.id);\r\n if (onAcknowledgementRequired) {\r\n console.log('[FORM FIELD RENDERER] Calling onAcknowledgementRequired');\r\n onAcknowledgementRequired(field);\r\n } else {\r\n console.log('[FORM FIELD RENDERER] WARNING: onAcknowledgementRequired not provided!');\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n className=\"relative\"\r\n onClick={(e) => {\r\n console.log('[FORM FIELD RENDERER] Wrapper div clicked!', e.target);\r\n }}\r\n >\r\n <div className={cn(\"relative border-2 border-orange-500 rounded-md\", className)}>\r\n {renderFieldComponent(field, commonProps, wrappedSignatureClick, hasSignature)}\r\n </div>\r\n <div className=\"flex items-center gap-1 text-orange-600 text-xs mt-1\">\r\n <Lock className=\"h-3 w-3\" />\r\n <span>Acknowledge before signing</span>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return renderFieldComponent(field, commonProps, onSignatureClick, hasSignature);\r\n}\r\n\r\nfunction renderFieldComponent(\r\n field: EsignFormField,\r\n commonProps: any,\r\n onSignatureClick?: () => void,\r\n hasSignature?: boolean\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 (\r\n <InitialsFieldRenderer\r\n {...commonProps}\r\n onSignatureClick={onSignatureClick}\r\n hasSignature={hasSignature}\r\n />\r\n );\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, paste, and keyboard support\r\n */\r\n\r\nimport { useCallback, useMemo, useRef, useState } from 'react';\r\nimport { Upload, X, FileText, Image as ImageIcon, File as FileIcon, AlertCircle } from 'lucide-react';\r\nimport type { Attachment, AttachmentConstraints } 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 constraints?: AttachmentConstraints;\r\n validationErrors?: string[];\r\n onClearErrors?: () => void;\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 constraints,\r\n validationErrors,\r\n onClearErrors,\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 // Derive accept string from constraints for the file input\r\n const acceptString = useMemo(() => {\r\n if (!constraints) return undefined;\r\n const types = constraints.allowedTypes ?? [];\r\n const extensions = constraints.allowedExtensions ?? [];\r\n const combined = [...types, ...extensions].join(',');\r\n return combined || undefined;\r\n }, [constraints]);\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 * Open the file picker\r\n */\r\n const openFilePicker = useCallback(() => {\r\n if (!disabled && !isUploading) {\r\n fileInputRef.current?.click();\r\n }\r\n }, [disabled, isUploading]);\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 * Handle clipboard paste (Ctrl+V / Cmd+V)\r\n */\r\n const handlePaste = useCallback(\r\n (event: React.ClipboardEvent) => {\r\n if (disabled || isUploading) return;\r\n\r\n const items = event.clipboardData?.items;\r\n if (!items) return;\r\n\r\n const files: File[] = [];\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i]!;\r\n if (item.kind === 'file') {\r\n const file = item.getAsFile();\r\n if (file) files.push(file);\r\n }\r\n }\r\n\r\n if (files.length > 0) {\r\n event.preventDefault();\r\n onAdd(files);\r\n }\r\n },\r\n [disabled, isUploading, onAdd]\r\n );\r\n\r\n /**\r\n * Handle keyboard activation (Enter/Space)\r\n */\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n if (disabled || isUploading) return;\r\n if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n fileInputRef.current?.click();\r\n }\r\n },\r\n [disabled, isUploading]\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 const totalSize = attachments.reduce((sum, att) => sum + att.size, 0);\r\n\r\n return (\r\n <div className={`space-y-3 md:space-y-4 ${className}`} onPaste={handlePaste}>\r\n {/* Upload Area */}\r\n {canAddMore && (\r\n <div\r\n onClick={openFilePicker}\r\n onKeyDown={handleKeyDown}\r\n onDragEnter={handleDragEnter}\r\n onDragLeave={handleDragLeave}\r\n onDragOver={handleDragOver}\r\n onDrop={handleDrop}\r\n role=\"button\"\r\n tabIndex={disabled ? -1 : 0}\r\n aria-label={`Upload files. ${attachments.length} of ${maxFiles} files attached.`}\r\n aria-disabled={disabled || isUploading}\r\n className={`relative border-2 border-dashed rounded-lg p-4 md:p-8 text-center transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 ${\r\n isDragging\r\n ? 'border-primary bg-primary/10 ring-2 ring-primary/30 scale-[1.01]'\r\n : disabled\r\n ? 'border-border bg-muted cursor-not-allowed'\r\n : 'border-border bg-background hover:border-primary/40 hover:bg-primary/5 cursor-pointer'\r\n }`}\r\n >\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n multiple\r\n accept={acceptString}\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, paste, or </span>\r\n <span className=\"text-primary font-medium\">\r\n <span className=\"sm:hidden\">Tap to </span>browse files\r\n </span>\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 {/* Validation Errors */}\r\n {validationErrors && validationErrors.length > 0 && (\r\n <div className=\"flex items-start gap-2 p-2 md:p-3 bg-destructive/10 border border-destructive/30 rounded-lg text-destructive\">\r\n <AlertCircle className=\"w-4 h-4 mt-0.5 flex-shrink-0\" />\r\n <div className=\"flex-1 min-w-0\">\r\n <ul className=\"list-disc list-inside text-xs md:text-sm space-y-0.5\">\r\n {validationErrors.map((error, index) => (\r\n <li key={index}>{error}</li>\r\n ))}\r\n </ul>\r\n </div>\r\n {onClearErrors && (\r\n <button\r\n type=\"button\"\r\n onClick={onClearErrors}\r\n className=\"flex-shrink-0 p-0.5 rounded text-destructive/70 hover:text-destructive transition-colors\"\r\n aria-label=\"Dismiss errors\"\r\n >\r\n <X className=\"w-3.5 h-3.5\" />\r\n </button>\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 <div className=\"flex items-center justify-between\">\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 {constraints && (\r\n <p className=\"text-xs text-muted-foreground\">\r\n {formatSize(totalSize)} / {formatSize(constraints.maxTotalSize)}\r\n </p>\r\n )}\r\n </div>\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","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","import { Button } from '../lib/ui/button';\r\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\r\n\r\nexport interface RequiredFieldNavigationProps {\r\n /** Current index in the required fields list (0-indexed) */\r\n currentIndex: number;\r\n /** Total number of required fields */\r\n totalRequired: number;\r\n /** Callback when next button is clicked */\r\n onNext: () => void;\r\n /** Callback when previous button is clicked */\r\n onPrevious: () => void;\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Navigation controls for cycling through required fields only\r\n * Shows current position and provides next/previous buttons\r\n */\r\nexport function RequiredFieldNavigation({\r\n currentIndex,\r\n totalRequired,\r\n onNext,\r\n onPrevious,\r\n className = ''\r\n}: RequiredFieldNavigationProps) {\r\n if (totalRequired === 0) return null;\r\n\r\n return (\r\n <div className={`flex items-center gap-2 ${className}`}>\r\n <div className=\"flex items-center gap-1\">\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n onClick={onPrevious}\r\n className=\"h-8 w-8\"\r\n aria-label=\"Previous required field\"\r\n >\r\n <ChevronLeft size={16} />\r\n </Button>\r\n <span className=\"text-sm text-muted-foreground px-2\">\r\n {currentIndex < 0 ? 0 : currentIndex + 1} / {totalRequired}\r\n </span>\r\n <Button\r\n variant=\"ghost\"\r\n onClick={onNext}\r\n className=\"h-8 px-3 gap-1.5\"\r\n aria-label=\"Next required field\"\r\n >\r\n <ChevronRight size={16} />\r\n <span className=\"text-sm font-medium\">Required Field</span>\r\n </Button>\r\n </div>\r\n </div>\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\nimport { RequiredFieldNavigation } from './RequiredFieldNavigation';\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 /** Required field navigation props (for PDF view only) */\r\n requiredFieldNavigation?: {\r\n hasRequiredFields: boolean;\r\n currentRequiredIndex: number;\r\n requiredFieldCount: number;\r\n onNext: () => void;\r\n onPrevious: () => void;\r\n };\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 requiredFieldNavigation,\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 {/* Page Navigation Controls */}\r\n {showPdfControlsGroup && isViewerReady && (\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 )}\r\n\r\n {/* PDF Controls - Three column layout on desktop */}\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\">\r\n {/* Page Navigation Controls - Centered on desktop */}\r\n \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 {/* Zoom Controls */}\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 {/* Required Field Navigation */}\r\n {requiredFieldNavigation?.hasRequiredFields && (\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 <RequiredFieldNavigation\r\n currentIndex={requiredFieldNavigation.currentRequiredIndex}\r\n totalRequired={requiredFieldNavigation.requiredFieldCount}\r\n onNext={requiredFieldNavigation.onNext}\r\n onPrevious={requiredFieldNavigation.onPrevious}\r\n />\r\n </>\r\n )}\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 /** Check if field acknowledgements are fully acknowledged */\r\n isFieldFullyAcknowledged?: (fieldId: string) => boolean;\r\n /** Callback when acknowledgement is required for a field */\r\n onAcknowledgementRequired?: (field: EsignFormField) => void;\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 ALL signature and initials fields (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 isFieldFullyAcknowledged,\r\n onAcknowledgementRequired,\r\n}, ref) => {\r\n // Filter out ALL signature and initials fields (they stay in sidebar)\r\n const displayFields = fields.filter(\r\n (f) => f.type !== 'signature' && f.type !== 'initials'\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 isFieldFullyAcknowledged={isFieldFullyAcknowledged}\r\n onAcknowledgementRequired={onAcknowledgementRequired}\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","import { useState, useEffect } from 'react';\r\nimport type { EsignFormField } from '../types';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../lib/ui/dialog';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Checkbox } from '../lib/ui/checkbox';\r\nimport { Label } from '../lib/ui/label';\r\nimport { AlertCircle } from 'lucide-react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface AcknowledgementModalProps {\r\n /** Whether the modal is open */\r\n open: boolean;\r\n /** Callback when modal close is requested */\r\n onOpenChange: (open: boolean) => void;\r\n /** The field with acknowledgements to display */\r\n field: EsignFormField | null;\r\n /** Callback when an acknowledgement item is checked/unchecked */\r\n onAcknowledge: (fieldId: string, ackId: string) => void;\r\n /** Check if an acknowledgement is already acknowledged */\r\n isAcknowledged: (fieldId: string, ackId: string) => boolean;\r\n /** Callback when all acknowledgements are acknowledged */\r\n onComplete?: (fieldId: string) => void;\r\n}\r\n\r\n/**\r\n * Modal that displays acknowledgements for a field\r\n * Requires explicit acceptance before allowing field interaction\r\n */\r\nexport function AcknowledgementModal({\r\n open,\r\n onOpenChange,\r\n field,\r\n onAcknowledge,\r\n isAcknowledged,\r\n onComplete,\r\n}: AcknowledgementModalProps) {\r\n const [localChecked, setLocalChecked] = useState<Set<string>>(new Set());\r\n\r\n // Reset local state when field changes or modal opens\r\n useEffect(() => {\r\n if (open && field && field.acknowledgements) {\r\n const alreadyAcknowledged = new Set(\r\n field.acknowledgements\r\n .filter(ack => isAcknowledged(field.id, ack.id))\r\n .map(ack => ack.id)\r\n );\r\n setLocalChecked(alreadyAcknowledged);\r\n }\r\n }, [open, field, isAcknowledged]);\r\n\r\n if (!field || !field.acknowledgements || !Array.isArray(field.acknowledgements) || field.acknowledgements.length === 0) {\r\n return null;\r\n }\r\n\r\n const allChecked = field.acknowledgements.every(ack => localChecked.has(ack.id));\r\n\r\n const handleCheckboxChange = (ackId: string, checked: boolean) => {\r\n setLocalChecked(prev => {\r\n const newSet = new Set(prev);\r\n if (checked) {\r\n newSet.add(ackId);\r\n } else {\r\n newSet.delete(ackId);\r\n }\r\n return newSet;\r\n });\r\n };\r\n\r\n const handleAcknowledgeAll = () => {\r\n // Mark all as checked locally\r\n const allIds = new Set(field.acknowledgements!.map(ack => ack.id));\r\n setLocalChecked(allIds);\r\n\r\n // Acknowledge all in parent state\r\n field.acknowledgements!.forEach(ack => {\r\n if (!isAcknowledged(field.id, ack.id)) {\r\n onAcknowledge(field.id, ack.id);\r\n }\r\n });\r\n\r\n // Call completion callback and close modal\r\n onComplete?.(field.id);\r\n onOpenChange(false);\r\n };\r\n\r\n const handleCancel = () => {\r\n // Reset local state and close without saving\r\n onOpenChange(false);\r\n };\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={(newOpen) => {\r\n if (!newOpen) {\r\n handleCancel();\r\n }\r\n }}>\r\n <DialogContent className=\"max-w-2xl max-h-[80vh] flex flex-col\">\r\n <DialogHeader>\r\n <DialogTitle className=\"flex items-center gap-2 text-xl\">\r\n <AlertCircle className=\"h-5 w-5 text-orange-600\" />\r\n Acknowledgements Required\r\n </DialogTitle>\r\n <DialogDescription className=\"text-base\">\r\n Please review and acknowledge the following before interacting with this field:\r\n <span className=\"font-semibold block mt-1\">{field.label || field.name}</span>\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <div className=\"flex-1 overflow-y-auto space-y-4 py-4\">\r\n {field.acknowledgements.map((ack, index) => {\r\n const checked = localChecked.has(ack.id);\r\n return (\r\n <div\r\n key={ack.id}\r\n className={cn(\r\n \"p-4 border rounded-lg transition-colors\",\r\n checked\r\n ? \"border-green-500 bg-green-50 dark:bg-green-950/20\"\r\n : \"border-border bg-muted/30\"\r\n )}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <Checkbox\r\n id={`ack-${ack.id}`}\r\n checked={checked}\r\n onCheckedChange={(isChecked) =>\r\n handleCheckboxChange(ack.id, isChecked === true)\r\n }\r\n className=\"mt-1\"\r\n />\r\n <div className=\"flex-1\">\r\n <Label\r\n htmlFor={`ack-${ack.id}`}\r\n className=\"text-base font-semibold cursor-pointer\"\r\n >\r\n {index + 1}. {ack.title}\r\n </Label>\r\n {ack.description && (\r\n <p className=\"text-sm text-muted-foreground mt-2 whitespace-pre-wrap\">\r\n {ack.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <DialogFooter className=\"flex-row justify-end gap-2 sm:gap-2\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={handleCancel}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n onClick={handleAcknowledgeAll}\r\n disabled={allChecked && field.acknowledgements.every(ack => isAcknowledged(field.id, ack.id))}\r\n className=\"min-w-[140px]\"\r\n >\r\n {allChecked ? 'Continue' : 'Acknowledge All'}\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\n","import { useState, useEffect, useRef } from 'react';\r\nimport type { EsignFormField } from '../types';\r\nimport {\r\n Dialog,\r\n DialogContent,\r\n DialogDescription,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTitle,\r\n} from '../lib/ui/dialog';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Checkbox } from '../lib/ui/checkbox';\r\nimport { Label } from '../lib/ui/label';\r\nimport { AlertCircle, ChevronDown, CheckCircle2, Clock } from 'lucide-react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface UnacknowledgedFieldInfo {\r\n field: EsignFormField;\r\n unacknowledgedCount: number;\r\n}\r\n\r\nexport interface UnacknowledgedFieldsModalProps {\r\n /** Whether the modal is open */\r\n open: boolean;\r\n /** Callback when modal close is requested */\r\n onOpenChange: (open: boolean) => void;\r\n /** List of fields with unacknowledged items */\r\n unacknowledgedFields: UnacknowledgedFieldInfo[];\r\n /** Callback when an acknowledgement item is checked */\r\n onAcknowledge: (fieldId: string, ackId: string) => void;\r\n /** Check if an acknowledgement is already acknowledged */\r\n isAcknowledged: (fieldId: string, ackId: string) => boolean;\r\n /** Callback when all acknowledgements are complete (called with acknowledged field IDs) */\r\n onComplete?: (fieldIds: string[]) => void;\r\n}\r\n\r\n/**\r\n * Modal that displays all fields with unacknowledged items\r\n * Uses accordion UI to allow inline acknowledgement without opening separate modals\r\n */\r\nexport function UnacknowledgedFieldsModal({\r\n open,\r\n onOpenChange,\r\n unacknowledgedFields,\r\n onAcknowledge,\r\n isAcknowledged,\r\n onComplete,\r\n}: UnacknowledgedFieldsModalProps) {\r\n const [expandedItem, setExpandedItem] = useState<string>('');\r\n const [isManuallyClosing, setIsManuallyClosing] = useState(false);\r\n\r\n // Keep a ref to the latest onComplete callback to avoid stale closures in setTimeout\r\n const onCompleteRef = useRef(onComplete);\r\n useEffect(() => {\r\n onCompleteRef.current = onComplete;\r\n }, [onComplete]);\r\n\r\n // Auto-expand first field when modal opens\r\n useEffect(() => {\r\n if (open && unacknowledgedFields.length > 0 && expandedItem === '') {\r\n const firstField = unacknowledgedFields[0];\r\n if (firstField) {\r\n setExpandedItem(firstField.field.id);\r\n }\r\n }\r\n }, [open, unacknowledgedFields, expandedItem]);\r\n\r\n // Auto-close if all acknowledgements are complete (but not if manually closing)\r\n useEffect(() => {\r\n if (open && unacknowledgedFields.length === 0 && !isManuallyClosing) {\r\n onOpenChange(false);\r\n }\r\n }, [open, unacknowledgedFields.length, onOpenChange, isManuallyClosing]);\r\n\r\n const handleCheckboxChange = (fieldId: string, ackId: string, checked: boolean) => {\r\n if (checked) {\r\n onAcknowledge(fieldId, ackId);\r\n\r\n // Check if this field is now fully acknowledged\r\n const fieldInfo = unacknowledgedFields.find(f => f.field.id === fieldId);\r\n if (fieldInfo && fieldInfo.field.acknowledgements) {\r\n const allAcknowledged = fieldInfo.field.acknowledgements.every(ack =>\r\n ack.id === ackId || isAcknowledged(fieldId, ack.id)\r\n );\r\n\r\n if (allAcknowledged) {\r\n // Trigger indicator refresh for this field with fresh state\r\n // Use setTimeout to ensure React has processed the state update and re-rendered\r\n // 150ms allows for React batch updates + re-render + useEffect to update the ref\r\n setTimeout(() => {\r\n onCompleteRef.current?.([fieldId]);\r\n }, 150);\r\n\r\n // Collapse current and expand next unacknowledged\r\n const currentIndex = unacknowledgedFields.findIndex(f => f.field.id === fieldId);\r\n const nextUnacknowledged = unacknowledgedFields[currentIndex + 1];\r\n\r\n if (nextUnacknowledged) {\r\n setTimeout(() => {\r\n setExpandedItem(nextUnacknowledged.field.id);\r\n }, 300);\r\n } else {\r\n // All done, modal will auto-close via useEffect\r\n setTimeout(() => setExpandedItem(''), 300);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const toggleExpanded = (fieldId: string) => {\r\n setExpandedItem(prev => prev === fieldId ? '' : fieldId);\r\n };\r\n\r\n const handleAcknowledgeAll = async () => {\r\n setIsManuallyClosing(true);\r\n\r\n // Collect field IDs that are being acknowledged\r\n const acknowledgedFieldIds: string[] = [];\r\n\r\n // Acknowledge all items for all fields\r\n unacknowledgedFields.forEach(({ field }) => {\r\n if (field.acknowledgements) {\r\n let fieldHadUnacknowledged = false;\r\n field.acknowledgements.forEach(ack => {\r\n if (!isAcknowledged(field.id, ack.id)) {\r\n onAcknowledge(field.id, ack.id);\r\n fieldHadUnacknowledged = true;\r\n }\r\n });\r\n if (fieldHadUnacknowledged) {\r\n acknowledgedFieldIds.push(field.id);\r\n }\r\n }\r\n });\r\n\r\n // Wait for state updates to propagate before closing\r\n // This ensures the parent component sees the updated acknowledgement state\r\n await new Promise(resolve => setTimeout(resolve, 150));\r\n\r\n // Close modal after acknowledgements have been processed\r\n onOpenChange(false);\r\n setIsManuallyClosing(false);\r\n\r\n // Call onComplete with the acknowledged field IDs AFTER state updates have propagated\r\n // This allows the parent to refresh indicators with fresh state\r\n // Use onCompleteRef.current to get the LATEST callback with fresh closures,\r\n // not the stale version captured when this function was created\r\n if (acknowledgedFieldIds.length > 0) {\r\n // Use setTimeout to ensure this runs after React has processed the state updates\r\n // and the parent component has re-rendered with fresh closures\r\n // 150ms allows for React batch updates + re-render + useEffect to update the ref\r\n setTimeout(() => {\r\n onCompleteRef.current?.(acknowledgedFieldIds);\r\n }, 150);\r\n }\r\n };\r\n\r\n return (\r\n <Dialog open={open} onOpenChange={onOpenChange}>\r\n <DialogContent className=\"max-w-2xl max-h-[80vh] flex flex-col\">\r\n <DialogHeader>\r\n <DialogTitle className=\"flex items-center gap-2 text-xl\">\r\n <AlertCircle className=\"h-5 w-5 text-orange-600\" />\r\n Acknowledgements Required\r\n </DialogTitle>\r\n <DialogDescription className=\"text-base\">\r\n The following fields require acknowledgements before you can submit this document.\r\n Review and check each acknowledgement below.\r\n </DialogDescription>\r\n </DialogHeader>\r\n\r\n <div className=\"flex-1 overflow-y-auto space-y-3 py-4\">\r\n {unacknowledgedFields.map(({ field }) => {\r\n if (!field.acknowledgements) return null;\r\n\r\n const isExpanded = expandedItem === field.id;\r\n const totalCount = field.acknowledgements.length;\r\n const acknowledgedCount = field.acknowledgements.filter(ack =>\r\n isAcknowledged(field.id, ack.id)\r\n ).length;\r\n const isFullyAcknowledged = acknowledgedCount === totalCount;\r\n const isPartiallyAcknowledged = acknowledgedCount > 0 && acknowledgedCount < totalCount;\r\n\r\n let StatusIcon = AlertCircle;\r\n let statusColor = 'text-orange-600';\r\n let borderColor = 'border-orange-500';\r\n\r\n if (isFullyAcknowledged) {\r\n StatusIcon = CheckCircle2;\r\n statusColor = 'text-green-600';\r\n borderColor = 'border-green-500';\r\n } else if (isPartiallyAcknowledged) {\r\n StatusIcon = Clock;\r\n statusColor = 'text-blue-600';\r\n borderColor = 'border-blue-500';\r\n }\r\n\r\n return (\r\n <div\r\n key={field.id}\r\n className={cn('border rounded-lg', borderColor)}\r\n >\r\n {/* Header/Trigger */}\r\n <button\r\n onClick={() => toggleExpanded(field.id)}\r\n className=\"w-full px-4 py-3 flex items-center gap-3 text-left hover:bg-muted/50 transition-colors\"\r\n type=\"button\"\r\n >\r\n <StatusIcon className={cn('h-5 w-5 flex-shrink-0', statusColor)} />\r\n <span className=\"flex-1 text-base font-semibold line-clamp-1\">\r\n {field.label || field.name}\r\n </span>\r\n <span className=\"text-sm text-muted-foreground bg-muted px-2.5 py-1 rounded-full flex-shrink-0\">\r\n {acknowledgedCount}/{totalCount}\r\n </span>\r\n <ChevronDown\r\n className={cn(\r\n 'h-5 w-5 flex-shrink-0 transition-transform duration-200',\r\n isExpanded && 'rotate-180'\r\n )}\r\n />\r\n </button>\r\n\r\n {/* Content */}\r\n {isExpanded && (\r\n <div className=\"px-4 pb-4 space-y-3 pt-1\">\r\n {field.acknowledgements.map((ack, index) => {\r\n const checked = isAcknowledged(field.id, ack.id);\r\n return (\r\n <div\r\n key={ack.id}\r\n className={cn(\r\n 'p-3 border rounded-md transition-colors',\r\n checked\r\n ? 'border-green-500 bg-green-50 dark:bg-green-950/20'\r\n : 'border-border bg-background'\r\n )}\r\n >\r\n <div className=\"flex items-start gap-3\">\r\n <Checkbox\r\n id={`modal-ack-${field.id}-${ack.id}`}\r\n checked={checked}\r\n onCheckedChange={(isChecked) =>\r\n handleCheckboxChange(field.id, ack.id, isChecked === true)\r\n }\r\n className=\"mt-1\"\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <Label\r\n htmlFor={`modal-ack-${field.id}-${ack.id}`}\r\n className=\"text-sm font-semibold cursor-pointer block\"\r\n >\r\n {index + 1}. {ack.title}\r\n </Label>\r\n {ack.description && (\r\n <p className=\"text-sm text-muted-foreground mt-2 whitespace-pre-wrap\">\r\n {ack.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n <DialogFooter className=\"flex-row justify-between gap-2 sm:gap-2\">\r\n <Button\r\n type=\"button\"\r\n variant=\"outline\"\r\n onClick={() => onOpenChange(false)}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n type=\"button\"\r\n onClick={handleAcknowledgeAll}\r\n disabled={unacknowledgedFields.length === 0}\r\n >\r\n Acknowledge All & Continue\r\n </Button>\r\n </DialogFooter>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n","import { useState, useEffect } from 'react';\r\nimport type { EsignFormField } from '../types';\r\nimport { Card, CardContent, CardHeader, CardTitle } from '../lib/ui/card';\r\nimport { Checkbox } from '../lib/ui/checkbox';\r\nimport { Label } from '../lib/ui/label';\r\nimport { AlertCircle, CheckCircle2, Clock, ChevronDown } from 'lucide-react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport interface AcknowledgementsSidebarProps {\r\n /** Fields that have acknowledgements */\r\n fields: EsignFormField[];\r\n /** Callback when an acknowledgement item is checked */\r\n onAcknowledge: (fieldId: string, ackId: string) => void;\r\n /** Check if an acknowledgement is already acknowledged */\r\n isAcknowledged: (fieldId: string, ackId: string) => boolean;\r\n /** Get progress for a field */\r\n getProgress: (fieldId: string) => { current: number; total: number };\r\n /** Additional CSS classes */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * Sidebar section for acknowledging all field acknowledgements\r\n * Displays fields with acknowledgements and allows batch acknowledgement\r\n */\r\nexport function AcknowledgementsSidebar({\r\n fields,\r\n onAcknowledge,\r\n isAcknowledged,\r\n getProgress,\r\n className = '',\r\n}: AcknowledgementsSidebarProps) {\r\n const [expandedItem, setExpandedItem] = useState<string>('');\r\n\r\n // Filter fields that have acknowledgements - with safety checks\r\n const fieldsWithAcknowledgements = fields.filter(\r\n field => field?.acknowledgements && Array.isArray(field.acknowledgements) && field.acknowledgements.length > 0\r\n );\r\n\r\n // Auto-expand first unacknowledged field on mount\r\n useEffect(() => {\r\n if (fieldsWithAcknowledgements.length === 0) return;\r\n \r\n if (expandedItem === '' && fieldsWithAcknowledgements.length > 0) {\r\n const firstUnacknowledged = fieldsWithAcknowledgements.find(field => {\r\n const progress = getProgress(field.id);\r\n return progress.current < progress.total;\r\n });\r\n\r\n if (firstUnacknowledged) {\r\n setExpandedItem(firstUnacknowledged.id);\r\n }\r\n }\r\n }, [fieldsWithAcknowledgements, getProgress, expandedItem]);\r\n\r\n if (fieldsWithAcknowledgements.length === 0) {\r\n return null;\r\n }\r\n\r\n const handleCheckboxChange = (fieldId: string, ackId: string, checked: boolean) => {\r\n if (checked) {\r\n onAcknowledge(fieldId, ackId);\r\n\r\n // Check if this field is now fully acknowledged\r\n const field = fieldsWithAcknowledgements.find(f => f.id === fieldId);\r\n if (field && field.acknowledgements) {\r\n const allAcknowledged = field.acknowledgements.every(ack =>\r\n ack.id === ackId || isAcknowledged(fieldId, ack.id)\r\n );\r\n\r\n if (allAcknowledged) {\r\n // Collapse current and expand next unacknowledged\r\n const currentIndex = fieldsWithAcknowledgements.findIndex(f => f.id === fieldId);\r\n const nextUnacknowledged = fieldsWithAcknowledgements\r\n .slice(currentIndex + 1)\r\n .find(f => {\r\n const progress = getProgress(f.id);\r\n return progress.current < progress.total;\r\n });\r\n\r\n if (nextUnacknowledged) {\r\n setTimeout(() => {\r\n setExpandedItem(nextUnacknowledged.id);\r\n }, 300);\r\n } else {\r\n // All done, collapse current\r\n setTimeout(() => setExpandedItem(''), 300);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n const toggleExpanded = (fieldId: string) => {\r\n setExpandedItem(prev => prev === fieldId ? '' : fieldId);\r\n };\r\n\r\n return (\r\n <Card className={cn('mb-4', className)}>\r\n <CardHeader className=\"pb-3\">\r\n <CardTitle className=\"text-base flex items-center gap-2\">\r\n <AlertCircle className=\"h-4 w-4 text-orange-600\" />\r\n Acknowledgements\r\n </CardTitle>\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n Review and acknowledge before signing\r\n </p>\r\n </CardHeader>\r\n <CardContent className=\"pt-0 px-0\">\r\n <div className=\"space-y-2 px-0\">\r\n {fieldsWithAcknowledgements.map((field) => {\r\n const progress = getProgress(field.id);\r\n const isFullyAcknowledged = progress.current === progress.total;\r\n const isPartiallyAcknowledged = progress.current > 0 && progress.current < progress.total;\r\n const isExpanded = expandedItem === field.id;\r\n\r\n let StatusIcon = AlertCircle;\r\n let statusColor = 'text-orange-600';\r\n let borderColor = 'border-orange-500';\r\n\r\n if (isFullyAcknowledged) {\r\n StatusIcon = CheckCircle2;\r\n statusColor = 'text-green-600';\r\n borderColor = 'border-green-500';\r\n } else if (isPartiallyAcknowledged) {\r\n StatusIcon = Clock;\r\n statusColor = 'text-blue-600';\r\n borderColor = 'border-blue-500';\r\n }\r\n\r\n return (\r\n <div\r\n key={field.id}\r\n className={cn('border rounded-lg', borderColor)}\r\n data-field-ack-id={field.id}\r\n >\r\n {/* Header/Trigger */}\r\n <button\r\n onClick={() => toggleExpanded(field.id)}\r\n className=\"w-full px-3 py-3 flex items-center gap-2 text-left hover:bg-muted/50 transition-colors\"\r\n type=\"button\"\r\n >\r\n <StatusIcon className={cn('h-4 w-4 flex-shrink-0', statusColor)} />\r\n <span className=\"flex-1 text-sm font-medium line-clamp-1\">\r\n {field.label || field.name}\r\n </span>\r\n <span className=\"text-xs text-muted-foreground bg-muted px-2 py-0.5 rounded-full flex-shrink-0\">\r\n {progress.current}/{progress.total}\r\n </span>\r\n <ChevronDown \r\n className={cn(\r\n 'h-4 w-4 flex-shrink-0 transition-transform duration-200',\r\n isExpanded && 'rotate-180'\r\n )} \r\n />\r\n </button>\r\n\r\n {/* Content */}\r\n {isExpanded && (\r\n <div className=\"px-3 pb-3 space-y-3 pt-2\">\r\n {field.acknowledgements!.map((ack, index) => {\r\n const checked = isAcknowledged(field.id, ack.id);\r\n return (\r\n <div\r\n key={ack.id}\r\n className={cn(\r\n 'p-3 border rounded-md transition-colors',\r\n checked\r\n ? 'border-green-500 bg-green-50 dark:bg-green-950/20'\r\n : 'border-border bg-background'\r\n )}\r\n >\r\n <div className=\"flex items-start gap-2\">\r\n <Checkbox\r\n id={`sidebar-ack-${field.id}-${ack.id}`}\r\n checked={checked}\r\n onCheckedChange={(isChecked) =>\r\n handleCheckboxChange(field.id, ack.id, isChecked === true)\r\n }\r\n className=\"mt-1\"\r\n />\r\n <div className=\"flex-1 min-w-0\">\r\n <Label\r\n htmlFor={`sidebar-ack-${field.id}-${ack.id}`}\r\n className=\"text-sm font-semibold cursor-pointer block\"\r\n >\r\n {index + 1}. {ack.title}\r\n </Label>\r\n {ack.description && (\r\n <p className=\"text-xs text-muted-foreground mt-1.5 whitespace-pre-wrap\">\r\n {ack.description}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </CardContent>\r\n </Card>\r\n );\r\n}\r\n","/**\r\n * Date Field Calendar Popup Component\r\n * \r\n * A calendar popup that appears near a PDF date field when clicked.\r\n * Uses portal rendering to position the calendar relative to the field position.\r\n */\r\n\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport { format } from 'date-fns';\r\nimport { createPortal } from 'react-dom';\r\nimport { Calendar } from '../lib/ui/calendar';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Card } from '../lib/ui/card';\r\nimport { parseAndValidateDate } from '../utils/date-validation';\r\n\r\nexport interface DateFieldPosition {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface DateFieldCalendarPopupProps {\r\n /** Whether the calendar is open */\r\n open: boolean;\r\n /** Callback when open state changes */\r\n onOpenChange: (open: boolean) => void;\r\n /** The current value of the date field (ISO string or other format) */\r\n value?: string;\r\n /** Callback when a date is selected */\r\n onSelect: (date: string) => void;\r\n /** Position of the field in the viewport */\r\n fieldPosition: DateFieldPosition | null;\r\n /** Field label for accessibility */\r\n fieldLabel?: string;\r\n}\r\n\r\n/**\r\n * Calculate the popup position based on field position and viewport constraints\r\n */\r\nfunction calculatePopupPosition(\r\n fieldPos: DateFieldPosition,\r\n popupWidth: number,\r\n popupHeight: number\r\n): { top: number; left: number } {\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n const gap = 8; // Gap between field and calendar\r\n const edgePadding = 16; // Padding from viewport edges\r\n\r\n // Field boundaries\r\n const fieldTop = fieldPos.y;\r\n const fieldBottom = fieldPos.y + fieldPos.height;\r\n const fieldLeft = fieldPos.x;\r\n const fieldRight = fieldPos.x + fieldPos.width;\r\n\r\n // Calculate available space below and above the field\r\n const spaceBelow = viewportHeight - fieldBottom - edgePadding;\r\n const spaceAbove = fieldTop - edgePadding;\r\n \r\n // Determine if we should position below or above based on available space\r\n const positionBelow = spaceBelow >= popupHeight || spaceBelow >= spaceAbove;\r\n \r\n let top: number;\r\n if (positionBelow) {\r\n // Position below the field\r\n top = fieldBottom + gap;\r\n \r\n // Ensure it doesn't go off the bottom\r\n if (top + popupHeight > viewportHeight - edgePadding) {\r\n // Not enough space below, try above\r\n const topAbove = fieldTop - popupHeight - gap;\r\n if (topAbove >= edgePadding) {\r\n // Fits above\r\n top = topAbove;\r\n } else {\r\n // Doesn't fit above either, position below but clamp to viewport\r\n top = Math.min(fieldBottom + gap, viewportHeight - edgePadding - popupHeight);\r\n top = Math.max(top, edgePadding);\r\n }\r\n }\r\n } else {\r\n // Position above the field\r\n top = fieldTop - popupHeight - gap;\r\n \r\n // Ensure it doesn't go off the top\r\n if (top < edgePadding) {\r\n // Not enough space above, position below instead\r\n top = fieldBottom + gap;\r\n // Clamp to viewport if needed\r\n if (top + popupHeight > viewportHeight - edgePadding) {\r\n top = Math.max(edgePadding, viewportHeight - edgePadding - popupHeight);\r\n }\r\n }\r\n }\r\n\r\n // Verify no overlap with field (safety check)\r\n if (top < fieldBottom && top + popupHeight > fieldTop) {\r\n // Overlapping detected! Force below\r\n top = fieldBottom + gap;\r\n if (top + popupHeight > viewportHeight - edgePadding) {\r\n // If still doesn't fit, force above\r\n top = fieldTop - popupHeight - gap;\r\n if (top < edgePadding) {\r\n // Last resort: position at top of viewport\r\n top = edgePadding;\r\n }\r\n }\r\n }\r\n\r\n // Horizontal positioning: align to the left of the field by default\r\n let left = fieldLeft;\r\n\r\n // If popup would go off the right edge, align to the right of the field\r\n if (left + popupWidth > viewportWidth - edgePadding) {\r\n left = fieldRight - popupWidth;\r\n }\r\n\r\n // If still off-screen, align with right viewport edge\r\n if (left + popupWidth > viewportWidth - edgePadding) {\r\n left = viewportWidth - edgePadding - popupWidth;\r\n }\r\n\r\n // If popup would go off the left edge\r\n if (left < edgePadding) {\r\n left = edgePadding;\r\n }\r\n\r\n return { top: Math.round(top), left: Math.round(left) };\r\n}\r\n\r\nexport function DateFieldCalendarPopup({\r\n open,\r\n onOpenChange,\r\n value,\r\n onSelect,\r\n fieldPosition,\r\n fieldLabel,\r\n}: DateFieldCalendarPopupProps) {\r\n const [date, setDate] = useState<Date | undefined>(undefined);\r\n const [position, setPosition] = useState<{ top: number; left: number }>({ top: 0, left: 0 });\r\n const popupRef = useRef<HTMLDivElement>(null);\r\n const frozenPositionRef = useRef<DateFieldPosition | null>(null); // Freeze position on opening\r\n const [mounted, setMounted] = useState(false);\r\n\r\n // Parse the current value\r\n useEffect(() => {\r\n if (value) {\r\n const validation = parseAndValidateDate(value);\r\n if (validation.isValid && validation.date) {\r\n setDate(validation.date);\r\n } else {\r\n setDate(undefined);\r\n }\r\n } else {\r\n setDate(undefined);\r\n }\r\n }, [value]);\r\n\r\n // Freeze field position when opening and calculate calendar position once\r\n useEffect(() => {\r\n if (open && fieldPosition) {\r\n // Freeze the position on opening (only if not already frozen)\r\n if (!frozenPositionRef.current) {\r\n frozenPositionRef.current = { ...fieldPosition };\r\n \r\n // Use requestAnimationFrame to ensure DOM is updated\r\n requestAnimationFrame(() => {\r\n if (popupRef.current && frozenPositionRef.current) {\r\n const popupRect = popupRef.current.getBoundingClientRect();\r\n const newPosition = calculatePopupPosition(\r\n frozenPositionRef.current,\r\n popupRect.width || 350, // Default width estimate\r\n popupRect.height || 400 // Default height estimate\r\n );\r\n setPosition(newPosition);\r\n }\r\n });\r\n }\r\n } else if (!open) {\r\n // Clear frozen position and reset position when closed\r\n frozenPositionRef.current = null;\r\n setPosition({ top: 0, left: 0 });\r\n }\r\n }, [open, fieldPosition]);\r\n\r\n // Apply position styles whenever position changes\r\n useEffect(() => {\r\n if (popupRef.current && (position.top !== 0 || position.left !== 0)) {\r\n // Use setProperty with !important to ensure position overrides any conflicting styles\r\n // This is necessary because animations/transforms can affect positioning\r\n popupRef.current.style.setProperty('top', `${position.top}px`, 'important');\r\n popupRef.current.style.setProperty('left', `${position.left}px`, 'important');\r\n popupRef.current.style.setProperty('position', 'fixed', 'important');\r\n popupRef.current.style.setProperty('transform', 'none', 'important');\r\n }\r\n }, [position]);\r\n\r\n // Handle click outside to close\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handleClickOutside = (event: MouseEvent) => {\r\n const target = event.target as Node;\r\n \r\n // Check if click is inside the calendar popup\r\n if (popupRef.current && popupRef.current.contains(target)) {\r\n return;\r\n }\r\n \r\n // Check if click is inside any Radix Select elements (dropdowns, items, triggers)\r\n // This prevents closing the calendar when interacting with month/year dropdowns\r\n const selectElement = (target as Element).closest?.(\r\n '[data-radix-select-content], [data-radix-select-item], [data-radix-select-trigger], [data-radix-select-viewport]'\r\n );\r\n if (selectElement) {\r\n return;\r\n }\r\n \r\n // Click is outside both the calendar and dropdowns, so close\r\n onOpenChange(false);\r\n };\r\n\r\n const handleEscape = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n onOpenChange(false);\r\n }\r\n };\r\n\r\n // Add listeners after a short delay to prevent immediate closing\r\n const timeoutId = setTimeout(() => {\r\n document.addEventListener('mousedown', handleClickOutside);\r\n document.addEventListener('keydown', handleEscape);\r\n }, 100);\r\n\r\n return () => {\r\n clearTimeout(timeoutId);\r\n document.removeEventListener('mousedown', handleClickOutside);\r\n document.removeEventListener('keydown', handleEscape);\r\n };\r\n }, [open, onOpenChange]);\r\n\r\n // Handle scroll to close calendar (industry best practice)\r\n useEffect(() => {\r\n if (!open) return;\r\n\r\n const handleScroll = () => {\r\n onOpenChange(false);\r\n };\r\n\r\n // Add listeners after a short delay to prevent immediate closing\r\n const timeoutId = setTimeout(() => {\r\n // Listen for scroll on main window\r\n window.addEventListener('scroll', handleScroll, { passive: true });\r\n \r\n // Listen for scroll inside the PDF iframe\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentWindow) {\r\n // Listen on the iframe's window\r\n iframe.contentWindow.addEventListener('scroll', handleScroll, { passive: true });\r\n \r\n // Also listen on the PDF.js viewer container (where the actual scrolling happens)\r\n const viewerContainer = iframe.contentDocument?.querySelector('#viewerContainer');\r\n if (viewerContainer) {\r\n viewerContainer.addEventListener('scroll', handleScroll, { passive: true });\r\n }\r\n }\r\n }, 100);\r\n\r\n return () => {\r\n clearTimeout(timeoutId);\r\n window.removeEventListener('scroll', handleScroll);\r\n \r\n // Clean up iframe scroll listeners\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentWindow) {\r\n iframe.contentWindow.removeEventListener('scroll', handleScroll);\r\n \r\n const viewerContainer = iframe.contentDocument?.querySelector('#viewerContainer');\r\n if (viewerContainer) {\r\n viewerContainer.removeEventListener('scroll', handleScroll);\r\n }\r\n }\r\n };\r\n }, [open, onOpenChange]);\r\n\r\n // Track mounted state for portal\r\n useEffect(() => {\r\n setMounted(true);\r\n return () => setMounted(false);\r\n }, []);\r\n\r\n const handleDateSelect = (selectedDate: Date | undefined) => {\r\n if (selectedDate) {\r\n setDate(selectedDate);\r\n // Convert to ISO date string (YYYY-MM-DD)\r\n const isoString = format(selectedDate, 'yyyy-MM-dd');\r\n onSelect(isoString);\r\n onOpenChange(false);\r\n }\r\n };\r\n\r\n const handleToday = () => {\r\n const today = new Date();\r\n handleDateSelect(today);\r\n };\r\n\r\n const handleClear = () => {\r\n setDate(undefined);\r\n onSelect('');\r\n onOpenChange(false);\r\n };\r\n\r\n const handleClose = () => {\r\n onOpenChange(false);\r\n };\r\n\r\n if (!open || !mounted || !fieldPosition) {\r\n return null;\r\n }\r\n\r\n // Check if position has been calculated (not at initial 0, 0)\r\n const hasValidPosition = position.top !== 0 || position.left !== 0;\r\n\r\n const content = (\r\n <div className=\"signiphi-pdf-signer\">\r\n <div\r\n ref={popupRef}\r\n className=\"signiphi-pdf-calendar-popup\"\r\n style={{\r\n visibility: hasValidPosition ? 'visible' : 'hidden', // Use visibility instead of opacity\r\n opacity: hasValidPosition ? 1 : 0, // Also keep opacity for smooth fade-in\r\n pointerEvents: hasValidPosition ? 'auto' : 'none', // Disable interaction until positioned\r\n }}\r\n role=\"dialog\"\r\n aria-label={fieldLabel ? `Select date for ${fieldLabel}` : 'Select date'}\r\n aria-modal=\"true\"\r\n >\r\n <Card className=\"p-0 shadow-lg border-2 border-border bg-popover rounded-lg\">\r\n <div className=\"p-3\">\r\n <Calendar\r\n mode=\"single\"\r\n selected={date}\r\n onSelect={handleDateSelect}\r\n initialFocus\r\n />\r\n </div>\r\n <div className=\"flex gap-2 p-3 border-t border-border\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={handleToday}\r\n className=\"flex-1\"\r\n >\r\n Today\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n onClick={handleClear}\r\n className=\"flex-1\"\r\n >\r\n Clear\r\n </Button>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n onClick={handleClose}\r\n className=\"flex-1\"\r\n >\r\n Cancel\r\n </Button>\r\n </div>\r\n </Card>\r\n </div>\r\n </div>\r\n );\r\n\r\n // Render into document body using portal\r\n return createPortal(content, document.body);\r\n}\r\n\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 { hasDrawableLabel } 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 removeWidget?: (index: number) => void;\r\n };\r\n}\r\n\r\n// Interface for PDF form (needed for robust removal)\r\ninterface PDFFormWithRemove {\r\n removeField(field: unknown): void;\r\n getFieldMaybe(name: string): unknown | undefined;\r\n}\r\n\r\n/**\r\n * Robustly removes a single form field by first removing all its widgets (visual annotations)\r\n * and then removing the field from the AcroForm.\r\n */\r\nfunction robustlyRemoveField(form: PDFFormWithRemove, field: unknown): boolean {\r\n try {\r\n // Phase 1: Remove all widgets (visual annotations) from the field\r\n const fieldWithAcro = field as PDFFieldWithExtensions;\r\n if (fieldWithAcro.acroField && typeof fieldWithAcro.acroField.getWidgets === 'function') {\r\n let widgets = fieldWithAcro.acroField.getWidgets() || [];\r\n\r\n // Remove widgets one by one from the end 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 fieldWithAcro.acroField.removeWidget?.(widgetIndex);\r\n widgets = fieldWithAcro.acroField.getWidgets() || [];\r\n } catch {\r\n break;\r\n }\r\n safetyCounter++;\r\n }\r\n }\r\n\r\n // Phase 2: Remove the field from AcroForm\r\n form.removeField(field);\r\n return true;\r\n } catch (error) {\r\n // Fallback: try simpler removal\r\n try {\r\n form.removeField(field);\r\n return true;\r\n } catch {\r\n return false;\r\n }\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 if (!hasDrawableLabel(field) && !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 if (isRadioField) {\r\n // Draw radio GROUP label (once per field, above first widget)\r\n if (hasDrawableLabel(field)) {\r\n const firstWidget = widgets[0];\r\n if (firstWidget) {\r\n const firstRect = firstWidget.getRectangle?.();\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) {\r\n const groupLabelKey = `${pageIndex}-${field.name}-grouplabel`;\r\n\r\n if (!drawnOnce.has(groupLabelKey)) {\r\n const radioLabelFontSize = Math.min(10, firstRect.height * 0.4);\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: radioLabelFontSize,\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 }\r\n\r\n // Draw radio OPTION labels (next to each radio button)\r\n // Same approach as flattening code in pdf-manipulation.ts\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\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\r\n const optionText = field.options[i];\r\n const optionKey = `${pageIndex}-${field.name}-opt-${i}`;\r\n\r\n if (optionText && !drawnOnce.has(optionKey)) {\r\n // Draw option label to the right of radio button\r\n // Size 7 to match flattening, positioned to align with radio circle center\r\n page.drawText(optionText, {\r\n x: rect.x + rect.width + 4,\r\n y: rect.y + (rect.height - 7) / 2,\r\n size: 7,\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 or fallback)\r\n if (hasDrawableLabel(field)) {\r\n const labelFontSize = Math.min(10, rect.height * 0.4);\r\n if (field.type === FormFieldType.CHECKBOX) {\r\n // Checkbox label to the right\r\n page.drawText(field.label, {\r\n x: rect.x + rect.width + 5,\r\n y: rect.y + (rect.height - labelFontSize) / 2,\r\n size: labelFontSize,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\r\n });\r\n } else {\r\n // Other field labels above the field\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: labelFontSize,\r\n font: labelFont,\r\n color: rgb(0, 0, 0),\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 // Use robust removal that cleans up widgets before removing field\r\n robustlyRemoveField(form as unknown as PDFFormWithRemove, 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, signerEmailForExtraction?: 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\r\n // Extract fields and filter BEFORE loading into viewer to prevent flash\r\n const fields = await extractVisibleFormFields(bytes, signerEmailForExtraction);\r\n setExtractedFields(fields);\r\n\r\n // Filter PDF for current signer (or just add labels for single-signer)\r\n const filteredBytes = await filterPdfForCurrentSigner(\r\n bytes,\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 setViewerPdfBytes(filteredBytes);\r\n\r\n // Load the filtered/labeled PDF into viewer (no flash!)\r\n const blobUrl = createPdfBlobUrl(filteredBytes);\r\n await viewerRef.current?.loadPdf(blobUrl);\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 }, [multiSignerContext]);\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 * Inject placeholders and radio labels into the PDF viewer\r\n * Field extraction and filtering is now done in loadPdf to prevent flash\r\n */\r\n const extractFormFields = useCallback(\r\n async (_currentSignerEmail?: string) => {\r\n // Fields are already extracted in loadPdf, just inject placeholders\r\n if (viewerRef.current && extractedFields.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(extractedFields);\r\n // Inject radio labels as HTML elements (aligned with PDF.js rendered widgets)\r\n viewerRef.current.injectRadioLabels(extractedFields);\r\n }\r\n\r\n return extractedFields;\r\n },\r\n [extractedFields]\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, useEffect, useRef } from 'react';\r\nimport type { FormField, ValidationError, FormFieldType } from '../types';\r\nimport { isValidISODate } from '../utils/date-validation-iso';\r\nimport { getFieldDisplayName } from '../utils/pdf-validators';\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\r\n // Seed field values from defaultValue when fields arrive or change.\r\n // Tracks which field IDs have been seeded so new fields get defaults\r\n // without overwriting user-edited values on existing fields.\r\n const seededFieldsRef = useRef<Set<string>>(new Set());\r\n useEffect(() => {\r\n if (fields.length === 0) return;\r\n const defaults: Record<string, string> = {};\r\n for (const field of fields) {\r\n if (\r\n field.defaultValue &&\r\n field.defaultValue.trim() &&\r\n !seededFieldsRef.current.has(field.id)\r\n ) {\r\n defaults[field.id] = field.defaultValue;\r\n seededFieldsRef.current.add(field.id);\r\n }\r\n }\r\n if (Object.keys(defaults).length > 0) {\r\n setFieldValues((prev) => ({ ...defaults, ...prev }));\r\n }\r\n }, [fields]);\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: `${getFieldDisplayName(field)} 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: `${getFieldDisplayName(field)} 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: `${getFieldDisplayName(field)} 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: `${getFieldDisplayName(field)} 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: `${getFieldDisplayName(field)} 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\nimport { getFieldDisplayName } from '../utils/pdf-validators';\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 // State for collected signatures (for auto-placement)\r\n const [collectedSignature, setCollectedSignature] = useState<string | null>(null);\r\n const [collectedInitials, setCollectedInitials] = useState<string | null>(null);\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(`${getFieldDisplayName(field)} 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 /**\r\n * Collect a signature or initials for auto-placement\r\n */\r\n const collectSignature = useCallback((type: 'signature' | 'initials', dataUrl: string) => {\r\n if (type === 'signature') {\r\n setCollectedSignature(dataUrl);\r\n } else {\r\n setCollectedInitials(dataUrl);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Check if we have a collected signature or initials\r\n */\r\n const hasCollectedSignature = useCallback((type: 'signature' | 'initials'): boolean => {\r\n return type === 'signature'\r\n ? collectedSignature !== null\r\n : collectedInitials !== null;\r\n }, [collectedSignature, collectedInitials]);\r\n\r\n /**\r\n * Get the collected signature or initials\r\n */\r\n const getCollectedSignature = useCallback((type: 'signature' | 'initials'): string | null => {\r\n return type === 'signature' ? collectedSignature : collectedInitials;\r\n }, [collectedSignature, collectedInitials]);\r\n\r\n /**\r\n * Clear collected signatures\r\n */\r\n const clearCollectedSignatures = useCallback(() => {\r\n setCollectedSignature(null);\r\n setCollectedInitials(null);\r\n }, []);\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 // Auto-place functionality\r\n collectSignature,\r\n hasCollectedSignature,\r\n getCollectedSignature,\r\n clearCollectedSignatures,\r\n };\r\n}\r\n\r\n","/**\n * Hook for filtering form fields by signer with multi-signer support\n * Implements Dockmaster's exact field visibility logic\n */\n\nimport { useMemo } from 'react';\nimport type { EsignFormField, MultiSignerContext } from '../types';\nimport { isFieldVisibleToSigner, filterFieldsBySigner } from '../utils/field-visibility';\n\n/**\n * Hook for filtering form fields based on multi-signer context\n * \n * @param allFields - All form fields extracted from the PDF\n * @param multiSignerContext - Multi-signer context (from useMultiSignerContext)\n * @returns Filtered fields and utility functions\n * \n * @example\n * ```tsx\n * const context = useMultiSignerContext(currentSigner, isMultipleSignature, totalSigners);\n * const { filteredFields } = useFieldFiltering(allFields, context);\n * ```\n */\nexport function useFieldFiltering(\n allFields: EsignFormField[],\n multiSignerContext: MultiSignerContext\n) {\n /**\n * Filtered fields based on Dockmaster's multi-signer visibility logic\n */\n const filteredFields = useMemo(() => {\n // First, hide non-main signature/initials fields from UI\n // EXCEPTION: Keep ALL signature/initials fields (they need visual indicators even without acknowledgements)\n let fields = allFields.filter((field) => {\n // Keep signature_field_main and initials_field_main\n if (field.id === 'signature_field_main' || field.id === 'initials_field_main') {\n return true;\n }\n\n // Keep ALL signature/initials fields (for acknowledgements AND visual indicators)\n // Previously we only kept fields with acknowledgements, but fields without acknowledgements\n // also need to be tracked so they can show visual indicators when signed\n if (field.type === 'signature' || field.type === 'initials') {\n return true;\n }\n\n return true;\n });\n\n // Apply multi-signer filtering using centralized visibility logic\n return filterFieldsBySigner(fields, multiSignerContext);\n }, [allFields, multiSignerContext]);\n\n /**\n * Required fields from filtered set\n */\n const requiredFields = useMemo(() => {\n return filteredFields.filter((field) => field.required);\n }, [filteredFields]);\n\n /**\n * Optional fields from filtered set\n */\n const optionalFields = useMemo(() => {\n return filteredFields.filter((field) => !field.required);\n }, [filteredFields]);\n\n /**\n * Check if a field is visible to current signer\n * Uses the same logic as filteredFields for consistency\n */\n const isFieldVisible = (field: EsignFormField): boolean => {\n return isFieldVisibleToSigner(field, multiSignerContext);\n };\n\n return {\n // Filtered fields\n filteredFields,\n requiredFields,\n optionalFields,\n \n // Utilities\n isFieldVisible,\n \n // Counts\n totalFields: allFields.length,\n filteredCount: filteredFields.length,\n requiredCount: requiredFields.length,\n optionalCount: optionalFields.length,\n };\n}\n\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 for duplicate file name\r\n const isDuplicate = [...attachments, ...newAttachments].some(\r\n (att) => att.name.toLowerCase() === file.name.toLowerCase()\r\n );\r\n if (isDuplicate) {\r\n errors.push(`\"${file.name}\" is already attached`);\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 * Clear validation errors only\r\n */\r\n const clearValidationErrors = useCallback(() => {\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 clearValidationErrors,\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, useCallback, useRef, useEffect } from 'react';\r\nimport type { EsignFormField, Acknowledgement } from '../types';\r\n\r\ninterface AcknowledgementProgress {\r\n current: number;\r\n total: number;\r\n}\r\n\r\ninterface UnacknowledgedFieldDetail {\r\n field: EsignFormField;\r\n unacknowledgedItems: Acknowledgement[];\r\n}\r\n\r\ninterface UseAcknowledgementsReturn {\r\n acknowledgeItem: (fieldId: string, ackId: string) => void;\r\n isAcknowledged: (fieldId: string, ackId?: string) => boolean;\r\n isFieldFullyAcknowledged: (fieldId: string) => boolean;\r\n getFieldAcknowledgementProgress: (fieldId: string) => AcknowledgementProgress;\r\n acknowledgeAllForField: (fieldId: string) => void;\r\n getFieldsWithAcknowledgements: (fields: EsignFormField[]) => EsignFormField[];\r\n hasUnacknowledgedFields: (fields: EsignFormField[]) => boolean;\r\n getUnacknowledgedFields: (fields: EsignFormField[]) => EsignFormField[];\r\n getUnacknowledgedFieldsDetailed: (fields: EsignFormField[]) => UnacknowledgedFieldDetail[];\r\n resetAcknowledgements: () => void;\r\n}\r\n\r\n/**\r\n * Hook for managing acknowledgement state across form fields\r\n * \r\n * Tracks which acknowledgements have been accepted by the signer.\r\n * Acknowledgements are field-level requirements that must be explicitly\r\n * accepted before the field can be interacted with or submitted.\r\n * \r\n * State is stored in memory and resets on component unmount/page refresh.\r\n * \r\n * @param fields - Array of form fields that may contain acknowledgements\r\n * @returns Object with acknowledgement state management functions\r\n * \r\n * @example\r\n * ```tsx\r\n * const {\r\n * acknowledgeItem,\r\n * isFieldFullyAcknowledged,\r\n * hasUnacknowledgedFields\r\n * } = useAcknowledgements(fields);\r\n * \r\n * // Check if field can be submitted\r\n * if (hasUnacknowledgedFields(fields)) {\r\n * // Show acknowledgement modal\r\n * }\r\n * ```\r\n */\r\nexport function useAcknowledgements(\r\n fields: EsignFormField[]\r\n): UseAcknowledgementsReturn {\r\n // Map of fieldId -> Set of acknowledged acknowledgement IDs\r\n const [acknowledgedMap, setAcknowledgedMap] = useState<Map<string, Set<string>>>(\r\n new Map()\r\n );\r\n\r\n // Keep a ref to always have access to the latest acknowledgedMap\r\n // This allows isFieldFullyAcknowledged to read fresh state even in stale closures\r\n const acknowledgedMapRef = useRef(acknowledgedMap);\r\n useEffect(() => {\r\n acknowledgedMapRef.current = acknowledgedMap;\r\n }, [acknowledgedMap]);\r\n\r\n // Get all fields that have acknowledgements\r\n const getFieldsWithAcknowledgements = useCallback((fieldsToFilter: EsignFormField[]) => {\r\n return fieldsToFilter.filter(\r\n field => field.acknowledgements && field.acknowledgements.length > 0\r\n );\r\n }, []);\r\n\r\n // Acknowledge a specific acknowledgement item for a field\r\n const acknowledgeItem = useCallback((fieldId: string, ackId: string) => {\r\n setAcknowledgedMap(prev => {\r\n const newMap = new Map(prev);\r\n const fieldAcks = newMap.get(fieldId) || new Set<string>();\r\n fieldAcks.add(ackId);\r\n newMap.set(fieldId, fieldAcks);\r\n\r\n // Directly update the ref so isFieldFullyAcknowledged sees the change immediately\r\n // (useEffect that syncs the ref won't run until after render)\r\n acknowledgedMapRef.current = newMap;\r\n\r\n return newMap;\r\n });\r\n }, []);\r\n\r\n // Check if a specific acknowledgement or all acknowledgements are acknowledged\r\n // Uses acknowledgedMapRef to always read fresh state, even when called from stale closures\r\n const isAcknowledged = useCallback((fieldId: string, ackId?: string) => {\r\n // Use ref to get the latest state\r\n const fieldAcks = acknowledgedMapRef.current.get(fieldId);\r\n if (!fieldAcks) return false;\r\n\r\n if (ackId) {\r\n return fieldAcks.has(ackId);\r\n }\r\n\r\n // If no ackId provided, check if any are acknowledged\r\n return fieldAcks.size > 0;\r\n }, []);\r\n\r\n // Check if all acknowledgements for a field are acknowledged\r\n // Uses acknowledgedMapRef to always read fresh state, even when called from stale closures\r\n const isFieldFullyAcknowledged = useCallback((fieldId: string) => {\r\n const field = fields.find(f => f.id === fieldId);\r\n if (!field || !field.acknowledgements || field.acknowledgements.length === 0) {\r\n return true; // No acknowledgements means fully acknowledged\r\n }\r\n\r\n // Use ref to get the latest state, not the captured closure value\r\n const fieldAcks = acknowledgedMapRef.current.get(fieldId);\r\n if (!fieldAcks) return false;\r\n\r\n return field.acknowledgements.every(ack => fieldAcks.has(ack.id));\r\n }, [fields]);\r\n\r\n // Get acknowledgement progress for a field\r\n const getFieldAcknowledgementProgress = useCallback((fieldId: string): AcknowledgementProgress => {\r\n const field = fields.find(f => f.id === fieldId);\r\n if (!field || !field.acknowledgements || field.acknowledgements.length === 0) {\r\n return { current: 0, total: 0 };\r\n }\r\n\r\n const fieldAcks = acknowledgedMap.get(fieldId) || new Set<string>();\r\n return {\r\n current: fieldAcks.size,\r\n total: field.acknowledgements.length\r\n };\r\n }, [fields, acknowledgedMap]);\r\n\r\n // Acknowledge all acknowledgements for a field\r\n const acknowledgeAllForField = useCallback((fieldId: string) => {\r\n const field = fields.find(f => f.id === fieldId);\r\n if (!field || !field.acknowledgements) return;\r\n\r\n setAcknowledgedMap(prev => {\r\n const newMap = new Map(prev);\r\n const allAckIds = new Set(field.acknowledgements!.map(ack => ack.id));\r\n newMap.set(fieldId, allAckIds);\r\n return newMap;\r\n });\r\n }, [fields]);\r\n\r\n // Check if there are any unacknowledged fields\r\n const hasUnacknowledgedFields = useCallback((fieldsToCheck: EsignFormField[]) => {\r\n const fieldsWithAcks = getFieldsWithAcknowledgements(fieldsToCheck);\r\n return fieldsWithAcks.some(field => !isFieldFullyAcknowledged(field.id));\r\n }, [getFieldsWithAcknowledgements, isFieldFullyAcknowledged]);\r\n\r\n // Get list of fields that have unacknowledged items\r\n const getUnacknowledgedFields = useCallback((fieldsToCheck: EsignFormField[]) => {\r\n const fieldsWithAcks = getFieldsWithAcknowledgements(fieldsToCheck);\r\n return fieldsWithAcks.filter(field => !isFieldFullyAcknowledged(field.id));\r\n }, [getFieldsWithAcknowledgements, isFieldFullyAcknowledged]);\r\n\r\n // Get detailed information about fields with unacknowledged items\r\n const getUnacknowledgedFieldsDetailed = useCallback((fieldsToCheck: EsignFormField[]) => {\r\n return fieldsToCheck\r\n .filter(field => field.acknowledgements && field.acknowledgements.length > 0)\r\n .map(field => ({\r\n field,\r\n unacknowledgedItems: field.acknowledgements!.filter(\r\n ack => !isAcknowledged(field.id, ack.id)\r\n )\r\n }))\r\n .filter(({ unacknowledgedItems }) => unacknowledgedItems.length > 0);\r\n }, [isAcknowledged]);\r\n\r\n // Reset all acknowledgements (for testing or form reset)\r\n const resetAcknowledgements = useCallback(() => {\r\n setAcknowledgedMap(new Map());\r\n }, []);\r\n\r\n return {\r\n acknowledgeItem,\r\n isAcknowledged,\r\n isFieldFullyAcknowledged,\r\n getFieldAcknowledgementProgress,\r\n acknowledgeAllForField,\r\n getFieldsWithAcknowledgements,\r\n hasUnacknowledgedFields,\r\n getUnacknowledgedFields,\r\n getUnacknowledgedFieldsDetailed,\r\n resetAcknowledgements,\r\n };\r\n}\r\n\r\n","import { useState, useCallback, useMemo } from 'react';\r\nimport type { EsignFormField } from '../types';\r\n\r\nexport interface UseRequiredFieldNavigationReturn {\r\n requiredFields: EsignFormField[];\r\n hasRequiredFields: boolean;\r\n currentRequiredField: EsignFormField | null;\r\n currentRequiredIndex: number;\r\n goToNextRequired: () => EsignFormField | null;\r\n goToPreviousRequired: () => EsignFormField | null;\r\n requiredFieldCount: number;\r\n}\r\n\r\n/**\r\n * Hook for navigating through required fields only\r\n * Provides next/previous navigation that cycles through required fields\r\n */\r\nexport function useRequiredFieldNavigation(\r\n fields: EsignFormField[]\r\n): UseRequiredFieldNavigationReturn {\r\n // Start at -1 to represent \"no field selected yet\"\r\n // First click on next/previous will go to first/last field respectively\r\n const [currentRequiredIndex, setCurrentRequiredIndex] = useState(-1);\r\n\r\n // Get only required fields (excluding sidebar-only fields)\r\n const requiredFields = useMemo(() => {\r\n return fields.filter(f => {\r\n // Exclude sidebar-only signature/initials fields\r\n if (f.id === 'signature_field_main' || f.id === 'initials_field_main') {\r\n return false;\r\n }\r\n return f.required;\r\n });\r\n }, [fields]);\r\n\r\n const hasRequiredFields = requiredFields.length > 0;\r\n\r\n // Navigate to next required field\r\n const goToNextRequired = useCallback((): EsignFormField | null => {\r\n if (!hasRequiredFields) return null;\r\n\r\n // If at -1 (initial state), go to 0 (first field)\r\n // Otherwise, cycle through normally\r\n const nextIndex = currentRequiredIndex === -1\r\n ? 0\r\n : (currentRequiredIndex + 1) % requiredFields.length;\r\n setCurrentRequiredIndex(nextIndex);\r\n return requiredFields[nextIndex] || null;\r\n }, [currentRequiredIndex, requiredFields, hasRequiredFields]);\r\n\r\n // Navigate to previous required field\r\n const goToPreviousRequired = useCallback((): EsignFormField | null => {\r\n if (!hasRequiredFields) return null;\r\n\r\n // If at -1 (initial state), go to last field\r\n // If at 0 (first field), go to last field (wrap around)\r\n // Otherwise, go to previous field\r\n const prevIndex = currentRequiredIndex <= 0\r\n ? requiredFields.length - 1\r\n : currentRequiredIndex - 1;\r\n setCurrentRequiredIndex(prevIndex);\r\n return requiredFields[prevIndex] || null;\r\n }, [currentRequiredIndex, requiredFields, hasRequiredFields]);\r\n\r\n // Get current required field\r\n const currentRequiredField = useMemo(() => {\r\n if (!hasRequiredFields || currentRequiredIndex < 0) return null;\r\n return requiredFields[currentRequiredIndex] || null;\r\n }, [requiredFields, currentRequiredIndex, hasRequiredFields]);\r\n\r\n return {\r\n requiredFields,\r\n hasRequiredFields,\r\n currentRequiredField,\r\n currentRequiredIndex,\r\n goToNextRequired,\r\n goToPreviousRequired,\r\n requiredFieldCount: requiredFields.length\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 { InitialsModal } from './InitialsModal';\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 { AcknowledgementModal } from './AcknowledgementModal';\r\nimport { UnacknowledgedFieldsModal } from './UnacknowledgedFieldsModal';\r\nimport { AcknowledgementsSidebar } from './AcknowledgementsSidebar';\r\nimport { DateFieldCalendarPopup, type DateFieldPosition } from './DateFieldCalendarPopup';\r\nimport type { ViewMode } from './ViewToggleToolbar';\r\nimport { usePdfViewer, useFormFields, useSignatures, useFieldFiltering, useAttachments, useMultiSignerContext, useAcknowledgements } from '../hooks';\r\nimport { useRequiredFieldNavigation } from '../hooks/useRequiredFieldNavigation';\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, resolveField, getFieldDisplayName } 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 touched,\r\n clearFields,\r\n } = useFormFields(extractedFields);\r\n\r\n // Signature state\r\n const {\r\n signatures,\r\n setSignature: setSignatureOriginal,\r\n validateSignatures,\r\n hasSignature,\r\n collectSignature,\r\n hasCollectedSignature,\r\n getCollectedSignature,\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 const touchedRef = useRef(touched);\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 useEffect(() => {\r\n touchedRef.current = touched;\r\n }, [touched]);\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 // Acknowledgement state (must come after filteredFields is defined)\r\n const {\r\n acknowledgeItem: acknowledgeItemOriginal,\r\n isAcknowledged,\r\n isFieldFullyAcknowledged,\r\n getFieldAcknowledgementProgress,\r\n hasUnacknowledgedFields,\r\n getUnacknowledgedFields,\r\n getUnacknowledgedFieldsDetailed,\r\n } = useAcknowledgements(filteredFields);\r\n\r\n // Required field navigation (must come after filteredFields is defined)\r\n const {\r\n hasRequiredFields,\r\n currentRequiredIndex,\r\n goToNextRequired,\r\n goToPreviousRequired,\r\n requiredFieldCount,\r\n } = useRequiredFieldNavigation(filteredFields);\r\n\r\n // Acknowledgement modal state\r\n const [acknowledgementModalOpen, setAcknowledgementModalOpen] = useState(false);\r\n const [currentAcknowledgementField, setCurrentAcknowledgementField] = useState<EsignFormField | null>(null);\r\n const [currentAcknowledgementFieldName, setCurrentAcknowledgementFieldName] = useState<string | null>(null);\r\n const currentAcknowledgementElementRef = useRef<HTMLElement | null>(null);\r\n const acknowledgementTriggerSourceRef = useRef<'pdf-click' | 'navigation' | null>(null);\r\n const acknowledgementCleanupTimeoutRef = useRef<NodeJS.Timeout | null>(null);\r\n const [unacknowledgedModalOpen, setUnacknowledgedModalOpen] = useState(false);\r\n \r\n // Track recently acknowledged fields to prevent race condition\r\n const recentlyAcknowledgedFieldsRef = useRef<Map<string, number>>(new Map());\r\n\r\n // Date calendar popup state\r\n const [dateCalendarOpen, setDateCalendarOpen] = useState(false);\r\n const [currentDateField, setCurrentDateField] = useState<EsignFormField | null>(null);\r\n const [dateFieldPosition, setDateFieldPosition] = useState<{ x: number; y: number; width: number; height: number } | null>(null);\r\n\r\n // Helper to get PDF field names that should show indicators\r\n // Memoized to avoid expensive filtering on every render\r\n // Returns comma-separated list of fieldIds (UUIDs) for fields that can show indicators\r\n const realPdfFieldsByType = useMemo(() => {\r\n return {\r\n signature: filteredFields.filter(f => \r\n f.type === 'signature' && \r\n f.id !== 'signature_field_main'\r\n ),\r\n initials: filteredFields.filter(f => \r\n f.type === 'initials' && \r\n f.id !== 'initials_field_main'\r\n )\r\n };\r\n }, [filteredFields]);\r\n\r\n // Check if document has initials fields (for dynamic messaging)\r\n const hasInitialsFields = useMemo(() => {\r\n return filteredFields.some(f => f.id === 'initials_field_main' || f.type === 'initials');\r\n }, [filteredFields]);\r\n\r\n // Default signing instruction message (adjusts based on whether initials are present)\r\n const defaultSigningMessage = useMemo(() => {\r\n if (hasInitialsFields) {\r\n return 'Fill out the form fields directly in the PDF document. Your signature and initials below will be applied to the document automatically.';\r\n }\r\n return 'Fill out the form fields directly in the PDF document. Your signature below will be applied to the document automatically.';\r\n }, [hasInitialsFields]);\r\n\r\n const getPdfFieldNamesForIndicators = useCallback((fieldType: 'signature' | 'initials'): string => {\r\n // Get all REAL PDF fields (not the synthetic _main fields) - pre-filtered\r\n const realPdfFields = realPdfFieldsByType[fieldType];\r\n\r\n console.log(`[SubmissionForm] Total filteredFields count:`, filteredFields.length);\r\n console.log(`[SubmissionForm] All ${fieldType} in filteredFields (including _main):`, filteredFields.filter(f =>\r\n f.type === fieldType || f.id.toLowerCase().includes(fieldType)\r\n ).map(f => ({\r\n id: f.id,\r\n fieldId: f.fieldId,\r\n hasAcks: !!f.acknowledgements?.length,\r\n })));\r\n\r\n console.log(`[SubmissionForm] Real PDF ${fieldType} fields (excluding _main):`, realPdfFields.map(f => ({\r\n id: f.id,\r\n fieldId: f.fieldId,\r\n name: f.name,\r\n hasAcks: !!f.acknowledgements?.length,\r\n ackCount: f.acknowledgements?.length || 0\r\n })));\r\n\r\n // Filter to only fields that can show indicators\r\n const fieldsToIndicate = realPdfFields.filter(field => {\r\n if (!field.acknowledgements || field.acknowledgements.length === 0) {\r\n console.log(`[SubmissionForm] Field ${field.id} has NO acks - CAN show indicator`);\r\n return true; // No acks - can show\r\n }\r\n const isFullyAcked = isFieldFullyAcknowledged(field.id);\r\n console.log(`[SubmissionForm] Field ${field.id} has acks - fully acknowledged? ${isFullyAcked}`);\r\n return isFullyAcked; // Has acks - can show if fully acked\r\n });\r\n\r\n // Return comma-separated fieldIds (UUIDs) from PDF metadata\r\n const result = fieldsToIndicate.map(f => f.fieldId).join(',');\r\n console.log(`[SubmissionForm] Allowed fieldIds (UUIDs) for ${fieldType} indicators:`, result);\r\n console.log(`[SubmissionForm] Fields that will show indicators:`, fieldsToIndicate.map(f => ({\r\n id: f.id,\r\n fieldId: f.fieldId,\r\n name: f.name\r\n })));\r\n\r\n return result;\r\n }, [realPdfFieldsByType, filteredFields, isFieldFullyAcknowledged]);\r\n\r\n // Helper to refresh indicators for a given field type\r\n // Track pending indicator updates to prevent blinking\r\n const indicatorUpdateTimers = useRef<Map<string, NodeJS.Timeout>>(new Map());\r\n\r\n // Cleanup on unmount: clear all timeouts to prevent memory leaks\r\n useEffect(() => {\r\n return () => {\r\n // Clear acknowledgement cleanup timeout\r\n if (acknowledgementCleanupTimeoutRef.current) {\r\n clearTimeout(acknowledgementCleanupTimeoutRef.current);\r\n }\r\n // Clear indicator update timers\r\n indicatorUpdateTimers.current.forEach(timer => clearTimeout(timer));\r\n indicatorUpdateTimers.current.clear();\r\n };\r\n }, []);\r\n\r\n // Unified function to add/update indicator for any field type\r\n /**\r\n * Update field indicator based on acknowledgement status and field value\r\n *\r\n * Field Indicator System - Three-state visual feedback:\r\n * - 'info' (gray 'i'): Field has acknowledgements but is unfilled\r\n * - 'pending-ack' (amber '!'): Field is filled but needs acknowledgement\r\n * - 'completed' (green '✓'): Field is filled AND fully acknowledged\r\n *\r\n * Indicators only appear for fields with acknowledgements.\r\n * Updates are executed immediately to ensure fresh state is always used.\r\n *\r\n * @param fieldId - The ID of the field to update indicator for\r\n */\r\n const updateFieldIndicator = useCallback((fieldId: string) => {\r\n // Clear any pending update for this field\r\n const existingTimer = indicatorUpdateTimers.current.get(fieldId);\r\n if (existingTimer) {\r\n clearTimeout(existingTimer);\r\n }\r\n\r\n // Debounce the update to allow React state to settle\r\n const timer = setTimeout(() => {\r\n const field = filteredFields.find(f => f.id === fieldId);\r\n if (!field || !viewerRef.current?.addFieldIndicator) {\r\n return;\r\n }\r\n\r\n // Special handling for signature_field_main and initials_field_main:\r\n // These are synthetic sidebar fields that collect signatures/initials\r\n // But acknowledgements are on the REAL PDF fields (signature_1767..., initials_1767...)\r\n // So we need to check if ANY real PDF field of this type has acknowledgements\r\n if (fieldId === 'signature_field_main' || fieldId === 'initials_field_main') {\r\n const fieldType = field.type; // 'signature' or 'initials'\r\n \r\n // Find all real PDF fields of this type (not the _main synthetic field)\r\n const realPdfFields = filteredFields.filter(f => \r\n f.type === fieldType && \r\n f.id !== fieldId && \r\n f.id !== 'signature_field_main' && \r\n f.id !== 'initials_field_main'\r\n );\r\n \r\n // Check if ANY of the real PDF fields have acknowledgements\r\n const anyFieldHasAcks = realPdfFields.some(f => f.acknowledgements && f.acknowledgements.length > 0);\r\n \r\n if (!anyFieldHasAcks) {\r\n // No real PDF fields have acknowledgements - no indicator needed\r\n viewerRef.current?.removeFieldIndicator(field.name);\r\n logger.info(`[FIELD INDICATOR] No acks on any real PDF ${fieldType} fields for ${field.id}, removing indicator`, {\r\n fieldName: field.name,\r\n hasValue: true,\r\n realFieldsCount: realPdfFields.length\r\n });\r\n indicatorUpdateTimers.current.delete(fieldId);\r\n return;\r\n }\r\n \r\n // At least one real PDF field has acknowledgements\r\n // Check if ALL fields with acknowledgements are fully acknowledged\r\n const allAcknowledged = realPdfFields\r\n .filter(f => f.acknowledgements && f.acknowledgements.length > 0)\r\n .every(f => isFieldFullyAcknowledged(f.id));\r\n \r\n const indicatorType = allAcknowledged ? 'completed' : 'pending-ack';\r\n const allowedFieldIds = getPdfFieldNamesForIndicators(fieldType === 'signature' ? 'signature' : 'initials');\r\n \r\n try {\r\n viewerRef.current?.addFieldIndicator(field.name, indicatorType, allowedFieldIds);\r\n logger.info(`[FIELD INDICATOR] Added ${indicatorType} indicator for field: ${field.id} (checked real PDF fields)`, {\r\n fieldName: field.name,\r\n hasValue: true,\r\n realFieldsCount: realPdfFields.length,\r\n anyFieldHasAcks,\r\n allAcknowledged\r\n });\r\n } catch (error) {\r\n logger.error(`[FIELD INDICATOR] Failed to add ${indicatorType} indicator for ${field.id}:`, error);\r\n }\r\n \r\n indicatorUpdateTimers.current.delete(fieldId);\r\n return;\r\n }\r\n\r\n // For regular fields (non-synthetic), use the standard logic\r\n // Determine if field has a value\r\n // Special case: For signature/initials fields (not _main), check if signature_field_main has a value\r\n // because signatures/initials are collected once in the sidebar and applied to all fields\r\n let hasValue: boolean;\r\n if (field.type === 'signature' && fieldId !== 'signature_field_main') {\r\n // Real PDF signature field - check if signature_field_main has a signature\r\n hasValue = !!signaturesRef.current['signature_field_main'];\r\n } else if (field.type === 'initials' && fieldId !== 'initials_field_main') {\r\n // Real PDF initials field - check if initials_field_main has a value\r\n hasValue = !!(fieldValuesRef.current['initials_field_main'] && String(fieldValuesRef.current['initials_field_main']).trim() !== '');\r\n } else {\r\n // Regular field or _main field - check its own value\r\n hasValue = field.type === 'signature'\r\n ? !!signaturesRef.current[field.id]\r\n : !!(fieldValuesRef.current[field.id] && String(fieldValuesRef.current[field.id]).trim() !== '');\r\n }\r\n\r\n // HYBRID APPROACH: Show different indicators based on state\r\n const hasAcknowledgements = field.acknowledgements && field.acknowledgements.length > 0;\r\n \r\n if (!hasValue && !hasAcknowledgements) {\r\n // No value, no acknowledgements - no indicator needed\r\n viewerRef.current?.removeFieldIndicator(field.name);\r\n logger.info(`[FIELD INDICATOR] No value or acks for ${field.id}, removing indicator`);\r\n indicatorUpdateTimers.current.delete(fieldId);\r\n return;\r\n }\r\n \r\n if (!hasValue && hasAcknowledgements) {\r\n // No value BUT has acknowledgements - show subtle info indicator\r\n // For signature_field_main and initials_field_main, get the allowed PDF field IDs\r\n let allowedFieldIds: string | undefined = undefined;\r\n if (fieldId === 'signature_field_main' || fieldId === 'initials_field_main') {\r\n const fieldType = fieldId === 'signature_field_main' ? 'signature' : 'initials';\r\n allowedFieldIds = getPdfFieldNamesForIndicators(fieldType);\r\n }\r\n \r\n try {\r\n viewerRef.current?.addFieldIndicator(field.name, 'info', allowedFieldIds);\r\n logger.info(`[FIELD INDICATOR] Added info indicator (unfilled + has acks): ${field.id}`, {\r\n fieldName: field.name,\r\n ackCount: field.acknowledgements?.length\r\n });\r\n } catch (error) {\r\n logger.error(`[FIELD INDICATOR] Failed to add info indicator for ${field.id}:`, error);\r\n }\r\n \r\n indicatorUpdateTimers.current.delete(fieldId);\r\n return;\r\n }\r\n\r\n // Field has value - only show indicator if it has acknowledgements\r\n if (!hasAcknowledgements) {\r\n // Has value but NO acknowledgements - no indicator needed\r\n viewerRef.current?.removeFieldIndicator(field.name);\r\n logger.info(`[FIELD INDICATOR] Field has value but no acks for ${field.id}, removing indicator`);\r\n indicatorUpdateTimers.current.delete(fieldId);\r\n return;\r\n }\r\n \r\n // Field has value AND acknowledgements - determine indicator type\r\n const isAcknowledged = isFieldFullyAcknowledged(field.id);\r\n const indicatorType = isAcknowledged ? 'completed' : 'pending-ack';\r\n\r\n // For signature_field_main and initials_field_main, get the allowed PDF field IDs\r\n let allowedFieldIds: string | undefined = undefined;\r\n if (fieldId === 'signature_field_main' || fieldId === 'initials_field_main') {\r\n const fieldType = fieldId === 'signature_field_main' ? 'signature' : 'initials';\r\n allowedFieldIds = getPdfFieldNamesForIndicators(fieldType);\r\n }\r\n\r\n // Add/update indicator with error handling\r\n try {\r\n viewerRef.current?.addFieldIndicator(field.name, indicatorType, allowedFieldIds);\r\n logger.info(`[FIELD INDICATOR] Added ${indicatorType} indicator for field: ${field.id}`, {\r\n fieldName: field.name,\r\n hasValue,\r\n hasAcks: true,\r\n isAcknowledged\r\n });\r\n } catch (error) {\r\n logger.error(`[FIELD INDICATOR] Failed to add ${indicatorType} indicator for ${field.id}:`, error);\r\n }\r\n \r\n }, 50); // Small debounce to let React state settle\r\n\r\n indicatorUpdateTimers.current.set(fieldId, timer);\r\n }, [filteredFields, isFieldFullyAcknowledged, viewerRef, getPdfFieldNamesForIndicators]);\r\n // Note: fieldValuesRef and signaturesRef are used inside but not in deps (they're refs, always stable)\r\n\r\n // Keep a ref to the latest updateFieldIndicator to avoid stale closures in callbacks\r\n const updateFieldIndicatorRef = useRef(updateFieldIndicator);\r\n useEffect(() => {\r\n updateFieldIndicatorRef.current = updateFieldIndicator;\r\n }, [updateFieldIndicator]);\r\n\r\n // Wrapper for acknowledgeItem that refreshes indicators after acknowledgement\r\n const acknowledgeItem = useCallback((fieldId: string, ackId: string) => {\r\n acknowledgeItemOriginal(fieldId, ackId);\r\n // Refs are updated immediately in acknowledgeItemOriginal, so we can update indicator now\r\n // This handles the case where field already has a value when acknowledged\r\n updateFieldIndicatorRef.current(fieldId);\r\n }, [acknowledgeItemOriginal]);\r\n\r\n // Wrapper for setSignature that also updates visual indicator\r\n const setSignature = useCallback((fieldId: string, dataUrl: string) => {\r\n // Set the signature data\r\n setSignatureOriginal(fieldId, dataUrl);\r\n\r\n // Directly update the ref so indicator check sees the new value immediately\r\n // (useEffect that syncs signaturesRef won't run until after render)\r\n signaturesRef.current = {\r\n ...signaturesRef.current,\r\n [fieldId]: dataUrl,\r\n };\r\n\r\n // Update indicator using ref to get latest function with fresh closures\r\n updateFieldIndicatorRef.current(fieldId);\r\n\r\n // Preview on the PDF viewer — initials are plain text, signatures are data URLs\r\n if (dataUrl.startsWith('data:')) {\r\n viewerRef.current?.previewSignature(fieldId, dataUrl);\r\n } else {\r\n viewerRef.current?.previewInitials(fieldId, dataUrl);\r\n }\r\n }, [setSignatureOriginal]);\r\n\r\n // Attachments\r\n const {\r\n attachments,\r\n isUploading: isUploadingAttachments,\r\n validationErrors: attachmentErrors,\r\n constraints: attachmentConstraints,\r\n addFiles,\r\n removeAttachment,\r\n clearValidationErrors: clearAttachmentErrors,\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 - SEPARATE modals for signature and initials\r\n const [signatureModalOpen, setSignatureModalOpen] = useState(false);\r\n const [currentSignatureField, setCurrentSignatureField] = useState<EsignFormField | null>(null);\r\n const [initialsModalOpen, setInitialsModalOpen] = useState(false);\r\n const [currentInitialsField, setCurrentInitialsField] = useState<EsignFormField | null>(null);\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 (extraction and filtering happens inside loadPdf to prevent flash)\r\n useEffect(() => {\r\n if (pdfUrl) {\r\n // Pass signer email for field extraction/filtering in multi-signer mode\r\n const signerEmailForExtraction = multiSignerContext.isMultiSigner ? effectiveSignerEmail : undefined;\r\n loadPdf(pdfUrl, signerEmailForExtraction);\r\n }\r\n }, [pdfUrl, loadPdf, multiSignerContext.isMultiSigner, effectiveSignerEmail]);\r\n\r\n // Inject placeholders after PDF loads (extraction already done in loadPdf)\r\n useEffect(() => {\r\n if (isPdfLoaded && !customFormFields) {\r\n extractFormFields().catch((error) => {\r\n logger.error('Failed to inject placeholders:', error);\r\n });\r\n }\r\n }, [isPdfLoaded, extractFormFields, customFormFields]);\r\n\r\n // Note: Mousedown listeners are now set up in the click interceptor useEffect below\r\n // with a 500ms timeout to ensure PDF fields are fully rendered\r\n\r\n // Auto-refresh all field indicators when PDF loads and when field values or acknowledgements change\r\n useEffect(() => {\r\n if (!isPdfLoaded || !viewerRef.current) {\r\n return;\r\n }\r\n\r\n logger.info('[FIELD INDICATOR] Auto-refreshing all field indicators');\r\n\r\n // Refresh indicators for ALL fields (not just ones with values)\r\n // This enables the hybrid approach: show info icons for unfilled fields with acks\r\n // Use a longer delay to ensure all data (acknowledgements, field values) is ready\r\n const timeoutId = setTimeout(() => {\r\n filteredFields.forEach(field => {\r\n // Skip synthetic main fields (handled by the effect below)\r\n if (field.id === 'signature_field_main' || field.id === 'initials_field_main') {\r\n return;\r\n }\r\n\r\n // Update indicator for every field (hybrid logic handles empty fields)\r\n updateFieldIndicator(field.id);\r\n });\r\n }, 700); // Increased delay to ensure all data is ready before showing indicators\r\n\r\n return () => clearTimeout(timeoutId);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isPdfLoaded, filteredFields, viewerRef]);\r\n // Note: updateFieldIndicator is intentionally excluded - it's now stable and doesn't need to trigger re-runs\r\n\r\n // Separately handle signature/initials indicators when they're added\r\n // Use a longer delay to ensure acknowledgement state is fully synced\r\n useEffect(() => {\r\n if (!isPdfLoaded || !viewerRef.current) {\r\n return;\r\n }\r\n\r\n // Delay indicator updates for signature/initials to prevent showing wrong state\r\n const timeoutId = setTimeout(() => {\r\n if (signatures['signature_field_main']) {\r\n updateFieldIndicator('signature_field_main');\r\n }\r\n if (signatures['initials_field_main'] || fieldValues['initials_field_main']) {\r\n updateFieldIndicator('initials_field_main');\r\n }\r\n }, 250); // Delay to ensure state is synced\r\n\r\n return () => clearTimeout(timeoutId);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [signatures, isPdfLoaded, viewerRef]);\r\n // Note: updateFieldIndicator is stable now, fieldValues removed to prevent excessive re-runs\r\n\r\n // Re-apply signature/initials previews when PDF.js re-renders annotation layers (zoom, lazy page load)\r\n useEffect(() => {\r\n if (!isPdfLoaded || !viewerRef.current) return;\r\n\r\n const iframe = document.querySelector('iframe');\r\n if (!iframe?.contentDocument) return;\r\n\r\n const reapplyPreviews = () => {\r\n const doc = iframe.contentDocument;\r\n if (!doc) return;\r\n\r\n // Re-apply signature preview if collected and previews are missing\r\n const mainSig = signaturesRef.current['signature_field_main'];\r\n if (mainSig) {\r\n const existingSigPreviews = doc.querySelectorAll('.signiphi-signature-preview');\r\n if (existingSigPreviews.length === 0) {\r\n viewerRef.current?.previewSignature('signature_field_main', mainSig);\r\n }\r\n }\r\n\r\n // Re-apply initials preview if collected and previews are missing\r\n const mainInitials = fieldValuesRef.current['initials_field_main'];\r\n if (mainInitials) {\r\n const existingInitialsPreviews = doc.querySelectorAll('.signiphi-initials-preview');\r\n if (existingInitialsPreviews.length === 0) {\r\n viewerRef.current?.previewInitials('initials_field_main', mainInitials);\r\n }\r\n }\r\n };\r\n\r\n // Debounce to avoid rapid re-application during zoom\r\n let debounceTimeout: ReturnType<typeof setTimeout>;\r\n const debouncedReapply = () => {\r\n clearTimeout(debounceTimeout);\r\n debounceTimeout = setTimeout(reapplyPreviews, 150);\r\n };\r\n\r\n const observer = new MutationObserver(debouncedReapply);\r\n\r\n // Observe all annotation layers for child changes (pages being rebuilt)\r\n const annotationLayers = iframe.contentDocument.querySelectorAll('.annotationLayer');\r\n annotationLayers.forEach(layer => {\r\n observer.observe(layer, { childList: true, subtree: false });\r\n });\r\n\r\n return () => {\r\n observer.disconnect();\r\n clearTimeout(debounceTimeout);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isPdfLoaded]);\r\n\r\n // Log fields with acknowledgements when they change\r\n useEffect(() => {\r\n const fieldsWithAcks = filteredFields.filter(f => f.acknowledgements && f.acknowledgements.length > 0);\r\n if (fieldsWithAcks.length > 0) {\r\n logger.info('[FIELDS DEBUG] Fields with acknowledgements:', fieldsWithAcks.map(f => ({\r\n id: f.id,\r\n fieldId: f.fieldId,\r\n type: f.type,\r\n label: f.label,\r\n ackCount: f.acknowledgements?.length || 0,\r\n acks: f.acknowledgements\r\n })));\r\n } else {\r\n logger.info('[FIELDS DEBUG] No fields with acknowledgements found in filteredFields');\r\n }\r\n\r\n // Also log ALL signature/initials fields (to see if they're being extracted)\r\n const sigFields = filteredFields.filter(f => f.type === 'signature' || f.type === 'initials');\r\n logger.info('[FIELDS DEBUG] All signature/initials fields:', sigFields.map(f => ({\r\n id: f.id,\r\n fieldId: f.fieldId,\r\n type: f.type,\r\n ackCount: f.acknowledgements?.length || 0\r\n })));\r\n }, [filteredFields]);\r\n\r\n // Set field metadata for font size injection\r\n useEffect(() => {\r\n if (isPdfLoaded && viewerRef.current?.setFieldMetadata && filteredFields.length > 0) {\r\n viewerRef.current.setFieldMetadata(filteredFields);\r\n logger.info('[FIELD METADATA] Set field metadata for PDF viewer:', filteredFields.length, 'fields');\r\n }\r\n }, [isPdfLoaded, filteredFields]);\r\n\r\n // Attach PDF field click interceptors and change listeners for acknowledgement checking\r\n useEffect(() => {\r\n if (!isPdfLoaded || !viewerRef.current?.attachFieldClickInterceptors || !viewerRef.current?.attachFieldChangeListeners) {\r\n return;\r\n }\r\n\r\n // Store cleanup function for change listeners\r\n let changeListenerCleanup: (() => void) | null = null;\r\n\r\n // Add delay to ensure PDF.js has fully rendered the form fields\r\n const timeoutId = setTimeout(async () => {\r\n // Attach change listeners using the correct iframe reference from PdfViewerCore\r\n changeListenerCleanup = await viewerRef.current?.attachFieldChangeListeners((fieldName, value) => {\r\n // Find the corresponding field using secure UUID-based lookup\r\n const field = resolveField(filteredFields, fieldName);\r\n\r\n if (field) {\r\n // Update React state\r\n setFieldValue(field.id, value);\r\n\r\n // Directly update the ref so indicator check sees the new value immediately\r\n fieldValuesRef.current = {\r\n ...fieldValuesRef.current,\r\n [field.id]: value,\r\n };\r\n\r\n // Update indicator immediately using ref to avoid stale closure\r\n logger.info(`[PDF FIELD CHANGE] Field ${field.id} changed to: \"${value}\"`);\r\n updateFieldIndicatorRef.current(field.id);\r\n }\r\n }) || null;\r\n\r\n await viewerRef.current?.attachFieldClickInterceptors((fieldName, element) => {\r\n logger.info(`[PDF Click] Checking field: ${fieldName}`);\r\n logger.info(`[PDF Click] Available fields:`, filteredFields.map(f => ({ id: f.id, fieldId: f.fieldId, name: f.name, acks: f.acknowledgements?.length || 0 })));\r\n\r\n // Use the secure resolveField function which tries UUID first\r\n // This prevents bugs when field names change or in multi-signer workflows\r\n const field = resolveField(filteredFields, fieldName);\r\n\r\n if (!field) {\r\n logger.info(`[PDF Click] Field not found: ${fieldName}`);\r\n return true; // Unknown field, allow interaction\r\n }\r\n\r\n logger.info(`[PDF Click] Found field:`, { id: field.id, name: field.name, type: field.type, acks: field.acknowledgements?.length || 0 });\r\n\r\n // Special handling for signature/initials fields\r\n if (field.type === 'signature' || field.type === 'initials') {\r\n logger.info(`[PDF Click] Field is ${field.type}`);\r\n \r\n // Check if field has acknowledgements\r\n const hasAcknowledgements = field.acknowledgements && field.acknowledgements.length > 0;\r\n \r\n if (hasAcknowledgements) {\r\n // Has acknowledgements - check if fully acknowledged\r\n const isAcked = isFieldFullyAcknowledged(field.id);\r\n logger.info(`[PDF Click] ${field.type} field has acknowledgements, is fully acknowledged: ${isAcked}`);\r\n \r\n if (!isAcked) {\r\n // Block and show acknowledgement modal\r\n logger.info(`[PDF Click] Blocking ${field.type} field and showing acknowledgement modal`);\r\n setCurrentAcknowledgementField(field);\r\n setCurrentAcknowledgementFieldName(fieldName);\r\n setAcknowledgementModalOpen(true);\r\n return false;\r\n }\r\n }\r\n \r\n // Either no acknowledgements OR fully acknowledged - open signature/initials modal\r\n logger.info(`[PDF Click] Opening ${field.type} modal`);\r\n \r\n // Check if we already have a collected signature/initials\r\n const fieldType = field.type as 'signature' | 'initials';\r\n if (hasCollectedSignature(fieldType)) {\r\n // Auto-place the collected signature/initials\r\n const collected = getCollectedSignature(fieldType);\r\n if (collected) {\r\n logger.info(`[PDF Click] Auto-placing ${fieldType} for field ${field.id}`);\r\n // Signature = image (use setSignature), Initials = text (use setFieldValue)\r\n if (field.type === 'signature') {\r\n setSignature(field.id, collected);\r\n } else if (field.type === 'initials') {\r\n setFieldValue(field.id, collected);\r\n // Directly update ref so indicator sees new value immediately\r\n fieldValuesRef.current = {\r\n ...fieldValuesRef.current,\r\n [field.id]: collected,\r\n };\r\n }\r\n // Update indicator for this field\r\n updateFieldIndicator(field.id);\r\n }\r\n } else {\r\n // First time - open the CORRECT modal based on field type\r\n logger.info(`[PDF Click] Opening ${fieldType} modal to collect`);\r\n if (field.type === 'signature') {\r\n setCurrentSignatureField(field);\r\n setSignatureModalOpen(true);\r\n } else if (field.type === 'initials') {\r\n setCurrentInitialsField(field);\r\n setInitialsModalOpen(true);\r\n }\r\n }\r\n \r\n // Clear navigation highlights\r\n try {\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentDocument) {\r\n const navigationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field');\r\n navigationHighlights.forEach(el => el.classList.remove('active-required-field'));\r\n const navigationAnnotationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field-annotation');\r\n navigationAnnotationHighlights.forEach(el => el.classList.remove('active-required-field-annotation'));\r\n logger.info('[PDF Click] Cleared navigation highlights');\r\n }\r\n } catch (error) {\r\n logger.warn('[PDF Click] Failed to clear navigation highlights:', error);\r\n }\r\n \r\n return false; // Block default PDF interaction (we're handling it with our modal)\r\n }\r\n\r\n // For non-signature/initials fields, check acknowledgements and handle date fields\r\n let shouldBlock = false;\r\n \r\n // Check if field was recently acknowledged (prevents race condition)\r\n const wasRecentlyAcknowledged = recentlyAcknowledgedFieldsRef.current.has(field.id);\r\n \r\n if (wasRecentlyAcknowledged) {\r\n logger.info(`[PDF Click] Field was recently acknowledged, skipping check`);\r\n shouldBlock = false;\r\n } else {\r\n // Check if field has acknowledgements\r\n if (!field.acknowledgements || field.acknowledgements.length === 0) {\r\n logger.info(`[PDF Click] Field has no acknowledgements`);\r\n shouldBlock = false;\r\n } else {\r\n // Check if fully acknowledged\r\n const isAcked = isFieldFullyAcknowledged(field.id);\r\n logger.info(`[PDF Click] Field is fully acknowledged: ${isAcked}`);\r\n shouldBlock = !isAcked;\r\n }\r\n }\r\n\r\n // If blocking, show acknowledgement modal\r\n if (shouldBlock) {\r\n logger.info(`[PDF Click] Blocking field and showing modal`);\r\n setCurrentAcknowledgementField(field);\r\n setCurrentAcknowledgementFieldName(fieldName);\r\n currentAcknowledgementElementRef.current = element || null;\r\n acknowledgementTriggerSourceRef.current = 'pdf-click'; // Track that this came from PDF click\r\n setAcknowledgementModalOpen(true);\r\n \r\n // Clear navigation highlights\r\n try {\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentDocument) {\r\n const navigationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field');\r\n navigationHighlights.forEach(el => el.classList.remove('active-required-field'));\r\n const navigationAnnotationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field-annotation');\r\n navigationAnnotationHighlights.forEach(el => el.classList.remove('active-required-field-annotation'));\r\n logger.info('[PDF Click] Cleared navigation highlights (blocked)');\r\n }\r\n } catch (error) {\r\n logger.warn('[PDF Click] Failed to clear navigation highlights:', error);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n // If this is a date field and no blocking, show calendar\r\n if (field.type === 'date') {\r\n logger.info(`[PDF Click] Opening calendar for date field: ${field.id}`);\r\n \r\n // Get field position from the PDF iframe\r\n try {\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentDocument) {\r\n const formElement = iframe.contentDocument.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"]`\r\n );\r\n \r\n if (formElement) {\r\n const rect = formElement.getBoundingClientRect();\r\n const iframeRect = iframe.getBoundingClientRect();\r\n \r\n // Calculate position relative to viewport (for fixed positioning)\r\n // rect from inside iframe is relative to iframe's viewport\r\n // We need to account for iframe's position in the main document\r\n const position: DateFieldPosition = {\r\n x: Math.round(iframeRect.left + rect.left),\r\n y: Math.round(iframeRect.top + rect.top),\r\n width: Math.round(rect.width),\r\n height: Math.round(rect.height)\r\n };\r\n \r\n setCurrentDateField(field);\r\n setDateFieldPosition(position);\r\n setDateCalendarOpen(true);\r\n }\r\n }\r\n } catch (error) {\r\n logger.error('[PDF Click] Failed to get field position:', error);\r\n }\r\n \r\n // Clear navigation highlights\r\n try {\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentDocument) {\r\n const navigationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field');\r\n navigationHighlights.forEach(el => el.classList.remove('active-required-field'));\r\n const navigationAnnotationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field-annotation');\r\n navigationAnnotationHighlights.forEach(el => el.classList.remove('active-required-field-annotation'));\r\n logger.info('[PDF Click] Cleared navigation highlights (calendar)');\r\n }\r\n } catch (error) {\r\n logger.warn('[PDF Click] Failed to clear navigation highlights:', error);\r\n }\r\n \r\n return false; // Block default PDF interaction (we're handling it with calendar)\r\n }\r\n\r\n // Clear navigation highlights ONLY when interaction is allowed (not blocked)\r\n if (!shouldBlock) {\r\n try {\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentDocument) {\r\n const navigationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field');\r\n navigationHighlights.forEach(el => el.classList.remove('active-required-field'));\r\n const navigationAnnotationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field-annotation');\r\n navigationAnnotationHighlights.forEach(el => el.classList.remove('active-required-field-annotation'));\r\n logger.info('[PDF Click] Cleared navigation highlights (interaction allowed)');\r\n }\r\n } catch (error) {\r\n logger.warn('[PDF Click] Failed to clear navigation highlights:', error);\r\n }\r\n }\r\n\r\n return true; // Allow interaction for non-date fields\r\n });\r\n }, 500); // 500ms delay to ensure fields are rendered\r\n\r\n return () => {\r\n clearTimeout(timeoutId);\r\n // Clean up change listeners\r\n if (changeListenerCleanup) {\r\n changeListenerCleanup();\r\n }\r\n };\r\n }, [isPdfLoaded, filteredFields, isFieldFullyAcknowledged, hasCollectedSignature, getCollectedSignature, setSignature, setFieldValue, updateFieldIndicator]);\r\n\r\n // Add calendar icon indicators to date fields when PDF loads\r\n useEffect(() => {\r\n if (!isPdfLoaded || !viewerRef.current?.addDateFieldIndicator) {\r\n return;\r\n }\r\n\r\n // Add delay to ensure PDF.js has fully rendered the form fields\r\n const timeoutId = setTimeout(() => {\r\n // Find all date fields\r\n const dateFields = filteredFields.filter(f => f.type === 'date');\r\n \r\n logger.info(`[DATE INDICATORS] Adding calendar icons to ${dateFields.length} date fields`);\r\n\r\n // Add calendar indicator to each date field\r\n dateFields.forEach(field => {\r\n try {\r\n viewerRef.current?.addDateFieldIndicator(field.name);\r\n logger.info(`[DATE INDICATORS] Added calendar icon to: ${field.name}`);\r\n } catch (error) {\r\n logger.error(`[DATE INDICATORS] Failed to add calendar icon to ${field.name}:`, error);\r\n }\r\n });\r\n\r\n // Also set up click handlers for calendar icons\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentDocument) {\r\n // Find all calendar indicators and attach click handlers\r\n const calendarIndicators = iframe.contentDocument.querySelectorAll('.signiphi-date-field-indicator');\r\n \r\n calendarIndicators.forEach(indicator => {\r\n indicator.addEventListener('click', (event: Event) => {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n \r\n // Find the associated field\r\n const annotationSection = (indicator as HTMLElement).closest('section');\r\n if (annotationSection) {\r\n const formElement = annotationSection.querySelector('input, textarea');\r\n if (formElement) {\r\n const fieldName = formElement.getAttribute('name') || formElement.getAttribute('data-element-id') || '';\r\n \r\n // Find the field in filteredFields\r\n let field = filteredFields.find(f => f.fieldId === fieldName || f.id === fieldName || f.name === fieldName);\r\n \r\n // Try without suffixes\r\n if (!field) {\r\n const cleanFieldName = fieldName.replace(/_date$/i, '');\r\n field = filteredFields.find(f => f.fieldId === cleanFieldName || f.id === cleanFieldName || f.name === cleanFieldName);\r\n }\r\n \r\n if (field && field.type === 'date') {\r\n logger.info(`[DATE INDICATOR CLICK] Opening calendar for: ${field.id}`);\r\n \r\n // Check if field has acknowledgements that need to be completed first\r\n const hasAcknowledgements = field.acknowledgements && field.acknowledgements.length > 0;\r\n if (hasAcknowledgements && !isFieldFullyAcknowledged(field.id)) {\r\n logger.info(`[DATE INDICATOR CLICK] Showing acknowledgement modal first`);\r\n setCurrentAcknowledgementField(field);\r\n setCurrentAcknowledgementFieldName(fieldName);\r\n setAcknowledgementModalOpen(true);\r\n return;\r\n }\r\n \r\n // Get field position\r\n // rect from iframe gives us position relative to the iframe's VIEWPORT (not content)\r\n // iframeRect gives us the iframe's position in the main page\r\n const rect = formElement.getBoundingClientRect();\r\n const iframeRect = iframe.getBoundingClientRect();\r\n \r\n // Since getBoundingClientRect() from inside iframe already accounts for scroll within the iframe,\r\n // we just need to add the iframe's position in the main page\r\n // This gives us the position relative to the main page viewport\r\n const position: DateFieldPosition = {\r\n x: Math.round(iframeRect.left + rect.left),\r\n y: Math.round(iframeRect.top + rect.top),\r\n width: Math.round(rect.width),\r\n height: Math.round(rect.height)\r\n };\r\n \r\n logger.info('[DATE INDICATOR CLICK] Opening calendar at position:', position);\r\n \r\n setCurrentDateField(field);\r\n setDateFieldPosition(position);\r\n setDateCalendarOpen(true);\r\n }\r\n }\r\n }\r\n });\r\n });\r\n \r\n logger.info(`[DATE INDICATORS] Attached click handlers to ${calendarIndicators.length} calendar icons`);\r\n }\r\n }, 600); // Slightly longer delay than field interceptors to ensure they're rendered\r\n\r\n return () => clearTimeout(timeoutId);\r\n }, [isPdfLoaded, filteredFields, isFieldFullyAcknowledged]);\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 // Radio button: discard \"true\"/\"false\" values that can leak from\r\n // annotationStorage widget data — these don't represent option selections\r\n if (field.type === 'radio' && (normalizedPdfValue === 'true' || normalizedPdfValue === 'false')) {\r\n normalizedPdfValue = undefined;\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 from PDF values.\r\n // `field.id in pdfValues` distinguishes \"user interacted with field\"\r\n // (present in annotationStorage, even if empty) from \"field never touched\"\r\n // (not in annotationStorage). This lets us detect cleared pre-filled fields\r\n // while preserving seeded defaults for untouched fields.\r\n const isUnresolvedRadioIndex = field.type === 'radio' &&\r\n normalizedPdfValue?.includes('__RADIO_OPTION_INDEX_');\r\n const pdfFieldReported = field.id in pdfValues;\r\n\r\n if (normalizedPdfValue && normalizedPdfValue !== currentReactValue && !isUnresolvedRadioIndex) {\r\n // PDF has a non-empty, resolved value different from React — use it\r\n setFieldValue(field.id, normalizedPdfValue);\r\n } else if (pdfFieldReported && !normalizedPdfValue && currentReactValue) {\r\n // PDF explicitly reports empty for a field that React has a value for.\r\n // User cleared the field in PDF View — sync the empty value.\r\n setFieldValue(field.id, '');\r\n }\r\n // If PDF didn't report the field at all, leave React state unchanged.\r\n // This preserves seeded defaults for fields not yet in annotationStorage.\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 // Update field indicator (debounced internally)\r\n updateFieldIndicator(fieldId);\r\n\r\n // Preview initials on the PDF viewer when initials fields change\r\n if (field && field.type === 'initials') {\r\n viewerRef.current?.previewInitials('initials_field_main', value || null);\r\n }\r\n },\r\n [setFieldValue, filteredFields, updateFieldIndicator]\r\n );\r\n\r\n // Handle acknowledgement required\r\n const handleAcknowledgementRequired = useCallback((field: EsignFormField, element?: HTMLElement, fieldName?: string) => {\r\n if (readOnly) return;\r\n \r\n // Store field for modal\r\n setCurrentAcknowledgementField(field);\r\n \r\n // Store element and fieldName for auto-proceed after acknowledgement\r\n // This enables the same auto-focus/interaction behavior for navigation arrows as for direct PDF clicks\r\n if (element) {\r\n currentAcknowledgementElementRef.current = element;\r\n logger.info(`[ACK REQUIRED] Stored element reference for field ${field.id}`, {\r\n elementTag: element.tagName,\r\n dataElementId: element.getAttribute('data-element-id')\r\n });\r\n }\r\n if (fieldName) {\r\n setCurrentAcknowledgementFieldName(fieldName);\r\n logger.info(`[ACK REQUIRED] Stored fieldName: ${fieldName} for field ${field.id}`);\r\n }\r\n \r\n setAcknowledgementModalOpen(true);\r\n }, [readOnly]);\r\n\r\n // Handle acknowledgement modal close - cleanup trigger source\r\n const handleAcknowledgementModalOpenChange = useCallback((open: boolean) => {\r\n setAcknowledgementModalOpen(open);\r\n \r\n // Clear any existing cleanup timeout\r\n if (acknowledgementCleanupTimeoutRef.current) {\r\n clearTimeout(acknowledgementCleanupTimeoutRef.current);\r\n acknowledgementCleanupTimeoutRef.current = null;\r\n }\r\n \r\n // When modal closes without completing (user clicks outside or presses escape)\r\n // clean up the trigger source\r\n // NOTE: Do NOT clear currentAcknowledgementElementRef here - it's needed by handleAcknowledgementComplete\r\n // The finally block in handleAcknowledgementComplete will clear it after use\r\n if (!open) {\r\n // Only clear trigger source if modal was dismissed (not completed)\r\n // If completed, handleAcknowledgementComplete will clear everything\r\n acknowledgementCleanupTimeoutRef.current = setTimeout(() => {\r\n // Delayed cleanup - if handleAcknowledgementComplete didn't clear it, we do\r\n if (acknowledgementTriggerSourceRef.current !== null) {\r\n acknowledgementTriggerSourceRef.current = null;\r\n currentAcknowledgementElementRef.current = null;\r\n logger.info('[ACK MODAL] Cleaned up refs after modal dismiss (not completed)');\r\n }\r\n acknowledgementCleanupTimeoutRef.current = null;\r\n }, 500); // Wait for handleAcknowledgementComplete to finish if it's running\r\n }\r\n }, []);\r\n\r\n // Handle date selection from calendar popup\r\n const handleDateSelect = useCallback(async (dateValue: string) => {\r\n if (readOnly || !currentDateField) return;\r\n\r\n logger.info(`[DATE SELECT] Selected date for field ${currentDateField.id}:`, dateValue);\r\n\r\n // Update React state\r\n setFieldValue(currentDateField.id, dateValue);\r\n\r\n // Update PDF field (DOM) and annotationStorage.\r\n // setFormFieldValues updates the DOM input but doesn't write to\r\n // annotationStorage, so getFormFieldValues (used by the view-switch sync)\r\n // would still return the old pre-filled value. Writing directly to\r\n // annotationStorage ensures the sync picks up the user's new date.\r\n try {\r\n await setFormFieldValues({ [currentDateField.id]: dateValue });\r\n\r\n const pdfApp = viewerRef.current?.getPDFViewerApplication?.();\r\n const pdfDocument = (pdfApp as any)?.pdfDocument;\r\n if (pdfDocument?.annotationStorage && typeof pdfDocument.getFieldObjects === 'function') {\r\n const fieldObjects: Record<string, Array<{ id?: string }>> =\r\n await pdfDocument.getFieldObjects() || {};\r\n const widgets = fieldObjects[currentDateField.id];\r\n if (widgets?.[0]?.id) {\r\n pdfDocument.annotationStorage.setValue(widgets[0].id, { value: dateValue });\r\n }\r\n }\r\n\r\n logger.info(`[DATE SELECT] Updated PDF field ${currentDateField.id}`);\r\n } catch (error) {\r\n logger.error(`[DATE SELECT] Failed to update PDF field:`, error);\r\n }\r\n\r\n // Clear any date validation errors\r\n if (dateValue) {\r\n const validation = parseAndValidateDate(dateValue);\r\n if (validation.isValid) {\r\n setValidationErrors((prev) =>\r\n prev.filter(error =>\r\n !error.includes('date field(s) contain invalid values') ||\r\n !(error.includes(currentDateField.label || currentDateField.id))\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Update field indicator if needed\r\n updateFieldIndicator(currentDateField.id);\r\n }, [readOnly, currentDateField, setFieldValue, setFormFieldValues, updateFieldIndicator]);\r\n\r\n // Handle signature/initials click - assumes acknowledgements are already handled\r\n const handleSignatureClick = useCallback((field: EsignFormField) => {\r\n if (readOnly) return;\r\n\r\n logger.info(`[SIGNATURE CLICK] Field:`, {\r\n id: field.id,\r\n name: field.name,\r\n type: field.type,\r\n });\r\n\r\n const fieldType = field.type as 'signature' | 'initials';\r\n\r\n // Check if we already have a collected signature/initials\r\n if (hasCollectedSignature(fieldType)) {\r\n // Auto-place the collected signature/initials\r\n const collected = getCollectedSignature(fieldType);\r\n if (collected) {\r\n // Signature = image (use setSignature), Initials = text (use setFieldValue)\r\n if (field.type === 'signature') {\r\n setSignature(field.id, collected);\r\n } else if (field.type === 'initials') {\r\n setFieldValue(field.id, collected);\r\n // Directly update ref so indicator sees new value immediately\r\n fieldValuesRef.current = {\r\n ...fieldValuesRef.current,\r\n [field.id]: collected,\r\n };\r\n }\r\n logger.info(`[SIGNATURE CLICK] Auto-placed ${fieldType} for field ${field.id}`);\r\n\r\n // Update indicator for this field\r\n updateFieldIndicator(field.id);\r\n }\r\n } else {\r\n // First time - open the CORRECT modal based on field type\r\n logger.info(`[SIGNATURE CLICK] Opening ${fieldType} modal to collect`);\r\n\r\n if (field.type === 'signature') {\r\n setCurrentSignatureField(field);\r\n setSignatureModalOpen(true);\r\n } else if (field.type === 'initials') {\r\n setCurrentInitialsField(field);\r\n setInitialsModalOpen(true);\r\n }\r\n }\r\n }, [readOnly, hasCollectedSignature, getCollectedSignature, setSignature, setFieldValue, updateFieldIndicator]);\r\n\r\n // Handle required field navigation with intelligent interaction\r\n const navigateToRequiredField = useCallback(async (field: EsignFormField) => {\r\n if (!field) return;\r\n\r\n logger.info(`[REQUIRED NAV] Navigating to field:`, {\r\n id: field.id,\r\n name: field.name,\r\n type: field.type,\r\n page: field.position?.page,\r\n hasAcknowledgements: !!field.acknowledgements?.length,\r\n isAcknowledged: field.acknowledgements?.length ? isFieldFullyAcknowledged(field.id) : true\r\n });\r\n\r\n // Step 1: Navigate to the field's page in PDF viewer\r\n if (field.position?.page && viewerRef.current) {\r\n try {\r\n const currentPage = await viewerRef.current.getCurrentPage();\r\n if (currentPage !== field.position.page) {\r\n // Navigate to the page (PDF.js uses 1-indexed pages)\r\n const pdfApp = viewerRef.current.getPDFViewerApplication();\r\n if (pdfApp?.pdfViewer) {\r\n pdfApp.pdfViewer.currentPageNumber = field.position.page;\r\n logger.info(`[REQUIRED NAV] Navigated to page ${field.position.page}`);\r\n // Wait for page render\r\n await new Promise(resolve => setTimeout(resolve, 300));\r\n }\r\n }\r\n } catch (error) {\r\n logger.warn('[REQUIRED NAV] Failed to navigate to page:', error);\r\n }\r\n }\r\n\r\n // Step 1.5: Add visual highlight to the active field\r\n let highlightedFieldElement: HTMLElement | null = null;\r\n let pdfFieldName = field.name; // Declare outside try-catch for wider scope, fallback to field name\r\n try {\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentDocument) {\r\n // Remove previous highlights\r\n const previousHighlights = iframe.contentDocument.querySelectorAll('.active-required-field');\r\n previousHighlights.forEach(el => el.classList.remove('active-required-field'));\r\n const previousAnnotationHighlights = iframe.contentDocument.querySelectorAll('.active-required-field-annotation');\r\n previousAnnotationHighlights.forEach(el => el.classList.remove('active-required-field-annotation'));\r\n\r\n // Remove click highlights (navigation takes priority)\r\n const clickHighlights = iframe.contentDocument.querySelectorAll('.clicked-field');\r\n clickHighlights.forEach(el => el.classList.remove('clicked-field'));\r\n const clickAnnotationHighlights = iframe.contentDocument.querySelectorAll('.clicked-field-annotation');\r\n clickAnnotationHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\r\n logger.info('[REQUIRED NAV] Cleared click highlights');\r\n\r\n // Ensure CSS styles are present (defensive - also added in useEffect)\r\n const styleId = 'active-field-highlight-style';\r\n if (!iframe.contentDocument.getElementById(styleId)) {\r\n const style = iframe.contentDocument.createElement('style');\r\n style.id = styleId;\r\n style.textContent = `\r\n .active-required-field-annotation {\r\n outline: 3px solid #3b82f6 !important;\r\n outline-offset: 2px !important;\r\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4), 0 4px 12px rgba(59, 130, 246, 0.3) !important;\r\n animation: pulse-glow 2s ease-in-out infinite !important;\r\n z-index: 9999 !important;\r\n position: relative !important;\r\n border-radius: 4px !important;\r\n }\r\n input.active-required-field,\r\n select.active-required-field,\r\n textarea.active-required-field {\r\n border-color: #3b82f6 !important;\r\n background-color: rgba(59, 130, 246, 0.08) !important;\r\n }\r\n .clicked-field-annotation {\r\n outline: 2px solid #3b82f6 !important;\r\n outline-offset: 1px !important;\r\n box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15) !important;\r\n border-radius: 3px !important;\r\n z-index: 999 !important;\r\n position: relative !important;\r\n }\r\n .clicked-field {\r\n outline: none !important;\r\n border-color: #3b82f6 !important;\r\n background-color: rgba(59, 130, 246, 0.05) !important;\r\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1) !important;\r\n }\r\n @keyframes pulse-glow {\r\n 0%, 100% {\r\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.4), 0 4px 12px rgba(59, 130, 246, 0.3);\r\n outline-offset: 2px;\r\n }\r\n 50% {\r\n box-shadow: 0 0 0 6px rgba(59, 130, 246, 0.2), 0 6px 16px rgba(59, 130, 246, 0.4);\r\n outline-offset: 3px;\r\n }\r\n }\r\n `;\r\n iframe.contentDocument.head.appendChild(style);\r\n logger.info('[REQUIRED NAV] Added CSS styles');\r\n }\r\n\r\n // Get PDF field name from metadata using fieldId (pdfFieldName already declared outside)\r\n // Try to read metadata to get the correct PDF field name\r\n const pdfApp = viewerRef.current?.getPDFViewerApplication?.();\r\n if (pdfApp?.pdfDocument?.getData) {\r\n try {\r\n const pdfBytesRaw = await pdfApp.pdfDocument.getData();\r\n let pdfBytes: Uint8Array;\r\n\r\n if (pdfBytesRaw instanceof Uint8Array) {\r\n pdfBytes = pdfBytesRaw;\r\n } else if ((pdfBytesRaw as any)?.buffer instanceof ArrayBuffer) {\r\n const rawData = pdfBytesRaw as any;\r\n pdfBytes = new Uint8Array(rawData.buffer, rawData.byteOffset || 0, rawData.byteLength || rawData.length);\r\n } else {\r\n pdfBytes = new Uint8Array(pdfBytesRaw as any);\r\n }\r\n\r\n const { PDFDocument, PDFName } = await import('pdf-lib');\r\n const pdfLibDoc = await PDFDocument.load(pdfBytes);\r\n const infoRef = pdfLibDoc.context.trailerInfo.Info;\r\n\r\n if (infoRef) {\r\n const infoObj = pdfLibDoc.context.lookup(infoRef) as any;\r\n const metadataObj = infoObj?.get(PDFName.of('SigniphiMetadata'));\r\n\r\n if (metadataObj) {\r\n const signiphiMetadataStr = metadataObj.toString();\r\n let jsonStr = signiphiMetadataStr;\r\n const parenMatch = signiphiMetadataStr.match(/^\\((.*)\\)$/);\r\n if (parenMatch && parenMatch[1]) {\r\n jsonStr = parenMatch[1];\r\n }\r\n\r\n const signiphiMetadata = JSON.parse(jsonStr);\r\n if (signiphiMetadata.fields) {\r\n // Find the PDF field name that has this fieldId\r\n for (const [pdfName, fieldData] of Object.entries(signiphiMetadata.fields) as [string, any][]) {\r\n if (fieldData.fieldId === field.id) {\r\n pdfFieldName = pdfName;\r\n logger.info(`[REQUIRED NAV] Mapped fieldId ${field.id} to PDF name ${pdfName}`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (metadataError) {\r\n logger.warn('[REQUIRED NAV] Could not read PDF metadata:', metadataError);\r\n }\r\n }\r\n\r\n // Try multiple selectors to find the field element\r\n let fieldElement: HTMLElement | null = null;\r\n\r\n // Try 1: Using PDF field name from metadata\r\n fieldElement = iframe.contentDocument.querySelector(\r\n `input[data-element-id=\"${pdfFieldName}\"], ` +\r\n `select[data-element-id=\"${pdfFieldName}\"], ` +\r\n `textarea[data-element-id=\"${pdfFieldName}\"]`\r\n ) as HTMLElement;\r\n\r\n // Try 2: If not found, try using field.name directly\r\n if (!fieldElement && field.name !== pdfFieldName) {\r\n fieldElement = iframe.contentDocument.querySelector(\r\n `input[data-element-id=\"${field.name}\"], ` +\r\n `select[data-element-id=\"${field.name}\"], ` +\r\n `textarea[data-element-id=\"${field.name}\"]`\r\n ) as HTMLElement;\r\n if (fieldElement) {\r\n logger.info(`[REQUIRED NAV] Found field using field.name instead of metadata name`);\r\n }\r\n }\r\n\r\n // Try 3: If still not found, try using name attribute instead of data-element-id\r\n if (!fieldElement) {\r\n fieldElement = iframe.contentDocument.querySelector(\r\n `input[name=\"${pdfFieldName}\"], ` +\r\n `select[name=\"${pdfFieldName}\"], ` +\r\n `textarea[name=\"${pdfFieldName}\"]`\r\n ) as HTMLElement;\r\n if (fieldElement) {\r\n logger.info(`[REQUIRED NAV] Found field using name attribute`);\r\n }\r\n }\r\n\r\n if (fieldElement) {\r\n fieldElement.classList.add('active-required-field');\r\n\r\n // Also highlight the parent widget annotation if it exists\r\n const widgetAnnotation = fieldElement.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation');\r\n if (widgetAnnotation) {\r\n widgetAnnotation.classList.add('active-required-field-annotation');\r\n }\r\n\r\n // Scroll field into view using PDF.js viewer container\r\n try {\r\n // Get the PDF viewer's scroll container\r\n const viewerContainer = iframe.contentDocument.querySelector('#viewerContainer');\r\n if (viewerContainer && widgetAnnotation) {\r\n // Get the field's position relative to the container\r\n const fieldRect = (widgetAnnotation as HTMLElement).getBoundingClientRect();\r\n const containerRect = viewerContainer.getBoundingClientRect();\r\n \r\n // Calculate the scroll position to center the field\r\n const scrollTop = viewerContainer.scrollTop + fieldRect.top - containerRect.top - (containerRect.height / 2) + (fieldRect.height / 2);\r\n \r\n // Smooth scroll to the field\r\n viewerContainer.scrollTo({\r\n top: scrollTop,\r\n behavior: 'smooth'\r\n });\r\n \r\n logger.info(`[REQUIRED NAV] Scrolled to field`, {\r\n fieldRect: { top: fieldRect.top, height: fieldRect.height },\r\n containerRect: { top: containerRect.top, height: containerRect.height },\r\n scrollTop\r\n });\r\n } else {\r\n // Fallback to regular scrollIntoView if viewer container not found\r\n fieldElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n logger.info(`[REQUIRED NAV] Used fallback scrollIntoView`);\r\n }\r\n } catch (scrollError) {\r\n logger.warn('[REQUIRED NAV] Error scrolling to field:', scrollError);\r\n // Final fallback\r\n fieldElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n \r\n // Store reference for later focus\r\n highlightedFieldElement = fieldElement;\r\n \r\n logger.info(`[REQUIRED NAV] Added visual highlight to field`, {\r\n fieldId: field.id,\r\n fieldName: field.name,\r\n pdfFieldName,\r\n hasAnnotation: !!widgetAnnotation,\r\n elementTag: fieldElement.tagName,\r\n dataElementId: fieldElement.getAttribute('data-element-id'),\r\n nameAttr: fieldElement.getAttribute('name')\r\n });\r\n } else {\r\n logger.warn(`[REQUIRED NAV] Could not find field element`, {\r\n fieldId: field.id,\r\n fieldName: field.name,\r\n pdfFieldName,\r\n availableInputs: Array.from(iframe.contentDocument.querySelectorAll('input, select, textarea')).slice(0, 5).map(el => ({\r\n tag: el.tagName,\r\n dataElementId: el.getAttribute('data-element-id'),\r\n name: el.getAttribute('name')\r\n }))\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n logger.warn('[REQUIRED NAV] Failed to add visual highlight:', error);\r\n }\r\n\r\n // Step 2: Determine appropriate action based on field state\r\n // Priority: Acknowledgements > Signature/Initials > Regular Field\r\n\r\n // Check if field has unacknowledged acknowledgements\r\n if (field.acknowledgements && field.acknowledgements.length > 0) {\r\n if (!isFieldFullyAcknowledged(field.id)) {\r\n logger.info(`[REQUIRED NAV] Field has unacknowledged items, opening acknowledgement modal`);\r\n // Set trigger source to indicate this came from navigation arrows\r\n acknowledgementTriggerSourceRef.current = 'navigation';\r\n // Pass element and fieldName to enable auto-proceed after acknowledgement\r\n handleAcknowledgementRequired(field, highlightedFieldElement || undefined, pdfFieldName);\r\n return;\r\n }\r\n }\r\n\r\n // Handle signature/initials fields (both modal-based)\r\n if (field.type === 'signature' || field.type === 'initials') {\r\n logger.info(`[REQUIRED NAV] Field is ${field.type}, triggering handler`);\r\n handleSignatureClick(field);\r\n return;\r\n }\r\n\r\n // Handle regular text fields - try to focus the field in PDF\r\n logger.info(`[REQUIRED NAV] Regular field, attempting to focus in PDF`);\r\n try {\r\n // Wait a bit for scroll animation to complete\r\n await new Promise(resolve => setTimeout(resolve, 300));\r\n\r\n // Use the field element we already found during highlighting\r\n if (highlightedFieldElement) {\r\n highlightedFieldElement.focus();\r\n logger.info(`[REQUIRED NAV] Focused field in PDF`, {\r\n elementTag: highlightedFieldElement.tagName,\r\n dataElementId: highlightedFieldElement.getAttribute('data-element-id')\r\n });\r\n } else {\r\n logger.warn(`[REQUIRED NAV] No field element available to focus`);\r\n }\r\n } catch (error) {\r\n logger.warn('[REQUIRED NAV] Failed to focus field:', error);\r\n }\r\n }, [viewerRef, isFieldFullyAcknowledged, handleAcknowledgementRequired, handleSignatureClick]);\r\n\r\n // Handle required field navigation\r\n const handleNextRequired = useCallback(() => {\r\n const field = goToNextRequired();\r\n if (field) {\r\n navigateToRequiredField(field);\r\n }\r\n }, [goToNextRequired, navigateToRequiredField]);\r\n\r\n const handlePreviousRequired = useCallback(() => {\r\n const field = goToPreviousRequired();\r\n if (field) {\r\n navigateToRequiredField(field);\r\n }\r\n }, [goToPreviousRequired, navigateToRequiredField]);\r\n\r\n // Handle SIGNATURE save (signature modal only)\r\n const handleSignatureSave = useCallback(\r\n (dataUrl: string) => {\r\n if (!currentSignatureField) return;\r\n\r\n // Collect the signature for future auto-placement\r\n collectSignature('signature', dataUrl);\r\n\r\n // Set signature for the current field\r\n setSignature(currentSignatureField.id, dataUrl);\r\n\r\n // SYNC: Also update the main sidebar signature field\r\n setSignature('signature_field_main', dataUrl);\r\n\r\n setCurrentSignatureField(null);\r\n setSignatureModalOpen(false);\r\n },\r\n [currentSignatureField, setSignature, collectSignature]\r\n );\r\n\r\n // Handle INITIALS save (initials modal only - TEXT INPUT)\r\n const handleInitialsSave = useCallback(\r\n (initialsText: string) => {\r\n if (!currentInitialsField) return;\r\n\r\n // Initials are TEXT, not images - save to field value\r\n setFieldValue(currentInitialsField.id, initialsText);\r\n\r\n // Store for auto-placement to other initials fields\r\n collectSignature('initials', initialsText);\r\n\r\n // SYNC: Also update the main sidebar initials field\r\n setFieldValue('initials_field_main', initialsText);\r\n\r\n // Directly update the ref so indicator check sees the new value immediately\r\n // (useEffect that syncs fieldValuesRef won't run until after render)\r\n fieldValuesRef.current = {\r\n ...fieldValuesRef.current,\r\n [currentInitialsField.id]: initialsText,\r\n 'initials_field_main': initialsText,\r\n };\r\n\r\n // Capture fieldId before clearing state\r\n const fieldIdToUpdate = currentInitialsField.id;\r\n\r\n setCurrentInitialsField(null);\r\n setInitialsModalOpen(false);\r\n\r\n // Update indicator for the specific field only\r\n // DO NOT update initials_field_main here - it would check ALL initials fields\r\n // and show pending-ack if any are unacknowledged, overwriting the completed indicator\r\n updateFieldIndicator(fieldIdToUpdate);\r\n\r\n // Preview initials on the PDF viewer (all initials fields)\r\n viewerRef.current?.previewInitials('initials_field_main', initialsText || null);\r\n },\r\n [currentInitialsField, setFieldValue, collectSignature, updateFieldIndicator]\r\n );\r\n\r\n // Handle acknowledgement complete - continue the interaction flow\r\n const handleAcknowledgementComplete = useCallback(async (fieldId: string) => {\r\n logger.info(`[ACK COMPLETE] Field ${fieldId} fully acknowledged, continuing interaction`);\r\n\r\n // Mark field as recently acknowledged (with timestamp) to prevent race condition\r\n recentlyAcknowledgedFieldsRef.current.set(fieldId, Date.now());\r\n // Auto-clean after 3 seconds\r\n setTimeout(() => {\r\n recentlyAcknowledgedFieldsRef.current.delete(fieldId);\r\n }, 3000);\r\n\r\n // Find the field\r\n const field = filteredFields.find(f => f.id === fieldId);\r\n if (!field) {\r\n logger.warn(`[ACK COMPLETE] Field ${fieldId} not found`);\r\n return;\r\n }\r\n\r\n // Now that acknowledgements are done, continue with the appropriate action\r\n if (field.type === 'signature' || field.type === 'initials') {\r\n // For signature/initials fields: check if we need to collect or can auto-place\r\n const fieldType = field.type as 'signature' | 'initials';\r\n\r\n if (hasCollectedSignature(fieldType)) {\r\n // Auto-place the collected signature/initials\r\n const collected = getCollectedSignature(fieldType);\r\n if (collected) {\r\n // Signature = image (use setSignature), Initials = text (use setFieldValue)\r\n if (field.type === 'signature') {\r\n setSignature(field.id, collected);\r\n } else if (field.type === 'initials') {\r\n setFieldValue(field.id, collected);\r\n }\r\n logger.info(`[ACK COMPLETE] Auto-placed ${fieldType} for field ${field.id}`);\r\n }\r\n } else {\r\n // Open the CORRECT modal to collect signature/initials\r\n logger.info(`[ACK COMPLETE] Opening ${fieldType} modal to collect`);\r\n\r\n if (field.type === 'signature') {\r\n setCurrentSignatureField(field);\r\n setSignatureModalOpen(true);\r\n } else if (field.type === 'initials') {\r\n setCurrentInitialsField(field);\r\n setInitialsModalOpen(true);\r\n }\r\n }\r\n } else if (field.type === 'date') {\r\n // For date fields: open the calendar popup\r\n logger.info(`[ACK COMPLETE] Date field, opening calendar`);\r\n \r\n try {\r\n // Small delay to allow modal close animation to complete\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n \r\n // Use the stored fieldName from when acknowledgement modal was opened\r\n // This ensures we use the same selector that worked when clicking the field\r\n const fieldName = currentAcknowledgementFieldName || field.fieldId || field.name;\r\n logger.info(`[ACK COMPLETE] Looking for field with name: ${fieldName}`);\r\n \r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentDocument) {\r\n // Use the exact same selector as the working PDF click handler\r\n const formElement = iframe.contentDocument.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"]`\r\n ) as HTMLElement;\r\n \r\n if (formElement) {\r\n const rect = formElement.getBoundingClientRect();\r\n const iframeRect = iframe.getBoundingClientRect();\r\n \r\n // Calculate position relative to viewport (for fixed positioning)\r\n const position: DateFieldPosition = {\r\n x: Math.round(iframeRect.left + rect.left),\r\n y: Math.round(iframeRect.top + rect.top),\r\n width: Math.round(rect.width),\r\n height: Math.round(rect.height)\r\n };\r\n \r\n setCurrentDateField(field);\r\n setDateFieldPosition(position);\r\n setDateCalendarOpen(true);\r\n logger.info(`[ACK COMPLETE] Opened calendar for date field in PDF view`);\r\n } else {\r\n logger.warn(`[ACK COMPLETE] Date field element not found in PDF with name: ${fieldName}`);\r\n }\r\n }\r\n } catch (error) {\r\n logger.error('[ACK COMPLETE] Failed to open calendar:', error);\r\n }\r\n } else {\r\n // For regular fields (text, dropdown, checkbox, radio): focus/click the field in PDF\r\n const triggerSource = acknowledgementTriggerSourceRef.current;\r\n logger.info(`[ACK COMPLETE] Regular field (${field.type}), trigger: ${triggerSource}`);\r\n \r\n // For navigation arrows: skip auto-interaction for checkbox/radio\r\n // (user intent is unclear - they just want to see the field, not make a choice)\r\n if (triggerSource === 'navigation' && (field.type === 'checkbox' || field.type === 'radio')) {\r\n logger.info(`[ACK COMPLETE] Skipping auto-interaction for ${field.type} via navigation (unclear intent)`);\r\n // Just let the field stay highlighted from navigation, don't interact\r\n acknowledgementTriggerSourceRef.current = null; // Clear for next use\r\n currentAcknowledgementElementRef.current = null;\r\n return;\r\n }\r\n \r\n try {\r\n // Small delay to allow modal close animation to complete\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n\r\n // Use the stored fieldName from when acknowledgement modal was opened\r\n const fieldName = currentAcknowledgementFieldName || field.fieldId || field.name;\r\n logger.info(`[ACK COMPLETE] Looking for field with name: ${fieldName}`);\r\n\r\n const iframe = document.querySelector('iframe');\r\n if (iframe?.contentDocument) {\r\n if (field.type === 'dropdown') {\r\n // For dropdowns: use the showPicker() API (modern browsers) to open programmatically\r\n const storedElement = currentAcknowledgementElementRef.current;\r\n let selectElement: HTMLSelectElement | null = null;\r\n \r\n if (storedElement && storedElement.tagName === 'SELECT') {\r\n selectElement = storedElement as HTMLSelectElement;\r\n logger.info(`[ACK COMPLETE] Using stored dropdown element`);\r\n } else {\r\n selectElement = iframe.contentDocument.querySelector(\r\n `select[name=\"${fieldName}\"], select[data-element-id=\"${fieldName}\"]`\r\n ) as HTMLSelectElement;\r\n logger.info(`[ACK COMPLETE] Querying for dropdown element`);\r\n }\r\n \r\n if (selectElement) {\r\n selectElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n \r\n // Focus first\r\n selectElement.focus();\r\n \r\n // Small delay, then try to open using showPicker() API\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n \r\n try {\r\n // Modern API to programmatically open select dropdowns\r\n if ('showPicker' in selectElement) {\r\n (selectElement as any).showPicker();\r\n logger.info(`[ACK COMPLETE] Opened dropdown using showPicker() API`);\r\n } else {\r\n logger.info(`[ACK COMPLETE] showPicker() not supported, dropdown is focused`);\r\n }\r\n } catch (error) {\r\n // showPicker() can throw if not triggered by user gesture in some browsers\r\n logger.warn(`[ACK COMPLETE] showPicker() failed (may require user gesture):`, error);\r\n }\r\n } else {\r\n logger.warn(`[ACK COMPLETE] Dropdown element not found with name: ${fieldName}`);\r\n }\r\n } else if (field.type === 'radio') {\r\n // For radio buttons: use the stored element to get the exact option clicked\r\n const storedElement = currentAcknowledgementElementRef.current;\r\n \r\n if (storedElement && storedElement.getAttribute('type') === 'radio') {\r\n // We have the exact radio option that was clicked\r\n storedElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n storedElement.click();\r\n logger.info(`[ACK COMPLETE] Clicked specific radio option with value: ${(storedElement as HTMLInputElement).value}`);\r\n } else {\r\n // Fallback: focus the first radio button\r\n const radioElement = iframe.contentDocument.querySelector(\r\n `input[type=\"radio\"][name=\"${fieldName}\"], input[type=\"radio\"][data-element-id=\"${fieldName}\"]`\r\n ) as HTMLInputElement;\r\n \r\n if (radioElement) {\r\n radioElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n radioElement.focus();\r\n logger.info(`[ACK COMPLETE] Focused radio button group (fallback)`);\r\n } else {\r\n logger.warn(`[ACK COMPLETE] Radio element not found with name: ${fieldName}`);\r\n }\r\n }\r\n } else {\r\n // For text and checkbox fields\r\n const fieldElement = iframe.contentDocument.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\r\n ) as HTMLElement;\r\n \r\n if (fieldElement) {\r\n fieldElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n \r\n if (field.type === 'checkbox') {\r\n fieldElement.click();\r\n logger.info(`[ACK COMPLETE] Clicked checkbox field`);\r\n } else {\r\n fieldElement.focus();\r\n logger.info(`[ACK COMPLETE] Focused text field`);\r\n }\r\n } else {\r\n logger.warn(`[ACK COMPLETE] Field element not found with name: ${fieldName}`);\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n logger.warn('[ACK COMPLETE] Failed to interact with field:', error);\r\n } finally {\r\n // Clear trigger source and element ref after handling\r\n acknowledgementTriggerSourceRef.current = null;\r\n currentAcknowledgementElementRef.current = null;\r\n }\r\n }\r\n }, [filteredFields, hasCollectedSignature, getCollectedSignature, setSignature, setFieldValue, currentAcknowledgementFieldName]);\r\n\r\n // Handle bulk acknowledgement complete from UnacknowledgedFieldsModal\r\n // This is called AFTER all acknowledgements are processed and state has been updated\r\n // We use updateFieldIndicatorRef.current to always get the LATEST updateFieldIndicator\r\n // with fresh closures, avoiding stale state issues regardless of callback recreation timing\r\n const handleBulkAcknowledgementComplete = useCallback((fieldIds: string[]) => {\r\n logger.info(`[BULK ACK COMPLETE] Refreshing indicators for ${fieldIds.length} fields:`, fieldIds);\r\n\r\n // Update indicators for all acknowledged fields using the ref to get latest function\r\n fieldIds.forEach(fieldId => {\r\n updateFieldIndicatorRef.current(fieldId);\r\n });\r\n\r\n // Also update the main signature/initials fields if any signature or initials fields were acknowledged\r\n const hasSignatureFields = fieldIds.some(id => {\r\n const field = filteredFields.find(f => f.id === id);\r\n return field?.type === 'signature';\r\n });\r\n const hasInitialsFields = fieldIds.some(id => {\r\n const field = filteredFields.find(f => f.id === id);\r\n return field?.type === 'initials';\r\n });\r\n\r\n if (hasSignatureFields) {\r\n updateFieldIndicatorRef.current('signature_field_main');\r\n }\r\n if (hasInitialsFields) {\r\n updateFieldIndicatorRef.current('initials_field_main');\r\n }\r\n }, [filteredFields]);\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 // If a field was cleared in PDF View, pdfFieldValues has \"\" but React state\r\n // may still hold the stale seeded default. Override so validation catches it.\r\n // BUT: skip the override if the user re-filled the field in Form View —\r\n // detected via touched state (setFieldValue marks fields as touched).\r\n const currentTouched = touchedRef.current;\r\n for (const [fieldId, pdfVal] of Object.entries(pdfFieldValues)) {\r\n if (pdfVal === '') {\r\n const reactVal = currentFieldValues[fieldId];\r\n const fieldTouched = currentTouched[fieldId] || false;\r\n // Override when: React is empty, OR the field was never touched in Form View\r\n // (meaning React still holds the stale seeded default).\r\n if (!reactVal || reactVal.trim() === '' || !fieldTouched) {\r\n allFieldValues[fieldId] = '';\r\n }\r\n }\r\n }\r\n\r\n // CRITICAL: Merge signatures (including auto-filled initials) into allFieldValues\r\n // This ensures validation can find initials that were auto-filled into signaturesRef.current\r\n console.log('[VALIDATION] === MERGING SIGNATURES INTO allFieldValues ===');\r\n console.log('[VALIDATION] currentSignatures:', currentSignatures);\r\n for (const [fieldId, signatureValue] of Object.entries(currentSignatures)) {\r\n if (signatureValue) {\r\n allFieldValues[fieldId] = signatureValue;\r\n console.log('[VALIDATION] Merged signature for field:', fieldId, '(truncated):', signatureValue.substring(0, 50));\r\n }\r\n }\r\n console.log('[VALIDATION] allFieldValues after merge has', Object.keys(allFieldValues).length, 'entries');\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 validationErrors.push(\r\n `${getFieldDisplayName(field)}: 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(`${getFieldDisplayName(field)} 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 console.log('[VALIDATION] === VALIDATING INITIALS FIELDS ===');\r\n console.log('[VALIDATION] Found', initialsFields.length, 'initials fields');\r\n for (const field of initialsFields) {\r\n if (field.required) {\r\n const value = allFieldValues[field.id]; // Use merged values (now includes signatures!)\r\n console.log('[VALIDATION] Checking field:', field.id, 'Label:', field.label);\r\n console.log('[VALIDATION] Value from allFieldValues:', value ? '(found, truncated): ' + value.substring(0, 50) : '(MISSING)');\r\n if (!value || value.trim() === '') {\r\n console.log('[VALIDATION] ERROR: Field is required but missing!');\r\n validationErrors.push(`${getFieldDisplayName(field)} is required`);\r\n } else {\r\n console.log('[VALIDATION] OK: Field has value');\r\n }\r\n }\r\n }\r\n\r\n // Validate required fields against merged values (allFieldValues).\r\n // This catches pre-filled fields cleared in PDF View that the React-state-based\r\n // validateFields() misses (the change listener may not propagate clears to React).\r\n const alreadyCheckedTypes = new Set(['date', 'signature', 'initials']);\r\n for (const field of filteredFields) {\r\n if (!field.required || alreadyCheckedTypes.has(field.type)) continue;\r\n if (field.id === 'signature_field_main' || field.id === 'initials_field_main') continue;\r\n const value = allFieldValues[field.id];\r\n if (!value || (typeof value === 'string' && value.trim() === '')) {\r\n validationErrors.push(`${getFieldDisplayName(field)} is required`);\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 // Validate acknowledgements - all fields with acknowledgements must be fully acknowledged\r\n const unacknowledgedFields = getUnacknowledgedFields(filteredFields);\r\n if (unacknowledgedFields.length > 0) {\r\n // Open the unacknowledged fields modal instead of showing a text error\r\n setUnacknowledgedModalOpen(true);\r\n return false; // Stop validation and return invalid\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 // Auto-fill remaining signatures/initials IF all acknowledgements are complete\r\n // This improves UX by not requiring users to click every signature field\r\n // However, if ANY field has UNACKNOWLEDGED items, we disable auto-fill to ensure\r\n // users explicitly interact with each field and see acknowledgements\r\n const hasUnacknowledgedItems = hasUnacknowledgedFields(filteredFields);\r\n\r\n console.log('[SUBMIT] === ACKNOWLEDGEMENT CHECK ===');\r\n console.log('[SUBMIT] hasUnacknowledgedItems:', hasUnacknowledgedItems);\r\n console.log('[SUBMIT] Current signatures:', signaturesRef.current);\r\n console.log('[SUBMIT] Has collected signature:', hasCollectedSignature('signature'));\r\n console.log('[SUBMIT] Has collected initials:', hasCollectedSignature('initials'));\r\n\r\n if (!hasUnacknowledgedItems) {\r\n // Safe to auto-fill - no unacknowledged items remaining\r\n console.log('[SUBMIT] ✅ No unacknowledged items - proceeding with auto-fill');\r\n let filledCount = 0;\r\n const updatedSignatures = { ...signaturesRef.current };\r\n\r\n // Auto-fill signature fields if we have a collected signature\r\n if (hasCollectedSignature('signature')) {\r\n const collectedSig = getCollectedSignature('signature');\r\n console.log('[SUBMIT] Got collected signature:', !!collectedSig);\r\n if (collectedSig) {\r\n const emptySignatureFields = filteredFields.filter(\r\n field => field.type === 'signature' && !updatedSignatures[field.id]\r\n );\r\n console.log('[SUBMIT] Empty signature fields:', emptySignatureFields.length, emptySignatureFields.map(f => f.id));\r\n emptySignatureFields.forEach(field => {\r\n setSignature(field.id, collectedSig);\r\n updatedSignatures[field.id] = collectedSig; // Update local copy\r\n filledCount++;\r\n console.log(`[SUBMIT] ✅ Auto-filled signature for field ${field.id}`);\r\n });\r\n }\r\n }\r\n\r\n // Auto-fill initials fields\r\n // Check for collected canvas initials first, then fall back to text-based initials from main field\r\n let initialsValue = null;\r\n if (hasCollectedSignature('initials')) {\r\n initialsValue = getCollectedSignature('initials');\r\n console.log('[SUBMIT] Got collected canvas initials:', !!initialsValue);\r\n } else if (fieldValuesRef.current['initials_field_main']) {\r\n // Fall back to text-based initials from the main initials input field\r\n initialsValue = fieldValuesRef.current['initials_field_main'];\r\n console.log('[SUBMIT] Got text-based initials from field:', !!initialsValue, initialsValue);\r\n }\r\n\r\n if (initialsValue) {\r\n const emptyInitialsFields = filteredFields.filter(\r\n field => field.type === 'initials' && !updatedSignatures[field.id]\r\n );\r\n console.log('[SUBMIT] Empty initials fields:', emptyInitialsFields.length, emptyInitialsFields.map(f => f.id));\r\n emptyInitialsFields.forEach(field => {\r\n setSignature(field.id, initialsValue);\r\n updatedSignatures[field.id] = initialsValue; // Update local copy\r\n filledCount++;\r\n console.log(`[SUBMIT] ✅ Auto-filled initials for field ${field.id}`);\r\n });\r\n } else {\r\n console.log('[SUBMIT] ⚠️ No initials value found (neither canvas nor text-based)');\r\n }\r\n\r\n // CRITICAL: Manually update the ref immediately to avoid waiting for useEffect\r\n // This ensures validation sees the auto-filled values right away\r\n if (filledCount > 0) {\r\n console.log(`[SUBMIT] ✅ Auto-filled ${filledCount} fields total`);\r\n console.log('[SUBMIT] Final signatures:', updatedSignatures);\r\n signaturesRef.current = updatedSignatures;\r\n // Small delay to ensure setSignature state updates are queued\r\n await new Promise(resolve => setTimeout(resolve, 50));\r\n } else {\r\n console.log('[SUBMIT] ⚠️ No fields were auto-filled');\r\n }\r\n } else {\r\n console.log('[SUBMIT] ❌ Unacknowledged items present - auto-fill DISABLED');\r\n const unackFields = getUnacknowledgedFields(filteredFields);\r\n console.log('[SUBMIT] Unacknowledged fields:', unackFields.map(f => ({ id: f.id, label: f.label })));\r\n }\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 // Override with cleared PDF values (same logic as validateForm)\r\n const currentTouchedSubmit = touchedRef.current;\r\n for (const [fieldId, pdfVal] of Object.entries(pdfFieldValues)) {\r\n if (pdfVal === '') {\r\n const reactVal = currentFieldValues[fieldId];\r\n const fieldTouched = currentTouchedSubmit[fieldId] || false;\r\n if (!reactVal || reactVal.trim() === '' || !fieldTouched) {\r\n finalFieldValues[fieldId] = '';\r\n }\r\n }\r\n }\r\n\r\n // CRITICAL: Merge signatures (including auto-filled initials) into finalFieldValues\r\n // This ensures auto-filled initials are flattened to the PDF\r\n console.log('[SUBMIT] === MERGING SIGNATURES INTO finalFieldValues FOR FLATTENING ===');\r\n console.log('[SUBMIT] currentSignatures:', currentSignatures);\r\n for (const [fieldId, signatureValue] of Object.entries(currentSignatures)) {\r\n if (signatureValue) {\r\n finalFieldValues[fieldId] = signatureValue;\r\n console.log('[SUBMIT] Merged signature for field:', fieldId, '(truncated):', signatureValue.substring(0, 50));\r\n }\r\n }\r\n console.log('[SUBMIT] finalFieldValues after merge has', Object.keys(finalFieldValues).length, 'entries');\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 or generic values like \"on\" 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 generic value but PDF has a proper __RADIO_OPTION_INDEX_ value, use PDF value\r\n if (pdfValue && pdfValue.includes('__RADIO_OPTION_INDEX_')) {\r\n // Always prefer the properly formatted PDF value for radio buttons\r\n finalFieldValues[key] = pdfValue;\r\n logger.info(`[SUBMIT] Radio button ${key}: using PDF value \"${pdfValue}\" instead of React value \"${reactValue}\"`);\r\n } else if ((reactValue === 'true' || reactValue === 'false' || reactValue === 'on') &&\r\n pdfValue &&\r\n pdfValue !== 'true' &&\r\n pdfValue !== 'false' &&\r\n pdfValue !== 'on') {\r\n // Fallback: If React has a boolean/generic string but PDF has a proper value, use PDF value\r\n finalFieldValues[key] = pdfValue;\r\n logger.info(`[SUBMIT] Radio button ${key}: using PDF value \"${pdfValue}\" instead of generic React value \"${reactValue}\"`);\r\n }\r\n }\r\n }\r\n\r\n // Validate attachments if enabled\r\n if (enableAttachments) {\r\n if (attachments.length === 0) {\r\n setValidationErrors(['At least one attachment is required']);\r\n setIsSubmitting(false);\r\n return;\r\n }\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 console.log('[SUBMIT] === CALLING fillPdf ===');\r\n console.log('[SUBMIT] finalFieldValues keys:', Object.keys(finalFieldValues));\r\n console.log('[SUBMIT] finalFieldValues has initials_field_main:', !!finalFieldValues['initials_field_main']);\r\n console.log('[SUBMIT] Initials fields in finalFieldValues:', Object.keys(finalFieldValues).filter(k => k.toLowerCase().includes('initials')));\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 console.log('[SUBMIT] ✅ fillPdf completed');\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 filteredFields,\r\n hasCollectedSignature,\r\n getCollectedSignature,\r\n hasSignature,\r\n setSignature,\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 } else {\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\r\n // Check attachments if required\r\n if (enableAttachments && attachments.length === 0) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }, [filteredFields, fieldValues, hasSignature, showFullFieldsSidebar, enableAttachments, attachments]);\r\n\r\n return (\r\n <div className={cn('signiphi-pdf-signer flex flex-col gap-4 md:gap-6 h-full overflow-auto px-2 md:px-0', className)}>\r\n {/* Title and Instructions - Above everything */}\r\n {(documentTitle || signingInstructions || showPoweredBy) && (\r\n <div className=\"flex-shrink-0\">\r\n <div className=\"flex flex-col sm:flex-row items-start justify-between gap-3 sm:gap-4\">\r\n {documentTitle && (\r\n <h1 className=\"text-2xl sm:text-3xl md:text-4xl font-bold text-primary tracking-tight flex-1\">\r\n {documentTitle}\r\n </h1>\r\n )}\r\n {showPoweredBy && (\r\n <div className=\"flex-shrink-0\">\r\n <PoweredBySigniphi />\r\n </div>\r\n )}\r\n </div>\r\n {signingInstructions && (\r\n <div className=\"text-sm md:text-base text-muted-foreground\">\r\n <SigningInstructions html={signingInstructions} />\r\n </div>\r\n )}\r\n </div>\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 requiredFieldNavigation={{\r\n hasRequiredFields,\r\n currentRequiredIndex,\r\n requiredFieldCount,\r\n onNext: handleNextRequired,\r\n onPrevious: handlePreviousRequired,\r\n }}\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 isFieldFullyAcknowledged={isFieldFullyAcknowledged}\r\n onAcknowledgementRequired={handleAcknowledgementRequired}\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 || defaultSigningMessage}\r\n </CardDescription>\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 {/* Acknowledgements Sidebar - At the top */}\r\n <AcknowledgementsSidebar\r\n fields={filteredFields.filter(f => {\r\n // Show ALL fields with acknowledgements (including signature/initials)\r\n return f.acknowledgements && f.acknowledgements.length > 0;\r\n })}\r\n onAcknowledge={acknowledgeItem}\r\n isAcknowledged={isAcknowledged}\r\n getProgress={getFieldAcknowledgementProgress}\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 // NEVER show signature/initials fields in the regular sidebar\r\n // They are handled by SignatureInitialsBox and AcknowledgementsSidebar\r\n const isSignatureOrInitials = field.type === 'signature' || field.type === 'initials';\r\n if (isSignatureOrInitials) {\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 // Log rendering of signature/initials fields with acknowledgements\r\n if ((field.type === 'signature' || field.type === 'initials') &&\r\n field.acknowledgements && field.acknowledgements.length > 0) {\r\n console.log('[SUBMISSION FORM RENDER] Rendering field with acks:', {\r\n id: field.id,\r\n type: field.type,\r\n ackCount: field.acknowledgements.length,\r\n hasOnSignatureClick: typeof handleSignatureClick === 'function',\r\n hasOnAckRequired: typeof handleAcknowledgementRequired === 'function'\r\n });\r\n }\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 isFieldFullyAcknowledged={isFieldFullyAcknowledged}\r\n onAcknowledgementRequired={handleAcknowledgementRequired}\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 */}\r\n {enableAttachments && (\r\n <div className=\"mt-4 md:mt-6 mb-6 md:mb-8\">\r\n <div className=\"flex items-center gap-2 mb-2\">\r\n <span className=\"text-sm font-semibold text-foreground\">Attachments</span>\r\n <span className=\"text-xs font-medium text-destructive\">(Required)</span>\r\n </div>\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 constraints={attachmentConstraints}\r\n validationErrors={attachmentErrors.length > 0 ? attachmentErrors : undefined}\r\n onClearErrors={clearAttachmentErrors}\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\r\n </div>\r\n )}\r\n </Card>\r\n </div>\r\n\r\n {/* Signature Modal - FOR SIGNATURES ONLY */}\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 fieldLabel={currentSignatureField.label || currentSignatureField.name || 'Signature'}\r\n />\r\n )}\r\n\r\n {/* Initials Modal - FOR INITIALS ONLY */}\r\n {initialsModalOpen && currentInitialsField && (\r\n <InitialsModal\r\n isOpen={initialsModalOpen}\r\n onClose={() => {\r\n setInitialsModalOpen(false);\r\n setCurrentInitialsField(null);\r\n }}\r\n onSave={handleInitialsSave}\r\n fieldLabel={currentInitialsField.label || currentInitialsField.name || 'Initials'}\r\n />\r\n )}\r\n\r\n {/* Acknowledgement Modal */}\r\n <AcknowledgementModal\r\n open={acknowledgementModalOpen}\r\n onOpenChange={handleAcknowledgementModalOpenChange}\r\n field={currentAcknowledgementField}\r\n onAcknowledge={acknowledgeItem}\r\n isAcknowledged={isAcknowledged}\r\n onComplete={handleAcknowledgementComplete}\r\n />\r\n\r\n {/* Unacknowledged Fields Modal */}\r\n <UnacknowledgedFieldsModal\r\n open={unacknowledgedModalOpen}\r\n onOpenChange={setUnacknowledgedModalOpen}\r\n unacknowledgedFields={getUnacknowledgedFieldsDetailed(filteredFields).map(({ field, unacknowledgedItems }) => ({\r\n field,\r\n unacknowledgedCount: unacknowledgedItems.length,\r\n }))}\r\n onAcknowledge={acknowledgeItem}\r\n isAcknowledged={isAcknowledged}\r\n onComplete={handleBulkAcknowledgementComplete}\r\n />\r\n\r\n {/* Date Field Calendar Popup */}\r\n <DateFieldCalendarPopup\r\n open={dateCalendarOpen}\r\n onOpenChange={setDateCalendarOpen}\r\n value={currentDateField ? (fieldValues[currentDateField.id] || '') : ''}\r\n onSelect={handleDateSelect}\r\n fieldPosition={dateFieldPosition}\r\n fieldLabel={currentDateField?.label || currentDateField?.name}\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"]}
|