{"version":3,"file":"tvangular-document-viewer.mjs","sources":["../../../../tvangular/document-viewer/src/lib/enums/tooltip-position-enum.ts","../../../../tvangular/document-viewer/src/lib/services/document-service.ts","../../../../tvangular/document-viewer/src/lib/services/pdf-annotation-utils.ts","../../../../tvangular/document-viewer/src/lib/services/annotation.service.ts","../../../../tvangular/document-viewer/src/lib/constants/app.constants.ts","../../../../tvangular/document-viewer/src/lib/configurations/context-menu-items.ts","../../../../tvangular/document-viewer/src/lib/components/document-viewer/document-viewer.ts","../../../../tvangular/document-viewer/src/lib/components/document-viewer/document-viewer.html","../../../../tvangular/document-viewer/src/lib/models/pdf-annotation.model.ts","../../../../tvangular/document-viewer/src/tvangular-document-viewer.ts"],"sourcesContent":["export enum TooltipPosition {\r\n  ABOVE = 'above',\r\n  BELOW = 'below',\r\n  LEFT = 'left',\r\n  RIGHT = 'right',\r\n  DYNAMIC = 'dynamic',\r\n  DEFAULT = BELOW,\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class DocumentService {\r\n  // scale: any = 3;\r\n  searchResults: any;\r\n  existCount = 0;\r\n  /**\r\n   * Renders a PDF page in a given canvas element and applies zoom transform.\r\n   * Also highlights search results, if provided.\r\n   * @param pageNum Page number to render (1-based).\r\n   * @param canvas Canvas element to render into.\r\n   * @param pdfDoc PDF document object.\r\n   * @param searchResults Optional search result data.\r\n   * @param searchTextQuery Optional search query text.\r\n   * @param activeStatus Optional boolean indicating if search results should be highlighted.\r\n   * @param zoomScale Optional number indicating the zoom level (1 = 100%).\r\n   * @param currentSearchIndex Optional index of the currently active search result.\r\n   * @returns Promise<{x: number, y: number} | null> - Coordinates of the active match, or null if not found.\r\n   */\r\n  async renderPage(\r\n    pageNum: number,\r\n    canvas: HTMLCanvasElement,\r\n    pdfDoc: any,\r\n    searchResults: any,\r\n    searchTextQuery: any,\r\n    activeStatus: any,\r\n    zoomScale: number, // e.g., 1 (100%), 1.5 (150%), 0.8 (80%)\r\n    currentSearchIndex?: number, // Index of the currently active search result\r\n    pdfText?: any[], // Pre-extracted text items for accurate highlighting\r\n    textLayerContainer?: HTMLElement, // Optional textLayer container for text selection/annotation\r\n  ): Promise<{ x: number; y: number } | null> {\r\n    if (!pageNum) return null;\r\n\r\n    const page = await pdfDoc.getPage(pageNum);\r\n\r\n    // --- Browser-native zoom approach ---\r\n    // Render the canvas at a fixed high-DPI base scale for crispness.\r\n    // Zoom is expressed purely via CSS width/height on the canvas element,\r\n    // so the DOM layout (page gaps, container sizes) is never affected by zoom.\r\n    const BASE_SCALE = 3; // High-DPI factor (retina quality)\r\n    const viewport = page.getViewport({ scale: BASE_SCALE });\r\n\r\n    // Set the canvas pixel buffer to the high-DPI size (never changes with zoom)\r\n    canvas.width = viewport.width;\r\n    canvas.height = viewport.height;\r\n\r\n    // Apply zoom visually via CSS — this is what the browser native viewer does.\r\n    // The margin/gap on .page-container is in CSS pixels and is unaffected.\r\n    const cssWidth = (viewport.width / BASE_SCALE) * zoomScale;\r\n    const cssHeight = (viewport.height / BASE_SCALE) * zoomScale;\r\n    canvas.style.width = `${cssWidth}px`;\r\n    canvas.style.height = `${cssHeight}px`;\r\n\r\n    const context = canvas.getContext('2d');\r\n    if (!context) {\r\n      return null;\r\n    }\r\n\r\n    context.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n    await page.render({\r\n      canvasContext: context,\r\n      viewport,\r\n    }).promise;\r\n\r\n    // Render PDF.js TextLayer for text selection and annotation support\r\n    if (textLayerContainer) {\r\n      textLayerContainer.innerHTML = '';\r\n      textLayerContainer.style.width = `${cssWidth}px`;\r\n      textLayerContainer.style.height = `${cssHeight}px`;\r\n      textLayerContainer.style.setProperty(\r\n        '--total-scale-factor',\r\n        `${zoomScale}`,\r\n      );\r\n      textLayerContainer.style.setProperty('--scale-factor', `${zoomScale}`);\r\n\r\n      try {\r\n        const textContent = await page.getTextContent({\r\n          includeMarkedContent: true,\r\n          disableNormalization: false,\r\n        });\r\n        const textViewport = page.getViewport({ scale: zoomScale });\r\n\r\n        const textLayer = new (pdfjsLib as any).TextLayer({\r\n          textContentSource: textContent,\r\n          container: textLayerContainer,\r\n          viewport: textViewport,\r\n        });\r\n\r\n        await textLayer.render();\r\n      } catch (err) {\r\n        console.warn(\r\n          `[DocumentService] Error rendering textLayer for page ${pageNum}:`,\r\n          err,\r\n        );\r\n      }\r\n    }\r\n\r\n    // If highlights are needed\r\n    if (activeStatus) {\r\n      return this.highlightSearchResults(\r\n        pageNum,\r\n        context,\r\n        viewport,\r\n        pdfDoc,\r\n        searchResults,\r\n        searchTextQuery,\r\n        currentSearchIndex,\r\n        pdfText,\r\n      );\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * Highlights search results on a PDF page by drawing yellow background rectangles behind matched text.\r\n   *\r\n   * This method locates and highlights occurrences of a search query on a specified\r\n   * page of a PDF document. Each match is marked by a yellow background rectangle\r\n   * drawn behind the text in a canvas rendering context. The method also updates the count of matches\r\n   * found. The currently active match is highlighted with a brighter yellow color.\r\n   *\r\n   * @param {number} pageNum - The page number where the search results should be highlighted.\r\n   * @param {CanvasRenderingContext2D} context - The canvas rendering context used for drawing.\r\n   * @param {any} viewport - The viewport for the PDF page, including transformation information.\r\n   * @param {any} pdfDoc - The PDF document object containing the pages.\r\n   * @param {any[]} searchResults - An array of search result objects containing page and index data.\r\n   * @param {string} searchTextQuery - The search query text to highlight within the page.\r\n   * @param {number} currentSearchIndex - The index of the currently active search result.\r\n   *\r\n   * @returns {Promise<{x: number, y: number} | null>} - A promise resolving to the coordinates of the active match, or null if not found.\r\n   */\r\n\r\n  async highlightSearchResults(\r\n    pageNum: number,\r\n    context: any,\r\n    viewport: any,\r\n    pdfDoc: any,\r\n    searchResults: any[],\r\n    searchTextQuery: string,\r\n    currentSearchIndex?: number,\r\n    pdfText?: any[],\r\n  ): Promise<{ x: number; y: number } | null> {\r\n    if (!searchResults?.length) return null;\r\n\r\n    const matches = searchResults.filter((res) => res.page === pageNum);\r\n    if (matches.length === 0) return null;\r\n\r\n    // Use pre-extracted text items if available to ensure index consistency with search results\r\n    let textItems: any[];\r\n    if (pdfText && pdfText[pageNum - 1]) {\r\n      textItems = pdfText[pageNum - 1];\r\n    } else {\r\n      // Fallback to re-fetching text content\r\n      const page = await pdfDoc.getPage(pageNum);\r\n      const textContent = await page.getTextContent();\r\n      textItems = textContent.items;\r\n    }\r\n\r\n    const query = searchTextQuery.toLowerCase();\r\n\r\n    this.existCount = 0;\r\n\r\n    // Calculate the starting global index for this page\r\n    let globalMatchIndex = 0;\r\n    for (let i = 1; i < pageNum; i++) {\r\n      const pageMatches = searchResults.filter((res) => res.page === i);\r\n      globalMatchIndex += pageMatches.length;\r\n    }\r\n\r\n    let activeMatchCoordinates: { x: number; y: number } | null = null;\r\n\r\n    // Use the pre-calculated search results for exact matching\r\n    for (const match of matches) {\r\n      // Use the stored text from search results if available\r\n      const storedText = match.text;\r\n\r\n      // Try to find the matching text item by comparing the stored text\r\n      let textItem: any = null;\r\n      let actualItemIndex = -1;\r\n\r\n      if (storedText) {\r\n        // Find the text item that matches the stored text\r\n        for (let i = 0; i < textItems.length; i++) {\r\n          if (textItems[i].str === storedText) {\r\n            textItem = textItems[i];\r\n            actualItemIndex = i;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n\r\n      // Fallback to using the stored itemIndex if no match found\r\n      if (!textItem && match.itemIndex < textItems.length) {\r\n        textItem = textItems[match.itemIndex];\r\n        actualItemIndex = match.itemIndex;\r\n      }\r\n\r\n      if (!textItem) {\r\n        console.warn(\r\n          `Text item not found for match: storedText=\"${storedText}\", itemIndex=${match.itemIndex}`,\r\n        );\r\n        continue;\r\n      }\r\n\r\n      const text = textItem.str;\r\n      if (!text) continue;\r\n\r\n      // Verify the text actually contains the search query at the match position\r\n      const lowerText = text.toLowerCase();\r\n      const matchedText = lowerText.substring(\r\n        match.matchIndex,\r\n        match.matchIndex + match.length,\r\n      );\r\n      if (matchedText !== query.toLowerCase()) {\r\n        console.warn(\r\n          `Text mismatch: expected \"${query.toLowerCase()}\" but found \"${matchedText}\" in text \"${lowerText}\" at index ${match.matchIndex}`,\r\n        );\r\n        continue;\r\n      }\r\n\r\n      // Get the transform matrix for the text item\r\n      const transform = pdfjsLib.Util.transform(\r\n        viewport.transform,\r\n        textItem.transform,\r\n      );\r\n      const tx = transform[4];\r\n      const ty = transform[5];\r\n\r\n      // Save canvas context state\r\n      context.save();\r\n\r\n      // Set font on context for measuring proportional text substrings\r\n      const fontHeight =\r\n        Math.hypot(transform[2], transform[3]) || Math.abs(transform[0]) || 12;\r\n      context.font = `${Math.round(fontHeight)}px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif`;\r\n\r\n      // Measure total string width in canvas context font to compute proportional scale\r\n      const fullMeasuredWidth = context.measureText(text).width || 1;\r\n      const textWidth =\r\n        (textItem.width ? textItem.width * viewport.scale : 0) ||\r\n        fullMeasuredWidth;\r\n      const widthScale = textWidth / fullMeasuredWidth;\r\n\r\n      // Substring before the match: accounts for character widths precisely\r\n      const prefixText = text.substring(0, match.matchIndex);\r\n      const prefixWidth = context.measureText(prefixText).width * widthScale;\r\n\r\n      // Matched substring width\r\n      const matchedSubstring = text.substring(\r\n        match.matchIndex,\r\n        match.matchIndex + match.length,\r\n      );\r\n      const matchedWidth =\r\n        context.measureText(matchedSubstring).width * widthScale;\r\n\r\n      const startX = tx + prefixWidth;\r\n      const highlightWidth = Math.max(matchedWidth, 4);\r\n\r\n      this.existCount++;\r\n\r\n      // Determine if this is the active match by comparing global index\r\n      const isActiveMatch =\r\n        currentSearchIndex !== undefined &&\r\n        globalMatchIndex === currentSearchIndex;\r\n\r\n      // Store coordinates of active match for scrolling\r\n      if (isActiveMatch) {\r\n        activeMatchCoordinates = { x: startX, y: ty };\r\n      }\r\n\r\n      // Active match: amber-orange, Inactive matches: clear yellow\r\n      if (isActiveMatch) {\r\n        context.fillStyle = 'rgba(255, 153, 0, 0.65)';\r\n      } else {\r\n        context.fillStyle = 'rgba(255, 220, 0, 0.45)';\r\n      }\r\n\r\n      // In PDF coordinate space, ty is at the text baseline.\r\n      const boxY = ty - fontHeight * 0.78;\r\n      const boxHeight = fontHeight * 0.96;\r\n      const boxPaddingX = 1;\r\n\r\n      context.fillRect(\r\n        startX - boxPaddingX,\r\n        boxY,\r\n        highlightWidth + boxPaddingX * 2,\r\n        boxHeight,\r\n      );\r\n\r\n      context.restore();\r\n\r\n      globalMatchIndex++;\r\n    }\r\n\r\n    return activeMatchCoordinates;\r\n  }\r\n}\r\n","import { PDFSelector, TextNodeSegment } from '../models/pdf-annotation.model';\r\n\r\n/**\r\n * 1. SELECTION CAPTURE (DOM Selection to Character Offsets)\r\n * Derived from: packages/text-annotator/src/utils/annotation/range-to-selector.ts\r\n *\r\n * Uses rangeBefore to measure exact character offset from the start of the textLayer container.\r\n */\r\nexport const getSelectionOffsets = (\r\n  range: Range,\r\n  container: HTMLElement,\r\n  pageNumber: number,\r\n): PDFSelector | null => {\r\n  if (!range || range.collapsed) {\r\n    return null;\r\n  }\r\n\r\n  // Ensure selection intersects container\r\n  const commonAncestor = range.commonAncestorContainer;\r\n  if (\r\n    !container.contains(commonAncestor) &&\r\n    !container.contains(range.startContainer)\r\n  ) {\r\n    return null;\r\n  }\r\n\r\n  // Measure character offsets using TreeWalker\r\n  const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);\r\n  let currentOffset = 0;\r\n  let start = -1;\r\n  let end = -1;\r\n\r\n  while (walker.nextNode()) {\r\n    const node = walker.currentNode as Text;\r\n\r\n    if (node === range.startContainer) {\r\n      start = currentOffset + range.startOffset;\r\n    }\r\n\r\n    if (node === range.endContainer) {\r\n      end = currentOffset + range.endOffset;\r\n    }\r\n\r\n    currentOffset += node.textContent?.length || 0;\r\n  }\r\n\r\n  // Fallback to rangeBefore if start or end was not resolved by node reference directly\r\n  if (start === -1 || end === -1) {\r\n    try {\r\n      const rangeBefore = document.createRange();\r\n      rangeBefore.setStart(container, 0);\r\n      rangeBefore.setEnd(range.startContainer, range.startOffset);\r\n      start = rangeBefore.toString().length;\r\n      end = start + range.toString().length;\r\n    } catch {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  const quote = range.toString();\r\n\r\n  if (start < 0 || end <= start || !quote.trim()) {\r\n    return null;\r\n  }\r\n\r\n  // Calculate QuadPoints (PDF Coordinate Bounding Boxes)\r\n  const quadpoints = getQuadPoints(range, container);\r\n\r\n  return {\r\n    pageNumber,\r\n    quote,\r\n    start,\r\n    end,\r\n    quadpoints,\r\n  };\r\n};\r\n\r\n/**\r\n * Helper: Calculates exact quadpoint coordinates for W3C PDF Compliance\r\n * Derived from: packages/pdf-annotator/src/utils/pdf/get-quad-points.ts\r\n */\r\nexport const getQuadPoints = (\r\n  range: Range,\r\n  container: HTMLElement,\r\n): number[] => {\r\n  const containerRect = container.getBoundingClientRect();\r\n  const clientRects = Array.from(range.getClientRects());\r\n  const quads: number[] = [];\r\n\r\n  for (const rect of clientRects) {\r\n    const x1 = rect.left - containerRect.left;\r\n    const y1 = rect.top - containerRect.top;\r\n    const x2 = rect.right - containerRect.left;\r\n    const y2 = rect.top - containerRect.top;\r\n    const x3 = rect.right - containerRect.left;\r\n    const y3 = rect.bottom - containerRect.top;\r\n    const x4 = rect.left - containerRect.left;\r\n    const y4 = rect.bottom - containerRect.top;\r\n\r\n    quads.push(x1, y1, x2, y2, x3, y3, x4, y4);\r\n  }\r\n\r\n  return quads;\r\n};\r\n\r\n/**\r\n * 2. THE MATCHER (Offsets to Dynamic DOM Spans)\r\n * Derived from: packages/text-annotator-tei/src/crosswalk/crosswalk.ts\r\n * and packages/text-annotator/src/utils/annotation/revive-annotation.ts\r\n *\r\n * Traverses dynamic PDF.js text spans using TreeWalker to split selections across fragmented nodes.\r\n */\r\nexport const findNodesInTextLayer = (\r\n  container: HTMLElement,\r\n  start: number,\r\n  end: number,\r\n): TextNodeSegment[] => {\r\n  const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);\r\n  const segments: TextNodeSegment[] = [];\r\n\r\n  let runningOffset = 0;\r\n  let node = walker.nextNode();\r\n\r\n  while (node) {\r\n    const len = node.textContent?.length || 0;\r\n    const nodeEnd = runningOffset + len;\r\n\r\n    // Check if annotation overlaps this specific span/text node\r\n    if (start < nodeEnd && end > runningOffset) {\r\n      segments.push({\r\n        node: node as Text,\r\n        start: Math.max(0, start - runningOffset),\r\n        end: Math.min(len, end - runningOffset),\r\n      });\r\n    }\r\n\r\n    runningOffset = nodeEnd;\r\n    if (runningOffset >= end) break;\r\n    node = walker.nextNode();\r\n  }\r\n\r\n  return segments;\r\n};\r\n\r\n/**\r\n * 3. RENDERING LOGIC (Painting the Highlight)\r\n * Derived from: packages/text-annotator/src/rendering/renderer-spans/spans-renderer.ts\r\n *\r\n * Wraps segments in <mark> tags safely without breaking the PDF structure.\r\n */\r\nexport const applyHighlight = (\r\n  segments: TextNodeSegment[],\r\n  annotationId?: string,\r\n  color = 'rgba(255, 235, 59, 0.4)',\r\n): void => {\r\n  segments.forEach((seg) => {\r\n    const range = document.createRange();\r\n    range.setStart(seg.node, seg.start);\r\n    range.setEnd(seg.node, seg.end);\r\n\r\n    const mark = document.createElement('mark');\r\n    mark.className = 'pdf-annotation-highlight';\r\n    mark.style.backgroundColor = color;\r\n    mark.style.pointerEvents = 'auto';\r\n\r\n    if (annotationId) {\r\n      mark.dataset['annotationId'] = annotationId;\r\n    }\r\n\r\n    try {\r\n      range.surroundContents(mark);\r\n    } catch (e) {\r\n      // Fallback for partial boundary overlap\r\n      const extracted = range.extractContents();\r\n      mark.appendChild(extracted);\r\n      range.insertNode(mark);\r\n    }\r\n  });\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n  PDFSelector,\r\n  PDFAnnotation,\r\n  TextNodeSegment,\r\n} from '../models/pdf-annotation.model';\r\nimport {\r\n  getSelectionOffsets,\r\n  getQuadPoints,\r\n  findNodesInTextLayer,\r\n  applyHighlight,\r\n} from './pdf-annotation-utils';\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class AnnotationService {\r\n  /**\r\n   * 1. Captures the user's active window.getSelection() on a page textLayer\r\n   */\r\n  public captureSelection(\r\n    range: Range,\r\n    textLayer: HTMLElement,\r\n    pageNumber: number,\r\n    color = 'rgba(255, 235, 59, 0.4)',\r\n  ): PDFAnnotation | null {\r\n    const selector = getSelectionOffsets(range, textLayer, pageNumber);\r\n    if (!selector) return null;\r\n\r\n    return {\r\n      id: `anno-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\r\n      selector,\r\n      color,\r\n      createdAt: new Date().toISOString(),\r\n    };\r\n  }\r\n\r\n  /**\r\n   * 2. Finds matching text nodes in textLayer for given character offsets\r\n   */\r\n  public findNodesInTextLayer(\r\n    container: HTMLElement,\r\n    start: number,\r\n    end: number,\r\n  ): TextNodeSegment[] {\r\n    return findNodesInTextLayer(container, start, end);\r\n  }\r\n\r\n  /**\r\n   * 3. Applies highlight to given segments\r\n   */\r\n  public applyHighlight(\r\n    segments: TextNodeSegment[],\r\n    annotationId?: string,\r\n    color?: string,\r\n  ): void {\r\n    applyHighlight(segments, annotationId, color);\r\n  }\r\n\r\n  /**\r\n   * 4. Repaints all annotations for a specific PDF page when rendered or zoomed\r\n   */\r\n  public renderPageHighlights(\r\n    textLayer: HTMLElement,\r\n    pageNumber: number,\r\n    annotations: PDFAnnotation[],\r\n  ): void {\r\n    if (!textLayer || !annotations?.length) return;\r\n\r\n    const pageAnnos = annotations.filter(\r\n      (a) => a.selector.pageNumber === pageNumber,\r\n    );\r\n\r\n    pageAnnos.forEach((anno) => {\r\n      const segments = findNodesInTextLayer(\r\n        textLayer,\r\n        anno.selector.start,\r\n        anno.selector.end,\r\n      );\r\n      applyHighlight(segments, anno.id, anno.color);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * 5. Attaches delegated click listener to detect clicked annotations\r\n   */\r\n  public attachClickListener(\r\n    textLayer: HTMLElement,\r\n    callback: (annotationId: string, event: MouseEvent) => void,\r\n  ): () => void {\r\n    const handler = (e: MouseEvent) => {\r\n      const target = (e.target as HTMLElement).closest(\r\n        '.pdf-annotation-highlight',\r\n      ) as HTMLElement;\r\n      if (target && target.dataset['annotationId']) {\r\n        callback(target.dataset['annotationId'], e);\r\n      }\r\n    };\r\n\r\n    textLayer.addEventListener('click', handler);\r\n    return () => textLayer.removeEventListener('click', handler);\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class AppConstants {\r\n  public readonly thumbnailScale = 0.5;\r\n  public readonly maxScaleValue = 2.4; // 240% – upper zoom limit\r\n  public readonly minScaleValue = 0.4; // 40%  – lower zoom limit\r\n  public readonly changeScaleValue = 0.8;\r\n}\r\n","import { ContextMenuItem } from '@tvangular/context-menu';\r\n\r\nexport const DEFAULT_CONTEXT_MENU_ITEMS: ContextMenuItem[] = [\r\n  { label: 'Next Page', action: 'nextPage', icon: 'ri-arrow-right-s-line' },\r\n  {\r\n    label: 'Previous Page',\r\n    action: 'previousPage',\r\n    icon: 'ri-arrow-left-s-line',\r\n  },\r\n  { type: 'seperator', label: '', action: '' },\r\n  { label: 'Zoom In', action: 'zoomIn', icon: 'ri-zoom-in-line' },\r\n  { label: 'Zoom Out', action: 'zoomOut', icon: 'ri-zoom-out-line' },\r\n  { type: 'seperator', label: '', action: '' },\r\n  { label: 'View', action: 'toggleView', icon: 'ri-layout-grid-line' },\r\n  { type: 'seperator', label: '', action: '' },\r\n  { label: 'Download', action: 'download', icon: 'ri-download-line' },\r\n  { label: 'Print', action: 'print', icon: 'ri-printer-line' },\r\n];\r\n","import {\r\n  Component,\r\n  DOCUMENT,\r\n  ElementRef,\r\n  EventEmitter,\r\n  HostListener,\r\n  Inject,\r\n  inject,\r\n  Input,\r\n  Output,\r\n  ViewChild,\r\n  ChangeDetectorRef,\r\n  ViewChildren,\r\n  QueryList,\r\n  SecurityContext,\r\n  AfterViewInit,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  NgZone,\r\n} from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { TooltipPosition } from '../../enums/tooltip-position-enum';\r\nimport { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist';\r\nimport { PDFAnnotation, PDFSelector } from '../../models/pdf-annotation.model';\r\nimport {\r\n  DocumentViewerConfig,\r\n  TooltipConfig,\r\n} from '../../models/document-config';\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\nimport * as docx from 'docx-preview';\r\n// import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { DocumentService } from '../../services/document-service';\r\nimport { AnnotationService } from '../../services/annotation.service';\r\nimport { AppConstants } from '../../constants/app.constants';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ScrollToTop } from '@tvangular/scroll-to-top';\r\nimport { ContextMenuService, ContextMenuItem } from '@tvangular/context-menu';\r\nimport { DEFAULT_CONTEXT_MENU_ITEMS } from '../../configurations/context-menu-items';\r\n\r\n@Component({\r\n  selector: 'lib-document-viewer',\r\n  imports: [CommonModule, FormsModule, ScrollToTop],\r\n  templateUrl: './document-viewer.html',\r\n  styleUrl: './document-viewer.css',\r\n})\r\nexport class DocumentViewer implements AfterViewInit, OnChanges {\r\n  /**\r\n   * Security Note:\r\n   * HTML content is rendered within a sandboxed iframe to prevent XSS attacks.\r\n   * The sandbox attribute restricts the iframe's capabilities while allowing\r\n   * necessary functionality for document viewing. Content is loaded via srcdoc\r\n   * with bypassSecurityTrustHtml since the iframe sandbox provides the security layer.\r\n   */\r\n  @ViewChild('pdfCanvas', { static: false })\r\n  pdfCanvas!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild('viewerContainer', { static: false })\r\n  viewerContainer!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('htmlContentIframe', { static: false })\r\n  htmlContentIframe!: ElementRef<HTMLIFrameElement>;\r\n  @ViewChild('docxRenderContainer', { static: false })\r\n  docxRenderContainer!: ElementRef<HTMLDivElement>;\r\n  @ViewChildren('thumbnailCanvas') thumbnailCanvases!: QueryList<\r\n    ElementRef<HTMLCanvasElement>\r\n  >;\r\n\r\n  observer!: IntersectionObserver;\r\n  private isManualNavigation = false; // Flag to prevent observer interference\r\n  @Output() removeImageEvent = new EventEmitter<void>(); // Define event\r\n  @Output() closeRequest = new EventEmitter<void>();\r\n  @Output() contextMenuItemClick = new EventEmitter<string>();\r\n  @Output() annotationCreated = new EventEmitter<PDFAnnotation>();\r\n  @Output() annotationUpdated = new EventEmitter<PDFAnnotation>();\r\n  @Output() annotationDeleted = new EventEmitter<string>();\r\n  @Output() annotationClicked = new EventEmitter<{\r\n    annotationId: string;\r\n    event: MouseEvent;\r\n  }>();\r\n  @Output() textLayerRendered = new EventEmitter<{\r\n    pageNumber: number;\r\n    textLayer: HTMLElement;\r\n  }>();\r\n\r\n  @Input() parentData!: DocumentViewerConfig;\r\n  @Input() customContextMenuItems?: ContextMenuItem[];\r\n  @Input() annotations: PDFAnnotation[] = [];\r\n\r\n  private contextMenuService = inject(ContextMenuService);\r\n  private annotationService = inject(AnnotationService);\r\n  private ngZone = inject(NgZone);\r\n\r\n  // Floating Annotation Comment & Selection Toolbar State (Pic 1)\r\n  showSelectionToolbar = false;\r\n  selectionToolbarPos: { top: number; left: number } = { top: 0, left: 0 };\r\n  pendingSelection: { range: Range; pageNumber: number } | null = null;\r\n\r\n  showCommentBox = false;\r\n  activeCommentAnnotation: PDFAnnotation | null = null;\r\n  isNewAnnotation = false;\r\n  isEditingComment = false;\r\n  showCommentMenu = false;\r\n  commentInputText = '';\r\n  commentReplyText = '';\r\n  commentBoxPosition: { top: number; left: number } = { top: 0, left: 0 };\r\n\r\n  // Sidebar collapse state\r\n  isSidebarCollapsed = false;\r\n  activeSidebarTab: 'thumbnails' | 'toc' = 'thumbnails';\r\n  // Table of Contents (Outline) state\r\n  pdfOutline: any[] = [];\r\n\r\n  viewMode: 'single' | 'multi' = 'single'; // Default to single view\r\n  tooltipPosition: typeof TooltipPosition = TooltipPosition;\r\n  pdfDoc: PDFDocumentProxy | null = null;\r\n  pdfDoc1: PDFDocumentProxy | null = null;\r\n  pdfDoc2: PDFDocumentProxy | null = null;\r\n  totalPages: any = 0;\r\n  currentPage = 1;\r\n  scale: any = 1;\r\n  /** Remembers the single-view zoom level so it can be restored when leaving multi-view. */\r\n  private singleViewScale = 1;\r\n  inputPageNumber = 1;\r\n\r\n  docxScale = 1.0;\r\n\r\n  get zoomPercentage(): number {\r\n    if (this.isDocxContent) {\r\n      return Math.round(this.docxScale * 100);\r\n    }\r\n    return Math.round((this.isHtmlContent ? this.htmlScale : this.scale) * 100);\r\n  }\r\n  pageThumbnails: HTMLCanvasElement[] = [];\r\n  thumbnailDataUrls: string[] = [];\r\n  base64Url: any;\r\n  imgUrl: any = '';\r\n  fileUrl: any;\r\n  fileType: any;\r\n  canvas: any;\r\n  pdfIsLoaded: any = true;\r\n  htmlContent: any = null; // For storing sanitized HTML content\r\n  textContent: any = null; // For storing text content\r\n  originalHtmlContent = ''; // Store original HTML for download\r\n  originalTextContent = ''; // Store original text for download\r\n  safeIframeSrc: any = null; // SafeResourceUrl for iframe src\r\n  private htmlBlobUrl: string | null = null; // Current blob URL for HTML iframe\r\n  pdfText: any;\r\n  pages: any[] = [];\r\n  isMultiView = false;\r\n  existCount = 0;\r\n  // Find / Search UI state\r\n  isSearchPanelVisible = false;\r\n  isFindBarCollapsed = false;\r\n  searchQuery = '';\r\n  matchCase = false;\r\n  wholeWord = false;\r\n  useRegex = false;\r\n  findCountText = 'No results';\r\n  findHistory: string[] = [];\r\n  historyIndex = -1;\r\n  searchResults: Array<{\r\n    page: number;\r\n    itemIndex: number;\r\n    matchIndex: number;\r\n    length: number;\r\n    text: string;\r\n  }> = [];\r\n  currentSearchIndex = -1;\r\n  isSearching = false;\r\n  searchTimeout: any = null;\r\n  activeMatchCoordinates: { x: number; y: number } | null = null;\r\n  htmlScale = 1; // Separate scale for HTML/TXT content\r\n  tooltipBelowConfig: TooltipConfig = {\r\n    backgroundColor: '#212529',\r\n    textColor: 'white',\r\n    borderRadius: '0px',\r\n    animationDuration: '500ms',\r\n    fontSize: '12px',\r\n    fontStyle: 'normal',\r\n    padding: '',\r\n    boxShadow: '',\r\n    showDelay: 0,\r\n    hideDelay: 0,\r\n  };\r\n  private _appConstants = inject(AppConstants);\r\n  private _documentViewerService = inject(DocumentService);\r\n  private cdr = inject(ChangeDetectorRef);\r\n  private sanitizer = inject(DomSanitizer);\r\n  constructor() {\r\n    pdfjsLib.GlobalWorkerOptions.workerSrc =\r\n      'https://cdn.jsdelivr.net/npm/pdfjs-dist@5.6.205/build/pdf.worker.min.mjs';\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    if (this.observer) {\r\n      this.observer.disconnect();\r\n    }\r\n\r\n    // Clean up iframe content and revoke blob URLs to prevent memory leaks\r\n    if (this.htmlContentIframe) {\r\n      this.htmlContentIframe.nativeElement.src = 'about:blank';\r\n    }\r\n    if (this.htmlBlobUrl) {\r\n      URL.revokeObjectURL(this.htmlBlobUrl);\r\n      this.htmlBlobUrl = null;\r\n    }\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['parentData'] && !changes['parentData'].firstChange) {\r\n      this.initializeDocument();\r\n    }\r\n    if (changes['annotations'] && !changes['annotations'].firstChange) {\r\n      this.reRenderAnnotationsOnVisiblePages();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Re-paints annotations across all currently rendered pages.\r\n   */\r\n  public reRenderAnnotationsOnVisiblePages(): void {\r\n    this.pages.forEach((page, index) => {\r\n      if (page.rendered) {\r\n        const pageNumber = index + 1;\r\n        const textLayer = document.getElementById(\r\n          `textLayer${pageNumber}`,\r\n        ) as HTMLElement;\r\n        if (textLayer) {\r\n          this.annotationService.renderPageHighlights(\r\n            textLayer,\r\n            pageNumber,\r\n            this.annotations,\r\n          );\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Core rendering bridge that renders both PDF.js canvas and textLayer,\r\n   * paints saved annotations, attaches interaction listeners, and emits textLayerRendered.\r\n   */\r\n  private renderPageAndAnnotations(\r\n    pageNumber: number,\r\n    canvas: HTMLCanvasElement,\r\n    activeStatus: any,\r\n  ): Promise<{ x: number; y: number } | null> {\r\n    const textLayer = document.getElementById(\r\n      `textLayer${pageNumber}`,\r\n    ) as HTMLElement;\r\n    return this._documentViewerService\r\n      .renderPage(\r\n        pageNumber,\r\n        canvas,\r\n        this.pdfDoc,\r\n        this.searchResults,\r\n        this.searchQuery,\r\n        activeStatus,\r\n        this.scale,\r\n        this.currentSearchIndex,\r\n        this.pdfText,\r\n        textLayer,\r\n      )\r\n      .then((coordinates) => {\r\n        if (textLayer) {\r\n          this.annotationService.renderPageHighlights(\r\n            textLayer,\r\n            pageNumber,\r\n            this.annotations,\r\n          );\r\n          this.annotationService.attachClickListener(\r\n            textLayer,\r\n            (annotationId, event) => {\r\n              this.annotationClicked.emit({ annotationId, event });\r\n              this.handleAnnotationClick(annotationId, event);\r\n            },\r\n          );\r\n          this.textLayerRendered.emit({ pageNumber, textLayer });\r\n        }\r\n        return coordinates;\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Handles user selection on the PDF.js text layer (via mouseup event).\r\n   * Immediately applies the yellow highlight and opens the comment card beside the selection (Pic 1).\r\n   */\r\n  onTextLayerMouseUp(event: MouseEvent, pageNumber: number): void {\r\n    const textLayer = document.getElementById(\r\n      `textLayer${pageNumber}`,\r\n    ) as HTMLElement;\r\n    if (!textLayer) return;\r\n\r\n    const selection = window.getSelection();\r\n    if (!selection || selection.isCollapsed || selection.rangeCount === 0) {\r\n      return;\r\n    }\r\n\r\n    const range = selection.getRangeAt(0);\r\n    const selectedText = range.toString().trim();\r\n    if (!selectedText) return;\r\n\r\n    const selectionRect = range.getBoundingClientRect();\r\n    const newAnnotation = this.annotationService.captureSelection(\r\n      range,\r\n      textLayer,\r\n      pageNumber,\r\n    );\r\n\r\n    if (newAnnotation) {\r\n      const segments = this.annotationService.findNodesInTextLayer(\r\n        textLayer,\r\n        newAnnotation.selector.start,\r\n        newAnnotation.selector.end,\r\n      );\r\n      this.annotationService.applyHighlight(\r\n        segments,\r\n        newAnnotation.id,\r\n        newAnnotation.color,\r\n      );\r\n\r\n      this.annotations = [...this.annotations, newAnnotation];\r\n      selection.removeAllRanges();\r\n\r\n      // Open comment card anchored to the selection in the right margin (Pic 1)\r\n      this.openCommentBox(newAnnotation, selectionRect, true, pageNumber);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Triggered when user clicks the \"Highlight\" icon on the selection pill toolbar.\r\n   */\r\n  onToolbarAddHighlight(): void {\r\n    if (!this.pendingSelection) return;\r\n\r\n    const { range, pageNumber } = this.pendingSelection;\r\n    const textLayer = document.getElementById(\r\n      `textLayer${pageNumber}`,\r\n    ) as HTMLElement;\r\n    if (!textLayer) return;\r\n\r\n    const newAnnotation = this.annotationService.captureSelection(\r\n      range,\r\n      textLayer,\r\n      pageNumber,\r\n    );\r\n\r\n    if (newAnnotation) {\r\n      const segments = this.annotationService.findNodesInTextLayer(\r\n        textLayer,\r\n        newAnnotation.selector.start,\r\n        newAnnotation.selector.end,\r\n      );\r\n      this.annotationService.applyHighlight(\r\n        segments,\r\n        newAnnotation.id,\r\n        newAnnotation.color,\r\n      );\r\n\r\n      this.annotations = [...this.annotations, newAnnotation];\r\n      this.annotationCreated.emit(newAnnotation);\r\n\r\n      const sel = window.getSelection();\r\n      if (sel) sel.removeAllRanges();\r\n    }\r\n\r\n    this.showSelectionToolbar = false;\r\n    this.pendingSelection = null;\r\n  }\r\n\r\n  /**\r\n   * Handles click on an existing highlighted annotation to view/edit comment.\r\n   */\r\n  private handleAnnotationClick(annotationId: string, event: MouseEvent): void {\r\n    const annotation = this.annotations.find((a) => a.id === annotationId);\r\n    if (!annotation) return;\r\n\r\n    const targetEl = (event.target as HTMLElement).closest(\r\n      '.pdf-annotation-highlight',\r\n    ) as HTMLElement;\r\n    const rect = targetEl\r\n      ? targetEl.getBoundingClientRect()\r\n      : (event.target as HTMLElement).getBoundingClientRect();\r\n\r\n    this.openCommentBox(\r\n      annotation,\r\n      rect,\r\n      false,\r\n      annotation.selector.pageNumber,\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Opens the floating comment card in the right margin beside the PDF page (Pic 1).\r\n   */\r\n  private openCommentBox(\r\n    annotation: PDFAnnotation,\r\n    rect: DOMRect,\r\n    isNew: boolean,\r\n    pageNumber: number,\r\n  ): void {\r\n    this.activeCommentAnnotation = annotation;\r\n    this.isNewAnnotation = isNew;\r\n    this.isEditingComment = isNew;\r\n    this.commentInputText = annotation.comment || '';\r\n    this.commentReplyText = '';\r\n    this.showCommentMenu = false;\r\n    this.positionCommentBox(rect, pageNumber);\r\n    this.showCommentBox = true;\r\n  }\r\n\r\n  /**\r\n   * Calculates (top, left) coordinates for the comment card placed in the right margin beside the PDF page.\r\n   */\r\n  private positionCommentBox(rect: DOMRect, pageNumber: number): void {\r\n    const viewerEl = this.viewerContainer?.nativeElement;\r\n    if (!viewerEl) return;\r\n\r\n    const viewerRect = viewerEl.getBoundingClientRect();\r\n    const pageContainer = document.getElementById(\r\n      `page-container-${pageNumber}`,\r\n    );\r\n\r\n    let top = rect.top - viewerRect.top + viewerEl.scrollTop;\r\n    let left = 0;\r\n\r\n    if (pageContainer) {\r\n      const pageRect = pageContainer.getBoundingClientRect();\r\n      // Position cleanly in the right margin beside the PDF page (matching Pic 1)\r\n      left = pageRect.right - viewerRect.left + viewerEl.scrollLeft + 20;\r\n    } else {\r\n      left = rect.right - viewerRect.left + viewerEl.scrollLeft + 20;\r\n    }\r\n\r\n    // Ensure the card fits within the visible container width\r\n    const cardWidth = 340;\r\n    const availableWidth = viewerEl.clientWidth + viewerEl.scrollLeft;\r\n    if (left + cardWidth > availableWidth) {\r\n      left = Math.max(16, rect.left - viewerRect.left + viewerEl.scrollLeft);\r\n      top = rect.bottom - viewerRect.top + viewerEl.scrollTop + 8;\r\n    }\r\n\r\n    this.commentBoxPosition = {\r\n      top: Math.max(10, Math.round(top)),\r\n      left: Math.max(10, Math.round(left)),\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Formats timestamp for comment card e.g. \"5:46 PM Today\"\r\n   */\r\n  getFormattedCommentTime(isoString?: string): string {\r\n    const date = isoString ? new Date(isoString) : new Date();\r\n    const hours = date.getHours();\r\n    const minutes = date.getMinutes().toString().padStart(2, '0');\r\n    const ampm = hours >= 12 ? 'PM' : 'AM';\r\n    const formattedHours = hours % 12 || 12;\r\n    return `${formattedHours}:${minutes} ${ampm} Today`;\r\n  }\r\n\r\n  /**\r\n   * Toggles the dropdown menu for edit/delete on comment card header.\r\n   */\r\n  toggleCommentMenu(): void {\r\n    this.showCommentMenu = !this.showCommentMenu;\r\n  }\r\n\r\n  /**\r\n   * Resolves the annotation (checkmark action).\r\n   */\r\n  resolveAnnotation(): void {\r\n    this.deleteActiveAnnotation();\r\n  }\r\n\r\n  /**\r\n   * Submits reply text entered on existing comment card.\r\n   */\r\n  submitReply(): void {\r\n    if (!this.commentReplyText.trim() || !this.activeCommentAnnotation) return;\r\n\r\n    const reply = this.commentReplyText.trim();\r\n    this.activeCommentAnnotation.comment = this.activeCommentAnnotation.comment\r\n      ? `${this.activeCommentAnnotation.comment}\\n${reply}`\r\n      : reply;\r\n\r\n    this.commentReplyText = '';\r\n    this.annotationUpdated.emit(this.activeCommentAnnotation);\r\n  }\r\n\r\n  /**\r\n   * Saves the entered comment on the active annotation.\r\n   */\r\n  saveComment(): void {\r\n    if (!this.activeCommentAnnotation) return;\r\n\r\n    const trimmedComment = this.commentInputText.trim();\r\n    this.activeCommentAnnotation.comment = trimmedComment;\r\n\r\n    if (this.isNewAnnotation) {\r\n      this.annotationCreated.emit(this.activeCommentAnnotation);\r\n    } else {\r\n      this.annotationUpdated.emit(this.activeCommentAnnotation);\r\n    }\r\n\r\n    this.closeCommentBox();\r\n  }\r\n\r\n  /**\r\n   * Cancels comment input. If it was a newly created unsaved selection without comment,\r\n   * it removes the highlight from the page.\r\n   */\r\n  cancelComment(): void {\r\n    if (this.isNewAnnotation && this.activeCommentAnnotation) {\r\n      const annoId = this.activeCommentAnnotation.id;\r\n      const pageNum = this.activeCommentAnnotation.selector.pageNumber;\r\n      this.annotations = this.annotations.filter((a) => a.id !== annoId);\r\n\r\n      const textLayer = document.getElementById(\r\n        `textLayer${pageNum}`,\r\n      ) as HTMLElement;\r\n      if (textLayer) {\r\n        this.renderMainPageLazily(pageNum);\r\n      }\r\n    }\r\n\r\n    this.closeCommentBox();\r\n  }\r\n\r\n  /**\r\n   * Enters edit mode for an existing comment.\r\n   */\r\n  editComment(): void {\r\n    this.isEditingComment = true;\r\n    this.showCommentMenu = false;\r\n    this.commentInputText = this.activeCommentAnnotation?.comment || '';\r\n  }\r\n\r\n  /**\r\n   * Deletes the active annotation and re-renders visible highlights.\r\n   */\r\n  deleteActiveAnnotation(): void {\r\n    if (!this.activeCommentAnnotation) return;\r\n\r\n    const id = this.activeCommentAnnotation.id;\r\n    const pageNum = this.activeCommentAnnotation.selector.pageNumber;\r\n    this.annotations = this.annotations.filter((a) => a.id !== id);\r\n\r\n    const page = this.pages[pageNum - 1];\r\n    if (page && this.pdfDoc) {\r\n      page.rendered = false;\r\n      this.renderMainPageLazily(pageNum);\r\n    }\r\n\r\n    this.annotationDeleted.emit(id);\r\n    this.closeCommentBox();\r\n  }\r\n\r\n  /**\r\n   * Closes the floating comment card.\r\n   */\r\n  closeCommentBox(): void {\r\n    this.showCommentBox = false;\r\n    this.activeCommentAnnotation = null;\r\n    this.commentInputText = '';\r\n    this.commentReplyText = '';\r\n    this.isEditingComment = false;\r\n    this.isNewAnnotation = false;\r\n    this.showCommentMenu = false;\r\n  }\r\n\r\n  // ngAfterViewInit(): void {\r\n  //   // this.fileType = this.parentData?.file?.type;\r\n  //   // this.fileType = 'application/pdf';\r\n  //   // if (this.parentData?.file?.type == \"application/pdf\") {\r\n  //   if ( this.parentData.fileType === 'application/pdf' ||\r\n  // this.parentData.fileType === 'text/html') {\r\n  //     const fileUrl = this.parentData?.fileUrl;\r\n\r\n  //     // Check if it's a base64 string or a file URL\r\n  //     if (fileUrl.startsWith('data:application/pdf;base64,')) {\r\n  //       this.base64Url = fileUrl.replace(/^data:application\\/pdf;base64,/, '');\r\n  //       this.loadPdf(this.base64Url);\r\n  //     } else if (fileUrl.startsWith('/') || fileUrl.startsWith('http')) {\r\n  //       // It's a file URL, load it directly\r\n  //       this.loadPdfFromUrl(fileUrl);\r\n  //     } else {\r\n  //       // Assume it's a base64 string without the prefix\r\n  //       this.base64Url = fileUrl;\r\n  //       this.loadPdf(this.base64Url);\r\n  //     }\r\n  //   } else {\r\n  //  this.imgUrl = `data:${this.parentData?.fileType};base64,${this.parentData?.fileUrl}`;\r\n\r\n  //   }\r\n  // }\r\n\r\n  ngAfterViewInit(): void {\r\n    this.initializeDocument();\r\n  }\r\n\r\n  initializeDocument(): void {\r\n    if (!this.parentData) return;\r\n\r\n    // Reset document state on each document switch\r\n    this.pages = [];\r\n    this.pageThumbnails = [];\r\n    this.thumbnailDataUrls = [];\r\n    this.pdfOutline = [];\r\n    this.currentPage = 1;\r\n    this.inputPageNumber = 1;\r\n    this.searchResults = [];\r\n    this.currentSearchIndex = -1;\r\n    this.searchQuery = '';\r\n    this.pdfText = null;\r\n    this.clearDocxHighlights();\r\n\r\n    if (this.isDocxContent) {\r\n      this.loadDocx();\r\n    } else if (this.isPdfContent) {\r\n      this.loadPdfContent();\r\n    } else if (this.isHtmlContent) {\r\n      this.loadHtmlOrTextContent();\r\n    }\r\n  }\r\n\r\n  private loadPdfContent(): void {\r\n    let fileUrl = this.parentData?.fileUrl;\r\n    console.log(fileUrl, 'fileUrl');\r\n\r\n    // Extract string if it's a SafeResourceUrl\r\n    if (fileUrl && typeof fileUrl !== 'string' && !(fileUrl instanceof Blob)) {\r\n      fileUrl =\r\n        this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, fileUrl) ||\r\n        fileUrl;\r\n    }\r\n\r\n    // 1. Blob object\r\n    if (fileUrl instanceof Blob) {\r\n      console.log('1212121');\r\n      this.loadPdfFromBlob(fileUrl);\r\n    }\r\n    // 2. Blob URL  (e.g. blob:http://localhost/xxxxxxxx)\r\n    else if (typeof fileUrl === 'string' && fileUrl.startsWith('blob:')) {\r\n      this.loadPdfFromUrl(fileUrl);\r\n    }\r\n    // 3. Base64 data URI with prefix\r\n    else if (\r\n      typeof fileUrl === 'string' &&\r\n      fileUrl.startsWith('data:application/pdf;base64,')\r\n    ) {\r\n      this.base64Url = fileUrl.replace(/^data:application\\/pdf;base64,/, '');\r\n      this.loadPdf(this.base64Url);\r\n    }\r\n    // 4. HTTP / absolute path URL\r\n    else if (\r\n      typeof fileUrl === 'string' &&\r\n      (fileUrl.startsWith('/') || fileUrl.startsWith('http'))\r\n    ) {\r\n      this.loadPdfFromUrl(fileUrl);\r\n    }\r\n    // 5. Raw base64 string (no prefix)\r\n    else if (typeof fileUrl === 'string') {\r\n      this.base64Url = fileUrl;\r\n      this.loadPdf(this.base64Url);\r\n    }\r\n  }\r\n\r\n  async loadDocx(): Promise<void> {\r\n    try {\r\n      const fileUrl = this.parentData?.fileUrl;\r\n      const file = this.parentData?.file;\r\n      let buffer: ArrayBuffer | null = null;\r\n\r\n      if (file instanceof File || file instanceof Blob) {\r\n        buffer = await file.arrayBuffer();\r\n      } else if (fileUrl instanceof Blob) {\r\n        buffer = await fileUrl.arrayBuffer();\r\n      } else if (typeof fileUrl === 'string') {\r\n        const trimmed = fileUrl.trim();\r\n        if (trimmed.startsWith('data:')) {\r\n          const base64 = trimmed.split(',')[1];\r\n          const binary = atob(base64);\r\n          const len = binary.length;\r\n          const bytes = new Uint8Array(len);\r\n          for (let i = 0; i < len; i++) {\r\n            bytes[i] = binary.charCodeAt(i);\r\n          }\r\n          buffer = bytes.buffer;\r\n        } else {\r\n          const response = await fetch(trimmed);\r\n          if (!response.ok) {\r\n            throw new Error(`Failed to download DOCX (${response.statusText})`);\r\n          }\r\n          buffer = await response.arrayBuffer();\r\n        }\r\n      }\r\n\r\n      if (!buffer) return;\r\n\r\n      this.cdr.detectChanges();\r\n\r\n      // Ensure DOM is updated and container is resolved\r\n      await new Promise((resolve) => setTimeout(resolve, 0));\r\n\r\n      const container =\r\n        this.docxRenderContainer?.nativeElement ||\r\n        (document.querySelector('.docx-render-stage') as HTMLDivElement);\r\n\r\n      if (container) {\r\n        await this.renderDocxBuffer(buffer, container);\r\n      } else {\r\n        setTimeout(async () => {\r\n          const retryContainer =\r\n            this.docxRenderContainer?.nativeElement ||\r\n            (document.querySelector('.docx-render-stage') as HTMLDivElement);\r\n          if (retryContainer) {\r\n            await this.renderDocxBuffer(buffer!, retryContainer);\r\n          }\r\n        }, 50);\r\n      }\r\n    } catch (error) {\r\n      console.error('Error loading DOCX content:', error);\r\n    }\r\n  }\r\n\r\n  private async renderDocxBuffer(\r\n    buffer: ArrayBuffer,\r\n    container: HTMLDivElement,\r\n  ): Promise<void> {\r\n    container.innerHTML = '';\r\n    await docx.renderAsync(buffer, container, undefined, {\r\n      className: 'docx',\r\n      inWrapper: true,\r\n      ignoreWidth: false,\r\n      ignoreHeight: false,\r\n      ignoreFonts: false,\r\n      breakPages: true,\r\n      ignoreLastRenderedPageBreak: false,\r\n      renderHeaders: true,\r\n      renderFooters: true,\r\n      renderFootnotes: true,\r\n      renderEndnotes: true,\r\n      useBase64URL: true,\r\n    });\r\n\r\n    // Wait for layout engine to calculate element heights\r\n    await new Promise((resolve) => setTimeout(resolve, 30));\r\n\r\n    // Auto-paginate into discrete A4 pages if content exceeds single page height\r\n    this.autoPaginateDocx(container);\r\n\r\n    this.totalPages =\r\n      container.querySelectorAll('.docx-wrapper > section.docx').length || 1;\r\n    this.currentPage = 1;\r\n    this.inputPageNumber = 1;\r\n\r\n    if (this.searchQuery && this.searchQuery.trim()) {\r\n      this.executeDocxSearch(this.searchQuery);\r\n    }\r\n\r\n    this.ngZone.run(() => {\r\n      this.cdr.detectChanges();\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Splits overflowing DOCX content into discrete visual A4 page cards\r\n   */\r\n  private autoPaginateDocx(container: HTMLDivElement): void {\r\n    const wrapper = container.querySelector('.docx-wrapper');\r\n    if (!wrapper) return;\r\n\r\n    const sections = Array.from(\r\n      wrapper.querySelectorAll('section.docx'),\r\n    ) as HTMLElement[];\r\n    const PAGE_HEIGHT_PX = 1056; // Standard A4 page height (approx 11in @ 96 DPI)\r\n\r\n    for (const section of sections) {\r\n      const article =\r\n        (section.querySelector('article') as HTMLElement) || section;\r\n      const elements = Array.from(article.children) as HTMLElement[];\r\n\r\n      if (elements.length <= 1) continue;\r\n\r\n      const style = window.getComputedStyle(section);\r\n      const padTop = parseFloat(style.paddingTop) || 72;\r\n      const padBottom = parseFloat(style.paddingBottom) || 72;\r\n      const usableHeight = Math.max(PAGE_HEIGHT_PX - padTop - padBottom, 700);\r\n\r\n      const totalContentHeight = elements.reduce((acc, el) => {\r\n        const elStyle = window.getComputedStyle(el);\r\n        const marginY =\r\n          (parseFloat(elStyle.marginTop) || 0) +\r\n          (parseFloat(elStyle.marginBottom) || 0);\r\n        return acc + (el.offsetHeight || 24) + marginY;\r\n      }, 0);\r\n\r\n      if (\r\n        totalContentHeight <= usableHeight &&\r\n        section.scrollHeight <= PAGE_HEIGHT_PX + 40\r\n      ) {\r\n        continue;\r\n      }\r\n\r\n      const pageGroups: HTMLElement[][] = [[]];\r\n      let currentHeight = 0;\r\n      let pageIdx = 0;\r\n\r\n      for (const el of elements) {\r\n        const elStyle = window.getComputedStyle(el);\r\n        const marginY =\r\n          (parseFloat(elStyle.marginTop) || 0) +\r\n          (parseFloat(elStyle.marginBottom) || 0);\r\n        const elHeight = (el.offsetHeight || 24) + marginY;\r\n\r\n        if (\r\n          currentHeight + elHeight > usableHeight &&\r\n          pageGroups[pageIdx].length > 0\r\n        ) {\r\n          pageIdx++;\r\n          pageGroups[pageIdx] = [];\r\n          currentHeight = 0;\r\n        }\r\n        pageGroups[pageIdx].push(el);\r\n        currentHeight += elHeight;\r\n      }\r\n\r\n      if (pageGroups.length > 1) {\r\n        article.innerHTML = '';\r\n        pageGroups[0].forEach((el) => article.appendChild(el));\r\n\r\n        let currentSectionRef = section;\r\n        for (let i = 1; i < pageGroups.length; i++) {\r\n          const newSection = section.cloneNode(false) as HTMLElement;\r\n          const newArticle = article.cloneNode(false) as HTMLElement;\r\n          pageGroups[i].forEach((el) => newArticle.appendChild(el));\r\n          newSection.appendChild(newArticle);\r\n\r\n          currentSectionRef.after(newSection);\r\n          currentSectionRef = newSection;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  onDocxScroll(event: any): void {\r\n    const viewer = event?.target as HTMLElement;\r\n    if (!viewer) return;\r\n\r\n    const sections = Array.from(\r\n      viewer.querySelectorAll('.docx-wrapper > section.docx'),\r\n    ) as HTMLElement[];\r\n    const viewerRect = viewer.getBoundingClientRect();\r\n\r\n    for (let i = 0; i < sections.length; i++) {\r\n      const rect = sections[i].getBoundingClientRect();\r\n      if (\r\n        rect.top <= viewerRect.top + viewerRect.height / 3 &&\r\n        rect.bottom >= viewerRect.top + 50\r\n      ) {\r\n        const pageNum = i + 1;\r\n        if (this.currentPage !== pageNum) {\r\n          this.currentPage = pageNum;\r\n          this.inputPageNumber = pageNum;\r\n          this.cdr.detectChanges();\r\n        }\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  async loadPdfFromBlob(blob: Blob) {\r\n    try {\r\n      const blobUrl = URL.createObjectURL(blob);\r\n\r\n      const loadingTask = pdfjsLib.getDocument(blobUrl);\r\n\r\n      this.pdfDoc = await loadingTask.promise;\r\n      this.pdfDoc1 = this.pdfDoc;\r\n      this.pdfDoc2 = this.pdfDoc;\r\n\r\n      this.totalPages = this.pdfDoc.numPages;\r\n      this.loadPdfOutline();\r\n      this.pdfText = await this.extractTextFromPdf();\r\n\r\n      this.pages = [];\r\n\r\n      for (let i = 1; i <= this.totalPages; i++) {\r\n        this.pages.push({\r\n          pageNumber: i,\r\n          rendered: false,\r\n        });\r\n      }\r\n\r\n      this.renderAllThumbnails();\r\n\r\n      this.currentPage = 1;\r\n      this.inputPageNumber = 1;\r\n      this.isManualNavigation = true;\r\n\r\n      setTimeout(() => {\r\n        this.setupIntersectionObserver();\r\n      }, 100);\r\n\r\n      setTimeout(() => {\r\n        this.currentPage = 1;\r\n        this.inputPageNumber = 1;\r\n        this.isManualNavigation = false;\r\n        this.syncThumbnailSidebar();\r\n        this.cdr.detectChanges();\r\n\r\n        // Release Blob URL after loading\r\n        URL.revokeObjectURL(blobUrl);\r\n      }, 1500);\r\n    } catch (error) {\r\n      console.error('Error loading PDF from Blob:', error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Asynchronously loads a PDF document from a URL and performs\r\n   * various operations on the loaded document, such as extracting text and\r\n   * rendering thumbnails.\r\n   *\r\n   * @param {string} url - The URL of the PDF document.\r\n   * @return {Promise<void>} A promise that resolves when the PDF document has\r\n   * been successfully loaded and processed.\r\n   */\r\n  async loadPdfFromUrl(url: string) {\r\n    try {\r\n      const loadingTask = pdfjsLib.getDocument(url);\r\n      this.pdfDoc = await loadingTask.promise;\r\n      this.pdfDoc1 = await loadingTask.promise;\r\n      this.pdfDoc2 = await loadingTask.promise;\r\n      this.totalPages = this.pdfDoc.numPages;\r\n      this.loadPdfOutline();\r\n      this.pdfText = await this.extractTextFromPdf();\r\n      // Populate the pages array (you can structure this data as needed)\r\n      for (let i = 1; i <= this.totalPages; i++) {\r\n        this.pages.push({ pageNumber: i, rendered: false });\r\n      }\r\n      this.renderAllThumbnails();\r\n\r\n      // ── Initial-load guard ──────────────────────────────────────────────\r\n      // Lock manual-navigation so the IntersectionObserver's first batch of\r\n      // callbacks (which fire for EVERY page simultaneously because all\r\n      // page-containers have zero height before the canvas is rendered)\r\n      // cannot overwrite currentPage away from 1.\r\n      this.currentPage = 1;\r\n      this.inputPageNumber = 1;\r\n      this.isManualNavigation = true;\r\n      // ────────────────────────────────────────────────────────────────────\r\n\r\n      setTimeout(() => {\r\n        this.setupIntersectionObserver();\r\n      }, 100);\r\n\r\n      // Release the guard after the observer's initial-fire window has\r\n      // fully settled, then snap the sidebar to page 1.\r\n      setTimeout(() => {\r\n        this.currentPage = 1;\r\n        this.inputPageNumber = 1;\r\n        this.isManualNavigation = false;\r\n        this.syncThumbnailSidebar();\r\n        this.cdr.detectChanges();\r\n      }, 1500);\r\n    } catch (error) {\r\n      console.error('Error loading PDF from URL:', error);\r\n    }\r\n  }\r\n\r\n  async loadPdf(base64Url: string) {\r\n    try {\r\n      const binaryString = atob(base64Url);\r\n      const pdfData = new Uint8Array(binaryString.length);\r\n\r\n      for (let i = 0; i < binaryString.length; i++) {\r\n        pdfData[i] = binaryString.charCodeAt(i);\r\n      }\r\n\r\n      const loadingTask = pdfjsLib.getDocument({ data: pdfData });\r\n      this.pdfDoc = await loadingTask.promise;\r\n      this.pdfDoc1 = await loadingTask.promise;\r\n      this.pdfDoc2 = await loadingTask.promise;\r\n      this.totalPages = this.pdfDoc.numPages;\r\n      this.loadPdfOutline();\r\n      this.pdfText = await this.extractTextFromPdf();\r\n      // Populate the pages array (you can structure this data as needed)\r\n      for (let i = 1; i <= this.totalPages; i++) {\r\n        this.pages.push({ pageNumber: i, rendered: false });\r\n      }\r\n      this.renderAllThumbnails();\r\n\r\n      // ── Initial-load guard ──────────────────────────────────────────────\r\n      // Lock manual-navigation so the IntersectionObserver's first batch of\r\n      // callbacks (which fire for EVERY page simultaneously because all\r\n      // page-containers have zero height before the canvas is rendered)\r\n      // cannot overwrite currentPage away from 1.\r\n      this.currentPage = 1;\r\n      this.inputPageNumber = 1;\r\n      this.isManualNavigation = true;\r\n      // ────────────────────────────────────────────────────────────────────\r\n\r\n      setTimeout(() => {\r\n        this.setupIntersectionObserver();\r\n      }, 100);\r\n\r\n      // Release the guard after the observer's initial-fire window has\r\n      // fully settled, then snap the sidebar to page 1.\r\n      setTimeout(() => {\r\n        this.currentPage = 1;\r\n        this.inputPageNumber = 1;\r\n        this.isManualNavigation = false;\r\n        this.syncThumbnailSidebar();\r\n        this.cdr.detectChanges();\r\n      }, 1500);\r\n    } catch (error) {\r\n      console.error('Error loading PDF:', error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Prevents the default behavior of the right-click event.\r\n   *\r\n   * @param {MouseEvent} event - The right-click event.\r\n   */\r\n  disableRightClick(event: MouseEvent) {\r\n    event.preventDefault();\r\n  }\r\n  // Extract text from all pages\r\n  async extractTextFromPdf() {\r\n    const textPages: any[] = []; // Store text items instead of concatenated strings\r\n    for (let i = 1; i <= this.totalPages; i++) {\r\n      const page = await this.pdfDoc!.getPage(i);\r\n\r\n      // Try extracting text with additional options\r\n      const textContent = await page.getTextContent({\r\n        disableNormalization: false, // Keep text normalization enabled\r\n        includeMarkedContent: true, // Extract hidden/marked content\r\n      });\r\n\r\n      if (textContent.items.length === 0) {\r\n        console.warn(`No text found on page ${i}`);\r\n      }\r\n\r\n      // Store the actual text items for more accurate search and highlighting\r\n      textPages.push(textContent.items);\r\n    }\r\n    return textPages;\r\n  }\r\n\r\n  /**\r\n   * Renders all PDF page thumbnails for the sidebar.\r\n   * Clears existing thumbnails and renders new ones for each page.\r\n   * Each thumbnail is a small preview of the page.\r\n   *\r\n   * @returns {Promise<void>} Promise that resolves when all thumbnails are rendered.\r\n   */\r\n  async renderAllThumbnails() {\r\n    this.pageThumbnails = []; // Clear existing thumbnails\r\n    this.thumbnailDataUrls = []; // Clear existing data URLs\r\n\r\n    const thumbnailScale = this._appConstants.thumbnailScale; // Adjust scale for small previews\r\n\r\n    for (let i = 1; i <= this.totalPages; i++) {\r\n      try {\r\n        const page: PDFPageProxy = await this.pdfDoc!.getPage(i);\r\n        const viewport = page.getViewport({ scale: thumbnailScale });\r\n        const thumbnailCanvas = document.createElement('canvas');\r\n        const context = thumbnailCanvas.getContext('2d');\r\n\r\n        const width = Math.floor(viewport.width);\r\n        const height = Math.floor(viewport.height);\r\n        if (context) {\r\n          thumbnailCanvas.width = width > 0 ? width : 1;\r\n          thumbnailCanvas.height = height > 0 ? height : 1;\r\n\r\n          // Fill with white background\r\n          context.fillStyle = '#ffffff';\r\n          context.fillRect(0, 0, width, height);\r\n\r\n          // Render the page content into the thumbnail canvas\r\n          await page.render({\r\n            canvas: thumbnailCanvas,\r\n            canvasContext: context,\r\n            viewport,\r\n          }).promise;\r\n\r\n          // Store the rendered canvas as a preview for the sidebar\r\n          this.pageThumbnails.push(thumbnailCanvas);\r\n\r\n          // Convert canvas to data URL for easier display\r\n          const dataUrl = thumbnailCanvas.toDataURL('image/png');\r\n          this.thumbnailDataUrls.push(dataUrl);\r\n          this.cdr.detectChanges();\r\n        }\r\n      } catch (error) {\r\n        console.error('Error rendering thumbnail for page', i, ':', error);\r\n      }\r\n    }\r\n\r\n    // Trigger change detection to update the view\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  /**\r\n   * Navigates to the entered page number.\r\n   * If the entered page number is less than 1, it sets the input page number to null and the value to null.\r\n   * If the entered page number is greater than the total number of pages, it sets the input page number to null and the value to null.\r\n   * If the entered page number is between 1 and the total number of pages, it sets the input page number to the entered value.\r\n   * It then converts the input page number to an integer page number.\r\n   * If the page number is between 1 and the total number of pages, it checks if multi-view is enabled.\r\n   * If multi-view is enabled:\r\n   *   - Determines if the page number is even or odd.\r\n   *   - Sets pageNum1 and pageNum2 accordingly.\r\n   *   - Renders the pages at pageNum1 and pageNum2.\r\n   * If multi-view is not enabled:\r\n   *   - Sets the current page to the page number.\r\n   *   - Renders the page at the current page.\r\n   *\r\n   * @param {any} value - The entered page number.\r\n   */\r\n  goToEnteredPage(value: any) {\r\n    // Parse the value to integer first\r\n    const pageNumber = parseInt(value, 10);\r\n\r\n    if (isNaN(pageNumber) || pageNumber < 1) {\r\n      // Clamp to first page instead of setting to null\r\n      this.inputPageNumber = 1;\r\n      this.currentPage = 1;\r\n      this.goToPage(this.currentPage, null);\r\n      return;\r\n    } else if (pageNumber > this.totalPages) {\r\n      // Clamp to last page instead of setting to null\r\n      this.inputPageNumber = this.totalPages;\r\n      this.currentPage = this.totalPages;\r\n      this.goToPage(this.currentPage, null);\r\n      return;\r\n    } else {\r\n      this.inputPageNumber = pageNumber;\r\n    }\r\n\r\n    if (pageNumber >= 1 && pageNumber <= this.totalPages) {\r\n      this.currentPage = pageNumber;\r\n      // Use goToPage to handle both multi-view and continuous scroll\r\n      this.goToPage(this.currentPage, null);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Validates the page number input by the user.\r\n   *\r\n   * @param {any} event - The event object containing the input element.\r\n   * @return {void}\r\n   */\r\n  validatePageNumber(event: any): void {\r\n    const input = event.target;\r\n    const value = input.value;\r\n\r\n    // Only validate if there's a value\r\n    if (value === '' || value === null || value === undefined) {\r\n      return;\r\n    }\r\n\r\n    const parsedValue = parseInt(value, 10);\r\n\r\n    // Only restrict if the value is complete and out of range\r\n    if (!isNaN(parsedValue)) {\r\n      if (parsedValue < 1) {\r\n        // Don't reset during typing, just let it be\r\n        // input.value = null;\r\n      } else if (parsedValue > this.totalPages) {\r\n        // Don't reset during typing, just let it be\r\n        // input.value = null;\r\n      }\r\n    }\r\n\r\n    // Don't update the bound value during typing\r\n    // this.inputPageNumber = input.value;\r\n  }\r\n\r\n  // ── SEARCH UI & EXECUTION HANDLERS ─────────────────────────────────────\r\n\r\n  toggleSearchPanel(): void {\r\n    if (this.isSearchPanelVisible) {\r\n      this.closeFindBar();\r\n    } else {\r\n      this.isSearchPanelVisible = true;\r\n      this.isFindBarCollapsed = false;\r\n      this.cdr.detectChanges();\r\n      setTimeout(() => {\r\n        const input = document.getElementById('find-input') as HTMLInputElement;\r\n        input?.focus();\r\n        input?.select();\r\n      }, 100);\r\n    }\r\n  }\r\n\r\n  toggleFindCollapse(): void {\r\n    this.isFindBarCollapsed = !this.isFindBarCollapsed;\r\n  }\r\n\r\n  toggleMatchCase(): void {\r\n    this.matchCase = !this.matchCase;\r\n    if (this.searchQuery) {\r\n      this.executeSearch(this.searchQuery);\r\n    }\r\n  }\r\n\r\n  toggleWholeWord(): void {\r\n    this.wholeWord = !this.wholeWord;\r\n    if (this.searchQuery) {\r\n      this.executeSearch(this.searchQuery);\r\n    }\r\n  }\r\n\r\n  toggleUseRegex(): void {\r\n    this.useRegex = !this.useRegex;\r\n    if (this.searchQuery) {\r\n      this.executeSearch(this.searchQuery);\r\n    }\r\n  }\r\n\r\n  closeFindBar(): void {\r\n    this.searchQuery = '';\r\n    this.searchResults = [];\r\n    this.currentSearchIndex = -1;\r\n    this.findCountText = 'No results';\r\n    this.isSearchPanelVisible = false;\r\n    if (this.isDocxContent) {\r\n      this.clearDocxHighlights();\r\n    } else {\r\n      this.reRenderForSearch();\r\n    }\r\n  }\r\n\r\n  onFindInput(value: string): void {\r\n    this.searchQuery = value;\r\n    if (this.searchTimeout) {\r\n      clearTimeout(this.searchTimeout);\r\n    }\r\n    if (!value || !value.trim()) {\r\n      this.searchResults = [];\r\n      this.currentSearchIndex = -1;\r\n      this.findCountText = 'No results';\r\n      if (this.isDocxContent) {\r\n        this.clearDocxHighlights();\r\n      } else {\r\n        this.reRenderForSearch();\r\n      }\r\n      return;\r\n    }\r\n    this.searchTimeout = setTimeout(() => {\r\n      this.executeSearch(value);\r\n    }, 150);\r\n  }\r\n\r\n  executeSearch(query: string): void {\r\n    if (this.isDocxContent) {\r\n      this.executeDocxSearch(query);\r\n      return;\r\n    }\r\n\r\n    if (!query || !query.trim() || !this.pdfText || !this.pdfText.length) {\r\n      this.searchResults = [];\r\n      this.currentSearchIndex = -1;\r\n      this.findCountText = 'No results';\r\n      this.reRenderForSearch();\r\n      return;\r\n    }\r\n\r\n    const results: Array<{\r\n      page: number;\r\n      itemIndex: number;\r\n      matchIndex: number;\r\n      length: number;\r\n      text: string;\r\n    }> = [];\r\n\r\n    let regex: RegExp;\r\n    try {\r\n      let pattern = query;\r\n      if (!this.useRegex) {\r\n        pattern = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n      }\r\n      if (this.wholeWord) {\r\n        pattern = `\\\\b${pattern}\\\\b`;\r\n      }\r\n      const flags = this.matchCase ? 'g' : 'gi';\r\n      regex = new RegExp(pattern, flags);\r\n    } catch {\r\n      const flags = this.matchCase ? 'g' : 'gi';\r\n      const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n      regex = new RegExp(escaped, flags);\r\n    }\r\n\r\n    this.pdfText.forEach((pageItems: any[], pageIndex: number) => {\r\n      const pageNumber = pageIndex + 1;\r\n      if (!Array.isArray(pageItems)) return;\r\n\r\n      pageItems.forEach((item: any, itemIndex: number) => {\r\n        const text = item.str || '';\r\n        if (!text) return;\r\n\r\n        regex.lastIndex = 0;\r\n        let match: RegExpExecArray | null;\r\n        while ((match = regex.exec(text)) !== null) {\r\n          results.push({\r\n            page: pageNumber,\r\n            itemIndex: itemIndex,\r\n            matchIndex: match.index,\r\n            length: match[0].length || 1,\r\n            text: text,\r\n          });\r\n          if (!regex.global || match[0].length === 0) {\r\n            regex.lastIndex++;\r\n            if (!regex.global) break;\r\n          }\r\n        }\r\n      });\r\n    });\r\n\r\n    this.searchResults = results;\r\n\r\n    if (results.length > 0) {\r\n      this.currentSearchIndex = 0;\r\n      this.findCountText = `1 of ${results.length}`;\r\n      this.goToSearchResult(0, true);\r\n    } else {\r\n      this.currentSearchIndex = -1;\r\n      this.findCountText = 'No results';\r\n      this.reRenderForSearch();\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  private clearDocxHighlights(): void {\r\n    const container =\r\n      this.docxRenderContainer?.nativeElement ||\r\n      (document.querySelector('.docx-render-stage') as HTMLElement);\r\n    if (!container) return;\r\n\r\n    const marks = Array.from(\r\n      container.querySelectorAll('.docx-search-highlight'),\r\n    );\r\n    marks.forEach((mark) => {\r\n      const parent = mark.parentNode;\r\n      if (parent) {\r\n        const textNode = document.createTextNode(mark.textContent || '');\r\n        parent.replaceChild(textNode, mark);\r\n        parent.normalize();\r\n      }\r\n    });\r\n  }\r\n\r\n  private executeDocxSearch(query: string): void {\r\n    this.clearDocxHighlights();\r\n\r\n    const container =\r\n      this.docxRenderContainer?.nativeElement ||\r\n      (document.querySelector('.docx-render-stage') as HTMLElement);\r\n\r\n    if (!container || !query || !query.trim()) {\r\n      this.searchResults = [];\r\n      this.currentSearchIndex = -1;\r\n      this.findCountText = 'No results';\r\n      this.cdr.detectChanges();\r\n      return;\r\n    }\r\n\r\n    let regex: RegExp;\r\n    try {\r\n      let pattern = query;\r\n      if (!this.useRegex) {\r\n        pattern = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n      }\r\n      if (this.wholeWord) {\r\n        pattern = `\\\\b${pattern}\\\\b`;\r\n      }\r\n      const flags = this.matchCase ? 'g' : 'gi';\r\n      regex = new RegExp(pattern, flags);\r\n    } catch {\r\n      const flags = this.matchCase ? 'g' : 'gi';\r\n      const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n      regex = new RegExp(escaped, flags);\r\n    }\r\n\r\n    const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, {\r\n      acceptNode: (node: Node) => {\r\n        if (!node.textContent || !node.textContent.trim()) {\r\n          return NodeFilter.FILTER_REJECT;\r\n        }\r\n        const parent = node.parentElement;\r\n        if (\r\n          !parent ||\r\n          parent.closest('.docx-search-highlight') ||\r\n          parent.tagName === 'SCRIPT' ||\r\n          parent.tagName === 'STYLE'\r\n        ) {\r\n          return NodeFilter.FILTER_REJECT;\r\n        }\r\n        return NodeFilter.FILTER_ACCEPT;\r\n      },\r\n    });\r\n\r\n    const textNodes: Text[] = [];\r\n    let currentNode: Node | null = walker.nextNode();\r\n    while (currentNode) {\r\n      textNodes.push(currentNode as Text);\r\n      currentNode = walker.nextNode();\r\n    }\r\n\r\n    const sections = Array.from(\r\n      container.querySelectorAll('.docx-wrapper > section.docx'),\r\n    ) as HTMLElement[];\r\n    const results: Array<{\r\n      page: number;\r\n      element: HTMLElement;\r\n      text: string;\r\n    }> = [];\r\n\r\n    for (const node of textNodes) {\r\n      const text = node.textContent || '';\r\n      regex.lastIndex = 0;\r\n\r\n      const matches: Array<{ start: number; end: number; text: string }> = [];\r\n      let match: RegExpExecArray | null;\r\n      while ((match = regex.exec(text)) !== null) {\r\n        matches.push({\r\n          start: match.index,\r\n          end: match.index + match[0].length,\r\n          text: match[0],\r\n        });\r\n        if (!regex.global || match[0].length === 0) {\r\n          regex.lastIndex++;\r\n          if (!regex.global) break;\r\n        }\r\n      }\r\n\r\n      if (matches.length === 0) continue;\r\n\r\n      let pageNum = 1;\r\n      const parentSection = node.parentElement?.closest(\r\n        'section.docx',\r\n      ) as HTMLElement;\r\n      if (parentSection) {\r\n        const idx = sections.indexOf(parentSection);\r\n        if (idx >= 0) pageNum = idx + 1;\r\n      }\r\n\r\n      const parent = node.parentNode;\r\n      if (!parent) continue;\r\n\r\n      const currentTextNode: Text = node;\r\n      const nodeMarks: Array<{\r\n        page: number;\r\n        element: HTMLElement;\r\n        text: string;\r\n      }> = [];\r\n      for (let i = matches.length - 1; i >= 0; i--) {\r\n        const m = matches[i];\r\n        const afterText = currentTextNode.splitText(m.start);\r\n        const remainingText = afterText.splitText(m.end - m.start);\r\n\r\n        const mark = document.createElement('mark');\r\n        mark.className = 'docx-search-highlight';\r\n        mark.style.backgroundColor = 'rgba(255, 220, 0, 0.45)';\r\n        mark.style.color = 'inherit';\r\n        mark.textContent = afterText.textContent;\r\n\r\n        parent.replaceChild(mark, afterText);\r\n        nodeMarks.unshift({\r\n          page: pageNum,\r\n          element: mark,\r\n          text: m.text,\r\n        });\r\n      }\r\n      results.push(...nodeMarks);\r\n    }\r\n\r\n    this.searchResults = results as any;\r\n\r\n    if (results.length > 0) {\r\n      this.currentSearchIndex = 0;\r\n      this.findCountText = `1 of ${results.length}`;\r\n      this.goToDocxSearchResult(0);\r\n    } else {\r\n      this.currentSearchIndex = -1;\r\n      this.findCountText = 'No results';\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  private goToDocxSearchResult(index: number): void {\r\n    if (!this.searchResults || index < 0 || index >= this.searchResults.length)\r\n      return;\r\n\r\n    this.currentSearchIndex = index;\r\n    this.findCountText = `${index + 1} of ${this.searchResults.length}`;\r\n\r\n    const container =\r\n      this.docxRenderContainer?.nativeElement ||\r\n      (document.querySelector('.docx-render-stage') as HTMLElement);\r\n    if (container) {\r\n      container.querySelectorAll('.docx-search-highlight').forEach((el) => {\r\n        el.classList.remove('current');\r\n        (el as HTMLElement).style.backgroundColor = 'rgba(255, 220, 0, 0.45)';\r\n        (el as HTMLElement).style.color = 'inherit';\r\n        (el as HTMLElement).style.outline = 'none';\r\n      });\r\n    }\r\n\r\n    const result = this.searchResults[index] as any;\r\n    if (result?.element) {\r\n      result.element.classList.add('current');\r\n      result.element.style.backgroundColor = 'rgba(255, 153, 0, 0.65)';\r\n      result.element.style.color = 'inherit';\r\n      result.element.style.outline = 'none';\r\n\r\n      const docxViewer = document.querySelector('.docx-viewer') as HTMLElement;\r\n      if (docxViewer) {\r\n        const viewerRect = docxViewer.getBoundingClientRect();\r\n        const elRect = result.element.getBoundingClientRect();\r\n        const scrollOffset =\r\n          elRect.top -\r\n          viewerRect.top +\r\n          docxViewer.scrollTop -\r\n          viewerRect.height / 2;\r\n        docxViewer.scrollTo({\r\n          top: Math.max(0, scrollOffset),\r\n          behavior: 'smooth',\r\n        });\r\n      } else {\r\n        result.element.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n      }\r\n\r\n      if (result.page) {\r\n        this.currentPage = result.page;\r\n        this.inputPageNumber = result.page;\r\n      }\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  goToSearchResult(index: number, activeStatus = true): void {\r\n    if (this.isDocxContent) {\r\n      this.goToDocxSearchResult(index);\r\n      return;\r\n    }\r\n    if (\r\n      !this.searchResults.length ||\r\n      index < 0 ||\r\n      index >= this.searchResults.length\r\n    )\r\n      return;\r\n    this.currentSearchIndex = index;\r\n    this.findCountText = `${index + 1} of ${this.searchResults.length}`;\r\n    const target = this.searchResults[index];\r\n    this.goToPage(target.page, activeStatus);\r\n    this.reRenderForSearch();\r\n  }\r\n\r\n  findNext(): void {\r\n    if (!this.searchResults.length) return;\r\n    this.currentSearchIndex =\r\n      (this.currentSearchIndex + 1) % this.searchResults.length;\r\n    if (this.isDocxContent) {\r\n      this.goToDocxSearchResult(this.currentSearchIndex);\r\n    } else {\r\n      this.goToSearchResult(this.currentSearchIndex, true);\r\n    }\r\n  }\r\n\r\n  findPrev(): void {\r\n    if (!this.searchResults.length) return;\r\n    this.currentSearchIndex =\r\n      (this.currentSearchIndex - 1 + this.searchResults.length) %\r\n      this.searchResults.length;\r\n    if (this.isDocxContent) {\r\n      this.goToDocxSearchResult(this.currentSearchIndex);\r\n    } else {\r\n      this.goToSearchResult(this.currentSearchIndex, true);\r\n    }\r\n  }\r\n\r\n  reRenderForSearch(): void {\r\n    this.pages.forEach((p, idx) => {\r\n      const pageNum = idx + 1;\r\n      const canvas = document.getElementById(\r\n        `pageCanvas${pageNum}`,\r\n      ) as HTMLCanvasElement;\r\n      if (canvas && this.pdfDoc && p.rendered) {\r\n        const activeSearch =\r\n          this.searchResults &&\r\n          this.searchResults.length > 0 &&\r\n          !!this.searchQuery;\r\n        this.renderPageAndAnnotations(pageNum, canvas, activeSearch).then(\r\n          (coordinates) => {\r\n            if (\r\n              coordinates &&\r\n              this.searchResults[this.currentSearchIndex]?.page === pageNum\r\n            ) {\r\n              this.activeMatchCoordinates = coordinates;\r\n            }\r\n          },\r\n        );\r\n      }\r\n    });\r\n  }\r\n\r\n  onFindKeydown(event: KeyboardEvent, input: HTMLInputElement): void {\r\n    if (event.altKey && event.key.toLowerCase() === 'c') {\r\n      event.preventDefault();\r\n      this.toggleMatchCase();\r\n    } else if (event.altKey && event.key.toLowerCase() === 'w') {\r\n      event.preventDefault();\r\n      this.toggleWholeWord();\r\n    } else if (event.altKey && event.key.toLowerCase() === 'r') {\r\n      event.preventDefault();\r\n      this.toggleUseRegex();\r\n    } else if (event.key === 'Enter') {\r\n      event.preventDefault();\r\n      if (event.shiftKey) {\r\n        this.findPrev();\r\n      } else {\r\n        this.findNext();\r\n      }\r\n    } else if (event.key === 'Escape') {\r\n      this.closeFindBar();\r\n    } else if (event.key === 'ArrowUp' && input.selectionStart === 0) {\r\n      if (this.findHistory.length) {\r\n        event.preventDefault();\r\n        this.historyIndex = Math.max(0, this.historyIndex - 1);\r\n        this.searchQuery = this.findHistory[this.historyIndex] || '';\r\n        this.executeSearch(this.searchQuery);\r\n      }\r\n    } else if (event.key === 'ArrowDown') {\r\n      if (\r\n        this.findHistory.length &&\r\n        this.historyIndex < this.findHistory.length - 1\r\n      ) {\r\n        event.preventDefault();\r\n        this.historyIndex++;\r\n        this.searchQuery = this.findHistory[this.historyIndex] || '';\r\n        this.executeSearch(this.searchQuery);\r\n      }\r\n    }\r\n  }\r\n\r\n  onFindChange(value: string): void {\r\n    if (value && this.findHistory[this.findHistory.length - 1] !== value) {\r\n      this.findHistory.push(value);\r\n      this.historyIndex = this.findHistory.length;\r\n    }\r\n  }\r\n\r\n  @HostListener('window:keydown', ['$event'])\r\n  onWindowKeydown(e: KeyboardEvent): void {\r\n    if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'f') {\r\n      e.preventDefault();\r\n      this.isSearchPanelVisible = true;\r\n      this.isFindBarCollapsed = false;\r\n      this.cdr.detectChanges();\r\n      setTimeout(() => {\r\n        const input = document.getElementById('find-input') as HTMLInputElement;\r\n        if (input) {\r\n          input.focus();\r\n          input.select();\r\n        }\r\n      }, 100);\r\n    }\r\n  }\r\n  /**\r\n   * Navigates to the specified page in the PDF document.\r\n   *\r\n   * @param pageNavigation - The page navigation action to perform.\r\n   * Must be one of 'previousPage', 'nextPage', 'firstPage', or 'lastPage'.\r\n   * If none of the cases match, the function does nothing.\r\n   */\r\n  pageNavigation(pageNavigation: any) {\r\n    switch (pageNavigation) {\r\n      case 'previousPage':\r\n        if (this.currentPage > 1) {\r\n          this.currentPage--;\r\n          this.goToPage(this.currentPage, null);\r\n          this.inputPageNumber = this.currentPage;\r\n        }\r\n        break;\r\n      case 'nextPage':\r\n        if (this.currentPage < this.totalPages) {\r\n          this.currentPage++;\r\n          this.goToPage(this.currentPage, null);\r\n          this.inputPageNumber = this.currentPage;\r\n        }\r\n        break;\r\n      case 'firstPage':\r\n        if (this.totalPages > 0) {\r\n          this.currentPage = 1;\r\n          this.goToPage(this.currentPage, null);\r\n          this.inputPageNumber = this.currentPage;\r\n        }\r\n        break;\r\n      case 'lastPage':\r\n        if (this.totalPages > 0) {\r\n          this.currentPage = this.totalPages;\r\n          this.goToPage(this.currentPage, null);\r\n          this.inputPageNumber = this.currentPage;\r\n        }\r\n        break;\r\n      default:\r\n      // Code to execute if none of the cases match\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Navigates to the specified page number, rendering the page in the viewer.\r\n   * If multi-view mode is enabled, the left and right pages will be rendered.\r\n   * @param pageNumber The page number to navigate to.\r\n   * @param activeStatus Optional boolean indicating if search results should be highlighted.\r\n   */\r\n  goToPage(pageNumber: number, activeStatus: any) {\r\n    if (this.isHtmlContent) {\r\n      // HTML content shows full content without pagination\r\n      return;\r\n    }\r\n\r\n    if (this.isDocxContent) {\r\n      this.currentPage = Math.max(\r\n        1,\r\n        Math.min(pageNumber, this.totalPages || 1),\r\n      );\r\n      this.inputPageNumber = this.currentPage;\r\n\r\n      const sections = document.querySelectorAll(\r\n        '.docx-wrapper > section.docx',\r\n      );\r\n      const targetSection = sections[this.currentPage - 1] as HTMLElement;\r\n\r\n      if (targetSection) {\r\n        targetSection.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n      }\r\n      this.cdr.detectChanges();\r\n      return;\r\n    }\r\n\r\n    // PDF navigation logic\r\n    this.isManualNavigation = true; // Prevent observer interference\r\n    this.currentPage = pageNumber;\r\n\r\n    const pageContainer = document.getElementById(\r\n      `page-container-${pageNumber}`,\r\n    );\r\n    if (pageContainer) {\r\n      // Force render the specific page in continuous scroll mode\r\n      const pageIndex = pageNumber - 1;\r\n      if (this.pages[pageIndex]) {\r\n        this.pages[pageIndex].rendered = false;\r\n        setTimeout(() => {\r\n          const canvas = document.getElementById(\r\n            `pageCanvas${pageNumber}`,\r\n          ) as HTMLCanvasElement;\r\n          if (canvas && this.pdfDoc) {\r\n            this.renderPageAndAnnotations(\r\n              pageNumber,\r\n              canvas,\r\n              activeStatus,\r\n            ).then((coordinates) => {\r\n              // Store coordinates if this is the page with the active match\r\n              if (\r\n                coordinates &&\r\n                this.searchResults[this.currentSearchIndex]?.page === pageNumber\r\n              ) {\r\n                this.activeMatchCoordinates = coordinates;\r\n              }\r\n            });\r\n            this.pages[pageIndex].rendered = true;\r\n\r\n            // Scroll to the page after rendering is complete\r\n            setTimeout(() => {\r\n              pageContainer.scrollIntoView({\r\n                behavior: 'auto',\r\n                block: 'start',\r\n              });\r\n\r\n              // Reset the flag after scroll completes (increased to 5 seconds for large documents)\r\n              setTimeout(() => {\r\n                this.isManualNavigation = false;\r\n              }, 5000);\r\n            }, 50);\r\n          } else {\r\n            console.error(\r\n              'Canvas or pdfDoc not available for page:',\r\n              pageNumber,\r\n            );\r\n          }\r\n        }, 100);\r\n      } else {\r\n        // If page is already rendered or doesn't exist in array, just scroll\r\n        pageContainer.scrollIntoView({ behavior: 'auto', block: 'start' });\r\n        // Reset the flag after scroll completes (increased to 5 seconds for large documents)\r\n        setTimeout(() => {\r\n          this.isManualNavigation = false;\r\n        }, 5000);\r\n      }\r\n    } else {\r\n      console.error('Page container not found for page:', pageNumber);\r\n      this.isManualNavigation = false;\r\n    }\r\n\r\n    this.inputPageNumber = this.currentPage;\r\n    this.syncThumbnailSidebar();\r\n  }\r\n\r\n  /**\r\n   * Increases the zoom level of the document.\r\n   * Uses the AppConstants.maxScaleValue ceiling.\r\n   * Preserves the viewport scroll centre so zoom feels browser-native.\r\n   */\r\n  zoomIn() {\r\n    if (this.isDocxContent) {\r\n      const maxScale = this._appConstants.maxScaleValue;\r\n      if (this.docxScale >= maxScale) return;\r\n\r\n      const step = 0.1;\r\n      this.docxScale = Math.min(\r\n        parseFloat(this.docxScale.toFixed(2)) + step,\r\n        maxScale,\r\n      );\r\n    } else if (this.isHtmlContent) {\r\n      // Zoom for HTML/TXT content via iframe CSS transform\r\n      const maxScale = this._appConstants.maxScaleValue;\r\n      if (this.htmlScale >= maxScale) return;\r\n\r\n      const step = 0.1;\r\n      this.htmlScale = Math.min(\r\n        parseFloat(this.htmlScale.toFixed(2)) + step,\r\n        maxScale,\r\n      );\r\n      this.applyHtmlZoom();\r\n    } else {\r\n      // Zoom for PDF content\r\n      const roundedScale = parseFloat(this.scale.toFixed(2));\r\n      const maxScale = this._appConstants.maxScaleValue; // e.g. 2.6\r\n      if (roundedScale >= maxScale) return;\r\n\r\n      const step = 0.1;\r\n      this.scale = parseFloat(\r\n        Math.min(maxScale, roundedScale + step).toFixed(2),\r\n      );\r\n      this.applyZoom();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Decreases the zoom level of the document.\r\n   * Uses the AppConstants.minScaleValue floor.\r\n   * Preserves the viewport scroll centre so zoom feels browser-native.\r\n   */\r\n  zoomOut() {\r\n    if (this.isDocxContent) {\r\n      const minScale = this._appConstants.minScaleValue;\r\n      if (this.docxScale <= minScale) return;\r\n\r\n      const step = 0.1;\r\n      this.docxScale = Math.max(\r\n        parseFloat(this.docxScale.toFixed(2)) - step,\r\n        minScale,\r\n      );\r\n    } else if (this.isHtmlContent) {\r\n      // Zoom for HTML/TXT content via iframe CSS transform\r\n      const minScale = this._appConstants.minScaleValue;\r\n      if (this.htmlScale <= minScale) return;\r\n\r\n      const step = 0.1;\r\n      this.htmlScale = Math.max(\r\n        parseFloat(this.htmlScale.toFixed(2)) - step,\r\n        minScale,\r\n      );\r\n      this.applyHtmlZoom();\r\n    } else {\r\n      // Zoom for PDF content\r\n      const roundedScale = parseFloat(this.scale.toFixed(2));\r\n      const minScale = this._appConstants.minScaleValue; // e.g. 0.8\r\n      if (roundedScale <= minScale) return;\r\n\r\n      const step = 0.1;\r\n      this.scale = parseFloat(\r\n        Math.max(minScale, roundedScale - step).toFixed(2),\r\n      );\r\n      this.applyZoom();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Applies zoom to HTML/TXT content by modifying iframe CSS\r\n   */\r\n  private applyHtmlZoom(): void {\r\n    if (this.htmlContentIframe && this.htmlContentIframe.nativeElement) {\r\n      const iframe = this.htmlContentIframe.nativeElement;\r\n      iframe.style.transform = `scale(${this.htmlScale})`;\r\n      iframe.style.transformOrigin = 'top left';\r\n      iframe.style.width = `${100 / this.htmlScale}%`;\r\n      iframe.style.height = `${100 / this.htmlScale}%`;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Re-renders all pages at the current zoom scale, preserving the viewport\r\n   * scroll centre — matching the behaviour of the browser's native PDF viewer.\r\n   */\r\n  private applyZoom(targetPageNumber?: number) {\r\n    // Capture the scroll centre ratio BEFORE changing page sizes\r\n    const container = this.viewerContainer?.nativeElement as HTMLElement;\r\n    const scrollRatioBefore =\r\n      container && !targetPageNumber\r\n        ? (container.scrollTop + container.clientHeight / 2) /\r\n          (container.scrollHeight || 1)\r\n        : 0;\r\n\r\n    // Re-render every page (so CSS size is updated on all canvases simultaneously)\r\n    const activeSearch =\r\n      this.searchResults && this.searchResults.length > 0 && !!this.searchQuery;\r\n    const renderPromises: Promise<any>[] = [];\r\n\r\n    this.pages.forEach((page, index) => {\r\n      const pageNumber = index + 1;\r\n      const canvas = document.getElementById(\r\n        `pageCanvas${pageNumber}`,\r\n      ) as HTMLCanvasElement;\r\n      if (canvas && this.pdfDoc) {\r\n        const promise = this.renderPageAndAnnotations(\r\n          pageNumber,\r\n          canvas,\r\n          activeSearch,\r\n        );\r\n        renderPromises.push(promise);\r\n        page.rendered = true;\r\n      }\r\n    });\r\n\r\n    // After all canvases have been resized, restore the scroll centre\r\n    // After all canvases have been resized, restore the scroll centre or jump to target\r\n    Promise.all(renderPromises).then(() => {\r\n      if (targetPageNumber) {\r\n        const pageContainer = document.getElementById(\r\n          `page-container-${targetPageNumber}`,\r\n        );\r\n        if (pageContainer) {\r\n          pageContainer.scrollIntoView({ behavior: 'auto', block: 'start' });\r\n        }\r\n      } else if (container) {\r\n        const newScrollTop =\r\n          scrollRatioBefore * container.scrollHeight -\r\n          container.clientHeight / 2;\r\n        container.scrollTop = Math.max(0, newScrollTop);\r\n      }\r\n\r\n      // Re-attach intersection observer so lazy-load logic stays in sync\r\n      this.setupIntersectionObserver();\r\n\r\n      if (targetPageNumber) {\r\n        this.syncThumbnailSidebar();\r\n        setTimeout(() => {\r\n          this.isManualNavigation = false;\r\n        }, 1500); // Give the observer time to settle before unlocking\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Downloads a document (PDF, HTML, or TXT).\r\n   *\r\n   * This function creates a download link for a document. It handles different\r\n   * file types appropriately and triggers the download.\r\n   *\r\n   * @return {void} This function does not return anything.\r\n   */\r\n  downloadPdf(): void {\r\n    let fileUrl: string | Blob = this.parentData.fileUrl;\r\n\r\n    // Extract string if it's a SafeResourceUrl\r\n    if (typeof fileUrl !== 'string') {\r\n      fileUrl =\r\n        this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, fileUrl) || '';\r\n    }\r\n\r\n    const fileType = this.parentData.fileType;\r\n    const fileName = this.getDocumentName();\r\n\r\n    if (this.isDocxContent) {\r\n      if (this.parentData?.file) {\r\n        const file = this.parentData.file as Blob | File;\r\n        const url = URL.createObjectURL(file);\r\n        const link = document.createElement('a');\r\n        link.href = url;\r\n        link.download = fileName.endsWith('.docx')\r\n          ? fileName\r\n          : `${fileName}.docx`;\r\n        link.click();\r\n        URL.revokeObjectURL(url);\r\n        return;\r\n      }\r\n      const link = document.createElement('a');\r\n      link.href = fileUrl;\r\n      link.download = fileName.endsWith('.docx')\r\n        ? fileName\r\n        : `${fileName}.docx`;\r\n      link.click();\r\n      return;\r\n    }\r\n\r\n    // Handle base64 data URIs for PDF\r\n    if (\r\n      fileType === 'application/pdf' &&\r\n      fileUrl.startsWith('data:application/pdf;base64,')\r\n    ) {\r\n      const base64 = fileUrl.replace(/^data:application\\/pdf;base64,/, '');\r\n      const blob = this.base64ToBlob(base64, 'application/pdf');\r\n      const url = URL.createObjectURL(blob);\r\n\r\n      const link = document.createElement('a');\r\n      link.href = url;\r\n      link.download = fileName;\r\n      link.click();\r\n      URL.revokeObjectURL(url);\r\n    } else if (fileType === 'text/html' || fileType === 'text/plain') {\r\n      // For HTML/TXT, convert to PDF before download\r\n      const contentToDownload =\r\n        fileType === 'text/plain' && this.originalTextContent\r\n          ? this.originalTextContent\r\n          : this.originalHtmlContent;\r\n\r\n      if (contentToDownload) {\r\n        this.convertHtmlToPdf(\r\n          contentToDownload,\r\n          fileName,\r\n          fileType === 'text/plain',\r\n        );\r\n      } else if (fileUrl.startsWith('blob:')) {\r\n        // For blob URLs, fetch the content and convert to PDF\r\n        fetch(fileUrl)\r\n          .then((response) => {\r\n            if (!response.ok) throw new Error('Network response was not ok');\r\n            return response.text();\r\n          })\r\n          .then((content) => {\r\n            this.convertHtmlToPdf(content, fileName, fileType === 'text/plain');\r\n          })\r\n          .catch((error) => {\r\n            console.error('Error downloading file:', error);\r\n          });\r\n      } else {\r\n        // For regular URLs, try direct download\r\n        const link = document.createElement('a');\r\n        link.href = fileUrl;\r\n        link.download = fileName;\r\n        link.target = '_blank';\r\n        link.click();\r\n      }\r\n    } else {\r\n      // Works for both blob: URLs and plain http/path URLs\r\n      const link = document.createElement('a');\r\n      link.href = fileUrl;\r\n      link.download = fileName;\r\n      link.click();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Opens a new window and prints the document (PDF, HTML, or TXT).\r\n   *\r\n   * This function handles different file types appropriately for printing.\r\n   *\r\n   * @return {void} This function does not return anything.\r\n   */\r\n  printPdf(): void {\r\n    if (this.isDocxContent) {\r\n      window.print();\r\n      return;\r\n    }\r\n\r\n    if (!this.parentData?.fileUrl) {\r\n      return;\r\n    }\r\n\r\n    const fileType = this.parentData.fileType;\r\n    let fileUrl = this.parentData.fileUrl;\r\n\r\n    // Extract string if it's a SafeResourceUrl\r\n    if (typeof fileUrl !== 'string') {\r\n      fileUrl =\r\n        this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, fileUrl) || '';\r\n    }\r\n\r\n    // For HTML/TXT content, use the original HTML content for printing\r\n    if (fileType === 'text/html' || fileType === 'text/plain') {\r\n      try {\r\n        // Use the original complete HTML content for printing\r\n        const contentToPrint = this.originalHtmlContent;\r\n\r\n        if (contentToPrint) {\r\n          // Create a new window with the complete HTML content\r\n          const printWindow = window.open('', '_blank');\r\n          if (printWindow) {\r\n            printWindow.document.open();\r\n            printWindow.document.write(contentToPrint);\r\n            printWindow.document.close();\r\n\r\n            // Wait for content to load, then print\r\n            printWindow.onload = () => {\r\n              setTimeout(() => {\r\n                printWindow.print();\r\n                // Optional: close window after printing (uncomment if desired)\r\n                // printWindow.close();\r\n              }, 500);\r\n            };\r\n          }\r\n        } else {\r\n          // Fallback: try to fetch and print the blob URL directly\r\n          const printWindow = window.open(fileUrl, '_blank');\r\n          if (printWindow) {\r\n            printWindow.onload = () => {\r\n              printWindow.print();\r\n            };\r\n          }\r\n        }\r\n      } catch (error) {\r\n        console.error('Error printing HTML content:', error);\r\n        // Final fallback: try blob URL\r\n        const printWindow = window.open(fileUrl, '_blank');\r\n        if (printWindow) {\r\n          printWindow.onload = () => {\r\n            printWindow.print();\r\n          };\r\n        }\r\n      }\r\n      return;\r\n    }\r\n\r\n    // For PDF, use the existing logic\r\n    let isTempBlobUrl = false;\r\n\r\n    if (fileUrl.startsWith('data:application/pdf;base64,')) {\r\n      const base64 = fileUrl.replace(/^data:application\\/pdf;base64,/, '');\r\n\r\n      const blob = this.base64ToBlob(base64, 'application/pdf');\r\n      fileUrl = URL.createObjectURL(blob);\r\n      isTempBlobUrl = true; // Only revoke URLs we created here\r\n    }\r\n\r\n    // blob: URLs (passed in directly) and http/path URLs are used as-is\r\n    const printWindow = window.open(fileUrl, '_blank');\r\n\r\n    if (printWindow) {\r\n      printWindow.onload = () => {\r\n        printWindow.focus();\r\n        printWindow.print();\r\n\r\n        // Only revoke the temporary blob URL we created from base64\r\n        if (isTempBlobUrl) {\r\n          URL.revokeObjectURL(fileUrl);\r\n        }\r\n      };\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Converts a base64 encoded string to a Blob object.\r\n   *\r\n   * @param {string} base64 - The base64 encoded string to convert.\r\n   * @param {string} type - The MIME type of the Blob object.\r\n   * @return {Blob} The resulting Blob object.\r\n   */\r\n  base64ToBlob(base64: string, type: string): Blob {\r\n    const byteCharacters = atob(base64);\r\n    const byteNumbers = new Array(byteCharacters.length);\r\n    for (let i = 0; i < byteCharacters.length; i++) {\r\n      byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n    }\r\n    const byteArray = new Uint8Array(byteNumbers);\r\n    return new Blob([byteArray], { type: type });\r\n  }\r\n\r\n  /**\r\n   * Emits a 'remove file' event to the parent component, indicating that\r\n   * the user wishes to remove the current file.\r\n   *\r\n   * @emits closeRequest - Emits a 'remove file' event to the parent component.\r\n   */\r\n  removeImage() {\r\n    const removeFile: any = 'remove file';\r\n    this.closeRequest.emit(removeFile);\r\n  }\r\n\r\n  /**\r\n   * Emits a 'normal close' event to the parent component, indicating a normal\r\n   * closure of the modal dialog.\r\n   *\r\n   * @emits closeRequest - Emits a 'normal close' event to the parent component.\r\n   */\r\n  dismissModal(): void {\r\n    const normalClose: any = 'normal close';\r\n    this.closeRequest.emit(normalClose);\r\n  }\r\n\r\n  /**\r\n   * Toggles the view between single view and multi view of a PDF document.\r\n   *\r\n   * When entering multi-view, the scale is reset to 60% so\r\n   * both pages fit side-by-side without being clipped. The previous single-view\r\n   * zoom level is saved and restored when returning to single view.\r\n   */\r\n  toggleView() {\r\n    this.isMultiView = !this.isMultiView;\r\n\r\n    // Handle PDF multi-view (HTML content no longer supports multi-view)\r\n    if (this.isMultiView) {\r\n      // Save the current single-view zoom so it can be restored later\r\n      this.singleViewScale = this.scale;\r\n      // Reset to default multi-view zoom (60%)\r\n      this.scale = 0.6;\r\n    } else {\r\n      // Restore the scale the user had before entering multi-view\r\n      this.scale = this.singleViewScale;\r\n    }\r\n\r\n    // Lock manual navigation so the browser's layout shift doesn't cause the\r\n    // IntersectionObserver to accidentally overwrite the current page before\r\n    // we can scroll to the correct destination.\r\n    this.isManualNavigation = true;\r\n    const targetPage = this.currentPage;\r\n\r\n    // applyZoom will efficiently resize all canvases to the new scale and\r\n    // immediately jump back to the exact target page we were on.\r\n    setTimeout(() => {\r\n      this.applyZoom(targetPage);\r\n      this.cdr.detectChanges();\r\n    }, 0);\r\n  }\r\n\r\n  setupIntersectionObserver() {\r\n    if (this.observer) this.observer.disconnect();\r\n\r\n    this.observer = new IntersectionObserver(\r\n      (entries) => {\r\n        entries.forEach((entry) => {\r\n          if (entry.isIntersecting) {\r\n            const pageContainer = entry.target as HTMLElement;\r\n            const pageNumber = parseInt(\r\n              pageContainer.getAttribute('data-page-number') || '0',\r\n              10,\r\n            );\r\n\r\n            // Always trigger lazy render regardless of nav state\r\n            this.renderMainPageLazily(pageNumber);\r\n\r\n            // Only update the active-page indicator while the user is freely scrolling\r\n            // (isManualNavigation blocks updates during programmatic navigation AND\r\n            //  during the initial-load warm-up window set in loadPdf / loadPdfFromUrl)\r\n            if (\r\n              entry.intersectionRatio >= 0.5 &&\r\n              !this.isManualNavigation &&\r\n              this.currentPage !== pageNumber\r\n            ) {\r\n              this.currentPage = pageNumber;\r\n              this.inputPageNumber = pageNumber;\r\n              this.syncThumbnailSidebar();\r\n              this.cdr.detectChanges();\r\n            }\r\n          }\r\n        });\r\n      },\r\n      {\r\n        root: this.viewerContainer?.nativeElement,\r\n        rootMargin: '0px',\r\n        threshold: [0.6],\r\n      },\r\n    );\r\n\r\n    // Scope the query to viewerContainer so we never accidentally observe\r\n    // stale .page-container elements from a previous render or another instance.\r\n    setTimeout(() => {\r\n      const root = this.viewerContainer?.nativeElement as HTMLElement;\r\n      const containers = root\r\n        ? root.querySelectorAll('.page-container')\r\n        : document.querySelectorAll('.page-container');\r\n      containers.forEach((container) => this.observer.observe(container));\r\n    }, 500);\r\n  }\r\n\r\n  renderMainPageLazily(pageNumber: number) {\r\n    const page = this.pages[pageNumber - 1];\r\n    if (page && !page.rendered && this.pdfDoc) {\r\n      const canvas = document.getElementById(\r\n        `pageCanvas${pageNumber}`,\r\n      ) as HTMLCanvasElement;\r\n      if (canvas) {\r\n        page.rendered = true;\r\n        // Enable highlighting if we have search results\r\n        const activeStatus =\r\n          this.searchResults &&\r\n          this.searchResults.length > 0 &&\r\n          !!this.searchQuery;\r\n\r\n        this.renderPageAndAnnotations(pageNumber, canvas, activeStatus).then(\r\n          (coordinates) => {\r\n            // Store coordinates if this is the page with the active match\r\n            if (\r\n              coordinates &&\r\n              this.searchResults[this.currentSearchIndex]?.page === pageNumber\r\n            ) {\r\n              this.activeMatchCoordinates = coordinates;\r\n            }\r\n          },\r\n        );\r\n      } else {\r\n        // If canvas is not yet mounted in DOM, retry shortly\r\n        setTimeout(() => {\r\n          if (!page.rendered) {\r\n            this.renderMainPageLazily(pageNumber);\r\n          }\r\n        }, 50);\r\n      }\r\n    }\r\n  }\r\n\r\n  syncThumbnailSidebar() {\r\n    // For PDF content, use data-index\r\n    // Angular template binding handles the active class, we just handle scrolling\r\n    let thumbnailToScroll: HTMLElement | null = null;\r\n\r\n    if (this.isMultiView) {\r\n      // In multi-view mode, scroll to the current page thumbnail\r\n      thumbnailToScroll = document.querySelector(\r\n        `.thumbnail-sidebar .thumbnail[data-index=\"${this.currentPage - 1}\"]`,\r\n      ) as HTMLElement;\r\n    } else {\r\n      // Single view mode, scroll to current page\r\n      thumbnailToScroll = document.querySelector(\r\n        `.thumbnail-sidebar .thumbnail[data-index=\"${this.currentPage - 1}\"]`,\r\n      ) as HTMLElement;\r\n    }\r\n\r\n    if (thumbnailToScroll) {\r\n      thumbnailToScroll.scrollIntoView({\r\n        behavior: 'smooth',\r\n        block: 'nearest',\r\n      });\r\n    }\r\n  }\r\n\r\n  isElementInViewport(el: HTMLElement): boolean {\r\n    const rect = el.getBoundingClientRect();\r\n    return (\r\n      rect.top >= 0 &&\r\n      rect.left >= 0 &&\r\n      rect.bottom <=\r\n        (window.innerHeight || document.documentElement.clientHeight) &&\r\n      rect.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n    );\r\n  }\r\n\r\n  onViewerScroll(event: any) {\r\n    // Scroll events are handled by the IntersectionObserver efficiently\r\n  }\r\n\r\n  getDocumentName(): string {\r\n    if (this.parentData?.fileName) {\r\n      return this.parentData.fileName;\r\n    }\r\n    if (this.isDocxContent) {\r\n      if (typeof this.parentData?.fileUrl === 'string') {\r\n        const parts = this.parentData.fileUrl.split('/');\r\n        const last = parts[parts.length - 1];\r\n        if (last && last.endsWith('.docx')) return last;\r\n      }\r\n      return 'Word Document (.docx)';\r\n    }\r\n    if (this.parentData?.fileUrl) {\r\n      let url = this.parentData.fileUrl;\r\n\r\n      // Extract string if it's a SafeResourceUrl\r\n      if (typeof url !== 'string') {\r\n        url = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, url) || '';\r\n      }\r\n\r\n      if (\r\n        url.startsWith('data:application/pdf;base64,') ||\r\n        url.startsWith('blob:')\r\n      ) {\r\n        return this.parentData.fileType === 'text/html'\r\n          ? 'HTML Document'\r\n          : 'PDF Document';\r\n      } else {\r\n        const parts = url.split('/');\r\n        return parts[parts.length - 1] || 'Document';\r\n      }\r\n    }\r\n    return 'Document';\r\n  }\r\n\r\n  /**\r\n   * Universal loader for HTML and text content.\r\n   * Supports Blob objects, blob: URLs, http(s) URLs, base64 data URIs, and raw HTML/text strings.\r\n   */\r\n  async loadHtmlOrTextContent(providedUrl?: string) {\r\n    try {\r\n      let fileUrl = providedUrl || this.parentData?.fileUrl;\r\n\r\n      if (!fileUrl) {\r\n        console.warn('No fileUrl provided for HTML/Text viewer');\r\n        return;\r\n      }\r\n\r\n      // Extract and sanitize URL for security purposes using Angular DomSanitizer\r\n      if (\r\n        fileUrl &&\r\n        typeof fileUrl !== 'string' &&\r\n        !(fileUrl instanceof Blob)\r\n      ) {\r\n        fileUrl =\r\n          this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, fileUrl) ||\r\n          this.sanitizer.sanitize(SecurityContext.URL, fileUrl) ||\r\n          fileUrl;\r\n      }\r\n\r\n      let rawContent = '';\r\n\r\n      if (fileUrl instanceof Blob) {\r\n        rawContent = await fileUrl.text();\r\n      } else if (typeof fileUrl === 'string') {\r\n        // Sanitize http/https URLs via DomSanitizer for security compliance\r\n        if (fileUrl.startsWith('http://') || fileUrl.startsWith('https://')) {\r\n          const sanitizedUrl = this.sanitizer.sanitize(\r\n            SecurityContext.URL,\r\n            fileUrl,\r\n          );\r\n          if (sanitizedUrl) {\r\n            fileUrl = sanitizedUrl;\r\n          }\r\n        }\r\n\r\n        const trimmed = fileUrl.trim();\r\n        if (\r\n          trimmed.startsWith('blob:') ||\r\n          trimmed.startsWith('http://') ||\r\n          trimmed.startsWith('https://') ||\r\n          trimmed.startsWith('/')\r\n        ) {\r\n          const response = await fetch(trimmed);\r\n          rawContent = await response.text();\r\n        } else if (\r\n          trimmed.startsWith('data:text/html;base64,') ||\r\n          trimmed.startsWith('data:text/plain;base64,') ||\r\n          trimmed.startsWith('data:application/xhtml+xml;base64,')\r\n        ) {\r\n          const base64 = trimmed.split(',')[1];\r\n          try {\r\n            rawContent = decodeURIComponent(escape(atob(base64)));\r\n          } catch {\r\n            rawContent = atob(base64);\r\n          }\r\n        } else if (\r\n          trimmed.startsWith('data:text/html,') ||\r\n          trimmed.startsWith('data:text/plain,')\r\n        ) {\r\n          rawContent = decodeURIComponent(trimmed.split(',')[1]);\r\n        } else if (\r\n          trimmed.startsWith('<') ||\r\n          trimmed.toLowerCase().includes('html') ||\r\n          trimmed.toLowerCase().includes('body')\r\n        ) {\r\n          rawContent = fileUrl;\r\n        } else {\r\n          // Attempt base64 decode or fallback to raw text\r\n          try {\r\n            rawContent = decodeURIComponent(escape(atob(trimmed)));\r\n          } catch {\r\n            rawContent = fileUrl;\r\n          }\r\n        }\r\n      }\r\n\r\n      const isPlainText = this.parentData?.fileType === 'text/plain';\r\n\r\n      if (isPlainText) {\r\n        this.originalTextContent = rawContent;\r\n        rawContent = `\r\n          <!DOCTYPE html>\r\n          <html>\r\n          <head>\r\n            <style>\r\n              body {\r\n                margin: 0;\r\n                padding: 20px;\r\n                font-family: 'Courier New', Courier, monospace;\r\n                line-height: 1.6;\r\n                color: #000;\r\n                white-space: pre-wrap;\r\n                word-wrap: break-word;\r\n              }\r\n              * {\r\n                max-width: 100%;\r\n                box-sizing: border-box;\r\n              }\r\n            </style>\r\n          </head>\r\n          <body>\r\n            <pre>${this.escapeHtml(rawContent)}</pre>\r\n          </body>\r\n          </html>\r\n        `;\r\n      }\r\n\r\n      // Check if HTML already has styles, if not, inject base styles\r\n      const hasStyles =\r\n        rawContent.includes('<style') || rawContent.includes('<link');\r\n      if (!hasStyles && !isPlainText) {\r\n        const minimalStyles = `\r\n          <style>\r\n            body {\r\n              margin: 0;\r\n              padding: 20px;\r\n              font-family: system-ui, -apple-system, sans-serif;\r\n            }\r\n            * {\r\n              max-width: 100%;\r\n              box-sizing: border-box;\r\n            }\r\n          </style>\r\n        `;\r\n        if (rawContent.includes('</head>')) {\r\n          rawContent = rawContent.replace('</head>', minimalStyles + '</head>');\r\n        } else if (rawContent.includes('<body')) {\r\n          rawContent = rawContent.replace('<body', minimalStyles + '<body');\r\n        } else {\r\n          rawContent = minimalStyles + rawContent;\r\n        }\r\n      }\r\n\r\n      // Store original content for download/print\r\n      this.originalHtmlContent = rawContent;\r\n      this.htmlContent = this.sanitizer.bypassSecurityTrustHtml(rawContent);\r\n      this.totalPages = 1;\r\n      this.currentPage = 1;\r\n      this.inputPageNumber = 1;\r\n\r\n      // Update change detection so iframe template renders\r\n      this.cdr.detectChanges();\r\n\r\n      // Write content directly into iframe document to guarantee immediate display with full CSS styles\r\n      this.writeHtmlToIframe(rawContent);\r\n    } catch (error) {\r\n      console.error('Error loading HTML/Text content:', error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Writes HTML string directly into the iframe's contentDocument.\r\n   * Ensures styles and colors render immediately without cross-origin or sandboxed blob issues.\r\n   */\r\n  private writeHtmlToIframe(htmlContent: string): void {\r\n    const doWrite = () => {\r\n      if (this.htmlContentIframe?.nativeElement) {\r\n        const iframe = this.htmlContentIframe.nativeElement;\r\n        try {\r\n          const doc = iframe.contentDocument || iframe.contentWindow?.document;\r\n          if (doc) {\r\n            doc.open();\r\n            doc.write(htmlContent);\r\n            doc.close();\r\n          }\r\n        } catch (err) {\r\n          console.error('Error writing to iframe document:', err);\r\n        }\r\n      }\r\n    };\r\n\r\n    doWrite();\r\n    setTimeout(doWrite, 10);\r\n    setTimeout(doWrite, 100);\r\n  }\r\n\r\n  async loadHtmlFromBlobUrl(blobUrl: string) {\r\n    return this.loadHtmlOrTextContent(blobUrl);\r\n  }\r\n\r\n  async loadTextFromBlobUrl(blobUrl: string) {\r\n    return this.loadHtmlOrTextContent(blobUrl);\r\n  }\r\n\r\n  /**\r\n   * Escapes HTML special characters to prevent XSS\r\n   * @param text - The text to escape\r\n   */\r\n  private escapeHtml(text: string): string {\r\n    const div = document.createElement('div');\r\n    div.textContent = text;\r\n    return div.innerHTML;\r\n  }\r\n\r\n  /**\r\n   * Converts HTML/TXT content to PDF and triggers download\r\n   * @param content - The HTML or text content to convert\r\n   * @param fileName - The desired filename for the download\r\n   * @param isPlainText - Whether the content is plain text\r\n   */\r\n  private convertHtmlToPdf(\r\n    content: string,\r\n    fileName: string,\r\n    isPlainText = false,\r\n  ) {\r\n    try {\r\n      // Try to use html2pdf library if available\r\n      if ((window as any).html2pdf) {\r\n        this.convertWithHtml2Pdf(content, fileName, isPlainText);\r\n      } else {\r\n        // Fallback: Download as HTML file with print instructions\r\n        console.warn(\r\n          'html2pdf library not available, downloading as HTML instead',\r\n        );\r\n        this.downloadAsHtmlWithPrintInstructions(\r\n          content,\r\n          fileName,\r\n          isPlainText,\r\n        );\r\n      }\r\n    } catch (error) {\r\n      console.error('Error converting to PDF:', error);\r\n      // Fallback: download as original format\r\n      this.downloadAsOriginalFormat(content, fileName, isPlainText);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Converts HTML to PDF using html2pdf library\r\n   * @param content - The HTML content to convert\r\n   * @param fileName - The desired filename\r\n   * @param isPlainText - Whether the content is plain text\r\n   */\r\n  private convertWithHtml2Pdf(\r\n    content: string,\r\n    fileName: string,\r\n    isPlainText = false,\r\n  ) {\r\n    try {\r\n      const element = document.createElement('div');\r\n      element.style.position = 'absolute';\r\n      element.style.left = '-9999px';\r\n      element.style.top = '0';\r\n      element.style.width = '800px';\r\n      element.innerHTML = content;\r\n      document.body.appendChild(element);\r\n\r\n      const opt = {\r\n        margin: 10,\r\n        filename: fileName.replace(/\\.(html|txt)$/i, '.pdf'),\r\n        image: { type: 'jpeg', quality: 0.98 },\r\n        html2canvas: { scale: 2 },\r\n        jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },\r\n      };\r\n\r\n      (window as any)\r\n        .html2pdf()\r\n        .set(opt)\r\n        .from(element)\r\n        .save()\r\n        .then(() => {\r\n          document.body.removeChild(element);\r\n        })\r\n        .catch((error: any) => {\r\n          console.error('html2pdf conversion failed:', error);\r\n          document.body.removeChild(element);\r\n          this.downloadAsHtmlWithPrintInstructions(\r\n            content,\r\n            fileName,\r\n            isPlainText,\r\n          );\r\n        });\r\n    } catch (error) {\r\n      console.error('Error using html2pdf:', error);\r\n      this.downloadAsHtmlWithPrintInstructions(content, fileName, isPlainText);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Downloads content as HTML file with print-to-PDF instructions\r\n   * @param content - The HTML content to download\r\n   * @param fileName - The desired filename\r\n   * @param isPlainText - Whether the content is plain text\r\n   */\r\n  private downloadAsHtmlWithPrintInstructions(\r\n    content: string,\r\n    fileName: string,\r\n    isPlainText = false,\r\n  ) {\r\n    let htmlContent: string;\r\n\r\n    if (isPlainText) {\r\n      // Convert plain text to HTML\r\n      htmlContent = `\r\n        <!DOCTYPE html>\r\n        <html>\r\n        <head>\r\n          <title>${fileName}</title>\r\n          <style>\r\n            body {\r\n              margin: 0;\r\n              padding: 40px;\r\n              font-family: 'Courier New', Courier, monospace;\r\n              line-height: 1.6;\r\n              color: #000;\r\n              white-space: pre-wrap;\r\n              word-wrap: break-word;\r\n            }\r\n            @media print {\r\n              body { padding: 20px; }\r\n            }\r\n          </style>\r\n        </head>\r\n        <body>\r\n          <pre>${this.escapeHtml(content)}</pre>\r\n        </body>\r\n        </html>\r\n      `;\r\n    } else {\r\n      htmlContent = content;\r\n    }\r\n\r\n    // Add print instructions as a comment\r\n    const htmlWithInstructions =\r\n      `<!-- \r\n      To save as PDF:\r\n      1. Open this file in a web browser\r\n      2. Press Ctrl+P (or Cmd+P on Mac)\r\n      3. Select \"Save as PDF\" as the destination\r\n      4. Click Save\r\n    -->` + htmlContent;\r\n\r\n    const mimeType = 'text/html';\r\n    const blob = new Blob([htmlWithInstructions], { type: mimeType });\r\n    const url = URL.createObjectURL(blob);\r\n\r\n    const link = document.createElement('a');\r\n    link.href = url;\r\n    link.download = fileName;\r\n    link.click();\r\n    URL.revokeObjectURL(url);\r\n\r\n    // Show user feedback\r\n    this.showDownloadFeedback(fileName);\r\n  }\r\n\r\n  /**\r\n   * Shows feedback to the user about the download\r\n   * @param fileName - The name of the downloaded file\r\n   */\r\n  private showDownloadFeedback(fileName: string) {\r\n    // Create a temporary toast notification\r\n    const toast = document.createElement('div');\r\n    toast.style.position = 'fixed';\r\n    toast.style.bottom = '20px';\r\n    toast.style.right = '20px';\r\n    toast.style.backgroundColor = '#333';\r\n    toast.style.color = '#fff';\r\n    toast.style.padding = '12px 20px';\r\n    toast.style.borderRadius = '8px';\r\n    toast.style.zIndex = '10000';\r\n    toast.style.boxShadow = '0 4px 12px rgba(0,0,0,0.15)';\r\n    toast.textContent = `Downloaded: ${fileName}. Open in browser and print to PDF.`;\r\n\r\n    document.body.appendChild(toast);\r\n\r\n    setTimeout(() => {\r\n      toast.style.opacity = '0';\r\n      toast.style.transition = 'opacity 0.3s';\r\n      setTimeout(() => {\r\n        document.body.removeChild(toast);\r\n      }, 300);\r\n    }, 4000);\r\n  }\r\n\r\n  /**\r\n   * Fallback method to download content in its original format\r\n   * @param content - The content to download\r\n   * @param fileName - The filename\r\n   * @param isPlainText - Whether the content is plain text\r\n   */\r\n  private downloadAsOriginalFormat(\r\n    content: string,\r\n    fileName: string,\r\n    isPlainText: boolean,\r\n  ) {\r\n    const mimeType = isPlainText ? 'text/plain' : 'text/html';\r\n    const blob = new Blob([content], { type: mimeType });\r\n    const url = URL.createObjectURL(blob);\r\n\r\n    const link = document.createElement('a');\r\n    link.href = url;\r\n    link.download = fileName;\r\n    link.click();\r\n    URL.revokeObjectURL(url);\r\n  }\r\n\r\n  /**\r\n   * Checks if the current content is DOCX\r\n   */\r\n  get isDocxContent(): boolean {\r\n    const ft = (this.parentData?.fileType || '').toLowerCase();\r\n    const fu =\r\n      typeof this.parentData?.fileUrl === 'string'\r\n        ? this.parentData.fileUrl.toLowerCase()\r\n        : '';\r\n    const fn = (this.parentData?.fileName || '').toLowerCase();\r\n    return (\r\n      ft.includes('wordprocessingml') ||\r\n      ft.includes('docx') ||\r\n      ft ===\r\n        'application/vnd.openxmlformats-officedocument.wordprocessingml.document' ||\r\n      fu.endsWith('.docx') ||\r\n      fu.includes('.docx?') ||\r\n      fu.includes(\r\n        'data:application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n      ) ||\r\n      fn.endsWith('.docx')\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Checks if the current content is HTML\r\n   */\r\n  get isHtmlContent(): boolean {\r\n    if (this.isDocxContent) return false;\r\n    return (\r\n      this.parentData?.fileType === 'text/html' ||\r\n      this.parentData?.fileType === 'text/plain'\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Checks if the current content is PDF\r\n   */\r\n  get isPdfContent(): boolean {\r\n    if (this.isDocxContent || this.isHtmlContent) return false;\r\n    return (\r\n      this.parentData?.fileType === 'application/pdf' ||\r\n      (typeof this.parentData?.fileUrl === 'string' &&\r\n        (this.parentData.fileUrl.endsWith('.pdf') ||\r\n          this.parentData.fileUrl.includes('.pdf?')))\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Checks if the current content is text (TXT)\r\n   */\r\n  get isTextContent(): boolean {\r\n    if (this.isDocxContent) return false;\r\n    return (\r\n      this.parentData?.fileType === 'text/plain' && this.htmlContent !== null\r\n    );\r\n  }\r\n\r\n  get isToolbarVisible(): boolean {\r\n    return !!(\r\n      this.parentData?.documentNameVisibility ||\r\n      this.parentData?.paginationVisibility ||\r\n      this.parentData?.searchBtnVisibility ||\r\n      this.parentData?.zoomVisibility ||\r\n      this.parentData?.multiViewBtnVisibility ||\r\n      this.parentData?.downloadVisibility ||\r\n      this.parentData?.printerVisibility ||\r\n      this.parentData?.removeVisibility\r\n    );\r\n  }\r\n  /**\r\n   * Toggles sidebar collapsed state\r\n   */\r\n  toggleSidebar(): void {\r\n    this.isSidebarCollapsed = !this.isSidebarCollapsed;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  /**\r\n   * Sets active sidebar tab ('thumbnails' or 'toc')\r\n   */\r\n  setSidebarTab(tab: 'thumbnails' | 'toc'): void {\r\n    this.activeSidebarTab = tab;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  /**\r\n   * Loads and parses PDF document outline / bookmarks into Table of Contents structure\r\n   */\r\n  async loadPdfOutline(): Promise<void> {\r\n    if (!this.pdfDoc) return;\r\n    try {\r\n      const rawOutline = await this.pdfDoc.getOutline();\r\n      console.log('rawOutline', rawOutline);\r\n\r\n      if (rawOutline && rawOutline.length > 0) {\r\n        this.pdfOutline = await this.parseOutlineItems(rawOutline);\r\n      } else {\r\n        this.pdfOutline = [];\r\n      }\r\n      this.cdr.detectChanges();\r\n    } catch (error) {\r\n      console.error('Error loading PDF outline:', error);\r\n      this.pdfOutline = [];\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Recursively parses raw pdf.js outline items into structured TOC items with target page numbers\r\n   */\r\n  private async parseOutlineItems(items: any[]): Promise<any[]> {\r\n    const result: any[] = [];\r\n    for (const item of items) {\r\n      let pageNumber: number | null = null;\r\n      try {\r\n        let dest = item.dest;\r\n        if (typeof dest === 'string') {\r\n          dest = await this.pdfDoc!.getDestination(dest);\r\n        }\r\n        if (Array.isArray(dest) && dest.length > 0) {\r\n          const pageRef = dest[0];\r\n          if (typeof pageRef === 'number') {\r\n            pageNumber = pageRef + 1;\r\n          } else if (pageRef && typeof pageRef === 'object') {\r\n            const pageIndex = await this.pdfDoc!.getPageIndex(pageRef);\r\n            pageNumber = pageIndex + 1;\r\n          }\r\n        }\r\n      } catch (e) {\r\n        console.warn(\r\n          'Could not resolve destination for outline item:',\r\n          item.title,\r\n          e,\r\n        );\r\n      }\r\n\r\n      const children =\r\n        item.items && item.items.length > 0\r\n          ? await this.parseOutlineItems(item.items)\r\n          : [];\r\n\r\n      result.push({\r\n        title: item.title,\r\n        pageNumber: pageNumber,\r\n        items: children,\r\n        expanded: true,\r\n      });\r\n    }\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Toggles expansion state of a nested TOC outline item\r\n   */\r\n  toggleOutlineItem(item: any, event: Event): void {\r\n    event.stopPropagation();\r\n    item.expanded = !item.expanded;\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  /**\r\n   * Navigates viewer to the page specified by a TOC item\r\n   */\r\n  goToOutlineItem(item: any): void {\r\n    if (item.pageNumber) {\r\n      this.goToPage(item.pageNumber, null);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Opens custom context menu on right click\r\n   */\r\n  onContextMenu(event: MouseEvent): void {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n\r\n    //Start with default items\r\n    let items: ContextMenuItem[] = [\r\n      ...(this.customContextMenuItems ||\r\n        this.parentData?.contextMenuItems ||\r\n        DEFAULT_CONTEXT_MENU_ITEMS),\r\n    ];\r\n\r\n    //Filter items based on content type\r\n    // Multi-view and Pagination don't apply to HTML/Text content\r\n    if (this.isHtmlContent) {\r\n      items = items.filter(\r\n        (item) =>\r\n          item.action !== 'toggleView' &&\r\n          item.action !== 'nextPage' &&\r\n          item.action !== 'previousPage' &&\r\n          item.action !== 'firstPage' &&\r\n          item.action !== 'lastPage',\r\n      );\r\n    }\r\n\r\n    //Update the 'View' item dynamically and disable out-of-range pagination\r\n    items = items.map((item) => {\r\n      if (item.action === 'toggleView') {\r\n        return {\r\n          ...item,\r\n          label: this.isMultiView ? 'Single View' : 'Multi View',\r\n          icon: this.isMultiView ? 'ri-layout-line' : 'ri-layout-grid-line',\r\n        };\r\n      }\r\n\r\n      //Disable pagination items if on first/last page\r\n      if (item.action === 'previousPage' && this.currentPage === 1)\r\n        return { ...item, disabled: true };\r\n      if (item.action === 'firstPage' && this.currentPage === 1)\r\n        return { ...item, disabled: true };\r\n      if (item.action === 'nextPage' && this.currentPage === this.totalPages)\r\n        return { ...item, disabled: true };\r\n      if (item.action === 'lastPage' && this.currentPage === this.totalPages)\r\n        return { ...item, disabled: true };\r\n\r\n      return item;\r\n    });\r\n\r\n    //Open the menu with the modified items\r\n    this.contextMenuService.open(event, items, (action: string) => {\r\n      this.handleContextMenuAction(action);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Handles action executed from context menu selection\r\n   */\r\n  handleContextMenuAction(action: string): void {\r\n    switch (action) {\r\n      case 'nextPage':\r\n        this.pageNavigation('nextPage');\r\n        break;\r\n      case 'previousPage':\r\n        this.pageNavigation('previousPage');\r\n        break;\r\n      case 'firstPage':\r\n        this.pageNavigation('firstPage');\r\n        break;\r\n      case 'lastPage':\r\n        this.pageNavigation('lastPage');\r\n        break;\r\n      case 'zoomIn':\r\n        this.zoomIn();\r\n        break;\r\n      case 'zoomOut':\r\n        this.zoomOut();\r\n        break;\r\n      case 'toggleView':\r\n        this.toggleView();\r\n        break;\r\n      case 'download':\r\n        this.downloadPdf();\r\n        break;\r\n      case 'print':\r\n        this.printPdf();\r\n        break;\r\n      default:\r\n        this.contextMenuItemClick.emit(action);\r\n        break;\r\n    }\r\n  }\r\n}\r\n","@if ( parentData.fileType === 'application/pdf' || parentData.fileType ===\r\n'text/html' || parentData.fileType === 'text/plain' || isDocxContent ) {\r\n<div class=\"pdf-wrapper\" (contextmenu)=\"onContextMenu($event)\">\r\n  <!-- Toolbar -->\r\n  @if (isToolbarVisible) {\r\n  <div class=\"pdf-toolbar\">\r\n    <!-- Left - Document Name & Sidebar Toggle -->\r\n    @if (parentData.documentNameVisibility === true) {\r\n    <div class=\"toolbar-left\">\r\n      @if (isPdfContent) {\r\n      <button\r\n        class=\"sidebar-toggle-btn\"\r\n        (click)=\"toggleSidebar()\"\r\n        [title]=\"isSidebarCollapsed ? 'Expand Sidebar' : 'Collapse Sidebar'\"\r\n      >\r\n        <img\r\n          src=\"assets/icons/sidebar-toggle.svg\"\r\n          alt=\"Toggle Sidebar\"\r\n          width=\"20\"\r\n          height=\"20\"\r\n        />\r\n      </button>\r\n      }\r\n      <div class=\"document-name\">\r\n        <img\r\n          src=\"assets/icons/document-icon.svg\"\r\n          alt=\"Document\"\r\n          class=\"icon flat-line\"\r\n          width=\"22\"\r\n          height=\"22\"\r\n        />\r\n        <span>{{ getDocumentName() }}</span>\r\n      </div>\r\n    </div>\r\n    }\r\n\r\n    <!-- Center - Pagination Controls -->\r\n    @if (!isMultiView && !isHtmlContent) {\r\n    <div class=\"toolbar-center\">\r\n      @if (parentData.paginationVisibility) {\r\n      <button\r\n        (click)=\"pageNavigation('firstPage')\"\r\n        [disabled]=\"currentPage === 1\"\r\n        title=\"First Page\"\r\n      >\r\n        <img\r\n          src=\"assets/icons/first-page.svg\"\r\n          alt=\"First Page\"\r\n          width=\"10\"\r\n          height=\"10\"\r\n        />\r\n      </button>\r\n\r\n      <button\r\n        (click)=\"pageNavigation('previousPage')\"\r\n        [disabled]=\"currentPage === 1\"\r\n        title=\"Previous Page\"\r\n      >\r\n        <img\r\n          src=\"assets/icons/previous-page.svg\"\r\n          alt=\"Previous Page\"\r\n          width=\"10\"\r\n          height=\"10\"\r\n        />\r\n      </button>\r\n\r\n      <div class=\"page-input-group\">\r\n        <input\r\n          type=\"number\"\r\n          [(ngModel)]=\"inputPageNumber\"\r\n          (keyup.enter)=\"goToEnteredPage(inputPageNumber)\"\r\n          (blur)=\"goToEnteredPage(inputPageNumber)\"\r\n          (change)=\"goToEnteredPage(inputPageNumber)\"\r\n          min=\"1\"\r\n          [max]=\"totalPages\"\r\n        />\r\n        <span class=\"page-divider\">/</span>\r\n        <span class=\"total-pages\">{{ totalPages }}</span>\r\n      </div>\r\n\r\n      <button\r\n        (click)=\"pageNavigation('nextPage')\"\r\n        [disabled]=\"currentPage === totalPages\"\r\n        title=\"Next Page\"\r\n      >\r\n        <img\r\n          src=\"assets/icons/next-page.svg\"\r\n          alt=\"Next Page\"\r\n          width=\"10\"\r\n          height=\"10\"\r\n        />\r\n      </button>\r\n\r\n      <button\r\n        (click)=\"pageNavigation('lastPage')\"\r\n        [disabled]=\"currentPage === totalPages\"\r\n        title=\"Last Page\"\r\n      >\r\n        <img\r\n          src=\"assets/icons/last-page.svg\"\r\n          alt=\"Last Page\"\r\n          width=\"10\"\r\n          height=\"10\"\r\n        />\r\n      </button>\r\n      }\r\n    </div>\r\n    }\r\n\r\n    <!-- Right - Search & Action Controls -->\r\n    <div class=\"toolbar-right\">\r\n      <!-- @if (parentData.searchBtnVisibility) {\r\n          <button\r\n            class=\"icon-btn search-toggle-btn\"\r\n            [class.active]=\"isSearchPanelVisible\"\r\n            (click)=\"toggleSearchPanel()\"\r\n            title=\"Find in document (Ctrl+F)\"\r\n          >\r\n            <i class=\"ri-search-line\"></i>\r\n          </button>\r\n        } -->\r\n\r\n      @if (parentData.zoomVisibility) {\r\n      <button (click)=\"zoomOut()\" title=\"Zoom Out\">\r\n        <img\r\n          src=\"assets/icons/zoom-out.svg\"\r\n          alt=\"Zoom Out\"\r\n          width=\"15\"\r\n          height=\"15\"\r\n        />\r\n      </button>\r\n\r\n      <input\r\n        type=\"text\"\r\n        class=\"zoom-percentage-input\"\r\n        [value]=\"zoomPercentage + '%'\"\r\n        readonly\r\n      />\r\n\r\n      <button (click)=\"zoomIn()\" title=\"Zoom In\">\r\n        <img\r\n          src=\"assets/icons/zoom-in.svg\"\r\n          alt=\"Zoom In\"\r\n          width=\"15\"\r\n          height=\"15\"\r\n        />\r\n      </button>\r\n      } @if (parentData.multiViewBtnVisibility && !isHtmlContent &&\r\n      !isDocxContent) {\r\n      <button\r\n        (click)=\"toggleView()\"\r\n        [title]=\"isMultiView ? 'Single View' : 'Multi View'\"\r\n      >\r\n        <img\r\n          src=\"assets/icons/multi-view.svg\"\r\n          alt=\"Toggle View\"\r\n          width=\"15\"\r\n          height=\"15\"\r\n        />\r\n      </button>\r\n      } @if (parentData.downloadVisibility === true) {\r\n      <button (click)=\"downloadPdf()\" title=\"Download\">\r\n        <img\r\n          src=\"assets/icons/download.svg\"\r\n          alt=\"Download\"\r\n          width=\"15\"\r\n          height=\"15\"\r\n        />\r\n      </button>\r\n      } @if (parentData.printerVisibility) {\r\n      <button (click)=\"printPdf()\" title=\"Print\">\r\n        <img src=\"assets/icons/print.svg\" alt=\"Print\" width=\"15\" height=\"15\" />\r\n      </button>\r\n      } @if (parentData.removeVisibility) {\r\n      <button (click)=\"removeImage()\" title=\"Remove\">\r\n        <i class=\"ri-delete-bin-line\"></i>\r\n      </button>\r\n      }\r\n    </div>\r\n  </div>\r\n  }\r\n  <!-- Viewer -->\r\n\r\n  <div class=\"pdf-viewer-container\">\r\n    <!-- Floating Find / Search Widget (VS Code Style) -->\r\n    @if (parentData.searchBtnVisibility && isSearchPanelVisible) {\r\n    <div\r\n      id=\"find-bar\"\r\n      class=\"vscode-find-widget\"\r\n      [class.collapsed]=\"isFindBarCollapsed\"\r\n    >\r\n      <!-- Collapse / Expand Toggle Button -->\r\n      <button\r\n        id=\"find-collapse\"\r\n        class=\"find-collapse-btn\"\r\n        aria-label=\"Toggle\"\r\n        title=\"Toggle find bar\"\r\n        (click)=\"toggleFindCollapse()\"\r\n      >\r\n        <i\r\n          [class]=\"isFindBarCollapsed ? 'ri-arrow-right-s-line' : 'ri-arrow-down-s-line'\"\r\n        ></i>\r\n      </button>\r\n\r\n      @if (!isFindBarCollapsed) {\r\n      <!-- Search Input Container with inline Aa / ab / .* toggles -->\r\n      <div class=\"find-input-wrapper\">\r\n        <input\r\n          id=\"find-input\"\r\n          class=\"find-input\"\r\n          type=\"text\"\r\n          placeholder=\"Find (&#8593;&#8595; for history)\"\r\n          autocomplete=\"off\"\r\n          #findInput\r\n          [(ngModel)]=\"searchQuery\"\r\n          (input)=\"onFindInput(findInput.value)\"\r\n          (keydown)=\"onFindKeydown($event, findInput)\"\r\n          (change)=\"onFindChange(findInput.value)\"\r\n        />\r\n\r\n        <!-- Match Case Toggle (Aa) -->\r\n        <button\r\n          id=\"find-case\"\r\n          class=\"find-option-btn\"\r\n          title=\"Match Case (Alt+C)\"\r\n          [class.active]=\"matchCase\"\r\n          (click)=\"toggleMatchCase()\"\r\n        >\r\n          Aa\r\n        </button>\r\n\r\n        <!-- Whole Word Toggle (ab) -->\r\n        <button\r\n          id=\"find-word\"\r\n          class=\"find-option-btn\"\r\n          title=\"Match Whole Word (Alt+W)\"\r\n          [class.active]=\"wholeWord\"\r\n          (click)=\"toggleWholeWord()\"\r\n        >\r\n          ab\r\n        </button>\r\n\r\n        <!-- Regular Expression Toggle (.*) -->\r\n        <button\r\n          id=\"find-regex\"\r\n          class=\"find-option-btn\"\r\n          title=\"Use Regular Expression (Alt+R)\"\r\n          [class.active]=\"useRegex\"\r\n          (click)=\"toggleUseRegex()\"\r\n        >\r\n          .*\r\n        </button>\r\n      </div>\r\n\r\n      <!-- Result Count Text -->\r\n      <span\r\n        id=\"find-count\"\r\n        class=\"find-count\"\r\n        [class.no-results]=\"searchQuery && searchResults.length === 0\"\r\n      >\r\n        {{ findCountText }}\r\n      </span>\r\n\r\n      <!-- Navigation Arrows -->\r\n      <div class=\"find-nav-group\">\r\n        <button\r\n          id=\"find-prev\"\r\n          class=\"find-nav-btn\"\r\n          aria-label=\"Previous match\"\r\n          title=\"Previous match (Shift+Enter)\"\r\n          [disabled]=\"searchResults.length === 0\"\r\n          (click)=\"findPrev()\"\r\n        >\r\n          <i class=\"ri-arrow-up-s-line\"></i>\r\n        </button>\r\n        <button\r\n          id=\"find-next\"\r\n          class=\"find-nav-btn\"\r\n          aria-label=\"Next match\"\r\n          title=\"Next match (Enter)\"\r\n          [disabled]=\"searchResults.length === 0\"\r\n          (click)=\"findNext()\"\r\n        >\r\n          <i class=\"ri-arrow-down-s-line\"></i>\r\n        </button>\r\n      </div>\r\n\r\n      <!-- Close Button -->\r\n      <button\r\n        id=\"find-close\"\r\n        class=\"find-close-btn\"\r\n        aria-label=\"Close\"\r\n        title=\"Close (Esc)\"\r\n        (click)=\"closeFindBar()\"\r\n      >\r\n        <i class=\"ri-close-line\"></i>\r\n      </button>\r\n      }\r\n    </div>\r\n    }\r\n    <!-- HTML Content Viewer -->\r\n    @if (isHtmlContent) {\r\n    <!-- HTML Viewer -->\r\n    <div class=\"html-viewer\" #viewerContainer>\r\n      <iframe\r\n        #htmlContentIframe\r\n        class=\"html-content-container\"\r\n        [attr.srcdoc]=\"originalHtmlContent\"\r\n        sandbox=\"allow-same-origin allow-scripts allow-forms allow-popups allow-modals\"\r\n        referrerpolicy=\"no-referrer\"\r\n        loading=\"eager\"\r\n        title=\"Document Content\"\r\n      >\r\n      </iframe>\r\n    </div>\r\n    }\r\n\r\n    <!-- DOCX Content Viewer -->\r\n    @if (isDocxContent) {\r\n    <div\r\n      class=\"docx-viewer\"\r\n      #docxViewerContainer\r\n      (scroll)=\"onDocxScroll($event)\"\r\n    >\r\n      <div\r\n        class=\"docx-viewport\"\r\n        [style.transform]=\"'scale(' + docxScale + ')'\"\r\n        [style.transform-origin]=\"'top center'\"\r\n      >\r\n        <div #docxRenderContainer class=\"docx-render-stage\"></div>\r\n      </div>\r\n    </div>\r\n    }\r\n\r\n    <!-- PDF Viewer -->\r\n    @if (isPdfContent) {\r\n    <!-- Sidebar -->\r\n\r\n    <div class=\"thumbnail-sidebar\" [class.collapsed]=\"isSidebarCollapsed\">\r\n      <!-- Sidebar Left Icon Navigation Strip -->\r\n      <div class=\"sidebar-tab-strip\">\r\n        <button\r\n          class=\"sidebar-tab-btn\"\r\n          [class.active]=\"activeSidebarTab === 'thumbnails'\"\r\n          (click)=\"setSidebarTab('thumbnails')\"\r\n          title=\"Page Thumbnails\"\r\n        >\r\n          <img\r\n            src=\"assets/icons/thumbnails-tab.svg\"\r\n            alt=\"Thumbnails\"\r\n            width=\"18\"\r\n            height=\"18\"\r\n          />\r\n        </button>\r\n        <button\r\n          class=\"sidebar-tab-btn\"\r\n          [class.active]=\"activeSidebarTab === 'toc'\"\r\n          (click)=\"setSidebarTab('toc')\"\r\n          title=\"Table of Contents\"\r\n        >\r\n          <img\r\n            src=\"assets/icons/toc-tab.svg\"\r\n            alt=\"Table of Contents\"\r\n            width=\"18\"\r\n            height=\"18\"\r\n          />\r\n        </button>\r\n      </div>\r\n\r\n      <!-- Main Sidebar Content Area -->\r\n      <div class=\"sidebar-content-area\">\r\n        <!-- Thumbnails View -->\r\n        @if (activeSidebarTab === 'thumbnails') {\r\n        <div class=\"thumbnails-container\">\r\n          @for (thumbnailDataUrl of thumbnailDataUrls; track $index; let i =\r\n          $index) {\r\n          <div\r\n            class=\"thumbnail\"\r\n            [attr.data-index]=\"i\"\r\n            [class.active]=\"\r\n                      isMultiView\r\n                        ? i + 1 === currentPage ||\r\n                          (currentPage % 2 !== 0 && i + 1 === currentPage + 1) ||\r\n                          (currentPage % 2 === 0 && i + 1 === currentPage - 1)\r\n                        : currentPage === i + 1\r\n                    \"\r\n            role=\"button\"\r\n            tabindex=\"0\"\r\n            (click)=\"goToPage(i + 1, true)\"\r\n            (keydown.enter)=\"goToPage(i + 1, true)\"\r\n            (keydown.space)=\"goToPage(i + 1, true)\"\r\n          >\r\n            @if (thumbnailDataUrl) {\r\n            <img\r\n              [src]=\"thumbnailDataUrl\"\r\n              alt=\"Page {{ i + 1 }} thumbnail\"\r\n              class=\"thumbnail-image\"\r\n            />\r\n            } @else {\r\n            <div class=\"thumbnail-placeholder\">\r\n              <span>Loading...</span>\r\n            </div>\r\n            }\r\n\r\n            <span>Page {{ i + 1 }}</span>\r\n          </div>\r\n          }\r\n        </div>\r\n        }\r\n\r\n        <!-- Table of Contents (Outline) View -->\r\n        @if (activeSidebarTab === 'toc') {\r\n        <div class=\"toc-container\">\r\n          @if (pdfOutline && pdfOutline.length > 0) {\r\n          <ng-container\r\n            *ngTemplateOutlet=\"outlineTree; context: { $implicit: pdfOutline }\"\r\n          ></ng-container>\r\n          } @else {\r\n          <div class=\"toc-empty-state\">\r\n            <img\r\n              src=\"assets/icons/toc-empty.svg\"\r\n              alt=\"No table of contents\"\r\n              width=\"24\"\r\n              height=\"24\"\r\n            />\r\n            <span>No table of contents</span>\r\n          </div>\r\n          }\r\n        </div>\r\n        }\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Recursive Template for Outline Items -->\r\n    <ng-template #outlineTree let-items>\r\n      <ul class=\"toc-list\">\r\n        @for (item of items; track item.title) {\r\n        <li class=\"toc-item\">\r\n          <div\r\n            class=\"toc-item-header\"\r\n            role=\"button\"\r\n            tabindex=\"0\"\r\n            (click)=\"goToOutlineItem(item)\"\r\n            (keydown.enter)=\"goToOutlineItem(item)\"\r\n            (keydown.space)=\"goToOutlineItem(item)\"\r\n            [class.active]=\"item.pageNumber === currentPage\"\r\n          >\r\n            @if (item.items && item.items.length > 0) {\r\n            <button\r\n              class=\"toc-toggle-btn\"\r\n              (click)=\"toggleOutlineItem(item, $event)\"\r\n            >\r\n              <img\r\n                src=\"assets/icons/toc-chevron.svg\"\r\n                alt=\"Toggle\"\r\n                class=\"toc-chevron\"\r\n                [class.expanded]=\"item.expanded\"\r\n                width=\"12\"\r\n                height=\"12\"\r\n              />\r\n            </button>\r\n            } @else {\r\n            <span class=\"toc-toggle-spacer\"></span>\r\n            }\r\n            <span class=\"toc-title\" [title]=\"item.title\">{{ item.title }}</span>\r\n          </div>\r\n\r\n          @if (item.items && item.items.length > 0 && item.expanded) {\r\n          <ng-container\r\n            *ngTemplateOutlet=\"outlineTree; context: { $implicit: item.items }\"\r\n          ></ng-container>\r\n          }\r\n        </li>\r\n        }\r\n      </ul>\r\n    </ng-template>\r\n\r\n    <!-- PDF -->\r\n\r\n    <div class=\"pdf-viewer\" #viewerContainer (scroll)=\"onViewerScroll($event)\">\r\n      <div\r\n        class=\"continuous-scroll-container\"\r\n        [class.multi-view-mode]=\"isMultiView\"\r\n      >\r\n        @for (page of pages; track $index; let i = $index) {\r\n        <div\r\n          [id]=\"'page-container-' + (i + 1)\"\r\n          [attr.data-page-number]=\"i + 1\"\r\n          class=\"page-container\"\r\n        >\r\n          <div class=\"page-canvas-wrapper\" [id]=\"'pageWrapper' + (i + 1)\">\r\n            <canvas [id]=\"'pageCanvas' + (i + 1)\"></canvas>\r\n            <div\r\n              [id]=\"'textLayer' + (i + 1)\"\r\n              class=\"textLayer\"\r\n              (mouseup)=\"onTextLayerMouseUp($event, i + 1)\"\r\n            ></div>\r\n          </div>\r\n        </div>\r\n        }\r\n      </div>\r\n\r\n      <!-- Floating Annotation Comment Card (Pic 1) -->\r\n      @if (showCommentBox && activeCommentAnnotation) {\r\n      <div\r\n        class=\"pdf-comment-card\"\r\n        [style.top.px]=\"commentBoxPosition.top\"\r\n        [style.left.px]=\"commentBoxPosition.left\"\r\n        tabindex=\"-1\"\r\n        (click)=\"$event.stopPropagation()\"\r\n        (keydown)=\"$event.stopPropagation()\"\r\n      >\r\n        <!-- Card Header -->\r\n        <div class=\"comment-card-header\">\r\n          <div class=\"comment-user-info\">\r\n            <!-- <div class=\"comment-user-avatar\">\r\n                    {{ activeCommentAnnotation.creator?.charAt(0) || 'G' }}\r\n                  </div> -->\r\n            <div class=\"comment-user-meta\">\r\n              <!-- <span class=\"comment-user-name\">{{ activeCommentAnnotation.creator || 'Gopika K G' }}</span>\r\n                    <span class=\"comment-user-time\">{{ getFormattedCommentTime(activeCommentAnnotation.createdAt) }}</span> -->\r\n            </div>\r\n          </div>\r\n          <div class=\"comment-header-actions\">\r\n            <button\r\n              type=\"button\"\r\n              class=\"btn-icon-header\"\r\n              title=\"Resolve comment\"\r\n              (click)=\"resolveAnnotation()\"\r\n            >\r\n              <svg\r\n                width=\"18\"\r\n                height=\"18\"\r\n                viewBox=\"0 0 24 24\"\r\n                fill=\"none\"\r\n                stroke=\"#2563eb\"\r\n                stroke-width=\"2.5\"\r\n                stroke-linecap=\"round\"\r\n                stroke-linejoin=\"round\"\r\n              >\r\n                <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n              </svg>\r\n            </button>\r\n            <div class=\"comment-menu-dropdown-wrapper\">\r\n              <button\r\n                type=\"button\"\r\n                class=\"btn-icon-header\"\r\n                title=\"More options\"\r\n                (click)=\"toggleCommentMenu()\"\r\n              >\r\n                <svg\r\n                  width=\"18\"\r\n                  height=\"18\"\r\n                  viewBox=\"0 0 24 24\"\r\n                  fill=\"currentColor\"\r\n                >\r\n                  <circle cx=\"12\" cy=\"5\" r=\"2\"></circle>\r\n                  <circle cx=\"12\" cy=\"12\" r=\"2\"></circle>\r\n                  <circle cx=\"12\" cy=\"19\" r=\"2\"></circle>\r\n                </svg>\r\n              </button>\r\n              @if (showCommentMenu) {\r\n              <div class=\"comment-dropdown-menu\">\r\n                <button\r\n                  type=\"button\"\r\n                  class=\"dropdown-menu-item\"\r\n                  (click)=\"editComment()\"\r\n                >\r\n                  Edit\r\n                </button>\r\n                <button\r\n                  type=\"button\"\r\n                  class=\"dropdown-menu-item text-danger\"\r\n                  (click)=\"deleteActiveAnnotation()\"\r\n                >\r\n                  Delete\r\n                </button>\r\n              </div>\r\n              }\r\n            </div>\r\n          </div>\r\n        </div>\r\n\r\n        @if (isNewAnnotation || isEditingComment) {\r\n        <!-- Input / Edit Mode -->\r\n        <div class=\"comment-input-wrapper\">\r\n          <textarea\r\n            class=\"comment-textarea\"\r\n            rows=\"2\"\r\n            [(ngModel)]=\"commentInputText\"\r\n            placeholder=\"Comment or add others with @\"\r\n            (keydown.enter)=\"$event.preventDefault(); saveComment()\"\r\n            (keydown.escape)=\"cancelComment()\"\r\n          ></textarea>\r\n          <span\r\n            class=\"comment-input-dot\"\r\n            [class.has-text]=\"commentInputText.trim().length > 0\"\r\n          ></span>\r\n        </div>\r\n\r\n        <div class=\"comment-card-actions\">\r\n          <button\r\n            type=\"button\"\r\n            class=\"btn-comment-cancel\"\r\n            (click)=\"cancelComment()\"\r\n          >\r\n            Cancel\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            class=\"btn-comment-submit\"\r\n            [class.is-active]=\"commentInputText.trim().length > 0\"\r\n            [disabled]=\"!commentInputText.trim()\"\r\n            (click)=\"saveComment()\"\r\n          >\r\n            Comment\r\n          </button>\r\n        </div>\r\n        } @else {\r\n        <!-- View Saved Comment Mode (Pic 1) -->\r\n        <div class=\"comment-view-wrapper\">\r\n          <div class=\"comment-text-content\">\r\n            {{ activeCommentAnnotation.comment }}\r\n          </div>\r\n\r\n          <!-- Reply Box at bottom of card -->\r\n          <div class=\"comment-reply-wrapper\">\r\n            <input\r\n              type=\"text\"\r\n              class=\"comment-reply-input\"\r\n              placeholder=\"Reply or add others with @\"\r\n              [(ngModel)]=\"commentReplyText\"\r\n              (keydown.enter)=\"submitReply()\"\r\n            />\r\n          </div>\r\n        </div>\r\n        }\r\n      </div>\r\n      }\r\n    </div>\r\n    }\r\n\r\n    <!-- Scroll to Top Component -->\r\n    <lib-scroll-to-top\r\n      [targetSelector]=\"'.docx-viewer, .pdf-viewer, .html-viewer'\"\r\n    ></lib-scroll-to-top>\r\n  </div>\r\n</div>\r\n}\r\n","/**\r\n * W3C-Compatible PDF Annotation Data Model\r\n * Derived from: packages/pdf-annotator/src/model/core/pdf-annotation.ts\r\n */\r\n\r\nexport interface PDFSelector {\r\n  pageNumber: number;\r\n  quote: string;\r\n  start: number; // Character offset from start of page\r\n  end: number; // Character offset from start of page\r\n  quadpoints?: number[]; // [x1, y1, x2, y2, x3, y3, x4, y4...] PDF coordinates\r\n}\r\n\r\nexport interface PDFAnnotation {\r\n  id: string;\r\n  selector: PDFSelector;\r\n  color?: string;\r\n  comment?: string;\r\n  createdAt?: string;\r\n  creator?: string;\r\n}\r\n\r\nexport interface TextNodeSegment {\r\n  node: Text;\r\n  start: number;\r\n  end: number;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}