@ngstarter-ui/components 21.0.33 → 21.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ngstarter-ui-components-pdf-viewer.mjs","sources":["../../../projects/components/pdf-viewer/src/pdf-viewer/pdf-viewer-engine.service.ts","../../../projects/components/pdf-viewer/src/pdf-viewer/pdf-viewer.ts","../../../projects/components/pdf-viewer/src/pdf-viewer/pdf-viewer.html","../../../projects/components/pdf-viewer/ngstarter-ui-components-pdf-viewer.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { PluginRegistry } from '@embedpdf/core';\nimport type { PdfEngine } from '@embedpdf/models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PdfViewerEngineService {\n private readonly engines = new Map<string, Promise<PdfEngine<Blob>>>();\n\n getEngine(wasmUrl: string): Promise<PdfEngine<Blob>> {\n const cachedEngine = this.engines.get(wasmUrl);\n\n if (cachedEngine) {\n return cachedEngine;\n }\n\n const engine = this.createEngine(wasmUrl);\n this.engines.set(wasmUrl, engine);\n return engine;\n }\n\n createRegistry(engine: PdfEngine<Blob>, defaultScale: number): Promise<PluginRegistry> {\n const registry = new PluginRegistry(engine, { defaultScale });\n return registry.initialize().then(() => registry);\n }\n\n private async createEngine(wasmUrl: string): Promise<PdfEngine<Blob>> {\n const { createPdfiumEngine } = await import('@embedpdf/engines/pdfium-direct-engine');\n return createPdfiumEngine(wasmUrl, { encoderPoolSize: 0 });\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport type { PdfDocumentObject, PdfEngine, PdfPageObject } from '@embedpdf/models';\nimport { BlockLoader } from '@ngstarter-ui/components/block-loader';\nimport { Button } from '@ngstarter-ui/components/button';\nimport { Icon } from '@ngstarter-ui/components/icon';\nimport { ImagePlaceholder } from '@ngstarter-ui/components/image-placeholder';\nimport {\n Menu,\n MenuDivider,\n MenuHeading,\n MenuItem,\n MenuTrigger,\n} from '@ngstarter-ui/components/menu';\nimport {\n Panel,\n PanelContent,\n PanelHeader,\n PanelSidebar,\n} from '@ngstarter-ui/components/panel';\nimport { PdfViewerEngineService } from './pdf-viewer-engine.service';\nimport {\n PdfViewerLoadedEvent,\n PdfViewerPageRenderedEvent,\n PdfViewerThumbnailView,\n PdfViewerPageView,\n PdfViewerSelectionRectView,\n PdfViewerSource,\n PdfViewerTextGlyphView,\n} from './types';\n\ninterface PdfViewerPageListItem {\n pageNumber: number;\n thumbnail: PdfViewerThumbnailView | null;\n}\n\ntype PdfViewerSpreadMode = 'single' | 'two-odd' | 'two-even';\ntype PdfViewerScrollLayout = 'vertical' | 'horizontal';\n\ninterface PdfViewerSelectionPoint {\n pageNumber: number;\n x: number;\n y: number;\n offset: number;\n}\n\ninterface PdfViewerTextLineView {\n lineId: number;\n glyphs: PdfViewerTextGlyphView[];\n top: number;\n bottom: number;\n left: number;\n right: number;\n center: number;\n}\n\n@Component({\n selector: 'ngs-pdf-viewer',\n exportAs: 'ngsPdfViewer',\n standalone: true,\n imports: [\n BlockLoader,\n Button,\n Icon,\n ImagePlaceholder,\n Menu,\n MenuDivider,\n MenuHeading,\n MenuItem,\n MenuTrigger,\n Panel,\n PanelContent,\n PanelHeader,\n PanelSidebar,\n ],\n templateUrl: './pdf-viewer.html',\n styleUrl: './pdf-viewer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngs-pdf-viewer not-prose',\n '[class.is-loading]': 'isLoading()',\n '[class.has-toolbar]': 'showToolbar()',\n '[class.has-page-list]': 'isPageListVisible()',\n '[class.has-error]': 'errorState()',\n },\n})\nexport class PdfViewer {\n private readonly textSelectionHorizontalPadding = 2;\n private readonly textSelectionLineHeight = 1.2;\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly engineService = inject(PdfViewerEngineService);\n private readonly hostElement = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly viewerBody = viewChild<ElementRef<HTMLElement>>('viewerBody');\n private readonly pageList = viewChild<ElementRef<HTMLElement>>('pageList');\n\n src = input<PdfViewerSource>(null);\n wasmUrl = input('/assets/embedpdf/pdfium.wasm');\n page = input(1, { transform: numberAttribute });\n scale = input(1, { transform: numberAttribute });\n minScale = input(0.2, { transform: numberAttribute });\n maxScale = input(60, { transform: numberAttribute });\n zoomStep = input(0.1, { transform: numberAttribute });\n renderAll = input(true, { transform: booleanAttribute });\n showToolbar = input(true, { transform: booleanAttribute });\n showPageList = input(true, { transform: booleanAttribute });\n withAnnotations = input(true, { transform: booleanAttribute });\n withForms = input(true, { transform: booleanAttribute });\n\n loaded = output<PdfViewerLoadedEvent>();\n pageChanged = output<number>();\n pageRendered = output<PdfViewerPageRenderedEvent>();\n error = output<unknown>();\n\n protected readonly isLoading = signal(false);\n protected readonly errorState = signal<unknown>(null);\n protected readonly renderedPages = signal<PdfViewerPageView[]>([]);\n protected readonly thumbnailPages = signal<PdfViewerThumbnailView[]>([]);\n protected readonly pageCount = signal(0);\n protected readonly activePage = signal(1);\n protected readonly zoom = signal(1);\n protected readonly pageListVisible = signal(true);\n protected readonly spreadMode = signal<PdfViewerSpreadMode>('single');\n protected readonly scrollLayout = signal<PdfViewerScrollLayout>('horizontal');\n protected readonly selectionRects = signal<PdfViewerSelectionRectView[]>([]);\n protected readonly hasDocument = computed(() => this.pageCount() > 0);\n protected readonly isPageListVisible = computed(() =>\n this.showPageList() && this.hasDocument() && this.pageListVisible(),\n );\n protected readonly thumbnailPageMap = computed(() =>\n new Map(this.thumbnailPages().map((thumbnail) => [thumbnail.pageNumber, thumbnail])),\n );\n protected readonly pageItems = computed<PdfViewerPageListItem[]>(() =>\n Array.from({ length: this.pageCount() }, (_, index) => {\n const pageNumber = index + 1;\n\n return {\n pageNumber,\n thumbnail: this.thumbnailPageMap().get(pageNumber) ?? null,\n };\n }),\n );\n protected readonly canGoPrevious = computed(() => this.activePage() > 1);\n protected readonly canGoNext = computed(() => this.activePage() < this.pageCount());\n protected readonly canZoomOut = computed(() => this.zoom() > this.getScaleBounds().min);\n protected readonly canZoomIn = computed(() => this.zoom() < this.getScaleBounds().max);\n protected readonly zoomLabel = computed(() => `${Math.round(this.zoom() * 100)}%`);\n\n private engine: PdfEngine<Blob> | null = null;\n private pdfDocument: PdfDocumentObject | null = null;\n private registry: { destroy(): Promise<void> | void } | null = null;\n private pageIntersectionObserver: IntersectionObserver | null = null;\n private visiblePageRatios = new Map<number, number>();\n private loadToken = 0;\n private renderToken = 0;\n private scrollSyncFrame: number | null = null;\n private programmaticScrollTargetPage: number | null = null;\n private programmaticScrollTimeout: number | null = null;\n private pageObserverFrame: number | null = null;\n private pageObserverTimeout: number | null = null;\n private visiblePageRenderFrame: number | null = null;\n private pageObserverRefreshAttempts = 0;\n private selectionStart: PdfViewerSelectionPoint | null = null;\n private isViewInitialized = false;\n private readonly programmaticScrollMinDuration = 900;\n private readonly programmaticScrollMaxDuration = 6000;\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.loadToken++;\n this.renderToken++;\n this.cancelScrollSyncFrame();\n this.clearProgrammaticScrollLock();\n this.cancelPageObserverFrame();\n this.cancelVisiblePageRenderFrame();\n this.disconnectPageObserver();\n this.revokeRenderedPages();\n this.revokeThumbnailPages();\n void this.closeDocument();\n void this.registry?.destroy();\n });\n\n effect(() => {\n const source = this.src();\n const wasmUrl = this.wasmUrl();\n\n if (!this.isViewInitialized || !this.isBrowser) {\n return;\n }\n\n untracked(() => {\n void this.loadDocument(source, wasmUrl);\n });\n });\n\n effect(() => {\n const scale = this.sanitizeScale(this.scale());\n\n if (untracked(() => this.zoom()) !== scale) {\n untracked(() => this.setZoom(scale));\n }\n });\n\n effect(() => {\n const requestedPage = this.sanitizePage(this.page());\n\n if (requestedPage !== untracked(() => this.activePage())) {\n this.activePage.set(requestedPage);\n }\n });\n\n effect(() => {\n const zoom = this.zoom();\n const renderAll = this.renderAll();\n const activePage = renderAll ? untracked(() => this.activePage()) : this.activePage();\n const withAnnotations = this.withAnnotations();\n const withForms = this.withForms();\n\n if (!this.pdfDocument || !this.engine || this.isLoading()) {\n return;\n }\n\n untracked(() => {\n this.applyInstantZoom(zoom);\n this.scheduleVisiblePagesRender({ zoom, activePage, renderAll, withAnnotations, withForms });\n });\n });\n\n effect(() => {\n const withAnnotations = this.withAnnotations();\n const isLoading = this.isLoading();\n const pageCount = this.pageCount();\n\n if (isLoading || pageCount === 0 || !this.pdfDocument || !this.engine) {\n return;\n }\n\n untracked(() => {\n void this.renderThumbnails(this.loadToken, { withAnnotations });\n });\n });\n }\n\n ngAfterViewInit(): void {\n this.isViewInitialized = true;\n\n if (this.isBrowser) {\n void this.loadDocument(this.src(), this.wasmUrl());\n }\n }\n\n previousPage(): void {\n if (!this.canGoPrevious()) {\n return;\n }\n\n this.setPage(this.activePage() - 1);\n }\n\n nextPage(): void {\n if (!this.canGoNext()) {\n return;\n }\n\n this.setPage(this.activePage() + 1);\n }\n\n zoomIn(): void {\n this.setZoom(this.roundZoom(this.zoom() + this.sanitizeZoomStep()));\n }\n\n zoomOut(): void {\n this.setZoom(this.roundZoom(this.zoom() - this.sanitizeZoomStep()));\n }\n\n togglePageList(): void {\n this.pageListVisible.update((isVisible) => !isVisible);\n }\n\n protected setSpreadMode(mode: PdfViewerSpreadMode): void {\n this.spreadMode.set(mode);\n }\n\n protected setScrollLayout(layout: PdfViewerScrollLayout): void {\n this.scrollLayout.set(layout);\n }\n\n protected rotateClockwise(): void {\n this.renderedPages.update((pages) => [...pages]);\n }\n\n protected rotateCounterClockwise(): void {\n this.renderedPages.update((pages) => [...pages]);\n }\n\n protected toggleFullscreen(): void {\n if (!this.isBrowser) {\n return;\n }\n\n const target = this.hostElement.nativeElement;\n const currentFullscreenElement = this.document.fullscreenElement;\n\n if (currentFullscreenElement) {\n void this.document.exitFullscreen?.();\n return;\n }\n\n void target.requestFullscreen?.();\n }\n\n setPage(pageNumber: number): void {\n const nextPage = this.clamp(pageNumber, 1, Math.max(this.pageCount(), 1));\n const hasChanged = nextPage !== this.activePage();\n\n if (!hasChanged) {\n this.scrollToPage(nextPage);\n this.scrollPageListToPage(nextPage);\n return;\n }\n\n this.activePage.set(nextPage);\n this.pageChanged.emit(nextPage);\n this.scrollToPage(nextPage);\n this.scrollPageListToPage(nextPage);\n }\n\n protected onViewerScroll(): void {\n if (!this.renderAll() || !this.isBrowser || this.renderedPages().length < 2) {\n return;\n }\n\n if (this.scrollSyncFrame !== null) {\n return;\n }\n\n this.scrollSyncFrame = this.document.defaultView?.requestAnimationFrame(() => {\n this.scrollSyncFrame = null;\n\n if (this.isProgrammaticScrollActive()) {\n this.completeProgrammaticScrollIfSettled();\n return;\n }\n\n this.syncActivePageFromViewport();\n this.scheduleCurrentVisiblePagesRender();\n }) ?? null;\n }\n\n protected selectionRectsForPage(pageNumber: number): PdfViewerSelectionRectView[] {\n return this.selectionRects().filter((rect) => rect.pageNumber === pageNumber);\n }\n\n protected isPageImageFresh(page: PdfViewerPageView): boolean {\n return !!page.url && Math.abs((page.renderedScale ?? 0) - page.scale) < 0.0001;\n }\n\n protected startTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void {\n if (event.button !== 0 || page.textGlyphs.length === 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const surface = event.currentTarget as HTMLElement;\n if ('pointerId' in event) {\n surface.setPointerCapture?.(event.pointerId);\n }\n\n this.selectionStart = this.getSelectionPoint(event, page, surface);\n this.selectionRects.set([]);\n }\n\n protected updateTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void {\n if (!this.selectionStart || this.selectionStart.pageNumber !== page.pageNumber) {\n return;\n }\n\n event.preventDefault();\n const surface = event.currentTarget as HTMLElement;\n const currentPoint = this.getSelectionPoint(event, page, surface);\n\n if (this.selectionStart.offset === currentPoint.offset) {\n this.selectionRects.set([]);\n return;\n }\n\n this.selectionRects.set(this.getSelectionRects(page, this.selectionStart.offset, currentPoint.offset));\n }\n\n protected finishTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void {\n if (!this.selectionStart) {\n return;\n }\n\n this.updateTextSelection(event, page);\n this.selectionStart = null;\n\n const surface = event.currentTarget as HTMLElement;\n if ('pointerId' in event) {\n surface.releasePointerCapture?.(event.pointerId);\n }\n }\n\n protected cancelTextSelection(): void {\n this.selectionStart = null;\n }\n\n private async loadDocument(source: PdfViewerSource, wasmUrl: string): Promise<void> {\n const token = ++this.loadToken;\n this.renderToken++;\n this.isLoading.set(true);\n this.errorState.set(null);\n this.pageCount.set(0);\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.revokeRenderedPages();\n this.revokeThumbnailPages();\n\n await this.closeDocument();\n await this.registry?.destroy();\n this.registry = null;\n\n if (!source) {\n this.isLoading.set(false);\n return;\n }\n\n try {\n const engine = await this.engineService.getEngine(wasmUrl);\n\n if (token !== this.loadToken) {\n return;\n }\n\n this.engine = engine;\n this.registry = await this.engineService.createRegistry(engine, this.zoom());\n\n if (token !== this.loadToken) {\n return;\n }\n\n const documentId = this.createDocumentId();\n const pdfDocument = await this.openSource(engine, documentId, source);\n\n if (token !== this.loadToken) {\n await engine.closeDocument(pdfDocument).toPromise();\n return;\n }\n\n this.pdfDocument = pdfDocument;\n this.pageCount.set(pdfDocument.pageCount);\n this.activePage.set(this.clamp(this.activePage(), 1, Math.max(pdfDocument.pageCount, 1)));\n this.loaded.emit({ pageCount: pdfDocument.pageCount });\n this.initializePageShells(pdfDocument, this.zoom(), this.renderAll(), this.activePage());\n this.schedulePageObserverRefresh();\n await this.renderVisiblePages(token, ++this.renderToken, {\n zoom: this.zoom(),\n activePage: this.activePage(),\n renderAll: this.renderAll(),\n withAnnotations: this.withAnnotations(),\n withForms: this.withForms(),\n });\n } catch (error) {\n if (token === this.loadToken) {\n this.errorState.set(error);\n this.error.emit(error);\n }\n } finally {\n if (token === this.loadToken) {\n this.isLoading.set(false);\n }\n }\n }\n\n private initializePageShells(\n pdfDocument: PdfDocumentObject,\n scale: number,\n renderAll: boolean,\n activePage: number,\n ): void {\n const previousPages = this.renderedPages();\n const previousPageMap = new Map(previousPages.map((page) => [page.pageNumber, page]));\n const pageNumbers = this.getPageNumbersToDisplay(pdfDocument, renderAll, activePage);\n const nextScale = this.sanitizeScale(scale);\n const nextPages = pageNumbers.map((pageNumber) => {\n const pdfPage = pdfDocument.pages[pageNumber - 1];\n const previousPage = previousPageMap.get(pageNumber);\n const displaySize = this.getPageDisplaySize(pdfPage, nextScale);\n const isFresh = previousPage?.url && Math.abs((previousPage.renderedScale ?? 0) - nextScale) < 0.0001;\n\n return {\n pageNumber,\n url: isFresh ? previousPage.url : null,\n scale: nextScale,\n renderedScale: isFresh ? previousPage.renderedScale : null,\n width: displaySize.width,\n height: displaySize.height,\n isRendering: false,\n textGlyphs: isFresh ? previousPage.textGlyphs : [],\n };\n });\n const nextUrlSet = new Set(nextPages.map((page) => page.url).filter((url): url is string => !!url));\n\n for (const page of previousPages) {\n if (page.url && !nextUrlSet.has(page.url)) {\n this.revokeObjectUrl(page.url);\n }\n }\n\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.disconnectPageObserver();\n this.renderedPages.set(nextPages);\n }\n\n private getPageNumbersToDisplay(\n pdfDocument: PdfDocumentObject,\n renderAll: boolean,\n activePage: number,\n ): number[] {\n if (!renderAll) {\n return [this.clamp(activePage, 1, pdfDocument.pageCount)];\n }\n\n return Array.from({ length: pdfDocument.pageCount }, (_, index) => index + 1);\n }\n\n private scheduleVisiblePagesRender(\n options: {\n zoom: number;\n activePage: number;\n renderAll: boolean;\n withAnnotations: boolean;\n withForms: boolean;\n },\n ): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.cancelVisiblePageRenderFrame();\n const token = this.loadToken;\n const renderToken = ++this.renderToken;\n\n this.visiblePageRenderFrame = targetWindow.requestAnimationFrame(() => {\n this.visiblePageRenderFrame = null;\n void this.renderVisiblePages(token, renderToken, options);\n });\n }\n\n private scheduleCurrentVisiblePagesRender(): void {\n this.scheduleVisiblePagesRender({\n zoom: this.zoom(),\n activePage: this.activePage(),\n renderAll: this.renderAll(),\n withAnnotations: this.withAnnotations(),\n withForms: this.withForms(),\n });\n }\n\n private async renderVisiblePages(\n token: number,\n renderToken: number,\n options: {\n zoom: number;\n activePage: number;\n renderAll: boolean;\n withAnnotations: boolean;\n withForms: boolean;\n },\n ): Promise<void> {\n if (!this.engine || !this.pdfDocument) {\n return;\n }\n\n const pdfDocument = this.pdfDocument;\n const renderScale = this.sanitizeScale(options.zoom);\n const pageNumbers = this.getPriorityPageNumbers(options.activePage, options.renderAll);\n\n for (const pageNumber of pageNumbers) {\n if (!this.isRenderCurrent(token, renderToken)) {\n return;\n }\n\n const currentPage = this.renderedPages().find((page) => page.pageNumber === pageNumber);\n\n if (!currentPage || Math.abs(currentPage.scale - renderScale) > 0.0001) {\n continue;\n }\n\n if (currentPage.url && Math.abs((currentPage.renderedScale ?? 0) - renderScale) < 0.0001) {\n continue;\n }\n\n this.patchRenderedPage(pageNumber, { isRendering: true });\n const page = pdfDocument.pages[pageNumber - 1];\n const blob = await this.engine.renderPage(pdfDocument, page, {\n scaleFactor: renderScale,\n dpr: this.getDevicePixelRatio(),\n withAnnotations: options.withAnnotations,\n withForms: options.withForms,\n }).toPromise();\n\n if (!this.isRenderCurrent(token, renderToken)) {\n return;\n }\n\n const displaySize = this.getPageDisplaySize(page, renderScale);\n const textGlyphs = await this.getPageTextGlyphs(pdfDocument, page, renderScale);\n\n if (!this.isRenderCurrent(token, renderToken)) {\n return;\n }\n\n const url = this.document.defaultView?.URL.createObjectURL(blob) ?? URL.createObjectURL(blob);\n const previousUrl = this.renderedPages().find((renderedPage) => renderedPage.pageNumber === pageNumber)?.url;\n\n this.patchRenderedPage(pageNumber, {\n url,\n scale: renderScale,\n renderedScale: renderScale,\n width: displaySize.width,\n height: displaySize.height,\n isRendering: false,\n textGlyphs,\n });\n\n if (previousUrl && previousUrl !== url) {\n this.revokeObjectUrl(previousUrl);\n }\n\n this.pageRendered.emit({ pageNumber, url, width: displaySize.width, height: displaySize.height });\n }\n }\n\n private setZoom(scale: number): void {\n const nextZoom = this.sanitizeScale(scale);\n\n if (this.zoom() !== nextZoom) {\n this.zoom.set(nextZoom);\n }\n\n this.applyInstantZoom(nextZoom);\n }\n\n private applyInstantZoom(scale: number): void {\n const nextScale = this.sanitizeScale(scale);\n const pdfDocument = this.pdfDocument;\n const pages = this.renderedPages();\n\n if (!pdfDocument || pages.length === 0) {\n return;\n }\n\n let hasChanges = false;\n const nextPages = pages.map((page) => {\n if (Math.abs(page.scale - nextScale) < 0.0001) {\n return page;\n }\n\n hasChanges = true;\n const pdfPage = pdfDocument.pages[page.pageNumber - 1];\n const displaySize = this.getPageDisplaySize(pdfPage, nextScale);\n\n return {\n ...page,\n url: null,\n scale: nextScale,\n renderedScale: null,\n width: displaySize.width,\n height: displaySize.height,\n isRendering: false,\n textGlyphs: [],\n };\n });\n\n if (!hasChanges) {\n return;\n }\n\n for (const page of pages) {\n if (page.url) {\n this.revokeObjectUrl(page.url);\n }\n }\n\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.renderedPages.set(nextPages);\n this.schedulePageObserverRefresh();\n }\n\n private getPriorityPageNumbers(activePage: number, renderAll: boolean): number[] {\n if (!this.pdfDocument) {\n return [];\n }\n\n const pageCount = this.pdfDocument.pageCount;\n const visiblePageNumbers = renderAll\n ? this.getVisiblePageNumbers()\n : [this.clamp(activePage, 1, pageCount)];\n const priorityPageNumbers = new Set<number>();\n\n for (const pageNumber of visiblePageNumbers.length > 0 ? visiblePageNumbers : [activePage]) {\n for (let candidate = pageNumber - 1; candidate <= pageNumber + 1; candidate++) {\n if (candidate >= 1 && candidate <= pageCount) {\n priorityPageNumbers.add(candidate);\n }\n }\n }\n\n priorityPageNumbers.add(this.clamp(activePage, 1, pageCount));\n\n return [...priorityPageNumbers].sort((a, b) => {\n const activeDistance = Math.abs(a - activePage) - Math.abs(b - activePage);\n\n return activeDistance || a - b;\n });\n }\n\n private getVisiblePageNumbers(): number[] {\n const container = this.viewerBody()?.nativeElement;\n\n if (!container) {\n return [];\n }\n\n const containerRect = container.getBoundingClientRect();\n const prefetchMargin = containerRect.height;\n const pages = Array.from(container.querySelectorAll<HTMLElement>('[data-ngs-pdf-page]'));\n const visiblePageNumbers: number[] = [];\n\n for (const page of pages) {\n const rect = page.getBoundingClientRect();\n const pageNumber = Number(page.dataset['ngsPdfPage']);\n\n if (\n Number.isFinite(pageNumber) &&\n rect.bottom >= containerRect.top - prefetchMargin &&\n rect.top <= containerRect.bottom + prefetchMargin\n ) {\n visiblePageNumbers.push(pageNumber);\n }\n }\n\n return visiblePageNumbers;\n }\n\n private patchRenderedPage(pageNumber: number, patch: Partial<PdfViewerPageView>): void {\n this.renderedPages.update((pages) =>\n pages.map((page) => page.pageNumber === pageNumber ? { ...page, ...patch } : page),\n );\n }\n\n private async renderThumbnails(\n token: number,\n options: {\n withAnnotations: boolean;\n },\n ): Promise<void> {\n if (!this.engine || !this.pdfDocument) {\n return;\n }\n\n const pdfDocument = this.pdfDocument;\n const thumbnailScale = 0.18;\n const nextThumbnails: PdfViewerThumbnailView[] = [];\n const previousThumbnails = this.thumbnailPages();\n\n for (const page of pdfDocument.pages) {\n const blob = await this.engine.renderThumbnail(pdfDocument, page, {\n scaleFactor: thumbnailScale,\n dpr: this.getDevicePixelRatio(),\n withAnnotations: options.withAnnotations,\n }).toPromise();\n\n if (token !== this.loadToken) {\n const staleUrl = this.document.defaultView?.URL.createObjectURL(blob) ?? URL.createObjectURL(blob);\n this.revokeObjectUrl(staleUrl);\n return;\n }\n\n const url = this.document.defaultView?.URL.createObjectURL(blob) ?? URL.createObjectURL(blob);\n const pageNumber = page.index + 1;\n const displaySize = this.getPageDisplaySize(page, thumbnailScale);\n nextThumbnails.push({ pageNumber, url, width: displaySize.width, height: displaySize.height });\n }\n\n if (token !== this.loadToken) {\n for (const thumbnail of nextThumbnails) {\n this.revokeObjectUrl(thumbnail.url);\n }\n return;\n }\n\n this.thumbnailPages.set(nextThumbnails);\n\n for (const thumbnail of previousThumbnails) {\n this.revokeObjectUrl(thumbnail.url);\n }\n }\n\n private async getPageTextGlyphs(\n pdfDocument: PdfDocumentObject,\n page: PdfPageObject,\n scale: number,\n ): Promise<PdfViewerTextGlyphView[]> {\n if (!this.engine) {\n return [];\n }\n\n try {\n const geometry = await this.engine.getPageGeometry(pdfDocument, page).toPromise();\n const displaySize = this.getPageDisplaySize(page, scale);\n const glyphs: PdfViewerTextGlyphView[] = [];\n\n for (const run of geometry.runs) {\n for (const glyph of run.glyphs) {\n if ((glyph.flags & 2) === 2 || glyph.width <= 0 || glyph.height <= 0) {\n continue;\n }\n\n const glyphLeft = glyph.x * scale;\n const glyphTop = glyph.y * scale;\n const glyphWidth = glyph.width * scale;\n const glyphHeight = glyph.height * scale;\n const lineHeight = Math.max(\n glyphHeight,\n (run.fontSize ?? glyph.height) * this.textSelectionLineHeight * scale,\n );\n const lineTop = this.clamp(glyphTop - (lineHeight - glyphHeight) / 2, 0, displaySize.height);\n const lineBottom = this.clamp(lineTop + lineHeight, 0, displaySize.height);\n const left = this.clamp(glyphLeft, 0, displaySize.width);\n const right = this.clamp(glyphLeft + glyphWidth, 0, displaySize.width);\n\n glyphs.push({\n index: glyphs.length,\n left,\n top: this.clamp(glyphTop, 0, displaySize.height),\n width: Math.max(0, right - left),\n height: Math.max(0, glyphHeight),\n lineTop,\n lineHeight: Math.max(0, lineBottom - lineTop),\n lineId: -1,\n });\n }\n }\n\n return this.assignTextGlyphLines(glyphs).map((glyph) => ({\n ...glyph,\n left: this.roundCssPixel(glyph.left),\n top: this.roundCssPixel(glyph.top),\n width: this.roundCssPixel(glyph.width),\n height: this.roundCssPixel(glyph.height),\n lineTop: this.roundCssPixel(glyph.lineTop),\n lineHeight: this.roundCssPixel(glyph.lineHeight),\n }));\n } catch {\n return [];\n }\n }\n\n private assignTextGlyphLines(glyphs: PdfViewerTextGlyphView[]): PdfViewerTextGlyphView[] {\n const lines: PdfViewerTextLineView[] = [];\n\n for (const glyph of [...glyphs].sort((a, b) => a.lineTop - b.lineTop || a.left - b.left)) {\n const glyphBottom = glyph.lineTop + glyph.lineHeight;\n const glyphCenter = glyph.lineTop + glyph.lineHeight / 2;\n let line = lines.find((candidate) =>\n this.rangesOverlap(candidate.top, candidate.bottom, glyph.lineTop, glyphBottom) ||\n Math.abs(candidate.center - glyphCenter) <= Math.max(2, glyph.lineHeight * 0.4),\n );\n\n if (!line) {\n line = {\n lineId: lines.length,\n glyphs: [],\n top: glyph.lineTop,\n bottom: glyphBottom,\n left: glyph.left,\n right: glyph.left + glyph.width,\n center: glyphCenter,\n };\n lines.push(line);\n }\n\n glyph.lineId = line.lineId;\n line.glyphs.push(glyph);\n line.top = Math.min(line.top, glyph.lineTop);\n line.bottom = Math.max(line.bottom, glyphBottom);\n line.left = Math.min(line.left, glyph.left);\n line.right = Math.max(line.right, glyph.left + glyph.width);\n line.center = line.top + (line.bottom - line.top) / 2;\n }\n\n return glyphs;\n }\n\n private getTextLines(glyphs: PdfViewerTextGlyphView[]): PdfViewerTextLineView[] {\n const lines = new Map<number, PdfViewerTextLineView>();\n\n for (const glyph of glyphs) {\n const glyphBottom = glyph.lineTop + glyph.lineHeight;\n const glyphRight = glyph.left + glyph.width;\n const existing = lines.get(glyph.lineId);\n\n if (!existing) {\n lines.set(glyph.lineId, {\n lineId: glyph.lineId,\n glyphs: [glyph],\n top: glyph.lineTop,\n bottom: glyphBottom,\n left: glyph.left,\n right: glyphRight,\n center: glyph.lineTop + glyph.lineHeight / 2,\n });\n continue;\n }\n\n existing.glyphs.push(glyph);\n existing.top = Math.min(existing.top, glyph.lineTop);\n existing.bottom = Math.max(existing.bottom, glyphBottom);\n existing.left = Math.min(existing.left, glyph.left);\n existing.right = Math.max(existing.right, glyphRight);\n existing.center = existing.top + (existing.bottom - existing.top) / 2;\n }\n\n return [...lines.values()]\n .map((line) => ({\n ...line,\n glyphs: [...line.glyphs].sort((a, b) => a.left - b.left || a.index - b.index),\n }))\n .sort((a, b) => a.top - b.top || a.left - b.left);\n }\n\n private rangesOverlap(aStart: number, aEnd: number, bStart: number, bEnd: number): boolean {\n return aStart < bEnd && aEnd > bStart;\n }\n\n private getCaretOffsetAtPoint(page: PdfViewerPageView, point: Pick<PdfViewerSelectionPoint, 'x' | 'y'>): number {\n const lines = this.getTextLines(page.textGlyphs);\n\n if (lines.length === 0) {\n return 0;\n }\n\n const line =\n lines.find((candidate) => point.y >= candidate.top && point.y <= candidate.bottom) ??\n lines.reduce((closest, candidate) =>\n Math.abs(candidate.center - point.y) < Math.abs(closest.center - point.y) ? candidate : closest,\n );\n const glyphs = line.glyphs;\n\n if (glyphs.length === 0) {\n return 0;\n }\n\n for (const glyph of glyphs) {\n if (point.x < glyph.left + glyph.width / 2) {\n return glyph.index;\n }\n }\n\n return glyphs[glyphs.length - 1].index + 1;\n }\n\n private getSelectionPoint(\n event: PointerEvent | MouseEvent,\n page: PdfViewerPageView,\n surface: HTMLElement,\n ): PdfViewerSelectionPoint {\n const rect = surface.getBoundingClientRect();\n const x = this.clamp(event.clientX - rect.left, 0, page.width);\n const y = this.clamp(event.clientY - rect.top, 0, page.height);\n\n return {\n pageNumber: page.pageNumber,\n x,\n y,\n offset: this.getCaretOffsetAtPoint(page, { x, y }),\n };\n }\n\n private getSelectionRects(\n page: PdfViewerPageView,\n startOffset: number,\n endOffset: number,\n ): PdfViewerSelectionRectView[] {\n const rangeStart = Math.min(startOffset, endOffset);\n const rangeEnd = Math.max(startOffset, endOffset);\n const selectedGlyphs = page.textGlyphs.filter((glyph) =>\n glyph.index >= rangeStart && glyph.index < rangeEnd,\n );\n\n return this.getTextLines(selectedGlyphs).map((line) => {\n const left = this.clamp(line.left - this.textSelectionHorizontalPadding, 0, page.width);\n const top = this.clamp(line.top, 0, page.height);\n const right = this.clamp(line.right + this.textSelectionHorizontalPadding, 0, page.width);\n const bottom = this.clamp(line.bottom, 0, page.height);\n\n return {\n text: '',\n pageNumber: page.pageNumber,\n left: this.roundCssPixel(left),\n top: this.roundCssPixel(top),\n width: this.roundCssPixel(Math.max(0, right - left)),\n height: this.roundCssPixel(Math.max(0, bottom - top)),\n };\n });\n }\n\n private async openSource(\n engine: PdfEngine<Blob>,\n documentId: string,\n source: Exclude<PdfViewerSource, null | undefined>,\n ): Promise<PdfDocumentObject> {\n if (typeof source === 'string') {\n return engine.openDocumentUrl({ id: documentId, url: source }).toPromise();\n }\n\n if (source instanceof Blob) {\n return engine.openDocumentBuffer({ id: documentId, content: await source.arrayBuffer() }).toPromise();\n }\n\n if (source instanceof Uint8Array) {\n const content = new Uint8Array(source).buffer;\n return engine.openDocumentBuffer({ id: documentId, content }).toPromise();\n }\n\n return engine.openDocumentBuffer({ id: documentId, content: source }).toPromise();\n }\n\n private async closeDocument(): Promise<void> {\n if (!this.engine || !this.pdfDocument) {\n this.pdfDocument = null;\n return;\n }\n\n const documentToClose = this.pdfDocument;\n this.pdfDocument = null;\n\n try {\n await this.engine.closeDocument(documentToClose).toPromise();\n } catch {\n // Best-effort cleanup; the viewer should not surface cleanup failures as user-facing load errors.\n }\n }\n\n private revokeRenderedPages(): void {\n this.disconnectPageObserver();\n this.cancelVisiblePageRenderFrame();\n\n for (const page of this.renderedPages()) {\n if (page.url) {\n this.revokeObjectUrl(page.url);\n }\n }\n\n this.renderedPages.set([]);\n }\n\n private revokeThumbnailPages(): void {\n for (const thumbnail of this.thumbnailPages()) {\n this.revokeObjectUrl(thumbnail.url);\n }\n\n this.thumbnailPages.set([]);\n }\n\n private revokeObjectUrl(url: string): void {\n const targetWindow = this.document.defaultView;\n\n if (targetWindow) {\n targetWindow.URL.revokeObjectURL(url);\n return;\n }\n\n URL.revokeObjectURL(url);\n }\n\n private sanitizePage(pageNumber: number): number {\n return this.clamp(Math.trunc(Number.isFinite(pageNumber) ? pageNumber : 1), 1, Math.max(this.pageCount(), 1));\n }\n\n private sanitizeScale(scale: number): number {\n const bounds = this.getScaleBounds();\n return this.clamp(Number.isFinite(scale) ? scale : 1, bounds.min, bounds.max);\n }\n\n private roundZoom(value: number): number {\n return this.sanitizeScale(Math.round(this.sanitizeScale(value) * 100) / 100);\n }\n\n private clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n }\n\n private roundCssPixel(value: number): number {\n return Math.round(value * 100) / 100;\n }\n\n private getDevicePixelRatio(): number {\n return this.document.defaultView?.devicePixelRatio || 1;\n }\n\n private createDocumentId(): string {\n return `ngs-pdf-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n\n private isRenderCurrent(loadToken: number, renderToken: number): boolean {\n return loadToken === this.loadToken && renderToken === this.renderToken;\n }\n\n private cancelScrollSyncFrame(): void {\n if (this.scrollSyncFrame === null) {\n return;\n }\n\n this.document.defaultView?.cancelAnimationFrame(this.scrollSyncFrame);\n this.scrollSyncFrame = null;\n }\n\n private cancelPageObserverFrame(): void {\n if (this.pageObserverTimeout !== null) {\n this.document.defaultView?.clearTimeout(this.pageObserverTimeout);\n this.pageObserverTimeout = null;\n }\n\n if (this.pageObserverFrame === null) {\n return;\n }\n\n this.document.defaultView?.cancelAnimationFrame(this.pageObserverFrame);\n this.pageObserverFrame = null;\n }\n\n private cancelVisiblePageRenderFrame(): void {\n if (this.visiblePageRenderFrame === null) {\n return;\n }\n\n this.document.defaultView?.cancelAnimationFrame(this.visiblePageRenderFrame);\n this.visiblePageRenderFrame = null;\n }\n\n private disconnectPageObserver(): void {\n this.cancelPageObserverFrame();\n this.pageIntersectionObserver?.disconnect();\n this.pageIntersectionObserver = null;\n this.visiblePageRatios.clear();\n }\n\n private schedulePageObserverRefresh(): void {\n const targetWindow = this.document.defaultView;\n\n if (!this.isBrowser || !targetWindow) {\n return;\n }\n\n this.cancelPageObserverFrame();\n this.pageObserverRefreshAttempts = 0;\n this.scheduleNextPageObserverRefresh();\n }\n\n private scheduleNextPageObserverRefresh(): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.pageObserverTimeout = targetWindow.setTimeout(() => {\n this.pageObserverTimeout = null;\n this.pageObserverFrame = targetWindow.requestAnimationFrame(() => {\n this.pageObserverFrame = null;\n const isReady = this.setupPageIntersectionObserver();\n\n if (!isReady && this.pageObserverRefreshAttempts < 10) {\n this.pageObserverRefreshAttempts++;\n this.scheduleNextPageObserverRefresh();\n return;\n }\n\n this.syncActivePageFromViewport();\n });\n }, 0);\n }\n\n private setupPageIntersectionObserver(): boolean {\n const targetWindow = this.document.defaultView;\n const container = this.viewerBody()?.nativeElement;\n\n if (!targetWindow || !container || !('IntersectionObserver' in targetWindow)) {\n return false;\n }\n\n const pages = Array.from(container.querySelectorAll<HTMLElement>('[data-ngs-pdf-page]'));\n\n if (pages.length === 0) {\n return false;\n }\n\n this.pageIntersectionObserver?.disconnect();\n this.visiblePageRatios.clear();\n this.pageIntersectionObserver = new targetWindow.IntersectionObserver((entries) => {\n if (this.isProgrammaticScrollActive()) {\n this.scheduleCurrentVisiblePagesRender();\n return;\n }\n\n for (const entry of entries) {\n const pageNumber = Number(entry.target.getAttribute('data-ngs-pdf-page'));\n\n if (!Number.isFinite(pageNumber)) {\n continue;\n }\n\n this.visiblePageRatios.set(pageNumber, entry.intersectionRatio);\n }\n\n this.syncActivePageFromIntersections();\n this.scheduleCurrentVisiblePagesRender();\n }, {\n root: container,\n threshold: [0, 0.1, 0.25, 0.5, 0.75, 1],\n });\n\n for (const page of pages) {\n this.pageIntersectionObserver.observe(page);\n }\n\n return true;\n }\n\n private getScaleBounds(): { min: number; max: number } {\n const min = this.sanitizePositiveNumber(this.minScale(), 0.2);\n const max = this.sanitizePositiveNumber(this.maxScale(), 60);\n\n return min <= max ? { min, max } : { min: max, max: min };\n }\n\n private sanitizeZoomStep(): number {\n return this.sanitizePositiveNumber(this.zoomStep(), 0.1);\n }\n\n private sanitizePositiveNumber(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n }\n\n private getPageDisplaySize(page: PdfPageObject, scale: number): { width: number; height: number } {\n const isRotatedSideways = page.rotation === 1 || page.rotation === 3;\n const width = isRotatedSideways ? page.size.height : page.size.width;\n const height = isRotatedSideways ? page.size.width : page.size.height;\n\n return {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n };\n }\n\n private scrollToPage(pageNumber: number): void {\n if (!this.renderAll()) {\n return;\n }\n\n const container = this.viewerBody()?.nativeElement;\n const target = container?.querySelector<HTMLElement>(`[data-ngs-pdf-page=\"${pageNumber}\"]`);\n\n if (!container || !target) {\n return;\n }\n\n const nextScrollTop = this.getPageScrollTop(container, target);\n const scrollDistance = Math.abs(container.scrollTop - nextScrollTop);\n\n this.startProgrammaticScrollLock(pageNumber, scrollDistance);\n container.scrollTo({\n top: nextScrollTop,\n behavior: 'smooth',\n });\n }\n\n private syncActivePageFromViewport(): void {\n const pageNumber = this.findActivePageInViewport();\n\n this.activatePageFromScroll(pageNumber);\n }\n\n private syncActivePageFromIntersections(): void {\n let activePage: number | null = null;\n let activeRatio = 0;\n\n for (const [pageNumber, ratio] of this.visiblePageRatios) {\n if (ratio > activeRatio) {\n activeRatio = ratio;\n activePage = pageNumber;\n }\n }\n\n if (!activePage) {\n activePage = this.findActivePageInViewport();\n }\n\n this.activatePageFromScroll(activePage);\n }\n\n private activatePageFromScroll(pageNumber: number | null): void {\n if (this.isProgrammaticScrollActive()) {\n return;\n }\n\n if (!pageNumber || pageNumber === this.activePage()) {\n return;\n }\n\n this.activePage.set(pageNumber);\n this.pageChanged.emit(pageNumber);\n this.scrollPageListToPage(pageNumber);\n this.scheduleCurrentVisiblePagesRender();\n }\n\n private findActivePageInViewport(): number | null {\n const container = this.viewerBody()?.nativeElement;\n\n if (!container) {\n return null;\n }\n\n const containerRect = container.getBoundingClientRect();\n const viewportCenter = containerRect.top + containerRect.height / 2;\n const pages = Array.from(container.querySelectorAll<HTMLElement>('[data-ngs-pdf-page]'));\n\n let closestPage: number | null = null;\n let closestDistance = Number.POSITIVE_INFINITY;\n let mostVisiblePage: number | null = null;\n let mostVisibleHeight = 0;\n\n for (const page of pages) {\n const rect = page.getBoundingClientRect();\n const pageNumber = Number(page.dataset['ngsPdfPage']);\n\n if (!Number.isFinite(pageNumber)) {\n continue;\n }\n\n if (rect.top <= viewportCenter && rect.bottom >= viewportCenter) {\n return pageNumber;\n }\n\n const visibleHeight = Math.max(0, Math.min(rect.bottom, containerRect.bottom) - Math.max(rect.top, containerRect.top));\n\n if (visibleHeight > mostVisibleHeight) {\n mostVisibleHeight = visibleHeight;\n mostVisiblePage = pageNumber;\n }\n\n const distance = Math.min(Math.abs(rect.top - viewportCenter), Math.abs(rect.bottom - viewportCenter));\n\n if (distance < closestDistance) {\n closestDistance = distance;\n closestPage = pageNumber;\n }\n }\n\n return mostVisiblePage ?? closestPage;\n }\n\n private scrollPageListToPage(pageNumber: number): void {\n const container = this.pageList()?.nativeElement;\n const target = container?.querySelector<HTMLElement>(`[data-ngs-pdf-page-button=\"${pageNumber}\"]`);\n\n if (!container || !target) {\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n const isAbove = targetRect.top < containerRect.top;\n const isBelow = targetRect.bottom > containerRect.bottom;\n\n if (!isAbove && !isBelow) {\n return;\n }\n\n container.scrollTo({\n top: this.getElementScrollTop(container, target, 'center'),\n behavior: 'smooth',\n });\n }\n\n private getPageScrollTop(container: HTMLElement, target: HTMLElement): number {\n return this.getElementScrollTop(container, target, 'start');\n }\n\n private getElementScrollTop(container: HTMLElement, target: HTMLElement, align: 'start' | 'center'): number {\n const containerRect = container.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n const targetTop = container.scrollTop + targetRect.top - containerRect.top;\n const alignedTop = align === 'center'\n ? targetTop - container.clientHeight / 2 + targetRect.height / 2\n : targetTop;\n\n return this.clamp(alignedTop, 0, Math.max(0, container.scrollHeight - container.clientHeight));\n }\n\n private getProgrammaticScrollTimeout(distance: number): number {\n return this.clamp(\n this.programmaticScrollMinDuration + distance * 0.45,\n this.programmaticScrollMinDuration,\n this.programmaticScrollMaxDuration,\n );\n }\n\n private startProgrammaticScrollLock(pageNumber: number, distance: number): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.clearProgrammaticScrollLock();\n this.programmaticScrollTargetPage = pageNumber;\n this.programmaticScrollTimeout = targetWindow.setTimeout(() => {\n this.programmaticScrollTimeout = null;\n this.completeProgrammaticScroll();\n }, this.getProgrammaticScrollTimeout(distance));\n }\n\n private isProgrammaticScrollActive(): boolean {\n return this.programmaticScrollTargetPage !== null;\n }\n\n private completeProgrammaticScrollIfSettled(): void {\n const pageNumber = this.programmaticScrollTargetPage;\n\n if (pageNumber === null) {\n return;\n }\n\n const container = this.viewerBody()?.nativeElement;\n const target = container?.querySelector<HTMLElement>(`[data-ngs-pdf-page=\"${pageNumber}\"]`);\n\n if (!container || !target) {\n this.completeProgrammaticScroll();\n return;\n }\n\n if (Math.abs(container.scrollTop - this.getPageScrollTop(container, target)) <= 2) {\n this.completeProgrammaticScroll();\n }\n }\n\n private completeProgrammaticScroll(): void {\n const pageNumber = this.programmaticScrollTargetPage;\n\n this.clearProgrammaticScrollLock();\n\n if (pageNumber === null) {\n return;\n }\n\n if (pageNumber !== this.activePage()) {\n this.activePage.set(pageNumber);\n this.pageChanged.emit(pageNumber);\n }\n\n this.scrollPageListToPage(pageNumber);\n }\n\n private clearProgrammaticScrollLock(): void {\n if (this.programmaticScrollTimeout !== null) {\n this.document.defaultView?.clearTimeout(this.programmaticScrollTimeout);\n this.programmaticScrollTimeout = null;\n }\n\n this.programmaticScrollTargetPage = null;\n }\n}\n","<ngs-panel class=\"pdf-viewer-panel\">\n @if (showToolbar()) {\n <ngs-panel-header flex>\n <div class=\"pdf-viewer-toolbar\" aria-label=\"PDF viewer controls\">\n @if (showPageList()) {\n <button\n ngsIconButton\n type=\"button\"\n [attr.aria-label]=\"pageListVisible() ? 'Hide pages panel' : 'Show pages panel'\"\n [attr.aria-pressed]=\"pageListVisible()\"\n (click)=\"togglePageList()\">\n <ngs-icon\n [name]=\"pageListVisible() ? 'fluent:panel-left-contract-24-regular' : 'fluent:panel-left-expand-24-regular'\" />\n </button>\n }\n <button ngsIconButton type=\"button\" aria-label=\"Previous page\" [disabled]=\"!canGoPrevious()\" (click)=\"previousPage()\">\n <ngs-icon name=\"fluent:chevron-up-24-regular\" />\n </button>\n <span class=\"pdf-viewer-toolbar__page\">{{ activePage() }} / {{ pageCount() || 1 }}</span>\n <button ngsIconButton type=\"button\" aria-label=\"Next page\" [disabled]=\"!canGoNext()\" (click)=\"nextPage()\">\n <ngs-icon name=\"fluent:chevron-down-24-regular\" />\n </button>\n <span class=\"pdf-viewer-toolbar__spacer\"></span>\n <button ngsIconButton type=\"button\" aria-label=\"Zoom out\" [disabled]=\"!canZoomOut()\" (click)=\"zoomOut()\">\n <ngs-icon name=\"fluent:zoom-out-24-regular\" />\n </button>\n <span class=\"pdf-viewer-toolbar__zoom\">{{ zoomLabel() }}</span>\n <button ngsIconButton type=\"button\" aria-label=\"Zoom in\" [disabled]=\"!canZoomIn()\" (click)=\"zoomIn()\">\n <ngs-icon name=\"fluent:zoom-in-24-regular\" />\n </button>\n <button ngsIconButton type=\"button\" aria-label=\"PDF viewer settings\" [ngsMenuTriggerFor]=\"settingsMenu\">\n <ngs-icon name=\"fluent:settings-24-regular\" />\n </button>\n </div>\n\n <ngs-menu #settingsMenu=\"ngsMenu\" xPosition=\"before\">\n <ngs-menu-heading>SPREAD MODE</ngs-menu-heading>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"spreadMode() === 'single'\"\n (click)=\"setSpreadMode('single')\">\n <ngs-icon name=\"fluent:document-24-regular\" />\n <span>Single Page</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"spreadMode() === 'two-odd'\"\n (click)=\"setSpreadMode('two-odd')\">\n <ngs-icon name=\"fluent:book-open-24-regular\" />\n <span>Two Page (Odd)</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"spreadMode() === 'two-even'\"\n (click)=\"setSpreadMode('two-even')\">\n <ngs-icon name=\"fluent:document-text-24-regular\" />\n <span>Two Page (Even)</span>\n </button>\n\n <ngs-menu-divider />\n <ngs-menu-heading>SCROLL LAYOUT</ngs-menu-heading>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"scrollLayout() === 'vertical'\"\n (click)=\"setScrollLayout('vertical')\">\n <ngs-icon name=\"fluent:arrow-sort-24-regular\" />\n <span>Vertical</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"scrollLayout() === 'horizontal'\"\n (click)=\"setScrollLayout('horizontal')\">\n <ngs-icon name=\"fluent:arrow-swap-24-regular\" />\n <span>Horizontal</span>\n </button>\n\n <ngs-menu-divider />\n <ngs-menu-heading>PAGE ROTATION</ngs-menu-heading>\n <button ngs-menu-item type=\"button\" (click)=\"rotateClockwise()\">\n <ngs-icon name=\"fluent:arrow-clockwise-24-regular\" />\n <span>Rotate Clockwise</span>\n </button>\n <button ngs-menu-item type=\"button\" (click)=\"rotateCounterClockwise()\">\n <ngs-icon name=\"fluent:arrow-counterclockwise-24-regular\" />\n <span>Rotate Counter-Clockwise</span>\n </button>\n\n <ngs-menu-divider />\n <button ngs-menu-item type=\"button\" (click)=\"toggleFullscreen()\">\n <ngs-icon name=\"fluent:arrow-maximize-24-regular\" />\n <span>Fullscreen</span>\n </button>\n </ngs-menu>\n </ngs-panel-header>\n }\n\n @if (isPageListVisible()) {\n <ngs-panel-sidebar>\n <div class=\"pdf-viewer-sidebar\" #pageList>\n <div class=\"pdf-viewer-sidebar__title\">Pages</div>\n <div class=\"pdf-viewer-sidebar__pages\" aria-label=\"PDF pages\">\n @for (pageItem of pageItems(); track pageItem.pageNumber) {\n <button\n class=\"pdf-viewer-sidebar__page\"\n type=\"button\"\n [class.is-active]=\"pageItem.pageNumber === activePage()\"\n [attr.aria-current]=\"pageItem.pageNumber === activePage() ? 'page' : null\"\n [attr.aria-label]=\"'Open page ' + pageItem.pageNumber\"\n [attr.data-ngs-pdf-page-button]=\"pageItem.pageNumber\"\n (click)=\"setPage(pageItem.pageNumber)\">\n <span class=\"pdf-viewer-sidebar__thumb\" aria-hidden=\"true\">\n @if (pageItem.thumbnail; as thumbnail) {\n <img\n [src]=\"thumbnail.url\"\n [attr.width]=\"thumbnail.width\"\n [attr.height]=\"thumbnail.height\"\n alt=\"\"\n draggable=\"false\" />\n } @else {\n <ngs-image-placeholder />\n }\n </span>\n <span class=\"pdf-viewer-sidebar__label\">Page {{ pageItem.pageNumber }}</span>\n </button>\n }\n </div>\n </div>\n </ngs-panel-sidebar>\n }\n\n <ngs-panel-content>\n <div class=\"pdf-viewer-body\" #viewerBody (scroll)=\"onViewerScroll()\">\n <ngs-block-loader [loading]=\"isLoading()\">Loading PDF...</ngs-block-loader>\n @if (errorState()) {\n <div class=\"pdf-viewer-state pdf-viewer-state--error\">\n <ngs-icon name=\"fluent:error-circle-24-regular\" />\n <span>PDF could not be loaded.</span>\n </div>\n } @else if (!src()) {\n <div class=\"pdf-viewer-state\">\n <ngs-icon name=\"fluent:document-pdf-24-regular\" />\n <span>No PDF selected.</span>\n </div>\n } @else {\n <div class=\"pdf-viewer-pages\">\n @for (pdfPage of renderedPages(); track pdfPage.pageNumber) {\n <article\n class=\"pdf-viewer-page\"\n [attr.aria-label]=\"'PDF page ' + pdfPage.pageNumber\"\n [attr.data-ngs-pdf-page]=\"pdfPage.pageNumber\">\n <div\n class=\"pdf-viewer-page__surface\"\n [style.width.px]=\"pdfPage.width\"\n [style.height.px]=\"pdfPage.height\"\n (pointerdown)=\"startTextSelection($event, pdfPage)\"\n (pointermove)=\"updateTextSelection($event, pdfPage)\"\n (pointerup)=\"finishTextSelection($event, pdfPage)\"\n (pointercancel)=\"cancelTextSelection()\"\n (mousedown)=\"startTextSelection($event, pdfPage)\"\n (mousemove)=\"updateTextSelection($event, pdfPage)\"\n (mouseup)=\"finishTextSelection($event, pdfPage)\">\n @if (isPageImageFresh(pdfPage) && pdfPage.url; as pageUrl) {\n <img\n [src]=\"pageUrl\"\n [alt]=\"'PDF page ' + pdfPage.pageNumber\"\n [attr.width]=\"pdfPage.width\"\n [attr.height]=\"pdfPage.height\"\n draggable=\"false\" />\n } @else {\n <div class=\"pdf-viewer-page__placeholder\" aria-hidden=\"true\">\n @if (pdfPage.isRendering) {\n <span></span>\n }\n </div>\n }\n @if (selectionRectsForPage(pdfPage.pageNumber); as selectionRects) {\n @if (selectionRects.length > 0) {\n <div class=\"pdf-viewer-page__selection-layer\" aria-hidden=\"true\">\n @for (selectionRect of selectionRects; track selectionRect.left + '-' + selectionRect.top + '-' + $index) {\n <div\n class=\"pdf-viewer-page__selection-rect\"\n [style.left.px]=\"selectionRect.left\"\n [style.top.px]=\"selectionRect.top\"\n [style.width.px]=\"selectionRect.width\"\n [style.height.px]=\"selectionRect.height\"></div>\n }\n </div>\n }\n }\n </div>\n </article>\n }\n </div>\n }\n </div>\n </ngs-panel-content>\n</ngs-panel>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngstarter-ui-components-pdf-viewer.mjs","sources":["../../../projects/components/pdf-viewer/src/pdf-viewer-annotations/pdf-viewer-annotations.ts","../../../projects/components/pdf-viewer/src/pdf-viewer-annotations/pdf-viewer-annotations.html","../../../projects/components/pdf-viewer/src/pdf-viewer-annotation-def.directive.ts","../../../projects/components/pdf-viewer/src/pdf-viewer-engine.service.ts","../../../projects/components/pdf-viewer/src/pdf-viewer-search/pdf-viewer-search.ts","../../../projects/components/pdf-viewer/src/pdf-viewer-search/pdf-viewer-search.html","../../../projects/components/pdf-viewer/src/pdf-viewer/pdf-viewer.ts","../../../projects/components/pdf-viewer/src/pdf-viewer/pdf-viewer.html","../../../projects/components/pdf-viewer/ngstarter-ui-components-pdf-viewer.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, output, signal, TemplateRef } from '@angular/core';\nimport { Button } from '@ngstarter-ui/components/button';\nimport { FormField, IconButtonSuffix, IconPrefix } from '@ngstarter-ui/components/form-field';\nimport { Icon } from '@ngstarter-ui/components/icon';\nimport { Input as NgsInput } from '@ngstarter-ui/components/input';\nimport { Panel, PanelContent, PanelHeader, PanelSubheader } from '@ngstarter-ui/components/panel';\nimport {\n Toolbar,\n ToolbarItem,\n ToolbarSpacer,\n ToolbarTitle,\n} from '@ngstarter-ui/components/toolbar';\nimport { PdfViewerAnnotationDef } from '../pdf-viewer-annotation-def.directive';\nimport type {\n PdfViewerAnnotationTemplateContext,\n PdfViewerAnnotationView,\n} from '../types';\n\n@Component({\n selector: 'ngs-pdf-viewer-annotations',\n standalone: true,\n imports: [\n Button,\n FormField,\n Icon,\n IconButtonSuffix,\n IconPrefix,\n NgsInput,\n NgTemplateOutlet,\n Panel,\n PanelContent,\n PanelHeader,\n Toolbar,\n ToolbarItem,\n ToolbarSpacer,\n ToolbarTitle,\n PanelSubheader,\n ],\n templateUrl: './pdf-viewer-annotations.html',\n styleUrl: './pdf-viewer-annotations.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngs-pdf-viewer-annotations',\n },\n})\nexport class PdfViewerAnnotations {\n annotations = input<PdfViewerAnnotationView[]>([]);\n annotationDefs = input<readonly PdfViewerAnnotationDef[]>([]);\n annotationTypeProperty = input('type');\n\n closed = output<void>();\n pageSelected = output<number>();\n\n protected readonly filterQuery = signal('');\n protected readonly filteredAnnotations = computed(() => {\n const query = this.filterQuery().trim().toLocaleLowerCase();\n const annotations = this.annotations();\n\n if (!query) {\n return annotations;\n }\n\n return annotations.filter((annotation) => this.annotationMatchesFilter(annotation, query));\n });\n\n protected setFilterQuery(event: Event): void {\n this.filterQuery.set((event.target as HTMLInputElement).value);\n }\n\n protected clearFilterQuery(): void {\n this.filterQuery.set('');\n }\n\n protected getAnnotationTemplate(\n annotation: PdfViewerAnnotationView,\n index: number,\n ): TemplateRef<PdfViewerAnnotationTemplateContext> | null {\n const annotationDefs = this.annotationDefs();\n const typeProperty = this.annotationTypeProperty();\n const matchingDef = annotationDefs.find((def) => def.matches(annotation, index, typeProperty))\n ?? annotationDefs.find((def) => !def.hasWhen());\n\n return matchingDef?.template ?? null;\n }\n\n protected getAnnotationTemplateContext(\n annotation: PdfViewerAnnotationView,\n index: number,\n ): PdfViewerAnnotationTemplateContext {\n return {\n $implicit: annotation,\n annotation,\n index,\n goToPage: (pageNumber: number) => this.pageSelected.emit(pageNumber),\n };\n }\n\n protected getAnnotationTypeLabel(annotation: PdfViewerAnnotationView): string {\n const label = annotation.label ?? annotation.type;\n\n return typeof label === 'string' && label.trim().length > 0 ? label : 'Comment';\n }\n\n protected getAvatarLabel(annotation: PdfViewerAnnotationView): string {\n const explicitLabel = annotation.avatarLabel;\n\n if (typeof explicitLabel === 'string' && explicitLabel.trim().length > 0) {\n return explicitLabel.trim();\n }\n\n return annotation.author\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toUpperCase())\n .join('');\n }\n\n protected getAvatarImage(annotation: PdfViewerAnnotationView): string {\n return typeof annotation.avatarUrl === 'string' ? annotation.avatarUrl : '';\n }\n\n protected getReplyLabel(annotation: PdfViewerAnnotationView): string {\n return typeof annotation.replyLabel === 'string' && annotation.replyLabel.trim().length > 0\n ? annotation.replyLabel\n : 'Reply';\n }\n\n private annotationMatchesFilter(annotation: PdfViewerAnnotationView, query: string): boolean {\n return [\n annotation.author,\n annotation.time,\n annotation.text,\n annotation.type,\n annotation.label,\n `page ${annotation.pageNumber}`,\n ]\n .filter((value): value is string => typeof value === 'string')\n .some((value) => value.toLocaleLowerCase().includes(query));\n }\n}\n","<ngs-panel class=\"pdf-viewer-annotations bg-surface\" aria-label=\"PDF annotations\">\n <ngs-panel-header class=\"p-0\">\n <ngs-toolbar class=\"w-full py-0 pr-2 ps-4\" aria-label=\"PDF annotations toolbar\">\n <ngs-toolbar-title>\n Annotations\n </ngs-toolbar-title>\n <ngs-toolbar-spacer />\n <ngs-toolbar-item>\n <button\n class=\"pdf-viewer-annotations__close\"\n ngsIconButton\n type=\"button\"\n aria-label=\"Close annotations panel\"\n (click)=\"closed.emit()\">\n <ngs-icon name=\"fluent:dismiss-24-regular\" />\n </button>\n </ngs-toolbar-item>\n </ngs-toolbar>\n </ngs-panel-header>\n\n <ngs-panel-subheader autoHeight class=\"px-4 pb-4\">\n <ngs-form-field subscriptHiddenIfEmpty>\n <ngs-icon ngsIconPrefix name=\"fluent:search-24-regular\" />\n <input\n ngsInput\n type=\"text\"\n aria-label=\"Filter annotations\"\n placeholder=\"Filter annotations...\"\n [value]=\"filterQuery()\"\n (input)=\"setFilterQuery($event)\" />\n @if (filterQuery()) {\n <button\n ngsIconButton\n ngsIconButtonSuffix\n type=\"button\"\n aria-label=\"Clear annotation filter\"\n (click)=\"clearFilterQuery()\">\n <ngs-icon name=\"fluent:dismiss-24-regular\" />\n </button>\n }\n </ngs-form-field>\n </ngs-panel-subheader>\n\n <ngs-panel-content>\n <div class=\"flex min-h-full flex-col\">\n <div class=\"flex flex-1 flex-col gap-4 pb-4 px-4\">\n <ng-template #defaultAnnotationTemplate let-annotation let-goToPage=\"goToPage\">\n <article class=\"rounded-2xl border border-border bg-surface p-4 shadow-xs\">\n <header class=\"flex items-start gap-3\">\n <span class=\"flex size-9 shrink-0 items-center justify-center overflow-hidden rounded-full bg-primary-container text-xs font-semibold text-on-primary-container\">\n @if (getAvatarImage(annotation); as avatarImage) {\n <img\n class=\"h-full w-full object-cover\"\n [src]=\"avatarImage\"\n [alt]=\"annotation.author\" />\n } @else {\n {{ getAvatarLabel(annotation) }}\n }\n </span>\n\n <span class=\"min-w-0 flex-1\">\n <span class=\"block truncate text-sm font-semibold text-on-surface\">{{ annotation.author }}</span>\n @if (annotation.time) {\n <span class=\"block truncate text-xs text-on-surface-variant\">{{ annotation.time }}</span>\n }\n </span>\n\n <span class=\"rounded-full bg-surface-container-high px-2 py-1 text-xs font-medium tracking-normal text-on-surface-variant uppercase\">\n {{ getAnnotationTypeLabel(annotation) }}\n </span>\n </header>\n\n <p class=\"mt-3 mb-0 text-base leading-relaxed text-on-surface\">{{ annotation.text }}</p>\n\n <footer class=\"mt-4 flex items-center justify-between gap-2\">\n <button\n ngsButton=\"tonal\"\n type=\"button\"\n (click)=\"goToPage(annotation.pageNumber)\">\n Page {{ annotation.pageNumber }}\n </button>\n\n <button ngsButton=\"text\" type=\"button\">\n {{ getReplyLabel(annotation) }}\n </button>\n </footer>\n </article>\n </ng-template>\n\n @for (annotation of filteredAnnotations(); track annotation.id ?? annotation.pageNumber + '-' + $index) {\n <ng-container\n [ngTemplateOutlet]=\"getAnnotationTemplate(annotation, $index) ?? defaultAnnotationTemplate\"\n [ngTemplateOutletContext]=\"getAnnotationTemplateContext(annotation, $index)\" />\n } @empty {\n <div class=\"p-4 text-center text-sm text-on-surface-variant\">No annotations found.</div>\n }\n </div>\n </div>\n </ngs-panel-content>\n</ngs-panel>\n","import { Directive, input, TemplateRef } from '@angular/core';\nimport type {\n PdfViewerAnnotationTemplateContext,\n PdfViewerAnnotationWhen,\n PdfViewerAnnotationView,\n} from './types';\n\n@Directive({\n selector: '[ngsPdfViewerAnnotationDef], [ngsPdfViewerAnnotation]',\n standalone: true,\n})\nexport class PdfViewerAnnotationDef {\n readonly annotationWhen = input<PdfViewerAnnotationWhen | undefined>(undefined, {\n alias: 'ngsPdfViewerAnnotation',\n });\n readonly defWhen = input<PdfViewerAnnotationWhen | undefined>(undefined, {\n alias: 'ngsPdfViewerAnnotationDef',\n });\n readonly when = input<PdfViewerAnnotationWhen | undefined>(undefined, {\n alias: 'ngsPdfViewerAnnotationWhen',\n });\n\n constructor(public template: TemplateRef<PdfViewerAnnotationTemplateContext>) {}\n\n matches(annotation: PdfViewerAnnotationView, index: number, typeProperty: string): boolean {\n const whenValue = this.whenValue();\n\n if (!whenValue) {\n return false;\n }\n\n if (typeof whenValue === 'function') {\n return whenValue(annotation, index);\n }\n\n return annotation[typeProperty] === whenValue;\n }\n\n hasWhen(): boolean {\n return !!this.whenValue();\n }\n\n private whenValue(): PdfViewerAnnotationWhen | undefined {\n return this.when() ?? this.defWhen() ?? this.annotationWhen();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { PluginRegistry } from '@embedpdf/core';\nimport type { PdfEngine } from '@embedpdf/models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PdfViewerEngineService {\n private readonly engines = new Map<string, Promise<PdfEngine<Blob>>>();\n\n getEngine(wasmUrl: string): Promise<PdfEngine<Blob>> {\n const cachedEngine = this.engines.get(wasmUrl);\n\n if (cachedEngine) {\n return cachedEngine;\n }\n\n const engine = this.createEngine(wasmUrl).catch((error: unknown) => {\n this.engines.delete(wasmUrl);\n throw error;\n });\n this.engines.set(wasmUrl, engine);\n return engine;\n }\n\n createRegistry(engine: PdfEngine<Blob>, defaultScale: number): Promise<PluginRegistry> {\n const registry = new PluginRegistry(engine, { defaultScale });\n return registry.initialize().then(() => registry);\n }\n\n private async createEngine(wasmUrl: string): Promise<PdfEngine<Blob>> {\n const { createPdfiumEngine } = await import('@embedpdf/engines/pdfium-direct-engine');\n return createPdfiumEngine(wasmUrl, { encoderPoolSize: 0 });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, input, output, signal, untracked } from '@angular/core';\nimport { Button } from '@ngstarter-ui/components/button';\nimport { Checkbox } from '@ngstarter-ui/components/checkbox';\nimport { FormField, IconButtonSuffix, IconPrefix } from '@ngstarter-ui/components/form-field';\nimport { Icon } from '@ngstarter-ui/components/icon';\nimport { Input as NgsInput } from '@ngstarter-ui/components/input';\nimport { Panel, PanelContent, PanelHeader, PanelSubheader } from '@ngstarter-ui/components/panel';\nimport { Toolbar, ToolbarSpacer, ToolbarTitle } from '@ngstarter-ui/components/toolbar';\nimport type { PdfViewerSearchOptions, PdfViewerSearchResultView } from '../types';\n\ninterface PdfViewerSearchResultPart {\n text: string;\n highlight: boolean;\n}\n\ninterface PdfViewerSearchResultGroup {\n pageNumber: number;\n results: Array<{\n result: PdfViewerSearchResultView;\n index: number;\n }>;\n}\n\n@Component({\n selector: 'ngs-pdf-viewer-search',\n standalone: true,\n imports: [\n Button,\n Checkbox,\n FormField,\n Icon,\n IconButtonSuffix,\n IconPrefix,\n NgsInput,\n Panel,\n PanelContent,\n PanelHeader,\n Toolbar,\n ToolbarSpacer,\n ToolbarTitle,\n PanelSubheader,\n ],\n templateUrl: './pdf-viewer-search.html',\n styleUrl: './pdf-viewer-search.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngs-pdf-viewer-search',\n },\n})\nexport class PdfViewerSearch {\n results = input<PdfViewerSearchResultView[]>([]);\n query = input('');\n\n closed = output<void>();\n resultSelected = output<PdfViewerSearchResultView>();\n searchChanged = output<{\n query: string;\n options: PdfViewerSearchOptions;\n }>();\n\n protected readonly caseSensitive = signal(false);\n protected readonly wholeWord = signal(false);\n protected readonly activeResultIndex = signal(0);\n protected readonly queryValue = signal('');\n protected readonly hasQuery = computed(() => this.queryValue().trim().length > 0);\n protected readonly visibleResultGroups = computed<PdfViewerSearchResultGroup[]>(() => {\n const groups = new Map<number, PdfViewerSearchResultGroup>();\n\n this.results().forEach((result, index) => {\n const group = groups.get(result.pageNumber) ?? {\n pageNumber: result.pageNumber,\n results: [],\n };\n\n group.results.push({ result, index });\n groups.set(result.pageNumber, group);\n });\n\n return [...groups.values()];\n });\n protected readonly resultCountLabel = computed(() => {\n const count = this.results().length;\n\n return `${count} ${count === 1 ? 'result' : 'results'} found`;\n });\n\n constructor() {\n effect(() => {\n const query = this.query();\n\n untracked(() => {\n this.queryValue.set(query);\n this.activeResultIndex.set(0);\n });\n });\n }\n\n protected setQuery(event: Event): void {\n this.queryValue.set((event.target as HTMLInputElement).value);\n this.activeResultIndex.set(0);\n this.emitSearchChanged();\n }\n\n protected clearQuery(): void {\n this.queryValue.set('');\n this.activeResultIndex.set(0);\n this.emitSearchChanged();\n }\n\n protected setCaseSensitive(value: boolean): void {\n this.caseSensitive.set(value);\n this.activeResultIndex.set(0);\n this.emitSearchChanged();\n }\n\n protected setWholeWord(value: boolean): void {\n this.wholeWord.set(value);\n this.activeResultIndex.set(0);\n this.emitSearchChanged();\n }\n\n protected previousResult(): void {\n const count = this.results().length;\n\n if (count === 0) {\n return;\n }\n\n this.activeResultIndex.update((index) => (index - 1 + count) % count);\n }\n\n protected nextResult(): void {\n const count = this.results().length;\n\n if (count === 0) {\n return;\n }\n\n this.activeResultIndex.update((index) => (index + 1) % count);\n }\n\n protected selectResult(result: PdfViewerSearchResultView, index: number): void {\n this.activeResultIndex.set(index);\n this.resultSelected.emit(result);\n }\n\n protected resultParts(result: PdfViewerSearchResultView): PdfViewerSearchResultPart[] {\n const query = this.queryValue().trim();\n\n if (!query) {\n return [{ text: result.excerpt, highlight: false }];\n }\n\n const flags = this.caseSensitive() ? 'g' : 'gi';\n const escapedQuery = this.escapeRegExp(query);\n const pattern = this.wholeWord()\n ? new RegExp(`\\\\b${escapedQuery}\\\\b`, flags)\n : new RegExp(escapedQuery, flags);\n const parts: PdfViewerSearchResultPart[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = pattern.exec(result.excerpt)) !== null) {\n if (match.index > lastIndex) {\n parts.push({ text: result.excerpt.slice(lastIndex, match.index), highlight: false });\n }\n\n parts.push({ text: match[0], highlight: true });\n lastIndex = match.index + match[0].length;\n\n if (match[0].length === 0) {\n pattern.lastIndex++;\n }\n }\n\n if (lastIndex < result.excerpt.length) {\n parts.push({ text: result.excerpt.slice(lastIndex), highlight: false });\n }\n\n return parts.length > 0 ? parts : [{ text: result.excerpt, highlight: false }];\n }\n\n private emitSearchChanged(): void {\n this.searchChanged.emit({\n query: this.queryValue(),\n options: {\n caseSensitive: this.caseSensitive(),\n wholeWord: this.wholeWord(),\n },\n });\n }\n\n private escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n","<ngs-panel class=\"pdf-viewer-search\" aria-label=\"PDF search\">\n <ngs-panel-header class=\"ps-4 pe-3\">\n <ngs-toolbar>\n <ngs-toolbar-title>Search</ngs-toolbar-title>\n <ngs-toolbar-spacer />\n <button ngsIconButton type=\"button\" aria-label=\"Close search panel\" (click)=\"closed.emit()\">\n <ngs-icon name=\"fluent:dismiss-24-regular\" />\n </button>\n </ngs-toolbar>\n </ngs-panel-header>\n\n <ngs-panel-subheader autoHeight class=\"px-4 pb-4\">\n <ngs-form-field class=\"pdf-viewer-search__field\" subscriptHiddenIfEmpty>\n <ngs-icon name=\"fluent:search-24-regular\" ngsIconPrefix />\n <input\n ngsInput\n type=\"text\"\n aria-label=\"Search PDF\"\n placeholder=\"Search\"\n [value]=\"queryValue()\"\n (input)=\"setQuery($event)\" />\n @if (queryValue()) {\n <button ngsIconButtonSuffix ngsIconButton type=\"button\" aria-label=\"Clear search\" (click)=\"clearQuery()\">\n <ngs-icon name=\"fluent:dismiss-24-regular\" />\n </button>\n }\n </ngs-form-field>\n\n <div class=\"pdf-viewer-search__options mt-4 grid gap-3 text-base text-on-surface\">\n <ngs-checkbox [checked]=\"caseSensitive()\" (checkedChange)=\"setCaseSensitive($event)\">\n Case sensitive\n </ngs-checkbox>\n <ngs-checkbox [checked]=\"wholeWord()\" (checkedChange)=\"setWholeWord($event)\">\n Whole word\n </ngs-checkbox>\n </div>\n\n @if (hasQuery()) {\n <div class=\"pdf-viewer-search__summary mt-4 flex items-center justify-between gap-4 text-base text-on-surface-variant\">\n <span>{{ resultCountLabel() }}</span>\n <div class=\"pdf-viewer-search__nav flex items-center gap-3\">\n <button\n class=\"text-on-surface\"\n ngsIconButton\n type=\"button\"\n aria-label=\"Previous search result\"\n [disabled]=\"results().length === 0\"\n (click)=\"previousResult()\">\n <ngs-icon name=\"fluent:chevron-left-24-regular\" />\n </button>\n <button\n class=\"text-on-surface\"\n ngsIconButton\n type=\"button\"\n aria-label=\"Next search result\"\n [disabled]=\"results().length === 0\"\n (click)=\"nextResult()\">\n <ngs-icon name=\"fluent:chevron-right-24-regular\" />\n </button>\n </div>\n </div>\n }\n </ngs-panel-subheader>\n\n <ngs-panel-content>\n <div class=\"pdf-viewer-search__content flex min-h-full flex-col gap-4 px-4 pb-4\">\n @if (hasQuery()) {\n <div class=\"pdf-viewer-search__results grid min-h-0 gap-4\">\n @for (group of visibleResultGroups(); track group.pageNumber) {\n <section class=\"pdf-viewer-search__page-group grid gap-3 bg-surface\">\n <h3 class=\"m-0 text-base font-medium text-on-surface-variant\">Page {{ group.pageNumber }}</h3>\n @for (item of group.results; track item.result.id ?? item.result.pageNumber + '-' + item.index) {\n <button\n class=\"pdf-viewer-search__result w-full cursor-pointer rounded-2xl border border-border p-4 text-left text-base leading-snug text-on-surface\"\n type=\"button\"\n [class.bg-primary-container]=\"item.index === activeResultIndex()\"\n [class.bg-surface]=\"item.index !== activeResultIndex()\"\n (click)=\"selectResult(item.result, item.index)\">\n @for (part of resultParts(item.result); track part.text + '-' + $index) {\n <span\n [class.font-bold]=\"part.highlight\"\n [class.text-primary]=\"part.highlight\">{{ part.text }}</span>\n }\n </button>\n }\n </section>\n } @empty {\n <div class=\"pdf-viewer-search__empty p-4 text-center text-sm text-on-surface-variant\">No results.</div>\n }\n </div>\n }\n </div>\n </ngs-panel-content>\n</ngs-panel>\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n DestroyRef,\n ElementRef,\n effect,\n inject,\n input,\n numberAttribute,\n output,\n PLATFORM_ID,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { MatchFlag, Rotation } from '@embedpdf/models';\nimport type { PdfDocumentObject, PdfEngine, PdfPageObject, SearchResult } from '@embedpdf/models';\nimport { BlockLoader } from '@ngstarter-ui/components/block-loader';\nimport { Button } from '@ngstarter-ui/components/button';\nimport { Divider } from '@ngstarter-ui/components/divider';\nimport { Icon } from '@ngstarter-ui/components/icon';\nimport { ImagePlaceholder } from '@ngstarter-ui/components/image-placeholder';\nimport {\n Menu,\n MenuDivider,\n MenuHeading,\n MenuItem,\n MenuTrigger,\n} from '@ngstarter-ui/components/menu';\nimport {\n Panel,\n PanelAside,\n PanelContent,\n PanelHeader,\n PanelSidebar,\n} from '@ngstarter-ui/components/panel';\nimport {\n Toolbar,\n ToolbarItem,\n ToolbarSpacer,\n ToolbarTitle,\n} from '@ngstarter-ui/components/toolbar';\nimport { isObservable } from 'rxjs';\nimport type { Subscription } from 'rxjs';\nimport { PdfViewerAnnotations } from '../pdf-viewer-annotations/pdf-viewer-annotations';\nimport { PdfViewerAnnotationDef } from '../pdf-viewer-annotation-def.directive';\nimport { PdfViewerEngineService } from '../pdf-viewer-engine.service';\nimport { PdfViewerSearch } from '../pdf-viewer-search/pdf-viewer-search';\nimport {\n PdfViewerAnnotationDataSource,\n PdfViewerAnnotationDataSourceContext,\n PdfViewerAnnotationDataSourceResult,\n PdfViewerAnnotationView,\n PdfViewerLoadedEvent,\n PdfViewerPageRenderedEvent,\n PdfViewerSearchOptions,\n PdfViewerSearchResultView,\n PdfViewerThumbnailView,\n PdfViewerPageView,\n PdfViewerSelectionRectView,\n PdfViewerServerAnnotationDataSource,\n PdfViewerSource,\n PdfViewerTextGlyphView,\n} from '../types';\n\ninterface PdfViewerPageListItem {\n pageNumber: number;\n thumbnail: PdfViewerThumbnailView | null;\n}\n\ninterface PdfViewerPageSpread {\n id: string;\n leadingPlaceholder: boolean;\n leadingPlaceholderPage: PdfViewerPageView | null;\n pages: PdfViewerPageView[];\n}\n\ntype PdfViewerSpreadMode = 'single' | 'two-odd' | 'two-even';\ntype PdfViewerScrollLayout = 'vertical' | 'horizontal';\ntype PdfViewerZoomMode = 'custom' | 'fit-page' | 'fit-width';\n\ninterface PdfViewerSelectionPoint {\n pageNumber: number;\n x: number;\n y: number;\n offset: number;\n}\n\ninterface PdfViewerTextLineView {\n lineId: number;\n glyphs: PdfViewerTextGlyphView[];\n top: number;\n bottom: number;\n left: number;\n right: number;\n center: number;\n}\n\ninterface PdfViewerZoomAnchor {\n container: HTMLElement;\n pageNumber: number;\n relativeX: number;\n relativeY: number;\n viewportX: number;\n viewportY: number;\n}\n\n@Component({\n selector: 'ngs-pdf-viewer',\n exportAs: 'ngsPdfViewer',\n imports: [\n BlockLoader,\n Button,\n Divider,\n Icon,\n ImagePlaceholder,\n Menu,\n MenuDivider,\n MenuHeading,\n MenuItem,\n MenuTrigger,\n Panel,\n PanelAside,\n PanelContent,\n PanelHeader,\n PanelSidebar,\n Toolbar,\n ToolbarItem,\n ToolbarSpacer,\n ToolbarTitle,\n PdfViewerAnnotations,\n PdfViewerSearch,\n ],\n templateUrl: './pdf-viewer.html',\n styleUrl: './pdf-viewer.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngs-pdf-viewer not-prose',\n '[class.is-loading]': 'isLoading()',\n '[class.has-toolbar]': 'showToolbar()',\n '[class.has-page-list]': 'isPageListVisible()',\n '[class.has-error]': 'errorState()',\n },\n})\nexport class PdfViewer {\n private readonly textSelectionHorizontalPadding = 2;\n private readonly textSelectionLineHeight = 1.2;\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly engineService = inject(PdfViewerEngineService);\n private readonly hostElement = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly viewerBody = viewChild<ElementRef<HTMLElement>>('viewerBody');\n private readonly pageList = viewChild<ElementRef<HTMLElement>>('pageList');\n protected readonly annotationDefs = contentChildren(PdfViewerAnnotationDef, { descendants: true });\n\n src = input<PdfViewerSource>(null);\n documentName = input<string | null>(null);\n wasmUrl = input('/assets/embedpdf/pdfium.wasm');\n page = input(1, { transform: numberAttribute });\n scale = input(1, { transform: numberAttribute });\n minScale = input(0.2, { transform: numberAttribute });\n maxScale = input(60, { transform: numberAttribute });\n zoomStep = input(0.1, { transform: numberAttribute });\n maxRenderPixels = input(128_000_000, { transform: numberAttribute });\n maxRenderDimension = input(13_000, { transform: numberAttribute });\n renderAll = input(true, { transform: booleanAttribute });\n showToolbar = input(true, { transform: booleanAttribute });\n showPageList = input(true, { transform: booleanAttribute });\n showSearchPanel = input(true, { transform: booleanAttribute });\n showAnnotationsPanel = input(false, { transform: booleanAttribute });\n annotations = input<PdfViewerAnnotationView[]>([]);\n annotationsDataSource = input<PdfViewerAnnotationDataSource | null>(null);\n annotationTypeProperty = input('type');\n searchQuery = input('');\n withAnnotations = input(true, { transform: booleanAttribute });\n withForms = input(true, { transform: booleanAttribute });\n\n loaded = output<PdfViewerLoadedEvent>();\n pageChanged = output<number>();\n pageRendered = output<PdfViewerPageRenderedEvent>();\n error = output<unknown>();\n\n protected readonly isLoading = signal(false);\n protected readonly errorState = signal<unknown>(null);\n protected readonly renderedPages = signal<PdfViewerPageView[]>([]);\n protected readonly thumbnailPages = signal<PdfViewerThumbnailView[]>([]);\n protected readonly pageCount = signal(0);\n protected readonly activePage = signal(1);\n protected readonly zoom = signal(1);\n protected readonly pageListVisible = signal(false);\n protected readonly searchPanelVisible = signal(false);\n protected readonly annotationsPanelVisible = signal(false);\n protected readonly asidePanelInteractive = signal(false);\n protected readonly spreadMode = signal<PdfViewerSpreadMode>('single');\n protected readonly scrollLayout = signal<PdfViewerScrollLayout>('vertical');\n protected readonly pageRotation = signal<Rotation>(Rotation.Degree0);\n protected readonly zoomMode = signal<PdfViewerZoomMode>('custom');\n protected readonly annotationItems = signal<PdfViewerAnnotationView[]>([]);\n protected readonly activeSearchQuery = signal('');\n protected readonly pdfSearchResults = signal<PdfViewerSearchResultView[]>([]);\n protected readonly selectionRects = signal<PdfViewerSelectionRectView[]>([]);\n protected readonly hasDocument = computed(() => this.pageCount() > 0);\n protected readonly isPageListVisible = computed(() =>\n this.showPageList() && this.pageListVisible(),\n );\n protected readonly isSearchPanelVisible = computed(() =>\n this.showSearchPanel() && this.searchPanelVisible(),\n );\n protected readonly isAnnotationsPanelVisible = computed(() =>\n this.showAnnotationsPanel() && !this.searchPanelVisible() && this.annotationsPanelVisible(),\n );\n protected readonly thumbnailPageMap = computed(() =>\n new Map(this.thumbnailPages().map((thumbnail) => [thumbnail.pageNumber, thumbnail])),\n );\n protected readonly pageItems = computed<PdfViewerPageListItem[]>(() =>\n Array.from({ length: this.pageCount() }, (_, index) => {\n const pageNumber = index + 1;\n\n return {\n pageNumber,\n thumbnail: this.thumbnailPageMap().get(pageNumber) ?? null,\n };\n }),\n );\n protected readonly canGoPrevious = computed(() => this.activePage() > 1);\n protected readonly canGoNext = computed(() => this.activePage() < this.pageCount());\n protected readonly canZoomOut = computed(() => this.zoom() > this.getScaleBounds().min);\n protected readonly canZoomIn = computed(() => this.zoom() < this.getScaleBounds().max);\n protected readonly zoomLabel = computed(() => `${Math.round(this.zoom() * 100)}%`);\n protected readonly displayDocumentName = computed(() => this.documentName() || this.getSourceName(this.src()));\n protected readonly pageSpreads = computed<PdfViewerPageSpread[]>(() =>\n this.groupPagesIntoSpreads(this.renderedPages(), this.spreadMode()),\n );\n protected readonly zoomPresets = [0.25, 0.5, 1, 1.25, 1.5, 2, 4, 8, 16];\n\n private engine: PdfEngine<Blob> | null = null;\n private pdfDocument: PdfDocumentObject | null = null;\n private registry: { destroy(): Promise<void> | void } | null = null;\n private pageIntersectionObserver: IntersectionObserver | null = null;\n private visiblePageRatios = new Map<number, number>();\n private loadToken = 0;\n private renderToken = 0;\n private searchToken = 0;\n private scrollSyncFrame: number | null = null;\n private programmaticScrollTargetPage: number | null = null;\n private programmaticScrollTimeout: number | null = null;\n private pageObserverFrame: number | null = null;\n private pageObserverTimeout: number | null = null;\n private visiblePageRenderFrame: number | null = null;\n private visiblePageRenderTimeout: number | null = null;\n private pageObserverRefreshAttempts = 0;\n private selectionStart: PdfViewerSelectionPoint | null = null;\n private isViewInitialized = false;\n private annotationDataSourceToken = 0;\n private annotationDataSourceCleanup: (() => void) | null = null;\n private lastZoomChangeTime = 0;\n private readonly programmaticScrollMinDuration = 900;\n private readonly programmaticScrollMaxDuration = 6000;\n private readonly qualityRenderZoomIdleDelay = 160;\n private readonly documentOpenTimeoutMs = 15000;\n\n constructor() {\n afterNextRender(() => {\n if (this.isBrowser) {\n this.asidePanelInteractive.set(true);\n }\n });\n\n this.destroyRef.onDestroy(() => {\n this.loadToken++;\n this.renderToken++;\n this.searchToken++;\n this.annotationDataSourceToken++;\n this.annotationDataSourceCleanup?.();\n this.cancelScrollSyncFrame();\n this.clearProgrammaticScrollLock();\n this.cancelPageObserverFrame();\n this.cancelVisiblePageRenderFrame();\n this.disconnectPageObserver();\n this.revokeRenderedPages();\n this.revokeThumbnailPages();\n void this.closeDocument();\n void this.registry?.destroy();\n });\n\n effect((onCleanup) => {\n const dataSource = this.annotationsDataSource();\n const fallbackAnnotations = this.annotations();\n const source = this.src();\n const documentName = this.documentName() || this.getSourceName(source);\n const pageCount = this.pageCount();\n const token = ++this.annotationDataSourceToken;\n const context: PdfViewerAnnotationDataSourceContext = {\n source,\n documentName,\n pageCount,\n };\n\n this.annotationDataSourceCleanup?.();\n this.annotationDataSourceCleanup = untracked(() =>\n this.loadAnnotationsDataSource(dataSource ?? fallbackAnnotations, context, token),\n );\n\n onCleanup(() => {\n this.annotationDataSourceCleanup?.();\n this.annotationDataSourceCleanup = null;\n });\n });\n\n effect(() => {\n const source = this.src();\n const wasmUrl = this.wasmUrl();\n\n if (!this.isViewInitialized || !this.isBrowser) {\n return;\n }\n\n untracked(() => {\n void this.loadDocument(source, wasmUrl);\n });\n });\n\n effect(() => {\n const scale = this.sanitizeScale(this.scale());\n\n if (untracked(() => this.zoom()) !== scale) {\n untracked(() => this.setZoom(scale));\n }\n });\n\n effect(() => {\n const requestedPage = this.sanitizePage(this.page());\n\n if (requestedPage !== untracked(() => this.activePage())) {\n this.activePage.set(requestedPage);\n }\n });\n\n effect(() => {\n const query = this.searchQuery();\n\n if (query !== untracked(() => this.activeSearchQuery())) {\n this.activeSearchQuery.set(query);\n untracked(() => {\n void this.searchPdf(query, {\n caseSensitive: false,\n wholeWord: false,\n });\n });\n }\n });\n\n effect(() => {\n const zoom = this.zoom();\n const renderAll = this.renderAll();\n const activePage = renderAll ? untracked(() => this.activePage()) : this.activePage();\n const withAnnotations = this.withAnnotations();\n const withForms = this.withForms();\n this.pageRotation();\n this.spreadMode();\n this.scrollLayout();\n\n if (!this.pdfDocument || !this.engine || this.isLoading()) {\n return;\n }\n\n untracked(() => {\n this.applyInstantZoom(zoom);\n this.schedulePageObserverRefresh();\n this.scheduleVisiblePagesRender({ zoom, activePage, renderAll, withAnnotations, withForms });\n });\n });\n\n effect(() => {\n const withAnnotations = this.withAnnotations();\n const isLoading = this.isLoading();\n const pageCount = this.pageCount();\n this.pageRotation();\n\n if (isLoading || pageCount === 0 || !this.pdfDocument || !this.engine) {\n return;\n }\n\n untracked(() => {\n void this.renderThumbnails(this.loadToken, { withAnnotations });\n });\n });\n }\n\n ngAfterViewInit(): void {\n this.isViewInitialized = true;\n\n if (this.isBrowser) {\n void this.loadDocument(this.src(), this.wasmUrl());\n }\n }\n\n previousPage(): void {\n if (!this.canGoPrevious()) {\n return;\n }\n\n this.setPage(this.activePage() - 1);\n }\n\n nextPage(): void {\n if (!this.canGoNext()) {\n return;\n }\n\n this.setPage(this.activePage() + 1);\n }\n\n zoomIn(): void {\n this.zoomMode.set('custom');\n this.setZoom(this.roundZoom(this.zoom() + this.sanitizeZoomStep()));\n }\n\n zoomOut(): void {\n this.zoomMode.set('custom');\n this.setZoom(this.roundZoom(this.zoom() - this.sanitizeZoomStep()));\n }\n\n togglePageList(): void {\n this.pageListVisible.update((isVisible) => !isVisible);\n }\n\n protected toggleSearchPanel(): void {\n const nextVisible = !this.searchPanelVisible();\n this.searchPanelVisible.set(nextVisible);\n\n if (nextVisible) {\n this.annotationsPanelVisible.set(false);\n const query = this.searchQuery();\n this.activeSearchQuery.set(query);\n void this.searchPdf(query, {\n caseSensitive: false,\n wholeWord: false,\n });\n }\n }\n\n protected toggleAnnotationsPanel(): void {\n const nextVisible = !this.annotationsPanelVisible();\n this.annotationsPanelVisible.set(nextVisible);\n\n if (nextVisible) {\n this.searchPanelVisible.set(false);\n }\n }\n\n protected closeAsidePanel(): void {\n this.searchPanelVisible.set(false);\n this.annotationsPanelVisible.set(false);\n }\n\n protected updatePdfSearch(\n event: {\n query: string;\n options: PdfViewerSearchOptions;\n },\n ): Promise<void> {\n this.activeSearchQuery.set(event.query);\n return this.searchPdf(event.query, event.options);\n }\n\n protected selectSearchResult(result: PdfViewerSearchResultView): void {\n this.setPage(result.pageNumber);\n }\n\n protected setZoomPreset(scale: number): void {\n this.zoomMode.set('custom');\n this.setZoom(scale);\n }\n\n protected isZoomPresetSelected(scale: number): boolean {\n return this.zoomMode() === 'custom' && Math.abs(this.zoom() - this.sanitizeScale(scale)) < 0.0001;\n }\n\n protected fitToPage(): void {\n const scale = this.getFitScale('fit-page');\n\n if (scale === null) {\n return;\n }\n\n this.zoomMode.set('fit-page');\n this.setZoom(scale);\n }\n\n protected fitToWidth(): void {\n const scale = this.getFitScale('fit-width');\n\n if (scale === null) {\n return;\n }\n\n this.zoomMode.set('fit-width');\n this.setZoom(scale);\n }\n\n protected setSpreadMode(mode: PdfViewerSpreadMode): void {\n this.spreadMode.set(mode);\n this.refreshLayoutAfterModeChange();\n }\n\n protected setScrollLayout(layout: PdfViewerScrollLayout): void {\n this.scrollLayout.set(layout);\n this.refreshLayoutAfterModeChange();\n }\n\n protected rotateClockwise(): void {\n this.setPageRotation(this.rotatePageBy(1));\n }\n\n protected rotateCounterClockwise(): void {\n this.setPageRotation(this.rotatePageBy(-1));\n }\n\n private groupPagesIntoSpreads(\n pages: PdfViewerPageView[],\n mode: PdfViewerSpreadMode,\n ): PdfViewerPageSpread[] {\n if (mode === 'single') {\n return pages.map((page) => ({\n id: `single-${page.pageNumber}`,\n leadingPlaceholder: false,\n leadingPlaceholderPage: null,\n pages: [page],\n }));\n }\n\n const spreads: PdfViewerPageSpread[] = [];\n let pageIndex = 0;\n\n if (mode === 'two-even' && pages.length > 0) {\n spreads.push({\n id: 'two-even-cover',\n leadingPlaceholder: true,\n leadingPlaceholderPage: pages[0],\n pages: [pages[0]],\n });\n pageIndex = 1;\n }\n\n while (pageIndex < pages.length) {\n const spreadPages = pages.slice(pageIndex, pageIndex + 2);\n spreads.push({\n id: `${mode}-${spreadPages.map((page) => page.pageNumber).join('-')}`,\n leadingPlaceholder: false,\n leadingPlaceholderPage: null,\n pages: spreadPages,\n });\n pageIndex += 2;\n }\n\n return spreads;\n }\n\n private setPageRotation(rotation: Rotation): void {\n this.pageRotation.set(rotation);\n this.applyInstantZoom(this.zoom());\n this.refreshLayoutAfterModeChange();\n }\n\n private rotatePageBy(delta: 1 | -1): Rotation {\n return this.normalizeRotation(this.pageRotation() + delta);\n }\n\n private refreshLayoutAfterModeChange(): void {\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.schedulePageObserverRefresh();\n\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n this.scrollToPage(this.activePage());\n return;\n }\n\n targetWindow.requestAnimationFrame(() => this.scrollToPage(this.activePage()));\n }\n\n protected toggleFullscreen(): void {\n if (!this.isBrowser) {\n return;\n }\n\n const target = this.hostElement.nativeElement;\n const currentFullscreenElement = this.document.fullscreenElement;\n\n if (currentFullscreenElement) {\n void this.document.exitFullscreen?.();\n return;\n }\n\n void target.requestFullscreen?.();\n }\n\n setPage(pageNumber: number): void {\n const nextPage = this.clamp(pageNumber, 1, Math.max(this.pageCount(), 1));\n const hasChanged = nextPage !== this.activePage();\n\n if (!hasChanged) {\n this.scrollToPage(nextPage);\n this.scrollPageListToPage(nextPage);\n return;\n }\n\n this.activePage.set(nextPage);\n this.pageChanged.emit(nextPage);\n this.scrollToPage(nextPage);\n this.scrollPageListToPage(nextPage);\n }\n\n protected onViewerScroll(): void {\n if (!this.renderAll() || !this.isBrowser || this.renderedPages().length < 2) {\n return;\n }\n\n if (this.scrollSyncFrame !== null) {\n return;\n }\n\n this.scrollSyncFrame = this.document.defaultView?.requestAnimationFrame(() => {\n this.scrollSyncFrame = null;\n\n if (this.isProgrammaticScrollActive()) {\n this.completeProgrammaticScrollIfSettled();\n return;\n }\n\n this.syncActivePageFromViewport();\n this.scheduleCurrentVisiblePagesRender();\n }) ?? null;\n }\n\n protected onViewerWheel(event: WheelEvent): void {\n if (!event.metaKey && !event.ctrlKey) {\n return;\n }\n\n if (!this.pdfDocument || this.isLoading()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const container = this.viewerBody()?.nativeElement;\n const anchor = container ? this.getZoomAnchor(container, event) : null;\n const delta = event.deltaY || event.deltaX;\n const direction = delta < 0 ? 1 : -1;\n const multiplier = Math.max(1, Math.min(6, Math.abs(delta) / 100));\n const nextZoom = this.roundZoom(this.zoom() + direction * this.sanitizeZoomStep() * multiplier);\n\n if (nextZoom === this.zoom()) {\n return;\n }\n\n this.zoomMode.set('custom');\n this.setZoom(nextZoom);\n this.restoreZoomAnchor(anchor);\n }\n\n protected selectionRectsForPage(pageNumber: number): PdfViewerSelectionRectView[] {\n return this.selectionRects().filter((rect) => rect.pageNumber === pageNumber);\n }\n\n protected startTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void {\n if (event.button !== 0 || page.textGlyphs.length === 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const surface = event.currentTarget as HTMLElement;\n if ('pointerId' in event) {\n surface.setPointerCapture?.(event.pointerId);\n }\n\n this.selectionStart = this.getSelectionPoint(event, page, surface);\n this.selectionRects.set([]);\n }\n\n protected updateTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void {\n if (!this.selectionStart || this.selectionStart.pageNumber !== page.pageNumber) {\n return;\n }\n\n event.preventDefault();\n const surface = event.currentTarget as HTMLElement;\n const currentPoint = this.getSelectionPoint(event, page, surface);\n\n if (this.selectionStart.offset === currentPoint.offset) {\n this.selectionRects.set([]);\n return;\n }\n\n this.selectionRects.set(this.getSelectionRects(page, this.selectionStart.offset, currentPoint.offset));\n }\n\n protected finishTextSelection(event: PointerEvent | MouseEvent, page: PdfViewerPageView): void {\n if (!this.selectionStart) {\n return;\n }\n\n this.updateTextSelection(event, page);\n this.selectionStart = null;\n\n const surface = event.currentTarget as HTMLElement;\n if ('pointerId' in event) {\n surface.releasePointerCapture?.(event.pointerId);\n }\n }\n\n private loadAnnotationsDataSource(\n dataSource: PdfViewerAnnotationDataSource | null | undefined,\n context: PdfViewerAnnotationDataSourceContext,\n token: number,\n ): () => void {\n if (!dataSource) {\n this.setAnnotationItems([], token);\n return () => {};\n }\n\n try {\n if (Array.isArray(dataSource)) {\n this.setAnnotationItems(dataSource, token);\n return () => {};\n }\n\n if (this.isServerAnnotationDataSource(dataSource)) {\n let isActive = true;\n\n dataSource.getAnnotations({\n ...context,\n successCallback: (annotations) => {\n if (isActive) {\n this.setAnnotationItems(annotations, token);\n }\n },\n failCallback: () => {\n if (isActive) {\n this.setAnnotationItems([], token);\n }\n },\n });\n\n return () => {\n isActive = false;\n };\n }\n\n const result = typeof dataSource === 'function' ? dataSource(context) : dataSource;\n\n return this.applyAnnotationDataSourceResult(result, token);\n } catch {\n this.setAnnotationItems([], token);\n return () => {};\n }\n }\n\n private applyAnnotationDataSourceResult(\n result: PdfViewerAnnotationDataSourceResult,\n token: number,\n ): () => void {\n if (isObservable(result)) {\n const subscription: Subscription = result.subscribe({\n next: (annotations) => this.setAnnotationItems(annotations, token),\n error: () => this.setAnnotationItems([], token),\n });\n\n return () => subscription.unsubscribe();\n }\n\n if (this.isPromiseLike(result)) {\n let isActive = true;\n\n result\n .then((annotations) => {\n if (isActive) {\n this.setAnnotationItems(annotations, token);\n }\n })\n .catch(() => {\n if (isActive) {\n this.setAnnotationItems([], token);\n }\n });\n\n return () => {\n isActive = false;\n };\n }\n\n this.setAnnotationItems(result, token);\n\n return () => {};\n }\n\n private setAnnotationItems(annotations: PdfViewerAnnotationView[], token: number): void {\n if (token === this.annotationDataSourceToken) {\n this.annotationItems.set(annotations ?? []);\n }\n }\n\n private isServerAnnotationDataSource(\n dataSource: PdfViewerAnnotationDataSource,\n ): dataSource is PdfViewerServerAnnotationDataSource {\n return typeof dataSource === 'object'\n && dataSource !== null\n && 'getAnnotations' in dataSource\n && typeof dataSource.getAnnotations === 'function';\n }\n\n private isPromiseLike<T>(value: unknown): value is Promise<T> {\n return typeof value === 'object'\n && value !== null\n && 'then' in value\n && typeof (value as Promise<T>).then === 'function';\n }\n\n protected cancelTextSelection(): void {\n this.selectionStart = null;\n }\n\n private async searchPdf(query: string, options: PdfViewerSearchOptions): Promise<void> {\n const token = ++this.searchToken;\n const keyword = query.trim();\n\n if (!keyword || !this.engine || !this.pdfDocument) {\n this.pdfSearchResults.set([]);\n return;\n }\n\n const flags: MatchFlag[] = [];\n\n if (options.caseSensitive) {\n flags.push(MatchFlag.MatchCase);\n }\n\n if (options.wholeWord) {\n flags.push(MatchFlag.MatchWholeWord);\n }\n\n try {\n const searchResult = await this.engine.searchAllPages(this.pdfDocument, keyword, { flags }).toPromise();\n\n if (token !== this.searchToken) {\n return;\n }\n\n this.pdfSearchResults.set(searchResult.results.map((result, index) => this.toSearchResultView(result, index)));\n } catch (error) {\n if (token === this.searchToken) {\n this.pdfSearchResults.set([]);\n this.error.emit(error);\n }\n }\n }\n\n private toSearchResultView(result: SearchResult, index: number): PdfViewerSearchResultView {\n const context = result.context;\n const excerpt = [\n context.truncatedLeft ? '...' : '',\n context.before,\n context.match,\n context.after,\n context.truncatedRight ? '...' : '',\n ]\n .filter((part) => part.length > 0)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return {\n id: `${result.pageIndex}-${result.charIndex}-${result.charCount}-${index}`,\n pageNumber: result.pageIndex + 1,\n excerpt,\n };\n }\n\n private async loadDocument(source: PdfViewerSource, wasmUrl: string): Promise<void> {\n const token = ++this.loadToken;\n this.renderToken++;\n this.isLoading.set(true);\n this.errorState.set(null);\n this.pageCount.set(0);\n this.searchToken++;\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.pdfSearchResults.set([]);\n this.revokeRenderedPages();\n this.revokeThumbnailPages();\n\n await this.closeDocument();\n await this.registry?.destroy();\n this.registry = null;\n\n if (!source) {\n this.isLoading.set(false);\n return;\n }\n\n try {\n const engine = await this.engineService.getEngine(wasmUrl);\n\n if (token !== this.loadToken) {\n return;\n }\n\n this.engine = engine;\n this.registry = await this.engineService.createRegistry(engine, this.zoom());\n\n if (token !== this.loadToken) {\n return;\n }\n\n const documentId = this.createDocumentId();\n const pdfDocument = await this.openSource(engine, documentId, source);\n\n if (token !== this.loadToken) {\n await engine.closeDocument(pdfDocument).toPromise();\n return;\n }\n\n this.pdfDocument = pdfDocument;\n this.pageCount.set(pdfDocument.pageCount);\n this.activePage.set(this.clamp(this.activePage(), 1, Math.max(pdfDocument.pageCount, 1)));\n this.loaded.emit({ pageCount: pdfDocument.pageCount });\n this.initializePageShells(pdfDocument, this.zoom(), this.renderAll(), this.activePage());\n this.schedulePageObserverRefresh();\n await this.searchPdf(this.activeSearchQuery() || this.searchQuery(), {\n caseSensitive: false,\n wholeWord: false,\n });\n await this.renderVisiblePages(token, ++this.renderToken, {\n zoom: this.zoom(),\n activePage: this.activePage(),\n renderAll: this.renderAll(),\n withAnnotations: this.withAnnotations(),\n withForms: this.withForms(),\n });\n } catch (error) {\n if (token === this.loadToken) {\n this.errorState.set(error);\n this.error.emit(error);\n }\n } finally {\n if (token === this.loadToken) {\n this.isLoading.set(false);\n }\n }\n }\n\n private initializePageShells(\n pdfDocument: PdfDocumentObject,\n scale: number,\n renderAll: boolean,\n activePage: number,\n ): void {\n const previousPages = this.renderedPages();\n const previousPageMap = new Map(previousPages.map((page) => [page.pageNumber, page]));\n const pageNumbers = this.getPageNumbersToDisplay(pdfDocument, renderAll, activePage);\n const nextScale = this.sanitizeScale(scale);\n const nextPages = pageNumbers.map((pageNumber) => {\n const pdfPage = pdfDocument.pages[pageNumber - 1];\n const previousPage = previousPageMap.get(pageNumber);\n const displaySize = this.getPageDisplaySize(pdfPage, nextScale);\n const displayRotation = this.getPageDisplayRotation(pdfPage);\n const isFresh = previousPage?.url\n && Math.abs((previousPage.renderedScale ?? 0) - nextScale) < 0.0001\n && previousPage.renderedRotation === displayRotation;\n\n return {\n pageNumber,\n url: isFresh ? previousPage.url : null,\n scale: nextScale,\n renderedScale: isFresh ? previousPage.renderedScale : null,\n rotation: displayRotation,\n renderedRotation: isFresh ? previousPage.renderedRotation : null,\n width: displaySize.width,\n height: displaySize.height,\n isRendering: false,\n textGlyphs: isFresh ? previousPage.textGlyphs : [],\n };\n });\n const nextUrlSet = new Set(nextPages.map((page) => page.url).filter((url): url is string => !!url));\n\n for (const page of previousPages) {\n if (page.url && !nextUrlSet.has(page.url)) {\n this.revokeObjectUrl(page.url);\n }\n }\n\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.disconnectPageObserver();\n this.renderedPages.set(nextPages);\n }\n\n private getPageNumbersToDisplay(\n pdfDocument: PdfDocumentObject,\n renderAll: boolean,\n activePage: number,\n ): number[] {\n if (!renderAll) {\n return [this.clamp(activePage, 1, pdfDocument.pageCount)];\n }\n\n return Array.from({ length: pdfDocument.pageCount }, (_, index) => index + 1);\n }\n\n private scheduleVisiblePagesRender(\n options: {\n zoom: number;\n activePage: number;\n renderAll: boolean;\n withAnnotations: boolean;\n withForms: boolean;\n },\n ): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.cancelVisiblePageRenderFrame();\n const token = this.loadToken;\n const renderToken = ++this.renderToken;\n const renderDelay = this.getQualityRenderDelay();\n\n if (renderDelay > 0) {\n this.visiblePageRenderTimeout = targetWindow.setTimeout(() => {\n this.visiblePageRenderTimeout = null;\n this.queueVisiblePageRenderFrame(token, renderToken, options);\n }, renderDelay);\n return;\n }\n\n this.queueVisiblePageRenderFrame(token, renderToken, options);\n }\n\n private queueVisiblePageRenderFrame(\n token: number,\n renderToken: number,\n options: {\n zoom: number;\n activePage: number;\n renderAll: boolean;\n withAnnotations: boolean;\n withForms: boolean;\n },\n ): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.visiblePageRenderFrame = targetWindow.requestAnimationFrame(() => {\n this.visiblePageRenderFrame = null;\n void this.renderVisiblePages(token, renderToken, options);\n });\n }\n\n private scheduleCurrentVisiblePagesRender(): void {\n this.scheduleVisiblePagesRender({\n zoom: this.zoom(),\n activePage: this.activePage(),\n renderAll: this.renderAll(),\n withAnnotations: this.withAnnotations(),\n withForms: this.withForms(),\n });\n }\n\n private async renderVisiblePages(\n token: number,\n renderToken: number,\n options: {\n zoom: number;\n activePage: number;\n renderAll: boolean;\n withAnnotations: boolean;\n withForms: boolean;\n },\n ): Promise<void> {\n if (!this.engine || !this.pdfDocument) {\n return;\n }\n\n const pdfDocument = this.pdfDocument;\n const renderScale = this.sanitizeScale(options.zoom);\n const pageNumbers = this.getPriorityPageNumbers(options.activePage, options.renderAll);\n\n for (const pageNumber of pageNumbers) {\n if (!this.isRenderCurrent(token, renderToken)) {\n return;\n }\n\n const currentPage = this.renderedPages().find((page) => page.pageNumber === pageNumber);\n const page = pdfDocument.pages[pageNumber - 1];\n const renderRotation = this.getPageDisplayRotation(page);\n\n if (!currentPage || Math.abs(currentPage.scale - renderScale) > 0.0001) {\n continue;\n }\n\n if (\n currentPage.url\n && Math.abs((currentPage.renderedScale ?? 0) - renderScale) < 0.0001\n && currentPage.renderedRotation === renderRotation\n ) {\n continue;\n }\n\n this.patchRenderedPage(pageNumber, { isRendering: !currentPage.url });\n const rasterOptions = this.getPageRasterRenderOptions(page, renderScale);\n const blob = await this.engine.renderPage(pdfDocument, page, {\n scaleFactor: rasterOptions.scaleFactor,\n rotation: renderRotation,\n dpr: rasterOptions.dpr,\n withAnnotations: options.withAnnotations,\n withForms: options.withForms,\n }).toPromise();\n\n if (!this.isRenderCurrent(token, renderToken)) {\n return;\n }\n\n const displaySize = this.getPageDisplaySize(page, renderScale);\n const textGlyphs = this.pageRotation() === Rotation.Degree0\n ? await this.getPageTextGlyphs(pdfDocument, page, renderScale)\n : [];\n\n if (!this.isRenderCurrent(token, renderToken)) {\n return;\n }\n\n const url = this.document.defaultView?.URL.createObjectURL(blob) ?? URL.createObjectURL(blob);\n const previousUrl = this.renderedPages().find((renderedPage) => renderedPage.pageNumber === pageNumber)?.url;\n\n this.patchRenderedPage(pageNumber, {\n url,\n scale: renderScale,\n renderedScale: renderScale,\n rotation: renderRotation,\n renderedRotation: renderRotation,\n width: displaySize.width,\n height: displaySize.height,\n isRendering: false,\n textGlyphs,\n });\n\n if (previousUrl && previousUrl !== url) {\n this.revokeObjectUrl(previousUrl);\n }\n\n this.pageRendered.emit({ pageNumber, url, width: displaySize.width, height: displaySize.height });\n }\n }\n\n private setZoom(scale: number): void {\n const nextZoom = this.sanitizeScale(scale);\n\n if (this.zoom() !== nextZoom) {\n this.lastZoomChangeTime = this.getCurrentTime();\n this.zoom.set(nextZoom);\n }\n\n this.applyInstantZoom(nextZoom);\n }\n\n private applyInstantZoom(scale: number): void {\n const nextScale = this.sanitizeScale(scale);\n const pdfDocument = this.pdfDocument;\n const pages = this.renderedPages();\n\n if (!pdfDocument || pages.length === 0) {\n return;\n }\n\n let hasChanges = false;\n const urlsToRevoke: string[] = [];\n const nextPages = pages.map((page) => {\n const pdfPage = pdfDocument.pages[page.pageNumber - 1];\n const displaySize = this.getPageDisplaySize(pdfPage, nextScale);\n const displayRotation = this.getPageDisplayRotation(pdfPage);\n const scaleChanged = Math.abs(page.scale - nextScale) >= 0.0001;\n const rotationChanged = page.rotation !== displayRotation || page.renderedRotation !== displayRotation;\n\n if (!scaleChanged && !rotationChanged && page.width === displaySize.width && page.height === displaySize.height) {\n return page;\n }\n\n hasChanges = true;\n\n if (rotationChanged && page.url) {\n urlsToRevoke.push(page.url);\n }\n\n return {\n ...page,\n url: rotationChanged ? null : page.url,\n scale: nextScale,\n renderedScale: rotationChanged ? null : page.renderedScale,\n rotation: displayRotation,\n renderedRotation: rotationChanged ? null : page.renderedRotation,\n width: displaySize.width,\n height: displaySize.height,\n isRendering: false,\n textGlyphs: [],\n };\n });\n\n if (!hasChanges) {\n return;\n }\n\n this.selectionStart = null;\n this.selectionRects.set([]);\n this.renderedPages.set(nextPages);\n for (const url of urlsToRevoke) {\n this.revokeObjectUrl(url);\n }\n this.schedulePageObserverRefresh();\n }\n\n private getPriorityPageNumbers(activePage: number, renderAll: boolean): number[] {\n if (!this.pdfDocument) {\n return [];\n }\n\n const pageCount = this.pdfDocument.pageCount;\n const visiblePageNumbers = renderAll\n ? this.getVisiblePageNumbers()\n : [this.clamp(activePage, 1, pageCount)];\n const priorityPageNumbers = new Set<number>();\n\n for (const pageNumber of visiblePageNumbers.length > 0 ? visiblePageNumbers : [activePage]) {\n for (let candidate = pageNumber - 1; candidate <= pageNumber + 1; candidate++) {\n if (candidate >= 1 && candidate <= pageCount) {\n priorityPageNumbers.add(candidate);\n }\n }\n }\n\n priorityPageNumbers.add(this.clamp(activePage, 1, pageCount));\n\n return [...priorityPageNumbers].sort((a, b) => {\n const activeDistance = Math.abs(a - activePage) - Math.abs(b - activePage);\n\n return activeDistance || a - b;\n });\n }\n\n private getVisiblePageNumbers(): number[] {\n const container = this.viewerBody()?.nativeElement;\n\n if (!container) {\n return [];\n }\n\n const containerRect = container.getBoundingClientRect();\n const verticalPrefetchMargin = containerRect.height;\n const horizontalPrefetchMargin = containerRect.width;\n const pages = Array.from(container.querySelectorAll<HTMLElement>('[data-ngs-pdf-page]'));\n const visiblePageNumbers: number[] = [];\n\n for (const page of pages) {\n const rect = page.getBoundingClientRect();\n const pageNumber = Number(page.dataset['ngsPdfPage']);\n\n if (\n Number.isFinite(pageNumber) &&\n rect.bottom >= containerRect.top - verticalPrefetchMargin &&\n rect.top <= containerRect.bottom + verticalPrefetchMargin &&\n rect.right >= containerRect.left - horizontalPrefetchMargin &&\n rect.left <= containerRect.right + horizontalPrefetchMargin\n ) {\n visiblePageNumbers.push(pageNumber);\n }\n }\n\n return visiblePageNumbers;\n }\n\n private patchRenderedPage(pageNumber: number, patch: Partial<PdfViewerPageView>): void {\n this.renderedPages.update((pages) =>\n pages.map((page) => page.pageNumber === pageNumber ? { ...page, ...patch } : page),\n );\n }\n\n private async renderThumbnails(\n token: number,\n options: {\n withAnnotations: boolean;\n },\n ): Promise<void> {\n if (!this.engine || !this.pdfDocument) {\n return;\n }\n\n const pdfDocument = this.pdfDocument;\n const thumbnailScale = 0.18;\n const nextThumbnails: PdfViewerThumbnailView[] = [];\n const previousThumbnails = this.thumbnailPages();\n\n for (const page of pdfDocument.pages) {\n const blob = await this.engine.renderThumbnail(pdfDocument, page, {\n scaleFactor: thumbnailScale,\n rotation: this.getPageDisplayRotation(page),\n dpr: this.getDevicePixelRatio(),\n withAnnotations: options.withAnnotations,\n }).toPromise();\n\n if (token !== this.loadToken) {\n const staleUrl = this.document.defaultView?.URL.createObjectURL(blob) ?? URL.createObjectURL(blob);\n this.revokeObjectUrl(staleUrl);\n return;\n }\n\n const url = this.document.defaultView?.URL.createObjectURL(blob) ?? URL.createObjectURL(blob);\n const pageNumber = page.index + 1;\n const displaySize = this.getPageDisplaySize(page, thumbnailScale);\n nextThumbnails.push({ pageNumber, url, width: displaySize.width, height: displaySize.height });\n }\n\n if (token !== this.loadToken) {\n for (const thumbnail of nextThumbnails) {\n this.revokeObjectUrl(thumbnail.url);\n }\n return;\n }\n\n this.thumbnailPages.set(nextThumbnails);\n\n for (const thumbnail of previousThumbnails) {\n this.revokeObjectUrl(thumbnail.url);\n }\n }\n\n private async getPageTextGlyphs(\n pdfDocument: PdfDocumentObject,\n page: PdfPageObject,\n scale: number,\n ): Promise<PdfViewerTextGlyphView[]> {\n if (!this.engine) {\n return [];\n }\n\n try {\n const geometry = await this.engine.getPageGeometry(pdfDocument, page).toPromise();\n const displaySize = this.getPageDisplaySize(page, scale);\n const glyphs: PdfViewerTextGlyphView[] = [];\n\n for (const run of geometry.runs) {\n for (const glyph of run.glyphs) {\n if ((glyph.flags & 2) === 2 || glyph.width <= 0 || glyph.height <= 0) {\n continue;\n }\n\n const glyphLeft = glyph.x * scale;\n const glyphTop = glyph.y * scale;\n const glyphWidth = glyph.width * scale;\n const glyphHeight = glyph.height * scale;\n const lineHeight = Math.max(\n glyphHeight,\n (run.fontSize ?? glyph.height) * this.textSelectionLineHeight * scale,\n );\n const lineTop = this.clamp(glyphTop - (lineHeight - glyphHeight) / 2, 0, displaySize.height);\n const lineBottom = this.clamp(lineTop + lineHeight, 0, displaySize.height);\n const left = this.clamp(glyphLeft, 0, displaySize.width);\n const right = this.clamp(glyphLeft + glyphWidth, 0, displaySize.width);\n\n glyphs.push({\n index: glyphs.length,\n left,\n top: this.clamp(glyphTop, 0, displaySize.height),\n width: Math.max(0, right - left),\n height: Math.max(0, glyphHeight),\n lineTop,\n lineHeight: Math.max(0, lineBottom - lineTop),\n lineId: -1,\n });\n }\n }\n\n return this.assignTextGlyphLines(glyphs).map((glyph) => ({\n ...glyph,\n left: this.roundCssPixel(glyph.left),\n top: this.roundCssPixel(glyph.top),\n width: this.roundCssPixel(glyph.width),\n height: this.roundCssPixel(glyph.height),\n lineTop: this.roundCssPixel(glyph.lineTop),\n lineHeight: this.roundCssPixel(glyph.lineHeight),\n }));\n } catch {\n return [];\n }\n }\n\n private assignTextGlyphLines(glyphs: PdfViewerTextGlyphView[]): PdfViewerTextGlyphView[] {\n const lines: PdfViewerTextLineView[] = [];\n\n for (const glyph of [...glyphs].sort((a, b) => a.lineTop - b.lineTop || a.left - b.left)) {\n const glyphBottom = glyph.lineTop + glyph.lineHeight;\n const glyphCenter = glyph.lineTop + glyph.lineHeight / 2;\n let line = lines.find((candidate) =>\n this.rangesOverlap(candidate.top, candidate.bottom, glyph.lineTop, glyphBottom) ||\n Math.abs(candidate.center - glyphCenter) <= Math.max(2, glyph.lineHeight * 0.4),\n );\n\n if (!line) {\n line = {\n lineId: lines.length,\n glyphs: [],\n top: glyph.lineTop,\n bottom: glyphBottom,\n left: glyph.left,\n right: glyph.left + glyph.width,\n center: glyphCenter,\n };\n lines.push(line);\n }\n\n glyph.lineId = line.lineId;\n line.glyphs.push(glyph);\n line.top = Math.min(line.top, glyph.lineTop);\n line.bottom = Math.max(line.bottom, glyphBottom);\n line.left = Math.min(line.left, glyph.left);\n line.right = Math.max(line.right, glyph.left + glyph.width);\n line.center = line.top + (line.bottom - line.top) / 2;\n }\n\n return glyphs;\n }\n\n private getTextLines(glyphs: PdfViewerTextGlyphView[]): PdfViewerTextLineView[] {\n const lines = new Map<number, PdfViewerTextLineView>();\n\n for (const glyph of glyphs) {\n const glyphBottom = glyph.lineTop + glyph.lineHeight;\n const glyphRight = glyph.left + glyph.width;\n const existing = lines.get(glyph.lineId);\n\n if (!existing) {\n lines.set(glyph.lineId, {\n lineId: glyph.lineId,\n glyphs: [glyph],\n top: glyph.lineTop,\n bottom: glyphBottom,\n left: glyph.left,\n right: glyphRight,\n center: glyph.lineTop + glyph.lineHeight / 2,\n });\n continue;\n }\n\n existing.glyphs.push(glyph);\n existing.top = Math.min(existing.top, glyph.lineTop);\n existing.bottom = Math.max(existing.bottom, glyphBottom);\n existing.left = Math.min(existing.left, glyph.left);\n existing.right = Math.max(existing.right, glyphRight);\n existing.center = existing.top + (existing.bottom - existing.top) / 2;\n }\n\n return [...lines.values()]\n .map((line) => ({\n ...line,\n glyphs: [...line.glyphs].sort((a, b) => a.left - b.left || a.index - b.index),\n }))\n .sort((a, b) => a.top - b.top || a.left - b.left);\n }\n\n private rangesOverlap(aStart: number, aEnd: number, bStart: number, bEnd: number): boolean {\n return aStart < bEnd && aEnd > bStart;\n }\n\n private getCaretOffsetAtPoint(page: PdfViewerPageView, point: Pick<PdfViewerSelectionPoint, 'x' | 'y'>): number {\n const lines = this.getTextLines(page.textGlyphs);\n\n if (lines.length === 0) {\n return 0;\n }\n\n const line =\n lines.find((candidate) => point.y >= candidate.top && point.y <= candidate.bottom) ??\n lines.reduce((closest, candidate) =>\n Math.abs(candidate.center - point.y) < Math.abs(closest.center - point.y) ? candidate : closest,\n );\n const glyphs = line.glyphs;\n\n if (glyphs.length === 0) {\n return 0;\n }\n\n for (const glyph of glyphs) {\n if (point.x < glyph.left + glyph.width / 2) {\n return glyph.index;\n }\n }\n\n return glyphs[glyphs.length - 1].index + 1;\n }\n\n private getSelectionPoint(\n event: PointerEvent | MouseEvent,\n page: PdfViewerPageView,\n surface: HTMLElement,\n ): PdfViewerSelectionPoint {\n const rect = surface.getBoundingClientRect();\n const x = this.clamp(event.clientX - rect.left, 0, page.width);\n const y = this.clamp(event.clientY - rect.top, 0, page.height);\n\n return {\n pageNumber: page.pageNumber,\n x,\n y,\n offset: this.getCaretOffsetAtPoint(page, { x, y }),\n };\n }\n\n private getSelectionRects(\n page: PdfViewerPageView,\n startOffset: number,\n endOffset: number,\n ): PdfViewerSelectionRectView[] {\n const rangeStart = Math.min(startOffset, endOffset);\n const rangeEnd = Math.max(startOffset, endOffset);\n const selectedGlyphs = page.textGlyphs.filter((glyph) =>\n glyph.index >= rangeStart && glyph.index < rangeEnd,\n );\n\n return this.getTextLines(selectedGlyphs).map((line) => {\n const left = this.clamp(line.left - this.textSelectionHorizontalPadding, 0, page.width);\n const top = this.clamp(line.top, 0, page.height);\n const right = this.clamp(line.right + this.textSelectionHorizontalPadding, 0, page.width);\n const bottom = this.clamp(line.bottom, 0, page.height);\n\n return {\n text: '',\n pageNumber: page.pageNumber,\n left: this.roundCssPixel(left),\n top: this.roundCssPixel(top),\n width: this.roundCssPixel(Math.max(0, right - left)),\n height: this.roundCssPixel(Math.max(0, bottom - top)),\n };\n });\n }\n\n private async openSource(\n engine: PdfEngine<Blob>,\n documentId: string,\n source: Exclude<PdfViewerSource, null | undefined>,\n ): Promise<PdfDocumentObject> {\n if (typeof source === 'string') {\n const content = await this.fetchPdfSource(source);\n return this.openDocumentBuffer(engine, documentId, content);\n }\n\n if (source instanceof Blob) {\n return this.openDocumentBuffer(engine, documentId, await source.arrayBuffer());\n }\n\n if (source instanceof Uint8Array) {\n const content = new Uint8Array(source).buffer;\n return this.openDocumentBuffer(engine, documentId, content);\n }\n\n return this.openDocumentBuffer(engine, documentId, source);\n }\n\n private async fetchPdfSource(source: string): Promise<ArrayBuffer> {\n const response = await fetch(source);\n\n if (!response.ok) {\n throw new Error(`PDF request failed with status ${response.status}`);\n }\n\n return response.arrayBuffer();\n }\n\n private openDocumentBuffer(\n engine: PdfEngine<Blob>,\n documentId: string,\n content: ArrayBuffer,\n ): Promise<PdfDocumentObject> {\n return this.withTimeout(\n engine.openDocumentBuffer({ id: documentId, content }).toPromise(),\n this.documentOpenTimeoutMs,\n 'PDF document opening timed out',\n );\n }\n\n private withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeoutId = setTimeout(() => reject(new Error(message)), timeoutMs);\n\n promise.then(\n (value) => {\n clearTimeout(timeoutId);\n resolve(value);\n },\n (error: unknown) => {\n clearTimeout(timeoutId);\n reject(error);\n }\n );\n });\n }\n\n private async closeDocument(): Promise<void> {\n if (!this.engine || !this.pdfDocument) {\n this.pdfDocument = null;\n return;\n }\n\n const documentToClose = this.pdfDocument;\n this.pdfDocument = null;\n\n try {\n await this.engine.closeDocument(documentToClose).toPromise();\n } catch {\n // Best-effort cleanup; the viewer should not surface cleanup failures as user-facing load errors.\n }\n }\n\n private revokeRenderedPages(): void {\n this.disconnectPageObserver();\n this.cancelVisiblePageRenderFrame();\n\n for (const page of this.renderedPages()) {\n if (page.url) {\n this.revokeObjectUrl(page.url);\n }\n }\n\n this.renderedPages.set([]);\n }\n\n private revokeThumbnailPages(): void {\n for (const thumbnail of this.thumbnailPages()) {\n this.revokeObjectUrl(thumbnail.url);\n }\n\n this.thumbnailPages.set([]);\n }\n\n private revokeObjectUrl(url: string): void {\n const targetWindow = this.document.defaultView;\n\n if (targetWindow) {\n targetWindow.URL.revokeObjectURL(url);\n return;\n }\n\n URL.revokeObjectURL(url);\n }\n\n private getSourceName(source: PdfViewerSource): string {\n if (typeof File !== 'undefined' && source instanceof File && source.name) {\n return source.name;\n }\n\n if (typeof source !== 'string' || source.trim().length === 0) {\n return 'Document.pdf';\n }\n\n try {\n const url = new URL(source, this.document.baseURI);\n const pathName = url.pathname.split('/').filter(Boolean).pop();\n\n return pathName ? decodeURIComponent(pathName) : 'Document.pdf';\n } catch {\n const pathName = source.split('?')[0]?.split('#')[0]?.split('/').filter(Boolean).pop();\n\n return pathName ? decodeURIComponent(pathName) : 'Document.pdf';\n }\n }\n\n private sanitizePage(pageNumber: number): number {\n return this.clamp(Math.trunc(Number.isFinite(pageNumber) ? pageNumber : 1), 1, Math.max(this.pageCount(), 1));\n }\n\n private sanitizeScale(scale: number): number {\n const bounds = this.getScaleBounds();\n return this.clamp(Number.isFinite(scale) ? scale : 1, bounds.min, bounds.max);\n }\n\n private roundZoom(value: number): number {\n return this.sanitizeScale(Math.round(this.sanitizeScale(value) * 100) / 100);\n }\n\n private floorFitZoom(value: number): number {\n return this.sanitizeScale(Math.floor(this.sanitizeScale(value) * 100) / 100);\n }\n\n private clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n }\n\n private roundCssPixel(value: number): number {\n return Math.round(value * 100) / 100;\n }\n\n private parseCssPixel(value: string): number {\n const parsed = Number.parseFloat(value);\n\n return Number.isFinite(parsed) ? parsed : 0;\n }\n\n private getDevicePixelRatio(): number {\n return this.document.defaultView?.devicePixelRatio || 1;\n }\n\n private getPageRasterRenderOptions(page: PdfPageObject, scale: number): { scaleFactor: number; dpr: number } {\n const devicePixelRatio = Math.max(1, this.getDevicePixelRatio());\n const pageSize = this.getPageBaseSize(page);\n const maxRenderPixels = this.sanitizePositiveNumber(this.maxRenderPixels(), 128_000_000);\n const maxRenderDimension = this.sanitizePositiveNumber(this.maxRenderDimension(), 13_000);\n const targetEffectiveScale = scale * devicePixelRatio;\n const dimensionEffectiveScale = maxRenderDimension / Math.max(pageSize.width, pageSize.height);\n const pixelEffectiveScale = Math.sqrt(maxRenderPixels / (pageSize.width * pageSize.height));\n const effectiveScale = this.clamp(\n Math.min(targetEffectiveScale, dimensionEffectiveScale, pixelEffectiveScale),\n 0.05,\n targetEffectiveScale,\n );\n const dprAtLayoutScale = effectiveScale / scale;\n\n if (dprAtLayoutScale >= 1) {\n return {\n scaleFactor: scale,\n dpr: this.clamp(dprAtLayoutScale, 1, devicePixelRatio),\n };\n }\n\n return {\n scaleFactor: effectiveScale,\n dpr: 1,\n };\n }\n\n private createDocumentId(): string {\n return `ngs-pdf-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n }\n\n private isRenderCurrent(loadToken: number, renderToken: number): boolean {\n return loadToken === this.loadToken && renderToken === this.renderToken;\n }\n\n private cancelScrollSyncFrame(): void {\n if (this.scrollSyncFrame === null) {\n return;\n }\n\n this.document.defaultView?.cancelAnimationFrame(this.scrollSyncFrame);\n this.scrollSyncFrame = null;\n }\n\n private cancelPageObserverFrame(): void {\n if (this.pageObserverTimeout !== null) {\n this.document.defaultView?.clearTimeout(this.pageObserverTimeout);\n this.pageObserverTimeout = null;\n }\n\n if (this.pageObserverFrame === null) {\n return;\n }\n\n this.document.defaultView?.cancelAnimationFrame(this.pageObserverFrame);\n this.pageObserverFrame = null;\n }\n\n private cancelVisiblePageRenderFrame(): void {\n if (this.visiblePageRenderTimeout !== null) {\n this.document.defaultView?.clearTimeout(this.visiblePageRenderTimeout);\n this.visiblePageRenderTimeout = null;\n }\n\n if (this.visiblePageRenderFrame === null) {\n return;\n }\n\n this.document.defaultView?.cancelAnimationFrame(this.visiblePageRenderFrame);\n this.visiblePageRenderFrame = null;\n }\n\n private getCurrentTime(): number {\n return this.document.defaultView?.performance?.now() ?? Date.now();\n }\n\n private getQualityRenderDelay(): number {\n const elapsed = this.getCurrentTime() - this.lastZoomChangeTime;\n\n if (elapsed >= this.qualityRenderZoomIdleDelay) {\n return 0;\n }\n\n return Math.max(0, this.qualityRenderZoomIdleDelay - elapsed);\n }\n\n private getZoomAnchor(container: HTMLElement, event: WheelEvent): PdfViewerZoomAnchor | null {\n if (!Number.isFinite(event.clientX) || !Number.isFinite(event.clientY)) {\n return null;\n }\n\n const targetDocument = container.ownerDocument;\n const targetElement = targetDocument.elementFromPoint(event.clientX, event.clientY);\n const pageElement = targetElement?.closest<HTMLElement>('[data-ngs-pdf-page]');\n\n if (!pageElement || !container.contains(pageElement)) {\n return null;\n }\n\n const containerRect = container.getBoundingClientRect();\n const pageRect = pageElement.getBoundingClientRect();\n const pageNumber = Number(pageElement.dataset['ngsPdfPage']);\n\n if (!Number.isFinite(pageNumber) || pageRect.width <= 0 || pageRect.height <= 0) {\n return null;\n }\n\n return {\n container,\n pageNumber,\n relativeX: this.clamp((event.clientX - pageRect.left) / pageRect.width, 0, 1),\n relativeY: this.clamp((event.clientY - pageRect.top) / pageRect.height, 0, 1),\n viewportX: event.clientX - containerRect.left,\n viewportY: event.clientY - containerRect.top,\n };\n }\n\n private restoreZoomAnchor(anchor: PdfViewerZoomAnchor | null): void {\n if (!anchor) {\n return;\n }\n\n const targetWindow = this.document.defaultView;\n const restore = (): void => {\n const pageElement = anchor.container.querySelector<HTMLElement>(`[data-ngs-pdf-page=\"${anchor.pageNumber}\"]`);\n\n if (!pageElement) {\n return;\n }\n\n const containerRect = anchor.container.getBoundingClientRect();\n const pageRect = pageElement.getBoundingClientRect();\n const targetLeft =\n anchor.container.scrollLeft +\n pageRect.left -\n containerRect.left +\n pageRect.width * anchor.relativeX -\n anchor.viewportX;\n const targetTop =\n anchor.container.scrollTop +\n pageRect.top -\n containerRect.top +\n pageRect.height * anchor.relativeY -\n anchor.viewportY;\n\n anchor.container.scrollLeft = this.clamp(targetLeft, 0, Math.max(0, anchor.container.scrollWidth - anchor.container.clientWidth));\n anchor.container.scrollTop = this.clamp(targetTop, 0, Math.max(0, anchor.container.scrollHeight - anchor.container.clientHeight));\n };\n\n if (!targetWindow) {\n restore();\n return;\n }\n\n targetWindow.requestAnimationFrame(restore);\n }\n\n private disconnectPageObserver(): void {\n this.cancelPageObserverFrame();\n this.pageIntersectionObserver?.disconnect();\n this.pageIntersectionObserver = null;\n this.visiblePageRatios.clear();\n }\n\n private schedulePageObserverRefresh(): void {\n const targetWindow = this.document.defaultView;\n\n if (!this.isBrowser || !targetWindow) {\n return;\n }\n\n this.cancelPageObserverFrame();\n this.pageObserverRefreshAttempts = 0;\n this.scheduleNextPageObserverRefresh();\n }\n\n private scheduleNextPageObserverRefresh(): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.pageObserverTimeout = targetWindow.setTimeout(() => {\n this.pageObserverTimeout = null;\n this.pageObserverFrame = targetWindow.requestAnimationFrame(() => {\n this.pageObserverFrame = null;\n const isReady = this.setupPageIntersectionObserver();\n\n if (!isReady && this.pageObserverRefreshAttempts < 10) {\n this.pageObserverRefreshAttempts++;\n this.scheduleNextPageObserverRefresh();\n return;\n }\n\n this.syncActivePageFromViewport();\n });\n }, 0);\n }\n\n private setupPageIntersectionObserver(): boolean {\n const targetWindow = this.document.defaultView;\n const container = this.viewerBody()?.nativeElement;\n\n if (!targetWindow || !container || !('IntersectionObserver' in targetWindow)) {\n return false;\n }\n\n const pages = Array.from(container.querySelectorAll<HTMLElement>('[data-ngs-pdf-page]'));\n\n if (pages.length === 0) {\n return false;\n }\n\n this.pageIntersectionObserver?.disconnect();\n this.visiblePageRatios.clear();\n this.pageIntersectionObserver = new targetWindow.IntersectionObserver((entries) => {\n if (this.isProgrammaticScrollActive()) {\n this.scheduleCurrentVisiblePagesRender();\n return;\n }\n\n for (const entry of entries) {\n const pageNumber = Number(entry.target.getAttribute('data-ngs-pdf-page'));\n\n if (!Number.isFinite(pageNumber)) {\n continue;\n }\n\n this.visiblePageRatios.set(pageNumber, entry.intersectionRatio);\n }\n\n this.syncActivePageFromIntersections();\n this.scheduleCurrentVisiblePagesRender();\n }, {\n root: container,\n threshold: [0, 0.1, 0.25, 0.5, 0.75, 1],\n });\n\n for (const page of pages) {\n this.pageIntersectionObserver.observe(page);\n }\n\n return true;\n }\n\n private getFitScale(mode: Extract<PdfViewerZoomMode, 'fit-page' | 'fit-width'>): number | null {\n const container = this.viewerBody()?.nativeElement;\n const page = this.pdfDocument?.pages[this.clamp(this.activePage(), 1, Math.max(this.pageCount(), 1)) - 1];\n\n if (!container || !page) {\n return null;\n }\n\n const pageSize = this.getPageBaseSize(page);\n const pagesElement = container.querySelector<HTMLElement>('.pdf-viewer-pages');\n const computedStyle = pagesElement && this.document.defaultView\n ? this.document.defaultView.getComputedStyle(pagesElement)\n : null;\n const horizontalPadding = computedStyle\n ? this.parseCssPixel(computedStyle.paddingLeft) + this.parseCssPixel(computedStyle.paddingRight)\n : 0;\n const verticalPadding = computedStyle\n ? this.parseCssPixel(computedStyle.paddingTop) + this.parseCssPixel(computedStyle.paddingBottom)\n : 0;\n const fitAllowance = 1;\n const availableWidth = Math.max(1, container.clientWidth - horizontalPadding - fitAllowance);\n const availableHeight = Math.max(1, container.clientHeight - verticalPadding - fitAllowance);\n const widthScale = availableWidth / pageSize.width;\n\n if (mode === 'fit-width') {\n return this.floorFitZoom(widthScale);\n }\n\n return this.floorFitZoom(Math.min(widthScale, availableHeight / pageSize.height));\n }\n\n private getScaleBounds(): { min: number; max: number } {\n const min = this.sanitizePositiveNumber(this.minScale(), 0.2);\n const max = this.sanitizePositiveNumber(this.maxScale(), 60);\n\n return min <= max ? { min, max } : { min: max, max: min };\n }\n\n private sanitizeZoomStep(): number {\n return this.sanitizePositiveNumber(this.zoomStep(), 0.1);\n }\n\n private sanitizePositiveNumber(value: number, fallback: number): number {\n return Number.isFinite(value) && value > 0 ? value : fallback;\n }\n\n private getPageDisplaySize(page: PdfPageObject, scale: number): { width: number; height: number } {\n const pageSize = this.getPageBaseSize(page);\n\n return {\n width: Math.max(1, Math.round(pageSize.width * scale)),\n height: Math.max(1, Math.round(pageSize.height * scale)),\n };\n }\n\n private getPageBaseSize(page: PdfPageObject): { width: number; height: number } {\n const rotation = this.getPageDisplayRotation(page);\n const isRotatedSideways = rotation === Rotation.Degree90 || rotation === Rotation.Degree270;\n const width = isRotatedSideways ? page.size.height : page.size.width;\n const height = isRotatedSideways ? page.size.width : page.size.height;\n\n return {\n width: Math.max(1, width),\n height: Math.max(1, height),\n };\n }\n\n private getPageDisplayRotation(page: PdfPageObject): Rotation {\n return this.normalizeRotation(page.rotation + this.pageRotation());\n }\n\n private normalizeRotation(rotation: number): Rotation {\n return (((rotation % 4) + 4) % 4) as Rotation;\n }\n\n private scrollToPage(pageNumber: number): void {\n if (!this.renderAll()) {\n return;\n }\n\n const container = this.viewerBody()?.nativeElement;\n const target = container?.querySelector<HTMLElement>(`[data-ngs-pdf-page=\"${pageNumber}\"]`);\n\n if (!container || !target) {\n return;\n }\n\n const nextScrollTop = this.getPageScrollTop(container, target);\n const nextScrollLeft = this.getPageScrollLeft(container, target);\n const scrollDistance = Math.hypot(\n container.scrollTop - nextScrollTop,\n container.scrollLeft - nextScrollLeft,\n );\n\n this.startProgrammaticScrollLock(pageNumber, scrollDistance);\n container.scrollTo({\n top: nextScrollTop,\n left: nextScrollLeft,\n behavior: 'smooth',\n });\n }\n\n private syncActivePageFromViewport(): void {\n const pageNumber = this.findActivePageInViewport();\n\n this.activatePageFromScroll(pageNumber);\n }\n\n private syncActivePageFromIntersections(): void {\n let activePage: number | null = null;\n let activeRatio = 0;\n\n for (const [pageNumber, ratio] of this.visiblePageRatios) {\n if (ratio > activeRatio) {\n activeRatio = ratio;\n activePage = pageNumber;\n }\n }\n\n if (!activePage) {\n activePage = this.findActivePageInViewport();\n }\n\n this.activatePageFromScroll(activePage);\n }\n\n private activatePageFromScroll(pageNumber: number | null): void {\n if (this.isProgrammaticScrollActive()) {\n return;\n }\n\n if (!pageNumber || pageNumber === this.activePage()) {\n return;\n }\n\n this.activePage.set(pageNumber);\n this.pageChanged.emit(pageNumber);\n this.scrollPageListToPage(pageNumber);\n this.scheduleCurrentVisiblePagesRender();\n }\n\n private findActivePageInViewport(): number | null {\n const container = this.viewerBody()?.nativeElement;\n\n if (!container) {\n return null;\n }\n\n const containerRect = container.getBoundingClientRect();\n const viewportCenterX = containerRect.left + containerRect.width / 2;\n const viewportCenterY = containerRect.top + containerRect.height / 2;\n const pages = Array.from(container.querySelectorAll<HTMLElement>('[data-ngs-pdf-page]'));\n\n let closestPage: number | null = null;\n let closestDistance = Number.POSITIVE_INFINITY;\n let mostVisiblePage: number | null = null;\n let mostVisibleArea = 0;\n\n for (const page of pages) {\n const rect = page.getBoundingClientRect();\n const pageNumber = Number(page.dataset['ngsPdfPage']);\n\n if (!Number.isFinite(pageNumber)) {\n continue;\n }\n\n if (\n rect.left <= viewportCenterX &&\n rect.right >= viewportCenterX &&\n rect.top <= viewportCenterY &&\n rect.bottom >= viewportCenterY\n ) {\n return pageNumber;\n }\n\n const visibleWidth = Math.max(0, Math.min(rect.right, containerRect.right) - Math.max(rect.left, containerRect.left));\n const visibleHeight = Math.max(0, Math.min(rect.bottom, containerRect.bottom) - Math.max(rect.top, containerRect.top));\n const visibleArea = visibleWidth * visibleHeight;\n\n if (visibleArea > mostVisibleArea) {\n mostVisibleArea = visibleArea;\n mostVisiblePage = pageNumber;\n }\n\n const pageCenterX = rect.left + rect.width / 2;\n const pageCenterY = rect.top + rect.height / 2;\n const distance = Math.hypot(pageCenterX - viewportCenterX, pageCenterY - viewportCenterY);\n\n if (distance < closestDistance) {\n closestDistance = distance;\n closestPage = pageNumber;\n }\n }\n\n return mostVisiblePage ?? closestPage;\n }\n\n private scrollPageListToPage(pageNumber: number): void {\n const container = this.pageList()?.nativeElement;\n const target = container?.querySelector<HTMLElement>(`[data-ngs-pdf-page-button=\"${pageNumber}\"]`);\n\n if (!container || !target) {\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n const isAbove = targetRect.top < containerRect.top;\n const isBelow = targetRect.bottom > containerRect.bottom;\n\n if (!isAbove && !isBelow) {\n return;\n }\n\n container.scrollTo({\n top: this.getElementScrollTop(container, target, 'center'),\n behavior: 'smooth',\n });\n }\n\n private getPageScrollTop(container: HTMLElement, target: HTMLElement): number {\n return this.getElementScrollTop(container, target, 'start');\n }\n\n private getPageScrollLeft(container: HTMLElement, target: HTMLElement): number {\n const containerRect = container.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n const targetLeft = container.scrollLeft + targetRect.left - containerRect.left;\n\n return this.clamp(targetLeft, 0, Math.max(0, container.scrollWidth - container.clientWidth));\n }\n\n private getElementScrollTop(container: HTMLElement, target: HTMLElement, align: 'start' | 'center'): number {\n const containerRect = container.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n const targetTop = container.scrollTop + targetRect.top - containerRect.top;\n const alignedTop = align === 'center'\n ? targetTop - container.clientHeight / 2 + targetRect.height / 2\n : targetTop;\n\n return this.clamp(alignedTop, 0, Math.max(0, container.scrollHeight - container.clientHeight));\n }\n\n private getProgrammaticScrollTimeout(distance: number): number {\n return this.clamp(\n this.programmaticScrollMinDuration + distance * 0.45,\n this.programmaticScrollMinDuration,\n this.programmaticScrollMaxDuration,\n );\n }\n\n private startProgrammaticScrollLock(pageNumber: number, distance: number): void {\n const targetWindow = this.document.defaultView;\n\n if (!targetWindow) {\n return;\n }\n\n this.clearProgrammaticScrollLock();\n this.programmaticScrollTargetPage = pageNumber;\n this.programmaticScrollTimeout = targetWindow.setTimeout(() => {\n this.programmaticScrollTimeout = null;\n this.completeProgrammaticScroll();\n }, this.getProgrammaticScrollTimeout(distance));\n }\n\n private isProgrammaticScrollActive(): boolean {\n return this.programmaticScrollTargetPage !== null;\n }\n\n private completeProgrammaticScrollIfSettled(): void {\n const pageNumber = this.programmaticScrollTargetPage;\n\n if (pageNumber === null) {\n return;\n }\n\n const container = this.viewerBody()?.nativeElement;\n const target = container?.querySelector<HTMLElement>(`[data-ngs-pdf-page=\"${pageNumber}\"]`);\n\n if (!container || !target) {\n this.completeProgrammaticScroll();\n return;\n }\n\n if (\n Math.abs(container.scrollTop - this.getPageScrollTop(container, target)) <= 2 &&\n Math.abs(container.scrollLeft - this.getPageScrollLeft(container, target)) <= 2\n ) {\n this.completeProgrammaticScroll();\n }\n }\n\n private completeProgrammaticScroll(): void {\n const pageNumber = this.programmaticScrollTargetPage;\n\n this.clearProgrammaticScrollLock();\n\n if (pageNumber === null) {\n return;\n }\n\n if (pageNumber !== this.activePage()) {\n this.activePage.set(pageNumber);\n this.pageChanged.emit(pageNumber);\n }\n\n this.scrollPageListToPage(pageNumber);\n }\n\n private clearProgrammaticScrollLock(): void {\n if (this.programmaticScrollTimeout !== null) {\n this.document.defaultView?.clearTimeout(this.programmaticScrollTimeout);\n this.programmaticScrollTimeout = null;\n }\n\n this.programmaticScrollTargetPage = null;\n }\n}\n","<ngs-panel class=\"pdf-viewer-panel h-full overflow-hidden rounded-lg border border-border bg-surface-container-low text-on-surface\">\n @if (showToolbar()) {\n <ngs-panel-header class=\"min-w-0 border-b border-border bg-surface\" flex>\n <ngs-toolbar class=\"pdf-viewer-toolbar flex h-14 w-full min-w-0 items-center gap-4 overflow-visible px-2 text-on-surface-variant\" aria-label=\"PDF viewer controls\">\n <ngs-toolbar-item class=\"pdf-viewer-toolbar__start flex min-w-0 flex-none items-center gap-2\">\n @if (showPageList()) {\n <button\n class=\"pdf-viewer-toolbar__button size-10 text-on-surface-variant hover:bg-surface-container-low hover:text-on-surface\"\n ngsIconButton\n type=\"button\"\n [attr.aria-label]=\"pageListVisible() ? 'Hide pages panel' : 'Show pages panel'\"\n [attr.aria-pressed]=\"pageListVisible()\"\n (click)=\"togglePageList()\">\n <ngs-icon\n class=\"text-2xl\"\n [name]=\"pageListVisible() ? 'fluent:panel-left-contract-24-regular' : 'fluent:panel-left-expand-24-regular'\" />\n </button>\n }\n <ngs-divider vertical fixedHeight />\n </ngs-toolbar-item>\n <ngs-toolbar-title class=\"min-w-0 flex-1 truncate text-sm! max-w-[20%] font-semibold! text-on-surface-variant\" [title]=\"displayDocumentName()\">\n {{ displayDocumentName() }}\n </ngs-toolbar-title>\n\n <ngs-toolbar-item class=\"pdf-viewer-toolbar__center flex flex-none items-center gap-3\">\n <div class=\"pdf-viewer-toolbar__cluster flex min-w-0 items-center gap-2\" aria-label=\"Zoom controls\">\n <button\n class=\"pdf-viewer-toolbar__button size-10 text-on-surface-variant hover:bg-surface-container-low hover:text-on-surface\"\n ngsIconButton\n type=\"button\"\n aria-label=\"Zoom out\"\n [disabled]=\"!canZoomOut()\"\n (click)=\"zoomOut()\">\n <ngs-icon class=\"text-2xl\" name=\"fluent:zoom-out-24-regular\" />\n </button>\n <button\n class=\"pdf-viewer-toolbar__zoom min-w-12 cursor-pointer border-0 bg-transparent p-0 text-center text-sm text-on-surface hover:text-primary\"\n type=\"button\"\n aria-label=\"Zoom presets\"\n [ngsMenuTriggerFor]=\"zoomMenu\">\n {{ zoomLabel() }}\n </button>\n <button\n class=\"pdf-viewer-toolbar__button size-10 text-on-surface-variant hover:bg-surface-container-low hover:text-on-surface\"\n ngsIconButton\n type=\"button\"\n aria-label=\"Zoom in\"\n [disabled]=\"!canZoomIn()\"\n (click)=\"zoomIn()\">\n <ngs-icon class=\"text-2xl\" name=\"fluent:zoom-in-24-regular\" />\n </button>\n </div>\n\n <ngs-divider vertical fixedHeight />\n\n <div class=\"pdf-viewer-toolbar__cluster flex min-w-0 items-center gap-2\" aria-label=\"Page navigation\">\n <button\n class=\"pdf-viewer-toolbar__button size-10 text-on-surface-variant hover:bg-surface-container-low hover:text-on-surface\"\n ngsIconButton\n type=\"button\"\n aria-label=\"Previous page\"\n [disabled]=\"!canGoPrevious()\"\n (click)=\"previousPage()\">\n <ngs-icon class=\"text-2xl\" name=\"fluent:chevron-left-24-regular\" />\n </button>\n <span class=\"pdf-viewer-toolbar__page inline-flex h-9 min-w-16 items-center justify-center gap-2 rounded bg-surface-container-low text-sm font-bold text-on-surface\">\n <span>{{ activePage() }}</span>\n <span>/</span>\n <span>{{ pageCount() || 1 }}</span>\n </span>\n <button\n class=\"pdf-viewer-toolbar__button size-10 text-on-surface-variant hover:bg-surface-container-low hover:text-on-surface\"\n ngsIconButton\n type=\"button\"\n aria-label=\"Next page\"\n [disabled]=\"!canGoNext()\"\n (click)=\"nextPage()\">\n <ngs-icon class=\"text-2xl\" name=\"fluent:chevron-right-24-regular\" />\n </button>\n </div>\n </ngs-toolbar-item>\n\n <ngs-toolbar-spacer />\n\n <ngs-toolbar-item class=\"pdf-viewer-toolbar__end flex min-w-0 flex-1 items-center justify-end gap-2\" aria-label=\"PDF tools\">\n @if (showSearchPanel()) {\n <button\n class=\"pdf-viewer-toolbar__button size-10 text-on-surface-variant hover:bg-surface-container-low hover:text-on-surface\"\n ngsIconButton\n type=\"button\"\n [attr.aria-pressed]=\"isSearchPanelVisible()\"\n aria-label=\"Search\"\n [disabled]=\"!asidePanelInteractive()\"\n (click)=\"toggleSearchPanel()\">\n <ngs-icon class=\"text-2xl\" name=\"fluent:search-24-regular\" />\n </button>\n }\n <button\n class=\"pdf-viewer-toolbar__button size-10 text-on-surface-variant hover:bg-surface-container-low hover:text-on-surface\"\n ngsIconButton\n type=\"button\"\n aria-label=\"PDF viewer settings\"\n [ngsMenuTriggerFor]=\"settingsMenu\">\n <ngs-icon class=\"text-2xl\" name=\"fluent:settings-24-regular\" />\n </button>\n @if (showAnnotationsPanel()) {\n <button\n class=\"pdf-viewer-toolbar__button size-10 text-on-surface-variant hover:bg-surface-container-low hover:text-on-surface\"\n ngsIconButton\n type=\"button\"\n [attr.aria-pressed]=\"isAnnotationsPanelVisible()\"\n aria-label=\"Toggle annotations panel\"\n [disabled]=\"!asidePanelInteractive()\"\n (click)=\"toggleAnnotationsPanel()\">\n <ngs-icon class=\"text-2xl\" name=\"fluent:text-bullet-list-square-edit-24-regular\" />\n </button>\n }\n </ngs-toolbar-item>\n </ngs-toolbar>\n\n <ngs-menu #zoomMenu=\"ngsMenu\">\n @for (zoomPreset of zoomPresets; track zoomPreset) {\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"isZoomPresetSelected(zoomPreset)\"\n (click)=\"setZoomPreset(zoomPreset)\">\n <span>{{ zoomPreset * 100 }}%</span>\n </button>\n }\n\n <ngs-menu-divider />\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"zoomMode() === 'fit-page'\"\n (click)=\"fitToPage()\">\n <ngs-icon name=\"fluent:resize-large-24-regular\" />\n <span>Fit to Page</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"zoomMode() === 'fit-width'\"\n (click)=\"fitToWidth()\">\n <ngs-icon name=\"fluent:resize-24-regular\" />\n <span>Fit to Width</span>\n </button>\n </ngs-menu>\n\n <ngs-menu #settingsMenu=\"ngsMenu\" xPosition=\"before\">\n <ngs-menu-heading>SPREAD MODE</ngs-menu-heading>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"spreadMode() === 'single'\"\n (click)=\"setSpreadMode('single')\">\n <ngs-icon name=\"fluent:document-24-regular\" />\n <span>Single Page</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"spreadMode() === 'two-odd'\"\n (click)=\"setSpreadMode('two-odd')\">\n <ngs-icon name=\"fluent:book-open-24-regular\" />\n <span>Two Page (Odd)</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"spreadMode() === 'two-even'\"\n (click)=\"setSpreadMode('two-even')\">\n <ngs-icon name=\"fluent:document-text-24-regular\" />\n <span>Two Page (Even)</span>\n </button>\n\n <ngs-menu-divider />\n <ngs-menu-heading>SCROLL LAYOUT</ngs-menu-heading>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"scrollLayout() === 'vertical'\"\n (click)=\"setScrollLayout('vertical')\">\n <ngs-icon name=\"fluent:arrow-sort-24-regular\" />\n <span>Vertical</span>\n </button>\n <button\n ngs-menu-item\n type=\"button\"\n [selected]=\"scrollLayout() === 'horizontal'\"\n (click)=\"setScrollLayout('horizontal')\">\n <ngs-icon name=\"fluent:arrow-swap-24-regular\" />\n <span>Horizontal</span>\n </button>\n\n <ngs-menu-divider />\n <ngs-menu-heading>PAGE ROTATION</ngs-menu-heading>\n <button ngs-menu-item type=\"button\" (click)=\"rotateClockwise()\">\n <ngs-icon name=\"fluent:arrow-clockwise-24-regular\" />\n <span>Rotate Clockwise</span>\n </button>\n <button ngs-menu-item type=\"button\" (click)=\"rotateCounterClockwise()\">\n <ngs-icon name=\"fluent:arrow-counterclockwise-24-regular\" />\n <span>Rotate Counter-Clockwise</span>\n </button>\n\n <ngs-menu-divider />\n <button ngs-menu-item type=\"button\" (click)=\"toggleFullscreen()\">\n <ngs-icon name=\"fluent:arrow-maximize-24-regular\" />\n <span>Fullscreen</span>\n </button>\n </ngs-menu>\n </ngs-panel-header>\n }\n\n @if (isPageListVisible()) {\n <ngs-panel-sidebar class=\"w-[var(--ngs-pdf-viewer-sidebar-width)] min-w-[var(--ngs-pdf-viewer-sidebar-width)] border-r border-border bg-surface\">\n <div class=\"pdf-viewer-sidebar flex h-full min-h-0 flex-col gap-2 overflow-auto p-3\" #pageList>\n <div class=\"pdf-viewer-sidebar__title px-1 text-xs font-semibold text-on-surface-variant\">Pages</div>\n <div class=\"pdf-viewer-sidebar__pages flex min-h-0 flex-col gap-2\" aria-label=\"PDF pages\">\n @for (pageItem of pageItems(); track pageItem.pageNumber) {\n <button\n class=\"pdf-viewer-sidebar__page group flex w-full cursor-pointer flex-col items-stretch gap-1 rounded border border-transparent bg-transparent p-1 text-left text-on-surface-variant focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary [&.is-active]:text-on-surface\"\n type=\"button\"\n [class.is-active]=\"pageItem.pageNumber === activePage()\"\n [attr.aria-current]=\"pageItem.pageNumber === activePage() ? 'page' : null\"\n [attr.aria-label]=\"'Open page ' + pageItem.pageNumber\"\n [attr.data-ngs-pdf-page-button]=\"pageItem.pageNumber\"\n (click)=\"setPage(pageItem.pageNumber)\">\n <span class=\"pdf-viewer-sidebar__thumb flex aspect-[3/4] w-full items-center justify-center overflow-hidden rounded border border-border bg-surface shadow-xs group-hover:border-border\" aria-hidden=\"true\">\n @if (pageItem.thumbnail; as thumbnail) {\n <img\n class=\"block h-full w-full select-none object-contain\"\n [src]=\"thumbnail.url\"\n [attr.width]=\"thumbnail.width\"\n [attr.height]=\"thumbnail.height\"\n alt=\"\"\n draggable=\"false\" />\n } @else {\n <ngs-image-placeholder class=\"h-full w-full\" />\n }\n </span>\n <span class=\"pdf-viewer-sidebar__label block truncate text-center text-xs font-medium leading-tight\">Page {{ pageItem.pageNumber }}</span>\n </button>\n }\n </div>\n </div>\n </ngs-panel-sidebar>\n }\n\n <ngs-panel-content class=\"min-h-0 min-w-0 overflow-hidden bg-surface-container-low\">\n <div class=\"pdf-viewer-body absolute inset-0 overflow-auto\" #viewerBody (scroll)=\"onViewerScroll()\" (wheel)=\"onViewerWheel($event)\">\n <ngs-block-loader [loading]=\"isLoading()\">Loading PDF...</ngs-block-loader>\n @if (errorState()) {\n <div class=\"pdf-viewer-state pdf-viewer-state--error absolute inset-0 flex flex-col items-center justify-center gap-3 p-6 text-center text-danger\">\n <ngs-icon class=\"text-3xl\" name=\"fluent:error-circle-24-regular\" />\n <span>PDF could not be loaded.</span>\n </div>\n } @else if (!src()) {\n <div class=\"pdf-viewer-state absolute inset-0 flex flex-col items-center justify-center gap-3 p-6 text-center text-on-surface-variant\">\n <ngs-icon class=\"text-3xl\" name=\"fluent:document-pdf-24-regular\" />\n <span>No PDF selected.</span>\n </div>\n } @else {\n <div\n class=\"pdf-viewer-pages\"\n [class.is-horizontal]=\"scrollLayout() === 'horizontal'\"\n [class.is-vertical]=\"scrollLayout() === 'vertical'\"\n [class.is-spread]=\"spreadMode() !== 'single'\">\n @for (spread of pageSpreads(); track spread.id) {\n <div class=\"pdf-viewer-spread\" [attr.data-ngs-pdf-spread]=\"spread.id\">\n @if (spread.leadingPlaceholder) {\n @if (spread.leadingPlaceholderPage; as placeholderPage) {\n <div\n class=\"pdf-viewer-spread__placeholder\"\n [style.width.px]=\"placeholderPage.width\"\n [style.height.px]=\"placeholderPage.height\"\n aria-hidden=\"true\"></div>\n }\n }\n @for (pdfPage of spread.pages; track pdfPage.pageNumber) {\n <article\n class=\"pdf-viewer-page w-max max-w-none\"\n [attr.aria-label]=\"'PDF page ' + pdfPage.pageNumber\"\n [attr.data-ngs-pdf-page]=\"pdfPage.pageNumber\">\n <div\n class=\"pdf-viewer-page__surface relative cursor-text overflow-hidden rounded bg-surface shadow-md select-none touch-none\"\n [style.width.px]=\"pdfPage.width\"\n [style.height.px]=\"pdfPage.height\"\n (pointerdown)=\"startTextSelection($event, pdfPage)\"\n (pointermove)=\"updateTextSelection($event, pdfPage)\"\n (pointerup)=\"finishTextSelection($event, pdfPage)\"\n (pointercancel)=\"cancelTextSelection()\"\n (mousedown)=\"startTextSelection($event, pdfPage)\"\n (mousemove)=\"updateTextSelection($event, pdfPage)\"\n (mouseup)=\"finishTextSelection($event, pdfPage)\">\n @if (pdfPage.url; as pageUrl) {\n <img\n class=\"block h-full w-full max-w-none select-none pointer-events-none\"\n [src]=\"pageUrl\"\n [alt]=\"'PDF page ' + pdfPage.pageNumber\"\n [attr.width]=\"pdfPage.width\"\n [attr.height]=\"pdfPage.height\"\n draggable=\"false\" />\n } @else {\n <div class=\"pdf-viewer-page__placeholder pointer-events-none absolute inset-0 flex items-center justify-center bg-surface\" aria-hidden=\"true\">\n @if (pdfPage.isRendering) {\n <span class=\"size-8 animate-spin rounded-full border-2 border-border border-t-primary\"></span>\n }\n </div>\n }\n @if (selectionRectsForPage(pdfPage.pageNumber); as selectionRects) {\n @if (selectionRects.length > 0) {\n <div class=\"pdf-viewer-page__selection-layer pointer-events-none absolute inset-0 z-[1] isolate overflow-hidden mix-blend-multiply\" aria-hidden=\"true\">\n @for (selectionRect of selectionRects; track selectionRect.left + '-' + selectionRect.top + '-' + $index) {\n <div\n class=\"pdf-viewer-page__selection-rect pointer-events-none absolute bg-primary/30\"\n [style.left.px]=\"selectionRect.left\"\n [style.top.px]=\"selectionRect.top\"\n [style.width.px]=\"selectionRect.width\"\n [style.height.px]=\"selectionRect.height\"></div>\n }\n </div>\n }\n }\n </div>\n </article>\n }\n </div>\n }\n </div>\n }\n </div>\n </ngs-panel-content>\n\n @if (isSearchPanelVisible() || isAnnotationsPanelVisible()) {\n <ngs-panel-aside class=\"w-[var(--ngs-pdf-viewer-aside-width)] min-w-[var(--ngs-pdf-viewer-aside-width)] border-l border-border bg-surface\">\n @if (isSearchPanelVisible()) {\n <ngs-pdf-viewer-search\n [query]=\"activeSearchQuery()\"\n [results]=\"pdfSearchResults()\"\n (closed)=\"closeAsidePanel()\"\n (searchChanged)=\"updatePdfSearch($event)\"\n (resultSelected)=\"selectSearchResult($event)\" />\n } @else {\n <ngs-pdf-viewer-annotations\n [annotations]=\"annotationItems()\"\n [annotationDefs]=\"annotationDefs()\"\n [annotationTypeProperty]=\"annotationTypeProperty()\"\n (closed)=\"closeAsidePanel()\"\n (pageSelected)=\"setPage($event)\" />\n }\n </ngs-panel-aside>\n }\n</ngs-panel>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgsInput"],"mappings":"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"}