@ngstarter-ui/components 21.0.31 → 21.0.33

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.
@@ -0,0 +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,19 +1,19 @@
1
1
  import { FocusMonitor } from '@angular/cdk/a11y';
2
2
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
3
3
  import * as i0 from '@angular/core';
4
- import { Injectable, Pipe, inject, DestroyRef, ChangeDetectorRef, ElementRef, viewChild, signal, output, input, booleanAttribute, computed, effect, Input as Input$1, Optional, Self, Component } from '@angular/core';
4
+ import { Injectable, inject, DestroyRef, ChangeDetectorRef, ElementRef, viewChild, signal, output, computed, input, booleanAttribute, effect, Input as Input$1, Optional, Self, Component, Pipe } from '@angular/core';
5
5
  import * as i1 from '@angular/forms';
6
6
  import { NgForm, ReactiveFormsModule, FormsModule, NG_VALIDATORS } from '@angular/forms';
7
7
  import * as i2 from '@ngstarter-ui/components/core';
8
8
  import { ErrorStateMatcher, Ripple } from '@ngstarter-ui/components/core';
9
9
  import { FormFieldControl } from '@ngstarter-ui/components/form-field';
10
- import { MenuTrigger, Menu, MenuItem } from '@ngstarter-ui/components/menu';
10
+ import { MenuTrigger, Menu, MenuHeader, MenuItem, MenuDivider } from '@ngstarter-ui/components/menu';
11
11
  import { parsePhoneNumber, parsePhoneNumberFromString, AsYouType } from 'libphonenumber-js';
12
12
  import { Subject } from 'rxjs';
13
13
  import { Icon } from '@ngstarter-ui/components/icon';
14
14
  import { Input } from '@ngstarter-ui/components/input';
15
15
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
16
- import { Divider } from '@ngstarter-ui/components/divider';
16
+ import { Button } from '@ngstarter-ui/components/button';
17
17
 
18
18
  class CountryCode {
19
19
  allCountries = [
@@ -286,27 +286,10 @@ const phoneValidator = (control) => {
286
286
  return null;
287
287
  };
288
288
 
289
- class SearchPipe {
290
- transform(countries, searchCriteria) {
291
- if (!searchCriteria || searchCriteria === '') {
292
- return countries;
293
- }
294
- return countries.filter((country) => {
295
- return `${country.name}${country.phoneCode}`
296
- .toLowerCase()
297
- .includes(searchCriteria.toLowerCase());
298
- });
299
- }
300
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SearchPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
301
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.4", ngImport: i0, type: SearchPipe, isStandalone: true, name: "search" });
302
- }
303
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SearchPipe, decorators: [{
304
- type: Pipe,
305
- args: [{ name: 'search' }]
306
- }] });
307
-
308
289
  class PhoneInput {
309
290
  ngControl;
291
+ static COUNTRY_RENDER_CHUNK_SIZE = 32;
292
+ static COUNTRY_RENDER_CHUNK_DELAY = 50;
310
293
  _destroyRef = inject(DestroyRef);
311
294
  _changeDetectorRef = inject(ChangeDetectorRef);
312
295
  countryCodeData = inject(CountryCode);
@@ -315,7 +298,7 @@ class PhoneInput {
315
298
  _errorStateMatcher = inject(ErrorStateMatcher);
316
299
  _parentForm = inject(NgForm, { optional: true });
317
300
  static nextId = 0;
318
- menuSearchInput = viewChild('menuSearchInput', ...(ngDevMode ? [{ debugName: "menuSearchInput" }] : /* istanbul ignore next */ []));
301
+ searchInput = viewChild('searchInput', ...(ngDevMode ? [{ debugName: "searchInput" }] : /* istanbul ignore next */ []));
319
302
  focusable = viewChild.required('focusable');
320
303
  _focused = signal(false, ...(ngDevMode ? [{ debugName: "_focused" }] : /* istanbul ignore next */ []));
321
304
  _errorState = signal(false, ...(ngDevMode ? [{ debugName: "_errorState" }] : /* istanbul ignore next */ []));
@@ -331,8 +314,25 @@ class PhoneInput {
331
314
  selectedCountry = signal(null, ...(ngDevMode ? [{ debugName: "selectedCountry" }] : /* istanbul ignore next */ []));
332
315
  numberInstance;
333
316
  _value;
334
- searchCriteria;
317
+ searchTerm = signal('', ...(ngDevMode ? [{ debugName: "searchTerm" }] : /* istanbul ignore next */ []));
318
+ visibleCountryCount = signal(PhoneInput.COUNTRY_RENDER_CHUNK_SIZE, ...(ngDevMode ? [{ debugName: "visibleCountryCount" }] : /* istanbul ignore next */ []));
319
+ filteredCountries = computed(() => {
320
+ const searchTerm = this.searchTerm().trim().toLowerCase();
321
+ if (!searchTerm) {
322
+ return this.allCountries;
323
+ }
324
+ return this.allCountries.filter((country) => {
325
+ return `${country.name}${country.phoneCode}`
326
+ .toLowerCase()
327
+ .includes(searchTerm);
328
+ });
329
+ }, ...(ngDevMode ? [{ debugName: "filteredCountries" }] : /* istanbul ignore next */ []));
330
+ visibleCountries = computed(() => {
331
+ return this.filteredCountries().slice(0, this.visibleCountryCount());
332
+ }, ...(ngDevMode ? [{ debugName: "visibleCountries" }] : /* istanbul ignore next */ []));
335
333
  _previousFormattedNumber;
334
+ _countryRenderTimeout;
335
+ _countrySearchFocusTimeout;
336
336
  onTouched = () => { };
337
337
  propagateChange = (_) => { };
338
338
  get focused() {
@@ -445,6 +445,7 @@ class PhoneInput {
445
445
  this._changeDetectorRef.detectChanges();
446
446
  }
447
447
  ngOnDestroy() {
448
+ this.clearCountryMenuTimeouts();
448
449
  this.stateChanges.complete();
449
450
  this._focusMonitor.stopMonitoring(this._elementRef);
450
451
  }
@@ -492,6 +493,69 @@ class PhoneInput {
492
493
  this.onPhoneNumberChange();
493
494
  el.focus();
494
495
  }
496
+ focusSearchInput() {
497
+ this.searchInput()?.nativeElement.focus();
498
+ }
499
+ openCountryMenu() {
500
+ this.visibleCountryCount.set(PhoneInput.COUNTRY_RENDER_CHUNK_SIZE);
501
+ this.scheduleCountryRendering();
502
+ this._countrySearchFocusTimeout = setTimeout(() => this.focusSearchInput());
503
+ }
504
+ closeCountryMenu() {
505
+ this.clearCountryMenuTimeouts();
506
+ this.searchTerm.set('');
507
+ this.visibleCountryCount.set(PhoneInput.COUNTRY_RENDER_CHUNK_SIZE);
508
+ }
509
+ onCountrySearch(searchTerm) {
510
+ this.searchTerm.set(searchTerm);
511
+ this.visibleCountryCount.set(PhoneInput.COUNTRY_RENDER_CHUNK_SIZE);
512
+ this.scheduleCountryRendering();
513
+ }
514
+ clearSearch(event) {
515
+ event.stopPropagation();
516
+ this.onCountrySearch('');
517
+ this.focusSearchInput();
518
+ }
519
+ countryFlagEmoji(shortCode) {
520
+ if (!shortCode || shortCode.length !== 2) {
521
+ return '';
522
+ }
523
+ const upperShortCode = shortCode.toUpperCase();
524
+ return Array.from(upperShortCode)
525
+ .map((letter) => String.fromCodePoint(0x1F1E6 + letter.charCodeAt(0) - 65))
526
+ .join('');
527
+ }
528
+ scheduleCountryRendering() {
529
+ this.clearCountryRenderTimeout();
530
+ if (this.visibleCountryCount() >= this.filteredCountries().length) {
531
+ return;
532
+ }
533
+ this._countryRenderTimeout = setTimeout(() => {
534
+ this.visibleCountryCount.update((count) => {
535
+ return Math.min(count + PhoneInput.COUNTRY_RENDER_CHUNK_SIZE, this.filteredCountries().length);
536
+ });
537
+ this.scheduleCountryRendering();
538
+ this._changeDetectorRef.markForCheck();
539
+ }, PhoneInput.COUNTRY_RENDER_CHUNK_DELAY);
540
+ }
541
+ clearCountryMenuTimeouts() {
542
+ this.clearCountryRenderTimeout();
543
+ this.clearCountrySearchFocusTimeout();
544
+ }
545
+ clearCountryRenderTimeout() {
546
+ if (!this._countryRenderTimeout) {
547
+ return;
548
+ }
549
+ clearTimeout(this._countryRenderTimeout);
550
+ this._countryRenderTimeout = undefined;
551
+ }
552
+ clearCountrySearchFocusTimeout() {
553
+ if (!this._countrySearchFocusTimeout) {
554
+ return;
555
+ }
556
+ clearTimeout(this._countrySearchFocusTimeout);
557
+ this._countrySearchFocusTimeout = undefined;
558
+ }
495
559
  getCountry(shortCode) {
496
560
  return (this.allCountries.find((c) => c.shortCode === shortCode.toLowerCase()) || {
497
561
  name: 'UN',
@@ -619,7 +683,7 @@ class PhoneInput {
619
683
  useValue: phoneValidator,
620
684
  multi: true,
621
685
  },
622
- ], viewQueries: [{ propertyName: "menuSearchInput", first: true, predicate: ["menuSearchInput"], descendants: true, isSignal: true }, { propertyName: "focusable", first: true, predicate: ["focusable"], descendants: true, isSignal: true }], exportAs: ["ngsPhoneInput"], ngImport: i0, template: "<div class=\"phone-input-container\">\n <button\n type=\"button\"\n ngsRipple\n [ngsMenuTriggerFor]=\"menu\"\n class=\"country-selector pe-1.5\"\n [disabled]=\"disabled\"\n (menuOpened)=\"menuSearchInput()?.nativeElement?.focus()\">\n @if (selectedCountry()) {\n <ngs-icon [name]=\"'circle-flags:' + selectedCountry()?.shortCode\" class=\"flag-icon\" />\n\n @if (selectedCountry()?.phoneCode) {\n <span class=\"country-selector-code\">{{ selectedCountry()?.phoneCode }}</span>\n }\n }\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"text-neutral-500 size-4 relative ms-0.5\"/>\n </button>\n <input\n ngsInput\n type=\"tel\"\n inputmode=\"tel\"\n [autocomplete]=\"autocomplete()\"\n (blur)=\"onTouched()\"\n (keypress)=\"onInputKeyPress($event)\"\n [(ngModel)]=\"phoneNumber\"\n (ngModelChange)=\"onPhoneNumberChange()\"\n [errorStateMatcher]=\"errorStateMatcher()\"\n [placeholder]=\"_placeholder()\"\n [disabled]=\"disabled\"\n class=\"grow\"\n #focusable>\n</div>\n<ngs-menu #menu=\"ngsMenu\">\n @for (country of preferredCountriesInDropDown; track country) {\n <button type=\"button\" ngs-menu-item (click)=\"onCountrySelect(country, focusable)\">\n <div class=\"flex items-center gap-2\">\n <ngs-icon [name]=\"'circle-flags:' + country.shortCode\" class=\"flag-icon\" />\n <div class=\"label-wrapper\">\n {{ country.name }}\n <span [class.whitespace-nowrap]=\"!searchCriteria\" class=\"text-neutral-500\">{{ country.phoneCode }}</span>\n </div>\n </div>\n </button>\n }\n\n @if (preferredCountriesInDropDown.length) {\n <ngs-divider/>\n }\n\n @for (country of allCountries | search : searchCriteria; track country) {\n <button type=\"button\" ngs-menu-item (click)=\"onCountrySelect(country, focusable)\">\n <div class=\"flex items-center gap-2\">\n <ngs-icon [name]=\"'circle-flags:' + country.shortCode\" class=\"flag-icon\" />\n <div>\n {{ country.name }}\n <span [class.whitespace-nowrap]=\"!searchCriteria\" class=\"text-neutral-500\">{{ country.phoneCode }}</span>\n </div>\n </div>\n </button>\n }\n</ngs-menu>\n", styles: [":host{--ngs-phone-input-color: var(--ngs-color-neutral-600);--ngs-phone-input-opacity: 0}@media print{:host{--ngs-phone-input-flag-display: none}}:host .flag-icon{margin-inline-end:calc(var(--spacing, .25rem) * 1);--ngs-icon-size: 18px}:host.is-floating .country-selector{opacity:1}:host .phone-input-container{display:flex;align-items:center}:host input{border:none;background:none;outline:none;font:inherit;width:max-content;box-sizing:border-box;padding-right:6px;padding-left:4px;position:relative;z-index:0}:host .icon-wrapper{padding-right:24px}:host .mdc-button__label{margin-right:auto}:host .country-selector{display:flex;align-items:center;line-height:0;border-radius:0;color:var(--ngs-phone-input-color);flex-shrink:0;height:initial;opacity:var(--ngs-phone-input-opacity, 0);transition:opacity .2s;border:unset}:host .country-selector:disabled{opacity:.8}:host .country-selector-code{color:var(--ngs-phone-input-color);padding-right:0}:host-context(html.dark){--ngs-phone-input-color: var(--ngs-color-neutral-500)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: Ripple, selector: "[ngsRipple]", inputs: ["ngsRippleColor", "ngsRippleUnbounded", "ngsRippleCentered", "ngsRippleRadius", "ngsRippleAnimation", "ngsRippleDisabled", "ngsRippleTrigger"], outputs: ["ngsRippleCenteredChange", "ngsRippleDisabledChange", "ngsRippleTriggerChange"], exportAs: ["ngsRipple"] }, { kind: "directive", type: MenuTrigger, selector: "[ngsMenuTriggerFor]", inputs: ["ngsMenuTriggerFor", "ngsMenuTriggerData", "ngsMenuDisabled", "xPosition", "yPosition", "ngsMenuTriggerRestoreFocus"], outputs: ["menuOpened", "menuClosed"], exportAs: ["ngsMenuTrigger"] }, { kind: "component", type: Icon, selector: "ngs-icon", inputs: ["name"], exportAs: ["ngsIcon"] }, { kind: "component", type: Menu, selector: "ngs-menu", inputs: ["role", "classList", "xPosition", "yPosition"], outputs: ["closed"], exportAs: ["ngsMenu"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MenuItem, selector: "ngs-menu-item, [ngs-menu-item]", inputs: ["disabled", "role", "selected"], outputs: ["_triggered"], exportAs: ["ngsMenuItem"] }, { kind: "directive", type: Input, selector: "input[ngsInput], textarea[ngsInput]", inputs: ["id", "placeholder", "required", "disabled", "readonly", "errorStateMatcher"], exportAs: ["ngsInput"] }, { kind: "component", type: Divider, selector: "ngs-divider", inputs: ["vertical", "inset", "fixedHeight"], exportAs: ["ngsDivider"] }, { kind: "pipe", type: SearchPipe, name: "search" }] });
686
+ ], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true, isSignal: true }, { propertyName: "focusable", first: true, predicate: ["focusable"], descendants: true, isSignal: true }], exportAs: ["ngsPhoneInput"], ngImport: i0, template: "<div class=\"phone-input-container\">\n <button\n type=\"button\"\n ngsRipple\n [ngsMenuTriggerFor]=\"menu\"\n class=\"country-selector pe-1.5\"\n [disabled]=\"disabled\"\n (menuOpened)=\"openCountryMenu()\"\n (menuClosed)=\"closeCountryMenu()\">\n @if (selectedCountry()) {\n <span class=\"flag-icon\" aria-hidden=\"true\">{{ countryFlagEmoji(selectedCountry()?.shortCode) }}</span>\n\n @if (selectedCountry()?.phoneCode) {\n <span class=\"country-selector-code\">{{ selectedCountry()?.phoneCode }}</span>\n }\n }\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"text-neutral-500 size-4 relative ms-0.5\"/>\n </button>\n\n <input\n ngsInput\n type=\"tel\"\n inputmode=\"tel\"\n [autocomplete]=\"autocomplete()\"\n (blur)=\"onTouched()\"\n (keypress)=\"onInputKeyPress($event)\"\n [(ngModel)]=\"phoneNumber\"\n (ngModelChange)=\"onPhoneNumberChange()\"\n [errorStateMatcher]=\"errorStateMatcher()\"\n [placeholder]=\"_placeholder()\"\n [disabled]=\"disabled\"\n class=\"grow\"\n #focusable>\n</div>\n\n<ngs-menu #menu=\"ngsMenu\">\n <ngs-menu-header>\n <div class=\"sticky top-0 z-1 bg-surface-container-lowest\">\n <input #searchInput\n type=\"text\"\n placeholder=\"Search...\"\n autocomplete=\"off\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onCountrySearch($event)\"\n class=\"w-full text-sm focus:outline-none border-b border-border focus:border-b-primary h-14 px-3\">\n @if (searchTerm().trim()) {\n <div class=\"absolute end-1 top-1/2 -translate-y-1/2\">\n <button\n ngsIconButton\n (click)=\"clearSearch($event)\"\n class=\"clear-button\"\n type=\"button\"\n aria-label=\"Clear search\">\n <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n </button>\n </div>\n }\n </div>\n </ngs-menu-header>\n\n @for (country of preferredCountriesInDropDown; track country.shortCode) {\n <button type=\"button\" ngs-menu-item (click)=\"onCountrySelect(country, focusable)\">\n <div class=\"flex items-center gap-2\">\n <span class=\"flag-icon-option text-2xl\" aria-hidden=\"true\">{{ countryFlagEmoji(country.shortCode) }}</span>\n <div class=\"label-wrapper\">\n {{ country.name }}\n <span [class.whitespace-nowrap]=\"!searchTerm()\" class=\"text-neutral-500\">{{ country.phoneCode }}</span>\n </div>\n </div>\n </button>\n }\n\n @if (preferredCountriesInDropDown.length) {\n <ngs-menu-divider/>\n }\n\n @for (country of visibleCountries(); track country.shortCode) {\n <button type=\"button\" ngs-menu-item (click)=\"onCountrySelect(country, focusable)\">\n <div class=\"flex items-center gap-2\">\n <span class=\"flag-icon-option text-2xl\" aria-hidden=\"true\">{{ countryFlagEmoji(country.shortCode) }}</span>\n <div>\n {{ country.name }}\n <span [class.whitespace-nowrap]=\"!searchTerm()\" class=\"text-neutral-500\">{{ country.phoneCode }}</span>\n </div>\n </div>\n </button>\n } @empty {\n @if (searchTerm()) {\n <div class=\"text-sm px-4 py-3\">\n <span i18n>No countries found</span>.\n </div>\n }\n }\n\n @if (visibleCountryCount() < filteredCountries().length) {\n <div class=\"country-loading\">\n Loading more countries...\n </div>\n }\n</ngs-menu>\n", styles: [":host{--ngs-phone-input-color: var(--ngs-color-neutral-600);--ngs-phone-input-opacity: 0}@media print{:host{--ngs-phone-input-flag-display: none}}:host .flag-icon{display:var(--ngs-phone-input-flag-display, inline-flex);align-items:center;justify-content:center;width:22px;margin-inline-end:calc(var(--spacing, .25rem) * 1);font-size:22px;line-height:1}:host.is-floating .country-selector{opacity:1}:host .phone-input-container{display:flex;align-items:center}:host .country-empty,:host .country-loading{padding:calc(var(--spacing, .25rem) * 3);color:var(--ngs-color-on-surface-variant);font-size:var(--ngs-font-size-sm)}:host .country-loading{padding-block:calc(var(--spacing, .25rem) * 2)}:host .phone-input-container input{border:none;background:none;outline:none;font:inherit;width:max-content;box-sizing:border-box;padding-right:6px;padding-left:4px;position:relative;z-index:0}:host .icon-wrapper{padding-right:24px}:host .mdc-button__label{margin-right:auto}:host .country-selector{display:flex;align-items:center;line-height:0;border-radius:0;color:var(--ngs-phone-input-color);flex-shrink:0;height:initial;opacity:var(--ngs-phone-input-opacity, 0);transition:opacity .2s;border:unset}:host .country-selector:disabled{opacity:.8}:host .country-selector-code{color:var(--ngs-phone-input-color);padding-right:0}:host-context(html.dark){--ngs-phone-input-color: var(--ngs-color-neutral-500)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: Ripple, selector: "[ngsRipple]", inputs: ["ngsRippleColor", "ngsRippleUnbounded", "ngsRippleCentered", "ngsRippleRadius", "ngsRippleAnimation", "ngsRippleDisabled", "ngsRippleTrigger"], outputs: ["ngsRippleCenteredChange", "ngsRippleDisabledChange", "ngsRippleTriggerChange"], exportAs: ["ngsRipple"] }, { kind: "directive", type: MenuTrigger, selector: "[ngsMenuTriggerFor]", inputs: ["ngsMenuTriggerFor", "ngsMenuTriggerData", "ngsMenuDisabled", "xPosition", "yPosition", "ngsMenuTriggerRestoreFocus"], outputs: ["menuOpened", "menuClosed"], exportAs: ["ngsMenuTrigger"] }, { kind: "component", type: Icon, selector: "ngs-icon", inputs: ["name"], exportAs: ["ngsIcon"] }, { kind: "component", type: Menu, selector: "ngs-menu", inputs: ["role", "classList", "xPosition", "yPosition"], outputs: ["closed"], exportAs: ["ngsMenu"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: MenuHeader, selector: "ngs-menu-header", exportAs: ["ngsMenuHeader"] }, { kind: "component", type: MenuItem, selector: "ngs-menu-item, [ngs-menu-item]", inputs: ["disabled", "role", "selected"], outputs: ["_triggered"], exportAs: ["ngsMenuItem"] }, { kind: "component", type: MenuDivider, selector: "ngs-menu-divider" }, { kind: "directive", type: Input, selector: "input[ngsInput], textarea[ngsInput]", inputs: ["id", "placeholder", "required", "disabled", "readonly", "errorStateMatcher"], exportAs: ["ngsInput"] }, { kind: "component", type: Button, selector: " button[ngsButton], button[ngsIconButton], a[ngsButton], a[ngsIconButton] ", inputs: ["ngsButton", "ngsIconButton", "loading", "disabled", "disabledInteractive", "disableRipple", "reverse", "fullWidth", "hideTextOnMobile"], exportAs: ["ngsButton"] }] });
623
687
  }
624
688
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: PhoneInput, decorators: [{
625
689
  type: Component,
@@ -630,10 +694,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
630
694
  Menu,
631
695
  ReactiveFormsModule,
632
696
  FormsModule,
697
+ MenuHeader,
633
698
  MenuItem,
699
+ MenuDivider,
634
700
  Input,
635
- SearchPipe,
636
- Divider,
701
+ Button,
637
702
  ], providers: [
638
703
  CountryCode,
639
704
  {
@@ -648,7 +713,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
648
713
  ], host: {
649
714
  'class': 'ngs-phone-input',
650
715
  '[class.is-floating]': 'shouldLabelFloat',
651
- }, template: "<div class=\"phone-input-container\">\n <button\n type=\"button\"\n ngsRipple\n [ngsMenuTriggerFor]=\"menu\"\n class=\"country-selector pe-1.5\"\n [disabled]=\"disabled\"\n (menuOpened)=\"menuSearchInput()?.nativeElement?.focus()\">\n @if (selectedCountry()) {\n <ngs-icon [name]=\"'circle-flags:' + selectedCountry()?.shortCode\" class=\"flag-icon\" />\n\n @if (selectedCountry()?.phoneCode) {\n <span class=\"country-selector-code\">{{ selectedCountry()?.phoneCode }}</span>\n }\n }\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"text-neutral-500 size-4 relative ms-0.5\"/>\n </button>\n <input\n ngsInput\n type=\"tel\"\n inputmode=\"tel\"\n [autocomplete]=\"autocomplete()\"\n (blur)=\"onTouched()\"\n (keypress)=\"onInputKeyPress($event)\"\n [(ngModel)]=\"phoneNumber\"\n (ngModelChange)=\"onPhoneNumberChange()\"\n [errorStateMatcher]=\"errorStateMatcher()\"\n [placeholder]=\"_placeholder()\"\n [disabled]=\"disabled\"\n class=\"grow\"\n #focusable>\n</div>\n<ngs-menu #menu=\"ngsMenu\">\n @for (country of preferredCountriesInDropDown; track country) {\n <button type=\"button\" ngs-menu-item (click)=\"onCountrySelect(country, focusable)\">\n <div class=\"flex items-center gap-2\">\n <ngs-icon [name]=\"'circle-flags:' + country.shortCode\" class=\"flag-icon\" />\n <div class=\"label-wrapper\">\n {{ country.name }}\n <span [class.whitespace-nowrap]=\"!searchCriteria\" class=\"text-neutral-500\">{{ country.phoneCode }}</span>\n </div>\n </div>\n </button>\n }\n\n @if (preferredCountriesInDropDown.length) {\n <ngs-divider/>\n }\n\n @for (country of allCountries | search : searchCriteria; track country) {\n <button type=\"button\" ngs-menu-item (click)=\"onCountrySelect(country, focusable)\">\n <div class=\"flex items-center gap-2\">\n <ngs-icon [name]=\"'circle-flags:' + country.shortCode\" class=\"flag-icon\" />\n <div>\n {{ country.name }}\n <span [class.whitespace-nowrap]=\"!searchCriteria\" class=\"text-neutral-500\">{{ country.phoneCode }}</span>\n </div>\n </div>\n </button>\n }\n</ngs-menu>\n", styles: [":host{--ngs-phone-input-color: var(--ngs-color-neutral-600);--ngs-phone-input-opacity: 0}@media print{:host{--ngs-phone-input-flag-display: none}}:host .flag-icon{margin-inline-end:calc(var(--spacing, .25rem) * 1);--ngs-icon-size: 18px}:host.is-floating .country-selector{opacity:1}:host .phone-input-container{display:flex;align-items:center}:host input{border:none;background:none;outline:none;font:inherit;width:max-content;box-sizing:border-box;padding-right:6px;padding-left:4px;position:relative;z-index:0}:host .icon-wrapper{padding-right:24px}:host .mdc-button__label{margin-right:auto}:host .country-selector{display:flex;align-items:center;line-height:0;border-radius:0;color:var(--ngs-phone-input-color);flex-shrink:0;height:initial;opacity:var(--ngs-phone-input-opacity, 0);transition:opacity .2s;border:unset}:host .country-selector:disabled{opacity:.8}:host .country-selector-code{color:var(--ngs-phone-input-color);padding-right:0}:host-context(html.dark){--ngs-phone-input-color: var(--ngs-color-neutral-500)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
716
+ }, template: "<div class=\"phone-input-container\">\n <button\n type=\"button\"\n ngsRipple\n [ngsMenuTriggerFor]=\"menu\"\n class=\"country-selector pe-1.5\"\n [disabled]=\"disabled\"\n (menuOpened)=\"openCountryMenu()\"\n (menuClosed)=\"closeCountryMenu()\">\n @if (selectedCountry()) {\n <span class=\"flag-icon\" aria-hidden=\"true\">{{ countryFlagEmoji(selectedCountry()?.shortCode) }}</span>\n\n @if (selectedCountry()?.phoneCode) {\n <span class=\"country-selector-code\">{{ selectedCountry()?.phoneCode }}</span>\n }\n }\n <ngs-icon name=\"fluent:chevron-down-24-regular\" class=\"text-neutral-500 size-4 relative ms-0.5\"/>\n </button>\n\n <input\n ngsInput\n type=\"tel\"\n inputmode=\"tel\"\n [autocomplete]=\"autocomplete()\"\n (blur)=\"onTouched()\"\n (keypress)=\"onInputKeyPress($event)\"\n [(ngModel)]=\"phoneNumber\"\n (ngModelChange)=\"onPhoneNumberChange()\"\n [errorStateMatcher]=\"errorStateMatcher()\"\n [placeholder]=\"_placeholder()\"\n [disabled]=\"disabled\"\n class=\"grow\"\n #focusable>\n</div>\n\n<ngs-menu #menu=\"ngsMenu\">\n <ngs-menu-header>\n <div class=\"sticky top-0 z-1 bg-surface-container-lowest\">\n <input #searchInput\n type=\"text\"\n placeholder=\"Search...\"\n autocomplete=\"off\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onCountrySearch($event)\"\n class=\"w-full text-sm focus:outline-none border-b border-border focus:border-b-primary h-14 px-3\">\n @if (searchTerm().trim()) {\n <div class=\"absolute end-1 top-1/2 -translate-y-1/2\">\n <button\n ngsIconButton\n (click)=\"clearSearch($event)\"\n class=\"clear-button\"\n type=\"button\"\n aria-label=\"Clear search\">\n <ngs-icon name=\"fluent:dismiss-24-regular\"/>\n </button>\n </div>\n }\n </div>\n </ngs-menu-header>\n\n @for (country of preferredCountriesInDropDown; track country.shortCode) {\n <button type=\"button\" ngs-menu-item (click)=\"onCountrySelect(country, focusable)\">\n <div class=\"flex items-center gap-2\">\n <span class=\"flag-icon-option text-2xl\" aria-hidden=\"true\">{{ countryFlagEmoji(country.shortCode) }}</span>\n <div class=\"label-wrapper\">\n {{ country.name }}\n <span [class.whitespace-nowrap]=\"!searchTerm()\" class=\"text-neutral-500\">{{ country.phoneCode }}</span>\n </div>\n </div>\n </button>\n }\n\n @if (preferredCountriesInDropDown.length) {\n <ngs-menu-divider/>\n }\n\n @for (country of visibleCountries(); track country.shortCode) {\n <button type=\"button\" ngs-menu-item (click)=\"onCountrySelect(country, focusable)\">\n <div class=\"flex items-center gap-2\">\n <span class=\"flag-icon-option text-2xl\" aria-hidden=\"true\">{{ countryFlagEmoji(country.shortCode) }}</span>\n <div>\n {{ country.name }}\n <span [class.whitespace-nowrap]=\"!searchTerm()\" class=\"text-neutral-500\">{{ country.phoneCode }}</span>\n </div>\n </div>\n </button>\n } @empty {\n @if (searchTerm()) {\n <div class=\"text-sm px-4 py-3\">\n <span i18n>No countries found</span>.\n </div>\n }\n }\n\n @if (visibleCountryCount() < filteredCountries().length) {\n <div class=\"country-loading\">\n Loading more countries...\n </div>\n }\n</ngs-menu>\n", styles: [":host{--ngs-phone-input-color: var(--ngs-color-neutral-600);--ngs-phone-input-opacity: 0}@media print{:host{--ngs-phone-input-flag-display: none}}:host .flag-icon{display:var(--ngs-phone-input-flag-display, inline-flex);align-items:center;justify-content:center;width:22px;margin-inline-end:calc(var(--spacing, .25rem) * 1);font-size:22px;line-height:1}:host.is-floating .country-selector{opacity:1}:host .phone-input-container{display:flex;align-items:center}:host .country-empty,:host .country-loading{padding:calc(var(--spacing, .25rem) * 3);color:var(--ngs-color-on-surface-variant);font-size:var(--ngs-font-size-sm)}:host .country-loading{padding-block:calc(var(--spacing, .25rem) * 2)}:host .phone-input-container input{border:none;background:none;outline:none;font:inherit;width:max-content;box-sizing:border-box;padding-right:6px;padding-left:4px;position:relative;z-index:0}:host .icon-wrapper{padding-right:24px}:host .mdc-button__label{margin-right:auto}:host .country-selector{display:flex;align-items:center;line-height:0;border-radius:0;color:var(--ngs-phone-input-color);flex-shrink:0;height:initial;opacity:var(--ngs-phone-input-opacity, 0);transition:opacity .2s;border:unset}:host .country-selector:disabled{opacity:.8}:host .country-selector-code{color:var(--ngs-phone-input-color);padding-right:0}:host-context(html.dark){--ngs-phone-input-color: var(--ngs-color-neutral-500)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
652
717
  }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
653
718
  type: Optional
654
719
  }, {
@@ -657,11 +722,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
657
722
  type: Optional
658
723
  }] }, { type: i1.FormGroupDirective, decorators: [{
659
724
  type: Optional
660
- }] }, { type: i2.ErrorStateMatcher }], propDecorators: { menuSearchInput: [{ type: i0.ViewChild, args: ['menuSearchInput', { isSignal: true }] }], focusable: [{ type: i0.ViewChild, args: ['focusable', { isSignal: true }] }], countryChanged: [{ type: i0.Output, args: ["countryChanged"] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], onlyCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "onlyCountries", required: false }] }], preferredCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "preferredCountries", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], defaultSelectedCountryCode: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultSelectedCountryCode", required: false }] }], _placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], required: [{
725
+ }] }, { type: i2.ErrorStateMatcher }], propDecorators: { searchInput: [{ type: i0.ViewChild, args: ['searchInput', { isSignal: true }] }], focusable: [{ type: i0.ViewChild, args: ['focusable', { isSignal: true }] }], countryChanged: [{ type: i0.Output, args: ["countryChanged"] }], autocomplete: [{ type: i0.Input, args: [{ isSignal: true, alias: "autocomplete", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], onlyCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "onlyCountries", required: false }] }], preferredCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "preferredCountries", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], defaultSelectedCountryCode: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultSelectedCountryCode", required: false }] }], _placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], required: [{
661
726
  type: Input$1,
662
727
  args: [{ alias: 'required', transform: booleanAttribute }]
663
728
  }], phoneDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }] } });
664
729
 
730
+ class SearchPipe {
731
+ transform(countries, searchCriteria) {
732
+ if (!searchCriteria || searchCriteria === '') {
733
+ return countries;
734
+ }
735
+ return countries.filter((country) => {
736
+ return `${country.name}${country.phoneCode}`
737
+ .toLowerCase()
738
+ .includes(searchCriteria.toLowerCase());
739
+ });
740
+ }
741
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SearchPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
742
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.4", ngImport: i0, type: SearchPipe, isStandalone: true, name: "search" });
743
+ }
744
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SearchPipe, decorators: [{
745
+ type: Pipe,
746
+ args: [{ name: 'search' }]
747
+ }] });
748
+
665
749
  /**
666
750
  * Generated bundle index. Do not edit.
667
751
  */