@signiphi/pdf-compose 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4966 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4930 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles/index.css +2366 -0
- package/package.json +92 -0
- package/src/styles/index.css +229 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/components/FieldNodeView.tsx","../src/extensions/field-node.ts","../src/components/VariableNodeView.tsx","../src/extensions/variable-node.ts","../src/types/index.ts","../src/utils/field-helpers.ts","../src/utils/variable-helpers.ts","../src/utils/markdown-writer.ts","../src/utils/markdown-parser.ts","../src/utils/error-helpers.ts","../src/utils/pdf-metadata.ts","../src/utils/pdf-generator.ts","../src/utils/pdf-preview.ts","../src/hooks/useDocumentGenerator.ts","../src/lib/ui/button.tsx","../src/lib/ui/tooltip.tsx","../src/components/EditorToolbar.tsx","../src/lib/ui/popover.tsx","../src/lib/ui/input.tsx","../src/lib/ui/label.tsx","../src/components/FieldInsertPopover.tsx","../src/components/FieldEditPopover.tsx","../src/components/VariableInsertPopover.tsx","../src/components/VariableEditPopover.tsx","../src/components/FieldOverlay.tsx","../src/components/PreviewPanel.tsx","../src/utils/markdown-validator.ts","../src/lib/ui/toggle-group.tsx","../src/components/GeneratePanel.tsx","../src/utils/theme-helpers.ts","../src/contexts/ThemeContext.tsx","../src/components/ErrorBoundary.tsx","../src/components/DocumentGenerator.tsx","../src/components/EditorPanel.tsx"],"names":["twMerge","clsx","Type","PenTool","Hash","Calendar","CheckSquare","Circle","ChevronDown","FileText","useCallback","jsx","NodeViewWrapper","jsxs","Node","mergeAttributes","ReactNodeViewRenderer","Braces","FormFieldType","uuidv4","rgb","StandardFonts","PDFName","PDFString","PDFDocument","useState","useRef","useEditor","StarterKit","Underline","TextAlign","Placeholder","useEffect","cva","React2","Slot","TooltipPrimitive","React3","NodeSelection","Fragment","PanelLeftClose","Undo","Redo","Bold","Italic","UnderlineIcon","Code","Heading1","Heading2","Heading3","List","ListOrdered","Quote","Minus","AlignLeft","AlignCenter","AlignRight","PopoverPrimitive","React5","React6","React7","LabelPrimitive","ChevronRight","X","Plus","Trash2","useMemo","ChevronLeft","ZoomOut","ZoomIn","Maximize2","Loader2","React","PenLine","Upload","AlertTriangle","WrapText","CheckCircle2","RefreshCw","Download","createContext","useContext","EditorContent","PanelLeftOpen","FileDown"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","import React, { useCallback } from 'react';\r\nimport { NodeViewWrapper } from '@tiptap/react';\r\nimport type { NodeViewProps } from '@tiptap/react';\r\nimport {\r\n Type,\r\n PenTool,\r\n Hash,\r\n Calendar,\r\n CheckSquare,\r\n Circle,\r\n ChevronDown,\r\n FileText,\r\n} from 'lucide-react';\r\nimport { cn } from '../lib/utils';\r\n\r\nconst FIELD_TYPE_CONFIG: Record<string, { icon: React.ElementType; color: string; label: string }> = {\r\n text: { icon: Type, color: 'bg-blue-100 text-blue-700 border-blue-300', label: 'Text' },\r\n signature: { icon: PenTool, color: 'bg-purple-100 text-purple-700 border-purple-300', label: 'Signature' },\r\n initials: { icon: Hash, color: 'bg-green-100 text-green-700 border-green-300', label: 'Initials' },\r\n date: { icon: Calendar, color: 'bg-amber-100 text-amber-700 border-amber-300', label: 'Date' },\r\n checkbox: { icon: CheckSquare, color: 'bg-teal-100 text-teal-700 border-teal-300', label: 'Checkbox' },\r\n radio: { icon: Circle, color: 'bg-pink-100 text-pink-700 border-pink-300', label: 'Radio' },\r\n dropdown: { icon: ChevronDown, color: 'bg-indigo-100 text-indigo-700 border-indigo-300', label: 'Dropdown' },\r\n text_label: { icon: FileText, color: 'bg-gray-100 text-gray-700 border-gray-300', label: 'Label' },\r\n};\r\n\r\nexport function FieldNodeView({ node, selected, getPos, editor }: NodeViewProps) {\r\n const { fieldType, fieldLabel, fieldName, required } = node.attrs;\r\n const config = FIELD_TYPE_CONFIG[fieldType] || FIELD_TYPE_CONFIG.text;\r\n const Icon = config.icon;\r\n\r\n const handleDoubleClick = useCallback((e: React.MouseEvent) => {\r\n const pos = typeof getPos === 'function' ? getPos() : null;\r\n if (pos !== null && pos !== undefined) {\r\n editor.commands.setNodeSelection(pos);\r\n const event = new CustomEvent('signiphi:edit-field', {\r\n detail: { fieldId: node.attrs.fieldId, pos, anchorEl: e.currentTarget },\r\n });\r\n window.dispatchEvent(event);\r\n }\r\n }, [editor, getPos, node.attrs.fieldId]);\r\n\r\n return (\r\n <NodeViewWrapper as=\"span\" className=\"inline\">\r\n <span\r\n className={cn(\r\n 'inline-flex items-center gap-1 px-2 py-0.5 rounded-md border text-xs font-medium',\r\n 'cursor-pointer select-none align-baseline',\r\n config.color,\r\n selected && 'ring-2 ring-primary ring-offset-1'\r\n )}\r\n onDoubleClick={handleDoubleClick}\r\n title={`${config.label}: ${fieldLabel || fieldName}${required ? ' (required)' : ''}`}\r\n >\r\n <Icon size={12} />\r\n <span>{fieldLabel || fieldName}</span>\r\n {required && <span className=\"text-red-500\">*</span>}\r\n </span>\r\n </NodeViewWrapper>\r\n );\r\n}\r\n","import { Node, mergeAttributes } from '@tiptap/core';\r\nimport { ReactNodeViewRenderer } from '@tiptap/react';\r\nimport { FieldNodeView } from '../components/FieldNodeView';\r\n\r\nexport interface FieldNodeAttributes {\r\n fieldId: string;\r\n fieldType: string;\r\n fieldName: string;\r\n fieldLabel: string;\r\n required: boolean;\r\n options: string;\r\n placeholder: string;\r\n fontSize: number | null;\r\n defaultValue: string;\r\n multiline: boolean;\r\n maxLength: number | null;\r\n acknowledgements: string;\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n fieldNode: {\r\n insertField: (attrs: Partial<FieldNodeAttributes> & {\r\n fieldId: string;\r\n fieldType: string;\r\n fieldName: string;\r\n fieldLabel: string;\r\n }) => ReturnType;\r\n updateField: (fieldId: string, attrs: Partial<FieldNodeAttributes>) => ReturnType;\r\n removeField: (fieldId: string) => ReturnType;\r\n };\r\n }\r\n}\r\n\r\nexport const FieldNode = Node.create({\r\n name: 'fieldNode',\r\n group: 'inline',\r\n inline: true,\r\n atom: true,\r\n selectable: true,\r\n draggable: false,\r\n\r\n addAttributes() {\r\n return {\r\n fieldId: { default: '' },\r\n fieldType: { default: 'text' },\r\n fieldName: { default: '' },\r\n fieldLabel: { default: '' },\r\n required: { default: false },\r\n options: { default: '' },\r\n placeholder: { default: '' },\r\n fontSize: { default: null },\r\n defaultValue: { default: '' },\r\n multiline: { default: false },\r\n maxLength: { default: null },\r\n acknowledgements: { default: '' },\r\n };\r\n },\r\n\r\n parseHTML() {\r\n return [{ tag: 'span[data-field-node]' }];\r\n },\r\n\r\n renderHTML({ HTMLAttributes }) {\r\n return ['span', mergeAttributes({ 'data-field-node': '' }, HTMLAttributes)];\r\n },\r\n\r\n addNodeView() {\r\n return ReactNodeViewRenderer(FieldNodeView);\r\n },\r\n\r\n addCommands() {\r\n return {\r\n insertField:\r\n (attrs) =>\r\n ({ chain }) => {\r\n return chain()\r\n .insertContent({\r\n type: this.name,\r\n attrs,\r\n })\r\n .run();\r\n },\r\n\r\n updateField:\r\n (fieldId, attrs) =>\r\n ({ tr, state, dispatch }) => {\r\n let found = false;\r\n state.doc.descendants((node, pos) => {\r\n if (node.type.name === this.name && node.attrs.fieldId === fieldId) {\r\n if (dispatch) {\r\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, ...attrs });\r\n }\r\n found = true;\r\n return false;\r\n }\r\n });\r\n return found;\r\n },\r\n\r\n removeField:\r\n (fieldId) =>\r\n ({ tr, state, dispatch }) => {\r\n let found = false;\r\n state.doc.descendants((node, pos) => {\r\n if (node.type.name === this.name && node.attrs.fieldId === fieldId) {\r\n if (dispatch) {\r\n tr.delete(pos, pos + node.nodeSize);\r\n }\r\n found = true;\r\n return false;\r\n }\r\n });\r\n return found;\r\n },\r\n };\r\n },\r\n\r\n addKeyboardShortcuts() {\r\n return {\r\n Backspace: ({ editor }) => {\r\n const { state } = editor;\r\n const { $from } = state.selection;\r\n if (state.selection.empty && $from.nodeBefore?.type.name === this.name) {\r\n return editor.commands.deleteRange({\r\n from: $from.pos - $from.nodeBefore.nodeSize,\r\n to: $from.pos,\r\n });\r\n }\r\n return false;\r\n },\r\n };\r\n },\r\n});\r\n","import { useCallback } from 'react';\r\nimport { NodeViewWrapper } from '@tiptap/react';\r\nimport type { NodeViewProps } from '@tiptap/react';\r\nimport { Braces } from 'lucide-react';\r\nimport { cn } from '../lib/utils';\r\n\r\nexport function VariableNodeView({ node, selected, getPos, editor }: NodeViewProps) {\r\n const { varName, varLabel, varDefault } = node.attrs;\r\n\r\n // Derive styling from marks\r\n const marks = node.marks || [];\r\n const isBold = marks.some((m: { type: { name: string } }) => m.type.name === 'bold');\r\n const isItalic = marks.some((m: { type: { name: string } }) => m.type.name === 'italic');\r\n const isUnderline = marks.some((m: { type: { name: string } }) => m.type.name === 'underline');\r\n\r\n const handleDoubleClick = useCallback((e: React.MouseEvent) => {\r\n const pos = typeof getPos === 'function' ? getPos() : null;\r\n if (pos !== null && pos !== undefined) {\r\n editor.commands.setNodeSelection(pos);\r\n const event = new CustomEvent('signiphi:edit-variable', {\r\n detail: { varName, pos, anchorEl: e.currentTarget },\r\n });\r\n window.dispatchEvent(event);\r\n }\r\n }, [editor, getPos, varName]);\r\n\r\n return (\r\n <NodeViewWrapper as=\"span\" className=\"inline\">\r\n <span\r\n data-variable-node=\"\"\r\n data-var-name={varName}\r\n className={cn(\r\n 'inline-flex items-center gap-1 px-2 py-0.5 rounded-md border text-xs font-medium',\r\n 'cursor-pointer select-none align-baseline',\r\n 'bg-orange-100 text-orange-700 border-orange-300',\r\n selected && 'ring-2 ring-primary ring-offset-1'\r\n )}\r\n onDoubleClick={handleDoubleClick}\r\n title={`Variable: ${varLabel || varName}${varDefault ? ` (default: ${varDefault})` : ''}`}\r\n >\r\n <Braces size={12} />\r\n <span\r\n className={cn(\r\n isBold && 'font-bold',\r\n isItalic && 'italic',\r\n isUnderline && 'underline',\r\n )}\r\n >\r\n {varLabel || varName}\r\n </span>\r\n </span>\r\n </NodeViewWrapper>\r\n );\r\n}\r\n","import { Node, mergeAttributes } from '@tiptap/core';\r\nimport { ReactNodeViewRenderer } from '@tiptap/react';\r\nimport { VariableNodeView } from '../components/VariableNodeView';\r\n\r\nexport interface VariableNodeAttributes {\r\n varName: string;\r\n varLabel: string;\r\n varDefault: string;\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n interface Commands<ReturnType> {\r\n variableNode: {\r\n insertVariable: (attrs: VariableNodeAttributes) => ReturnType;\r\n updateVariable: (varName: string, attrs: Partial<VariableNodeAttributes>) => ReturnType;\r\n removeVariable: (varName: string) => ReturnType;\r\n };\r\n }\r\n}\r\n\r\nexport const VariableNode = Node.create({\r\n name: 'variableNode',\r\n group: 'inline',\r\n inline: true,\r\n atom: true,\r\n selectable: true,\r\n draggable: false,\r\n\r\n addAttributes() {\r\n return {\r\n varName: { default: '' },\r\n varLabel: { default: '' },\r\n varDefault: { default: '' },\r\n };\r\n },\r\n\r\n parseHTML() {\r\n return [{ tag: 'span[data-variable-node]' }];\r\n },\r\n\r\n renderHTML({ HTMLAttributes }) {\r\n return ['span', mergeAttributes({ 'data-variable-node': '' }, HTMLAttributes)];\r\n },\r\n\r\n addNodeView() {\r\n return ReactNodeViewRenderer(VariableNodeView);\r\n },\r\n\r\n addCommands() {\r\n return {\r\n insertVariable:\r\n (attrs) =>\r\n ({ chain }) => {\r\n return chain()\r\n .insertContent({ type: this.name, attrs })\r\n .run();\r\n },\r\n\r\n updateVariable:\r\n (varName, attrs) =>\r\n ({ tr, state, dispatch }) => {\r\n let found = false;\r\n state.doc.descendants((node, pos) => {\r\n if (node.type.name === this.name && node.attrs.varName === varName) {\r\n if (dispatch) {\r\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, ...attrs });\r\n }\r\n found = true;\r\n }\r\n });\r\n return found;\r\n },\r\n\r\n removeVariable:\r\n (varName) =>\r\n ({ tr, state, dispatch }) => {\r\n // Collect all positions first, then delete in reverse order\r\n const positions: number[] = [];\r\n state.doc.descendants((node, pos) => {\r\n if (node.type.name === this.name && node.attrs.varName === varName) {\r\n positions.push(pos);\r\n }\r\n });\r\n if (positions.length === 0) return false;\r\n if (dispatch) {\r\n // Delete in reverse to preserve positions\r\n for (let i = positions.length - 1; i >= 0; i--) {\r\n const pos = positions[i];\r\n const node = state.doc.nodeAt(pos);\r\n if (node) {\r\n tr.delete(pos, pos + node.nodeSize);\r\n }\r\n }\r\n }\r\n return true;\r\n },\r\n };\r\n },\r\n\r\n addKeyboardShortcuts() {\r\n return {\r\n Backspace: ({ editor }) => {\r\n const { state } = editor;\r\n const { $from } = state.selection;\r\n if (state.selection.empty && $from.nodeBefore?.type.name === this.name) {\r\n return editor.commands.deleteRange({\r\n from: $from.pos - $from.nodeBefore.nodeSize,\r\n to: $from.pos,\r\n });\r\n }\r\n return false;\r\n },\r\n };\r\n },\r\n});\r\n","import type { JSONContent } from '@tiptap/core';\r\n\r\n/**\r\n * Acknowledgement for form fields — matching @signiphi/document-prepare\r\n */\r\nexport interface Acknowledgement {\r\n id: string;\r\n title: string;\r\n description: string;\r\n}\r\n\r\n/**\r\n * Form field types — same values as @signiphi/document-prepare for compatibility\r\n */\r\nexport enum FormFieldType {\r\n TEXT = 'text',\r\n SIGNATURE = 'signature',\r\n INITIALS = 'initials',\r\n DATE = 'date',\r\n CHECKBOX = 'checkbox',\r\n RADIO = 'radio',\r\n DROPDOWN = 'dropdown',\r\n TEXT_LABEL = 'text_label',\r\n}\r\n\r\n/**\r\n * Position and dimensions of a form field on a PDF page\r\n */\r\nexport interface FormFieldPosition {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n page: number; // 1-indexed\r\n}\r\n\r\n/**\r\n * Field as it exists in the editor — no position (computed during PDF generation)\r\n */\r\nexport interface DocumentGeneratorField {\r\n fieldId: string;\r\n type: FormFieldType;\r\n name: string;\r\n label: string;\r\n required: boolean;\r\n options?: string[];\r\n placeholder?: string;\r\n fontSize?: number;\r\n defaultValue?: string;\r\n multiline?: boolean;\r\n maxLength?: number;\r\n acknowledgements?: Acknowledgement[];\r\n}\r\n\r\n/**\r\n * Full document model for save/load\r\n */\r\nexport interface GeneratedDocument {\r\n title: string;\r\n markdown: string;\r\n editorContent: JSONContent;\r\n fields: DocumentGeneratorField[];\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\n/**\r\n * Field with computed position for PDF embedding.\r\n * Compatible with @signiphi/document-prepare's FormField interface.\r\n */\r\nexport interface FormFieldForExport {\r\n id: string;\r\n fieldId: string;\r\n type: FormFieldType;\r\n name: string;\r\n label: string;\r\n position: FormFieldPosition;\r\n required: boolean;\r\n options?: string[];\r\n placeholder?: string;\r\n fontSize?: number;\r\n defaultValue?: string;\r\n multiline?: boolean;\r\n maxLength?: number;\r\n acknowledgements?: Acknowledgement[];\r\n}\r\n\r\n/**\r\n * Export result — same shape as document-prepare's PreparedDocument\r\n */\r\nexport interface DocumentGeneratorExportResult {\r\n pdfBlob: Blob;\r\n fields: FormFieldForExport[];\r\n markdown: string;\r\n}\r\n\r\n/**\r\n * Template variable as it exists in the editor\r\n */\r\nexport interface DocumentGeneratorVariable {\r\n varName: string;\r\n varLabel: string;\r\n varDefault: string;\r\n}\r\n\r\n/**\r\n * Variable values mapping: varName → user-supplied value\r\n */\r\nexport type VariableValues = Record<string, string>;\r\n\r\n/**\r\n * PDF page information with rendered image\r\n */\r\nexport interface PdfPage {\r\n pageNumber: number;\r\n width: number;\r\n height: number;\r\n imageUrl: string;\r\n}\r\n\r\n/**\r\n * Theme mode options\r\n */\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n/**\r\n * Advanced theme configuration\r\n */\r\nexport interface ThemeConfig {\r\n primary?: string;\r\n primaryForeground?: string;\r\n background?: string;\r\n foreground?: string;\r\n secondary?: string;\r\n secondaryForeground?: string;\r\n muted?: string;\r\n mutedForeground?: string;\r\n accent?: string;\r\n accentForeground?: string;\r\n border?: string;\r\n input?: string;\r\n ring?: string;\r\n card?: string;\r\n cardForeground?: string;\r\n}\r\n\r\n/**\r\n * DocumentGenerator component props\r\n */\r\nexport interface DocumentGeneratorProps {\r\n /** Initial markdown content with field tokens */\r\n initialMarkdown?: string;\r\n /** Initial TipTap JSON content (takes precedence over initialMarkdown) */\r\n initialContent?: JSONContent;\r\n /** Called whenever the content changes (debounced) */\r\n onChange?: (data: {\r\n markdown: string;\r\n content: JSONContent;\r\n fields: DocumentGeneratorField[];\r\n variables: DocumentGeneratorVariable[];\r\n }) => void;\r\n /** Called when user triggers export */\r\n onExport?: (result: DocumentGeneratorExportResult) => void;\r\n /** Whether the component is in read-only mode */\r\n readOnly?: boolean;\r\n /** Custom class name */\r\n className?: string;\r\n /** Theme color (hex) */\r\n themeColor?: string;\r\n /** Theme mode */\r\n themeMode?: ThemeMode;\r\n /** Advanced theme configuration */\r\n themeConfig?: ThemeConfig;\r\n /** Whether to show the preview panel. Default: true */\r\n showPreview?: boolean;\r\n /** Placeholder text for the editor */\r\n placeholder?: string;\r\n /** Custom export button text. Default: 'Export Document' */\r\n exportButtonText?: string;\r\n /** Whether to show the toolbar. Default: true */\r\n showToolbar?: boolean;\r\n /** Whether to show the Generate tab. Default: true */\r\n showGenerateTab?: boolean;\r\n /** Called when user generates PDF(s) from the Generate tab */\r\n onGeneratePdf?: (blob: Blob, fileName: string) => void;\r\n /** Pre-filled bulk data for the Generate tab (array of variable-value objects) */\r\n initialBulkData?: Record<string, string>[];\r\n}\r\n","import { v4 as uuidv4 } from 'uuid';\r\nimport { FormFieldType, type Acknowledgement, type DocumentGeneratorField } from '../types';\r\nimport type { FieldNodeAttributes } from '../extensions/field-node';\r\nimport type { JSONContent } from '@tiptap/core';\r\n\r\n/**\r\n * Default field dimensions in PDF points for each field type\r\n */\r\n/**\r\n * Default field dimensions matching document-prepare (PdfViewerWithFields.tsx:423-441)\r\n */\r\nexport const DEFAULT_FIELD_DIMENSIONS: Record<FormFieldType, { width: number; height: number }> = {\r\n [FormFieldType.TEXT]: { width: 120, height: 30 },\r\n [FormFieldType.SIGNATURE]: { width: 200, height: 60 },\r\n [FormFieldType.INITIALS]: { width: 120, height: 30 },\r\n [FormFieldType.DATE]: { width: 100, height: 30 },\r\n [FormFieldType.CHECKBOX]: { width: 20, height: 20 },\r\n [FormFieldType.RADIO]: { width: 100, height: 88 },\r\n [FormFieldType.DROPDOWN]: { width: 120, height: 30 },\r\n [FormFieldType.TEXT_LABEL]: { width: 150, height: 25 },\r\n};\r\n\r\n/**\r\n * Generate a unique field name from type and timestamp (matches document-prepare pattern)\r\n */\r\nexport function generateFieldName(type: FormFieldType): string {\r\n return `${type}_${Date.now()}`;\r\n}\r\n\r\n/**\r\n * Create default field node attributes for a given type.\r\n * Smart defaults per type match document-prepare's PdfViewerWithFields.tsx:474-495\r\n */\r\nexport function createFieldAttrs(\r\n type: FormFieldType,\r\n overrides?: Partial<FieldNodeAttributes>\r\n): FieldNodeAttributes {\r\n const name = overrides?.fieldName || generateFieldName(type);\r\n\r\n // Smart defaults per type\r\n let defaultOptions = '';\r\n let defaultFontSize: number | null = null;\r\n let defaultMultiline = false;\r\n let defaultDefaultValue = '';\r\n\r\n if (type === FormFieldType.RADIO || type === FormFieldType.DROPDOWN) {\r\n defaultOptions = 'Option A,Option B,Option C';\r\n }\r\n if (type === FormFieldType.TEXT || type === FormFieldType.TEXT_LABEL) {\r\n defaultFontSize = 12;\r\n }\r\n if (type === FormFieldType.TEXT) {\r\n defaultMultiline = false;\r\n }\r\n if (type === FormFieldType.TEXT_LABEL) {\r\n defaultDefaultValue = 'Text Label';\r\n }\r\n\r\n return {\r\n fieldId: uuidv4(),\r\n fieldType: type,\r\n fieldName: name,\r\n fieldLabel: overrides?.fieldLabel || '',\r\n required: overrides?.required ?? false,\r\n options: overrides?.options || defaultOptions,\r\n placeholder: overrides?.placeholder || '',\r\n fontSize: overrides?.fontSize ?? defaultFontSize,\r\n defaultValue: overrides?.defaultValue || defaultDefaultValue,\r\n multiline: overrides?.multiline ?? defaultMultiline,\r\n maxLength: overrides?.maxLength ?? null,\r\n acknowledgements: overrides?.acknowledgements ?? '',\r\n ...overrides,\r\n };\r\n}\r\n\r\n/**\r\n * Extract all DocumentGeneratorField instances from TipTap JSON content\r\n */\r\nexport function extractFieldsFromContent(content: JSONContent): DocumentGeneratorField[] {\r\n const fields: DocumentGeneratorField[] = [];\r\n\r\n function walk(node: JSONContent) {\r\n if (node.type === 'fieldNode' && node.attrs) {\r\n fields.push({\r\n fieldId: node.attrs.fieldId,\r\n type: node.attrs.fieldType as FormFieldType,\r\n name: node.attrs.fieldName,\r\n label: node.attrs.fieldLabel,\r\n required: node.attrs.required ?? false,\r\n options: node.attrs.options\r\n ? node.attrs.options.split(',').map((s: string) => s.trim()).filter(Boolean)\r\n : undefined,\r\n placeholder: node.attrs.placeholder || undefined,\r\n fontSize: node.attrs.fontSize || undefined,\r\n defaultValue: node.attrs.defaultValue || undefined,\r\n multiline: node.attrs.multiline || undefined,\r\n maxLength: node.attrs.maxLength || undefined,\r\n acknowledgements: node.attrs.acknowledgements\r\n ? JSON.parse(node.attrs.acknowledgements) as Acknowledgement[]\r\n : undefined,\r\n });\r\n }\r\n if (node.content) {\r\n node.content.forEach(walk);\r\n }\r\n }\r\n\r\n if (content.content) {\r\n content.content.forEach(walk);\r\n }\r\n return fields;\r\n}\r\n\r\n/**\r\n * Get all existing field names from content\r\n */\r\nexport function getExistingFieldNames(content: JSONContent): string[] {\r\n return extractFieldsFromContent(content).map(f => f.name);\r\n}\r\n","import type { JSONContent } from '@tiptap/core';\r\nimport type { DocumentGeneratorVariable } from '../types';\r\n\r\n/**\r\n * Extract all unique variables from TipTap content.\r\n * Deduplicates by varName (same name = same variable).\r\n */\r\nexport function extractVariablesFromContent(content: JSONContent): DocumentGeneratorVariable[] {\r\n const seen = new Map<string, DocumentGeneratorVariable>();\r\n\r\n function walk(node: JSONContent) {\r\n if (node.type === 'variableNode' && node.attrs) {\r\n const varName = node.attrs.varName as string;\r\n if (varName && !seen.has(varName)) {\r\n seen.set(varName, {\r\n varName,\r\n varLabel: (node.attrs.varLabel as string) || varName,\r\n varDefault: (node.attrs.varDefault as string) || '',\r\n });\r\n }\r\n }\r\n if (node.content) {\r\n node.content.forEach(walk);\r\n }\r\n }\r\n\r\n if (content.content) {\r\n content.content.forEach(walk);\r\n }\r\n return Array.from(seen.values());\r\n}\r\n\r\n/**\r\n * Replace variable nodes in TipTap content with plain text nodes.\r\n * Returns a new content tree (does not mutate the input).\r\n */\r\nexport function replaceVariablesInContent(\r\n content: JSONContent,\r\n values: Record<string, string>,\r\n): JSONContent {\r\n function walkNode(node: JSONContent): JSONContent {\r\n if (node.type === 'variableNode' && node.attrs) {\r\n const varName = node.attrs.varName as string;\r\n const replacement = values[varName]\r\n || (node.attrs.varDefault as string)\r\n || `[${(node.attrs.varLabel as string) || varName}]`;\r\n const textNode: JSONContent = { type: 'text', text: replacement };\r\n if (node.marks && node.marks.length > 0) {\r\n textNode.marks = node.marks;\r\n }\r\n return textNode;\r\n }\r\n if (node.content) {\r\n return { ...node, content: node.content.map(walkNode) };\r\n }\r\n return node;\r\n }\r\n return walkNode(content);\r\n}\r\n\r\n/**\r\n * Auto-generate a snake_case variable name from a label.\r\n */\r\nexport function labelToVarName(label: string): string {\r\n return label\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, '_')\r\n .replace(/^_|_$/g, '');\r\n}\r\n","import type { JSONContent } from '@tiptap/core';\r\n\r\n/**\r\n * Serialize a field node's attributes into the {{field|...}} token syntax.\r\n */\r\nfunction serializeFieldToken(attrs: Record<string, unknown>): string {\r\n const parts = ['field'];\r\n if (attrs.fieldType) parts.push(`type:${attrs.fieldType}`);\r\n if (attrs.fieldName) parts.push(`name:${attrs.fieldName}`);\r\n if (attrs.fieldLabel) parts.push(`label:${attrs.fieldLabel}`);\r\n if (attrs.fieldId) parts.push(`id:${attrs.fieldId}`);\r\n if (attrs.required) parts.push(`required:true`);\r\n if (attrs.options) parts.push(`options:${attrs.options}`);\r\n if (attrs.fontSize) parts.push(`fontSize:${attrs.fontSize}`);\r\n if (attrs.placeholder) parts.push(`placeholder:${attrs.placeholder}`);\r\n if (attrs.defaultValue) parts.push(`defaultValue:${attrs.defaultValue}`);\r\n if (attrs.multiline) parts.push(`multiline:true`);\r\n if (attrs.maxLength) parts.push(`maxLength:${attrs.maxLength}`);\r\n if (attrs.acknowledgements) parts.push(`acks:${btoa(attrs.acknowledgements as string)}`);\r\n return `{{${parts.join('|')}}}`;\r\n}\r\n\r\n/**\r\n * Serialize a variable node's attributes into the {{var|...}} token syntax.\r\n */\r\nfunction serializeVariableToken(attrs: Record<string, unknown>): string {\r\n const parts = ['var'];\r\n if (attrs.varName) parts.push(`name:${attrs.varName}`);\r\n if (attrs.varLabel) parts.push(`label:${attrs.varLabel}`);\r\n if (attrs.varDefault) parts.push(`default:${attrs.varDefault}`);\r\n return `{{${parts.join('|')}}}`;\r\n}\r\n\r\n/**\r\n * Serialize inline content (text nodes, marks, field nodes, variable nodes) to markdown string.\r\n */\r\nfunction serializeInline(content: JSONContent[] | undefined): string {\r\n if (!content) return '';\r\n let result = '';\r\n\r\n for (const node of content) {\r\n if (node.type === 'fieldNode') {\r\n result += serializeFieldToken(node.attrs || {});\r\n continue;\r\n }\r\n\r\n if (node.type === 'variableNode') {\r\n let token = serializeVariableToken(node.attrs || {});\r\n const varMarks = node.marks || [];\r\n const isBold = varMarks.some((m: { type: string }) => m.type === 'bold');\r\n const isItalic = varMarks.some((m: { type: string }) => m.type === 'italic');\r\n const isUnderline = varMarks.some((m: { type: string }) => m.type === 'underline');\r\n\r\n if (isBold && isItalic) token = `***${token}***`;\r\n else if (isBold) token = `**${token}**`;\r\n else if (isItalic) token = `*${token}*`;\r\n if (isUnderline) token = `__${token}__`;\r\n\r\n result += token;\r\n continue;\r\n }\r\n\r\n if (node.type === 'text') {\r\n let text = node.text || '';\r\n const marks = node.marks || [];\r\n\r\n // Apply marks (bold, italic, underline, code)\r\n for (const mark of marks) {\r\n if (mark.type === 'bold') text = `**${text}**`;\r\n else if (mark.type === 'italic') text = `*${text}*`;\r\n else if (mark.type === 'underline') text = `__${text}__`;\r\n else if (mark.type === 'code') text = `\\`${text}\\``;\r\n }\r\n result += text;\r\n }\r\n\r\n if (node.type === 'hardBreak') {\r\n result += ' \\n';\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Convert a single block node to markdown.\r\n */\r\nfunction serializeBlock(node: JSONContent): string {\r\n switch (node.type) {\r\n case 'heading': {\r\n const level = node.attrs?.level || 1;\r\n const prefix = '#'.repeat(level);\r\n return `${prefix} ${serializeInline(node.content)}`;\r\n }\r\n\r\n case 'paragraph': {\r\n const inline = serializeInline(node.content);\r\n // Handle text alignment — not representable in standard markdown, skip\r\n return inline;\r\n }\r\n\r\n case 'bulletList': {\r\n return (node.content || [])\r\n .map((item) => {\r\n const inner = (item.content || [])\r\n .map(serializeBlock)\r\n .join('\\n');\r\n return `- ${inner}`;\r\n })\r\n .join('\\n');\r\n }\r\n\r\n case 'orderedList': {\r\n return (node.content || [])\r\n .map((item, i) => {\r\n const inner = (item.content || [])\r\n .map(serializeBlock)\r\n .join('\\n');\r\n return `${i + 1}. ${inner}`;\r\n })\r\n .join('\\n');\r\n }\r\n\r\n case 'listItem': {\r\n return (node.content || []).map(serializeBlock).join('\\n');\r\n }\r\n\r\n case 'blockquote': {\r\n return (node.content || [])\r\n .map(serializeBlock)\r\n .map((line) => `> ${line}`)\r\n .join('\\n');\r\n }\r\n\r\n case 'codeBlock': {\r\n const text = serializeInline(node.content);\r\n return `\\`\\`\\`\\n${text}\\n\\`\\`\\``;\r\n }\r\n\r\n case 'horizontalRule': {\r\n return '---';\r\n }\r\n\r\n default:\r\n return serializeInline(node.content);\r\n }\r\n}\r\n\r\n/**\r\n * Convert TipTap JSON content to markdown string with field tokens.\r\n */\r\nexport function tiptapToMarkdown(doc: JSONContent): string {\r\n if (!doc.content) return '';\r\n\r\n return doc.content\r\n .map(serializeBlock)\r\n .join('\\n\\n');\r\n}\r\n","import type { JSONContent } from '@tiptap/core';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nconst TOKEN_REGEX = /\\{\\{(field|var)\\|([^}]+)\\}\\}/g;\r\n\r\n/**\r\n * Inject _marks key into a token string before the closing }}.\r\n */\r\nfunction injectMarks(token: string, marks: string[]): string {\r\n const existingMatch = token.match(/\\|_marks:([^}|]+)/);\r\n if (existingMatch) {\r\n const existing = existingMatch[1].split(',');\r\n const merged = [...new Set([...existing, ...marks])];\r\n return token.replace(/\\|_marks:[^}|]+/, `|_marks:${merged.join(',')}`);\r\n }\r\n return token.replace(/\\}\\}$/, `|_marks:${marks.join(',')}}}`);\r\n}\r\n\r\n/**\r\n * Pre-process markdown to convert mark-wrapped tokens into tokens with _marks hint.\r\n * e.g. **{{var|name:foo}}** → {{var|name:foo|_marks:bold}}\r\n */\r\nfunction preprocessMarkedTokens(text: string): string {\r\n const tk = `\\\\{\\\\{(?:var|field)\\\\|[^}]+\\\\}\\\\}`;\r\n // Combined: underline + bold+italic\r\n text = text.replace(new RegExp(`__(\\\\*\\\\*\\\\*(${tk})\\\\*\\\\*\\\\*)__`, 'g'), (_, _inner, token) => `__${injectMarks(token, ['bold', 'italic'])}__`);\r\n // Combined: underline + bold\r\n text = text.replace(new RegExp(`__(\\\\*\\\\*(${tk})\\\\*\\\\*)__`, 'g'), (_, _inner, token) => `__${injectMarks(token, ['bold'])}__`);\r\n // Combined: underline + italic\r\n text = text.replace(new RegExp(`__(\\\\*(${tk})\\\\*)__`, 'g'), (_, _inner, token) => `__${injectMarks(token, ['italic'])}__`);\r\n // Underline only\r\n text = text.replace(new RegExp(`__(${tk})__`, 'g'), (_, token) => injectMarks(token, ['underline']));\r\n // Bold+italic: ***{{...}}***\r\n text = text.replace(new RegExp(`\\\\*\\\\*\\\\*(${tk})\\\\*\\\\*\\\\*`, 'g'), (_, token) => injectMarks(token, ['bold', 'italic']));\r\n // Bold: **{{...}}**\r\n text = text.replace(new RegExp(`\\\\*\\\\*(${tk})\\\\*\\\\*`, 'g'), (_, token) => injectMarks(token, ['bold']));\r\n // Italic: *{{...}}*\r\n text = text.replace(new RegExp(`(?<!\\\\*)\\\\*(${tk})\\\\*(?!\\\\*)`, 'g'), (_, token) => injectMarks(token, ['italic']));\r\n return text;\r\n}\r\n\r\n/**\r\n * Extract _marks from attrs and return as a marks array, removing the key from attrs.\r\n */\r\nfunction extractAndRemoveMarks(attrs: Record<string, unknown>): Array<{ type: string }> {\r\n const marksStr = attrs._marks as string | undefined;\r\n delete attrs._marks;\r\n if (!marksStr) return [];\r\n return marksStr.split(',').map(m => ({ type: m.trim() }));\r\n}\r\n\r\n/**\r\n * Parse a field token body into node attributes.\r\n */\r\nfunction parseFieldToken(tokenBody: string): Record<string, string | boolean | number | null> {\r\n const attrs: Record<string, string | boolean | number | null> = {\r\n fieldId: '',\r\n fieldType: 'text',\r\n fieldName: '',\r\n fieldLabel: '',\r\n required: false,\r\n options: '',\r\n placeholder: '',\r\n fontSize: null,\r\n defaultValue: '',\r\n multiline: false,\r\n maxLength: null,\r\n acknowledgements: '',\r\n };\r\n\r\n const pairs = tokenBody.split('|');\r\n for (const pair of pairs) {\r\n const colonIdx = pair.indexOf(':');\r\n if (colonIdx === -1) continue;\r\n const key = pair.slice(0, colonIdx).trim();\r\n const value = pair.slice(colonIdx + 1).trim();\r\n\r\n switch (key) {\r\n case 'type': attrs.fieldType = value; break;\r\n case 'name': attrs.fieldName = value; break;\r\n case 'label': attrs.fieldLabel = value; break;\r\n case 'id': attrs.fieldId = value; break;\r\n case 'required': attrs.required = value === 'true'; break;\r\n case 'options': attrs.options = value; break;\r\n case 'fontSize': attrs.fontSize = parseInt(value, 10) || null; break;\r\n case 'placeholder': attrs.placeholder = value; break;\r\n case 'defaultValue': attrs.defaultValue = value; break;\r\n case 'multiline': attrs.multiline = value === 'true'; break;\r\n case 'maxLength': attrs.maxLength = parseInt(value, 10) || null; break;\r\n case 'acks': attrs.acknowledgements = atob(value); break;\r\n case '_marks': attrs._marks = value; break;\r\n }\r\n }\r\n\r\n if (!attrs.fieldId) {\r\n attrs.fieldId = uuidv4();\r\n }\r\n\r\n return attrs;\r\n}\r\n\r\n/**\r\n * Parse a variable token body into node attributes.\r\n */\r\nfunction parseVariableToken(tokenBody: string): Record<string, string> {\r\n const attrs: Record<string, string> = {\r\n varName: '',\r\n varLabel: '',\r\n varDefault: '',\r\n };\r\n\r\n const pairs = tokenBody.split('|');\r\n for (const pair of pairs) {\r\n const colonIdx = pair.indexOf(':');\r\n if (colonIdx === -1) continue;\r\n const key = pair.slice(0, colonIdx).trim();\r\n const value = pair.slice(colonIdx + 1).trim();\r\n\r\n switch (key) {\r\n case 'name': attrs.varName = value; break;\r\n case 'label': attrs.varLabel = value; break;\r\n case 'default': attrs.varDefault = value; break;\r\n case '_marks': attrs._marks = value; break;\r\n }\r\n }\r\n\r\n return attrs;\r\n}\r\n\r\n/**\r\n * Parse inline text content that may contain field/variable tokens into TipTap inline nodes.\r\n */\r\nfunction parseInline(text: string): JSONContent[] {\r\n // Preprocess to convert mark-wrapped tokens into tokens with _marks hint\r\n text = preprocessMarkedTokens(text);\r\n\r\n const nodes: JSONContent[] = [];\r\n let lastIndex = 0;\r\n\r\n TOKEN_REGEX.lastIndex = 0;\r\n let match;\r\n while ((match = TOKEN_REGEX.exec(text)) !== null) {\r\n // Text before the token\r\n if (match.index > lastIndex) {\r\n const beforeText = text.slice(lastIndex, match.index);\r\n nodes.push(...parseFormattedText(beforeText));\r\n }\r\n\r\n // Field or variable token\r\n if (match[1] === 'field') {\r\n const attrs = parseFieldToken(match[2]);\r\n const marks = extractAndRemoveMarks(attrs);\r\n const node: JSONContent = { type: 'fieldNode', attrs };\r\n if (marks.length > 0) node.marks = marks;\r\n nodes.push(node);\r\n } else if (match[1] === 'var') {\r\n const attrs = parseVariableToken(match[2]);\r\n const marks = extractAndRemoveMarks(attrs);\r\n const node: JSONContent = { type: 'variableNode', attrs };\r\n if (marks.length > 0) node.marks = marks;\r\n nodes.push(node);\r\n }\r\n\r\n lastIndex = match.index + match[0].length;\r\n }\r\n\r\n // Remaining text after last token\r\n if (lastIndex < text.length) {\r\n nodes.push(...parseFormattedText(text.slice(lastIndex)));\r\n }\r\n\r\n return nodes;\r\n}\r\n\r\n/**\r\n * Parse formatted text (bold, italic, underline, code) into TipTap text nodes with marks.\r\n * Simplified parser — handles **bold**, *italic*, __underline__, `code`.\r\n */\r\nfunction parseFormattedText(text: string): JSONContent[] {\r\n if (!text) return [];\r\n\r\n const nodes: JSONContent[] = [];\r\n // For v1, do a simple regex-based parse for bold and italic\r\n const parts = text.split(/(\\*\\*[^*]+\\*\\*|\\*[^*]+\\*|__[^_]+__|`[^`]+`)/);\r\n\r\n for (const part of parts) {\r\n if (!part) continue;\r\n\r\n if (part.startsWith('**') && part.endsWith('**')) {\r\n nodes.push({\r\n type: 'text',\r\n text: part.slice(2, -2),\r\n marks: [{ type: 'bold' }],\r\n });\r\n } else if (part.startsWith('*') && part.endsWith('*')) {\r\n nodes.push({\r\n type: 'text',\r\n text: part.slice(1, -1),\r\n marks: [{ type: 'italic' }],\r\n });\r\n } else if (part.startsWith('__') && part.endsWith('__')) {\r\n nodes.push({\r\n type: 'text',\r\n text: part.slice(2, -2),\r\n marks: [{ type: 'underline' }],\r\n });\r\n } else if (part.startsWith('`') && part.endsWith('`')) {\r\n nodes.push({\r\n type: 'text',\r\n text: part.slice(1, -1),\r\n marks: [{ type: 'code' }],\r\n });\r\n } else {\r\n nodes.push({ type: 'text', text: part });\r\n }\r\n }\r\n\r\n return nodes;\r\n}\r\n\r\n/**\r\n * Parse a markdown string (with field tokens) into TipTap JSONContent.\r\n */\r\nexport function markdownToTiptap(markdown: string): JSONContent {\r\n const lines = markdown.split('\\n');\r\n const content: JSONContent[] = [];\r\n let i = 0;\r\n\r\n while (i < lines.length) {\r\n const line = lines[i];\r\n\r\n // Empty line — skip (paragraph separator)\r\n if (line.trim() === '') {\r\n i++;\r\n continue;\r\n }\r\n\r\n // Horizontal rule\r\n if (/^---+$/.test(line.trim())) {\r\n content.push({ type: 'horizontalRule' });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Heading\r\n const headingMatch = line.match(/^(#{1,3})\\s+(.+)/);\r\n if (headingMatch) {\r\n const level = headingMatch[1].length;\r\n const text = headingMatch[2];\r\n content.push({\r\n type: 'heading',\r\n attrs: { level },\r\n content: parseInline(text),\r\n });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Bullet list\r\n if (/^\\s*[-*]\\s+/.test(line)) {\r\n const items: JSONContent[] = [];\r\n while (i < lines.length && /^\\s*[-*]\\s+/.test(lines[i])) {\r\n const itemText = lines[i].replace(/^\\s*[-*]\\s+/, '');\r\n items.push({\r\n type: 'listItem',\r\n content: [{ type: 'paragraph', content: parseInline(itemText) }],\r\n });\r\n i++;\r\n }\r\n content.push({ type: 'bulletList', content: items });\r\n continue;\r\n }\r\n\r\n // Ordered list\r\n if (/^\\s*\\d+\\.\\s+/.test(line)) {\r\n const items: JSONContent[] = [];\r\n while (i < lines.length && /^\\s*\\d+\\.\\s+/.test(lines[i])) {\r\n const itemText = lines[i].replace(/^\\s*\\d+\\.\\s+/, '');\r\n items.push({\r\n type: 'listItem',\r\n content: [{ type: 'paragraph', content: parseInline(itemText) }],\r\n });\r\n i++;\r\n }\r\n content.push({ type: 'orderedList', content: items });\r\n continue;\r\n }\r\n\r\n // Blockquote\r\n if (line.startsWith('> ')) {\r\n const quoteLines: string[] = [];\r\n while (i < lines.length && lines[i].startsWith('> ')) {\r\n quoteLines.push(lines[i].slice(2));\r\n i++;\r\n }\r\n content.push({\r\n type: 'blockquote',\r\n content: [{ type: 'paragraph', content: parseInline(quoteLines.join('\\n')) }],\r\n });\r\n continue;\r\n }\r\n\r\n // Code block\r\n if (line.startsWith('```')) {\r\n i++; // skip opening fence\r\n const codeLines: string[] = [];\r\n while (i < lines.length && !lines[i].startsWith('```')) {\r\n codeLines.push(lines[i]);\r\n i++;\r\n }\r\n if (i < lines.length) i++; // skip closing fence\r\n content.push({\r\n type: 'codeBlock',\r\n content: [{ type: 'text', text: codeLines.join('\\n') }],\r\n });\r\n continue;\r\n }\r\n\r\n // Default: paragraph\r\n content.push({\r\n type: 'paragraph',\r\n content: parseInline(line),\r\n });\r\n i++;\r\n }\r\n\r\n return { type: 'doc', content };\r\n}\r\n","/**\r\n * Extract a human-readable message from an unknown caught error.\r\n * Always returns a string — never throws.\r\n */\r\nexport function getErrorMessage(error: unknown): string {\r\n if (error instanceof Error) return error.message;\r\n if (typeof error === 'string') return error;\r\n try {\r\n return JSON.stringify(error);\r\n } catch {\r\n return String(error);\r\n }\r\n}\r\n\r\n/**\r\n * Format a contextual error: prefix + extracted message.\r\n * Example: formatError('Preview generation failed', err)\r\n * => \"Preview generation failed: The PDF document is corrupted\"\r\n */\r\nexport function formatError(context: string, error: unknown): string {\r\n const message = getErrorMessage(error);\r\n return `${context}: ${message}`;\r\n}\r\n\r\nexport type JsonParseResult =\r\n | { valid: true; data: unknown }\r\n | { valid: false; message: string; line: number; col: number };\r\n\r\n// Number of characters to show on each side of the error position in the context snippet\r\nconst CONTEXT_CHARS = 25;\r\n\r\n/**\r\n * Extract the character offset from a JSON.parse SyntaxError message.\r\n * Handles V8 (Chrome/Node), SpiderMonkey (Firefox), and JSC (Safari).\r\n */\r\nfunction extractPosition(error: SyntaxError, inputLength: number): number | null {\r\n const msg = error.message;\r\n\r\n // V8: \"... at position 42\", \"... at position 42 (line 3 column 5)\"\r\n const v8 = /position\\s+(\\d+)/i.exec(msg);\r\n if (v8) return Number(v8[1]);\r\n\r\n // Unexpected end of input → error is at the end\r\n if (/unexpected end/i.test(msg) || /unterminated/i.test(msg)) {\r\n return inputLength > 0 ? inputLength - 1 : 0;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Strip the native position/location suffix from a JSON.parse error message.\r\n * V8: \"Expected ... in JSON at position 50 (line 4 column 5)\" → \"Expected ...\"\r\n * SpiderMonkey: \"... at line 3 column 5 of the JSON data\" → \"...\"\r\n */\r\nfunction stripNativePosition(msg: string): string {\r\n // V8: \" in JSON at position ...\" (with optional \"(line N column M)\" suffix)\r\n const v8Stripped = msg.replace(/\\s+in JSON at position\\s+\\d+(\\s*\\(line\\s+\\d+\\s+column\\s+\\d+\\))?/i, '');\r\n if (v8Stripped !== msg) return v8Stripped;\r\n\r\n // SpiderMonkey: \" at line N column M of the JSON data\"\r\n const ffStripped = msg.replace(/\\s+at line\\s+\\d+\\s+column\\s+\\d+\\s+of the JSON data/i, '');\r\n if (ffStripped !== msg) return ffStripped;\r\n\r\n return msg;\r\n}\r\n\r\n/**\r\n * Compute 1-based line and column from a 0-based character offset.\r\n */\r\nfunction posToLineCol(text: string, pos: number): { line: number; col: number } {\r\n let line = 1;\r\n let lastNewline = -1;\r\n for (let i = 0; i < pos && i < text.length; i++) {\r\n if (text[i] === '\\n') {\r\n line++;\r\n lastNewline = i;\r\n }\r\n }\r\n return { line, col: pos - lastNewline };\r\n}\r\n\r\n/**\r\n * Try to extract line/col directly from Firefox-style error messages.\r\n * SpiderMonkey: \"... at line 3 column 5 of the JSON data\"\r\n */\r\nfunction extractLineCol(error: SyntaxError): { line: number; col: number } | null {\r\n const ff = /line\\s+(\\d+)\\s+column\\s+(\\d+)/i.exec(error.message);\r\n if (ff) return { line: Number(ff[1]), col: Number(ff[2]) };\r\n return null;\r\n}\r\n\r\n/**\r\n * Build a context snippet showing the JSON text around the error position.\r\n */\r\nfunction buildContextSnippet(text: string, pos: number): string {\r\n const start = Math.max(0, pos - CONTEXT_CHARS);\r\n const end = Math.min(text.length, pos + CONTEXT_CHARS);\r\n const prefix = start > 0 ? '...' : '';\r\n const suffix = end < text.length ? '...' : '';\r\n return `${prefix}${text.slice(start, end)}${suffix}`;\r\n}\r\n\r\n/**\r\n * Parse JSON with precise error messages including line/col and a context snippet.\r\n * Uses native JSON.parse with cross-browser position extraction\r\n * (inspired by json-parse-better-errors).\r\n */\r\nexport function parseJsonWithDetails(input: string): JsonParseResult {\r\n try {\r\n const data = JSON.parse(input);\r\n return { valid: true, data };\r\n } catch (err: unknown) {\r\n if (!(err instanceof SyntaxError)) {\r\n return { valid: false, message: getErrorMessage(err), line: 0, col: 0 };\r\n }\r\n\r\n // Try to get position and line/col\r\n const pos = extractPosition(err, input.length);\r\n let lc = extractLineCol(err);\r\n if (!lc && pos !== null) {\r\n lc = posToLineCol(input, pos);\r\n }\r\n const line = lc?.line ?? 0;\r\n const col = lc?.col ?? 0;\r\n\r\n // Build message: clean reason + our location + context snippet\r\n let message = stripNativePosition(err.message);\r\n if (line > 0) {\r\n message += ` (line ${line}, col ${col})`;\r\n }\r\n if (pos !== null) {\r\n const snippet = buildContextSnippet(input, pos);\r\n message += `\\nnear: ${snippet}`;\r\n }\r\n\r\n return { valid: false, message, line, col };\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 * Matches the format used by @signiphi/document-prepare and read by @signiphi/pdf-signer.\r\n */\r\n\r\nimport type { PDFDocument, PDFName as PDFNameType, PDFString as PDFStringType } from 'pdf-lib';\r\nimport type { Acknowledgement } from '../types';\r\nimport { getErrorMessage } from './error-helpers';\r\n\r\n// Module-level variables for pdf-lib classes\r\nlet PDFName: typeof PDFNameType;\r\nlet PDFString: typeof PDFStringType;\r\n\r\n/**\r\n * Initialize PDF classes from the pdf-lib module.\r\n * Must be called before using setSigniphiMetadata.\r\n */\r\nexport function initPdfMetadata(pdfLibModule: { PDFName: typeof PDFNameType; PDFString: typeof PDFStringType }): 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;\r\n label?: string;\r\n placeholder?: string;\r\n acknowledgements?: Acknowledgement[];\r\n required?: boolean;\r\n options?: string[];\r\n}\r\n\r\n/**\r\n * Complete metadata structure stored in PDF — compatible with document-prepare & pdf-signer\r\n */\r\nexport interface SigniphiMetadata {\r\n version: string;\r\n fields: Record<string, FieldMetadata>;\r\n fieldIdIndex?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * Stores Signiphi metadata in the PDF's document information dictionary.\r\n */\r\nexport function setSigniphiMetadata(pdfDoc: PDFDocument, metadata: SigniphiMetadata): void {\r\n if (!PDFName || !PDFString) {\r\n throw new Error('PDF metadata classes not initialized — call initPdfMetadata before setSigniphiMetadata');\r\n }\r\n\r\n try {\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('Cannot access PDF document info dictionary for metadata storage');\r\n }\r\n const infoDict = infoObj as any;\r\n const metadataString = JSON.stringify(metadata);\r\n\r\n infoDict.set(PDFName.of('SigniphiMetadata'), PDFString.of(metadataString));\r\n } catch (error) {\r\n throw new Error(`Failed to embed document metadata: ${getErrorMessage(error)}`);\r\n }\r\n}\r\n\r\n/**\r\n * Input field shape for building metadata (subset of DocumentGeneratorField)\r\n */\r\ninterface MetadataFieldInput {\r\n fieldId: string;\r\n name: string;\r\n label?: string;\r\n placeholder?: string;\r\n acknowledgements?: Acknowledgement[];\r\n required?: boolean;\r\n options?: string[];\r\n}\r\n\r\n/**\r\n * Builds a metadata object from form fields.\r\n * @param fields - Array of fields to extract metadata from\r\n * @param actualFieldNames - Mapping of base field name → actual PDF field name (with suffixes)\r\n */\r\nexport function buildMetadataObject(\r\n fields: MetadataFieldInput[],\r\n actualFieldNames?: Map<string, string>\r\n): SigniphiMetadata {\r\n const metadata: SigniphiMetadata = {\r\n version: '1.0',\r\n fields: {},\r\n fieldIdIndex: {},\r\n };\r\n\r\n fields.forEach(field => {\r\n const hasMetadata = field.fieldId || field.label || field.placeholder ||\r\n field.acknowledgements?.length ||\r\n field.required !== undefined || field.options?.length;\r\n\r\n if (hasMetadata) {\r\n const actualFieldName = actualFieldNames?.get(field.name) || field.name;\r\n\r\n metadata.fields[actualFieldName] = {\r\n fieldId: field.fieldId,\r\n label: field.label,\r\n placeholder: field.placeholder,\r\n acknowledgements: field.acknowledgements,\r\n required: field.required,\r\n options: field.options,\r\n };\r\n\r\n if (field.fieldId) {\r\n metadata.fieldIdIndex![field.fieldId] = actualFieldName;\r\n }\r\n }\r\n });\r\n\r\n return metadata;\r\n}\r\n","import { PDFDocument, StandardFonts, rgb, PDFFont, PDFPage, PDFName, PDFString } from 'pdf-lib';\r\nimport type { JSONContent } from '@tiptap/core';\r\nimport { FormFieldType, type FormFieldPosition, type DocumentGeneratorField } from '../types';\r\nimport { initPdfMetadata, buildMetadataObject, setSigniphiMetadata } from './pdf-metadata';\r\nimport { getErrorMessage } from './error-helpers';\r\n\r\n// A4 dimensions in PDF points (1 point = 1/72 inch)\r\nconst PAGE_WIDTH = 595.28;\r\nconst PAGE_HEIGHT = 841.89;\r\nconst MARGIN = 72; // 1 inch\r\nconst CONTENT_WIDTH = PAGE_WIDTH - 2 * MARGIN;\r\nconst CONTENT_HEIGHT = PAGE_HEIGHT - 2 * MARGIN;\r\nconst LINE_HEIGHT_FACTOR = 1.4;\r\n\r\ninterface FontSet {\r\n regular: PDFFont;\r\n bold: PDFFont;\r\n italic: PDFFont;\r\n boldItalic: PDFFont;\r\n}\r\n\r\ninterface LayoutState {\r\n currentPage: PDFPage;\r\n pageIndex: number;\r\n y: number; // Current Y position (PDF coordinates: top-down from MARGIN)\r\n fonts: FontSet;\r\n pdfDoc: PDFDocument;\r\n fieldPositions: Map<string, FormFieldPosition>;\r\n drawFieldPlaceholders: boolean;\r\n}\r\n\r\n/**\r\n * Field type display labels and visual dimensions in the PDF\r\n */\r\n/**\r\n * Field dimensions matching document-prepare (PdfViewerWithFields.tsx:423-441)\r\n */\r\nconst FIELD_DISPLAY: Record<string, { label: string; width: number; height: number }> = {\r\n [FormFieldType.TEXT]: { label: 'Text', width: 120, height: 30 },\r\n [FormFieldType.SIGNATURE]: { label: 'Signature', width: 200, height: 60 },\r\n [FormFieldType.INITIALS]: { label: 'Initials', width: 120, height: 30 },\r\n [FormFieldType.DATE]: { label: 'Date', width: 100, height: 30 },\r\n [FormFieldType.CHECKBOX]: { label: 'Checkbox', width: 20, height: 20 },\r\n [FormFieldType.RADIO]: { label: 'Radio', width: 100, height: 88 },\r\n [FormFieldType.DROPDOWN]: { label: 'Dropdown', width: 120, height: 30 },\r\n [FormFieldType.TEXT_LABEL]: { label: 'Label', width: 150, height: 25 },\r\n};\r\n\r\n/**\r\n * Inline field types get dynamic text-based sizing.\r\n * Block-like fields (signature, initials, checkbox, radio) keep static sizes.\r\n */\r\nconst INLINE_FIELD_TYPES = new Set([\r\n FormFieldType.TEXT, FormFieldType.DATE,\r\n FormFieldType.DROPDOWN, FormFieldType.TEXT_LABEL,\r\n]);\r\n\r\n/**\r\n * Calculate field dimensions. Inline fields are sized from their label text;\r\n * block-like fields use static FIELD_DISPLAY sizes.\r\n */\r\nfunction getFieldDimensions(\r\n fieldType: string,\r\n attrs: Record<string, unknown> | undefined,\r\n font: PDFFont,\r\n fontSize: number,\r\n): { width: number; height: number } {\r\n if (!INLINE_FIELD_TYPES.has(fieldType as FormFieldType)) {\r\n const display = FIELD_DISPLAY[fieldType] || FIELD_DISPLAY[FormFieldType.TEXT];\r\n return { width: display.width, height: display.height };\r\n }\r\n\r\n const label = (attrs?.fieldLabel as string) || (attrs?.fieldName as string) || fieldType;\r\n const textLineHeight = fontSize * LINE_HEIGHT_FACTOR;\r\n const labelText = `[ ${label} ]`;\r\n const textWidth = font.widthOfTextAtSize(labelText, fontSize);\r\n const padding = 12;\r\n const width = Math.max(textWidth + padding, 60);\r\n const height = textLineHeight + 4;\r\n\r\n return { width, height };\r\n}\r\n\r\n/**\r\n * Ensure we have enough vertical space; if not, create a new page.\r\n */\r\nfunction ensureSpace(state: LayoutState, neededHeight: number): void {\r\n // y is measured from top of content area (0 = top margin, CONTENT_HEIGHT = bottom margin)\r\n if (state.y + neededHeight > CONTENT_HEIGHT) {\r\n const newPage = state.pdfDoc.addPage([PAGE_WIDTH, PAGE_HEIGHT]);\r\n state.currentPage = newPage;\r\n state.pageIndex++;\r\n state.y = 0;\r\n }\r\n}\r\n\r\n/**\r\n * Draw text at the current position, handling word-wrapping.\r\n * Used for standalone block-level text (code blocks, etc.).\r\n * Returns the Y advance.\r\n */\r\nfunction drawText(\r\n state: LayoutState,\r\n text: string,\r\n font: PDFFont,\r\n fontSize: number,\r\n indent: number = 0,\r\n): number {\r\n const lineHeight = fontSize * LINE_HEIGHT_FACTOR;\r\n const maxWidth = CONTENT_WIDTH - indent;\r\n const words = text.split(/\\s+/);\r\n let line = '';\r\n let totalAdvance = 0;\r\n\r\n for (const word of words) {\r\n const testLine = line ? `${line} ${word}` : word;\r\n const testWidth = font.widthOfTextAtSize(testLine, fontSize);\r\n\r\n if (testWidth > maxWidth && line) {\r\n ensureSpace(state, lineHeight);\r\n const pdfY = PAGE_HEIGHT - MARGIN - state.y - fontSize;\r\n state.currentPage.drawText(line, {\r\n x: MARGIN + indent,\r\n y: pdfY,\r\n size: fontSize,\r\n font,\r\n color: rgb(0, 0, 0),\r\n });\r\n state.y += lineHeight;\r\n totalAdvance += lineHeight;\r\n line = word;\r\n } else {\r\n line = testLine;\r\n }\r\n }\r\n\r\n if (line) {\r\n ensureSpace(state, lineHeight);\r\n const pdfY = PAGE_HEIGHT - MARGIN - state.y - fontSize;\r\n state.currentPage.drawText(line, {\r\n x: MARGIN + indent,\r\n y: pdfY,\r\n size: fontSize,\r\n font,\r\n color: rgb(0, 0, 0),\r\n });\r\n state.y += lineHeight;\r\n totalAdvance += lineHeight;\r\n }\r\n\r\n return totalAdvance;\r\n}\r\n\r\n// ─── Inline segment layout system ───────────────────────────────────────\r\n\r\ntype InlineSegment =\r\n | { kind: 'text'; text: string; font: PDFFont; fontSize: number }\r\n | { kind: 'field'; attrs: Record<string, unknown>; width: number; height: number }\r\n | { kind: 'break' };\r\n\r\n/**\r\n * Collect inline segments from TipTap JSON content nodes.\r\n * Converts text (with marks), variables, fields, and hard breaks into typed segments.\r\n */\r\nfunction collectInlineSegments(\r\n content: JSONContent[],\r\n fonts: FontSet,\r\n fontSize: number,\r\n): InlineSegment[] {\r\n const segments: InlineSegment[] = [];\r\n\r\n for (const node of content) {\r\n if (node.type === 'fieldNode') {\r\n const fieldType = (node.attrs?.fieldType as string) || 'text';\r\n const { width, height } = getFieldDimensions(fieldType, node.attrs, fonts.italic, fontSize);\r\n segments.push({ kind: 'field', attrs: node.attrs || {}, width, height });\r\n } else if (node.type === 'text') {\r\n const text = node.text || '';\r\n const marks = node.marks || [];\r\n const isBold = marks.some((m: { type: string }) => m.type === 'bold');\r\n const isItalic = marks.some((m: { type: string }) => m.type === 'italic');\r\n let font = fonts.regular;\r\n if (isBold && isItalic) font = fonts.boldItalic;\r\n else if (isBold) font = fonts.bold;\r\n else if (isItalic) font = fonts.italic;\r\n segments.push({ kind: 'text', text, font, fontSize });\r\n } else if (node.type === 'variableNode') {\r\n const label = (node.attrs?.varLabel as string) || (node.attrs?.varName as string) || 'Variable';\r\n const varMarks = node.marks || [];\r\n const varIsBold = varMarks.some((m: { type: string }) => m.type === 'bold');\r\n const varIsItalic = varMarks.some((m: { type: string }) => m.type === 'italic');\r\n let varFont = fonts.regular;\r\n if (varIsBold && varIsItalic) varFont = fonts.boldItalic;\r\n else if (varIsBold) varFont = fonts.bold;\r\n else if (varIsItalic) varFont = fonts.italic;\r\n segments.push({ kind: 'text', text: `[${label}]`, font: varFont, fontSize });\r\n } else if (node.type === 'hardBreak') {\r\n segments.push({ kind: 'break' });\r\n }\r\n }\r\n\r\n return segments;\r\n}\r\n\r\n/**\r\n * Lay out inline segments with proper X-position tracking and word wrapping.\r\n * Text and fields share the same line; wraps when content exceeds available width.\r\n */\r\nfunction layoutInlineSegments(\r\n state: LayoutState,\r\n segments: InlineSegment[],\r\n fontSize: number,\r\n indent: number = 0,\r\n): void {\r\n const textLineHeight = fontSize * LINE_HEIGHT_FACTOR;\r\n const maxX = MARGIN + CONTENT_WIDTH;\r\n const startX = MARGIN + indent;\r\n\r\n let currentX = startX;\r\n let currentLineHeight = 0; // tallest element on current line\r\n let lineHasContent = false;\r\n\r\n // Flush (finalize) the current line: advance Y and reset X\r\n function flushLine() {\r\n if (lineHasContent) {\r\n state.y += currentLineHeight;\r\n }\r\n currentX = startX;\r\n currentLineHeight = 0;\r\n lineHasContent = false;\r\n }\r\n\r\n for (const seg of segments) {\r\n if (seg.kind === 'break') {\r\n // Hard break: finish current line\r\n if (!lineHasContent) {\r\n // Empty line — still advance by text line height\r\n currentLineHeight = textLineHeight;\r\n lineHasContent = true;\r\n }\r\n flushLine();\r\n continue;\r\n }\r\n\r\n if (seg.kind === 'field') {\r\n const fieldGap = 4;\r\n const totalFieldWidth = seg.width + fieldGap;\r\n\r\n // Check if field fits on current line\r\n if (lineHasContent && currentX + seg.width > maxX) {\r\n flushLine();\r\n }\r\n\r\n ensureSpace(state, Math.max(seg.height, textLineHeight));\r\n\r\n const fieldX = currentX;\r\n const pdfY = PAGE_HEIGHT - MARGIN - state.y - seg.height;\r\n\r\n // Draw visual placeholder when in export mode\r\n if (state.drawFieldPlaceholders) {\r\n const fieldType = (seg.attrs.fieldType as string) || 'text';\r\n const fieldLabel = (seg.attrs.fieldLabel as string) || (seg.attrs.fieldName as string) || fieldType;\r\n const isInline = INLINE_FIELD_TYPES.has(fieldType as FormFieldType);\r\n\r\n state.currentPage.drawRectangle({\r\n x: fieldX,\r\n y: pdfY,\r\n width: seg.width,\r\n height: seg.height,\r\n borderColor: rgb(0.5, 0.5, 0.7),\r\n borderWidth: isInline ? 0.5 : 1,\r\n color: rgb(0.95, 0.95, 1.0),\r\n borderDashArray: [4, 2],\r\n });\r\n\r\n const display = FIELD_DISPLAY[fieldType] || FIELD_DISPLAY[FormFieldType.TEXT];\r\n const labelFontSize = isInline ? (fontSize - 2) : 8;\r\n const labelText = isInline ? `[ ${fieldLabel} ]` : `[ ${display.label}: ${fieldLabel} ]`;\r\n const labelPadding = isInline ? 6 : 4;\r\n state.currentPage.drawText(labelText, {\r\n x: fieldX + labelPadding,\r\n y: pdfY + seg.height / 2 - labelFontSize / 2,\r\n size: labelFontSize,\r\n font: state.fonts.italic,\r\n color: rgb(0.4, 0.4, 0.6),\r\n maxWidth: seg.width - labelPadding * 2,\r\n });\r\n }\r\n\r\n // Record field position\r\n const fieldId = seg.attrs.fieldId as string;\r\n if (fieldId) {\r\n state.fieldPositions.set(fieldId, {\r\n x: fieldX,\r\n y: pdfY,\r\n width: seg.width,\r\n height: seg.height,\r\n page: state.pageIndex + 1,\r\n });\r\n }\r\n\r\n currentX += totalFieldWidth;\r\n currentLineHeight = Math.max(currentLineHeight, seg.height + 4);\r\n lineHasContent = true;\r\n continue;\r\n }\r\n\r\n // Text segment: split into words and lay out with wrapping\r\n if (seg.kind === 'text') {\r\n const { text, font } = seg;\r\n const spaceWidth = font.widthOfTextAtSize(' ', fontSize);\r\n\r\n // Split text preserving leading/trailing spaces\r\n const words = text.split(/(\\s+)/);\r\n\r\n for (const token of words) {\r\n if (!token) continue;\r\n\r\n // Whitespace token\r\n if (/^\\s+$/.test(token)) {\r\n if (lineHasContent) {\r\n currentX += spaceWidth;\r\n }\r\n continue;\r\n }\r\n\r\n const wordWidth = font.widthOfTextAtSize(token, fontSize);\r\n\r\n // Check if word fits on current line\r\n if (lineHasContent && currentX + wordWidth > maxX) {\r\n flushLine();\r\n }\r\n\r\n ensureSpace(state, textLineHeight);\r\n const pdfY = PAGE_HEIGHT - MARGIN - state.y - fontSize;\r\n state.currentPage.drawText(token, {\r\n x: currentX,\r\n y: pdfY,\r\n size: fontSize,\r\n font,\r\n color: rgb(0, 0, 0),\r\n });\r\n\r\n currentX += wordWidth;\r\n currentLineHeight = Math.max(currentLineHeight, textLineHeight);\r\n lineHasContent = true;\r\n }\r\n }\r\n }\r\n\r\n // Flush the last line\r\n flushLine();\r\n}\r\n\r\n/**\r\n * Process inline content within a paragraph/block and render it.\r\n * Uses segment-based layout for proper inline positioning of text, variables, and fields.\r\n */\r\nfunction processInlineContent(\r\n state: LayoutState,\r\n content: JSONContent[] | undefined,\r\n fontSize: number,\r\n indent: number = 0,\r\n): void {\r\n if (!content) return;\r\n const segments = collectInlineSegments(content, state.fonts, fontSize);\r\n if (segments.length === 0) return;\r\n layoutInlineSegments(state, segments, fontSize, indent);\r\n}\r\n\r\n/**\r\n * Process a block-level TipTap node and render it to the PDF.\r\n */\r\nfunction processBlock(state: LayoutState, node: JSONContent): void {\r\n switch (node.type) {\r\n case 'heading': {\r\n const level = node.attrs?.level || 1;\r\n const fontSizes: Record<number, number> = { 1: 24, 2: 20, 3: 16 };\r\n const fontSize = fontSizes[level] || 16;\r\n const spacing = fontSize * 0.6;\r\n\r\n ensureSpace(state, fontSize * LINE_HEIGHT_FACTOR + spacing);\r\n state.y += spacing / 2;\r\n\r\n if (!node.content) break;\r\n // Use bold font as default for headings, collect segments with bold override\r\n const headingFonts: FontSet = {\r\n regular: state.fonts.bold,\r\n bold: state.fonts.bold,\r\n italic: state.fonts.boldItalic,\r\n boldItalic: state.fonts.boldItalic,\r\n };\r\n const segments = collectInlineSegments(node.content, headingFonts, fontSize);\r\n layoutInlineSegments(state, segments, fontSize);\r\n state.y += spacing / 2;\r\n break;\r\n }\r\n\r\n case 'paragraph': {\r\n const fontSize = 12;\r\n if (!node.content || node.content.length === 0) {\r\n // Empty paragraph — add spacing\r\n state.y += fontSize * LINE_HEIGHT_FACTOR;\r\n break;\r\n }\r\n processInlineContent(state, node.content, fontSize);\r\n state.y += 4; // Paragraph spacing\r\n break;\r\n }\r\n\r\n case 'bulletList': {\r\n for (const item of node.content || []) {\r\n for (const child of item.content || []) {\r\n const fontSize = 12;\r\n ensureSpace(state, fontSize * LINE_HEIGHT_FACTOR);\r\n // Draw bullet at current Y before inline content advances it\r\n const bulletPdfY = PAGE_HEIGHT - MARGIN - state.y - fontSize;\r\n state.currentPage.drawText('\\u2022', {\r\n x: MARGIN + 8,\r\n y: bulletPdfY,\r\n size: fontSize,\r\n font: state.fonts.regular,\r\n color: rgb(0, 0, 0),\r\n });\r\n processInlineContent(state, child.content, fontSize, 24);\r\n }\r\n }\r\n state.y += 4;\r\n break;\r\n }\r\n\r\n case 'orderedList': {\r\n let num = 1;\r\n for (const item of node.content || []) {\r\n for (const child of item.content || []) {\r\n const fontSize = 12;\r\n ensureSpace(state, fontSize * LINE_HEIGHT_FACTOR);\r\n // Draw number at current Y before inline content advances it\r\n const numPdfY = PAGE_HEIGHT - MARGIN - state.y - fontSize;\r\n state.currentPage.drawText(`${num}.`, {\r\n x: MARGIN + 4,\r\n y: numPdfY,\r\n size: fontSize,\r\n font: state.fonts.regular,\r\n color: rgb(0, 0, 0),\r\n });\r\n processInlineContent(state, child.content, fontSize, 24);\r\n }\r\n num++;\r\n }\r\n state.y += 4;\r\n break;\r\n }\r\n\r\n case 'blockquote': {\r\n // Draw a vertical line on the left\r\n const startY = state.y;\r\n for (const child of node.content || []) {\r\n processInlineContent(state, child.content, 12, 16);\r\n }\r\n const endY = state.y;\r\n // Draw the quote bar\r\n const barX = MARGIN + 4;\r\n const barTop = PAGE_HEIGHT - MARGIN - startY;\r\n const barBottom = PAGE_HEIGHT - MARGIN - endY;\r\n state.currentPage.drawLine({\r\n start: { x: barX, y: barTop },\r\n end: { x: barX, y: barBottom },\r\n thickness: 2,\r\n color: rgb(0.7, 0.7, 0.7),\r\n });\r\n state.y += 4;\r\n break;\r\n }\r\n\r\n case 'horizontalRule': {\r\n ensureSpace(state, 16);\r\n state.y += 8;\r\n const ruleY = PAGE_HEIGHT - MARGIN - state.y;\r\n state.currentPage.drawLine({\r\n start: { x: MARGIN, y: ruleY },\r\n end: { x: PAGE_WIDTH - MARGIN, y: ruleY },\r\n thickness: 1,\r\n color: rgb(0.7, 0.7, 0.7),\r\n });\r\n state.y += 8;\r\n break;\r\n }\r\n\r\n case 'codeBlock': {\r\n const fontSize = 10;\r\n const text = node.content?.map(c => c.text || '').join('') || '';\r\n const lines = text.split('\\n');\r\n\r\n // Background box\r\n const lineHeight = fontSize * LINE_HEIGHT_FACTOR;\r\n const blockHeight = lines.length * lineHeight + 16;\r\n ensureSpace(state, blockHeight);\r\n\r\n const boxY = PAGE_HEIGHT - MARGIN - state.y - blockHeight;\r\n state.currentPage.drawRectangle({\r\n x: MARGIN,\r\n y: boxY,\r\n width: CONTENT_WIDTH,\r\n height: blockHeight,\r\n color: rgb(0.95, 0.95, 0.95),\r\n borderColor: rgb(0.85, 0.85, 0.85),\r\n borderWidth: 0.5,\r\n });\r\n\r\n state.y += 8;\r\n for (const line of lines) {\r\n drawText(state, line || ' ', state.fonts.regular, fontSize, 8);\r\n }\r\n state.y += 8;\r\n break;\r\n }\r\n\r\n default:\r\n // Unknown node type — try to process inline content\r\n if (node.content) {\r\n processInlineContent(state, node.content, 12);\r\n }\r\n break;\r\n }\r\n}\r\n\r\n// Extended interface for form fields with acroField access (matching document-prepare)\r\ninterface PDFFormFieldWithAcro {\r\n acroField: {\r\n dict: {\r\n set(key: unknown, value: unknown): void;\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Ensures a field name has the correct type suffix without duplicating it.\r\n * Matches document-prepare's ensureFieldSuffix (pdf-helpers.ts:44-51).\r\n */\r\nfunction ensureFieldSuffix(fieldName: string, suffix: '_signature' | '_initials' | '_date'): string {\r\n const cleanName = fieldName\r\n .replace(/_signature$/i, '')\r\n .replace(/_initials$/i, '')\r\n .replace(/_date$/i, '');\r\n return `${cleanName}${suffix}`;\r\n}\r\n\r\n/**\r\n * Add interactive PDF form fields matching document-prepare's addFormFieldsToFreshPdf.\r\n * Creates properly styled fields with metadata, ready for consumption by pdf-signer.\r\n */\r\nasync function addFormFields(\r\n pdfDoc: PDFDocument,\r\n fieldPositions: Map<string, FormFieldPosition>,\r\n fields: DocumentGeneratorField[],\r\n): Promise<string[]> {\r\n const form = pdfDoc.getForm();\r\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\r\n const pages = pdfDoc.getPages();\r\n const actualFieldNames = new Map<string, string>();\r\n const warnings: string[] = [];\r\n\r\n // Generate unique field names matching document-prepare pattern: ${type}_${timestamp}\r\n let baseTimestamp = Date.now();\r\n\r\n for (const field of fields) {\r\n const position = fieldPositions.get(field.fieldId);\r\n if (!position || !field.name) continue;\r\n\r\n // Use type_timestamp pattern (same as document-prepare's PdfViewerWithFields.tsx:478)\r\n const pdfFieldName = `${field.type}_${baseTimestamp++}`;\r\n\r\n const pageIndex = position.page - 1;\r\n const page = pages[pageIndex];\r\n if (!page) continue;\r\n\r\n const pdfX = position.x;\r\n const pdfY = position.y;\r\n\r\n try {\r\n switch (field.type) {\r\n case FormFieldType.TEXT: {\r\n const textField = form.createTextField(pdfFieldName);\r\n actualFieldNames.set(field.name, pdfFieldName);\r\n textField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: position.width,\r\n height: position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n if (field.label && field.label.trim()) {\r\n let tuValue = field.label;\r\n if (field.fontSize && field.fontSize >= 8 && field.fontSize <= 72) {\r\n tuValue = `${field.label}|fontSize:${field.fontSize}`;\r\n }\r\n (textField as unknown as PDFFormFieldWithAcro).acroField.dict.set(\r\n PDFName.of('TU'), PDFString.of(tuValue)\r\n );\r\n }\r\n\r\n if (field.defaultValue && field.defaultValue.trim()) {\r\n textField.setText(field.defaultValue);\r\n }\r\n\r\n if (field.fontSize && field.fontSize >= 8 && field.fontSize <= 72) {\r\n try { textField.setFontSize(field.fontSize); } catch (e) { /* ignore */ }\r\n }\r\n\r\n if (field.multiline) {\r\n try { textField.enableMultiline(); } catch (e) { /* ignore */ }\r\n }\r\n\r\n if (field.maxLength && field.maxLength > 0) {\r\n try { textField.setMaxLength(field.maxLength); } catch (e) { /* ignore */ }\r\n }\r\n\r\n if (field.required) {\r\n textField.enableRequired();\r\n }\r\n break;\r\n }\r\n\r\n case FormFieldType.SIGNATURE: {\r\n const fieldNameWithSuffix = ensureFieldSuffix(pdfFieldName, '_signature');\r\n actualFieldNames.set(field.name, fieldNameWithSuffix);\r\n const sigField = form.createTextField(fieldNameWithSuffix);\r\n sigField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: position.width,\r\n height: position.height,\r\n borderColor: rgb(0, 0, 1),\r\n backgroundColor: rgb(0.9, 0.9, 1),\r\n });\r\n\r\n if (field.label && field.label.trim()) {\r\n (sigField as unknown as PDFFormFieldWithAcro).acroField.dict.set(\r\n PDFName.of('TU'), PDFString.of(field.label)\r\n );\r\n }\r\n\r\n sigField.enableReadOnly();\r\n if (field.required) sigField.enableRequired();\r\n break;\r\n }\r\n\r\n case FormFieldType.INITIALS: {\r\n const fieldNameWithSuffix = ensureFieldSuffix(pdfFieldName, '_initials');\r\n actualFieldNames.set(field.name, fieldNameWithSuffix);\r\n const initialsField = form.createTextField(fieldNameWithSuffix);\r\n initialsField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: position.width,\r\n height: position.height,\r\n borderColor: rgb(0, 0, 1),\r\n backgroundColor: rgb(0.9, 1, 0.9),\r\n });\r\n\r\n if (field.label && field.label.trim()) {\r\n (initialsField as unknown as PDFFormFieldWithAcro).acroField.dict.set(\r\n PDFName.of('TU'), PDFString.of(field.label)\r\n );\r\n }\r\n\r\n initialsField.enableReadOnly();\r\n if (field.required) initialsField.enableRequired();\r\n break;\r\n }\r\n\r\n case FormFieldType.DATE: {\r\n const fieldNameWithSuffix = ensureFieldSuffix(pdfFieldName, '_date');\r\n actualFieldNames.set(field.name, fieldNameWithSuffix);\r\n const dateField = form.createTextField(fieldNameWithSuffix);\r\n dateField.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: position.width,\r\n height: position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n const tuValue = (field.placeholder && field.placeholder.trim())\r\n ? field.placeholder\r\n : (field.label && field.label.trim()) ? field.label : undefined;\r\n if (tuValue) {\r\n (dateField as unknown as PDFFormFieldWithAcro).acroField.dict.set(\r\n PDFName.of('TU'), PDFString.of(tuValue)\r\n );\r\n }\r\n\r\n if (field.required) dateField.enableRequired();\r\n break;\r\n }\r\n\r\n case FormFieldType.CHECKBOX: {\r\n const checkBox = form.createCheckBox(pdfFieldName);\r\n actualFieldNames.set(field.name, pdfFieldName);\r\n checkBox.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: position.width,\r\n height: position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n if (field.defaultValue === 'true' || field.defaultValue === 'checked') {\r\n checkBox.check();\r\n }\r\n\r\n if (field.required) checkBox.enableRequired();\r\n break;\r\n }\r\n\r\n case FormFieldType.DROPDOWN: {\r\n const dropdown = form.createDropdown(pdfFieldName);\r\n actualFieldNames.set(field.name, pdfFieldName);\r\n if (field.options && field.options.length > 0) {\r\n dropdown.setOptions(field.options);\r\n }\r\n dropdown.addToPage(page, {\r\n x: pdfX,\r\n y: pdfY,\r\n width: position.width,\r\n height: position.height,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n\r\n if (field.required) dropdown.enableRequired();\r\n break;\r\n }\r\n\r\n case FormFieldType.RADIO: {\r\n const radioGroup = form.createRadioGroup(pdfFieldName);\r\n actualFieldNames.set(field.name, pdfFieldName);\r\n if (field.options && field.options.length > 0) {\r\n const radioButtonSize = 20;\r\n const buttonGap = 4;\r\n const radioSpacing = radioButtonSize + buttonGap;\r\n const topPadding = 8;\r\n const fieldTopY = pdfY + position.height;\r\n\r\n field.options.forEach((option, index) => {\r\n const radioX = pdfX;\r\n const radioY = fieldTopY - topPadding - radioButtonSize - (index * radioSpacing);\r\n\r\n radioGroup.addOptionToPage(option, page, {\r\n x: radioX,\r\n y: radioY,\r\n width: radioButtonSize,\r\n height: radioButtonSize,\r\n borderColor: rgb(0.5, 0.5, 0.5),\r\n backgroundColor: rgb(1, 1, 1),\r\n });\r\n });\r\n }\r\n\r\n if (field.required) radioGroup.enableRequired();\r\n break;\r\n }\r\n\r\n case FormFieldType.TEXT_LABEL: {\r\n // TEXT_LABEL: draw text directly, no form field (matching document-prepare)\r\n const textContent = field.defaultValue || 'Text Label';\r\n const labelFontSize = field.fontSize && field.fontSize >= 8 && field.fontSize <= 72\r\n ? field.fontSize\r\n : Math.max(8, Math.min(16, position.height * 0.8));\r\n\r\n const textX = pdfX;\r\n const textY = pdfY + (position.height - labelFontSize) / 2;\r\n\r\n page.drawText(textContent, {\r\n x: textX,\r\n y: textY,\r\n size: labelFontSize,\r\n font,\r\n color: rgb(0, 0, 0),\r\n });\r\n break;\r\n }\r\n }\r\n } catch (err) {\r\n warnings.push(`Failed to create ${field.type} field \"${field.name}\": ${getErrorMessage(err)}`);\r\n }\r\n }\r\n\r\n // Build and store SigniphiMetadata in PDF document information dictionary\r\n initPdfMetadata({ PDFName, PDFString });\r\n const metadata = buildMetadataObject(fields, actualFieldNames);\r\n setSigniphiMetadata(pdfDoc, metadata);\r\n\r\n return warnings;\r\n}\r\n\r\nexport interface PdfGenerationResult {\r\n pdfBytes: Uint8Array;\r\n fieldPositions: Map<string, FormFieldPosition>;\r\n /** Non-fatal warnings about fields that failed to create */\r\n fieldWarnings?: string[];\r\n}\r\n\r\nexport interface PdfGenerationOptions {\r\n /** Draw visual placeholder boxes for fields in the PDF (default: false) */\r\n drawFieldPlaceholders?: boolean;\r\n /** Add interactive PDF form fields at field positions (default: false) */\r\n embedFormFields?: boolean;\r\n /** Fields data for form field creation (required when embedFormFields is true) */\r\n fields?: DocumentGeneratorField[];\r\n}\r\n\r\n/**\r\n * Generate a PDF from TipTap JSON content.\r\n *\r\n * For preview: call with defaults (no placeholders, no form fields) — field positions\r\n * are still tracked so React overlays can render on top of the PDF image.\r\n *\r\n * For export: call with { embedFormFields: true } to bake interactive form fields\r\n * into the PDF for downstream consumption (e.g. pdf-signer).\r\n */\r\nexport async function generatePdfFromContent(\r\n content: JSONContent,\r\n options: PdfGenerationOptions = {},\r\n): Promise<PdfGenerationResult> {\r\n const { drawFieldPlaceholders = false, embedFormFields = false, fields = [] } = options;\r\n\r\n const pdfDoc = await PDFDocument.create();\r\n const firstPage = pdfDoc.addPage([PAGE_WIDTH, PAGE_HEIGHT]);\r\n\r\n const fonts: FontSet = {\r\n regular: await pdfDoc.embedFont(StandardFonts.Helvetica),\r\n bold: await pdfDoc.embedFont(StandardFonts.HelveticaBold),\r\n italic: await pdfDoc.embedFont(StandardFonts.HelveticaOblique),\r\n boldItalic: await pdfDoc.embedFont(StandardFonts.HelveticaBoldOblique),\r\n };\r\n\r\n const state: LayoutState = {\r\n currentPage: firstPage,\r\n pageIndex: 0,\r\n y: 0,\r\n fonts,\r\n pdfDoc,\r\n fieldPositions: new Map(),\r\n drawFieldPlaceholders,\r\n };\r\n\r\n // Process all top-level blocks\r\n if (content.content) {\r\n for (const block of content.content) {\r\n processBlock(state, block);\r\n }\r\n }\r\n\r\n // Add interactive form fields only when requested (export mode)\r\n let fieldWarnings: string[] | undefined;\r\n if (embedFormFields && fields.length > 0) {\r\n const warnings = await addFormFields(pdfDoc, state.fieldPositions, fields);\r\n if (warnings.length > 0) fieldWarnings = warnings;\r\n }\r\n\r\n const pdfBytes = await pdfDoc.save({ useObjectStreams: false });\r\n\r\n return {\r\n pdfBytes,\r\n fieldPositions: state.fieldPositions,\r\n fieldWarnings,\r\n };\r\n}\r\n","import type { PdfPage } from '../types';\r\nimport { formatError, getErrorMessage } from './error-helpers';\r\n\r\n/**\r\n * Convert PDF bytes to page images using pdfjs-dist for the preview panel.\r\n * Dynamically imports pdfjs-dist to avoid SSR issues.\r\n */\r\nexport async function pdfToImages(\r\n pdfBytes: Uint8Array,\r\n scale: number = 2,\r\n): Promise<PdfPage[]> {\r\n // Dynamic import for pdfjs-dist\r\n let pdfjsLib;\r\n try {\r\n pdfjsLib = await import('pdfjs-dist');\r\n } catch (err) {\r\n throw new Error(formatError(\r\n 'Failed to load the PDF preview library — ensure pdfjs-dist is installed and the worker is accessible',\r\n err,\r\n ));\r\n }\r\n\r\n // Set worker source if not already set\r\n if (!pdfjsLib.GlobalWorkerOptions.workerSrc) {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n }\r\n\r\n let pdf;\r\n try {\r\n const loadingTask = pdfjsLib.getDocument({ data: pdfBytes });\r\n pdf = await loadingTask.promise;\r\n } catch (err) {\r\n throw new Error(formatError('Failed to parse the generated PDF for preview', err));\r\n }\r\n\r\n const pages: PdfPage[] = [];\r\n const pageErrors: string[] = [];\r\n\r\n for (let i = 1; i <= pdf.numPages; i++) {\r\n try {\r\n const page = await pdf.getPage(i);\r\n const viewport = page.getViewport({ scale });\r\n\r\n // Create canvas and render\r\n const canvas = document.createElement('canvas');\r\n canvas.width = viewport.width;\r\n canvas.height = viewport.height;\r\n const context = canvas.getContext('2d');\r\n\r\n if (!context) {\r\n throw new Error('Browser could not create a 2D canvas rendering context');\r\n }\r\n\r\n await page.render({\r\n canvasContext: context,\r\n viewport,\r\n }).promise;\r\n\r\n const imageUrl = canvas.toDataURL('image/png');\r\n const originalViewport = page.getViewport({ scale: 1 });\r\n\r\n pages.push({\r\n pageNumber: i,\r\n width: originalViewport.width,\r\n height: originalViewport.height,\r\n imageUrl,\r\n });\r\n\r\n // Cleanup\r\n page.cleanup();\r\n } catch (err) {\r\n pageErrors.push(`Page ${i}: ${getErrorMessage(err)}`);\r\n }\r\n }\r\n\r\n pdf.destroy();\r\n\r\n // If ALL pages failed, throw. If some succeeded, return what we got.\r\n if (pages.length === 0 && pageErrors.length > 0) {\r\n throw new Error(`Failed to render PDF pages:\\n${pageErrors.join('\\n')}`);\r\n }\r\n\r\n return pages;\r\n}\r\n","import { useState, useCallback, useRef, useEffect } from 'react';\r\nimport { useEditor, type Editor } from '@tiptap/react';\r\nimport StarterKit from '@tiptap/starter-kit';\r\nimport Underline from '@tiptap/extension-underline';\r\nimport TextAlign from '@tiptap/extension-text-align';\r\nimport Placeholder from '@tiptap/extension-placeholder';\r\nimport type { JSONContent } from '@tiptap/core';\r\nimport { FieldNode, type FieldNodeAttributes } from '../extensions/field-node';\r\nimport { VariableNode, type VariableNodeAttributes } from '../extensions/variable-node';\r\nimport { FormFieldType, type DocumentGeneratorField, type DocumentGeneratorVariable, type FormFieldPosition, type FormFieldForExport, type PdfPage, type DocumentGeneratorExportResult, type GeneratedDocument } from '../types';\r\nimport { extractFieldsFromContent, createFieldAttrs } from '../utils/field-helpers';\r\nimport { extractVariablesFromContent, replaceVariablesInContent } from '../utils/variable-helpers';\r\nimport { tiptapToMarkdown } from '../utils/markdown-writer';\r\nimport { markdownToTiptap } from '../utils/markdown-parser';\r\nimport { generatePdfFromContent } from '../utils/pdf-generator';\r\nimport { pdfToImages } from '../utils/pdf-preview';\r\nimport { formatError } from '../utils/error-helpers';\r\n\r\nexport interface UseDocumentGeneratorOptions {\r\n initialMarkdown?: string;\r\n initialContent?: JSONContent;\r\n placeholder?: string;\r\n onChange?: (data: {\r\n markdown: string;\r\n content: JSONContent;\r\n fields: DocumentGeneratorField[];\r\n variables: DocumentGeneratorVariable[];\r\n }) => void;\r\n}\r\n\r\nexport interface UseDocumentGeneratorReturn {\r\n editor: Editor | null;\r\n fields: DocumentGeneratorField[];\r\n variables: DocumentGeneratorVariable[];\r\n fieldPositions: Map<string, FormFieldPosition>;\r\n positionedFields: FormFieldForExport[];\r\n markdown: string;\r\n pdfBytes: Uint8Array | null;\r\n pdfPages: PdfPage[];\r\n isGenerating: boolean;\r\n error: string | null;\r\n fieldWarnings: string[];\r\n insertField: (type: FormFieldType, attrs?: Partial<FieldNodeAttributes>) => void;\r\n updateField: (fieldId: string, attrs: Partial<FieldNodeAttributes>) => void;\r\n deleteField: (fieldId: string) => void;\r\n insertVariable: (attrs: VariableNodeAttributes) => void;\r\n updateVariable: (varName: string, attrs: Partial<VariableNodeAttributes>) => void;\r\n deleteVariable: (varName: string) => void;\r\n generatePdf: () => Promise<void>;\r\n generateWithVariables: (values: Record<string, string>) => Promise<{ pdfBytes: Uint8Array; pdfPages: PdfPage[] }>;\r\n exportDocument: () => Promise<DocumentGeneratorExportResult | null>;\r\n exportMarkdown: () => string;\r\n getDocument: (title: string) => GeneratedDocument;\r\n loadDocument: (doc: GeneratedDocument) => void;\r\n}\r\n\r\nexport function useDocumentGenerator(\r\n options: UseDocumentGeneratorOptions = {}\r\n): UseDocumentGeneratorReturn {\r\n const [fields, setFields] = useState<DocumentGeneratorField[]>([]);\r\n const [variables, setVariables] = useState<DocumentGeneratorVariable[]>([]);\r\n const [fieldPositions, setFieldPositions] = useState<Map<string, FormFieldPosition>>(new Map());\r\n const [markdown, setMarkdown] = useState(options.initialMarkdown || '');\r\n const [pdfBytes, setPdfBytes] = useState<Uint8Array | null>(null);\r\n const [pdfPages, setPdfPages] = useState<PdfPage[]>([]);\r\n const [isGenerating, setIsGenerating] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [fieldWarnings, setFieldWarnings] = useState<string[]>([]);\r\n\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\r\n const onChangeRef = useRef(options.onChange);\r\n onChangeRef.current = options.onChange;\r\n\r\n // Determine initial content\r\n const initialContent = options.initialContent\r\n || (options.initialMarkdown ? markdownToTiptap(options.initialMarkdown) : undefined);\r\n\r\n const editor = useEditor({\r\n extensions: [\r\n StarterKit.configure({\r\n heading: { levels: [1, 2, 3] },\r\n }),\r\n Underline,\r\n TextAlign.configure({\r\n types: ['heading', 'paragraph'],\r\n }),\r\n Placeholder.configure({\r\n placeholder: options.placeholder || 'Start writing your document...',\r\n }),\r\n FieldNode,\r\n VariableNode,\r\n ],\r\n content: initialContent || { type: 'doc', content: [{ type: 'paragraph' }] },\r\n onUpdate: ({ editor: ed }) => {\r\n clearTimeout(debounceRef.current);\r\n debounceRef.current = setTimeout(() => {\r\n const content = ed.getJSON();\r\n const extractedFields = extractFieldsFromContent(content);\r\n const extractedVariables = extractVariablesFromContent(content);\r\n const md = tiptapToMarkdown(content);\r\n\r\n setFields(extractedFields);\r\n setVariables(extractedVariables);\r\n setMarkdown(md);\r\n\r\n onChangeRef.current?.({ markdown: md, content, fields: extractedFields, variables: extractedVariables });\r\n }, 150);\r\n },\r\n });\r\n\r\n // Extract fields and variables from initial content once the editor is ready\r\n useEffect(() => {\r\n if (!editor) return;\r\n const content = editor.getJSON();\r\n const extractedFields = extractFieldsFromContent(content);\r\n const extractedVariables = extractVariablesFromContent(content);\r\n const md = tiptapToMarkdown(content);\r\n setFields(extractedFields);\r\n setVariables(extractedVariables);\r\n setMarkdown(md);\r\n }, [editor]);\r\n\r\n // Cleanup debounce on unmount\r\n useEffect(() => {\r\n return () => clearTimeout(debounceRef.current);\r\n }, []);\r\n\r\n // Field operations\r\n const insertField = useCallback(\r\n (type: FormFieldType, overrides?: Partial<FieldNodeAttributes>) => {\r\n if (!editor) return;\r\n const attrs = createFieldAttrs(type, {\r\n fieldType: type,\r\n ...overrides,\r\n });\r\n editor.commands.insertField(attrs);\r\n },\r\n [editor]\r\n );\r\n\r\n const updateField = useCallback(\r\n (fieldId: string, attrs: Partial<FieldNodeAttributes>) => {\r\n if (!editor) return;\r\n editor.commands.updateField(fieldId, attrs);\r\n },\r\n [editor]\r\n );\r\n\r\n const deleteField = useCallback(\r\n (fieldId: string) => {\r\n if (!editor) return;\r\n editor.commands.removeField(fieldId);\r\n },\r\n [editor]\r\n );\r\n\r\n // Variable operations\r\n const insertVariable = useCallback(\r\n (attrs: VariableNodeAttributes) => {\r\n if (!editor) return;\r\n editor.commands.insertVariable(attrs);\r\n },\r\n [editor]\r\n );\r\n\r\n const updateVariable = useCallback(\r\n (varName: string, attrs: Partial<VariableNodeAttributes>) => {\r\n if (!editor) return;\r\n editor.commands.updateVariable(varName, attrs);\r\n },\r\n [editor]\r\n );\r\n\r\n const deleteVariable = useCallback(\r\n (varName: string) => {\r\n if (!editor) return;\r\n editor.commands.removeVariable(varName);\r\n },\r\n [editor]\r\n );\r\n\r\n const generatePdf = useCallback(async () => {\r\n if (!editor) return;\r\n setIsGenerating(true);\r\n setError(null);\r\n setFieldWarnings([]);\r\n try {\r\n const content = editor.getJSON();\r\n // Sync fields state so overlays match the generated PDF\r\n setFields(extractFieldsFromContent(content));\r\n setVariables(extractVariablesFromContent(content));\r\n\r\n // Preview: clean PDF without field placeholders or form widgets.\r\n // Field positions are still tracked so React FieldOverlay can render on top.\r\n const result = await generatePdfFromContent(content);\r\n setPdfBytes(result.pdfBytes);\r\n setFieldPositions(result.fieldPositions);\r\n if (result.fieldWarnings) {\r\n setFieldWarnings(result.fieldWarnings);\r\n }\r\n\r\n const pages = await pdfToImages(result.pdfBytes);\r\n setPdfPages(pages);\r\n } catch (err) {\r\n console.error('Failed to generate PDF:', err);\r\n setError(formatError('PDF generation failed', err));\r\n } finally {\r\n setIsGenerating(false);\r\n }\r\n }, [editor]);\r\n\r\n // Generate PDF with variables replaced by actual values\r\n const generateWithVariables = useCallback(\r\n async (values: Record<string, string>): Promise<{ pdfBytes: Uint8Array; pdfPages: PdfPage[] }> => {\r\n if (!editor) throw new Error('Editor is not initialized yet — wait for the editor to load before generating');\r\n const content = editor.getJSON();\r\n const replacedContent = replaceVariablesInContent(content, values);\r\n const result = await generatePdfFromContent(replacedContent);\r\n const pages = await pdfToImages(result.pdfBytes);\r\n return { pdfBytes: result.pdfBytes, pdfPages: pages };\r\n },\r\n [editor]\r\n );\r\n\r\n // A4 page height for coordinate conversion (must match pdf-generator.ts)\r\n const PDF_PAGE_HEIGHT = 841.89;\r\n\r\n // Derive positioned fields by merging field metadata with their PDF positions\r\n const positionedFields: FormFieldForExport[] = fields.map((f) => {\r\n const pos = fieldPositions.get(f.fieldId);\r\n return {\r\n id: f.name,\r\n fieldId: f.fieldId,\r\n type: f.type,\r\n name: f.name,\r\n label: f.label,\r\n position: pos || { x: 0, y: 0, width: 0, height: 0, page: 1 },\r\n required: f.required,\r\n options: f.options,\r\n placeholder: f.placeholder,\r\n fontSize: f.fontSize,\r\n defaultValue: f.defaultValue,\r\n multiline: f.multiline,\r\n maxLength: f.maxLength,\r\n acknowledgements: f.acknowledgements,\r\n };\r\n });\r\n\r\n const exportDocument = useCallback(async (): Promise<DocumentGeneratorExportResult | null> => {\r\n if (!editor) return null;\r\n setError(null);\r\n setFieldWarnings([]);\r\n try {\r\n const content = editor.getJSON();\r\n const exportFields = extractFieldsFromContent(content);\r\n\r\n // Regenerate PDF with interactive form fields embedded for downstream use\r\n const result = await generatePdfFromContent(content, {\r\n embedFormFields: true,\r\n fields: exportFields,\r\n });\r\n\r\n if (result.fieldWarnings) {\r\n setFieldWarnings(result.fieldWarnings);\r\n }\r\n\r\n const blob = new Blob([result.pdfBytes as BlobPart], { type: 'application/pdf' });\r\n\r\n return {\r\n pdfBlob: blob,\r\n fields: exportFields.map((f) => {\r\n const pos = result.fieldPositions.get(f.fieldId);\r\n // Convert from bottom-left (pdf-lib) to top-left (document-prepare convention)\r\n const exportPos = pos\r\n ? { ...pos, y: PDF_PAGE_HEIGHT - pos.y - pos.height }\r\n : { x: 0, y: 0, width: 0, height: 0, page: 1 };\r\n return {\r\n id: f.name,\r\n fieldId: f.fieldId,\r\n type: f.type,\r\n name: f.name,\r\n label: f.label,\r\n position: exportPos,\r\n required: f.required,\r\n options: f.options,\r\n placeholder: f.placeholder,\r\n fontSize: f.fontSize,\r\n defaultValue: f.defaultValue,\r\n multiline: f.multiline,\r\n maxLength: f.maxLength,\r\n acknowledgements: f.acknowledgements,\r\n };\r\n }),\r\n markdown,\r\n };\r\n } catch (err) {\r\n console.error('Document export failed:', err);\r\n setError(formatError('Document export failed', err));\r\n return null;\r\n }\r\n }, [editor, markdown]);\r\n\r\n const exportMarkdown = useCallback((): string => {\r\n if (!editor) return '';\r\n return tiptapToMarkdown(editor.getJSON());\r\n }, [editor]);\r\n\r\n const getDocument = useCallback(\r\n (title: string): GeneratedDocument => ({\r\n title,\r\n markdown,\r\n editorContent: editor?.getJSON() || { type: 'doc', content: [] },\r\n fields,\r\n createdAt: new Date().toISOString(),\r\n updatedAt: new Date().toISOString(),\r\n }),\r\n [editor, markdown, fields]\r\n );\r\n\r\n const loadDocument = useCallback(\r\n (doc: GeneratedDocument) => {\r\n if (!editor) return;\r\n if (doc.editorContent) {\r\n editor.commands.setContent(doc.editorContent);\r\n } else if (doc.markdown) {\r\n const content = markdownToTiptap(doc.markdown);\r\n editor.commands.setContent(content);\r\n }\r\n },\r\n [editor]\r\n );\r\n\r\n return {\r\n editor,\r\n fields,\r\n variables,\r\n fieldPositions,\r\n positionedFields,\r\n markdown,\r\n pdfBytes,\r\n pdfPages,\r\n isGenerating,\r\n error,\r\n fieldWarnings,\r\n insertField,\r\n updateField,\r\n deleteField,\r\n insertVariable,\r\n updateVariable,\r\n deleteVariable,\r\n generatePdf,\r\n generateWithVariables,\r\n exportDocument,\r\n exportMarkdown,\r\n getDocument,\r\n loadDocument,\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\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 md:h-12 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 * as React from \"react\"\r\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\r\nimport { cn } from \"../utils\"\r\n\r\nconst TooltipProvider = ({ children, ...props }: TooltipPrimitive.TooltipProviderProps) => (\r\n <TooltipPrimitive.Provider delayDuration={0} {...props}>\r\n {children}\r\n </TooltipPrimitive.Provider>\r\n)\r\n\r\nconst Tooltip = TooltipPrimitive.Root\r\n\r\nconst TooltipTrigger = TooltipPrimitive.Trigger\r\n\r\nconst TooltipContent = React.forwardRef<\r\n React.ElementRef<typeof TooltipPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\r\n>(({ className, sideOffset = 4, children, ...props }, ref) => (\r\n <TooltipPrimitive.Portal>\r\n <TooltipPrimitive.Content\r\n ref={ref}\r\n sideOffset={sideOffset}\r\n className=\"signiphi-pdf-compose\"\r\n {...props}\r\n >\r\n <div className={cn(\r\n \"z-50 overflow-hidden rounded-md border border-border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md\",\r\n className\r\n )}>\r\n {children}\r\n </div>\r\n </TooltipPrimitive.Content>\r\n </TooltipPrimitive.Portal>\r\n))\r\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\r\n\r\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\r\n","import React, { useCallback } from 'react';\r\nimport type { Editor } from '@tiptap/react';\r\nimport { NodeSelection } from '@tiptap/pm/state';\r\nimport {\r\n Bold,\r\n Italic,\r\n Underline as UnderlineIcon,\r\n Heading1,\r\n Heading2,\r\n Heading3,\r\n List,\r\n ListOrdered,\r\n Quote,\r\n Minus,\r\n Code,\r\n AlignLeft,\r\n AlignCenter,\r\n AlignRight,\r\n Undo,\r\n Redo,\r\n PanelLeftClose,\r\n} from 'lucide-react';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } from '../lib/ui/tooltip';\r\nimport { cn } from '../lib/utils';\r\n\r\ninterface ToolbarButtonProps {\r\n icon: React.ElementType;\r\n label: string;\r\n isActive?: boolean;\r\n disabled?: boolean;\r\n onClick: () => void;\r\n}\r\n\r\nfunction ToolbarButton({ icon: Icon, label, isActive, disabled, onClick }: ToolbarButtonProps) {\r\n return (\r\n <Tooltip>\r\n <TooltipTrigger asChild>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className={cn(\r\n 'h-8 w-8',\r\n isActive && 'bg-accent text-accent-foreground',\r\n )}\r\n disabled={disabled}\r\n onClick={onClick}\r\n >\r\n <Icon size={16} />\r\n </Button>\r\n </TooltipTrigger>\r\n <TooltipContent side=\"bottom\">\r\n {label}\r\n </TooltipContent>\r\n </Tooltip>\r\n );\r\n}\r\n\r\nfunction ToolbarSeparator() {\r\n return <div className=\"mx-1 h-6 w-px bg-border\" />;\r\n}\r\n\r\ninterface EditorToolbarProps {\r\n editor: Editor | null;\r\n insertFieldButton: React.ReactNode;\r\n insertVariableButton?: React.ReactNode;\r\n onCollapse?: () => void;\r\n}\r\n\r\nfunction isMarkActiveOnSelection(editor: Editor, markName: string): boolean {\r\n if (editor.isActive(markName)) return true;\r\n const { selection } = editor.state;\r\n if (selection instanceof NodeSelection && selection.node.type.name === 'variableNode') {\r\n const markType = editor.schema.marks[markName];\r\n return markType ? !!markType.isInSet(selection.node.marks) : false;\r\n }\r\n return false;\r\n}\r\n\r\nexport function EditorToolbar({ editor, insertFieldButton, insertVariableButton, onCollapse }: EditorToolbarProps) {\r\n const toggle = useCallback(\r\n (command: () => boolean) => {\r\n if (!editor) return;\r\n command();\r\n editor.commands.focus();\r\n },\r\n [editor],\r\n );\r\n\r\n if (!editor) return null;\r\n\r\n return (\r\n <TooltipProvider>\r\n <div className=\"flex items-center flex-wrap gap-0.5 px-2 py-1.5 bg-muted/30\">\r\n {/* Collapse editor */}\r\n {onCollapse && (\r\n <>\r\n <ToolbarButton\r\n icon={PanelLeftClose}\r\n label=\"Collapse\"\r\n onClick={onCollapse}\r\n />\r\n <ToolbarSeparator />\r\n </>\r\n )}\r\n\r\n {/* Undo/Redo */}\r\n <ToolbarButton\r\n icon={Undo}\r\n label=\"Undo\"\r\n disabled={!editor.can().undo()}\r\n onClick={() => toggle(() => editor.chain().focus().undo().run())}\r\n />\r\n <ToolbarButton\r\n icon={Redo}\r\n label=\"Redo\"\r\n disabled={!editor.can().redo()}\r\n onClick={() => toggle(() => editor.chain().focus().redo().run())}\r\n />\r\n\r\n <ToolbarSeparator />\r\n\r\n {/* Text formatting */}\r\n <ToolbarButton\r\n icon={Bold}\r\n label=\"Bold\"\r\n isActive={isMarkActiveOnSelection(editor, 'bold')}\r\n onClick={() => toggle(() => editor.chain().focus().toggleBold().run())}\r\n />\r\n <ToolbarButton\r\n icon={Italic}\r\n label=\"Italic\"\r\n isActive={isMarkActiveOnSelection(editor, 'italic')}\r\n onClick={() => toggle(() => editor.chain().focus().toggleItalic().run())}\r\n />\r\n <ToolbarButton\r\n icon={UnderlineIcon}\r\n label=\"Underline\"\r\n isActive={isMarkActiveOnSelection(editor, 'underline')}\r\n onClick={() => toggle(() => editor.chain().focus().toggleUnderline().run())}\r\n />\r\n <ToolbarButton\r\n icon={Code}\r\n label=\"Code\"\r\n isActive={editor.isActive('code')}\r\n onClick={() => toggle(() => editor.chain().focus().toggleCode().run())}\r\n />\r\n\r\n <ToolbarSeparator />\r\n\r\n {/* Headings */}\r\n <ToolbarButton\r\n icon={Heading1}\r\n label=\"Heading 1\"\r\n isActive={editor.isActive('heading', { level: 1 })}\r\n onClick={() => toggle(() => editor.chain().focus().toggleHeading({ level: 1 }).run())}\r\n />\r\n <ToolbarButton\r\n icon={Heading2}\r\n label=\"Heading 2\"\r\n isActive={editor.isActive('heading', { level: 2 })}\r\n onClick={() => toggle(() => editor.chain().focus().toggleHeading({ level: 2 }).run())}\r\n />\r\n <ToolbarButton\r\n icon={Heading3}\r\n label=\"Heading 3\"\r\n isActive={editor.isActive('heading', { level: 3 })}\r\n onClick={() => toggle(() => editor.chain().focus().toggleHeading({ level: 3 }).run())}\r\n />\r\n\r\n <ToolbarSeparator />\r\n\r\n {/* Lists */}\r\n <ToolbarButton\r\n icon={List}\r\n label=\"Bullet List\"\r\n isActive={editor.isActive('bulletList')}\r\n onClick={() => toggle(() => editor.chain().focus().toggleBulletList().run())}\r\n />\r\n <ToolbarButton\r\n icon={ListOrdered}\r\n label=\"Ordered List\"\r\n isActive={editor.isActive('orderedList')}\r\n onClick={() => toggle(() => editor.chain().focus().toggleOrderedList().run())}\r\n />\r\n\r\n <ToolbarSeparator />\r\n\r\n {/* Block elements */}\r\n <ToolbarButton\r\n icon={Quote}\r\n label=\"Blockquote\"\r\n isActive={editor.isActive('blockquote')}\r\n onClick={() => toggle(() => editor.chain().focus().toggleBlockquote().run())}\r\n />\r\n <ToolbarButton\r\n icon={Minus}\r\n label=\"Horizontal Rule\"\r\n onClick={() => toggle(() => editor.chain().focus().setHorizontalRule().run())}\r\n />\r\n\r\n <ToolbarSeparator />\r\n\r\n {/* Alignment */}\r\n <ToolbarButton\r\n icon={AlignLeft}\r\n label=\"Align Left\"\r\n isActive={editor.isActive({ textAlign: 'left' })}\r\n onClick={() => toggle(() => editor.chain().focus().setTextAlign('left').run())}\r\n />\r\n <ToolbarButton\r\n icon={AlignCenter}\r\n label=\"Align Center\"\r\n isActive={editor.isActive({ textAlign: 'center' })}\r\n onClick={() => toggle(() => editor.chain().focus().setTextAlign('center').run())}\r\n />\r\n <ToolbarButton\r\n icon={AlignRight}\r\n label=\"Align Right\"\r\n isActive={editor.isActive({ textAlign: 'right' })}\r\n onClick={() => toggle(() => editor.chain().focus().setTextAlign('right').run())}\r\n />\r\n\r\n <ToolbarSeparator />\r\n\r\n {/* Insert Field */}\r\n {insertFieldButton}\r\n\r\n {/* Insert Variable */}\r\n {insertVariableButton}\r\n </div>\r\n </TooltipProvider>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport * as React from 'react';\r\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\r\nimport { cn } from '../utils';\r\n\r\nconst Popover = PopoverPrimitive.Root;\r\nconst PopoverTrigger = PopoverPrimitive.Trigger;\r\nconst PopoverAnchor = PopoverPrimitive.Anchor;\r\n\r\nconst PopoverContent = React.forwardRef<\r\n React.ComponentRef<typeof PopoverPrimitive.Content>,\r\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\r\n>(({ className, align = 'center', sideOffset = 4, children, ...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=\"signiphi-pdf-compose\"\r\n {...props}\r\n >\r\n <div className={cn(\r\n 'z-50 w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none',\r\n className,\r\n )}>\r\n {children}\r\n </div>\r\n </PopoverPrimitive.Content>\r\n </PopoverPrimitive.Portal>\r\n));\r\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\r\n\r\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\r\n","import * as React from 'react';\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-2 border-input bg-background px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground transition-all duration-200 focus:outline-none focus:border-primary focus:ring-0 focus:shadow-[0_0_0_3px_rgba(0,153,205,0.15)] focus-visible:outline-none focus-visible:border-primary focus-visible:ring-0 focus-visible:shadow-[0_0_0_3px_rgba(0,153,205,0.15)] 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\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 children?: React.ReactNode;\r\n }\r\n>(({ className, ...props }, ref) => (\r\n <LabelPrimitive.Root\r\n ref={ref}\r\n className={cn(labelVariants(), className)}\r\n {...props}\r\n />\r\n));\r\nLabel.displayName = LabelPrimitive.Root.displayName;\r\n\r\nexport { Label };\r\n","import React, { useState, useCallback } from 'react';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport {\r\n Type,\r\n PenTool,\r\n Hash,\r\n Calendar,\r\n CheckSquare,\r\n Circle,\r\n ChevronDown,\r\n ChevronRight,\r\n FileText,\r\n Plus,\r\n X,\r\n} from 'lucide-react';\r\nimport { Popover, PopoverTrigger, PopoverContent } from '../lib/ui/popover';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Input } from '../lib/ui/input';\r\nimport { Label } from '../lib/ui/label';\r\nimport { FormFieldType, type Acknowledgement } from '../types';\r\nimport type { FieldNodeAttributes } from '../extensions/field-node';\r\nimport { cn } from '../lib/utils';\r\n\r\nconst FIELD_TYPES = [\r\n { type: FormFieldType.TEXT, icon: Type, label: 'Text', color: 'bg-blue-100 text-blue-700 border-blue-300 hover:bg-blue-200' },\r\n { type: FormFieldType.SIGNATURE, icon: PenTool, label: 'Signature', color: 'bg-purple-100 text-purple-700 border-purple-300 hover:bg-purple-200' },\r\n { type: FormFieldType.INITIALS, icon: Hash, label: 'Initials', color: 'bg-green-100 text-green-700 border-green-300 hover:bg-green-200' },\r\n { type: FormFieldType.DATE, icon: Calendar, label: 'Date', color: 'bg-amber-100 text-amber-700 border-amber-300 hover:bg-amber-200' },\r\n { type: FormFieldType.CHECKBOX, icon: CheckSquare, label: 'Checkbox', color: 'bg-teal-100 text-teal-700 border-teal-300 hover:bg-teal-200' },\r\n { type: FormFieldType.RADIO, icon: Circle, label: 'Radio', color: 'bg-pink-100 text-pink-700 border-pink-300 hover:bg-pink-200' },\r\n { type: FormFieldType.DROPDOWN, icon: ChevronDown, label: 'Dropdown', color: 'bg-indigo-100 text-indigo-700 border-indigo-300 hover:bg-indigo-200' },\r\n { type: FormFieldType.TEXT_LABEL, icon: FileText, label: 'Label', color: 'bg-gray-100 text-gray-700 border-gray-300 hover:bg-gray-200' },\r\n] as const;\r\n\r\ninterface FieldInsertPopoverProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onInsert: (type: FormFieldType, attrs?: Partial<FieldNodeAttributes>) => void;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function FieldInsertPopover({\r\n open,\r\n onOpenChange,\r\n onInsert,\r\n children,\r\n}: FieldInsertPopoverProps) {\r\n const [step, setStep] = useState<'type' | 'configure'>('type');\r\n const [selectedType, setSelectedType] = useState<FormFieldType | null>(null);\r\n // Essential\r\n const [label, setLabel] = useState('');\r\n const [required, setRequired] = useState(false);\r\n const [options, setOptions] = useState('');\r\n const [placeholder, setPlaceholder] = useState('');\r\n const [defaultValue, setDefaultValue] = useState('');\r\n // Advanced\r\n const [advancedOpen, setAdvancedOpen] = useState(false);\r\n const [fontSize, setFontSize] = useState('');\r\n const [multiline, setMultiline] = useState(false);\r\n const [maxLength, setMaxLength] = useState('');\r\n // Acknowledgements\r\n const [acknowledgements, setAcknowledgements] = useState<Acknowledgement[]>([]);\r\n const [isAddingAck, setIsAddingAck] = useState(false);\r\n const [ackTitle, setAckTitle] = useState('');\r\n const [ackDescription, setAckDescription] = useState('');\r\n\r\n const reset = useCallback(() => {\r\n setStep('type');\r\n setSelectedType(null);\r\n setLabel('');\r\n setRequired(false);\r\n setOptions('');\r\n setPlaceholder('');\r\n setDefaultValue('');\r\n setAdvancedOpen(false);\r\n setFontSize('');\r\n setMultiline(false);\r\n setMaxLength('');\r\n setAcknowledgements([]);\r\n setIsAddingAck(false);\r\n setAckTitle('');\r\n setAckDescription('');\r\n }, []);\r\n\r\n const handleOpenChange = useCallback(\r\n (nextOpen: boolean) => {\r\n if (!nextOpen) reset();\r\n onOpenChange(nextOpen);\r\n },\r\n [onOpenChange, reset],\r\n );\r\n\r\n const handleTypeSelect = useCallback((type: FormFieldType) => {\r\n setSelectedType(type);\r\n setStep('configure');\r\n }, []);\r\n\r\n const handleInsert = useCallback(() => {\r\n if (!selectedType) return;\r\n const attrs: Partial<FieldNodeAttributes> = {};\r\n if (label) attrs.fieldLabel = label;\r\n attrs.required = required;\r\n if (options) attrs.options = options;\r\n if (placeholder) attrs.placeholder = placeholder;\r\n if (defaultValue) attrs.defaultValue = defaultValue;\r\n if (fontSize) attrs.fontSize = parseInt(fontSize, 10) || null;\r\n if (multiline) attrs.multiline = multiline;\r\n if (maxLength) attrs.maxLength = parseInt(maxLength, 10) || null;\r\n if (acknowledgements.length > 0) {\r\n attrs.acknowledgements = JSON.stringify(acknowledgements);\r\n }\r\n onInsert(selectedType, attrs);\r\n handleOpenChange(false);\r\n }, [selectedType, label, required, options, placeholder, defaultValue, fontSize, multiline, maxLength, acknowledgements, onInsert, handleOpenChange]);\r\n\r\n const addAcknowledgement = useCallback(() => {\r\n if (!ackTitle.trim()) return;\r\n const newAck: Acknowledgement = {\r\n id: uuidv4(),\r\n title: ackTitle.trim(),\r\n description: ackDescription.trim(),\r\n };\r\n setAcknowledgements(prev => {\r\n const updated = [...prev, newAck];\r\n // Auto-set required when first acknowledgement is added\r\n if (updated.length === 1) setRequired(true);\r\n return updated;\r\n });\r\n setAckTitle('');\r\n setAckDescription('');\r\n setIsAddingAck(false);\r\n }, [ackTitle, ackDescription]);\r\n\r\n const removeAcknowledgement = useCallback((id: string) => {\r\n setAcknowledgements(prev => prev.filter(a => a.id !== id));\r\n }, []);\r\n\r\n const showLabel = selectedType !== FormFieldType.TEXT_LABEL;\r\n const showPlaceholder = selectedType === FormFieldType.TEXT || selectedType === FormFieldType.DATE;\r\n const showOptions = selectedType === FormFieldType.DROPDOWN || selectedType === FormFieldType.RADIO;\r\n const showDefaultValue = selectedType === FormFieldType.TEXT || selectedType === FormFieldType.TEXT_LABEL;\r\n const showFontSize = selectedType === FormFieldType.TEXT || selectedType === FormFieldType.TEXT_LABEL;\r\n const showMultiline = selectedType === FormFieldType.TEXT;\r\n const showMaxLength = selectedType === FormFieldType.TEXT;\r\n const showRequired = selectedType !== FormFieldType.TEXT_LABEL;\r\n const showAcknowledgements = selectedType !== FormFieldType.TEXT_LABEL;\r\n const hasAdvancedFields = showFontSize || showMultiline || showMaxLength || showAcknowledgements;\r\n\r\n return (\r\n <Popover open={open} onOpenChange={handleOpenChange}>\r\n <PopoverTrigger asChild>{children}</PopoverTrigger>\r\n <PopoverContent className=\"w-80 p-0\" align=\"start\" sideOffset={8}>\r\n {step === 'type' && (\r\n <div className=\"p-3\">\r\n <p className=\"mb-2 text-sm font-medium text-foreground\">Select field type</p>\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n {FIELD_TYPES.map(({ type, icon: Icon, label: typeLabel, color }) => (\r\n <button\r\n key={type}\r\n className={cn(\r\n 'flex items-center gap-2 rounded-md border px-3 py-2 text-xs font-medium transition-colors',\r\n color,\r\n )}\r\n onClick={() => handleTypeSelect(type)}\r\n >\r\n <Icon size={14} />\r\n {typeLabel}\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {step === 'configure' && selectedType && (\r\n <div className=\"p-3 space-y-3\">\r\n <div className=\"flex items-center justify-between\">\r\n <p className=\"text-sm font-medium text-foreground\">Configure field</p>\r\n <button\r\n className=\"text-xs text-muted-foreground hover:text-foreground\"\r\n onClick={() => setStep('type')}\r\n >\r\n Back\r\n </button>\r\n </div>\r\n\r\n {/* Essential Properties */}\r\n <div className=\"space-y-2\">\r\n {showLabel && (\r\n <div>\r\n <Label htmlFor=\"field-label\" className=\"text-xs\">Label</Label>\r\n <Input\r\n id=\"field-label\"\r\n value={label}\r\n onChange={(e) => setLabel(e.target.value)}\r\n placeholder=\"e.g. Customer Signature\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showDefaultValue && (\r\n <div>\r\n <Label htmlFor=\"field-default\" className=\"text-xs\">\r\n {selectedType === FormFieldType.TEXT_LABEL ? 'Text Content' : 'Default Value'}\r\n </Label>\r\n <Input\r\n id=\"field-default\"\r\n value={defaultValue}\r\n onChange={(e) => setDefaultValue(e.target.value)}\r\n placeholder={selectedType === FormFieldType.TEXT_LABEL ? 'Text Label' : 'Default value'}\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showPlaceholder && (\r\n <div>\r\n <Label htmlFor=\"field-placeholder\" className=\"text-xs\">Placeholder</Label>\r\n <Input\r\n id=\"field-placeholder\"\r\n value={placeholder}\r\n onChange={(e) => setPlaceholder(e.target.value)}\r\n placeholder=\"e.g. Enter your name\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showOptions && (\r\n <div>\r\n <Label htmlFor=\"field-options\" className=\"text-xs\">Options (comma-separated)</Label>\r\n <Input\r\n id=\"field-options\"\r\n value={options}\r\n onChange={(e) => setOptions(e.target.value)}\r\n placeholder=\"e.g. Option A, Option B, Option C\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showRequired && (\r\n <label className=\"flex items-center gap-2 cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={required}\r\n onChange={(e) => setRequired(e.target.checked)}\r\n className=\"h-3.5 w-3.5 rounded border-border\"\r\n />\r\n <span className=\"text-xs text-muted-foreground\">Required field</span>\r\n </label>\r\n )}\r\n </div>\r\n\r\n {/* Advanced Section */}\r\n {hasAdvancedFields && (\r\n <div className=\"border-t border-border pt-2\">\r\n <button\r\n className=\"flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground w-full\"\r\n onClick={() => setAdvancedOpen(!advancedOpen)}\r\n >\r\n {advancedOpen ? <ChevronDown size={12} /> : <ChevronRight size={12} />}\r\n Advanced\r\n </button>\r\n\r\n {advancedOpen && (\r\n <div className=\"mt-2 space-y-2\">\r\n {showFontSize && (\r\n <div>\r\n <Label htmlFor=\"field-fontsize\" className=\"text-xs\">Font Size (8-72)</Label>\r\n <Input\r\n id=\"field-fontsize\"\r\n type=\"number\"\r\n min=\"8\"\r\n max=\"72\"\r\n value={fontSize}\r\n onChange={(e) => setFontSize(e.target.value)}\r\n placeholder=\"12\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showMultiline && (\r\n <label className=\"flex items-center gap-2 cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={multiline}\r\n onChange={(e) => setMultiline(e.target.checked)}\r\n className=\"h-3.5 w-3.5 rounded border-border\"\r\n />\r\n <span className=\"text-xs text-muted-foreground\">Multiline</span>\r\n </label>\r\n )}\r\n\r\n {showMaxLength && (\r\n <div>\r\n <Label htmlFor=\"field-maxlength\" className=\"text-xs\">Max Length</Label>\r\n <Input\r\n id=\"field-maxlength\"\r\n type=\"number\"\r\n min=\"1\"\r\n value={maxLength}\r\n onChange={(e) => setMaxLength(e.target.value)}\r\n placeholder=\"No limit\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Acknowledgements */}\r\n {showAcknowledgements && (\r\n <div className=\"space-y-1.5\">\r\n <Label className=\"text-xs\">Acknowledgements</Label>\r\n\r\n {acknowledgements.length === 0 && !isAddingAck && (\r\n <p className=\"text-[10px] text-muted-foreground\">No acknowledgements added</p>\r\n )}\r\n\r\n {acknowledgements.map((ack) => (\r\n <div key={ack.id} className=\"flex items-start gap-1.5 rounded border border-border p-1.5\">\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-[11px] font-medium text-foreground truncate\">{ack.title}</p>\r\n {ack.description && (\r\n <p className=\"text-[10px] text-muted-foreground truncate\">{ack.description}</p>\r\n )}\r\n </div>\r\n <button\r\n className=\"text-muted-foreground hover:text-destructive shrink-0 mt-0.5\"\r\n onClick={() => removeAcknowledgement(ack.id)}\r\n >\r\n <X size={12} />\r\n </button>\r\n </div>\r\n ))}\r\n\r\n {isAddingAck ? (\r\n <div className=\"space-y-1.5 rounded border border-border p-2\">\r\n <Input\r\n value={ackTitle}\r\n onChange={(e) => setAckTitle(e.target.value)}\r\n placeholder=\"Title (required)\"\r\n className=\"h-7 text-xs\"\r\n />\r\n <Input\r\n value={ackDescription}\r\n onChange={(e) => setAckDescription(e.target.value)}\r\n placeholder=\"Description (optional)\"\r\n className=\"h-7 text-xs\"\r\n />\r\n <div className=\"flex gap-1.5\">\r\n <Button\r\n size=\"sm\"\r\n className=\"h-6 text-[10px] flex-1\"\r\n onClick={addAcknowledgement}\r\n disabled={!ackTitle.trim()}\r\n >\r\n Add\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-6 text-[10px]\"\r\n onClick={() => { setIsAddingAck(false); setAckTitle(''); setAckDescription(''); }}\r\n >\r\n Cancel\r\n </Button>\r\n </div>\r\n </div>\r\n ) : (\r\n <button\r\n className=\"flex items-center gap-1 text-[11px] text-primary hover:text-primary/80\"\r\n onClick={() => setIsAddingAck(true)}\r\n >\r\n <Plus size={11} />\r\n Add acknowledgement\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div className=\"flex gap-2 pt-1\">\r\n <Button\r\n size=\"sm\"\r\n className=\"h-8 flex-1 text-xs\"\r\n onClick={handleInsert}\r\n >\r\n Insert\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 text-xs\"\r\n onClick={() => handleOpenChange(false)}\r\n >\r\n Cancel\r\n </Button>\r\n </div>\r\n </div>\r\n )}\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n","import React, { useState, useEffect, useCallback } from 'react';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport {\r\n Type,\r\n PenTool,\r\n Hash,\r\n Calendar,\r\n CheckSquare,\r\n Circle,\r\n ChevronDown,\r\n ChevronRight,\r\n FileText,\r\n Trash2,\r\n Plus,\r\n X,\r\n} from 'lucide-react';\r\nimport { Popover, PopoverContent, PopoverAnchor } from '../lib/ui/popover';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Input } from '../lib/ui/input';\r\nimport { Label } from '../lib/ui/label';\r\nimport { FormFieldType, type Acknowledgement } from '../types';\r\nimport type { FieldNodeAttributes } from '../extensions/field-node';\r\nimport { cn } from '../lib/utils';\r\n\r\nconst FIELD_TYPE_META: Record<string, { icon: React.ElementType; label: string; color: string }> = {\r\n [FormFieldType.TEXT]: { icon: Type, label: 'Text', color: 'text-blue-600' },\r\n [FormFieldType.SIGNATURE]: { icon: PenTool, label: 'Signature', color: 'text-purple-600' },\r\n [FormFieldType.INITIALS]: { icon: Hash, label: 'Initials', color: 'text-green-600' },\r\n [FormFieldType.DATE]: { icon: Calendar, label: 'Date', color: 'text-amber-600' },\r\n [FormFieldType.CHECKBOX]: { icon: CheckSquare, label: 'Checkbox', color: 'text-teal-600' },\r\n [FormFieldType.RADIO]: { icon: Circle, label: 'Radio', color: 'text-pink-600' },\r\n [FormFieldType.DROPDOWN]: { icon: ChevronDown, label: 'Dropdown', color: 'text-indigo-600' },\r\n [FormFieldType.TEXT_LABEL]: { icon: FileText, label: 'Label', color: 'text-gray-600' },\r\n};\r\n\r\ninterface FieldEditPopoverProps {\r\n fieldId: string | null;\r\n attrs: Partial<FieldNodeAttributes> | null;\r\n anchorEl: HTMLElement | null;\r\n onUpdate: (fieldId: string, attrs: Partial<FieldNodeAttributes>) => void;\r\n onDelete: (fieldId: string) => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport function FieldEditPopover({\r\n fieldId,\r\n attrs,\r\n anchorEl,\r\n onUpdate,\r\n onDelete,\r\n onClose,\r\n}: FieldEditPopoverProps) {\r\n // Essential\r\n const [label, setLabel] = useState('');\r\n const [required, setRequired] = useState(false);\r\n const [options, setOptions] = useState('');\r\n const [placeholder, setPlaceholder] = useState('');\r\n const [defaultValue, setDefaultValue] = useState('');\r\n // Advanced\r\n const [advancedOpen, setAdvancedOpen] = useState(false);\r\n const [fontSize, setFontSize] = useState('');\r\n const [multiline, setMultiline] = useState(false);\r\n const [maxLength, setMaxLength] = useState('');\r\n // Acknowledgements\r\n const [acknowledgements, setAcknowledgements] = useState<Acknowledgement[]>([]);\r\n const [isAddingAck, setIsAddingAck] = useState(false);\r\n const [ackTitle, setAckTitle] = useState('');\r\n const [ackDescription, setAckDescription] = useState('');\r\n\r\n useEffect(() => {\r\n if (attrs) {\r\n setLabel(String(attrs.fieldLabel || ''));\r\n setRequired(Boolean(attrs.required));\r\n setOptions(String(attrs.options || ''));\r\n setPlaceholder(String(attrs.placeholder || ''));\r\n setDefaultValue(String(attrs.defaultValue || ''));\r\n setFontSize(attrs.fontSize ? String(attrs.fontSize) : '');\r\n setMultiline(Boolean(attrs.multiline));\r\n setMaxLength(attrs.maxLength ? String(attrs.maxLength) : '');\r\n // Parse acknowledgements from JSON string\r\n try {\r\n const acks = attrs.acknowledgements ? JSON.parse(attrs.acknowledgements) : [];\r\n setAcknowledgements(Array.isArray(acks) ? acks : []);\r\n } catch {\r\n setAcknowledgements([]);\r\n }\r\n setAdvancedOpen(false);\r\n setIsAddingAck(false);\r\n setAckTitle('');\r\n setAckDescription('');\r\n }\r\n }, [attrs]);\r\n\r\n const handleSave = useCallback(() => {\r\n if (!fieldId) return;\r\n const updates: Partial<FieldNodeAttributes> = {\r\n fieldLabel: label,\r\n required,\r\n options,\r\n placeholder,\r\n defaultValue,\r\n fontSize: fontSize ? parseInt(fontSize, 10) || null : null,\r\n multiline,\r\n maxLength: maxLength ? parseInt(maxLength, 10) || null : null,\r\n acknowledgements: acknowledgements.length > 0 ? JSON.stringify(acknowledgements) : '',\r\n };\r\n onUpdate(fieldId, updates);\r\n onClose();\r\n }, [fieldId, label, required, options, placeholder, defaultValue, fontSize, multiline, maxLength, acknowledgements, onUpdate, onClose]);\r\n\r\n const handleDelete = useCallback(() => {\r\n if (!fieldId) return;\r\n onDelete(fieldId);\r\n onClose();\r\n }, [fieldId, onDelete, onClose]);\r\n\r\n const addAcknowledgement = useCallback(() => {\r\n if (!ackTitle.trim()) return;\r\n const newAck: Acknowledgement = {\r\n id: uuidv4(),\r\n title: ackTitle.trim(),\r\n description: ackDescription.trim(),\r\n };\r\n setAcknowledgements(prev => {\r\n const updated = [...prev, newAck];\r\n if (updated.length === 1) setRequired(true);\r\n return updated;\r\n });\r\n setAckTitle('');\r\n setAckDescription('');\r\n setIsAddingAck(false);\r\n }, [ackTitle, ackDescription]);\r\n\r\n const removeAcknowledgement = useCallback((id: string) => {\r\n setAcknowledgements(prev => prev.filter(a => a.id !== id));\r\n }, []);\r\n\r\n const isOpen = fieldId !== null && attrs !== null;\r\n const fieldType = attrs?.fieldType as string;\r\n const meta = FIELD_TYPE_META[fieldType] || FIELD_TYPE_META[FormFieldType.TEXT];\r\n const Icon = meta.icon;\r\n\r\n const showLabel = fieldType !== FormFieldType.TEXT_LABEL;\r\n const showPlaceholder = fieldType === FormFieldType.TEXT || fieldType === FormFieldType.DATE;\r\n const showOptions = fieldType === FormFieldType.DROPDOWN || fieldType === FormFieldType.RADIO;\r\n const showDefaultValue = fieldType === FormFieldType.TEXT || fieldType === FormFieldType.TEXT_LABEL;\r\n const showFontSize = fieldType === FormFieldType.TEXT || fieldType === FormFieldType.TEXT_LABEL;\r\n const showMultiline = fieldType === FormFieldType.TEXT;\r\n const showMaxLength = fieldType === FormFieldType.TEXT;\r\n const showRequired = fieldType !== FormFieldType.TEXT_LABEL;\r\n const showAcknowledgements = fieldType !== FormFieldType.TEXT_LABEL;\r\n const hasAdvancedFields = showFontSize || showMultiline || showMaxLength || showAcknowledgements;\r\n\r\n return (\r\n <Popover open={isOpen} onOpenChange={(open) => { if (!open) onClose(); }}>\r\n {anchorEl && (\r\n <PopoverAnchor virtualRef={{ current: anchorEl }} />\r\n )}\r\n <PopoverContent className=\"w-72 p-0\" align=\"start\" sideOffset={8}>\r\n <div className=\"p-3 space-y-3\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className={cn('flex items-center gap-1.5 text-sm font-medium', meta.color)}>\r\n <Icon size={14} />\r\n <span>{meta.label} Field</span>\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-7 w-7 text-destructive hover:text-destructive\"\r\n onClick={handleDelete}\r\n >\r\n <Trash2 size={14} />\r\n </Button>\r\n </div>\r\n\r\n {/* Essential Properties */}\r\n <div className=\"space-y-2\">\r\n {/* Field name (read-only) */}\r\n <div>\r\n <Label htmlFor=\"edit-field-name\" className=\"text-xs\">Name</Label>\r\n <Input\r\n id=\"edit-field-name\"\r\n value={String(attrs?.fieldName || '')}\r\n disabled\r\n className=\"h-8 text-xs opacity-60\"\r\n />\r\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">Auto-generated identifier</p>\r\n </div>\r\n\r\n {showLabel && (\r\n <div>\r\n <Label htmlFor=\"edit-field-label\" className=\"text-xs\">Label</Label>\r\n <Input\r\n id=\"edit-field-label\"\r\n value={label}\r\n onChange={(e) => setLabel(e.target.value)}\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showDefaultValue && (\r\n <div>\r\n <Label htmlFor=\"edit-field-default\" className=\"text-xs\">\r\n {fieldType === FormFieldType.TEXT_LABEL ? 'Text Content' : 'Default Value'}\r\n </Label>\r\n <Input\r\n id=\"edit-field-default\"\r\n value={defaultValue}\r\n onChange={(e) => setDefaultValue(e.target.value)}\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showPlaceholder && (\r\n <div>\r\n <Label htmlFor=\"edit-field-placeholder\" className=\"text-xs\">Placeholder</Label>\r\n <Input\r\n id=\"edit-field-placeholder\"\r\n value={placeholder}\r\n onChange={(e) => setPlaceholder(e.target.value)}\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showOptions && (\r\n <div>\r\n <Label htmlFor=\"edit-field-options\" className=\"text-xs\">Options (comma-separated)</Label>\r\n <Input\r\n id=\"edit-field-options\"\r\n value={options}\r\n onChange={(e) => setOptions(e.target.value)}\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showRequired && (\r\n <label className=\"flex items-center gap-2 cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={required}\r\n onChange={(e) => setRequired(e.target.checked)}\r\n className=\"h-3.5 w-3.5 rounded border-border\"\r\n />\r\n <span className=\"text-xs text-muted-foreground\">Required field</span>\r\n </label>\r\n )}\r\n </div>\r\n\r\n {/* Advanced Section */}\r\n {hasAdvancedFields && (\r\n <div className=\"border-t border-border pt-2\">\r\n <button\r\n className=\"flex items-center gap-1 text-xs font-medium text-muted-foreground hover:text-foreground w-full\"\r\n onClick={() => setAdvancedOpen(!advancedOpen)}\r\n >\r\n {advancedOpen ? <ChevronDown size={12} /> : <ChevronRight size={12} />}\r\n Advanced\r\n </button>\r\n\r\n {advancedOpen && (\r\n <div className=\"mt-2 space-y-2\">\r\n {showFontSize && (\r\n <div>\r\n <Label htmlFor=\"edit-field-fontsize\" className=\"text-xs\">Font Size (8-72)</Label>\r\n <Input\r\n id=\"edit-field-fontsize\"\r\n type=\"number\"\r\n min=\"8\"\r\n max=\"72\"\r\n value={fontSize}\r\n onChange={(e) => setFontSize(e.target.value)}\r\n placeholder=\"12\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {showMultiline && (\r\n <label className=\"flex items-center gap-2 cursor-pointer\">\r\n <input\r\n type=\"checkbox\"\r\n checked={multiline}\r\n onChange={(e) => setMultiline(e.target.checked)}\r\n className=\"h-3.5 w-3.5 rounded border-border\"\r\n />\r\n <span className=\"text-xs text-muted-foreground\">Multiline</span>\r\n </label>\r\n )}\r\n\r\n {showMaxLength && (\r\n <div>\r\n <Label htmlFor=\"edit-field-maxlength\" className=\"text-xs\">Max Length</Label>\r\n <Input\r\n id=\"edit-field-maxlength\"\r\n type=\"number\"\r\n min=\"1\"\r\n value={maxLength}\r\n onChange={(e) => setMaxLength(e.target.value)}\r\n placeholder=\"No limit\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Acknowledgements */}\r\n {showAcknowledgements && (\r\n <div className=\"space-y-1.5\">\r\n <Label className=\"text-xs\">Acknowledgements</Label>\r\n\r\n {acknowledgements.length === 0 && !isAddingAck && (\r\n <p className=\"text-[10px] text-muted-foreground\">No acknowledgements added</p>\r\n )}\r\n\r\n {acknowledgements.map((ack) => (\r\n <div key={ack.id} className=\"flex items-start gap-1.5 rounded border border-border p-1.5\">\r\n <div className=\"flex-1 min-w-0\">\r\n <p className=\"text-[11px] font-medium text-foreground truncate\">{ack.title}</p>\r\n {ack.description && (\r\n <p className=\"text-[10px] text-muted-foreground truncate\">{ack.description}</p>\r\n )}\r\n </div>\r\n <button\r\n className=\"text-muted-foreground hover:text-destructive shrink-0 mt-0.5\"\r\n onClick={() => removeAcknowledgement(ack.id)}\r\n >\r\n <X size={12} />\r\n </button>\r\n </div>\r\n ))}\r\n\r\n {isAddingAck ? (\r\n <div className=\"space-y-1.5 rounded border border-border p-2\">\r\n <Input\r\n value={ackTitle}\r\n onChange={(e) => setAckTitle(e.target.value)}\r\n placeholder=\"Title (required)\"\r\n className=\"h-7 text-xs\"\r\n />\r\n <Input\r\n value={ackDescription}\r\n onChange={(e) => setAckDescription(e.target.value)}\r\n placeholder=\"Description (optional)\"\r\n className=\"h-7 text-xs\"\r\n />\r\n <div className=\"flex gap-1.5\">\r\n <Button\r\n size=\"sm\"\r\n className=\"h-6 text-[10px] flex-1\"\r\n onClick={addAcknowledgement}\r\n disabled={!ackTitle.trim()}\r\n >\r\n Add\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-6 text-[10px]\"\r\n onClick={() => { setIsAddingAck(false); setAckTitle(''); setAckDescription(''); }}\r\n >\r\n Cancel\r\n </Button>\r\n </div>\r\n </div>\r\n ) : (\r\n <button\r\n className=\"flex items-center gap-1 text-[11px] text-primary hover:text-primary/80\"\r\n onClick={() => setIsAddingAck(true)}\r\n >\r\n <Plus size={11} />\r\n Add acknowledgement\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Actions */}\r\n <div className=\"flex gap-2 pt-1\">\r\n <Button\r\n size=\"sm\"\r\n className=\"h-8 flex-1 text-xs\"\r\n onClick={handleSave}\r\n >\r\n Save\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 text-xs\"\r\n onClick={onClose}\r\n >\r\n Cancel\r\n </Button>\r\n </div>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n","import React, { useState, useCallback, useEffect } from 'react';\r\nimport { Braces } from 'lucide-react';\r\nimport { Popover, PopoverTrigger, PopoverContent } from '../lib/ui/popover';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Input } from '../lib/ui/input';\r\nimport { Label } from '../lib/ui/label';\r\nimport type { VariableNodeAttributes } from '../extensions/variable-node';\r\n\r\nfunction labelToVarName(label: string): string {\r\n return label\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, '_')\r\n .replace(/^_|_$/g, '');\r\n}\r\n\r\ninterface VariableInsertPopoverProps {\r\n open: boolean;\r\n onOpenChange: (open: boolean) => void;\r\n onInsert: (attrs: VariableNodeAttributes) => void;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function VariableInsertPopover({\r\n open,\r\n onOpenChange,\r\n onInsert,\r\n children,\r\n}: VariableInsertPopoverProps) {\r\n const [varLabel, setVarLabel] = useState('');\r\n const [varName, setVarName] = useState('');\r\n const [varDefault, setVarDefault] = useState('');\r\n const [nameManuallyEdited, setNameManuallyEdited] = useState(false);\r\n\r\n const reset = useCallback(() => {\r\n setVarLabel('');\r\n setVarName('');\r\n setVarDefault('');\r\n setNameManuallyEdited(false);\r\n }, []);\r\n\r\n const handleOpenChange = useCallback(\r\n (nextOpen: boolean) => {\r\n if (!nextOpen) reset();\r\n onOpenChange(nextOpen);\r\n },\r\n [onOpenChange, reset],\r\n );\r\n\r\n // Auto-generate name from label unless manually edited\r\n useEffect(() => {\r\n if (!nameManuallyEdited) {\r\n setVarName(labelToVarName(varLabel));\r\n }\r\n }, [varLabel, nameManuallyEdited]);\r\n\r\n const handleInsert = useCallback(() => {\r\n if (!varLabel.trim() || !varName.trim()) return;\r\n onInsert({\r\n varName: varName.trim(),\r\n varLabel: varLabel.trim(),\r\n varDefault: varDefault.trim(),\r\n });\r\n handleOpenChange(false);\r\n }, [varLabel, varName, varDefault, onInsert, handleOpenChange]);\r\n\r\n return (\r\n <Popover open={open} onOpenChange={handleOpenChange}>\r\n <PopoverTrigger asChild>{children}</PopoverTrigger>\r\n <PopoverContent className=\"w-72 p-0\" align=\"start\" sideOffset={8}>\r\n <div className=\"p-3 space-y-3\">\r\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-orange-700\">\r\n <Braces size={14} />\r\n <span>Insert Variable</span>\r\n </div>\r\n\r\n <div className=\"space-y-2\">\r\n <div>\r\n <Label htmlFor=\"var-label\" className=\"text-xs\">Label</Label>\r\n <Input\r\n id=\"var-label\"\r\n value={varLabel}\r\n onChange={(e) => setVarLabel(e.target.value)}\r\n placeholder=\"e.g. Company Name\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <Label htmlFor=\"var-name\" className=\"text-xs\">Name (identifier)</Label>\r\n <Input\r\n id=\"var-name\"\r\n value={varName}\r\n onChange={(e) => {\r\n setVarName(e.target.value);\r\n setNameManuallyEdited(true);\r\n }}\r\n placeholder=\"e.g. company_name\"\r\n className=\"h-8 text-xs font-mono\"\r\n />\r\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">Used as key in data objects</p>\r\n </div>\r\n\r\n <div>\r\n <Label htmlFor=\"var-default\" className=\"text-xs\">Default Value</Label>\r\n <Input\r\n id=\"var-default\"\r\n value={varDefault}\r\n onChange={(e) => setVarDefault(e.target.value)}\r\n placeholder=\"Optional\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"flex gap-2 pt-1\">\r\n <Button\r\n size=\"sm\"\r\n className=\"h-8 flex-1 text-xs\"\r\n onClick={handleInsert}\r\n disabled={!varLabel.trim() || !varName.trim()}\r\n >\r\n Insert\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 text-xs\"\r\n onClick={() => handleOpenChange(false)}\r\n >\r\n Cancel\r\n </Button>\r\n </div>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback } from 'react';\r\nimport { Braces, Trash2 } from 'lucide-react';\r\nimport { Popover, PopoverContent, PopoverAnchor } from '../lib/ui/popover';\r\nimport { Button } from '../lib/ui/button';\r\nimport { Input } from '../lib/ui/input';\r\nimport { Label } from '../lib/ui/label';\r\nimport type { VariableNodeAttributes } from '../extensions/variable-node';\r\n\r\ninterface VariableEditPopoverProps {\r\n varName: string | null;\r\n attrs: Partial<VariableNodeAttributes> | null;\r\n anchorEl: HTMLElement | null;\r\n onUpdate: (varName: string, attrs: Partial<VariableNodeAttributes>) => void;\r\n onDelete: (varName: string) => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport function VariableEditPopover({\r\n varName,\r\n attrs,\r\n anchorEl,\r\n onUpdate,\r\n onDelete,\r\n onClose,\r\n}: VariableEditPopoverProps) {\r\n const [varLabel, setVarLabel] = useState('');\r\n const [varDefault, setVarDefault] = useState('');\r\n\r\n useEffect(() => {\r\n if (attrs) {\r\n setVarLabel(String(attrs.varLabel || ''));\r\n setVarDefault(String(attrs.varDefault || ''));\r\n }\r\n }, [attrs]);\r\n\r\n const handleSave = useCallback(() => {\r\n if (!varName) return;\r\n onUpdate(varName, {\r\n varLabel,\r\n varDefault,\r\n });\r\n onClose();\r\n }, [varName, varLabel, varDefault, onUpdate, onClose]);\r\n\r\n const handleDelete = useCallback(() => {\r\n if (!varName) return;\r\n onDelete(varName);\r\n onClose();\r\n }, [varName, onDelete, onClose]);\r\n\r\n const isOpen = varName !== null && attrs !== null;\r\n\r\n return (\r\n <Popover open={isOpen} onOpenChange={(open) => { if (!open) onClose(); }}>\r\n {anchorEl && (\r\n <PopoverAnchor virtualRef={{ current: anchorEl }} />\r\n )}\r\n <PopoverContent className=\"w-72 p-0\" align=\"start\" sideOffset={8}>\r\n <div className=\"p-3 space-y-3\">\r\n {/* Header */}\r\n <div className=\"flex items-center justify-between\">\r\n <div className=\"flex items-center gap-1.5 text-sm font-medium text-orange-700\">\r\n <Braces size={14} />\r\n <span>Edit Variable</span>\r\n </div>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-7 w-7 text-destructive hover:text-destructive\"\r\n onClick={handleDelete}\r\n >\r\n <Trash2 size={14} />\r\n </Button>\r\n </div>\r\n\r\n {/* Form */}\r\n <div className=\"space-y-2\">\r\n <div>\r\n <Label htmlFor=\"edit-var-name\" className=\"text-xs\">Name (identifier)</Label>\r\n <Input\r\n id=\"edit-var-name\"\r\n value={String(attrs?.varName || '')}\r\n disabled\r\n className=\"h-8 text-xs font-mono opacity-60\"\r\n />\r\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\r\n Same name = same value across document\r\n </p>\r\n </div>\r\n\r\n <div>\r\n <Label htmlFor=\"edit-var-label\" className=\"text-xs\">Label</Label>\r\n <Input\r\n id=\"edit-var-label\"\r\n value={varLabel}\r\n onChange={(e) => setVarLabel(e.target.value)}\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n\r\n <div>\r\n <Label htmlFor=\"edit-var-default\" className=\"text-xs\">Default Value</Label>\r\n <Input\r\n id=\"edit-var-default\"\r\n value={varDefault}\r\n onChange={(e) => setVarDefault(e.target.value)}\r\n placeholder=\"Optional\"\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex gap-2 pt-1\">\r\n <Button\r\n size=\"sm\"\r\n className=\"h-8 flex-1 text-xs\"\r\n onClick={handleSave}\r\n >\r\n Save\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 text-xs\"\r\n onClick={onClose}\r\n >\r\n Cancel\r\n </Button>\r\n </div>\r\n </div>\r\n </PopoverContent>\r\n </Popover>\r\n );\r\n}\r\n","import { FormFieldType } from '../types';\r\nimport type { FormFieldForExport } from '../types';\r\nimport { cn } from '../lib/utils';\r\n\r\ninterface FieldOverlayProps {\r\n field: FormFieldForExport;\r\n renderScale: number;\r\n pageHeight: number;\r\n}\r\n\r\nfunction getFieldIcon(type: FormFieldType): string {\r\n switch (type) {\r\n case FormFieldType.TEXT: return 'T';\r\n case FormFieldType.SIGNATURE: return '\\u270D';\r\n case FormFieldType.INITIALS: return 'I';\r\n case FormFieldType.DATE: return '\\uD83D\\uDCC5';\r\n case FormFieldType.CHECKBOX: return '\\u2610';\r\n case FormFieldType.RADIO: return '\\u25CB';\r\n case FormFieldType.DROPDOWN: return '\\u25BC';\r\n case FormFieldType.TEXT_LABEL: return 'A';\r\n default: return 'T';\r\n }\r\n}\r\n\r\nfunction getFieldColors(type: FormFieldType): { bg: string; border: string } {\r\n switch (type) {\r\n case FormFieldType.SIGNATURE:\r\n return { bg: 'bg-purple-50', border: 'border-purple-300' };\r\n case FormFieldType.INITIALS:\r\n return { bg: 'bg-green-50', border: 'border-green-400' };\r\n case FormFieldType.DATE:\r\n return { bg: 'bg-orange-50', border: 'border-orange-400' };\r\n default:\r\n return { bg: 'bg-card', border: 'border-border' };\r\n }\r\n}\r\n\r\nexport function FieldOverlay({ field, renderScale, pageHeight }: FieldOverlayProps) {\r\n const { position } = field;\r\n\r\n // Convert PDF coordinates (origin bottom-left) to display coordinates (origin top-left)\r\n const displayX = position.x * renderScale;\r\n const displayY = (pageHeight - position.y - position.height) * renderScale;\r\n const displayWidth = position.width * renderScale;\r\n const displayHeight = position.height * renderScale;\r\n\r\n const colors = getFieldColors(field.type);\r\n const icon = getFieldIcon(field.type);\r\n\r\n return (\r\n <div\r\n className={cn(\r\n 'absolute box-border border-2 border-dashed rounded pointer-events-none',\r\n colors.bg,\r\n colors.border,\r\n )}\r\n style={{\r\n left: displayX,\r\n top: displayY,\r\n width: displayWidth,\r\n height: displayHeight,\r\n }}\r\n >\r\n <div className=\"flex items-center gap-1 h-full px-1 text-xs overflow-hidden\">\r\n <span className=\"shrink-0\">{icon}</span>\r\n <span className=\"overflow-hidden text-ellipsis whitespace-nowrap\">\r\n {field.label}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useMemo, useEffect } from 'react';\r\nimport {\r\n ZoomIn,\r\n ZoomOut,\r\n Maximize2,\r\n ChevronLeft,\r\n ChevronRight,\r\n Loader2,\r\n} from 'lucide-react';\r\nimport { Button } from '../lib/ui/button';\r\nimport { FieldOverlay } from './FieldOverlay';\r\nimport type { PdfPage, FormFieldForExport } from '../types';\r\nimport { cn } from '../lib/utils';\r\n\r\ninterface PreviewPanelProps {\r\n pages: PdfPage[];\r\n isGenerating: boolean;\r\n positionedFields?: FormFieldForExport[];\r\n headerLeft?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nexport function PreviewPanel({\r\n pages,\r\n isGenerating,\r\n positionedFields,\r\n headerLeft,\r\n className,\r\n}: PreviewPanelProps) {\r\n const [currentPageIndex, setCurrentPageIndex] = useState(0);\r\n const [zoomLevel, setZoomLevel] = useState(1.0);\r\n\r\n const currentPage = pages.length > 0 ? pages[currentPageIndex] : null;\r\n\r\n // Reset page index when pages change\r\n useEffect(() => {\r\n if (pages.length > 0 && currentPageIndex >= pages.length) {\r\n setCurrentPageIndex(0);\r\n }\r\n }, [pages.length, currentPageIndex]);\r\n\r\n // Zoom controls\r\n const zoomIn = () => setZoomLevel((prev) => Math.min(prev + 0.25, 4.0));\r\n const zoomOut = () => setZoomLevel((prev) => Math.max(prev - 0.25, 0.25));\r\n const resetZoom = () => setZoomLevel(1.0);\r\n const handleZoomSliderChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n setZoomLevel(parseFloat(e.target.value));\r\n };\r\n\r\n // Compute viewport + content dimensions\r\n const pageDisplaySize = useMemo(() => {\r\n if (!currentPage) return null;\r\n const renderWidth = currentPage.width;\r\n const renderHeight = currentPage.height;\r\n const baseScale = Math.min(700 / renderWidth, 900 / renderHeight, 1);\r\n const viewportWidth = renderWidth * baseScale;\r\n const viewportHeight = renderHeight * baseScale;\r\n const contentWidth = renderWidth * baseScale * zoomLevel;\r\n const contentHeight = renderHeight * baseScale * zoomLevel;\r\n const renderScale = baseScale * zoomLevel;\r\n return { viewportWidth, viewportHeight, contentWidth, contentHeight, renderScale };\r\n }, [currentPage, zoomLevel]);\r\n\r\n // Fields on the current page\r\n const pageFields = useMemo(() => {\r\n if (!currentPage || !positionedFields) return [];\r\n return positionedFields.filter(\r\n (f) => f.position.page === currentPageIndex + 1 && f.position.width > 0,\r\n );\r\n }, [positionedFields, currentPage, currentPageIndex]);\r\n\r\n const showScrollbars = zoomLevel > 1;\r\n\r\n return (\r\n <div className={cn('flex flex-col h-full border border-border rounded-lg overflow-hidden bg-muted/20', className)}>\r\n {/* Toolbar */}\r\n <div className=\"border-b border-border px-2 py-1.5 flex-shrink-0\">\r\n <div className=\"flex items-center justify-between gap-2 flex-wrap\">\r\n {/* Page navigation */}\r\n <div className=\"flex items-center gap-1\">\r\n {headerLeft}\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 px-2 text-xs\"\r\n disabled={currentPageIndex <= 0 || pages.length === 0}\r\n onClick={() => setCurrentPageIndex((p) => Math.max(0, p - 1))}\r\n >\r\n <ChevronLeft size={14} />\r\n Prev\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 px-2 text-xs\"\r\n disabled={currentPageIndex >= pages.length - 1 || pages.length === 0}\r\n onClick={() => setCurrentPageIndex((p) => Math.min(pages.length - 1, p + 1))}\r\n >\r\n Next\r\n <ChevronRight size={14} />\r\n </Button>\r\n <span className=\"text-xs text-muted-foreground ml-1\">\r\n {pages.length > 0\r\n ? `Page ${currentPageIndex + 1} of ${pages.length}`\r\n : 'No pages'}\r\n </span>\r\n </div>\r\n\r\n {/* Field count + Zoom controls */}\r\n <div className=\"flex items-center gap-2\">\r\n {pageFields.length > 0 && (\r\n <span className=\"text-xs text-muted-foreground\">\r\n {pageFields.length} field{pageFields.length !== 1 ? 's' : ''} on this page\r\n </span>\r\n )}\r\n <div className=\"flex items-center gap-1\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n disabled={pages.length === 0 || zoomLevel <= 0.25}\r\n onClick={zoomOut}\r\n >\r\n <ZoomOut size={14} />\r\n </Button>\r\n <input\r\n type=\"range\"\r\n min=\"0.25\"\r\n max=\"4\"\r\n step=\"0.25\"\r\n value={zoomLevel}\r\n onChange={handleZoomSliderChange}\r\n disabled={pages.length === 0}\r\n className=\"w-20 h-1.5 bg-muted rounded-lg appearance-none cursor-pointer accent-primary disabled:opacity-50 disabled:cursor-not-allowed\"\r\n />\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n disabled={pages.length === 0 || zoomLevel >= 4}\r\n onClick={zoomIn}\r\n >\r\n <ZoomIn size={14} />\r\n </Button>\r\n <span className=\"text-xs text-muted-foreground font-medium min-w-[2.5rem] text-center\">\r\n {Math.round(zoomLevel * 100)}%\r\n </span>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n disabled={pages.length === 0 || zoomLevel === 1.0}\r\n onClick={resetZoom}\r\n >\r\n <Maximize2 size={14} />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Content area */}\r\n <div\r\n className={cn(\r\n 'flex-1 min-h-0 bg-muted/50 flex justify-center overflow-auto p-4',\r\n !isGenerating && currentPage && pageDisplaySize ? 'items-start' : 'items-center',\r\n )}\r\n >\r\n {isGenerating && (\r\n <div className=\"flex flex-col items-center justify-center gap-2 text-muted-foreground\">\r\n <Loader2 size={24} className=\"animate-spin\" />\r\n <p className=\"text-sm\">Generating PDF...</p>\r\n </div>\r\n )}\r\n\r\n {!isGenerating && pages.length === 0 && (\r\n <div className=\"flex flex-col items-center justify-center gap-2 text-muted-foreground\">\r\n <p className=\"text-sm font-medium\">No preview available</p>\r\n <p className=\"text-xs\">Click "Generate PDF" to see a preview</p>\r\n </div>\r\n )}\r\n\r\n {!isGenerating && currentPage && pageDisplaySize && (\r\n <div\r\n className={cn(\r\n 'border border-border rounded-lg bg-muted/30 shrink-0',\r\n showScrollbars ? 'overflow-auto' : 'overflow-hidden',\r\n )}\r\n style={{\r\n width: pageDisplaySize.viewportWidth,\r\n height: pageDisplaySize.viewportHeight,\r\n }}\r\n >\r\n <div\r\n className=\"relative bg-white\"\r\n style={{\r\n width: pageDisplaySize.contentWidth,\r\n height: pageDisplaySize.contentHeight,\r\n }}\r\n >\r\n <img\r\n src={currentPage.imageUrl}\r\n alt={`Page ${currentPage.pageNumber}`}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'contain',\r\n }}\r\n className=\"absolute inset-0 pointer-events-none\"\r\n draggable={false}\r\n />\r\n {pageFields.map((field) => (\r\n <FieldOverlay\r\n key={field.fieldId}\r\n field={field}\r\n renderScale={pageDisplaySize.renderScale}\r\n pageHeight={currentPage.height}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import type { DocumentGeneratorField, DocumentGeneratorVariable } from '../types';\r\nimport { markdownToTiptap } from './markdown-parser';\r\nimport { extractFieldsFromContent } from './field-helpers';\r\nimport { extractVariablesFromContent } from './variable-helpers';\r\n\r\nexport interface MarkdownValidationResult {\r\n valid: boolean;\r\n errors: string[];\r\n warnings: string[];\r\n variables: DocumentGeneratorVariable[];\r\n fields: DocumentGeneratorField[];\r\n}\r\n\r\n/**\r\n * Validate markdown content for well-formed field and variable tokens.\r\n */\r\nexport function validateMarkdown(markdown: string): MarkdownValidationResult {\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n if (!markdown || !markdown.trim()) {\r\n return { valid: false, errors: ['Content is empty'], warnings: [], variables: [], fields: [] };\r\n }\r\n\r\n const lines = markdown.split('\\n');\r\n\r\n // Check for unclosed/malformed tokens\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n const lineNum = i + 1;\r\n\r\n // Find opening {{ without closing }}\r\n let searchFrom = 0;\r\n while (true) {\r\n const openIdx = line.indexOf('{{', searchFrom);\r\n if (openIdx === -1) break;\r\n const closeIdx = line.indexOf('}}', openIdx + 2);\r\n if (closeIdx === -1) {\r\n errors.push(`Unclosed token at line ${lineNum}: missing }}`);\r\n break;\r\n }\r\n\r\n // Validate token content\r\n const tokenContent = line.slice(openIdx + 2, closeIdx);\r\n const pipeIdx = tokenContent.indexOf('|');\r\n if (pipeIdx === -1) {\r\n errors.push(`Malformed token at line ${lineNum}: missing | delimiter`);\r\n } else {\r\n const tokenType = tokenContent.slice(0, pipeIdx);\r\n if (tokenType !== 'field' && tokenType !== 'var') {\r\n errors.push(`Unknown token type \"${tokenType}\" at line ${lineNum} (expected \"field\" or \"var\")`);\r\n } else {\r\n const body = tokenContent.slice(pipeIdx + 1);\r\n const pairs = body.split('|');\r\n\r\n if (tokenType === 'field') {\r\n const hasType = pairs.some(p => p.startsWith('type:'));\r\n if (!hasType) {\r\n errors.push(`Field token at line ${lineNum} is missing required \"type\" attribute`);\r\n }\r\n } else if (tokenType === 'var') {\r\n const hasName = pairs.some(p => p.startsWith('name:'));\r\n if (!hasName) {\r\n errors.push(`Variable token at line ${lineNum} is missing required \"name\" attribute`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n searchFrom = closeIdx + 2;\r\n }\r\n }\r\n\r\n // Try to parse and extract fields/variables\r\n let fields: DocumentGeneratorField[] = [];\r\n let variables: DocumentGeneratorVariable[] = [];\r\n\r\n try {\r\n const content = markdownToTiptap(markdown);\r\n fields = extractFieldsFromContent(content);\r\n variables = extractVariablesFromContent(content);\r\n } catch (e) {\r\n errors.push(`Failed to parse markdown: ${(e as Error).message}`);\r\n }\r\n\r\n // Check for duplicate variable names with conflicting labels/defaults\r\n const varMap = new Map<string, DocumentGeneratorVariable>();\r\n for (const v of variables) {\r\n const existing = varMap.get(v.varName);\r\n if (existing) {\r\n if (existing.varLabel !== v.varLabel || existing.varDefault !== v.varDefault) {\r\n warnings.push(`Variable \"${v.varName}\" has conflicting labels or defaults`);\r\n }\r\n } else {\r\n varMap.set(v.varName, v);\r\n }\r\n }\r\n\r\n // Warn about variables without default values\r\n for (const v of variables) {\r\n if (!v.varDefault) {\r\n warnings.push(`Variable \"${v.varName}\" has no default value`);\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n variables,\r\n fields,\r\n };\r\n}\r\n","import { cn } from '../utils';\r\n\r\ninterface ToggleGroupProps<T extends string> {\r\n value: T;\r\n onChange: (value: T) => void;\r\n options: { value: T; label: string }[];\r\n size?: 'sm' | 'md';\r\n className?: string;\r\n}\r\n\r\nconst sizeClasses = {\r\n md: 'px-3 py-1.5 text-xs font-medium',\r\n sm: 'px-2 py-0.5 text-[10px] font-medium',\r\n} as const;\r\n\r\nexport function ToggleGroup<T extends string>({\r\n value,\r\n onChange,\r\n options,\r\n size = 'md',\r\n className,\r\n}: ToggleGroupProps<T>) {\r\n return (\r\n <div className={cn('inline-flex items-center gap-1 bg-muted/50 p-0.5 rounded-lg', className)}>\r\n {options.map((opt) => (\r\n <button\r\n key={opt.value}\r\n className={cn(\r\n 'rounded-md transition-colors',\r\n sizeClasses[size],\r\n value === opt.value\r\n ? 'bg-background text-foreground shadow-sm'\r\n : 'text-muted-foreground hover:text-foreground',\r\n )}\r\n onClick={() => onChange(opt.value)}\r\n >\r\n {opt.label}\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\r\nimport type { JSONContent } from '@tiptap/core';\r\nimport { Upload, FileText, X, AlertTriangle, Download, Loader2, RefreshCw, Braces, PenLine, CheckCircle2, WrapText } from 'lucide-react';\r\nimport type { DocumentGeneratorVariable, DocumentGeneratorField, FormFieldForExport, FormFieldPosition, PdfPage } from '../types';\r\nimport { markdownToTiptap } from '../utils/markdown-parser';\r\nimport { validateMarkdown, type MarkdownValidationResult } from '../utils/markdown-validator';\r\nimport { replaceVariablesInContent } from '../utils/variable-helpers';\r\nimport { extractFieldsFromContent } from '../utils/field-helpers';\r\nimport { generatePdfFromContent } from '../utils/pdf-generator';\r\nimport { pdfToImages } from '../utils/pdf-preview';\r\nimport { PreviewPanel } from './PreviewPanel';\r\nimport { Button } from '../lib/ui/button';\r\nimport { ToggleGroup } from '../lib/ui/toggle-group';\r\nimport { Input } from '../lib/ui/input';\r\nimport { Label } from '../lib/ui/label';\r\nimport { cn } from '../lib/utils';\r\nimport { formatError, getErrorMessage, parseJsonWithDetails } from '../utils/error-helpers';\r\n\r\ninterface GeneratePanelProps {\r\n editorMarkdown: string;\r\n editorContent?: JSONContent;\r\n editorVariables: DocumentGeneratorVariable[];\r\n onGeneratePdf?: (blob: Blob, fileName: string) => void;\r\n initialBulkData?: Record<string, string>[];\r\n}\r\n\r\ntype BulkInputFormat = 'json' | 'csv';\r\n\r\n/**\r\n * Parse a CSV string into an array of record objects.\r\n * First row = headers (used as keys), subsequent rows = data.\r\n * Handles quoted values containing commas.\r\n */\r\nfunction parseCsv(text: string): Record<string, string>[] {\r\n const lines = text.split(/\\r?\\n/).filter((l) => l.trim() !== '');\r\n if (lines.length < 2) return [];\r\n\r\n // Parse a single CSV line respecting quoted fields\r\n function parseLine(line: string): string[] {\r\n const fields: string[] = [];\r\n let current = '';\r\n let inQuotes = false;\r\n\r\n for (let i = 0; i < line.length; i++) {\r\n const ch = line[i];\r\n if (inQuotes) {\r\n if (ch === '\"' && line[i + 1] === '\"') {\r\n current += '\"';\r\n i++;\r\n } else if (ch === '\"') {\r\n inQuotes = false;\r\n } else {\r\n current += ch;\r\n }\r\n } else {\r\n if (ch === '\"') {\r\n inQuotes = true;\r\n } else if (ch === ',') {\r\n fields.push(current.trim());\r\n current = '';\r\n } else {\r\n current += ch;\r\n }\r\n }\r\n }\r\n fields.push(current.trim());\r\n return fields;\r\n }\r\n\r\n const headers = parseLine(lines[0]);\r\n const rows: Record<string, string>[] = [];\r\n\r\n for (let i = 1; i < lines.length; i++) {\r\n const values = parseLine(lines[i]);\r\n const row: Record<string, string> = {};\r\n for (let j = 0; j < headers.length; j++) {\r\n row[headers[j]] = values[j] || '';\r\n }\r\n rows.push(row);\r\n }\r\n\r\n return rows;\r\n}\r\n\r\nexport function GeneratePanel({\r\n editorMarkdown,\r\n editorContent,\r\n editorVariables,\r\n onGeneratePdf,\r\n initialBulkData,\r\n}: GeneratePanelProps) {\r\n // Template source\r\n const [templateSource, setTemplateSource] = useState<'editor' | 'imported'>('editor');\r\n const [importedMarkdown, setImportedMarkdown] = useState<string | null>(null);\r\n const [importedFileName, setImportedFileName] = useState<string | null>(null);\r\n const [validationResult, setValidationResult] = useState<MarkdownValidationResult | null>(null);\r\n\r\n // Mode\r\n const [mode, setMode] = useState<'single' | 'bulk'>('single');\r\n\r\n // Variable values (single mode)\r\n const [variableValues, setVariableValues] = useState<Record<string, string>>({});\r\n\r\n // Bulk data\r\n const [bulkInputFormat, setBulkInputFormat] = useState<BulkInputFormat>('json');\r\n const [bulkInput, setBulkInput] = useState('');\r\n const [bulkData, setBulkData] = useState<Record<string, string>[] | null>(null);\r\n const [bulkError, setBulkError] = useState<string | null>(null);\r\n const [csvFileName, setCsvFileName] = useState<string | null>(null);\r\n\r\n // Preview\r\n const [previewPages, setPreviewPages] = useState<PdfPage[]>([]);\r\n const [previewFields, setPreviewFields] = useState<FormFieldForExport[]>([]);\r\n const [isGenerating, setIsGenerating] = useState(false);\r\n const [isExporting, setIsExporting] = useState(false);\r\n const [previewFresh, setPreviewFresh] = useState(false);\r\n\r\n // Error/success feedback\r\n const [previewError, setPreviewError] = useState<string | null>(null);\r\n const [exportError, setExportError] = useState<string | null>(null);\r\n const [exportSuccess, setExportSuccess] = useState<string | null>(null);\r\n\r\n // JSON cursor position (line:col)\r\n const [jsonCursor, setJsonCursor] = useState<{ line: number; col: number }>({ line: 1, col: 1 });\r\n\r\n // Drag state\r\n const [isDragOver, setIsDragOver] = useState(false);\r\n const [isCsvDragOver, setIsCsvDragOver] = useState(false);\r\n\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const csvInputRef = useRef<HTMLInputElement>(null);\r\n const jsonGutterRef = useRef<HTMLDivElement>(null);\r\n\r\n const updateJsonCursor = useCallback((el: HTMLTextAreaElement) => {\r\n const pos = el.selectionStart ?? 0;\r\n const textBefore = el.value.slice(0, pos);\r\n const line = (textBefore.match(/\\n/g) || []).length + 1;\r\n const col = pos - textBefore.lastIndexOf('\\n');\r\n setJsonCursor({ line, col });\r\n }, []);\r\n\r\n // Derived: active variables\r\n const activeVariables =\r\n templateSource === 'imported' && validationResult?.valid\r\n ? validationResult.variables\r\n : editorVariables;\r\n const hasVariables = activeVariables.length > 0;\r\n const hasEditorContent = editorMarkdown.trim().length > 0;\r\n const hasImportedContent = templateSource === 'imported' && importedMarkdown != null;\r\n const hasContent = hasImportedContent || hasEditorContent;\r\n\r\n // Get the active content tree for PDF generation\r\n const getActiveContent = useCallback((): JSONContent => {\r\n if (templateSource === 'imported' && importedMarkdown) {\r\n return markdownToTiptap(importedMarkdown);\r\n }\r\n // Use raw editor JSON if available (avoids markdown round-trip)\r\n if (editorContent) {\r\n return editorContent;\r\n }\r\n return markdownToTiptap(editorMarkdown);\r\n }, [templateSource, importedMarkdown, editorContent, editorMarkdown]);\r\n\r\n // Handle .md file import\r\n const handleFileImport = useCallback((file: File) => {\r\n if (!file.name.endsWith('.md')) {\r\n setValidationResult({\r\n valid: false,\r\n errors: ['Only .md files are supported'],\r\n warnings: [],\r\n variables: [],\r\n fields: [],\r\n });\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const text = e.target?.result as string;\r\n const result = validateMarkdown(text);\r\n setValidationResult(result);\r\n\r\n if (result.valid) {\r\n setImportedMarkdown(text);\r\n setImportedFileName(file.name);\r\n setTemplateSource('imported');\r\n\r\n // Pre-fill variable values with defaults\r\n const defaults: Record<string, string> = {};\r\n for (const v of result.variables) {\r\n defaults[v.varName] = v.varDefault || '';\r\n }\r\n setVariableValues(defaults);\r\n setPreviewPages([]);\r\n }\r\n };\r\n reader.readAsText(file);\r\n }, []);\r\n\r\n // Handle CSV file import\r\n const handleCsvImport = useCallback(\r\n (file: File) => {\r\n if (!file.name.endsWith('.csv')) {\r\n setBulkError('Only .csv files are supported');\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const text = e.target?.result as string;\r\n try {\r\n const rows = parseCsv(text);\r\n if (rows.length === 0) {\r\n setBulkError('CSV is empty or has no data rows');\r\n setBulkData(null);\r\n setCsvFileName(null);\r\n return;\r\n }\r\n\r\n // Check that at least one header matches a variable name\r\n const csvHeaders = Object.keys(rows[0]);\r\n const varNames = activeVariables.map((v) => v.varName);\r\n const matchingHeaders = csvHeaders.filter((h) => varNames.includes(h));\r\n\r\n if (matchingHeaders.length === 0) {\r\n setBulkError(\r\n `No CSV headers match variable names. Expected: ${varNames.join(', ')}. Got: ${csvHeaders.join(', ')}`,\r\n );\r\n setBulkData(null);\r\n setCsvFileName(null);\r\n return;\r\n }\r\n\r\n setBulkData(rows);\r\n setBulkError(null);\r\n setCsvFileName(file.name);\r\n } catch (err) {\r\n setBulkError(`Failed to parse CSV file: ${getErrorMessage(err)}`);\r\n setBulkData(null);\r\n setCsvFileName(null);\r\n }\r\n };\r\n reader.readAsText(file);\r\n },\r\n [activeVariables],\r\n );\r\n\r\n // Drag and drop handlers\r\n const handleDragOver = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragOver(true);\r\n }, []);\r\n\r\n const handleDragLeave = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragOver(false);\r\n }, []);\r\n\r\n const handleDrop = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsDragOver(false);\r\n\r\n const files = e.dataTransfer.files;\r\n if (files.length > 0) {\r\n handleFileImport(files[0]);\r\n }\r\n },\r\n [handleFileImport],\r\n );\r\n\r\n const handleCsvDragOver = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsCsvDragOver(true);\r\n }, []);\r\n\r\n const handleCsvDragLeave = useCallback((e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsCsvDragOver(false);\r\n }, []);\r\n\r\n const handleCsvDrop = useCallback(\r\n (e: React.DragEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n setIsCsvDragOver(false);\r\n\r\n const files = e.dataTransfer.files;\r\n if (files.length > 0) {\r\n handleCsvImport(files[0]);\r\n }\r\n },\r\n [handleCsvImport],\r\n );\r\n\r\n // Clear import\r\n const clearImport = useCallback(() => {\r\n setTemplateSource('editor');\r\n setImportedMarkdown(null);\r\n setImportedFileName(null);\r\n setValidationResult(null);\r\n setPreviewPages([]);\r\n\r\n // Reset values to editor variable defaults\r\n const defaults: Record<string, string> = {};\r\n for (const v of editorVariables) {\r\n defaults[v.varName] = v.varDefault || '';\r\n }\r\n setVariableValues(defaults);\r\n }, [editorVariables]);\r\n\r\n // Update a single variable value\r\n const updateVariableValue = useCallback((varName: string, value: string) => {\r\n setVariableValues((prev) => ({ ...prev, [varName]: value }));\r\n }, []);\r\n\r\n // Build positionedFields from extracted fields + field positions map\r\n const buildPositionedFields = useCallback(\r\n (fields: DocumentGeneratorField[], positions: Map<string, FormFieldPosition>): FormFieldForExport[] =>\r\n fields.map((f) => {\r\n const pos = positions.get(f.fieldId);\r\n return {\r\n id: f.name,\r\n fieldId: f.fieldId,\r\n type: f.type,\r\n name: f.name,\r\n label: f.label,\r\n position: pos || { x: 0, y: 0, width: 0, height: 0, page: 1 },\r\n required: f.required,\r\n options: f.options,\r\n placeholder: f.placeholder,\r\n fontSize: f.fontSize,\r\n defaultValue: f.defaultValue,\r\n multiline: f.multiline,\r\n maxLength: f.maxLength,\r\n acknowledgements: f.acknowledgements,\r\n };\r\n }),\r\n [],\r\n );\r\n\r\n // Generate preview (single mode)\r\n const handlePreview = useCallback(async () => {\r\n if (!hasContent) return;\r\n setIsGenerating(true);\r\n setPreviewError(null);\r\n try {\r\n const content = getActiveContent();\r\n const replaced = replaceVariablesInContent(content, variableValues);\r\n const fields = extractFieldsFromContent(replaced);\r\n const result = await generatePdfFromContent(replaced);\r\n const pages = await pdfToImages(result.pdfBytes);\r\n setPreviewPages(pages);\r\n setPreviewFields(buildPositionedFields(fields, result.fieldPositions));\r\n setPreviewFresh(true);\r\n } catch (err) {\r\n console.error('Preview generation failed:', err);\r\n setPreviewError(formatError('Preview generation failed', err));\r\n } finally {\r\n setIsGenerating(false);\r\n }\r\n }, [getActiveContent, variableValues, hasContent, buildPositionedFields]);\r\n\r\n // Export single PDF\r\n const handleExportSingle = useCallback(async () => {\r\n if (!hasContent) return;\r\n setIsExporting(true);\r\n setExportError(null);\r\n setExportSuccess(null);\r\n try {\r\n const content = getActiveContent();\r\n const replaced = replaceVariablesInContent(content, variableValues);\r\n const fields = extractFieldsFromContent(replaced);\r\n const result = await generatePdfFromContent(replaced, {\r\n drawFieldPlaceholders: false,\r\n embedFormFields: true,\r\n fields,\r\n });\r\n const blob = new Blob([result.pdfBytes as BlobPart], { type: 'application/pdf' });\r\n const fileName = importedFileName\r\n ? importedFileName.replace('.md', '.pdf')\r\n : 'document.pdf';\r\n\r\n if (onGeneratePdf) {\r\n onGeneratePdf(blob, fileName);\r\n } else {\r\n const url = URL.createObjectURL(blob);\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 setExportSuccess(`Exported ${fileName} successfully`);\r\n\r\n if (result.fieldWarnings && result.fieldWarnings.length > 0) {\r\n setExportError(`PDF exported with warnings: ${result.fieldWarnings.join('; ')}`);\r\n }\r\n } catch (err) {\r\n console.error('Export failed:', err);\r\n setExportError(formatError('PDF export failed', err));\r\n } finally {\r\n setIsExporting(false);\r\n }\r\n }, [getActiveContent, variableValues, hasContent, onGeneratePdf, importedFileName]);\r\n\r\n // Parse bulk JSON input\r\n const parseBulkInput = useCallback(() => {\r\n const result = parseJsonWithDetails(bulkInput);\r\n if (!result.valid) {\r\n setBulkError(result.message);\r\n setBulkData(null);\r\n return;\r\n }\r\n const parsed = result.data;\r\n if (!Array.isArray(parsed)) {\r\n setBulkError('Input must be a JSON array (wrap objects in [ ])');\r\n setBulkData(null);\r\n return;\r\n }\r\n if (parsed.length === 0) {\r\n setBulkError('Array is empty — add at least one object');\r\n setBulkData(null);\r\n return;\r\n }\r\n for (let i = 0; i < parsed.length; i++) {\r\n if (typeof parsed[i] !== 'object' || parsed[i] === null) {\r\n setBulkError(`Entry ${i + 1} is not a valid object — each array element must be a { } object`);\r\n setBulkData(null);\r\n return;\r\n }\r\n }\r\n setBulkData(parsed);\r\n setBulkError(null);\r\n }, [bulkInput]);\r\n\r\n // Format JSON in the textarea\r\n const handleFormatJson = useCallback(() => {\r\n const result = parseJsonWithDetails(bulkInput);\r\n if (result.valid) {\r\n setBulkInput(JSON.stringify(result.data, null, 2));\r\n setBulkError(null);\r\n } else {\r\n setBulkError(result.message);\r\n }\r\n }, [bulkInput]);\r\n\r\n // Generate bulk PDFs as ZIP\r\n const handleBulkGenerate = useCallback(async () => {\r\n if (!bulkData || !hasContent) return;\r\n setIsExporting(true);\r\n setBulkError(null);\r\n setExportSuccess(null);\r\n try {\r\n const JSZip = (await import('jszip')).default;\r\n const zip = new JSZip();\r\n const content = getActiveContent();\r\n\r\n const baseFields = extractFieldsFromContent(content);\r\n const allWarnings: string[] = [];\r\n\r\n for (let i = 0; i < bulkData.length; i++) {\r\n const values = bulkData[i];\r\n const replaced = replaceVariablesInContent(content, values);\r\n const fields = extractFieldsFromContent(replaced);\r\n const result = await generatePdfFromContent(replaced, {\r\n drawFieldPlaceholders: false,\r\n embedFormFields: true,\r\n fields: fields.length > 0 ? fields : baseFields,\r\n });\r\n if (result.fieldWarnings) {\r\n allWarnings.push(`Document ${i + 1}: ${result.fieldWarnings.join(', ')}`);\r\n }\r\n const fileName = `document_${i + 1}.pdf`;\r\n zip.file(fileName, result.pdfBytes);\r\n }\r\n\r\n const zipBlob = await zip.generateAsync({ type: 'blob' });\r\n\r\n if (onGeneratePdf) {\r\n onGeneratePdf(zipBlob, 'documents.zip');\r\n } else {\r\n const url = URL.createObjectURL(zipBlob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = 'documents.zip';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n const count = bulkData.length;\r\n setExportSuccess(`Generated ${count} PDF${count !== 1 ? 's' : ''} successfully`);\r\n\r\n if (allWarnings.length > 0) {\r\n setBulkError(`Generated with warnings:\\n${allWarnings.join('\\n')}`);\r\n }\r\n } catch (err) {\r\n console.error('Bulk generation failed:', err);\r\n setBulkError(formatError('Bulk generation failed', err));\r\n } finally {\r\n setIsExporting(false);\r\n }\r\n }, [bulkData, getActiveContent, hasContent, onGeneratePdf]);\r\n\r\n // Serialize initialBulkData for pre-filling the JSON textarea\r\n const initialBulkJson = React.useMemo(\r\n () => initialBulkData && initialBulkData.length > 0 ? JSON.stringify(initialBulkData, null, 2) : '',\r\n [initialBulkData],\r\n );\r\n\r\n // Reset bulk data when switching format\r\n const switchBulkFormat = useCallback((format: BulkInputFormat) => {\r\n setBulkInputFormat(format);\r\n setBulkData(null);\r\n setBulkError(null);\r\n setCsvFileName(null);\r\n setBulkInput(format === 'json' ? initialBulkJson : '');\r\n }, [initialBulkJson]);\r\n\r\n // Pre-fill bulk JSON when switching to bulk mode\r\n useEffect(() => {\r\n if (mode === 'bulk' && bulkInputFormat === 'json' && !bulkInput && initialBulkJson) {\r\n setBulkInput(initialBulkJson);\r\n }\r\n }, [mode, bulkInputFormat, bulkInput, initialBulkJson]);\r\n\r\n // Initialize defaults when editor variables change and using editor source\r\n React.useEffect(() => {\r\n if (templateSource === 'editor') {\r\n const defaults: Record<string, string> = {};\r\n for (const v of editorVariables) {\r\n defaults[v.varName] = variableValues[v.varName] || v.varDefault || '';\r\n }\r\n setVariableValues(defaults);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Intentionally excluding variableValues to avoid loop\r\n }, [editorVariables, templateSource]);\r\n\r\n // Invalidate preview when inputs change (require re-preview before export)\r\n useEffect(() => {\r\n setPreviewFresh(false);\r\n }, [variableValues, templateSource, importedMarkdown, editorMarkdown, editorContent]);\r\n\r\n // Auto-clear success message after 3 seconds\r\n useEffect(() => {\r\n if (exportSuccess) {\r\n const timer = setTimeout(() => setExportSuccess(null), 3000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [exportSuccess]);\r\n\r\n return (\r\n <div className=\"flex-1 min-h-0 grid grid-cols-[1fr_1px_1fr]\">\r\n {/* Left panel: import + variable form */}\r\n <div className=\"flex flex-col min-h-0 min-w-0\">\r\n <div className=\"flex-1 overflow-y-auto p-4 space-y-4\">\r\n {/* Template import zone */}\r\n <div>\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <h3 className=\"text-sm font-medium\">Template</h3>\r\n {templateSource === 'imported' && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-7 text-xs\"\r\n onClick={clearImport}\r\n >\r\n <X size={12} className=\"mr-1\" />\r\n Clear\r\n </Button>\r\n )}\r\n </div>\r\n\r\n {templateSource === 'editor' ? (\r\n <>\r\n {/* Editor content indicator */}\r\n {hasEditorContent && (\r\n <div className=\"flex items-start gap-2.5 p-3 rounded-lg bg-muted/40 mb-2\">\r\n <PenLine size={14} className=\"text-muted-foreground shrink-0 mt-0.5\" />\r\n <div className=\"flex-1 min-w-0 text-xs text-muted-foreground\">\r\n <p>\r\n Generating from the <span className=\"font-medium text-foreground\">Editor tab</span> content.\r\n {editorVariables.length > 0\r\n ? ` ${editorVariables.length} variable${editorVariables.length !== 1 ? 's' : ''} detected.`\r\n : ' No variables detected.'}\r\n </p>\r\n <p className=\"mt-0.5\">You can also import a different .md template below.</p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <div\r\n className={cn(\r\n 'border-2 border-dashed rounded-lg p-5 text-center transition-colors cursor-pointer border-border hover:border-muted-foreground/50',\r\n isDragOver && 'border-muted-foreground/50 bg-muted/30',\r\n )}\r\n onDragOver={handleDragOver}\r\n onDragLeave={handleDragLeave}\r\n onDrop={handleDrop}\r\n onClick={() => fileInputRef.current?.click()}\r\n >\r\n <Upload\r\n size={20}\r\n className=\"mx-auto mb-1.5 text-muted-foreground\"\r\n />\r\n <p className=\"text-xs text-muted-foreground\">\r\n {hasEditorContent\r\n ? 'Import a different .md template'\r\n : 'Drop .md file here or click to browse'}\r\n </p>\r\n {!hasEditorContent && (\r\n <p className=\"text-[10px] text-muted-foreground/70 mt-1\">\r\n Or add content in the Editor tab\r\n </p>\r\n )}\r\n <input\r\n ref={fileInputRef}\r\n type=\"file\"\r\n accept=\".md\"\r\n className=\"hidden\"\r\n onChange={(e) => {\r\n const file = e.target.files?.[0];\r\n if (file) handleFileImport(file);\r\n e.target.value = '';\r\n }}\r\n />\r\n </div>\r\n </>\r\n ) : (\r\n <div className=\"border border-border rounded-lg p-3 bg-muted/20\">\r\n <div className=\"flex items-center gap-2\">\r\n <FileText\r\n size={16}\r\n className=\"text-muted-foreground shrink-0\"\r\n />\r\n <span className=\"text-sm font-medium truncate\">\r\n {importedFileName}\r\n </span>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Validation errors */}\r\n {validationResult && !validationResult.valid && (\r\n <div className=\"mt-2 p-2 rounded-md bg-destructive/10 border border-destructive/20\">\r\n <div className=\"flex items-start gap-1.5\">\r\n <AlertTriangle\r\n size={14}\r\n className=\"text-destructive shrink-0 mt-0.5\"\r\n />\r\n <div className=\"text-xs text-destructive space-y-0.5\">\r\n {validationResult.errors.map((err, i) => (\r\n <p key={i}>{err}</p>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Validation warnings */}\r\n {validationResult?.valid &&\r\n validationResult.warnings.length > 0 && (\r\n <div className=\"mt-2 p-2 rounded-md bg-orange-500/10 border border-orange-500/20\">\r\n <div className=\"text-xs text-orange-700 space-y-0.5\">\r\n {validationResult.warnings.map((warn, i) => (\r\n <p key={i}>{warn}</p>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* No content empty state */}\r\n {!hasContent && (\r\n <div className=\"flex flex-col items-center justify-center py-8 text-muted-foreground\">\r\n <Braces size={32} className=\"mb-2 opacity-50\" />\r\n <p className=\"text-sm font-medium\">No template content</p>\r\n <p className=\"text-xs mt-1\">\r\n Import a .md template above or add content in the Editor tab.\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Variables section — bordered container */}\r\n {hasVariables && hasContent && (\r\n <div className=\"border border-border rounded-lg overflow-hidden\">\r\n {/* Mode toggle header */}\r\n <div className=\"flex items-center gap-2 px-3 py-2 bg-muted/30 border-b border-border\">\r\n <ToggleGroup\r\n value={mode}\r\n onChange={setMode}\r\n options={[\r\n { value: 'single', label: 'Single' },\r\n { value: 'bulk', label: 'Bulk' },\r\n ]}\r\n />\r\n </div>\r\n\r\n {/* Single mode: variable inputs */}\r\n {mode === 'single' && (\r\n <div className=\"p-3 space-y-3\">\r\n <h3 className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Variables</h3>\r\n {activeVariables.map((v) => (\r\n <div key={v.varName}>\r\n <Label htmlFor={`gen-${v.varName}`} className=\"text-xs\">\r\n {v.varLabel || v.varName}\r\n </Label>\r\n <Input\r\n id={`gen-${v.varName}`}\r\n value={variableValues[v.varName] || ''}\r\n onChange={(e) =>\r\n updateVariableValue(v.varName, e.target.value)\r\n }\r\n placeholder={\r\n v.varDefault || `Enter ${v.varLabel || v.varName}`\r\n }\r\n className=\"h-8 text-xs\"\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n\r\n {/* Bulk mode */}\r\n {mode === 'bulk' && (\r\n <div className=\"p-3 space-y-3\">\r\n {/* Format toggle */}\r\n <div className=\"flex items-center justify-between\">\r\n <h3 className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide\">Bulk Data</h3>\r\n <ToggleGroup\r\n value={bulkInputFormat}\r\n onChange={switchBulkFormat}\r\n options={[\r\n { value: 'json', label: 'JSON' },\r\n { value: 'csv', label: 'CSV' },\r\n ]}\r\n size=\"sm\"\r\n />\r\n </div>\r\n\r\n {/* JSON input with line numbers */}\r\n {bulkInputFormat === 'json' && (\r\n <>\r\n <div className=\"rounded-md border border-input bg-background overflow-hidden focus-within:ring-2 focus-within:ring-ring\"\r\n style={{ resize: 'vertical' }}\r\n >\r\n <div className=\"flex h-64\" style={{ resize: 'vertical', overflow: 'hidden' }}>\r\n {/* Line number gutter */}\r\n <div\r\n ref={jsonGutterRef}\r\n aria-hidden\r\n className=\"shrink-0 py-2 pl-2 pr-1.5 text-xs font-mono text-muted-foreground/50 text-right select-none overflow-hidden border-r border-input bg-muted/30\"\r\n style={{ lineHeight: '1.35rem' }}\r\n >\r\n {Array.from(\r\n { length: Math.max((bulkInput || '\\n').split('\\n').length, 1) },\r\n (_, i) => (\r\n <div key={i}>{i + 1}</div>\r\n ),\r\n )}\r\n </div>\r\n <textarea\r\n value={bulkInput}\r\n onChange={(e) => {\r\n setBulkInput(e.target.value);\r\n updateJsonCursor(e.target);\r\n }}\r\n onKeyUp={(e) => updateJsonCursor(e.target as HTMLTextAreaElement)}\r\n onClick={(e) => updateJsonCursor(e.target as HTMLTextAreaElement)}\r\n onScroll={(e) => {\r\n if (jsonGutterRef.current) {\r\n jsonGutterRef.current.scrollTop = (e.target as HTMLTextAreaElement).scrollTop;\r\n }\r\n }}\r\n placeholder={`[\\n { ${activeVariables.map((v) => `\"${v.varName}\": \"...\"`).join(', ')} },\\n ...\\n]`}\r\n className=\"flex-1 py-2 px-2.5 text-xs font-mono bg-transparent resize-none focus:outline-none overflow-y-auto\"\r\n style={{ lineHeight: '1.35rem' }}\r\n />\r\n </div>\r\n {/* Cursor position status bar */}\r\n {bulkInput.trim() && (\r\n <div className=\"flex items-center justify-end px-2 py-0.5 border-t border-input bg-muted/30\">\r\n <span className=\"text-[10px] font-mono text-muted-foreground/60\">\r\n Ln {jsonCursor.line}, Col {jsonCursor.col}\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-7 text-xs\"\r\n onClick={handleFormatJson}\r\n disabled={!bulkInput.trim()}\r\n >\r\n <WrapText size={12} />\r\n Format\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-7 text-xs\"\r\n onClick={parseBulkInput}\r\n disabled={!bulkInput.trim()}\r\n >\r\n Parse JSON\r\n </Button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {/* CSV upload */}\r\n {bulkInputFormat === 'csv' && (\r\n <>\r\n {!csvFileName ? (\r\n <div\r\n className={cn(\r\n 'border-2 border-dashed rounded-lg p-4 text-center cursor-pointer transition-colors border-border hover:border-muted-foreground/50',\r\n isCsvDragOver && 'border-muted-foreground/50 bg-muted/30',\r\n )}\r\n onClick={() => csvInputRef.current?.click()}\r\n onDragOver={handleCsvDragOver}\r\n onDragLeave={handleCsvDragLeave}\r\n onDrop={handleCsvDrop}\r\n >\r\n <Upload size={18} className=\"mx-auto mb-1.5 text-muted-foreground\" />\r\n <p className=\"text-xs text-muted-foreground\">\r\n Click to upload a .csv file\r\n </p>\r\n <p className=\"text-[10px] text-muted-foreground/70 mt-1\">\r\n First row must be headers matching variable names:\r\n {' '}{activeVariables.map((v) => v.varName).join(', ')}\r\n </p>\r\n <input\r\n ref={csvInputRef}\r\n type=\"file\"\r\n accept=\".csv\"\r\n className=\"hidden\"\r\n onChange={(e) => {\r\n const file = e.target.files?.[0];\r\n if (file) handleCsvImport(file);\r\n e.target.value = '';\r\n }}\r\n />\r\n </div>\r\n ) : (\r\n <div className=\"flex items-center gap-2 p-2.5 border border-border rounded-lg bg-muted/20\">\r\n <FileText size={14} className=\"text-muted-foreground shrink-0\" />\r\n <span className=\"text-xs font-medium truncate flex-1\">{csvFileName}</span>\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-6 w-6 p-0\"\r\n onClick={() => {\r\n setCsvFileName(null);\r\n setBulkData(null);\r\n setBulkError(null);\r\n }}\r\n >\r\n <X size={12} />\r\n </Button>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n\r\n {bulkError && (\r\n <div className=\"p-2 rounded-md bg-destructive/10 border border-destructive/20\">\r\n <p className=\"text-xs text-destructive\">{bulkError}</p>\r\n </div>\r\n )}\r\n\r\n {/* Bulk data table preview */}\r\n {bulkData && (\r\n <div className=\"border border-border rounded-md overflow-auto max-h-48\">\r\n <table className=\"w-full text-xs\">\r\n <thead>\r\n <tr className=\"border-b border-border bg-muted/30\">\r\n <th className=\"px-2 py-1 text-left font-medium text-muted-foreground\">\r\n #\r\n </th>\r\n {activeVariables.map((v) => (\r\n <th\r\n key={v.varName}\r\n className=\"px-2 py-1 text-left font-medium text-muted-foreground\"\r\n >\r\n {v.varLabel || v.varName}\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {bulkData.map((row, i) => (\r\n <tr\r\n key={i}\r\n className=\"border-b border-border last:border-b-0\"\r\n >\r\n <td className=\"px-2 py-1 text-muted-foreground\">\r\n {i + 1}\r\n </td>\r\n {activeVariables.map((v) => (\r\n <td key={v.varName} className=\"px-2 py-1\">\r\n {row[v.varName] || (\r\n <span className=\"text-muted-foreground/50\">\r\n -\r\n </span>\r\n )}\r\n </td>\r\n ))}\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n <div className=\"px-2 py-1 text-xs text-muted-foreground bg-muted/20 border-t border-border\">\r\n {bulkData.length} row{bulkData.length !== 1 ? 's' : ''}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* No variables info for content without variables */}\r\n {!hasVariables && hasContent && (\r\n <div className=\"p-3 rounded-md bg-muted/30 border border-border\">\r\n <p className=\"text-xs text-muted-foreground\">\r\n This template has no variables. You can still preview and export\r\n the PDF as-is, or add variables in the Editor tab using the\r\n "Insert Variable" button.\r\n </p>\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Error/success feedback */}\r\n {previewError && (\r\n <div className=\"px-4 pb-0\">\r\n <div className=\"p-2 rounded-md bg-destructive/10 border border-destructive/20\">\r\n <div className=\"flex items-start gap-1.5\">\r\n <AlertTriangle size={14} className=\"text-destructive shrink-0 mt-0.5\" />\r\n <p className=\"text-xs text-destructive\">{previewError}</p>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n {exportError && (\r\n <div className=\"px-4 pb-0\">\r\n <div className=\"p-2 rounded-md bg-destructive/10 border border-destructive/20\">\r\n <div className=\"flex items-start gap-1.5\">\r\n <AlertTriangle size={14} className=\"text-destructive shrink-0 mt-0.5\" />\r\n <p className=\"text-xs text-destructive\">{exportError}</p>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n {exportSuccess && (\r\n <div className=\"px-4 pb-0\">\r\n <div className=\"p-2 rounded-md bg-emerald-500/10 border border-emerald-500/20\">\r\n <div className=\"flex items-center gap-1.5\">\r\n <CheckCircle2 size={14} className=\"text-emerald-600 shrink-0\" />\r\n <p className=\"text-xs text-emerald-700\">{exportSuccess}</p>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Footer actions */}\r\n {hasContent && (\r\n <div className=\"border-t border-border px-4 py-3 flex items-center gap-2 bg-gradient-to-b from-background to-muted/20\">\r\n {mode === 'single' || !hasVariables ? (\r\n <>\r\n <Button\r\n variant=\"secondary\"\r\n onClick={handlePreview}\r\n disabled={isGenerating}\r\n className=\"h-10 px-4 font-semibold shadow-sm hover:shadow-md transition-all duration-200 text-sm\"\r\n >\r\n {isGenerating ? (\r\n <Loader2 size={16} className=\"animate-spin\" />\r\n ) : (\r\n <RefreshCw size={16} />\r\n )}\r\n {isGenerating ? 'Generating...' : 'Generate PDF'}\r\n </Button>\r\n <Button\r\n onClick={handleExportSingle}\r\n disabled={!previewFresh || isExporting}\r\n className=\"h-10 px-4 font-semibold bg-primary hover:bg-primary/90 text-primary-foreground shadow-sm hover:shadow-md transition-all duration-200 text-sm\"\r\n >\r\n {isExporting ? (\r\n <Loader2 size={16} className=\"animate-spin\" />\r\n ) : (\r\n <Download size={16} />\r\n )}\r\n {isExporting ? 'Exporting...' : 'Export PDF'}\r\n </Button>\r\n </>\r\n ) : (\r\n <Button\r\n onClick={handleBulkGenerate}\r\n disabled={isExporting || !bulkData || bulkData.length === 0}\r\n className=\"h-10 px-4 font-semibold bg-primary hover:bg-primary/90 text-primary-foreground shadow-lg hover:shadow-xl transition-all duration-200 text-sm\"\r\n >\r\n {isExporting ? (\r\n <Loader2 size={16} className=\"animate-spin\" />\r\n ) : (\r\n <Download size={16} />\r\n )}\r\n {isExporting ? 'Generating...' : `Generate All (${bulkData?.length || 0} PDFs)`}\r\n </Button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Divider */}\r\n <div className=\"bg-border\" />\r\n\r\n {/* Right panel: preview */}\r\n <div className=\"flex flex-col min-h-0 min-w-0\">\r\n <PreviewPanel\r\n pages={previewPages}\r\n isGenerating={isGenerating}\r\n positionedFields={previewFields}\r\n className=\"flex-1 border-0 rounded-none\"\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n","export function parseThemeColor(color: string): string {\r\n if (!color || typeof color !== 'string') {\r\n return '#0099CD';\r\n }\r\n const trimmed = color.trim();\r\n if (\r\n trimmed.startsWith('#') ||\r\n trimmed.startsWith('rgb') ||\r\n trimmed.startsWith('hsl') ||\r\n trimmed.startsWith('oklch') ||\r\n /^[a-z]+$/i.test(trimmed)\r\n ) {\r\n return trimmed;\r\n }\r\n return trimmed;\r\n}\r\n\r\nexport function getContrastColor(backgroundColor: string): string {\r\n if (typeof window === 'undefined') {\r\n return '#000000';\r\n }\r\n const tempDiv = document.createElement('div');\r\n tempDiv.style.color = backgroundColor;\r\n tempDiv.style.position = 'absolute';\r\n tempDiv.style.visibility = 'hidden';\r\n document.body.appendChild(tempDiv);\r\n const computedColor = window.getComputedStyle(tempDiv).color;\r\n document.body.removeChild(tempDiv);\r\n const rgbMatch = computedColor.match(/\\d+/g);\r\n if (!rgbMatch || rgbMatch.length < 3) {\r\n return '#000000';\r\n }\r\n const r = parseInt(rgbMatch[0], 10);\r\n const g = parseInt(rgbMatch[1], 10);\r\n const b = parseInt(rgbMatch[2], 10);\r\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\r\n return luminance > 0.5 ? '#000000' : '#ffffff';\r\n}\r\n\r\nexport function applyThemeColor(\r\n element: HTMLElement,\r\n color: string,\r\n config?: {\r\n primaryForeground?: string;\r\n background?: string;\r\n foreground?: string;\r\n secondary?: string;\r\n secondaryForeground?: string;\r\n muted?: string;\r\n mutedForeground?: string;\r\n accent?: string;\r\n accentForeground?: string;\r\n border?: string;\r\n input?: string;\r\n ring?: string;\r\n card?: string;\r\n cardForeground?: string;\r\n }\r\n): void {\r\n if (!element) return;\r\n const parsedColor = parseThemeColor(color);\r\n element.style.setProperty('--xpc-primary', parsedColor);\r\n element.style.setProperty('--xpc-ring', parsedColor);\r\n const primaryForeground = config?.primaryForeground || getContrastColor(parsedColor);\r\n element.style.setProperty('--xpc-primary-foreground', primaryForeground);\r\n if (config) {\r\n Object.entries(config).forEach(([key, value]) => {\r\n if (value) {\r\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n element.style.setProperty(`--xpc-${cssKey}`, parseThemeColor(value));\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport function detectSystemTheme(): 'light' | 'dark' {\r\n if (typeof window === 'undefined' || !window.matchMedia) {\r\n return 'light';\r\n }\r\n try {\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\r\n } catch {\r\n return 'light';\r\n }\r\n}\r\n\r\nexport function getEffectiveThemeMode(themeMode: 'light' | 'dark' | 'auto' = 'auto'): 'light' | 'dark' {\r\n if (themeMode === 'auto') {\r\n return detectSystemTheme();\r\n }\r\n return themeMode;\r\n}\r\n","import React, { createContext, useContext, useEffect, useState, useRef, useMemo } from 'react';\r\nimport { ThemeMode, ThemeConfig } from '../types';\r\nimport { getEffectiveThemeMode, applyThemeColor, parseThemeColor } from '../utils/theme-helpers';\r\n\r\nexport interface ThemeContextValue {\r\n themeMode: 'light' | 'dark';\r\n originalMode: ThemeMode;\r\n themeColor: string;\r\n themeConfig?: ThemeConfig;\r\n setThemeMode: (mode: ThemeMode) => void;\r\n}\r\n\r\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\r\n\r\nexport function useTheme(): ThemeContextValue {\r\n const context = useContext(ThemeContext);\r\n if (!context) {\r\n throw new Error('useTheme must be used within ThemeProvider');\r\n }\r\n return context;\r\n}\r\n\r\nexport interface ThemeProviderProps {\r\n themeMode?: ThemeMode;\r\n themeColor?: string;\r\n themeConfig?: ThemeConfig;\r\n rootElement?: HTMLElement | null;\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function ThemeProvider({\r\n themeMode: initialMode = 'auto',\r\n themeColor: initialColor = '#0099CD',\r\n themeConfig,\r\n rootElement,\r\n children,\r\n}: ThemeProviderProps) {\r\n const [themeMode, setThemeModeState] = useState<ThemeMode>(initialMode);\r\n const rootRef = useRef<HTMLElement | null>(rootElement || null);\r\n const effectiveMode = useMemo(() => getEffectiveThemeMode(themeMode), [themeMode]);\r\n\r\n useEffect(() => {\r\n if (themeMode !== 'auto') return;\r\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n const handleChange = () => setThemeModeState('auto');\r\n if (mediaQuery.addEventListener) {\r\n mediaQuery.addEventListener('change', handleChange);\r\n return () => mediaQuery.removeEventListener('change', handleChange);\r\n } else {\r\n mediaQuery.addListener(handleChange);\r\n return () => mediaQuery.removeListener(handleChange);\r\n }\r\n }, [themeMode]);\r\n\r\n useEffect(() => {\r\n const element = rootRef.current || document.querySelector('.signiphi-pdf-compose');\r\n if (!element) return;\r\n const htmlElement = element as HTMLElement;\r\n htmlElement.setAttribute('data-theme', effectiveMode);\r\n applyThemeColor(htmlElement, initialColor, themeConfig);\r\n if (effectiveMode === 'dark') {\r\n htmlElement.classList.add('dark');\r\n } else {\r\n htmlElement.classList.remove('dark');\r\n }\r\n }, [effectiveMode, initialColor, themeConfig]);\r\n\r\n const setThemeMode = (mode: ThemeMode) => setThemeModeState(mode);\r\n\r\n const contextValue: ThemeContextValue = useMemo(\r\n () => ({\r\n themeMode: effectiveMode,\r\n originalMode: themeMode,\r\n themeColor: parseThemeColor(initialColor),\r\n themeConfig,\r\n setThemeMode,\r\n }),\r\n [effectiveMode, themeMode, initialColor, themeConfig]\r\n );\r\n\r\n return <ThemeContext.Provider value={contextValue}>{children}</ThemeContext.Provider>;\r\n}\r\n","import React from 'react';\r\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\r\nimport { Button } from '../lib/ui/button';\r\n\r\ninterface ErrorBoundaryProps {\r\n children: React.ReactNode;\r\n fallbackClassName?: string;\r\n}\r\n\r\ninterface ErrorBoundaryState {\r\n hasError: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport class ComposeErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = { hasError: false, error: null };\r\n }\r\n\r\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\r\n return { hasError: true, error };\r\n }\r\n\r\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\r\n console.error('pdf-compose render error:', error, errorInfo);\r\n }\r\n\r\n handleReset = () => {\r\n this.setState({ hasError: false, error: null });\r\n };\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n return (\r\n <div className={this.props.fallbackClassName}>\r\n <div className=\"flex flex-col items-center justify-center p-8 text-center gap-3\">\r\n <AlertTriangle size={32} className=\"text-destructive\" />\r\n <div>\r\n <p className=\"text-sm font-medium text-foreground\">Something went wrong</p>\r\n <p className=\"text-xs text-muted-foreground mt-1\">\r\n {this.state.error?.message || 'An unexpected error occurred in the document composer.'}\r\n </p>\r\n </div>\r\n <Button variant=\"outline\" size=\"sm\" onClick={this.handleReset}>\r\n <RefreshCw size={14} />\r\n Try Again\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\r\nimport { FileDown, FileText, RefreshCw, Loader2, Plus, PanelLeftOpen, Braces, AlertTriangle, CheckCircle2 } from 'lucide-react';\r\nimport { EditorContent } from '@tiptap/react';\r\nimport { useDocumentGenerator } from '../hooks/useDocumentGenerator';\r\nimport { EditorToolbar } from './EditorToolbar';\r\nimport { FieldInsertPopover } from './FieldInsertPopover';\r\nimport { FieldEditPopover } from './FieldEditPopover';\r\nimport { VariableInsertPopover } from './VariableInsertPopover';\r\nimport { VariableEditPopover } from './VariableEditPopover';\r\nimport { PreviewPanel } from './PreviewPanel';\r\nimport { GeneratePanel } from './GeneratePanel';\r\nimport { Button } from '../lib/ui/button';\r\nimport { ToggleGroup } from '../lib/ui/toggle-group';\r\nimport { ThemeProvider } from '../contexts/ThemeContext';\r\nimport { FormFieldType } from '../types';\r\nimport type { DocumentGeneratorProps } from '../types';\r\nimport type { FieldNodeAttributes } from '../extensions/field-node';\r\nimport type { VariableNodeAttributes } from '../extensions/variable-node';\r\nimport { validateMarkdown } from '../utils/markdown-validator';\r\nimport { ComposeErrorBoundary } from './ErrorBoundary';\r\nimport { cn } from '../lib/utils';\r\n\r\ntype ActiveTab = 'editor' | 'generate';\r\n\r\nfunction DocumentGeneratorInner({\r\n initialMarkdown,\r\n initialContent,\r\n onChange,\r\n onExport,\r\n readOnly = false,\r\n className,\r\n showPreview = true,\r\n placeholder,\r\n exportButtonText = 'Export Document',\r\n showToolbar = true,\r\n showGenerateTab = true,\r\n onGeneratePdf,\r\n initialBulkData,\r\n}: DocumentGeneratorProps) {\r\n const {\r\n editor,\r\n fields,\r\n variables,\r\n positionedFields,\r\n markdown,\r\n pdfPages,\r\n isGenerating,\r\n error: generationError,\r\n fieldWarnings,\r\n insertField,\r\n updateField,\r\n deleteField,\r\n insertVariable,\r\n updateVariable,\r\n deleteVariable,\r\n generatePdf,\r\n exportDocument,\r\n exportMarkdown,\r\n } = useDocumentGenerator({\r\n initialMarkdown,\r\n initialContent,\r\n placeholder,\r\n onChange,\r\n });\r\n\r\n // Tab state\r\n const [activeTab, setActiveTab] = useState<ActiveTab>('editor');\r\n\r\n // Insert popover state (field)\r\n const [insertPopoverOpen, setInsertPopoverOpen] = useState(false);\r\n\r\n // Insert popover state (variable)\r\n const [insertVarPopoverOpen, setInsertVarPopoverOpen] = useState(false);\r\n\r\n // Edit popover state (field)\r\n const [editFieldId, setEditFieldId] = useState<string | null>(null);\r\n const [editFieldAttrs, setEditFieldAttrs] = useState<Partial<FieldNodeAttributes> | null>(null);\r\n const [editFieldAnchorEl, setEditFieldAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n // Edit popover state (variable)\r\n const [editVarName, setEditVarName] = useState<string | null>(null);\r\n const [editVarAttrs, setEditVarAttrs] = useState<Partial<VariableNodeAttributes> | null>(null);\r\n const [editVarAnchorEl, setEditVarAnchorEl] = useState<HTMLElement | null>(null);\r\n\r\n const editorWrapperRef = useRef<HTMLDivElement>(null);\r\n\r\n // Editor collapse state\r\n const [editorCollapsed, setEditorCollapsed] = useState(false);\r\n\r\n // Export MD state\r\n const [mdExportError, setMdExportError] = useState<string | null>(null);\r\n\r\n // Export success state\r\n const [exportSuccess, setExportSuccess] = useState<string | null>(null);\r\n\r\n // Listen for double-click edit events from FieldNodeView\r\n useEffect(() => {\r\n const handler = (e: Event) => {\r\n const detail = (e as CustomEvent).detail;\r\n if (!detail?.fieldId || !editor) return;\r\n\r\n let foundAttrs: Record<string, unknown> | null = null;\r\n editor.state.doc.descendants((node) => {\r\n if (node.type.name === 'fieldNode' && node.attrs.fieldId === detail.fieldId) {\r\n foundAttrs = node.attrs;\r\n return false;\r\n }\r\n });\r\n\r\n if (foundAttrs) {\r\n setEditFieldId(detail.fieldId);\r\n setEditFieldAttrs(foundAttrs as Partial<FieldNodeAttributes>);\r\n setEditFieldAnchorEl(detail.anchorEl || editorWrapperRef.current);\r\n }\r\n };\r\n\r\n window.addEventListener('signiphi:edit-field', handler);\r\n return () => window.removeEventListener('signiphi:edit-field', handler);\r\n }, [editor]);\r\n\r\n // Listen for double-click edit events from VariableNodeView\r\n useEffect(() => {\r\n const handler = (e: Event) => {\r\n const detail = (e as CustomEvent).detail;\r\n if (!detail?.varName || !editor) return;\r\n\r\n let foundAttrs: Record<string, unknown> | null = null;\r\n editor.state.doc.descendants((node) => {\r\n if (node.type.name === 'variableNode' && node.attrs.varName === detail.varName) {\r\n foundAttrs = node.attrs;\r\n return false;\r\n }\r\n });\r\n\r\n if (foundAttrs) {\r\n setEditVarName(detail.varName);\r\n setEditVarAttrs(foundAttrs as Partial<VariableNodeAttributes>);\r\n setEditVarAnchorEl(detail.anchorEl || editorWrapperRef.current);\r\n }\r\n };\r\n\r\n window.addEventListener('signiphi:edit-variable', handler);\r\n return () => window.removeEventListener('signiphi:edit-variable', handler);\r\n }, [editor]);\r\n\r\n const handleInsertField = useCallback(\r\n (type: FormFieldType, attrs?: Partial<FieldNodeAttributes>) => {\r\n insertField(type, attrs);\r\n },\r\n [insertField],\r\n );\r\n\r\n const handleInsertVariable = useCallback(\r\n (attrs: VariableNodeAttributes) => {\r\n insertVariable(attrs);\r\n },\r\n [insertVariable],\r\n );\r\n\r\n const handleCloseFieldEditPopover = useCallback(() => {\r\n setEditFieldId(null);\r\n setEditFieldAttrs(null);\r\n setEditFieldAnchorEl(null);\r\n }, []);\r\n\r\n const handleCloseVarEditPopover = useCallback(() => {\r\n setEditVarName(null);\r\n setEditVarAttrs(null);\r\n setEditVarAnchorEl(null);\r\n }, []);\r\n\r\n const handleExport = useCallback(async () => {\r\n setExportSuccess(null);\r\n const result = await exportDocument();\r\n if (result && onExport) {\r\n onExport(result);\r\n setExportSuccess('Document exported successfully');\r\n }\r\n }, [exportDocument, onExport]);\r\n\r\n const handleExportMarkdown = useCallback(() => {\r\n const md = exportMarkdown();\r\n if (!md.trim()) {\r\n setMdExportError('Editor content is empty');\r\n return;\r\n }\r\n\r\n // Validate before exporting\r\n const validation = validateMarkdown(md);\r\n if (!validation.valid) {\r\n setMdExportError(validation.errors.join('; '));\r\n return;\r\n }\r\n\r\n setMdExportError(null);\r\n\r\n // Trigger download\r\n const blob = new Blob([md], { type: 'text/markdown' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = 'template.md';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n }, [exportMarkdown]);\r\n\r\n // Clear MD export error when content changes\r\n useEffect(() => {\r\n if (mdExportError) setMdExportError(null);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [markdown]);\r\n\r\n // Auto-clear success message after 3 seconds\r\n useEffect(() => {\r\n if (exportSuccess) {\r\n const timer = setTimeout(() => setExportSuccess(null), 3000);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [exportSuccess]);\r\n\r\n const insertFieldButton = (\r\n <FieldInsertPopover\r\n open={insertPopoverOpen}\r\n onOpenChange={setInsertPopoverOpen}\r\n onInsert={handleInsertField}\r\n >\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 gap-1.5 text-xs font-medium\"\r\n >\r\n <Plus size={14} />\r\n Insert Field\r\n </Button>\r\n </FieldInsertPopover>\r\n );\r\n\r\n const insertVariableButton = (\r\n <VariableInsertPopover\r\n open={insertVarPopoverOpen}\r\n onOpenChange={setInsertVarPopoverOpen}\r\n onInsert={handleInsertVariable}\r\n >\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 gap-1.5 text-xs font-medium\"\r\n >\r\n <Braces size={14} />\r\n Insert Variable\r\n </Button>\r\n </VariableInsertPopover>\r\n );\r\n\r\n return (\r\n <div data-compose-root className={cn('signiphi-pdf-compose', className)}>\r\n {/* Header row with tab bar */}\r\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-border bg-background\">\r\n {showGenerateTab && (\r\n <ToggleGroup\r\n value={activeTab}\r\n onChange={setActiveTab}\r\n options={[\r\n { value: 'editor', label: 'Editor' },\r\n { value: 'generate', label: 'Generate' },\r\n ]}\r\n />\r\n )}\r\n\r\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\r\n {fields.length > 0 && (\r\n <span>{fields.length} field{fields.length !== 1 ? 's' : ''}</span>\r\n )}\r\n {variables.length > 0 && (\r\n <span>{variables.length} variable{variables.length !== 1 ? 's' : ''}</span>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* Editor tab content — stays mounted, hidden when not active */}\r\n <div className={cn(\r\n 'flex flex-col flex-1 min-h-0',\r\n activeTab !== 'editor' && 'hidden',\r\n )}>\r\n {/* Two-column layout */}\r\n <div className={cn(\r\n 'flex-1 min-h-0',\r\n showPreview && !editorCollapsed ? 'grid grid-cols-[1fr_1px_1fr]' : 'flex flex-col',\r\n )}>\r\n {/* Left column: editor toolbar + editor content */}\r\n {!editorCollapsed && (\r\n <div className=\"flex flex-col min-h-0 min-w-0\">\r\n {showToolbar && !readOnly && (\r\n <div className=\"border-b border-border\">\r\n <EditorToolbar\r\n editor={editor}\r\n insertFieldButton={insertFieldButton}\r\n insertVariableButton={insertVariableButton}\r\n onCollapse={showPreview ? () => setEditorCollapsed(true) : undefined}\r\n />\r\n </div>\r\n )}\r\n <div ref={editorWrapperRef} className=\"flex-1 overflow-y-auto min-h-0\">\r\n <EditorContent\r\n editor={editor}\r\n className=\"prose prose-sm max-w-none p-4 focus-within:outline-none\"\r\n />\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Vertical divider */}\r\n {showPreview && !editorCollapsed && (\r\n <div className=\"bg-border\" />\r\n )}\r\n\r\n {/* Right column: preview */}\r\n {showPreview && (\r\n <PreviewPanel\r\n pages={pdfPages}\r\n isGenerating={isGenerating}\r\n positionedFields={positionedFields}\r\n headerLeft={editorCollapsed ? (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"sm\"\r\n className=\"h-8 w-8 p-0\"\r\n onClick={() => setEditorCollapsed(false)}\r\n >\r\n <PanelLeftOpen size={14} />\r\n </Button>\r\n ) : undefined}\r\n className=\"flex-1 border-0 rounded-none\"\r\n />\r\n )}\r\n </div>\r\n\r\n {/* Editor tab footer */}\r\n <div className=\"flex items-center justify-between px-4 py-3 border-t border-border bg-gradient-to-b from-background to-muted/20\">\r\n <Button\r\n variant=\"secondary\"\r\n onClick={generatePdf}\r\n disabled={isGenerating || !editor}\r\n className=\"h-10 px-4 font-semibold shadow-sm hover:shadow-md transition-all duration-200 text-sm\"\r\n >\r\n {isGenerating ? (\r\n <Loader2 size={16} className=\"animate-spin\" />\r\n ) : (\r\n <RefreshCw size={16} />\r\n )}\r\n {isGenerating ? 'Generating...' : 'Generate PDF'}\r\n </Button>\r\n\r\n {/* Error/warning/success feedback */}\r\n <div className=\"flex flex-col items-center gap-1\">\r\n {mdExportError && (\r\n <div className=\"flex items-center gap-1.5 text-xs text-destructive max-w-[300px]\">\r\n <AlertTriangle size={14} className=\"shrink-0\" />\r\n <span className=\"truncate\">{mdExportError}</span>\r\n </div>\r\n )}\r\n {generationError && (\r\n <div className=\"flex items-center gap-1.5 text-xs text-destructive max-w-[300px]\">\r\n <AlertTriangle size={14} className=\"shrink-0\" />\r\n <span className=\"truncate\">{generationError}</span>\r\n </div>\r\n )}\r\n {fieldWarnings.length > 0 && (\r\n <div className=\"flex items-center gap-1.5 text-xs text-orange-600 max-w-[400px]\">\r\n <AlertTriangle size={14} className=\"shrink-0\" />\r\n <span className=\"truncate\">\r\n {fieldWarnings.length} field{fieldWarnings.length !== 1 ? 's' : ''} had warnings during generation\r\n </span>\r\n </div>\r\n )}\r\n {exportSuccess && (\r\n <div className=\"flex items-center gap-1.5 text-xs text-emerald-600 max-w-[300px]\">\r\n <CheckCircle2 size={14} className=\"shrink-0\" />\r\n <span>{exportSuccess}</span>\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n onClick={handleExportMarkdown}\r\n disabled={!editor || !markdown.trim()}\r\n className=\"h-10 px-4 font-semibold bg-primary hover:bg-primary/90 text-primary-foreground shadow-sm hover:shadow-md transition-all duration-200 text-sm\"\r\n >\r\n <FileText size={16} />\r\n Export MD\r\n </Button>\r\n\r\n <Button\r\n onClick={handleExport}\r\n disabled={isGenerating || !editor || pdfPages.length === 0}\r\n className=\"h-10 px-4 font-semibold bg-primary hover:bg-primary/90 text-primary-foreground shadow-sm hover:shadow-md transition-all duration-200 text-sm\"\r\n >\r\n <FileDown size={16} />\r\n {exportButtonText}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Generate tab content */}\r\n {showGenerateTab && activeTab === 'generate' && (\r\n <GeneratePanel\r\n editorMarkdown={markdown}\r\n editorContent={editor?.getJSON()}\r\n editorVariables={variables}\r\n onGeneratePdf={onGeneratePdf}\r\n initialBulkData={initialBulkData}\r\n />\r\n )}\r\n\r\n {/* Field edit popover */}\r\n <FieldEditPopover\r\n key={editFieldId}\r\n fieldId={editFieldId}\r\n attrs={editFieldAttrs}\r\n anchorEl={editFieldAnchorEl}\r\n onUpdate={updateField}\r\n onDelete={deleteField}\r\n onClose={handleCloseFieldEditPopover}\r\n />\r\n\r\n {/* Variable edit popover */}\r\n <VariableEditPopover\r\n key={editVarName}\r\n varName={editVarName}\r\n attrs={editVarAttrs}\r\n anchorEl={editVarAnchorEl}\r\n onUpdate={updateVariable}\r\n onDelete={deleteVariable}\r\n onClose={handleCloseVarEditPopover}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport function DocumentGenerator(props: DocumentGeneratorProps) {\r\n return (\r\n <ThemeProvider\r\n themeColor={props.themeColor}\r\n themeMode={props.themeMode}\r\n themeConfig={props.themeConfig}\r\n >\r\n <ComposeErrorBoundary fallbackClassName={props.className}>\r\n <DocumentGeneratorInner {...props} />\r\n </ComposeErrorBoundary>\r\n </ThemeProvider>\r\n );\r\n}\r\n","import { useState, useEffect, useCallback, useRef } from 'react';\r\nimport { EditorContent, type Editor } from '@tiptap/react';\r\nimport { Plus } from 'lucide-react';\r\nimport { EditorToolbar } from './EditorToolbar';\r\nimport { FieldInsertPopover } from './FieldInsertPopover';\r\nimport { FieldEditPopover } from './FieldEditPopover';\r\nimport { Button } from '../lib/ui/button';\r\nimport { FormFieldType } from '../types';\r\nimport type { FieldNodeAttributes } from '../extensions/field-node';\r\nimport { cn } from '../lib/utils';\r\n\r\ninterface EditorPanelProps {\r\n editor: Editor | null;\r\n showToolbar?: boolean;\r\n readOnly?: boolean;\r\n className?: string;\r\n onInsertField: (type: FormFieldType, attrs?: Partial<FieldNodeAttributes>) => void;\r\n onUpdateField: (fieldId: string, attrs: Partial<FieldNodeAttributes>) => void;\r\n onDeleteField: (fieldId: string) => void;\r\n}\r\n\r\nexport function EditorPanel({\r\n editor,\r\n showToolbar = true,\r\n readOnly = false,\r\n className,\r\n onInsertField,\r\n onUpdateField,\r\n onDeleteField,\r\n}: EditorPanelProps) {\r\n const [insertPopoverOpen, setInsertPopoverOpen] = useState(false);\r\n const [editFieldId, setEditFieldId] = useState<string | null>(null);\r\n const [editFieldAttrs, setEditFieldAttrs] = useState<Partial<FieldNodeAttributes> | null>(null);\r\n const [editAnchorEl, setEditAnchorEl] = useState<HTMLElement | null>(null);\r\n const editorWrapperRef = useRef<HTMLDivElement>(null);\r\n\r\n // Listen for double-click edit events from FieldNodeView\r\n useEffect(() => {\r\n const handler = (e: Event) => {\r\n const detail = (e as CustomEvent).detail;\r\n if (!detail?.fieldId || !editor) return;\r\n\r\n // Find the field node attrs from the editor state\r\n let foundAttrs: Record<string, unknown> | null = null;\r\n editor.state.doc.descendants((node) => {\r\n if (node.type.name === 'fieldNode' && node.attrs.fieldId === detail.fieldId) {\r\n foundAttrs = node.attrs;\r\n return false;\r\n }\r\n });\r\n\r\n if (foundAttrs) {\r\n setEditFieldId(detail.fieldId);\r\n setEditFieldAttrs(foundAttrs as Partial<FieldNodeAttributes>);\r\n\r\n // Find the DOM element for the field node to anchor the popover\r\n const fieldEl = editorWrapperRef.current?.querySelector(\r\n `[data-field-node][data-field-id=\"${detail.fieldId}\"], span[data-field-node]`\r\n ) as HTMLElement | null;\r\n\r\n if (fieldEl) {\r\n setEditAnchorEl(fieldEl);\r\n } else {\r\n setEditAnchorEl(editorWrapperRef.current);\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener('signiphi:edit-field', handler);\r\n return () => window.removeEventListener('signiphi:edit-field', handler);\r\n }, [editor]);\r\n\r\n const handleInsertField = useCallback(\r\n (type: FormFieldType, attrs?: Partial<FieldNodeAttributes>) => {\r\n onInsertField(type, attrs);\r\n },\r\n [onInsertField],\r\n );\r\n\r\n const handleCloseEditPopover = useCallback(() => {\r\n setEditFieldId(null);\r\n setEditFieldAttrs(null);\r\n setEditAnchorEl(null);\r\n }, []);\r\n\r\n const insertFieldButton = (\r\n <FieldInsertPopover\r\n open={insertPopoverOpen}\r\n onOpenChange={setInsertPopoverOpen}\r\n onInsert={handleInsertField}\r\n >\r\n <Button\r\n variant=\"outline\"\r\n size=\"sm\"\r\n className=\"h-8 gap-1.5 text-xs font-medium\"\r\n >\r\n <Plus size={14} />\r\n Insert Field\r\n </Button>\r\n </FieldInsertPopover>\r\n );\r\n\r\n return (\r\n <div className={cn('flex flex-col h-full border border-border rounded-lg overflow-hidden bg-background', className)}>\r\n {showToolbar && !readOnly && (\r\n <EditorToolbar\r\n editor={editor}\r\n insertFieldButton={insertFieldButton}\r\n />\r\n )}\r\n\r\n <div ref={editorWrapperRef} className=\"flex-1 overflow-y-auto\">\r\n <EditorContent\r\n editor={editor}\r\n className=\"prose prose-sm max-w-none p-4 min-h-full focus-within:outline-none\"\r\n />\r\n </div>\r\n\r\n <FieldEditPopover\r\n fieldId={editFieldId}\r\n attrs={editFieldAttrs}\r\n anchorEl={editAnchorEl}\r\n onUpdate={onUpdateField}\r\n onDelete={onDeleteField}\r\n onClose={handleCloseEditPopover}\r\n />\r\n </div>\r\n );\r\n}\r\n"]}
|