{"version":3,"file":"ngx-universal-file-viewer.mjs","sources":["../../../projects/ngx-universal-file-viewer/src/lib/ngx-universal-file-viewer.component.ts","../../../projects/ngx-universal-file-viewer/src/lib/ngx-universal-file-viewer.module.ts","../../../projects/ngx-universal-file-viewer/src/public-api.ts","../../../projects/ngx-universal-file-viewer/src/ngx-universal-file-viewer.ts"],"sourcesContent":["import {\r\n  Component,\r\n  Input,\r\n  OnInit,\r\n  ViewChild,\r\n  ElementRef,\r\n  OnChanges,\r\n  SimpleChanges,\r\n  Output,\r\n  EventEmitter,\r\n  Inject,\r\n  PLATFORM_ID,\r\n  HostListener,\r\n  OnDestroy,\r\n  ChangeDetectorRef,\r\n  AfterViewInit,\r\n} from '@angular/core';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { FormsModule } from '@angular/forms';\r\nimport * as XLSX from 'xlsx';\r\nimport { renderAsync } from 'docx-preview';\r\n\r\ndeclare global {\r\n  interface Window { pdfjsLib: any; }\r\n}\r\n\r\nexport type ViewMode = 'continuous' | 'page';\r\n\r\nexport interface ToolbarConfig {\r\n \r\n  showPrint?: boolean;\r\n  showZoom?: boolean;\r\n  showRotation?: boolean;\r\n  showNavigation?: boolean;\r\n  showPageInput?: boolean;\r\n  showFitToWidth?: boolean;\r\n  showFullscreen?: boolean;\r\n  showSearch?: boolean;\r\n  showThumbnails?: boolean;\r\n  showViewModeToggle?: boolean;\r\n}\r\n\r\nexport interface ViewerConfig {\r\n  defaultViewMode?: ViewMode;\r\n \r\n  enablePrint?: boolean;\r\n  enableZoom?: boolean;\r\n  enableNavigation?: boolean;\r\n  enableViewModeToggle?: boolean;\r\n  pdfWorkerSrc?: string;\r\n  theme?: 'light' | 'dark';\r\n  height?: string;\r\n  useGoogleDocsViewer?: boolean;\r\n  forceChapterStartOnNewPage?: boolean;\r\n  enableWatermark?: boolean;\r\n  watermarkText?: string;\r\n  watermarkOpacity?: number;\r\n  disableCopy?: boolean;\r\n  disableRightClick?: boolean;\r\n  enableKeyboardShortcuts?: boolean;\r\n  mobileOptimized?: boolean;\r\n  autoFitMobile?: boolean;\r\n  mobileScale?: number;\r\n}\r\n\r\nexport interface PageChangeEvent {\r\n  page: number;\r\n  totalPages: number;\r\n  type: 'pdf' | 'word' | 'excel' | 'ppt';\r\n  viewMode: ViewMode;\r\n}\r\n\r\n@Component({\r\n  selector: 'ngx-universal-file-viewer',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  template: `\r\n    <div class=\"file-viewer-container\"\r\n         #viewerContainer\r\n         [class.dark-theme]=\"viewerConfig.theme === 'dark'\"\r\n         [class.loading-state]=\"isLoading\"\r\n         [class.continuous-mode]=\"viewMode === 'continuous'\"\r\n         [class.page-mode]=\"viewMode === 'page'\"\r\n         [class.mobile]=\"isMobileView\"\r\n         [class.fullscreen]=\"isFullscreen\"\r\n         [class.no-copy]=\"viewerConfig.disableCopy\"\r\n         [style.height]=\"viewerConfig.height || '100vh'\"\r\n         (contextmenu)=\"onContextMenu($event)\"\r\n         (touchstart)=\"onTouchStart($event)\"\r\n         (touchmove)=\"onTouchMove($event)\"\r\n         (touchend)=\"onTouchEnd($event)\">\r\n\r\n      <!-- Watermark -->\r\n      <div class=\"watermark\"\r\n           *ngIf=\"viewerConfig.enableWatermark && viewerConfig.watermarkText\"\r\n           [style.opacity]=\"viewerConfig.watermarkOpacity || 0.08\">\r\n        {{ viewerConfig.watermarkText }}\r\n      </div>\r\n\r\n      <!-- LOADER -->\r\n      <div class=\"loader-overlay\" *ngIf=\"isLoading\">\r\n        <div class=\"loader-card\">\r\n          <div class=\"loader-spinner\">\r\n            <svg class=\"spinner-svg\" viewBox=\"0 0 50 50\">\r\n              <circle class=\"spinner-path\" cx=\"25\" cy=\"25\" r=\"20\"\r\n                      fill=\"none\" stroke-width=\"4\"></circle>\r\n            </svg>\r\n          </div>\r\n          <p class=\"loader-text\">{{ loadingMessage }}</p>\r\n          <div class=\"progress-bar\" *ngIf=\"loadingProgress > 0 && loadingProgress < 100\">\r\n            <div class=\"progress-fill\" [style.width.%]=\"loadingProgress\"></div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- ERROR -->\r\n      <div class=\"error-overlay\" *ngIf=\"errorMessage && !isLoading\">\r\n        <div class=\"error-card\">\r\n          <div class=\"error-icon-wrap\">\r\n            <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"48\" height=\"48\">\r\n              <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10\r\n                       10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/>\r\n            </svg>\r\n          </div>\r\n          <h3>Unable to Load File</h3>\r\n          <p>{{ errorMessage }}</p>\r\n          <button (click)=\"retry()\" class=\"retry-btn\">\r\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n              <path d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99\r\n                       3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55\r\n                       7.73-6h-2.08c-.82 2.33-3.04 4-5.65\r\n                       4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0\r\n                       3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"/>\r\n            </svg>\r\n            Try Again\r\n          </button>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- PDF VIEWER -->\r\n      <div class=\"pdf-viewer\" *ngIf=\"fileType==='pdf' && !isLoading && !errorMessage\">\r\n\r\n        <!-- Desktop Toolbar -->\r\n        <div class=\"toolbar desktop-toolbar\" *ngIf=\"showToolbar && !isMobileView\">\r\n          <div class=\"toolbar-group\" *ngIf=\"toolbarConfig.showViewModeToggle !== false\">\r\n            <button class=\"btn btn-primary\" (click)=\"toggleViewMode()\" title=\"Toggle View Mode\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path *ngIf=\"viewMode==='continuous'\"\r\n                  d=\"M3 3v8h8V3H3zm6 6H5V5h4v4zm-6 4v8h8v-8H3zm6\r\n                     6H5v-4h4v4zm4-16v8h8V3h-8zm6 6h-4V5h4v4zm-6\r\n                     4v8h8v-8h-8zm6 6h-4v-4h4v4z\"/>\r\n                <path *ngIf=\"viewMode==='page'\"\r\n                  d=\"M3 9h18v2H3V9zm0 4h18v2H3v-2z\"/>\r\n              </svg>\r\n              {{ viewMode === 'continuous' ? 'Page View' : 'Continuous' }}\r\n            </button>\r\n          </div>\r\n\r\n          <div class=\"toolbar-group\" *ngIf=\"toolbarConfig.showNavigation !== false && viewMode==='page'\">\r\n            <button class=\"btn icon-btn\" (click)=\"firstPage()\" [disabled]=\"currentPage<=1\" title=\"First\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z\"/>\r\n              </svg>\r\n            </button>\r\n            <button class=\"btn icon-btn\" (click)=\"previousPage()\" [disabled]=\"currentPage<=1\" title=\"Previous\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>\r\n              </svg>\r\n            </button>\r\n            <div class=\"page-info\">\r\n              <input *ngIf=\"toolbarConfig.showPageInput !== false\"\r\n                     type=\"number\" [(ngModel)]=\"currentPage\"\r\n                     (change)=\"goToPage()\"\r\n                     [min]=\"1\" [max]=\"totalPages\"\r\n                     class=\"page-input\"/>\r\n              <span *ngIf=\"toolbarConfig.showPageInput===false\">{{ currentPage }}</span>\r\n              <span class=\"page-sep\">of</span>\r\n              <span class=\"page-total\">{{ totalPages }}</span>\r\n            </div>\r\n            <button class=\"btn icon-btn\" (click)=\"nextPage()\" [disabled]=\"currentPage>=totalPages\" title=\"Next\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/>\r\n              </svg>\r\n            </button>\r\n            <button class=\"btn icon-btn\" (click)=\"lastPage()\" [disabled]=\"currentPage>=totalPages\" title=\"Last\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n\r\n          <div class=\"toolbar-group\" *ngIf=\"toolbarConfig.showZoom !== false\">\r\n            <button class=\"btn icon-btn\" (click)=\"zoomOut()\" [disabled]=\"scale<=0.25\" title=\"Zoom Out\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M19 13H5v-2h14v2z\"/>\r\n              </svg>\r\n            </button>\r\n            <button class=\"zoom-label\" (click)=\"resetZoom()\" title=\"Reset Zoom\">\r\n              {{ (scale * 100).toFixed(0) }}%\r\n            </button>\r\n            <button class=\"btn icon-btn\" (click)=\"zoomIn()\" [disabled]=\"scale>=3\" title=\"Zoom In\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\r\n              </svg>\r\n            </button>\r\n            <button class=\"btn icon-btn\" (click)=\"fitToWidth()\" title=\"Fit Width\"\r\n                    *ngIf=\"toolbarConfig.showFitToWidth !== false\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M9 3L5 7l4 4V8h8v3l4-4-4-4v3H9V3z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n\r\n          <div class=\"toolbar-group\" *ngIf=\"toolbarConfig.showRotation !== false\">\r\n            <button class=\"btn icon-btn\" (click)=\"rotate(-90)\" title=\"Rotate Left\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M7.11 8.53L5.7 7.11C4.8 8.27 4.24 9.61 4.07\r\n                         11h2.02c.14-.87.49-1.72 1.02-2.47zM6.09 13H4.07c.17\r\n                         1.39.72 2.73 1.62 3.89l1.41-1.42c-.52-.75-.88-1.59-1.01-2.47zm1.01\r\n                         5.32c1.16.9 2.51 1.44 3.9 1.61V17.9c-.87-.15-1.71-.49-2.46-1.03L7.1\r\n                         18.32zM13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5 2.94 5\r\n                         5.91s-2.16 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93s-3.05-7.44-7-7.93z\"/>\r\n              </svg>\r\n            </button>\r\n            <button class=\"btn icon-btn\" (click)=\"rotate(90)\" title=\"Rotate Right\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M15.55 5.55L11 1v3.07C7.06 4.56 4 7.92 4 12s3.05\r\n                         7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43\r\n                         5-5.91V10l4.55-4.45zM19.93 11c-.17-1.39-.72-2.73-1.62-3.89l-1.42\r\n                         1.42c.54.75.88 1.6 1.02 2.47h2.02zM13 17.9v2.02c1.39-.17\r\n                         2.74-.71 3.9-1.61l-1.44-1.44c-.75.54-1.59.89-2.46\r\n                         1.03zm3.89-2.42l1.42 1.41c.9-1.16 1.45-2.5\r\n                         1.62-3.89h-2.02c-.14.87-.48 1.72-1.02 2.48z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n\r\n          <div class=\"toolbar-group toolbar-right\">\r\n           \r\n            <button class=\"btn icon-btn\" (click)=\"toggleFullscreen()\"\r\n                    *ngIf=\"toolbarConfig.showFullscreen !== false\" title=\"Fullscreen\">\r\n              <svg *ngIf=\"!isFullscreen\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12\r\n                         7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"/>\r\n              </svg>\r\n              <svg *ngIf=\"isFullscreen\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6\r\n                         11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Mobile Toolbar -->\r\n        <div class=\"mobile-toolbar\" *ngIf=\"showToolbar && isMobileView\">\r\n          <div class=\"mobile-tb-main\">\r\n            <button class=\"mob-btn\" (click)=\"previousPage()\" [disabled]=\"currentPage<=1\">\r\n              <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>\r\n              </svg>\r\n            </button>\r\n            <div class=\"mob-center\">\r\n              <span class=\"mob-page\">{{ currentPage }} / {{ totalPages }}</span>\r\n              <span class=\"mob-zoom\">{{ (scale * 100).toFixed(0) }}%</span>\r\n            </div>\r\n            <button class=\"mob-btn\" (click)=\"nextPage()\" [disabled]=\"currentPage>=totalPages\">\r\n              <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/>\r\n              </svg>\r\n            </button>\r\n            <button class=\"mob-btn mob-more\" (click)=\"toggleMobileMenu()\"\r\n                    [class.active]=\"showMobileMenu\">\r\n              <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9\r\n                         2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2\r\n                         2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2\r\n                         2 2 2-.9 2-2-.9-2-2-2z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n          <div class=\"mob-menu-panel\" *ngIf=\"showMobileMenu\">\r\n            <div class=\"mob-menu-row\">\r\n              <button class=\"mob-menu-btn\" (click)=\"zoomOut(); closeMobileMenu()\" [disabled]=\"scale<=0.25\">\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                  <path d=\"M19 13H5v-2h14v2z\"/>\r\n                </svg>\r\n                Zoom Out\r\n              </button>\r\n              <button class=\"mob-menu-btn\" (click)=\"fitToWidth(); closeMobileMenu()\">\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                  <path d=\"M9 3L5 7l4 4V8h8v3l4-4-4-4v3H9V3z\"/>\r\n                </svg>\r\n                Fit Width\r\n              </button>\r\n              <button class=\"mob-menu-btn\" (click)=\"zoomIn(); closeMobileMenu()\" [disabled]=\"scale>=3\">\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                  <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\r\n                </svg>\r\n                Zoom In\r\n              </button>\r\n            </div>\r\n            <div class=\"mob-menu-row\">\r\n              <button class=\"mob-menu-btn\" (click)=\"rotate(-90); closeMobileMenu()\">\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                  <path d=\"M13 4.07V1L8.45 5.55 13 10V6.09c2.84.48 5\r\n                           2.94 5 5.91s-2.16 5.43-5 5.91v2.02c3.95-.49\r\n                           7-3.85 7-7.93s-3.05-7.44-7-7.93z\"/>\r\n                </svg>\r\n                Rotate L\r\n              </button>\r\n              <button class=\"mob-menu-btn\" (click)=\"toggleViewMode(); closeMobileMenu()\">\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                  <path d=\"M3 9h18v2H3V9zm0 4h18v2H3v-2z\"/>\r\n                </svg>\r\n                {{ viewMode === 'continuous' ? 'Page' : 'Scroll' }}\r\n              </button>\r\n              <button class=\"mob-menu-btn\" (click)=\"rotate(90); closeMobileMenu()\">\r\n                <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                  <path d=\"M15.55 5.55L11 1v3.07C7.06 4.56 4 7.92 4\r\n                           12s3.05 7.44 7 7.93v-2.02c-2.84-.48-5-2.94-5-5.91s2.16-5.43\r\n                           5-5.91V10l4.55-4.45z\"/>\r\n                </svg>\r\n                Rotate R\r\n              </button>\r\n            </div>\r\n           \r\n          </div>\r\n        </div>\r\n\r\n        <!-- Page Mode Canvas -->\r\n        <div class=\"pdf-page-view\" #canvasContainer *ngIf=\"viewMode==='page'\">\r\n          <div class=\"canvas-wrapper\" #canvasWrapper>\r\n            <canvas #pdfCanvas></canvas>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Continuous Mode -->\r\n        <div class=\"pdf-scroll-view\" *ngIf=\"viewMode==='continuous'\"\r\n             #continuousContainer\r\n             (scroll)=\"onContinuousScroll($event)\">\r\n          <div *ngFor=\"let p of pdfPagesArray\"\r\n               class=\"pdf-page-block\"\r\n               [attr.data-page]=\"p\">\r\n            <span class=\"page-badge\">{{ p }}</span>\r\n            <canvas [id]=\"'pdf-page-' + p\"></canvas>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- WORD VIEWER -->\r\n      <div class=\"word-viewer\" *ngIf=\"fileType==='word' && !isLoading && !errorMessage\">\r\n        <div class=\"toolbar desktop-toolbar\" *ngIf=\"showToolbar && !isMobileView\">\r\n          <div class=\"toolbar-group\" *ngIf=\"toolbarConfig.showZoom !== false\">\r\n            <button class=\"btn icon-btn\" (click)=\"zoomOutWord()\" [disabled]=\"wordZoom<=0.3\" title=\"Zoom Out\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M19 13H5v-2h14v2z\"/>\r\n              </svg>\r\n            </button>\r\n            <button class=\"zoom-label\" (click)=\"resetWordZoom()\" title=\"Reset\">\r\n              {{ (wordZoom * 100).toFixed(0) }}%\r\n            </button>\r\n            <button class=\"btn icon-btn\" (click)=\"zoomInWord()\" [disabled]=\"wordZoom>=2\" title=\"Zoom In\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\r\n              </svg>\r\n            </button>\r\n            <button class=\"btn icon-btn\" (click)=\"fitToPageWidth()\" title=\"Fit Width\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M9 3L5 7l4 4V8h8v3l4-4-4-4v3H9V3z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n          <div class=\"toolbar-group toolbar-right\">\r\n           \r\n            <button class=\"btn icon-btn\" (click)=\"toggleFullscreen()\" title=\"Fullscreen\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12\r\n                         7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n        </div>\r\n\r\n        <div class=\"mobile-toolbar\" *ngIf=\"showToolbar && isMobileView\">\r\n          <div class=\"mobile-tb-main\">\r\n            <button class=\"mob-btn\" (click)=\"zoomOutWord()\" [disabled]=\"wordZoom<=0.3\">\r\n              <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M19 13H5v-2h14v2z\"/>\r\n              </svg>\r\n            </button>\r\n            <button class=\"mob-center-btn\" (click)=\"fitToPageWidth()\">\r\n              <span class=\"mob-zoom\">{{ (wordZoom*100).toFixed(0) }}%</span>\r\n              <span class=\"mob-hint\">tap to fit</span>\r\n            </button>\r\n            <button class=\"mob-btn\" (click)=\"zoomInWord()\" [disabled]=\"wordZoom>=2\">\r\n              <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n        </div>\r\n\r\n        <iframe *ngIf=\"useGoogleViewer && isPublicUrl\"\r\n                [src]=\"googleDocsViewerUrl\"\r\n                class=\"google-iframe\">\r\n        </iframe>\r\n\r\n        <div class=\"word-scroll-view\" #wordRoot *ngIf=\"!useGoogleViewer\">\r\n          <div class=\"docx-scale-wrapper\" [style.transform]=\"'scale('+wordZoom+')'\">\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- EXCEL VIEWER -->\r\n      <div class=\"excel-viewer\" *ngIf=\"fileType==='excel' && !isLoading && !errorMessage\">\r\n        <div class=\"toolbar desktop-toolbar\" *ngIf=\"showToolbar && !isMobileView\">\r\n          <div class=\"toolbar-group\">\r\n            <label class=\"toolbar-label\">Sheet:</label>\r\n            <select [(ngModel)]=\"currentSheet\" (ngModelChange)=\"onSheetChange()\" class=\"styled-select\">\r\n              <option *ngFor=\"let s of excelSheets; let i=index\" [value]=\"i\">{{ s }}</option>\r\n            </select>\r\n          </div>\r\n          <div class=\"toolbar-group toolbar-right\">\r\n           \r\n          </div>\r\n        </div>\r\n        <div class=\"mobile-toolbar\" *ngIf=\"showToolbar && isMobileView\">\r\n          <select [(ngModel)]=\"currentSheet\" (ngModelChange)=\"onSheetChange()\" class=\"mob-sheet-select\">\r\n            <option *ngFor=\"let s of excelSheets; let i=index\" [value]=\"i\">{{ s }}</option>\r\n          </select>\r\n        </div>\r\n        <div class=\"excel-scroll-view\">\r\n          <div class=\"excel-table-wrap\" [innerHTML]=\"excelContent\"></div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- PPT VIEWER -->\r\n      <div class=\"ppt-viewer\" *ngIf=\"fileType==='ppt' && !isLoading && !errorMessage\">\r\n        <div class=\"toolbar desktop-toolbar\" *ngIf=\"showToolbar && !isMobileView\">\r\n          <div class=\"toolbar-group\">\r\n            <button class=\"btn icon-btn\" (click)=\"previousSlide()\" [disabled]=\"currentSlide<=1\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>\r\n              </svg>\r\n            </button>\r\n            <span class=\"page-info\">\r\n              <strong>{{ currentSlide }}</strong> / {{ totalSlides }}\r\n            </span>\r\n            <button class=\"btn icon-btn\" (click)=\"nextSlide()\" [disabled]=\"currentSlide>=totalSlides\">\r\n              <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n        </div>\r\n        <div class=\"mobile-toolbar\" *ngIf=\"showToolbar && isMobileView\">\r\n          <div class=\"mobile-tb-main\">\r\n            <button class=\"mob-btn\" (click)=\"previousSlide()\" [disabled]=\"currentSlide<=1\">\r\n              <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>\r\n              </svg>\r\n            </button>\r\n            <span class=\"mob-center\">{{ currentSlide }} / {{ totalSlides }}</span>\r\n            <button class=\"mob-btn\" (click)=\"nextSlide()\" [disabled]=\"currentSlide>=totalSlides\">\r\n              <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n                <path d=\"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\"/>\r\n              </svg>\r\n            </button>\r\n          </div>\r\n        </div>\r\n        <div class=\"ppt-slide-view\" [innerHTML]=\"slideContent\"></div>\r\n      </div>\r\n\r\n      <!-- Keyboard Help Modal -->\r\n      <div class=\"kb-help-overlay\" *ngIf=\"showKeyboardHelp\" (click)=\"toggleKeyboardHelp()\">\r\n        <div class=\"kb-help-card\" (click)=\"$event.stopPropagation()\">\r\n          <h3>⌨️ Keyboard Shortcuts</h3>\r\n          <div class=\"kb-list\">\r\n            <div class=\"kb-item\"><kbd>←</kbd><span>Previous Page</span></div>\r\n            <div class=\"kb-item\"><kbd>→</kbd><span>Next Page</span></div>\r\n            <div class=\"kb-item\"><kbd>+</kbd><span>Zoom In</span></div>\r\n            <div class=\"kb-item\"><kbd>−</kbd><span>Zoom Out</span></div>\r\n            <div class=\"kb-item\"><kbd>F</kbd><span>Fullscreen</span></div>\r\n            <div class=\"kb-item\"><kbd>?</kbd><span>This Help</span></div>\r\n          </div>\r\n          <button (click)=\"toggleKeyboardHelp()\" class=\"kb-close-btn\">Close</button>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  `,\r\n  styles: [`\r\n    :host {\r\n      display: block;\r\n      width: 100%;\r\n      -webkit-font-smoothing: antialiased;\r\n    }\r\n\r\n    *, *::before, *::after {\r\n      box-sizing: border-box;\r\n      -webkit-tap-highlight-color: transparent;\r\n    }\r\n\r\n    .file-viewer-container {\r\n      position: relative;\r\n      display: flex;\r\n      flex-direction: column;\r\n      width: 100%;\r\n      height: 100vh;\r\n      background: #f0f2f5;\r\n      overflow: hidden;\r\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n    }\r\n\r\n    .file-viewer-container.fullscreen {\r\n      position: fixed;\r\n      inset: 0;\r\n      z-index: 9999;\r\n      border-radius: 0;\r\n      height: 100vh !important;\r\n    }\r\n\r\n    .file-viewer-container.no-copy {\r\n      user-select: none;\r\n      -webkit-user-select: none;\r\n    }\r\n\r\n    .file-viewer-container.dark-theme {\r\n      background: #1a1a2e;\r\n      color: #e0e0e0;\r\n    }\r\n\r\n    .dark-theme .toolbar { background: #16213e; border-color: #0f3460; }\r\n    .dark-theme .btn { background: #0f3460; color: #e0e0e0; border-color: #1a4a8a; }\r\n    .dark-theme .zoom-label { color: #e0e0e0; }\r\n\r\n    .watermark {\r\n      position: absolute;\r\n      top: 50%;\r\n      left: 50%;\r\n      transform: translate(-50%, -50%) rotate(-35deg);\r\n      font-size: clamp(32px, 8vw, 80px);\r\n      font-weight: 900;\r\n      color: #000;\r\n      pointer-events: none;\r\n      z-index: 500;\r\n      white-space: nowrap;\r\n      user-select: none;\r\n      letter-spacing: 4px;\r\n    }\r\n\r\n    .loader-overlay {\r\n      position: absolute;\r\n      inset: 0;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      background: rgba(255,255,255,0.97);\r\n      z-index: 1000;\r\n      backdrop-filter: blur(4px);\r\n    }\r\n\r\n    .loader-card {\r\n      text-align: center;\r\n      padding: 40px 48px;\r\n      background: #fff;\r\n      border-radius: 16px;\r\n      box-shadow: 0 8px 32px rgba(0,0,0,0.12);\r\n      min-width: 200px;\r\n    }\r\n\r\n    .loader-spinner {\r\n      display: flex;\r\n      justify-content: center;\r\n      margin-bottom: 16px;\r\n    }\r\n\r\n    .spinner-svg {\r\n      width: 48px;\r\n      height: 48px;\r\n      animation: rotate 1.4s linear infinite;\r\n    }\r\n\r\n    .spinner-path {\r\n      stroke: #3498db;\r\n      stroke-linecap: round;\r\n      stroke-dasharray: 80;\r\n      stroke-dashoffset: 60;\r\n      animation: dash 1.4s ease-in-out infinite;\r\n    }\r\n\r\n    @keyframes rotate { 100% { transform: rotate(360deg); } }\r\n    @keyframes dash {\r\n      0% { stroke-dashoffset: 80; }\r\n      50% { stroke-dashoffset: 20; }\r\n      100% { stroke-dashoffset: 80; }\r\n    }\r\n\r\n    .loader-text { color: #666; font-size: 14px; margin: 0 0 12px; }\r\n\r\n    .progress-bar {\r\n      width: 180px;\r\n      height: 4px;\r\n      background: #e8ecf0;\r\n      border-radius: 2px;\r\n      overflow: hidden;\r\n      margin: 0 auto;\r\n    }\r\n\r\n    .progress-fill {\r\n      height: 100%;\r\n      background: linear-gradient(90deg, #3498db, #2980b9);\r\n      border-radius: 2px;\r\n      transition: width 0.3s ease;\r\n    }\r\n\r\n    .error-overlay {\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      height: 100%;\r\n      padding: 24px;\r\n    }\r\n\r\n    .error-card {\r\n      text-align: center;\r\n      max-width: 360px;\r\n      background: #fff;\r\n      padding: 40px 32px;\r\n      border-radius: 16px;\r\n      box-shadow: 0 4px 20px rgba(0,0,0,0.08);\r\n    }\r\n\r\n    .error-icon-wrap { color: #e74c3c; margin-bottom: 16px; }\r\n    .error-card h3 { margin: 0 0 8px; font-size: 20px; color: #2c3e50; }\r\n    .error-card p { color: #7f8c8d; font-size: 14px; margin: 0 0 20px; }\r\n\r\n    .retry-btn {\r\n      display: inline-flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      padding: 12px 28px;\r\n      background: linear-gradient(135deg, #3498db, #2980b9);\r\n      color: #fff;\r\n      border: none;\r\n      border-radius: 10px;\r\n      cursor: pointer;\r\n      font-size: 15px;\r\n      font-weight: 500;\r\n      transition: transform 0.2s, box-shadow 0.2s;\r\n      box-shadow: 0 4px 12px rgba(52,152,219,0.35);\r\n    }\r\n\r\n    .retry-btn:hover {\r\n      transform: translateY(-1px);\r\n      box-shadow: 0 6px 16px rgba(52,152,219,0.45);\r\n    }\r\n\r\n    .toolbar {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n      padding: 0 16px;\r\n      background: #ffffff;\r\n      border-bottom: 1px solid #e8ecf0;\r\n      box-shadow: 0 1px 4px rgba(0,0,0,0.06);\r\n      flex-shrink: 0;\r\n      flex-wrap: wrap;\r\n      min-height: 52px;\r\n    }\r\n\r\n    .toolbar-group {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 4px;\r\n      padding: 8px 0;\r\n    }\r\n\r\n    .toolbar-group:not(:last-child) {\r\n      border-right: 1px solid #e8ecf0;\r\n      padding-right: 12px;\r\n      margin-right: 4px;\r\n    }\r\n\r\n    .toolbar-right { margin-left: auto; border-right: none !important; }\r\n    .toolbar-label { font-size: 13px; color: #666; margin-right: 4px; }\r\n\r\n    .btn {\r\n      display: inline-flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      gap: 6px;\r\n      height: 34px;\r\n      padding: 0 12px;\r\n      background: #fff;\r\n      color: #374151;\r\n      border: 1px solid #d1d5db;\r\n      border-radius: 7px;\r\n      cursor: pointer;\r\n      font-size: 13px;\r\n      font-weight: 500;\r\n      transition: all 0.15s ease;\r\n      white-space: nowrap;\r\n    }\r\n\r\n    .btn:hover:not(:disabled) { background: #f3f4f6; border-color: #9ca3af; }\r\n    .btn:active:not(:disabled) { background: #e5e7eb; transform: scale(0.97); }\r\n    .btn:disabled { opacity: 0.38; cursor: not-allowed; }\r\n\r\n    .btn-primary { background: #3498db; color: #fff; border-color: #2980b9; }\r\n    .btn-primary:hover:not(:disabled) { background: #2980b9; border-color: #2471a3; }\r\n    .icon-btn { width: 34px; padding: 0; }\r\n\r\n    .zoom-label {\r\n      min-width: 52px;\r\n      height: 34px;\r\n      padding: 0 10px;\r\n      background: #f3f4f6;\r\n      border: 1px solid #d1d5db;\r\n      border-radius: 7px;\r\n      font-size: 13px;\r\n      font-weight: 600;\r\n      color: #374151;\r\n      cursor: pointer;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      transition: background 0.15s;\r\n    }\r\n\r\n    .zoom-label:hover { background: #e5e7eb; }\r\n\r\n    .page-info {\r\n      display: flex;\r\n      align-items: center;\r\n      gap: 6px;\r\n      padding: 0 8px;\r\n      font-size: 13px;\r\n      color: #6b7280;\r\n    }\r\n\r\n    .page-input {\r\n      width: 48px;\r\n      height: 30px;\r\n      padding: 0 6px;\r\n      border: 1px solid #d1d5db;\r\n      border-radius: 6px;\r\n      text-align: center;\r\n      font-size: 13px;\r\n      font-weight: 600;\r\n      color: #374151;\r\n      outline: none;\r\n      transition: border-color 0.15s;\r\n    }\r\n\r\n    .page-input:focus { border-color: #3498db; }\r\n    .page-sep { color: #9ca3af; }\r\n    .page-total { font-weight: 600; color: #374151; }\r\n\r\n    .styled-select {\r\n      height: 34px;\r\n      padding: 0 10px;\r\n      border: 1px solid #d1d5db;\r\n      border-radius: 7px;\r\n      background: #fff;\r\n      font-size: 13px;\r\n      color: #374151;\r\n      cursor: pointer;\r\n      outline: none;\r\n      max-width: 180px;\r\n    }\r\n\r\n    .mobile-toolbar {\r\n      position: relative;\r\n      background: #fff;\r\n      border-top: 1px solid #e8ecf0;\r\n      box-shadow: 0 -2px 12px rgba(0,0,0,0.08);\r\n      flex-shrink: 0;\r\n      z-index: 100;\r\n      padding-bottom: env(safe-area-inset-bottom, 0px);\r\n    }\r\n\r\n    .mobile-tb-main {\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: space-between;\r\n      padding: 8px 12px;\r\n      gap: 8px;\r\n      min-height: 56px;\r\n    }\r\n\r\n    .mob-btn {\r\n      display: inline-flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      width: 44px;\r\n      height: 44px;\r\n      background: #f3f4f6;\r\n      color: #374151;\r\n      border: 1px solid #e5e7eb;\r\n      border-radius: 50%;\r\n      cursor: pointer;\r\n      transition: all 0.15s;\r\n      flex-shrink: 0;\r\n      touch-action: manipulation;\r\n    }\r\n\r\n    .mob-btn:active:not(:disabled) {\r\n      background: #3498db;\r\n      color: #fff;\r\n      border-color: #3498db;\r\n      transform: scale(0.92);\r\n    }\r\n\r\n    .mob-btn:disabled { opacity: 0.35; cursor: not-allowed; }\r\n    .mob-more { background: #3498db; color: #fff; border-color: #3498db; }\r\n    .mob-more.active { background: #2980b9; }\r\n\r\n    .mob-center {\r\n      flex: 1;\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      justify-content: center;\r\n      gap: 2px;\r\n    }\r\n\r\n    .mob-page { font-size: 15px; font-weight: 700; color: #374151; }\r\n    .mob-zoom { font-size: 11px; font-weight: 500; color: #9ca3af; }\r\n\r\n    .mob-center-btn {\r\n      flex: 1;\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      justify-content: center;\r\n      padding: 8px;\r\n      background: #f3f4f6;\r\n      border: 1px solid #e5e7eb;\r\n      border-radius: 10px;\r\n      cursor: pointer;\r\n      touch-action: manipulation;\r\n    }\r\n\r\n    .mob-hint { font-size: 10px; color: #9ca3af; }\r\n\r\n    .mob-menu-panel {\r\n      border-top: 1px solid #f0f0f0;\r\n      padding: 8px 12px 12px;\r\n      animation: slideUp 0.2s ease;\r\n    }\r\n\r\n    @keyframes slideUp {\r\n      from { opacity: 0; transform: translateY(10px); }\r\n      to   { opacity: 1; transform: translateY(0); }\r\n    }\r\n\r\n    .mob-menu-row { display: flex; gap: 8px; margin-bottom: 8px; }\r\n\r\n    .mob-menu-btn {\r\n      flex: 1;\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      gap: 4px;\r\n      padding: 10px 4px;\r\n      background: #f8f9fa;\r\n      color: #374151;\r\n      border: 1px solid #e5e7eb;\r\n      border-radius: 10px;\r\n      font-size: 11px;\r\n      font-weight: 500;\r\n      cursor: pointer;\r\n      touch-action: manipulation;\r\n      transition: all 0.15s;\r\n    }\r\n\r\n    .mob-menu-btn:active:not(:disabled) {\r\n      background: #3498db;\r\n      color: #fff;\r\n      border-color: #3498db;\r\n    }\r\n\r\n    .mob-menu-btn:disabled { opacity: 0.35; }\r\n\r\n    .mob-download {\r\n      background: linear-gradient(135deg, #27ae60, #229954);\r\n      color: #fff;\r\n      border-color: #27ae60;\r\n    }\r\n\r\n    .mob-sheet-select {\r\n      width: 100%;\r\n      padding: 10px 12px;\r\n      border: none;\r\n      border-top: 1px solid #f0f0f0;\r\n      font-size: 14px;\r\n      color: #374151;\r\n      background: #fff;\r\n      outline: none;\r\n    }\r\n\r\n    .pdf-viewer {\r\n      flex: 1;\r\n      display: flex;\r\n      flex-direction: column;\r\n      overflow: hidden;\r\n      min-height: 0;\r\n    }\r\n\r\n    .pdf-page-view {\r\n      flex: 1;\r\n      overflow: auto;\r\n      display: flex;\r\n      justify-content: center;\r\n      align-items: flex-start;\r\n      padding: 24px;\r\n      background: #525659;\r\n      -webkit-overflow-scrolling: touch;\r\n    }\r\n\r\n    .canvas-wrapper {\r\n      display: flex;\r\n      justify-content: center;\r\n      align-items: flex-start;\r\n    }\r\n\r\n    .pdf-page-view canvas {\r\n      display: block;\r\n      box-shadow: 0 4px 24px rgba(0,0,0,0.35);\r\n      background: #fff;\r\n      max-width: 100%;\r\n    }\r\n\r\n    .pdf-scroll-view {\r\n      flex: 1;\r\n      overflow-y: auto;\r\n      overflow-x: auto;\r\n      padding: 16px;\r\n      background: #525659;\r\n      -webkit-overflow-scrolling: touch;\r\n    }\r\n\r\n    .pdf-page-block {\r\n      position: relative;\r\n      display: flex;\r\n      justify-content: center;\r\n      margin-bottom: 16px;\r\n    }\r\n\r\n    .pdf-page-block canvas {\r\n      display: block;\r\n      box-shadow: 0 4px 24px rgba(0,0,0,0.35);\r\n      background: #fff;\r\n      max-width: 100%;\r\n    }\r\n\r\n    .page-badge {\r\n      position: absolute;\r\n      top: 8px;\r\n      right: 8px;\r\n      background: rgba(0,0,0,0.65);\r\n      color: #fff;\r\n      padding: 3px 8px;\r\n      border-radius: 20px;\r\n      font-size: 11px;\r\n      font-weight: 500;\r\n      pointer-events: none;\r\n      z-index: 10;\r\n    }\r\n\r\n    .word-viewer {\r\n      flex: 1;\r\n      display: flex;\r\n      flex-direction: column;\r\n      overflow: hidden;\r\n      min-height: 0;\r\n    }\r\n\r\n    .word-scroll-view {\r\n      flex: 1;\r\n      overflow: auto;\r\n      background: #525659;\r\n      padding: 20px;\r\n      display: flex;\r\n      justify-content: center;\r\n      align-items: flex-start;\r\n      -webkit-overflow-scrolling: touch;\r\n    }\r\n\r\n    .docx-scale-wrapper {\r\n      transform-origin: top center;\r\n      transition: transform 0.2s ease;\r\n      width: 100%;\r\n    }\r\n\r\n    ::ng-deep .docx-scale-wrapper .docx {\r\n      font-family: 'Calibri', 'Arial', sans-serif !important;\r\n    }\r\n\r\n    ::ng-deep .docx-scale-wrapper .docx-wrapper {\r\n      padding: 0 !important;\r\n      background: transparent !important;\r\n    }\r\n\r\n    ::ng-deep .docx-scale-wrapper section.docx {\r\n      background: #fff;\r\n      box-shadow: 0 4px 24px rgba(0,0,0,0.25);\r\n      margin: 0 auto 16px !important;\r\n      padding: 60px 72px !important;\r\n    }\r\n\r\n    ::ng-deep .docx-scale-wrapper section.docx * {\r\n      word-wrap: break-word !important;\r\n      overflow-wrap: break-word !important;\r\n    }\r\n\r\n    ::ng-deep .docx-scale-wrapper img { max-width: 100% !important; height: auto !important; }\r\n    ::ng-deep .docx-scale-wrapper table { max-width: 100% !important; border-collapse: collapse; }\r\n\r\n    .google-iframe { flex: 1; border: none; width: 100%; height: 100%; }\r\n\r\n    .excel-viewer {\r\n      flex: 1;\r\n      display: flex;\r\n      flex-direction: column;\r\n      overflow: hidden;\r\n      min-height: 0;\r\n    }\r\n\r\n    .excel-scroll-view { flex: 1; overflow: auto; background: #fff; -webkit-overflow-scrolling: touch; }\r\n    .excel-table-wrap { padding: 0; }\r\n\r\n    ::ng-deep .excel-table-wrap table { border-collapse: collapse; font-size: 13px; width: 100%; }\r\n    ::ng-deep .excel-table-wrap th,\r\n    ::ng-deep .excel-table-wrap td { border: 1px solid #e5e7eb; padding: 8px 12px; white-space: nowrap; }\r\n    ::ng-deep .excel-table-wrap th {\r\n      background: #1d4ed8;\r\n      color: #fff;\r\n      font-weight: 600;\r\n      position: sticky;\r\n      top: 0;\r\n      z-index: 10;\r\n    }\r\n    ::ng-deep .excel-table-wrap tr:nth-child(even) td { background: #f8fafc; }\r\n    ::ng-deep .excel-table-wrap tr:hover td { background: #eff6ff; }\r\n\r\n    .ppt-viewer {\r\n      flex: 1;\r\n      display: flex;\r\n      flex-direction: column;\r\n      overflow: hidden;\r\n      min-height: 0;\r\n    }\r\n\r\n    .ppt-slide-view {\r\n      flex: 1;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      padding: 32px;\r\n      background: #2c3e50;\r\n      overflow: auto;\r\n      -webkit-overflow-scrolling: touch;\r\n    }\r\n\r\n    .kb-help-overlay {\r\n      position: fixed;\r\n      inset: 0;\r\n      background: rgba(0,0,0,0.65);\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: center;\r\n      z-index: 10000;\r\n      padding: 24px;\r\n      backdrop-filter: blur(4px);\r\n    }\r\n\r\n    .kb-help-card {\r\n      background: #fff;\r\n      padding: 28px;\r\n      border-radius: 16px;\r\n      max-width: 380px;\r\n      width: 100%;\r\n      box-shadow: 0 16px 48px rgba(0,0,0,0.24);\r\n    }\r\n\r\n    .kb-help-card h3 { margin: 0 0 20px; font-size: 18px; color: #1f2937; }\r\n    .kb-list { display: grid; gap: 12px; margin-bottom: 24px; }\r\n    .kb-item { display: flex; align-items: center; gap: 12px; }\r\n\r\n    .kb-item kbd {\r\n      min-width: 52px;\r\n      padding: 6px 10px;\r\n      background: #f3f4f6;\r\n      border: 1px solid #d1d5db;\r\n      border-bottom-width: 3px;\r\n      border-radius: 6px;\r\n      font-size: 13px;\r\n      font-weight: 600;\r\n      text-align: center;\r\n      color: #374151;\r\n    }\r\n\r\n    .kb-item span { font-size: 14px; color: #6b7280; }\r\n\r\n    .kb-close-btn {\r\n      width: 100%;\r\n      padding: 12px;\r\n      background: #3498db;\r\n      color: #fff;\r\n      border: none;\r\n      border-radius: 10px;\r\n      font-size: 15px;\r\n      font-weight: 500;\r\n      cursor: pointer;\r\n      transition: background 0.15s;\r\n    }\r\n\r\n    .kb-close-btn:hover { background: #2980b9; }\r\n\r\n    @media (max-width: 768px) {\r\n      .file-viewer-container { border-radius: 0; }\r\n      .desktop-toolbar { display: none !important; }\r\n      .pdf-page-view, .pdf-scroll-view { padding: 10px; }\r\n      .word-scroll-view { padding: 10px; }\r\n      .pdf-page-view canvas, .pdf-scroll-view canvas {\r\n        max-width: 100% !important;\r\n        width: 100% !important;\r\n        height: auto !important;\r\n      }\r\n      ::ng-deep .docx-scale-wrapper section.docx {\r\n        padding: 20px !important;\r\n        margin: 0 0 10px !important;\r\n      }\r\n      .watermark { font-size: 28px; }\r\n    }\r\n\r\n    @media (max-width: 480px) {\r\n      .mob-btn { width: 40px; height: 40px; }\r\n      .mob-menu-btn { font-size: 10px; padding: 8px 2px; }\r\n    }\r\n\r\n    @media (max-height: 480px) and (orientation: landscape) {\r\n      .mobile-tb-main { min-height: 44px; padding: 4px 12px; }\r\n      .mob-btn { width: 38px; height: 38px; }\r\n    }\r\n\r\n    .pdf-page-view::-webkit-scrollbar,\r\n    .pdf-scroll-view::-webkit-scrollbar,\r\n    .word-scroll-view::-webkit-scrollbar,\r\n    .excel-scroll-view::-webkit-scrollbar { width: 8px; height: 8px; }\r\n\r\n    .pdf-page-view::-webkit-scrollbar-track,\r\n    .pdf-scroll-view::-webkit-scrollbar-track,\r\n    .word-scroll-view::-webkit-scrollbar-track { background: #3a3d41; }\r\n\r\n    .pdf-page-view::-webkit-scrollbar-thumb,\r\n    .pdf-scroll-view::-webkit-scrollbar-thumb,\r\n    .word-scroll-view::-webkit-scrollbar-thumb { background: #6b6f75; border-radius: 4px; }\r\n\r\n    @media print {\r\n      .toolbar, .mobile-toolbar { display: none !important; }\r\n      ::ng-deep section.docx { box-shadow: none !important; page-break-after: always; }\r\n    }\r\n  `],\r\n})\r\nexport class NgxUniversalFileViewerComponent\r\n  implements OnInit, OnChanges, OnDestroy, AfterViewInit {\r\n\r\n  @ViewChild('pdfCanvas', { static: false }) pdfCanvas!: ElementRef<HTMLCanvasElement>;\r\n  @ViewChild('canvasContainer', { static: false }) canvasContainer!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('canvasWrapper', { static: false }) canvasWrapper!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('continuousContainer', { static: false }) continuousContainer!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('wordRoot', { static: false }) wordRoot!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('viewerContainer', { static: false }) viewerContainer!: ElementRef<HTMLDivElement>;\r\n\r\n  @Input() src!: string | ArrayBuffer | Blob;\r\n  @Input() fileType: 'auto' | 'pdf' | 'word' | 'excel' | 'ppt' = 'auto';\r\n  @Input() showToolbar = true;\r\n  @Input() toolbarConfig: ToolbarConfig = {};\r\n  @Input() viewerConfig: ViewerConfig = {};\r\n  @Input() viewMode: ViewMode = 'continuous';\r\n\r\n  @Output() onLoad = new EventEmitter<any>();\r\n  @Output() onError = new EventEmitter<any>();\r\n  @Output() pageChange = new EventEmitter<PageChangeEvent>();\r\n  @Output() viewModeChange = new EventEmitter<ViewMode>();\r\n\r\n  // State\r\n  isLoading = false;\r\n  loadingMessage = 'Loading file…';\r\n  loadingProgress = 0;\r\n  errorMessage = '';\r\n\r\n  // PDF state\r\n  pdfDocument: any = null;\r\n  currentPage = 1;\r\n  totalPages = 0;\r\n  scale = 1.5;\r\n  rotation = 0;\r\n  pdfPagesArray: number[] = [];\r\n  private pdfLib: any = null;\r\n  private renderTask: any = null;\r\n\r\n  // Word state\r\n  useGoogleViewer = false;\r\n  isPublicUrl = false;\r\n  googleDocsViewerUrl: SafeResourceUrl = '';\r\n  wordZoom = 1;\r\n\r\n  // Excel state\r\n  excelContent: SafeHtml = '';\r\n  excelSheets: string[] = [];\r\n  currentSheet = 0;\r\n  workbook: any;\r\n\r\n  // PPT state\r\n  currentSlide = 1;\r\n  totalSlides = 1;\r\n  slideContent: SafeHtml = '';\r\n  slides: string[] = [];\r\n\r\n  // UI state\r\n  isMobileView = false;\r\n  showMobileMenu = false;\r\n  isFullscreen = false;\r\n  showKeyboardHelp = false;\r\n\r\n  // Touch state\r\n  private touchStartX = 0;\r\n  private touchStartY = 0;\r\n  private initialPinchDistance = 0;\r\n  private lastScale = 1;\r\n\r\n  // Internal\r\n  private isBrowser: boolean;\r\n  private resizeObserver: ResizeObserver | null = null;\r\n  private renderDebounce: any = null;\r\n  private viewerReady = false;\r\n\r\n  constructor(\r\n    private sanitizer: DomSanitizer,\r\n    private cdr: ChangeDetectorRef,\r\n    @Inject(PLATFORM_ID) private platformId: Object,\r\n  ) {\r\n    this.isBrowser = isPlatformBrowser(this.platformId);\r\n  }\r\n\r\n  /* =====================================================\r\n     LIFECYCLE HOOKS\r\n  ===================================================== */\r\n  ngOnInit() {\r\n    if (this.viewerConfig.defaultViewMode) {\r\n      this.viewMode = this.viewerConfig.defaultViewMode;\r\n    }\r\n    if (this.isBrowser) {\r\n      this.checkMobileView();\r\n      this.applyMobileDefaults();\r\n    }\r\n  }\r\n\r\n  ngAfterViewInit() {\r\n    if (!this.isBrowser) return;\r\n    setTimeout(() => {\r\n      this.viewerReady = true;\r\n      this.setupResizeObserver();\r\n      this.initializePdfJs()\r\n        .then(() => this.loadFile())\r\n        .catch(err => {\r\n          console.error('PDF.js init failed:', err);\r\n          this.loadFile();\r\n        });\r\n    }, 0);\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges) {\r\n    if (changes['src'] && !changes['src'].firstChange && this.isBrowser && this.viewerReady) {\r\n      this.loadFile();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    this.resizeObserver?.disconnect();\r\n    clearTimeout(this.renderDebounce);\r\n    this.cancelRenderTask();\r\n  }\r\n\r\n  /* =====================================================\r\n     RESIZE OBSERVER\r\n  ===================================================== */\r\n  private setupResizeObserver() {\r\n    if (!this.viewerContainer?.nativeElement) return;\r\n    this.resizeObserver = new ResizeObserver(() => {\r\n      clearTimeout(this.renderDebounce);\r\n      this.renderDebounce = setTimeout(() => this.onContainerResize(), 150);\r\n    });\r\n    this.resizeObserver.observe(this.viewerContainer.nativeElement);\r\n  }\r\n\r\n  private onContainerResize() {\r\n    this.checkMobileView();\r\n    if (this.fileType === 'pdf' && this.pdfDocument) {\r\n      this.fitToWidth();\r\n    } else if (this.fileType === 'word') {\r\n      this.fitToPageWidth();\r\n    }\r\n  }\r\n\r\n  /* =====================================================\r\n     MOBILE HELPERS\r\n  ===================================================== */\r\n  @HostListener('window:resize')\r\n  onWindowResize() { this.checkMobileView(); }\r\n\r\n  checkMobileView() {\r\n    if (!this.isBrowser) return;\r\n    this.isMobileView = window.innerWidth <= 768;\r\n  }\r\n\r\n  applyMobileDefaults() {\r\n    if (this.isMobileView) {\r\n      this.scale    = this.viewerConfig.mobileScale ?? 0.9;\r\n      this.wordZoom = 0.75;\r\n    } else {\r\n      this.scale    = 1.5;\r\n      this.wordZoom = 1;\r\n    }\r\n  }\r\n\r\n  toggleMobileMenu() { this.showMobileMenu = !this.showMobileMenu; }\r\n  closeMobileMenu()  { this.showMobileMenu = false; }\r\n\r\n  /* =====================================================\r\n     TOUCH GESTURES\r\n  ===================================================== */\r\n  onTouchStart(e: TouchEvent) {\r\n    if (e.touches.length === 1) {\r\n      this.touchStartX = e.touches[0].clientX;\r\n      this.touchStartY = e.touches[0].clientY;\r\n    } else if (e.touches.length === 2) {\r\n      const dx = e.touches[0].clientX - e.touches[1].clientX;\r\n      const dy = e.touches[0].clientY - e.touches[1].clientY;\r\n      this.initialPinchDistance = Math.sqrt(dx * dx + dy * dy);\r\n      this.lastScale = this.fileType === 'word' ? this.wordZoom : this.scale;\r\n    }\r\n  }\r\n\r\n  onTouchMove(e: TouchEvent) {\r\n    if (e.touches.length !== 2 || this.initialPinchDistance === 0) return;\r\n    e.preventDefault();\r\n    const dx = e.touches[0].clientX - e.touches[1].clientX;\r\n    const dy = e.touches[0].clientY - e.touches[1].clientY;\r\n    const ratio    = Math.sqrt(dx * dx + dy * dy) / this.initialPinchDistance;\r\n    const newScale = this.lastScale * ratio;\r\n\r\n    if (this.fileType === 'word') {\r\n      this.wordZoom = Math.max(0.3, Math.min(2, newScale));\r\n    } else if (this.fileType === 'pdf') {\r\n      this.scale = Math.max(0.25, Math.min(3, newScale));\r\n      this.debouncedRender();\r\n    }\r\n  }\r\n\r\n  onTouchEnd(_: TouchEvent) { this.initialPinchDistance = 0; }\r\n\r\n  onContextMenu(e: MouseEvent): boolean {\r\n    if (this.viewerConfig.disableRightClick) { e.preventDefault(); return false; }\r\n    return true;\r\n  }\r\n\r\n  /* =====================================================\r\n     KEYBOARD SHORTCUTS\r\n  ===================================================== */\r\n  @HostListener('window:keydown', ['$event'])\r\n  handleKey(e: KeyboardEvent) {\r\n    if (!this.viewerConfig.enableKeyboardShortcuts || this.isLoading) return;\r\n    if (e.target instanceof HTMLInputElement) return;\r\n\r\n    switch (e.key) {\r\n      case 'ArrowLeft':  e.preventDefault(); this.previousPage(); break;\r\n      case 'ArrowRight': e.preventDefault(); this.nextPage();     break;\r\n      case '+': case '=':\r\n        e.preventDefault();\r\n        this.fileType === 'word' ? this.zoomInWord() : this.zoomIn();\r\n        break;\r\n      case '-':\r\n        e.preventDefault();\r\n        this.fileType === 'word' ? this.zoomOutWord() : this.zoomOut();\r\n        break;\r\n      case 'f': case 'F':\r\n        if (!e.ctrlKey) { e.preventDefault(); this.toggleFullscreen(); }\r\n        break;\r\n      case '?': e.preventDefault(); this.toggleKeyboardHelp(); break;\r\n    }\r\n  }\r\n\r\n  toggleKeyboardHelp() { this.showKeyboardHelp = !this.showKeyboardHelp; }\r\n\r\n  /* =====================================================\r\n     FULLSCREEN\r\n  ===================================================== */\r\n  toggleFullscreen() {\r\n    if (!this.isBrowser) return;\r\n    const el = this.viewerContainer?.nativeElement as any;\r\n    if (!document.fullscreenElement) {\r\n      el.requestFullscreen?.() ?? el.webkitRequestFullscreen?.();\r\n      this.isFullscreen = true;\r\n    } else {\r\n      document.exitFullscreen?.();\r\n      this.isFullscreen = false;\r\n    }\r\n    setTimeout(() => { if (this.fileType === 'pdf') this.fitToWidth(); }, 300);\r\n  }\r\n\r\n  /* =====================================================\r\n     PDF.JS INITIALISATION\r\n  ===================================================== */\r\n  async initializePdfJs(): Promise<void> {\r\n    if (!this.isBrowser) return;\r\n    return new Promise((resolve, reject) => {\r\n      if (window.pdfjsLib) {\r\n        this.pdfLib = window.pdfjsLib;\r\n        this.pdfLib.GlobalWorkerOptions.workerSrc =\r\n          'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js';\r\n        return resolve();\r\n      }\r\n      const s    = document.createElement('script');\r\n      s.src      = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js';\r\n      s.onload   = () => {\r\n        if (window.pdfjsLib) {\r\n          this.pdfLib = window.pdfjsLib;\r\n          this.pdfLib.GlobalWorkerOptions.workerSrc =\r\n            'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js';\r\n          resolve();\r\n        } else {\r\n          reject(new Error('PDF.js load failed'));\r\n        }\r\n      };\r\n      s.onerror  = () => reject(new Error('PDF.js script error'));\r\n      document.head.appendChild(s);\r\n    });\r\n  }\r\n\r\n  /* =====================================================\r\n     FILE LOADING — MAIN ENTRY\r\n  ===================================================== */\r\n  async loadFile() {\r\n    if (!this.src) { this.errorMessage = 'No source provided'; return; }\r\n\r\n    this.isLoading      = true;\r\n    this.errorMessage   = '';\r\n    this.loadingProgress = 0;\r\n    this.cdr.detectChanges();\r\n\r\n    try {\r\n      if (this.fileType === 'auto') this.detectFileType();\r\n      this.loadingMessage = `Loading ${this.fileType.toUpperCase()}…`;\r\n\r\n      switch (this.fileType) {\r\n        case 'pdf':   await this.loadPDF();   break;\r\n        case 'word':  await this.loadWord();  break;\r\n        case 'excel': await this.loadExcel(); break;\r\n        case 'ppt':   await this.loadPPT();   break;\r\n        default: throw new Error('Unsupported file type');\r\n      }\r\n\r\n      this.onLoad.emit({ type: this.fileType, status: 'success' });\r\n    } catch (e: any) {\r\n      console.error('Load error:', e);\r\n      this.errorMessage = e?.message || `Failed to load ${this.fileType}`;\r\n      this.onError.emit(e);\r\n    } finally {\r\n      this.isLoading       = false;\r\n      this.loadingProgress = 100;\r\n      this.cdr.detectChanges();\r\n    }\r\n  }\r\n\r\n  detectFileType() {\r\n    if (typeof this.src !== 'string') return;\r\n    const ext = this.src.split('?')[0].split('.').pop()?.toLowerCase() ?? '';\r\n    if (ext === 'pdf')                     this.fileType = 'pdf';\r\n    else if (['doc','docx'].includes(ext)) this.fileType = 'word';\r\n    else if (['xls','xlsx'].includes(ext)) this.fileType = 'excel';\r\n    else if (['ppt','pptx'].includes(ext)) this.fileType = 'ppt';\r\n  }\r\n\r\n  /* =====================================================\r\n     PDF — LOAD\r\n     FIX: isLoading is set to false BEFORE rendering so\r\n     the DOM (canvas / continuous divs) is actually present\r\n     when we try to render into it.\r\n  ===================================================== */\r\n  async loadPDF() {\r\n    if (!this.pdfLib) throw new Error('PDF.js not ready');\r\n    this.loadingProgress = 20;\r\n\r\n    const pdfData = await this.getPdfData();\r\n    this.loadingProgress = 50;\r\n\r\n    const loadingTask = this.pdfLib.getDocument(pdfData);\r\n    loadingTask.onProgress = (p: any) => {\r\n      if (p.total) {\r\n        this.loadingProgress = 50 + Math.round((p.loaded / p.total) * 40);\r\n        this.cdr.detectChanges();\r\n      }\r\n    };\r\n\r\n    this.pdfDocument  = await loadingTask.promise;\r\n    this.totalPages   = this.pdfDocument.numPages;\r\n    this.currentPage  = 1;\r\n    this.pdfPagesArray = Array.from({ length: this.totalPages }, (_, i) => i + 1);\r\n    this.loadingProgress = 100;\r\n\r\n    // ── KEY FIX ──────────────────────────────────────────────────────────────\r\n    // Hide the loader NOW so Angular renders the actual PDF canvas / scroll\r\n    // elements into the DOM.  Without this, ViewChild refs are null and\r\n    // continuous-mode canvases (identified by id) don't exist yet.\r\n    this.isLoading = false;\r\n    this.cdr.detectChanges();\r\n\r\n    // Give Angular one more tick to finish stamping the *ngIf / *ngFor nodes.\r\n    await this.waitForDom(50);\r\n\r\n    // Calculate the correct scale from the real container dimensions.\r\n    await this.fitToWidthAsync();\r\n\r\n    // Now render – the DOM is guaranteed to be ready.\r\n    await this.renderCurrentView();\r\n    // ─────────────────────────────────────────────────────────────────────────\r\n  }\r\n\r\n  private async getPdfData(): Promise<any> {\r\n    if (typeof this.src === 'string') {\r\n      if (this.src.startsWith('data:')) {\r\n        const b64 = this.src.split(',')[1];\r\n        const bin = atob(b64);\r\n        const u8  = new Uint8Array(bin.length);\r\n        for (let i = 0; i < bin.length; i++) u8[i] = bin.charCodeAt(i);\r\n        return { data: u8 };\r\n      }\r\n      return this.src;\r\n    }\r\n    if (this.src instanceof ArrayBuffer) return { data: new Uint8Array(this.src) };\r\n    if (this.src instanceof Blob)        return { data: new Uint8Array(await this.src.arrayBuffer()) };\r\n    throw new Error('Invalid source');\r\n  }\r\n\r\n  /* =====================================================\r\n     PDF — FIT TO WIDTH\r\n  ===================================================== */\r\n\r\n  /**\r\n   * Calculates the correct scale so the PDF fills the available container\r\n   * width.  Works for both page-mode (canvasContainer) and continuous-mode\r\n   * (continuousContainer).\r\n   */\r\n  async fitToWidthAsync(): Promise<void> {\r\n    // Prefer whichever container is currently in the DOM.\r\n    const container =\r\n      this.canvasContainer?.nativeElement ??\r\n      this.continuousContainer?.nativeElement ??\r\n      this.viewerContainer?.nativeElement;\r\n\r\n    if (!container || !this.pdfDocument) return;\r\n\r\n    const page    = await this.pdfDocument.getPage(1);\r\n    const vp      = page.getViewport({ scale: 1 });\r\n    const padding = this.isMobileView ? 20 : 48;\r\n    const available = container.clientWidth - padding;\r\n\r\n    if (available > 0) {\r\n      this.scale = +(available / vp.width).toFixed(3);\r\n    }\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  /** Public toolbar button — fit then re-render. */\r\n  async fitToWidth(): Promise<void> {\r\n    await this.fitToWidthAsync();\r\n    await this.renderCurrentView();\r\n  }\r\n\r\n  /* =====================================================\r\n     PDF — RENDER\r\n  ===================================================== */\r\n  private async renderCurrentView() {\r\n    if (this.viewMode === 'continuous') {\r\n      await this.renderAllPages();\r\n    } else {\r\n      await this.renderPage(this.currentPage);\r\n    }\r\n  }\r\n\r\n  private cancelRenderTask() {\r\n    if (this.renderTask) {\r\n      try { this.renderTask.cancel(); } catch (_) {}\r\n      this.renderTask = null;\r\n    }\r\n  }\r\n\r\n  async renderPage(pageNum: number) {\r\n    if (!this.pdfDocument) return;\r\n\r\n    // Wait for the canvas ViewChild to appear (it may need an extra tick after\r\n    // the *ngIf for viewMode==='page' resolves).\r\n    await this.waitForCanvas(150);\r\n\r\n    const canvas = this.pdfCanvas?.nativeElement;\r\n    if (!canvas) { console.warn('renderPage: canvas not found'); return; }\r\n\r\n    this.cancelRenderTask();\r\n\r\n    const page = await this.pdfDocument.getPage(pageNum);\r\n    const dpr  = Math.min(window.devicePixelRatio || 1, 2);\r\n    const vp   = page.getViewport({ scale: this.scale * dpr, rotation: this.rotation });\r\n\r\n    canvas.width        = vp.width;\r\n    canvas.height       = vp.height;\r\n    canvas.style.width  = `${vp.width  / dpr}px`;\r\n    canvas.style.height = `${vp.height / dpr}px`;\r\n\r\n    const ctx     = canvas.getContext('2d')!;\r\n    this.renderTask = page.render({ canvasContext: ctx, viewport: vp });\r\n\r\n    try {\r\n      await this.renderTask.promise;\r\n    } catch (e: any) {\r\n      if (e?.name !== 'RenderingCancelledException') console.warn('Render error', e);\r\n    }\r\n    this.renderTask = null;\r\n\r\n    this.pageChange.emit({\r\n      page: pageNum,\r\n      totalPages: this.totalPages,\r\n      type: 'pdf',\r\n      viewMode: this.viewMode,\r\n    });\r\n    this.cdr.detectChanges();\r\n  }\r\n\r\n  async renderPageToContinuous(pageNum: number) {\r\n    if (!this.pdfDocument) return;\r\n\r\n    // Poll until the canvas element stamped by *ngFor is available in the DOM.\r\n    const canvas = await this.waitForContinuousCanvas(pageNum, 200);\r\n    if (!canvas) { console.warn(`Canvas for page ${pageNum} not found`); return; }\r\n\r\n    const page = await this.pdfDocument.getPage(pageNum);\r\n    const dpr  = Math.min(window.devicePixelRatio || 1, 2);\r\n    const vp   = page.getViewport({ scale: this.scale * dpr, rotation: this.rotation });\r\n\r\n    canvas.width        = vp.width;\r\n    canvas.height       = vp.height;\r\n    canvas.style.width  = `${vp.width  / dpr}px`;\r\n    canvas.style.height = `${vp.height / dpr}px`;\r\n\r\n    const ctx = canvas.getContext('2d')!;\r\n    try {\r\n      await page.render({ canvasContext: ctx, viewport: vp }).promise;\r\n    } catch (_) {}\r\n  }\r\n\r\n  async renderAllPages() {\r\n    // Give *ngFor one tick to stamp all canvas elements before we start.\r\n    await this.waitForDom(60);\r\n    for (let p = 1; p <= this.totalPages; p++) {\r\n      await this.renderPageToContinuous(p);\r\n    }\r\n  }\r\n\r\n  /* =====================================================\r\n     DOM POLLING HELPERS  ← NEW\r\n     Waits until the target element actually exists in the\r\n     DOM instead of relying on an arbitrary fixed delay.\r\n  ===================================================== */\r\n\r\n  /**\r\n   * Polls until `this.pdfCanvas` ViewChild is non-null.\r\n   * Falls back after `maxMs` milliseconds.\r\n   */\r\n  private waitForCanvas(maxMs = 300): Promise<void> {\r\n    return new Promise(resolve => {\r\n      const start = Date.now();\r\n      const check = () => {\r\n        if (this.pdfCanvas?.nativeElement || Date.now() - start > maxMs) {\r\n          resolve();\r\n        } else {\r\n          requestAnimationFrame(check);\r\n        }\r\n      };\r\n      check();\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Polls until `document.getElementById('pdf-page-N')` is non-null.\r\n   * Falls back after `maxMs` milliseconds.\r\n   */\r\n  private waitForContinuousCanvas(\r\n    pageNum: number,\r\n    maxMs = 300,\r\n  ): Promise<HTMLCanvasElement | null> {\r\n    return new Promise(resolve => {\r\n      const start = Date.now();\r\n      const check = () => {\r\n        const el = document.getElementById(`pdf-page-${pageNum}`) as HTMLCanvasElement | null;\r\n        if (el || Date.now() - start > maxMs) {\r\n          resolve(el);\r\n        } else {\r\n          requestAnimationFrame(check);\r\n        }\r\n      };\r\n      check();\r\n    });\r\n  }\r\n\r\n  /* =====================================================\r\n     PDF — SCROLL TRACKING (continuous mode)\r\n  ===================================================== */\r\n  onContinuousScroll(e: Event) {\r\n    const el    = e.target as HTMLElement;\r\n    const pages = el.querySelectorAll('.pdf-page-block');\r\n\r\n    for (let i = 0; i < pages.length; i++) {\r\n      const pg = pages[i] as HTMLElement;\r\n      if (pg.offsetTop + pg.offsetHeight > el.scrollTop) {\r\n        const n = parseInt(pg.getAttribute('data-page') ?? '1', 10);\r\n        if (this.currentPage !== n) {\r\n          this.currentPage = n;\r\n          this.pageChange.emit({\r\n            page: n,\r\n            totalPages: this.totalPages,\r\n            type: 'pdf',\r\n            viewMode: 'continuous',\r\n          });\r\n          this.cdr.detectChanges();\r\n        }\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  /* =====================================================\r\n     PDF — TOOLBAR ACTIONS\r\n  ===================================================== */\r\n  toggleViewMode() {\r\n    this.viewMode = this.viewMode === 'continuous' ? 'page' : 'continuous';\r\n    this.viewModeChange.emit(this.viewMode);\r\n    // Let Angular swap the *ngIf DOM before rendering.\r\n    setTimeout(() => this.renderCurrentView(), 60);\r\n  }\r\n\r\n  firstPage()    { if (this.currentPage > 1)               { this.currentPage = 1;              this.renderPage(this.currentPage); } }\r\n  lastPage()     { if (this.currentPage < this.totalPages) { this.currentPage = this.totalPages; this.renderPage(this.currentPage); } }\r\n  previousPage() { if (this.currentPage > 1)               { this.currentPage--;                 this.renderPage(this.currentPage); } }\r\n  nextPage()     { if (this.currentPage < this.totalPages) { this.currentPage++;                 this.renderPage(this.currentPage); } }\r\n\r\n  goToPage() {\r\n    this.currentPage = Math.max(1, Math.min(this.totalPages, this.currentPage));\r\n    this.renderPage(this.currentPage);\r\n  }\r\n\r\n  zoomIn()    { if (this.scale < 3)    { this.scale = +(this.scale + 0.25).toFixed(2); this.changeZoom(); } }\r\n  zoomOut()   { if (this.scale > 0.25) { this.scale = +(this.scale - 0.25).toFixed(2); this.changeZoom(); } }\r\n  resetZoom() { this.scale = this.isMobileView ? 0.9 : 1.5; this.changeZoom(); }\r\n\r\n  changeZoom() {\r\n    this.viewMode === 'continuous'\r\n      ? this.renderAllPages()\r\n      : this.renderPage(this.currentPage);\r\n  }\r\n\r\n  rotate(deg: number) {\r\n    this.rotation = (this.rotation + deg + 360) % 360;\r\n    this.changeZoom();\r\n  }\r\n\r\n\r\n\r\n  private debouncedRender() {\r\n    clearTimeout(this.renderDebounce);\r\n    this.renderDebounce = setTimeout(() => this.changeZoom(), 80);\r\n  }\r\n\r\n  /* =====================================================\r\n     WORD — LOAD\r\n  ===================================================== */\r\n  async loadWord() {\r\n    this.loadingMessage  = 'Rendering document…';\r\n    this.loadingProgress = 20;\r\n\r\n    if (\r\n      typeof this.src === 'string' &&\r\n      this.src.startsWith('http') &&\r\n      this.viewerConfig.useGoogleDocsViewer\r\n    ) {\r\n      this.isPublicUrl      = true;\r\n      this.useGoogleViewer  = true;\r\n      this.googleDocsViewerUrl = this.sanitizer.bypassSecurityTrustResourceUrl(\r\n        `https://docs.google.com/viewer?url=${encodeURIComponent(this.src)}&embedded=true`\r\n      );\r\n      return;\r\n    }\r\n\r\n    this.useGoogleViewer = false;\r\n    const buf = await this.getArrayBuffer();\r\n    this.loadingProgress = 60;\r\n    this.cdr.detectChanges();\r\n\r\n    await this.waitForDom(150);\r\n\r\n    const wrapper = this.wordRoot?.nativeElement\r\n      ?.querySelector('.docx-scale-wrapper') as HTMLElement;\r\n    if (!wrapper) throw new Error('Word container not ready');\r\n\r\n    wrapper.innerHTML = '';\r\n\r\n    await renderAsync(buf, wrapper, undefined, {\r\n      className:    'docx',\r\n      inWrapper:    true,\r\n      ignoreWidth:  false,\r\n      ignoreHeight: false,\r\n      breakPages:   true,\r\n      experimental: true,\r\n    } as any);\r\n\r\n    this.loadingProgress = 95;\r\n    this.cdr.detectChanges();\r\n\r\n    await this.waitForDom(200);\r\n    this.fitToPageWidth();\r\n\r\n    const pages = wrapper.querySelectorAll('section.docx');\r\n    this.pageChange.emit({\r\n      page: 1,\r\n      totalPages: Math.max(1, pages.length),\r\n      type: 'word',\r\n      viewMode: this.viewMode,\r\n    });\r\n  }\r\n\r\n  /* =====================================================\r\n     WORD — ZOOM / FIT\r\n  ===================================================== */\r\n  zoomInWord()    { if (this.wordZoom < 2)   this.wordZoom = +(this.wordZoom + 0.1).toFixed(2); }\r\n  zoomOutWord()   { if (this.wordZoom > 0.3) this.wordZoom = +(this.wordZoom - 0.1).toFixed(2); }\r\n  resetWordZoom() { this.wordZoom = this.isMobileView ? 0.75 : 1; }\r\n\r\n  fitToPageWidth() {\r\n    if (!this.isBrowser) return;\r\n    const container = this.wordRoot?.nativeElement as HTMLElement;\r\n    if (!container) return;\r\n\r\n    setTimeout(() => {\r\n      const page  = container.querySelector('section.docx') as HTMLElement;\r\n      const pad   = this.isMobileView ? 20 : 48;\r\n      const avail = container.clientWidth - pad;\r\n      const pw    = page ? (page.scrollWidth || page.offsetWidth || 794) : 794;\r\n      this.wordZoom = +Math.min(1.5, avail / pw).toFixed(3);\r\n      this.cdr.detectChanges();\r\n    }, 80);\r\n  }\r\n\r\n  \r\n\r\n  /* =====================================================\r\n     EXCEL\r\n  ===================================================== */\r\n  async loadExcel() {\r\n    this.loadingProgress = 30;\r\n    const buf = await this.getArrayBuffer();\r\n    this.loadingProgress = 70;\r\n    this.workbook    = XLSX.read(buf, { type: 'array' });\r\n    this.excelSheets = this.workbook.SheetNames;\r\n    this.renderExcelSheet(0);\r\n  }\r\n\r\n  renderExcelSheet(idx: number) {\r\n    const ws  = this.workbook.Sheets[this.excelSheets[idx]];\r\n    const raw = XLSX.utils.sheet_to_html(ws);\r\n    this.excelContent = this.sanitizer.sanitize(1, raw) ?? '';\r\n  }\r\n\r\n  onSheetChange()  { this.renderExcelSheet(this.currentSheet); }\r\n\r\n\r\n\r\n  /* =====================================================\r\n     PPT\r\n  ===================================================== */\r\n  async loadPPT() {\r\n    this.slides      = Array.from({ length: 5 }, (_, i) => `<h1>Slide ${i + 1}</h1>`);\r\n    this.totalSlides = this.slides.length;\r\n    this.currentSlide = 1;\r\n    this.renderSlide(1);\r\n  }\r\n\r\n  renderSlide(n: number) {\r\n    const raw = this.slides[n - 1] ?? '';\r\n    this.slideContent = this.sanitizer.sanitize(1, raw) ?? '';\r\n    this.pageChange.emit({ page: n, totalPages: this.totalSlides, type: 'ppt', viewMode: this.viewMode });\r\n  }\r\n\r\n  previousSlide() { if (this.currentSlide > 1)               { this.currentSlide--; this.renderSlide(this.currentSlide); } }\r\n  nextSlide()     { if (this.currentSlide < this.totalSlides) { this.currentSlide++; this.renderSlide(this.currentSlide); } }\r\n\r\n  /* =====================================================\r\n     SHARED HELPERS\r\n  ===================================================== */\r\n  retry() { this.errorMessage = ''; this.loadFile(); }\r\n\r\n  private waitForDom(ms: number): Promise<void> {\r\n    return new Promise(resolve => setTimeout(resolve, ms));\r\n  }\r\n\r\n  async getArrayBuffer(): Promise<ArrayBuffer> {\r\n    if (this.src instanceof ArrayBuffer) return this.src;\r\n    if (this.src instanceof Blob)        return this.src.arrayBuffer();\r\n    if (typeof this.src === 'string') {\r\n      if (this.src.startsWith('data:')) {\r\n        const b64 = this.src.split(',')[1];\r\n        const bin = atob(b64);\r\n        const u8  = new Uint8Array(bin.length);\r\n        for (let i = 0; i < bin.length; i++) u8[i] = bin.charCodeAt(i);\r\n        return u8.buffer;\r\n      }\r\n      const res = await fetch(this.src);\r\n      if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\r\n      return res.arrayBuffer();\r\n    }\r\n    throw new Error('Invalid source type');\r\n  }\r\n}","import { NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NgxUniversalFileViewerComponent } from './ngx-universal-file-viewer.component';\r\n\r\n@NgModule({\r\n  imports: [NgxUniversalFileViewerComponent, FormsModule],\r\n  exports: [NgxUniversalFileViewerComponent]\r\n})\r\nexport class NgxUniversalFileViewerModule { }","/*\r\n * Public API Surface of ngx-universal-file-viewer\r\n */\r\n\r\n// Main Component Export\r\nexport * from './lib/ngx-universal-file-viewer.component';\r\n\r\n// Module Export (for Angular 12-13)\r\nexport * from './lib/ngx-universal-file-viewer.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}