@unlev/exeq 0.1.0 → 0.1.2

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.mjs CHANGED
@@ -611,20 +611,29 @@ function SignatureCanvas({
611
611
 
612
612
  // src/components/pdf-builder/DesignerView.tsx
613
613
  import { Fragment, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
614
- function DesignerView() {
614
+ function DesignerView({
615
+ initialPdfUrl,
616
+ initialTemplate,
617
+ onSave
618
+ } = {}) {
615
619
  const [pages, setPages] = useState3([]);
616
- const [fields, setFields] = useState3([]);
620
+ const [fields, setFields] = useState3(initialTemplate?.fields ?? []);
617
621
  const [selectedFieldId, setSelectedFieldId] = useState3(null);
618
- const [signerRoles, setSignerRoles] = useState3([...DEFAULT_SIGNER_ROLES]);
622
+ const [signerRoles, setSignerRoles] = useState3(initialTemplate?.signerRoles ?? [...DEFAULT_SIGNER_ROLES]);
619
623
  const [activeRole, setActiveRole] = useState3("Sender");
620
624
  const [activeFieldType, setActiveFieldType] = useState3("text");
621
625
  const [loading, setLoading] = useState3(false);
622
626
  const [pdfSource, setPdfSource] = useState3(null);
623
627
  useEffect2(() => {
624
- const params = new URLSearchParams(window.location.search);
625
- const pdfUrl = params.get("pdf");
628
+ const pdfUrl = initialPdfUrl || initialTemplate?.pdfUrl;
626
629
  if (pdfUrl) {
627
630
  loadPdf(pdfUrl);
631
+ return;
632
+ }
633
+ const params = new URLSearchParams(window.location.search);
634
+ const paramPdf = params.get("pdf");
635
+ if (paramPdf) {
636
+ loadPdf(paramPdf);
628
637
  }
629
638
  const handleMessage = (e) => {
630
639
  if (e.data?.type === "load-pdf" && e.data.url) {
@@ -638,7 +647,7 @@ function DesignerView() {
638
647
  };
639
648
  window.addEventListener("message", handleMessage);
640
649
  return () => window.removeEventListener("message", handleMessage);
641
- }, []);
650
+ }, [initialPdfUrl, initialTemplate]);
642
651
  const loadPdf = useCallback3(async (source) => {
643
652
  setLoading(true);
644
653
  try {
@@ -694,16 +703,20 @@ function DesignerView() {
694
703
  signerRoles,
695
704
  pdfUrl: typeof pdfSource === "string" ? pdfSource : ""
696
705
  };
697
- const json = JSON.stringify(template, null, 2);
698
- const blob = new Blob([json], { type: "application/json" });
699
- const url = URL.createObjectURL(blob);
700
- const a = document.createElement("a");
701
- a.href = url;
702
- a.download = "template.json";
703
- a.click();
704
- URL.revokeObjectURL(url);
706
+ if (onSave) {
707
+ onSave(template);
708
+ } else {
709
+ const json = JSON.stringify(template, null, 2);
710
+ const blob = new Blob([json], { type: "application/json" });
711
+ const url = URL.createObjectURL(blob);
712
+ const a = document.createElement("a");
713
+ a.href = url;
714
+ a.download = "template.json";
715
+ a.click();
716
+ URL.revokeObjectURL(url);
717
+ }
705
718
  window.parent?.postMessage({ type: "template-saved", template }, "*");
706
- }, [fields, signerRoles, pdfSource]);
719
+ }, [fields, signerRoles, pdfSource, onSave]);
707
720
  const selectedField = fields.find((f) => f.id === selectedFieldId) || null;
708
721
  const renderFieldContent = useCallback3((field) => {
709
722
  if (field.type === "signature" || field.type === "initials") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/pdf-builder/DesignerView.tsx","../src/types/pdf-builder.ts","../src/utils/pdfRenderer.ts","../src/components/pdf-builder/PdfViewer.tsx","../src/components/pdf-builder/FieldPropertyPanel.tsx","../src/components/pdf-builder/SignerRoleSelector.tsx","../src/components/pdf-builder/SignatureCanvas.tsx","../src/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/components/pdf-builder/FieldNavigator.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useEffect } from 'react';\nimport type { FormField, FieldType, Template } from '@/types/pdf-builder';\nimport { DEFAULT_SIGNER_ROLES, createField, getSignerColor } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldPropertyPanel } from './FieldPropertyPanel';\nimport { SignerRoleSelector } from './SignerRoleSelector';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport '@/styles/pdf-builder.css';\n\nexport function DesignerView() {\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>([]);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signerRoles, setSignerRoles] = useState<string[]>([...DEFAULT_SIGNER_ROLES]);\n const [activeRole, setActiveRole] = useState('Sender');\n const [activeFieldType, setActiveFieldType] = useState<FieldType>('text');\n const [loading, setLoading] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n\n // Load PDF from URL params or postMessage\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const pdfUrl = params.get('pdf');\n if (pdfUrl) {\n loadPdf(pdfUrl);\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-pdf' && e.data.url) {\n loadPdf(e.data.url);\n }\n if (e.data?.type === 'load-template') {\n if (e.data.fields) setFields(e.data.fields);\n if (e.data.signerRoles) setSignerRoles(e.data.signerRoles);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, []);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const handleFileUpload = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (reader.result) loadPdf(reader.result as ArrayBuffer);\n };\n reader.readAsArrayBuffer(file);\n }, [loadPdf]);\n\n const handlePageClick = useCallback((page: number, x: number, y: number) => {\n const field = createField(activeFieldType, activeRole, page, x, y);\n setFields(prev => [...prev, field]);\n setSelectedFieldId(field.id);\n }, [activeFieldType, activeRole]);\n\n const handleFieldMove = useCallback((id: string, page: number, x: number, y: number) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, page, x, y } : f));\n }, []);\n\n const handleFieldResize = useCallback((id: string, width: number, height: number) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, width, height } : f));\n }, []);\n\n const handleFieldUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, ...updates } : f));\n }, []);\n\n const handleFieldDelete = useCallback((id: string) => {\n setFields(prev => prev.filter(f => f.id !== id));\n if (selectedFieldId === id) setSelectedFieldId(null);\n }, [selectedFieldId]);\n\n const handleAddRole = useCallback((role: string) => {\n if (!signerRoles.includes(role)) {\n setSignerRoles(prev => [...prev, role]);\n }\n }, [signerRoles]);\n\n const handleRemoveRole = useCallback((role: string) => {\n setSignerRoles(prev => prev.filter(r => r !== role));\n setFields(prev => prev.map(f => f.assignee === role ? { ...f, assignee: signerRoles[0] } : f));\n if (activeRole === role) setActiveRole(signerRoles[0]);\n }, [signerRoles, activeRole]);\n\n const handleExport = useCallback(() => {\n const template: Template = {\n fields,\n signerRoles,\n pdfUrl: typeof pdfSource === 'string' ? pdfSource : '',\n };\n const json = JSON.stringify(template, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'template.json';\n a.click();\n URL.revokeObjectURL(url);\n\n // Also post to parent if embedded\n window.parent?.postMessage({ type: 'template-saved', template }, '*');\n }, [fields, signerRoles, pdfSource]);\n\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n\n const renderFieldContent = useCallback((field: FormField) => {\n if (field.type === 'signature' || field.type === 'initials') {\n if (field.value) {\n return <img src={field.value} alt={field.label} className=\"field-signature-preview\" />;\n }\n }\n return (\n <div className=\"field-overlay-placeholder\">\n {field.value || field.placeholder}\n </div>\n );\n }, []);\n\n return (\n <div className=\"designer-layout\">\n <div className=\"designer-toolbar\">\n <div className=\"toolbar-left\">\n {!pages.length && (\n <label className=\"upload-btn\">\n Upload PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n )}\n {pages.length > 0 && (\n <>\n <label className=\"upload-btn upload-btn-small\">\n Change PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n <div className=\"field-type-selector\">\n {(['text', 'signature', 'signed-date', 'checkbox', 'initials'] as FieldType[]).map(type => (\n <button\n key={type}\n className={`field-type-btn ${activeFieldType === type ? 'active' : ''}`}\n onClick={() => setActiveFieldType(type)}\n >\n {type === 'text' ? 'Text' :\n type === 'signature' ? 'Signature' :\n type === 'signed-date' ? 'Date' :\n type === 'checkbox' ? 'Checkbox' : 'Initials'}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n <div className=\"toolbar-right\">\n {pages.length > 0 && (\n <button onClick={handleExport} className=\"export-btn\">\n Export Template\n </button>\n )}\n </div>\n </div>\n\n {pages.length > 0 && (\n <SignerRoleSelector\n roles={signerRoles}\n activeRole={activeRole}\n onSetActiveRole={setActiveRole}\n onAddRole={handleAddRole}\n onRemoveRole={handleRemoveRole}\n />\n )}\n\n <div className=\"designer-content\">\n <div className=\"designer-pdf-area\">\n {loading && <div className=\"loading-indicator\">Loading PDF...</div>}\n {!pages.length && !loading && (\n <div className=\"empty-state\">\n <h2>Upload a PDF to get started</h2>\n <p>Upload a template PDF, then click on the page to place form fields.</p>\n <label className=\"upload-btn upload-btn-large\">\n Choose PDF File\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n </div>\n )}\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={setSelectedFieldId}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\n onPageClick={handlePageClick}\n mode=\"designer\"\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"designer-panel\">\n {selectedField ? (\n <>\n <FieldPropertyPanel\n field={selectedField}\n signerRoles={signerRoles}\n onUpdate={handleFieldUpdate}\n onDelete={handleFieldDelete}\n />\n {/* Pre-fill area for Sender fields */}\n {selectedField.assignee === activeRole && (\n <div className=\"prefill-section\">\n <h4>Pre-fill Value</h4>\n {(selectedField.type === 'signature' || selectedField.type === 'initials') ? (\n <SignatureCanvas\n width={300}\n height={selectedField.type === 'initials' ? 100 : 150}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, { value: dataUrl })}\n initialValue={selectedField.value}\n />\n ) : selectedField.type === 'checkbox' ? (\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.checked ? 'true' : '' })}\n />\n Checked\n </label>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.value })}\n placeholder={`Pre-fill ${selectedField.label}`}\n className=\"prefill-input\"\n />\n )}\n </div>\n )}\n </>\n ) : (\n <div className=\"panel-empty\">\n {pages.length > 0\n ? 'Click on the PDF to place a field, or select an existing field to edit its properties.'\n : 'Upload a PDF to begin designing your template.'}\n </div>\n )}\n\n {fields.length > 0 && (\n <div className=\"field-list\">\n <h4>All Fields ({fields.length})</h4>\n {fields.map((f, i) => (\n <div\n key={f.id}\n className={`field-list-item ${f.id === selectedFieldId ? 'active' : ''}`}\n onClick={() => setSelectedFieldId(f.id)}\n >\n <span\n className=\"field-list-dot\"\n style={{ backgroundColor: getSignerColor(f.assignee) }}\n />\n <span className=\"field-list-name\">{f.label}</span>\n <span className=\"field-list-page\">p{f.page + 1}</span>\n {f.required && <span className=\"field-list-required\">*</span>}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n );\n}\n","function generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport type FieldType = 'text' | 'signature' | 'signed-date' | 'checkbox' | 'initials';\n\nexport type TextSubtype = 'freeform' | 'number' | 'date' | 'email' | 'phone';\n\nexport interface FormField {\n id: string;\n type: FieldType;\n textSubtype?: TextSubtype;\n label: string;\n placeholder: string;\n required: boolean;\n assignee: string; // signer role e.g. \"Sender\", \"Signer 1\"\n page: number; // 0-indexed page number\n x: number; // percentage of page width (0-100)\n y: number; // percentage of page height (0-100)\n width: number; // percentage of page width\n height: number; // percentage of page height\n fontSize: number; // in points\n value: string; // pre-filled value or current value\n}\n\nexport interface Template {\n fields: FormField[];\n signerRoles: string[];\n pdfUrl: string;\n}\n\nexport const DEFAULT_SIGNER_ROLES = ['Sender', 'Signer 1'];\n\nexport const SIGNER_ROLE_COLORS: Record<string, string> = {\n 'Sender': '#6366f1',\n 'Signer 1': '#22c55e',\n 'Signer 2': '#f59e0b',\n 'Signer 3': '#ef4444',\n 'Signer 4': '#06b6d4',\n 'Signer 5': '#d946ef',\n};\n\nexport function getSignerColor(role: string): string {\n return SIGNER_ROLE_COLORS[role] || '#888888';\n}\n\nexport const FIELD_DEFAULTS: Record<FieldType, Partial<FormField>> = {\n text: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: 'Enter text',\n textSubtype: 'freeform',\n },\n signature: {\n width: 20,\n height: 6,\n fontSize: 12,\n placeholder: 'Sign here',\n },\n 'signed-date': {\n width: 15,\n height: 3,\n fontSize: 12,\n placeholder: 'Date',\n },\n checkbox: {\n width: 2.5,\n height: 2.5,\n fontSize: 12,\n placeholder: '',\n },\n initials: {\n width: 8,\n height: 5,\n fontSize: 12,\n placeholder: 'Initials',\n },\n};\n\nexport function createField(\n type: FieldType,\n assignee: string,\n page: number,\n x: number,\n y: number,\n): FormField {\n const defaults = FIELD_DEFAULTS[type];\n return {\n id: generateId(),\n type,\n label: type === 'text' ? 'Text Field' : type === 'signature' ? 'Signature' : type === 'signed-date' ? 'Signed Date' : type === 'checkbox' ? 'Checkbox' : 'Initials',\n placeholder: defaults.placeholder || '',\n required: true,\n assignee,\n page,\n x,\n y,\n width: defaults.width || 20,\n height: defaults.height || 3,\n fontSize: defaults.fontSize || 12,\n value: '',\n ...(type === 'text' ? { textSubtype: defaults.textSubtype as TextSubtype } : {}),\n };\n}\n","import * as pdfjsLib from 'pdfjs-dist';\n\n// Configure the worker\nif (typeof window !== 'undefined') {\n pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.mjs`;\n}\n\nexport interface RenderedPage {\n pageNumber: number;\n dataUrl: string;\n width: number;\n height: number;\n}\n\nexport async function renderPdfPages(\n source: string | ArrayBuffer,\n scale: number = 2,\n): Promise<RenderedPage[]> {\n const loadingTask = pdfjsLib.getDocument(\n typeof source === 'string' ? { url: source } : { data: source }\n );\n const pdf = await loadingTask.promise;\n const pages: RenderedPage[] = [];\n\n for (let i = 1; i <= pdf.numPages; i++) {\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d')!;\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n pages.push({\n pageNumber: i,\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height,\n });\n }\n\n return pages;\n}\n","'use client';\n\nimport { useRef, useCallback } from 'react';\nimport type { FormField } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface PdfViewerProps {\n pages: RenderedPage[];\n fields: FormField[];\n selectedFieldId: string | null;\n onSelectField: (id: string | null) => void;\n onFieldMove?: (id: string, page: number, x: number, y: number) => void;\n onFieldResize?: (id: string, width: number, height: number) => void;\n onPageClick?: (page: number, x: number, y: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldId,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n mode,\n currentSigner,\n renderFieldContent,\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handlePageClick = useCallback((e: React.MouseEvent<HTMLDivElement>, pageIndex: number) => {\n const target = e.target as HTMLElement;\n if (target.closest('.field-overlay')) return;\n\n if (onPageClick) {\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n onPageClick(pageIndex, x, y);\n } else {\n onSelectField(null);\n }\n }, [onPageClick, onSelectField]);\n\n return (\n <div className=\"pdf-viewer\" ref={containerRef}>\n {pages.map((page, pageIndex) => {\n const pageFields = fields.filter(f => f.page === pageIndex);\n return (\n <div\n key={pageIndex}\n className=\"pdf-page\"\n style={{ aspectRatio: `${page.width} / ${page.height}` }}\n onClick={(e) => handlePageClick(e, pageIndex)}\n data-page={pageIndex}\n >\n <img\n src={page.dataUrl}\n alt={`Page ${pageIndex + 1}`}\n className=\"pdf-page-image\"\n draggable={false}\n />\n {pageFields.map(field => (\n <FieldOverlayItem\n key={field.id}\n field={field}\n isSelected={field.id === selectedFieldId}\n onSelect={() => onSelectField(field.id)}\n onMove={onFieldMove}\n onResize={onFieldResize}\n mode={mode}\n currentSigner={currentSigner}\n renderContent={renderFieldContent}\n />\n ))}\n </div>\n );\n })}\n </div>\n );\n}\n\ninterface FieldOverlayItemProps {\n field: FormField;\n isSelected: boolean;\n onSelect: () => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n onSelect,\n onMove,\n onResize,\n mode,\n currentSigner,\n renderContent,\n}: FieldOverlayItemProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const dragStartRef = useRef<{ startX: number; startY: number; fieldX: number; fieldY: number } | null>(null);\n const resizeStartRef = useRef<{ startX: number; startY: number; fieldW: number; fieldH: number } | null>(null);\n\n const color = getSignerColor(field.assignee);\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\n const isPreFilled = !isEditable && !!field.value;\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onMove) return;\n e.preventDefault();\n e.stopPropagation();\n onSelect();\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldX: field.x,\n fieldY: field.y,\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!dragStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((e.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((e.clientY - dragStartRef.current.startY) / rect.height) * 100;\n const newX = Math.max(0, Math.min(100 - field.width, dragStartRef.current.fieldX + dx));\n const newY = Math.max(0, Math.min(100 - field.height, dragStartRef.current.fieldY + dy));\n onMove(field.id, field.page, newX, newY);\n };\n\n const handleMouseUp = () => {\n dragStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onMove, onSelect]);\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onResize) return;\n e.preventDefault();\n e.stopPropagation();\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n resizeStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldW: field.width,\n fieldH: field.height,\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dw = ((e.clientX - resizeStartRef.current.startX) / rect.width) * 100;\n const dh = ((e.clientY - resizeStartRef.current.startY) / rect.height) * 100;\n const newW = Math.max(2, Math.min(100 - field.x, resizeStartRef.current.fieldW + dw));\n const newH = Math.max(1.5, Math.min(100 - field.y, resizeStartRef.current.fieldH + dh));\n onResize(field.id, newW, newH);\n };\n\n const handleMouseUp = () => {\n resizeStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onResize]);\n\n return (\n <div\n ref={overlayRef}\n className={`field-overlay ${isSelected ? 'selected' : ''} ${isEditable ? 'editable' : 'readonly'} ${isPreFilled ? 'prefilled' : ''}`}\n style={{\n left: `${field.x}%`,\n top: `${field.y}%`,\n width: `${field.width}%`,\n height: `${field.height}%`,\n borderColor: color,\n backgroundColor: isSelected ? `${color}22` : `${color}11`,\n cursor: mode === 'designer' ? 'move' : 'default',\n }}\n onClick={(e) => { e.stopPropagation(); onSelect(); }}\n onMouseDown={handleMouseDown}\n >\n {mode === 'designer' && (\n <div className=\"field-overlay-label\" style={{ backgroundColor: color }}>\n {field.label}\n </div>\n )}\n\n {renderContent ? renderContent(field) : (\n <div className=\"field-overlay-placeholder\">\n {field.value || field.placeholder}\n </div>\n )}\n\n {mode === 'designer' && isSelected && (\n <div\n className=\"field-resize-handle\"\n onMouseDown={handleResizeMouseDown}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface FieldPropertyPanelProps {\n field: FormField;\n signerRoles: string[];\n onUpdate: (id: string, updates: Partial<FormField>) => void;\n onDelete: (id: string) => void;\n}\n\nexport function FieldPropertyPanel({ field, signerRoles, onUpdate, onDelete }: FieldPropertyPanelProps) {\n const color = getSignerColor(field.assignee);\n\n return (\n <div className=\"field-property-panel\">\n <div className=\"panel-header\">\n <h3 style={{ color }}>\n {field.label}\n </h3>\n <button onClick={() => onDelete(field.id)} className=\"panel-delete-btn\">\n Delete\n </button>\n </div>\n\n <div className=\"panel-field\">\n <label>Label</label>\n <input\n type=\"text\"\n value={field.label}\n onChange={e => onUpdate(field.id, { label: e.target.value })}\n />\n </div>\n\n <div className=\"panel-field\">\n <label>Field Type</label>\n <select\n value={field.type}\n onChange={e => onUpdate(field.id, { type: e.target.value as FieldType })}\n >\n <option value=\"text\">Text</option>\n <option value=\"signature\">Signature</option>\n <option value=\"signed-date\">Signed Date</option>\n <option value=\"checkbox\">Checkbox</option>\n <option value=\"initials\">Initials</option>\n </select>\n </div>\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Text Type</label>\n <select\n value={field.textSubtype || 'freeform'}\n onChange={e => onUpdate(field.id, { textSubtype: e.target.value as TextSubtype })}\n >\n <option value=\"freeform\">Freeform</option>\n <option value=\"number\">Number</option>\n <option value=\"date\">Date</option>\n <option value=\"email\">Email</option>\n <option value=\"phone\">Phone</option>\n </select>\n </div>\n )}\n\n <div className=\"panel-field\">\n <label>Assigned To</label>\n <select\n value={field.assignee}\n onChange={e => onUpdate(field.id, { assignee: e.target.value })}\n >\n {signerRoles.map(role => (\n <option key={role} value={role} style={{ color: getSignerColor(role) }}>\n {role}\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"panel-field\">\n <label>Placeholder</label>\n <input\n type=\"text\"\n value={field.placeholder}\n onChange={e => onUpdate(field.id, { placeholder: e.target.value })}\n />\n </div>\n\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={e => onUpdate(field.id, { required: e.target.checked })}\n />\n Required\n </label>\n </div>\n\n {field.type !== 'checkbox' && (\n <div className=\"panel-field\">\n <label>Font Size (pt)</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={field.fontSize}\n onChange={e => onUpdate(field.id, { fontSize: Number(e.target.value) })}\n />\n </div>\n )}\n\n <div className=\"panel-field-group\">\n <div className=\"panel-field\">\n <label>Width (%)</label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"100\"\n step=\"0.5\"\n value={field.width}\n onChange={e => onUpdate(field.id, { width: Number(e.target.value) })}\n />\n </div>\n <div className=\"panel-field\">\n <label>Height (%)</label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"100\"\n step=\"0.5\"\n value={field.height}\n onChange={e => onUpdate(field.id, { height: Number(e.target.value) })}\n />\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n &times;\n </span>\n )}\n </button>\n ))}\n {isAdding ? (\n <div className=\"signer-role-add-input\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAdd()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAdd}>Add</button>\n <button onClick={() => setIsAdding(false)}>Cancel</button>\n </div>\n ) : (\n <button\n className=\"signer-role-add-btn\"\n onClick={() => setIsAdding(true)}\n >\n + Add Role\n </button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\nimport { getStroke } from 'perfect-freehand';\n\ninterface SignatureCanvasProps {\n width?: number;\n height?: number;\n onSign: (dataUrl: string) => void;\n initialValue?: string;\n className?: string;\n}\n\nfunction getSvgPathFromStroke(stroke: number[][]) {\n if (!stroke.length) return '';\n\n const d = stroke.reduce(\n (acc, [x0, y0], i, arr) => {\n const [x1, y1] = arr[(i + 1) % arr.length];\n acc.push(x0, y0, (x0 + x1) / 2, (y0 + y1) / 2);\n return acc;\n },\n ['M', ...stroke[0], 'Q'],\n );\n\n d.push('Z');\n return d.join(' ');\n}\n\nexport function SignatureCanvas({\n width = 400,\n height = 150,\n onSign,\n initialValue,\n className,\n}: SignatureCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [paths, setPaths] = useState<number[][][]>([]);\n const [currentPath, setCurrentPath] = useState<number[][] | null>(null);\n const [isEmpty, setIsEmpty] = useState(!initialValue);\n\n // Draw initial value if provided\n useEffect(() => {\n if (initialValue && canvasRef.current) {\n const ctx = canvasRef.current.getContext('2d')!;\n const img = new Image();\n img.onload = () => {\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0, width, height);\n };\n img.src = initialValue;\n }\n }, [initialValue, width, height]);\n\n // Redraw all paths whenever they change\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n\n const allPaths = currentPath ? [...paths, currentPath] : paths;\n\n for (const path of allPaths) {\n const stroke = getStroke(path, {\n size: 3,\n thinning: 0.5,\n smoothing: 0.5,\n streamline: 0.5,\n });\n const pathStr = getSvgPathFromStroke(stroke);\n const path2d = new Path2D(pathStr);\n ctx.fillStyle = '#000';\n ctx.fill(path2d);\n }\n }, [paths, currentPath, width, height]);\n\n const getPoint = useCallback((e: React.PointerEvent) => {\n const rect = canvasRef.current!.getBoundingClientRect();\n return [\n e.clientX - rect.left,\n e.clientY - rect.top,\n e.pressure,\n ];\n }, []);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n setCurrentPath([getPoint(e)]);\n }, [getPoint]);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n if (!currentPath) return;\n e.preventDefault();\n setCurrentPath([...currentPath, getPoint(e)]);\n }, [currentPath, getPoint]);\n\n const handlePointerUp = useCallback(() => {\n if (!currentPath) return;\n setPaths(prev => [...prev, currentPath]);\n setCurrentPath(null);\n setIsEmpty(false);\n\n // Export after state updates\n requestAnimationFrame(() => {\n if (canvasRef.current) {\n onSign(canvasRef.current.toDataURL('image/png'));\n }\n });\n }, [currentPath, onSign]);\n\n const handleClear = useCallback(() => {\n setPaths([]);\n setCurrentPath(null);\n setIsEmpty(true);\n const canvas = canvasRef.current;\n if (canvas) {\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n onSign('');\n }\n }, [width, height, onSign]);\n\n return (\n <div className={`signature-canvas-wrapper ${className || ''}`}>\n <canvas\n ref={canvasRef}\n width={width}\n height={height}\n className=\"signature-canvas\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{ touchAction: 'none' }}\n />\n <div className=\"signature-canvas-actions\">\n {!isEmpty && (\n <button type=\"button\" onClick={handleClear} className=\"signature-clear-btn\">\n Clear\n </button>\n )}\n {isEmpty && <span className=\"signature-hint\">Draw your signature above</span>}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { FormField, Template } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { generateFilledPdf, downloadPdf, postPdfToCallback } from '@/utils/pdfFiller';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldNavigator } from './FieldNavigator';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport '@/styles/pdf-builder.css';\n\ninterface SignerViewProps {\n /** If provided, use these instead of URL params / postMessage */\n initialPdfUrl?: string;\n initialTemplate?: Template;\n initialSigner?: string;\n callbackUrl?: string;\n onComplete?: (pdfBlob: Blob) => void;\n}\n\nexport function SignerView({\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n}: SignerViewProps = {}) {\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>([]);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signer, setSigner] = useState(initialSigner || 'Signer 1');\n const [loading, setLoading] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [callbackUrl, setCallbackUrl] = useState(initialCallbackUrl || '');\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n setFields(initialTemplate.fields);\n if (initialPdfUrl) loadPdf(initialPdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const pdfUrl = params.get('pdf');\n const fieldsUrl = params.get('fields');\n const signerParam = params.get('signer');\n const cbUrl = params.get('callbackUrl');\n\n if (signerParam) setSigner(signerParam);\n if (cbUrl) setCallbackUrl(cbUrl);\n\n if (pdfUrl) loadPdf(pdfUrl);\n if (fieldsUrl) {\n fetch(fieldsUrl)\n .then(r => r.json())\n .then((template: Template) => setFields(template.fields))\n .catch(err => console.error('Failed to load fields:', err));\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-signing') {\n if (e.data.fields) setFields(e.data.fields);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) setSigner(e.data.signer);\n if (e.data.callbackUrl) setCallbackUrl(e.data.callbackUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialTemplate, initialPdfUrl]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Fields this signer needs to fill\n const editableFields = fields.filter(f => f.assignee === signer);\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n const isFieldEditable = selectedField ? selectedField.assignee === signer : false;\n\n const handleFieldUpdate = useCallback((id: string, value: string) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, value } : f));\n }, []);\n\n const handleNavigate = useCallback((fieldId: string) => {\n setSelectedFieldId(fieldId);\n // Scroll to that field's page\n const field = fields.find(f => f.id === fieldId);\n if (field && containerRef.current) {\n const pageEl = containerRef.current.querySelector(`[data-page=\"${field.page}\"]`);\n if (pageEl) {\n pageEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n }, [fields]);\n\n const allRequiredFilled = editableFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true; // checkbox is always \"filled\"\n return !!f.value;\n });\n\n const handleSubmit = useCallback(async () => {\n if (!pdfSource || !allRequiredFilled) return;\n setSubmitting(true);\n try {\n const pdfBytes = await generateFilledPdf(pdfSource, fields);\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n // Always allow download\n downloadPdf(pdfBytes, 'signed-document.pdf');\n\n // Post to callback if provided\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n // Notify parent via callback prop\n if (onComplete) {\n onComplete(blob);\n }\n\n // Notify parent window via postMessage\n window.parent?.postMessage({ type: 'signing-complete' }, '*');\n } catch (err) {\n console.error('Failed to generate PDF:', err);\n } finally {\n setSubmitting(false);\n }\n }, [pdfSource, fields, callbackUrl, allRequiredFilled, onComplete]);\n\n const renderFieldContent = useCallback((field: FormField) => {\n const editable = field.assignee === signer;\n\n if (!editable) {\n // Show pre-filled content as read-only\n if (field.type === 'signature' || field.type === 'initials') {\n return field.value ? (\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n ) : (\n <div className=\"field-overlay-placeholder readonly\">{field.placeholder}</div>\n );\n }\n if (field.type === 'checkbox') {\n return (\n <div className=\"field-checkbox-display readonly\">\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder readonly\">\n {field.value || field.placeholder}\n </div>\n );\n }\n\n // Editable fields\n if (field.type === 'signature' || field.type === 'initials') {\n if (field.value) {\n return (\n <div className=\"field-signature-filled\" onClick={() => handleFieldUpdate(field.id, '')}>\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder editable\">\n {field.placeholder}\n </div>\n );\n }\n\n if (field.type === 'checkbox') {\n return (\n <div\n className=\"field-checkbox-display editable\"\n onClick={(e) => {\n e.stopPropagation();\n handleFieldUpdate(field.id, field.value === 'true' ? '' : 'true');\n }}\n >\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n\n if (field.type === 'signed-date') {\n return (\n <div className=\"field-overlay-value\">\n {field.value || new Date().toLocaleDateString()}\n </div>\n );\n }\n\n // Text field\n return (\n <input\n type={field.textSubtype === 'email' ? 'email' :\n field.textSubtype === 'number' ? 'number' :\n field.textSubtype === 'phone' ? 'tel' :\n field.textSubtype === 'date' ? 'date' : 'text'}\n className=\"field-inline-input\"\n value={field.value}\n placeholder={field.placeholder}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n style={{ fontSize: `${field.fontSize * 0.6}px` }}\n />\n );\n }, [signer, handleFieldUpdate]);\n\n // Auto-fill signed-date fields when signature is filled\n useEffect(() => {\n const sigFields = fields.filter(f => f.assignee === signer && f.type === 'signature' && f.value);\n if (sigFields.length > 0) {\n const dateStr = new Date().toLocaleDateString();\n setFields(prev => prev.map(f => {\n if (f.assignee === signer && f.type === 'signed-date' && !f.value) {\n return { ...f, value: dateStr };\n }\n return f;\n }));\n }\n }, [fields.filter(f => f.type === 'signature' && f.value).length]);\n\n return (\n <div className=\"signer-layout\" ref={containerRef}>\n {loading && <div className=\"loading-indicator\">Loading document...</div>}\n\n <div className=\"signer-content\">\n <div className=\"signer-pdf-area\">\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={setSelectedFieldId}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\n {selectedField && isFieldEditable && (\n <div className=\"signer-field-input\">\n <h3>{selectedField.label}</h3>\n {selectedField.required && <span className=\"required-badge\">Required</span>}\n\n {(selectedField.type === 'signature' || selectedField.type === 'initials') && (\n <SignatureCanvas\n width={280}\n height={selectedField.type === 'initials' ? 80 : 120}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, dataUrl)}\n initialValue={selectedField.value}\n />\n )}\n\n {selectedField.type === 'text' && (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n placeholder={selectedField.placeholder}\n className=\"signer-text-input\"\n />\n )}\n\n {selectedField.type === 'checkbox' && (\n <label className=\"signer-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.checked ? 'true' : '')}\n />\n {selectedField.placeholder || 'Check this box'}\n </label>\n )}\n\n {selectedField.type === 'signed-date' && (\n <div className=\"signer-date-display\">\n {selectedField.value || 'Will auto-fill when you sign'}\n </div>\n )}\n </div>\n )}\n\n {selectedField && !isFieldEditable && (\n <div className=\"signer-field-readonly\">\n <h3>{selectedField.label}</h3>\n <p>This field belongs to another signer.</p>\n </div>\n )}\n\n {!selectedField && editableFields.length > 0 && (\n <div className=\"panel-empty\">\n Select a field to fill it in, or use the navigation below.\n </div>\n )}\n\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onSubmit={handleSubmit}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n </div>\n </div>\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n );\n}\n","import { PDFDocument, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\n\nexport async function generateFilledPdf(\n pdfSource: string | ArrayBuffer,\n fields: FormField[],\n): Promise<Uint8Array> {\n let pdfBytes: ArrayBuffer;\n if (typeof pdfSource === 'string') {\n const res = await fetch(pdfSource);\n pdfBytes = await res.arrayBuffer();\n } else {\n pdfBytes = pdfSource;\n }\n\n const pdfDoc = await PDFDocument.load(pdfBytes);\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\n const pages = pdfDoc.getPages();\n\n for (const field of fields) {\n if (!field.value) continue;\n const page = pages[field.page];\n if (!page) continue;\n\n const pageWidth = page.getWidth();\n const pageHeight = page.getHeight();\n\n // Convert percentage coordinates to PDF points\n const x = (field.x / 100) * pageWidth;\n const y = pageHeight - ((field.y / 100) * pageHeight) - ((field.height / 100) * pageHeight);\n const w = (field.width / 100) * pageWidth;\n const h = (field.height / 100) * pageHeight;\n\n if (field.type === 'checkbox') {\n if (field.value === 'true') {\n // Draw an X checkmark (WinAnsi-safe, no unicode)\n const inset = Math.min(w, h) * 0.2;\n const lineWidth = Math.min(w, h) * 0.08;\n page.drawLine({\n start: { x: x + inset, y: y + inset },\n end: { x: x + w - inset, y: y + h - inset },\n thickness: lineWidth,\n color: rgb(0, 0, 0),\n });\n page.drawLine({\n start: { x: x + w - inset, y: y + inset },\n end: { x: x + inset, y: y + h - inset },\n thickness: lineWidth,\n color: rgb(0, 0, 0),\n });\n }\n } else if (field.type === 'signature' || field.type === 'initials') {\n // Value is a data URL from the canvas\n if (field.value.startsWith('data:image/png')) {\n const pngBytes = Uint8Array.from(\n atob(field.value.split(',')[1]),\n c => c.charCodeAt(0),\n );\n const pngImage = await pdfDoc.embedPng(pngBytes);\n page.drawImage(pngImage, {\n x,\n y,\n width: w,\n height: h,\n });\n }\n } else {\n // Text fields (including signed-date)\n const fontSize = Math.min(field.fontSize, h * 0.7);\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: rgb(0, 0, 0),\n maxWidth: w - 4,\n });\n }\n }\n\n return pdfDoc.save();\n}\n\nexport function downloadPdf(bytes: Uint8Array, filename: string) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport async function postPdfToCallback(\n bytes: Uint8Array,\n callbackUrl: string,\n filename: string,\n) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const formData = new FormData();\n formData.append('file', blob, filename);\n\n await fetch(callbackUrl, {\n method: 'POST',\n body: formData,\n });\n}\n","'use client';\n\nimport type { FormField } from '@/types/pdf-builder';\n\ninterface FieldNavigatorProps {\n fields: FormField[];\n currentFieldId: string | null;\n onNavigate: (fieldId: string) => void;\n allRequiredFilled: boolean;\n onSubmit: () => void;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onSubmit,\n}: FieldNavigatorProps) {\n const currentIndex = fields.findIndex(f => f.id === currentFieldId);\n const hasPrev = currentIndex > 0;\n const hasNext = currentIndex < fields.length - 1;\n\n const handlePrev = () => {\n if (hasPrev) {\n onNavigate(fields[currentIndex - 1].id);\n }\n };\n\n const handleNext = () => {\n if (hasNext) {\n onNavigate(fields[currentIndex + 1].id);\n }\n };\n\n const filledCount = fields.filter(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n }).length;\n\n return (\n <div className=\"field-navigator\">\n <div className=\"field-navigator-progress\">\n {filledCount} of {fields.length} fields completed\n </div>\n <div className=\"field-navigator-controls\">\n <button\n onClick={handlePrev}\n disabled={!hasPrev}\n className=\"nav-btn\"\n >\n Prev\n </button>\n <span className=\"field-navigator-position\">\n {currentIndex >= 0 ? `${currentIndex + 1} / ${fields.length}` : '-'}\n </span>\n <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n </div>\n <button\n onClick={onSubmit}\n disabled={!allRequiredFilled}\n className=\"submit-btn\"\n >\n Complete & Download\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":["useState","useCallback","useEffect","e","jsx","jsxs","jsx","jsxs","useRef","useState","useCallback","jsx","jsxs","jsx","jsxs","useState","useEffect","useCallback","useState","useCallback","useEffect","useRef","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback"]}
1
+ {"version":3,"sources":["../src/components/pdf-builder/DesignerView.tsx","../src/types/pdf-builder.ts","../src/utils/pdfRenderer.ts","../src/components/pdf-builder/PdfViewer.tsx","../src/components/pdf-builder/FieldPropertyPanel.tsx","../src/components/pdf-builder/SignerRoleSelector.tsx","../src/components/pdf-builder/SignatureCanvas.tsx","../src/components/pdf-builder/SignerView.tsx","../src/utils/pdfFiller.ts","../src/components/pdf-builder/FieldNavigator.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useCallback, useEffect } from 'react';\nimport type { FormField, FieldType, Template } from '@/types/pdf-builder';\nimport { DEFAULT_SIGNER_ROLES, createField, getSignerColor } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldPropertyPanel } from './FieldPropertyPanel';\nimport { SignerRoleSelector } from './SignerRoleSelector';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport '@/styles/pdf-builder.css';\n\nexport interface DesignerViewProps {\n /** URL to a PDF to pre-load */\n initialPdfUrl?: string;\n /** Existing template to load (fields, signer roles, and PDF URL) */\n initialTemplate?: Template;\n /** Called when the user clicks \"Export Template\" */\n onSave?: (template: Template) => void;\n}\n\nexport function DesignerView({\n initialPdfUrl,\n initialTemplate,\n onSave,\n}: DesignerViewProps = {}) {\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>(initialTemplate?.fields ?? []);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signerRoles, setSignerRoles] = useState<string[]>(initialTemplate?.signerRoles ?? [...DEFAULT_SIGNER_ROLES]);\n const [activeRole, setActiveRole] = useState('Sender');\n const [activeFieldType, setActiveFieldType] = useState<FieldType>('text');\n const [loading, setLoading] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n\n // Load PDF from props, URL params, or postMessage\n useEffect(() => {\n const pdfUrl = initialPdfUrl || initialTemplate?.pdfUrl;\n if (pdfUrl) {\n loadPdf(pdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const paramPdf = params.get('pdf');\n if (paramPdf) {\n loadPdf(paramPdf);\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-pdf' && e.data.url) {\n loadPdf(e.data.url);\n }\n if (e.data?.type === 'load-template') {\n if (e.data.fields) setFields(e.data.fields);\n if (e.data.signerRoles) setSignerRoles(e.data.signerRoles);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialPdfUrl, initialTemplate]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const handleFileUpload = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n if (reader.result) loadPdf(reader.result as ArrayBuffer);\n };\n reader.readAsArrayBuffer(file);\n }, [loadPdf]);\n\n const handlePageClick = useCallback((page: number, x: number, y: number) => {\n const field = createField(activeFieldType, activeRole, page, x, y);\n setFields(prev => [...prev, field]);\n setSelectedFieldId(field.id);\n }, [activeFieldType, activeRole]);\n\n const handleFieldMove = useCallback((id: string, page: number, x: number, y: number) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, page, x, y } : f));\n }, []);\n\n const handleFieldResize = useCallback((id: string, width: number, height: number) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, width, height } : f));\n }, []);\n\n const handleFieldUpdate = useCallback((id: string, updates: Partial<FormField>) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, ...updates } : f));\n }, []);\n\n const handleFieldDelete = useCallback((id: string) => {\n setFields(prev => prev.filter(f => f.id !== id));\n if (selectedFieldId === id) setSelectedFieldId(null);\n }, [selectedFieldId]);\n\n const handleAddRole = useCallback((role: string) => {\n if (!signerRoles.includes(role)) {\n setSignerRoles(prev => [...prev, role]);\n }\n }, [signerRoles]);\n\n const handleRemoveRole = useCallback((role: string) => {\n setSignerRoles(prev => prev.filter(r => r !== role));\n setFields(prev => prev.map(f => f.assignee === role ? { ...f, assignee: signerRoles[0] } : f));\n if (activeRole === role) setActiveRole(signerRoles[0]);\n }, [signerRoles, activeRole]);\n\n const handleExport = useCallback(() => {\n const template: Template = {\n fields,\n signerRoles,\n pdfUrl: typeof pdfSource === 'string' ? pdfSource : '',\n };\n\n if (onSave) {\n onSave(template);\n } else {\n // Default: download as JSON file\n const json = JSON.stringify(template, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'template.json';\n a.click();\n URL.revokeObjectURL(url);\n }\n\n // Also post to parent if embedded\n window.parent?.postMessage({ type: 'template-saved', template }, '*');\n }, [fields, signerRoles, pdfSource, onSave]);\n\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n\n const renderFieldContent = useCallback((field: FormField) => {\n if (field.type === 'signature' || field.type === 'initials') {\n if (field.value) {\n return <img src={field.value} alt={field.label} className=\"field-signature-preview\" />;\n }\n }\n return (\n <div className=\"field-overlay-placeholder\">\n {field.value || field.placeholder}\n </div>\n );\n }, []);\n\n return (\n <div className=\"designer-layout\">\n <div className=\"designer-toolbar\">\n <div className=\"toolbar-left\">\n {!pages.length && (\n <label className=\"upload-btn\">\n Upload PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n )}\n {pages.length > 0 && (\n <>\n <label className=\"upload-btn upload-btn-small\">\n Change PDF\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n <div className=\"field-type-selector\">\n {(['text', 'signature', 'signed-date', 'checkbox', 'initials'] as FieldType[]).map(type => (\n <button\n key={type}\n className={`field-type-btn ${activeFieldType === type ? 'active' : ''}`}\n onClick={() => setActiveFieldType(type)}\n >\n {type === 'text' ? 'Text' :\n type === 'signature' ? 'Signature' :\n type === 'signed-date' ? 'Date' :\n type === 'checkbox' ? 'Checkbox' : 'Initials'}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n <div className=\"toolbar-right\">\n {pages.length > 0 && (\n <button onClick={handleExport} className=\"export-btn\">\n Export Template\n </button>\n )}\n </div>\n </div>\n\n {pages.length > 0 && (\n <SignerRoleSelector\n roles={signerRoles}\n activeRole={activeRole}\n onSetActiveRole={setActiveRole}\n onAddRole={handleAddRole}\n onRemoveRole={handleRemoveRole}\n />\n )}\n\n <div className=\"designer-content\">\n <div className=\"designer-pdf-area\">\n {loading && <div className=\"loading-indicator\">Loading PDF...</div>}\n {!pages.length && !loading && (\n <div className=\"empty-state\">\n <h2>Upload a PDF to get started</h2>\n <p>Upload a template PDF, then click on the page to place form fields.</p>\n <label className=\"upload-btn upload-btn-large\">\n Choose PDF File\n <input type=\"file\" accept=\".pdf\" onChange={handleFileUpload} hidden />\n </label>\n </div>\n )}\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={setSelectedFieldId}\n onFieldMove={handleFieldMove}\n onFieldResize={handleFieldResize}\n onPageClick={handlePageClick}\n mode=\"designer\"\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"designer-panel\">\n {selectedField ? (\n <>\n <FieldPropertyPanel\n field={selectedField}\n signerRoles={signerRoles}\n onUpdate={handleFieldUpdate}\n onDelete={handleFieldDelete}\n />\n {/* Pre-fill area for Sender fields */}\n {selectedField.assignee === activeRole && (\n <div className=\"prefill-section\">\n <h4>Pre-fill Value</h4>\n {(selectedField.type === 'signature' || selectedField.type === 'initials') ? (\n <SignatureCanvas\n width={300}\n height={selectedField.type === 'initials' ? 100 : 150}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, { value: dataUrl })}\n initialValue={selectedField.value}\n />\n ) : selectedField.type === 'checkbox' ? (\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.checked ? 'true' : '' })}\n />\n Checked\n </label>\n ) : (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, { value: e.target.value })}\n placeholder={`Pre-fill ${selectedField.label}`}\n className=\"prefill-input\"\n />\n )}\n </div>\n )}\n </>\n ) : (\n <div className=\"panel-empty\">\n {pages.length > 0\n ? 'Click on the PDF to place a field, or select an existing field to edit its properties.'\n : 'Upload a PDF to begin designing your template.'}\n </div>\n )}\n\n {fields.length > 0 && (\n <div className=\"field-list\">\n <h4>All Fields ({fields.length})</h4>\n {fields.map((f, i) => (\n <div\n key={f.id}\n className={`field-list-item ${f.id === selectedFieldId ? 'active' : ''}`}\n onClick={() => setSelectedFieldId(f.id)}\n >\n <span\n className=\"field-list-dot\"\n style={{ backgroundColor: getSignerColor(f.assignee) }}\n />\n <span className=\"field-list-name\">{f.label}</span>\n <span className=\"field-list-page\">p{f.page + 1}</span>\n {f.required && <span className=\"field-list-required\">*</span>}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n );\n}\n","function generateId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport type FieldType = 'text' | 'signature' | 'signed-date' | 'checkbox' | 'initials';\n\nexport type TextSubtype = 'freeform' | 'number' | 'date' | 'email' | 'phone';\n\nexport interface FormField {\n id: string;\n type: FieldType;\n textSubtype?: TextSubtype;\n label: string;\n placeholder: string;\n required: boolean;\n assignee: string; // signer role e.g. \"Sender\", \"Signer 1\"\n page: number; // 0-indexed page number\n x: number; // percentage of page width (0-100)\n y: number; // percentage of page height (0-100)\n width: number; // percentage of page width\n height: number; // percentage of page height\n fontSize: number; // in points\n value: string; // pre-filled value or current value\n}\n\nexport interface Template {\n fields: FormField[];\n signerRoles: string[];\n pdfUrl: string;\n}\n\nexport const DEFAULT_SIGNER_ROLES = ['Sender', 'Signer 1'];\n\nexport const SIGNER_ROLE_COLORS: Record<string, string> = {\n 'Sender': '#6366f1',\n 'Signer 1': '#22c55e',\n 'Signer 2': '#f59e0b',\n 'Signer 3': '#ef4444',\n 'Signer 4': '#06b6d4',\n 'Signer 5': '#d946ef',\n};\n\nexport function getSignerColor(role: string): string {\n return SIGNER_ROLE_COLORS[role] || '#888888';\n}\n\nexport const FIELD_DEFAULTS: Record<FieldType, Partial<FormField>> = {\n text: {\n width: 20,\n height: 3,\n fontSize: 12,\n placeholder: 'Enter text',\n textSubtype: 'freeform',\n },\n signature: {\n width: 20,\n height: 6,\n fontSize: 12,\n placeholder: 'Sign here',\n },\n 'signed-date': {\n width: 15,\n height: 3,\n fontSize: 12,\n placeholder: 'Date',\n },\n checkbox: {\n width: 2.5,\n height: 2.5,\n fontSize: 12,\n placeholder: '',\n },\n initials: {\n width: 8,\n height: 5,\n fontSize: 12,\n placeholder: 'Initials',\n },\n};\n\nexport function createField(\n type: FieldType,\n assignee: string,\n page: number,\n x: number,\n y: number,\n): FormField {\n const defaults = FIELD_DEFAULTS[type];\n return {\n id: generateId(),\n type,\n label: type === 'text' ? 'Text Field' : type === 'signature' ? 'Signature' : type === 'signed-date' ? 'Signed Date' : type === 'checkbox' ? 'Checkbox' : 'Initials',\n placeholder: defaults.placeholder || '',\n required: true,\n assignee,\n page,\n x,\n y,\n width: defaults.width || 20,\n height: defaults.height || 3,\n fontSize: defaults.fontSize || 12,\n value: '',\n ...(type === 'text' ? { textSubtype: defaults.textSubtype as TextSubtype } : {}),\n };\n}\n","import * as pdfjsLib from 'pdfjs-dist';\n\n// Configure the worker\nif (typeof window !== 'undefined') {\n pdfjsLib.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.mjs`;\n}\n\nexport interface RenderedPage {\n pageNumber: number;\n dataUrl: string;\n width: number;\n height: number;\n}\n\nexport async function renderPdfPages(\n source: string | ArrayBuffer,\n scale: number = 2,\n): Promise<RenderedPage[]> {\n const loadingTask = pdfjsLib.getDocument(\n typeof source === 'string' ? { url: source } : { data: source }\n );\n const pdf = await loadingTask.promise;\n const pages: RenderedPage[] = [];\n\n for (let i = 1; i <= pdf.numPages; i++) {\n const page = await pdf.getPage(i);\n const viewport = page.getViewport({ scale });\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d')!;\n\n await page.render({ canvasContext: ctx, viewport }).promise;\n\n pages.push({\n pageNumber: i,\n dataUrl: canvas.toDataURL('image/png'),\n width: viewport.width,\n height: viewport.height,\n });\n }\n\n return pages;\n}\n","'use client';\n\nimport { useRef, useCallback } from 'react';\nimport type { FormField } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface PdfViewerProps {\n pages: RenderedPage[];\n fields: FormField[];\n selectedFieldId: string | null;\n onSelectField: (id: string | null) => void;\n onFieldMove?: (id: string, page: number, x: number, y: number) => void;\n onFieldResize?: (id: string, width: number, height: number) => void;\n onPageClick?: (page: number, x: number, y: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderFieldContent?: (field: FormField) => React.ReactNode;\n}\n\nexport function PdfViewer({\n pages,\n fields,\n selectedFieldId,\n onSelectField,\n onFieldMove,\n onFieldResize,\n onPageClick,\n mode,\n currentSigner,\n renderFieldContent,\n}: PdfViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handlePageClick = useCallback((e: React.MouseEvent<HTMLDivElement>, pageIndex: number) => {\n const target = e.target as HTMLElement;\n if (target.closest('.field-overlay')) return;\n\n if (onPageClick) {\n const rect = e.currentTarget.getBoundingClientRect();\n const x = ((e.clientX - rect.left) / rect.width) * 100;\n const y = ((e.clientY - rect.top) / rect.height) * 100;\n onPageClick(pageIndex, x, y);\n } else {\n onSelectField(null);\n }\n }, [onPageClick, onSelectField]);\n\n return (\n <div className=\"pdf-viewer\" ref={containerRef}>\n {pages.map((page, pageIndex) => {\n const pageFields = fields.filter(f => f.page === pageIndex);\n return (\n <div\n key={pageIndex}\n className=\"pdf-page\"\n style={{ aspectRatio: `${page.width} / ${page.height}` }}\n onClick={(e) => handlePageClick(e, pageIndex)}\n data-page={pageIndex}\n >\n <img\n src={page.dataUrl}\n alt={`Page ${pageIndex + 1}`}\n className=\"pdf-page-image\"\n draggable={false}\n />\n {pageFields.map(field => (\n <FieldOverlayItem\n key={field.id}\n field={field}\n isSelected={field.id === selectedFieldId}\n onSelect={() => onSelectField(field.id)}\n onMove={onFieldMove}\n onResize={onFieldResize}\n mode={mode}\n currentSigner={currentSigner}\n renderContent={renderFieldContent}\n />\n ))}\n </div>\n );\n })}\n </div>\n );\n}\n\ninterface FieldOverlayItemProps {\n field: FormField;\n isSelected: boolean;\n onSelect: () => void;\n onMove?: (id: string, page: number, x: number, y: number) => void;\n onResize?: (id: string, width: number, height: number) => void;\n mode: 'designer' | 'signer';\n currentSigner?: string;\n renderContent?: (field: FormField) => React.ReactNode;\n}\n\nfunction FieldOverlayItem({\n field,\n isSelected,\n onSelect,\n onMove,\n onResize,\n mode,\n currentSigner,\n renderContent,\n}: FieldOverlayItemProps) {\n const overlayRef = useRef<HTMLDivElement>(null);\n const dragStartRef = useRef<{ startX: number; startY: number; fieldX: number; fieldY: number } | null>(null);\n const resizeStartRef = useRef<{ startX: number; startY: number; fieldW: number; fieldH: number } | null>(null);\n\n const color = getSignerColor(field.assignee);\n const isEditable = mode === 'designer' || (mode === 'signer' && field.assignee === currentSigner);\n const isPreFilled = !isEditable && !!field.value;\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onMove) return;\n e.preventDefault();\n e.stopPropagation();\n onSelect();\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldX: field.x,\n fieldY: field.y,\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!dragStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dx = ((e.clientX - dragStartRef.current.startX) / rect.width) * 100;\n const dy = ((e.clientY - dragStartRef.current.startY) / rect.height) * 100;\n const newX = Math.max(0, Math.min(100 - field.width, dragStartRef.current.fieldX + dx));\n const newY = Math.max(0, Math.min(100 - field.height, dragStartRef.current.fieldY + dy));\n onMove(field.id, field.page, newX, newY);\n };\n\n const handleMouseUp = () => {\n dragStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onMove, onSelect]);\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n if (mode !== 'designer' || !onResize) return;\n e.preventDefault();\n e.stopPropagation();\n\n const pageEl = overlayRef.current?.closest('.pdf-page') as HTMLElement;\n if (!pageEl) return;\n\n resizeStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n fieldW: field.width,\n fieldH: field.height,\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!resizeStartRef.current) return;\n const rect = pageEl.getBoundingClientRect();\n const dw = ((e.clientX - resizeStartRef.current.startX) / rect.width) * 100;\n const dh = ((e.clientY - resizeStartRef.current.startY) / rect.height) * 100;\n const newW = Math.max(2, Math.min(100 - field.x, resizeStartRef.current.fieldW + dw));\n const newH = Math.max(1.5, Math.min(100 - field.y, resizeStartRef.current.fieldH + dh));\n onResize(field.id, newW, newH);\n };\n\n const handleMouseUp = () => {\n resizeStartRef.current = null;\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }, [field, mode, onResize]);\n\n return (\n <div\n ref={overlayRef}\n className={`field-overlay ${isSelected ? 'selected' : ''} ${isEditable ? 'editable' : 'readonly'} ${isPreFilled ? 'prefilled' : ''}`}\n style={{\n left: `${field.x}%`,\n top: `${field.y}%`,\n width: `${field.width}%`,\n height: `${field.height}%`,\n borderColor: color,\n backgroundColor: isSelected ? `${color}22` : `${color}11`,\n cursor: mode === 'designer' ? 'move' : 'default',\n }}\n onClick={(e) => { e.stopPropagation(); onSelect(); }}\n onMouseDown={handleMouseDown}\n >\n {mode === 'designer' && (\n <div className=\"field-overlay-label\" style={{ backgroundColor: color }}>\n {field.label}\n </div>\n )}\n\n {renderContent ? renderContent(field) : (\n <div className=\"field-overlay-placeholder\">\n {field.value || field.placeholder}\n </div>\n )}\n\n {mode === 'designer' && isSelected && (\n <div\n className=\"field-resize-handle\"\n onMouseDown={handleResizeMouseDown}\n />\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { FormField, FieldType, TextSubtype } from '@/types/pdf-builder';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface FieldPropertyPanelProps {\n field: FormField;\n signerRoles: string[];\n onUpdate: (id: string, updates: Partial<FormField>) => void;\n onDelete: (id: string) => void;\n}\n\nexport function FieldPropertyPanel({ field, signerRoles, onUpdate, onDelete }: FieldPropertyPanelProps) {\n const color = getSignerColor(field.assignee);\n\n return (\n <div className=\"field-property-panel\">\n <div className=\"panel-header\">\n <h3 style={{ color }}>\n {field.label}\n </h3>\n <button onClick={() => onDelete(field.id)} className=\"panel-delete-btn\">\n Delete\n </button>\n </div>\n\n <div className=\"panel-field\">\n <label>Label</label>\n <input\n type=\"text\"\n value={field.label}\n onChange={e => onUpdate(field.id, { label: e.target.value })}\n />\n </div>\n\n <div className=\"panel-field\">\n <label>Field Type</label>\n <select\n value={field.type}\n onChange={e => onUpdate(field.id, { type: e.target.value as FieldType })}\n >\n <option value=\"text\">Text</option>\n <option value=\"signature\">Signature</option>\n <option value=\"signed-date\">Signed Date</option>\n <option value=\"checkbox\">Checkbox</option>\n <option value=\"initials\">Initials</option>\n </select>\n </div>\n\n {field.type === 'text' && (\n <div className=\"panel-field\">\n <label>Text Type</label>\n <select\n value={field.textSubtype || 'freeform'}\n onChange={e => onUpdate(field.id, { textSubtype: e.target.value as TextSubtype })}\n >\n <option value=\"freeform\">Freeform</option>\n <option value=\"number\">Number</option>\n <option value=\"date\">Date</option>\n <option value=\"email\">Email</option>\n <option value=\"phone\">Phone</option>\n </select>\n </div>\n )}\n\n <div className=\"panel-field\">\n <label>Assigned To</label>\n <select\n value={field.assignee}\n onChange={e => onUpdate(field.id, { assignee: e.target.value })}\n >\n {signerRoles.map(role => (\n <option key={role} value={role} style={{ color: getSignerColor(role) }}>\n {role}\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"panel-field\">\n <label>Placeholder</label>\n <input\n type=\"text\"\n value={field.placeholder}\n onChange={e => onUpdate(field.id, { placeholder: e.target.value })}\n />\n </div>\n\n <div className=\"panel-field\">\n <label className=\"panel-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={field.required}\n onChange={e => onUpdate(field.id, { required: e.target.checked })}\n />\n Required\n </label>\n </div>\n\n {field.type !== 'checkbox' && (\n <div className=\"panel-field\">\n <label>Font Size (pt)</label>\n <input\n type=\"number\"\n min=\"6\"\n max=\"72\"\n value={field.fontSize}\n onChange={e => onUpdate(field.id, { fontSize: Number(e.target.value) })}\n />\n </div>\n )}\n\n <div className=\"panel-field-group\">\n <div className=\"panel-field\">\n <label>Width (%)</label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"100\"\n step=\"0.5\"\n value={field.width}\n onChange={e => onUpdate(field.id, { width: Number(e.target.value) })}\n />\n </div>\n <div className=\"panel-field\">\n <label>Height (%)</label>\n <input\n type=\"number\"\n min=\"1\"\n max=\"100\"\n step=\"0.5\"\n value={field.height}\n onChange={e => onUpdate(field.id, { height: Number(e.target.value) })}\n />\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { getSignerColor } from '@/types/pdf-builder';\n\ninterface SignerRoleSelectorProps {\n roles: string[];\n activeRole: string;\n onSetActiveRole: (role: string) => void;\n onAddRole: (role: string) => void;\n onRemoveRole: (role: string) => void;\n}\n\nexport function SignerRoleSelector({\n roles,\n activeRole,\n onSetActiveRole,\n onAddRole,\n onRemoveRole,\n}: SignerRoleSelectorProps) {\n const [isAdding, setIsAdding] = useState(false);\n const [newRoleName, setNewRoleName] = useState('');\n\n const handleAdd = () => {\n if (newRoleName.trim()) {\n onAddRole(newRoleName.trim());\n setNewRoleName('');\n setIsAdding(false);\n }\n };\n\n return (\n <div className=\"signer-role-selector\">\n <div className=\"signer-role-label\">Signer Roles</div>\n <div className=\"signer-role-list\">\n {roles.map(role => (\n <button\n key={role}\n className={`signer-role-chip ${role === activeRole ? 'active' : ''}`}\n style={{\n borderColor: getSignerColor(role),\n backgroundColor: role === activeRole ? getSignerColor(role) : 'transparent',\n color: role === activeRole ? '#fff' : getSignerColor(role),\n }}\n onClick={() => onSetActiveRole(role)}\n >\n {role}\n {roles.length > 1 && role !== 'Sender' && (\n <span\n className=\"signer-role-remove\"\n onClick={(e) => { e.stopPropagation(); onRemoveRole(role); }}\n >\n &times;\n </span>\n )}\n </button>\n ))}\n {isAdding ? (\n <div className=\"signer-role-add-input\">\n <input\n type=\"text\"\n value={newRoleName}\n onChange={e => setNewRoleName(e.target.value)}\n onKeyDown={e => e.key === 'Enter' && handleAdd()}\n placeholder=\"Role name\"\n autoFocus\n />\n <button onClick={handleAdd}>Add</button>\n <button onClick={() => setIsAdding(false)}>Cancel</button>\n </div>\n ) : (\n <button\n className=\"signer-role-add-btn\"\n onClick={() => setIsAdding(true)}\n >\n + Add Role\n </button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\nimport { getStroke } from 'perfect-freehand';\n\ninterface SignatureCanvasProps {\n width?: number;\n height?: number;\n onSign: (dataUrl: string) => void;\n initialValue?: string;\n className?: string;\n}\n\nfunction getSvgPathFromStroke(stroke: number[][]) {\n if (!stroke.length) return '';\n\n const d = stroke.reduce(\n (acc, [x0, y0], i, arr) => {\n const [x1, y1] = arr[(i + 1) % arr.length];\n acc.push(x0, y0, (x0 + x1) / 2, (y0 + y1) / 2);\n return acc;\n },\n ['M', ...stroke[0], 'Q'],\n );\n\n d.push('Z');\n return d.join(' ');\n}\n\nexport function SignatureCanvas({\n width = 400,\n height = 150,\n onSign,\n initialValue,\n className,\n}: SignatureCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [paths, setPaths] = useState<number[][][]>([]);\n const [currentPath, setCurrentPath] = useState<number[][] | null>(null);\n const [isEmpty, setIsEmpty] = useState(!initialValue);\n\n // Draw initial value if provided\n useEffect(() => {\n if (initialValue && canvasRef.current) {\n const ctx = canvasRef.current.getContext('2d')!;\n const img = new Image();\n img.onload = () => {\n ctx.clearRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0, width, height);\n };\n img.src = initialValue;\n }\n }, [initialValue, width, height]);\n\n // Redraw all paths whenever they change\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n\n const allPaths = currentPath ? [...paths, currentPath] : paths;\n\n for (const path of allPaths) {\n const stroke = getStroke(path, {\n size: 3,\n thinning: 0.5,\n smoothing: 0.5,\n streamline: 0.5,\n });\n const pathStr = getSvgPathFromStroke(stroke);\n const path2d = new Path2D(pathStr);\n ctx.fillStyle = '#000';\n ctx.fill(path2d);\n }\n }, [paths, currentPath, width, height]);\n\n const getPoint = useCallback((e: React.PointerEvent) => {\n const rect = canvasRef.current!.getBoundingClientRect();\n return [\n e.clientX - rect.left,\n e.clientY - rect.top,\n e.pressure,\n ];\n }, []);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n setCurrentPath([getPoint(e)]);\n }, [getPoint]);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n if (!currentPath) return;\n e.preventDefault();\n setCurrentPath([...currentPath, getPoint(e)]);\n }, [currentPath, getPoint]);\n\n const handlePointerUp = useCallback(() => {\n if (!currentPath) return;\n setPaths(prev => [...prev, currentPath]);\n setCurrentPath(null);\n setIsEmpty(false);\n\n // Export after state updates\n requestAnimationFrame(() => {\n if (canvasRef.current) {\n onSign(canvasRef.current.toDataURL('image/png'));\n }\n });\n }, [currentPath, onSign]);\n\n const handleClear = useCallback(() => {\n setPaths([]);\n setCurrentPath(null);\n setIsEmpty(true);\n const canvas = canvasRef.current;\n if (canvas) {\n const ctx = canvas.getContext('2d')!;\n ctx.clearRect(0, 0, width, height);\n onSign('');\n }\n }, [width, height, onSign]);\n\n return (\n <div className={`signature-canvas-wrapper ${className || ''}`}>\n <canvas\n ref={canvasRef}\n width={width}\n height={height}\n className=\"signature-canvas\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n style={{ touchAction: 'none' }}\n />\n <div className=\"signature-canvas-actions\">\n {!isEmpty && (\n <button type=\"button\" onClick={handleClear} className=\"signature-clear-btn\">\n Clear\n </button>\n )}\n {isEmpty && <span className=\"signature-hint\">Draw your signature above</span>}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport type { FormField, Template } from '@/types/pdf-builder';\nimport type { RenderedPage } from '@/utils/pdfRenderer';\nimport { renderPdfPages } from '@/utils/pdfRenderer';\nimport { generateFilledPdf, downloadPdf, postPdfToCallback } from '@/utils/pdfFiller';\nimport { PdfViewer } from './PdfViewer';\nimport { FieldNavigator } from './FieldNavigator';\nimport { SignatureCanvas } from './SignatureCanvas';\nimport '@/styles/pdf-builder.css';\n\nexport interface SignerViewProps {\n /** If provided, use these instead of URL params / postMessage */\n initialPdfUrl?: string;\n initialTemplate?: Template;\n initialSigner?: string;\n callbackUrl?: string;\n onComplete?: (pdfBlob: Blob) => void;\n}\n\nexport function SignerView({\n initialPdfUrl,\n initialTemplate,\n initialSigner,\n callbackUrl: initialCallbackUrl,\n onComplete,\n}: SignerViewProps = {}) {\n const [pages, setPages] = useState<RenderedPage[]>([]);\n const [fields, setFields] = useState<FormField[]>([]);\n const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);\n const [signer, setSigner] = useState(initialSigner || 'Signer 1');\n const [loading, setLoading] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [pdfSource, setPdfSource] = useState<string | ArrayBuffer | null>(null);\n const [callbackUrl, setCallbackUrl] = useState(initialCallbackUrl || '');\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Load from props, URL params, or postMessage\n useEffect(() => {\n if (initialTemplate) {\n setFields(initialTemplate.fields);\n if (initialPdfUrl) loadPdf(initialPdfUrl);\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n const pdfUrl = params.get('pdf');\n const fieldsUrl = params.get('fields');\n const signerParam = params.get('signer');\n const cbUrl = params.get('callbackUrl');\n\n if (signerParam) setSigner(signerParam);\n if (cbUrl) setCallbackUrl(cbUrl);\n\n if (pdfUrl) loadPdf(pdfUrl);\n if (fieldsUrl) {\n fetch(fieldsUrl)\n .then(r => r.json())\n .then((template: Template) => setFields(template.fields))\n .catch(err => console.error('Failed to load fields:', err));\n }\n\n const handleMessage = (e: MessageEvent) => {\n if (e.data?.type === 'load-signing') {\n if (e.data.fields) setFields(e.data.fields);\n if (e.data.pdfUrl) loadPdf(e.data.pdfUrl);\n if (e.data.signer) setSigner(e.data.signer);\n if (e.data.callbackUrl) setCallbackUrl(e.data.callbackUrl);\n }\n };\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [initialTemplate, initialPdfUrl]);\n\n const loadPdf = useCallback(async (source: string | ArrayBuffer) => {\n setLoading(true);\n try {\n const rendered = await renderPdfPages(source);\n setPages(rendered);\n setPdfSource(source);\n } catch (err) {\n console.error('Failed to load PDF:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Fields this signer needs to fill\n const editableFields = fields.filter(f => f.assignee === signer);\n const selectedField = fields.find(f => f.id === selectedFieldId) || null;\n const isFieldEditable = selectedField ? selectedField.assignee === signer : false;\n\n const handleFieldUpdate = useCallback((id: string, value: string) => {\n setFields(prev => prev.map(f => f.id === id ? { ...f, value } : f));\n }, []);\n\n const handleNavigate = useCallback((fieldId: string) => {\n setSelectedFieldId(fieldId);\n // Scroll to that field's page\n const field = fields.find(f => f.id === fieldId);\n if (field && containerRef.current) {\n const pageEl = containerRef.current.querySelector(`[data-page=\"${field.page}\"]`);\n if (pageEl) {\n pageEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }\n }, [fields]);\n\n const allRequiredFilled = editableFields.every(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true; // checkbox is always \"filled\"\n return !!f.value;\n });\n\n const handleSubmit = useCallback(async () => {\n if (!pdfSource || !allRequiredFilled) return;\n setSubmitting(true);\n try {\n const pdfBytes = await generateFilledPdf(pdfSource, fields);\n const blob = new Blob([pdfBytes.slice().buffer], { type: 'application/pdf' });\n\n // Always allow download\n downloadPdf(pdfBytes, 'signed-document.pdf');\n\n // Post to callback if provided\n if (callbackUrl) {\n await postPdfToCallback(pdfBytes, callbackUrl, 'signed-document.pdf');\n }\n\n // Notify parent via callback prop\n if (onComplete) {\n onComplete(blob);\n }\n\n // Notify parent window via postMessage\n window.parent?.postMessage({ type: 'signing-complete' }, '*');\n } catch (err) {\n console.error('Failed to generate PDF:', err);\n } finally {\n setSubmitting(false);\n }\n }, [pdfSource, fields, callbackUrl, allRequiredFilled, onComplete]);\n\n const renderFieldContent = useCallback((field: FormField) => {\n const editable = field.assignee === signer;\n\n if (!editable) {\n // Show pre-filled content as read-only\n if (field.type === 'signature' || field.type === 'initials') {\n return field.value ? (\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n ) : (\n <div className=\"field-overlay-placeholder readonly\">{field.placeholder}</div>\n );\n }\n if (field.type === 'checkbox') {\n return (\n <div className=\"field-checkbox-display readonly\">\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder readonly\">\n {field.value || field.placeholder}\n </div>\n );\n }\n\n // Editable fields\n if (field.type === 'signature' || field.type === 'initials') {\n if (field.value) {\n return (\n <div className=\"field-signature-filled\" onClick={() => handleFieldUpdate(field.id, '')}>\n <img src={field.value} alt={field.label} className=\"field-signature-preview\" />\n </div>\n );\n }\n return (\n <div className=\"field-overlay-placeholder editable\">\n {field.placeholder}\n </div>\n );\n }\n\n if (field.type === 'checkbox') {\n return (\n <div\n className=\"field-checkbox-display editable\"\n onClick={(e) => {\n e.stopPropagation();\n handleFieldUpdate(field.id, field.value === 'true' ? '' : 'true');\n }}\n >\n {field.value === 'true' ? '\\u2713' : ''}\n </div>\n );\n }\n\n if (field.type === 'signed-date') {\n return (\n <div className=\"field-overlay-value\">\n {field.value || new Date().toLocaleDateString()}\n </div>\n );\n }\n\n // Text field\n return (\n <input\n type={field.textSubtype === 'email' ? 'email' :\n field.textSubtype === 'number' ? 'number' :\n field.textSubtype === 'phone' ? 'tel' :\n field.textSubtype === 'date' ? 'date' : 'text'}\n className=\"field-inline-input\"\n value={field.value}\n placeholder={field.placeholder}\n onChange={(e) => handleFieldUpdate(field.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n style={{ fontSize: `${field.fontSize * 0.6}px` }}\n />\n );\n }, [signer, handleFieldUpdate]);\n\n // Auto-fill signed-date fields when signature is filled\n useEffect(() => {\n const sigFields = fields.filter(f => f.assignee === signer && f.type === 'signature' && f.value);\n if (sigFields.length > 0) {\n const dateStr = new Date().toLocaleDateString();\n setFields(prev => prev.map(f => {\n if (f.assignee === signer && f.type === 'signed-date' && !f.value) {\n return { ...f, value: dateStr };\n }\n return f;\n }));\n }\n }, [fields.filter(f => f.type === 'signature' && f.value).length]);\n\n return (\n <div className=\"signer-layout\" ref={containerRef}>\n {loading && <div className=\"loading-indicator\">Loading document...</div>}\n\n <div className=\"signer-content\">\n <div className=\"signer-pdf-area\">\n {pages.length > 0 && (\n <PdfViewer\n pages={pages}\n fields={fields}\n selectedFieldId={selectedFieldId}\n onSelectField={setSelectedFieldId}\n mode=\"signer\"\n currentSigner={signer}\n renderFieldContent={renderFieldContent}\n />\n )}\n </div>\n\n <div className=\"signer-panel\">\n {selectedField && isFieldEditable && (\n <div className=\"signer-field-input\">\n <h3>{selectedField.label}</h3>\n {selectedField.required && <span className=\"required-badge\">Required</span>}\n\n {(selectedField.type === 'signature' || selectedField.type === 'initials') && (\n <SignatureCanvas\n width={280}\n height={selectedField.type === 'initials' ? 80 : 120}\n onSign={(dataUrl) => handleFieldUpdate(selectedField.id, dataUrl)}\n initialValue={selectedField.value}\n />\n )}\n\n {selectedField.type === 'text' && (\n <input\n type={selectedField.textSubtype === 'email' ? 'email' :\n selectedField.textSubtype === 'number' ? 'number' :\n selectedField.textSubtype === 'phone' ? 'tel' :\n selectedField.textSubtype === 'date' ? 'date' : 'text'}\n value={selectedField.value}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.value)}\n placeholder={selectedField.placeholder}\n className=\"signer-text-input\"\n />\n )}\n\n {selectedField.type === 'checkbox' && (\n <label className=\"signer-checkbox-label\">\n <input\n type=\"checkbox\"\n checked={selectedField.value === 'true'}\n onChange={e => handleFieldUpdate(selectedField.id, e.target.checked ? 'true' : '')}\n />\n {selectedField.placeholder || 'Check this box'}\n </label>\n )}\n\n {selectedField.type === 'signed-date' && (\n <div className=\"signer-date-display\">\n {selectedField.value || 'Will auto-fill when you sign'}\n </div>\n )}\n </div>\n )}\n\n {selectedField && !isFieldEditable && (\n <div className=\"signer-field-readonly\">\n <h3>{selectedField.label}</h3>\n <p>This field belongs to another signer.</p>\n </div>\n )}\n\n {!selectedField && editableFields.length > 0 && (\n <div className=\"panel-empty\">\n Select a field to fill it in, or use the navigation below.\n </div>\n )}\n\n <FieldNavigator\n fields={editableFields}\n currentFieldId={selectedFieldId}\n onNavigate={handleNavigate}\n allRequiredFilled={allRequiredFilled}\n onSubmit={handleSubmit}\n />\n\n {submitting && <div className=\"loading-indicator\">Generating PDF...</div>}\n </div>\n </div>\n\n <div className=\"powered-by\">Powered by <a href=\"https://exeq.org\" target=\"_blank\" rel=\"noopener noreferrer\">Exeq.org</a></div>\n </div>\n );\n}\n","import { PDFDocument, rgb, StandardFonts } from 'pdf-lib';\nimport type { FormField } from '@/types/pdf-builder';\n\nexport async function generateFilledPdf(\n pdfSource: string | ArrayBuffer,\n fields: FormField[],\n): Promise<Uint8Array> {\n let pdfBytes: ArrayBuffer;\n if (typeof pdfSource === 'string') {\n const res = await fetch(pdfSource);\n pdfBytes = await res.arrayBuffer();\n } else {\n pdfBytes = pdfSource;\n }\n\n const pdfDoc = await PDFDocument.load(pdfBytes);\n const font = await pdfDoc.embedFont(StandardFonts.Helvetica);\n const pages = pdfDoc.getPages();\n\n for (const field of fields) {\n if (!field.value) continue;\n const page = pages[field.page];\n if (!page) continue;\n\n const pageWidth = page.getWidth();\n const pageHeight = page.getHeight();\n\n // Convert percentage coordinates to PDF points\n const x = (field.x / 100) * pageWidth;\n const y = pageHeight - ((field.y / 100) * pageHeight) - ((field.height / 100) * pageHeight);\n const w = (field.width / 100) * pageWidth;\n const h = (field.height / 100) * pageHeight;\n\n if (field.type === 'checkbox') {\n if (field.value === 'true') {\n // Draw an X checkmark (WinAnsi-safe, no unicode)\n const inset = Math.min(w, h) * 0.2;\n const lineWidth = Math.min(w, h) * 0.08;\n page.drawLine({\n start: { x: x + inset, y: y + inset },\n end: { x: x + w - inset, y: y + h - inset },\n thickness: lineWidth,\n color: rgb(0, 0, 0),\n });\n page.drawLine({\n start: { x: x + w - inset, y: y + inset },\n end: { x: x + inset, y: y + h - inset },\n thickness: lineWidth,\n color: rgb(0, 0, 0),\n });\n }\n } else if (field.type === 'signature' || field.type === 'initials') {\n // Value is a data URL from the canvas\n if (field.value.startsWith('data:image/png')) {\n const pngBytes = Uint8Array.from(\n atob(field.value.split(',')[1]),\n c => c.charCodeAt(0),\n );\n const pngImage = await pdfDoc.embedPng(pngBytes);\n page.drawImage(pngImage, {\n x,\n y,\n width: w,\n height: h,\n });\n }\n } else {\n // Text fields (including signed-date)\n const fontSize = Math.min(field.fontSize, h * 0.7);\n page.drawText(field.value, {\n x: x + 2,\n y: y + h * 0.3,\n size: fontSize,\n font,\n color: rgb(0, 0, 0),\n maxWidth: w - 4,\n });\n }\n }\n\n return pdfDoc.save();\n}\n\nexport function downloadPdf(bytes: Uint8Array, filename: string) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport async function postPdfToCallback(\n bytes: Uint8Array,\n callbackUrl: string,\n filename: string,\n) {\n const blob = new Blob([bytes.slice().buffer], { type: 'application/pdf' });\n const formData = new FormData();\n formData.append('file', blob, filename);\n\n await fetch(callbackUrl, {\n method: 'POST',\n body: formData,\n });\n}\n","'use client';\n\nimport type { FormField } from '@/types/pdf-builder';\n\ninterface FieldNavigatorProps {\n fields: FormField[];\n currentFieldId: string | null;\n onNavigate: (fieldId: string) => void;\n allRequiredFilled: boolean;\n onSubmit: () => void;\n}\n\nexport function FieldNavigator({\n fields,\n currentFieldId,\n onNavigate,\n allRequiredFilled,\n onSubmit,\n}: FieldNavigatorProps) {\n const currentIndex = fields.findIndex(f => f.id === currentFieldId);\n const hasPrev = currentIndex > 0;\n const hasNext = currentIndex < fields.length - 1;\n\n const handlePrev = () => {\n if (hasPrev) {\n onNavigate(fields[currentIndex - 1].id);\n }\n };\n\n const handleNext = () => {\n if (hasNext) {\n onNavigate(fields[currentIndex + 1].id);\n }\n };\n\n const filledCount = fields.filter(f => {\n if (!f.required) return true;\n if (f.type === 'checkbox') return true;\n return !!f.value;\n }).length;\n\n return (\n <div className=\"field-navigator\">\n <div className=\"field-navigator-progress\">\n {filledCount} of {fields.length} fields completed\n </div>\n <div className=\"field-navigator-controls\">\n <button\n onClick={handlePrev}\n disabled={!hasPrev}\n className=\"nav-btn\"\n >\n Prev\n </button>\n <span className=\"field-navigator-position\">\n {currentIndex >= 0 ? `${currentIndex + 1} / ${fields.length}` : '-'}\n </span>\n <button\n onClick={handleNext}\n disabled={!hasNext}\n className=\"nav-btn\"\n >\n Next\n </button>\n </div>\n <button\n onClick={onSubmit}\n disabled={!allRequiredFilled}\n className=\"submit-btn\"\n >\n Complete & Download\n </button>\n </div>\n );\n}\n"],"mappings":";AAEA,SAAS,YAAAA,WAAU,eAAAC,cAAa,aAAAC,kBAAiB;;;ACFjD,SAAS,aAAqB;AAC5B,MAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAAY;AAC5E,WAAO,OAAO,WAAW;AAAA,EAC3B;AACA,SAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,UAAM,IAAK,KAAK,OAAO,IAAI,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;AA6BO,IAAM,uBAAuB,CAAC,UAAU,UAAU;AAElD,IAAM,qBAA6C;AAAA,EACxD,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd;AAEO,SAAS,eAAe,MAAsB;AACnD,SAAO,mBAAmB,IAAI,KAAK;AACrC;AAEO,IAAM,iBAAwD;AAAA,EACnE,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,aAAa;AAAA,EACf;AACF;AAEO,SAAS,YACd,MACA,UACA,MACA,GACA,GACW;AACX,QAAM,WAAW,eAAe,IAAI;AACpC,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf;AAAA,IACA,OAAO,SAAS,SAAS,eAAe,SAAS,cAAc,cAAc,SAAS,gBAAgB,gBAAgB,SAAS,aAAa,aAAa;AAAA,IACzJ,aAAa,SAAS,eAAe;AAAA,IACrC,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,SAAS,SAAS;AAAA,IACzB,QAAQ,SAAS,UAAU;AAAA,IAC3B,UAAU,SAAS,YAAY;AAAA,IAC/B,OAAO;AAAA,IACP,GAAI,SAAS,SAAS,EAAE,aAAa,SAAS,YAA2B,IAAI,CAAC;AAAA,EAChF;AACF;;;AC/GA,YAAY,cAAc;AAG1B,IAAI,OAAO,WAAW,aAAa;AACjC,EAAS,6BAAoB,YAAY,iDAA0D,gBAAO;AAC5G;AASA,eAAsB,eACpB,QACA,QAAgB,GACS;AACzB,QAAM,cAAuB;AAAA,IAC3B,OAAO,WAAW,WAAW,EAAE,KAAK,OAAO,IAAI,EAAE,MAAM,OAAO;AAAA,EAChE;AACA,QAAM,MAAM,MAAM,YAAY;AAC9B,QAAM,QAAwB,CAAC;AAE/B,WAAS,IAAI,GAAG,KAAK,IAAI,UAAU,KAAK;AACtC,UAAM,OAAO,MAAM,IAAI,QAAQ,CAAC;AAChC,UAAM,WAAW,KAAK,YAAY,EAAE,MAAM,CAAC;AAC3C,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ,SAAS;AACxB,WAAO,SAAS,SAAS;AACzB,UAAM,MAAM,OAAO,WAAW,IAAI;AAElC,UAAM,KAAK,OAAO,EAAE,eAAe,KAAK,SAAS,CAAC,EAAE;AAEpD,UAAM,KAAK;AAAA,MACT,YAAY;AAAA,MACZ,SAAS,OAAO,UAAU,WAAW;AAAA,MACrC,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACzCA,SAAS,QAAQ,mBAAmB;AAmD1B,SAOE,KAPF;AAjCH,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,eAAe,OAAuB,IAAI;AAEhD,QAAM,kBAAkB,YAAY,CAAC,GAAqC,cAAsB;AAC9F,UAAM,SAAS,EAAE;AACjB,QAAI,OAAO,QAAQ,gBAAgB,EAAG;AAEtC,QAAI,aAAa;AACf,YAAM,OAAO,EAAE,cAAc,sBAAsB;AACnD,YAAM,KAAM,EAAE,UAAU,KAAK,QAAQ,KAAK,QAAS;AACnD,YAAM,KAAM,EAAE,UAAU,KAAK,OAAO,KAAK,SAAU;AACnD,kBAAY,WAAW,GAAG,CAAC;AAAA,IAC7B,OAAO;AACL,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,aAAa,CAAC;AAE/B,SACE,oBAAC,SAAI,WAAU,cAAa,KAAK,cAC9B,gBAAM,IAAI,CAAC,MAAM,cAAc;AAC9B,UAAM,aAAa,OAAO,OAAO,OAAK,EAAE,SAAS,SAAS;AAC1D,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,OAAO,EAAE,aAAa,GAAG,KAAK,KAAK,MAAM,KAAK,MAAM,GAAG;AAAA,QACvD,SAAS,CAAC,MAAM,gBAAgB,GAAG,SAAS;AAAA,QAC5C,aAAW;AAAA,QAEX;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,KAAK;AAAA,cACV,KAAK,QAAQ,YAAY,CAAC;AAAA,cAC1B,WAAU;AAAA,cACV,WAAW;AAAA;AAAA,UACb;AAAA,UACC,WAAW,IAAI,WACd;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,YAAY,MAAM,OAAO;AAAA,cACzB,UAAU,MAAM,cAAc,MAAM,EAAE;AAAA,cACtC,QAAQ;AAAA,cACR,UAAU;AAAA,cACV;AAAA,cACA;AAAA,cACA,eAAe;AAAA;AAAA,YARV,MAAM;AAAA,UASb,CACD;AAAA;AAAA;AAAA,MAxBI;AAAA,IAyBP;AAAA,EAEJ,CAAC,GACH;AAEJ;AAaA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,eAAe,OAAkF,IAAI;AAC3G,QAAM,iBAAiB,OAAkF,IAAI;AAE7G,QAAM,QAAQ,eAAe,MAAM,QAAQ;AAC3C,QAAM,aAAa,SAAS,cAAe,SAAS,YAAY,MAAM,aAAa;AACnF,QAAM,cAAc,CAAC,cAAc,CAAC,CAAC,MAAM;AAE3C,QAAM,kBAAkB,YAAY,CAAC,MAAwB;AAC3D,QAAI,SAAS,cAAc,CAAC,OAAQ;AACpC,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,aAAS;AAET,UAAM,SAAS,WAAW,SAAS,QAAQ,WAAW;AACtD,QAAI,CAAC,OAAQ;AAEb,iBAAa,UAAU;AAAA,MACrB,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM;AAAA,IAChB;AAEA,UAAM,kBAAkB,CAACC,OAAkB;AACzC,UAAI,CAAC,aAAa,QAAS;AAC3B,YAAM,OAAO,OAAO,sBAAsB;AAC1C,YAAM,MAAOA,GAAE,UAAU,aAAa,QAAQ,UAAU,KAAK,QAAS;AACtE,YAAM,MAAOA,GAAE,UAAU,aAAa,QAAQ,UAAU,KAAK,SAAU;AACvE,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,OAAO,aAAa,QAAQ,SAAS,EAAE,CAAC;AACtF,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,QAAQ,aAAa,QAAQ,SAAS,EAAE,CAAC;AACvF,aAAO,MAAM,IAAI,MAAM,MAAM,MAAM,IAAI;AAAA,IACzC;AAEA,UAAM,gBAAgB,MAAM;AAC1B,mBAAa,UAAU;AACvB,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAEA,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,WAAW,aAAa;AAAA,EAClD,GAAG,CAAC,OAAO,MAAM,QAAQ,QAAQ,CAAC;AAElC,QAAM,wBAAwB,YAAY,CAAC,MAAwB;AACjE,QAAI,SAAS,cAAc,CAAC,SAAU;AACtC,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAElB,UAAM,SAAS,WAAW,SAAS,QAAQ,WAAW;AACtD,QAAI,CAAC,OAAQ;AAEb,mBAAe,UAAU;AAAA,MACvB,QAAQ,EAAE;AAAA,MACV,QAAQ,EAAE;AAAA,MACV,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM;AAAA,IAChB;AAEA,UAAM,kBAAkB,CAACA,OAAkB;AACzC,UAAI,CAAC,eAAe,QAAS;AAC7B,YAAM,OAAO,OAAO,sBAAsB;AAC1C,YAAM,MAAOA,GAAE,UAAU,eAAe,QAAQ,UAAU,KAAK,QAAS;AACxE,YAAM,MAAOA,GAAE,UAAU,eAAe,QAAQ,UAAU,KAAK,SAAU;AACzE,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,MAAM,GAAG,eAAe,QAAQ,SAAS,EAAE,CAAC;AACpF,YAAM,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,GAAG,eAAe,QAAQ,SAAS,EAAE,CAAC;AACtF,eAAS,MAAM,IAAI,MAAM,IAAI;AAAA,IAC/B;AAEA,UAAM,gBAAgB,MAAM;AAC1B,qBAAe,UAAU;AACzB,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAEA,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,WAAW,aAAa;AAAA,EAClD,GAAG,CAAC,OAAO,MAAM,QAAQ,CAAC;AAE1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW,iBAAiB,aAAa,aAAa,EAAE,IAAI,aAAa,aAAa,UAAU,IAAI,cAAc,cAAc,EAAE;AAAA,MAClI,OAAO;AAAA,QACL,MAAM,GAAG,MAAM,CAAC;AAAA,QAChB,KAAK,GAAG,MAAM,CAAC;AAAA,QACf,OAAO,GAAG,MAAM,KAAK;AAAA,QACrB,QAAQ,GAAG,MAAM,MAAM;AAAA,QACvB,aAAa;AAAA,QACb,iBAAiB,aAAa,GAAG,KAAK,OAAO,GAAG,KAAK;AAAA,QACrD,QAAQ,SAAS,aAAa,SAAS;AAAA,MACzC;AAAA,MACA,SAAS,CAAC,MAAM;AAAE,UAAE,gBAAgB;AAAG,iBAAS;AAAA,MAAG;AAAA,MACnD,aAAa;AAAA,MAEZ;AAAA,iBAAS,cACR,oBAAC,SAAI,WAAU,uBAAsB,OAAO,EAAE,iBAAiB,MAAM,GAClE,gBAAM,OACT;AAAA,QAGD,gBAAgB,cAAc,KAAK,IAClC,oBAAC,SAAI,WAAU,6BACZ,gBAAM,SAAS,MAAM,aACxB;AAAA,QAGD,SAAS,cAAc,cACtB;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,aAAa;AAAA;AAAA,QACf;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AC7MM,SACE,OAAAC,MADF,QAAAC,aAAA;AALC,SAAS,mBAAmB,EAAE,OAAO,aAAa,UAAU,SAAS,GAA4B;AACtG,QAAM,QAAQ,eAAe,MAAM,QAAQ;AAE3C,SACE,gBAAAA,MAAC,SAAI,WAAU,wBACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,gBACb;AAAA,sBAAAD,KAAC,QAAG,OAAO,EAAE,MAAM,GAChB,gBAAM,OACT;AAAA,MACA,gBAAAA,KAAC,YAAO,SAAS,MAAM,SAAS,MAAM,EAAE,GAAG,WAAU,oBAAmB,oBAExE;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,mBAAK;AAAA,MACZ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC;AAAA;AAAA,MAC7D;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,wBAAU;AAAA,MACjB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,MAAmB,CAAC;AAAA,UAEvE;AAAA,4BAAAD,KAAC,YAAO,OAAM,QAAO,kBAAI;AAAA,YACzB,gBAAAA,KAAC,YAAO,OAAM,aAAY,uBAAS;AAAA,YACnC,gBAAAA,KAAC,YAAO,OAAM,eAAc,yBAAW;AAAA,YACvC,gBAAAA,KAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA,YACjC,gBAAAA,KAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA;AAAA;AAAA,MACnC;AAAA,OACF;AAAA,IAEC,MAAM,SAAS,UACd,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,uBAAS;AAAA,MAChB,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM,eAAe;AAAA,UAC5B,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,aAAa,EAAE,OAAO,MAAqB,CAAC;AAAA,UAEhF;AAAA,4BAAAD,KAAC,YAAO,OAAM,YAAW,sBAAQ;AAAA,YACjC,gBAAAA,KAAC,YAAO,OAAM,UAAS,oBAAM;AAAA,YAC7B,gBAAAA,KAAC,YAAO,OAAM,QAAO,kBAAI;AAAA,YACzB,gBAAAA,KAAC,YAAO,OAAM,SAAQ,mBAAK;AAAA,YAC3B,gBAAAA,KAAC,YAAO,OAAM,SAAQ,mBAAK;AAAA;AAAA;AAAA,MAC7B;AAAA,OACF;AAAA,IAGF,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,yBAAW;AAAA,MAClB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,UAAU,EAAE,OAAO,MAAM,CAAC;AAAA,UAE7D,sBAAY,IAAI,UACf,gBAAAA,KAAC,YAAkB,OAAO,MAAM,OAAO,EAAE,OAAO,eAAe,IAAI,EAAE,GAClE,kBADU,IAEb,CACD;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,yBAAW;AAAA,MAClB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,aAAa,EAAE,OAAO,MAAM,CAAC;AAAA;AAAA,MACnE;AAAA,OACF;AAAA,IAEA,gBAAAA,KAAC,SAAI,WAAU,eACb,0BAAAC,MAAC,WAAM,WAAU,wBACf;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM;AAAA,UACf,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,UAAU,EAAE,OAAO,QAAQ,CAAC;AAAA;AAAA,MAClE;AAAA,MAAE;AAAA,OAEJ,GACF;AAAA,IAEC,MAAM,SAAS,cACd,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,sBAAAD,KAAC,WAAM,4BAAc;AAAA,MACrB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAI;AAAA,UACJ,KAAI;AAAA,UACJ,OAAO,MAAM;AAAA,UACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,UAAU,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,MACxE;AAAA,OACF;AAAA,IAGF,gBAAAC,MAAC,SAAI,WAAU,qBACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,eACb;AAAA,wBAAAD,KAAC,WAAM,uBAAS;AAAA,QAChB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAI;AAAA,YACJ,KAAI;AAAA,YACJ,MAAK;AAAA,YACL,OAAO,MAAM;AAAA,YACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,QACrE;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,wBAAAD,KAAC,WAAM,wBAAU;AAAA,QACjB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAI;AAAA,YACJ,KAAI;AAAA,YACJ,MAAK;AAAA,YACL,OAAO,MAAM;AAAA,YACb,UAAU,OAAK,SAAS,MAAM,IAAI,EAAE,QAAQ,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA;AAAA,QACtE;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;;;ACxIA,SAAS,gBAAgB;AA+BnB,gBAAAE,MAGI,QAAAC,aAHJ;AApBC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AAEjD,QAAM,YAAY,MAAM;AACtB,QAAI,YAAY,KAAK,GAAG;AACtB,gBAAU,YAAY,KAAK,CAAC;AAC5B,qBAAe,EAAE;AACjB,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SACE,gBAAAA,MAAC,SAAI,WAAU,wBACb;AAAA,oBAAAD,KAAC,SAAI,WAAU,qBAAoB,0BAAY;AAAA,IAC/C,gBAAAC,MAAC,SAAI,WAAU,oBACZ;AAAA,YAAM,IAAI,UACT,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,oBAAoB,SAAS,aAAa,WAAW,EAAE;AAAA,UAClE,OAAO;AAAA,YACL,aAAa,eAAe,IAAI;AAAA,YAChC,iBAAiB,SAAS,aAAa,eAAe,IAAI,IAAI;AAAA,YAC9D,OAAO,SAAS,aAAa,SAAS,eAAe,IAAI;AAAA,UAC3D;AAAA,UACA,SAAS,MAAM,gBAAgB,IAAI;AAAA,UAElC;AAAA;AAAA,YACA,MAAM,SAAS,KAAK,SAAS,YAC5B,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM;AAAE,oBAAE,gBAAgB;AAAG,+BAAa,IAAI;AAAA,gBAAG;AAAA,gBAC5D;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,QAhBG;AAAA,MAkBP,CACD;AAAA,MACA,WACC,gBAAAC,MAAC,SAAI,WAAU,yBACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,OAAK,eAAe,EAAE,OAAO,KAAK;AAAA,YAC5C,WAAW,OAAK,EAAE,QAAQ,WAAW,UAAU;AAAA,YAC/C,aAAY;AAAA,YACZ,WAAS;AAAA;AAAA,QACX;AAAA,QACA,gBAAAA,KAAC,YAAO,SAAS,WAAW,iBAAG;AAAA,QAC/B,gBAAAA,KAAC,YAAO,SAAS,MAAM,YAAY,KAAK,GAAG,oBAAM;AAAA,SACnD,IAEA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,MAAM,YAAY,IAAI;AAAA,UAChC;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,KACF;AAEJ;;;AC/EA,SAAS,UAAAE,SAAQ,YAAAC,WAAU,eAAAC,cAAa,iBAAiB;AACzD,SAAS,iBAAiB;AA2HpB,gBAAAC,MAUA,QAAAC,aAVA;AAjHN,SAAS,qBAAqB,QAAoB;AAChD,MAAI,CAAC,OAAO,OAAQ,QAAO;AAE3B,QAAM,IAAI,OAAO;AAAA,IACf,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,GAAG,QAAQ;AACzB,YAAM,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM;AACzC,UAAI,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,CAAC;AAC7C,aAAO;AAAA,IACT;AAAA,IACA,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG;AAAA,EACzB;AAEA,IAAE,KAAK,GAAG;AACV,SAAO,EAAE,KAAK,GAAG;AACnB;AAEO,SAAS,gBAAgB;AAAA,EAC9B,QAAQ;AAAA,EACR,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,YAAYJ,QAA0B,IAAI;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAuB,CAAC,CAAC;AACnD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAA4B,IAAI;AACtE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,CAAC,YAAY;AAGpD,YAAU,MAAM;AACd,QAAI,gBAAgB,UAAU,SAAS;AACrC,YAAM,MAAM,UAAU,QAAQ,WAAW,IAAI;AAC7C,YAAM,MAAM,IAAI,MAAM;AACtB,UAAI,SAAS,MAAM;AACjB,YAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,YAAI,UAAU,KAAK,GAAG,GAAG,OAAO,MAAM;AAAA,MACxC;AACA,UAAI,MAAM;AAAA,IACZ;AAAA,EACF,GAAG,CAAC,cAAc,OAAO,MAAM,CAAC;AAGhC,YAAU,MAAM;AACd,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AACb,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AAEjC,UAAM,WAAW,cAAc,CAAC,GAAG,OAAO,WAAW,IAAI;AAEzD,eAAW,QAAQ,UAAU;AAC3B,YAAM,SAAS,UAAU,MAAM;AAAA,QAC7B,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW;AAAA,QACX,YAAY;AAAA,MACd,CAAC;AACD,YAAM,UAAU,qBAAqB,MAAM;AAC3C,YAAM,SAAS,IAAI,OAAO,OAAO;AACjC,UAAI,YAAY;AAChB,UAAI,KAAK,MAAM;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,OAAO,aAAa,OAAO,MAAM,CAAC;AAEtC,QAAM,WAAWC,aAAY,CAAC,MAA0B;AACtD,UAAM,OAAO,UAAU,QAAS,sBAAsB;AACtD,WAAO;AAAA,MACL,EAAE,UAAU,KAAK;AAAA,MACjB,EAAE,UAAU,KAAK;AAAA,MACjB,EAAE;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,CAAC,MAA0B;AAC/D,MAAE,eAAe;AACjB,IAAC,EAAE,OAAuB,kBAAkB,EAAE,SAAS;AACvD,mBAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AAAA,EAC9B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,oBAAoBA,aAAY,CAAC,MAA0B;AAC/D,QAAI,CAAC,YAAa;AAClB,MAAE,eAAe;AACjB,mBAAe,CAAC,GAAG,aAAa,SAAS,CAAC,CAAC,CAAC;AAAA,EAC9C,GAAG,CAAC,aAAa,QAAQ,CAAC;AAE1B,QAAM,kBAAkBA,aAAY,MAAM;AACxC,QAAI,CAAC,YAAa;AAClB,aAAS,UAAQ,CAAC,GAAG,MAAM,WAAW,CAAC;AACvC,mBAAe,IAAI;AACnB,eAAW,KAAK;AAGhB,0BAAsB,MAAM;AAC1B,UAAI,UAAU,SAAS;AACrB,eAAO,UAAU,QAAQ,UAAU,WAAW,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,cAAcA,aAAY,MAAM;AACpC,aAAS,CAAC,CAAC;AACX,mBAAe,IAAI;AACnB,eAAW,IAAI;AACf,UAAM,SAAS,UAAU;AACzB,QAAI,QAAQ;AACV,YAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,aAAO,EAAE;AAAA,IACX;AAAA,EACF,GAAG,CAAC,OAAO,QAAQ,MAAM,CAAC;AAE1B,SACE,gBAAAE,MAAC,SAAI,WAAW,4BAA4B,aAAa,EAAE,IACzD;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,WAAU;AAAA,QACV,eAAe;AAAA,QACf,eAAe;AAAA,QACf,aAAa;AAAA,QACb,OAAO,EAAE,aAAa,OAAO;AAAA;AAAA,IAC/B;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,4BACZ;AAAA,OAAC,WACA,gBAAAD,KAAC,YAAO,MAAK,UAAS,SAAS,aAAa,WAAU,uBAAsB,mBAE5E;AAAA,MAED,WAAW,gBAAAA,KAAC,UAAK,WAAU,kBAAiB,uCAAyB;AAAA,OACxE;AAAA,KACF;AAEJ;;;ANMe,SAqBH,UArBG,OAAAE,MAeH,QAAAC,aAfG;AAlIR,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,IAAuB,CAAC,GAAG;AACzB,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAyB,CAAC,CAAC;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAsB,iBAAiB,UAAU,CAAC,CAAC;AAC/E,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAwB,IAAI;AAC1E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAmB,iBAAiB,eAAe,CAAC,GAAG,oBAAoB,CAAC;AAClH,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,QAAQ;AACrD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAoB,MAAM;AACxE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAsC,IAAI;AAG5E,EAAAC,WAAU,MAAM;AACd,UAAM,SAAS,iBAAiB,iBAAiB;AACjD,QAAI,QAAQ;AACV,cAAQ,MAAM;AACd;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,UAAM,WAAW,OAAO,IAAI,KAAK;AACjC,QAAI,UAAU;AACZ,cAAQ,QAAQ;AAAA,IAClB;AAEA,UAAM,gBAAgB,CAAC,MAAoB;AACzC,UAAI,EAAE,MAAM,SAAS,cAAc,EAAE,KAAK,KAAK;AAC7C,gBAAQ,EAAE,KAAK,GAAG;AAAA,MACpB;AACA,UAAI,EAAE,MAAM,SAAS,iBAAiB;AACpC,YAAI,EAAE,KAAK,OAAQ,WAAU,EAAE,KAAK,MAAM;AAC1C,YAAI,EAAE,KAAK,YAAa,gBAAe,EAAE,KAAK,WAAW;AACzD,YAAI,EAAE,KAAK,OAAQ,SAAQ,EAAE,KAAK,MAAM;AAAA,MAC1C;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,eAAe,eAAe,CAAC;AAEnC,QAAM,UAAUC,aAAY,OAAO,WAAiC;AAClE,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,eAAe,MAAM;AAC5C,eAAS,QAAQ;AACjB,mBAAa,MAAM;AAAA,IACrB,SAAS,KAAK;AACZ,cAAQ,MAAM,uBAAuB,GAAG;AAAA,IAC1C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA,aAAY,CAAC,MAA2C;AAC/E,UAAM,OAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,MAAM;AACpB,UAAI,OAAO,OAAQ,SAAQ,OAAO,MAAqB;AAAA,IACzD;AACA,WAAO,kBAAkB,IAAI;AAAA,EAC/B,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,kBAAkBA,aAAY,CAAC,MAAc,GAAW,MAAc;AAC1E,UAAM,QAAQ,YAAY,iBAAiB,YAAY,MAAM,GAAG,CAAC;AACjE,cAAU,UAAQ,CAAC,GAAG,MAAM,KAAK,CAAC;AAClC,uBAAmB,MAAM,EAAE;AAAA,EAC7B,GAAG,CAAC,iBAAiB,UAAU,CAAC;AAEhC,QAAM,kBAAkBA,aAAY,CAAC,IAAY,MAAc,GAAW,MAAc;AACtF,cAAU,UAAQ,KAAK,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,CAAC;AAAA,EACzE,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,CAAC,IAAY,OAAe,WAAmB;AACnF,cAAU,UAAQ,KAAK,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,CAAC,CAAC;AAAA,EAC5E,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,CAAC,IAAY,YAAgC;AACjF,cAAU,UAAQ,KAAK,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC;AAAA,EACzE,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,CAAC,OAAe;AACpD,cAAU,UAAQ,KAAK,OAAO,OAAK,EAAE,OAAO,EAAE,CAAC;AAC/C,QAAI,oBAAoB,GAAI,oBAAmB,IAAI;AAAA,EACrD,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,gBAAgBA,aAAY,CAAC,SAAiB;AAClD,QAAI,CAAC,YAAY,SAAS,IAAI,GAAG;AAC/B,qBAAe,UAAQ,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,mBAAmBA,aAAY,CAAC,SAAiB;AACrD,mBAAe,UAAQ,KAAK,OAAO,OAAK,MAAM,IAAI,CAAC;AACnD,cAAU,UAAQ,KAAK,IAAI,OAAK,EAAE,aAAa,OAAO,EAAE,GAAG,GAAG,UAAU,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7F,QAAI,eAAe,KAAM,eAAc,YAAY,CAAC,CAAC;AAAA,EACvD,GAAG,CAAC,aAAa,UAAU,CAAC;AAE5B,QAAM,eAAeA,aAAY,MAAM;AACrC,UAAM,WAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,cAAc,WAAW,YAAY;AAAA,IACtD;AAEA,QAAI,QAAQ;AACV,aAAO,QAAQ;AAAA,IACjB,OAAO;AAEL,YAAM,OAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAC7C,YAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,OAAO;AACT,QAAE,WAAW;AACb,QAAE,MAAM;AACR,UAAI,gBAAgB,GAAG;AAAA,IACzB;AAGA,WAAO,QAAQ,YAAY,EAAE,MAAM,kBAAkB,SAAS,GAAG,GAAG;AAAA,EACtE,GAAG,CAAC,QAAQ,aAAa,WAAW,MAAM,CAAC;AAE3C,QAAM,gBAAgB,OAAO,KAAK,OAAK,EAAE,OAAO,eAAe,KAAK;AAEpE,QAAM,qBAAqBA,aAAY,CAAC,UAAqB;AAC3D,QAAI,MAAM,SAAS,eAAe,MAAM,SAAS,YAAY;AAC3D,UAAI,MAAM,OAAO;AACf,eAAO,gBAAAJ,KAAC,SAAI,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,WAAU,2BAA0B;AAAA,MACtF;AAAA,IACF;AACA,WACE,gBAAAA,KAAC,SAAI,WAAU,6BACZ,gBAAM,SAAS,MAAM,aACxB;AAAA,EAEJ,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAC,MAAC,SAAI,WAAU,mBACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,oBACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,gBACZ;AAAA,SAAC,MAAM,UACN,gBAAAA,MAAC,WAAM,WAAU,cAAa;AAAA;AAAA,UAE5B,gBAAAD,KAAC,WAAM,MAAK,QAAO,QAAO,QAAO,UAAU,kBAAkB,QAAM,MAAC;AAAA,WACtE;AAAA,QAED,MAAM,SAAS,KACd,gBAAAC,MAAA,YACE;AAAA,0BAAAA,MAAC,WAAM,WAAU,+BAA8B;AAAA;AAAA,YAE7C,gBAAAD,KAAC,WAAM,MAAK,QAAO,QAAO,QAAO,UAAU,kBAAkB,QAAM,MAAC;AAAA,aACtE;AAAA,UACA,gBAAAA,KAAC,SAAI,WAAU,uBACX,WAAC,QAAQ,aAAa,eAAe,YAAY,UAAU,EAAkB,IAAI,UACjF,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,kBAAkB,oBAAoB,OAAO,WAAW,EAAE;AAAA,cACrE,SAAS,MAAM,mBAAmB,IAAI;AAAA,cAErC,mBAAS,SAAS,SAClB,SAAS,cAAc,cACvB,SAAS,gBAAgB,SACzB,SAAS,aAAa,aAAa;AAAA;AAAA,YAP/B;AAAA,UAQP,CACD,GACH;AAAA,WACF;AAAA,SAEJ;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAU,iBACZ,gBAAM,SAAS,KACd,gBAAAA,KAAC,YAAO,SAAS,cAAc,WAAU,cAAa,6BAEtD,GAEJ;AAAA,OACF;AAAA,IAEC,MAAM,SAAS,KACd,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA,iBAAiB;AAAA,QACjB,WAAW;AAAA,QACX,cAAc;AAAA;AAAA,IAChB;AAAA,IAGF,gBAAAC,MAAC,SAAI,WAAU,oBACb;AAAA,sBAAAA,MAAC,SAAI,WAAU,qBACZ;AAAA,mBAAW,gBAAAD,KAAC,SAAI,WAAU,qBAAoB,4BAAc;AAAA,QAC5D,CAAC,MAAM,UAAU,CAAC,WACjB,gBAAAC,MAAC,SAAI,WAAU,eACb;AAAA,0BAAAD,KAAC,QAAG,yCAA2B;AAAA,UAC/B,gBAAAA,KAAC,OAAE,iFAAmE;AAAA,UACtE,gBAAAC,MAAC,WAAM,WAAU,+BAA8B;AAAA;AAAA,YAE7C,gBAAAD,KAAC,WAAM,MAAK,QAAO,QAAO,QAAO,UAAU,kBAAkB,QAAM,MAAC;AAAA,aACtE;AAAA,WACF;AAAA,QAED,MAAM,SAAS,KACd,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe;AAAA,YACf,aAAa;AAAA,YACb,eAAe;AAAA,YACf,aAAa;AAAA,YACb,MAAK;AAAA,YACL;AAAA;AAAA,QACF;AAAA,SAEJ;AAAA,MAEA,gBAAAC,MAAC,SAAI,WAAU,kBACZ;AAAA,wBACC,gBAAAA,MAAA,YACE;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP;AAAA,cACA,UAAU;AAAA,cACV,UAAU;AAAA;AAAA,UACZ;AAAA,UAEC,cAAc,aAAa,cAC1B,gBAAAC,MAAC,SAAI,WAAU,mBACb;AAAA,4BAAAD,KAAC,QAAG,4BAAc;AAAA,YAChB,cAAc,SAAS,eAAe,cAAc,SAAS,aAC7D,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,QAAQ,cAAc,SAAS,aAAa,MAAM;AAAA,gBAClD,QAAQ,CAAC,YAAY,kBAAkB,cAAc,IAAI,EAAE,OAAO,QAAQ,CAAC;AAAA,gBAC3E,cAAc,cAAc;AAAA;AAAA,YAC9B,IACE,cAAc,SAAS,aACzB,gBAAAC,MAAC,WAAM,WAAU,wBACf;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,cAAc,UAAU;AAAA,kBACjC,UAAU,OAAK,kBAAkB,cAAc,IAAI,EAAE,OAAO,EAAE,OAAO,UAAU,SAAS,GAAG,CAAC;AAAA;AAAA,cAC9F;AAAA,cAAE;AAAA,eAEJ,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAM,cAAc,gBAAgB,UAAU,UACxC,cAAc,gBAAgB,WAAW,WACzC,cAAc,gBAAgB,UAAU,QACxC,cAAc,gBAAgB,SAAS,SAAS;AAAA,gBACtD,OAAO,cAAc;AAAA,gBACrB,UAAU,OAAK,kBAAkB,cAAc,IAAI,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC;AAAA,gBAC5E,aAAa,YAAY,cAAc,KAAK;AAAA,gBAC5C,WAAU;AAAA;AAAA,YACZ;AAAA,aAEJ;AAAA,WAEJ,IAEA,gBAAAA,KAAC,SAAI,WAAU,eACZ,gBAAM,SAAS,IACZ,2FACA,kDACN;AAAA,QAGD,OAAO,SAAS,KACf,gBAAAC,MAAC,SAAI,WAAU,cACb;AAAA,0BAAAA,MAAC,QAAG;AAAA;AAAA,YAAa,OAAO;AAAA,YAAO;AAAA,aAAC;AAAA,UAC/B,OAAO,IAAI,CAAC,GAAG,MACd,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,mBAAmB,EAAE,OAAO,kBAAkB,WAAW,EAAE;AAAA,cACtE,SAAS,MAAM,mBAAmB,EAAE,EAAE;AAAA,cAEtC;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,EAAE,iBAAiB,eAAe,EAAE,QAAQ,EAAE;AAAA;AAAA,gBACvD;AAAA,gBACA,gBAAAA,KAAC,UAAK,WAAU,mBAAmB,YAAE,OAAM;AAAA,gBAC3C,gBAAAC,MAAC,UAAK,WAAU,mBAAkB;AAAA;AAAA,kBAAE,EAAE,OAAO;AAAA,mBAAE;AAAA,gBAC9C,EAAE,YAAY,gBAAAD,KAAC,UAAK,WAAU,uBAAsB,eAAC;AAAA;AAAA;AAAA,YAVjD,EAAE;AAAA,UAWT,CACD;AAAA,WACH;AAAA,SAEJ;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,cAAa;AAAA;AAAA,MAAW,gBAAAD,KAAC,OAAE,MAAK,oBAAmB,QAAO,UAAS,KAAI,uBAAsB,sBAAQ;AAAA,OAAI;AAAA,KAC1H;AAEJ;;;AO9TA,SAAS,YAAAK,WAAU,eAAAC,cAAa,aAAAC,YAAW,UAAAC,eAAc;;;ACFzD,SAAS,aAAa,KAAK,qBAAqB;AAGhD,eAAsB,kBACpB,WACA,QACqB;AACrB,MAAI;AACJ,MAAI,OAAO,cAAc,UAAU;AACjC,UAAM,MAAM,MAAM,MAAM,SAAS;AACjC,eAAW,MAAM,IAAI,YAAY;AAAA,EACnC,OAAO;AACL,eAAW;AAAA,EACb;AAEA,QAAM,SAAS,MAAM,YAAY,KAAK,QAAQ;AAC9C,QAAM,OAAO,MAAM,OAAO,UAAU,cAAc,SAAS;AAC3D,QAAM,QAAQ,OAAO,SAAS;AAE9B,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,MAAM,MAAO;AAClB,UAAM,OAAO,MAAM,MAAM,IAAI;AAC7B,QAAI,CAAC,KAAM;AAEX,UAAM,YAAY,KAAK,SAAS;AAChC,UAAM,aAAa,KAAK,UAAU;AAGlC,UAAM,IAAK,MAAM,IAAI,MAAO;AAC5B,UAAM,IAAI,aAAe,MAAM,IAAI,MAAO,aAAgB,MAAM,SAAS,MAAO;AAChF,UAAM,IAAK,MAAM,QAAQ,MAAO;AAChC,UAAM,IAAK,MAAM,SAAS,MAAO;AAEjC,QAAI,MAAM,SAAS,YAAY;AAC7B,UAAI,MAAM,UAAU,QAAQ;AAE1B,cAAM,QAAQ,KAAK,IAAI,GAAG,CAAC,IAAI;AAC/B,cAAM,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI;AACnC,aAAK,SAAS;AAAA,UACZ,OAAO,EAAE,GAAG,IAAI,OAAO,GAAG,IAAI,MAAM;AAAA,UACpC,KAAK,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,IAAI,MAAM;AAAA,UAC1C,WAAW;AAAA,UACX,OAAO,IAAI,GAAG,GAAG,CAAC;AAAA,QACpB,CAAC;AACD,aAAK,SAAS;AAAA,UACZ,OAAO,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,IAAI,MAAM;AAAA,UACxC,KAAK,EAAE,GAAG,IAAI,OAAO,GAAG,IAAI,IAAI,MAAM;AAAA,UACtC,WAAW;AAAA,UACX,OAAO,IAAI,GAAG,GAAG,CAAC;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,SAAS,eAAe,MAAM,SAAS,YAAY;AAElE,UAAI,MAAM,MAAM,WAAW,gBAAgB,GAAG;AAC5C,cAAM,WAAW,WAAW;AAAA,UAC1B,KAAK,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,UAC9B,OAAK,EAAE,WAAW,CAAC;AAAA,QACrB;AACA,cAAM,WAAW,MAAM,OAAO,SAAS,QAAQ;AAC/C,aAAK,UAAU,UAAU;AAAA,UACvB;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AAEL,YAAM,WAAW,KAAK,IAAI,MAAM,UAAU,IAAI,GAAG;AACjD,WAAK,SAAS,MAAM,OAAO;AAAA,QACzB,GAAG,IAAI;AAAA,QACP,GAAG,IAAI,IAAI;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA,OAAO,IAAI,GAAG,GAAG,CAAC;AAAA,QAClB,UAAU,IAAI;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,YAAY,OAAmB,UAAkB;AAC/D,QAAM,OAAO,IAAI,KAAK,CAAC,MAAM,MAAM,EAAE,MAAM,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACzE,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW;AACb,IAAE,MAAM;AACR,MAAI,gBAAgB,GAAG;AACzB;AAEA,eAAsB,kBACpB,OACA,aACA,UACA;AACA,QAAM,OAAO,IAAI,KAAK,CAAC,MAAM,MAAM,EAAE,MAAM,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACzE,QAAM,WAAW,IAAI,SAAS;AAC9B,WAAS,OAAO,QAAQ,MAAM,QAAQ;AAEtC,QAAM,MAAM,aAAa;AAAA,IACvB,QAAQ;AAAA,IACR,MAAM;AAAA,EACR,CAAC;AACH;;;AC/DM,SAIE,OAAAC,MAJF,QAAAC,aAAA;AA/BC,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,eAAe,OAAO,UAAU,OAAK,EAAE,OAAO,cAAc;AAClE,QAAM,UAAU,eAAe;AAC/B,QAAM,UAAU,eAAe,OAAO,SAAS;AAE/C,QAAM,aAAa,MAAM;AACvB,QAAI,SAAS;AACX,iBAAW,OAAO,eAAe,CAAC,EAAE,EAAE;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,SAAS;AACX,iBAAW,OAAO,eAAe,CAAC,EAAE,EAAE;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,OAAO,OAAK;AACrC,QAAI,CAAC,EAAE,SAAU,QAAO;AACxB,QAAI,EAAE,SAAS,WAAY,QAAO;AAClC,WAAO,CAAC,CAAC,EAAE;AAAA,EACb,CAAC,EAAE;AAEH,SACE,gBAAAA,MAAC,SAAI,WAAU,mBACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,4BACZ;AAAA;AAAA,MAAY;AAAA,MAAK,OAAO;AAAA,MAAO;AAAA,OAClC;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,4BACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU,CAAC;AAAA,UACX,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA,KAAC,UAAK,WAAU,4BACb,0BAAgB,IAAI,GAAG,eAAe,CAAC,MAAM,OAAO,MAAM,KAAK,KAClE;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU,CAAC;AAAA,UACX,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT,UAAU,CAAC;AAAA,QACX,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KACF;AAEJ;;;AF6EU,gBAAAE,MAwIM,QAAAC,aAxIN;AAlIH,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AACF,IAAqB,CAAC,GAAG;AACvB,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAyB,CAAC,CAAC;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAsB,CAAC,CAAC;AACpD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAwB,IAAI;AAC1E,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,iBAAiB,UAAU;AAChE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAsC,IAAI;AAC5E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,sBAAsB,EAAE;AACvE,QAAM,eAAeC,QAAuB,IAAI;AAGhD,EAAAC,WAAU,MAAM;AACd,QAAI,iBAAiB;AACnB,gBAAU,gBAAgB,MAAM;AAChC,UAAI,cAAe,SAAQ,aAAa;AACxC;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AACzD,UAAM,SAAS,OAAO,IAAI,KAAK;AAC/B,UAAM,YAAY,OAAO,IAAI,QAAQ;AACrC,UAAM,cAAc,OAAO,IAAI,QAAQ;AACvC,UAAM,QAAQ,OAAO,IAAI,aAAa;AAEtC,QAAI,YAAa,WAAU,WAAW;AACtC,QAAI,MAAO,gBAAe,KAAK;AAE/B,QAAI,OAAQ,SAAQ,MAAM;AAC1B,QAAI,WAAW;AACb,YAAM,SAAS,EACZ,KAAK,OAAK,EAAE,KAAK,CAAC,EAClB,KAAK,CAAC,aAAuB,UAAU,SAAS,MAAM,CAAC,EACvD,MAAM,SAAO,QAAQ,MAAM,0BAA0B,GAAG,CAAC;AAAA,IAC9D;AAEA,UAAM,gBAAgB,CAAC,MAAoB;AACzC,UAAI,EAAE,MAAM,SAAS,gBAAgB;AACnC,YAAI,EAAE,KAAK,OAAQ,WAAU,EAAE,KAAK,MAAM;AAC1C,YAAI,EAAE,KAAK,OAAQ,SAAQ,EAAE,KAAK,MAAM;AACxC,YAAI,EAAE,KAAK,OAAQ,WAAU,EAAE,KAAK,MAAM;AAC1C,YAAI,EAAE,KAAK,YAAa,gBAAe,EAAE,KAAK,WAAW;AAAA,MAC3D;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAEnC,QAAM,UAAUC,aAAY,OAAO,WAAiC;AAClE,eAAW,IAAI;AACf,QAAI;AACF,YAAM,WAAW,MAAM,eAAe,MAAM;AAC5C,eAAS,QAAQ;AACjB,mBAAa,MAAM;AAAA,IACrB,SAAS,KAAK;AACZ,cAAQ,MAAM,uBAAuB,GAAG;AAAA,IAC1C,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,iBAAiB,OAAO,OAAO,OAAK,EAAE,aAAa,MAAM;AAC/D,QAAM,gBAAgB,OAAO,KAAK,OAAK,EAAE,OAAO,eAAe,KAAK;AACpE,QAAM,kBAAkB,gBAAgB,cAAc,aAAa,SAAS;AAE5E,QAAM,oBAAoBA,aAAY,CAAC,IAAY,UAAkB;AACnE,cAAU,UAAQ,KAAK,IAAI,OAAK,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC;AAAA,EACpE,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiBA,aAAY,CAAC,YAAoB;AACtD,uBAAmB,OAAO;AAE1B,UAAM,QAAQ,OAAO,KAAK,OAAK,EAAE,OAAO,OAAO;AAC/C,QAAI,SAAS,aAAa,SAAS;AACjC,YAAM,SAAS,aAAa,QAAQ,cAAc,eAAe,MAAM,IAAI,IAAI;AAC/E,UAAI,QAAQ;AACV,eAAO,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,CAAC;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,oBAAoB,eAAe,MAAM,OAAK;AAClD,QAAI,CAAC,EAAE,SAAU,QAAO;AACxB,QAAI,EAAE,SAAS,WAAY,QAAO;AAClC,WAAO,CAAC,CAAC,EAAE;AAAA,EACb,CAAC;AAED,QAAM,eAAeA,aAAY,YAAY;AAC3C,QAAI,CAAC,aAAa,CAAC,kBAAmB;AACtC,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,WAAW,MAAM;AAC1D,YAAM,OAAO,IAAI,KAAK,CAAC,SAAS,MAAM,EAAE,MAAM,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAG5E,kBAAY,UAAU,qBAAqB;AAG3C,UAAI,aAAa;AACf,cAAM,kBAAkB,UAAU,aAAa,qBAAqB;AAAA,MACtE;AAGA,UAAI,YAAY;AACd,mBAAW,IAAI;AAAA,MACjB;AAGA,aAAO,QAAQ,YAAY,EAAE,MAAM,mBAAmB,GAAG,GAAG;AAAA,IAC9D,SAAS,KAAK;AACZ,cAAQ,MAAM,2BAA2B,GAAG;AAAA,IAC9C,UAAE;AACA,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,WAAW,QAAQ,aAAa,mBAAmB,UAAU,CAAC;AAElE,QAAM,qBAAqBA,aAAY,CAAC,UAAqB;AAC3D,UAAM,WAAW,MAAM,aAAa;AAEpC,QAAI,CAAC,UAAU;AAEb,UAAI,MAAM,SAAS,eAAe,MAAM,SAAS,YAAY;AAC3D,eAAO,MAAM,QACX,gBAAAL,KAAC,SAAI,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,WAAU,2BAA0B,IAE7E,gBAAAA,KAAC,SAAI,WAAU,sCAAsC,gBAAM,aAAY;AAAA,MAE3E;AACA,UAAI,MAAM,SAAS,YAAY;AAC7B,eACE,gBAAAA,KAAC,SAAI,WAAU,mCACZ,gBAAM,UAAU,SAAS,WAAW,IACvC;AAAA,MAEJ;AACA,aACE,gBAAAA,KAAC,SAAI,WAAU,sCACZ,gBAAM,SAAS,MAAM,aACxB;AAAA,IAEJ;AAGA,QAAI,MAAM,SAAS,eAAe,MAAM,SAAS,YAAY;AAC3D,UAAI,MAAM,OAAO;AACf,eACE,gBAAAA,KAAC,SAAI,WAAU,0BAAyB,SAAS,MAAM,kBAAkB,MAAM,IAAI,EAAE,GACnF,0BAAAA,KAAC,SAAI,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,WAAU,2BAA0B,GAC/E;AAAA,MAEJ;AACA,aACE,gBAAAA,KAAC,SAAI,WAAU,sCACZ,gBAAM,aACT;AAAA,IAEJ;AAEA,QAAI,MAAM,SAAS,YAAY;AAC7B,aACE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,8BAAkB,MAAM,IAAI,MAAM,UAAU,SAAS,KAAK,MAAM;AAAA,UAClE;AAAA,UAEC,gBAAM,UAAU,SAAS,WAAW;AAAA;AAAA,MACvC;AAAA,IAEJ;AAEA,QAAI,MAAM,SAAS,eAAe;AAChC,aACE,gBAAAA,KAAC,SAAI,WAAU,uBACZ,gBAAM,UAAS,oBAAI,KAAK,GAAE,mBAAmB,GAChD;AAAA,IAEJ;AAGA,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM,gBAAgB,UAAU,UAChC,MAAM,gBAAgB,WAAW,WACjC,MAAM,gBAAgB,UAAU,QAChC,MAAM,gBAAgB,SAAS,SAAS;AAAA,QAC9C,WAAU;AAAA,QACV,OAAO,MAAM;AAAA,QACb,aAAa,MAAM;AAAA,QACnB,UAAU,CAAC,MAAM,kBAAkB,MAAM,IAAI,EAAE,OAAO,KAAK;AAAA,QAC3D,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,QAClC,OAAO,EAAE,UAAU,GAAG,MAAM,WAAW,GAAG,KAAK;AAAA;AAAA,IACjD;AAAA,EAEJ,GAAG,CAAC,QAAQ,iBAAiB,CAAC;AAG9B,EAAAI,WAAU,MAAM;AACd,UAAM,YAAY,OAAO,OAAO,OAAK,EAAE,aAAa,UAAU,EAAE,SAAS,eAAe,EAAE,KAAK;AAC/F,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,WAAU,oBAAI,KAAK,GAAE,mBAAmB;AAC9C,gBAAU,UAAQ,KAAK,IAAI,OAAK;AAC9B,YAAI,EAAE,aAAa,UAAU,EAAE,SAAS,iBAAiB,CAAC,EAAE,OAAO;AACjE,iBAAO,EAAE,GAAG,GAAG,OAAO,QAAQ;AAAA,QAChC;AACA,eAAO;AAAA,MACT,CAAC,CAAC;AAAA,IACJ;AAAA,EACF,GAAG,CAAC,OAAO,OAAO,OAAK,EAAE,SAAS,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC;AAEjE,SACE,gBAAAH,MAAC,SAAI,WAAU,iBAAgB,KAAK,cACjC;AAAA,eAAW,gBAAAD,KAAC,SAAI,WAAU,qBAAoB,iCAAmB;AAAA,IAElE,gBAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,sBAAAD,KAAC,SAAI,WAAU,mBACZ,gBAAM,SAAS,KACd,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf,MAAK;AAAA,UACL,eAAe;AAAA,UACf;AAAA;AAAA,MACF,GAEJ;AAAA,MAEA,gBAAAC,MAAC,SAAI,WAAU,gBACZ;AAAA,yBAAiB,mBAChB,gBAAAA,MAAC,SAAI,WAAU,sBACb;AAAA,0BAAAD,KAAC,QAAI,wBAAc,OAAM;AAAA,UACxB,cAAc,YAAY,gBAAAA,KAAC,UAAK,WAAU,kBAAiB,sBAAQ;AAAA,WAElE,cAAc,SAAS,eAAe,cAAc,SAAS,eAC7D,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,QAAQ,cAAc,SAAS,aAAa,KAAK;AAAA,cACjD,QAAQ,CAAC,YAAY,kBAAkB,cAAc,IAAI,OAAO;AAAA,cAChE,cAAc,cAAc;AAAA;AAAA,UAC9B;AAAA,UAGD,cAAc,SAAS,UACtB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,cAAc,gBAAgB,UAAU,UACxC,cAAc,gBAAgB,WAAW,WACzC,cAAc,gBAAgB,UAAU,QACxC,cAAc,gBAAgB,SAAS,SAAS;AAAA,cACtD,OAAO,cAAc;AAAA,cACrB,UAAU,OAAK,kBAAkB,cAAc,IAAI,EAAE,OAAO,KAAK;AAAA,cACjE,aAAa,cAAc;AAAA,cAC3B,WAAU;AAAA;AAAA,UACZ;AAAA,UAGD,cAAc,SAAS,cACtB,gBAAAC,MAAC,WAAM,WAAU,yBACf;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,cAAc,UAAU;AAAA,gBACjC,UAAU,OAAK,kBAAkB,cAAc,IAAI,EAAE,OAAO,UAAU,SAAS,EAAE;AAAA;AAAA,YACnF;AAAA,YACC,cAAc,eAAe;AAAA,aAChC;AAAA,UAGD,cAAc,SAAS,iBACtB,gBAAAA,KAAC,SAAI,WAAU,uBACZ,wBAAc,SAAS,gCAC1B;AAAA,WAEJ;AAAA,QAGD,iBAAiB,CAAC,mBACjB,gBAAAC,MAAC,SAAI,WAAU,yBACb;AAAA,0BAAAD,KAAC,QAAI,wBAAc,OAAM;AAAA,UACzB,gBAAAA,KAAC,OAAE,mDAAqC;AAAA,WAC1C;AAAA,QAGD,CAAC,iBAAiB,eAAe,SAAS,KACzC,gBAAAA,KAAC,SAAI,WAAU,eAAc,wEAE7B;AAAA,QAGF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ;AAAA,YACR,gBAAgB;AAAA,YAChB,YAAY;AAAA,YACZ;AAAA,YACA,UAAU;AAAA;AAAA,QACZ;AAAA,QAEC,cAAc,gBAAAA,KAAC,SAAI,WAAU,qBAAoB,+BAAiB;AAAA,SACrE;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,cAAa;AAAA;AAAA,MAAW,gBAAAD,KAAC,OAAE,MAAK,oBAAmB,QAAO,UAAS,KAAI,uBAAsB,sBAAQ;AAAA,OAAI;AAAA,KAC1H;AAEJ;","names":["useState","useCallback","useEffect","e","jsx","jsxs","jsx","jsxs","useRef","useState","useCallback","jsx","jsxs","jsx","jsxs","useState","useEffect","useCallback","useState","useCallback","useEffect","useRef","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","useCallback"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unlev/exeq",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Embeddable PDF form builder and document signing — client-side, no backend required",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",