{"version":3,"sources":["../src/utils.ts","../src/image-handler.ts","../src/table-handler.ts","../src/page-break-handler.ts","../src/core.ts","../src/helpers.ts"],"names":["thead","html2canvas","jsPDF"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * PDF Generator Library - Utilities\n *\n * Helper functions for PDF generation, color conversion, and styling\n */\n\nimport type {\n  PDFGeneratorOptions,\n  PDFPageConfig,\n  WatermarkOptions,\n  HeaderFooterTemplate,\n  PDFMetadata,\n  TemplateOptions,\n  FontOptions,\n  TOCOptions,\n  BookmarkOptions,\n  TemplateContext,\n  TOCEntry,\n  BookmarkEntry,\n  PDFSecurityOptions,\n  AsyncProcessingOptions,\n  PreviewOptions,\n} from './types';\n\n/** Standard paper formats in mm */\nexport const PAPER_FORMATS = {\n  a4: { width: 210, height: 297 },\n  letter: { width: 215.9, height: 279.4 },\n  a3: { width: 297, height: 420 },\n  legal: { width: 215.9, height: 355.6 },\n} as const;\n\n/** Default options for PDF generation */\nexport const DEFAULT_OPTIONS: Required<PDFGeneratorOptions> = {\n  orientation: 'portrait',\n  format: 'a4',\n  margins: [10, 10, 10, 10],\n  compress: true,\n  scale: 2,\n  imageQuality: 0.85,\n  header: () => null,\n  footer: () => null,\n  showPageNumbers: false,\n  pageNumberPosition: 'footer',\n  customCSS: '',\n  colorReplacements: {},\n  optimizeImages: true,\n  maxImageWidth: 1200,\n  convertSVG: true,\n  repeatTableHeaders: true,\n  avoidTableRowSplit: true,\n  preventOrphanedHeadings: true,\n  respectCSSPageBreaks: true,\n  onProgress: () => {},\n  onComplete: () => {},\n  onError: () => {},\n  emulateMediaType: 'screen',\n  watermark: undefined as unknown as WatermarkOptions,\n  headerTemplate: undefined as unknown as HeaderFooterTemplate,\n  footerTemplate: undefined as unknown as HeaderFooterTemplate,\n  metadata: undefined as unknown as PDFMetadata,\n  templateOptions: undefined as unknown as TemplateOptions,\n  fontOptions: undefined as unknown as FontOptions,\n  tocOptions: undefined as unknown as TOCOptions,\n  bookmarkOptions: undefined as unknown as BookmarkOptions,\n  securityOptions: undefined as unknown as PDFSecurityOptions,\n  asyncOptions: undefined as unknown as AsyncProcessingOptions,\n  previewOptions: undefined as unknown as PreviewOptions,\n};\n\n/**\n * Calculate page configuration based on options\n */\nexport function calculatePageConfig(\n  options: Required<PDFGeneratorOptions>\n): PDFPageConfig {\n  const format = PAPER_FORMATS[options.format];\n  const [marginTop, marginRight, marginBottom, marginLeft] = options.margins;\n\n  const width = options.orientation === 'portrait' ? format.width : format.height;\n  const height = options.orientation === 'portrait' ? format.height : format.width;\n\n  const usableWidth = width - marginLeft - marginRight;\n  const usableHeight = height - marginTop - marginBottom;\n\n  // Convert mm to pixels (96 DPI: 1mm = 3.7795px)\n  const MM_TO_PX = 3.7795;\n  const widthPx = usableWidth * MM_TO_PX;\n  const heightPx = usableHeight * MM_TO_PX;\n\n  return {\n    width,\n    height,\n    usableWidth,\n    usableHeight,\n    widthPx,\n    heightPx,\n  };\n}\n\n/**\n * Common Tailwind OKLCH color replacements\n */\nexport const TAILWIND_COLOR_REPLACEMENTS: Record<string, string> = {\n  '--color-red-50': '#fef2f2',\n  '--color-red-100': '#fee2e2',\n  '--color-red-200': '#fecaca',\n  '--color-red-300': '#fca5a5',\n  '--color-red-400': '#f87171',\n  '--color-red-500': '#ef4444',\n  '--color-red-600': '#dc2626',\n  '--color-red-700': '#b91c1c',\n  '--color-red-800': '#991b1b',\n  '--color-red-900': '#7f1d1d',\n\n  '--color-orange-50': '#fff7ed',\n  '--color-orange-100': '#ffedd5',\n  '--color-orange-200': '#fed7aa',\n  '--color-orange-300': '#fdba74',\n  '--color-orange-400': '#fb923c',\n  '--color-orange-500': '#f97316',\n  '--color-orange-600': '#ea580c',\n  '--color-orange-700': '#c2410c',\n  '--color-orange-800': '#9a3412',\n  '--color-orange-900': '#7c2d12',\n\n  '--color-yellow-50': '#fefce8',\n  '--color-yellow-100': '#fef9c3',\n  '--color-yellow-200': '#fef08a',\n  '--color-yellow-300': '#fde047',\n  '--color-yellow-400': '#facc15',\n  '--color-yellow-500': '#eab308',\n  '--color-yellow-600': '#ca8a04',\n  '--color-yellow-700': '#a16207',\n  '--color-yellow-800': '#854d0e',\n  '--color-yellow-900': '#713f12',\n\n  '--color-green-50': '#f0fdf4',\n  '--color-green-100': '#dcfce7',\n  '--color-green-200': '#bbf7d0',\n  '--color-green-300': '#86efac',\n  '--color-green-400': '#4ade80',\n  '--color-green-500': '#22c55e',\n  '--color-green-600': '#16a34a',\n  '--color-green-700': '#15803d',\n  '--color-green-800': '#166534',\n  '--color-green-900': '#14532d',\n\n  '--color-blue-50': '#eff6ff',\n  '--color-blue-100': '#dbeafe',\n  '--color-blue-200': '#bfdbfe',\n  '--color-blue-300': '#93c5fd',\n  '--color-blue-400': '#60a5fa',\n  '--color-blue-500': '#3b82f6',\n  '--color-blue-600': '#2563eb',\n  '--color-blue-700': '#1d4ed8',\n  '--color-blue-800': '#1e40af',\n  '--color-blue-900': '#1e3a8a',\n\n  '--color-purple-50': '#faf5ff',\n  '--color-purple-100': '#f3e8ff',\n  '--color-purple-200': '#e9d5ff',\n  '--color-purple-300': '#d8b4fe',\n  '--color-purple-400': '#c084fc',\n  '--color-purple-500': '#a855f7',\n  '--color-purple-600': '#9333ea',\n  '--color-purple-700': '#7e22ce',\n  '--color-purple-800': '#6b21a8',\n  '--color-purple-900': '#581c87',\n\n  '--color-gray-50': '#f9fafb',\n  '--color-gray-100': '#f3f4f6',\n  '--color-gray-200': '#e5e7eb',\n  '--color-gray-300': '#d1d5db',\n  '--color-gray-400': '#9ca3af',\n  '--color-gray-500': '#6b7280',\n  '--color-gray-600': '#4b5563',\n  '--color-gray-700': '#374151',\n  '--color-gray-800': '#1f2937',\n  '--color-gray-900': '#111827',\n\n  '--color-black': '#000000',\n  '--color-white': '#ffffff',\n};\n\n/**\n * Generate CSS for color replacements\n */\nexport function generateColorReplacementCSS(\n  colorReplacements: Record<string, string>,\n  targetId?: string\n): string {\n  const selector = targetId ? `#${targetId}` : ':root';\n  const cssVars = Object.entries(colorReplacements)\n    .map(([key, value]) => `    ${key}: ${value} !important;`)\n    .join('\\n');\n\n  let css = `\n    ${selector} {\n${cssVars}\n    }\n  `;\n\n  // Add utility class overrides\n  const utilityClasses: string[] = [];\n\n  // Background colors\n  ['red', 'orange', 'yellow', 'green', 'blue', 'purple', 'gray'].forEach((color) => {\n    for (let i = 50; i <= 900; i += (i < 100 ? 50 : 100)) {\n      const key = `--color-${color}-${i}`;\n      const value = colorReplacements[key];\n      if (value) {\n        utilityClasses.push(\n          `${targetId ? `#${targetId}` : ''} .bg-${color}-${i} { background-color: ${value} !important; }`\n        );\n        utilityClasses.push(\n          `${targetId ? `#${targetId}` : ''} .text-${color}-${i} { color: ${value} !important; }`\n        );\n        utilityClasses.push(\n          `${targetId ? `#${targetId}` : ''} .border-${color}-${i} { border-color: ${value} !important; }`\n        );\n      }\n    }\n  });\n\n  css += '\\n' + utilityClasses.join('\\n');\n\n  return css;\n}\n\n/**\n * Create a style element with custom CSS\n */\nexport function createStyleElement(css: string, id: string): HTMLStyleElement {\n  const style = document.createElement('style');\n  style.id = id;\n  style.textContent = css;\n  return style;\n}\n\n/**\n * Clone an element with all styles computed\n */\nexport function cloneElementWithStyles(\n  element: HTMLElement,\n  targetWidth: number\n): HTMLElement {\n  const clone = element.cloneNode(true) as HTMLElement;\n  clone.style.width = `${targetWidth}px`;\n  clone.style.maxWidth = `${targetWidth}px`;\n  clone.style.minWidth = `${targetWidth}px`;\n  clone.style.boxSizing = 'border-box';\n  return clone;\n}\n\n/**\n * Generate a sanitized filename\n */\nexport function sanitizeFilename(name: string, extension: string): string {\n  const sanitized = name\n    .trim()\n    .replace(/[^\\w\\s\\u0980-\\u09FF-]/g, ' ') // Replace special chars\n    .replace(/\\s+/g, '_') // Replace spaces with underscore\n    .replace(/^_+|_+$/g, '') // Remove leading/trailing underscores\n    .substring(0, 50); // Limit length\n\n  return sanitized ? `${sanitized}.${extension}` : `document.${extension}`;\n}\n\n/**\n * Convert HTML string to HTMLElement\n * Supports full HTML documents or HTML fragments\n */\nexport function htmlStringToElement(htmlString: string): HTMLElement {\n  // Create a temporary container\n  const container = document.createElement('div');\n\n  // Clean up the HTML string\n  const trimmedHTML = htmlString.trim();\n\n  // Check if it's a full HTML document\n  const isFullDocument = /^<!DOCTYPE|^<html/i.test(trimmedHTML);\n\n  if (isFullDocument) {\n    // Parse as full document\n    const parser = new DOMParser();\n    const doc = parser.parseFromString(trimmedHTML, 'text/html');\n\n    // Extract body content\n    const body = doc.body;\n\n    // Also extract and apply styles from head\n    const styles = doc.head.querySelectorAll('style, link[rel=\"stylesheet\"]');\n    const wrapper = document.createElement('div');\n\n    // Add styles to wrapper\n    styles.forEach(style => {\n      wrapper.appendChild(style.cloneNode(true));\n    });\n\n    // Add body content\n    Array.from(body.children).forEach(child => {\n      wrapper.appendChild(child.cloneNode(true));\n    });\n\n    return wrapper;\n  } else {\n    // Parse as HTML fragment\n    container.innerHTML = trimmedHTML;\n\n    // If there's only one child, return it directly\n    if (container.children.length === 1) {\n      return container.children[0] as HTMLElement;\n    }\n\n    // Otherwise return the container with all children\n    return container;\n  }\n}\n\n/**\n * Load external CSS from link tags in HTML string\n */\nexport async function loadExternalStyles(element: HTMLElement): Promise<void> {\n  const linkTags = element.querySelectorAll('link[rel=\"stylesheet\"]');\n\n  const promises = Array.from(linkTags).map(async (link) => {\n    const href = link.getAttribute('href');\n    if (!href) return;\n\n    try {\n      const response = await fetch(href);\n      const cssText = await response.text();\n\n      // Create style element\n      const style = document.createElement('style');\n      style.textContent = cssText;\n\n      // Replace link with style\n      link.parentNode?.replaceChild(style, link);\n    } catch (error) {\n      console.warn(`Failed to load external stylesheet: ${href}`, error);\n    }\n  });\n\n  await Promise.all(promises);\n}\n\n/**\n * Estimate the number of pages needed based on content height\n */\nexport function estimatePageCount(\n  contentHeight: number,\n  pageHeight: number\n): number {\n  return Math.ceil(contentHeight / pageHeight);\n}\n\n/**\n * Wait for images to load in an element\n */\nexport async function waitForImagesToLoad(element: HTMLElement): Promise<void> {\n  const images = Array.from(element.querySelectorAll('img'));\n  const imagePromises = images.map((img) => {\n    if (img.complete) return Promise.resolve();\n    return new Promise<void>((resolve) => {\n      img.addEventListener('load', () => resolve());\n      img.addEventListener('error', () => resolve()); // Resolve even on error\n    });\n  });\n\n  await Promise.all(imagePromises);\n}\n\n/**\n * Calculate optimal scale based on content width\n */\nexport function calculateOptimalScale(\n  contentWidth: number,\n  targetWidth: number,\n  maxScale: number = 3\n): number {\n  const scale = targetWidth / contentWidth;\n  return Math.min(scale, maxScale);\n}\n\n/**\n * Process template string with variables\n * Supports: {{pageNumber}}, {{totalPages}}, {{date}}, {{title}}\n */\nexport function processTemplate(\n  template: string,\n  variables: Record<string, string | number>\n): string {\n  let processed = template;\n\n  Object.entries(variables).forEach(([key, value]) => {\n    const regex = new RegExp(`{{${key}}}`, 'g');\n    processed = processed.replace(regex, String(value));\n  });\n\n  return processed;\n}\n\n/**\n * Parse hex color to RGB\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n  const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n  return result ? {\n    r: parseInt(result[1], 16),\n    g: parseInt(result[2], 16),\n    b: parseInt(result[3], 16)\n  } : null;\n}\n\n/**\n * Convert OKLCH to linear RGB\n * Based on OKLCH color space specification\n */\nfunction oklchToLinearRgb(L: number, C: number, h: number): [number, number, number] {\n  // Convert OKLCH to OKLab\n  const hRad = (h * Math.PI) / 180;\n  const a = C * Math.cos(hRad);\n  const b = C * Math.sin(hRad);\n\n  // OKLab to linear RGB transformation matrix\n  const l_ = L + 0.3963377774 * a + 0.2158037573 * b;\n  const m_ = L - 0.1055613458 * a - 0.0638541728 * b;\n  const s_ = L - 0.0894841775 * a - 1.2914855480 * b;\n\n  const l = l_ * l_ * l_;\n  const m = m_ * m_ * m_;\n  const s = s_ * s_ * s_;\n\n  return [\n    +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n    -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n    -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s,\n  ];\n}\n\n/**\n * Apply gamma correction to linear RGB\n */\nfunction linearToSrgb(c: number): number {\n  const abs = Math.abs(c);\n  if (abs > 0.0031308) {\n    return (Math.sign(c) || 1) * (1.055 * Math.pow(abs, 1 / 2.4) - 0.055);\n  }\n  return 12.92 * c;\n}\n\n/**\n * Clamp value between 0 and 255\n */\nfunction clamp(value: number): number {\n  return Math.max(0, Math.min(255, Math.round(value * 255)));\n}\n\n/**\n * Convert OKLCH color to RGB\n * Handles various OKLCH formats:\n * - oklch(L C H)\n * - oklch(L C H / alpha)\n * - oklch(L% C% H)\n * - oklch(L% C% H / alpha)\n *\n * @param oklchString - OKLCH color string (e.g., \"oklch(0.5 0.2 180)\" or \"oklch(50% 20% 180deg / 0.5)\")\n * @returns RGB color string (e.g., \"rgb(123, 45, 67)\" or \"rgba(123, 45, 67, 0.5)\")\n */\nexport function oklchToRgb(oklchString: string): string | null {\n  // Match OKLCH format with optional alpha\n  // Supports: oklch(L C H), oklch(L C H / alpha), oklch(L% C% H), oklch(L% C% Hdeg / alpha%), etc.\n  const oklchRegex = /oklch\\(\\s*([\\d.]+)%?\\s+([\\d.]+)%?\\s+([\\d.]+)(?:deg|rad|grad|turn)?\\s*(?:\\/\\s*([\\d.]+)%?\\s*)?\\)/i;\n  const match = oklchString.match(oklchRegex);\n\n  if (!match) {\n    return null;\n  }\n\n  let [, lStr, cStr, hStr, alphaStr] = match;\n\n  // Parse L (lightness): 0-1 or 0-100%\n  let L = parseFloat(lStr);\n  if (oklchString.includes(`${lStr}%`)) {\n    L = L / 100;\n  }\n  // If L > 1, assume it's a percentage without % symbol\n  if (L > 1) {\n    L = L / 100;\n  }\n\n  // Parse C (chroma): 0-0.4 typical range, but can be higher\n  let C = parseFloat(cStr);\n  if (oklchString.includes(`${cStr}%`)) {\n    C = C / 100 * 0.4; // Scale percentage to typical chroma range\n  }\n\n  // Parse H (hue): 0-360 degrees\n  let h = parseFloat(hStr);\n  const hMatch = hStr.match(/([\\d.]+)(deg|rad|grad|turn)?/i);\n  if (hMatch && hMatch[2]) {\n    const unit = hMatch[2].toLowerCase();\n    if (unit === 'rad') {\n      h = (h * 180) / Math.PI;\n    } else if (unit === 'grad') {\n      h = (h * 360) / 400;\n    } else if (unit === 'turn') {\n      h = h * 360;\n    }\n  }\n\n  // Parse alpha (optional): 0-1 or 0-100%\n  let alpha: number | undefined;\n  if (alphaStr) {\n    alpha = parseFloat(alphaStr);\n    if (oklchString.includes(`${alphaStr}%`)) {\n      alpha = alpha / 100;\n    }\n    // Clamp alpha between 0 and 1\n    alpha = Math.max(0, Math.min(1, alpha));\n  }\n\n  // Convert OKLCH to linear RGB\n  const [rLinear, gLinear, bLinear] = oklchToLinearRgb(L, C, h);\n\n  // Apply gamma correction and convert to 0-255 range\n  const r = clamp(linearToSrgb(rLinear));\n  const g = clamp(linearToSrgb(gLinear));\n  const b = clamp(linearToSrgb(bLinear));\n\n  // Return RGB or RGBA\n  if (alpha !== undefined) {\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n  }\n  return `rgb(${r}, ${g}, ${b})`;\n}\n\n/**\n * Convert all OKLCH colors in CSS text to RGB\n * Handles both inline styles and CSS rules\n *\n * @param css - CSS text containing OKLCH colors\n * @returns CSS text with OKLCH colors converted to RGB\n */\nexport function convertOklchToRgbInCSS(css: string): string {\n  // Match all OKLCH color functions\n  const oklchRegex = /oklch\\([^)]+\\)/gi;\n\n  return css.replace(oklchRegex, (match) => {\n    const rgb = oklchToRgb(match);\n    return rgb || match; // Return original if conversion fails\n  });\n}\n\n/**\n * Convert OKLCH colors in element's inline styles and computed styles\n * Modifies the element in place\n *\n * @param element - HTML element to process\n */\nexport function convertOklchInElement(element: HTMLElement): void {\n  // Process inline styles on root element\n  if (element.style.cssText) {\n    element.style.cssText = convertOklchToRgbInCSS(element.style.cssText);\n  }\n\n  // Also check computed styles and apply as inline if they contain OKLCH\n  const computedStyle = window.getComputedStyle(element);\n  _applyOklchConversionFromComputed(element, computedStyle);\n\n  // Process all child elements recursively\n  const children = element.querySelectorAll('*');\n  children.forEach((child) => {\n    if (child instanceof HTMLElement) {\n      // Convert inline styles\n      if (child.style.cssText) {\n        child.style.cssText = convertOklchToRgbInCSS(child.style.cssText);\n      }\n\n      // Convert computed styles\n      const childComputed = window.getComputedStyle(child);\n      _applyOklchConversionFromComputed(child, childComputed);\n    }\n  });\n}\n\n/**\n * Helper function to check computed styles for OKLCH and apply converted values\n * @internal\n */\nfunction _applyOklchConversionFromComputed(element: HTMLElement, computedStyle: CSSStyleDeclaration): void {\n  // Properties that commonly use colors\n  const colorProperties = [\n    'color',\n    'background-color',\n    'border-color',\n    'border-top-color',\n    'border-right-color',\n    'border-bottom-color',\n    'border-left-color',\n    'outline-color',\n    'text-decoration-color',\n    'column-rule-color',\n    'caret-color',\n  ];\n\n  colorProperties.forEach((prop) => {\n    const value = computedStyle.getPropertyValue(prop);\n    if (value && value.includes('oklch')) {\n      const converted = convertOklchToRgbInCSS(value);\n      // Apply as inline style to override computed style\n      element.style.setProperty(prop, converted, 'important');\n    }\n  });\n\n  // Handle background shorthand which might contain OKLCH\n  const background = computedStyle.getPropertyValue('background');\n  if (background && background.includes('oklch')) {\n    const converted = convertOklchToRgbInCSS(background);\n    element.style.setProperty('background', converted, 'important');\n  }\n\n  // Handle border shorthand\n  const border = computedStyle.getPropertyValue('border');\n  if (border && border.includes('oklch')) {\n    const converted = convertOklchToRgbInCSS(border);\n    element.style.setProperty('border', converted, 'important');\n  }\n}\n\n/**\n * Process all stylesheets in an element to convert OKLCH to RGB\n * Creates new style elements with converted CSS\n *\n * @param element - HTML element containing stylesheets\n */\nexport function convertOklchInStylesheets(element: HTMLElement): void {\n  // Process <style> tags\n  const styleTags = element.querySelectorAll('style');\n  styleTags.forEach((styleTag) => {\n    if (styleTag.textContent) {\n      styleTag.textContent = convertOklchToRgbInCSS(styleTag.textContent);\n    }\n  });\n}\n\n/**\n * Extract all CSS rules from document stylesheets that contain OKLCH\n * and create a comprehensive override stylesheet\n *\n * @returns CSS text with all OKLCH colors converted to RGB\n */\nexport function extractAndConvertOklchFromStylesheets(): string {\n  const cssRules: string[] = [];\n\n  // Iterate through all stylesheets\n  Array.from(document.styleSheets).forEach((sheet) => {\n    try {\n      // Try to access cssRules (may fail for cross-origin stylesheets)\n      const rules = sheet.cssRules || sheet.rules;\n      if (!rules) return;\n\n      Array.from(rules).forEach((rule) => {\n        const cssText = rule.cssText;\n\n        // Check if rule contains OKLCH\n        if (cssText && cssText.includes('oklch')) {\n          // Convert OKLCH to RGB in this rule\n          const converted = convertOklchToRgbInCSS(cssText);\n          cssRules.push(converted);\n        }\n      });\n    } catch (e) {\n      // Silently fail for cross-origin stylesheets\n      // This is expected for external CSS files from different domains\n    }\n  });\n\n  return cssRules.join('\\n');\n}\n\n/**\n * Get watermark rotation angle based on position\n */\nexport function getWatermarkRotation(position: string): number {\n  if (position === 'diagonal') return 45;\n  return 0;\n}\n\n/**\n * Calculate watermark position coordinates\n */\nexport function calculateWatermarkPosition(\n  position: string,\n  pageWidth: number,\n  pageHeight: number,\n  textWidth: number,\n  textHeight: number\n): { x: number; y: number } {\n  switch (position) {\n    case 'center':\n      return {\n        x: pageWidth / 2,\n        y: pageHeight / 2\n      };\n    case 'diagonal':\n      return {\n        x: pageWidth / 2,\n        y: pageHeight / 2\n      };\n    case 'top-left':\n      return {\n        x: textWidth / 2 + 10,\n        y: textHeight / 2 + 10\n      };\n    case 'top-right':\n      return {\n        x: pageWidth - textWidth / 2 - 10,\n        y: textHeight / 2 + 10\n      };\n    case 'bottom-left':\n      return {\n        x: textWidth / 2 + 10,\n        y: pageHeight - textHeight / 2 - 10\n      };\n    case 'bottom-right':\n      return {\n        x: pageWidth - textWidth / 2 - 10,\n        y: pageHeight - textHeight / 2 - 10\n      };\n    default:\n      return {\n        x: pageWidth / 2,\n        y: pageHeight / 2\n      };\n  }\n}\n\n/**\n * Format date for templates\n */\nexport function formatDate(date: Date = new Date()): string {\n  return date.toLocaleDateString('en-US', {\n    year: 'numeric',\n    month: 'long',\n    day: 'numeric'\n  });\n}\n\n/**\n * Process template with context variables\n * Supports simple variables: {{variable}}\n * Supports loops: {{#each items}}{{name}}{{/each}}\n * Supports conditionals: {{#if condition}}text{{/if}}\n */\nexport function processTemplateWithContext(\n  template: string,\n  context: TemplateContext,\n  options: { enableLoops?: boolean; enableConditionals?: boolean } = {}\n): string {\n  let processed = template;\n\n  // Process simple variables first: {{variable}}\n  Object.entries(context).forEach(([key, value]) => {\n    if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n      const regex = new RegExp(`{{${key}}}`, 'g');\n      processed = processed.replace(regex, String(value));\n    }\n  });\n\n  // Process loops: {{#each items}}{{name}}{{/each}}\n  if (options.enableLoops) {\n    const loopRegex = /{{#each\\s+(\\w+)}}([\\s\\S]*?){{\\/each}}/g;\n    processed = processed.replace(loopRegex, (match, arrayKey, template) => {\n      const arrayData = context[arrayKey];\n      if (!Array.isArray(arrayData)) return match;\n\n      return arrayData\n        .map((item: any) => {\n          let itemHtml = template;\n          if (typeof item === 'object') {\n            Object.entries(item).forEach(([key, value]) => {\n              const regex = new RegExp(`{{${key}}}`, 'g');\n              itemHtml = itemHtml.replace(regex, String(value));\n            });\n          } else {\n            itemHtml = itemHtml.replace(/{{this}}/g, String(item));\n          }\n          return itemHtml;\n        })\n        .join('');\n    });\n  }\n\n  // Process conditionals: {{#if condition}}text{{/if}}\n  if (options.enableConditionals) {\n    const ifRegex = /{{#if\\s+(\\w+)}}([\\s\\S]*?){{\\/if}}/g;\n    processed = processed.replace(ifRegex, (match, conditionKey, content) => {\n      const condition = context[conditionKey];\n      return condition ? content : '';\n    });\n  }\n\n  return processed;\n}\n\n/**\n * Extract headings from HTML element for TOC or bookmarks\n */\nexport function extractHeadings(\n  element: HTMLElement,\n  levels: number[] = [1, 2, 3]\n): Array<{ title: string; level: number; id: string; element: HTMLElement }> {\n  const headings: Array<{ title: string; level: number; id: string; element: HTMLElement }> = [];\n  const selectors = levels.map(level => `h${level}`).join(', ');\n  const headingElements = element.querySelectorAll(selectors);\n\n  headingElements.forEach((heading, index) => {\n    const level = parseInt(heading.tagName.substring(1));\n    const title = heading.textContent?.trim() || '';\n    let id = heading.id;\n\n    // Generate ID if not present\n    if (!id) {\n      id = `heading-${index}-${title.toLowerCase().replace(/\\s+/g, '-').substring(0, 30)}`;\n      heading.id = id;\n    }\n\n    headings.push({\n      title,\n      level,\n      id,\n      element: heading as HTMLElement\n    });\n  });\n\n  return headings;\n}\n\n/**\n * Build hierarchical TOC structure from flat heading list\n */\nexport function buildTOCHierarchy(\n  headings: Array<{ title: string; level: number; page: number; id: string }>\n): TOCEntry[] {\n  const root: TOCEntry[] = [];\n  const stack: Array<TOCEntry & { level: number }> = [];\n\n  headings.forEach(heading => {\n    const entry: TOCEntry & { level: number } = {\n      title: heading.title,\n      level: heading.level,\n      page: heading.page,\n      id: heading.id,\n      children: []\n    };\n\n    // Find parent level\n    while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {\n      stack.pop();\n    }\n\n    if (stack.length === 0) {\n      root.push(entry);\n    } else {\n      const parent = stack[stack.length - 1];\n      if (!parent.children) parent.children = [];\n      parent.children.push(entry);\n    }\n\n    stack.push(entry);\n  });\n\n  return root;\n}\n\n/**\n * Generate TOC HTML from entries\n */\nexport function generateTOCHTML(\n  entries: TOCEntry[],\n  options: {\n    includePageNumbers?: boolean;\n    indentPerLevel?: number;\n    title?: string;\n  } = {}\n): string {\n  const { includePageNumbers = true, indentPerLevel = 10, title = 'Table of Contents' } = options;\n\n  let html = `<div class=\"pdf-toc\">`;\n  if (title) {\n    html += `<h1 class=\"pdf-toc-title\">${title}</h1>`;\n  }\n  html += `<div class=\"pdf-toc-entries\">`;\n\n  const renderEntry = (entry: TOCEntry, depth: number = 0): string => {\n    const indent = depth * indentPerLevel;\n    let entryHtml = `<div class=\"pdf-toc-entry pdf-toc-level-${entry.level}\" style=\"margin-left: ${indent}mm;\">`;\n    entryHtml += `<span class=\"pdf-toc-entry-title\">${entry.title}</span>`;\n    if (includePageNumbers) {\n      entryHtml += `<span class=\"pdf-toc-entry-page\">${entry.page}</span>`;\n    }\n    entryHtml += `</div>`;\n\n    if (entry.children && entry.children.length > 0) {\n      entry.children.forEach(child => {\n        entryHtml += renderEntry(child, depth + 1);\n      });\n    }\n\n    return entryHtml;\n  };\n\n  entries.forEach(entry => {\n    html += renderEntry(entry);\n  });\n\n  html += `</div></div>`;\n  return html;\n}\n\n/**\n * Generate default TOC CSS\n */\nexport function generateTOCCSS(): string {\n  return `\n    .pdf-toc {\n      page-break-after: always;\n      padding: 20px 0;\n    }\n    .pdf-toc-title {\n      font-size: 24px;\n      font-weight: bold;\n      margin-bottom: 20px;\n      text-align: center;\n    }\n    .pdf-toc-entries {\n      line-height: 1.6;\n    }\n    .pdf-toc-entry {\n      display: flex;\n      justify-content: space-between;\n      padding: 4px 0;\n      border-bottom: 1px dotted #ccc;\n    }\n    .pdf-toc-entry-title {\n      flex: 1;\n    }\n    .pdf-toc-entry-page {\n      margin-left: 10px;\n      font-weight: bold;\n    }\n    .pdf-toc-level-1 {\n      font-weight: bold;\n      font-size: 16px;\n      margin-top: 10px;\n    }\n    .pdf-toc-level-2 {\n      font-size: 14px;\n    }\n    .pdf-toc-level-3 {\n      font-size: 12px;\n      color: #666;\n    }\n  `;\n}\n\n/**\n * Build hierarchical bookmark structure from flat heading list\n */\nexport function buildBookmarkHierarchy(\n  headings: Array<{ title: string; level: number; page: number; id: string }>\n): BookmarkEntry[] {\n  const root: BookmarkEntry[] = [];\n  const stack: Array<BookmarkEntry & { level: number }> = [];\n\n  headings.forEach(heading => {\n    const entry: BookmarkEntry & { level: number } = {\n      title: heading.title,\n      page: heading.page,\n      level: heading.level,\n      id: heading.id,\n      children: []\n    };\n\n    // Find parent level\n    while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {\n      stack.pop();\n    }\n\n    if (stack.length === 0) {\n      root.push(entry);\n    } else {\n      const parent = stack[stack.length - 1];\n      if (!parent.children) parent.children = [];\n      parent.children.push(entry);\n    }\n\n    stack.push(entry);\n  });\n\n  return root;\n}\n\n/**\n * Web-safe font replacements\n */\nexport const WEB_SAFE_FONT_MAP: Record<string, string> = {\n  'Arial': 'Arial, Helvetica, sans-serif',\n  'Helvetica': 'Helvetica, Arial, sans-serif',\n  'Times New Roman': 'Times New Roman, Times, serif',\n  'Times': 'Times, Times New Roman, serif',\n  'Courier New': 'Courier New, Courier, monospace',\n  'Courier': 'Courier, Courier New, monospace',\n  'Verdana': 'Verdana, Geneva, sans-serif',\n  'Georgia': 'Georgia, serif',\n  'Palatino': 'Palatino Linotype, Book Antiqua, Palatino, serif',\n  'Garamond': 'Garamond, serif',\n  'Comic Sans MS': 'Comic Sans MS, cursive',\n  'Trebuchet MS': 'Trebuchet MS, Helvetica, sans-serif',\n  'Arial Black': 'Arial Black, Gadget, sans-serif',\n  'Impact': 'Impact, Charcoal, sans-serif',\n};\n\n/**\n * Replace custom fonts with web-safe alternatives\n */\nexport function replaceWithWebSafeFonts(css: string): string {\n  let processedCSS = css;\n\n  Object.entries(WEB_SAFE_FONT_MAP).forEach(([custom, webSafe]) => {\n    const regex = new RegExp(`font-family:\\\\s*['\"]?${custom}['\"]?`, 'gi');\n    processedCSS = processedCSS.replace(regex, `font-family: ${webSafe}`);\n  });\n\n  return processedCSS;\n}\n\n/**\n * Generate @font-face CSS for custom fonts\n */\nexport function generateFontFaceCSS(fonts: Array<{ family: string; src: string; weight?: number; style?: string }>): string {\n  return fonts.map(font => {\n    const weight = font.weight || 400;\n    const style = font.style || 'normal';\n\n    return `\n      @font-face {\n        font-family: '${font.family}';\n        src: url('${font.src}');\n        font-weight: ${weight};\n        font-style: ${style};\n      }\n    `;\n  }).join('\\n');\n}\n","/**\n * PDF Generator Library - Image Handler\n *\n * Advanced image processing for PDF generation\n */\n\n/**\n * Image processing options\n */\nexport interface ImageProcessingOptions {\n  /** Maximum width in pixels */\n  maxWidth?: number;\n  /** Maximum height in pixels */\n  maxHeight?: number;\n  /** JPEG quality (0-1) */\n  quality?: number;\n  /** Enable image compression */\n  compress?: boolean;\n  /** Convert to grayscale */\n  grayscale?: boolean;\n  /** DPI for print quality (72, 150, 300) */\n  dpi?: number;\n  /** Image format */\n  format?: 'jpeg' | 'png' | 'webp';\n  /** Background color for transparent images (hex or rgb) */\n  backgroundColor?: string;\n  /** Enable image interpolation (may cause blur) */\n  interpolate?: boolean;\n  /** Optimize for print quality */\n  optimizeForPrint?: boolean;\n}\n\n/**\n * Preload and optimize all images in an element\n */\nexport async function preloadImages(element: HTMLElement): Promise<void> {\n  const images = Array.from(element.querySelectorAll('img'));\n\n  await Promise.all(\n    images.map((img) => {\n      if (img.complete && img.naturalHeight !== 0) {\n        return Promise.resolve();\n      }\n\n      return new Promise<void>((resolve, reject) => {\n        const timeout = setTimeout(() => {\n          console.warn(`Image load timeout: ${img.src}`);\n          resolve(); // Resolve anyway to not block\n        }, 10000); // 10 second timeout\n\n        img.addEventListener('load', () => {\n          clearTimeout(timeout);\n          resolve();\n        });\n\n        img.addEventListener('error', (e) => {\n          clearTimeout(timeout);\n          console.error(`Failed to load image: ${img.src}`, e);\n          resolve(); // Resolve to not block other images\n        });\n\n        // If src is not set, resolve immediately\n        if (!img.src) {\n          clearTimeout(timeout);\n          resolve();\n        }\n      });\n    })\n  );\n}\n\n/**\n * Convert SVG elements to images\n */\nexport async function convertSVGsToImages(element: HTMLElement): Promise<void> {\n  const svgs = Array.from(element.querySelectorAll('svg'));\n\n  await Promise.all(\n    svgs.map(async (svg) => {\n      try {\n        const svgData = new XMLSerializer().serializeToString(svg);\n        const svgBlob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n        const url = URL.createObjectURL(svgBlob);\n\n        const img = document.createElement('img');\n        const rect = svg.getBoundingClientRect();\n\n        img.width = rect.width || parseInt(svg.getAttribute('width') || '100');\n        img.height = rect.height || parseInt(svg.getAttribute('height') || '100');\n\n        await new Promise<void>((resolve, reject) => {\n          img.onload = () => {\n            // Replace SVG with IMG\n            svg.parentNode?.replaceChild(img, svg);\n            URL.revokeObjectURL(url);\n            resolve();\n          };\n          img.onerror = reject;\n          img.src = url;\n        });\n      } catch (error) {\n        console.error('Failed to convert SVG:', error);\n      }\n    })\n  );\n}\n\n/**\n * Optimize image quality and size\n */\nexport async function optimizeImage(\n  img: HTMLImageElement,\n  options: ImageProcessingOptions = {}\n): Promise<string> {\n  const {\n    maxWidth = 2000,\n    maxHeight = 2000,\n    quality = 0.85,\n    compress = true,\n    grayscale = false,\n    dpi = 150,\n    format = 'jpeg',\n    backgroundColor = '#ffffff',\n    interpolate = true,\n    optimizeForPrint = false,\n  } = options;\n\n  const canvas = document.createElement('canvas');\n  const ctx = canvas.getContext('2d');\n  if (!ctx) return img.src;\n\n  let { width, height } = img;\n\n  // Apply DPI scaling for print quality\n  let dpiScale = 1;\n  if (optimizeForPrint && dpi) {\n    // Scale based on DPI (72 DPI is web standard, 300 DPI is print standard)\n    dpiScale = dpi / 72;\n  }\n\n  // Calculate scaling to fit within max dimensions\n  if (width > maxWidth || height > maxHeight) {\n    const ratio = Math.min(maxWidth / width, maxHeight / height);\n    width *= ratio;\n    height *= ratio;\n  }\n\n  // Apply DPI scaling\n  const finalWidth = Math.floor(width * dpiScale);\n  const finalHeight = Math.floor(height * dpiScale);\n\n  canvas.width = finalWidth;\n  canvas.height = finalHeight;\n\n  // Control interpolation to prevent blur\n  if (!interpolate) {\n    ctx.imageSmoothingEnabled = false;\n  } else {\n    ctx.imageSmoothingEnabled = true;\n    ctx.imageSmoothingQuality = 'high';\n  }\n\n  // FIX: Fill canvas with background color BEFORE drawing image\n  // This prevents transparent areas from becoming black in JPEG\n  if (format === 'jpeg' || backgroundColor !== 'transparent') {\n    ctx.fillStyle = backgroundColor;\n    ctx.fillRect(0, 0, finalWidth, finalHeight);\n  }\n\n  // Draw image\n  ctx.drawImage(img, 0, 0, finalWidth, finalHeight);\n\n  // Apply grayscale if requested\n  if (grayscale) {\n    const imageData = ctx.getImageData(0, 0, finalWidth, finalHeight);\n    const data = imageData.data;\n\n    for (let i = 0; i < data.length; i += 4) {\n      const avg = (data[i] + data[i + 1] + data[i + 2]) / 3;\n      data[i] = avg;     // Red\n      data[i + 1] = avg; // Green\n      data[i + 2] = avg; // Blue\n    }\n\n    ctx.putImageData(imageData, 0, 0);\n  }\n\n  // Return optimized data URL with specified format\n  const mimeType = format === 'jpeg' ? 'image/jpeg' : format === 'png' ? 'image/png' : 'image/webp';\n  return canvas.toDataURL(mimeType, quality);\n}\n\n/**\n * Process all images in element for PDF rendering\n */\nexport async function processImagesForPDF(\n  element: HTMLElement,\n  options: ImageProcessingOptions = {}\n): Promise<void> {\n  // First, preload all images\n  await preloadImages(element);\n\n  // Convert SVGs to images\n  await convertSVGsToImages(element);\n\n  // Optimize remaining images if compression is enabled\n  if (options.compress) {\n    const images = Array.from(element.querySelectorAll('img'));\n    await Promise.all(\n      images.map(async (img) => {\n        try {\n          const optimized = await optimizeImage(img, options);\n          img.src = optimized;\n        } catch (error) {\n          console.error('Failed to optimize image:', error);\n        }\n      })\n    );\n  }\n}\n\n/**\n * Handle background images in elements\n */\nexport async function processBackgroundImages(element: HTMLElement): Promise<void> {\n  const elementsWithBg = Array.from(\n    element.querySelectorAll('*')\n  ).filter((el) => {\n    const style = window.getComputedStyle(el);\n    return style.backgroundImage && style.backgroundImage !== 'none';\n  });\n\n  await Promise.all(\n    elementsWithBg.map(async (el) => {\n      const style = window.getComputedStyle(el);\n      const bgImage = style.backgroundImage;\n\n      // Extract URL from background-image\n      const urlMatch = bgImage.match(/url\\(['\"]?([^'\"]+)['\"]?\\)/);\n      if (!urlMatch) return;\n\n      const url = urlMatch[1];\n\n      // Create temporary image to preload\n      return new Promise<void>((resolve) => {\n        const img = new Image();\n        img.onload = () => resolve();\n        img.onerror = () => resolve(); // Continue even if image fails\n        img.src = url;\n      });\n    })\n  );\n}\n\n/**\n * Get image dimensions without loading the full image\n */\nexport async function getImageDimensions(\n  src: string\n): Promise<{ width: number; height: number }> {\n  return new Promise((resolve, reject) => {\n    const img = new Image();\n    img.onload = () => {\n      resolve({ width: img.naturalWidth, height: img.naturalHeight });\n    };\n    img.onerror = reject;\n    img.src = src;\n  });\n}\n\n/**\n * Convert image to data URL\n */\nexport async function imageToDataURL(\n  img: HTMLImageElement,\n  type: 'image/jpeg' | 'image/png' | 'image/webp' = 'image/jpeg',\n  quality: number = 0.85,\n  backgroundColor: string = '#ffffff'\n): Promise<string> {\n  const canvas = document.createElement('canvas');\n  canvas.width = img.naturalWidth;\n  canvas.height = img.naturalHeight;\n\n  const ctx = canvas.getContext('2d');\n  if (!ctx) throw new Error('Failed to get canvas context');\n\n  // FIX: Fill canvas with background color BEFORE drawing image\n  // This prevents transparent areas from becoming black in JPEG\n  if (type === 'image/jpeg' || backgroundColor !== 'transparent') {\n    ctx.fillStyle = backgroundColor;\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n  }\n\n  ctx.drawImage(img, 0, 0);\n  return canvas.toDataURL(type, quality);\n}\n\n/**\n * Check if image is already a data URL\n */\nexport function isDataURL(src: string): boolean {\n  return src.startsWith('data:');\n}\n\n/**\n * Estimate image file size\n */\nexport function estimateImageSize(dataURL: string): number {\n  // Remove data URL prefix\n  const base64 = dataURL.split(',')[1];\n  if (!base64) return 0;\n\n  // Calculate size (base64 is ~33% larger than binary)\n  return Math.ceil((base64.length * 3) / 4);\n}\n\n/**\n * Calculate pixel dimensions for given DPI\n */\nexport function calculateDPIDimensions(\n  widthInches: number,\n  heightInches: number,\n  dpi: number\n): { width: number; height: number } {\n  return {\n    width: Math.floor(widthInches * dpi),\n    height: Math.floor(heightInches * dpi)\n  };\n}\n\n/**\n * Get recommended DPI based on use case\n */\nexport function getRecommendedDPI(useCase: 'web' | 'print' | 'high-quality-print'): number {\n  switch (useCase) {\n    case 'web':\n      return 72;\n    case 'print':\n      return 150;\n    case 'high-quality-print':\n      return 300;\n    default:\n      return 150;\n  }\n}\n\n/**\n * Detect if image has transparency\n */\nexport function hasTransparency(img: HTMLImageElement): Promise<boolean> {\n  return new Promise((resolve) => {\n    const canvas = document.createElement('canvas');\n    canvas.width = img.naturalWidth;\n    canvas.height = img.naturalHeight;\n\n    const ctx = canvas.getContext('2d');\n    if (!ctx) {\n      resolve(false);\n      return;\n    }\n\n    ctx.drawImage(img, 0, 0);\n\n    try {\n      const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n      const data = imageData.data;\n\n      // Check if any pixel has alpha < 255\n      for (let i = 3; i < data.length; i += 4) {\n        if (data[i] < 255) {\n          resolve(true);\n          return;\n        }\n      }\n      resolve(false);\n    } catch (error) {\n      // CORS error or other issue\n      console.warn('Could not detect transparency:', error);\n      resolve(false);\n    }\n  });\n}\n","/**\n * PDF Generator Library - Table Handler\n *\n * Advanced table processing for proper PDF pagination\n */\n\nexport interface TableProcessingOptions {\n  /** Allow table rows to split across pages */\n  allowRowSplit?: boolean;\n  /** Repeat table headers on each page */\n  repeatHeaders?: boolean;\n  /** Minimum rows per page before splitting */\n  minRowsPerPage?: number;\n  /** Add borders to tables in PDF */\n  enforceBorders?: boolean;\n}\n\nexport interface TableInfo {\n  element: HTMLTableElement;\n  hasHeader: boolean;\n  headerHeight: number;\n  rowHeights: number[];\n  totalHeight: number;\n}\n\n/**\n * Analyze table structure and dimensions\n */\nexport function analyzeTable(table: HTMLTableElement): TableInfo {\n  const thead = table.querySelector('thead');\n  const tbody = table.querySelector('tbody');\n  const rows = tbody ? Array.from(tbody.querySelectorAll('tr')) : Array.from(table.querySelectorAll('tr'));\n\n  const hasHeader = !!thead;\n  const headerHeight = thead ? thead.getBoundingClientRect().height : 0;\n\n  const rowHeights = rows.map((row) => row.getBoundingClientRect().height);\n  const totalHeight = rowHeights.reduce((sum, h) => sum + h, 0) + headerHeight;\n\n  return {\n    element: table,\n    hasHeader,\n    headerHeight,\n    rowHeights,\n    totalHeight,\n  };\n}\n\n/**\n * Prepare table for PDF rendering with page breaks\n */\nexport function prepareTableForPDF(\n  table: HTMLTableElement,\n  options: TableProcessingOptions = {}\n): void {\n  const {\n    allowRowSplit = false,\n    repeatHeaders = true,\n    enforceBorders = true,\n  } = options;\n\n  // Add page break prevention to rows if not allowing splits\n  if (!allowRowSplit) {\n    const rows = table.querySelectorAll('tr');\n    rows.forEach((row) => {\n      (row as HTMLElement).style.pageBreakInside = 'avoid';\n      (row as HTMLElement).style.breakInside = 'avoid';\n    });\n  }\n\n  // Ensure table headers repeat on each page\n  if (repeatHeaders) {\n    const thead = table.querySelector('thead');\n    if (thead) {\n      (thead as HTMLElement).style.display = 'table-header-group';\n    }\n  }\n\n  // Enforce borders for better visibility in PDF\n  if (enforceBorders) {\n    table.style.borderCollapse = 'collapse';\n\n    const cells = table.querySelectorAll('th, td');\n    cells.forEach((cell) => {\n      const el = cell as HTMLElement;\n      if (!el.style.border && !window.getComputedStyle(el).border) {\n        el.style.border = '1px solid #d1d5db';\n      }\n    });\n  }\n\n  // Prevent orphaned header rows\n  const thead = table.querySelector('thead');\n  if (thead) {\n    (thead as HTMLElement).style.pageBreakAfter = 'avoid';\n  }\n}\n\n/**\n * Split large table into multiple tables for pagination\n */\nexport function splitTableForPagination(\n  table: HTMLTableElement,\n  maxHeight: number,\n  options: TableProcessingOptions = {}\n): HTMLTableElement[] {\n  const { repeatHeaders = true, minRowsPerPage = 3 } = options;\n\n  const tableInfo = analyzeTable(table);\n\n  // If table fits in one page, return as is\n  if (tableInfo.totalHeight <= maxHeight) {\n    return [table];\n  }\n\n  const tables: HTMLTableElement[] = [];\n  const thead = table.querySelector('thead');\n  const tbody = table.querySelector('tbody') || table;\n  const rows = Array.from(tbody.querySelectorAll('tr'));\n\n  let currentTable = table.cloneNode(false) as HTMLTableElement;\n  let currentTbody = document.createElement('tbody');\n  let currentHeight = repeatHeaders && thead ? tableInfo.headerHeight : 0;\n\n  // Add header to first table\n  if (thead && repeatHeaders) {\n    const clonedHeader = thead.cloneNode(true) as HTMLTableSectionElement;\n    currentTable.appendChild(clonedHeader);\n  }\n\n  rows.forEach((row, index) => {\n    const rowHeight = tableInfo.rowHeights[index];\n\n    // Check if adding this row would exceed max height\n    if (currentHeight + rowHeight > maxHeight && currentTbody.children.length >= minRowsPerPage) {\n      // Finalize current table\n      currentTable.appendChild(currentTbody);\n      tables.push(currentTable);\n\n      // Start new table\n      currentTable = table.cloneNode(false) as HTMLTableElement;\n      currentTbody = document.createElement('tbody');\n      currentHeight = 0;\n\n      // Add header to new table if repeating\n      if (thead && repeatHeaders) {\n        const clonedHeader = thead.cloneNode(true) as HTMLTableSectionElement;\n        currentTable.appendChild(clonedHeader);\n        currentHeight = tableInfo.headerHeight;\n      }\n    }\n\n    // Add row to current table\n    const clonedRow = row.cloneNode(true) as HTMLTableRowElement;\n    currentTbody.appendChild(clonedRow);\n    currentHeight += rowHeight;\n  });\n\n  // Add the last table if it has any rows\n  if (currentTbody.children.length > 0) {\n    currentTable.appendChild(currentTbody);\n    tables.push(currentTable);\n  }\n\n  return tables;\n}\n\n/**\n * Process all tables in element for PDF rendering\n */\nexport function processTablesForPDF(\n  element: HTMLElement,\n  options: TableProcessingOptions = {}\n): void {\n  const tables = Array.from(element.querySelectorAll('table'));\n\n  tables.forEach((table) => {\n    prepareTableForPDF(table, options);\n  });\n}\n\n/**\n * Add zebra striping to table rows\n */\nexport function addTableZebraStriping(\n  table: HTMLTableElement,\n  evenColor: string = '#f9fafb',\n  oddColor: string = '#ffffff'\n): void {\n  const tbody = table.querySelector('tbody') || table;\n  const rows = Array.from(tbody.querySelectorAll('tr'));\n\n  rows.forEach((row, index) => {\n    (row as HTMLElement).style.backgroundColor = index % 2 === 0 ? evenColor : oddColor;\n  });\n}\n\n/**\n * Fix table column widths for consistent rendering\n */\nexport function fixTableColumnWidths(table: HTMLTableElement): void {\n  const firstRow = table.querySelector('tr');\n  if (!firstRow) return;\n\n  const cells = Array.from(firstRow.querySelectorAll('th, td'));\n\n  cells.forEach((cell) => {\n    const width = cell.getBoundingClientRect().width;\n    (cell as HTMLElement).style.width = `${width}px`;\n    (cell as HTMLElement).style.minWidth = `${width}px`;\n    (cell as HTMLElement).style.maxWidth = `${width}px`;\n  });\n\n  // Set table layout to fixed for consistent rendering\n  table.style.tableLayout = 'fixed';\n}\n\n/**\n * Ensure minimum column widths\n */\nexport function enforceMinimumColumnWidths(\n  table: HTMLTableElement,\n  minWidth: number = 50\n): void {\n  const firstRow = table.querySelector('tr');\n  if (!firstRow) return;\n\n  const cells = Array.from(firstRow.querySelectorAll('th, td'));\n\n  cells.forEach((cell) => {\n    const el = cell as HTMLElement;\n    el.style.minWidth = `${minWidth}px`;\n  });\n}\n\n/**\n * Wrap long text in table cells\n */\nexport function wrapTableCellText(table: HTMLTableElement): void {\n  const cells = table.querySelectorAll('th, td');\n\n  cells.forEach((cell) => {\n    const el = cell as HTMLElement;\n    el.style.wordWrap = 'break-word';\n    el.style.wordBreak = 'break-word';\n    el.style.overflowWrap = 'break-word';\n    el.style.whiteSpace = 'normal';\n  });\n}\n\n/**\n * Convert table to a more PDF-friendly structure\n */\nexport function optimizeTableForPDF(table: HTMLTableElement): void {\n  // Fix column widths\n  fixTableColumnWidths(table);\n\n  // Wrap text in cells\n  wrapTableCellText(table);\n\n  // Ensure borders are visible\n  table.style.borderCollapse = 'collapse';\n\n  // Set consistent padding\n  const cells = table.querySelectorAll('th, td');\n  cells.forEach((cell) => {\n    const el = cell as HTMLElement;\n    if (!el.style.padding) {\n      el.style.padding = '8px';\n    }\n  });\n}\n\n/**\n * Calculate optimal table split points\n */\nexport function calculateTableSplitPoints(\n  tableInfo: TableInfo,\n  maxHeight: number,\n  options: TableProcessingOptions = {}\n): number[] {\n  const { minRowsPerPage = 3 } = options;\n  const splitPoints: number[] = [];\n\n  let currentHeight = tableInfo.headerHeight;\n  let currentRowCount = 0;\n\n  tableInfo.rowHeights.forEach((rowHeight, index) => {\n    if (\n      currentHeight + rowHeight > maxHeight &&\n      currentRowCount >= minRowsPerPage\n    ) {\n      splitPoints.push(index);\n      currentHeight = tableInfo.headerHeight + rowHeight;\n      currentRowCount = 1;\n    } else {\n      currentHeight += rowHeight;\n      currentRowCount++;\n    }\n  });\n\n  return splitPoints;\n}\n\n/**\n * Add table summary/totals row that sticks to bottom\n */\nexport function addTableFooter(\n  table: HTMLTableElement,\n  footerContent: string[],\n  className: string = 'table-footer'\n): void {\n  let tfoot = table.querySelector('tfoot');\n\n  if (!tfoot) {\n    tfoot = document.createElement('tfoot');\n    table.appendChild(tfoot);\n  }\n\n  const row = document.createElement('tr');\n  row.className = className;\n\n  footerContent.forEach((content) => {\n    const cell = document.createElement('td');\n    cell.textContent = content;\n    row.appendChild(cell);\n  });\n\n  tfoot.appendChild(row);\n\n  // Style footer\n  (tfoot as HTMLElement).style.fontWeight = 'bold';\n  (tfoot as HTMLElement).style.backgroundColor = '#f3f4f6';\n}\n","/**\n * PDF Generator Library - Page Break Handler\n *\n * Smart page break detection and element splitting\n */\n\nexport interface PageBreakOptions {\n  /** Respect CSS page-break properties */\n  respectCSSPageBreaks?: boolean;\n  /** Prevent orphaned headings */\n  preventOrphanedHeadings?: boolean;\n  /** Minimum lines before page break */\n  minLinesBeforeBreak?: number;\n  /** Elements that should not be split */\n  avoidBreakInside?: string[];\n  /** Elements that should break before */\n  breakBefore?: string[];\n  /** Elements that should break after */\n  breakAfter?: string[];\n}\n\nexport interface PageBreakPoint {\n  /** Element where break should occur */\n  element: HTMLElement;\n  /** Position in pixels from top */\n  position: number;\n  /** Type of break */\n  type: 'natural' | 'forced' | 'avoid';\n  /** Priority (higher = more important) */\n  priority: number;\n}\n\n/**\n * Default elements that should not be split\n */\nexport const DEFAULT_AVOID_BREAK_INSIDE = [\n  'table',\n  'figure',\n  'img',\n  'svg',\n  'pre',\n  'code',\n  'blockquote',\n  'ul',\n  'ol',\n  'dl',\n];\n\n/**\n * Elements that typically force breaks\n */\nexport const DEFAULT_BREAK_BEFORE = ['h1', 'h2'];\n\n/**\n * Analyze element for potential page break points\n */\nexport function analyzePageBreaks(\n  element: HTMLElement,\n  pageHeight: number,\n  options: PageBreakOptions = {}\n): PageBreakPoint[] {\n  const {\n    respectCSSPageBreaks = true,\n    preventOrphanedHeadings = true,\n    avoidBreakInside = DEFAULT_AVOID_BREAK_INSIDE,\n    breakBefore = DEFAULT_BREAK_BEFORE,\n    breakAfter = [],\n  } = options;\n\n  const breakPoints: PageBreakPoint[] = [];\n  const allElements = Array.from(element.querySelectorAll('*'));\n\n  allElements.forEach((el) => {\n    const htmlEl = el as HTMLElement;\n    const rect = htmlEl.getBoundingClientRect();\n    const style = window.getComputedStyle(htmlEl);\n\n    // Check CSS page-break properties\n    if (respectCSSPageBreaks) {\n      if (\n        style.pageBreakBefore === 'always' ||\n        style.breakBefore === 'page'\n      ) {\n        breakPoints.push({\n          element: htmlEl,\n          position: rect.top,\n          type: 'forced',\n          priority: 100,\n        });\n        return;\n      }\n\n      if (\n        style.pageBreakAfter === 'always' ||\n        style.breakAfter === 'page'\n      ) {\n        breakPoints.push({\n          element: htmlEl,\n          position: rect.bottom,\n          type: 'forced',\n          priority: 100,\n        });\n        return;\n      }\n\n      if (\n        style.pageBreakInside === 'avoid' ||\n        style.breakInside === 'avoid'\n      ) {\n        breakPoints.push({\n          element: htmlEl,\n          position: rect.top,\n          type: 'avoid',\n          priority: 80,\n        });\n        return;\n      }\n    }\n\n    const tagName = htmlEl.tagName.toLowerCase();\n\n    // Check avoid break inside elements\n    if (avoidBreakInside.includes(tagName)) {\n      breakPoints.push({\n        element: htmlEl,\n        position: rect.top,\n        type: 'avoid',\n        priority: 70,\n      });\n    }\n\n    // Check forced break before\n    if (breakBefore.includes(tagName)) {\n      breakPoints.push({\n        element: htmlEl,\n        position: rect.top,\n        type: 'forced',\n        priority: 90,\n      });\n    }\n\n    // Check forced break after\n    if (breakAfter.includes(tagName)) {\n      breakPoints.push({\n        element: htmlEl,\n        position: rect.bottom,\n        type: 'forced',\n        priority: 90,\n      });\n    }\n\n    // Prevent orphaned headings\n    if (preventOrphanedHeadings && /^h[1-6]$/i.test(tagName)) {\n      const nextEl = htmlEl.nextElementSibling;\n      if (nextEl) {\n        const nextRect = nextEl.getBoundingClientRect();\n        const gap = nextRect.top - rect.bottom;\n\n        // If heading is close to next element, keep them together\n        if (gap < 50) {\n          breakPoints.push({\n            element: htmlEl,\n            position: rect.top,\n            type: 'avoid',\n            priority: 85,\n          });\n        }\n      }\n    }\n  });\n\n  return breakPoints;\n}\n\n/**\n * Apply page break hints to elements\n */\nexport function applyPageBreakHints(\n  element: HTMLElement,\n  options: PageBreakOptions = {}\n): void {\n  const {\n    avoidBreakInside = DEFAULT_AVOID_BREAK_INSIDE,\n    breakBefore = DEFAULT_BREAK_BEFORE,\n    breakAfter = [],\n  } = options;\n\n  // Apply avoid-break-inside to specific elements\n  avoidBreakInside.forEach((selector) => {\n    const elements = element.querySelectorAll(selector);\n    elements.forEach((el) => {\n      (el as HTMLElement).style.pageBreakInside = 'avoid';\n      (el as HTMLElement).style.breakInside = 'avoid';\n    });\n  });\n\n  // Apply break-before to specific elements\n  breakBefore.forEach((selector) => {\n    const elements = element.querySelectorAll(selector);\n    elements.forEach((el) => {\n      (el as HTMLElement).style.pageBreakBefore = 'always';\n      (el as HTMLElement).style.breakBefore = 'page';\n    });\n  });\n\n  // Apply break-after to specific elements\n  breakAfter.forEach((selector) => {\n    const elements = element.querySelectorAll(selector);\n    elements.forEach((el) => {\n      (el as HTMLElement).style.pageBreakAfter = 'always';\n      (el as HTMLElement).style.breakAfter = 'page';\n    });\n  });\n\n  // Prevent orphaned headings\n  const headings = element.querySelectorAll('h1, h2, h3, h4, h5, h6');\n  headings.forEach((heading) => {\n    (heading as HTMLElement).style.pageBreakAfter = 'avoid';\n    (heading as HTMLElement).style.breakAfter = 'avoid-page';\n  });\n\n  // Prevent widow/orphan lines in paragraphs\n  const paragraphs = element.querySelectorAll('p');\n  paragraphs.forEach((p) => {\n    (p as HTMLElement).style.widows = '2';\n    (p as HTMLElement).style.orphans = '2';\n  });\n}\n\n/**\n * Calculate optimal page break positions\n */\nexport function calculatePageBreakPositions(\n  contentHeight: number,\n  pageHeight: number,\n  breakPoints: PageBreakPoint[]\n): number[] {\n  const positions: number[] = [];\n  let currentPosition = 0;\n\n  while (currentPosition < contentHeight) {\n    const nextPosition = currentPosition + pageHeight;\n\n    // Find break points near this position\n    const nearbyBreaks = breakPoints.filter(\n      (bp) =>\n        bp.position >= nextPosition - 100 && // Within 100px before\n        bp.position <= nextPosition + 100 // or 100px after\n    );\n\n    if (nearbyBreaks.length > 0) {\n      // Sort by priority and proximity to ideal break\n      nearbyBreaks.sort((a, b) => {\n        const aDist = Math.abs(a.position - nextPosition);\n        const bDist = Math.abs(b.position - nextPosition);\n\n        // If type is 'avoid', deprioritize\n        if (a.type === 'avoid') return 1;\n        if (b.type === 'avoid') return -1;\n\n        // Otherwise sort by priority then distance\n        if (a.priority !== b.priority) {\n          return b.priority - a.priority;\n        }\n        return aDist - bDist;\n      });\n\n      // Use the best break point\n      const bestBreak = nearbyBreaks[0];\n      if (bestBreak.type !== 'avoid') {\n        positions.push(bestBreak.position);\n        currentPosition = bestBreak.position;\n        continue;\n      }\n    }\n\n    // No suitable break point found, use ideal position\n    positions.push(nextPosition);\n    currentPosition = nextPosition;\n  }\n\n  return positions;\n}\n\n/**\n * Insert page break markers in DOM\n */\nexport function insertPageBreakMarkers(\n  element: HTMLElement,\n  positions: number[]\n): void {\n  positions.forEach((position, index) => {\n    const marker = document.createElement('div');\n    marker.className = 'page-break-marker';\n    marker.dataset.page = String(index + 2); // Page 2, 3, 4...\n    marker.style.position = 'absolute';\n    marker.style.top = `${position}px`;\n    marker.style.left = '0';\n    marker.style.right = '0';\n    marker.style.height = '1px';\n    marker.style.backgroundColor = 'transparent';\n    marker.style.pageBreakBefore = 'always';\n\n    element.appendChild(marker);\n  });\n}\n\n/**\n * Remove page break markers\n */\nexport function removePageBreakMarkers(element: HTMLElement): void {\n  const markers = element.querySelectorAll('.page-break-marker');\n  markers.forEach((marker) => marker.remove());\n}\n\n/**\n * Detect if element would be split by page break\n */\nexport function wouldElementBeSplit(\n  element: HTMLElement,\n  pageBreakPosition: number\n): boolean {\n  const rect = element.getBoundingClientRect();\n  return rect.top < pageBreakPosition && rect.bottom > pageBreakPosition;\n}\n\n/**\n * Find the best element to break before to avoid splitting\n */\nexport function findBestBreakBefore(\n  element: HTMLElement,\n  pageBreakPosition: number\n): HTMLElement | null {\n  const children = Array.from(element.children) as HTMLElement[];\n\n  for (let i = children.length - 1; i >= 0; i--) {\n    const child = children[i];\n    const rect = child.getBoundingClientRect();\n\n    if (rect.bottom <= pageBreakPosition) {\n      // This child ends before the break, perfect\n      return child;\n    }\n\n    if (rect.top < pageBreakPosition) {\n      // This child crosses the break, recurse\n      const innerBreak = findBestBreakBefore(child, pageBreakPosition);\n      if (innerBreak) return innerBreak;\n\n      // If can't find good inner break, use this child\n      return child;\n    }\n  }\n\n  return null;\n}\n\n/**\n * Optimize content for clean page breaks\n */\nexport function optimizeForPageBreaks(\n  element: HTMLElement,\n  pageHeight: number,\n  options: PageBreakOptions = {}\n): void {\n  // Apply basic page break hints\n  applyPageBreakHints(element, options);\n\n  // Analyze and find break points\n  const breakPoints = analyzePageBreaks(element, pageHeight, options);\n\n  // Calculate optimal positions\n  const contentHeight = element.scrollHeight;\n  const positions = calculatePageBreakPositions(\n    contentHeight,\n    pageHeight,\n    breakPoints\n  );\n\n  // Insert markers (optional, for debugging)\n  if (options.respectCSSPageBreaks) {\n    insertPageBreakMarkers(element, positions);\n  }\n}\n\n/**\n * Check if element has custom page break styling\n */\nexport function hasCustomPageBreak(element: HTMLElement): boolean {\n  const style = window.getComputedStyle(element);\n\n  return (\n    style.pageBreakBefore !== 'auto' ||\n    style.pageBreakAfter !== 'auto' ||\n    style.pageBreakInside !== 'auto' ||\n    style.breakBefore !== 'auto' ||\n    style.breakAfter !== 'auto' ||\n    style.breakInside !== 'auto'\n  );\n}\n\n/**\n * Get page break CSS properties\n */\nexport function getPageBreakProperties(element: HTMLElement): {\n  before: string;\n  after: string;\n  inside: string;\n} {\n  const style = window.getComputedStyle(element);\n\n  return {\n    before: style.pageBreakBefore || style.breakBefore || 'auto',\n    after: style.pageBreakAfter || style.breakAfter || 'auto',\n    inside: style.pageBreakInside || style.breakInside || 'auto',\n  };\n}\n","/**\n * PDF Generator Library - Core Implementation\n *\n * Multi-page PDF generation from HTML content with smart pagination\n */\n\nimport jsPDF from 'jspdf';\nimport html2canvas from 'html2canvas-pro';\nimport type {\n  PDFGeneratorOptions,\n  PDFPageConfig,\n  PDFGenerationResult,\n  PDFRenderContext,\n  PDFContentItem,\n  BatchPDFGenerationResult,\n} from './types';\nimport {\n  DEFAULT_OPTIONS,\n  calculatePageConfig,\n  generateColorReplacementCSS,\n  createStyleElement,\n  sanitizeFilename,\n  TAILWIND_COLOR_REPLACEMENTS,\n  htmlStringToElement,\n  loadExternalStyles,\n} from './utils';\nimport {\n  processImagesForPDF,\n  processBackgroundImages,\n} from './image-handler';\nimport { processTablesForPDF, optimizeTableForPDF } from './table-handler';\nimport { applyPageBreakHints } from './page-break-handler';\n\n/**\n * Main PDF Generator Class\n */\nexport class PDFGenerator {\n  private options: Required<PDFGeneratorOptions>;\n  private pageConfig: PDFPageConfig;\n  private styleElement: HTMLStyleElement | null = null;\n\n  // Preview-related properties\n  private previewContainer: HTMLElement | null = null;\n  private previewIframe: HTMLIFrameElement | null = null;\n  private previewBlobUrl: string | null = null;\n  private mutationObserver: MutationObserver | null = null;\n  private debounceTimer: number | null = null;\n  private isPreviewActive: boolean = false;\n  private previewTargetElement: HTMLElement | null = null;\n\n  constructor(options: Partial<PDFGeneratorOptions> = {}) {\n    // Merge with defaults\n    this.options = { ...DEFAULT_OPTIONS, ...options };\n\n    // Include Tailwind color replacements by default\n    this.options.colorReplacements = {\n      ...TAILWIND_COLOR_REPLACEMENTS,\n      ...this.options.colorReplacements,\n    };\n\n    // Calculate page configuration\n    this.pageConfig = calculatePageConfig(this.options);\n  }\n\n  /**\n   * Generate PDF from HTML element\n   */\n  async generatePDF(\n    element: HTMLElement,\n    filename: string = 'document.pdf'\n  ): Promise<PDFGenerationResult> {\n    const startTime = performance.now();\n\n    try {\n      this.options.onProgress(0);\n\n      // Step 1: Prepare element for rendering\n      const preparedElement = await this.prepareElement(element);\n      this.options.onProgress(10);\n\n      // Step 2: Create canvas from HTML\n      const canvas = await this.renderToCanvas(preparedElement);\n      this.options.onProgress(40);\n\n      // Step 3: Generate PDF with pagination\n      const pdf = await this.createPDFFromCanvas(canvas);\n      this.options.onProgress(80);\n\n      // Step 4: Generate blob and download\n      const blob = pdf.output('blob');\n      const pageCount = pdf.internal.pages.length - 1; // jsPDF counts empty first page\n\n      this.options.onProgress(90);\n\n      // Step 5: Download file\n      pdf.save(sanitizeFilename(filename, 'pdf'));\n      this.options.onProgress(100);\n\n      // Cleanup\n      this.cleanup(preparedElement);\n\n      const generationTime = performance.now() - startTime;\n      const result: PDFGenerationResult = {\n        blob,\n        pageCount,\n        fileSize: blob.size,\n        generationTime,\n      };\n\n      this.options.onComplete(blob);\n      return result;\n    } catch (error) {\n      this.cleanup();\n      const err = error instanceof Error ? error : new Error(String(error));\n      this.options.onError(err);\n      throw err;\n    }\n  }\n\n  /**\n   * Generate PDF blob without downloading\n   */\n  async generateBlob(element: HTMLElement): Promise<Blob> {\n    const startTime = performance.now();\n\n    try {\n      this.options.onProgress(0);\n\n      const preparedElement = await this.prepareElement(element);\n      this.options.onProgress(10);\n\n      const canvas = await this.renderToCanvas(preparedElement);\n      this.options.onProgress(40);\n\n      const pdf = await this.createPDFFromCanvas(canvas);\n      this.options.onProgress(80);\n\n      const blob = pdf.output('blob');\n      this.options.onProgress(100);\n\n      this.cleanup(preparedElement);\n      this.options.onComplete(blob);\n\n      return blob;\n    } catch (error) {\n      this.cleanup();\n      const err = error instanceof Error ? error : new Error(String(error));\n      this.options.onError(err);\n      throw err;\n    }\n  }\n\n  /**\n   * Prepare element for PDF rendering\n   */\n  private async prepareElement(element: HTMLElement): Promise<HTMLElement> {\n    this.options.onProgress(5);\n\n    // Create a container for offscreen rendering\n    // This allows content to flow naturally to its full height\n    const container = document.createElement('div');\n    container.id = 'pdf-render-container';\n    container.style.position = 'absolute';\n    container.style.left = '-9999px';\n    container.style.top = '0';\n    container.style.width = `${this.pageConfig.widthPx}px`;\n    container.style.padding = '0';\n    container.style.margin = '0';\n    container.style.backgroundColor = '#ffffff';\n    container.style.height = 'auto'; // Allow natural height\n    container.style.overflow = 'visible'; // Don't clip content\n\n    // Clone the element\n    const clone = element.cloneNode(true) as HTMLElement;\n    clone.id = 'pdf-render-target';\n    clone.style.width = `${this.pageConfig.widthPx}px`;\n    clone.style.maxWidth = `${this.pageConfig.widthPx}px`;\n    clone.style.minWidth = `${this.pageConfig.widthPx}px`;\n    clone.style.height = 'auto'; // Allow natural content flow\n    clone.style.boxSizing = 'border-box';\n\n    container.appendChild(clone);\n    document.body.appendChild(container);\n\n    // Inject custom CSS for color replacements\n    const cssParts = [\n      generateColorReplacementCSS(this.options.colorReplacements, 'pdf-render-target'),\n      this.options.customCSS,\n    ];\n\n    // Add media type emulation if set to 'print'\n    if (this.options.emulateMediaType === 'print') {\n      // Collect all @media print rules from stylesheets\n      const printStyles: string[] = [];\n\n      try {\n        for (let i = 0; i < document.styleSheets.length; i++) {\n          const sheet = document.styleSheets[i];\n          try {\n            const rules = sheet.cssRules || sheet.rules;\n            for (let j = 0; j < rules.length; j++) {\n              const rule = rules[j];\n              if (rule instanceof CSSMediaRule && rule.media.mediaText.includes('print')) {\n                // Extract rules inside @media print and apply them directly\n                printStyles.push(rule.cssText.replace('@media print', '').replace(/^\\s*{\\s*/, '').replace(/}\\s*$/, ''));\n              }\n            }\n          } catch (e) {\n            // Skip stylesheets we can't access (CORS)\n          }\n        }\n      } catch (e) {\n        console.warn('Could not extract @media print styles:', e);\n      }\n\n      if (printStyles.length > 0) {\n        cssParts.push(`/* Emulated @media print styles */\\n${printStyles.join('\\n')}`);\n      }\n    }\n\n    const css = cssParts.join('\\n\\n');\n    this.styleElement = createStyleElement(css, 'pdf-color-override');\n    document.head.appendChild(this.styleElement);\n\n    // Wait for styles to apply\n    await new Promise((resolve) => setTimeout(resolve, 100));\n\n    // Process images (SVG conversion, optimization, preloading)\n    this.options.onProgress(7);\n    await processImagesForPDF(clone, {\n      compress: this.options.compress,\n      quality: this.options.imageQuality,\n      maxWidth: this.pageConfig.widthPx,\n    });\n\n    // Process background images\n    await processBackgroundImages(clone);\n\n    // Process tables for better pagination\n    this.options.onProgress(8);\n    processTablesForPDF(clone, {\n      repeatHeaders: true,\n      enforceBorders: true,\n      allowRowSplit: false,\n    });\n\n    // Optimize tables\n    const tables = clone.querySelectorAll('table');\n    tables.forEach((table) => optimizeTableForPDF(table as HTMLTableElement));\n\n    // Apply page break hints\n    this.options.onProgress(9);\n    applyPageBreakHints(clone, {\n      preventOrphanedHeadings: true,\n      respectCSSPageBreaks: true,\n    });\n\n    // Final wait for all processing\n    await new Promise((resolve) => setTimeout(resolve, 200));\n\n    return clone;\n  }\n\n  /**\n   * Render element to canvas using html2canvas\n   * Like GoFullPage, captures the ENTIRE content height at once\n   */\n  private async renderToCanvas(element: HTMLElement): Promise<HTMLCanvasElement> {\n    // Get the actual rendered height of the content\n    const actualHeight = element.scrollHeight || element.offsetHeight;\n\n    const canvas = await html2canvas(element, {\n      scale: this.options.scale,\n      logging: false,\n      useCORS: true,\n      allowTaint: true,\n      backgroundColor: '#ffffff',\n      removeContainer: false,\n      imageTimeout: 0,\n      width: this.pageConfig.widthPx,\n      height: actualHeight, // Capture full content height\n      windowWidth: this.pageConfig.widthPx,\n      windowHeight: actualHeight, // Allow full height rendering\n      scrollY: -window.scrollY, // Reset scroll offset\n      scrollX: -window.scrollX,\n    });\n\n    return canvas;\n  }\n\n  /**\n   * Build encryption options for jsPDF from security configuration\n   */\n  private buildEncryptionOptions(): any {\n    const security = this.options.securityOptions;\n\n    if (!security || !security.enabled) {\n      return undefined;\n    }\n\n    const userPermissions: string[] = [];\n\n    // Map permissions to jsPDF format\n    if (security.permissions) {\n      const perms = security.permissions;\n\n      // Print permission\n      if (perms.printing && perms.printing !== 'none') {\n        userPermissions.push('print');\n      }\n\n      // Modify permission\n      if (perms.modifying) {\n        userPermissions.push('modify');\n      }\n\n      // Copy permission\n      if (perms.copying) {\n        userPermissions.push('copy');\n      }\n\n      // Annotation/forms permission\n      if (perms.annotating || perms.fillingForms) {\n        userPermissions.push('annot-forms');\n      }\n    } else {\n      // Default permissions if not specified\n      userPermissions.push('print', 'copy');\n    }\n\n    const encryption: any = {\n      userPermissions,\n    };\n\n    // Add passwords if provided\n    if (security.userPassword) {\n      encryption.userPassword = security.userPassword;\n    }\n\n    if (security.ownerPassword) {\n      encryption.ownerPassword = security.ownerPassword;\n    }\n\n    return encryption;\n  }\n\n  /**\n   * Create PDF from canvas with intelligent multi-page pagination\n   * Similar to GoFullPage - captures full content and splits into pages naturally\n   */\n  private async createPDFFromCanvas(canvas: HTMLCanvasElement): Promise<jsPDF> {\n    const [marginTop, marginRight, marginBottom, marginLeft] = this.options.margins;\n\n    const canvasWidth = canvas.width;\n    const canvasHeight = canvas.height;\n\n    // Build PDF options\n    const pdfOptions: any = {\n      orientation: this.options.orientation,\n      unit: 'mm',\n      format: this.options.format,\n      compress: this.options.compress,\n    };\n\n    // Add encryption if security is enabled\n    const encryption = this.buildEncryptionOptions();\n    if (encryption) {\n      pdfOptions.encryption = encryption;\n    }\n\n    // Create PDF\n    const pdf = new jsPDF(pdfOptions);\n\n    // Apply metadata if provided\n    if (this.options.metadata) {\n      const metadata = this.options.metadata;\n      const properties: any = {};\n\n      if (metadata.title) properties.title = metadata.title;\n      if (metadata.author) properties.author = metadata.author;\n      if (metadata.subject) properties.subject = metadata.subject;\n      if (metadata.creator) properties.creator = metadata.creator;\n\n      // Keywords can be array or string\n      if (metadata.keywords) {\n        properties.keywords = Array.isArray(metadata.keywords)\n          ? metadata.keywords.join(', ')\n          : metadata.keywords;\n      }\n\n      // Set creation date\n      if (metadata.creationDate) {\n        properties.creationDate = metadata.creationDate;\n      }\n\n      pdf.setProperties(properties);\n    }\n\n    // Calculate dimensions - image width fills the usable page width\n    const imgWidth = this.pageConfig.usableWidth;\n\n    // Calculate what the full image height would be at this width\n    const imgHeightMm = (canvasHeight * imgWidth) / canvasWidth;\n\n    // Calculate how much content fits on one page\n    const pageHeightMm = this.pageConfig.usableHeight;\n\n    // Check if content fits on a single page\n    if (imgHeightMm <= pageHeightMm) {\n      // Single page - add directly\n      const imgData = canvas.toDataURL('image/jpeg', this.options.imageQuality);\n\n      pdf.addImage(\n        imgData,\n        'JPEG',\n        marginLeft,\n        marginTop,\n        imgWidth,\n        imgHeightMm\n      );\n\n      // Apply header/footer callbacks\n      await this.applyHeaderFooter(pdf, 1, 1);\n\n      if (this.options.showPageNumbers) {\n        this.addPageNumber(pdf, 1, 1);\n      }\n\n      // Apply watermark to page\n      await this.applyWatermark(pdf);\n\n      return pdf;\n    }\n\n    // Multi-page: split the canvas into page-sized chunks\n    // Calculate how many pixels fit on one page\n    const pageHeightPx = (pageHeightMm * canvasWidth) / imgWidth;\n\n    let currentY = 0;\n    let pageNumber = 0;\n    const totalPages = Math.ceil(canvasHeight / pageHeightPx);\n\n    while (currentY < canvasHeight) {\n      pageNumber++;\n\n      if (pageNumber > 1) {\n        pdf.addPage();\n      }\n\n      // Calculate height for this slice\n      const remainingHeight = canvasHeight - currentY;\n      const sliceHeight = Math.min(pageHeightPx, remainingHeight);\n\n      // Create a canvas for this page\n      const pageCanvas = document.createElement('canvas');\n      pageCanvas.width = canvasWidth;\n      pageCanvas.height = sliceHeight;\n\n      const ctx = pageCanvas.getContext('2d');\n      if (!ctx) {\n        console.error('Failed to get canvas context');\n        break;\n      }\n\n      // Fill with white background\n      ctx.fillStyle = '#ffffff';\n      ctx.fillRect(0, 0, canvasWidth, sliceHeight);\n\n      // Draw the slice from the main canvas\n      ctx.drawImage(\n        canvas,\n        0, currentY,           // Source position\n        canvasWidth, sliceHeight,  // Source dimensions\n        0, 0,                  // Destination position\n        canvasWidth, sliceHeight   // Destination dimensions\n      );\n\n      // Convert this slice to image\n      const pageImgData = pageCanvas.toDataURL('image/jpeg', this.options.imageQuality);\n\n      // Calculate the mm height for this slice\n      const sliceHeightMm = (sliceHeight * imgWidth) / canvasWidth;\n\n      // Add to PDF\n      pdf.addImage(\n        pageImgData,\n        'JPEG',\n        marginLeft,\n        marginTop,\n        imgWidth,\n        sliceHeightMm\n      );\n\n      // Apply header/footer callbacks\n      await this.applyHeaderFooter(pdf, pageNumber, totalPages);\n\n      if (this.options.showPageNumbers) {\n        this.addPageNumber(pdf, pageNumber, totalPages);\n      }\n\n      // Apply watermark to page\n      await this.applyWatermark(pdf);\n\n      // Move to next slice\n      currentY += sliceHeight;\n    }\n\n    return pdf;\n  }\n\n\n  /**\n   * Add page number to PDF\n   */\n  private addPageNumber(pdf: jsPDF, pageNumber: number, totalPages: number): void {\n    const pageSize = pdf.internal.pageSize;\n    const pageHeight = pageSize.getHeight();\n    const pageWidth = pageSize.getWidth();\n\n    pdf.setFontSize(10);\n    pdf.setTextColor(128, 128, 128);\n\n    const text = `${pageNumber} / ${totalPages}`;\n\n    if (this.options.pageNumberPosition === 'footer') {\n      pdf.text(text, pageWidth / 2, pageHeight - 5, { align: 'center' });\n    } else {\n      pdf.text(text, pageWidth / 2, 5, { align: 'center' });\n    }\n  }\n\n  /**\n   * Render template string with variable substitution\n   */\n  private renderTemplate(\n    template: string,\n    variables: {\n      pageNumber: number;\n      totalPages: number;\n      date?: string;\n      title?: string;\n    }\n  ): string {\n    let rendered = template;\n\n    rendered = rendered.replace(/\\{\\{pageNumber\\}\\}/g, String(variables.pageNumber));\n    rendered = rendered.replace(/\\{\\{totalPages\\}\\}/g, String(variables.totalPages));\n    rendered = rendered.replace(/\\{\\{date\\}\\}/g, variables.date || new Date().toLocaleDateString());\n    rendered = rendered.replace(/\\{\\{title\\}\\}/g, variables.title || '');\n\n    return rendered;\n  }\n\n  /**\n   * Apply header and footer templates or callbacks\n   */\n  private async applyHeaderFooter(pdf: jsPDF, pageNumber: number, totalPages: number): Promise<void> {\n    const pageSize = pdf.internal.pageSize;\n    const pageHeight = pageSize.getHeight();\n    const pageWidth = pageSize.getWidth();\n    const [marginTop, marginRight, marginBottom, marginLeft] = this.options.margins;\n\n    // Apply headerTemplate if provided\n    if (this.options.headerTemplate && this.options.headerTemplate.template) {\n      const template = this.options.headerTemplate;\n      const templateString = template.template!; // Non-null assertion - checked above\n\n      // Skip first page if requested\n      if (pageNumber === 1 && template.firstPage === false) {\n        // Don't render on first page\n      } else {\n        const height = template.height || 15; // mm\n        const heightPx = height * 3.7795; // Convert mm to pixels\n\n        // Render template with variables\n        const html = this.renderTemplate(templateString, {\n          pageNumber,\n          totalPages,\n          date: new Date().toLocaleDateString(),\n          title: this.options.metadata?.title || ''\n        });\n\n        // Create temporary element\n        const container = document.createElement('div');\n        container.innerHTML = html;\n        container.style.position = 'absolute';\n        container.style.left = '-9999px';\n        container.style.width = `${this.pageConfig.widthPx}px`;\n        container.style.height = `${heightPx}px`;\n        container.style.overflow = 'hidden';\n\n        // Apply custom CSS if provided\n        if (template.css) {\n          container.style.cssText += template.css;\n        }\n\n        document.body.appendChild(container);\n\n        try {\n          // Render to canvas\n          const canvas = await html2canvas(container, {\n            scale: 1,\n            backgroundColor: null,\n            logging: false,\n          });\n\n          // Add to PDF\n          const imgData = canvas.toDataURL('image/png');\n          pdf.addImage(imgData, 'PNG', marginLeft, marginTop, this.pageConfig.usableWidth, height);\n        } catch (error) {\n          console.error('Failed to render header template:', error);\n        } finally {\n          document.body.removeChild(container);\n        }\n      }\n    }\n    // Fallback to header callback\n    else if (this.options.header) {\n      const headerElement = this.options.header(pageNumber, totalPages);\n      if (headerElement) {\n        const headerText = headerElement.textContent || headerElement.innerText || '';\n        if (headerText) {\n          pdf.setFontSize(10);\n          pdf.setTextColor(64, 64, 64);\n          pdf.text(headerText, pageWidth / 2, 7, { align: 'center' });\n        }\n      }\n    }\n\n    // Apply footerTemplate if provided\n    if (this.options.footerTemplate && this.options.footerTemplate.template) {\n      const template = this.options.footerTemplate;\n      const templateString = template.template!; // Non-null assertion - checked above\n\n      // Skip first page if requested\n      if (pageNumber === 1 && template.firstPage === false) {\n        // Don't render on first page\n      } else {\n        const height = template.height || 15; // mm\n        const heightPx = height * 3.7795; // Convert mm to pixels\n\n        // Render template with variables\n        const html = this.renderTemplate(templateString, {\n          pageNumber,\n          totalPages,\n          date: new Date().toLocaleDateString(),\n          title: this.options.metadata?.title || ''\n        });\n\n        // Create temporary element\n        const container = document.createElement('div');\n        container.innerHTML = html;\n        container.style.position = 'absolute';\n        container.style.left = '-9999px';\n        container.style.width = `${this.pageConfig.widthPx}px`;\n        container.style.height = `${heightPx}px`;\n        container.style.overflow = 'hidden';\n\n        // Apply custom CSS if provided\n        if (template.css) {\n          container.style.cssText += template.css;\n        }\n\n        document.body.appendChild(container);\n\n        try {\n          // Render to canvas\n          const canvas = await html2canvas(container, {\n            scale: 1,\n            backgroundColor: null,\n            logging: false,\n          });\n\n          // Add to PDF\n          const imgData = canvas.toDataURL('image/png');\n          const yPosition = pageHeight - marginBottom - height;\n          pdf.addImage(imgData, 'PNG', marginLeft, yPosition, this.pageConfig.usableWidth, height);\n        } catch (error) {\n          console.error('Failed to render footer template:', error);\n        } finally {\n          document.body.removeChild(container);\n        }\n      }\n    }\n    // Fallback to footer callback\n    else if (this.options.footer) {\n      const footerElement = this.options.footer(pageNumber, totalPages);\n      if (footerElement) {\n        const footerText = footerElement.textContent || footerElement.innerText || '';\n        if (footerText) {\n          pdf.setFontSize(10);\n          pdf.setTextColor(64, 64, 64);\n          pdf.text(footerText, pageWidth / 2, pageHeight - 7, { align: 'center' });\n        }\n      }\n    }\n  }\n\n  /**\n   * Apply watermark to current PDF page\n   */\n  private async applyWatermark(pdf: jsPDF): Promise<void> {\n    const watermark = this.options.watermark;\n\n    // Skip if no watermark configured\n    if (!watermark || (!watermark.text && !watermark.image)) {\n      return;\n    }\n\n    const pageSize = pdf.internal.pageSize;\n    const pageHeight = pageSize.getHeight();\n    const pageWidth = pageSize.getWidth();\n\n    // Save current graphics state\n    pdf.saveGraphicsState();\n\n    // Handle text watermark\n    if (watermark.text) {\n      const fontSize = watermark.fontSize || 48;\n      const opacity = watermark.opacity !== undefined ? watermark.opacity : 0.1;\n      const color = watermark.color || '#cccccc';\n      const position = watermark.position || 'diagonal';\n      const rotation = watermark.rotation !== undefined\n        ? watermark.rotation\n        : (position === 'diagonal' ? 45 : 0);\n\n      // Set text properties\n      pdf.setFontSize(fontSize);\n\n      // Parse color (support hex and rgb)\n      let r = 204, g = 204, b = 204; // Default gray\n      if (color.startsWith('#')) {\n        const hex = color.substring(1);\n        r = parseInt(hex.substring(0, 2), 16);\n        g = parseInt(hex.substring(2, 4), 16);\n        b = parseInt(hex.substring(4, 6), 16);\n      }\n\n      pdf.setTextColor(r, g, b);\n      (pdf as any).setGState((pdf as any).GState({ opacity }));\n\n      // Calculate text dimensions (approximate)\n      const textWidth = pdf.getTextWidth(watermark.text);\n      const textHeight = fontSize * 0.35; // Approximate height in mm\n\n      // Calculate position\n      let x = pageWidth / 2;\n      let y = pageHeight / 2;\n\n      switch (position) {\n        case 'center':\n        case 'diagonal':\n          x = pageWidth / 2;\n          y = pageHeight / 2;\n          break;\n        case 'top-left':\n          x = textWidth / 2 + 10;\n          y = textHeight / 2 + 10;\n          break;\n        case 'top-right':\n          x = pageWidth - textWidth / 2 - 10;\n          y = textHeight / 2 + 10;\n          break;\n        case 'bottom-left':\n          x = textWidth / 2 + 10;\n          y = pageHeight - textHeight / 2 - 10;\n          break;\n        case 'bottom-right':\n          x = pageWidth - textWidth / 2 - 10;\n          y = pageHeight - textHeight / 2 - 10;\n          break;\n      }\n\n      // Apply rotation and draw text\n      if (rotation !== 0) {\n        pdf.text(watermark.text, x, y, {\n          align: 'center',\n          angle: rotation,\n        });\n      } else {\n        pdf.text(watermark.text, x, y, { align: 'center' });\n      }\n    }\n\n    // Handle image watermark\n    if (watermark.image) {\n      const opacity = watermark.opacity !== undefined ? watermark.opacity : 0.15;\n      const position = watermark.position || 'center';\n\n      try {\n        // Load image - support both data URLs and paths\n        let imageData = watermark.image;\n\n        // If it's a path, we need to load it as data URL\n        if (!watermark.image.startsWith('data:')) {\n          // For now, we'll skip loading external images in the browser context\n          // This would require CORS and async image loading\n          console.warn('External image URLs for watermarks require data URLs. Please convert image to base64.');\n          pdf.restoreGraphicsState();\n          return;\n        }\n\n        // Calculate image dimensions (we'll use a default size)\n        const imgWidth = 50; // mm\n        const imgHeight = 50; // mm\n\n        // Calculate position\n        let x = (pageWidth - imgWidth) / 2;\n        let y = (pageHeight - imgHeight) / 2;\n\n        switch (position) {\n          case 'center':\n          case 'diagonal':\n            x = (pageWidth - imgWidth) / 2;\n            y = (pageHeight - imgHeight) / 2;\n            break;\n          case 'top-left':\n            x = 10;\n            y = 10;\n            break;\n          case 'top-right':\n            x = pageWidth - imgWidth - 10;\n            y = 10;\n            break;\n          case 'bottom-left':\n            x = 10;\n            y = pageHeight - imgHeight - 10;\n            break;\n          case 'bottom-right':\n            x = pageWidth - imgWidth - 10;\n            y = pageHeight - imgHeight - 10;\n            break;\n        }\n\n        // Set opacity\n        (pdf as any).setGState((pdf as any).GState({ opacity }));\n\n        // Add image\n        pdf.addImage(imageData, 'PNG', x, y, imgWidth, imgHeight);\n      } catch (error) {\n        console.error('Failed to add image watermark:', error);\n      }\n    }\n\n    // Restore graphics state\n    pdf.restoreGraphicsState();\n  }\n\n  /**\n   * Cleanup temporary elements\n   */\n  private cleanup(preparedElement?: HTMLElement): void {\n    // Remove style element\n    if (this.styleElement && this.styleElement.parentNode) {\n      document.head.removeChild(this.styleElement);\n      this.styleElement = null;\n    }\n\n    // Remove prepared element and container\n    if (preparedElement) {\n      const container = preparedElement.parentNode;\n      if (container && container.parentNode) {\n        container.parentNode.removeChild(container);\n      }\n    }\n\n    // Remove any stray containers\n    const containers = document.querySelectorAll('#pdf-render-container');\n    containers.forEach((container) => {\n      if (container.parentNode) {\n        container.parentNode.removeChild(container);\n      }\n    });\n  }\n\n  /**\n   * Update options\n   */\n  updateOptions(options: Partial<PDFGeneratorOptions>): void {\n    this.options = { ...this.options, ...options };\n    this.pageConfig = calculatePageConfig(this.options);\n  }\n\n  /**\n   * Get current configuration\n   */\n  getConfig(): { options: Required<PDFGeneratorOptions>; pageConfig: PDFPageConfig } {\n    return {\n      options: this.options,\n      pageConfig: this.pageConfig,\n    };\n  }\n\n  /**\n   * Start PDF preview\n   * Generates a live preview of the PDF in a container element\n   */\n  async startPreview(element: HTMLElement): Promise<void> {\n    if (!this.options.previewOptions) {\n      throw new Error('Preview options must be configured to use preview feature');\n    }\n\n    const previewOptions = this.options.previewOptions;\n\n    // Get or create preview container\n    if (previewOptions.containerId) {\n      const container = document.getElementById(previewOptions.containerId);\n      if (!container) {\n        throw new Error(`Preview container with id \"${previewOptions.containerId}\" not found`);\n      }\n      this.previewContainer = container;\n    } else {\n      throw new Error('Preview container ID must be specified in previewOptions.containerId');\n    }\n\n    // Store target element\n    this.previewTargetElement = element;\n    this.isPreviewActive = true;\n\n    // Setup iframe container\n    this.setupPreviewIframe();\n\n    // Generate initial preview\n    await this.updatePreview();\n\n    // Setup live updates if enabled\n    if (previewOptions.liveUpdate) {\n      this.setupLiveUpdates(element);\n    }\n  }\n\n  /**\n   * Stop PDF preview and cleanup resources\n   */\n  stopPreview(): void {\n    this.isPreviewActive = false;\n\n    // Disconnect mutation observer\n    if (this.mutationObserver) {\n      this.mutationObserver.disconnect();\n      this.mutationObserver = null;\n    }\n\n    // Clear debounce timer\n    if (this.debounceTimer !== null) {\n      clearTimeout(this.debounceTimer);\n      this.debounceTimer = null;\n    }\n\n    // Revoke blob URL to free memory\n    if (this.previewBlobUrl) {\n      URL.revokeObjectURL(this.previewBlobUrl);\n      this.previewBlobUrl = null;\n    }\n\n    // Remove iframe\n    if (this.previewIframe && this.previewIframe.parentNode) {\n      this.previewIframe.parentNode.removeChild(this.previewIframe);\n      this.previewIframe = null;\n    }\n\n    this.previewContainer = null;\n    this.previewTargetElement = null;\n  }\n\n  /**\n   * Manually update the preview\n   */\n  async updatePreview(): Promise<void> {\n    if (!this.isPreviewActive || !this.previewTargetElement) {\n      return;\n    }\n\n    try {\n      // Generate PDF blob\n      const blob = await this.generatePreviewBlob(this.previewTargetElement);\n\n      // Display in iframe\n      this.displayPreview(blob);\n    } catch (error) {\n      console.error('Failed to update preview:', error);\n      this.options.onError(error as Error);\n    }\n  }\n\n  /**\n   * Setup preview iframe in container\n   */\n  private setupPreviewIframe(): void {\n    if (!this.previewContainer) {\n      return;\n    }\n\n    // Create iframe\n    this.previewIframe = document.createElement('iframe');\n    this.previewIframe.style.width = '100%';\n    this.previewIframe.style.height = '100%';\n    this.previewIframe.style.border = 'none';\n    this.previewIframe.title = 'PDF Preview';\n\n    // Clear container and add iframe\n    this.previewContainer.innerHTML = '';\n    this.previewContainer.appendChild(this.previewIframe);\n  }\n\n  /**\n   * Generate PDF blob for preview (without downloading)\n   */\n  private async generatePreviewBlob(element: HTMLElement): Promise<Blob> {\n    // Use preview-specific options if provided\n    const previewOptions = this.options.previewOptions;\n    const originalScale = this.options.scale;\n    const originalQuality = this.options.imageQuality;\n\n    // Apply preview quality/scale overrides\n    if (previewOptions?.scale !== undefined) {\n      this.options.scale = previewOptions.scale;\n    } else {\n      // Default to lower quality for faster preview\n      this.options.scale = 1;\n    }\n\n    if (previewOptions?.quality !== undefined) {\n      this.options.imageQuality = previewOptions.quality;\n    } else {\n      // Default to lower quality for faster preview\n      this.options.imageQuality = 0.7;\n    }\n\n    try {\n      // Generate blob using existing generateBlob method\n      const blob = await this.generateBlob(element);\n      return blob;\n    } finally {\n      // Restore original options\n      this.options.scale = originalScale;\n      this.options.imageQuality = originalQuality;\n    }\n  }\n\n  /**\n   * Display PDF blob in preview iframe\n   */\n  private displayPreview(blob: Blob): void {\n    if (!this.previewIframe) {\n      return;\n    }\n\n    // Revoke old blob URL\n    if (this.previewBlobUrl) {\n      URL.revokeObjectURL(this.previewBlobUrl);\n    }\n\n    // Create new blob URL\n    this.previewBlobUrl = URL.createObjectURL(blob);\n\n    // Set iframe source\n    this.previewIframe.src = this.previewBlobUrl;\n  }\n\n  /**\n   * Setup live updates using MutationObserver\n   */\n  private setupLiveUpdates(element: HTMLElement): void {\n    const previewOptions = this.options.previewOptions;\n    const debounceDelay = previewOptions?.debounce ?? 500;\n\n    // Create mutation observer\n    this.mutationObserver = new MutationObserver(() => {\n      // Clear existing timer\n      if (this.debounceTimer !== null) {\n        clearTimeout(this.debounceTimer);\n      }\n\n      // Set new timer\n      this.debounceTimer = window.setTimeout(() => {\n        this.updatePreview();\n      }, debounceDelay);\n    });\n\n    // Observe changes\n    this.mutationObserver.observe(element, {\n      attributes: true,\n      childList: true,\n      subtree: true,\n      characterData: true,\n    });\n  }\n\n  /**\n   * Check if preview is currently active\n   */\n  isPreviewRunning(): boolean {\n    return this.isPreviewActive;\n  }\n}\n\n/**\n * Convenience function for quick PDF generation from HTMLElement\n */\nexport async function generatePDF(\n  element: HTMLElement,\n  filename: string = 'document.pdf',\n  options: Partial<PDFGeneratorOptions> = {}\n): Promise<PDFGenerationResult> {\n  const generator = new PDFGenerator(options);\n  return generator.generatePDF(element, filename);\n}\n\n/**\n * Convenience function for blob generation from HTMLElement\n */\nexport async function generatePDFBlob(\n  element: HTMLElement,\n  options: Partial<PDFGeneratorOptions> = {}\n): Promise<Blob> {\n  const generator = new PDFGenerator(options);\n  return generator.generateBlob(element);\n}\n\n/**\n * Generate PDF from HTML string (full document or fragment)\n * Supports Tailwind CSS and external stylesheets\n *\n * @example\n * ```typescript\n * const html = `\n *   <!DOCTYPE html>\n *   <html>\n *     <head>\n *       <style>body { font-family: Arial; }</style>\n *     </head>\n *     <body>\n *       <h1>My Document</h1>\n *       <p>Content here</p>\n *     </body>\n *   </html>\n * `;\n *\n * await generatePDFFromHTML(html, 'document.pdf');\n * ```\n */\nexport async function generatePDFFromHTML(\n  htmlString: string,\n  filename: string = 'document.pdf',\n  options: Partial<PDFGeneratorOptions> = {}\n): Promise<PDFGenerationResult> {\n  // Convert HTML string to element\n  const element = htmlStringToElement(htmlString);\n\n  // Append to document temporarily (needed for styles to compute)\n  element.style.position = 'absolute';\n  element.style.left = '-9999px';\n  element.style.top = '0';\n  document.body.appendChild(element);\n\n  try {\n    // Load external stylesheets if any\n    await loadExternalStyles(element);\n\n    // Wait a bit for styles to apply\n    await new Promise(resolve => setTimeout(resolve, 100));\n\n    // Generate PDF\n    const generator = new PDFGenerator(options);\n    const result = await generator.generatePDF(element, filename);\n\n    return result;\n  } finally {\n    // Cleanup\n    if (element.parentNode) {\n      element.parentNode.removeChild(element);\n    }\n  }\n}\n\n/**\n * Generate PDF blob from HTML string (full document or fragment)\n *\n * @example\n * ```typescript\n * const html = '<div><h1>Hello</h1><p>World</p></div>';\n * const blob = await generateBlobFromHTML(html);\n *\n * // Upload to server\n * const formData = new FormData();\n * formData.append('pdf', blob, 'document.pdf');\n * await fetch('/api/upload', { method: 'POST', body: formData });\n * ```\n */\nexport async function generateBlobFromHTML(\n  htmlString: string,\n  options: Partial<PDFGeneratorOptions> = {}\n): Promise<Blob> {\n  // Convert HTML string to element\n  const element = htmlStringToElement(htmlString);\n\n  // Append to document temporarily\n  element.style.position = 'absolute';\n  element.style.left = '-9999px';\n  element.style.top = '0';\n  document.body.appendChild(element);\n\n  try {\n    // Load external stylesheets if any\n    await loadExternalStyles(element);\n\n    // Wait for styles to apply\n    await new Promise(resolve => setTimeout(resolve, 100));\n\n    // Generate blob\n    const generator = new PDFGenerator(options);\n    const blob = await generator.generateBlob(element);\n\n    return blob;\n  } finally {\n    // Cleanup\n    if (element.parentNode) {\n      element.parentNode.removeChild(element);\n    }\n  }\n}\n\n/**\n * Generate batch PDF from multiple content items\n *\n * Combines multiple HTML elements/strings into a single PDF. Each item is rendered\n * sequentially in the final document. Use the `newPage` parameter to control page breaks:\n * - newPage: true → Force item to start on a new page\n * - newPage: false → Allow item to share page with previous content\n * - newPage: undefined → Default behavior (page break after each item)\n *\n * Note: The pageCount property in each item is used as a hint for scaling but may\n * not be exact. The actual page count depends on content size and layout.\n *\n * @example\n * ```typescript\n * const items = [\n *   { content: document.getElementById('section1'), pageCount: 2, title: 'Introduction', newPage: true },\n *   { content: '<div><h1>Chapter 2</h1><p>Content...</p></div>', pageCount: 3, title: 'Details', newPage: true },\n *   { content: document.getElementById('section3'), pageCount: 1, title: 'Summary', newPage: false },\n * ];\n *\n * const result = await generateBatchPDF(items, 'report.pdf', {\n *   format: 'a4',\n *   showPageNumbers: true,\n *   onProgress: (progress) => console.log(`${progress}%`),\n * });\n *\n * console.log(`Generated ${result.totalPages} pages`);\n * console.log('Items:', result.items);\n * ```\n */\nexport async function generateBatchPDF(\n  items: PDFContentItem[],\n  filename: string = 'document.pdf',\n  options: Partial<PDFGeneratorOptions> = {}\n): Promise<BatchPDFGenerationResult> {\n  const result = await generateBatchPDFBlob(items, options);\n\n  // Download the PDF if in browser environment and filename provided\n  if (filename && typeof document !== 'undefined') {\n    const sanitized = sanitizeFilename(filename, 'pdf');\n    const url = URL.createObjectURL(result.blob);\n    const link = document.createElement('a');\n    link.href = url;\n    link.download = sanitized;\n    link.click();\n    URL.revokeObjectURL(url);\n  }\n\n  return result;\n}\n\n/**\n * Generate batch PDF blob without downloading\n *\n * @example\n * ```typescript\n * const items = [\n *   { content: element1, pageCount: 2 },\n *   { content: element2, pageCount: 3 },\n * ];\n *\n * const result = await generateBatchPDFBlob(items, options);\n *\n * // Upload to server\n * const formData = new FormData();\n * formData.append('pdf', result.blob, 'report.pdf');\n * await fetch('/api/upload', { method: 'POST', body: formData });\n * ```\n */\nexport async function generateBatchPDFBlob(\n  items: PDFContentItem[],\n  options: Partial<PDFGeneratorOptions> = {}\n): Promise<BatchPDFGenerationResult> {\n  const startTime = Date.now();\n\n  if (!items || items.length === 0) {\n    throw new Error('Batch PDF generation requires at least one content item');\n  }\n\n  // Check if we're in a browser environment\n  const isBrowser = typeof document !== 'undefined';\n\n  if (!isBrowser) {\n    throw new Error('Batch PDF generation currently requires a browser environment');\n  }\n\n  // Check if all items have newPage: true (separate PDF approach)\n  const allNewPage = items.every(item => item.newPage === true);\n\n  // Check if all items have newPage: false (combined approach)\n  const allCombined = items.every(item => item.newPage === false);\n\n  // If mixed or undefined, use the separate PDF approach for safety\n  const useSeparatePDFs = allNewPage || (!allCombined && items.some(item => item.newPage !== false));\n\n  if (useSeparatePDFs) {\n    // APPROACH 1: Generate separate PDFs and merge them\n    // This guarantees each item starts on a new page\n    return generateBatchPDFSeparate(items, options, startTime);\n  } else {\n    // APPROACH 2: Combine all items in one container (for newPage: false)\n    // Items can share pages naturally\n    return generateBatchPDFCombined(items, options, startTime);\n  }\n}\n\n/**\n * Generate separate PDFs for each item and merge them\n * This ensures each item starts on a new page\n */\nasync function generateBatchPDFSeparate(\n  items: PDFContentItem[],\n  options: Partial<PDFGeneratorOptions>,\n  startTime: number\n): Promise<BatchPDFGenerationResult> {\n  const progressCallback = options.onProgress;\n  const itemResults: BatchPDFGenerationResult['items'] = [];\n\n  // We'll generate each item as a separate PDF and concatenate the blobs\n  // This is simpler than trying to merge PDF objects\n  const individualPDFs: Array<{ blob: Blob; title?: string }> = [];\n\n  for (let i = 0; i < items.length; i++) {\n    const item = items[i];\n\n    // Progress tracking\n    if (progressCallback) {\n      const progress = Math.floor(((i + 1) / items.length) * 90); // Reserve 10% for final merge\n      progressCallback(progress);\n    }\n\n    // Prepare element\n    let element: HTMLElement;\n    if (typeof item.content === 'string') {\n      element = htmlStringToElement(item.content);\n    } else {\n      element = item.content.cloneNode(true) as HTMLElement;\n    }\n\n    // Generate individual PDF for this item\n    const generator = new PDFGenerator(options);\n    const blob = await generator.generateBlob(element);\n\n    individualPDFs.push({\n      blob,\n      title: item.title\n    });\n  }\n\n  // Use pdf-lib to properly merge all PDFs into one\n  const { PDFDocument } = await import('pdf-lib');\n\n  // Create a new merged PDF document\n  const mergedPdf = await PDFDocument.create();\n\n  let currentPage = 0;\n\n  // Process each individual PDF\n  for (let i = 0; i < individualPDFs.length; i++) {\n    const pdfData = individualPDFs[i];\n\n    try {\n      // Convert blob to array buffer\n      const arrayBuffer = await pdfData.blob.arrayBuffer();\n\n      // Load the PDF using pdf-lib\n      const pdf = await PDFDocument.load(arrayBuffer);\n\n      // Get all pages from this PDF\n      const pageCount = pdf.getPageCount();\n\n      // Copy all pages from this PDF to the merged PDF\n      const copiedPages = await mergedPdf.copyPages(pdf, pdf.getPageIndices());\n\n      // Add each copied page to the merged document\n      copiedPages.forEach(page => {\n        mergedPdf.addPage(page);\n      });\n\n      // Track metadata for this item\n      const startPage = currentPage + 1;\n      const endPage = currentPage + pageCount;\n\n      itemResults.push({\n        title: pdfData.title,\n        startPage,\n        endPage,\n        pageCount,\n        scaleFactor: 1.0,\n      });\n\n      currentPage = endPage;\n\n    } catch (error) {\n      console.error(`Failed to merge PDF for item ${i}:`, error);\n\n      // Fallback metadata (still add to results even if merge failed)\n      const pageCount = 1;\n      const startPage = currentPage + 1;\n      const endPage = currentPage + pageCount;\n\n      itemResults.push({\n        title: pdfData.title,\n        startPage,\n        endPage,\n        pageCount,\n        scaleFactor: 1.0,\n      });\n\n      currentPage = endPage;\n    }\n  }\n\n  // Save the merged PDF as bytes\n  const mergedPdfBytes = await mergedPdf.save();\n\n  // Convert to Blob (type assertion needed for pdf-lib compatibility)\n  const finalBlob = new Blob([mergedPdfBytes as any], { type: 'application/pdf' });\n  const totalPages = currentPage;\n  const generationTime = Date.now() - startTime;\n\n  if (progressCallback) {\n    progressCallback(100);\n  }\n\n  if (options.onComplete) {\n    options.onComplete(finalBlob);\n  }\n\n  return {\n    blob: finalBlob,\n    totalPages,\n    fileSize: finalBlob.size,\n    generationTime,\n    items: itemResults,\n  };\n}\n\n/**\n * Combine all items in one container (for newPage: false)\n * Items can share pages naturally\n */\nasync function generateBatchPDFCombined(\n  items: PDFContentItem[],\n  options: Partial<PDFGeneratorOptions>,\n  startTime: number\n): Promise<BatchPDFGenerationResult> {\n  const progressCallback = options.onProgress;\n\n  // Create a container for all content items\n  const container = document.createElement('div');\n  container.style.position = 'absolute';\n  container.style.left = '-9999px';\n  container.style.top = '0';\n  container.style.width = '794px'; // A4 width at 96 DPI\n  document.body.appendChild(container);\n\n  try {\n    // Process each content item\n    for (let i = 0; i < items.length; i++) {\n      const item = items[i];\n      let element: HTMLElement;\n\n      if (typeof item.content === 'string') {\n        element = htmlStringToElement(item.content);\n      } else {\n        element = item.content.cloneNode(true) as HTMLElement;\n      }\n\n      container.appendChild(element);\n    }\n\n    // Load external styles if any\n    await loadExternalStyles(container);\n    await new Promise(resolve => setTimeout(resolve, 200));\n\n    // Track progress\n    if (progressCallback) {\n      progressCallback(50);\n    }\n\n    // Generate the PDF using the combined container\n    const generator = new PDFGenerator(options);\n    const blob = await generator.generateBlob(container);\n\n    // Estimate page breakdown\n    const totalPages = Math.ceil(items.reduce((sum, item) => sum + (item.pageCount || 1), 0));\n\n    const itemResults: BatchPDFGenerationResult['items'] = items.map((item, index) => {\n      const previousPages = items.slice(0, index).reduce((sum, it) => sum + (it.pageCount || 1), 0);\n      return {\n        title: item.title,\n        startPage: previousPages + 1,\n        endPage: previousPages + (item.pageCount || 1),\n        pageCount: item.pageCount || 1,\n        scaleFactor: 1.0,\n      };\n    });\n\n    const generationTime = Date.now() - startTime;\n\n    if (progressCallback) {\n      progressCallback(100);\n    }\n\n    if (options.onComplete) {\n      options.onComplete(blob);\n    }\n\n    return {\n      blob,\n      totalPages,\n      fileSize: blob.size,\n      generationTime,\n      items: itemResults,\n    };\n  } finally {\n    // Cleanup\n    if (container.parentNode) {\n      container.parentNode.removeChild(container);\n    }\n  }\n}\n","/**\n * Shared PDF Generation Helpers\n *\n * Centralized utilities for PDF generation across the app\n * Includes color conversion, style injection, and common settings\n */\n\nimport { TAILWIND_COLOR_REPLACEMENTS } from './utils';\n\n/**\n * Complete OKLCH to RGB color conversion map\n * Includes all Tailwind CSS colors used in the app\n */\nexport const PDF_COLOR_REPLACEMENTS = {\n  ...TAILWIND_COLOR_REPLACEMENTS,\n  // Add any custom app colors here if needed\n};\n\n/**\n * Generate comprehensive CSS for PDF rendering\n * Handles OKLCH color conversion and ensures proper styling\n */\nexport function generatePDFColorCSS(): string {\n  return `\n    :root, :host, * {\n      /* Red colors */\n      --color-red-50: #fef2f2 !important;\n      --color-red-100: #fee2e2 !important;\n      --color-red-200: #fecaca !important;\n      --color-red-300: #fca5a5 !important;\n      --color-red-400: #f87171 !important;\n      --color-red-500: #ef4444 !important;\n      --color-red-600: #dc2626 !important;\n      --color-red-700: #b91c1c !important;\n      --color-red-800: #991b1b !important;\n      --color-red-900: #7f1d1d !important;\n\n      /* Orange colors */\n      --color-orange-50: #fff7ed !important;\n      --color-orange-100: #ffedd5 !important;\n      --color-orange-200: #fed7aa !important;\n      --color-orange-300: #fdba74 !important;\n      --color-orange-400: #fb923c !important;\n      --color-orange-500: #f97316 !important;\n      --color-orange-600: #ea580c !important;\n      --color-orange-700: #c2410c !important;\n      --color-orange-800: #9a3412 !important;\n      --color-orange-900: #7c2d12 !important;\n\n      /* Yellow colors */\n      --color-yellow-50: #fefce8 !important;\n      --color-yellow-100: #fef9c3 !important;\n      --color-yellow-200: #fef08a !important;\n      --color-yellow-300: #fde047 !important;\n      --color-yellow-400: #facc15 !important;\n      --color-yellow-500: #eab308 !important;\n      --color-yellow-600: #ca8a04 !important;\n      --color-yellow-700: #a16207 !important;\n      --color-yellow-800: #854d0e !important;\n      --color-yellow-900: #713f12 !important;\n\n      /* Green colors */\n      --color-green-50: #f0fdf4 !important;\n      --color-green-100: #dcfce7 !important;\n      --color-green-200: #bbf7d0 !important;\n      --color-green-300: #86efac !important;\n      --color-green-400: #4ade80 !important;\n      --color-green-500: #22c55e !important;\n      --color-green-600: #16a34a !important;\n      --color-green-700: #15803d !important;\n      --color-green-800: #166534 !important;\n      --color-green-900: #14532d !important;\n\n      /* Blue colors */\n      --color-blue-50: #eff6ff !important;\n      --color-blue-100: #dbeafe !important;\n      --color-blue-200: #bfdbfe !important;\n      --color-blue-300: #93c5fd !important;\n      --color-blue-400: #60a5fa !important;\n      --color-blue-500: #3b82f6 !important;\n      --color-blue-600: #2563eb !important;\n      --color-blue-700: #1d4ed8 !important;\n      --color-blue-800: #1e40af !important;\n      --color-blue-900: #1e3a8a !important;\n\n      /* Purple colors */\n      --color-purple-50: #faf5ff !important;\n      --color-purple-100: #f3e8ff !important;\n      --color-purple-200: #e9d5ff !important;\n      --color-purple-300: #d8b4fe !important;\n      --color-purple-400: #c084fc !important;\n      --color-purple-500: #a855f7 !important;\n      --color-purple-600: #9333ea !important;\n      --color-purple-700: #7e22ce !important;\n      --color-purple-800: #6b21a8 !important;\n      --color-purple-900: #581c87 !important;\n\n      /* Gray colors */\n      --color-gray-50: #f9fafb !important;\n      --color-gray-100: #f3f4f6 !important;\n      --color-gray-200: #e5e7eb !important;\n      --color-gray-300: #d1d5db !important;\n      --color-gray-400: #9ca3af !important;\n      --color-gray-500: #6b7280 !important;\n      --color-gray-600: #4b5563 !important;\n      --color-gray-700: #374151 !important;\n      --color-gray-800: #1f2937 !important;\n      --color-gray-900: #111827 !important;\n\n      /* Basic colors */\n      --color-black: #000000 !important;\n      --color-white: #ffffff !important;\n    }\n\n    /* Background color utilities */\n    .bg-red-50 { background-color: #fef2f2 !important; }\n    .bg-red-100 { background-color: #fee2e2 !important; }\n    .bg-red-600 { background-color: #dc2626 !important; }\n    .bg-red-700 { background-color: #b91c1c !important; }\n\n    .bg-orange-50 { background-color: #fff7ed !important; }\n    .bg-orange-100 { background-color: #ffedd5 !important; }\n    .bg-orange-600 { background-color: #ea580c !important; }\n    .bg-orange-700 { background-color: #c2410c !important; }\n\n    .bg-yellow-50 { background-color: #fefce8 !important; }\n    .bg-yellow-100 { background-color: #fef9c3 !important; }\n    .bg-yellow-200 { background-color: #fef08a !important; }\n\n    .bg-green-50 { background-color: #f0fdf4 !important; }\n    .bg-green-100 { background-color: #dcfce7 !important; }\n    .bg-green-600 { background-color: #16a34a !important; }\n    .bg-green-700 { background-color: #15803d !important; }\n\n    .bg-blue-50 { background-color: #eff6ff !important; }\n    .bg-blue-100 { background-color: #dbeafe !important; }\n    .bg-blue-200 { background-color: #bfdbfe !important; }\n    .bg-blue-600 { background-color: #2563eb !important; }\n    .bg-blue-700 { background-color: #1d4ed8 !important; }\n\n    .bg-purple-50 { background-color: #faf5ff !important; }\n    .bg-purple-100 { background-color: #f3e8ff !important; }\n    .bg-purple-200 { background-color: #e9d5ff !important; }\n    .bg-purple-600 { background-color: #9333ea !important; }\n\n    .bg-gray-50 { background-color: #f9fafb !important; }\n    .bg-gray-100 { background-color: #f3f4f6 !important; }\n    .bg-gray-200 { background-color: #e5e7eb !important; }\n\n    /* Border color utilities */\n    .border-red-200 { border-color: #fecaca !important; }\n    .border-red-300 { border-color: #fca5a5 !important; }\n\n    .border-orange-200 { border-color: #fed7aa !important; }\n    .border-orange-300 { border-color: #fdba74 !important; }\n\n    .border-yellow-200 { border-color: #fef08a !important; }\n\n    .border-green-200 { border-color: #bbf7d0 !important; }\n\n    .border-blue-200 { border-color: #bfdbfe !important; }\n    .border-blue-300 { border-color: #93c5fd !important; }\n    .border-blue-400 { border-color: #60a5fa !important; }\n\n    .border-purple-200 { border-color: #e9d5ff !important; }\n    .border-purple-300 { border-color: #d8b4fe !important; }\n\n    .border-gray-200 { border-color: #e5e7eb !important; }\n    .border-gray-300 { border-color: #d1d5db !important; }\n    .border-gray-400 { border-color: #9ca3af !important; }\n\n    /* Text color utilities */\n    .text-red-600 { color: #dc2626 !important; }\n    .text-red-700 { color: #b91c1c !important; }\n\n    .text-orange-600 { color: #ea580c !important; }\n    .text-orange-700 { color: #c2410c !important; }\n\n    .text-yellow-600 { color: #ca8a04 !important; }\n\n    .text-green-600 { color: #16a34a !important; }\n    .text-green-700 { color: #15803d !important; }\n\n    .text-blue-600 { color: #2563eb !important; }\n    .text-blue-700 { color: #1d4ed8 !important; }\n\n    .text-purple-600 { color: #9333ea !important; }\n\n    .text-gray-500 { color: #6b7280 !important; }\n    .text-gray-600 { color: #4b5563 !important; }\n    .text-gray-700 { color: #374151 !important; }\n    .text-gray-900 { color: #111827 !important; }\n  `;\n}\n\n/**\n * Inject PDF color styles into the document\n * Returns cleanup function to remove styles\n */\nexport function injectPDFStyles(): () => void {\n  const styleId = 'pdf-color-override';\n\n  // Remove existing style if present\n  const existing = document.getElementById(styleId);\n  if (existing) {\n    existing.remove();\n  }\n\n  const style = document.createElement('style');\n  style.id = styleId;\n  style.textContent = generatePDFColorCSS();\n  document.head.appendChild(style);\n\n  // Return cleanup function\n  return () => {\n    const el = document.getElementById(styleId);\n    if (el) {\n      el.remove();\n    }\n  };\n}\n\n/**\n * Default PDF generator options optimized for the app\n */\nexport const DEFAULT_PDF_OPTIONS = {\n  format: 'a4' as const,\n  orientation: 'portrait' as const,\n  margins: [10, 10, 10, 10] as [number, number, number, number],\n  compress: true,\n  showPageNumbers: false,\n  imageQuality: 0.95,\n  scale: 3,\n  colorReplacements: PDF_COLOR_REPLACEMENTS,\n};\n\n/**\n * High-quality PDF options for detailed documents\n */\nexport const HIGH_QUALITY_PDF_OPTIONS = {\n  ...DEFAULT_PDF_OPTIONS,\n  imageQuality: 0.98,\n  scale: 4,\n};\n\n/**\n * Fast PDF options for quick generation\n */\nexport const FAST_PDF_OPTIONS = {\n  ...DEFAULT_PDF_OPTIONS,\n  imageQuality: 0.85,\n  scale: 2,\n};\n\n/**\n * Calculate PDF content width in pixels\n * This ensures consistent width across all PDF-rendered components\n *\n * Formula: (Paper Width - Left Margin - Right Margin) × MM_TO_PX\n * For A4 Portrait with 10mm margins: (210 - 10 - 10) × 3.7795 = 718.105px\n */\nexport function getPDFContentWidth(): number {\n  const a4WidthMm = 210; // A4 paper width\n  const [, marginRight, , marginLeft] = DEFAULT_PDF_OPTIONS.margins;\n  const usableWidthMm = a4WidthMm - marginLeft - marginRight;\n  const MM_TO_PX = 3.7795275591; // Exact 96 DPI conversion\n  return Math.round(usableWidthMm * MM_TO_PX); // 718px\n}\n\n/**\n * PDF content width constant for consistent rendering\n * Use this value for all PDF-targeted content widths\n */\nexport const PDF_CONTENT_WIDTH_PX = getPDFContentWidth();\n"]}