{"version":3,"sources":["../src/lib/field_registry.ts","../src/lib/utils.ts","../src/components/ui/input.tsx","../src/components/ui/label.tsx","../src/components/ui/tooltip.tsx","../src/components/file_manager_viewer/file_manager_button.tsx","../src/components/field_renderers/shared/reference_value.tsx","../src/components/field_renderers/text_field.tsx","../src/components/field_renderers/number_field.tsx","../src/components/field_renderers/date_field.tsx","../src/components/ui/checkbox.tsx","../src/components/field_renderers/boolean_field.tsx","../src/components/ui/select.tsx","../src/components/field_renderers/option_field.tsx","../src/components/field_renderers/email_field.tsx","../src/components/field_renderers/tel_field.tsx","../src/components/ui/hover_card.tsx","../src/components/field_renderers/shared/help_tooltip_icon.tsx","../src/components/field_renderers/currency_field.tsx","../src/components/field_renderers/percentage_field.tsx","../src/components/ui/textarea.tsx","../src/components/field_renderers/textarea_field.tsx","../src/components/ui/button.tsx","../src/components/ui/alert_dialog.tsx","../src/components/file_manager_viewer/file_list.tsx","../src/lib/hazo_pdf_exports.ts","../src/components/file_manager_viewer/file_viewer.tsx","../src/components/ui/dialog.tsx","../src/components/file_manager_viewer/file_manager_dialog.tsx","../src/components/file_manager_viewer/upload_zone.tsx","../src/components/file_manager_viewer/file_manager_page.tsx","../src/components/file_manager_viewer/types.ts","../src/components/file_manager_viewer/index.tsx","../src/components/field_renderers/table_field.tsx","../src/components/field_renderers/computed_field.tsx","../src/components/field_renderers/static_text_field.tsx","../src/components/field_renderers/summary_row_field.tsx","../src/lib/style_resolver.ts","../src/components/field_renderers/masked_field.tsx","../src/components/field_renderers/abn_field.tsx","../src/components/field_renderers/tfn_field.tsx","../src/components/field_renderers/index.tsx","../src/components/section_renderer/sub_section_renderer.tsx","../src/components/section_renderer/index.tsx","../src/components/ui/resizable.tsx","../src/lib/types.ts","../src/hooks/use_form_config.ts","../src/context/services_context.tsx","../src/components/hazo_data_form/index.tsx","../src/components/doc_panel/file_list_item.tsx","../src/components/doc_panel/non_pdf_content.tsx","../src/components/doc_panel/upload_zone.tsx","../src/components/doc_panel/index.tsx","../src/components/pdf_panel/doc_link_button.tsx","../src/components/pdf_panel/index.tsx","../src/components/ui/tabs.tsx","../src/components/file_upload_dialog/upload_icon_button.tsx","../src/components/file_upload_dialog/index.tsx"],"names":["twMerge","clsx","result","React","jsx","React2","React3","Fragment","React4","FaFileAlt","FaFileUpload","jsxs","React5","React6","React7","React8","React9","AlertDialogPrimitive","React10","FaFilePdf","FaFileImage","FaFileWord","FaFile","React11","FaTimes","FaUpload","FaPlus","FaExternalLinkAlt","FaSpinner","FaDownload","React12","DialogPrimitive","React13","React14","React15","React16","React17","FaRegFileAlt","React18","useFormContext","Controller","is_highlight","React19","Group","Panel","Separator","useState","useEffect","useMemo","React20","React21","useForm","FormProvider","get_type_icon","FileListItem","React22","UploadZone","React23","React24","React25","TabsPrimitive","React26","React27","React28","FaEye","FaTrash"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport type {\n  FormField,\n  FormMode,\n  FormConfig,\n  DocLink,\n  FieldTypeDefinition,\n  BaseFieldType,\n  FieldTypesConfig,\n  FieldUploads,\n} from \"./types\";\n\n/**\n * Props passed to field renderer components\n */\nexport interface FieldRendererProps {\n  field: FormField;\n  mode: FormMode;\n  value: unknown;\n  error?: string;\n  config: FormConfig;\n  on_change: (value: unknown) => void;\n  on_blur?: () => void;\n  on_doc_link_click?: () => void;\n  /** Callback for row-level doc_links in table fields */\n  on_row_doc_link_click?: (field_id: string, doc_links: DocLink[]) => void;\n  /** Fixed width for badge column when badges should be aligned */\n  badge_column_width?: string;\n  /** Fixed width for value column when values should be aligned */\n  value_column_width?: string;\n  /** Value for the paired field (when field has paired_field defined) */\n  paired_value?: unknown;\n  /** Change handler for the paired field */\n  paired_on_change?: (value: unknown) => void;\n  /** Blur handler for the paired field */\n  paired_on_blur?: () => void;\n  /** Error for the paired field */\n  paired_error?: string;\n  /** Uploaded files for this field */\n  field_uploads?: FieldUploads;\n  /** Callback when upload icon is clicked */\n  on_upload_click?: () => void;\n  /** Whether upload feature is enabled for this field */\n  upload_enabled?: boolean;\n}\n\n/**\n * Type definition for field renderer components\n */\nexport type FieldRenderer = React.ComponentType<FieldRendererProps>;\n\n/**\n * Registry for field renderers\n */\nconst field_renderers: Map<string, FieldRenderer> = new Map();\n\n/**\n * Register a custom field renderer\n */\nexport function register_field_renderer(\n  type: string,\n  renderer: FieldRenderer\n): void {\n  field_renderers.set(type, renderer);\n}\n\n/**\n * Get field renderer by type\n */\nexport function get_field_renderer(type: string): FieldRenderer | undefined {\n  return field_renderers.get(type);\n}\n\n/**\n * Check if a field renderer is registered\n */\nexport function has_field_renderer(type: string): boolean {\n  return field_renderers.has(type);\n}\n\n/**\n * Get all registered field types\n */\nexport function get_registered_field_types(): string[] {\n  return Array.from(field_renderers.keys());\n}\n\n/**\n * Unregister a field renderer\n */\nexport function unregister_field_renderer(type: string): boolean {\n  return field_renderers.delete(type);\n}\n\n// =============================================================================\n// FIELD TYPE RESOLUTION\n// =============================================================================\n\n/**\n * Resolve a field type to its definition from the config\n * Returns the FieldTypeDefinition if found in config, or null if it's a base type\n * or not found\n */\nexport function resolve_field_type(\n  field_type: string,\n  config: FormConfig\n): FieldTypeDefinition | null {\n  // Check if it's a configured custom field type\n  const field_types_config = config.field_types_config;\n  if (field_types_config?.field_types?.[field_type]) {\n    return resolve_field_type_inheritance(\n      field_types_config.field_types[field_type],\n      field_types_config\n    );\n  }\n\n  return null;\n}\n\n/**\n * Resolve inheritance chain for field type definitions\n */\nfunction resolve_field_type_inheritance(\n  type_def: FieldTypeDefinition,\n  field_types_config: FieldTypesConfig\n): FieldTypeDefinition {\n  if (!type_def.extends) {\n    return type_def;\n  }\n\n  const parent = field_types_config.field_types?.[type_def.extends];\n  if (!parent) {\n    return type_def;\n  }\n\n  const resolved_parent = resolve_field_type_inheritance(parent, field_types_config);\n\n  return {\n    ...resolved_parent,\n    ...type_def,\n    // Ensure base_type is always from the current definition or parent\n    base_type: type_def.base_type || resolved_parent.base_type,\n  };\n}\n\n/**\n * Check if a field type requires the MaskedField renderer\n * (i.e., it has a display_format defined)\n */\nexport function is_masked_field_type(\n  field_type: string,\n  config: FormConfig\n): boolean {\n  const type_def = resolve_field_type(field_type, config);\n  return type_def !== null && !!type_def.display_format;\n}\n\n/**\n * Get the base renderer type for a field type\n * Custom types resolve to their base_type, built-in types return as-is\n */\nexport function get_base_field_type(\n  field_type: string,\n  config: FormConfig\n): BaseFieldType | string {\n  const type_def = resolve_field_type(field_type, config);\n  if (type_def) {\n    return type_def.base_type;\n  }\n  return field_type;\n}\n\n/**\n * Check if a field type is a built-in base type\n */\nexport function is_base_field_type(field_type: string): field_type is BaseFieldType {\n  const base_types: BaseFieldType[] = [\n    \"text\",\n    \"number\",\n    \"date\",\n    \"boolean\",\n    \"option\",\n    \"email\",\n    \"tel\",\n    \"currency\",\n    \"percentage\",\n    \"textarea\",\n    \"table\",\n    \"computed\",\n    \"static_text\",\n    \"summary_row\",\n  ];\n  return base_types.includes(field_type as BaseFieldType);\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { DocLink, DocLinkType, FieldUploads, FormValues, UploadedFile } from \"./types\";\n\n/**\n * Merge Tailwind CSS classes with proper precedence\n */\nexport function cn(...inputs: ClassValue[]): string {\n  return twMerge(clsx(inputs));\n}\n\n/**\n * Parse a boolean value from string\n */\nexport function parse_boolean(\n  value: string | undefined,\n  default_value: boolean\n): boolean {\n  if (value === undefined || value === null || value === \"\") {\n    return default_value;\n  }\n  const lower = value.toLowerCase().trim();\n  if (lower === \"true\" || lower === \"yes\" || lower === \"1\") {\n    return true;\n  }\n  if (lower === \"false\" || lower === \"no\" || lower === \"0\") {\n    return false;\n  }\n  return default_value;\n}\n\n/**\n * Parse a number value from string\n */\nexport function parse_number(\n  value: string | undefined,\n  default_value: number\n): number {\n  if (value === undefined || value === null || value === \"\") {\n    return default_value;\n  }\n  const parsed = parseFloat(value);\n  return isNaN(parsed) ? default_value : parsed;\n}\n\n/**\n * Parse a string value with default\n */\nexport function parse_string(\n  value: string | undefined,\n  default_value: string\n): string {\n  if (value === undefined || value === null || value === \"\") {\n    return default_value;\n  }\n  return value;\n}\n\n/**\n * Format a number as currency\n */\nexport function format_currency(\n  value: number,\n  symbol: string = \"$\",\n  decimal_places: number = 2\n): string {\n  const formatted = value.toFixed(decimal_places);\n  const parts = formatted.split(\".\");\n  parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n  return `${symbol}${parts.join(\".\")}`;\n}\n\n/**\n * Format a number as percentage\n */\nexport function format_percentage(\n  value: number,\n  decimal_places: number = 2,\n  suffix: string = \"%\"\n): string {\n  return `${value.toFixed(decimal_places)}${suffix}`;\n}\n\n/**\n * Format a date value for display\n */\nexport function format_date(\n  value: string | Date,\n  format: string = \"MMM d, yyyy\"\n): string {\n  const date = typeof value === \"string\" ? new Date(value) : value;\n  if (isNaN(date.getTime())) {\n    return \"\";\n  }\n\n  const months = [\n    \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n    \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\",\n  ];\n  const full_months = [\n    \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n    \"July\", \"August\", \"September\", \"October\", \"November\", \"December\",\n  ];\n\n  const day = date.getDate();\n  const month = date.getMonth();\n  const year = date.getFullYear();\n\n  return format\n    .replace(\"MMMM\", full_months[month])\n    .replace(\"MMM\", months[month])\n    .replace(\"MM\", String(month + 1).padStart(2, \"0\"))\n    .replace(\"dd\", String(day).padStart(2, \"0\"))\n    .replace(\"d\", String(day))\n    .replace(\"yyyy\", String(year))\n    .replace(\"yy\", String(year).slice(-2));\n}\n\n/**\n * Sanitize a filename for safe storage paths\n * Removes or replaces characters that are unsafe in file paths\n */\nexport function sanitize_filename(filename: string): string {\n  return filename\n    .replace(/[<>:\"/\\\\|?*\\x00-\\x1F]/g, \"_\") // Replace unsafe characters\n    .replace(/\\.{2,}/g, \".\") // Collapse multiple dots\n    .replace(/^[\\s.]+|[\\s.]+$/g, \"\") // Trim leading/trailing spaces and dots\n    .slice(0, 255); // Limit length\n}\n\n/**\n * Generate a unique ID\n */\nexport function generate_id(): string {\n  return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Deep merge two objects\n */\nexport function deep_merge<T extends Record<string, unknown>>(\n  target: T,\n  source: Partial<T>\n): T {\n  const result = { ...target };\n\n  for (const key in source) {\n    if (Object.prototype.hasOwnProperty.call(source, key)) {\n      const source_value = source[key];\n      const target_value = target[key];\n\n      if (\n        typeof source_value === \"object\" &&\n        source_value !== null &&\n        !Array.isArray(source_value) &&\n        typeof target_value === \"object\" &&\n        target_value !== null &&\n        !Array.isArray(target_value)\n      ) {\n        result[key] = deep_merge(\n          target_value as Record<string, unknown>,\n          source_value as Record<string, unknown>\n        ) as T[Extract<keyof T, string>];\n      } else if (source_value !== undefined) {\n        result[key] = source_value as T[Extract<keyof T, string>];\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Evaluate TABLE_SUM function\n * Syntax: TABLE_SUM(table_id, sum_column, filter_column, filter_value)\n * Returns the sum of sum_column values where filter_column equals filter_value\n */\nfunction evaluate_table_sum(\n  args: string[],\n  values: Record<string, unknown>\n): number | null {\n  if (args.length !== 4) {\n    console.warn(\"TABLE_SUM requires 4 arguments: table_id, sum_column, filter_column, filter_value\");\n    return null;\n  }\n\n  const [table_id, sum_column, filter_column, filter_value] = args.map(a => a.trim());\n  const table_data = values[table_id];\n\n  if (!Array.isArray(table_data)) {\n    return null;\n  }\n\n  let sum = 0;\n  for (const row of table_data) {\n    if (typeof row === \"object\" && row !== null) {\n      const row_obj = row as Record<string, unknown>;\n      const row_filter_value = String(row_obj[filter_column]).toLowerCase();\n      const target_filter_value = filter_value.toLowerCase();\n      // Check if filter matches\n      if (row_filter_value === target_filter_value) {\n        const val = row_obj[sum_column];\n        const num = typeof val === \"number\" ? val : parseFloat(String(val));\n        if (!isNaN(num)) {\n          sum += num;\n        }\n      }\n    }\n  }\n\n  return sum;\n}\n\n/**\n * Safely evaluate a computed formula\n * Supports basic arithmetic operations and TABLE_SUM function for security\n *\n * Supported functions:\n * - TABLE_SUM(table_id, sum_column, filter_column, filter_value)\n *   Sums values from a table column where another column matches a filter value\n */\nexport function evaluate_formula(\n  formula: string,\n  values: Record<string, unknown>\n): number | null {\n  try {\n    // Replace field references with their values\n    let expression = formula;\n\n    // First, process TABLE_SUM functions\n    if (formula.includes(\"TABLE_SUM\")) {\n      const table_sum_regex = /TABLE_SUM\\s*\\(\\s*([^,]+)\\s*,\\s*([^,]+)\\s*,\\s*([^,]+)\\s*,\\s*([^)]+)\\s*\\)/gi;\n      expression = expression.replace(table_sum_regex, (match, table_id, sum_col, filter_col, filter_val) => {\n        const result = evaluate_table_sum([table_id, sum_col, filter_col, filter_val], values);\n        return result !== null ? String(result) : \"0\";\n      });\n    }\n\n    // Find all remaining field references (alphanumeric with underscores)\n    // But skip keywords that might appear in function names\n    const field_refs = expression.match(/[a-zA-Z_][a-zA-Z0-9_]*/g) || [];\n\n    for (const ref of field_refs) {\n      // Skip if it looks like a function name we already processed\n      if (ref.toUpperCase() === \"TABLE_SUM\") continue;\n\n      const value = values[ref];\n      if (typeof value === \"number\") {\n        expression = expression.replace(new RegExp(`\\\\b${ref}\\\\b`, \"g\"), String(value));\n      } else if (typeof value === \"string\" && !isNaN(parseFloat(value))) {\n        expression = expression.replace(new RegExp(`\\\\b${ref}\\\\b`, \"g\"), value);\n      } else if (value === undefined || value === null || value === \"\") {\n        // Treat undefined/null/empty as 0 for calculations\n        expression = expression.replace(new RegExp(`\\\\b${ref}\\\\b`, \"g\"), \"0\");\n      } else {\n        // If any referenced field is not a number, return null\n        return null;\n      }\n    }\n\n    // Validate that expression only contains safe characters\n    if (!/^[\\d\\s+\\-*/().]+$/.test(expression)) {\n      console.warn(\"Invalid formula expression:\", expression);\n      return null;\n    }\n\n    // Evaluate the expression\n    // Using Function constructor is safe here because we've validated the input\n    const result = new Function(`return (${expression})`)();\n    return typeof result === \"number\" && !isNaN(result) ? result : null;\n  } catch (error) {\n    console.warn(\"Formula evaluation error:\", error);\n    return null;\n  }\n}\n\n/**\n * Get the uploads key for a field ID\n * Uploads are stored with __uploads suffix in form values\n */\nexport function get_uploads_key(field_id: string): string {\n  return `${field_id}__uploads`;\n}\n\n/**\n * Extract uploads from form values for a field\n */\nexport function get_field_uploads(\n  values: FormValues,\n  field_id: string\n): FieldUploads {\n  const key = get_uploads_key(field_id);\n  return (values[key] as FieldUploads) || [];\n}\n\n/**\n * Check if field has uploads\n */\nexport function has_field_uploads(\n  values: FormValues,\n  field_id: string\n): boolean {\n  return get_field_uploads(values, field_id).length > 0;\n}\n\n/**\n * Generate a unique file ID for uploads\n */\nexport function generate_file_id(): string {\n  return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Format file size for display\n */\nexport function format_file_size(bytes: number): string {\n  if (bytes === 0) return \"0 B\";\n  const k = 1024;\n  const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n}\n\n/**\n * Check if a MIME type matches an allowed type pattern\n * Supports wildcards like \"image/*\"\n */\nexport function is_mime_type_allowed(\n  mime_type: string,\n  allowed_types: string[]\n): boolean {\n  return allowed_types.some((pattern) => {\n    if (pattern.endsWith(\"/*\")) {\n      const prefix = pattern.slice(0, -1);\n      return mime_type.startsWith(prefix);\n    }\n    return mime_type === pattern;\n  });\n}\n\n/**\n * Extract filename from URL or path\n * @param url The URL or file path\n * @returns The filename, or \"Document\" if extraction fails\n */\nexport function extract_filename_from_url(url: string): string {\n  try {\n    // Handle both URLs and file paths\n    const path = url.includes(\"://\")\n      ? new URL(url).pathname\n      : url;\n\n    // Get the last segment after /\n    const segments = path.split(\"/\").filter(Boolean);\n    const filename = segments[segments.length - 1];\n\n    if (!filename) {\n      return \"Document\";\n    }\n\n    // Decode URI component for special characters\n    return decodeURIComponent(filename);\n  } catch {\n    return \"Document\";\n  }\n}\n\n/**\n * Normalize doc_links to always return an array (handles undefined)\n */\nexport function normalize_doc_links(doc_links?: DocLink[]): DocLink[] {\n  return doc_links ?? [];\n}\n\n/**\n * Infer DocLinkType from MIME type\n */\nexport function infer_doc_link_type_from_mime(mime_type: string): DocLinkType {\n  if (mime_type === \"application/pdf\") return \"pdf\";\n  if (mime_type.startsWith(\"image/\")) return \"image\";\n  if (\n    mime_type.includes(\"word\") ||\n    mime_type.includes(\"excel\") ||\n    mime_type.includes(\"powerpoint\") ||\n    mime_type.includes(\"spreadsheet\") ||\n    mime_type.includes(\"presentation\") ||\n    mime_type === \"text/plain\" ||\n    mime_type === \"text/csv\"\n  ) {\n    return \"document\";\n  }\n  return \"other\";\n}\n\n/**\n * Convert UploadedFile to DocLink for display in DocPanel\n */\nexport function uploaded_file_to_doc_link(upload: UploadedFile): DocLink {\n  const type = infer_doc_link_type_from_mime(upload.mime_type);\n  return {\n    type,\n    url: upload.url,\n    filename: upload.filename,\n    page: upload.page,\n    file_id: upload.file_id,\n  };\n}\n\n/**\n * Convert array of UploadedFiles to DocLinks\n */\nexport function uploads_to_doc_links(uploads: UploadedFile[]): DocLink[] {\n  return uploads.map(uploaded_file_to_doc_link);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface InputProps\n  extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n  ({ className, type, ...props }, ref) => {\n    return (\n      <input\n        type={type}\n        className={cn(\n          \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      />\n    );\n  }\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface LabelProps\n  extends React.LabelHTMLAttributes<HTMLLabelElement> {}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n  ({ className, ...props }, ref) => {\n    return (\n      <label\n        ref={ref}\n        className={cn(\n          \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n          className\n        )}\n        {...props}\n      />\n    );\n  }\n);\nLabel.displayName = \"Label\";\n\nexport { Label };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\ninterface TooltipContextValue {\n  open: boolean;\n  set_open: (open: boolean) => void;\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null);\n\nexport function TooltipProvider({ children }: { children: React.ReactNode }) {\n  return <>{children}</>;\n}\n\nexport function Tooltip({ children }: { children: React.ReactNode }) {\n  const [open, set_open] = React.useState(false);\n\n  return (\n    <TooltipContext.Provider value={{ open, set_open }}>\n      <div className=\"relative inline-block\">{children}</div>\n    </TooltipContext.Provider>\n  );\n}\n\nexport function TooltipTrigger({\n  children,\n  asChild,\n}: {\n  children: React.ReactNode;\n  asChild?: boolean;\n}) {\n  const context = React.useContext(TooltipContext);\n\n  if (!context) {\n    throw new Error(\"TooltipTrigger must be used within a Tooltip\");\n  }\n\n  const { set_open } = context;\n\n  const handle_mouse_enter = () => set_open(true);\n  const handle_mouse_leave = () => set_open(false);\n\n  if (asChild && React.isValidElement(children)) {\n    return React.cloneElement(children as React.ReactElement<any>, {\n      onMouseEnter: handle_mouse_enter,\n      onMouseLeave: handle_mouse_leave,\n    });\n  }\n\n  return (\n    <span onMouseEnter={handle_mouse_enter} onMouseLeave={handle_mouse_leave}>\n      {children}\n    </span>\n  );\n}\n\nexport function TooltipContent({\n  children,\n  className,\n  side = \"top\",\n}: {\n  children: React.ReactNode;\n  className?: string;\n  side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n}) {\n  const context = React.useContext(TooltipContext);\n\n  if (!context) {\n    throw new Error(\"TooltipContent must be used within a Tooltip\");\n  }\n\n  const { open } = context;\n\n  if (!open) {\n    return null;\n  }\n\n  const position_classes = {\n    top: \"bottom-full left-1/2 -translate-x-1/2 mb-2\",\n    bottom: \"top-full left-1/2 -translate-x-1/2 mt-2\",\n    left: \"right-full top-1/2 -translate-y-1/2 mr-2\",\n    right: \"left-full top-1/2 -translate-y-1/2 ml-2\",\n  };\n\n  return (\n    <div\n      className={cn(\n        \"absolute z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95\",\n        position_classes[side],\n        className\n      )}\n    >\n      {children}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaFileAlt, FaFileUpload } from \"react-icons/fa\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../../lib/utils\";\nimport type { FileManagerButtonProps } from \"./types\";\n\n/**\n * FileManagerButton Component\n * Unified icon button that shows file count badge\n * Replaces both DocLinkButton and UploadIconButton\n */\nexport function FileManagerButton({\n  file_count,\n  has_files,\n  on_click,\n  config,\n  class_name,\n  tooltip_text,\n  disabled = false,\n}: FileManagerButtonProps) {\n  const [is_hovered, set_is_hovered] = React.useState(false);\n\n  const fm_config = config.file_manager;\n  const icon_size = parseInt(fm_config.icon_size, 10) || 20;\n\n  // Determine icon color based on state\n  const icon_color = is_hovered\n    ? fm_config.icon_color_hover\n    : has_files\n      ? fm_config.icon_color_with_files\n      : fm_config.icon_color;\n\n  // Determine which icon to show\n  // FaFileUpload when no files, FaFileAlt when files are attached\n  const IconComponent = has_files ? FaFileAlt : FaFileUpload;\n\n  // Default tooltip text\n  const default_tooltip = has_files\n    ? `${file_count} file${file_count !== 1 ? \"s\" : \"\"} attached`\n    : \"No files attached\";\n\n  const button_content = (\n    <button\n      type=\"button\"\n      onClick={on_click}\n      onMouseEnter={() => set_is_hovered(true)}\n      onMouseLeave={() => set_is_hovered(false)}\n      disabled={disabled}\n      className={cn(\n        \"cls_file_manager_btn relative p-1 rounded hover:bg-muted transition-colors\",\n        disabled && \"opacity-50 cursor-not-allowed\",\n        class_name\n      )}\n      aria-label={tooltip_text || default_tooltip}\n    >\n      <IconComponent\n        size={icon_size}\n        color={icon_color}\n        className=\"transition-colors\"\n      />\n      {/* Badge - always show when count > 0 */}\n      {file_count > 0 && (\n        <span\n          className=\"cls_file_count_badge absolute -top-1 -right-1 min-w-[16px] h-[16px] flex items-center justify-center rounded-full text-[10px] font-bold\"\n          style={{\n            backgroundColor: fm_config.badge_background,\n            color: fm_config.badge_text_color,\n          }}\n        >\n          {file_count > 9 ? \"9+\" : file_count}\n        </span>\n      )}\n    </button>\n  );\n\n  return (\n    <TooltipProvider>\n      <Tooltip>\n        <TooltipTrigger asChild>{button_content}</TooltipTrigger>\n        <TooltipContent>\n          <p>{tooltip_text || default_tooltip}</p>\n        </TooltipContent>\n      </Tooltip>\n    </TooltipProvider>\n  );\n}\n","\"use client\";\n\n/**\n * ReferenceValue\n * Displays an optional reference annotation below a field input.\n * Used for prior-year values, benchmarks, or expected values.\n */\nexport function ReferenceValue({ value }: { value: string }) {\n  return (\n    <div\n      className=\"cls_reference_value mt-1 text-xs italic px-2 py-0.5 rounded\"\n      style={{ backgroundColor: \"var(--muted, #f1f5f9)\", color: \"#6b7280\" }}\n    >\n      Ref: {value}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Text Field Renderer\n * Handles text input with optional min/max length validation\n */\nexport function TextField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  badge_column_width,\n  value_column_width,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const is_inline = field.label_position === \"inline\";\n  const string_value = value !== undefined && value !== null ? String(value) : \"\";\n\n  // Check if we're using column-aligned badge layout\n  const use_aligned_badge = is_inline && badge_column_width;\n\n  // Render the badge component separately for aligned layout\n  const render_badge = () => {\n    if (!field.field_info.badge) return null;\n    return (\n      <span\n        className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n        style={{\n          backgroundColor: \"#111827\",\n          color: \"#ffffff\",\n          minWidth: \"24px\",\n        }}\n      >\n        {field.field_info.badge}\n      </span>\n    );\n  };\n\n  // Render the label component\n  const render_label = () => (\n    <div className=\"cls_label_row flex items-center gap-2\">\n      {field.field_info.item_code && (\n        <span\n          className=\"cls_item_code_box inline-flex items-center justify-center px-1.5 py-0.5 border text-xs font-mono\"\n          style={{\n            borderColor: config.item_code_border_color,\n            backgroundColor: config.item_code_background,\n            fontSize: config.item_code_font_size,\n          }}\n        >\n          {field.field_info.item_code}\n        </span>\n      )}\n      <Label\n        htmlFor={field.id}\n        className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n        style={{\n          color: config.label_color,\n          fontFamily: config.label_font_family,\n          fontSize: config.label_font_size,\n          fontWeight: config.label_font_weight,\n        }}\n      >\n        {field.label}\n        {is_required && (\n          <span\n            className=\"cls_required_asterisk ml-1\"\n            style={{ color: config.label_color_required }}\n          >\n            *\n          </span>\n        )}\n      </Label>\n      {/* Only render badge inline with label if NOT using aligned layout */}\n      {!use_aligned_badge && field.field_info.badge && (\n        <span\n          className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n          style={{\n            backgroundColor: \"#111827\",\n            color: \"#ffffff\",\n            minWidth: \"24px\",\n          }}\n        >\n          {field.field_info.badge}\n        </span>\n      )}\n    </div>\n  );\n\n  // Render the file manager column (shows unified button with badge for total file count)\n  const render_file_column = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    return (\n      <div\n        className=\"cls_file_column flex-shrink-0 flex items-center justify-center\"\n        style={{ width: config.file_manager.button_column_width }}\n      >\n        <FileManagerButton\n          file_count={total_count}\n          has_files={has_files}\n          on_click={handle_click || (() => {})}\n          config={config}\n          disabled={!handle_click}\n        />\n      </div>\n    );\n  };\n\n  // Render the input/value component\n  const render_field = () => (\n    <>\n      {is_view ? (\n        <div\n          className={cn(\n            \"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\",\n            is_inline && field.field_info.text_align !== \"left\" && \"justify-end\"\n          )}\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {string_value || \"-\"}\n        </div>\n      ) : (\n        <Input\n          id={field.id}\n          type=\"text\"\n          value={string_value}\n          onChange={(e) => on_change(e.target.value)}\n          onBlur={on_blur}\n          placeholder={field.field_info.placeholder}\n          disabled={field.field_info.disabled}\n          minLength={field.field_info.min_length}\n          maxLength={field.field_info.max_length}\n          className={cn(\n            \"cls_text_input\",\n            is_inline && field.field_info.text_align !== \"left\" && \"text-right\",\n            error && \"cls_input_error border-destructive\"\n          )}\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          }}\n        />\n      )}\n    </>\n  );\n\n  // Inline layout: label and field on same row\n  if (is_inline) {\n    // Determine value width (use field-level value_width, or provided value_column_width, or default)\n    const effective_value_width = field.value_width || value_column_width || \"150px\";\n\n    return (\n      <div className=\"cls_field_container cls_text_field cls_inline_layout w-full\">\n        <div className=\"flex items-center gap-4\">\n          {/* Label section - takes remaining space */}\n          <div className=\"flex-grow min-w-0\">{render_label()}</div>\n          {/* Badge column - fixed width when aligned */}\n          {use_aligned_badge && (\n            <div\n              className=\"cls_badge_column flex-shrink-0 flex items-center justify-center\"\n              style={{ width: badge_column_width }}\n            >\n              {render_badge()}\n            </div>\n          )}\n          {/* Value column - fixed width */}\n          <div\n            className=\"flex-shrink-0\"\n            style={{ width: effective_value_width }}\n          >\n            {render_field()}\n          </div>\n          {/* Doc link column - always reserves space for alignment */}\n          {render_file_column()}\n        </div>\n        {error && (\n          <p\n            className=\"cls_error_message mt-1 text-sm text-right\"\n            style={{ color: config.error_color }}\n          >\n            {error}\n          </p>\n        )}\n        {field.reference_value && <ReferenceValue value={field.reference_value} />}\n      </div>\n    );\n  }\n\n  // Stacked layout (default): label above field\n  return (\n    <div className=\"cls_field_container cls_text_field w-full\">\n      <div style={{ marginBottom: config.label_field_gap }}>\n        {render_label()}\n      </div>\n      <div className=\"flex items-center gap-2\">\n        <div className=\"flex-grow min-w-0\">\n          {render_field()}\n        </div>\n        {render_file_column()}\n      </div>\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Number Field Renderer\n * Handles numeric input with optional min/max and decimal places\n * Supports inline layout with item_code and badge\n */\nexport function NumberField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  badge_column_width,\n  value_column_width,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const is_inline = field.label_position === \"inline\";\n\n  const format_value = (val: unknown): string => {\n    if (val === undefined || val === null || val === \"\") return \"\";\n    const num = typeof val === \"number\" ? val : parseFloat(String(val));\n    if (isNaN(num)) return \"\";\n    const decimals = field.field_info.decimal_places;\n    if (decimals !== undefined) {\n      return num.toFixed(decimals);\n    }\n    return String(num);\n  };\n\n  const display_value = format_value(value);\n\n  const handle_change = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const input = e.target.value;\n    if (input === \"\" || input === \"-\") {\n      on_change(input);\n      return;\n    }\n    const num = parseFloat(input);\n    if (!isNaN(num)) {\n      on_change(num);\n    }\n  };\n\n  // Check if we're using column-aligned badge layout\n  const use_aligned_badge = is_inline && badge_column_width;\n\n  // Render the badge component separately for aligned layout\n  const render_badge = () => {\n    if (!field.field_info.badge) return null;\n    return (\n      <span\n        className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n        style={{\n          backgroundColor: \"#111827\",\n          color: \"#ffffff\",\n          minWidth: \"24px\",\n        }}\n      >\n        {field.field_info.badge}\n      </span>\n    );\n  };\n\n  // Render the label component (without badge if using aligned layout)\n  const render_label = () => (\n    <div className=\"cls_label_row flex items-center gap-2\">\n      {field.field_info.item_code && (\n        <span\n          className=\"cls_item_code_box inline-flex items-center justify-center px-1.5 py-0.5 border text-xs font-mono\"\n          style={{\n            borderColor: config.item_code_border_color,\n            backgroundColor: config.item_code_background,\n            fontSize: config.item_code_font_size,\n          }}\n        >\n          {field.field_info.item_code}\n        </span>\n      )}\n      <Label\n        htmlFor={field.id}\n        className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n        style={{\n          color: config.label_color,\n          fontFamily: config.label_font_family,\n          fontSize: config.label_font_size,\n          fontWeight: config.label_font_weight,\n        }}\n      >\n        {field.label}\n        {is_required && (\n          <span\n            className=\"cls_required_asterisk ml-1\"\n            style={{ color: config.label_color_required }}\n          >\n            *\n          </span>\n        )}\n      </Label>\n      {/* Only render badge inline with label if NOT using aligned layout */}\n      {!use_aligned_badge && field.field_info.badge && (\n        <span\n          className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n          style={{\n            backgroundColor: \"#111827\",\n            color: \"#ffffff\",\n            minWidth: \"24px\",\n          }}\n        >\n          {field.field_info.badge}\n        </span>\n      )}\n    </div>\n  );\n\n  // Render the file manager column (shows unified button with badge for total file count)\n  const render_file_column = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    return (\n      <div\n        className=\"cls_file_column flex-shrink-0 flex items-center justify-center\"\n        style={{ width: config.file_manager.button_column_width }}\n      >\n        <FileManagerButton\n          file_count={total_count}\n          has_files={has_files}\n          on_click={handle_click || (() => {})}\n          config={config}\n          disabled={!handle_click}\n        />\n      </div>\n    );\n  };\n\n  // Render the input/value component\n  const render_field = () => (\n    <>\n      {is_view ? (\n        <div\n          className={cn(\n            \"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\",\n            is_inline && \"justify-end\"\n          )}\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {display_value || \"-\"}\n        </div>\n      ) : (\n        <Input\n          id={field.id}\n          type=\"number\"\n          value={value !== undefined && value !== null ? String(value) : \"\"}\n          onChange={handle_change}\n          onBlur={on_blur}\n          placeholder={field.field_info.placeholder}\n          disabled={field.field_info.disabled}\n          min={field.field_info.min}\n          max={field.field_info.max}\n          step={\n            field.field_info.decimal_places !== undefined\n              ? Math.pow(10, -field.field_info.decimal_places)\n              : \"any\"\n          }\n          className={cn(\n            \"cls_number_input\",\n            is_inline && \"text-right\",\n            error && \"cls_input_error border-destructive\"\n          )}\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          }}\n        />\n      )}\n    </>\n  );\n\n  // Inline layout: label and field on same row\n  if (is_inline) {\n    // Determine value width (use provided value_column_width or default)\n    const effective_value_width = value_column_width || \"150px\";\n\n    return (\n      <div className=\"cls_field_container cls_number_field cls_inline_layout w-full\">\n        <div className=\"flex items-center gap-4\">\n          {/* Label section - takes remaining space */}\n          <div className=\"flex-grow min-w-0\">{render_label()}</div>\n          {/* Badge column - fixed width when aligned */}\n          {use_aligned_badge && (\n            <div\n              className=\"cls_badge_column flex-shrink-0 flex items-center justify-center\"\n              style={{ width: badge_column_width }}\n            >\n              {render_badge()}\n            </div>\n          )}\n          {/* Value column - fixed width */}\n          <div\n            className=\"flex-shrink-0\"\n            style={{ width: effective_value_width }}\n          >\n            {render_field()}\n          </div>\n          {/* Doc link column - always reserves space for alignment */}\n          {render_file_column()}\n        </div>\n        {error && (\n          <p\n            className=\"cls_error_message mt-1 text-sm text-right\"\n            style={{ color: config.error_color }}\n          >\n            {error}\n          </p>\n        )}\n        {field.reference_value && <ReferenceValue value={field.reference_value} />}\n      </div>\n    );\n  }\n\n  // Stacked layout (default): label above field\n  return (\n    <div className=\"cls_field_container cls_number_field w-full\">\n      <div style={{ marginBottom: config.label_field_gap }}>\n        {render_label()}\n      </div>\n      <div className=\"flex items-center gap-2\">\n        <div className=\"flex-grow min-w-0\">\n          {render_field()}\n        </div>\n        {render_file_column()}\n      </div>\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, format_date, format_currency, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Date Field Renderer\n * Handles date input with configurable display format\n * Supports paired fields for dual-column layouts\n */\nexport function DateField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  badge_column_width,\n  value_column_width,\n  paired_value,\n  paired_on_change,\n  paired_on_blur,\n  paired_error,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const is_inline = field.label_position === \"inline\";\n\n  // Check if we're using column-aligned badge layout\n  const use_aligned_badge = is_inline && badge_column_width;\n\n  // Check if we have a paired field\n  const has_paired_field = !!field.paired_field;\n  const paired_field_info = field.paired_field?.field_info;\n\n  // Convert value to YYYY-MM-DD format for input\n  const get_input_value = (): string => {\n    if (!value) return \"\";\n    if (typeof value === \"string\") {\n      // If already in YYYY-MM-DD format, use as is\n      if (/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n        return value;\n      }\n      // Try to parse and convert\n      const date = new Date(value);\n      if (!isNaN(date.getTime())) {\n        return date.toISOString().split(\"T\")[0];\n      }\n    }\n    if (value instanceof Date) {\n      return value.toISOString().split(\"T\")[0];\n    }\n    return \"\";\n  };\n\n  // Format value for display\n  const get_display_value = (): string => {\n    if (!value) return \"-\";\n    try {\n      return format_date(value as string | Date, config.date_format);\n    } catch {\n      return String(value);\n    }\n  };\n\n  // Render the badge component separately for aligned layout\n  const render_badge = () => {\n    if (!field.field_info.badge) return null;\n    return (\n      <span\n        className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n        style={{\n          backgroundColor: \"#111827\",\n          color: \"#ffffff\",\n          minWidth: \"24px\",\n        }}\n      >\n        {field.field_info.badge}\n      </span>\n    );\n  };\n\n  // Render the label component\n  const render_label = () => (\n    <div className=\"cls_label_row flex items-center gap-2\">\n      {field.field_info.item_code && (\n        <span\n          className=\"cls_item_code_box inline-flex items-center justify-center px-1.5 py-0.5 border text-xs font-mono\"\n          style={{\n            borderColor: config.item_code_border_color,\n            backgroundColor: config.item_code_background,\n            fontSize: config.item_code_font_size,\n          }}\n        >\n          {field.field_info.item_code}\n        </span>\n      )}\n      <Label\n        htmlFor={field.id}\n        className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n        style={{\n          color: config.label_color,\n          fontFamily: config.label_font_family,\n          fontSize: config.label_font_size,\n          fontWeight: config.label_font_weight,\n        }}\n      >\n        {field.label}\n        {is_required && (\n          <span\n            className=\"cls_required_asterisk ml-1\"\n            style={{ color: config.label_color_required }}\n          >\n            *\n          </span>\n        )}\n      </Label>\n      {/* Only render badge inline with label if NOT using aligned layout */}\n      {!use_aligned_badge && field.field_info.badge && (\n        <span\n          className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n          style={{\n            backgroundColor: \"#111827\",\n            color: \"#ffffff\",\n            minWidth: \"24px\",\n          }}\n        >\n          {field.field_info.badge}\n        </span>\n      )}\n    </div>\n  );\n\n  // Render the file manager column (shows unified button with badge for total file count)\n  const render_file_column = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    return (\n      <div\n        className=\"cls_file_column flex-shrink-0 flex items-center justify-center\"\n        style={{ width: config.file_manager.button_column_width }}\n      >\n        <FileManagerButton\n          file_count={total_count}\n          has_files={has_files}\n          on_click={handle_click || (() => {})}\n          config={config}\n          disabled={!handle_click}\n        />\n      </div>\n    );\n  };\n\n  // Render the input/value component\n  const render_field = () => (\n    <>\n      {is_view ? (\n        <div\n          className={cn(\n            \"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\",\n            is_inline && \"justify-end\"\n          )}\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {get_display_value()}\n        </div>\n      ) : (\n        <input\n          id={field.id}\n          type=\"date\"\n          data-hazo-date-field=\"true\"\n          value={get_input_value()}\n          onChange={(e) => on_change(e.target.value)}\n          onBlur={on_blur}\n          disabled={field.field_info.disabled}\n          className={cn(\n            \"cls_date_input flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n            error && \"cls_input_error border-destructive\"\n          )}\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          } as React.CSSProperties}\n        />\n      )}\n    </>\n  );\n\n  // Render paired field (typically currency for Date+Amount layouts)\n  const render_paired_field = () => {\n    if (!paired_field_info) return null;\n\n    const paired_currency_symbol = paired_field_info.currency_symbol || config.default_currency_symbol;\n    const paired_decimal_places = paired_field_info.decimal_places ?? config.default_decimal_places;\n\n    // Format paired value for display\n    const get_paired_display_value = (): string => {\n      if (paired_value === undefined || paired_value === null || paired_value === \"\") return \"-\";\n      const num = typeof paired_value === \"number\" ? paired_value : parseFloat(String(paired_value));\n      if (isNaN(num)) return \"-\";\n      return format_currency(num, paired_currency_symbol, paired_decimal_places);\n    };\n\n    // Handle paired input change\n    const handle_paired_change = (e: React.ChangeEvent<HTMLInputElement>) => {\n      if (!paired_on_change) return;\n      const input = e.target.value;\n      const cleaned = input.replace(new RegExp(`[${paired_currency_symbol},\\\\s]`, \"g\"), \"\");\n      if (cleaned === \"\" || cleaned === \"-\") {\n        paired_on_change(\"\");\n        return;\n      }\n      const num = parseFloat(cleaned);\n      if (!isNaN(num)) {\n        paired_on_change(num);\n      }\n    };\n\n    // Get paired input value\n    const get_paired_input_value = (): string => {\n      if (paired_value === undefined || paired_value === null || paired_value === \"\") return \"\";\n      return String(paired_value);\n    };\n\n    if (is_view) {\n      return (\n        <div\n          className={cn(\n            \"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center justify-end\"\n          )}\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {get_paired_display_value()}\n        </div>\n      );\n    }\n\n    // Render based on paired field type\n    if (paired_field_info.field_type === \"currency\") {\n      return (\n        <div className=\"relative\">\n          <span\n            className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\"\n            style={{ fontFamily: config.field_font_family }}\n          >\n            {paired_currency_symbol}\n          </span>\n          <Input\n            id={field.paired_field?.id}\n            type=\"number\"\n            value={get_paired_input_value()}\n            onChange={handle_paired_change}\n            onBlur={paired_on_blur}\n            placeholder={paired_field_info.placeholder || \"0.00\"}\n            disabled={paired_field_info.disabled}\n            min={paired_field_info.min}\n            max={paired_field_info.max}\n            step={Math.pow(10, -paired_decimal_places)}\n            className={cn(\n              \"cls_currency_input text-right\",\n              paired_error && \"cls_input_error border-destructive\"\n            )}\n            style={{\n              paddingLeft: \"28px\", // Space for currency symbol\n              fontFamily: config.field_font_family,\n              fontSize: config.field_font_size,\n              borderColor: paired_error ? config.error_color : undefined,\n              backgroundColor: paired_field_info.disabled\n                ? config.field_background_color_disabled\n                : config.field_background_color,\n            }}\n          />\n        </div>\n      );\n    }\n\n    // Default: render as text input\n    return (\n      <Input\n        id={field.paired_field?.id}\n        type=\"text\"\n        value={paired_value as string || \"\"}\n        onChange={(e) => paired_on_change?.(e.target.value)}\n        onBlur={paired_on_blur}\n        disabled={paired_field_info.disabled}\n        className={cn(paired_error && \"cls_input_error border-destructive\")}\n        style={{\n          fontFamily: config.field_font_family,\n          fontSize: config.field_font_size,\n          borderColor: paired_error ? config.error_color : undefined,\n          backgroundColor: paired_field_info.disabled\n            ? config.field_background_color_disabled\n            : config.field_background_color,\n        }}\n      />\n    );\n  };\n\n  // Inline layout: label and field on same row\n  if (is_inline) {\n    // Determine value width (use field-level value_width, or provided value_column_width, or default)\n    const effective_value_width = field.value_width || value_column_width || \"150px\";\n\n    return (\n      <div className={cn(\n        \"cls_field_container cls_date_field cls_inline_layout w-full\",\n        has_paired_field && \"cls_paired_field_layout\"\n      )}>\n        <div className=\"flex items-center gap-4\">\n          {/* Label section - takes remaining space */}\n          <div className=\"flex-grow min-w-0\">{render_label()}</div>\n          {/* Badge column - fixed width when aligned */}\n          {use_aligned_badge && (\n            <div\n              className=\"cls_badge_column flex-shrink-0 flex items-center justify-center\"\n              style={{ width: badge_column_width }}\n            >\n              {render_badge()}\n            </div>\n          )}\n          {/* Value column - fixed width */}\n          <div\n            className=\"flex-shrink-0\"\n            style={{ width: effective_value_width }}\n          >\n            {render_field()}\n          </div>\n\n          {/* Paired field: Value (when present) */}\n          {has_paired_field && (\n            <div\n              className=\"flex-shrink-0\"\n              style={{ width: effective_value_width }}\n            >\n              {render_paired_field()}\n            </div>\n          )}\n\n          {/* Doc link column - always reserves space for alignment */}\n          {render_file_column()}\n        </div>\n        {(error || paired_error) && (\n          <div className=\"flex justify-end gap-4 mt-1\">\n            {error && (\n              <p\n                className=\"cls_error_message text-sm\"\n                style={{ color: config.error_color, width: effective_value_width }}\n              >\n                {error}\n              </p>\n            )}\n            {paired_error && (\n              <p\n                className=\"cls_error_message text-sm\"\n                style={{ color: config.error_color, width: effective_value_width }}\n              >\n                {paired_error}\n              </p>\n            )}\n          </div>\n        )}\n        {field.reference_value && <ReferenceValue value={field.reference_value} />}\n      </div>\n    );\n  }\n\n  // Stacked layout (default): label above field\n  return (\n    <div className=\"cls_field_container cls_date_field w-full\">\n      <div style={{ marginBottom: config.label_field_gap }}>\n        {render_label()}\n      </div>\n      <div className=\"flex items-center gap-2\">\n        <div className=\"flex-grow min-w-0\">\n          {render_field()}\n        </div>\n        {render_file_column()}\n      </div>\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface CheckboxProps\n  extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n  onCheckedChange?: (checked: boolean) => void;\n}\n\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n  ({ className, onCheckedChange, onChange, ...props }, ref) => {\n    const handle_change = (e: React.ChangeEvent<HTMLInputElement>) => {\n      if (onCheckedChange) {\n        onCheckedChange(e.target.checked);\n      }\n      if (onChange) {\n        onChange(e);\n      }\n    };\n\n    return (\n      <input\n        type=\"checkbox\"\n        className={cn(\n          \"h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n          className\n        )}\n        ref={ref}\n        onChange={handle_change}\n        {...props}\n      />\n    );\n  }\n);\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Checkbox } from \"../ui/checkbox\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Boolean Field Renderer\n * Handles boolean/checkbox input\n */\nexport function BooleanField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  badge_column_width,\n  value_column_width,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const is_inline = field.label_position === \"inline\";\n\n  // Convert value to boolean\n  const get_boolean_value = (): boolean => {\n    if (typeof value === \"boolean\") return value;\n    if (typeof value === \"string\") {\n      const lower = value.toLowerCase();\n      return lower === \"true\" || lower === \"yes\" || lower === \"1\";\n    }\n    return !!value;\n  };\n\n  const boolean_value = get_boolean_value();\n\n  // Display value for view mode\n  const display_value = boolean_value ? \"Yes\" : \"No\";\n\n  // Check if we're using column-aligned badge layout\n  const use_aligned_badge = is_inline && badge_column_width;\n\n  // Render the badge component separately for aligned layout\n  const render_badge = () => {\n    if (!field.field_info.badge) return null;\n    return (\n      <span\n        className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n        style={{\n          backgroundColor: \"#111827\",\n          color: \"#ffffff\",\n          minWidth: \"24px\",\n        }}\n      >\n        {field.field_info.badge}\n      </span>\n    );\n  };\n\n  // Render the label component\n  const render_label = () => (\n    <div className=\"cls_label_row flex items-center gap-2\">\n      {field.field_info.item_code && (\n        <span\n          className=\"cls_item_code_box inline-flex items-center justify-center px-1.5 py-0.5 border text-xs font-mono\"\n          style={{\n            borderColor: config.item_code_border_color,\n            backgroundColor: config.item_code_background,\n            fontSize: config.item_code_font_size,\n          }}\n        >\n          {field.field_info.item_code}\n        </span>\n      )}\n      <Label\n        htmlFor={field.id}\n        className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n        style={{\n          color: config.label_color,\n          fontFamily: config.label_font_family,\n          fontSize: config.label_font_size,\n          fontWeight: config.label_font_weight,\n        }}\n      >\n        {field.label}\n        {is_required && (\n          <span\n            className=\"cls_required_asterisk ml-1\"\n            style={{ color: config.label_color_required }}\n          >\n            *\n          </span>\n        )}\n      </Label>\n      {/* Only render badge inline with label if NOT using aligned layout */}\n      {!use_aligned_badge && field.field_info.badge && (\n        <span\n          className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n          style={{\n            backgroundColor: \"#111827\",\n            color: \"#ffffff\",\n            minWidth: \"24px\",\n          }}\n        >\n          {field.field_info.badge}\n        </span>\n      )}\n    </div>\n  );\n\n  // Render the file manager column (shows unified button with badge for total file count)\n  const render_file_column = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    return (\n      <div\n        className=\"cls_file_column flex-shrink-0 flex items-center justify-center\"\n        style={{ width: config.file_manager.button_column_width }}\n      >\n        <FileManagerButton\n          file_count={total_count}\n          has_files={has_files}\n          on_click={handle_click || (() => {})}\n          config={config}\n          disabled={!handle_click}\n        />\n      </div>\n    );\n  };\n\n  // Render the input/value component\n  const render_field = () => (\n    <>\n      {is_view ? (\n        <div\n          className={cn(\n            \"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\",\n            is_inline && \"justify-end\"\n          )}\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {display_value}\n        </div>\n      ) : (\n        <div className={cn(\"flex items-center gap-2 h-10\", is_inline && \"justify-end\")}>\n          <Checkbox\n            id={field.id}\n            checked={boolean_value}\n            onCheckedChange={(checked) => on_change(checked)}\n            onBlur={on_blur}\n            disabled={field.field_info.disabled}\n            className={cn(\n              \"cls_boolean_input\",\n              error && \"cls_input_error border-destructive\"\n            )}\n          />\n          <label\n            htmlFor={field.id}\n            className=\"text-sm cursor-pointer select-none\"\n            style={{\n              fontFamily: config.field_font_family,\n              fontSize: config.field_font_size,\n            }}\n          >\n            {boolean_value ? \"Yes\" : \"No\"}\n          </label>\n        </div>\n      )}\n    </>\n  );\n\n  // Inline layout: label and field on same row\n  if (is_inline) {\n    // Determine value width (use provided value_column_width or default)\n    const effective_value_width = value_column_width || \"150px\";\n\n    return (\n      <div className=\"cls_field_container cls_boolean_field cls_inline_layout w-full\">\n        <div className=\"flex items-center gap-4\">\n          {/* Label section - takes remaining space */}\n          <div className=\"flex-grow min-w-0\">{render_label()}</div>\n          {/* Badge column - fixed width when aligned */}\n          {use_aligned_badge && (\n            <div\n              className=\"cls_badge_column flex-shrink-0 flex items-center justify-center\"\n              style={{ width: badge_column_width }}\n            >\n              {render_badge()}\n            </div>\n          )}\n          {/* Value column - fixed width */}\n          <div\n            className=\"flex-shrink-0\"\n            style={{ width: effective_value_width }}\n          >\n            {render_field()}\n          </div>\n          {/* Doc link column - always reserves space for alignment */}\n          {render_file_column()}\n        </div>\n        {error && (\n          <p\n            className=\"cls_error_message mt-1 text-sm text-right\"\n            style={{ color: config.error_color }}\n          >\n            {error}\n          </p>\n        )}\n        {field.reference_value && <ReferenceValue value={field.reference_value} />}\n      </div>\n    );\n  }\n\n  // Stacked layout (default): label above field\n  return (\n    <div className=\"cls_field_container cls_boolean_field w-full\">\n      <div style={{ marginBottom: config.label_field_gap }}>\n        {render_label()}\n      </div>\n      <div className=\"flex items-center gap-2\">\n        <div className=\"flex-grow min-w-0\">\n          {render_field()}\n        </div>\n        {render_file_column()}\n      </div>\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface SelectProps\n  extends React.SelectHTMLAttributes<HTMLSelectElement> {}\n\nconst Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n  ({ className, children, ...props }, ref) => {\n    return (\n      <select\n        className={cn(\n          \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      >\n        {children}\n      </select>\n    );\n  }\n);\nSelect.displayName = \"Select\";\n\nexport { Select };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Select } from \"../ui/select\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Option Field Renderer\n * Handles select/dropdown input with predefined options\n */\nexport function OptionField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  badge_column_width,\n  value_column_width,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const is_inline = field.label_position === \"inline\";\n  const options = field.field_info.options || [];\n\n  // Check if we're using column-aligned badge layout\n  const use_aligned_badge = is_inline && badge_column_width;\n\n  const string_value = value !== undefined && value !== null ? String(value) : \"\";\n\n  // Get display label for view mode\n  const get_display_label = (): string => {\n    const option = options.find((opt) => opt.value === string_value);\n    return option?.label || string_value || \"-\";\n  };\n\n  // Render the badge component separately for aligned layout\n  const render_badge = () => {\n    if (!field.field_info.badge) return null;\n    return (\n      <span\n        className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n        style={{\n          backgroundColor: \"#111827\",\n          color: \"#ffffff\",\n          minWidth: \"24px\",\n        }}\n      >\n        {field.field_info.badge}\n      </span>\n    );\n  };\n\n  // Render the label component\n  const render_label = () => (\n    <div className=\"cls_label_row flex items-center gap-2\">\n      {field.field_info.item_code && (\n        <span\n          className=\"cls_item_code_box inline-flex items-center justify-center px-1.5 py-0.5 border text-xs font-mono\"\n          style={{\n            borderColor: config.item_code_border_color,\n            backgroundColor: config.item_code_background,\n            fontSize: config.item_code_font_size,\n          }}\n        >\n          {field.field_info.item_code}\n        </span>\n      )}\n      <Label\n        htmlFor={field.id}\n        className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n        style={{\n          color: config.label_color,\n          fontFamily: config.label_font_family,\n          fontSize: config.label_font_size,\n          fontWeight: config.label_font_weight,\n        }}\n      >\n        {field.label}\n        {is_required && (\n          <span\n            className=\"cls_required_asterisk ml-1\"\n            style={{ color: config.label_color_required }}\n          >\n            *\n          </span>\n        )}\n      </Label>\n      {/* Only render badge inline with label if NOT using aligned layout */}\n      {!use_aligned_badge && field.field_info.badge && (\n        <span\n          className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n          style={{\n            backgroundColor: \"#111827\",\n            color: \"#ffffff\",\n            minWidth: \"24px\",\n          }}\n        >\n          {field.field_info.badge}\n        </span>\n      )}\n    </div>\n  );\n\n  // Render the file manager column (shows unified button with badge for total file count)\n  const render_file_column = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    return (\n      <div\n        className=\"cls_file_column flex-shrink-0 flex items-center justify-center\"\n        style={{ width: config.file_manager.button_column_width }}\n      >\n        <FileManagerButton\n          file_count={total_count}\n          has_files={has_files}\n          on_click={handle_click || (() => {})}\n          config={config}\n          disabled={!handle_click}\n        />\n      </div>\n    );\n  };\n\n  // Render the input/value component\n  const render_field = () => (\n    <>\n      {is_view ? (\n        <div\n          className={cn(\n            \"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\",\n            is_inline && \"justify-end\"\n          )}\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {get_display_label()}\n        </div>\n      ) : (\n        <Select\n          id={field.id}\n          value={string_value}\n          onChange={(e) => on_change(e.target.value)}\n          onBlur={on_blur}\n          disabled={field.field_info.disabled}\n          className={cn(\"cls_option_input\", error && \"cls_input_error border-destructive\")}\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          }}\n        >\n          <option value=\"\">Select...</option>\n          {options.map((option) => (\n            <option key={option.value} value={option.value}>\n              {option.label}\n            </option>\n          ))}\n        </Select>\n      )}\n    </>\n  );\n\n  // Inline layout: label and field on same row\n  if (is_inline) {\n    // Determine value width (use field-level value_width, or provided value_column_width, or default)\n    const effective_value_width = field.value_width || value_column_width || \"150px\";\n\n    return (\n      <div className=\"cls_field_container cls_option_field cls_inline_layout w-full\">\n        <div className=\"flex items-center gap-4\">\n          {/* Label section - takes remaining space */}\n          <div className=\"flex-grow min-w-0\">{render_label()}</div>\n          {/* Badge column - fixed width when aligned */}\n          {use_aligned_badge && (\n            <div\n              className=\"cls_badge_column flex-shrink-0 flex items-center justify-center\"\n              style={{ width: badge_column_width }}\n            >\n              {render_badge()}\n            </div>\n          )}\n          {/* Value column - fixed width */}\n          <div\n            className=\"flex-shrink-0\"\n            style={{ width: effective_value_width }}\n          >\n            {render_field()}\n          </div>\n          {/* Doc link column - always reserves space for alignment */}\n          {render_file_column()}\n        </div>\n        {error && (\n          <p\n            className=\"cls_error_message mt-1 text-sm text-right\"\n            style={{ color: config.error_color }}\n          >\n            {error}\n          </p>\n        )}\n        {field.reference_value && <ReferenceValue value={field.reference_value} />}\n      </div>\n    );\n  }\n\n  // Stacked layout (default): label above field\n  return (\n    <div className=\"cls_field_container cls_option_field w-full\">\n      <div style={{ marginBottom: config.label_field_gap }}>\n        {render_label()}\n      </div>\n      <div className=\"flex items-center gap-2\">\n        <div className=\"flex-grow min-w-0\">\n          {render_field()}\n        </div>\n        {render_file_column()}\n      </div>\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Email Field Renderer\n * Handles email input with built-in validation\n */\nexport function EmailField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const string_value = value !== undefined && value !== null ? String(value) : \"\";\n\n  // Render the file manager button (shows unified button with badge for total file count)\n  const render_file_button = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return null;\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return null;\n    }\n\n    return (\n      <FileManagerButton\n        file_count={total_count}\n        has_files={has_files}\n        on_click={handle_click || (() => {})}\n        config={config}\n        disabled={!handle_click}\n      />\n    );\n  };\n\n  return (\n    <div className=\"cls_field_container cls_email_field w-full\">\n      <div\n        className=\"cls_label_row flex items-center gap-2\"\n        style={{ marginBottom: config.label_field_gap }}\n      >\n        <Label\n          htmlFor={field.id}\n          className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n          style={{\n            color: config.label_color,\n            fontFamily: config.label_font_family,\n            fontSize: config.label_font_size,\n            fontWeight: config.label_font_weight,\n          }}\n        >\n          {field.label}\n          {is_required && (\n            <span\n              className=\"cls_required_asterisk ml-1\"\n              style={{ color: config.label_color_required }}\n            >\n              *\n            </span>\n          )}\n        </Label>\n        {render_file_button()}\n      </div>\n\n      {is_view ? (\n        <div\n          className=\"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\"\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {string_value ? (\n            <a\n              href={`mailto:${string_value}`}\n              className=\"text-primary hover:underline\"\n            >\n              {string_value}\n            </a>\n          ) : (\n            \"-\"\n          )}\n        </div>\n      ) : (\n        <Input\n          id={field.id}\n          type=\"email\"\n          value={string_value}\n          onChange={(e) => on_change(e.target.value)}\n          onBlur={on_blur}\n          placeholder={field.field_info.placeholder || \"email@example.com\"}\n          disabled={field.field_info.disabled}\n          className={cn(\"cls_email_input\", error && \"cls_input_error border-destructive\")}\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          }}\n        />\n      )}\n\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Tel Field Renderer\n * Handles telephone number input\n */\nexport function TelField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const string_value = value !== undefined && value !== null ? String(value) : \"\";\n\n  // Render the file manager button (shows unified button with badge for total file count)\n  const render_file_button = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return null;\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return null;\n    }\n\n    return (\n      <FileManagerButton\n        file_count={total_count}\n        has_files={has_files}\n        on_click={handle_click || (() => {})}\n        config={config}\n        disabled={!handle_click}\n      />\n    );\n  };\n\n  return (\n    <div className=\"cls_field_container cls_tel_field w-full\">\n      <div\n        className=\"cls_label_row flex items-center gap-2\"\n        style={{ marginBottom: config.label_field_gap }}\n      >\n        <Label\n          htmlFor={field.id}\n          className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n          style={{\n            color: config.label_color,\n            fontFamily: config.label_font_family,\n            fontSize: config.label_font_size,\n            fontWeight: config.label_font_weight,\n          }}\n        >\n          {field.label}\n          {is_required && (\n            <span\n              className=\"cls_required_asterisk ml-1\"\n              style={{ color: config.label_color_required }}\n            >\n              *\n            </span>\n          )}\n        </Label>\n        {render_file_button()}\n      </div>\n\n      {is_view ? (\n        <div\n          className=\"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\"\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {string_value ? (\n            <a\n              href={`tel:${string_value.replace(/\\s/g, \"\")}`}\n              className=\"text-primary hover:underline\"\n            >\n              {string_value}\n            </a>\n          ) : (\n            \"-\"\n          )}\n        </div>\n      ) : (\n        <Input\n          id={field.id}\n          type=\"tel\"\n          value={string_value}\n          onChange={(e) => on_change(e.target.value)}\n          onBlur={on_blur}\n          placeholder={field.field_info.placeholder}\n          disabled={field.field_info.disabled}\n          className={cn(\"cls_tel_input\", error && \"cls_input_error border-destructive\")}\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          }}\n        />\n      )}\n\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\ninterface HoverCardContextValue {\n  open: boolean;\n  set_open: (open: boolean) => void;\n}\n\nconst HoverCardContext = React.createContext<HoverCardContextValue | null>(null);\n\nexport function HoverCard({ children }: { children: React.ReactNode }) {\n  const [open, set_open] = React.useState(false);\n  const timeout_ref = React.useRef<NodeJS.Timeout | null>(null);\n\n  const handle_open = React.useCallback(() => {\n    if (timeout_ref.current) {\n      clearTimeout(timeout_ref.current);\n    }\n    set_open(true);\n  }, []);\n\n  const handle_close = React.useCallback(() => {\n    // Delay closing to allow moving to the content\n    timeout_ref.current = setTimeout(() => {\n      set_open(false);\n    }, 100);\n  }, []);\n\n  React.useEffect(() => {\n    return () => {\n      if (timeout_ref.current) {\n        clearTimeout(timeout_ref.current);\n      }\n    };\n  }, []);\n\n  return (\n    <HoverCardContext.Provider value={{ open, set_open }}>\n      <div\n        className=\"cls_hover_card relative inline-block\"\n        onMouseEnter={handle_open}\n        onMouseLeave={handle_close}\n      >\n        {children}\n      </div>\n    </HoverCardContext.Provider>\n  );\n}\n\nexport function HoverCardTrigger({\n  children,\n  asChild,\n}: {\n  children: React.ReactNode;\n  asChild?: boolean;\n}) {\n  if (asChild && React.isValidElement(children)) {\n    return <>{children}</>;\n  }\n\n  return <span>{children}</span>;\n}\n\nexport function HoverCardContent({\n  children,\n  className,\n  align = \"center\",\n  side = \"top\",\n}: {\n  children: React.ReactNode;\n  className?: string;\n  align?: \"start\" | \"center\" | \"end\";\n  side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n}) {\n  const context = React.useContext(HoverCardContext);\n\n  if (!context) {\n    throw new Error(\"HoverCardContent must be used within a HoverCard\");\n  }\n\n  const { open } = context;\n\n  if (!open) {\n    return null;\n  }\n\n  const position_classes = {\n    top: \"bottom-full mb-2\",\n    bottom: \"top-full mt-2\",\n    left: \"right-full mr-2 top-1/2 -translate-y-1/2\",\n    right: \"left-full ml-2 top-1/2 -translate-y-1/2\",\n  };\n\n  const align_classes = {\n    start: side === \"top\" || side === \"bottom\" ? \"left-0\" : \"\",\n    center: side === \"top\" || side === \"bottom\" ? \"left-1/2 -translate-x-1/2\" : \"\",\n    end: side === \"top\" || side === \"bottom\" ? \"right-0\" : \"\",\n  };\n\n  return (\n    <div\n      className={cn(\n        \"cls_hover_card_content absolute z-50 rounded-md border p-4 shadow-lg outline-none\",\n        position_classes[side],\n        align_classes[align],\n        className\n      )}\n      style={{\n        backgroundColor: \"#ffffff\",\n        borderColor: \"#e5e7eb\",\n        color: \"#374151\",\n      }}\n    >\n      {children}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { HoverCard, HoverCardContent } from \"../../ui/hover_card\";\nimport type { HelpTooltip } from \"../../../lib/types\";\n\ninterface HelpTooltipIconProps {\n  help_tooltip: HelpTooltip;\n  computed_formula?: string;\n}\n\n/**\n * Help Tooltip Icon Component\n * Displays a question mark icon that shows help content on hover\n * Uses HoverCard for a wider, more readable tooltip UI\n */\nexport function HelpTooltipIcon({\n  help_tooltip,\n  computed_formula,\n}: HelpTooltipIconProps) {\n  // Don't render if no content\n  const has_message = !!help_tooltip.message;\n  const formula_text = help_tooltip.show_formula\n    ? help_tooltip.formula_display || computed_formula\n    : null;\n\n  if (!has_message && !formula_text) return null;\n\n  return (\n    <HoverCard>\n      <button\n        type=\"button\"\n        className=\"cls_help_tooltip_btn p-0.5 rounded-full hover:bg-muted transition-colors cursor-help\"\n        aria-label=\"Help\"\n      >\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          width=\"16\"\n          height=\"16\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className=\"text-muted-foreground hover:text-foreground\"\n        >\n          <circle cx=\"12\" cy=\"12\" r=\"10\" />\n          <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n          <path d=\"M12 17h.01\" />\n        </svg>\n      </button>\n      <HoverCardContent side=\"top\" align=\"start\" className=\"w-80\">\n        <div className=\"space-y-2\">\n          {has_message && (\n            <p className=\"cls_help_message text-sm text-foreground leading-relaxed\">\n              {help_tooltip.message}\n            </p>\n          )}\n          {formula_text && (\n            <div className=\"cls_help_formula pt-2 border-t border-border\">\n              <p className=\"text-xs text-muted-foreground font-medium mb-1\">Calculation</p>\n              <code className=\"text-xs bg-muted px-2 py-1 rounded text-muted-foreground font-mono block\">\n                {formula_text}\n              </code>\n            </div>\n          )}\n        </div>\n      </HoverCardContent>\n    </HoverCard>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, format_currency, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\nimport type { StyleVariant } from \"../../lib/types\";\nimport { HelpTooltipIcon } from \"./shared/help_tooltip_icon\";\n\n/**\n * Currency Field Renderer\n * Handles currency input with formatting\n * Supports style_variant for hierarchical styling (total_h1, total_h2, etc.)\n */\nexport function CurrencyField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  badge_column_width,\n  value_column_width,\n  paired_value,\n  paired_on_change,\n  paired_on_blur,\n  paired_error,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const has_help_tooltip = !!field.help_tooltip;\n\n  // Detect if this currency field should behave as computed (read-only with formula)\n  const is_computed = Boolean(field.field_info.computed_formula);\n  // When computed, always render as read-only (similar to view mode)\n  const is_readonly = is_view || is_computed;\n\n  const currency_symbol = field.field_info.currency_symbol || config.default_currency_symbol;\n  const decimal_places = field.field_info.decimal_places ?? config.default_decimal_places;\n\n  // Get style_variant from field (e.g., \"total_h1\", \"total_h2\")\n  const style_variant: StyleVariant | undefined = field.style_variant;\n  const has_style_variant = !!style_variant;\n  const style_config = style_variant ? config.styles[style_variant] : null;\n\n  // Format value for display\n  const get_display_value = (): string => {\n    if (value === undefined || value === null || value === \"\") return \"-\";\n    const num = typeof value === \"number\" ? value : parseFloat(String(value));\n    if (isNaN(num)) return \"-\";\n    return format_currency(num, currency_symbol, decimal_places);\n  };\n\n  // Parse input value\n  const handle_change = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const input = e.target.value;\n    // Remove currency symbol and commas\n    const cleaned = input.replace(new RegExp(`[${currency_symbol},\\\\s]`, \"g\"), \"\");\n    if (cleaned === \"\" || cleaned === \"-\") {\n      on_change(\"\");\n      return;\n    }\n    const num = parseFloat(cleaned);\n    if (!isNaN(num)) {\n      on_change(num);\n    }\n  };\n\n  // Get input value (raw number without formatting)\n  const get_input_value = (): string => {\n    if (value === undefined || value === null || value === \"\") return \"\";\n    return String(value);\n  };\n\n  const is_inline = field.label_position === \"inline\";\n\n  // Get variant-specific styles\n  const get_label_font_weight = () => {\n    if (style_config) return style_config.font_weight;\n    return config.label_font_weight;\n  };\n\n  const get_label_font_size = () => {\n    if (style_config) return style_config.font_size;\n    return config.label_font_size;\n  };\n\n  const get_label_font_color = () => {\n    // For total rows with background, use the style's font color\n    if (style_config && style_config.background_color !== \"transparent\") {\n      return style_config.font_color;\n    }\n    return config.label_color;\n  };\n\n  const get_field_font_weight = () => {\n    if (style_config) return style_config.font_weight;\n    return \"normal\";\n  };\n\n  const get_field_font_size = () => {\n    if (style_config) return style_config.font_size;\n    return config.field_font_size;\n  };\n\n  const get_row_background = () => {\n    if (style_config) return style_config.background_color;\n    return \"transparent\";\n  };\n\n  const get_row_indent = () => {\n    if (style_config) return style_config.indent;\n    return \"0px\";\n  };\n\n  // Check if we're using column-aligned badge layout\n  const use_aligned_badge = is_inline && badge_column_width;\n\n  // Render the badge component separately for aligned layout\n  const render_badge = () => {\n    // Check for formula_label (plain text annotation) first\n    if (field.field_info.formula_label) {\n      return (\n        <span\n          className=\"cls_formula_label text-sm text-muted-foreground\"\n          style={{\n            fontFamily: config.field_font_family,\n            whiteSpace: \"nowrap\",\n          }}\n        >\n          {field.field_info.formula_label}\n        </span>\n      );\n    }\n    if (!field.field_info.badge) return null;\n    return (\n      <span\n        className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n        style={{\n          backgroundColor: \"#111827\",\n          color: \"#ffffff\",\n          minWidth: \"24px\",\n        }}\n      >\n        {field.field_info.badge}\n      </span>\n    );\n  };\n\n  // Render the label component (without badge if using aligned layout)\n  const render_label = () => (\n    <div className=\"cls_label_row flex items-center gap-2\">\n      {field.field_info.item_code && (\n        <span\n          className=\"cls_item_code_box inline-flex items-center justify-center px-1.5 py-0.5 border text-xs font-mono\"\n          style={{\n            borderColor: config.item_code_border_color,\n            backgroundColor: config.item_code_background,\n            fontSize: config.item_code_font_size,\n          }}\n        >\n          {field.field_info.item_code}\n        </span>\n      )}\n      <Label\n        htmlFor={field.id}\n        className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n        style={{\n          color: get_label_font_color(),\n          fontFamily: config.label_font_family,\n          fontSize: get_label_font_size(),\n          fontWeight: get_label_font_weight(),\n        }}\n      >\n        {field.label}\n        {is_required && (\n          <span\n            className=\"cls_required_asterisk ml-1\"\n            style={{ color: config.label_color_required }}\n          >\n            *\n          </span>\n        )}\n      </Label>\n      {/* Only render badge inline with label if NOT using aligned layout */}\n      {!use_aligned_badge && field.field_info.badge && (\n        <span\n          className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n          style={{\n            backgroundColor: \"#111827\",\n            color: \"#ffffff\",\n            minWidth: \"24px\",\n          }}\n        >\n          {field.field_info.badge}\n        </span>\n      )}\n      {has_help_tooltip && field.help_tooltip && (\n        <HelpTooltipIcon\n          help_tooltip={field.help_tooltip}\n          computed_formula={field.field_info.computed_formula}\n        />\n      )}\n    </div>\n  );\n\n  // Render the file manager column (shows unified button with badge for total file count)\n  const render_file_column = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    return (\n      <div\n        className=\"cls_file_column flex-shrink-0 flex items-center justify-center\"\n        style={{ width: config.file_manager.button_column_width }}\n      >\n        <FileManagerButton\n          file_count={total_count}\n          has_files={has_files}\n          on_click={handle_click || (() => {})}\n          config={config}\n          disabled={!handle_click}\n        />\n      </div>\n    );\n  };\n\n  // Check if row background is not transparent (needs special styling)\n  const has_row_background = style_config && style_config.background_color !== \"transparent\";\n\n  // Render the input/value component\n  const render_field = () => (\n    <>\n      {is_readonly ? (\n        <div\n          className={cn(\n            \"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\",\n            is_inline && \"justify-end\"\n          )}\n          style={{\n            background: has_row_background ? \"transparent\" : config.view_mode_background,\n            border: has_row_background ? \"none\" : `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: get_field_font_size(),\n            fontWeight: get_field_font_weight(),\n            color: style_config ? style_config.font_color : undefined,\n          }}\n        >\n          {get_display_value()}\n        </div>\n      ) : (\n        <div className=\"relative\">\n          <span\n            className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\"\n            style={{\n              fontFamily: config.field_font_family,\n              fontWeight: get_field_font_weight(),\n            }}\n          >\n            {currency_symbol}\n          </span>\n          <Input\n            id={field.id}\n            type=\"number\"\n            value={get_input_value()}\n            onChange={handle_change}\n            onBlur={on_blur}\n            placeholder={field.field_info.placeholder || \"0.00\"}\n            disabled={field.field_info.disabled}\n            min={field.field_info.min}\n            max={field.field_info.max}\n            step={Math.pow(10, -decimal_places)}\n            className={cn(\n              \"cls_currency_input\",\n              is_inline && \"text-right\",\n              error && \"cls_input_error border-destructive\"\n            )}\n            style={{\n              paddingLeft: \"28px\", // Space for currency symbol\n              fontFamily: config.field_font_family,\n              fontSize: get_field_font_size(),\n              fontWeight: get_field_font_weight(),\n              borderColor: error ? config.error_color : undefined,\n              backgroundColor: field.field_info.disabled\n                ? config.field_background_color_disabled\n                : config.field_background_color,\n            }}\n          />\n        </div>\n      )}\n    </>\n  );\n\n  // Check if row needs full-width background styling\n  const needs_row_styling = has_style_variant && has_row_background;\n  const row_indent = get_row_indent();\n  const has_indent = row_indent !== \"0px\" && row_indent !== \"0\";\n\n  // Inline layout: label and field on same row\n  if (is_inline) {\n    // Determine value width (use provided value_column_width or default)\n    const effective_value_width = value_column_width || \"150px\";\n\n    // Check if we have a paired field (for dual-column layouts)\n    const has_paired_field = !!field.paired_field;\n    const paired_field_info = field.paired_field?.field_info;\n\n    // Render badge for paired field\n    const render_paired_badge = () => {\n      if (!paired_field_info?.badge) return null;\n      return (\n        <span\n          className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n          style={{\n            backgroundColor: \"#111827\",\n            color: \"#ffffff\",\n            minWidth: \"24px\",\n          }}\n        >\n          {paired_field_info.badge}\n        </span>\n      );\n    };\n\n    // Render the paired field input/value\n    const render_paired_field = () => {\n      const paired_currency_symbol = paired_field_info?.currency_symbol || config.default_currency_symbol;\n      const paired_decimal_places = paired_field_info?.decimal_places ?? config.default_decimal_places;\n\n      // Check if paired field should be readonly (computed or disabled)\n      const paired_is_computed = Boolean(paired_field_info?.computed_formula);\n      const paired_is_disabled = Boolean(paired_field_info?.disabled);\n      const paired_is_readonly = is_view || paired_is_computed || paired_is_disabled;\n\n      // Format paired value for display\n      const get_paired_display_value = (): string => {\n        if (paired_value === undefined || paired_value === null || paired_value === \"\") return \"-\";\n        const num = typeof paired_value === \"number\" ? paired_value : parseFloat(String(paired_value));\n        if (isNaN(num)) return \"-\";\n        return format_currency(num, paired_currency_symbol, paired_decimal_places);\n      };\n\n      // Handle paired input change\n      const handle_paired_change = (e: React.ChangeEvent<HTMLInputElement>) => {\n        if (!paired_on_change) return;\n        const input = e.target.value;\n        const cleaned = input.replace(new RegExp(`[${paired_currency_symbol},\\\\s]`, \"g\"), \"\");\n        if (cleaned === \"\" || cleaned === \"-\") {\n          paired_on_change(\"\");\n          return;\n        }\n        const num = parseFloat(cleaned);\n        if (!isNaN(num)) {\n          paired_on_change(num);\n        }\n      };\n\n      // Get paired input value\n      const get_paired_input_value = (): string => {\n        if (paired_value === undefined || paired_value === null || paired_value === \"\") return \"\";\n        return String(paired_value);\n      };\n\n      if (paired_is_readonly) {\n        return (\n          <div\n            className={cn(\n              \"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center justify-end\"\n            )}\n            style={{\n              background: has_row_background ? \"transparent\" : config.view_mode_background,\n              border: has_row_background ? \"none\" : `1px solid ${config.view_mode_border}`,\n              fontFamily: config.field_font_family,\n              fontSize: get_field_font_size(),\n              fontWeight: get_field_font_weight(),\n              color: style_config ? style_config.font_color : undefined,\n            }}\n          >\n            {get_paired_display_value()}\n          </div>\n        );\n      }\n\n      return (\n        <div className=\"relative\">\n          <span\n            className=\"absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground\"\n            style={{\n              fontFamily: config.field_font_family,\n              fontWeight: get_field_font_weight(),\n            }}\n          >\n            {paired_currency_symbol}\n          </span>\n          <Input\n            id={field.paired_field?.id}\n            type=\"number\"\n            value={get_paired_input_value()}\n            onChange={handle_paired_change}\n            onBlur={paired_on_blur}\n            placeholder={paired_field_info?.placeholder || \"0.00\"}\n            disabled={paired_field_info?.disabled}\n            min={paired_field_info?.min}\n            max={paired_field_info?.max}\n            step={Math.pow(10, -paired_decimal_places)}\n            className={cn(\n              \"cls_currency_input text-right\",\n              paired_error && \"cls_input_error border-destructive\"\n            )}\n            style={{\n              paddingLeft: \"28px\", // Space for currency symbol\n              fontFamily: config.field_font_family,\n              fontSize: get_field_font_size(),\n              fontWeight: get_field_font_weight(),\n              borderColor: paired_error ? config.error_color : undefined,\n              backgroundColor: paired_field_info?.disabled\n                ? config.field_background_color_disabled\n                : config.field_background_color,\n            }}\n          />\n        </div>\n      );\n    };\n\n    return (\n      <div\n        className={cn(\n          \"cls_field_container cls_currency_field cls_inline_layout\",\n          has_style_variant && `cls_style_${style_variant}`,\n          has_paired_field && \"cls_paired_field_layout\"\n        )}\n        style={{\n          backgroundColor: get_row_background(),\n          padding: needs_row_styling ? \"12px 16px\" : undefined,\n          marginLeft: needs_row_styling ? `calc(-16px + ${row_indent})` : has_indent ? row_indent : undefined,\n          marginRight: needs_row_styling ? \"-16px\" : undefined,\n          width: needs_row_styling\n            ? `calc(100% + 32px - ${row_indent})`\n            : has_indent\n              ? `calc(100% - ${row_indent})`\n              : \"100%\",\n          boxSizing: \"border-box\",\n        }}\n      >\n        <div className=\"flex items-center gap-4\">\n          {/* Label section - takes remaining space */}\n          <div className=\"flex-grow min-w-0\">{render_label()}</div>\n\n          {/* Primary field: Badge + Value */}\n          {use_aligned_badge && (field.field_info.badge || field.field_info.formula_label) && (\n            <div\n              className=\"cls_badge_column flex-shrink-0 flex items-center justify-center\"\n              style={{ width: badge_column_width, minWidth: field.field_info.formula_label ? \"120px\" : undefined }}\n            >\n              {render_badge()}\n            </div>\n          )}\n          <div\n            className=\"flex-shrink-0\"\n            style={{ width: effective_value_width }}\n          >\n            {render_field()}\n          </div>\n\n          {/* Paired field: Badge + Value (when present) */}\n          {has_paired_field && (\n            <>\n              {use_aligned_badge && paired_field_info?.badge && (\n                <div\n                  className=\"cls_badge_column flex-shrink-0 flex items-center justify-center\"\n                  style={{ width: badge_column_width }}\n                >\n                  {render_paired_badge()}\n                </div>\n              )}\n              <div\n                className=\"flex-shrink-0\"\n                style={{ width: effective_value_width }}\n              >\n                {render_paired_field()}\n              </div>\n            </>\n          )}\n\n          {/* Doc link column - always reserves space for alignment */}\n          {render_file_column()}\n        </div>\n        {(error || paired_error) && (\n          <div className=\"flex justify-end gap-4 mt-1\">\n            {error && (\n              <p\n                className=\"cls_error_message text-sm\"\n                style={{ color: config.error_color, width: effective_value_width }}\n              >\n                {error}\n              </p>\n            )}\n            {paired_error && (\n              <p\n                className=\"cls_error_message text-sm\"\n                style={{ color: config.error_color, width: effective_value_width }}\n              >\n                {paired_error}\n              </p>\n            )}\n          </div>\n        )}\n        {field.reference_value && <ReferenceValue value={field.reference_value} />}\n      </div>\n    );\n  }\n\n  // Stacked layout (default): label above field\n  return (\n    <div\n      className={cn(\n        \"cls_field_container cls_currency_field\",\n        has_style_variant && `cls_style_${style_variant}`\n      )}\n      style={{\n        backgroundColor: get_row_background(),\n        padding: needs_row_styling ? \"12px 16px\" : undefined,\n        marginLeft: needs_row_styling ? `calc(-16px + ${row_indent})` : has_indent ? row_indent : undefined,\n        marginRight: needs_row_styling ? \"-16px\" : undefined,\n        width: needs_row_styling\n          ? `calc(100% + 32px - ${row_indent})`\n          : has_indent\n            ? `calc(100% - ${row_indent})`\n            : \"100%\",\n        boxSizing: \"border-box\",\n      }}\n    >\n      <div style={{ marginBottom: config.label_field_gap }}>\n        {render_label()}\n      </div>\n      <div className=\"flex items-center gap-2\">\n        <div className=\"flex-grow min-w-0\">\n          {render_field()}\n        </div>\n        {render_file_column()}\n      </div>\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, format_percentage, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Percentage Field Renderer\n * Handles percentage input with formatting\n */\nexport function PercentageField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  badge_column_width,\n  value_column_width,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const is_inline = field.label_position === \"inline\";\n\n  const decimal_places = field.field_info.decimal_places ?? config.default_decimal_places;\n  const percentage_suffix = config.percentage_suffix;\n\n  // Check if we're using column-aligned badge layout\n  const use_aligned_badge = is_inline && badge_column_width;\n\n  // Format value for display\n  const get_display_value = (): string => {\n    if (value === undefined || value === null || value === \"\") return \"-\";\n    const num = typeof value === \"number\" ? value : parseFloat(String(value));\n    if (isNaN(num)) return \"-\";\n    return format_percentage(num, decimal_places, percentage_suffix);\n  };\n\n  // Parse input value\n  const handle_change = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const input = e.target.value;\n    if (input === \"\" || input === \"-\") {\n      on_change(\"\");\n      return;\n    }\n    const num = parseFloat(input);\n    if (!isNaN(num)) {\n      on_change(num);\n    }\n  };\n\n  // Get input value (raw number without formatting)\n  const get_input_value = (): string => {\n    if (value === undefined || value === null || value === \"\") return \"\";\n    return String(value);\n  };\n\n  // Render the badge component separately for aligned layout\n  const render_badge = () => {\n    if (!field.field_info.badge) return null;\n    return (\n      <span\n        className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n        style={{\n          backgroundColor: \"#111827\",\n          color: \"#ffffff\",\n          minWidth: \"24px\",\n        }}\n      >\n        {field.field_info.badge}\n      </span>\n    );\n  };\n\n  // Render the label component\n  const render_label = () => (\n    <div className=\"cls_label_row flex items-center gap-2\">\n      {field.field_info.item_code && (\n        <span\n          className=\"cls_item_code_box inline-flex items-center justify-center px-1.5 py-0.5 border text-xs font-mono\"\n          style={{\n            borderColor: config.item_code_border_color,\n            backgroundColor: config.item_code_background,\n            fontSize: config.item_code_font_size,\n          }}\n        >\n          {field.field_info.item_code}\n        </span>\n      )}\n      <Label\n        htmlFor={field.id}\n        className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n        style={{\n          color: config.label_color,\n          fontFamily: config.label_font_family,\n          fontSize: config.label_font_size,\n          fontWeight: config.label_font_weight,\n        }}\n      >\n        {field.label}\n        {is_required && (\n          <span\n            className=\"cls_required_asterisk ml-1\"\n            style={{ color: config.label_color_required }}\n          >\n            *\n          </span>\n        )}\n      </Label>\n      {/* Only render badge inline with label if NOT using aligned layout */}\n      {!use_aligned_badge && field.field_info.badge && (\n        <span\n          className=\"cls_field_badge inline-flex items-center justify-center px-2 py-0.5 text-xs font-bold rounded\"\n          style={{\n            backgroundColor: \"#111827\",\n            color: \"#ffffff\",\n            minWidth: \"24px\",\n          }}\n        >\n          {field.field_info.badge}\n        </span>\n      )}\n    </div>\n  );\n\n  // Render the file manager column (shows unified button with badge for total file count)\n  const render_file_column = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return (\n        <div\n          className=\"cls_file_column flex-shrink-0\"\n          style={{ width: config.file_manager.button_column_width }}\n        />\n      );\n    }\n\n    return (\n      <div\n        className=\"cls_file_column flex-shrink-0 flex items-center justify-center\"\n        style={{ width: config.file_manager.button_column_width }}\n      >\n        <FileManagerButton\n          file_count={total_count}\n          has_files={has_files}\n          on_click={handle_click || (() => {})}\n          config={config}\n          disabled={!handle_click}\n        />\n      </div>\n    );\n  };\n\n  // Render the input/value component\n  const render_field = () => (\n    <>\n      {is_view ? (\n        <div\n          className={cn(\n            \"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\",\n            is_inline && \"justify-end\"\n          )}\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {get_display_value()}\n        </div>\n      ) : (\n        <div className=\"relative\">\n          <Input\n            id={field.id}\n            type=\"number\"\n            value={get_input_value()}\n            onChange={handle_change}\n            onBlur={on_blur}\n            placeholder={field.field_info.placeholder || \"0\"}\n            disabled={field.field_info.disabled}\n            min={field.field_info.min ?? 0}\n            max={field.field_info.max ?? 100}\n            step={Math.pow(10, -decimal_places)}\n            className={cn(\n              \"cls_percentage_input pr-7\",\n              is_inline && \"text-right\",\n              error && \"cls_input_error border-destructive\"\n            )}\n            style={{\n              fontFamily: config.field_font_family,\n              fontSize: config.field_font_size,\n              borderColor: error ? config.error_color : undefined,\n              backgroundColor: field.field_info.disabled\n                ? config.field_background_color_disabled\n                : config.field_background_color,\n            }}\n          />\n          <span\n            className=\"absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground\"\n            style={{ fontFamily: config.field_font_family }}\n          >\n            {percentage_suffix}\n          </span>\n        </div>\n      )}\n    </>\n  );\n\n  // Inline layout: label and field on same row\n  if (is_inline) {\n    // Determine value width (use field-level value_width, or provided value_column_width, or default)\n    const effective_value_width = field.value_width || value_column_width || \"150px\";\n\n    return (\n      <div className=\"cls_field_container cls_percentage_field cls_inline_layout w-full\">\n        <div className=\"flex items-center gap-4\">\n          {/* Label section - takes remaining space */}\n          <div className=\"flex-grow min-w-0\">{render_label()}</div>\n          {/* Badge column - fixed width when aligned */}\n          {use_aligned_badge && (\n            <div\n              className=\"cls_badge_column flex-shrink-0 flex items-center justify-center\"\n              style={{ width: badge_column_width }}\n            >\n              {render_badge()}\n            </div>\n          )}\n          {/* Value column - fixed width */}\n          <div\n            className=\"flex-shrink-0\"\n            style={{ width: effective_value_width }}\n          >\n            {render_field()}\n          </div>\n          {/* Doc link column - always reserves space for alignment */}\n          {render_file_column()}\n        </div>\n        {error && (\n          <p\n            className=\"cls_error_message mt-1 text-sm text-right\"\n            style={{ color: config.error_color }}\n          >\n            {error}\n          </p>\n        )}\n        {field.reference_value && <ReferenceValue value={field.reference_value} />}\n      </div>\n    );\n  }\n\n  // Stacked layout (default): label above field\n  return (\n    <div className=\"cls_field_container cls_percentage_field w-full\">\n      <div style={{ marginBottom: config.label_field_gap }}>\n        {render_label()}\n      </div>\n      <div className=\"flex items-center gap-2\">\n        <div className=\"flex-grow min-w-0\">\n          {render_field()}\n        </div>\n        {render_file_column()}\n      </div>\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface TextareaProps\n  extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n  ({ className, ...props }, ref) => {\n    return (\n      <textarea\n        className={cn(\n          \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      />\n    );\n  }\n);\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Textarea } from \"../ui/textarea\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Textarea Field Renderer\n * Handles multi-line text input\n */\nexport function TextareaField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const string_value = value !== undefined && value !== null ? String(value) : \"\";\n  const rows = field.field_info.rows ?? 3;\n\n  // Render the file manager button (shows unified button with badge for total file count)\n  const render_file_button = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return null;\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return null;\n    }\n\n    return (\n      <FileManagerButton\n        file_count={total_count}\n        has_files={has_files}\n        on_click={handle_click || (() => {})}\n        config={config}\n        disabled={!handle_click}\n      />\n    );\n  };\n\n  return (\n    <div className=\"cls_field_container cls_textarea_field w-full\">\n      <div\n        className=\"cls_label_row flex items-center gap-2\"\n        style={{ marginBottom: config.label_field_gap }}\n      >\n        <Label\n          htmlFor={field.id}\n          className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n          style={{\n            color: config.label_color,\n            fontFamily: config.label_font_family,\n            fontSize: config.label_font_size,\n            fontWeight: config.label_font_weight,\n          }}\n        >\n          {field.label}\n          {is_required && (\n            <span\n              className=\"cls_required_asterisk ml-1\"\n              style={{ color: config.label_color_required }}\n            >\n              *\n            </span>\n          )}\n        </Label>\n        {render_file_button()}\n      </div>\n\n      {is_view ? (\n        <div\n          className=\"cls_field_value_display py-2 px-3 rounded-md min-h-[80px] whitespace-pre-wrap\"\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {string_value || \"-\"}\n        </div>\n      ) : (\n        <Textarea\n          id={field.id}\n          value={string_value}\n          onChange={(e) => on_change(e.target.value)}\n          onBlur={on_blur}\n          placeholder={field.field_info.placeholder}\n          disabled={field.field_info.disabled}\n          minLength={field.field_info.min_length}\n          maxLength={field.field_info.max_length}\n          rows={rows}\n          className={cn(\n            \"cls_textarea_input\",\n            error && \"cls_input_error border-destructive\"\n          )}\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          }}\n        />\n      )}\n\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  variant?:\n    | \"default\"\n    | \"destructive\"\n    | \"outline\"\n    | \"secondary\"\n    | \"ghost\"\n    | \"link\";\n  size?: \"default\" | \"sm\" | \"lg\" | \"icon\";\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ className, variant = \"default\", size = \"default\", ...props }, ref) => {\n    const variant_classes = {\n      default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n      destructive:\n        \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n      outline:\n        \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n      secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n      ghost: \"hover:bg-accent hover:text-accent-foreground\",\n      link: \"text-primary underline-offset-4 hover:underline\",\n    };\n\n    const size_classes = {\n      default: \"h-10 px-4 py-2\",\n      sm: \"h-9 rounded-md px-3\",\n      lg: \"h-11 rounded-md px-8\",\n      icon: \"h-10 w-10\",\n    };\n\n    return (\n      <button\n        className={cn(\n          \"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n          variant_classes[variant],\n          size_classes[size],\n          className\n        )}\n        ref={ref}\n        {...props}\n      />\n    );\n  }\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport { cn } from \"../../lib/utils\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\nconst AlertDialogOverlay = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Overlay\n    className={cn(\n      \"cls_alert_dialog_overlay fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n    ref={ref}\n  />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\nconst AlertDialogContent = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPortal>\n    <AlertDialogOverlay />\n    <AlertDialogPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"cls_alert_dialog_content fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n        className\n      )}\n      {...props}\n    />\n  </AlertDialogPortal>\n));\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"cls_alert_dialog_header flex flex-col space-y-2 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"cls_alert_dialog_footer flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Title\n    ref={ref}\n    className={cn(\n      \"cls_alert_dialog_title text-lg font-semibold\",\n      className\n    )}\n    {...props}\n  />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogDescription = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Description\n    ref={ref}\n    className={cn(\n      \"cls_alert_dialog_description text-sm text-muted-foreground\",\n      className\n    )}\n    {...props}\n  />\n));\nAlertDialogDescription.displayName =\n  AlertDialogPrimitive.Description.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Action>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Action\n    ref={ref}\n    className={cn(\n      \"cls_alert_dialog_action inline-flex h-10 items-center justify-center rounded-md bg-destructive px-4 py-2 text-sm font-semibold text-destructive-foreground transition-colors hover:bg-destructive/90 focus:outline-none focus:ring-2 focus:ring-destructive focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n      className\n    )}\n    {...props}\n  />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Cancel\n    ref={ref}\n    className={cn(\n      \"cls_alert_dialog_cancel inline-flex h-10 items-center justify-center rounded-md border border-border bg-background px-4 py-2 text-sm font-medium text-foreground transition-colors hover:bg-muted focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 sm:mt-0\",\n      className\n    )}\n    {...props}\n  />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n  AlertDialog,\n  AlertDialogPortal,\n  AlertDialogOverlay,\n  AlertDialogTrigger,\n  AlertDialogContent,\n  AlertDialogHeader,\n  AlertDialogFooter,\n  AlertDialogTitle,\n  AlertDialogDescription,\n  AlertDialogAction,\n  AlertDialogCancel,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaFilePdf, FaFileImage, FaFileWord, FaFile, FaTimes, FaPlus, FaUpload } from \"react-icons/fa\";\nimport { cn } from \"../../lib/utils\";\nimport {\n  AlertDialog,\n  AlertDialogAction,\n  AlertDialogCancel,\n  AlertDialogContent,\n  AlertDialogDescription,\n  AlertDialogFooter,\n  AlertDialogHeader,\n  AlertDialogTitle,\n  AlertDialogTrigger,\n} from \"../ui/alert_dialog\";\nimport type { FileListProps, FileItem, UploadProgress } from \"./types\";\nimport type { DocLinkType } from \"../../lib/types\";\n\n/**\n * Get icon component for file type\n */\nfunction get_type_icon(type: DocLinkType) {\n  switch (type) {\n    case \"pdf\":\n      return FaFilePdf;\n    case \"image\":\n      return FaFileImage;\n    case \"document\":\n      return FaFileWord;\n    default:\n      return FaFile;\n  }\n}\n\n/**\n * Individual file item in the list\n */\nfunction FileListItem({\n  file,\n  is_selected,\n  on_click,\n  deletable,\n  on_delete,\n  delete_in_progress,\n}: {\n  file: FileItem;\n  is_selected: boolean;\n  on_click: () => void;\n  deletable?: boolean;\n  on_delete?: () => void;\n  delete_in_progress?: boolean;\n}) {\n  const [is_hovered, set_is_hovered] = React.useState(false);\n  const [show_delete_dialog, set_show_delete_dialog] = React.useState(false);\n  const IconComponent = get_type_icon(file.type);\n\n  // Truncate long filenames\n  const display_name =\n    file.filename.length > 25\n      ? `${file.filename.substring(0, 22)}...`\n      : file.filename;\n\n  const handle_delete_click = (e: React.MouseEvent) => {\n    e.stopPropagation();\n    set_show_delete_dialog(true);\n  };\n\n  const handle_confirm_delete = () => {\n    on_delete?.();\n    set_show_delete_dialog(false);\n  };\n\n  return (\n    <div\n      className=\"cls_file_list_item_wrapper relative\"\n      onMouseEnter={() => set_is_hovered(true)}\n      onMouseLeave={() => set_is_hovered(false)}\n    >\n      <button\n        type=\"button\"\n        onClick={on_click}\n        disabled={delete_in_progress}\n        className={cn(\n          \"cls_file_list_item flex items-center gap-2 px-3 py-2 rounded-md text-sm\",\n          \"border transition-colors whitespace-nowrap\",\n          is_selected\n            ? \"bg-primary/10 border-primary/50 text-primary\"\n            : \"bg-background border-border text-foreground hover:bg-muted\",\n          delete_in_progress && \"opacity-50\"\n        )}\n        title={file.filename}\n      >\n        <IconComponent\n          size={16}\n          className={is_selected ? \"text-primary\" : \"text-muted-foreground\"}\n        />\n        <span>{display_name}</span>\n        {file.page && (\n          <span className=\"text-xs text-muted-foreground\">p.{file.page}</span>\n        )}\n      </button>\n\n      {/* Delete button - shows on hover when deletable */}\n      {deletable && is_hovered && !delete_in_progress && (\n        <button\n          type=\"button\"\n          onClick={handle_delete_click}\n          className=\"cls_file_delete_btn absolute -top-1 -right-1 w-5 h-5 bg-destructive text-destructive-foreground rounded-full flex items-center justify-center hover:bg-destructive/90 transition-colors shadow-sm\"\n          title=\"Remove file\"\n        >\n          <FaTimes size={10} />\n        </button>\n      )}\n\n      {/* Delete confirmation dialog */}\n      <AlertDialog open={show_delete_dialog} onOpenChange={set_show_delete_dialog}>\n        <AlertDialogContent>\n          <AlertDialogHeader>\n            <AlertDialogTitle>Remove file?</AlertDialogTitle>\n            <AlertDialogDescription>\n              Are you sure you want to remove &quot;{file.filename}&quot;? This action cannot be undone.\n            </AlertDialogDescription>\n          </AlertDialogHeader>\n          <AlertDialogFooter>\n            <AlertDialogAction onClick={handle_confirm_delete}>\n              Remove\n            </AlertDialogAction>\n            <AlertDialogCancel>Cancel</AlertDialogCancel>\n          </AlertDialogFooter>\n        </AlertDialogContent>\n      </AlertDialog>\n\n      {/* Loading indicator during deletion */}\n      {delete_in_progress && (\n        <div className=\"absolute inset-0 flex items-center justify-center bg-background/50 rounded-md\">\n          <div className=\"w-4 h-4 border-2 border-border border-t-foreground rounded-full animate-spin\" />\n        </div>\n      )}\n    </div>\n  );\n}\n\n/**\n * Compact upload progress display\n */\nfunction UploadProgressDisplay({ progress }: { progress: UploadProgress[] }) {\n  if (progress.length === 0) return null;\n\n  return (\n    <div className=\"cls_upload_progress_inline px-2 pb-2 space-y-1\">\n      {progress.map((item, index) => (\n        <div\n          key={`${item.filename}-${index}`}\n          className={cn(\n            \"flex items-center gap-2 px-2 py-1 rounded text-xs\",\n            item.status === \"uploading\" && \"bg-primary/10 text-primary\",\n            item.status === \"success\" && \"bg-primary/10 text-primary\",\n            item.status === \"error\" && \"bg-destructive/10 text-destructive\"\n          )}\n        >\n          <span className=\"font-medium truncate flex-1\">{item.filename}</span>\n          {item.status === \"uploading\" && (\n            <span className=\"text-primary animate-pulse\">Uploading...</span>\n          )}\n          {item.status === \"success\" && <span>Uploaded</span>}\n          {item.status === \"error\" && (\n            <span className=\"text-destructive\">{item.error || \"Failed\"}</span>\n          )}\n        </div>\n      ))}\n    </div>\n  );\n}\n\n/**\n * FileList Component\n * Horizontal scrollable list of files with integrated dropzone functionality\n */\nexport function FileList({\n  files,\n  selected_index,\n  on_select,\n  on_delete,\n  upload_enabled,\n  show_add_button,\n  config,\n  on_files_dropped,\n  drag_drop_enabled,\n  accept_types,\n  is_uploading,\n  upload_progress,\n}: FileListProps) {\n  const [delete_in_progress, set_delete_in_progress] = React.useState<string | null>(null);\n  const [is_dragging, set_is_dragging] = React.useState(false);\n  const file_input_ref = React.useRef<HTMLInputElement>(null);\n  const drag_counter = React.useRef(0);\n\n  const handle_delete = async (file: FileItem) => {\n    if (!on_delete || !file.file_id) return;\n\n    set_delete_in_progress(file.file_id);\n    try {\n      await on_delete(file.file_id);\n    } finally {\n      set_delete_in_progress(null);\n    }\n  };\n\n  // Drag event handlers\n  const handle_drag_enter = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    if (!drag_drop_enabled) return;\n\n    drag_counter.current++;\n    if (e.dataTransfer.items && e.dataTransfer.items.length > 0) {\n      set_is_dragging(true);\n    }\n  };\n\n  const handle_drag_leave = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    if (!drag_drop_enabled) return;\n\n    drag_counter.current--;\n    if (drag_counter.current === 0) {\n      set_is_dragging(false);\n    }\n  };\n\n  const handle_drag_over = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n  };\n\n  const handle_drop = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(false);\n    drag_counter.current = 0;\n\n    if (!drag_drop_enabled || !on_files_dropped) return;\n\n    if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n      on_files_dropped(Array.from(e.dataTransfer.files));\n    }\n  };\n\n  const handle_file_select = (e: React.ChangeEvent<HTMLInputElement>) => {\n    if (!on_files_dropped) return;\n\n    if (e.target.files && e.target.files.length > 0) {\n      on_files_dropped(Array.from(e.target.files));\n    }\n    e.target.value = \"\";\n  };\n\n  const handle_add_click = () => {\n    file_input_ref.current?.click();\n  };\n\n  return (\n    <div\n      className={cn(\n        \"cls_file_list transition-all duration-200\",\n        is_dragging && \"bg-primary/10\"\n      )}\n      onDragEnter={handle_drag_enter}\n      onDragLeave={handle_drag_leave}\n      onDragOver={handle_drag_over}\n      onDrop={handle_drop}\n    >\n      {/* Hidden file input */}\n      {drag_drop_enabled && (\n        <input\n          ref={file_input_ref}\n          type=\"file\"\n          multiple\n          accept={accept_types}\n          onChange={handle_file_select}\n          className=\"hidden\"\n        />\n      )}\n\n      {/* Dropzone overlay when dragging */}\n      {is_dragging ? (\n        <div className=\"cls_dropzone_overlay flex items-center justify-center gap-2 p-4 border-2 border-dashed border-primary rounded-md m-2 bg-primary/10\">\n          <FaUpload className=\"text-primary\" size={20} />\n          <span className=\"text-sm text-primary font-medium\">\n            Drop files here...\n          </span>\n        </div>\n      ) : (\n        <>\n          {/* Normal file list */}\n          <div className=\"flex gap-2 p-2 overflow-x-auto items-center\">\n            {files.map((file, index) => (\n              <FileListItem\n                key={file.id}\n                file={file}\n                is_selected={index === selected_index}\n                on_click={() => on_select(index)}\n                deletable={upload_enabled && file.source === \"upload\" && !!file.file_id && !!on_delete}\n                on_delete={() => handle_delete(file)}\n                delete_in_progress={delete_in_progress === file.file_id}\n              />\n            ))}\n\n            {/* Add file button - opens file picker directly */}\n            {show_add_button && drag_drop_enabled && (\n              <button\n                type=\"button\"\n                onClick={handle_add_click}\n                disabled={is_uploading}\n                className={cn(\n                  \"cls_add_file_btn flex items-center gap-1 px-3 py-2 rounded-md text-sm\",\n                  \"border border-dashed transition-colors whitespace-nowrap\",\n                  \"border-border text-muted-foreground hover:border-primary hover:bg-primary/10 hover:text-primary\",\n                  is_uploading && \"opacity-50 cursor-not-allowed\"\n                )}\n              >\n                <FaPlus size={12} />\n                <span>Add file</span>\n              </button>\n            )}\n          </div>\n\n          {/* Upload progress display */}\n          {upload_progress && upload_progress.length > 0 && (\n            <UploadProgressDisplay progress={upload_progress} />\n          )}\n        </>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\n/**\n * hazo_pdf Re-exports Module\n *\n * This module provides async access to hazo_pdf conversion utilities.\n * Using dynamic imports ensures hazo_pdf remains optional and is only\n * loaded when conversion features are actually needed.\n */\n\n/**\n * Supported image MIME types for conversion\n */\nexport type SupportedImageType = 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp';\n\n/**\n * Supported text MIME types for conversion\n */\nexport type SupportedTextType = 'text/plain' | 'text/markdown' | 'text/csv';\n\n/**\n * Supported Excel MIME types for conversion\n */\nexport type SupportedExcelType =\n  | 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n  | 'application/vnd.ms-excel'\n  | 'application/vnd.google-apps.spreadsheet';\n\n/**\n * All supported MIME types for conversion\n */\nexport type SupportedConversionType = SupportedImageType | SupportedTextType | SupportedExcelType;\n\n/**\n * PDF conversion options\n */\nexport interface PdfConversionOptions {\n  /** Page size: 'letter' (612x792), 'a4' (595x842), 'legal' (612x1008) */\n  page_size?: 'letter' | 'a4' | 'legal';\n  /** Image quality 0.0-1.0 for lossy compression (default: 0.85) */\n  image_quality?: number;\n  /** How image fits on page: 'fit' (preserve aspect), 'fill' (crop), 'stretch' */\n  image_fit?: 'fit' | 'fill' | 'stretch';\n  /** Margin in points (72 points = 1 inch, default: 36) */\n  margin?: number;\n  /** Font size for text files in points (default: 12) */\n  font_size?: number;\n  /** Line height multiplier for text files (default: 1.4) */\n  line_height?: number;\n}\n\n/**\n * Result from PDF conversion operations\n */\nexport interface ConversionResult {\n  /** Whether conversion succeeded */\n  success: boolean;\n  /** Converted PDF as Uint8Array (if success) */\n  pdf_bytes?: Uint8Array;\n  /** Original filename without extension */\n  original_name?: string;\n  /** Generated PDF filename */\n  pdf_filename?: string;\n  /** Original file type that was converted */\n  source_type?: 'image' | 'text' | 'excel';\n  /** Number of pages in the resulting PDF */\n  page_count?: number;\n  /** Error message (if !success) */\n  error?: string;\n}\n\n/**\n * Conversion utilities from hazo_pdf\n */\nexport interface HazoPdfConversionUtils {\n  /**\n   * Convert a file to PDF (auto-detects type)\n   * @param file - The file to convert\n   * @param filename - Original filename (used for output naming)\n   * @param options - Conversion options\n   * @returns Promise<ConversionResult>\n   */\n  convert_to_pdf: (\n    file: File | Blob,\n    filename: string,\n    options?: PdfConversionOptions\n  ) => Promise<ConversionResult>;\n\n  /**\n   * Convert image bytes to PDF\n   * @param image_bytes - Raw image data as Uint8Array\n   * @param mime_type - Image MIME type\n   * @param filename - Original filename\n   * @param options - Conversion options\n   * @returns Promise<ConversionResult>\n   */\n  convert_image_to_pdf: (\n    image_bytes: Uint8Array,\n    mime_type: SupportedImageType,\n    filename: string,\n    options?: PdfConversionOptions\n  ) => Promise<ConversionResult>;\n\n  /**\n   * Convert text content to PDF\n   * @param text_content - Text string to convert\n   * @param filename - Original filename\n   * @param options - Conversion options\n   * @returns Promise<ConversionResult>\n   */\n  convert_text_to_pdf: (\n    text_content: string,\n    filename: string,\n    options?: PdfConversionOptions\n  ) => Promise<ConversionResult>;\n\n  /**\n   * Convert Excel spreadsheet to PDF\n   * @param excel_bytes - Raw Excel data as Uint8Array\n   * @param filename - Original filename\n   * @param options - Conversion options\n   * @returns Promise<ConversionResult>\n   */\n  convert_excel_to_pdf: (\n    excel_bytes: Uint8Array,\n    filename: string,\n    options?: PdfConversionOptions\n  ) => Promise<ConversionResult>;\n\n  /**\n   * Check if a MIME type can be converted to PDF\n   * @param mime_type - The MIME type to check\n   * @returns boolean - Whether conversion is supported\n   */\n  can_convert_to_pdf: (mime_type: string) => boolean;\n\n  /**\n   * Check if a MIME type is an image type\n   * @param mime_type - The MIME type to check\n   * @returns boolean\n   */\n  is_image_type: (mime_type: string) => boolean;\n\n  /**\n   * Check if a MIME type is a text type\n   * @param mime_type - The MIME type to check\n   * @returns boolean\n   */\n  is_text_type: (mime_type: string) => boolean;\n\n  /**\n   * Check if a MIME type is an Excel type\n   * @param mime_type - The MIME type to check\n   * @returns boolean\n   */\n  is_excel_type: (mime_type: string) => boolean;\n\n  /**\n   * Get all supported MIME types for conversion\n   * @returns Array of supported MIME types\n   */\n  get_supported_types: () => string[];\n}\n\n/**\n * Dynamically load hazo_pdf conversion utilities\n *\n * @example\n * ```typescript\n * const utils = await get_hazo_pdf_conversion_utils();\n * if (utils.can_convert_to_pdf(file.type)) {\n *   const result = await utils.convert_to_pdf(file, file.name);\n *   if (result.success && result.pdf_bytes) {\n *     // Use result.pdf_bytes\n *   }\n * }\n * ```\n *\n * @returns Promise<HazoPdfConversionUtils> - The conversion utilities\n * @throws Error if hazo_pdf is not installed\n */\nexport async function get_hazo_pdf_conversion_utils(): Promise<HazoPdfConversionUtils> {\n  try {\n    const hazo_pdf = await import(/* webpackChunkName: \"hazo_pdf\" */ \"hazo_pdf\");\n\n    return {\n      convert_to_pdf: hazo_pdf.convert_to_pdf,\n      convert_image_to_pdf: hazo_pdf.convert_image_to_pdf,\n      convert_text_to_pdf: hazo_pdf.convert_text_to_pdf,\n      convert_excel_to_pdf: hazo_pdf.convert_excel_to_pdf,\n      can_convert_to_pdf: hazo_pdf.can_convert_to_pdf,\n      is_image_type: hazo_pdf.is_image_type,\n      is_text_type: hazo_pdf.is_text_type,\n      is_excel_type: hazo_pdf.is_excel_type,\n      get_supported_types: hazo_pdf.get_supported_types,\n    };\n  } catch (error) {\n    throw new Error(\n      \"hazo_pdf is not installed. Please install it to use conversion features: npm install hazo_pdf\"\n    );\n  }\n}\n\n/**\n * Check if hazo_pdf is available\n *\n * @example\n * ```typescript\n * const available = await is_hazo_pdf_available();\n * if (available) {\n *   // Safe to use conversion features\n * }\n * ```\n *\n * @returns Promise<boolean> - Whether hazo_pdf is installed and available\n */\nexport async function is_hazo_pdf_available(): Promise<boolean> {\n  try {\n    await import(/* webpackChunkName: \"hazo_pdf\" */ \"hazo_pdf\");\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Supported MIME types for conversion (static list for quick checks)\n * These match the types supported by hazo_pdf v1.4.0\n */\nexport const CONVERTIBLE_MIME_TYPES = {\n  image: [\n    \"image/jpeg\",\n    \"image/png\",\n    \"image/gif\",\n    \"image/webp\",\n  ],\n  text: [\n    \"text/plain\",\n    \"text/markdown\",\n    \"text/csv\",\n  ],\n  excel: [\n    \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n    \"application/vnd.ms-excel\",\n    \"application/vnd.google-apps.spreadsheet\",\n  ],\n} as const;\n\n/** Type for all convertible MIME types */\nexport type ConvertibleMimeType =\n  | (typeof CONVERTIBLE_MIME_TYPES.image)[number]\n  | (typeof CONVERTIBLE_MIME_TYPES.text)[number]\n  | (typeof CONVERTIBLE_MIME_TYPES.excel)[number];\n\n/**\n * Quick check if a MIME type can potentially be converted (without loading hazo_pdf)\n * Use this for UI decisions before actually attempting conversion.\n *\n * @param mime_type - The MIME type to check\n * @returns boolean - Whether the type is potentially convertible\n */\nexport function is_potentially_convertible(mime_type: string): boolean {\n  const all_types: readonly string[] = [\n    ...CONVERTIBLE_MIME_TYPES.image,\n    ...CONVERTIBLE_MIME_TYPES.text,\n    ...CONVERTIBLE_MIME_TYPES.excel,\n  ];\n  return all_types.includes(mime_type);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaDownload, FaExternalLinkAlt, FaFilePdf, FaSpinner } from \"react-icons/fa\";\nimport { Button } from \"../ui/button\";\nimport type { FileViewerProps, FileItem } from \"./types\";\nimport type { PdfViewerProps } from \"../hazo_data_form/types\";\nimport { is_potentially_convertible, get_hazo_pdf_conversion_utils } from \"../../lib/hazo_pdf_exports\";\n\n/**\n * Empty state when no files\n */\nfunction EmptyState({ upload_enabled }: { upload_enabled?: boolean }) {\n  return (\n    <div className=\"flex items-center justify-center h-full p-4 text-center text-muted-foreground\">\n      <div>\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          width=\"48\"\n          height=\"48\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className=\"mx-auto mb-4 text-muted-foreground/50\"\n        >\n          <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\n          <polyline points=\"14 2 14 8 20 8\" />\n        </svg>\n        <p className=\"text-sm text-muted-foreground\">No files yet</p>\n        {upload_enabled && (\n          <p className=\"text-xs text-muted-foreground/80 mt-1\">\n            Click \"Add file\" to upload\n          </p>\n        )}\n      </div>\n    </div>\n  );\n}\n\n/**\n * Error state for missing PDF\n */\nfunction ErrorState({\n  message,\n  filename,\n  deletable,\n  on_delete,\n}: {\n  message: string;\n  filename: string;\n  deletable?: boolean;\n  on_delete?: () => void;\n}) {\n  const is_404 = message.includes(\"404\");\n\n  return (\n    <div className=\"flex items-center justify-center h-full p-4 text-center text-muted-foreground\">\n      <div>\n        <svg\n          xmlns=\"http://www.w3.org/2000/svg\"\n          width=\"48\"\n          height=\"48\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n          className=\"mx-auto mb-4 text-muted-foreground\"\n        >\n          <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\n          <polyline points=\"14 2 14 8 20 8\" />\n          <line x1=\"9\" x2=\"15\" y1=\"15\" y2=\"15\" />\n        </svg>\n        <p className=\"text-sm text-foreground/80\">\n          {is_404 ? `Missing PDF \"${filename}\".` : message}\n        </p>\n        {is_404 && (\n          <p className=\"text-xs mt-2 text-muted-foreground/80\">\n            The file may have been deleted or moved.\n          </p>\n        )}\n        {deletable && on_delete && (\n          <button\n            type=\"button\"\n            onClick={on_delete}\n            className=\"mt-4 px-3 py-1.5 text-sm bg-destructive/10 text-destructive rounded-md hover:bg-destructive/20 transition-colors\"\n          >\n            Remove this file reference\n          </button>\n        )}\n      </div>\n    </div>\n  );\n}\n\n/**\n * Image preview component with optional PDF conversion\n */\nfunction ImageViewer({\n  file,\n  enable_conversion,\n  on_convert_to_pdf,\n  is_converting,\n}: {\n  file: FileItem;\n  enable_conversion?: boolean;\n  on_convert_to_pdf?: () => void;\n  is_converting?: boolean;\n}) {\n  const handle_open = () => {\n    window.open(file.url, \"_blank\");\n  };\n\n  return (\n    <div className=\"cls_file_viewer_image flex flex-col items-center justify-center h-full p-4\">\n      <img\n        src={file.url}\n        alt={file.filename}\n        className=\"max-w-full max-h-[70%] object-contain rounded border\"\n      />\n      <div className=\"mt-4 flex gap-2\">\n        <Button variant=\"outline\" onClick={handle_open}>\n          <FaExternalLinkAlt className=\"mr-2\" size={14} />\n          Open in New Tab\n        </Button>\n        {enable_conversion && on_convert_to_pdf && (\n          <Button\n            variant=\"outline\"\n            onClick={on_convert_to_pdf}\n            disabled={is_converting}\n          >\n            {is_converting ? (\n              <>\n                <FaSpinner className=\"mr-2 animate-spin\" size={14} />\n                Converting...\n              </>\n            ) : (\n              <>\n                <FaFilePdf className=\"mr-2\" size={14} />\n                Convert to PDF\n              </>\n            )}\n          </Button>\n        )}\n      </div>\n    </div>\n  );\n}\n\n/**\n * Download prompt for non-viewable files with optional PDF conversion\n */\nfunction DownloadViewer({\n  file,\n  enable_conversion,\n  on_convert_to_pdf,\n  is_converting,\n}: {\n  file: FileItem;\n  enable_conversion?: boolean;\n  on_convert_to_pdf?: () => void;\n  is_converting?: boolean;\n}) {\n  const handle_download = () => {\n    window.open(file.url, \"_blank\");\n  };\n\n  return (\n    <div className=\"cls_file_viewer_download flex flex-col items-center justify-center h-full p-8 text-center\">\n      <div className=\"w-16 h-16 mb-4 rounded-full bg-muted flex items-center justify-center\">\n        <FaDownload size={24} className=\"text-muted-foreground\" />\n      </div>\n      <h3 className=\"text-lg font-medium text-foreground mb-2\">{file.filename}</h3>\n      <p className=\"text-sm text-muted-foreground mb-6\">\n        {enable_conversion\n          ? \"This file can be converted to PDF for viewing, or downloaded directly.\"\n          : \"This file type cannot be previewed. Click below to download or open.\"}\n      </p>\n      <div className=\"flex gap-2\">\n        {enable_conversion && on_convert_to_pdf && (\n          <Button\n            onClick={on_convert_to_pdf}\n            disabled={is_converting}\n          >\n            {is_converting ? (\n              <>\n                <FaSpinner className=\"mr-2 animate-spin\" size={14} />\n                Converting...\n              </>\n            ) : (\n              <>\n                <FaFilePdf className=\"mr-2\" size={14} />\n                Convert to PDF\n              </>\n            )}\n          </Button>\n        )}\n        <Button variant={enable_conversion ? \"outline\" : \"default\"} onClick={handle_download}>\n          <FaDownload className=\"mr-2\" size={14} />\n          Download File\n        </Button>\n      </div>\n    </div>\n  );\n}\n\n/**\n * Get MIME type string for file type detection\n */\nfunction get_mime_type_for_file(file: FileItem): string | null {\n  // Check URL extension for common types\n  const url = file.url.toLowerCase();\n  const extension = url.split(\".\").pop()?.split(\"?\")[0];\n\n  switch (extension) {\n    // Images\n    case \"jpg\":\n    case \"jpeg\":\n      return \"image/jpeg\";\n    case \"png\":\n      return \"image/png\";\n    case \"gif\":\n      return \"image/gif\";\n    case \"webp\":\n      return \"image/webp\";\n    case \"bmp\":\n      return \"image/bmp\";\n    case \"tiff\":\n    case \"tif\":\n      return \"image/tiff\";\n    // Text files\n    case \"txt\":\n      return \"text/plain\";\n    case \"md\":\n      return \"text/markdown\";\n    case \"csv\":\n      return \"text/csv\";\n    case \"html\":\n    case \"htm\":\n      return \"text/html\";\n    case \"json\":\n      return \"application/json\";\n    // Excel files\n    case \"xlsx\":\n      return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\n    case \"xls\":\n      return \"application/vnd.ms-excel\";\n    default:\n      return null;\n  }\n}\n\n/**\n * FileViewer Component\n * Displays preview for the selected file (PDF, image, or download prompt)\n */\nexport function FileViewer({\n  file,\n  config,\n  pdf_viewer_component,\n  file_manager,\n  pdf_save_path,\n  deletable,\n  on_delete,\n  enable_file_conversion = false,\n  on_convert_to_pdf,\n  logger,\n}: FileViewerProps) {\n  // Dynamic PDF viewer loading\n  const [DynamicPdfViewer, set_dynamic_pdf_viewer] =\n    React.useState<React.ComponentType<PdfViewerProps> | null>(null);\n  const [hazo_pdf_error, set_hazo_pdf_error] = React.useState<string | null>(null);\n  const [file_error, set_file_error] = React.useState<string | null>(null);\n\n  // Conversion state\n  const [is_converting, set_is_converting] = React.useState(false);\n  const [conversion_error, set_conversion_error] = React.useState<string | null>(null);\n\n  const PdfViewerComponent = pdf_viewer_component || DynamicPdfViewer;\n\n  // Check if current file is convertible\n  const file_mime_type = file ? get_mime_type_for_file(file) : null;\n  const is_file_convertible = Boolean(\n    enable_file_conversion &&\n    on_convert_to_pdf &&\n    file_mime_type &&\n    is_potentially_convertible(file_mime_type)\n  );\n\n  // Load PDF viewer dynamically\n  React.useEffect(() => {\n    if (file?.type === \"pdf\" && !pdf_viewer_component && !DynamicPdfViewer) {\n      const load_pdf_viewer = async () => {\n        try {\n          const module = await import(/* webpackChunkName: \"hazo_pdf\" */ \"hazo_pdf\");\n          // @ts-ignore - CSS import has no type declarations\n          await import(/* webpackChunkName: \"hazo_pdf_styles\" */ \"hazo_pdf/styles.css\");\n          // Cast to ComponentType since PdfViewer is a ForwardRefExoticComponent\n          set_dynamic_pdf_viewer(() => module.PdfViewer as React.ComponentType<PdfViewerProps>);\n          set_hazo_pdf_error(null);\n        } catch (err) {\n          console.error(\"Failed to load hazo_pdf:\", err);\n          set_hazo_pdf_error(\n            \"hazo_pdf is not installed. Please install it to view PDFs.\"\n          );\n        }\n      };\n      load_pdf_viewer();\n    }\n  }, [file, pdf_viewer_component, DynamicPdfViewer]);\n\n  // Reset errors when file changes\n  React.useEffect(() => {\n    set_file_error(null);\n    set_conversion_error(null);\n  }, [file?.url]);\n\n  // Handle conversion to PDF\n  const handle_convert_to_pdf = React.useCallback(async () => {\n    if (!file || !on_convert_to_pdf || !file_mime_type) return;\n\n    set_is_converting(true);\n    set_conversion_error(null);\n\n    try {\n      // Fetch the file content\n      const response = await fetch(file.url);\n      if (!response.ok) {\n        throw new Error(`Failed to fetch file: ${response.statusText}`);\n      }\n      const blob = await response.blob();\n\n      // Create a File object with proper MIME type\n      const file_obj = new File([blob], file.filename, { type: file_mime_type });\n\n      // Get conversion utilities\n      const utils = await get_hazo_pdf_conversion_utils();\n\n      // Check if conversion is supported (pass MIME type string)\n      if (!utils.can_convert_to_pdf(file_mime_type)) {\n        throw new Error(`File type \"${file_mime_type}\" cannot be converted to PDF`);\n      }\n\n      // Convert to PDF (pass file and filename)\n      const result = await utils.convert_to_pdf(file_obj, file.filename);\n\n      // Check conversion result\n      if (!result.success || !result.pdf_bytes) {\n        throw new Error(result.error || \"Conversion failed\");\n      }\n\n      // Call the callback with the converted PDF bytes\n      on_convert_to_pdf(result.pdf_bytes, file.filename);\n    } catch (error) {\n      console.error(\"Conversion failed:\", error);\n      set_conversion_error(\n        error instanceof Error ? error.message : \"Conversion failed\"\n      );\n    } finally {\n      set_is_converting(false);\n    }\n  }, [file, on_convert_to_pdf, file_mime_type]);\n\n  // Empty state\n  if (!file) {\n    return <EmptyState upload_enabled />;\n  }\n\n  // PDF file\n  if (file.type === \"pdf\") {\n    // hazo_pdf library error\n    if (hazo_pdf_error) {\n      return (\n        <div className=\"flex items-center justify-center h-full p-4 text-center text-muted-foreground\">\n          <div>\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              width=\"48\"\n              height=\"48\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              strokeWidth=\"1\"\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n              className=\"mx-auto mb-4 text-muted-foreground\"\n            >\n              <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\n              <polyline points=\"14 2 14 8 20 8\" />\n              <line x1=\"9\" x2=\"15\" y1=\"15\" y2=\"15\" />\n            </svg>\n            <p className=\"text-sm\">{hazo_pdf_error}</p>\n            <p className=\"text-xs mt-2 text-muted-foreground/80\">Run: npm install hazo_pdf</p>\n          </div>\n        </div>\n      );\n    }\n\n    // File-specific error (e.g., 404)\n    if (file_error) {\n      return (\n        <ErrorState\n          message={file_error}\n          filename={file.filename}\n          deletable={deletable}\n          on_delete={on_delete}\n        />\n      );\n    }\n\n    // Loading PDF viewer\n    if (!PdfViewerComponent) {\n      return (\n        <div className=\"flex items-center justify-center h-full\">\n          <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-foreground\" />\n        </div>\n      );\n    }\n\n    // Render PDF viewer\n    // Build props, conditionally adding logger, file_manager, save_path\n    const viewer_props: PdfViewerProps & { logger?: unknown } = {\n      url: file.url,\n      className: \"h-full w-full\",\n      default_scale: \"page-width\",\n      on_error: (error: Error) => {\n        console.error(\"PDF load error for\", file.url, \":\", error);\n        set_file_error(error.message);\n      },\n      // Pass file_manager and save_path for hazo_pdf 1.6.0 integration\n      file_manager: file_manager,\n      save_path: pdf_save_path,\n    };\n\n    // Add logger if provided (hazo_pdf supports logger prop)\n    if (logger) {\n      viewer_props.logger = logger;\n    }\n\n    return (\n      <div className=\"h-full w-full\">\n        <PdfViewerComponent key={file.url} {...viewer_props} />\n      </div>\n    );\n  }\n\n  // Show conversion error if any\n  const conversion_error_display = conversion_error && (\n    <div className=\"absolute bottom-4 left-4 right-4 bg-destructive/10 text-destructive p-2 rounded text-sm\">\n      {conversion_error}\n    </div>\n  );\n\n  // Image file\n  if (file.type === \"image\") {\n    return (\n      <div className=\"relative h-full\">\n        <ImageViewer\n          file={file}\n          enable_conversion={is_file_convertible}\n          on_convert_to_pdf={handle_convert_to_pdf}\n          is_converting={is_converting}\n        />\n        {conversion_error_display}\n      </div>\n    );\n  }\n\n  // Other file types - download prompt (with conversion for supported types)\n  return (\n    <div className=\"relative h-full\">\n      <DownloadViewer\n        file={file}\n        enable_conversion={is_file_convertible}\n        on_convert_to_pdf={handle_convert_to_pdf}\n        is_converting={is_converting}\n      />\n      {conversion_error_display}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { FaTimes } from \"react-icons/fa\";\nimport { cn } from \"../../lib/utils\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Overlay\n    ref={ref}\n    className={cn(\n      \"cls_dialog_overlay fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n  />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n  <DialogPortal>\n    <DialogOverlay />\n    <DialogPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"cls_dialog_content fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n      <DialogPrimitive.Close className=\"cls_dialog_close absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-muted data-[state=open]:text-muted-foreground\">\n        <FaTimes className=\"h-4 w-4\" />\n        <span className=\"sr-only\">Close</span>\n      </DialogPrimitive.Close>\n    </DialogPrimitive.Content>\n  </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"cls_dialog_header flex flex-col space-y-1.5 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"cls_dialog_footer flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Title\n    ref={ref}\n    className={cn(\n      \"cls_dialog_title text-lg font-semibold leading-none tracking-tight\",\n      className\n    )}\n    {...props}\n  />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Description\n    ref={ref}\n    className={cn(\"cls_dialog_description text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n  Dialog,\n  DialogPortal,\n  DialogOverlay,\n  DialogClose,\n  DialogTrigger,\n  DialogContent,\n  DialogHeader,\n  DialogFooter,\n  DialogTitle,\n  DialogDescription,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogHeader,\n  DialogTitle,\n} from \"../ui/dialog\";\nimport { FileManager } from \"./index\";\nimport type { FileManagerDialogProps } from \"./types\";\n\n/**\n * FileManagerDialog Component\n * Dialog wrapper around FileManager for modal display\n */\nexport function FileManagerDialog({\n  files,\n  is_open,\n  on_close,\n  config,\n  pdf_viewer_component,\n  file_manager,\n  pdf_save_path,\n  upload_enabled,\n  field_label,\n  field_id,\n  on_upload,\n  on_delete,\n  on_popout,\n  class_name,\n  title,\n  // hazo_pdf 1.3.2 features\n  enable_file_conversion,\n  on_file_convert,\n  // Service injection\n  logger,\n}: FileManagerDialogProps) {\n  const fm_config = config.file_manager;\n\n  // Dialog title\n  const dialog_title = title\n    ? title\n    : upload_enabled && field_label\n      ? `Files for \"${field_label}\"`\n      : `Documents (${files.length})`;\n\n  return (\n    <Dialog open={is_open} onOpenChange={(open) => !open && on_close()}>\n      <DialogContent\n        className=\"cls_file_manager_dialog p-0 gap-0 overflow-hidden\"\n        style={{\n          width: fm_config.dialog_width,\n          maxWidth: \"90vw\",\n          maxHeight: fm_config.dialog_max_height,\n        }}\n      >\n        <DialogHeader className=\"sr-only\">\n          <DialogTitle>{dialog_title}</DialogTitle>\n        </DialogHeader>\n        <FileManager\n          files={files}\n          is_open={true}\n          on_close={on_close}\n          display_mode=\"dialog\"\n          config={config}\n          pdf_viewer_component={pdf_viewer_component}\n          file_manager={file_manager}\n          pdf_save_path={pdf_save_path}\n          upload_enabled={upload_enabled}\n          field_label={field_label}\n          field_id={field_id}\n          on_upload={on_upload}\n          on_delete={on_delete}\n          on_popout={on_popout}\n          class_name={class_name}\n          enable_file_conversion={enable_file_conversion}\n          on_file_convert={on_file_convert}\n          logger={logger}\n        />\n      </DialogContent>\n    </Dialog>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaUpload } from \"react-icons/fa\";\nimport { cn, format_file_size, is_mime_type_allowed } from \"../../lib/utils\";\nimport type { FormConfig, FileUploadResult } from \"../../lib/types\";\n\nexport interface UploadProgress {\n  filename: string;\n  progress: number;\n  status: \"uploading\" | \"success\" | \"error\";\n  error?: string;\n}\n\nexport interface UploadZoneProps {\n  config: FormConfig;\n  existing_file_count: number;\n  on_upload: (files: File[]) => Promise<FileUploadResult[]>;\n  on_upload_complete?: () => void;\n}\n\n/**\n * Drag-and-drop upload zone component\n */\nexport function UploadZone({\n  config,\n  existing_file_count,\n  on_upload,\n  on_upload_complete,\n}: UploadZoneProps) {\n  const file_input_ref = React.useRef<HTMLInputElement>(null);\n  const [is_dragging, set_is_dragging] = React.useState(false);\n  const [upload_progress, set_upload_progress] = React.useState<UploadProgress[]>([]);\n  const [is_uploading, set_is_uploading] = React.useState(false);\n\n  const upload_config = config.file_upload;\n\n  const validate_file = (file: File): string | null => {\n    if (!is_mime_type_allowed(file.type, upload_config.allowed_types)) {\n      return `File type \"${file.type}\" is not allowed`;\n    }\n\n    if (file.size > upload_config.max_file_size) {\n      return `File size exceeds maximum of ${format_file_size(upload_config.max_file_size)}`;\n    }\n\n    if (existing_file_count >= upload_config.max_files_per_field) {\n      return `Maximum of ${upload_config.max_files_per_field} files per field`;\n    }\n\n    return null;\n  };\n\n  const handle_files = async (files: FileList | File[]) => {\n    const file_array = Array.from(files);\n    const valid_files: File[] = [];\n    const errors: UploadProgress[] = [];\n\n    for (const file of file_array) {\n      const error = validate_file(file);\n      if (error) {\n        errors.push({\n          filename: file.name,\n          progress: 100,\n          status: \"error\",\n          error,\n        });\n      } else {\n        valid_files.push(file);\n      }\n    }\n\n    if (errors.length > 0) {\n      set_upload_progress(errors);\n    }\n\n    if (valid_files.length === 0) return;\n\n    set_is_uploading(true);\n    const progress_entries: UploadProgress[] = valid_files.map((f) => ({\n      filename: f.name,\n      progress: 0,\n      status: \"uploading\" as const,\n    }));\n    set_upload_progress([...errors, ...progress_entries]);\n\n    try {\n      const results = await on_upload(valid_files);\n\n      const updated_progress: UploadProgress[] = [...errors];\n      results.forEach((result, index) => {\n        const file = valid_files[index];\n        updated_progress.push({\n          filename: file.name,\n          progress: 100,\n          status: result.success ? \"success\" : \"error\",\n          error: result.error,\n        });\n      });\n      set_upload_progress(updated_progress);\n\n      // Clear success messages after a delay\n      setTimeout(() => {\n        set_upload_progress((prev) =>\n          prev.filter((p) => p.status === \"error\")\n        );\n        on_upload_complete?.();\n      }, 1500);\n    } catch (error) {\n      set_upload_progress(\n        valid_files.map((f) => ({\n          filename: f.name,\n          progress: 100,\n          status: \"error\" as const,\n          error: error instanceof Error ? error.message : \"Upload failed\",\n        }))\n      );\n    } finally {\n      set_is_uploading(false);\n    }\n  };\n\n  const handle_drag_over = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(true);\n  };\n\n  const handle_drag_leave = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(false);\n  };\n\n  const handle_drop = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(false);\n\n    if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n      handle_files(e.dataTransfer.files);\n    }\n  };\n\n  const handle_file_select = (e: React.ChangeEvent<HTMLInputElement>) => {\n    if (e.target.files && e.target.files.length > 0) {\n      handle_files(e.target.files);\n    }\n    e.target.value = \"\";\n  };\n\n  const allowed_extensions = upload_config.allowed_types\n    .map((t) => {\n      if (t === \"application/pdf\") return \".pdf\";\n      if (t === \"image/jpeg\") return \".jpg,.jpeg\";\n      if (t === \"image/png\") return \".png\";\n      if (t === \"image/gif\") return \".gif\";\n      if (t === \"image/webp\") return \".webp\";\n      if (t.endsWith(\"/*\")) return t.replace(\"/*\", \"/*\");\n      return \"\";\n    })\n    .filter(Boolean)\n    .join(\",\");\n\n  return (\n    <div className=\"cls_upload_zone p-3 border-t bg-muted\">\n      {/* Drag and drop zone */}\n      <div\n        className={cn(\n          \"cls_upload_dropzone border-2 border-dashed rounded-lg p-4 text-center transition-colors cursor-pointer\",\n          is_dragging\n            ? \"border-primary bg-primary/10\"\n            : \"border-border hover:border-input hover:bg-background\"\n        )}\n        onDragOver={handle_drag_over}\n        onDragLeave={handle_drag_leave}\n        onDrop={handle_drop}\n        onClick={() => file_input_ref.current?.click()}\n      >\n        <input\n          ref={file_input_ref}\n          type=\"file\"\n          multiple\n          accept={allowed_extensions}\n          onChange={handle_file_select}\n          className=\"hidden\"\n        />\n        <FaUpload\n          className={cn(\n            \"mx-auto mb-2\",\n            is_dragging ? \"text-primary\" : \"text-muted-foreground\"\n          )}\n          size={24}\n        />\n        <p className=\"text-sm text-foreground/80\">\n          {is_dragging\n            ? \"Drop files here...\"\n            : \"Drag and drop files here, or click to select\"}\n        </p>\n        <p className=\"text-xs text-muted-foreground mt-1\">\n          Max size: {format_file_size(upload_config.max_file_size)} |\n          Max files: {upload_config.max_files_per_field}\n        </p>\n      </div>\n\n      {/* Upload progress */}\n      {upload_progress.length > 0 && (\n        <div className=\"cls_upload_progress space-y-1 mt-2\">\n          {upload_progress.map((progress, index) => (\n            <div\n              key={`${progress.filename}-${index}`}\n              className={cn(\n                \"p-2 rounded text-xs\",\n                progress.status === \"uploading\" && \"bg-primary/10 text-primary\",\n                progress.status === \"success\" && \"bg-primary/10 text-primary\",\n                progress.status === \"error\" && \"bg-destructive/10 text-destructive\"\n              )}\n            >\n              <span className=\"font-medium\">{progress.filename}</span>\n              {progress.status === \"uploading\" && \" - Uploading...\"}\n              {progress.status === \"success\" && \" - Uploaded\"}\n              {progress.status === \"error\" && ` - ${progress.error}`}\n            </div>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FileManager } from \"./index\";\nimport type { FileManagerPopoutContext } from \"./types\";\nimport type { FormConfig } from \"../../lib/types\";\nimport type { PdfViewerProps } from \"../hazo_data_form/types\";\nimport type { FileManager as HazoFilesFileManager } from \"hazo_files\";\n\n/**\n * Props for the FileManagerPage component\n */\nexport interface FileManagerPageProps {\n  /** Storage key to read context from sessionStorage (default: \"file_viewer_context\") */\n  storage_key?: string;\n\n  /** Or provide context directly instead of reading from storage */\n  context?: FileManagerPopoutContext;\n\n  /** Config for styling */\n  config: FormConfig;\n\n  /** PDF viewer component */\n  pdf_viewer_component?: React.ComponentType<PdfViewerProps>;\n\n  /** File manager instance for save/load operations */\n  file_manager?: HazoFilesFileManager;\n\n  /** Path where PDFs should be saved */\n  pdf_save_path?: string;\n\n  /** Callback when close button is clicked (default: window.close()) */\n  on_close?: () => void;\n\n  /** Render prop for error state */\n  render_error?: (error: string) => React.ReactNode;\n\n  /** Render prop for loading state */\n  render_loading?: () => React.ReactNode;\n\n  /** Optional className for the container */\n  class_name?: string;\n}\n\n/**\n * FileManagerPage Component\n * Drop-in component for building file viewer popout pages.\n * Reads context from sessionStorage and renders the FileManager.\n * Consuming apps can wrap this with their own header/footer/navbar.\n */\nexport function FileManagerPage({\n  storage_key = \"file_viewer_context\",\n  context: provided_context,\n  config,\n  pdf_viewer_component,\n  file_manager,\n  pdf_save_path,\n  on_close,\n  render_error,\n  render_loading,\n  class_name,\n}: FileManagerPageProps) {\n  const [context, set_context] = React.useState<FileManagerPopoutContext | null>(\n    provided_context || null\n  );\n  const [error, set_error] = React.useState<string | null>(null);\n\n  // Read context from sessionStorage on mount\n  React.useEffect(() => {\n    if (provided_context) return; // Skip if context provided as prop\n\n    const stored = sessionStorage.getItem(storage_key);\n    if (stored) {\n      try {\n        set_context(JSON.parse(stored));\n      } catch {\n        set_error(\"Invalid file viewer context\");\n      }\n    } else {\n      set_error(\n        \"No file viewer context found. Please open this page from the file manager.\"\n      );\n    }\n  }, [storage_key, provided_context]);\n\n  // Default close handler closes the window\n  const handle_close = on_close || (() => window.close());\n\n  // Error state\n  if (error) {\n    if (render_error) {\n      return <>{render_error(error)}</>;\n    }\n    return (\n      <div className=\"flex items-center justify-center h-full p-8 text-center\">\n        <div>\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"48\"\n            height=\"48\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth=\"1\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n            className=\"mx-auto mb-4 text-muted-foreground\"\n          >\n            <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\n            <polyline points=\"14 2 14 8 20 8\" />\n            <line x1=\"9\" x2=\"15\" y1=\"15\" y2=\"15\" />\n          </svg>\n          <h2 className=\"text-lg font-semibold text-foreground mb-2\">\n            Unable to load files\n          </h2>\n          <p className=\"text-foreground/80\">{error}</p>\n        </div>\n      </div>\n    );\n  }\n\n  // Loading state\n  if (!context) {\n    if (render_loading) {\n      return <>{render_loading()}</>;\n    }\n    return (\n      <div className=\"flex items-center justify-center h-full\">\n        <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-foreground\" />\n      </div>\n    );\n  }\n\n  // Render FileManager with context\n  return (\n    <div className={class_name || \"h-full\"}>\n      <FileManager\n        files={context.files}\n        is_open={true}\n        on_close={handle_close}\n        display_mode=\"sidebar\"\n        config={config}\n        pdf_viewer_component={pdf_viewer_component}\n        file_manager={file_manager}\n        pdf_save_path={pdf_save_path}\n        field_label={context.field_label}\n        field_id={context.field_id}\n      />\n    </div>\n  );\n}\n","\"use client\";\n\nimport type { DocLink, DocLinkType, FormConfig, FileUploadResult } from \"../../lib/types\";\nimport type { PdfViewerProps } from \"../hazo_data_form/types\";\nimport type { Logger } from \"../../context\";\nimport type { FileManager as HazoFilesFileManager } from \"hazo_files\";\n\n/**\n * Display mode for the file manager\n */\nexport type FileManagerDisplayMode = \"sidebar\" | \"dialog\";\n\n/**\n * Unified file item that can represent either a doc_link or an uploaded file\n */\nexport interface FileItem {\n  /** Unique identifier */\n  id: string;\n  /** Display filename */\n  filename: string;\n  /** File URL */\n  url: string;\n  /** File type for icon selection */\n  type: DocLinkType;\n  /** Source: \"doc_link\" (schema) or \"upload\" (user uploaded) */\n  source: \"doc_link\" | \"upload\";\n  /** Page number for PDFs */\n  page?: number;\n  /** File ID for uploaded files (for deletion) */\n  file_id?: string;\n}\n\n/**\n * Props for the FileManagerButton component\n */\nexport interface FileManagerButtonProps {\n  /** Total count of files (doc_links + uploads) */\n  file_count: number;\n  /** Whether the field has any files */\n  has_files: boolean;\n  /** Click handler */\n  on_click: () => void;\n  /** Configuration */\n  config: FormConfig;\n  /** Additional class name */\n  class_name?: string;\n  /** Tooltip text override */\n  tooltip_text?: string;\n  /** Whether button is disabled (e.g., view mode without files) */\n  disabled?: boolean;\n}\n\n/**\n * Props for the FileManager component\n */\nexport interface FileManagerProps {\n  /** Array of all files (doc_links converted + uploads) */\n  files: FileItem[];\n\n  /** Whether manager is open */\n  is_open: boolean;\n\n  /** Callback to close manager */\n  on_close: () => void;\n\n  /** Display mode */\n  display_mode: FileManagerDisplayMode;\n\n  /** Config for styling */\n  config: FormConfig;\n\n  /** Optional PDF viewer component */\n  pdf_viewer_component?: React.ComponentType<PdfViewerProps>;\n\n  /** File manager instance for save/load operations */\n  file_manager?: HazoFilesFileManager;\n\n  /** Path where PDFs should be saved */\n  pdf_save_path?: string;\n\n  // Upload functionality\n  /** Enable upload UI */\n  upload_enabled?: boolean;\n\n  /** Field label for display */\n  field_label?: string;\n\n  /** Field ID for upload context */\n  field_id?: string;\n\n  /** Upload handler callback */\n  on_upload?: (files: File[]) => Promise<FileUploadResult[]>;\n\n  /** Delete handler callback (only for uploaded files) */\n  on_delete?: (file_id: string) => Promise<boolean>;\n\n  /** Callback when popout button is clicked. Receives full context to reconstruct FileManager. */\n  on_popout?: (context: FileManagerPopoutContext) => void;\n\n  /** Optional className */\n  class_name?: string;\n\n  // File conversion support (new in hazo_pdf 1.3.2)\n  /** Enable file conversion to PDF for supported types */\n  enable_file_conversion?: boolean;\n  /** Callback when a file is converted to PDF */\n  on_file_convert?: (converted_pdf: Uint8Array, original_filename: string) => void;\n\n  // Service injection\n  /** Logger instance (compatible with hazo_logs and hazo_pdf) */\n  logger?: Logger;\n}\n\n/**\n * Props for the FileManagerDialog component\n */\nexport interface FileManagerDialogProps extends Omit<FileManagerProps, \"display_mode\"> {\n  /** Dialog title override */\n  title?: string;\n}\n\n/**\n * Context passed to the popout callback\n * Contains all information needed to reconstruct the FileManager in a new tab\n */\nexport interface FileManagerPopoutContext {\n  /** All files in the file manager */\n  files: FileItem[];\n  /** Currently selected file */\n  selected_file: FileItem;\n  /** Index of the selected file */\n  selected_index: number;\n  /** Field ID (if applicable) */\n  field_id?: string;\n  /** Field label (if applicable) */\n  field_label?: string;\n}\n\n/**\n * Upload progress state for individual files\n */\nexport interface UploadProgress {\n  filename: string;\n  progress: number;\n  status: \"uploading\" | \"success\" | \"error\";\n  error?: string;\n}\n\n/**\n * Props for the FileList component\n */\nexport interface FileListProps {\n  /** List of files to display */\n  files: FileItem[];\n  /** Index of currently selected file */\n  selected_index: number;\n  /** Callback when a file is selected */\n  on_select: (index: number) => void;\n  /** Delete handler (only for uploaded files) */\n  on_delete?: (file_id: string) => Promise<boolean>;\n  /** Whether upload is enabled */\n  upload_enabled?: boolean;\n  /** Whether to show the add button */\n  show_add_button?: boolean;\n  /** Configuration */\n  config: FormConfig;\n\n  // Integrated dropzone functionality\n  /** Handler for dropped/selected files */\n  on_files_dropped?: (files: File[]) => void;\n  /** Whether drag-drop is enabled */\n  drag_drop_enabled?: boolean;\n  /** File input accept string for file picker */\n  accept_types?: string;\n  /** Whether upload is in progress */\n  is_uploading?: boolean;\n  /** Current upload progress */\n  upload_progress?: UploadProgress[];\n}\n\n/**\n * Props for the FileViewer component\n */\nexport interface FileViewerProps {\n  /** File to display (null for empty state) */\n  file: FileItem | null;\n  /** Configuration */\n  config: FormConfig;\n  /** Optional PDF viewer component */\n  pdf_viewer_component?: React.ComponentType<PdfViewerProps>;\n  /** File manager instance for save/load operations */\n  file_manager?: HazoFilesFileManager;\n  /** Path where PDFs should be saved */\n  pdf_save_path?: string;\n  /** Whether this file can be deleted (upload mode + uploaded file) */\n  deletable?: boolean;\n  /** Delete handler */\n  on_delete?: () => void;\n\n  // File conversion support (new in hazo_pdf 1.3.2)\n  /** Enable file conversion to PDF for supported types (images, text, Excel) */\n  enable_file_conversion?: boolean;\n  /**\n   * Callback when a file is converted to PDF\n   * The caller should handle storing/displaying the converted PDF\n   */\n  on_convert_to_pdf?: (converted_pdf: Uint8Array, original_filename: string) => void;\n\n  // Service injection\n  /** Logger instance (compatible with hazo_logs and hazo_pdf) */\n  logger?: Logger;\n}\n\n/**\n * Convert DocLink to FileItem\n */\nexport function doc_link_to_file_item(doc_link: DocLink, index: number): FileItem {\n  const filename = doc_link.filename || extract_filename_from_doc_link(doc_link.url);\n  return {\n    id: doc_link.file_id || `doc_link_${index}`,\n    filename,\n    url: doc_link.url,\n    type: doc_link.type,\n    source: doc_link.file_id ? \"upload\" : \"doc_link\",\n    page: doc_link.page,\n    file_id: doc_link.file_id,\n  };\n}\n\n/**\n * Extract filename from URL\n */\nfunction extract_filename_from_doc_link(url: string): string {\n  try {\n    const pathname = new URL(url, \"http://localhost\").pathname;\n    const filename = pathname.split(\"/\").pop() || \"document\";\n    return decodeURIComponent(filename);\n  } catch {\n    return \"document\";\n  }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaExternalLinkAlt } from \"react-icons/fa\";\nimport { Button } from \"../ui/button\";\nimport { cn, format_file_size, is_mime_type_allowed } from \"../../lib/utils\";\nimport { FileList } from \"./file_list\";\nimport { FileViewer } from \"./file_viewer\";\nimport type { FileManagerProps, FileItem, UploadProgress } from \"./types\";\n\n/**\n * FileManager Component\n * Main file management component that can render as sidebar OR dialog\n * Displays file list, upload zone, and file viewer\n */\nexport function FileManager({\n  files,\n  is_open,\n  on_close,\n  display_mode,\n  config,\n  pdf_viewer_component,\n  file_manager,\n  pdf_save_path,\n  upload_enabled,\n  field_label,\n  field_id,\n  on_upload,\n  on_delete,\n  on_popout,\n  class_name,\n  // hazo_pdf 1.3.2 features\n  enable_file_conversion,\n  on_file_convert,\n  // Service injection\n  logger,\n}: FileManagerProps) {\n  // Selected file state - defaults to first file\n  const [selected_index, set_selected_index] = React.useState(0);\n\n  // Upload state\n  const [is_uploading, set_is_uploading] = React.useState(false);\n  const [upload_progress, set_upload_progress] = React.useState<UploadProgress[]>([]);\n\n  // Reset selection when files change\n  React.useEffect(() => {\n    if (selected_index >= files.length) {\n      set_selected_index(Math.max(0, files.length - 1));\n    }\n  }, [files, selected_index]);\n\n  // File validation\n  const validate_file = (file: File): string | null => {\n    const upload_config = config.file_upload;\n\n    if (!is_mime_type_allowed(file.type, upload_config.allowed_types)) {\n      return `File type \"${file.type}\" is not allowed`;\n    }\n\n    if (file.size > upload_config.max_file_size) {\n      return `File size exceeds maximum of ${format_file_size(upload_config.max_file_size)}`;\n    }\n\n    if (files.length >= upload_config.max_files_per_field) {\n      return `Maximum of ${upload_config.max_files_per_field} files per field`;\n    }\n\n    return null;\n  };\n\n  // Handle files dropped or selected\n  const handle_files_dropped = async (dropped_files: File[]) => {\n    if (!on_upload) return;\n\n    const valid_files: File[] = [];\n    const errors: UploadProgress[] = [];\n\n    for (const file of dropped_files) {\n      const error = validate_file(file);\n      if (error) {\n        errors.push({\n          filename: file.name,\n          progress: 100,\n          status: \"error\",\n          error,\n        });\n      } else {\n        valid_files.push(file);\n      }\n    }\n\n    if (errors.length > 0) {\n      set_upload_progress(errors);\n    }\n\n    if (valid_files.length === 0) return;\n\n    set_is_uploading(true);\n    const progress_entries: UploadProgress[] = valid_files.map((f) => ({\n      filename: f.name,\n      progress: 0,\n      status: \"uploading\" as const,\n    }));\n    set_upload_progress([...errors, ...progress_entries]);\n\n    try {\n      const results = await on_upload(valid_files);\n\n      const updated_progress: UploadProgress[] = [...errors];\n      results.forEach((result, index) => {\n        const file = valid_files[index];\n        updated_progress.push({\n          filename: file.name,\n          progress: 100,\n          status: result.success ? \"success\" : \"error\",\n          error: result.error,\n        });\n      });\n      set_upload_progress(updated_progress);\n\n      // Clear success messages after a delay\n      setTimeout(() => {\n        set_upload_progress((prev) =>\n          prev.filter((p) => p.status === \"error\")\n        );\n      }, 1500);\n    } catch (error) {\n      set_upload_progress(\n        valid_files.map((f) => ({\n          filename: f.name,\n          progress: 100,\n          status: \"error\" as const,\n          error: error instanceof Error ? error.message : \"Upload failed\",\n        }))\n      );\n    } finally {\n      set_is_uploading(false);\n    }\n  };\n\n  // Generate accept string for file input\n  const get_accept_types = (): string => {\n    return config.file_upload.allowed_types\n      .map((t) => {\n        if (t === \"application/pdf\") return \".pdf\";\n        if (t === \"image/jpeg\") return \".jpg,.jpeg\";\n        if (t === \"image/png\") return \".png\";\n        if (t === \"image/gif\") return \".gif\";\n        if (t === \"image/webp\") return \".webp\";\n        if (t.endsWith(\"/*\")) return t.replace(\"/*\", \"/*\");\n        return \"\";\n      })\n      .filter(Boolean)\n      .join(\",\");\n  };\n\n  if (!is_open) {\n    return null;\n  }\n\n  const has_files = files.length > 0;\n  const selected_file = has_files ? (files[selected_index] || files[0]) : null;\n\n  // Header title based on mode\n  const header_title = upload_enabled && field_label\n    ? `Files for \"${field_label}\"`\n    : `Documents (${files.length})`;\n\n  // Determine if delete is available for selected file\n  const selected_deletable =\n    upload_enabled &&\n    selected_file?.source === \"upload\" &&\n    !!selected_file?.file_id &&\n    !!on_delete;\n\n  const handle_delete_selected = async () => {\n    if (selected_file?.file_id && on_delete) {\n      await on_delete(selected_file.file_id);\n    }\n  };\n\n  const content = (\n    <div\n      className={cn(\n        \"cls_file_manager bg-background flex flex-col h-full\",\n        class_name\n      )}\n    >\n      {/* TOP ROW: Header + File List */}\n      <div className=\"cls_file_manager_header border-b bg-muted shrink-0\">\n        {/* Header with popout and close buttons */}\n        <div className=\"flex items-center justify-between p-2 border-b\">\n          <span className=\"text-sm font-medium text-foreground\">\n            {header_title}\n          </span>\n          <div className=\"flex items-center gap-1\">\n            {/* Popout button - only show if on_popout provided and file selected */}\n            {on_popout && selected_file && (\n              <Button\n                variant=\"ghost\"\n                size=\"sm\"\n                onClick={() => on_popout({\n                  files,\n                  selected_file,\n                  selected_index,\n                  field_id,\n                  field_label,\n                })}\n                className=\"h-8 w-8 p-0\"\n                title=\"Open in new tab\"\n              >\n                <FaExternalLinkAlt size={14} />\n              </Button>\n            )}\n            {/* Close button */}\n            <Button\n              variant=\"ghost\"\n              size=\"sm\"\n              onClick={on_close}\n              className=\"h-8 w-8 p-0\"\n              title=\"Close\"\n            >\n              <svg\n                xmlns=\"http://www.w3.org/2000/svg\"\n                width=\"16\"\n                height=\"16\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                strokeWidth=\"2\"\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n              >\n                <path d=\"M18 6 6 18\" />\n                <path d=\"m6 6 12 12\" />\n              </svg>\n            </Button>\n          </div>\n        </div>\n\n        {/* File list with integrated dropzone */}\n        <FileList\n          files={files}\n          selected_index={selected_index}\n          on_select={set_selected_index}\n          on_delete={on_delete}\n          upload_enabled={upload_enabled}\n          show_add_button={upload_enabled && !!on_upload}\n          config={config}\n          on_files_dropped={upload_enabled && on_upload ? handle_files_dropped : undefined}\n          drag_drop_enabled={upload_enabled && !!on_upload}\n          accept_types={get_accept_types()}\n          is_uploading={is_uploading}\n          upload_progress={upload_progress}\n        />\n      </div>\n\n      {/* BOTTOM ROW: Viewer Area */}\n      <div className=\"cls_file_manager_viewer flex-1 overflow-hidden\">\n        <FileViewer\n          file={selected_file}\n          config={config}\n          pdf_viewer_component={pdf_viewer_component}\n          file_manager={file_manager}\n          pdf_save_path={pdf_save_path}\n          deletable={selected_deletable}\n          on_delete={handle_delete_selected}\n          enable_file_conversion={enable_file_conversion}\n          on_convert_to_pdf={on_file_convert}\n          logger={logger}\n        />\n      </div>\n    </div>\n  );\n\n  // For sidebar mode, just return the content\n  // Dialog mode is handled by FileManagerDialog wrapper\n  return content;\n}\n\n// Re-export all components\nexport { FileManagerButton } from \"./file_manager_button\";\nexport { FileManagerDialog } from \"./file_manager_dialog\";\nexport { FileList } from \"./file_list\";\nexport { FileViewer } from \"./file_viewer\";\nexport { UploadZone } from \"./upload_zone\";\nexport { FileManagerPage } from \"./file_manager_page\";\nexport type { FileManagerPageProps } from \"./file_manager_page\";\nexport type {\n  FileManagerProps,\n  FileManagerButtonProps,\n  FileManagerDialogProps,\n  FileItem,\n  FileManagerDisplayMode,\n  UploadProgress,\n} from \"./types\";\nexport { doc_link_to_file_item } from \"./types\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { cn, normalize_doc_links } from \"../../lib/utils\";\nimport { FileManagerButton } from \"../file_manager_viewer\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport type { TableColumn, DocLink } from \"../../lib/types\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Table row data can optionally include doc_links and per-cell reference values\n */\ninterface TableRowData extends Record<string, unknown> {\n  doc_links?: DocLink[];\n  /** Per-cell reference values keyed by column id */\n  _reference_values?: Record<string, string>;\n}\n\n/**\n * Table Field Renderer\n * Handles array/table data with dynamic rows\n */\nexport function TableField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_doc_link_click,\n  on_row_doc_link_click,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n\n  const columns = field.field_info.table_columns || [];\n  const min_rows = field.field_info.table_min_rows ?? 0;\n  const max_rows = field.field_info.table_max_rows ?? Infinity;\n\n  // Ensure value is an array\n  const rows: TableRowData[] = Array.isArray(value)\n    ? value\n    : value\n    ? [value as TableRowData]\n    : [];\n\n  // Check if any row has doc_links\n  const has_row_doc_links = rows.some((row) => row.doc_links?.length);\n\n  // Check if any columns have subtotal enabled\n  const has_subtotals = columns.some((col) => col.subtotal);\n\n  // Calculate subtotals for columns that have subtotal: true\n  const subtotals = React.useMemo(() => {\n    const result: Record<string, number> = {};\n    columns.forEach((col) => {\n      if (col.subtotal) {\n        result[col.id] = rows.reduce((sum, row) => {\n          const val = row[col.id];\n          const num = typeof val === \"number\" ? val : parseFloat(String(val));\n          return sum + (isNaN(num) ? 0 : num);\n        }, 0);\n      }\n    });\n    return result;\n  }, [columns, rows]);\n\n  // Add a new row with default values from column definitions\n  const handle_add_row = () => {\n    if (rows.length >= max_rows) return;\n    const new_row: Record<string, unknown> = {};\n    columns.forEach((col) => {\n      // Priority: column.default_value > column.field_info.default_value > \"\"\n      const default_val =\n        col.default_value !== undefined ? col.default_value :\n        col.field_info.default_value !== undefined ? col.field_info.default_value :\n        \"\";\n      new_row[col.id] = default_val;\n    });\n    on_change([...rows, new_row]);\n  };\n\n  // Remove a row\n  const handle_remove_row = (index: number) => {\n    if (rows.length <= min_rows) return;\n    const new_rows = rows.filter((_, i) => i !== index);\n    on_change(new_rows);\n  };\n\n  // Update a cell value\n  const handle_cell_change = (\n    row_index: number,\n    column_id: string,\n    cell_value: unknown\n  ) => {\n    const new_rows = rows.map((row, i) => {\n      if (i === row_index) {\n        return { ...row, [column_id]: cell_value };\n      }\n      return row;\n    });\n    on_change(new_rows);\n  };\n\n  // Render cell value based on column type\n  const render_cell = (\n    row: Record<string, unknown>,\n    row_index: number,\n    column: TableColumn\n  ) => {\n    const cell_value = row[column.id];\n    const string_value =\n      cell_value !== undefined && cell_value !== null ? String(cell_value) : \"\";\n\n    if (is_view) {\n      return (\n        <span\n          className=\"flex items-center gap-1\"\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          {string_value || \"-\"}\n          {column.field_info.badge && (\n            <span\n              className=\"cls_cell_badge inline-flex items-center justify-center px-1.5 py-0.5 text-xs font-semibold rounded\"\n              style={{\n                backgroundColor: config.badge_background,\n                color: config.badge_text_color,\n                minWidth: \"20px\",\n              }}\n            >\n              {column.field_info.badge}\n            </span>\n          )}\n        </span>\n      );\n    }\n\n    const field_type = column.field_info.field_type;\n\n    if (field_type === \"option\") {\n      const options = column.field_info.options || [];\n      return (\n        <select\n          value={string_value}\n          onChange={(e) => handle_cell_change(row_index, column.id, e.target.value)}\n          disabled={column.field_info.disabled}\n          className=\"h-9 w-full rounded-md border border-input bg-background px-2 text-sm\"\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        >\n          <option value=\"\">Select...</option>\n          {options.map((opt) => (\n            <option key={opt.value} value={opt.value}>\n              {opt.label}\n            </option>\n          ))}\n        </select>\n      );\n    }\n\n    if (field_type === \"number\" || field_type === \"currency\") {\n      return (\n        <Input\n          type=\"number\"\n          value={string_value}\n          onChange={(e) => {\n            const val = e.target.value;\n            const num = parseFloat(val);\n            handle_cell_change(row_index, column.id, isNaN(num) ? val : num);\n          }}\n          disabled={column.field_info.disabled}\n          placeholder={column.field_info.placeholder}\n          className=\"h-9 text-right\"\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: config.field_font_size,\n          }}\n        />\n      );\n    }\n\n    // Default to text input\n    return (\n      <Input\n        type=\"text\"\n        value={string_value}\n        onChange={(e) => handle_cell_change(row_index, column.id, e.target.value)}\n        disabled={column.field_info.disabled}\n        placeholder={column.field_info.placeholder}\n        className=\"h-9\"\n        style={{\n          fontFamily: config.field_font_family,\n          fontSize: config.field_font_size,\n        }}\n      />\n    );\n  };\n\n  const is_worksheet = field.field_info.is_worksheet;\n  const table_title = field.field_info.table_title;\n\n  return (\n    <div\n      className={cn(\"cls_field_container cls_table_field\", !is_worksheet && \"w-full\")}\n      style={{\n        marginLeft: is_worksheet ? config.worksheet_indent : undefined,\n        width: is_worksheet ? `calc(100% - ${config.worksheet_indent})` : undefined,\n        maxWidth: is_worksheet ? `calc(100% - ${config.worksheet_indent})` : undefined,\n        boxSizing: \"border-box\",\n      }}\n    >\n      {table_title && (\n        <p\n          className=\"cls_table_title font-semibold mb-2\"\n          style={{\n            color: config.label_color,\n            fontFamily: config.label_font_family,\n            fontSize: config.label_font_size,\n          }}\n        >\n          {table_title}\n        </p>\n      )}\n      {field.label && (\n        <div\n          className=\"cls_label_row flex items-center gap-2\"\n          style={{ marginBottom: config.label_field_gap }}\n        >\n          <Label\n            className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n            style={{\n              color: config.label_color,\n              fontFamily: config.label_font_family,\n              fontSize: config.label_font_size,\n              fontWeight: config.label_font_weight,\n            }}\n          >\n            {field.label}\n            {is_required && (\n              <span\n                className=\"cls_required_asterisk ml-1\"\n                style={{ color: config.label_color_required }}\n              >\n                *\n              </span>\n            )}\n          </Label>\n          {has_doc_links && on_doc_link_click && (\n            <FileManagerButton\n              file_count={field.doc_links!.length}\n              has_files={true}\n              on_click={on_doc_link_click}\n              config={config}\n            />\n          )}\n        </div>\n      )}\n\n      <div className=\"cls_table_wrapper border rounded-md overflow-hidden w-full\">\n        <table className=\"w-full\" style={{ tableLayout: \"fixed\" }}>\n          <thead>\n            <tr\n              className=\"border-b\"\n              style={{ background: config.section_header_background }}\n            >\n              {columns.map((col) => {\n                const is_numeric = col.field_info.field_type === \"number\" || col.field_info.field_type === \"currency\";\n                return (\n                  <th\n                    key={col.id}\n                    className={cn(\"px-3 py-2 font-medium\", is_numeric ? \"text-right\" : \"text-left\")}\n                    style={{\n                      width: col.width,\n                      fontFamily: config.label_font_family,\n                      fontSize: config.label_font_size,\n                      color: config.section_header_color,\n                    }}\n                  >\n                    {col.label}\n                    {col.field_info.required && (\n                      <span\n                        className=\"ml-1\"\n                        style={{ color: config.label_color_required }}\n                      >\n                        *\n                      </span>\n                    )}\n                  </th>\n                );\n              })}\n              {has_row_doc_links && <th className=\"w-10\"></th>}\n              {!is_view && <th className=\"w-10\"></th>}\n            </tr>\n          </thead>\n          <tbody>\n            {rows.length === 0 ? (\n              <tr>\n                <td\n                  colSpan={columns.length + (has_row_doc_links ? 1 : 0) + (is_view ? 0 : 1)}\n                  className=\"px-3 py-4 text-center text-muted-foreground\"\n                >\n                  No data\n                </td>\n              </tr>\n            ) : (\n              rows.map((row, row_index) => (\n                <tr key={row_index} className=\"border-b last:border-b-0\">\n                  {columns.map((col) => {\n                    const ref_val = row._reference_values?.[col.id] ?? col.reference_value;\n                    return (\n                      <td key={col.id} className=\"px-3 py-2 align-top\">\n                        {render_cell(row, row_index, col)}\n                        {ref_val && <ReferenceValue value={ref_val} />}\n                      </td>\n                    );\n                  })}\n                  {has_row_doc_links && (\n                    <td className=\"px-2 py-2 align-top\">\n                      {row.doc_links?.length && on_row_doc_link_click && (\n                        <FileManagerButton\n                          file_count={row.doc_links.length}\n                          has_files={true}\n                          on_click={() => on_row_doc_link_click(`${field.id}_row_${row_index}`, row.doc_links!)}\n                          config={config}\n                          tooltip_text={row.doc_links.length === 1 && row.doc_links[0].page ? `View document page ${row.doc_links[0].page}` : \"View documents\"}\n                        />\n                      )}\n                    </td>\n                  )}\n                  {!is_view && (\n                    <td className=\"px-2 py-2 align-top\">\n                      <button\n                        type=\"button\"\n                        onClick={() => handle_remove_row(row_index)}\n                        disabled={rows.length <= min_rows}\n                        className=\"p-1 text-muted-foreground hover:text-destructive disabled:opacity-50 disabled:cursor-not-allowed\"\n                        aria-label=\"Remove row\"\n                      >\n                        <svg\n                          xmlns=\"http://www.w3.org/2000/svg\"\n                          width=\"16\"\n                          height=\"16\"\n                          viewBox=\"0 0 24 24\"\n                          fill=\"none\"\n                          stroke=\"currentColor\"\n                          strokeWidth=\"2\"\n                          strokeLinecap=\"round\"\n                          strokeLinejoin=\"round\"\n                        >\n                          <path d=\"M3 6h18\" />\n                          <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n                          <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n                        </svg>\n                      </button>\n                    </td>\n                  )}\n                </tr>\n              ))\n            )}\n          </tbody>\n          {has_subtotals && rows.length > 0 && (\n            <tfoot>\n              <tr\n                className=\"border-t-2\"\n                style={{ background: \"#e5e7eb\" }}\n              >\n                {columns.map((col, col_index) => {\n                  const is_numeric = col.field_info.field_type === \"number\" || col.field_info.field_type === \"currency\";\n                  return (\n                    <td\n                      key={col.id}\n                      className={cn(\"py-2 font-semibold\", is_numeric || col.subtotal ? \"text-right\" : \"text-left\")}\n                      style={{\n                        fontFamily: config.field_font_family,\n                        fontSize: config.field_font_size,\n                        color: \"#111827\",\n                        paddingLeft: \"0.75rem\",\n                        // Extra right padding for numeric columns to align with input field content\n                        paddingRight: is_numeric || col.subtotal ? \"1.5rem\" : \"0.75rem\",\n                      }}\n                    >\n                      {col.subtotal ? (\n                        subtotals[col.id]?.toLocaleString(undefined, {\n                          minimumFractionDigits: col.field_info.decimal_places ?? 2,\n                          maximumFractionDigits: col.field_info.decimal_places ?? 2,\n                        })\n                      ) : col_index === 0 ? (\n                        \"Total\"\n                      ) : (\n                        \"\"\n                      )}\n                    </td>\n                  );\n                })}\n                {has_row_doc_links && <td className=\"w-10\"></td>}\n                {!is_view && <td className=\"w-10\"></td>}\n              </tr>\n            </tfoot>\n          )}\n        </table>\n      </div>\n\n      {!is_view && (\n        <button\n          type=\"button\"\n          onClick={handle_add_row}\n          disabled={rows.length >= max_rows}\n          className=\"mt-2 text-xs text-muted-foreground hover:text-foreground disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\"\n        >\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            width=\"12\"\n            height=\"12\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            strokeWidth=\"2\"\n            strokeLinecap=\"round\"\n            strokeLinejoin=\"round\"\n          >\n            <path d=\"M12 5v14\" />\n            <path d=\"M5 12h14\" />\n          </svg>\n          Add Row\n        </button>\n      )}\n\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Label } from \"../ui/label\";\nimport { FileManagerButton } from \"../file_manager_viewer/file_manager_button\";\nimport { cn, format_currency, format_percentage, normalize_doc_links } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport { ReferenceValue } from \"./shared/reference_value\";\n\n/**\n * Computed Field Renderer\n * Displays a read-only computed value based on a formula\n */\nexport function ComputedField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_doc_link_click,\n  field_uploads,\n  on_upload_click,\n  upload_enabled,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n\n  // Format the computed value for display\n  const format_value = (val: unknown): string => {\n    if (val === undefined || val === null || val === \"\") return \"-\";\n\n    const num = typeof val === \"number\" ? val : parseFloat(String(val));\n    if (isNaN(num)) return String(val);\n\n    // Check if we should format as currency or percentage\n    const formula = field.field_info.computed_formula || \"\";\n    const decimal_places = field.field_info.decimal_places ?? config.default_decimal_places;\n\n    if (field.field_info.currency_symbol) {\n      return format_currency(\n        num,\n        field.field_info.currency_symbol,\n        decimal_places\n      );\n    }\n\n    if (formula.includes(\"%\") || field.label.toLowerCase().includes(\"percent\")) {\n      return format_percentage(num, decimal_places, config.percentage_suffix);\n    }\n\n    return num.toFixed(decimal_places);\n  };\n\n  // Render the file manager button (shows unified button with badge for total file count)\n  const render_file_button = () => {\n    // Calculate total file count from doc_links + uploads\n    const doc_links = normalize_doc_links(field.doc_links);\n    const uploads = field_uploads || [];\n    const total_count = doc_links.length + uploads.length;\n    const has_files = total_count > 0;\n\n    // Determine click handler - use doc_link_click if available, otherwise upload_click\n    const handle_click = on_doc_link_click || (upload_enabled ? on_upload_click : undefined);\n\n    // In view mode, only show if there are files\n    if (is_view && !has_files) {\n      return null;\n    }\n\n    // Hide button if no handler and no files\n    if (!handle_click && !has_files) {\n      return null;\n    }\n\n    return (\n      <FileManagerButton\n        file_count={total_count}\n        has_files={has_files}\n        on_click={handle_click || (() => {})}\n        config={config}\n        disabled={!handle_click}\n      />\n    );\n  };\n\n  return (\n    <div className=\"cls_field_container cls_computed_field w-full\">\n      <div\n        className=\"cls_label_row flex items-center gap-2\"\n        style={{ marginBottom: config.label_field_gap }}\n      >\n        <Label\n          className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n          style={{\n            color: config.label_color,\n            fontFamily: config.label_font_family,\n            fontSize: config.label_font_size,\n            fontWeight: config.label_font_weight,\n          }}\n        >\n          {field.label}\n          {is_required && (\n            <span\n              className=\"cls_required_asterisk ml-1\"\n              style={{ color: config.label_color_required }}\n            >\n              *\n            </span>\n          )}\n        </Label>\n        {render_file_button()}\n      </div>\n\n      <div\n        className=\"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center font-medium\"\n        style={{\n          background: config.view_mode_background,\n          border: `1px solid ${config.view_mode_border}`,\n          fontFamily: config.field_font_family,\n          fontSize: config.field_font_size,\n        }}\n      >\n        {format_value(value)}\n      </div>\n\n      {field.field_info.computed_formula && (\n        <p\n          className=\"cls_formula_hint mt-1 text-xs text-muted-foreground\"\n          style={{ fontFamily: config.field_font_family }}\n        >\n          Calculated: {field.field_info.computed_formula}\n        </p>\n      )}\n\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n      {field.reference_value && <ReferenceValue value={field.reference_value} />}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\n\n/**\n * Static Text Field Renderer\n * Displays read-only static text content (instructions, notes, etc.)\n */\nexport function StaticTextField({\n  field,\n  config,\n}: FieldRendererProps) {\n  const content = field.field_info.static_content || field.label;\n  const text_align = field.field_info.text_align || \"left\";\n  const is_worksheet = field.field_info.is_worksheet;\n\n  return (\n    <div\n      className={cn(\n        \"cls_field_container cls_static_text_field\",\n        field.field_info.display_variant === \"inline\" && \"inline-block\",\n        !is_worksheet && \"w-full\"\n      )}\n      style={{\n        width: is_worksheet ? `calc(100% - ${config.worksheet_indent})` : field.field_info.width,\n        marginLeft: is_worksheet ? config.worksheet_indent : undefined,\n      }}\n    >\n      {field.field_info.item_code && (\n        <span\n          className=\"cls_item_code text-sm font-mono mr-2\"\n          style={{ color: config.label_color }}\n        >\n          {field.field_info.item_code}\n        </span>\n      )}\n      <p\n        className=\"cls_static_text_content\"\n        style={{\n          fontFamily: config.field_font_family,\n          fontSize: config.field_font_size,\n          color: config.label_color,\n          textAlign: text_align,\n        }}\n      >\n        {field.field_info.badge && (\n          <span\n            className=\"cls_field_badge inline-block px-2 py-0.5 mr-2 text-xs font-semibold rounded bg-primary/20 text-primary\"\n          >\n            {field.field_info.badge}\n          </span>\n        )}\n        {content}\n      </p>\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaFileAlt, FaRegFileAlt } from \"react-icons/fa\";\nimport { Label } from \"../ui/label\";\nimport { cn, format_currency } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport type { StyleVariant } from \"../../lib/types\";\n\n/**\n * Summary Row Field Renderer\n * Displays a read-only summary/total row with special styling\n * Supports style_variant for hierarchical styling (total_h1, total_h2, etc.)\n */\nexport function SummaryRowField({\n  field,\n  value,\n  config,\n  on_doc_link_click,\n  badge_column_width,\n  value_column_width,\n}: FieldRendererProps) {\n  const has_doc_links = !!field.doc_links?.length;\n  const text_align = field.field_info.text_align || \"right\";\n\n  // Get style_variant from field (e.g., \"total_h1\", \"total_h2\")\n  // Default to \"total_h1\" for consistent styling when no variant is specified\n  const style_variant: StyleVariant = field.style_variant || \"total_h1\";\n  const style_config = config.styles[style_variant];\n\n  // Check if row background is not transparent (needs special styling)\n  const has_row_background = style_config && style_config.background_color !== \"transparent\";\n\n  const format_value = (val: unknown): string => {\n    if (val === undefined || val === null || val === \"\") return \"$0.00\";\n\n    const num = typeof val === \"number\" ? val : parseFloat(String(val));\n    if (isNaN(num)) return String(val);\n\n    const decimal_places = field.field_info.decimal_places ?? config.default_decimal_places;\n    const currency_symbol = field.field_info.currency_symbol ?? config.default_currency_symbol;\n\n    return format_currency(num, currency_symbol, decimal_places);\n  };\n\n  const row_indent = style_config?.indent || \"0px\";\n\n  // Calculate doc link column width for alignment\n  const doc_link_col_width = config.doc_link_column_width || \"32px\";\n\n  // Render the doc link column (always reserves space for alignment)\n  const render_doc_link_column = () => {\n    const icon_size = parseInt(config.doc_link_icon_size, 10) || 20;\n    const IconComponent = config.doc_link_icon_style === \"solid\" ? FaFileAlt : FaRegFileAlt;\n\n    return (\n      <div\n        className=\"cls_doc_link_column flex-shrink-0 flex items-center justify-center\"\n        style={{ width: doc_link_col_width }}\n      >\n        {has_doc_links && on_doc_link_click && (\n          <button\n            type=\"button\"\n            onClick={on_doc_link_click}\n            className=\"cls_doc_link_btn p-1 rounded hover:bg-muted transition-colors\"\n            aria-label=\"View document\"\n          >\n            <IconComponent\n              size={icon_size}\n              color={config.doc_link_icon_color}\n              className=\"transition-colors\"\n            />\n          </button>\n        )}\n      </div>\n    );\n  };\n\n  return (\n    <div\n      className={cn(\n        \"cls_field_container cls_summary_row_field\",\n        `cls_style_${style_variant}`\n      )}\n      style={{\n        width: `calc(100% + 32px - ${row_indent})`,\n        backgroundColor: style_config?.background_color,\n        padding: \"12px 16px\",\n        marginLeft: `calc(-16px + ${row_indent})`,\n        marginRight: \"-16px\",\n        marginTop: \"8px\",\n        boxSizing: \"border-box\",\n      }}\n    >\n      <div className=\"flex items-center justify-between\">\n        <div className=\"cls_label_row flex items-center gap-2 flex-grow\">\n          {field.field_info.item_code && (\n            <span\n              className=\"cls_item_code text-sm font-mono\"\n              style={{ color: style_config?.font_color || config.label_color }}\n            >\n              {field.field_info.item_code}\n            </span>\n          )}\n          <Label\n            className=\"cls_field_label\"\n            style={{\n              color: style_config?.font_color,\n              fontFamily: config.label_font_family,\n              fontSize: style_config?.font_size,\n              fontWeight: style_config?.font_weight,\n            }}\n          >\n            {field.field_info.badge && (\n              <span\n                className=\"cls_field_badge inline-block px-2 py-0.5 mr-2 text-xs font-semibold rounded bg-primary/20 text-primary\"\n              >\n                {field.field_info.badge}\n              </span>\n            )}\n            {field.label}\n          </Label>\n        </div>\n\n        {field.field_info.summary_note && (\n          <span\n            className=\"cls_summary_note text-sm\"\n            style={{\n              color: style_config?.font_color || config.label_color,\n              fontFamily: config.field_font_family,\n              opacity: 0.8,\n            }}\n          >\n            {field.field_info.summary_note}\n          </span>\n        )}\n\n        {/* Badge column spacer - reserves space for alignment with other fields */}\n        {badge_column_width && (\n          <div\n            className=\"cls_badge_column_spacer flex-shrink-0\"\n            style={{ width: badge_column_width }}\n          />\n        )}\n\n        {/* Value column - uses value_column_width for alignment */}\n        <div\n          className={cn(\n            \"cls_summary_value py-2 px-4 rounded-md flex-shrink-0\",\n            has_row_background ? \"\" : \"bg-muted border border-border\"\n          )}\n          style={{\n            fontFamily: config.field_font_family,\n            fontSize: style_config?.font_size,\n            fontWeight: style_config?.font_weight,\n            color: style_config?.font_color,\n            textAlign: text_align,\n            width: value_column_width || \"150px\",\n            minWidth: \"150px\",\n            background: has_row_background ? \"transparent\" : undefined,\n            border: has_row_background ? \"none\" : undefined,\n          }}\n        >\n          {format_value(value)}\n        </div>\n\n        {/* Doc link column - always reserves space for alignment */}\n        {render_doc_link_column()}\n      </div>\n\n      {field.field_info.summary_fields && field.field_info.summary_fields.length > 0 && (\n        <p\n          className=\"cls_summary_hint mt-1 text-xs text-muted-foreground\"\n          style={{ fontFamily: config.field_font_family }}\n        >\n          Sum of: {field.field_info.summary_fields.join(\" + \")}\n        </p>\n      )}\n    </div>\n  );\n}\n","/**\n * Style resolver for the new form_styles.json configuration system\n * Handles token substitution, inheritance resolution, and CSS conversion\n */\n\nimport type {\n  StylesConfig,\n  StyleClassDefinition,\n  StyleTokens,\n  ResolvedStyle,\n} from \"./types\";\n\n/**\n * Resolve token references in a value\n * e.g., \"{colors.primary}\" -> \"#1e3a5f\"\n * e.g., \"{spacing.md}\" -> \"12px\"\n */\nexport function resolve_tokens(\n  value: string | undefined,\n  tokens: StyleTokens\n): string | undefined {\n  if (!value || typeof value !== \"string\") return value;\n\n  return value.replace(/\\{(\\w+)\\.(\\w+)\\}/g, (match, category, key) => {\n    const token_category = tokens[category as keyof StyleTokens];\n    if (token_category && typeof token_category === \"object\" && key in token_category) {\n      return token_category[key];\n    }\n    console.warn(`Unknown token: ${match}`);\n    return match;\n  });\n}\n\n/**\n * Resolve a style class with inheritance chain and token substitution\n * Uses memoization via the cache parameter for performance\n */\nexport function resolve_style_class(\n  class_name: string,\n  styles_config: StylesConfig,\n  cache: Map<string, ResolvedStyle> = new Map()\n): ResolvedStyle {\n  // Check cache first\n  if (cache.has(class_name)) {\n    return cache.get(class_name)!;\n  }\n\n  const style_def = styles_config.styles[class_name];\n  if (!style_def) {\n    console.warn(`Unknown style class: ${class_name}`);\n    return {};\n  }\n\n  // Resolve parent first if extends is specified\n  let base_style: ResolvedStyle = {};\n  if (style_def.extends) {\n    base_style = resolve_style_class(style_def.extends, styles_config, cache);\n  }\n\n  // Merge with current definition\n  const merged: ResolvedStyle = { ...base_style };\n  const tokens = styles_config.tokens;\n\n  // Apply each property with token resolution\n  for (const [key, value] of Object.entries(style_def)) {\n    if (key === \"extends\") continue;\n\n    if (typeof value === \"string\") {\n      (merged as Record<string, unknown>)[key] = resolve_tokens(value, tokens);\n    } else {\n      (merged as Record<string, unknown>)[key] = value;\n    }\n  }\n\n  // Cache result\n  cache.set(class_name, merged);\n\n  return merged;\n}\n\n/**\n * Convert ResolvedStyle to React inline style object\n */\nexport function to_inline_style(resolved: ResolvedStyle): React.CSSProperties {\n  const style: React.CSSProperties = {};\n\n  // Color properties\n  if (resolved.color) style.color = resolved.color;\n  if (resolved.background_color) style.backgroundColor = resolved.background_color;\n  if (resolved.border_color) style.borderColor = resolved.border_color;\n\n  // Border properties\n  if (resolved.border_width) style.borderWidth = resolved.border_width;\n  if (resolved.border_radius) style.borderRadius = resolved.border_radius;\n\n  // Font properties\n  if (resolved.font_family) style.fontFamily = resolved.font_family;\n  if (resolved.font_size) style.fontSize = resolved.font_size;\n  if (resolved.font_weight) style.fontWeight = resolved.font_weight;\n  if (resolved.line_height) style.lineHeight = resolved.line_height;\n  if (resolved.letter_spacing) style.letterSpacing = resolved.letter_spacing;\n\n  // Layout properties\n  if (resolved.text_align) style.textAlign = resolved.text_align as React.CSSProperties[\"textAlign\"];\n  if (resolved.min_width) style.minWidth = resolved.min_width;\n  if (resolved.min_height) style.minHeight = resolved.min_height;\n  if (resolved.opacity !== undefined) style.opacity = resolved.opacity;\n\n  // Handle padding\n  if (resolved.padding) {\n    style.padding = resolved.padding;\n  } else if (resolved.padding_x || resolved.padding_y) {\n    if (resolved.padding_x) {\n      style.paddingLeft = resolved.padding_x;\n      style.paddingRight = resolved.padding_x;\n    }\n    if (resolved.padding_y) {\n      style.paddingTop = resolved.padding_y;\n      style.paddingBottom = resolved.padding_y;\n    }\n  }\n\n  // Handle margin\n  if (resolved.margin) {\n    style.margin = resolved.margin;\n  }\n  if (resolved.margin_left) {\n    style.marginLeft = resolved.margin_left;\n  }\n  if (resolved.margin_top) {\n    style.marginTop = resolved.margin_top;\n  }\n\n  // Handle indent (typically used as marginLeft)\n  if (resolved.indent && !resolved.margin_left) {\n    style.marginLeft = resolved.indent;\n  }\n\n  return style;\n}\n\n/**\n * Get a specific style property value from a resolved style\n */\nexport function get_style_value<K extends keyof ResolvedStyle>(\n  resolved: ResolvedStyle,\n  property: K\n): ResolvedStyle[K] {\n  return resolved[property];\n}\n\n/**\n * Create a memoized style resolver for a given styles configuration\n * This is useful when you need to resolve multiple styles with the same config\n */\nexport function create_style_resolver(styles_config: StylesConfig) {\n  const cache = new Map<string, ResolvedStyle>();\n\n  return {\n    /**\n     * Resolve a style class by name, returns ResolvedStyle\n     */\n    resolve: (class_name: string): ResolvedStyle =>\n      resolve_style_class(class_name, styles_config, cache),\n\n    /**\n     * Resolve a style class and convert to React inline style\n     */\n    to_style: (class_name: string): React.CSSProperties =>\n      to_inline_style(resolve_style_class(class_name, styles_config, cache)),\n\n    /**\n     * Get a specific property value from a style class\n     */\n    get_value: <K extends keyof ResolvedStyle>(\n      class_name: string,\n      property: K\n    ): ResolvedStyle[K] => {\n      const resolved = resolve_style_class(class_name, styles_config, cache);\n      return resolved[property];\n    },\n\n    /**\n     * Resolve multiple style classes and merge them (later classes override earlier)\n     */\n    merge: (...class_names: string[]): ResolvedStyle => {\n      const merged: ResolvedStyle = {};\n      for (const class_name of class_names) {\n        const resolved = resolve_style_class(class_name, styles_config, cache);\n        Object.assign(merged, resolved);\n      }\n      return merged;\n    },\n\n    /**\n     * Resolve multiple style classes and convert to React inline style\n     */\n    merge_to_style: (...class_names: string[]): React.CSSProperties => {\n      const merged: ResolvedStyle = {};\n      for (const class_name of class_names) {\n        const resolved = resolve_style_class(class_name, styles_config, cache);\n        Object.assign(merged, resolved);\n      }\n      return to_inline_style(merged);\n    },\n\n    /**\n     * Clear the resolution cache (useful if styles config changes)\n     */\n    clear_cache: () => cache.clear(),\n\n    /**\n     * Check if a style class exists in the configuration\n     */\n    has_style: (class_name: string): boolean =>\n      class_name in styles_config.styles,\n\n    /**\n     * Get all available style class names\n     */\n    get_style_names: (): string[] => Object.keys(styles_config.styles),\n\n    /**\n     * Get the raw tokens from the config\n     */\n    get_tokens: (): StyleTokens => styles_config.tokens,\n\n    /**\n     * Resolve a single token value\n     */\n    resolve_token: (token_path: string): string | undefined => {\n      const match = token_path.match(/^\\{(\\w+)\\.(\\w+)\\}$/);\n      if (!match) return token_path;\n\n      const [, category, key] = match;\n      const token_category = styles_config.tokens[category as keyof StyleTokens];\n      if (token_category && typeof token_category === \"object\" && key in token_category) {\n        return token_category[key];\n      }\n      return undefined;\n    },\n  };\n}\n\n/**\n * Type for the style resolver returned by create_style_resolver\n */\nexport type StyleResolver = ReturnType<typeof create_style_resolver>;\n\n/**\n * Helper to merge ResolvedStyle with inline style overrides\n */\nexport function merge_with_overrides(\n  resolved: ResolvedStyle,\n  overrides: React.CSSProperties\n): React.CSSProperties {\n  return {\n    ...to_inline_style(resolved),\n    ...overrides,\n  };\n}\n\n/**\n * Get legacy StyleLevelConfig from new StylesConfig\n * For backward compatibility with existing code\n */\nexport function get_legacy_style_level(\n  style_variant: string,\n  styles_config: StylesConfig,\n  cache?: Map<string, ResolvedStyle>\n): { font_size: string; font_weight: string; font_color: string; background_color: string; indent: string } {\n  const resolved = resolve_style_class(style_variant, styles_config, cache || new Map());\n\n  return {\n    font_size: resolved.font_size || \"14px\",\n    font_weight: resolved.font_weight || \"400\",\n    font_color: resolved.color || \"#000000\",\n    background_color: resolved.background_color || \"transparent\",\n    indent: resolved.indent || resolved.margin_left || \"0px\",\n  };\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaFileAlt, FaRegFileAlt } from \"react-icons/fa\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { cn } from \"../../lib/utils\";\nimport { resolve_style_class, to_inline_style } from \"../../lib/style_resolver\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\nimport type { FieldTypeDefinition, ResolvedStyle } from \"../../lib/types\";\n\nexport interface MaskedFieldProps extends FieldRendererProps {\n  /** Field type definition from form_field_types.json */\n  type_definition: FieldTypeDefinition;\n}\n\n/**\n * Format a raw value according to display_format pattern\n * X or # in the format string are replaced with digits from the value\n */\nexport function format_masked_value(value: string, display_format: string): string {\n  const digits = value.replace(/\\D/g, \"\");\n  if (digits.length === 0) return \"\";\n\n  let result = \"\";\n  let digit_index = 0;\n\n  for (const char of display_format) {\n    if (char === \"X\" || char === \"#\") {\n      if (digit_index < digits.length) {\n        result += digits[digit_index];\n        digit_index++;\n      }\n    } else {\n      // Add separator character only if we have more digits to show\n      if (digit_index < digits.length) {\n        result += char;\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Extract raw digits from a masked value\n */\nexport function extract_raw_value(value: string, digit_count: number): string {\n  return value.replace(/\\D/g, \"\").slice(0, digit_count);\n}\n\n/**\n * Masked Field Renderer\n * Generic renderer for pattern-based field types like TFN, ABN, phone numbers, etc.\n * Configuration is loaded from form_field_types.json\n */\nexport function MaskedField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n  type_definition,\n}: MaskedFieldProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const string_value = value !== undefined && value !== null ? String(value) : \"\";\n\n  // Get formatting config from type definition\n  const display_format = type_definition.display_format || \"\";\n  const digit_count = type_definition.digit_count || 0;\n  const max_length = type_definition.max_length || display_format.length || 20;\n  const placeholder = type_definition.placeholder || field.field_info.placeholder || display_format;\n  const input_mode = type_definition.input_mode || \"text\";\n\n  // Format the value for display\n  const formatted_value = display_format\n    ? format_masked_value(string_value, display_format)\n    : string_value;\n\n  const handle_change = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const raw_value = extract_raw_value(e.target.value, digit_count || max_length);\n    on_change(raw_value);\n  };\n\n  // Get styles from config - prefer new styles_config, fallback to legacy\n  const styles_config = config.styles_config;\n  const style_cache = React.useMemo(() => new Map<string, ResolvedStyle>(), []);\n\n  // Get style class for this field type\n  const field_style_class = type_definition.style_class || \"field_mono\";\n  const field_style = styles_config\n    ? resolve_style_class(field_style_class, styles_config, style_cache)\n    : null;\n\n  const badge_style = styles_config\n    ? resolve_style_class(\"badge\", styles_config, style_cache)\n    : null;\n\n  return (\n    <div\n      className=\"cls_field_container cls_masked_field w-full\"\n      style={{ width: field.field_info.width }}\n    >\n      <div\n        className=\"cls_label_row flex items-center gap-2\"\n        style={{ marginBottom: config.label_field_gap }}\n      >\n        {field.field_info.item_code && (\n          <span\n            className=\"cls_item_code text-sm font-mono\"\n            style={{ color: config.label_color }}\n          >\n            {field.field_info.item_code}\n          </span>\n        )}\n        <Label\n          htmlFor={field.id}\n          className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n          style={{\n            color: config.label_color,\n            fontFamily: config.label_font_family,\n            fontSize: config.label_font_size,\n            fontWeight: config.label_font_weight,\n          }}\n        >\n          {field.field_info.badge && (\n            <span\n              className=\"cls_field_badge inline-block px-2 py-0.5 mr-2 text-xs font-semibold rounded\"\n              style={badge_style ? to_inline_style(badge_style) : {\n                backgroundColor: config.badge_background,\n                color: config.badge_text_color,\n              }}\n            >\n              {field.field_info.badge}\n            </span>\n          )}\n          {field.label}\n          {is_required && (\n            <span\n              className=\"cls_required_asterisk ml-1\"\n              style={{ color: config.label_color_required }}\n            >\n              *\n            </span>\n          )}\n        </Label>\n        {has_doc_links && on_doc_link_click && (() => {\n          const icon_size = parseInt(config.doc_link_icon_size, 10) || 20;\n          const IconComponent = config.doc_link_icon_style === \"solid\" ? FaFileAlt : FaRegFileAlt;\n          return (\n            <button\n              type=\"button\"\n              onClick={on_doc_link_click}\n              className=\"cls_doc_link_btn p-1 rounded hover:bg-muted transition-colors\"\n              aria-label=\"View document\"\n            >\n              <IconComponent\n                size={icon_size}\n                color={config.doc_link_icon_color}\n                className=\"transition-colors\"\n              />\n            </button>\n          );\n        })()}\n      </div>\n\n      {is_view ? (\n        <div\n          className=\"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center\"\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: field_style?.font_family || \"monospace\",\n            fontSize: config.field_font_size,\n            letterSpacing: field_style?.letter_spacing || \"0.05em\",\n          }}\n        >\n          {formatted_value || \"-\"}\n        </div>\n      ) : (\n        <Input\n          id={field.id}\n          type=\"text\"\n          inputMode={input_mode}\n          value={formatted_value}\n          onChange={handle_change}\n          onBlur={on_blur}\n          placeholder={placeholder}\n          disabled={field.field_info.disabled}\n          maxLength={max_length}\n          className={cn(\"cls_masked_input\", error && \"cls_input_error border-destructive\")}\n          style={{\n            fontFamily: field_style?.font_family || \"monospace\",\n            fontSize: config.field_font_size,\n            letterSpacing: field_style?.letter_spacing || \"0.05em\",\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          }}\n        />\n      )}\n\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error || type_definition.validation_message}\n        </p>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaFileAlt, FaRegFileAlt } from \"react-icons/fa\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { cn } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\n\n/**\n * Format ABN (Australian Business Number) as XX XXX XXX XXX\n */\nfunction format_abn(value: string): string {\n  const digits = value.replace(/\\D/g, \"\").slice(0, 11);\n  if (digits.length === 0) return \"\";\n  if (digits.length <= 2) return digits;\n  if (digits.length <= 5) return `${digits.slice(0, 2)} ${digits.slice(2)}`;\n  if (digits.length <= 8) return `${digits.slice(0, 2)} ${digits.slice(2, 5)} ${digits.slice(5)}`;\n  return `${digits.slice(0, 2)} ${digits.slice(2, 5)} ${digits.slice(5, 8)} ${digits.slice(8)}`;\n}\n\n/**\n * ABN Field Renderer\n * Handles Australian Business Number input with XX XXX XXX XXX formatting\n */\nexport function AbnField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const string_value = value !== undefined && value !== null ? String(value) : \"\";\n  const formatted_value = format_abn(string_value);\n\n  const handle_change = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const raw_value = e.target.value.replace(/\\D/g, \"\").slice(0, 11);\n    on_change(raw_value);\n  };\n\n  return (\n    <div\n      className=\"cls_field_container cls_abn_field w-full\"\n      style={{ width: field.field_info.width }}\n    >\n      <div\n        className=\"cls_label_row flex items-center gap-2\"\n        style={{ marginBottom: config.label_field_gap }}\n      >\n        {field.field_info.item_code && (\n          <span\n            className=\"cls_item_code text-sm font-mono\"\n            style={{ color: config.label_color }}\n          >\n            {field.field_info.item_code}\n          </span>\n        )}\n        <Label\n          htmlFor={field.id}\n          className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n          style={{\n            color: config.label_color,\n            fontFamily: config.label_font_family,\n            fontSize: config.label_font_size,\n            fontWeight: config.label_font_weight,\n          }}\n        >\n          {field.field_info.badge && (\n            <span\n              className=\"cls_field_badge inline-block px-2 py-0.5 mr-2 text-xs font-semibold rounded bg-primary/20 text-primary\"\n            >\n              {field.field_info.badge}\n            </span>\n          )}\n          {field.label}\n          {is_required && (\n            <span\n              className=\"cls_required_asterisk ml-1\"\n              style={{ color: config.label_color_required }}\n            >\n              *\n            </span>\n          )}\n        </Label>\n        {has_doc_links && on_doc_link_click && (() => {\n          const icon_size = parseInt(config.doc_link_icon_size, 10) || 20;\n          const IconComponent = config.doc_link_icon_style === \"solid\" ? FaFileAlt : FaRegFileAlt;\n          return (\n            <button\n              type=\"button\"\n              onClick={on_doc_link_click}\n              className=\"cls_doc_link_btn p-1 rounded hover:bg-muted transition-colors\"\n              aria-label=\"View document\"\n            >\n              <IconComponent\n                size={icon_size}\n                color={config.doc_link_icon_color}\n                className=\"transition-colors\"\n              />\n            </button>\n          );\n        })()}\n      </div>\n\n      {is_view ? (\n        <div\n          className=\"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center font-mono\"\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: \"monospace\",\n            fontSize: config.field_font_size,\n            letterSpacing: \"0.05em\",\n          }}\n        >\n          {formatted_value || \"-\"}\n        </div>\n      ) : (\n        <Input\n          id={field.id}\n          type=\"text\"\n          inputMode=\"numeric\"\n          value={formatted_value}\n          onChange={handle_change}\n          onBlur={on_blur}\n          placeholder={field.field_info.placeholder || \"XX XXX XXX XXX\"}\n          disabled={field.field_info.disabled}\n          maxLength={14}\n          className={cn(\"cls_abn_input font-mono\", error && \"cls_input_error border-destructive\")}\n          style={{\n            fontFamily: \"monospace\",\n            fontSize: config.field_font_size,\n            letterSpacing: \"0.05em\",\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          }}\n        />\n      )}\n\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaFileAlt, FaRegFileAlt } from \"react-icons/fa\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { cn } from \"../../lib/utils\";\nimport type { FieldRendererProps } from \"../../lib/field_registry\";\n\n/**\n * Format TFN (Tax File Number) as XXX XXX XXX\n */\nfunction format_tfn(value: string): string {\n  const digits = value.replace(/\\D/g, \"\").slice(0, 9);\n  if (digits.length === 0) return \"\";\n  if (digits.length <= 3) return digits;\n  if (digits.length <= 6) return `${digits.slice(0, 3)} ${digits.slice(3)}`;\n  return `${digits.slice(0, 3)} ${digits.slice(3, 6)} ${digits.slice(6)}`;\n}\n\n/**\n * TFN Field Renderer\n * Handles Tax File Number input with XXX XXX XXX formatting\n */\nexport function TfnField({\n  field,\n  mode,\n  value,\n  error,\n  config,\n  on_change,\n  on_blur,\n  on_doc_link_click,\n}: FieldRendererProps) {\n  const is_view = mode === \"view\";\n  const is_required = field.field_info.required;\n  const has_doc_links = !!field.doc_links?.length;\n  const string_value = value !== undefined && value !== null ? String(value) : \"\";\n  const formatted_value = format_tfn(string_value);\n\n  const handle_change = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const raw_value = e.target.value.replace(/\\D/g, \"\").slice(0, 9);\n    on_change(raw_value);\n  };\n\n  return (\n    <div\n      className=\"cls_field_container cls_tfn_field w-full\"\n      style={{ width: field.field_info.width }}\n    >\n      <div\n        className=\"cls_label_row flex items-center gap-2\"\n        style={{ marginBottom: config.label_field_gap }}\n      >\n        {field.field_info.item_code && (\n          <span\n            className=\"cls_item_code text-sm font-mono\"\n            style={{ color: config.label_color }}\n          >\n            {field.field_info.item_code}\n          </span>\n        )}\n        <Label\n          htmlFor={field.id}\n          className={cn(\"cls_field_label\", is_required && \"cls_required\")}\n          style={{\n            color: config.label_color,\n            fontFamily: config.label_font_family,\n            fontSize: config.label_font_size,\n            fontWeight: config.label_font_weight,\n          }}\n        >\n          {field.field_info.badge && (\n            <span\n              className=\"cls_field_badge inline-block px-2 py-0.5 mr-2 text-xs font-semibold rounded bg-primary/20 text-primary\"\n            >\n              {field.field_info.badge}\n            </span>\n          )}\n          {field.label}\n          {is_required && (\n            <span\n              className=\"cls_required_asterisk ml-1\"\n              style={{ color: config.label_color_required }}\n            >\n              *\n            </span>\n          )}\n        </Label>\n        {has_doc_links && on_doc_link_click && (() => {\n          const icon_size = parseInt(config.doc_link_icon_size, 10) || 20;\n          const IconComponent = config.doc_link_icon_style === \"solid\" ? FaFileAlt : FaRegFileAlt;\n          return (\n            <button\n              type=\"button\"\n              onClick={on_doc_link_click}\n              className=\"cls_doc_link_btn p-1 rounded hover:bg-muted transition-colors\"\n              aria-label=\"View document\"\n            >\n              <IconComponent\n                size={icon_size}\n                color={config.doc_link_icon_color}\n                className=\"transition-colors\"\n              />\n            </button>\n          );\n        })()}\n      </div>\n\n      {is_view ? (\n        <div\n          className=\"cls_field_value_display py-2 px-3 rounded-md min-h-[40px] flex items-center font-mono\"\n          style={{\n            background: config.view_mode_background,\n            border: `1px solid ${config.view_mode_border}`,\n            fontFamily: \"monospace\",\n            fontSize: config.field_font_size,\n            letterSpacing: \"0.05em\",\n          }}\n        >\n          {formatted_value || \"-\"}\n        </div>\n      ) : (\n        <Input\n          id={field.id}\n          type=\"text\"\n          inputMode=\"numeric\"\n          value={formatted_value}\n          onChange={handle_change}\n          onBlur={on_blur}\n          placeholder={field.field_info.placeholder || \"XXX XXX XXX\"}\n          disabled={field.field_info.disabled}\n          maxLength={11}\n          className={cn(\"cls_tfn_input font-mono\", error && \"cls_input_error border-destructive\")}\n          style={{\n            fontFamily: \"monospace\",\n            fontSize: config.field_font_size,\n            letterSpacing: \"0.05em\",\n            borderColor: error ? config.error_color : undefined,\n            backgroundColor: field.field_info.disabled\n              ? config.field_background_color_disabled\n              : config.field_background_color,\n          }}\n        />\n      )}\n\n      {error && (\n        <p\n          className=\"cls_error_message mt-1 text-sm\"\n          style={{ color: config.error_color }}\n        >\n          {error}\n        </p>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n  get_field_renderer,\n  register_field_renderer,\n  resolve_field_type,\n  is_masked_field_type,\n  get_base_field_type,\n  type FieldRendererProps,\n} from \"../../lib/field_registry\";\n\n// Import all field renderers\nimport { TextField } from \"./text_field\";\nimport { NumberField } from \"./number_field\";\nimport { DateField } from \"./date_field\";\nimport { BooleanField } from \"./boolean_field\";\nimport { OptionField } from \"./option_field\";\nimport { EmailField } from \"./email_field\";\nimport { TelField } from \"./tel_field\";\nimport { CurrencyField } from \"./currency_field\";\nimport { PercentageField } from \"./percentage_field\";\nimport { TextareaField } from \"./textarea_field\";\nimport { TableField } from \"./table_field\";\nimport { ComputedField } from \"./computed_field\";\nimport { StaticTextField } from \"./static_text_field\";\nimport { SummaryRowField } from \"./summary_row_field\";\nimport { MaskedField } from \"./masked_field\";\n\n// Legacy imports - kept for backward compatibility\n// @deprecated Use form_field_types.json to define these field types instead\nimport { AbnField } from \"./abn_field\";\nimport { TfnField } from \"./tfn_field\";\n\n// Register all built-in field renderers (base types)\nregister_field_renderer(\"text\", TextField);\nregister_field_renderer(\"number\", NumberField);\nregister_field_renderer(\"date\", DateField);\nregister_field_renderer(\"boolean\", BooleanField);\nregister_field_renderer(\"option\", OptionField);\nregister_field_renderer(\"email\", EmailField);\nregister_field_renderer(\"tel\", TelField);\nregister_field_renderer(\"currency\", CurrencyField);\nregister_field_renderer(\"percentage\", PercentageField);\nregister_field_renderer(\"textarea\", TextareaField);\nregister_field_renderer(\"table\", TableField);\nregister_field_renderer(\"computed\", ComputedField);\nregister_field_renderer(\"static_text\", StaticTextField);\nregister_field_renderer(\"summary_row\", SummaryRowField);\n\n// Register legacy field renderers (deprecated - use form_field_types.json instead)\n// These are kept for backward compatibility but will be removed in future versions\nregister_field_renderer(\"abn\", AbnField);\nregister_field_renderer(\"tfn\", TfnField);\n\n/**\n * Field Renderer Factory Component\n * Resolves the appropriate renderer based on field_type\n *\n * Resolution order:\n * 1. Check if field_type is defined in field_types_config (from form_field_types.json)\n *    - If it has display_format, use MaskedField\n *    - Otherwise, delegate to base_type renderer with enhanced props\n * 2. Fall back to directly registered renderers (built-in or legacy)\n */\nexport function FieldRenderer(props: FieldRendererProps) {\n  const { field, config } = props;\n  const field_type = field.field_info.field_type;\n\n  // Check if this field type is defined in the config\n  const type_definition = resolve_field_type(field_type, config);\n\n  if (type_definition) {\n    // Field type is defined in form_field_types.json\n    if (type_definition.display_format) {\n      // Use MaskedField for pattern-based field types\n      return <MaskedField {...props} type_definition={type_definition} />;\n    }\n\n    // Delegate to base_type renderer with enhanced props\n    const base_type = type_definition.base_type;\n    const BaseRenderer = get_field_renderer(base_type);\n\n    if (BaseRenderer) {\n      // Merge type_definition properties into field_info\n      const enhanced_props: FieldRendererProps = {\n        ...props,\n        field: {\n          ...field,\n          field_info: {\n            ...field.field_info,\n            placeholder: type_definition.placeholder || field.field_info.placeholder,\n            decimal_places: type_definition.decimal_places ?? field.field_info.decimal_places,\n            min: type_definition.min ?? field.field_info.min,\n            max: type_definition.max ?? field.field_info.max,\n            currency_symbol: type_definition.prefix || field.field_info.currency_symbol,\n          },\n        },\n      };\n      return <BaseRenderer {...enhanced_props} />;\n    }\n  }\n\n  // Fall back to directly registered renderer\n  const Renderer = get_field_renderer(field_type);\n\n  if (!Renderer) {\n    console.warn(`No renderer found for field type: ${field_type}`);\n    return (\n      <div className=\"cls_unsupported_field p-2 border border-destructive/30 bg-destructive/10 rounded text-sm text-destructive\">\n        Unsupported field type: {field_type}\n      </div>\n    );\n  }\n\n  return <Renderer {...props} />;\n}\n\n// Re-export individual field renderers for custom usage\nexport {\n  TextField,\n  NumberField,\n  DateField,\n  BooleanField,\n  OptionField,\n  EmailField,\n  TelField,\n  CurrencyField,\n  PercentageField,\n  TextareaField,\n  TableField,\n  ComputedField,\n  StaticTextField,\n  SummaryRowField,\n  MaskedField,\n  // Legacy exports (deprecated)\n  AbnField,\n  TfnField,\n};\n\n// Re-export registry functions for extending\nexport {\n  register_field_renderer,\n  get_field_renderer,\n  resolve_field_type,\n  is_masked_field_type,\n  get_base_field_type,\n} from \"../../lib/field_registry\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Controller, useFormContext } from \"react-hook-form\";\nimport { FieldRenderer } from \"../field_renderers\";\nimport { cn, get_field_uploads, normalize_doc_links } from \"../../lib/utils\";\nimport type { SubSection, FormMode, FormConfig, FormErrors, DocLink, StyleVariant, FormField, FormValues } from \"../../lib/types\";\n\nexport interface SubSectionRendererProps {\n  sub_section: SubSection;\n  mode: FormMode;\n  config: FormConfig;\n  show_header?: boolean;\n  on_doc_link_click?: (field_id: string, doc_links: DocLink[], field_label?: string) => void;\n  errors?: FormErrors;\n  upload_enabled?: boolean;\n  form_values?: FormValues;\n  on_upload_click?: (field_id: string, field_label: string) => void;\n}\n\n/**\n * Sub-section Renderer\n * Renders a sub-section with its label and field group\n */\nexport function SubSectionRenderer({\n  sub_section,\n  mode,\n  config,\n  show_header = true,\n  on_doc_link_click,\n  errors,\n  upload_enabled,\n  form_values,\n  on_upload_click,\n}: SubSectionRendererProps) {\n  const form = useFormContext();\n  const { orientation, fields, badge_column_width, value_column_width, column_headers } = sub_section.field_group;\n  const is_horizontal = orientation === \"horizontal\";\n\n  // Get style variant for sub-section header (default to header_h2)\n  const style_variant: StyleVariant = sub_section.style_variant || \"header_h2\";\n  const style_config = config.styles[style_variant];\n\n  // Check if we have paired fields that need column headers\n  const has_column_headers = column_headers && column_headers.length > 0;\n\n  // Build validation rules for a field based on field_info\n  const get_validation_rules = (field: FormField) => {\n    const rules: Record<string, unknown> = {};\n\n    if (field.field_info.required) {\n      rules.required = `${field.label || \"This field\"} is required`;\n    }\n\n    if (field.field_info.min !== undefined) {\n      rules.min = {\n        value: field.field_info.min,\n        message: `Minimum value is ${field.field_info.min}`,\n      };\n    }\n\n    if (field.field_info.max !== undefined) {\n      rules.max = {\n        value: field.field_info.max,\n        message: `Maximum value is ${field.field_info.max}`,\n      };\n    }\n\n    if (field.field_info.min_length !== undefined) {\n      rules.minLength = {\n        value: field.field_info.min_length,\n        message: `Minimum length is ${field.field_info.min_length} characters`,\n      };\n    }\n\n    if (field.field_info.max_length !== undefined) {\n      rules.maxLength = {\n        value: field.field_info.max_length,\n        message: `Maximum length is ${field.field_info.max_length} characters`,\n      };\n    }\n\n    return rules;\n  };\n\n  // Render a single field with form integration\n  const render_field_with_form = (field: FormField, paired_value?: unknown, paired_on_change?: (value: unknown) => void, paired_on_blur?: () => void) => {\n    const field_error = errors?.[field.id];\n    const paired_error = field.paired_field ? errors?.[field.paired_field.id] : undefined;\n    const field_uploads = form_values ? get_field_uploads(form_values, field.id) : [];\n\n    if (form) {\n      const validation_rules = get_validation_rules(field);\n\n      return (\n        <Controller\n          name={field.id}\n          control={form.control}\n          defaultValue={field.value ?? \"\"}\n          rules={validation_rules}\n          render={({ field: form_field, fieldState }) => (\n            <FieldRenderer\n              field={field}\n              mode={mode}\n              value={form_field.value}\n              error={field_error || fieldState.error?.message}\n              config={config}\n              on_change={form_field.onChange}\n              on_blur={form_field.onBlur}\n              on_doc_link_click={\n                field.doc_links?.length && on_doc_link_click\n                  ? () => {\n                      const normalized = normalize_doc_links(field.doc_links);\n                      if (normalized.length > 0) {\n                        on_doc_link_click(field.id, normalized, field.label);\n                      }\n                    }\n                  : undefined\n              }\n              on_row_doc_link_click={on_doc_link_click}\n              badge_column_width={badge_column_width}\n              value_column_width={value_column_width}\n              paired_value={paired_value}\n              paired_on_change={paired_on_change}\n              paired_on_blur={paired_on_blur}\n              paired_error={paired_error}\n              upload_enabled={upload_enabled}\n              field_uploads={field_uploads}\n              on_upload_click={\n                on_upload_click\n                  ? () => on_upload_click(field.id, field.label)\n                  : undefined\n              }\n            />\n          )}\n        />\n      );\n    }\n\n    // Fallback: render without form context (view mode)\n    return (\n      <FieldRenderer\n        field={field}\n        mode={mode}\n        value={field.value}\n        error={field_error}\n        config={config}\n        on_change={() => {}}\n        on_doc_link_click={\n          field.doc_links?.length && on_doc_link_click\n            ? () => {\n                const normalized = normalize_doc_links(field.doc_links);\n                if (normalized.length > 0) {\n                  on_doc_link_click(field.id, normalized, field.label);\n                }\n              }\n            : undefined\n        }\n        on_row_doc_link_click={on_doc_link_click}\n        badge_column_width={badge_column_width}\n        value_column_width={value_column_width}\n        paired_value={field.paired_field?.value}\n        paired_error={paired_error}\n        upload_enabled={upload_enabled}\n        field_uploads={field_uploads}\n        on_upload_click={\n          on_upload_click\n            ? () => on_upload_click(field.id, field.label)\n            : undefined\n        }\n      />\n    );\n  };\n\n  return (\n    <div\n      className=\"cls_sub_section\"\n      style={{ marginBottom: config.sub_section_spacing }}\n    >\n      {show_header && sub_section.sub_section_label && (\n        <div\n          className=\"cls_sub_section_header border-b pb-2 mb-4\"\n          style={{\n            backgroundColor: style_config.background_color,\n            marginLeft: style_config.indent,\n            padding: style_config.background_color !== \"transparent\" ? \"8px 12px\" : undefined,\n            borderRadius: style_config.background_color !== \"transparent\" ? \"4px\" : undefined,\n          }}\n        >\n          <div className=\"flex items-center justify-between\">\n            <h3\n              style={{\n                color: style_config.font_color,\n                fontFamily: config.label_font_family,\n                fontSize: style_config.font_size,\n                fontWeight: style_config.font_weight,\n              }}\n            >\n              {sub_section.item_code && (\n                <span\n                  className=\"cls_item_code_box inline-flex items-center justify-center mr-2 px-1.5 py-0.5 border text-xs font-mono\"\n                  style={{\n                    borderColor: config.item_code_border_color,\n                    backgroundColor: config.item_code_background,\n                    fontSize: config.item_code_font_size,\n                  }}\n                >\n                  {sub_section.item_code}\n                </span>\n              )}\n              {sub_section.sub_section_label}\n              {sub_section.badge && (\n                <span\n                  className=\"cls_sub_section_badge inline-flex items-center justify-center ml-2 px-2 py-0.5 text-xs font-bold rounded\"\n                  style={{\n                    backgroundColor: \"#111827\",\n                    color: \"#ffffff\",\n                    minWidth: \"24px\",\n                  }}\n                >\n                  {sub_section.badge}\n                </span>\n              )}\n            </h3>\n            {/* Column headers in the header row */}\n            {has_column_headers && (\n              <div className=\"cls_column_headers flex items-center gap-2\">\n                {column_headers.map((header, idx) => (\n                  <div\n                    key={idx}\n                    className=\"cls_column_header text-sm font-medium text-center\"\n                    style={{\n                      width: header.width || value_column_width || \"120px\",\n                      color: style_config.font_color,\n                    }}\n                  >\n                    {header.label}\n                  </div>\n                ))}\n              </div>\n            )}\n          </div>\n        </div>\n      )}\n\n      <div\n        className={cn(\n          \"cls_field_group\",\n          is_horizontal\n            ? \"flex flex-wrap items-start\"\n            : \"flex flex-col\"\n        )}\n        style={{\n          gap: is_horizontal ? config.field_gap_horizontal : config.field_gap_vertical,\n          paddingLeft: \"12px\",\n          paddingRight: \"12px\",\n        }}\n      >\n        {fields.map((field) => {\n          // Handle paired fields - need to register both with form\n          if (field.paired_field && form) {\n            // Build validation rules for paired field\n            const paired_rules: Record<string, unknown> = {};\n            if (field.paired_field.field_info?.required) {\n              paired_rules.required = `${field.label || \"This field\"} (paired) is required`;\n            }\n            if (field.paired_field.field_info?.min !== undefined) {\n              paired_rules.min = {\n                value: field.paired_field.field_info.min,\n                message: `Minimum value is ${field.paired_field.field_info.min}`,\n              };\n            }\n            if (field.paired_field.field_info?.max !== undefined) {\n              paired_rules.max = {\n                value: field.paired_field.field_info.max,\n                message: `Maximum value is ${field.paired_field.field_info.max}`,\n              };\n            }\n\n            // Apply highlight row styling if specified\n            const is_highlight = field.row_variant === \"highlight\";\n\n            return (\n              <div\n                key={field.id}\n                className={cn(\n                  \"cls_field_wrapper\",\n                  is_horizontal && \"flex-1 min-w-[200px]\",\n                  is_highlight && \"cls_highlight_row\"\n                )}\n                style={{\n                  backgroundColor: is_highlight ? config.highlight_row_background : undefined,\n                  padding: is_highlight ? \"8px 12px\" : undefined,\n                  marginLeft: is_highlight ? \"-12px\" : undefined,\n                  marginRight: is_highlight ? \"-12px\" : undefined,\n                  width: is_highlight ? \"calc(100% + 24px)\" : \"100%\",\n                  borderRadius: is_highlight ? \"4px\" : undefined,\n                  boxSizing: \"border-box\",\n                }}\n              >\n                <Controller\n                  name={field.paired_field.id}\n                  control={form.control}\n                  defaultValue={field.paired_field.value ?? \"\"}\n                  rules={paired_rules}\n                  render={({ field: paired_form_field, fieldState: paired_field_state }) => (\n                    <>\n                      {render_field_with_form(\n                        field,\n                        paired_form_field.value,\n                        paired_form_field.onChange,\n                        paired_form_field.onBlur\n                      )}\n                    </>\n                  )}\n                />\n              </div>\n            );\n          }\n\n          // Regular field (no pairing)\n          // Apply highlight row styling if specified\n          const is_highlight = field.row_variant === \"highlight\";\n\n          return (\n            <div\n              key={field.id}\n              className={cn(\n                \"cls_field_wrapper\",\n                is_horizontal && \"flex-1 min-w-[200px]\",\n                is_highlight && \"cls_highlight_row\"\n              )}\n              style={{\n                backgroundColor: is_highlight ? config.highlight_row_background : undefined,\n                padding: is_highlight ? \"8px 12px\" : undefined,\n                marginLeft: is_highlight ? \"-12px\" : undefined,\n                marginRight: is_highlight ? \"-12px\" : undefined,\n                width: is_highlight ? \"calc(100% + 24px)\" : \"100%\",\n                borderRadius: is_highlight ? \"4px\" : undefined,\n                boxSizing: \"border-box\",\n              }}\n            >\n              {render_field_with_form(field)}\n            </div>\n          );\n        })}\n      </div>\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { SubSectionRenderer } from \"./sub_section_renderer\";\nimport { cn } from \"../../lib/utils\";\nimport type { FormSection, FormMode, FormConfig, FormErrors, DocLink, StyleVariant, FormValues } from \"../../lib/types\";\n\nexport interface SectionRendererProps {\n  section: FormSection;\n  mode: FormMode;\n  config: FormConfig;\n  show_header?: boolean;\n  show_sub_headers?: boolean;\n  collapsible?: boolean;\n  initially_collapsed?: boolean;\n  on_doc_link_click?: (field_id: string, doc_links: DocLink[], field_label?: string) => void;\n  errors?: FormErrors;\n  upload_enabled?: boolean;\n  form_values?: FormValues;\n  on_upload_click?: (field_id: string, field_label: string, section_name?: string, sub_section_id?: string) => void;\n}\n\n/**\n * Section Renderer\n * Renders a top-level section with its sub-sections\n */\nexport function SectionRenderer({\n  section,\n  mode,\n  config,\n  show_header = true,\n  show_sub_headers = true,\n  collapsible = false,\n  initially_collapsed = false,\n  on_doc_link_click,\n  errors,\n  upload_enabled,\n  form_values,\n  on_upload_click,\n}: SectionRendererProps) {\n  const [is_collapsed, set_is_collapsed] = React.useState(initially_collapsed);\n\n  const toggle_collapsed = () => {\n    if (collapsible) {\n      set_is_collapsed(!is_collapsed);\n    }\n  };\n\n  // Get style variant for section header (default to header_h1)\n  const style_variant: StyleVariant = section.style_variant || \"header_h1\";\n  const style_config = config.styles[style_variant];\n\n  return (\n    <section\n      className=\"cls_section\"\n      style={{ marginBottom: config.section_spacing }}\n    >\n      {show_header && section.section_name && (\n        <div\n          className={cn(\n            \"cls_section_header flex items-center justify-between py-3 px-4 rounded-md mb-4\",\n            collapsible && \"cursor-pointer hover:opacity-80\"\n          )}\n          style={{\n            backgroundColor: style_config.background_color,\n            marginLeft: style_config.indent,\n          }}\n          onClick={toggle_collapsed}\n          role={collapsible ? \"button\" : undefined}\n          aria-expanded={collapsible ? !is_collapsed : undefined}\n        >\n          <h2\n            className=\"cls_section_title\"\n            style={{\n              color: style_config.font_color,\n              fontFamily: config.label_font_family,\n              fontSize: style_config.font_size,\n              fontWeight: style_config.font_weight,\n            }}\n          >\n            {section.section_name}\n          </h2>\n\n          {collapsible && (\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              width=\"20\"\n              height=\"20\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              strokeWidth=\"2\"\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n              className={cn(\n                \"cls_collapse_icon transition-transform\",\n                is_collapsed && \"rotate-180\"\n              )}\n              style={{ color: style_config.font_color }}\n            >\n              <path d=\"m6 9 6 6 6-6\" />\n            </svg>\n          )}\n        </div>\n      )}\n\n      {!is_collapsed && (\n        <div\n          className={cn(\n            \"cls_section_content\",\n            section.sub_section_layout === \"horizontal\" && \"grid grid-cols-2 gap-6\"\n          )}\n        >\n          {section.sub_sections.map((sub_section) => (\n            <SubSectionRenderer\n              key={sub_section.sub_section_id}\n              sub_section={sub_section}\n              mode={mode}\n              config={config}\n              show_header={show_sub_headers}\n              on_doc_link_click={on_doc_link_click}\n              errors={errors}\n              upload_enabled={upload_enabled}\n              form_values={form_values}\n              on_upload_click={\n                on_upload_click\n                  ? (field_id: string, field_label: string) =>\n                      on_upload_click(field_id, field_label, section.section_name, sub_section.sub_section_id)\n                  : undefined\n              }\n            />\n          ))}\n        </div>\n      )}\n    </section>\n  );\n}\n\n// Re-export SubSectionRenderer\nexport { SubSectionRenderer } from \"./sub_section_renderer\";\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Group, Panel, Separator } from \"react-resizable-panels\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction ResizablePanelGroup({\n  className,\n  ...props\n}: React.ComponentProps<typeof Group>) {\n  return (\n    <Group\n      data-slot=\"resizable-panel-group\"\n      className={cn(\n        \"flex h-full w-full\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction ResizablePanel({\n  className,\n  ...props\n}: React.ComponentProps<typeof Panel>) {\n  return (\n    <Panel\n      data-slot=\"resizable-panel\"\n      className={cn(\"overflow-hidden\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction ResizableHandle({\n  withHandle,\n  className,\n  ...props\n}: React.ComponentProps<typeof Separator> & {\n  withHandle?: boolean\n}) {\n  return (\n    <Separator\n      data-slot=\"resizable-handle\"\n      className={cn(\n        \"cls_resizable_handle\",\n        \"relative flex w-2 items-center justify-center bg-border\",\n        \"cursor-col-resize select-none\",\n        \"hover:bg-primary/80 active:bg-primary transition-colors\",\n        \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n        className\n      )}\n      {...props}\n    >\n      {withHandle && (\n        <div className=\"z-10 flex h-8 w-4 items-center justify-center rounded bg-muted border border-border shadow-sm\">\n          {/* Grip icon - 6 dots in 2 columns */}\n          <svg\n            width=\"8\"\n            height=\"14\"\n            viewBox=\"0 0 8 14\"\n            fill=\"currentColor\"\n            className=\"text-muted-foreground\"\n          >\n            <circle cx=\"2\" cy=\"2\" r=\"1.2\" />\n            <circle cx=\"6\" cy=\"2\" r=\"1.2\" />\n            <circle cx=\"2\" cy=\"7\" r=\"1.2\" />\n            <circle cx=\"6\" cy=\"7\" r=\"1.2\" />\n            <circle cx=\"2\" cy=\"12\" r=\"1.2\" />\n            <circle cx=\"6\" cy=\"12\" r=\"1.2\" />\n          </svg>\n        </div>\n      )}\n    </Separator>\n  )\n}\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle }\n","/**\n * Core type definitions for hazo_data_forms\n */\n\n/**\n * Supported document types for DocLink\n * - \"pdf\": PDF documents (opens in embedded viewer)\n * - \"image\": Image files (jpg, png, gif, webp - displays inline preview)\n * - \"document\": Office documents (docx, xlsx, etc. - download only)\n * - \"other\": Any other file type (download only)\n */\nexport type DocLinkType = \"pdf\" | \"image\" | \"document\" | \"other\";\n\n/**\n * Document link configuration for document integration\n */\nexport interface DocLink {\n  /** Document type - determines how it's displayed */\n  type: DocLinkType;\n  /** URL/path to the document */\n  url: string;\n  /** Starting page (PDF only) */\n  page?: number;\n  /** Optional display name (if not provided, extracted from URL) */\n  filename?: string;\n  /** File ID for uploaded files (used for deletion) */\n  file_id?: string;\n}\n\n/**\n * Uploaded file metadata - stored in form values\n */\nexport interface UploadedFile {\n  /** Unique identifier for the file */\n  file_id: string;\n  /** Original filename */\n  filename: string;\n  /** URL/path where file is stored */\n  url: string;\n  /** MIME type */\n  mime_type: string;\n  /** File size in bytes */\n  size: number;\n  /** Upload timestamp (ISO string) */\n  uploaded_at: string;\n  /** Optional page number for PDFs (for doc_link navigation) */\n  page?: number;\n}\n\n/**\n * Field uploads - array of uploaded files per field\n */\nexport type FieldUploads = UploadedFile[];\n\n/**\n * Upload request sent to the upload handler callback\n */\nexport interface FileUploadRequest {\n  /** The field being uploaded to */\n  field_id: string;\n  /** Field label for context */\n  field_label: string;\n  /** The file being uploaded */\n  file: File;\n  /** Section name containing the field */\n  section_name?: string;\n  /** Sub-section ID containing the field */\n  sub_section_id?: string;\n}\n\n/**\n * Upload result returned from the upload handler callback\n */\nexport interface FileUploadResult {\n  /** Whether upload succeeded */\n  success: boolean;\n  /** The uploaded file metadata (on success) */\n  uploaded_file?: UploadedFile;\n  /** Error message (on failure) */\n  error?: string;\n}\n\n/**\n * File upload configuration\n */\nexport interface FileUploadConfig {\n  /** Enable/disable upload feature globally */\n  enabled: boolean;\n  /** Allowed MIME types (e.g., [\"application/pdf\", \"image/*\"]) */\n  allowed_types: string[];\n  /** Max file size in bytes (default: 10MB) */\n  max_file_size: number;\n  /** Max files per field (default: 5) */\n  max_files_per_field: number;\n  /** Default upload directory hint (passed to callback) */\n  default_directory?: string;\n  /** Upload icon color */\n  upload_icon_color: string;\n  /** Upload icon hover color */\n  upload_hover_color: string;\n}\n\n/**\n * File manager configuration\n * Controls the unified file management button and panel\n */\nexport interface FileManagerConfig {\n  /** Default display mode: \"sidebar\" or \"dialog\" */\n  display_mode: \"sidebar\" | \"dialog\";\n  /** Icon size */\n  icon_size: string;\n  /** Icon color when no files */\n  icon_color: string;\n  /** Icon color on hover */\n  icon_color_hover: string;\n  /** Icon color when has files */\n  icon_color_with_files: string;\n  /** Badge background color */\n  badge_background: string;\n  /** Badge text color */\n  badge_text_color: string;\n  /** Dialog width */\n  dialog_width: string;\n  /** Dialog max height */\n  dialog_max_height: string;\n  /** Button column width */\n  button_column_width: string;\n}\n\n/**\n * Help tooltip configuration for field labels\n * Displays a question mark icon that shows help content on hover\n */\nexport interface HelpTooltip {\n  /** Custom help message to display */\n  message?: string;\n  /** Whether to show the calculation formula (for computed fields) */\n  show_formula?: boolean;\n  /** Custom formula display text (overrides computed_formula for display) */\n  formula_display?: string;\n}\n\n/**\n * Style level type (H1-H6) for hierarchical styling\n */\nexport type StyleLevel = \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\n/**\n * Style variant combining type (header/total) and level (h1-h6)\n * Used to specify styling for sections, sub-sections, and field rows\n */\nexport type StyleVariant =\n  | `header_${StyleLevel}`\n  | `total_${StyleLevel}`;\n\n/**\n * Individual style level configuration (legacy format)\n * Defines visual properties for each header/total level\n * @deprecated Use StyleClassDefinition instead\n */\nexport interface StyleLevelConfig {\n  font_size: string;\n  font_weight: string;\n  font_color: string;\n  background_color: string;\n  indent: string;\n}\n\n/**\n * Full hierarchical style configuration (legacy format)\n * Contains styling for all header and total levels (h1-h6)\n * @deprecated Use StylesConfig instead\n */\nexport interface HierarchicalStyleConfig {\n  header_h1: StyleLevelConfig;\n  header_h2: StyleLevelConfig;\n  header_h3: StyleLevelConfig;\n  header_h4: StyleLevelConfig;\n  header_h5: StyleLevelConfig;\n  header_h6: StyleLevelConfig;\n  total_h1: StyleLevelConfig;\n  total_h2: StyleLevelConfig;\n  total_h3: StyleLevelConfig;\n  total_h4: StyleLevelConfig;\n  total_h5: StyleLevelConfig;\n  total_h6: StyleLevelConfig;\n}\n\n// =============================================================================\n// NEW STYLE SYSTEM TYPES\n// =============================================================================\n\n/**\n * Design tokens for reusable style values\n */\nexport interface StyleTokens {\n  colors: Record<string, string>;\n  fonts: Record<string, string>;\n  spacing: Record<string, string>;\n}\n\n/**\n * Style class definition - CSS-class-like styling\n * Supports inheritance via 'extends' property\n * Token references use {category.key} syntax (e.g., \"{colors.primary}\")\n */\nexport interface StyleClassDefinition {\n  /** Inherit from another style class */\n  extends?: string;\n\n  // Color properties\n  color?: string;\n  background_color?: string;\n  border_color?: string;\n\n  // Border properties\n  border_width?: string;\n  border_radius?: string;\n\n  // Font properties\n  font_family?: string;\n  font_size?: string;\n  font_weight?: string;\n  line_height?: string;\n  letter_spacing?: string;\n\n  // Spacing properties\n  padding?: string;\n  padding_x?: string;\n  padding_y?: string;\n  margin?: string;\n  margin_left?: string;\n  margin_top?: string;\n\n  // Layout properties\n  text_align?: string;\n  min_width?: string;\n  min_height?: string;\n\n  // Other properties\n  opacity?: number;\n  indent?: string;\n}\n\n/**\n * Complete styles configuration loaded from form_styles.json\n */\nexport interface StylesConfig {\n  meta?: {\n    version?: string;\n    name?: string;\n    description?: string;\n  };\n  tokens: StyleTokens;\n  styles: Record<string, StyleClassDefinition>;\n}\n\n/**\n * Resolved style after inheritance resolution and token substitution\n */\nexport interface ResolvedStyle {\n  color?: string;\n  background_color?: string;\n  border_color?: string;\n  border_width?: string;\n  border_radius?: string;\n  font_family?: string;\n  font_size?: string;\n  font_weight?: string;\n  line_height?: string;\n  letter_spacing?: string;\n  padding?: string;\n  padding_x?: string;\n  padding_y?: string;\n  margin?: string;\n  margin_left?: string;\n  margin_top?: string;\n  text_align?: string;\n  min_width?: string;\n  min_height?: string;\n  opacity?: number;\n  indent?: string;\n}\n\n// =============================================================================\n// NEW FIELD TYPE SYSTEM TYPES\n// =============================================================================\n\n/**\n * Base field types - built-in renderers available in the library\n */\nexport type BaseFieldType =\n  | \"text\"\n  | \"number\"\n  | \"date\"\n  | \"boolean\"\n  | \"option\"\n  | \"email\"\n  | \"tel\"\n  | \"currency\"\n  | \"percentage\"\n  | \"textarea\"\n  | \"table\"\n  | \"computed\"\n  | \"static_text\"\n  | \"summary_row\";\n\n/**\n * Field type - includes base types and any custom types defined in config\n * Custom types (like \"tfn\", \"abn\") are resolved to base types at runtime\n */\nexport type FieldType = BaseFieldType | string;\n\n/**\n * Field type definition for configurable field types\n * Loaded from form_field_types.json\n */\nexport interface FieldTypeDefinition {\n  /** Which built-in renderer to use */\n  base_type: BaseFieldType;\n\n  /** Inherit from another field type definition */\n  extends?: string;\n\n  /** Human-readable label for this field type */\n  label?: string;\n\n  // Validation\n  /** Regex pattern for validation (validates raw/unmasked value) */\n  pattern?: string;\n  /** Error message when validation fails */\n  validation_message?: string;\n\n  // Masking/formatting\n  /** Display format with X placeholders for digits */\n  display_format?: string;\n  /** Input mask with # for digit placeholders */\n  input_mask?: string;\n  /** Default placeholder text */\n  placeholder?: string;\n  /** Maximum input length (including formatting chars) */\n  max_length?: number;\n  /** Number of digits (without formatting) */\n  digit_count?: number;\n\n  // Input behavior\n  /** HTML inputmode attribute for mobile keyboards */\n  input_mode?: \"text\" | \"numeric\" | \"tel\" | \"email\" | \"url\" | \"decimal\";\n\n  // Display\n  /** Prefix to display before value */\n  prefix?: string;\n  /** Suffix to display after value */\n  suffix?: string;\n  /** Style class to apply from form_styles.json */\n  style_class?: string;\n\n  // Numeric constraints\n  /** Default decimal places for numeric types */\n  decimal_places?: number;\n  /** Minimum value for numeric types */\n  min?: number;\n  /** Maximum value for numeric types */\n  max?: number;\n}\n\n/**\n * Field types configuration loaded from form_field_types.json\n */\nexport interface FieldTypesConfig {\n  meta?: {\n    version?: string;\n    description?: string;\n  };\n  field_types: Record<string, FieldTypeDefinition>;\n}\n\n// =============================================================================\n// EXISTING FIELD AND FORM TYPES\n// =============================================================================\n\n/**\n * Option item for select/option fields\n */\nexport interface OptionItem {\n  label: string;\n  value: string;\n}\n\n/**\n * Table column definition for table/array fields\n */\nexport interface TableColumn {\n  id: string;\n  label: string;\n  field_info: Omit<FieldInfo, \"table_columns\" | \"table_min_rows\" | \"table_max_rows\">;\n  width?: string;\n  /** If true, display a subtotal for this column at the bottom of the table */\n  subtotal?: boolean;\n  /** Default value for this column when adding new rows */\n  default_value?: unknown;\n  /** Optional reference value displayed below cell inputs (e.g., prior-year value, benchmark) */\n  reference_value?: string;\n}\n\n/**\n * Field information configuration\n */\nexport interface FieldInfo {\n  field_type: FieldType;\n  required?: boolean;\n  options?: OptionItem[];\n  min?: number;\n  max?: number;\n  decimal_places?: number;\n  currency_symbol?: string;\n  min_length?: number;\n  max_length?: number;\n  rows?: number;\n  placeholder?: string;\n  disabled?: boolean;\n  computed_formula?: string;\n  computed_dependencies?: string[];\n  table_columns?: TableColumn[];\n  table_min_rows?: number;\n  table_max_rows?: number;\n  table_title?: string;  // Title displayed above the table (e.g., \"WORKSHEET\")\n  /** Default value for this field when no value is provided */\n  default_value?: unknown;\n\n  // Tax form specific properties\n  badge?: string;\n  item_code?: string;\n  display_variant?: \"label_only\" | \"value_only\" | \"inline\";\n  width?: string;\n  text_align?: \"left\" | \"center\" | \"right\";\n  static_content?: string;\n  summary_fields?: string[];\n  summary_note?: string;  // Note displayed next to summary row label (e.g., \"Items D11 to D15\")\n  is_worksheet?: boolean;  // Indented worksheet table styling\n  formula_label?: string;  // Plain text formula annotation displayed in badge column (e.g., \"P less (Q + F + U)\")\n}\n\n/**\n * Label position for field layout\n * - \"stacked\": Label above the input field (default)\n * - \"inline\": Label on the same line as the input field\n */\nexport type LabelPosition = \"stacked\" | \"inline\";\n\n/**\n * Individual field definition\n */\nexport interface FormField {\n  id: string;\n  label: string;\n  field_info: FieldInfo;\n  value?: unknown;\n  /** Default value used when no value is provided (used for initial form state) */\n  default_value?: unknown;\n  /** Array of document links for this field */\n  doc_links?: DocLink[];\n  label_position?: LabelPosition;\n  style_variant?: StyleVariant;\n  help_tooltip?: HelpTooltip;\n  /** Field-level override for value column width (e.g., \"150px\") */\n  value_width?: string;\n  /** Row variant for special row styling (e.g., highlight row) */\n  row_variant?: \"highlight\" | \"normal\";\n  /** Optional reference value displayed below the field (e.g., prior-year value, benchmark) */\n  reference_value?: string;\n  /**\n   * Paired field for dual-column layouts (e.g., Capital gains / Capital losses)\n   * When present, renders both fields on the same row with their own badge+value\n   */\n  paired_field?: Omit<FormField, \"label\" | \"paired_field\" | \"label_position\">;\n}\n\n/**\n * Column header definition for multi-column layouts\n */\nexport interface ColumnHeader {\n  label: string;\n  width?: string;\n}\n\n/**\n * Field group with orientation\n */\nexport interface FieldGroup {\n  orientation: \"horizontal\" | \"vertical\";\n  fields: FormField[];\n  /** Fixed width for badge column when badges should be aligned (e.g., \"40px\") */\n  badge_column_width?: string;\n  /** Fixed width for value column when values should be aligned (e.g., \"80px\") */\n  value_column_width?: string;\n  /**\n   * Column headers for paired field layouts (e.g., [\"Capital gains\", \"Capital losses\"])\n   * When present, displays column headers above the badge+value columns\n   */\n  column_headers?: ColumnHeader[];\n}\n\n/**\n * Sub-section within a section\n */\nexport interface SubSection {\n  sub_section_id: string;\n  sub_section_label: string;\n  field_group: FieldGroup;\n  item_code?: string;  // Boxed prefix like [1], [10]\n  badge?: string;  // Letter badge like \"J\", \"M\" displayed in header\n  style_variant?: StyleVariant;  // e.g., \"header_h2\"\n}\n\n/**\n * Top-level section\n */\nexport interface FormSection {\n  section_name: string;\n  sub_sections: SubSection[];\n  sub_section_layout?: \"vertical\" | \"horizontal\";\n  style_variant?: StyleVariant;  // e.g., \"header_h1\"\n}\n\n/**\n * Complete form schema (array of sections)\n */\nexport type FormSchema = FormSection[];\n\n/**\n * Form values as a flat key-value map\n */\nexport type FormValues = Record<string, unknown>;\n\n/**\n * Form mode\n */\nexport type FormMode = \"edit\" | \"view\";\n\n/**\n * PDF panel position\n */\nexport type PdfPanelPosition = \"right\" | \"left\" | \"bottom\";\n\n/**\n * Callback event for doc_links click\n */\nexport interface DocLinkClickEvent {\n  field_id: string;\n  /** All doc_links for this field */\n  doc_links: DocLink[];\n}\n\n/**\n * Form validation errors\n */\nexport type FormErrors = Record<string, string>;\n\n// =============================================================================\n// FORM CONFIG\n// =============================================================================\n\n/**\n * Config options loaded from INI file and JSON configs\n */\nexport interface FormConfig {\n  // Paths to config files\n  styles_path?: string;\n  field_types_path?: string;\n\n  // Doc link settings\n  doc_link_icon_size: string;\n  doc_link_icon_style: \"solid\" | \"outline\";\n  doc_link_column_width: string;\n\n  // PDF Panel settings\n  pdf_panel_width: string;\n  pdf_panel_min_width: string;\n  pdf_panel_max_width: string;\n\n  // Formatting settings\n  default_currency_symbol: string;\n  date_format: string;\n  default_decimal_places: number;\n  percentage_suffix: string;\n\n  // Feature flags\n  enable_pdf_panel?: boolean;\n  collapsible_sections?: boolean;\n  validate_on_blur?: boolean;\n  validate_on_change?: boolean;\n\n  // File upload settings\n  file_upload: FileUploadConfig;\n\n  // File manager settings\n  file_manager: FileManagerConfig;\n\n  // New style system (loaded from form_styles.json)\n  styles_config: StylesConfig;\n\n  // New field type system (loaded from form_field_types.json)\n  field_types_config: FieldTypesConfig;\n\n  // Legacy: Hierarchical styles (kept for backward compatibility)\n  // @deprecated Use styles_config instead\n  styles: HierarchicalStyleConfig;\n\n  // Legacy style properties (kept for backward compatibility)\n  // @deprecated Use styles_config instead\n  label_color: string;\n  label_color_required: string;\n  field_border_color: string;\n  field_border_color_focus: string;\n  field_background_color: string;\n  field_background_color_disabled: string;\n  section_header_color: string;\n  section_header_background: string;\n  sub_section_header_color: string;\n  error_color: string;\n  doc_link_icon_color: string;\n  doc_link_hover_color: string;\n  view_mode_background: string;\n  view_mode_border: string;\n  label_font_family: string;\n  label_font_size: string;\n  label_font_weight: string;\n  field_font_family: string;\n  field_font_size: string;\n  section_header_font_size: string;\n  sub_section_header_font_size: string;\n  section_spacing: string;\n  sub_section_spacing: string;\n  field_spacing: string;\n  field_gap_horizontal: string;\n  field_gap_vertical: string;\n  label_field_gap: string;\n  item_code_border_color: string;\n  item_code_background: string;\n  item_code_font_size: string;\n  worksheet_indent: string;\n  worksheet_label_font_weight: string;\n  highlight_row_background: string;\n  badge_background: string;\n  badge_text_color: string;\n}\n\n/**\n * Partial config for overrides\n */\nexport type PartialFormConfig = Partial<FormConfig>;\n\n/**\n * Default styles configuration\n */\nexport const DEFAULT_STYLES_CONFIG: StylesConfig = {\n  meta: {\n    version: \"1.0.0\",\n    name: \"Default Theme\",\n  },\n  tokens: {\n    colors: {\n      primary: \"#1e3a5f\",\n      primary_foreground: \"#ffffff\",\n      secondary: \"#3b82f6\",\n      secondary_hover: \"#1d4ed8\",\n      text_primary: \"#111827\",\n      text_secondary: \"#374151\",\n      text_muted: \"#6b7280\",\n      text_disabled: \"#9ca3af\",\n      background: \"#ffffff\",\n      background_muted: \"#f9fafb\",\n      background_subtle: \"#f3f4f6\",\n      border: \"#d1d5db\",\n      border_focus: \"#3b82f6\",\n      error: \"#dc2626\",\n      highlight: \"#e0f2fe\",\n      transparent: \"transparent\",\n    },\n    fonts: {\n      sans: \"system-ui, -apple-system, sans-serif\",\n      mono: \"ui-monospace, SFMono-Regular, monospace\",\n    },\n    spacing: {\n      xs: \"4px\",\n      sm: \"8px\",\n      md: \"12px\",\n      lg: \"16px\",\n      xl: \"24px\",\n      \"2xl\": \"32px\",\n    },\n  },\n  styles: {\n    default: {\n      font_family: \"{fonts.sans}\",\n      font_size: \"14px\",\n      font_weight: \"400\",\n      color: \"{colors.text_primary}\",\n      line_height: \"1.5\",\n    },\n    label: {\n      extends: \"default\",\n      font_weight: \"500\",\n      color: \"{colors.text_secondary}\",\n    },\n    label_required: {\n      extends: \"label\",\n      color: \"{colors.error}\",\n    },\n    field: {\n      extends: \"default\",\n      background_color: \"{colors.background}\",\n      border_color: \"{colors.border}\",\n      border_width: \"1px\",\n      border_radius: \"6px\",\n      padding_x: \"{spacing.md}\",\n      padding_y: \"{spacing.sm}\",\n    },\n    field_focus: {\n      extends: \"field\",\n      border_color: \"{colors.border_focus}\",\n    },\n    field_disabled: {\n      extends: \"field\",\n      background_color: \"{colors.background_subtle}\",\n      color: \"{colors.text_muted}\",\n    },\n    field_view: {\n      extends: \"field\",\n      background_color: \"{colors.background_muted}\",\n      border_color: \"{colors.transparent}\",\n    },\n    field_mono: {\n      extends: \"field\",\n      font_family: \"{fonts.mono}\",\n      letter_spacing: \"0.05em\",\n    },\n    error_message: {\n      font_size: \"12px\",\n      color: \"{colors.error}\",\n      margin_top: \"{spacing.xs}\",\n    },\n    badge: {\n      font_size: \"12px\",\n      font_weight: \"700\",\n      color: \"{colors.primary_foreground}\",\n      background_color: \"{colors.text_primary}\",\n      padding_x: \"{spacing.sm}\",\n      padding_y: \"2px\",\n      border_radius: \"4px\",\n      min_width: \"24px\",\n      text_align: \"center\",\n    },\n    item_code: {\n      font_family: \"{fonts.mono}\",\n      font_size: \"12px\",\n      color: \"{colors.text_primary}\",\n      background_color: \"{colors.background}\",\n      border_color: \"{colors.text_primary}\",\n      border_width: \"1px\",\n      padding_x: \"6px\",\n      padding_y: \"2px\",\n    },\n    highlight_row: {\n      background_color: \"{colors.highlight}\",\n      padding_x: \"{spacing.md}\",\n      padding_y: \"{spacing.sm}\",\n      border_radius: \"4px\",\n    },\n    doc_link: {\n      color: \"{colors.secondary}\",\n      min_width: \"32px\",\n    },\n    worksheet: {\n      margin_left: \"{spacing.xl}\",\n      font_weight: \"600\",\n    },\n    header_h1: {\n      font_size: \"20px\",\n      font_weight: \"700\",\n      color: \"{colors.primary_foreground}\",\n      background_color: \"{colors.primary}\",\n      indent: \"0px\",\n    },\n    header_h2: {\n      font_size: \"18px\",\n      font_weight: \"600\",\n      color: \"{colors.text_primary}\",\n      background_color: \"{colors.background_subtle}\",\n      indent: \"0px\",\n    },\n    header_h3: {\n      font_size: \"16px\",\n      font_weight: \"600\",\n      color: \"{colors.text_secondary}\",\n      background_color: \"{colors.transparent}\",\n      indent: \"0px\",\n    },\n    header_h4: {\n      font_size: \"14px\",\n      font_weight: \"600\",\n      color: \"{colors.text_secondary}\",\n      background_color: \"{colors.transparent}\",\n      indent: \"{spacing.sm}\",\n    },\n    header_h5: {\n      font_size: \"14px\",\n      font_weight: \"500\",\n      color: \"{colors.text_muted}\",\n      background_color: \"{colors.transparent}\",\n      indent: \"{spacing.lg}\",\n    },\n    header_h6: {\n      font_size: \"12px\",\n      font_weight: \"500\",\n      color: \"{colors.text_disabled}\",\n      background_color: \"{colors.transparent}\",\n      indent: \"{spacing.xl}\",\n    },\n    total_h1: {\n      font_size: \"18px\",\n      font_weight: \"700\",\n      color: \"{colors.text_primary}\",\n      background_color: \"{colors.highlight}\",\n      indent: \"0px\",\n    },\n    total_h2: {\n      font_size: \"16px\",\n      font_weight: \"600\",\n      color: \"{colors.text_primary}\",\n      background_color: \"{colors.background_subtle}\",\n      indent: \"0px\",\n    },\n    total_h3: {\n      font_size: \"14px\",\n      font_weight: \"600\",\n      color: \"{colors.text_secondary}\",\n      background_color: \"{colors.background_muted}\",\n      indent: \"0px\",\n    },\n    total_h4: {\n      font_size: \"14px\",\n      font_weight: \"500\",\n      color: \"{colors.text_secondary}\",\n      background_color: \"{colors.transparent}\",\n      indent: \"{spacing.sm}\",\n    },\n    total_h5: {\n      font_size: \"14px\",\n      font_weight: \"500\",\n      color: \"{colors.text_muted}\",\n      background_color: \"{colors.transparent}\",\n      indent: \"{spacing.lg}\",\n    },\n    total_h6: {\n      font_size: \"12px\",\n      font_weight: \"500\",\n      color: \"{colors.text_disabled}\",\n      background_color: \"{colors.transparent}\",\n      indent: \"{spacing.xl}\",\n    },\n  },\n};\n\n/**\n * Default field types configuration\n */\nexport const DEFAULT_FIELD_TYPES_CONFIG: FieldTypesConfig = {\n  meta: {\n    version: \"1.0.0\",\n  },\n  field_types: {\n    tfn: {\n      base_type: \"text\",\n      label: \"Tax File Number\",\n      pattern: \"^\\\\d{9}$\",\n      display_format: \"XXX XXX XXX\",\n      input_mask: \"### ### ###\",\n      placeholder: \"XXX XXX XXX\",\n      max_length: 11,\n      digit_count: 9,\n      validation_message: \"Tax File Number must be 9 digits\",\n      input_mode: \"numeric\",\n      style_class: \"field_mono\",\n    },\n    abn: {\n      base_type: \"text\",\n      label: \"Australian Business Number\",\n      pattern: \"^\\\\d{11}$\",\n      display_format: \"XX XXX XXX XXX\",\n      input_mask: \"## ### ### ###\",\n      placeholder: \"XX XXX XXX XXX\",\n      max_length: 14,\n      digit_count: 11,\n      validation_message: \"Australian Business Number must be 11 digits\",\n      input_mode: \"numeric\",\n      style_class: \"field_mono\",\n    },\n  },\n};\n\n/**\n * Default form configuration values\n */\nexport const DEFAULT_FORM_CONFIG: FormConfig = {\n  // Paths\n  styles_path: \"/config/form_styles.json\",\n  field_types_path: \"/config/form_field_types.json\",\n\n  // Doc link\n  doc_link_icon_size: \"20px\",\n  doc_link_icon_style: \"solid\",\n  doc_link_column_width: \"32px\",\n\n  // PDF Panel\n  pdf_panel_width: \"50vw\",\n  pdf_panel_min_width: \"400px\",\n  pdf_panel_max_width: \"80vw\",\n\n  // Formatting\n  default_currency_symbol: \"$\",\n  date_format: \"MMM d, yyyy\",\n  default_decimal_places: 2,\n  percentage_suffix: \"%\",\n\n  // Feature flags\n  enable_pdf_panel: true,\n  collapsible_sections: false,\n  validate_on_blur: true,\n  validate_on_change: false,\n\n  // File upload settings\n  file_upload: {\n    enabled: false, // Opt-in - must be explicitly enabled\n    allowed_types: [\n      \"application/pdf\",\n      \"image/jpeg\",\n      \"image/png\",\n      \"image/gif\",\n      \"image/webp\",\n    ],\n    max_file_size: 10 * 1024 * 1024, // 10MB\n    max_files_per_field: 5,\n    default_directory: \"/uploads\",\n    upload_icon_color: \"#6b7280\", // Gray\n    upload_hover_color: \"#3b82f6\", // Blue\n  },\n\n  // File manager settings\n  file_manager: {\n    display_mode: \"sidebar\",\n    icon_size: \"20px\",\n    icon_color: \"#6b7280\", // Gray (no files)\n    icon_color_hover: \"#3b82f6\", // Blue\n    icon_color_with_files: \"#3b82f6\", // Blue\n    badge_background: \"#3b82f6\", // Blue\n    badge_text_color: \"#ffffff\", // White\n    dialog_width: \"700px\",\n    dialog_max_height: \"80vh\",\n    button_column_width: \"32px\",\n  },\n\n  // New config systems\n  styles_config: DEFAULT_STYLES_CONFIG,\n  field_types_config: DEFAULT_FIELD_TYPES_CONFIG,\n\n  // Legacy: Colors (deprecated - use styles_config)\n  label_color: \"#374151\",\n  label_color_required: \"#dc2626\",\n  field_border_color: \"#d1d5db\",\n  field_border_color_focus: \"#3b82f6\",\n  field_background_color: \"#ffffff\",\n  field_background_color_disabled: \"#f3f4f6\",\n  section_header_color: \"#ffffff\",\n  section_header_background: \"#1e3a5f\",\n  sub_section_header_color: \"#374151\",\n  error_color: \"#dc2626\",\n  doc_link_icon_color: \"#3b82f6\",\n  doc_link_hover_color: \"#1d4ed8\",\n  view_mode_background: \"#f9fafb\",\n  view_mode_border: \"transparent\",\n\n  // Legacy: Fonts (deprecated - use styles_config)\n  label_font_family: \"system-ui, -apple-system, sans-serif\",\n  label_font_size: \"14px\",\n  label_font_weight: \"500\",\n  field_font_family: \"system-ui, -apple-system, sans-serif\",\n  field_font_size: \"14px\",\n  section_header_font_size: \"18px\",\n  sub_section_header_font_size: \"16px\",\n\n  // Legacy: Spacing (deprecated - use styles_config)\n  section_spacing: \"32px\",\n  sub_section_spacing: \"24px\",\n  field_spacing: \"16px\",\n  field_gap_horizontal: \"16px\",\n  field_gap_vertical: \"12px\",\n  label_field_gap: \"6px\",\n\n  // Legacy: Item code styling (deprecated - use styles_config)\n  item_code_border_color: \"#000000\",\n  item_code_background: \"#ffffff\",\n  item_code_font_size: \"12px\",\n\n  // Legacy: Worksheet styling (deprecated - use styles_config)\n  worksheet_indent: \"24px\",\n  worksheet_label_font_weight: \"600\",\n\n  // Legacy: Highlight row styling (deprecated - use styles_config)\n  highlight_row_background: \"#e0f2fe\",\n\n  // Legacy: Badge styling (deprecated - use styles_config)\n  badge_background: \"#000000\",\n  badge_text_color: \"#ffffff\",\n\n  // Legacy: Hierarchical styles (deprecated - use styles_config)\n  styles: {\n    header_h1: {\n      font_size: \"20px\",\n      font_weight: \"700\",\n      font_color: \"#ffffff\",\n      background_color: \"#1e3a5f\",\n      indent: \"0px\",\n    },\n    header_h2: {\n      font_size: \"18px\",\n      font_weight: \"600\",\n      font_color: \"#111827\",\n      background_color: \"#f3f4f6\",\n      indent: \"0px\",\n    },\n    header_h3: {\n      font_size: \"16px\",\n      font_weight: \"600\",\n      font_color: \"#374151\",\n      background_color: \"transparent\",\n      indent: \"0px\",\n    },\n    header_h4: {\n      font_size: \"14px\",\n      font_weight: \"600\",\n      font_color: \"#374151\",\n      background_color: \"transparent\",\n      indent: \"8px\",\n    },\n    header_h5: {\n      font_size: \"14px\",\n      font_weight: \"500\",\n      font_color: \"#6b7280\",\n      background_color: \"transparent\",\n      indent: \"16px\",\n    },\n    header_h6: {\n      font_size: \"12px\",\n      font_weight: \"500\",\n      font_color: \"#9ca3af\",\n      background_color: \"transparent\",\n      indent: \"24px\",\n    },\n    total_h1: {\n      font_size: \"18px\",\n      font_weight: \"700\",\n      font_color: \"#111827\",\n      background_color: \"#e0f2fe\",\n      indent: \"0px\",\n    },\n    total_h2: {\n      font_size: \"16px\",\n      font_weight: \"600\",\n      font_color: \"#111827\",\n      background_color: \"#f3f4f6\",\n      indent: \"0px\",\n    },\n    total_h3: {\n      font_size: \"14px\",\n      font_weight: \"600\",\n      font_color: \"#374151\",\n      background_color: \"#f9fafb\",\n      indent: \"0px\",\n    },\n    total_h4: {\n      font_size: \"14px\",\n      font_weight: \"500\",\n      font_color: \"#374151\",\n      background_color: \"transparent\",\n      indent: \"8px\",\n    },\n    total_h5: {\n      font_size: \"14px\",\n      font_weight: \"500\",\n      font_color: \"#6b7280\",\n      background_color: \"transparent\",\n      indent: \"16px\",\n    },\n    total_h6: {\n      font_size: \"12px\",\n      font_weight: \"500\",\n      font_color: \"#9ca3af\",\n      background_color: \"transparent\",\n      indent: \"24px\",\n    },\n  },\n};\n","\"use client\";\n\nimport { useState, useEffect, useMemo } from \"react\";\nimport type {\n  FormConfig,\n  PartialFormConfig,\n  HierarchicalStyleConfig,\n  StyleVariant,\n  StylesConfig,\n  FieldTypesConfig,\n} from \"../lib/types\";\nimport {\n  DEFAULT_FORM_CONFIG,\n  DEFAULT_STYLES_CONFIG,\n  DEFAULT_FIELD_TYPES_CONFIG,\n} from \"../lib/types\";\nimport { parse_number, deep_merge } from \"../lib/utils\";\n\n/**\n * Load and merge form configuration from INI file, JSON configs, and overrides\n */\nexport function useFormConfig(\n  config_path?: string,\n  config_override?: PartialFormConfig\n): FormConfig {\n  const [loaded_config, set_loaded_config] = useState<PartialFormConfig>({});\n  const [styles_config, set_styles_config] = useState<StylesConfig | null>(null);\n  const [field_types_config, set_field_types_config] = useState<FieldTypesConfig | null>(null);\n  const [is_loading, set_is_loading] = useState(true);\n\n  useEffect(() => {\n    async function load_configs() {\n      // Load INI config first to get paths\n      let ini_config: PartialFormConfig = {};\n\n      if (config_path) {\n        // Client-side: fetch the INI file\n        if (typeof window !== \"undefined\") {\n          try {\n            const response = await fetch(config_path);\n            if (response.ok) {\n              const text = await response.text();\n              ini_config = parse_ini_text(text);\n              set_loaded_config(ini_config);\n            }\n          } catch {\n            console.warn(\n              `Failed to load config from ${config_path}, using defaults`\n            );\n          }\n        }\n      }\n\n      // Determine paths for JSON configs\n      const styles_path = ini_config.styles_path ||\n        config_override?.styles_path ||\n        DEFAULT_FORM_CONFIG.styles_path ||\n        \"/config/form_styles.json\";\n\n      const field_types_path = ini_config.field_types_path ||\n        config_override?.field_types_path ||\n        DEFAULT_FORM_CONFIG.field_types_path ||\n        \"/config/form_field_types.json\";\n\n      // Load styles JSON (client-side only)\n      if (typeof window !== \"undefined\") {\n        try {\n          const styles_response = await fetch(styles_path);\n          if (styles_response.ok) {\n            const styles = await styles_response.json();\n            set_styles_config(styles as StylesConfig);\n          } else {\n            console.warn(`Failed to load styles from ${styles_path}, using defaults`);\n          }\n        } catch {\n          console.warn(`Failed to load form_styles.json from ${styles_path}, using defaults`);\n        }\n\n        // Load field types JSON\n        try {\n          const field_types_response = await fetch(field_types_path);\n          if (field_types_response.ok) {\n            const field_types = await field_types_response.json();\n            set_field_types_config(field_types as FieldTypesConfig);\n          } else {\n            console.warn(`Failed to load field types from ${field_types_path}, using defaults`);\n          }\n        } catch {\n          console.warn(`Failed to load form_field_types.json from ${field_types_path}, using defaults`);\n        }\n      }\n\n      set_is_loading(false);\n    }\n\n    load_configs();\n  }, [config_path, config_override?.styles_path, config_override?.field_types_path]);\n\n  // Merge configs: defaults < loaded < override\n  const merged_config = useMemo(() => {\n    let config: FormConfig = { ...DEFAULT_FORM_CONFIG };\n\n    // Merge INI config\n    if (Object.keys(loaded_config).length > 0) {\n      config = deep_merge(\n        config as unknown as Record<string, unknown>,\n        loaded_config as Record<string, unknown>\n      ) as unknown as FormConfig;\n    }\n\n    // Merge overrides\n    if (config_override && Object.keys(config_override).length > 0) {\n      config = deep_merge(\n        config as unknown as Record<string, unknown>,\n        config_override as Record<string, unknown>\n      ) as unknown as FormConfig;\n    }\n\n    // Merge styles config (prefer loaded JSON, fallback to default)\n    if (styles_config) {\n      config.styles_config = merge_styles_config(DEFAULT_STYLES_CONFIG, styles_config);\n    } else {\n      config.styles_config = DEFAULT_STYLES_CONFIG;\n    }\n\n    // If override has styles_config, merge it too\n    if (config_override?.styles_config) {\n      config.styles_config = merge_styles_config(\n        config.styles_config,\n        config_override.styles_config\n      );\n    }\n\n    // Merge field types config (prefer loaded JSON, fallback to default)\n    if (field_types_config) {\n      config.field_types_config = merge_field_types_config(\n        DEFAULT_FIELD_TYPES_CONFIG,\n        field_types_config\n      );\n    } else {\n      config.field_types_config = DEFAULT_FIELD_TYPES_CONFIG;\n    }\n\n    // If override has field_types_config, merge it too\n    if (config_override?.field_types_config) {\n      config.field_types_config = merge_field_types_config(\n        config.field_types_config,\n        config_override.field_types_config\n      );\n    }\n\n    return config;\n  }, [loaded_config, config_override, styles_config, field_types_config]);\n\n  return merged_config;\n}\n\n/**\n * Merge two StylesConfig objects\n */\nfunction merge_styles_config(\n  base: StylesConfig,\n  override: StylesConfig\n): StylesConfig {\n  return {\n    meta: { ...base.meta, ...override.meta },\n    tokens: {\n      colors: { ...base.tokens.colors, ...override.tokens?.colors },\n      fonts: { ...base.tokens.fonts, ...override.tokens?.fonts },\n      spacing: { ...base.tokens.spacing, ...override.tokens?.spacing },\n    },\n    styles: { ...base.styles, ...override.styles },\n  };\n}\n\n/**\n * Merge two FieldTypesConfig objects\n */\nfunction merge_field_types_config(\n  base: FieldTypesConfig,\n  override: FieldTypesConfig\n): FieldTypesConfig {\n  return {\n    meta: { ...base.meta, ...override.meta },\n    field_types: { ...base.field_types, ...override.field_types },\n  };\n}\n\n/**\n * Parse INI text content (client-side)\n */\nfunction parse_ini_text(text: string): PartialFormConfig {\n  const result: Record<string, Record<string, string>> = {};\n  let current_section = \"\";\n\n  const lines = text.split(\"\\n\");\n  for (const line of lines) {\n    const trimmed = line.trim();\n\n    // Skip empty lines and comments\n    if (!trimmed || trimmed.startsWith(\";\") || trimmed.startsWith(\"#\")) {\n      continue;\n    }\n\n    // Section header\n    const section_match = trimmed.match(/^\\[([^\\]]+)\\]$/);\n    if (section_match) {\n      current_section = section_match[1];\n      if (!result[current_section]) {\n        result[current_section] = {};\n      }\n      continue;\n    }\n\n    // Key-value pair\n    const kv_match = trimmed.match(/^([^=]+)=(.*)$/);\n    if (kv_match && current_section) {\n      const key = kv_match[1].trim();\n      const value = kv_match[2].trim();\n      result[current_section][key] = value;\n    }\n  }\n\n  // Convert to FormConfig structure\n  const config: PartialFormConfig = {};\n\n  // Paths (new)\n  if (result.paths) {\n    config.styles_path = result.paths.styles_path;\n    config.field_types_path = result.paths.field_types_path;\n  }\n\n  // Doc link\n  if (result.doc_link) {\n    config.doc_link_icon_size = result.doc_link.doc_link_icon_size;\n    const doc_link_icon_style = result.doc_link.doc_link_icon_style;\n    if (doc_link_icon_style === \"solid\" || doc_link_icon_style === \"outline\") {\n      config.doc_link_icon_style = doc_link_icon_style;\n    }\n    config.doc_link_column_width = result.doc_link.doc_link_column_width;\n  }\n\n  // PDF Panel\n  if (result.pdf_panel) {\n    config.pdf_panel_width = result.pdf_panel.pdf_panel_width;\n    config.pdf_panel_min_width = result.pdf_panel.pdf_panel_min_width;\n    config.pdf_panel_max_width = result.pdf_panel.pdf_panel_max_width;\n  }\n\n  // Formatting\n  if (result.formatting) {\n    config.default_currency_symbol = result.formatting.default_currency_symbol;\n    config.date_format = result.formatting.date_format;\n    config.percentage_suffix = result.formatting.percentage_suffix;\n    if (result.formatting.default_decimal_places) {\n      config.default_decimal_places = parse_number(\n        result.formatting.default_decimal_places,\n        2\n      );\n    }\n  }\n\n  // Feature flags (new)\n  if (result.features) {\n    if (result.features.enable_pdf_panel) {\n      config.enable_pdf_panel = result.features.enable_pdf_panel === \"true\";\n    }\n    if (result.features.collapsible_sections) {\n      config.collapsible_sections = result.features.collapsible_sections === \"true\";\n    }\n    if (result.features.validate_on_blur) {\n      config.validate_on_blur = result.features.validate_on_blur === \"true\";\n    }\n    if (result.features.validate_on_change) {\n      config.validate_on_change = result.features.validate_on_change === \"true\";\n    }\n  }\n\n  // File manager settings\n  if (result.file_manager) {\n    const fm = result.file_manager;\n    config.file_manager = {\n      ...DEFAULT_FORM_CONFIG.file_manager,\n      ...(fm.display_mode === \"sidebar\" || fm.display_mode === \"dialog\" ? { display_mode: fm.display_mode } : {}),\n      ...(fm.icon_size ? { icon_size: fm.icon_size } : {}),\n      ...(fm.icon_color ? { icon_color: fm.icon_color } : {}),\n      ...(fm.icon_color_hover ? { icon_color_hover: fm.icon_color_hover } : {}),\n      ...(fm.icon_color_with_files ? { icon_color_with_files: fm.icon_color_with_files } : {}),\n      ...(fm.badge_background ? { badge_background: fm.badge_background } : {}),\n      ...(fm.badge_text_color ? { badge_text_color: fm.badge_text_color } : {}),\n      ...(fm.dialog_width ? { dialog_width: fm.dialog_width } : {}),\n      ...(fm.dialog_max_height ? { dialog_max_height: fm.dialog_max_height } : {}),\n      ...(fm.button_column_width ? { button_column_width: fm.button_column_width } : {}),\n    };\n  }\n\n  // Legacy support: Colors (deprecated)\n  if (result.colors) {\n    config.label_color = result.colors.label_color;\n    config.label_color_required = result.colors.label_color_required;\n    config.field_border_color = result.colors.field_border_color;\n    config.field_border_color_focus = result.colors.field_border_color_focus;\n    config.field_background_color = result.colors.field_background_color;\n    config.field_background_color_disabled = result.colors.field_background_color_disabled;\n    config.section_header_color = result.colors.section_header_color;\n    config.section_header_background = result.colors.section_header_background;\n    config.sub_section_header_color = result.colors.sub_section_header_color;\n    config.error_color = result.colors.error_color;\n    config.doc_link_icon_color = result.colors.doc_link_icon_color;\n    config.doc_link_hover_color = result.colors.doc_link_hover_color;\n    config.view_mode_background = result.colors.view_mode_background;\n    config.view_mode_border = result.colors.view_mode_border;\n  }\n\n  // Legacy support: Fonts (deprecated)\n  if (result.fonts) {\n    config.label_font_family = result.fonts.label_font_family;\n    config.label_font_size = result.fonts.label_font_size;\n    config.label_font_weight = result.fonts.label_font_weight;\n    config.field_font_family = result.fonts.field_font_family;\n    config.field_font_size = result.fonts.field_font_size;\n    config.section_header_font_size = result.fonts.section_header_font_size;\n    config.sub_section_header_font_size = result.fonts.sub_section_header_font_size;\n  }\n\n  // Legacy support: Spacing (deprecated)\n  if (result.spacing) {\n    config.section_spacing = result.spacing.section_spacing;\n    config.sub_section_spacing = result.spacing.sub_section_spacing;\n    config.field_spacing = result.spacing.field_spacing;\n    config.field_gap_horizontal = result.spacing.field_gap_horizontal;\n    config.field_gap_vertical = result.spacing.field_gap_vertical;\n    config.label_field_gap = result.spacing.label_field_gap;\n  }\n\n  // Legacy support: Item code styling (deprecated)\n  if (result.item_code) {\n    config.item_code_border_color = result.item_code.item_code_border_color;\n    config.item_code_background = result.item_code.item_code_background;\n    config.item_code_font_size = result.item_code.item_code_font_size;\n  }\n\n  // Legacy support: Worksheet styling (deprecated)\n  if (result.worksheet) {\n    config.worksheet_indent = result.worksheet.worksheet_indent;\n    config.worksheet_label_font_weight = result.worksheet.worksheet_label_font_weight;\n  }\n\n  // Legacy support: Highlight row styling (deprecated)\n  if (result.highlight_row) {\n    config.highlight_row_background = result.highlight_row.highlight_row_background;\n  }\n\n  // Legacy support: Badge styling (deprecated)\n  if (result.badge) {\n    config.badge_background = result.badge.badge_background;\n    config.badge_text_color = result.badge.badge_text_color;\n  }\n\n  // Legacy support: Hierarchical styles (deprecated)\n  const style_variants: StyleVariant[] = [\n    \"header_h1\", \"header_h2\", \"header_h3\", \"header_h4\", \"header_h5\", \"header_h6\",\n    \"total_h1\", \"total_h2\", \"total_h3\", \"total_h4\", \"total_h5\", \"total_h6\",\n  ];\n\n  const parsed_styles: Partial<HierarchicalStyleConfig> = {};\n  let has_any_style = false;\n\n  for (const variant of style_variants) {\n    if (result[variant]) {\n      has_any_style = true;\n      parsed_styles[variant] = {\n        font_size: result[variant].font_size || DEFAULT_FORM_CONFIG.styles[variant].font_size,\n        font_weight: result[variant].font_weight || DEFAULT_FORM_CONFIG.styles[variant].font_weight,\n        font_color: result[variant].font_color || DEFAULT_FORM_CONFIG.styles[variant].font_color,\n        background_color: result[variant].background_color || DEFAULT_FORM_CONFIG.styles[variant].background_color,\n        indent: result[variant].indent || DEFAULT_FORM_CONFIG.styles[variant].indent,\n      };\n    }\n  }\n\n  // Only set styles if we found any style sections in the INI file\n  if (has_any_style) {\n    config.styles = {\n      ...DEFAULT_FORM_CONFIG.styles,\n      ...parsed_styles,\n    } as HierarchicalStyleConfig;\n  }\n\n  // Remove undefined values\n  return Object.fromEntries(\n    Object.entries(config).filter(([, v]) => v !== undefined)\n  ) as PartialFormConfig;\n}\n\n/**\n * Get a single config value with type safety\n */\nexport function useConfigValue<K extends keyof FormConfig>(\n  config: FormConfig,\n  key: K\n): FormConfig[K] {\n  return config[key];\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { FileManager as HazoFilesFileManager } from \"hazo_files\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/**\n * Logger interface (matches hazo_pdf's Logger interface)\n * Compatible with hazo_logs package\n */\nexport interface Logger {\n  info: (message: string, data?: Record<string, unknown>) => void;\n  debug: (message: string, data?: Record<string, unknown>) => void;\n  warn: (message: string, data?: Record<string, unknown>) => void;\n  error: (message: string, data?: Record<string, unknown>) => void;\n}\n\n/**\n * Database connection interface for hazo_connect\n * Consumers pass their own hazo_connect instance\n */\nexport interface HazoConnectInstance {\n  /** Execute a query and return results */\n  query: <T = unknown>(sql: string, params?: unknown[]) => Promise<T[]>;\n  /** Execute a statement (INSERT, UPDATE, DELETE) */\n  execute: (sql: string, params?: unknown[]) => Promise<{ affected_rows: number }>;\n}\n\n/**\n * Services that can be injected into hazo_data_forms\n */\nexport interface HazoServices {\n  /** Database connection from hazo_connect */\n  db?: HazoConnectInstance;\n  /** Logger from hazo_logs (compatible with hazo_pdf's Logger) */\n  logger?: Logger;\n  /** File manager from hazo_files */\n  file_manager: HazoFilesFileManager;\n  /** Custom services for extensibility */\n  custom?: Record<string, unknown>;\n}\n\n/**\n * Props for HazoServicesProvider\n */\nexport interface HazoServicesProviderProps {\n  /** Services to provide to all child components */\n  services?: HazoServices;\n  /** Child components */\n  children: React.ReactNode;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst HazoServicesContext = React.createContext<HazoServices | undefined>(undefined);\n\n// ============================================================================\n// Provider\n// ============================================================================\n\n/**\n * Provider component for injecting services into hazo_data_forms\n *\n * Usage:\n * ```tsx\n * // App-wide services (recommended - in layout.tsx)\n * import { HazoServicesProvider } from \"hazo_data_forms\";\n * import { db } from \"./db\";\n * import { logger } from \"./logger\";\n *\n * export default function Layout({ children }) {\n *   return (\n *     <HazoServicesProvider services={{ db, logger }}>\n *       {children}\n *     </HazoServicesProvider>\n *   );\n * }\n * ```\n */\nexport function HazoServicesProvider({\n  services,\n  children,\n}: HazoServicesProviderProps): React.ReactElement {\n  // Memoize services to prevent unnecessary re-renders\n  const memoized_services = React.useMemo(() => services, [services]);\n\n  return (\n    <HazoServicesContext.Provider value={memoized_services}>\n      {children}\n    </HazoServicesContext.Provider>\n  );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to access all injected services\n *\n * Usage:\n * ```tsx\n * import { useHazoServices } from \"hazo_data_forms\";\n *\n * function MyComponent() {\n *   const services = useHazoServices();\n *   // Access services.db, services.logger, services.custom\n * }\n * ```\n */\nexport function useHazoServices(): HazoServices | undefined {\n  return React.useContext(HazoServicesContext);\n}\n\n/**\n * Hook to access the logger service\n * Returns undefined if no logger was provided\n *\n * Usage:\n * ```tsx\n * import { useHazoLogger } from \"hazo_data_forms\";\n *\n * function MyComponent() {\n *   const logger = useHazoLogger();\n *   logger?.info(\"Component mounted\");\n * }\n * ```\n */\nexport function useHazoLogger(): Logger | undefined {\n  const services = React.useContext(HazoServicesContext);\n  return services?.logger;\n}\n\n/**\n * Hook to access the database service\n * Returns undefined if no database was provided\n *\n * Usage:\n * ```tsx\n * import { useHazoDb } from \"hazo_data_forms\";\n *\n * function MyComponent() {\n *   const db = useHazoDb();\n *   // Query database\n *   const data = await db?.query(\"SELECT * FROM users\");\n * }\n * ```\n */\nexport function useHazoDb(): HazoConnectInstance | undefined {\n  const services = React.useContext(HazoServicesContext);\n  return services?.db;\n}\n\n/**\n * Hook to access a custom service by key\n *\n * Usage:\n * ```tsx\n * import { useHazoCustomService } from \"hazo_data_forms\";\n *\n * function MyComponent() {\n *   const myService = useHazoCustomService<MyService>(\"my_service\");\n * }\n * ```\n */\nexport function useHazoCustomService<T>(key: string): T | undefined {\n  const services = React.useContext(HazoServicesContext);\n  return services?.custom?.[key] as T | undefined;\n}\n\n/**\n * Hook to access the file manager service\n * Returns undefined if no file manager was provided\n *\n * Usage:\n * ```tsx\n * import { useHazoFileManager } from \"hazo_data_forms\";\n *\n * function MyComponent() {\n *   const file_manager = useHazoFileManager();\n *   if (file_manager?.isInitialized()) {\n *     await file_manager.uploadFile(data, \"/path/to/file.pdf\");\n *   }\n * }\n * ```\n */\nexport function useHazoFileManager(): HazoFilesFileManager | undefined {\n  const services = React.useContext(HazoServicesContext);\n  return services?.file_manager;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useForm, FormProvider } from \"react-hook-form\";\nimport { SectionRenderer } from \"../section_renderer\";\nimport { DocPanel } from \"../doc_panel\";\nimport { FileManager, FileManagerDialog, doc_link_to_file_item } from \"../file_manager_viewer\";\nimport type { FileItem } from \"../file_manager_viewer/types\";\nimport { Button } from \"../ui/button\";\nimport {\n  ResizablePanelGroup,\n  ResizablePanel,\n  ResizableHandle,\n} from \"../ui/resizable\";\nimport { useFormConfig } from \"../../hooks/use_form_config\";\nimport { HazoServicesProvider } from \"../../context\";\nimport { cn, evaluate_formula, get_uploads_key, get_field_uploads, uploads_to_doc_links, sanitize_filename, generate_file_id } from \"../../lib/utils\";\nimport type { DocLink, FormValues, FormField, FileUploadResult } from \"../../lib/types\";\nimport type { HazoDataFormProps } from \"./types\";\n\n// Import field renderers to register them - use named import to prevent tree-shaking\nimport { FieldRenderer as _FieldRenderer } from \"../field_renderers\";\n// Ensure the import isn't removed by referencing it\nconst _ensure_field_renderers_loaded = _FieldRenderer;\n\n/**\n * Convert width string (like \"50vw\", \"400px\", \"50%\") to a percentage number\n */\nfunction parse_width_to_percent(width_str: string): number {\n  if (width_str.endsWith(\"vw\") || width_str.endsWith(\"%\")) {\n    return parseFloat(width_str);\n  }\n  // For pixel values, assume viewport width of ~1400px as reference\n  // This is just a reasonable default for initial size\n  const px_value = parseFloat(width_str);\n  return Math.min(80, Math.max(20, (px_value / 1400) * 100));\n}\n\n/**\n * HazoDataForm Component\n * Main form component that renders dynamic forms from JSON schema\n */\nexport function HazoDataForm({\n  schema,\n  mode = \"edit\",\n  values,\n  default_values,\n  on_change,\n  on_field_change,\n  on_submit,\n  on_doc_link_click,\n  show_pdf_panel = true,\n  pdf_panel_position = \"right\",\n  pdf_panel_width,\n  pdf_panel_resizable = true,\n  pdf_viewer_component,\n  file_save_path,\n  pdf_save_path,\n  config_path,\n  config_override,\n  errors: external_errors,\n  validate_on_blur = true,\n  validate_on_change = false,\n  validate,\n  class_name,\n  show_section_headers = true,\n  show_sub_section_headers = true,\n  collapsible_sections = false,\n  collapsed_sections = [],\n  on_form_ready,\n  show_submit_button,\n  submit_button_text = \"Submit\",\n  enable_file_upload = false,\n  on_file_view,\n  on_file_popout,\n  // hazo_pdf 1.3.2 features\n  enable_file_conversion = false,\n  on_file_convert,\n  enable_pdf_popout = false,\n  pdf_popout_route,\n  on_pdf_popout,\n  // Service injection\n  services,\n}: HazoDataFormProps) {\n  // Load config from INI file\n  const config = useFormConfig(config_path, config_override);\n\n  // Document panel state\n  const [active_doc_links, set_active_doc_links] = React.useState<DocLink[]>([]);\n  const [is_doc_panel_open, set_is_doc_panel_open] = React.useState(false);\n\n  // Upload mode state for DocPanel\n  const [doc_panel_upload_mode, set_doc_panel_upload_mode] = React.useState(false);\n  const [active_field_id, set_active_field_id] = React.useState<string | null>(null);\n  const [active_field_label, set_active_field_label] = React.useState<string>(\"\");\n\n  // Extract default values from schema (including paired_field values)\n  // Priority: field.value > field.default_value > field.field_info.default_value\n  const schema_defaults = React.useMemo(() => {\n    const defaults: FormValues = {};\n    const extract_field_values = (fields: FormField[]) => {\n      fields.forEach((field) => {\n        // Get field value with priority: value > default_value > field_info.default_value\n        const field_value =\n          field.value !== undefined ? field.value :\n          field.default_value !== undefined ? field.default_value :\n          field.field_info.default_value;\n\n        if (field_value !== undefined) {\n          defaults[field.id] = field_value;\n        }\n\n        // Also extract paired_field value if present\n        // Priority: paired_field.value > paired_field.default_value > paired_field.field_info.default_value\n        if (field.paired_field) {\n          const paired_value =\n            field.paired_field.value !== undefined ? field.paired_field.value :\n            field.paired_field.default_value !== undefined ? field.paired_field.default_value :\n            field.paired_field.field_info?.default_value;\n\n          if (paired_value !== undefined) {\n            defaults[field.paired_field.id] = paired_value;\n          }\n        }\n      });\n    };\n\n    schema.forEach((section) => {\n      section.sub_sections.forEach((sub_section) => {\n        extract_field_values(sub_section.field_group.fields);\n      });\n    });\n\n    return defaults;\n  }, [schema]);\n\n  // Initialize react-hook-form\n  const form_methods = useForm<FormValues>({\n    defaultValues: { ...schema_defaults, ...default_values },\n    values: values,\n    mode: validate_on_change ? \"onChange\" : validate_on_blur ? \"onBlur\" : \"onSubmit\",\n  });\n\n  // Provide form methods to parent if requested\n  React.useEffect(() => {\n    if (on_form_ready) {\n      on_form_ready(form_methods);\n    }\n  }, [form_methods, on_form_ready]);\n\n  // Get all computed fields from schema\n  // Include both \"computed\" field type AND any field with computed_formula (e.g., currency fields)\n  // Also include paired_fields that have computed_formula\n  const computed_fields = React.useMemo(() => {\n    const fields: FormField[] = [];\n    schema.forEach((section) => {\n      section.sub_sections.forEach((sub_section) => {\n        sub_section.field_group.fields.forEach((field) => {\n          // Check main field\n          if (\n            field.field_info.field_type === \"computed\" ||\n            field.field_info.computed_formula\n          ) {\n            fields.push(field);\n          }\n          // Check paired_field for computed_formula\n          if (field.paired_field?.field_info?.computed_formula) {\n            // Create a synthetic FormField from the paired_field\n            const paired_as_field: FormField = {\n              id: field.paired_field.id,\n              label: field.label, // Use parent label for reference\n              field_info: field.paired_field.field_info,\n            };\n            fields.push(paired_as_field);\n          }\n        });\n      });\n    });\n    return fields;\n  }, [schema]);\n\n  // Get set of computed field IDs for quick lookup\n  const computed_field_ids = React.useMemo(() => {\n    return new Set(computed_fields.map((f) => f.id));\n  }, [computed_fields]);\n\n  // Update computed field values\n  const update_computed_fields = React.useCallback(\n    (current_values: FormValues, changed_field_name?: string) => {\n      // Skip if the changed field is itself a computed field (prevents infinite loop)\n      if (changed_field_name && computed_field_ids.has(changed_field_name)) {\n        return;\n      }\n\n      computed_fields.forEach((field) => {\n        if (field.field_info.computed_formula) {\n          let result = evaluate_formula(\n            field.field_info.computed_formula,\n            current_values\n          );\n\n          // Round to decimal places if specified\n          if (result !== null && field.field_info.decimal_places !== undefined) {\n            const multiplier = Math.pow(10, field.field_info.decimal_places);\n            result = Math.round(result * multiplier) / multiplier;\n          }\n\n          // Only update if result is valid and different from current value\n          const current_value = current_values[field.id];\n          if (result !== null && result !== current_value) {\n            form_methods.setValue(field.id, result, { shouldDirty: false });\n          }\n        }\n      });\n    },\n    [computed_fields, computed_field_ids, form_methods]\n  );\n\n  // Watch for value changes\n  React.useEffect(() => {\n    const subscription = form_methods.watch((watch_values, { name }) => {\n      // Merge with schema_defaults to ensure table data is always available\n      const merged_values = { ...schema_defaults, ...watch_values } as FormValues;\n\n      if (on_change) {\n        on_change(merged_values);\n      }\n      if (on_field_change && name) {\n        on_field_change(name, merged_values[name]);\n      }\n\n      // Update computed fields (pass changed field name to prevent infinite loop)\n      update_computed_fields(merged_values, name);\n    });\n    return () => subscription.unsubscribe();\n  }, [form_methods, on_change, on_field_change, update_computed_fields, schema_defaults]);\n\n  // Calculate computed fields on initial mount\n  React.useEffect(() => {\n    if (computed_fields.length > 0) {\n      // Merge schema_defaults with form values to ensure table data is available\n      // Controllers may not have registered yet, so getValues() might be incomplete\n      const current_values = form_methods.getValues();\n      const merged_values = { ...schema_defaults, ...current_values };\n      // Pass undefined as changed_field_name to allow initial calculation\n      update_computed_fields(merged_values, undefined);\n    }\n    // Only run once on mount - don't include update_computed_fields in deps\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  // Get file_manager from services\n  const file_manager = services?.file_manager;\n\n  // Check if upload is enabled (prop + config + file_manager available and initialized)\n  const is_upload_enabled = enable_file_upload && config.file_upload.enabled && !!file_manager?.isInitialized();\n\n  // Get display mode from config\n  const file_manager_display_mode = config.file_manager.display_mode;\n\n  // Convert active_doc_links to FileItem[] for FileManager\n  const file_manager_items: FileItem[] = React.useMemo(() => {\n    return active_doc_links.map((doc_link, index) => doc_link_to_file_item(doc_link, index));\n  }, [active_doc_links]);\n\n\n  // Handle doc_links click\n  const handle_doc_link_click = React.useCallback(\n    (field_id: string, doc_links: DocLink[], field_label?: string) => {\n      if (on_doc_link_click) {\n        on_doc_link_click({ field_id, doc_links });\n      }\n\n      if (show_pdf_panel) {\n        set_active_doc_links(doc_links);\n        set_is_doc_panel_open(true);\n\n        // Also set field context if file upload is enabled, so user can add files\n        if (is_upload_enabled) {\n          set_active_field_id(field_id);\n          set_active_field_label(field_label || \"\");\n          set_doc_panel_upload_mode(true);\n        }\n      }\n    },\n    [on_doc_link_click, show_pdf_panel, is_upload_enabled]\n  );\n\n  // Handle upload icon click - opens DocPanel in upload mode for the field\n  const handle_upload_click = React.useCallback(\n    (field_id: string, field_label: string) => {\n      // Get existing uploads for this field and convert to DocLinks\n      const uploads = get_field_uploads(form_methods.getValues(), field_id);\n      const doc_links = uploads_to_doc_links(uploads);\n\n      // Set state to open DocPanel in upload mode\n      set_active_field_id(field_id);\n      set_active_field_label(field_label);\n      set_active_doc_links(doc_links);\n      set_is_doc_panel_open(true);\n      set_doc_panel_upload_mode(true);\n    },\n    [form_methods]\n  );\n\n  // Handle file upload completion (from DocPanel) - uses file_manager service\n  const handle_panel_upload = React.useCallback(\n    async (files: File[]): Promise<FileUploadResult[]> => {\n      if (!file_manager || !active_field_id) {\n        return files.map(() => ({ success: false, error: \"File manager not configured\" }));\n      }\n\n      const base_path = file_save_path || \"/uploads\";\n      const results: FileUploadResult[] = [];\n\n      // Ensure the directory exists\n      await file_manager.ensureDirectory(base_path);\n\n      for (const file of files) {\n        try {\n          const safe_filename = sanitize_filename(file.name);\n          const file_id = generate_file_id();\n          const remote_path = `${base_path}/${file_id}_${safe_filename}`;\n\n          // Read file as ArrayBuffer and convert to Uint8Array\n          const array_buffer = await file.arrayBuffer();\n          const file_data = Buffer.from(array_buffer);\n\n          const upload_result = await file_manager.uploadFile(file_data, remote_path);\n\n          if (upload_result.success && upload_result.data) {\n            const uploaded_file = {\n              file_id: upload_result.data.id || file_id,\n              filename: file.name,\n              url: upload_result.data.path || remote_path,\n              mime_type: file.type,\n              size: file.size,\n              uploaded_at: new Date().toISOString(),\n            };\n\n            const result: FileUploadResult = {\n              success: true,\n              uploaded_file,\n            };\n            results.push(result);\n\n            // Add to form values and update doc_links\n            const uploads_key = get_uploads_key(active_field_id);\n            const current_uploads = get_field_uploads(form_methods.getValues(), active_field_id);\n            const new_uploads = [...current_uploads, uploaded_file];\n            form_methods.setValue(uploads_key, new_uploads);\n\n            // Update active_doc_links to include the new file\n            const new_doc_links = uploads_to_doc_links(new_uploads);\n            set_active_doc_links(new_doc_links);\n          } else {\n            results.push({\n              success: false,\n              error: upload_result.error || \"Upload failed\",\n            });\n          }\n        } catch (error) {\n          results.push({\n            success: false,\n            error: error instanceof Error ? error.message : \"Upload failed\",\n          });\n        }\n      }\n\n      return results;\n    },\n    [file_manager, active_field_id, file_save_path, form_methods]\n  );\n\n  // Handle file deletion (from DocPanel) - uses file_manager service\n  const handle_panel_delete = React.useCallback(\n    async (file_id: string): Promise<boolean> => {\n      if (!file_manager || !active_field_id) return false;\n\n      try {\n        // Find the file to get its path\n        const current_uploads = get_field_uploads(form_methods.getValues(), active_field_id);\n        const file_to_delete = current_uploads.find((u) => u.file_id === file_id);\n\n        if (file_to_delete?.url) {\n          const delete_result = await file_manager.deleteFile(file_to_delete.url);\n          if (!delete_result.success) {\n            console.warn(\"File deletion failed:\", delete_result.error);\n            return false;\n          }\n        }\n\n        // Remove from form values\n        const uploads_key = get_uploads_key(active_field_id);\n        const new_uploads = current_uploads.filter((u) => u.file_id !== file_id);\n        form_methods.setValue(uploads_key, new_uploads);\n\n        // Update active_doc_links to reflect deletion\n        const new_doc_links = uploads_to_doc_links(new_uploads);\n        set_active_doc_links(new_doc_links);\n\n        return true;\n      } catch (error) {\n        console.warn(\"File deletion error:\", error);\n        return false;\n      }\n    },\n    [file_manager, active_field_id, form_methods]\n  );\n\n  // Handle DocPanel close - reset upload mode state\n  const handle_doc_panel_close = React.useCallback(() => {\n    set_is_doc_panel_open(false);\n    set_doc_panel_upload_mode(false);\n    set_active_field_id(null);\n    set_active_field_label(\"\");\n  }, []);\n\n  // Handle form submission\n  const handle_submit = form_methods.handleSubmit((data) => {\n    // Run custom validation if provided\n    if (validate) {\n      const validation_errors = validate(data);\n      if (Object.keys(validation_errors).length > 0) {\n        Object.entries(validation_errors).forEach(([field, message]) => {\n          form_methods.setError(field, { type: \"manual\", message });\n        });\n        return;\n      }\n    }\n\n    if (on_submit) {\n      on_submit(data);\n    }\n  });\n\n  // Determine if submit button should be shown\n  const should_show_submit =\n    show_submit_button !== undefined ? show_submit_button : mode === \"edit\" && !!on_submit;\n\n  // Calculate panel sizes based on config\n  const pdf_panel_size = parse_width_to_percent(pdf_panel_width || config.pdf_panel_width);\n  const form_panel_size = 100 - pdf_panel_size;\n\n  // Wrap content with services provider (guard for runtime safety)\n  const wrap_with_services = (content: React.ReactNode): React.ReactNode => {\n    if (services) {\n      return (\n        <HazoServicesProvider services={services}>\n          {content}\n        </HazoServicesProvider>\n      );\n    }\n    return content;\n  };\n\n  // Form content component (reused in both layouts)\n  const form_content = (\n    <FormProvider {...form_methods}>\n      <form onSubmit={handle_submit} className=\"cls_form_container h-full overflow-auto\">\n        {schema.map((section) => (\n          <SectionRenderer\n            key={section.section_name}\n            section={section}\n            mode={mode}\n            config={config}\n            show_header={show_section_headers}\n            show_sub_headers={show_sub_section_headers}\n            collapsible={collapsible_sections}\n            initially_collapsed={collapsed_sections.includes(section.section_name)}\n            on_doc_link_click={handle_doc_link_click}\n            errors={external_errors}\n            upload_enabled={is_upload_enabled}\n            form_values={form_methods.getValues()}\n            on_upload_click={handle_upload_click}\n          />\n        ))}\n\n        {should_show_submit && (\n          <div className=\"cls_form_actions mt-6 pt-4 border-t\">\n            <Button\n              type=\"submit\"\n              className=\"cls_submit_btn\"\n              disabled={form_methods.formState.isSubmitting}\n            >\n              {form_methods.formState.isSubmitting ? \"Submitting...\" : submit_button_text}\n            </Button>\n          </div>\n        )}\n      </form>\n    </FormProvider>\n  );\n\n  // When file manager is open in SIDEBAR mode, use resizable layout\n  if (is_doc_panel_open && show_pdf_panel && file_manager_display_mode === \"sidebar\") {\n    // Build default layout based on panel position\n    const default_layout = pdf_panel_position === \"left\"\n      ? { \"doc-panel\": pdf_panel_size, \"form-panel\": form_panel_size }\n      : { \"form-panel\": form_panel_size, \"doc-panel\": pdf_panel_size };\n\n    const sidebar_content = (\n      <div className={cn(\"cls_hazo_data_form cls_hazo_data_form_with_pdf\", class_name)}\n        style={{ height: \"calc(100vh - 200px)\", minHeight: \"500px\" }}\n      >\n        <ResizablePanelGroup\n          orientation=\"horizontal\"\n          className=\"h-full\"\n          defaultLayout={default_layout}\n        >\n          {/* Form Panel - on left when doc panel is on right, vice versa */}\n          {pdf_panel_position === \"left\" && (\n            <>\n              <ResizablePanel\n                id=\"doc-panel\"\n                minSize={15}\n              >\n                <FileManager\n                  files={file_manager_items}\n                  is_open={is_doc_panel_open}\n                  on_close={handle_doc_panel_close}\n                  display_mode=\"sidebar\"\n                  config={config}\n                  pdf_viewer_component={pdf_viewer_component}\n                  file_manager={file_manager}\n                  pdf_save_path={pdf_save_path || file_save_path}\n                  upload_enabled={doc_panel_upload_mode}\n                  field_label={active_field_label}\n                  field_id={active_field_id || undefined}\n                  on_upload={is_upload_enabled ? handle_panel_upload : undefined}\n                  on_delete={is_upload_enabled ? handle_panel_delete : undefined}\n                  on_popout={on_file_popout}\n                  enable_file_conversion={enable_file_conversion}\n                  on_file_convert={on_file_convert}\n                  logger={services?.logger}\n                />\n              </ResizablePanel>\n              <ResizableHandle withHandle={pdf_panel_resizable} />\n              <ResizablePanel\n                id=\"form-panel\"\n                minSize={30}\n              >\n                {form_content}\n              </ResizablePanel>\n            </>\n          )}\n\n          {pdf_panel_position === \"right\" && (\n            <>\n              <ResizablePanel\n                id=\"form-panel\"\n                minSize={30}\n              >\n                {form_content}\n              </ResizablePanel>\n              <ResizableHandle withHandle={pdf_panel_resizable} />\n              <ResizablePanel\n                id=\"doc-panel\"\n                minSize={15}\n              >\n                <FileManager\n                  files={file_manager_items}\n                  is_open={is_doc_panel_open}\n                  on_close={handle_doc_panel_close}\n                  display_mode=\"sidebar\"\n                  config={config}\n                  pdf_viewer_component={pdf_viewer_component}\n                  file_manager={file_manager}\n                  pdf_save_path={pdf_save_path || file_save_path}\n                  upload_enabled={doc_panel_upload_mode}\n                  field_label={active_field_label}\n                  field_id={active_field_id || undefined}\n                  on_upload={is_upload_enabled ? handle_panel_upload : undefined}\n                  on_delete={is_upload_enabled ? handle_panel_delete : undefined}\n                  on_popout={on_file_popout}\n                  enable_file_conversion={enable_file_conversion}\n                  on_file_convert={on_file_convert}\n                  logger={services?.logger}\n                />\n              </ResizablePanel>\n            </>\n          )}\n        </ResizablePanelGroup>\n      </div>\n    );\n\n    return wrap_with_services(sidebar_content) as React.ReactElement;\n  }\n\n  // When file manager is in DIALOG mode, render form normally with dialog overlay\n  // Or when file manager is closed, render form normally\n  const dialog_content = (\n    <div className={cn(\"cls_hazo_data_form\", class_name)}>\n      {form_content}\n\n      {/* FileManagerDialog for dialog display mode */}\n      {file_manager_display_mode === \"dialog\" && (\n        <FileManagerDialog\n          files={file_manager_items}\n          is_open={is_doc_panel_open}\n          on_close={handle_doc_panel_close}\n          config={config}\n          pdf_viewer_component={pdf_viewer_component}\n          file_manager={file_manager}\n          pdf_save_path={pdf_save_path || file_save_path}\n          upload_enabled={doc_panel_upload_mode}\n          field_label={active_field_label}\n          field_id={active_field_id || undefined}\n          on_upload={is_upload_enabled ? handle_panel_upload : undefined}\n          on_delete={is_upload_enabled ? handle_panel_delete : undefined}\n          on_popout={on_file_popout}\n          enable_file_conversion={enable_file_conversion}\n          on_file_convert={on_file_convert}\n          logger={services?.logger}\n        />\n      )}\n    </div>\n  );\n\n  return wrap_with_services(dialog_content) as React.ReactElement;\n}\n\n// Re-export types\nexport type { HazoDataFormProps } from \"./types\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaFilePdf, FaFileImage, FaFileWord, FaFile, FaTimes } from \"react-icons/fa\";\nimport { cn, extract_filename_from_url } from \"../../lib/utils\";\nimport type { DocLink, DocLinkType, FormConfig } from \"../../lib/types\";\n\nexport interface FileListItemProps {\n  doc_link: DocLink;\n  is_selected: boolean;\n  on_click: () => void;\n  config: FormConfig;\n  /** Whether this file can be deleted */\n  deletable?: boolean;\n  /** Callback when delete button is clicked */\n  on_delete?: () => void;\n  /** Whether deletion is in progress */\n  delete_in_progress?: boolean;\n}\n\n/**\n * Get icon component for doc link type\n */\nfunction get_type_icon(type: DocLinkType) {\n  switch (type) {\n    case \"pdf\":\n      return FaFilePdf;\n    case \"image\":\n      return FaFileImage;\n    case \"document\":\n      return FaFileWord;\n    default:\n      return FaFile;\n  }\n}\n\n/**\n * Individual file item in the file list\n * Displays as a clickable chip/tab with icon and filename\n */\nexport function FileListItem({\n  doc_link,\n  is_selected,\n  on_click,\n  deletable,\n  on_delete,\n  delete_in_progress,\n}: FileListItemProps) {\n  const [is_hovered, set_is_hovered] = React.useState(false);\n  const filename = doc_link.filename || extract_filename_from_url(doc_link.url);\n  const IconComponent = get_type_icon(doc_link.type);\n\n  // Truncate long filenames\n  const display_name =\n    filename.length > 25 ? `${filename.substring(0, 22)}...` : filename;\n\n  const handle_delete = (e: React.MouseEvent) => {\n    e.stopPropagation();\n    on_delete?.();\n  };\n\n  return (\n    <div\n      className=\"cls_file_list_item_wrapper relative\"\n      onMouseEnter={() => set_is_hovered(true)}\n      onMouseLeave={() => set_is_hovered(false)}\n    >\n      <button\n        type=\"button\"\n        onClick={on_click}\n        disabled={delete_in_progress}\n        className={cn(\n          \"cls_file_list_item flex items-center gap-2 px-3 py-2 rounded-md text-sm\",\n          \"border transition-colors whitespace-nowrap\",\n          is_selected\n            ? \"bg-primary/10 border-primary/50 text-primary\"\n            : \"bg-background border-border text-foreground hover:bg-muted\",\n          delete_in_progress && \"opacity-50\"\n        )}\n        title={filename}\n      >\n        <IconComponent\n          size={16}\n          className={is_selected ? \"text-primary\" : \"text-muted-foreground\"}\n        />\n        <span>{display_name}</span>\n        {doc_link.page && (\n          <span className=\"text-xs text-muted-foreground\">p.{doc_link.page}</span>\n        )}\n      </button>\n\n      {/* Delete button - shows on hover when deletable */}\n      {deletable && is_hovered && !delete_in_progress && (\n        <button\n          type=\"button\"\n          onClick={handle_delete}\n          className=\"cls_file_delete_btn absolute -top-1 -right-1 w-5 h-5 bg-destructive text-destructive-foreground rounded-full flex items-center justify-center hover:bg-destructive/90 transition-colors shadow-sm\"\n          title=\"Remove file\"\n        >\n          <FaTimes size={10} />\n        </button>\n      )}\n\n      {/* Loading indicator during deletion */}\n      {delete_in_progress && (\n        <div className=\"absolute inset-0 flex items-center justify-center bg-background/50 rounded-md\">\n          <div className=\"w-4 h-4 border-2 border-border border-t-foreground rounded-full animate-spin\" />\n        </div>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaDownload, FaExternalLinkAlt } from \"react-icons/fa\";\nimport { Button } from \"../ui/button\";\nimport type { DocLink } from \"../../lib/types\";\n\nexport interface NonPdfContentProps {\n  doc_link: DocLink;\n  filename: string;\n}\n\n/**\n * Content display for non-PDF files\n * Shows preview for images, download button for other types\n */\nexport function NonPdfContent({ doc_link, filename }: NonPdfContentProps) {\n  const handle_download = () => {\n    // Open in new tab (will trigger download for non-viewable types)\n    window.open(doc_link.url, \"_blank\");\n  };\n\n  // For images, show a preview\n  if (doc_link.type === \"image\") {\n    return (\n      <div className=\"cls_non_pdf_image flex flex-col items-center justify-center h-full p-4\">\n        <img\n          src={doc_link.url}\n          alt={filename}\n          className=\"max-w-full max-h-[70%] object-contain rounded border\"\n        />\n        <div className=\"mt-4 flex gap-2\">\n          <Button variant=\"outline\" onClick={handle_download}>\n            <FaExternalLinkAlt className=\"mr-2\" size={14} />\n            Open in New Tab\n          </Button>\n        </div>\n      </div>\n    );\n  }\n\n  // For documents and other files, show download prompt\n  return (\n    <div className=\"cls_non_pdf_download flex flex-col items-center justify-center h-full p-8 text-center\">\n      <div className=\"w-16 h-16 mb-4 rounded-full bg-muted flex items-center justify-center\">\n        <FaDownload size={24} className=\"text-muted-foreground\" />\n      </div>\n      <h3 className=\"text-lg font-medium text-foreground mb-2\">{filename}</h3>\n      <p className=\"text-sm text-muted-foreground mb-6\">\n        This file type cannot be previewed. Click below to download or open.\n      </p>\n      <Button onClick={handle_download}>\n        <FaDownload className=\"mr-2\" size={14} />\n        Download File\n      </Button>\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaUpload } from \"react-icons/fa\";\nimport { cn, format_file_size, is_mime_type_allowed } from \"../../lib/utils\";\nimport type { FormConfig, FileUploadResult } from \"../../lib/types\";\n\nexport interface UploadProgress {\n  filename: string;\n  progress: number;\n  status: \"uploading\" | \"success\" | \"error\";\n  error?: string;\n}\n\nexport interface UploadZoneProps {\n  config: FormConfig;\n  existing_file_count: number;\n  on_upload: (files: File[]) => Promise<FileUploadResult[]>;\n  on_upload_complete?: () => void;\n}\n\n/**\n * Drag-and-drop upload zone component\n */\nexport function UploadZone({\n  config,\n  existing_file_count,\n  on_upload,\n  on_upload_complete,\n}: UploadZoneProps) {\n  const file_input_ref = React.useRef<HTMLInputElement>(null);\n  const [is_dragging, set_is_dragging] = React.useState(false);\n  const [upload_progress, set_upload_progress] = React.useState<UploadProgress[]>([]);\n  const [is_uploading, set_is_uploading] = React.useState(false);\n\n  const upload_config = config.file_upload;\n\n  const validate_file = (file: File): string | null => {\n    if (!is_mime_type_allowed(file.type, upload_config.allowed_types)) {\n      return `File type \"${file.type}\" is not allowed`;\n    }\n\n    if (file.size > upload_config.max_file_size) {\n      return `File size exceeds maximum of ${format_file_size(upload_config.max_file_size)}`;\n    }\n\n    if (existing_file_count >= upload_config.max_files_per_field) {\n      return `Maximum of ${upload_config.max_files_per_field} files per field`;\n    }\n\n    return null;\n  };\n\n  const handle_files = async (files: FileList | File[]) => {\n    const file_array = Array.from(files);\n    const valid_files: File[] = [];\n    const errors: UploadProgress[] = [];\n\n    for (const file of file_array) {\n      const error = validate_file(file);\n      if (error) {\n        errors.push({\n          filename: file.name,\n          progress: 100,\n          status: \"error\",\n          error,\n        });\n      } else {\n        valid_files.push(file);\n      }\n    }\n\n    if (errors.length > 0) {\n      set_upload_progress(errors);\n    }\n\n    if (valid_files.length === 0) return;\n\n    set_is_uploading(true);\n    const progress_entries: UploadProgress[] = valid_files.map((f) => ({\n      filename: f.name,\n      progress: 0,\n      status: \"uploading\" as const,\n    }));\n    set_upload_progress([...errors, ...progress_entries]);\n\n    try {\n      const results = await on_upload(valid_files);\n\n      const updated_progress: UploadProgress[] = [...errors];\n      results.forEach((result, index) => {\n        const file = valid_files[index];\n        updated_progress.push({\n          filename: file.name,\n          progress: 100,\n          status: result.success ? \"success\" : \"error\",\n          error: result.error,\n        });\n      });\n      set_upload_progress(updated_progress);\n\n      // Clear success messages after a delay\n      setTimeout(() => {\n        set_upload_progress((prev) =>\n          prev.filter((p) => p.status === \"error\")\n        );\n        on_upload_complete?.();\n      }, 1500);\n    } catch (error) {\n      set_upload_progress(\n        valid_files.map((f) => ({\n          filename: f.name,\n          progress: 100,\n          status: \"error\" as const,\n          error: error instanceof Error ? error.message : \"Upload failed\",\n        }))\n      );\n    } finally {\n      set_is_uploading(false);\n    }\n  };\n\n  const handle_drag_over = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(true);\n  };\n\n  const handle_drag_leave = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(false);\n  };\n\n  const handle_drop = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(false);\n\n    if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n      handle_files(e.dataTransfer.files);\n    }\n  };\n\n  const handle_file_select = (e: React.ChangeEvent<HTMLInputElement>) => {\n    if (e.target.files && e.target.files.length > 0) {\n      handle_files(e.target.files);\n    }\n    e.target.value = \"\";\n  };\n\n  const allowed_extensions = upload_config.allowed_types\n    .map((t) => {\n      if (t === \"application/pdf\") return \".pdf\";\n      if (t === \"image/jpeg\") return \".jpg,.jpeg\";\n      if (t === \"image/png\") return \".png\";\n      if (t === \"image/gif\") return \".gif\";\n      if (t === \"image/webp\") return \".webp\";\n      if (t.endsWith(\"/*\")) return t.replace(\"/*\", \"/*\");\n      return \"\";\n    })\n    .filter(Boolean)\n    .join(\",\");\n\n  return (\n    <div className=\"cls_upload_zone p-3 border-t bg-muted\">\n      {/* Drag and drop zone */}\n      <div\n        className={cn(\n          \"cls_upload_dropzone border-2 border-dashed rounded-lg p-4 text-center transition-colors cursor-pointer\",\n          is_dragging\n            ? \"border-primary bg-primary/10\"\n            : \"border-border hover:border-input hover:bg-background\"\n        )}\n        onDragOver={handle_drag_over}\n        onDragLeave={handle_drag_leave}\n        onDrop={handle_drop}\n        onClick={() => file_input_ref.current?.click()}\n      >\n        <input\n          ref={file_input_ref}\n          type=\"file\"\n          multiple\n          accept={allowed_extensions}\n          onChange={handle_file_select}\n          className=\"hidden\"\n        />\n        <FaUpload\n          className={cn(\n            \"mx-auto mb-2\",\n            is_dragging ? \"text-primary\" : \"text-muted-foreground\"\n          )}\n          size={24}\n        />\n        <p className=\"text-sm text-foreground/80\">\n          {is_dragging\n            ? \"Drop files here...\"\n            : \"Drag and drop files here, or click to select\"}\n        </p>\n        <p className=\"text-xs text-muted-foreground mt-1\">\n          Max size: {format_file_size(upload_config.max_file_size)} |\n          Max files: {upload_config.max_files_per_field}\n        </p>\n      </div>\n\n      {/* Upload progress */}\n      {upload_progress.length > 0 && (\n        <div className=\"cls_upload_progress space-y-1 mt-2\">\n          {upload_progress.map((progress, index) => (\n            <div\n              key={`${progress.filename}-${index}`}\n              className={cn(\n                \"p-2 rounded text-xs\",\n                progress.status === \"uploading\" && \"bg-primary/10 text-primary\",\n                progress.status === \"success\" && \"bg-primary/10 text-primary\",\n                progress.status === \"error\" && \"bg-destructive/10 text-destructive\"\n              )}\n            >\n              <span className=\"font-medium\">{progress.filename}</span>\n              {progress.status === \"uploading\" && \" - Uploading...\"}\n              {progress.status === \"success\" && \" - Uploaded\"}\n              {progress.status === \"error\" && ` - ${progress.error}`}\n            </div>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaPlus } from \"react-icons/fa\";\nimport { Button } from \"../ui/button\";\nimport { cn, extract_filename_from_url } from \"../../lib/utils\";\nimport type { DocLink, FormConfig, FileUploadResult } from \"../../lib/types\";\nimport type { PdfViewerProps } from \"../hazo_data_form/types\";\nimport type { FileManager as HazoFilesFileManager } from \"hazo_files\";\nimport { FileListItem } from \"./file_list_item\";\nimport { NonPdfContent } from \"./non_pdf_content\";\nimport { UploadZone } from \"./upload_zone\";\n\nexport interface DocPanelProps {\n  /** Array of doc_links for the current field */\n  doc_links: DocLink[];\n\n  /** Whether panel is open */\n  is_open: boolean;\n\n  /** Callback to close panel */\n  on_close: () => void;\n\n  /** Config for styling */\n  config: FormConfig;\n\n  /** Optional PDF viewer component (from hazo_pdf or custom) */\n  pdf_viewer_component?: React.ComponentType<PdfViewerProps>;\n\n  /** File manager instance for save/load operations */\n  file_manager?: HazoFilesFileManager;\n\n  /** Path where PDFs should be saved */\n  pdf_save_path?: string;\n\n  /** Optional className for the panel container */\n  class_name?: string;\n\n  // Upload mode props\n  /** Enable upload UI mode */\n  upload_mode?: boolean;\n\n  /** Field label for display in upload mode */\n  field_label?: string;\n\n  /** Upload handler callback */\n  on_upload?: (files: File[]) => Promise<FileUploadResult[]>;\n\n  /** Delete handler callback */\n  on_delete?: (file_id: string) => Promise<boolean>;\n}\n\n/**\n * Document Panel Component\n * Two-row layout: file list on top, viewer/download on bottom\n * In upload mode: adds upload zone and delete functionality\n */\nexport function DocPanel({\n  doc_links,\n  is_open,\n  on_close,\n  config,\n  pdf_viewer_component,\n  file_manager,\n  pdf_save_path,\n  class_name,\n  upload_mode,\n  field_label,\n  on_upload,\n  on_delete,\n}: DocPanelProps) {\n  // Selected file state - defaults to first file\n  const [selected_index, set_selected_index] = React.useState(0);\n\n  // Upload mode state\n  const [show_upload_zone, set_show_upload_zone] = React.useState(false);\n  const [delete_in_progress, set_delete_in_progress] = React.useState<string | null>(null);\n\n  // Dynamic PDF viewer loading (existing pattern)\n  const [DynamicPdfViewer, set_dynamic_pdf_viewer] = React.useState<React.ComponentType<PdfViewerProps> | null>(null);\n  const [hazo_pdf_error, set_hazo_pdf_error] = React.useState<string | null>(null);\n  // Track file-specific errors by URL\n  const [file_errors, set_file_errors] = React.useState<Map<string, string>>(new Map());\n\n  const PdfViewerComponent = pdf_viewer_component || DynamicPdfViewer;\n\n  // Reset selection when doc_links change\n  React.useEffect(() => {\n    // Keep selection in bounds\n    if (selected_index >= doc_links.length) {\n      set_selected_index(Math.max(0, doc_links.length - 1));\n    }\n  }, [doc_links, selected_index]);\n\n  // Show upload zone automatically if no files in upload mode\n  React.useEffect(() => {\n    if (upload_mode && doc_links.length === 0) {\n      set_show_upload_zone(true);\n    }\n  }, [upload_mode, doc_links.length]);\n\n  // Load PDF viewer dynamically (existing pattern from PdfPanel)\n  React.useEffect(() => {\n    if (is_open && !pdf_viewer_component && !DynamicPdfViewer) {\n      const load_pdf_viewer = async () => {\n        try {\n          // Dynamic import of hazo_pdf (optional peer dependency)\n          const module = await import(/* webpackChunkName: \"hazo_pdf\" */ \"hazo_pdf\");\n          // Load CSS (no type declarations for CSS files)\n          // @ts-ignore - CSS import has no type declarations\n          await import(/* webpackChunkName: \"hazo_pdf_styles\" */ \"hazo_pdf/styles.css\");\n          // Cast to ComponentType since PdfViewer is a ForwardRefExoticComponent\n          set_dynamic_pdf_viewer(() => module.PdfViewer as React.ComponentType<PdfViewerProps>);\n          set_hazo_pdf_error(null);\n        } catch (err) {\n          console.error(\"Failed to load hazo_pdf:\", err);\n          set_hazo_pdf_error(\n            \"hazo_pdf is not installed. Please install it to view PDFs.\"\n          );\n        }\n      };\n      load_pdf_viewer();\n    }\n  }, [is_open, pdf_viewer_component, DynamicPdfViewer]);\n\n  // Handle file deletion\n  const handle_delete = async (file_id: string) => {\n    if (!on_delete) return;\n\n    set_delete_in_progress(file_id);\n    try {\n      await on_delete(file_id);\n    } finally {\n      set_delete_in_progress(null);\n    }\n  };\n\n  if (!is_open) {\n    return null;\n  }\n\n  // In upload mode with no files, show empty state\n  const has_files = doc_links.length > 0;\n  const selected_doc = has_files ? (doc_links[selected_index] || doc_links[0]) : null;\n  const selected_filename = selected_doc\n    ? (selected_doc.filename || extract_filename_from_url(selected_doc.url))\n    : \"\";\n\n  // Header title based on mode\n  const header_title = upload_mode && field_label\n    ? `Files for \"${field_label}\"`\n    : `Documents (${doc_links.length})`;\n\n  return (\n    <div\n      className={cn(\n        \"cls_doc_panel bg-background flex flex-col h-full\",\n        class_name\n      )}\n    >\n      {/* TOP ROW: Header + File List */}\n      <div className=\"cls_doc_panel_file_list border-b bg-muted shrink-0\">\n        {/* Header with close button */}\n        <div className=\"flex items-center justify-between p-2 border-b\">\n          <span className=\"text-sm font-medium text-foreground\">\n            {header_title}\n          </span>\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            onClick={on_close}\n            className=\"h-8 w-8 p-0\"\n          >\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              width=\"16\"\n              height=\"16\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              strokeWidth=\"2\"\n              strokeLinecap=\"round\"\n              strokeLinejoin=\"round\"\n            >\n              <path d=\"M18 6 6 18\" />\n              <path d=\"m6 6 12 12\" />\n            </svg>\n          </Button>\n        </div>\n\n        {/* Scrollable file list */}\n        <div className=\"flex gap-2 p-2 overflow-x-auto items-center\">\n          {doc_links.map((doc, index) => (\n            <FileListItem\n              key={`${doc.url}-${doc.file_id || index}`}\n              doc_link={doc}\n              is_selected={index === selected_index}\n              on_click={() => set_selected_index(index)}\n              config={config}\n              deletable={upload_mode && !!doc.file_id && !!on_delete}\n              on_delete={doc.file_id ? () => handle_delete(doc.file_id!) : undefined}\n              delete_in_progress={delete_in_progress === doc.file_id}\n            />\n          ))}\n\n          {/* Add file button in upload mode */}\n          {upload_mode && on_upload && (\n            <button\n              type=\"button\"\n              onClick={() => set_show_upload_zone(!show_upload_zone)}\n              className={cn(\n                \"cls_add_file_btn flex items-center gap-1 px-3 py-2 rounded-md text-sm\",\n                \"border border-dashed transition-colors whitespace-nowrap\",\n                show_upload_zone\n                  ? \"border-primary bg-primary/10 text-primary\"\n                  : \"border-border text-muted-foreground hover:border-input hover:bg-muted\"\n              )}\n            >\n              <FaPlus size={12} />\n              <span>Add file</span>\n            </button>\n          )}\n        </div>\n      </div>\n\n      {/* Upload zone (shown when Add file is clicked) */}\n      {upload_mode && show_upload_zone && on_upload && (\n        <UploadZone\n          config={config}\n          existing_file_count={doc_links.length}\n          on_upload={on_upload}\n          on_upload_complete={() => set_show_upload_zone(false)}\n        />\n      )}\n\n      {/* BOTTOM ROW: Viewer Area */}\n      <div className=\"cls_doc_panel_viewer flex-1 overflow-hidden\">\n        {!has_files ? (\n          /* Empty state */\n          <div className=\"flex items-center justify-center h-full p-4 text-center text-muted-foreground\">\n            <div>\n              <svg\n                xmlns=\"http://www.w3.org/2000/svg\"\n                width=\"48\"\n                height=\"48\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                strokeWidth=\"1\"\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n                className=\"mx-auto mb-4 text-muted-foreground/50\"\n              >\n                <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\n                <polyline points=\"14 2 14 8 20 8\" />\n              </svg>\n              <p className=\"text-sm text-muted-foreground\">No files yet</p>\n              {upload_mode && (\n                <p className=\"text-xs text-muted-foreground/80 mt-1\">\n                  Click \"Add file\" to upload\n                </p>\n              )}\n            </div>\n          </div>\n        ) : selected_doc?.type === \"pdf\" ? (\n          /* PDF Viewer */\n          <div className=\"h-full w-full\">\n            {hazo_pdf_error ? (\n              /* hazo_pdf library failed to load */\n              <div className=\"flex items-center justify-center h-full p-4 text-center text-muted-foreground\">\n                <div>\n                  <svg\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                    width=\"48\"\n                    height=\"48\"\n                    viewBox=\"0 0 24 24\"\n                    fill=\"none\"\n                    stroke=\"currentColor\"\n                    strokeWidth=\"1\"\n                    strokeLinecap=\"round\"\n                    strokeLinejoin=\"round\"\n                    className=\"mx-auto mb-4 text-muted-foreground\"\n                  >\n                    <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\n                    <polyline points=\"14 2 14 8 20 8\" />\n                    <line x1=\"9\" x2=\"15\" y1=\"15\" y2=\"15\" />\n                  </svg>\n                  <p className=\"text-sm\">{hazo_pdf_error}</p>\n                  <p className=\"text-xs mt-2 text-muted-foreground/80\">\n                    Run: npm install hazo_pdf\n                  </p>\n                </div>\n              </div>\n            ) : file_errors.has(selected_doc.url) ? (\n              /* Specific file failed to load (e.g., 404) */\n              <div className=\"flex items-center justify-center h-full p-4 text-center text-muted-foreground\">\n                <div>\n                  <svg\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                    width=\"48\"\n                    height=\"48\"\n                    viewBox=\"0 0 24 24\"\n                    fill=\"none\"\n                    stroke=\"currentColor\"\n                    strokeWidth=\"1\"\n                    strokeLinecap=\"round\"\n                    strokeLinejoin=\"round\"\n                    className=\"mx-auto mb-4 text-muted-foreground\"\n                  >\n                    <path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\" />\n                    <polyline points=\"14 2 14 8 20 8\" />\n                    <line x1=\"9\" x2=\"15\" y1=\"15\" y2=\"15\" />\n                  </svg>\n                  <p className=\"text-sm text-foreground/80\">\n                    {file_errors.get(selected_doc.url)?.includes(\"404\")\n                      ? `Missing PDF \"${selected_filename}\".`\n                      : file_errors.get(selected_doc.url)}\n                  </p>\n                  {file_errors.get(selected_doc.url)?.includes(\"404\") && (\n                    <p className=\"text-xs mt-2 text-muted-foreground/80\">\n                      The file may have been deleted or moved.\n                    </p>\n                  )}\n                  {upload_mode && on_delete && selected_doc.file_id && (\n                    <button\n                      type=\"button\"\n                      onClick={() => handle_delete(selected_doc.file_id!)}\n                      className=\"mt-4 px-3 py-1.5 text-sm bg-destructive/10 text-destructive rounded-md hover:bg-destructive/20 transition-colors\"\n                    >\n                      Remove this file reference\n                    </button>\n                  )}\n                </div>\n              </div>\n            ) : !PdfViewerComponent ? (\n              <div className=\"flex items-center justify-center h-full\">\n                <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-foreground\"></div>\n              </div>\n            ) : (\n              <PdfViewerComponent\n                key={selected_doc.url}\n                url={selected_doc.url}\n                className=\"h-full w-full\"\n                default_scale=\"page-width\"\n                on_error={(error: Error) => {\n                  console.error(\"PDF load error for\", selected_doc.url, \":\", error);\n                  set_file_errors((prev) => {\n                    const next = new Map(prev);\n                    next.set(selected_doc.url, error.message);\n                    return next;\n                  });\n                }}\n                file_manager={file_manager}\n                save_path={pdf_save_path}\n              />\n            )}\n          </div>\n        ) : selected_doc ? (\n          /* Non-PDF content (image preview or download) */\n          <NonPdfContent doc_link={selected_doc} filename={selected_filename} />\n        ) : null}\n      </div>\n    </div>\n  );\n}\n\n// Re-export sub-components\nexport { FileListItem } from \"./file_list_item\";\nexport { NonPdfContent } from \"./non_pdf_content\";\nexport { UploadZone } from \"./upload_zone\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaFileAlt, FaRegFileAlt } from \"react-icons/fa\";\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"../ui/tooltip\";\nimport type { DocLink, FormConfig } from \"../../lib/types\";\n\nexport interface DocLinkButtonProps {\n  doc_link: DocLink;\n  on_click?: () => void;\n  config: FormConfig;\n}\n\n/**\n * Doc Link Button\n * Clickable icon that triggers PDF panel open\n */\nexport function DocLinkButton({ doc_link, on_click, config }: DocLinkButtonProps) {\n  const [is_hovered, set_is_hovered] = React.useState(false);\n\n  const is_solid = config.doc_link_icon_style === \"solid\";\n  const icon_color = is_hovered ? config.doc_link_hover_color : config.doc_link_icon_color;\n  const icon_size = parseInt(config.doc_link_icon_size, 10) || 20;\n\n  const IconComponent = is_solid ? FaFileAlt : FaRegFileAlt;\n\n  return (\n    <TooltipProvider>\n      <Tooltip>\n        <TooltipTrigger asChild>\n          <button\n            type=\"button\"\n            onClick={on_click}\n            onMouseEnter={() => set_is_hovered(true)}\n            onMouseLeave={() => set_is_hovered(false)}\n            className=\"cls_doc_link_btn p-1 rounded hover:bg-muted transition-colors\"\n            aria-label={`View document${doc_link.page ? ` page ${doc_link.page}` : \"\"}`}\n          >\n            <IconComponent\n              size={icon_size}\n              color={icon_color}\n              className=\"transition-colors\"\n            />\n          </button>\n        </TooltipTrigger>\n        <TooltipContent>\n          <p>View source document{doc_link.page ? ` (page ${doc_link.page})` : \"\"}</p>\n        </TooltipContent>\n      </Tooltip>\n    </TooltipProvider>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { DocPanel } from \"../doc_panel\";\nimport type { DocLink, FormConfig } from \"../../lib/types\";\nimport type { PdfViewerProps } from \"../hazo_data_form/types\";\nimport type { FileManager as HazoFilesFileManager } from \"hazo_files\";\n\nexport interface PdfPanelProps {\n  /** Currently active doc_link */\n  doc_link: DocLink | null;\n\n  /** Whether panel is open */\n  is_open: boolean;\n\n  /** Callback to close panel */\n  on_close: () => void;\n\n  /** Config for styling */\n  config: FormConfig;\n\n  /** Optional PDF viewer component (from hazo_pdf or custom) */\n  pdf_viewer_component?: React.ComponentType<PdfViewerProps>;\n\n  /** File manager instance for save/load operations */\n  file_manager?: HazoFilesFileManager;\n\n  /** Path where PDFs should be saved */\n  pdf_save_path?: string;\n\n  /** Optional className for the panel container */\n  class_name?: string;\n}\n\n/**\n * PDF Panel Component\n * @deprecated Use DocPanel instead. PdfPanel is kept for backward compatibility.\n * Wraps DocPanel to provide backward compatibility with single doc_link prop.\n */\nexport function PdfPanel({\n  doc_link,\n  is_open,\n  on_close,\n  config,\n  pdf_viewer_component,\n  file_manager,\n  pdf_save_path,\n  class_name,\n}: PdfPanelProps) {\n  // Convert single doc_link to array for DocPanel\n  const doc_links = doc_link ? [doc_link] : [];\n\n  return (\n    <DocPanel\n      doc_links={doc_links}\n      is_open={is_open}\n      on_close={on_close}\n      config={config}\n      pdf_viewer_component={pdf_viewer_component}\n      file_manager={file_manager}\n      pdf_save_path={pdf_save_path}\n      class_name={class_name}\n    />\n  );\n}\n\n// Re-export DocLinkButton\nexport { DocLinkButton } from \"./doc_link_button\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\nimport { cn } from \"../../lib/utils\";\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TabsList = React.forwardRef<\n  React.ElementRef<typeof TabsPrimitive.List>,\n  React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n  <TabsPrimitive.List\n    ref={ref}\n    className={cn(\n      \"cls_tabs_list inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground\",\n      className\n    )}\n    {...props}\n  />\n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n  React.ElementRef<typeof TabsPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n  <TabsPrimitive.Trigger\n    ref={ref}\n    className={cn(\n      \"cls_tabs_trigger inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n      className\n    )}\n    {...props}\n  />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n  React.ElementRef<typeof TabsPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n  <TabsPrimitive.Content\n    ref={ref}\n    className={cn(\n      \"cls_tabs_content mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n      className\n    )}\n    {...props}\n  />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaFileUpload, FaFileAlt } from \"react-icons/fa\";\nimport { cn } from \"../../lib/utils\";\nimport type { FormConfig } from \"../../lib/types\";\n\nexport interface UploadIconButtonProps {\n  /** Whether field has existing uploads */\n  has_uploads: boolean;\n  /** Number of uploaded files */\n  upload_count: number;\n  /** Click handler */\n  on_click: () => void;\n  /** Configuration */\n  config: FormConfig;\n  /** Additional class name */\n  class_name?: string;\n}\n\n/**\n * Upload icon button component\n * Shows upload icon when no files, doc-link style icon with count badge when files exist\n */\nexport function UploadIconButton({\n  has_uploads,\n  upload_count,\n  on_click,\n  config,\n  class_name,\n}: UploadIconButtonProps) {\n  const icon_size = parseInt(config.doc_link_icon_size, 10) || 20;\n  const [is_hovered, set_is_hovered] = React.useState(false);\n\n  const icon_color = is_hovered\n    ? config.file_upload.upload_hover_color\n    : has_uploads\n      ? config.doc_link_icon_color\n      : config.file_upload.upload_icon_color;\n\n  return (\n    <button\n      type=\"button\"\n      onClick={on_click}\n      onMouseEnter={() => set_is_hovered(true)}\n      onMouseLeave={() => set_is_hovered(false)}\n      className={cn(\n        \"cls_upload_icon_btn relative p-1 rounded hover:bg-muted transition-colors\",\n        class_name\n      )}\n      aria-label={has_uploads ? `View ${upload_count} uploaded file(s)` : \"Upload file\"}\n    >\n      {has_uploads ? (\n        <>\n          <FaFileAlt\n            size={icon_size}\n            color={icon_color}\n            className=\"transition-colors\"\n          />\n          {upload_count > 0 && (\n            <span\n              className=\"cls_upload_count_badge absolute -top-1 -right-1 min-w-[16px] h-[16px] flex items-center justify-center rounded-full text-[10px] font-bold text-primary-foreground bg-primary\"\n            >\n              {upload_count > 9 ? \"9+\" : upload_count}\n            </span>\n          )}\n        </>\n      ) : (\n        <FaFileUpload\n          size={icon_size}\n          color={icon_color}\n          className=\"transition-colors\"\n        />\n      )}\n    </button>\n  );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FaUpload, FaTrash, FaEye, FaFile, FaFilePdf, FaFileImage } from \"react-icons/fa\";\nimport {\n  Dialog,\n  DialogContent,\n  DialogHeader,\n  DialogTitle,\n  DialogDescription,\n} from \"../ui/dialog\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../ui/tabs\";\nimport { Button } from \"../ui/button\";\nimport { cn, format_file_size, is_mime_type_allowed } from \"../../lib/utils\";\nimport type {\n  FormConfig,\n  FieldUploads,\n  UploadedFile,\n  FileUploadResult,\n} from \"../../lib/types\";\n\nexport interface FileUploadDialogProps {\n  /** Whether dialog is open */\n  is_open: boolean;\n  /** Callback when dialog closes */\n  on_close: () => void;\n  /** Field ID being uploaded to */\n  field_id: string;\n  /** Field label for display */\n  field_label: string;\n  /** Existing uploads for this field */\n  existing_uploads: FieldUploads;\n  /** Upload handler callback */\n  on_upload: (files: File[]) => Promise<FileUploadResult[]>;\n  /** Delete handler callback */\n  on_delete: (file_id: string) => Promise<boolean>;\n  /** View file callback */\n  on_view: (uploaded_file: UploadedFile) => void;\n  /** Configuration */\n  config: FormConfig;\n}\n\ninterface UploadProgress {\n  filename: string;\n  progress: number; // 0-100\n  status: \"uploading\" | \"success\" | \"error\";\n  error?: string;\n}\n\n/**\n * File upload dialog component\n * Provides drag-and-drop and click-to-select file upload with file management\n *\n * @deprecated Use DocPanel with upload_mode=true instead.\n * The DocPanel provides integrated file management within the document viewer panel,\n * offering a more intuitive and streamlined user experience.\n *\n * Migration:\n * - Open DocPanel with upload_mode={true} instead of FileUploadDialog\n * - Pass field's uploaded files as doc_links using uploads_to_doc_links()\n * - Use on_upload and on_delete props on DocPanel\n */\nexport function FileUploadDialog({\n  is_open,\n  on_close,\n  field_id,\n  field_label,\n  existing_uploads,\n  on_upload,\n  on_delete,\n  on_view,\n  config,\n}: FileUploadDialogProps) {\n  const file_input_ref = React.useRef<HTMLInputElement>(null);\n  const [is_dragging, set_is_dragging] = React.useState(false);\n  const [upload_progress, set_upload_progress] = React.useState<UploadProgress[]>([]);\n  const [is_uploading, set_is_uploading] = React.useState(false);\n  const [delete_in_progress, set_delete_in_progress] = React.useState<string | null>(null);\n\n  const upload_config = config.file_upload;\n\n  // Reset state when dialog closes\n  React.useEffect(() => {\n    if (!is_open) {\n      set_upload_progress([]);\n      set_is_uploading(false);\n      set_is_dragging(false);\n    }\n  }, [is_open]);\n\n  const validate_file = (file: File): string | null => {\n    // Check file type\n    if (!is_mime_type_allowed(file.type, upload_config.allowed_types)) {\n      return `File type \"${file.type}\" is not allowed`;\n    }\n\n    // Check file size\n    if (file.size > upload_config.max_file_size) {\n      return `File size exceeds maximum of ${format_file_size(upload_config.max_file_size)}`;\n    }\n\n    // Check max files per field\n    if (existing_uploads.length >= upload_config.max_files_per_field) {\n      return `Maximum of ${upload_config.max_files_per_field} files per field`;\n    }\n\n    return null;\n  };\n\n  const handle_files = async (files: FileList | File[]) => {\n    const file_array = Array.from(files);\n    const valid_files: File[] = [];\n    const errors: UploadProgress[] = [];\n\n    // Validate all files first\n    for (const file of file_array) {\n      const error = validate_file(file);\n      if (error) {\n        errors.push({\n          filename: file.name,\n          progress: 100,\n          status: \"error\",\n          error,\n        });\n      } else {\n        valid_files.push(file);\n      }\n    }\n\n    if (errors.length > 0) {\n      set_upload_progress(errors);\n    }\n\n    if (valid_files.length === 0) return;\n\n    // Start uploading\n    set_is_uploading(true);\n    const progress_entries: UploadProgress[] = valid_files.map((f) => ({\n      filename: f.name,\n      progress: 0,\n      status: \"uploading\" as const,\n    }));\n    set_upload_progress([...errors, ...progress_entries]);\n\n    try {\n      const results = await on_upload(valid_files);\n\n      // Update progress based on results\n      const updated_progress: UploadProgress[] = [...errors];\n      results.forEach((result, index) => {\n        const file = valid_files[index];\n        updated_progress.push({\n          filename: file.name,\n          progress: 100,\n          status: result.success ? \"success\" : \"error\",\n          error: result.error,\n        });\n      });\n      set_upload_progress(updated_progress);\n\n      // Clear success messages after a delay\n      setTimeout(() => {\n        set_upload_progress((prev) =>\n          prev.filter((p) => p.status === \"error\")\n        );\n      }, 2000);\n    } catch (error) {\n      set_upload_progress(\n        valid_files.map((f) => ({\n          filename: f.name,\n          progress: 100,\n          status: \"error\" as const,\n          error: error instanceof Error ? error.message : \"Upload failed\",\n        }))\n      );\n    } finally {\n      set_is_uploading(false);\n    }\n  };\n\n  const handle_drag_over = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(true);\n  };\n\n  const handle_drag_leave = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(false);\n  };\n\n  const handle_drop = (e: React.DragEvent) => {\n    e.preventDefault();\n    e.stopPropagation();\n    set_is_dragging(false);\n\n    if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n      handle_files(e.dataTransfer.files);\n    }\n  };\n\n  const handle_file_select = (e: React.ChangeEvent<HTMLInputElement>) => {\n    if (e.target.files && e.target.files.length > 0) {\n      handle_files(e.target.files);\n    }\n    // Reset input so same file can be selected again\n    e.target.value = \"\";\n  };\n\n  const handle_delete = async (file_id: string) => {\n    set_delete_in_progress(file_id);\n    try {\n      await on_delete(file_id);\n    } finally {\n      set_delete_in_progress(null);\n    }\n  };\n\n  const get_file_icon = (mime_type: string) => {\n    if (mime_type === \"application/pdf\") {\n      return <FaFilePdf className=\"text-destructive\" size={24} />;\n    }\n    if (mime_type.startsWith(\"image/\")) {\n      return <FaFileImage className=\"text-primary\" size={24} />;\n    }\n    return <FaFile className=\"text-muted-foreground\" size={24} />;\n  };\n\n  const allowed_extensions = upload_config.allowed_types\n    .map((t) => {\n      if (t === \"application/pdf\") return \".pdf\";\n      if (t === \"image/jpeg\") return \".jpg,.jpeg\";\n      if (t === \"image/png\") return \".png\";\n      if (t === \"image/gif\") return \".gif\";\n      if (t === \"image/webp\") return \".webp\";\n      if (t.endsWith(\"/*\")) return t.replace(\"/*\", \"/*\");\n      return \"\";\n    })\n    .filter(Boolean)\n    .join(\",\");\n\n  return (\n    <Dialog open={is_open} onOpenChange={(open) => !open && on_close()}>\n      <DialogContent className=\"cls_file_upload_dialog sm:max-w-[600px]\">\n        <DialogHeader>\n          <DialogTitle>Manage Files for \"{field_label}\"</DialogTitle>\n          <DialogDescription>\n            Upload, view, or delete files associated with this field.\n          </DialogDescription>\n        </DialogHeader>\n\n        <Tabs defaultValue=\"upload\" className=\"w-full\">\n          <TabsList className=\"grid w-full grid-cols-1\">\n            <TabsTrigger value=\"upload\">Upload</TabsTrigger>\n          </TabsList>\n\n          <TabsContent value=\"upload\" className=\"space-y-4\">\n            {/* Drag and drop zone */}\n            <div\n              className={cn(\n                \"cls_upload_dropzone border-2 border-dashed rounded-lg p-8 text-center transition-colors cursor-pointer\",\n                is_dragging\n                  ? \"border-primary bg-primary/10\"\n                  : \"border-border hover:border-input hover:bg-muted\"\n              )}\n              onDragOver={handle_drag_over}\n              onDragLeave={handle_drag_leave}\n              onDrop={handle_drop}\n              onClick={() => file_input_ref.current?.click()}\n            >\n              <input\n                ref={file_input_ref}\n                type=\"file\"\n                multiple\n                accept={allowed_extensions}\n                onChange={handle_file_select}\n                className=\"hidden\"\n              />\n              <FaUpload\n                className={cn(\n                  \"mx-auto mb-4\",\n                  is_dragging ? \"text-primary\" : \"text-muted-foreground\"\n                )}\n                size={32}\n              />\n              <p className=\"text-sm text-foreground/80\">\n                {is_dragging\n                  ? \"Drop files here...\"\n                  : \"Drag and drop files here, or click to select\"}\n              </p>\n              <p className=\"text-xs text-muted-foreground mt-2\">\n                Max size: {format_file_size(upload_config.max_file_size)} |\n                Max files: {upload_config.max_files_per_field}\n              </p>\n            </div>\n\n            {/* Upload progress */}\n            {upload_progress.length > 0 && (\n              <div className=\"cls_upload_progress space-y-2\">\n                {upload_progress.map((progress, index) => (\n                  <div\n                    key={`${progress.filename}-${index}`}\n                    className={cn(\n                      \"p-2 rounded text-sm\",\n                      progress.status === \"uploading\" && \"bg-primary/10 text-primary\",\n                      progress.status === \"success\" && \"bg-primary/10 text-primary\",\n                      progress.status === \"error\" && \"bg-destructive/10 text-destructive\"\n                    )}\n                  >\n                    <span className=\"font-medium\">{progress.filename}</span>\n                    {progress.status === \"uploading\" && \" - Uploading...\"}\n                    {progress.status === \"success\" && \" - Uploaded successfully\"}\n                    {progress.status === \"error\" && ` - ${progress.error}`}\n                  </div>\n                ))}\n              </div>\n            )}\n\n            {/* Existing files list */}\n            {existing_uploads.length > 0 && (\n              <div className=\"cls_uploaded_files space-y-2\">\n                <h4 className=\"text-sm font-medium text-foreground\">\n                  Uploaded Files ({existing_uploads.length})\n                </h4>\n                <div className=\"border rounded-lg divide-y\">\n                  {existing_uploads.map((file) => (\n                    <div\n                      key={file.file_id}\n                      className=\"cls_uploaded_file_item flex items-center gap-3 p-3\"\n                    >\n                      {get_file_icon(file.mime_type)}\n                      <div className=\"flex-grow min-w-0\">\n                        <p className=\"text-sm font-medium truncate\">\n                          {file.filename}\n                        </p>\n                        <p className=\"text-xs text-muted-foreground\">\n                          {format_file_size(file.size)} |{\" \"}\n                          {new Date(file.uploaded_at).toLocaleDateString()}\n                        </p>\n                      </div>\n                      <div className=\"flex items-center gap-1\">\n                        <Button\n                          variant=\"ghost\"\n                          size=\"sm\"\n                          onClick={() => on_view(file)}\n                          title=\"View file\"\n                        >\n                          <FaEye className=\"h-4 w-4\" />\n                        </Button>\n                        <Button\n                          variant=\"ghost\"\n                          size=\"sm\"\n                          onClick={() => handle_delete(file.file_id)}\n                          disabled={delete_in_progress === file.file_id}\n                          title=\"Delete file\"\n                          className=\"text-destructive hover:text-destructive hover:bg-destructive/10\"\n                        >\n                          <FaTrash className=\"h-4 w-4\" />\n                        </Button>\n                      </div>\n                    </div>\n                  ))}\n                </div>\n              </div>\n            )}\n\n            {/* Empty state */}\n            {existing_uploads.length === 0 && upload_progress.length === 0 && (\n              <p className=\"text-sm text-muted-foreground text-center py-4\">\n                No files uploaded yet. Drag and drop or click above to upload.\n              </p>\n            )}\n          </TabsContent>\n        </Tabs>\n      </DialogContent>\n    </Dialog>\n  );\n}\n\nexport { UploadIconButton } from \"./upload_icon_button\";\n"]}