{"version":3,"file":"sdcorejs-angular-components-preview.mjs","sources":["../../../projects/sdcorejs-angular/components/preview/src/preview-image/preview-image.component.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-image/preview-image.component.html","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.browser.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.print.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.pdfjs.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.component.ts","../../../projects/sdcorejs-angular/components/preview/src/preview-pdf/preview-pdf.component.html","../../../projects/sdcorejs-angular/components/preview/sdcorejs-angular-components-preview.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  HostListener,\n  OnDestroy,\n  afterNextRender,\n  computed,\n  effect,\n  inject,\n  input,\n  output,\n  signal,\n} from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { NormalizedImage, PreviewItem, PreviewStage, PreviewTheme, ThumbnailPosition } from './preview-image.types';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n  selector: 'sd-preview-image',\n  standalone: true,\n  imports: [SdIcon, CommonModule, TranslatePipe],\n  templateUrl: './preview-image.component.html',\n  styleUrl: './preview-image.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  // WHY tabindex='0': host phải focusable để @HostListener('keydown') nhận event\n  // mà không cần bind document. Consumer (modal/drawer/page) chỉ cần thả component\n  // vào DOM — keyboard shortcut tự hoạt động khi component hoặc descendant đang focus.\n  host: {\n    tabindex: '0',\n    class: 'sd-preview-image-host',\n    // WHY data-theme attribute (not class): SCSS uses :host([data-theme=\"light\"])\n    // to swap CSS custom properties — keeps the theme variant declarative and\n    // visible in devtools without polluting the class list.\n    '[attr.data-theme]': 'theme()',\n    '[class.sd-preview-image-host--fullscreen]': 'isFullscreen()',\n  },\n})\nexport class SdPreviewImage implements OnDestroy {\n  // ==========================================\n  // CONSTANTS\n  // ==========================================\n  // Zoom giới hạn theo handoff: stage hiển thị từ 25% → 400% là dải hữu dụng.\n  // Ngoài dải này ảnh hoặc quá nhỏ để thao tác hoặc đã pixelated nặng.\n  static readonly MIN_ZOOM = 0.25;\n  static readonly MAX_ZOOM = 4;\n  static readonly ZOOM_STEP = 0.1;\n  static readonly SWIPE_THRESHOLD = 40;\n\n  // ==========================================\n  // DI\n  // ==========================================\n  readonly #hostEl = inject<ElementRef<HTMLElement>>(ElementRef);\n  readonly #destroyRef = inject(DestroyRef);\n\n  // ==========================================\n  // INPUTS (signal-based, Angular 19 style)\n  // ==========================================\n  // Declarative items input — consumer drives state. Mỗi lần items() đổi,\n  // effect() bên dưới sẽ normalize + load lại danh sách.\n  // autoId prefix `preview-image-`. Per-element child autoIds derive `${autoId}-{suffix}`.\n  readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n  readonly autoId = computed(() => (this.autoIdInput() ? `components-preview-image-${this.autoIdInput()}` : undefined));\n\n  readonly #childAutoId = (suffix: string): string | undefined => {\n    return this.autoId() ? `${this.autoId()}-${suffix}` : undefined;\n  };\n\n  readonly autoIdPrev = computed(() => this.#childAutoId('prev'));\n  readonly autoIdNext = computed(() => this.#childAutoId('next'));\n  readonly autoIdZoomIn = computed(() => this.#childAutoId('zoom-in'));\n  readonly autoIdZoomOut = computed(() => this.#childAutoId('zoom-out'));\n  readonly autoIdFit = computed(() => this.#childAutoId('fit'));\n  readonly autoIdRotate = computed(() => this.#childAutoId('rotate'));\n  readonly autoIdDownload = computed(() => this.#childAutoId('download'));\n  readonly autoIdFullscreen = computed(() => this.#childAutoId('fullscreen'));\n  readonly autoIdRetry = computed(() => this.#childAutoId('retry'));\n  readonly autoIdThumb = (i: number): string | undefined => this.#childAutoId(`thumb-${i}`);\n  readonly autoIdDot = (i: number): string | undefined => this.#childAutoId(`dot-${i}`);\n\n  readonly items = input<PreviewItem[]>([]);\n  readonly title = input<string | undefined>(undefined);\n  readonly thumbnailPosition = input<ThumbnailPosition>('bottom');\n  readonly showToolbar = input(true);\n  readonly downloadable = input(true);\n  readonly zoomable = input(true);\n  readonly loop = input(true);\n  readonly startIndex = input(0);\n  // Theme variant — drives [data-theme] host attribute. Default 'dark' preserves\n  // pre-existing visual contract; consumers opt-in to 'light' explicitly.\n  readonly theme = input<PreviewTheme>('dark');\n\n  // ==========================================\n  // OUTPUTS\n  // ==========================================\n  // `close`: user requested dismissal (X button hoặc Esc). Consumer tự quyết\n  // định đóng modal / điều hướng / hide section.\n  readonly close = output<void>();\n  readonly activeIndexChange = output<number>();\n  readonly download = output<{ index: number; item: NormalizedImage }>();\n  readonly imageError = output<{ index: number; reason: string }>();\n\n  // ==========================================\n  // STATE (signals)\n  // ==========================================\n  readonly #activeIndex = signal(0);\n  readonly #images = signal<NormalizedImage[]>([]);\n  readonly #zoom = signal(1);\n  readonly #rotation = signal(0);\n  readonly #pan = signal({ x: 0, y: 0 });\n  readonly #stage = signal<PreviewStage>('empty');\n  readonly #isFullscreen = signal(false);\n  readonly #isDragging = signal(false);\n\n  // Track every blob URL we created so we can revoke on destroy / re-normalize.\n  // CDN strings hoá ra File→blob URL nội bộ — bắt buộc phải revoke để không leak.\n  readonly #ownedBlobUrls = new Set<string>();\n\n  // Token chống race: nếu items() đổi liên tiếp (user click rất nhanh) thì\n  // promise normalize của lần trước phải bị bỏ qua khi resolve.\n  #loadToken = 0;\n\n  // Pointer state for drag/pinch — không cần signal vì không drive template.\n  #dragStart: { x: number; y: number; panX: number; panY: number } | null = null;\n  #swipeStart: { x: number; y: number; t: number } | null = null;\n  readonly #activePointers = new Map<number, { x: number; y: number }>();\n  #pinchStartDistance = 0;\n  #pinchStartZoom = 1;\n\n  // ==========================================\n  // COMPUTED (template-readable)\n  // ==========================================\n  readonly activeIndex = this.#activeIndex.asReadonly();\n  readonly images = this.#images.asReadonly();\n  readonly zoom = this.#zoom.asReadonly();\n  readonly rotation = this.#rotation.asReadonly();\n  readonly pan = this.#pan.asReadonly();\n  readonly stage = this.#stage.asReadonly();\n  readonly isFullscreen = this.#isFullscreen.asReadonly();\n\n  readonly activeImage = computed<NormalizedImage | undefined>(() => this.#images()[this.#activeIndex()]);\n  readonly hasPrev = computed(() => {\n    const len = this.#images().length;\n    return len > 1 && (this.loop() || this.#activeIndex() > 0);\n  });\n  readonly hasNext = computed(() => {\n    const len = this.#images().length;\n    return len > 1 && (this.loop() || this.#activeIndex() < len - 1);\n  });\n  readonly zoomPercent = computed(() => Math.round(this.#zoom() * 100));\n\n  // Transform style cho ảnh stage. WHY: gom translate/scale/rotate vào 1 string\n  // duy nhất để OnPush phát hiện thay đổi qua signal kéo theo computed.\n  readonly imageTransform = computed(() => {\n    const p = this.#pan();\n    const z = this.#zoom();\n    const r = this.#rotation();\n    return `translate(${p.x}px, ${p.y}px) scale(${z}) rotate(${r}deg)`;\n  });\n\n  readonly shellClass = computed(() => {\n    const pos = this.thumbnailPosition();\n    return {\n      'sd-preview-shell': true,\n      [`sd-preview-shell--pos-${pos}`]: true,\n      'sd-preview-shell--fullscreen': this.#isFullscreen(),\n    };\n  });\n\n  // ==========================================\n  // CONSTRUCTOR — declarative wiring\n  // ==========================================\n  constructor() {\n    // Đồng bộ #isFullscreen với trạng thái thực của browser (sự kiện 'fullscreenchange' fire\n    // bất kể user thoát fullscreen bằng cách nào: nút Thoát, Esc, F11, programmatic).\n    const onFullscreenChange = () => {\n      this.#isFullscreen.set(document.fullscreenElement === this.#hostEl.nativeElement);\n    };\n    document.addEventListener('fullscreenchange', onFullscreenChange);\n    this.#destroyRef.onDestroy(() => {\n      document.removeEventListener('fullscreenchange', onFullscreenChange);\n    });\n\n    // Reactive normalize: mỗi lần items() đổi → revoke blob cũ → load mới.\n    // WHY effect không async: effect() callback không hỗ trợ async cleanup,\n    // dùng token-based race guard trong #normalizeAndLoad để bỏ qua kết quả cũ.\n    effect(() => {\n      const list = this.items();\n      const start = this.startIndex();\n      this.#normalizeAndLoad(list, start);\n    });\n\n    // Auto-focus host sau lần render đầu để keyboard hoạt động ngay.\n    // WHY: nếu consumer KHÔNG bọc trong modal, không có ai focus giúp.\n    // Consumer bọc modal sẽ tự focus trap riêng — focus() này vô hại (no-op\n    // nếu element không visible).\n    afterNextRender(() => {\n      try {\n        this.#hostEl.nativeElement.focus({ preventScroll: true });\n      } catch {\n        // ignore — focus() can throw on detached/hidden elements.\n      }\n    });\n\n    // Cleanup khi component bị destroy.\n    this.#destroyRef.onDestroy(() => {\n      this.#revokeAllBlobs();\n      if (document.fullscreenElement === this.#hostEl.nativeElement) {\n        // Tránh để fullscreen \"treo\" khi component bị huỷ giữa chừng.\n        document.exitFullscreen?.().catch(() => undefined);\n      }\n    });\n  }\n\n  // ==========================================\n  // LIFECYCLE\n  // ==========================================\n  ngOnDestroy(): void {\n    // Giữ ngOnDestroy để vẫn tương thích với khai báo `implements OnDestroy`.\n    // Logic dọn dẹp đã được dời sang DestroyRef.onDestroy ở constructor để có\n    // thể chia sẻ với effect() teardown nếu cần sau này.\n  }\n\n  // ==========================================\n  // PUBLIC API\n  // ==========================================\n\n  onClickThumbnailImage(index: number): void {\n    if (index < 0 || index >= this.#images().length) return;\n    if (index === this.#activeIndex()) return;\n    this.#setActive(index);\n  }\n\n  updateCurrentImage(direction: 1 | -1): void {\n    const len = this.#images().length;\n    if (len <= 1) return;\n    const next = this.#activeIndex() + direction;\n    let target: number;\n    if (this.loop()) {\n      target = (next + len) % len;\n    } else {\n      if (next < 0 || next >= len) return;\n      target = next;\n    }\n    this.#setActive(target);\n  }\n\n  zoomIn(): void {\n    if (!this.zoomable()) return;\n    this.#setZoom(this.#zoom() + SdPreviewImage.ZOOM_STEP);\n  }\n\n  zoomOut(): void {\n    if (!this.zoomable()) return;\n    this.#setZoom(this.#zoom() - SdPreviewImage.ZOOM_STEP);\n  }\n\n  fitToScreen(): void {\n    this.#resetTransform();\n  }\n\n  rotate(direction: 'left' | 'right'): void {\n    const delta = direction === 'right' ? 90 : -90;\n    // Wrap về [0, 360) cho gọn — không strictly cần thiết về mặt visual.\n    this.#rotation.update(r => (((r + delta) % 360) + 360) % 360);\n  }\n\n  downloadCurrent(): void {\n    if (!this.downloadable()) return;\n    const img = this.activeImage();\n    if (!img || img.error) return;\n    // Ưu tiên CDN URL nếu có để tận dụng Content-Disposition của server,\n    // fallback về blob URL khi user upload File trực tiếp.\n    const href = img.url || img.blobUrl;\n    const a = document.createElement('a');\n    a.href = href;\n    a.download = img.name || 'image';\n    document.body.appendChild(a);\n    a.click();\n    a.remove();\n    this.download.emit({ index: this.#activeIndex(), item: img });\n  }\n\n  toggleFullscreen(): void {\n    // WHY: trạng thái #isFullscreen được sync qua sự kiện 'fullscreenchange' (xem constructor)\n    // — single source of truth. Không cần .then(set(true/false)) ở đây nữa.\n    if (!document.fullscreenElement) {\n      this.#hostEl.nativeElement.requestFullscreen?.().catch(() => undefined);\n    } else {\n      document.exitFullscreen?.().catch(() => undefined);\n    }\n  }\n\n  /** Retry just the active image (Artboard G action). */\n  async retryActive(): Promise<void> {\n    const idx = this.#activeIndex();\n    const img = this.#images()[idx];\n    if (!img || !img.url) return;\n    // Per-image loading: chỉ đánh dấu record này loading, KHÔNG đụng stage().\n    // Nhờ vậy nav arrows + thumbnails vẫn render trong lúc retry, không flicker.\n    this.#images.update(arr => {\n      const next = [...arr];\n      next[idx] = { ...arr[idx], loading: true, error: false };\n      return next;\n    });\n    const refreshed = await this.#normalize(img.url, { name: img.name, caption: img.caption, alt: img.alt });\n    if (refreshed) {\n      // Trao đổi nguyên record để giữ id thumbnail (avoid track-by reset).\n      this.#images.update(arr => {\n        const next = [...arr];\n        // Revoke blob cũ TRƯỚC khi thay để không leak record vừa fail tải.\n        if (this.#ownedBlobUrls.has(arr[idx].blobUrl)) {\n          URL.revokeObjectURL(arr[idx].blobUrl);\n          this.#ownedBlobUrls.delete(arr[idx].blobUrl);\n        }\n        next[idx] = { ...refreshed, id: img.id, loading: false };\n        return next;\n      });\n    } else {\n      // Normalize trả null → giữ record cũ nhưng tắt loading + mark error\n      // để inline placeholder hiển thị (không lật cả stage).\n      this.#images.update(arr => {\n        const next = [...arr];\n        next[idx] = { ...arr[idx], loading: false, error: true };\n        return next;\n      });\n    }\n  }\n\n  /** User clicked the X button — emit close intent for the consumer to react. */\n  requestClose(): void {\n    this.close.emit();\n  }\n\n  // ==========================================\n  // KEYBOARD — bound to HOST (not document)\n  // ==========================================\n  // WHY @HostListener('keydown') on host: component có tabindex=0 nên nhận được\n  // keyboard event khi nó hoặc descendant đang focused. Không bind document để\n  // tránh \"cướp\" phím tắt của các phần khác trong app khi component không hoạt động.\n  @HostListener('keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent): void {\n    // Bỏ qua khi user đang gõ trong input — toolbar / overlay có thể chứa\n    // input ẩn (search), không muốn ← → cướp event của họ.\n    const target = event.target as HTMLElement | null;\n    if (target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable)) {\n      return;\n    }\n\n    switch (event.key) {\n      case 'ArrowLeft':\n        event.preventDefault();\n        this.updateCurrentImage(-1);\n        break;\n      case 'ArrowRight':\n        event.preventDefault();\n        this.updateCurrentImage(1);\n        break;\n      case '+':\n      case '=':\n        if (this.zoomable()) {\n          event.preventDefault();\n          this.zoomIn();\n        }\n        break;\n      case '-':\n        if (this.zoomable()) {\n          event.preventDefault();\n          this.zoomOut();\n        }\n        break;\n      case '0':\n        event.preventDefault();\n        this.fitToScreen();\n        break;\n      case 'r':\n        event.preventDefault();\n        this.rotate('right');\n        break;\n      case 'R':\n        event.preventDefault();\n        this.rotate('left');\n        break;\n      case 'f':\n        event.preventDefault();\n        this.toggleFullscreen();\n        break;\n      case 'd':\n        if (this.downloadable()) {\n          event.preventDefault();\n          this.downloadCurrent();\n        }\n        break;\n    }\n  }\n\n  // ==========================================\n  // MOUSE / POINTER HANDLERS (template-bound)\n  // ==========================================\n  onWheel(event: WheelEvent): void {\n    if (!this.zoomable()) return;\n    event.preventDefault();\n    // deltaY < 0 nghĩa là cuộn lên = zoom in (giống Google Photos / macOS Preview).\n    const factor = event.deltaY < 0 ? 1 + SdPreviewImage.ZOOM_STEP : 1 - SdPreviewImage.ZOOM_STEP;\n    this.#setZoom(this.#zoom() * factor);\n  }\n\n  onPointerDown(event: PointerEvent): void {\n    if (event.button !== 0 && event.pointerType === 'mouse') return;\n    // Bỏ qua nếu pointer xuất phát trên control tương tác (toolbar / nav / dots / retry button).\n    // WHY: stage chứa các button con; setPointerCapture đi cùng drag/swipe logic sẽ\n    // \"ăn\" click event của những button đó (như nút Thoát fullscreen / zoom / rotate).\n    if ((event.target as HTMLElement).closest('button, [role=\"button\"]')) return;\n    (event.target as Element).setPointerCapture?.(event.pointerId);\n    this.#activePointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n    if (this.#activePointers.size === 2) {\n      // Bắt đầu pinch — khoá zoom hiện tại làm anchor.\n      const pts = [...this.#activePointers.values()];\n      this.#pinchStartDistance = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);\n      this.#pinchStartZoom = this.#zoom();\n      this.#dragStart = null;\n      this.#swipeStart = null;\n      return;\n    }\n\n    if (this.#zoom() > 1) {\n      // Đã zoom → pointer drag = pan, không phải swipe.\n      this.#isDragging.set(true);\n      this.#dragStart = {\n        x: event.clientX,\n        y: event.clientY,\n        panX: this.#pan().x,\n        panY: this.#pan().y,\n      };\n    } else {\n      // Ở mức 100% → pointer drag được coi là swipe sang ảnh kế.\n      this.#swipeStart = { x: event.clientX, y: event.clientY, t: performance.now() };\n    }\n  }\n\n  onPointerMove(event: PointerEvent): void {\n    if (!this.#activePointers.has(event.pointerId)) return;\n    this.#activePointers.set(event.pointerId, { x: event.clientX, y: event.clientY });\n\n    if (this.#activePointers.size === 2 && this.zoomable() && this.#pinchStartDistance > 0) {\n      const pts = [...this.#activePointers.values()];\n      const dist = Math.hypot(pts[0].x - pts[1].x, pts[0].y - pts[1].y);\n      const ratio = dist / this.#pinchStartDistance;\n      this.#setZoom(this.#pinchStartZoom * ratio);\n      return;\n    }\n\n    if (this.#dragStart && this.#zoom() > 1) {\n      const dx = event.clientX - this.#dragStart.x;\n      const dy = event.clientY - this.#dragStart.y;\n      this.#pan.set({ x: this.#dragStart.panX + dx, y: this.#dragStart.panY + dy });\n    }\n  }\n\n  onPointerUp(event: PointerEvent): void {\n    const start = this.#swipeStart;\n    this.#activePointers.delete(event.pointerId);\n\n    if (this.#activePointers.size < 2) {\n      this.#pinchStartDistance = 0;\n    }\n\n    if (this.#dragStart) {\n      this.#dragStart = null;\n      this.#isDragging.set(false);\n    }\n\n    // Detect swipe — chỉ khi đang ở fit/100% và di chuyển ngang đủ xa.\n    if (start && this.#zoom() <= 1) {\n      const dx = event.clientX - start.x;\n      const dy = event.clientY - start.y;\n      if (Math.abs(dx) >= SdPreviewImage.SWIPE_THRESHOLD && Math.abs(dx) > Math.abs(dy) * 1.5) {\n        this.updateCurrentImage(dx < 0 ? 1 : -1);\n      }\n    }\n    this.#swipeStart = null;\n  }\n\n  onPointerCancel(event: PointerEvent): void {\n    this.#activePointers.delete(event.pointerId);\n    this.#dragStart = null;\n    this.#swipeStart = null;\n    this.#isDragging.set(false);\n    if (this.#activePointers.size < 2) {\n      this.#pinchStartDistance = 0;\n    }\n  }\n\n  onImageDblClick(): void {\n    if (!this.zoomable()) return;\n    if (this.#zoom() === 1) {\n      this.#setZoom(2);\n    } else {\n      this.#resetTransform();\n    }\n  }\n\n  onImageError(): void {\n    const idx = this.#activeIndex();\n    const img = this.#images()[idx];\n    if (!img) return;\n    this.#images.update(arr => {\n      const next = [...arr];\n      next[idx] = { ...img, error: true, loading: false };\n      return next;\n    });\n    // WHY không set stage='error': lỗi từng ảnh không nên ẩn nav/dots/thumb của\n    // cả viewer. Template render placeholder inline ngay trong khung ảnh khi\n    // activeImage().error === true — user vẫn có thể chuyển sang ảnh khác.\n    this.imageError.emit({ index: idx, reason: 'render-failed' });\n  }\n\n  trackByImage(_i: number, item: NormalizedImage): string {\n    return item.id;\n  }\n\n  formatBytes(bytes: number): string {\n    if (!bytes || bytes < 0) return '';\n    if (bytes < 1024) return `${bytes} B`;\n    if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n    if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n    return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;\n  }\n\n  // ==========================================\n  // INTERNALS\n  // ==========================================\n  async #normalizeAndLoad(items: PreviewItem[] | null | undefined, startIndex: number): Promise<void> {\n    const token = ++this.#loadToken;\n\n    // Revoke trước khi map mới — items() đổi liên tiếp sẽ leak nếu không.\n    this.#revokeAllBlobs();\n    this.#resetTransform();\n\n    if (!Array.isArray(items) || items.length === 0) {\n      this.#images.set([]);\n      this.#activeIndex.set(0);\n      this.#stage.set('empty');\n      return;\n    }\n\n    this.#activeIndex.set(Math.max(0, Math.min(startIndex ?? 0, items.length - 1)));\n    this.#stage.set('loading');\n\n    const normalized = await Promise.all(items.map(item => this.#normalize(item)));\n\n    // Race guard: nếu items() đã đổi trong lúc await thì kết quả này là stale.\n    // Lưu ý: blob URL của batch này đã add vào #ownedBlobUrls — batch mới sẽ\n    // revoke chúng khi nó cũng vào #normalizeAndLoad.\n    if (token !== this.#loadToken) {\n      return;\n    }\n\n    const valid = normalized.filter((img): img is NormalizedImage => img !== null);\n    this.#images.set(valid);\n    if (valid.length === 0) {\n      this.#stage.set('empty');\n    } else {\n      const idx = Math.min(this.#activeIndex(), valid.length - 1);\n      this.#activeIndex.set(idx);\n      // WHY luôn 'ready' kể cả khi ảnh đầu bị error: per-image error render\n      // inline để giữ nav + thumb interactive. User vẫn điều hướng được sang\n      // ảnh khác.\n      this.#stage.set('ready');\n    }\n  }\n\n  #setActive(index: number): void {\n    this.#activeIndex.set(index);\n    this.#resetTransform();\n    // WHY luôn set 'ready' (không phụ thuộc img.error): per-image error giờ\n    // render inline trong stage thay vì lật cả stage sang 'error'. Giữ stage\n    // 'ready' để nav/dots/thumbnail/toolbar không bị ẩn.\n    this.#stage.set('ready');\n    this.activeIndexChange.emit(index);\n    // Auto-scroll thumbnail strip — đợi 1 microtask để DOM rendered xong.\n    // WHY scoped query: thumbnail id là global ('sd-preview-thumb-N'); nếu có\n    // > 1 instance trên page sẽ collide. Query trong nativeElement để isolate.\n    queueMicrotask(() => {\n      const el = this.#hostEl.nativeElement.querySelector(`#sd-preview-thumb-${index}`);\n      el?.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n    });\n  }\n\n  #setZoom(value: number): void {\n    const clamped = Math.min(SdPreviewImage.MAX_ZOOM, Math.max(SdPreviewImage.MIN_ZOOM, value));\n    this.#zoom.set(clamped);\n    if (clamped <= 1) {\n      // Khi về fit/100% — pan không còn ý nghĩa, reset để không bị \"lệch\" khi\n      // zoom lại lần sau.\n      this.#pan.set({ x: 0, y: 0 });\n    }\n  }\n\n  #resetTransform(): void {\n    this.#zoom.set(1);\n    this.#rotation.set(0);\n    this.#pan.set({ x: 0, y: 0 });\n  }\n\n  #revokeAllBlobs(): void {\n    for (const url of this.#ownedBlobUrls) {\n      URL.revokeObjectURL(url);\n    }\n    this.#ownedBlobUrls.clear();\n  }\n\n  async #normalize(item: PreviewItem, override?: { name?: string; caption?: string; alt?: string }): Promise<NormalizedImage | null> {\n    try {\n      if (typeof item === 'string') {\n        return await this.#fromUrl(item, override);\n      }\n      if (item instanceof File) {\n        return this.#fromFile(item, override);\n      }\n      if (item && typeof item === 'object') {\n        // Object form: chấp nhận file hoặc url, ưu tiên file vì không cần network.\n        if (item.file) {\n          return this.#fromFile(item.file, { name: item.name, caption: item.caption, alt: item.alt });\n        }\n        if (item.url) {\n          return await this.#fromUrl(item.url, {\n            name: item.name,\n            caption: item.caption,\n            alt: item.alt,\n          });\n        }\n      }\n      return null;\n    } catch (err) {\n      console.error('[sd-preview-image] normalize failed', err);\n      return null;\n    }\n  }\n\n  async #fromUrl(url: string, override?: { name?: string; caption?: string; alt?: string }): Promise<NormalizedImage> {\n    const id = Utilities.generateUuid();\n    // Lấy filename từ phần path cuối — bỏ query string.\n    const baseSrc = url.split('?')[0];\n    const inferredName = override?.name || baseSrc.substring(baseSrc.lastIndexOf('/') + 1) || 'image';\n    try {\n      const res = await fetch(url);\n      if (!res.ok) throw new Error(`HTTP ${res.status}`);\n      const blob = await res.blob();\n      const file = new File([blob], inferredName, { type: blob.type });\n      const blobUrl = URL.createObjectURL(file);\n      this.#ownedBlobUrls.add(blobUrl);\n      return {\n        id,\n        url,\n        blobUrl,\n        name: inferredName,\n        size: file.size,\n        caption: override?.caption,\n        alt: override?.alt,\n        loading: false,\n        error: false,\n      };\n    } catch {\n      // Vẫn trả về record để Artboard G có thể hiển thị Retry — error=true sẽ\n      // được stage signal chuyển sang trạng thái lỗi khi đây là active image.\n      return {\n        id,\n        url,\n        blobUrl: '',\n        name: inferredName,\n        size: 0,\n        caption: override?.caption,\n        alt: override?.alt,\n        loading: false,\n        error: true,\n      };\n    }\n  }\n\n  #fromFile(file: File, override?: { name?: string; caption?: string; alt?: string }): NormalizedImage | null {\n    if (!file.type.startsWith('image/')) {\n      // Silently filter — handoff yêu cầu non-image File bị drop yên lặng để\n      // tương thích với upload form nơi user trộn lẫn ảnh và tài liệu.\n      return null;\n    }\n    const blobUrl = URL.createObjectURL(file);\n    this.#ownedBlobUrls.add(blobUrl);\n    return {\n      id: Utilities.generateUuid(),\n      blobUrl,\n      name: override?.name || file.name,\n      size: file.size,\n      caption: override?.caption,\n      alt: override?.alt,\n      loading: false,\n      error: false,\n    };\n  }\n}\n","<!--\n  Self-contained viewer shell. Component sizes to its parent (width:100%;\n  height:100%) — consumer decides whether to wrap in <sd-modal>,\n  <sd-side-drawer>, a page section, or use inline.\n-->\n<div [ngClass]=\"shellClass()\" role=\"region\">\n  @let _stage = stage();\n  @let _images = images();\n  @let _thumbnailPosition = thumbnailPosition();\n  @let _activeIndex = activeIndex();\n  @let _activeImage = activeImage();\n\n  <!-- ============================================\n       HEADER BAR\n       ============================================ -->\n  @if (_stage !== 'empty' && _activeImage; as img) {\n    <div class=\"sd-preview-header\">\n      <div class=\"sd-preview-header__left\">\n        <sd-icon class=\"sd-preview-header__icon\" fontIcon=\"image\"></sd-icon>\n        <div class=\"sd-preview-header__meta\">\n          <div class=\"sd-preview-header__name T14M\" [title]=\"img.name\">{{ img.name }}</div>\n          @if (img.size) {\n            <div class=\"sd-preview-header__sub\">\n              {{ formatBytes(img.size) }}\n            </div>\n          }\n        </div>\n      </div>\n\n      @if (_images.length > 1) {\n        <div class=\"sd-preview-header__counter\" aria-live=\"polite\">\n          {{ _activeIndex + 1 }} / {{ _images.length }}\n        </div>\n      }\n    </div>\n  } @else if (title()) {\n    <!-- Optional override title even on empty state -->\n    <div class=\"sd-preview-header sd-preview-header--simple\">\n      <div class=\"sd-preview-header__name T14M\">{{ title() }}</div>\n    </div>\n  }\n\n  <!-- ============================================\n       BODY (stage + thumbnails per layout)\n       ============================================ -->\n  <div class=\"sd-preview-body\">\n\n    <!-- STAGE ............................................................... -->\n    <div\n      class=\"sd-preview-stage\"\n      [class.sd-preview-stage--dragging]=\"zoom() > 1\"\n      (wheel)=\"onWheel($event)\"\n      (pointerdown)=\"onPointerDown($event)\"\n      (pointermove)=\"onPointerMove($event)\"\n      (pointerup)=\"onPointerUp($event)\"\n      (pointercancel)=\"onPointerCancel($event)\"\n      (dblclick)=\"onImageDblClick()\">\n\n      @switch (_stage) {\n        @case ('empty') {\n          <div class=\"sd-preview-status\">\n            <div class=\"sd-preview-status__tile sd-preview-status__tile--muted\">\n              <sd-icon fontIcon=\"image_not_supported\"></sd-icon>\n            </div>\n            <div class=\"sd-preview-status__title\">\n              {{ 'core.component.preview-image.no-image' | translate }}\n            </div>\n            <div class=\"sd-preview-status__hint\">\n              {{ 'core.component.preview-image.no-image-hint' | translate }}\n            </div>\n          </div>\n        }\n        @case ('loading') {\n          <div class=\"sd-preview-status\">\n            <div class=\"sd-preview-spinner\" role=\"progressbar\"></div>\n            <div class=\"sd-preview-status__hint\">\n              {{ 'core.component.preview-image.loading' | translate }}\n            </div>\n          </div>\n        }\n        @default {\n          @if (_activeImage; as img) {\n            @if (img.loading) {\n              <!-- Per-image loading (retry inline) — giữ nav/dots/thumbs visible -->\n              <div class=\"sd-preview-image-loading\" role=\"status\"\n                   [attr.aria-label]=\"'core.component.preview-image.loading' | translate\">\n                <div class=\"sd-preview-spinner\"></div>\n                <div class=\"sd-preview-status__hint\">\n                  {{ 'core.component.preview-image.loading' | translate }}\n                </div>\n              </div>\n            } @else if (img.error) {\n              <!-- Inline broken-image placeholder — giữ nav/dots/thumbs visible -->\n              <div class=\"sd-preview-image-broken\" role=\"img\"\n                   [attr.aria-label]=\"'core.component.preview-image.load-error' | translate\">\n                <div class=\"sd-preview-status__tile sd-preview-status__tile--danger\">\n                  <sd-icon fontIcon=\"broken_image\"></sd-icon>\n                </div>\n                <div class=\"sd-preview-status__title\">\n                  {{ 'core.component.preview-image.load-error' | translate }}\n                </div>\n                <div class=\"sd-preview-status__hint\">\n                  {{ 'core.component.preview-image.load-error-hint' | translate }}\n                </div>\n                <button type=\"button\" class=\"sd-preview-btn-primary\" (click)=\"retryActive()\" [attr.data-autoId]=\"autoIdRetry()\">\n                  <sd-icon fontIcon=\"refresh\"></sd-icon>\n                  <span>{{ 'core.component.preview-image.retry' | translate }}</span>\n                </button>\n              </div>\n            } @else {\n              <img\n                class=\"sd-preview-image\"\n                [src]=\"img.blobUrl || img.url\"\n                [alt]=\"img.alt || img.name\"\n                [style.transform]=\"imageTransform()\"\n                (error)=\"onImageError()\"\n                draggable=\"false\" />\n\n              @if (img.caption) {\n                <div class=\"sd-preview-caption\">{{ img.caption }}</div>\n              }\n            }\n          }\n        }\n      }\n\n      <!-- KEYBOARD HINT ............................................. -->\n      @if (_stage === 'ready' && _images.length > 1) {\n        <div class=\"sd-preview-kbd-hint\" aria-hidden=\"true\">\n          <span class=\"sd-preview-kbd\">←</span>\n          <span class=\"sd-preview-kbd\">→</span>\n          <span class=\"sd-preview-kbd-text\">{{ 'core.component.preview-image.kbd-hint-nav' | translate }}</span>\n        </div>\n      }\n\n      <!-- NAV ARROWS ............................................. -->\n      @if (_stage === 'ready' && _images.length > 1) {\n        <button\n          type=\"button\"\n          class=\"sd-preview-nav sd-preview-nav--prev\"\n          [disabled]=\"!hasPrev()\"\n          [attr.aria-label]=\"'core.component.preview-image.prev' | translate\"\n          [attr.data-autoId]=\"autoIdPrev()\"\n          (click)=\"updateCurrentImage(-1)\">\n          <sd-icon fontIcon=\"chevron_left\"></sd-icon>\n        </button>\n        <button\n          type=\"button\"\n          class=\"sd-preview-nav sd-preview-nav--next\"\n          [disabled]=\"!hasNext()\"\n          [attr.aria-label]=\"'core.component.preview-image.next' | translate\"\n          [attr.data-autoId]=\"autoIdNext()\"\n          (click)=\"updateCurrentImage(1)\">\n          <sd-icon fontIcon=\"chevron_right\"></sd-icon>\n        </button>\n      }\n\n      <!-- DOTS INDICATOR ......................................... -->\n      @if (_thumbnailPosition === 'dots' && _stage === 'ready' && _images.length > 1) {\n        <div class=\"sd-preview-dots\" role=\"tablist\">\n          @for (img of _images; track img.id; let i = $index) {\n            <button\n              type=\"button\"\n              class=\"sd-preview-dot\"\n              [class.sd-preview-dot--active]=\"i === _activeIndex\"\n              [attr.aria-label]=\"'core.component.preview-image.next' | translate\"\n              [attr.data-autoId]=\"autoIdDot(i)\"\n              (click)=\"onClickThumbnailImage(i)\"></button>\n          }\n        </div>\n      }\n\n      <!-- FLOATING TOOLBAR ....................................... -->\n      @if (showToolbar() && _stage === 'ready') {\n        <div class=\"sd-preview-toolbar\" role=\"toolbar\">\n          @if (zoomable()) {\n            <button\n              type=\"button\"\n              class=\"sd-preview-toolbar__btn\"\n              [attr.aria-label]=\"'core.component.preview-image.zoom-out' | translate\"\n              [attr.title]=\"'core.component.preview-image.zoom-out' | translate\"\n              [attr.data-autoId]=\"autoIdZoomOut()\"\n              (click)=\"zoomOut()\">\n              <sd-icon fontIcon=\"zoom_out\"></sd-icon>\n            </button>\n            <span class=\"sd-preview-toolbar__readout\">{{ zoomPercent() }}%</span>\n            <button\n              type=\"button\"\n              class=\"sd-preview-toolbar__btn\"\n              [attr.aria-label]=\"'core.component.preview-image.zoom-in' | translate\"\n              [attr.title]=\"'core.component.preview-image.zoom-in' | translate\"\n              [attr.data-autoId]=\"autoIdZoomIn()\"\n              (click)=\"zoomIn()\">\n              <sd-icon fontIcon=\"zoom_in\"></sd-icon>\n            </button>\n            <span class=\"sd-preview-toolbar__divider\"></span>\n          }\n          <button\n            type=\"button\"\n            class=\"sd-preview-toolbar__btn sd-preview-toolbar__btn--with-label\"\n            [attr.aria-label]=\"'core.component.preview-image.fit' | translate\"\n            [attr.data-autoId]=\"autoIdFit()\"\n            (click)=\"fitToScreen()\">\n            <sd-icon fontIcon=\"fit_screen\"></sd-icon>\n            <span class=\"sd-preview-toolbar__btn-label\">{{ 'core.component.preview-image.fit' | translate }}</span>\n          </button>\n          <button\n            type=\"button\"\n            class=\"sd-preview-toolbar__btn\"\n            [attr.aria-label]=\"'core.component.preview-image.rotate' | translate\"\n            [attr.title]=\"'core.component.preview-image.rotate' | translate\"\n            [attr.data-autoId]=\"autoIdRotate()\"\n            (click)=\"rotate('right')\">\n            <sd-icon fontIcon=\"rotate_right\"></sd-icon>\n          </button>\n          <span class=\"sd-preview-toolbar__divider\"></span>\n          @if (downloadable()) {\n            <button\n              type=\"button\"\n              class=\"sd-preview-toolbar__btn\"\n              [attr.aria-label]=\"'core.component.preview-image.download' | translate\"\n              [attr.title]=\"'core.component.preview-image.download' | translate\"\n              [attr.data-autoId]=\"autoIdDownload()\"\n              (click)=\"downloadCurrent()\">\n              <sd-icon fontIcon=\"download\"></sd-icon>\n            </button>\n          }\n          <button\n            type=\"button\"\n            class=\"sd-preview-toolbar__btn\"\n            [attr.aria-label]=\"'core.component.preview-image.fullscreen' | translate\"\n            [attr.title]=\"'core.component.preview-image.fullscreen' | translate\"\n            [attr.data-autoId]=\"autoIdFullscreen()\"\n            (click)=\"toggleFullscreen()\">\n            <sd-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></sd-icon>\n          </button>\n        </div>\n      }\n    </div>\n\n    <!-- THUMBNAIL STRIP .................................................... -->\n    @if (\n      _stage === 'ready' &&\n      _images.length > 1 &&\n      _thumbnailPosition !== 'none' &&\n      _thumbnailPosition !== 'dots'\n    ) {\n      <div\n        class=\"sd-preview-thumbs\"\n        [class.sd-preview-thumbs--vertical]=\"_thumbnailPosition === 'left' || _thumbnailPosition === 'right'\">\n        @for (img of _images; track trackByImage($index, img); let i = $index) {\n          <button\n            type=\"button\"\n            class=\"sd-preview-thumb\"\n            [class.sd-preview-thumb--active]=\"i === _activeIndex\"\n            [id]=\"'sd-preview-thumb-' + i\"\n            [attr.aria-label]=\"img.name\"\n            [attr.aria-current]=\"i === _activeIndex ? 'true' : null\"\n            [attr.data-autoId]=\"autoIdThumb(i)\"\n            (click)=\"onClickThumbnailImage(i)\">\n            @if (img.error) {\n              <div class=\"sd-preview-thumb__broken\">\n                <sd-icon fontIcon=\"broken_image\"></sd-icon>\n              </div>\n            } @else {\n              <img class=\"sd-preview-thumb__img\" [src]=\"img.blobUrl || img.url\" [alt]=\"img.alt || img.name\" />\n            }\n            <span class=\"sd-preview-thumb__badge\">{{ i + 1 }}</span>\n            @if (_thumbnailPosition === 'right' || _thumbnailPosition === 'left') {\n              <span class=\"sd-preview-thumb__name\" [title]=\"img.name\">{{ img.name }}</span>\n            }\n          </button>\n        }\n      </div>\n    }\n  </div>\n</div>\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, InjectionToken, PLATFORM_ID } from '@angular/core';\n\nexport interface SdPdfIntersectionEntry {\n  readonly target: Element;\n  readonly isIntersecting: boolean;\n}\n\nexport interface SdPdfBrowserAdapter {\n  readonly isBrowser: boolean;\n  /** The platform can trigger an anchor download for an existing URL. */\n  readonly canDownloadUrl: boolean;\n  /** The platform can create/revoke an object URL and then download it. */\n  readonly canDownloadBlob: boolean;\n  readonly canFullscreen: boolean;\n  isFile(value: unknown): value is File;\n  isBlob(value: unknown): value is Blob;\n  createPdfBlob(data: Uint8Array): Blob | null;\n  createObjectUrl(blob: Blob): string | null;\n  revokeObjectUrl(url: string): void;\n  download(href: string, filename: string): boolean;\n  createElement<K extends keyof HTMLElementTagNameMap>(tagName: K): HTMLElementTagNameMap[K] | null;\n  createImage(): HTMLImageElement | null;\n  listenFullscreen(host: HTMLElement, listener: (active: boolean) => void): () => void;\n  toggleFullscreen(host: HTMLElement): Promise<void>;\n  observeResize(element: Element, listener: () => void): () => void;\n  observeIntersections(\n    elements: readonly Element[],\n    listener: (entries: readonly SdPdfIntersectionEntry[]) => void,\n    options?: IntersectionObserverInit\n  ): () => void;\n  scheduleFrame(callback: FrameRequestCallback): number | null;\n  cancelFrame(handle: number | null): void;\n}\n\nclass SdPdfDocumentBrowserAdapter implements SdPdfBrowserAdapter {\n  readonly isBrowser: boolean;\n  readonly canDownloadUrl: boolean;\n  readonly canDownloadBlob: boolean;\n  readonly canFullscreen: boolean;\n\n  constructor(\n    private readonly document: Document,\n    platformId: object\n  ) {\n    this.isBrowser = isPlatformBrowser(platformId) && !!document.defaultView;\n    this.canDownloadUrl = this.isBrowser && !!document.body && 'download' in document.createElement('a');\n    const view = document.defaultView;\n    this.canDownloadBlob =\n      this.canDownloadUrl &&\n      typeof view?.Blob === 'function' &&\n      typeof view.URL?.createObjectURL === 'function' &&\n      typeof view.URL?.revokeObjectURL === 'function';\n    this.canFullscreen =\n      this.isBrowser && typeof document.documentElement?.requestFullscreen === 'function' && typeof document.exitFullscreen === 'function';\n  }\n\n  isFile(value: unknown): value is File {\n    const FileCtor = this.document.defaultView?.File;\n    return this.isBrowser && !!FileCtor && value instanceof FileCtor;\n  }\n\n  isBlob(value: unknown): value is Blob {\n    const BlobCtor = this.document.defaultView?.Blob;\n    return this.isBrowser && !!BlobCtor && value instanceof BlobCtor;\n  }\n\n  createPdfBlob(data: Uint8Array): Blob | null {\n    const BlobCtor = this.document.defaultView?.Blob;\n    if (!this.isBrowser || !BlobCtor) return null;\n    return new BlobCtor([new Uint8Array(data)], { type: 'application/pdf' });\n  }\n\n  createObjectUrl(blob: Blob): string | null {\n    const urlApi = this.document.defaultView?.URL;\n    return this.isBrowser && urlApi?.createObjectURL ? urlApi.createObjectURL(blob) : null;\n  }\n\n  revokeObjectUrl(url: string): void {\n    if (!this.isBrowser) return;\n    this.document.defaultView?.URL?.revokeObjectURL?.(url);\n  }\n\n  download(href: string, filename: string): boolean {\n    if (!this.canDownloadUrl || !this.document.body) return false;\n    const anchor = this.document.createElement('a');\n    anchor.href = href;\n    anchor.download = filename;\n    anchor.hidden = true;\n    this.document.body.appendChild(anchor);\n    anchor.click();\n    anchor.remove();\n    return true;\n  }\n\n  createElement<K extends keyof HTMLElementTagNameMap>(tagName: K): HTMLElementTagNameMap[K] | null {\n    return this.isBrowser ? this.document.createElement(tagName) : null;\n  }\n\n  createImage(): HTMLImageElement | null {\n    return this.createElement('img');\n  }\n\n  listenFullscreen(host: HTMLElement, listener: (active: boolean) => void): () => void {\n    if (!this.isBrowser) return () => undefined;\n    const onChange = (): void => listener(this.document.fullscreenElement === host);\n    this.document.addEventListener('fullscreenchange', onChange);\n    onChange();\n    return () => this.document.removeEventListener('fullscreenchange', onChange);\n  }\n\n  async toggleFullscreen(host: HTMLElement): Promise<void> {\n    if (!this.canFullscreen) return;\n    if (this.document.fullscreenElement) {\n      await this.document.exitFullscreen?.();\n      return;\n    }\n    await host.requestFullscreen?.();\n  }\n\n  observeResize(element: Element, listener: () => void): () => void {\n    const ResizeObserverCtor = this.document.defaultView?.ResizeObserver;\n    if (!this.isBrowser || !ResizeObserverCtor) return () => undefined;\n    const observer = new ResizeObserverCtor(() => listener());\n    observer.observe(element);\n    return () => observer.disconnect();\n  }\n\n  observeIntersections(\n    elements: readonly Element[],\n    listener: (entries: readonly SdPdfIntersectionEntry[]) => void,\n    options?: IntersectionObserverInit\n  ): () => void {\n    const IntersectionObserverCtor = this.document.defaultView?.IntersectionObserver;\n    if (!this.isBrowser || elements.length === 0) return () => undefined;\n    if (!IntersectionObserverCtor) {\n      listener(elements.map(target => ({ target, isIntersecting: true })));\n      return () => undefined;\n    }\n    const observer = new IntersectionObserverCtor(entries => listener(entries), options);\n    for (const element of elements) observer.observe(element);\n    return () => observer.disconnect();\n  }\n\n  scheduleFrame(callback: FrameRequestCallback): number | null {\n    const view = this.document.defaultView;\n    if (!this.isBrowser || !view) return null;\n    return view.requestAnimationFrame ? view.requestAnimationFrame(callback) : view.setTimeout(() => callback(view.performance.now()), 0);\n  }\n\n  cancelFrame(handle: number | null): void {\n    if (handle === null || !this.isBrowser) return;\n    this.document.defaultView?.cancelAnimationFrame?.(handle);\n    this.document.defaultView?.clearTimeout(handle);\n  }\n}\n\nexport const SD_PDF_BROWSER_ADAPTER = new InjectionToken<SdPdfBrowserAdapter>('SD_PDF_BROWSER_ADAPTER', {\n  providedIn: 'root',\n  factory: () => new SdPdfDocumentBrowserAdapter(inject(DOCUMENT), inject(PLATFORM_ID)),\n});\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { inject, InjectionToken, PLATFORM_ID } from '@angular/core';\n\nexport interface SdPdfPrintJob {\n  readonly finished: Promise<void>;\n  cancel(): void;\n}\n\nexport interface SdPdfPrintAdapter {\n  readonly isSupported: boolean;\n  start(data: Uint8Array, filename: string): SdPdfPrintJob | null;\n}\n\nclass SdPdfIframePrintAdapter implements SdPdfPrintAdapter {\n  readonly #isBrowser: boolean;\n  readonly isSupported: boolean;\n\n  constructor(\n    private readonly document: Document,\n    platformId: object\n  ) {\n    this.#isBrowser = isPlatformBrowser(platformId) && !!document.defaultView;\n    const view = document.defaultView;\n    this.isSupported =\n      this.#isBrowser &&\n      !!view?.Blob &&\n      typeof view.URL?.createObjectURL === 'function' &&\n      typeof view.URL?.revokeObjectURL === 'function' &&\n      !!document.body;\n  }\n\n  start(data: Uint8Array, filename: string): SdPdfPrintJob | null {\n    const view = this.document.defaultView;\n    const BlobCtor = view?.Blob;\n    const urlApi = view?.URL;\n    if (\n      !this.isSupported ||\n      !view ||\n      !BlobCtor ||\n      typeof urlApi?.createObjectURL !== 'function' ||\n      typeof urlApi.revokeObjectURL !== 'function' ||\n      !this.document.body\n    ) {\n      return null;\n    }\n\n    const blob = new BlobCtor([new Uint8Array(data)], { type: 'application/pdf' });\n    const objectUrl = urlApi.createObjectURL(blob);\n    const frame = this.document.createElement('iframe');\n    frame.hidden = true;\n    frame.title = filename;\n\n    let settled = false;\n    let timeoutHandle: number | null = null;\n    let resolveFinished: () => void = () => undefined;\n    let rejectFinished: (reason: Error) => void = () => undefined;\n    const finished = new Promise<void>((resolve, reject) => {\n      resolveFinished = resolve;\n      rejectFinished = reject;\n    });\n\n    const attemptCleanup = (operation: () => void): void => {\n      try {\n        operation();\n      } catch {\n        // Cleanup is best-effort; every remaining step and promise settlement must still run.\n      }\n    };\n    const cleanup = (): void => {\n      if (timeoutHandle !== null) attemptCleanup(() => view.clearTimeout(timeoutHandle!));\n      attemptCleanup(() => frame.contentWindow?.removeEventListener('afterprint', complete));\n      attemptCleanup(() => frame.removeEventListener('load', onLoad));\n      attemptCleanup(() => frame.removeEventListener('error', onError));\n      attemptCleanup(() => frame.remove());\n      attemptCleanup(() => urlApi.revokeObjectURL(objectUrl));\n    };\n    const complete = (): void => {\n      if (settled) return;\n      settled = true;\n      cleanup();\n      resolveFinished();\n    };\n    const fail = (message: string): void => {\n      if (settled) return;\n      settled = true;\n      cleanup();\n      rejectFinished(new Error(message));\n    };\n    const onError = (): void => fail('Unable to load the PDF print frame.');\n    const onLoad = (): void => {\n      const printWindow = frame.contentWindow;\n      if (!printWindow?.print) {\n        fail('Printing is unavailable in this browser.');\n        return;\n      }\n      printWindow.addEventListener('afterprint', complete, { once: true });\n      timeoutHandle = view.setTimeout(complete, 30_000);\n      try {\n        printWindow.focus();\n        printWindow.print();\n      } catch {\n        fail('The browser blocked the PDF print dialog.');\n      }\n    };\n\n    frame.addEventListener('load', onLoad, { once: true });\n    frame.addEventListener('error', onError, { once: true });\n    frame.src = objectUrl;\n    this.document.body.appendChild(frame);\n\n    return {\n      finished,\n      cancel: complete,\n    };\n  }\n}\n\nexport const SD_PDF_PRINT_ADAPTER = new InjectionToken<SdPdfPrintAdapter>('SD_PDF_PRINT_ADAPTER', {\n  providedIn: 'root',\n  factory: () => new SdPdfIframePrintAdapter(inject(DOCUMENT), inject(PLATFORM_ID)),\n});\n","import { InjectionToken } from '@angular/core';\nimport * as pdfjsLib from 'pdfjs-dist';\n\nexport interface SdPdfRenderTask {\n  readonly promise: Promise<void>;\n  cancel(): void;\n}\n\nexport interface SdPdfViewport {\n  readonly width: number;\n  readonly height: number;\n}\n\nexport interface SdPdfTextItem {\n  readonly str: string;\n}\n\nexport interface SdPdfTextContent {\n  readonly items: readonly unknown[];\n}\n\nexport interface SdPdfPageProxy {\n  getViewport(parameters: { scale: number; rotation?: number }): SdPdfViewport;\n  render(parameters: { canvasContext: CanvasRenderingContext2D; viewport: SdPdfViewport }): SdPdfRenderTask;\n  getTextContent(): Promise<SdPdfTextContent | unknown>;\n  cleanup(): void;\n}\n\nexport interface SdPdfReference {\n  readonly num: number;\n  readonly gen: number;\n}\n\nexport type SdPdfDestination = string | readonly unknown[] | null;\n\nexport interface SdPdfRawOutlineItem {\n  readonly title?: string;\n  readonly dest?: SdPdfDestination;\n  readonly url?: string | null;\n  readonly items?: readonly SdPdfRawOutlineItem[];\n}\n\nexport interface SdPdfDocumentProxy {\n  readonly numPages: number;\n  getPage(pageNumber: number): Promise<SdPdfPageProxy>;\n  getMetadata(): Promise<{\n    readonly info?: { readonly Title?: string; readonly Author?: string; readonly Subject?: string };\n  }>;\n  getOutline(): Promise<readonly SdPdfRawOutlineItem[] | null>;\n  getDestination(name: string): Promise<readonly unknown[] | null>;\n  getPageIndex(reference: SdPdfReference): Promise<number>;\n  cachedPageNumber(reference: SdPdfReference): number | null;\n  getData(): Promise<Uint8Array>;\n  destroy(): Promise<void>;\n}\n\nexport interface SdPdfLoadingTask {\n  readonly promise: Promise<SdPdfDocumentProxy>;\n  onProgress?: (progress: { loaded: number; total: number }) => void;\n  destroy?(): Promise<void> | void;\n}\n\nexport interface SdPdfDocumentSpec {\n  url?: string;\n  data?: Uint8Array;\n  httpHeaders?: Record<string, string>;\n  withCredentials?: boolean;\n  password?: string;\n}\n\nexport interface SdPdfJsLib {\n  getDocument(spec: SdPdfDocumentSpec): SdPdfLoadingTask;\n  readonly GlobalWorkerOptions: { workerSrc: string };\n}\n\nfunction isSdPdfJsLib(value: unknown): value is SdPdfJsLib {\n  if (!value || typeof value !== 'object') return false;\n  const candidate = value as { getDocument?: unknown; GlobalWorkerOptions?: { workerSrc?: unknown } };\n  return typeof candidate.getDocument === 'function' && typeof candidate.GlobalWorkerOptions?.workerSrc === 'string';\n}\n\nexport const SD_PDFJS_LIB = new InjectionToken<SdPdfJsLib>('SD_PDFJS_LIB', {\n  providedIn: 'root',\n  factory: (): SdPdfJsLib => {\n    if (!pdfjsLib.GlobalWorkerOptions.workerSrc) {\n      pdfjsLib.GlobalWorkerOptions.workerSrc = new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url).toString();\n    }\n    const candidate: unknown = pdfjsLib;\n    if (!isSdPdfJsLib(candidate)) {\n      throw new Error('The installed pdfjs-dist build does not expose getDocument().');\n    }\n    return candidate;\n  },\n});\n","import { CommonModule } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  HostListener,\n  afterNextRender,\n  computed,\n  effect,\n  inject,\n  input,\n  output,\n  signal,\n  viewChild,\n  viewChildren,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport {\n  PdfErrorEvent,\n  PdfErrorReason,\n  PdfLoadEvent,\n  PdfMeta,\n  PdfOutlineItem,\n  PdfScrollMode,\n  PdfSearchResult,\n  PdfSearchState,\n  PdfSidebarMode,\n  PdfSource,\n  PdfStage,\n  PdfZoomMode,\n  PreviewTheme,\n} from './preview-pdf.types';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SD_PDF_BROWSER_ADAPTER } from './preview-pdf.browser';\nimport { SD_PDF_PRINT_ADAPTER, SdPdfPrintJob } from './preview-pdf.print';\nimport {\n  SD_PDFJS_LIB,\n  SdPdfDocumentProxy,\n  SdPdfDocumentSpec,\n  SdPdfLoadingTask,\n  SdPdfPageProxy,\n  SdPdfRawOutlineItem,\n  SdPdfReference,\n  SdPdfRenderTask,\n  SdPdfViewport,\n} from './preview-pdf.pdfjs';\n\nexport { SD_PDFJS_LIB } from './preview-pdf.pdfjs';\nexport type { SdPdfJsLib } from './preview-pdf.pdfjs';\n\nlet nextPdfPreviewInstanceId = 0;\n\ninterface PdfOutlineRow {\n  readonly item: PdfOutlineItem;\n  readonly level: number;\n  readonly parentId: string | null;\n}\n\ninterface PdfOutlineTraversal {\n  nodes: number;\n}\n\ninterface PdfPageTextScan {\n  readonly snapshot: ReadonlyMap<number, string>;\n  readonly staged: Map<number, string>;\n}\n\ninterface PdfSearchRequest {\n  readonly token: number;\n  readonly doc: SdPdfDocumentProxy;\n  readonly expression: RegExp;\n  readonly resolve: (resultCount: number) => void;\n}\n\ntype PdfThumbnailSlotState = 'new' | 'queued' | 'active' | 'released';\n\ninterface PdfThumbnailWork {\n  readonly loadToken: number;\n  cancelled: boolean;\n  renderTask: SdPdfRenderTask | null;\n  slotState: PdfThumbnailSlotState;\n  resumeSlot: ((acquired: boolean) => void) | null;\n}\n\nclass PdfHeightIndex {\n  readonly #gap: number;\n  #tree: number[] = [0];\n  #values: number[] = [];\n\n  constructor(gap: number) {\n    this.#gap = gap;\n  }\n\n  reset(heights: readonly number[]): void {\n    this.#values = heights.map((height, index) => height + (index < heights.length - 1 ? this.#gap : 0));\n    this.#tree = Array.from({ length: this.#values.length + 1 }, () => 0);\n    for (let index = 1; index < this.#tree.length; index++) {\n      this.#tree[index] += this.#values[index - 1];\n      const parent = index + (index & -index);\n      if (parent < this.#tree.length) this.#tree[parent] += this.#tree[index];\n    }\n  }\n\n  updateHeight(index: number, height: number): void {\n    if (index < 0 || index >= this.#values.length) return;\n    const next = height + (index < this.#values.length - 1 ? this.#gap : 0);\n    const delta = next - this.#values[index];\n    this.#values[index] = next;\n    for (let cursor = index + 1; cursor < this.#tree.length; cursor += cursor & -cursor) this.#tree[cursor] += delta;\n  }\n\n  offsetAt(index: number): number {\n    let sum = 0;\n    for (let cursor = Math.max(0, Math.min(index, this.#values.length)); cursor > 0; cursor -= cursor & -cursor) {\n      sum += this.#tree[cursor];\n    }\n    return sum;\n  }\n\n  total(): number {\n    return this.offsetAt(this.#values.length);\n  }\n\n  indexAt(offset: number): number {\n    if (this.#values.length === 0) return 0;\n    const bounded = Math.max(0, Math.min(offset, this.total()));\n    let index = 0;\n    let prefix = 0;\n    let bit = 1;\n    while (bit * 2 < this.#tree.length) bit *= 2;\n    for (; bit > 0; bit >>= 1) {\n      const next = index + bit;\n      if (next < this.#tree.length && prefix + this.#tree[next] <= bounded) {\n        index = next;\n        prefix += this.#tree[next];\n      }\n    }\n    return Math.min(index, this.#values.length - 1);\n  }\n}\n\ntype PdfSidebarTabMode = Exclude<PdfSidebarMode, 'none'>;\n\n@Component({\n  selector: 'sd-preview-pdf',\n  standalone: true,\n  imports: [SdIcon, CommonModule, FormsModule, TranslatePipe],\n  templateUrl: './preview-pdf.component.html',\n  styleUrl: './preview-pdf.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  // WHY tabindex='0': host phải focusable để @HostListener('keydown') nhận event\n  // mà không cần bind document. Mirror the preview-image pattern — consumer\n  // (modal/drawer/page) chỉ cần thả component vào DOM.\n  host: {\n    tabindex: '0',\n    class: 'sd-preview-pdf-host',\n    // WHY data-theme attribute: SCSS uses :host([data-theme=\"light\"]) to swap\n    // CSS custom properties — declarative, devtools-visible, no class-name\n    // collision with consumer styling.\n    '[attr.data-theme]': 'theme()',\n    '[class.sd-preview-pdf-host--fullscreen]': 'isFullscreen()',\n  },\n})\nexport class SdPreviewPdf {\n  // ==========================================\n  // CONSTANTS\n  // ==========================================\n  // Dải zoom hữu dụng cho viewer PDF. Dưới 25% chữ thành chấm, trên 400% là\n  // raster bị pixelated nặng (canvas + DPR vẫn có giới hạn). Trùng dải của\n  // preview-image để consumer làm quen với 1 spec duy nhất.\n  static readonly MIN_ZOOM = 0.25;\n  static readonly MAX_ZOOM = 4;\n  static readonly ZOOM_STEP = 0.1;\n  static readonly OUTLINE_MAX_DEPTH = 64;\n  static readonly OUTLINE_MAX_NODES = 10_000;\n  static readonly MAX_SEARCH_RESULTS = 1000;\n  static readonly MAX_PAGE_TEXT_CACHE_PAGES = 128;\n  static readonly THUMBNAIL_WINDOW_SIZE = 48;\n  static readonly THUMBNAIL_ITEM_HEIGHT = 220;\n  static readonly MAX_THUMBNAIL_CACHE_ENTRIES = 96;\n  private static readonly MAX_CONCURRENT_THUMBNAIL_WORK = 4;\n  static readonly MAX_CANVAS_DIMENSION = 8192;\n  static readonly MAX_CANVAS_PIXELS = 16_777_216;\n\n  // ==========================================\n  // DI\n  // ==========================================\n  readonly #hostEl = inject<ElementRef<HTMLElement>>(ElementRef);\n  readonly #destroyRef = inject(DestroyRef);\n  readonly #pdfjs = inject(SD_PDFJS_LIB);\n  readonly #browser = inject(SD_PDF_BROWSER_ADAPTER);\n  readonly #printAdapter = inject(SD_PDF_PRINT_ADAPTER);\n  readonly #instanceId = `sd-preview-pdf-${++nextPdfPreviewInstanceId}`;\n\n  // ==========================================\n  // VIEW CHILDREN\n  // WHY `protected readonly` (not `#private`): Angular's `viewChild()` query\n  // function emits a decorator-equivalent metadata that the compiler can't\n  // see through ES private fields (NG1053). `protected` keeps them invisible\n  // to consumers but accessible to the template.\n  // ==========================================\n  protected readonly pageCanvasRef = viewChild<ElementRef<HTMLCanvasElement>>('pageCanvas');\n  protected readonly stageEl = viewChild<ElementRef<HTMLElement>>('stageRef');\n  protected readonly pageInputRef = viewChild<ElementRef<HTMLInputElement>>('pageInput');\n  protected readonly searchInputRef = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n  protected readonly sidebarContentRef = viewChild<ElementRef<HTMLElement>>('sidebarContent');\n  protected readonly outlineItemRefs = viewChildren<ElementRef<HTMLElement>>('outlineItem');\n  protected readonly sidebarTabRefs = viewChildren<ElementRef<HTMLButtonElement>>('sidebarTab');\n  protected readonly continuousCanvases = viewChildren<ElementRef<HTMLCanvasElement>>('continuousCanvas');\n  // Every thumbnail <canvas> in the sidebar — populated when sidebar is open +\n  // mode==='thumbnails'. We feed these to the IntersectionObserver below so a\n  // thumb only renders when it scrolls into the viewport (lazy fill).\n  protected readonly thumbCanvases = viewChildren<ElementRef<HTMLCanvasElement>>('thumbCanvas');\n\n  // ==========================================\n  // INPUTS (signal-based, Angular 19 style)\n  // ==========================================\n  // autoId prefix `preview-pdf-`. Per-element child autoIds derive `${autoId}-{suffix}`.\n  readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n  readonly autoId = computed(() => (this.autoIdInput() ? `components-preview-pdf-${this.autoIdInput()}` : undefined));\n\n  readonly #childAutoId = (suffix: string): string | undefined => {\n    return this.autoId() ? `${this.autoId()}-${suffix}` : undefined;\n  };\n\n  // Page navigation\n  readonly autoIdFirst = computed(() => this.#childAutoId('first'));\n  readonly autoIdPrev = computed(() => this.#childAutoId('prev'));\n  readonly autoIdNext = computed(() => this.#childAutoId('next'));\n  readonly autoIdLast = computed(() => this.#childAutoId('last'));\n  readonly autoIdPageInput = computed(() => this.#childAutoId('page-input'));\n  // Zoom\n  readonly autoIdZoomIn = computed(() => this.#childAutoId('zoom-in'));\n  readonly autoIdZoomOut = computed(() => this.#childAutoId('zoom-out'));\n  readonly autoIdZoomReadout = computed(() => this.#childAutoId('zoom-readout'));\n  // Modes\n  readonly autoIdFitPage = computed(() => this.#childAutoId('fit-page'));\n  readonly autoIdFitWidth = computed(() => this.#childAutoId('fit-width'));\n  readonly autoIdRotate = computed(() => this.#childAutoId('rotate'));\n  readonly autoIdScrollMode = computed(() => this.#childAutoId('scroll-mode'));\n  // Header actions\n  readonly autoIdSearchToggle = computed(() => this.#childAutoId('search'));\n  readonly autoIdPrint = computed(() => this.#childAutoId('print'));\n  readonly autoIdDownload = computed(() => this.#childAutoId('download'));\n  readonly autoIdFullscreen = computed(() => this.#childAutoId('fullscreen'));\n  readonly autoIdSidebarToggle = computed(() => this.#childAutoId('sidebar-toggle'));\n  // Sidebar tabs\n  readonly autoIdTabThumbnails = computed(() => this.#childAutoId('tab-thumbnails'));\n  readonly autoIdTabOutline = computed(() => this.#childAutoId('tab-outline'));\n  readonly autoIdTabSearch = computed(() => this.#childAutoId('tab-search'));\n  readonly sidebarPanelId = computed(() => this.#childAutoId('sidebar-panel') ?? `${this.#instanceId}-sidebar-panel`);\n  readonly sidebarRegionId = computed(() => this.#childAutoId('sidebar') ?? `${this.#instanceId}-sidebar`);\n  readonly searchBarId = computed(() => this.#childAutoId('searchbar') ?? `${this.#instanceId}-searchbar`);\n  readonly tabThumbnailsId = computed(() => this.#childAutoId('tab-thumbnails') ?? `${this.#instanceId}-tab-thumbnails`);\n  readonly tabOutlineId = computed(() => this.#childAutoId('tab-outline') ?? `${this.#instanceId}-tab-outline`);\n  readonly tabSearchId = computed(() => this.#childAutoId('tab-search') ?? `${this.#instanceId}-tab-search`);\n  readonly sidebarActiveTabId = computed(() => {\n    switch (this.#sidebarModeInternal()) {\n      case 'outline':\n        return this.tabOutlineId();\n      case 'search':\n        return this.tabSearchId();\n      default:\n        return this.tabThumbnailsId();\n    }\n  });\n  // Search bar\n  readonly autoIdSearchInput = computed(() => this.#childAutoId('search-input'));\n  readonly autoIdSearchNext = computed(() => this.#childAutoId('search-next'));\n  readonly autoIdSearchPrev = computed(() => this.#childAutoId('search-prev'));\n  readonly autoIdSearchCase = computed(() => this.#childAutoId('search-case'));\n  readonly autoIdSearchWhole = computed(() => this.#childAutoId('search-whole'));\n  readonly autoIdSearchClose = computed(() => this.#childAutoId('search-close'));\n  // Retry (error state)\n  readonly autoIdRetry = computed(() => this.#childAutoId('retry'));\n  // Per-index helpers (thumb + search result)\n  readonly autoIdThumb = (i: number): string | undefined => this.#childAutoId(`thumb-${i}`);\n  readonly autoIdResult = (i: number): string | undefined => this.#childAutoId(`result-${i}`);\n\n  readonly source = input<PdfSource | null>(null);\n  readonly title = input<string | undefined>(undefined);\n  readonly startPage = input(1);\n  readonly initialZoom = input<PdfZoomMode>('page-fit');\n  readonly sidebar = input<PdfSidebarMode>('thumbnails');\n  readonly sidebarOpen = input(true);\n  readonly scrollMode = input<PdfScrollMode>('page');\n  readonly showToolbar = input(true);\n  readonly downloadable = input(true);\n  readonly password = input<string | undefined>(undefined);\n  readonly httpHeaders = input<Record<string, string> | undefined>(undefined);\n  // Theme variant — drives [data-theme] host attribute. Default 'dark'\n  // preserves the original visual contract; 'light' flips token set via SCSS.\n  readonly theme = input<PreviewTheme>('dark');\n\n  // ==========================================\n  // OUTPUTS\n  // ==========================================\n  readonly close = output<void>();\n  readonly loaded = output<PdfLoadEvent>();\n  readonly pageChange = output<number>();\n  readonly zoomChange = output<number>();\n  readonly download = output<{ filename: string }>();\n  readonly loadError = output<PdfErrorEvent>();\n  // Fired whenever the search term, results, or active index changes — gives\n  // the consumer a stable hook for analytics / sticky highlight bars without\n  // poking at the internal state signal.\n  readonly searchChange = output<{ term: string; total: number; current: number; truncated: boolean }>();\n\n  // ==========================================\n  // STATE (signals)\n  // ==========================================\n  readonly #stage = signal<PdfStage>('empty');\n  readonly #pdfDoc = signal<SdPdfDocumentProxy | null>(null);\n  readonly #meta = signal<PdfMeta | null>(null);\n  readonly #activePage = signal(1);\n  readonly #zoom = signal(1);\n  readonly #zoomMode = signal<PdfZoomMode>('page-fit');\n  readonly #rotation = signal(0);\n  readonly #sidebarOpenInternal = signal(true);\n  readonly #sidebarModeInternal = signal<PdfSidebarMode>('thumbnails');\n  readonly #scrollModeInternal = signal<PdfScrollMode>('page');\n  readonly #loadProgress = signal({ loaded: 0, total: 0 });\n  readonly #loadError = signal<PdfErrorEvent | null>(null);\n  readonly #isFullscreen = signal(false);\n  readonly #filename = signal('document.pdf');\n  readonly #fileSize = signal(0);\n  readonly #continuousPages = signal<number[]>([]);\n  readonly #continuousTopSpacer = signal(0);\n  readonly #continuousBottomSpacer = signal(0);\n  readonly #continuousHeightVersion = signal(0);\n  readonly #thumbnailWindowStart = signal(0);\n  readonly #outline = signal<readonly PdfOutlineItem[]>([]);\n  readonly #outlineExpanded = signal<ReadonlySet<string>>(new Set<string>());\n  readonly #outlineFocusId = signal<string | null>(null);\n\n  // Thumbnail cache: page number → data URL of mini-render. Lazy-populated as\n  // the user opens the sidebar / scrolls thumbnails into view.\n  readonly #thumbCache = signal<Record<number, string>>({});\n  readonly #thumbnailCacheLru = new Map<number, string>();\n\n  // ==========================================\n  // SEARCH STATE\n  // ==========================================\n  // Whether the search bar (between header + body) is visible. Toggled via\n  // Ctrl+F, the sidebar tab, or `openSearch()` / `closeSearch()`. Independent\n  // from the sidebar's `'search'` tab — the bar can stay open with the\n  // sidebar closed (Ctrl+F flow), and the tab can be open without the bar.\n  readonly #searchBarOpen = signal(false);\n  // Persisted across `clearSearch()` so user toggles don't reset on each new\n  // term — mirrors Acrobat / Chrome's \"Find in page\" behaviour.\n  readonly #searchCaseSensitive = signal(false);\n  readonly #searchWholeWord = signal(false);\n  readonly #searchTerm = signal('');\n  readonly #searchResults = signal<PdfSearchResult[]>([]);\n  readonly #searchTruncated = signal(false);\n  // -1 sentinel means \"no result focused yet\" (e.g. right after clearSearch\n  // or before the first searchNext). Highlight rendering uses this to skip\n  // the `--active` class altogether.\n  readonly #searchActiveIndex = signal(-1);\n  // Page-text cache: pageNum → fully-joined plain text. We pay the\n  // `getTextContent()` cost once per page per document, then reuse across\n  // re-runs (e.g. toggling case-sensitive). Cleared on every source change.\n  readonly #pageTextCache = new Map<number, string>();\n  readonly #pageTextCacheSize = signal(0);\n  // Token to abort an in-flight `search()` call when a newer one supersedes it\n  // — same pattern as #loadToken / #renderToken upstream.\n  #searchToken = 0;\n  #searchWorkerActive = false;\n  #queuedSearchRequest: PdfSearchRequest | null = null;\n  // The IntersectionObserver instance that drives lazy thumb rendering. Lives\n  // for the component's lifetime; we just rebind to the latest canvas refs\n  // when the sidebar tab switches.\n  #thumbObserverCleanup: (() => void) | null = null;\n  // Pages currently being rendered as thumbs — guards against double work\n  // when a thumb scrolls in/out/in rapidly.\n  readonly #thumbnailWork = new Map<number, PdfThumbnailWork>();\n  readonly #thumbnailWorkCount = signal(0);\n  readonly #thumbnailSlotQueue: PdfThumbnailWork[] = [];\n  #activeThumbnailSlots = 0;\n  readonly #continuousTasks = new Map<number, SdPdfRenderTask>();\n  readonly #continuousReservations = new Map<number, { readonly generation: number }>();\n  #continuousFrame: number | null = null;\n  #layoutGeneration = 0;\n  #pageHeights: number[] = [];\n  readonly #heightIndex = new PdfHeightIndex(24);\n\n  // Cached resolved source object that getDocument actually consumed — used\n  // for download fallback when caller passed a non-URL source.\n  // Track ALL blob URLs we created so we can revoke on source change + destroy.\n  readonly #ownedBlobUrls = new Set<string>();\n\n  // Race guards mirror preview-image's #loadToken pattern.\n  #loadToken = 0;\n  #currentLoadingTask: SdPdfLoadingTask | null = null;\n  #currentRenderTask: SdPdfRenderTask | null = null;\n  #currentPrintJob: SdPdfPrintJob | null = null;\n  #printGeneration = 0;\n  #downloadGeneration = 0;\n  #renderToken = 0;\n  #destroyed = false;\n\n  // ==========================================\n  // COMPUTED (template-readable)\n  // ==========================================\n  readonly stage = this.#stage.asReadonly();\n  readonly activePage = this.#activePage.asReadonly();\n  readonly zoom = this.#zoom.asReadonly();\n  readonly zoomMode = this.#zoomMode.asReadonly();\n  readonly rotation = this.#rotation.asReadonly();\n  readonly sidebarMode = this.#sidebarModeInternal.asReadonly();\n  readonly scrollModeCurrent = this.#scrollModeInternal.asReadonly();\n  readonly isFullscreen = this.#isFullscreen.asReadonly();\n  readonly meta = this.#meta.asReadonly();\n  readonly filename = this.#filename.asReadonly();\n  readonly fileSize = this.#fileSize.asReadonly();\n  readonly loadError$ = this.#loadError.asReadonly();\n  readonly thumbCache = this.#thumbCache.asReadonly();\n  readonly thumbnailWorkCount = this.#thumbnailWorkCount.asReadonly();\n  readonly pageTextCacheSize = this.#pageTextCacheSize.asReadonly();\n  readonly continuousPages = this.#continuousPages.asReadonly();\n  readonly continuousTopSpacer = this.#continuousTopSpacer.asReadonly();\n  readonly continuousBottomSpacer = this.#continuousBottomSpacer.asReadonly();\n  readonly continuousPageHeights = computed<Record<number, number>>(() => {\n    this.#continuousHeightVersion();\n    return Object.fromEntries(this.#continuousPages().map(page => [page, this.#pageHeights[page - 1] ?? 1]));\n  });\n  readonly outline = this.#outline.asReadonly();\n  readonly outlineFocusId = this.#outlineFocusId.asReadonly();\n  readonly visibleOutline = computed<readonly PdfOutlineRow[]>(() => {\n    const rows: PdfOutlineRow[] = [];\n    const expanded = this.#outlineExpanded();\n    const visit = (items: readonly PdfOutlineItem[], level: number, parentId: string | null): void => {\n      for (const item of items) {\n        rows.push({ item, level, parentId });\n        if (item.children.length > 0 && expanded.has(item.id)) visit(item.children, level + 1, item.id);\n      }\n    };\n    visit(this.#outline(), 1, null);\n    return rows;\n  });\n\n  readonly numPages = computed(() => this.#meta()?.numPages ?? 0);\n  readonly canPrev = computed(() => this.#activePage() > 1);\n  readonly canNext = computed(() => {\n    const n = this.numPages();\n    return n > 0 && this.#activePage() < n;\n  });\n  readonly zoomPercent = computed(() => Math.round(this.#zoom() * 100));\n  readonly loadPercent = computed(() => {\n    const p = this.#loadProgress();\n    if (p.total <= 0) return 0;\n    return Math.min(100, Math.round((p.loaded / p.total) * 100));\n  });\n  readonly isSidebarOpen = computed(() => this.#sidebarOpenInternal() && this.#sidebarModeInternal() !== 'none');\n  readonly canDownload = computed(() => {\n    const source = this.source();\n    if (!this.downloadable() || !source) return false;\n    if (this.#requiresLoadedDocumentBytes(source)) {\n      return this.#browser.canDownloadBlob && this.#stage() === 'ready' && this.#pdfDoc() !== null;\n    }\n    if (typeof source === 'string' || ('url' in source && typeof source.url === 'string')) {\n      return this.#browser.canDownloadUrl;\n    }\n    return this.#browser.canDownloadBlob;\n  });\n  readonly canFullscreen = computed(() => this.#browser.canFullscreen);\n  readonly canPrint = computed(() => this.#printAdapter.isSupported && this.#stage() === 'ready' && this.#pdfDoc() !== null);\n  readonly pageList = computed(() => {\n    const n = this.numPages();\n    return n > 0 ? Array.from({ length: n }, (_, i) => i + 1) : [];\n  });\n  // Alias used by the template's thumbnail @for — keeps the JSX-y `pageNumbers`\n  // name from the design handoff while reusing the same computed.\n  readonly pageNumbers = computed(() => {\n    const count = this.numPages();\n    const start = Math.max(0, Math.min(this.#thumbnailWindowStart(), Math.max(0, count - SdPreviewPdf.THUMBNAIL_WINDOW_SIZE)));\n    const length = Math.min(SdPreviewPdf.THUMBNAIL_WINDOW_SIZE, count - start);\n    return Array.from({ length }, (_, index) => start + index + 1);\n  });\n  readonly thumbnailTopSpacer = computed(() => this.#thumbnailWindowStart() * SdPreviewPdf.THUMBNAIL_ITEM_HEIGHT);\n  readonly thumbnailBottomSpacer = computed(() => {\n    const renderedEnd = this.#thumbnailWindowStart() + this.pageNumbers().length;\n    return Math.max(0, this.numPages() - renderedEnd) * SdPreviewPdf.THUMBNAIL_ITEM_HEIGHT;\n  });\n\n  // Search readonly accessors for the template + tests. Read-only by design;\n  // mutations go through `search()` / `searchNext()` etc.\n  readonly searchBarOpen = this.#searchBarOpen.asReadonly();\n  readonly searchTerm = this.#searchTerm.asReadonly();\n  readonly searchResults = this.#searchResults.asReadonly();\n  readonly searchActiveIndex = this.#searchActiveIndex.asReadonly();\n  readonly searchCaseSensitive = this.#searchCaseSensitive.asReadonly();\n  readonly searchWholeWord = this.#searchWholeWord.asReadonly();\n  readonly searchTotal = computed(() => this.#searchResults().length);\n  readonly searchTruncated = this.#searchTruncated.asReadonly();\n  // 1-based \"X of N\" indicator for the search bar counter. Reads 0 when\n  // there are no results so the template can hide / dim the counter.\n  readonly searchCurrent = computed(() => {\n    const idx = this.#searchActiveIndex();\n    return idx < 0 ? 0 : idx + 1;\n  });\n  // Currently-active hit (or null when nothing is focused) — drives the\n  // in-page `<mark class=\"--active\">` highlight + auto-scroll effect below.\n  readonly searchActiveResult = computed<PdfSearchResult | null>(() => {\n    const idx = this.#searchActiveIndex();\n    const results = this.#searchResults();\n    return idx >= 0 && idx < results.length ? results[idx] : null;\n  });\n  // Snapshot of the full search state — handed to consumer via\n  // `getSearchState()` for parity with `searchChange` event shape.\n  readonly searchState = computed<PdfSearchState>(() => ({\n    term: this.#searchTerm(),\n    caseSensitive: this.#searchCaseSensitive(),\n    wholeWord: this.#searchWholeWord(),\n    results: this.#searchResults(),\n    activeIndex: this.#searchActiveIndex(),\n    truncated: this.#searchTruncated(),\n  }));\n\n  // ==========================================\n  // CONSTRUCTOR — declarative wiring\n  // ==========================================\n  constructor() {\n    // Initialize internal mirrors from inputs once. WHY mirrors: user actions\n    // (toggleSidebar / setSidebarMode / setZoom) must modify state that the\n    // template reads; signal inputs are read-only.\n    effect(() => {\n      this.#sidebarOpenInternal.set(this.sidebarOpen());\n    });\n    effect(() => {\n      const m = this.sidebar();\n      this.#sidebarModeInternal.set(m);\n    });\n    let previousScrollModeInput: PdfScrollMode | undefined;\n    effect(() => {\n      const m = this.scrollMode();\n      if (m === previousScrollModeInput) return;\n      previousScrollModeInput = m;\n      this.#scrollModeInternal.set(m);\n      queueMicrotask(() => this.#onScrollModeChanged());\n    });\n    effect(() => {\n      // Reset zoom mode when initialZoom input changes — only fires when the\n      // input itself updates (not when user clicks zoom +/-).\n      this.#zoomMode.set(this.initialZoom());\n    });\n\n    const removeFullscreenListener = this.#browser.listenFullscreen(this.#hostEl.nativeElement, active => {\n      if (!this.#destroyed) this.#isFullscreen.set(active);\n    });\n\n    // React to source changes — destroy previous doc, load new one.\n    // WHY untracked-via-queueMicrotask: `effect()` tracks every signal READ\n    // sync-ly inside the callback. `#loadDocument` reads internal signals\n    // (#pdfDoc via #destroyDoc, plus #zoom on the cleanup path). Letting the\n    // effect track those would re-fire whenever we updated them inside the\n    // load flow → infinite loop. Reading only `source()` here and deferring\n    // the actual load to a microtask scopes the tracking to ONLY `source()`.\n    effect(() => {\n      const src = this.source();\n      queueMicrotask(() => this.#loadDocument(src));\n    });\n\n    // Auto-focus host after first render so keyboard works immediately.\n    afterNextRender(() => {\n      if (!this.#browser.isBrowser || this.#destroyed) return;\n      try {\n        this.#hostEl.nativeElement.focus({ preventScroll: true });\n      } catch {\n        // ignore — focus() can throw on detached elements.\n      }\n    });\n\n    // Drive lazy thumbnail rendering — every time the list of thumbnail\n    // <canvas> refs changes (sidebar opens, mode flips, doc reloads) we\n    // disconnect any prior observer and start watching the new set.\n    // WHY effect (not afterNextRender): viewChildren() emits a signal that\n    // updates whenever the template's @for collection mutates.\n    effect(() => {\n      const refs = this.thumbCanvases();\n      this.#syncThumbObserver(refs.map(r => r.nativeElement));\n    });\n\n    effect(() => {\n      const refs = this.continuousCanvases();\n      this.#scheduleContinuousRenders(refs.map(ref => ref.nativeElement));\n    });\n\n    effect(onCleanup => {\n      const stage = this.stageEl()?.nativeElement;\n      if (!stage) return;\n      const cleanup = this.#browser.observeResize(stage, () => {\n        if (this.#destroyed || this.#stage() !== 'ready') return;\n        if (this.#scrollModeInternal() === 'continuous') this.#invalidateContinuousLayout();\n        else void this.#renderActivePage();\n      });\n      onCleanup(cleanup);\n    });\n\n    // Re-apply highlights when the rendered page changes OR when the search\n    // term / active hit changes. WHY a separate effect: text-layer overlay\n    // doesn't exist in this commit, so we hook the page canvas wrapper and\n    // sprinkle `<mark>` siblings via DOM. Effect re-runs are cheap; the\n    // helper is a no-op when there's nothing to highlight.\n    effect(() => {\n      // Track these signals so the effect re-fires:\n      this.#searchTerm();\n      this.#searchActiveIndex();\n      this.activePage();\n      // Defer to a microtask so the canvas render finished writing — keeps\n      // us out of the page render's await chain.\n      queueMicrotask(() => this.#applyHighlightsForActivePage());\n    });\n\n    // Cleanup on destroy.\n    this.#destroyRef.onDestroy(() => {\n      this.#destroyed = true;\n      this.#loadToken++;\n      this.#searchToken++;\n      this.#cancelQueuedSearch();\n      this.#downloadGeneration++;\n      this.#renderToken++;\n      this.#cancelLoadingTask();\n      this.#cancelRender();\n      this.#cancelContinuousRenders();\n      this.#cancelThumbnailRenders();\n      this.#cancelPrint();\n      this.#destroyDoc();\n      this.#revokeAllBlobs();\n      this.#thumbObserverCleanup?.();\n      this.#thumbObserverCleanup = null;\n      this.#thumbnailCacheLru.clear();\n      this.#clearPageTextCache();\n      removeFullscreenListener();\n    });\n  }\n\n  // ==========================================\n  // PUBLIC API\n  // ==========================================\n\n  goToPage(page: number): void {\n    const n = this.numPages();\n    if (n <= 0) return;\n    const target = Math.max(1, Math.min(page, n));\n    const changed = target !== this.#activePage();\n    if (changed) {\n      this.#activePage.set(target);\n      this.pageChange.emit(target);\n    }\n    this.#ensureThumbnailPageVisible(target);\n    if (this.#scrollModeInternal() === 'continuous') {\n      this.#positionContinuousPage(target);\n    } else if (changed) {\n      void this.#renderActivePage();\n    }\n  }\n\n  nextPage(): void {\n    this.goToPage(this.#activePage() + 1);\n  }\n  prevPage(): void {\n    this.goToPage(this.#activePage() - 1);\n  }\n  firstPage(): void {\n    this.goToPage(1);\n  }\n  lastPage(): void {\n    this.goToPage(this.numPages());\n  }\n\n  zoomIn(): void {\n    this.#zoomMode.set(this.#zoom() + SdPreviewPdf.ZOOM_STEP);\n    this.#setZoom(this.#zoom() + SdPreviewPdf.ZOOM_STEP);\n  }\n\n  zoomOut(): void {\n    this.#zoomMode.set(this.#zoom() - SdPreviewPdf.ZOOM_STEP);\n    this.#setZoom(this.#zoom() - SdPreviewPdf.ZOOM_STEP);\n  }\n\n  setZoom(mode: PdfZoomMode): void {\n    this.#zoomMode.set(mode);\n    if (typeof mode === 'number') {\n      this.#setZoom(mode);\n    } else {\n      if (this.#scrollModeInternal() === 'continuous') this.#invalidateContinuousLayout();\n      else void this.#renderActivePage();\n    }\n  }\n\n  rotate(direction: 'left' | 'right'): void {\n    const delta = direction === 'right' ? 90 : -90;\n    this.#rotation.update(r => (((r + delta) % 360) + 360) % 360);\n    if (this.#scrollModeInternal() === 'continuous') this.#invalidateContinuousLayout();\n    else void this.#renderActivePage();\n  }\n\n  toggleSidebar(): void {\n    this.#sidebarOpenInternal.update(v => !v);\n  }\n\n  setSidebarMode(mode: PdfSidebarMode): void {\n    this.#sidebarModeInternal.set(mode);\n    if (mode !== 'none' && !this.#sidebarOpenInternal()) {\n      this.#sidebarOpenInternal.set(true);\n    }\n    // Selecting the 'search' tab implicitly opens the search bar so the user\n    // can start typing right away — matches Acrobat's flyout behaviour.\n    if (mode === 'search') {\n      this.openSearch();\n    }\n  }\n\n  onSidebarTabKeyDown(event: KeyboardEvent, currentMode: PdfSidebarTabMode): void {\n    const modes: readonly PdfSidebarTabMode[] = ['thumbnails', 'outline', 'search'];\n    const currentIndex = modes.indexOf(currentMode);\n    let targetIndex: number;\n    switch (event.key) {\n      case 'ArrowRight':\n        targetIndex = (currentIndex + 1) % modes.length;\n        break;\n      case 'ArrowLeft':\n        targetIndex = (currentIndex - 1 + modes.length) % modes.length;\n        break;\n      case 'Home':\n        targetIndex = 0;\n        break;\n      case 'End':\n        targetIndex = modes.length - 1;\n        break;\n      default:\n        return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    const target = modes[targetIndex];\n    this.setSidebarMode(target);\n    queueMicrotask(() => {\n      const tab = this.sidebarTabRefs().find(ref => ref.nativeElement.dataset['sidebarMode'] === target);\n      tab?.nativeElement.focus();\n    });\n  }\n\n  onThumbnailSidebarScroll(event: Event): void {\n    if (this.#sidebarModeInternal() !== 'thumbnails') return;\n    const element = event.currentTarget as HTMLElement | null;\n    if (!element) return;\n    const firstVisible = Math.floor(element.scrollTop / SdPreviewPdf.THUMBNAIL_ITEM_HEIGHT);\n    const start = Math.max(0, Math.min(firstVisible - 8, Math.max(0, this.numPages() - SdPreviewPdf.THUMBNAIL_WINDOW_SIZE)));\n    this.#thumbnailWindowStart.set(start);\n  }\n\n  setScrollMode(mode: PdfScrollMode): void {\n    if (this.#scrollModeInternal() === mode) return;\n    this.#scrollModeInternal.set(mode);\n    this.#onScrollModeChanged();\n  }\n\n  downloadFile(): void {\n    void this.downloadFileAsync();\n  }\n\n  async downloadFileAsync(): Promise<boolean> {\n    const generation = ++this.#downloadGeneration;\n    if (!this.canDownload() || this.#destroyed) return false;\n    const src = this.source();\n    if (!src) return false;\n    const filename = this.#filename();\n    const doc = this.#pdfDoc();\n\n    let href: string | null = null;\n    let temporaryHref: string | null = null;\n    if (this.#requiresLoadedDocumentBytes(src)) {\n      if (!doc) return false;\n      let data: Uint8Array;\n      try {\n        data = new Uint8Array(await doc.getData());\n      } catch {\n        return false;\n      }\n      if (!this.#isCurrentDownload(generation, src, doc)) return false;\n      const blob = this.#browser.createPdfBlob(data);\n      href = blob ? this.#browser.createObjectUrl(blob) : null;\n      temporaryHref = this.#trackTemporaryDownloadUrl(href);\n    } else if (typeof src === 'string') {\n      href = src;\n    } else if (this.#browser.isFile(src) || this.#browser.isBlob(src)) {\n      href = this.#browser.createObjectUrl(src);\n      temporaryHref = this.#trackTemporaryDownloadUrl(href);\n    } else if (src && typeof src === 'object' && 'url' in src && typeof src.url === 'string') {\n      href = src.url;\n    } else if (src instanceof ArrayBuffer || src instanceof Uint8Array || (src && typeof src === 'object' && 'data' in src)) {\n      const raw = src instanceof ArrayBuffer || src instanceof Uint8Array ? src : src.data;\n      const data = raw instanceof Uint8Array ? new Uint8Array(raw) : new Uint8Array(raw.slice(0));\n      const blob = this.#browser.createPdfBlob(data);\n      href = blob ? this.#browser.createObjectUrl(blob) : null;\n      temporaryHref = this.#trackTemporaryDownloadUrl(href);\n    }\n\n    if (!href || !this.#isCurrentDownload(generation, src, doc)) {\n      if (temporaryHref) this.#scheduleTemporaryDownloadUrlRelease(temporaryHref);\n      return false;\n    }\n    const downloaded = this.#browser.download(href, filename);\n    if (temporaryHref) this.#scheduleTemporaryDownloadUrlRelease(temporaryHref);\n    if (downloaded && !this.#destroyed) this.download.emit({ filename });\n    return downloaded;\n  }\n\n  toggleFullscreen(): void {\n    if (!this.canFullscreen()) return;\n    void this.#browser.toggleFullscreen(this.#hostEl.nativeElement).catch(() => undefined);\n  }\n\n  /** Programmatic equivalent of clicking the X — emits the close output. */\n  requestClose(): void {\n    this.close.emit();\n  }\n\n  /** Retry the active load attempt (called from the error state retry button). */\n  retryLoad(): void {\n    this.#loadDocument(this.source());\n  }\n\n  printFile(): void {\n    void this.print();\n  }\n\n  async print(): Promise<void> {\n    const generation = ++this.#printGeneration;\n    this.#cancelPrintJob();\n    const doc = this.#pdfDoc();\n    if (!doc || this.#destroyed || !this.canPrint()) return;\n    const loadToken = this.#loadToken;\n    let data: Uint8Array;\n    try {\n      data = new Uint8Array(await doc.getData());\n    } catch {\n      return;\n    }\n    if (generation !== this.#printGeneration || !this.#isActiveLoad(loadToken) || this.#pdfDoc() !== doc) return;\n    const job = this.#printAdapter.start(data, this.#filename());\n    if (!job) return;\n    this.#currentPrintJob = job;\n    try {\n      await job.finished;\n    } catch {\n      job.cancel();\n    } finally {\n      if (this.#currentPrintJob === job) this.#currentPrintJob = null;\n    }\n  }\n\n  isOutlineExpanded(id: string): boolean {\n    return this.#outlineExpanded().has(id);\n  }\n\n  toggleOutlineItem(id: string, event?: Event): void {\n    event?.stopPropagation();\n    const item = this.#findOutlineItem(id);\n    if (!item || item.children.length === 0) {\n      this.#outlineFocusId.set(id);\n      return;\n    }\n    this.#outlineExpanded.update(current => {\n      const next = new Set(current);\n      if (next.has(id)) next.delete(id);\n      else next.add(id);\n      return next;\n    });\n    this.#outlineFocusId.set(id);\n  }\n\n  focusOutlineItem(id: string): void {\n    this.#outlineFocusId.set(id);\n  }\n\n  activateOutlineItem(id: string): void {\n    const item = this.#findOutlineItem(id);\n    if (!item) return;\n    this.#outlineFocusId.set(id);\n    if (item.page !== null) {\n      this.goToPage(item.page);\n      return;\n    }\n    if (item.children.length > 0) this.toggleOutlineItem(id);\n  }\n\n  onOutlineKeyDown(event: KeyboardEvent, id: string): void {\n    const rows = this.visibleOutline();\n    const index = rows.findIndex(row => row.item.id === id);\n    if (index < 0) return;\n    const row = rows[index];\n    const item = row.item;\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        this.#focusOutlineRow(rows[Math.min(rows.length - 1, index + 1)].item.id);\n        break;\n      case 'ArrowUp':\n        event.preventDefault();\n        this.#focusOutlineRow(rows[Math.max(0, index - 1)].item.id);\n        break;\n      case 'ArrowRight':\n        event.preventDefault();\n        if (item.children.length === 0) break;\n        if (!this.isOutlineExpanded(id)) this.toggleOutlineItem(id);\n        else this.#focusOutlineRow(item.children[0].id);\n        break;\n      case 'ArrowLeft':\n        event.preventDefault();\n        if (item.children.length > 0 && this.isOutlineExpanded(id)) this.toggleOutlineItem(id);\n        else if (row.parentId) this.#focusOutlineRow(row.parentId);\n        break;\n      case 'Home':\n        event.preventDefault();\n        this.#focusOutlineRow(rows[0].item.id);\n        break;\n      case 'End':\n        event.preventDefault();\n        this.#focusOutlineRow(rows[rows.length - 1].item.id);\n        break;\n      case 'Enter':\n      case ' ':\n        if (item.url && item.page === null) break;\n        event.preventDefault();\n        this.activateOutlineItem(id);\n        break;\n      default:\n        break;\n    }\n  }\n\n  /**\n   * Run a full-document search for `term`. Returns the result count.\n   *\n   * Options:\n   * - `caseSensitive`: default off; matches independent of capitalisation.\n   * - `wholeWord`: default off; requires Unicode word-boundary on both sides\n   *   so `cat` does NOT match `category` (uses `/\\b...\\b/u` so Vietnamese\n   *   diacritic-bearing letters still participate as word characters).\n   *\n   * Implementation: iterate every page once (cached), build a flat plain-text\n   * string per page (joining textItem.str), and slice ~30 chars of context\n   * around each match. We deliberately use plain JS regex rather than\n   * pdf.js's `pdfFindController` — it's <40 lines, fully testable, and\n   * sidesteps the find-controller's dependency on a real text layer (which\n   * we don't render).\n   */\n  async search(term: string, options?: { caseSensitive?: boolean; wholeWord?: boolean }): Promise<number> {\n    const token = ++this.#searchToken;\n    const cleanTerm = (term ?? '').trim().normalize('NFC');\n    if (options?.caseSensitive !== undefined) {\n      this.#searchCaseSensitive.set(options.caseSensitive);\n    }\n    if (options?.wholeWord !== undefined) {\n      this.#searchWholeWord.set(options.wholeWord);\n    }\n    this.#searchTerm.set(cleanTerm);\n    this.#searchTruncated.set(false);\n\n    if (!cleanTerm) {\n      this.#cancelQueuedSearch();\n      this.#searchResults.set([]);\n      this.#searchActiveIndex.set(-1);\n      this.#emitSearchChange();\n      return 0;\n    }\n\n    const doc = this.#pdfDoc();\n    if (!doc) {\n      this.#cancelQueuedSearch();\n      this.#searchResults.set([]);\n      this.#searchActiveIndex.set(-1);\n      this.#emitSearchChange();\n      return 0;\n    }\n\n    const re = this.#buildSearchRegex(cleanTerm, this.#searchCaseSensitive(), this.#searchWholeWord());\n    if (!re) {\n      this.#cancelQueuedSearch();\n      this.#searchResults.set([]);\n      this.#searchActiveIndex.set(-1);\n      this.#emitSearchChange();\n      return 0;\n    }\n\n    return new Promise<number>(resolve => {\n      this.#enqueueSearchRequest({ token, doc, expression: re, resolve });\n    });\n  }\n\n  async #executeSearchRequest(request: PdfSearchRequest): Promise<number> {\n    const { token, doc, expression } = request;\n    const results: PdfSearchResult[] = [];\n    const textScan: PdfPageTextScan = {\n      snapshot: new Map(this.#pageTextCache),\n      staged: new Map<number, string>(),\n    };\n    pageLoop: for (let p = 1; p <= doc.numPages; p++) {\n      if (token !== this.#searchToken) return 0; // newer search superseded us\n      const text = await this.#getPageText(doc, p, token, textScan);\n      if (token !== this.#searchToken) return 0;\n      // re is /g — must be re-created or `lastIndex` reset between pages.\n      expression.lastIndex = 0;\n      let m: RegExpExecArray | null;\n      while ((m = expression.exec(text)) !== null) {\n        const start = m.index;\n        const matched = m[0];\n        const end = start + matched.length;\n        const before = text.slice(Math.max(0, start - 30), start);\n        const after = text.slice(end, end + 30);\n        if (results.length >= SdPreviewPdf.MAX_SEARCH_RESULTS) {\n          this.#searchTruncated.set(true);\n          break pageLoop;\n        }\n        results.push({ page: p, before, term: matched, after });\n        // Defensive: zero-length match would loop forever.\n        if (matched.length === 0) expression.lastIndex++;\n      }\n    }\n\n    if (token !== this.#searchToken) return 0;\n    this.#commitPageTextScan(textScan);\n    this.#searchResults.set(results);\n    // Activate the first result so the user sees something immediately;\n    // tests can assert this via `searchActiveIndex()`. Skip when empty.\n    this.#searchActiveIndex.set(results.length > 0 ? 0 : -1);\n    if (results.length > 0) {\n      // Auto-jump to the first hit's page.\n      this.goToPage(results[0].page);\n    }\n    this.#emitSearchChange();\n    return results.length;\n  }\n\n  #enqueueSearchRequest(request: PdfSearchRequest): void {\n    if (this.#searchWorkerActive) {\n      this.#queuedSearchRequest?.resolve(0);\n      this.#queuedSearchRequest = request;\n      return;\n    }\n    this.#searchWorkerActive = true;\n    void this.#drainSearchRequests(request);\n  }\n\n  async #drainSearchRequests(initial: PdfSearchRequest): Promise<void> {\n    let request: PdfSearchRequest | null = initial;\n    while (request) {\n      let resultCount = 0;\n      try {\n        resultCount = await this.#executeSearchRequest(request);\n      } catch {\n        resultCount = 0;\n      }\n      request.resolve(resultCount);\n      request = this.#queuedSearchRequest;\n      this.#queuedSearchRequest = null;\n    }\n    this.#searchWorkerActive = false;\n  }\n\n  #cancelQueuedSearch(): void {\n    this.#queuedSearchRequest?.resolve(0);\n    this.#queuedSearchRequest = null;\n  }\n\n  searchNext(): void {\n    const results = this.#searchResults();\n    if (results.length === 0) return;\n    const next = (this.#searchActiveIndex() + 1) % results.length;\n    this.#searchActiveIndex.set(next);\n    this.goToPage(results[next].page);\n    this.#emitSearchChange();\n  }\n\n  searchPrev(): void {\n    const results = this.#searchResults();\n    if (results.length === 0) return;\n    const cur = this.#searchActiveIndex();\n    const prev = cur <= 0 ? results.length - 1 : cur - 1;\n    this.#searchActiveIndex.set(prev);\n    this.goToPage(results[prev].page);\n    this.#emitSearchChange();\n  }\n\n  activateSearchResult(index: number): void {\n    const result = this.#searchResults()[index];\n    if (!result) return;\n    this.#searchActiveIndex.set(index);\n    this.goToPage(result.page);\n    this.#emitSearchChange();\n  }\n\n  clearSearch(): void {\n    this.#searchToken++;\n    this.#cancelQueuedSearch();\n    this.#searchTerm.set('');\n    this.#searchResults.set([]);\n    this.#searchActiveIndex.set(-1);\n    this.#searchTruncated.set(false);\n    this.#emitSearchChange();\n  }\n\n  /** Open the search bar and focus its input. Idempotent. */\n  openSearch(): void {\n    this.#searchBarOpen.set(true);\n    // Defer focus a tick so the *ngIf-rendered input exists in the DOM.\n    queueMicrotask(() => {\n      this.searchInputRef()?.nativeElement?.focus();\n      this.searchInputRef()?.nativeElement?.select();\n    });\n  }\n\n  /** Close the search bar AND clear results (mirrors Acrobat behaviour). */\n  closeSearch(): void {\n    this.#searchBarOpen.set(false);\n    this.clearSearch();\n  }\n\n  toggleSearchCaseSensitive(): void {\n    this.#searchCaseSensitive.update(v => !v);\n    // Re-run with the persisted term so the result set reflects the new flag.\n    if (this.#searchTerm()) {\n      void this.search(this.#searchTerm());\n    }\n  }\n\n  toggleSearchWholeWord(): void {\n    this.#searchWholeWord.update(v => !v);\n    if (this.#searchTerm()) {\n      void this.search(this.#searchTerm());\n    }\n  }\n\n  /** Live binding from the search bar's `(input)` event. */\n  onSearchInput(event: Event): void {\n    const target = event.target;\n    if (!target || typeof target !== 'object' || !('value' in target) || typeof target.value !== 'string') return;\n    void this.search(target.value);\n  }\n\n  // ==========================================\n  // KEYBOARD — bound to HOST (not document)\n  // ==========================================\n  @HostListener('keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent): void {\n    const target = event.target as HTMLElement | null;\n    const isSearchInput = !!target && target === this.searchInputRef()?.nativeElement;\n    const isOtherEditable =\n      !!target && !isSearchInput && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable);\n\n    // Ctrl/Cmd+F: open the search bar from anywhere (even when input has\n    // focus, e.g. re-focus the search bar from the page input). Handled\n    // before the input-target guard so it always works.\n    if ((event.ctrlKey || event.metaKey) && (event.key === 'f' || event.key === 'F')) {\n      event.preventDefault();\n      this.openSearch();\n      return;\n    }\n\n    if ((event.ctrlKey || event.metaKey) && (event.key === 'p' || event.key === 'P') && this.canPrint()) {\n      event.preventDefault();\n      this.printFile();\n      return;\n    }\n\n    // Keys while the search input is focused: Enter / Shift+Enter, F3 / Shift+F3\n    // cycle results; Esc closes the bar. Everything else (typing) passes through.\n    if (isSearchInput) {\n      if (event.key === 'Escape') {\n        event.preventDefault();\n        this.closeSearch();\n        // Re-focus the host so subsequent shortcuts work without a click.\n        this.#hostEl.nativeElement.focus();\n        return;\n      }\n      if (event.key === 'Enter') {\n        event.preventDefault();\n        if (event.shiftKey) {\n          this.searchPrev();\n        } else {\n          this.searchNext();\n        }\n        return;\n      }\n      if (event.key === 'F3') {\n        event.preventDefault();\n        if (event.shiftKey) {\n          this.searchPrev();\n        } else {\n          this.searchNext();\n        }\n        return;\n      }\n      return; // typing → let it pass through\n    }\n\n    // Other editable targets (page-number input etc.) shouldn't trigger\n    // viewer shortcuts — but Esc should still close an open search bar.\n    if (isOtherEditable) {\n      if (event.key === 'Escape' && this.#searchBarOpen()) {\n        event.preventDefault();\n        this.closeSearch();\n      }\n      return;\n    }\n\n    // F3 outside the search input still cycles results (matches browser\n    // Find-in-page convention). Only meaningful when the bar is open OR\n    // there are stale results — we keep it ungated for parity.\n    if (event.key === 'F3') {\n      event.preventDefault();\n      if (event.shiftKey) {\n        this.searchPrev();\n      } else {\n        this.searchNext();\n      }\n      return;\n    }\n\n    switch (event.key) {\n      case 'ArrowLeft':\n      case 'PageUp':\n        event.preventDefault();\n        this.prevPage();\n        break;\n      case 'ArrowRight':\n      case 'PageDown':\n        event.preventDefault();\n        this.nextPage();\n        break;\n      case 'Home':\n        event.preventDefault();\n        this.firstPage();\n        break;\n      case 'End':\n        event.preventDefault();\n        this.lastPage();\n        break;\n      case '+':\n      case '=':\n        event.preventDefault();\n        this.zoomIn();\n        break;\n      case '-':\n        event.preventDefault();\n        this.zoomOut();\n        break;\n      case '0':\n        event.preventDefault();\n        this.setZoom('page-fit');\n        break;\n      case 'r':\n        event.preventDefault();\n        this.rotate('right');\n        break;\n      case 'R':\n        event.preventDefault();\n        this.rotate('left');\n        break;\n      case 'f':\n        event.preventDefault();\n        this.toggleFullscreen();\n        break;\n      case 'Escape':\n        // Esc closes the search bar (when open). NEVER emits `close` on the\n        // component — that remains the consumer's responsibility per the\n        // standalone-embed pattern.\n        if (this.#searchBarOpen()) {\n          event.preventDefault();\n          this.closeSearch();\n        }\n        break;\n      default:\n        break;\n    }\n  }\n\n  // ==========================================\n  // TEMPLATE HANDLERS\n  // ==========================================\n\n  onPageInputEnter(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    const value = Number(input.value);\n    if (Number.isFinite(value)) {\n      this.goToPage(value);\n    }\n    // Snap input back to the actual current page after clamping.\n    input.value = String(this.#activePage());\n  }\n\n  onPageInputBlur(event: Event): void {\n    const input = event.target as HTMLInputElement;\n    input.value = String(this.#activePage());\n  }\n\n  onWheel(event: WheelEvent): void {\n    // Ctrl/Cmd + wheel = zoom (mirrors PDF readers + most image viewers).\n    // Plain wheel = let browser scroll the stage (especially when zoomed in).\n    if (event.ctrlKey || event.metaKey) {\n      event.preventDefault();\n      const factor = event.deltaY < 0 ? 1 + SdPreviewPdf.ZOOM_STEP : 1 - SdPreviewPdf.ZOOM_STEP;\n      this.#zoomMode.set(this.#zoom() * factor);\n      this.#setZoom(this.#zoom() * factor);\n    }\n  }\n\n  trackByPage(_i: number, page: number): number {\n    return page;\n  }\n\n  // ==========================================\n  // INTERNALS\n  // ==========================================\n\n  #findOutlineItem(id: string, items: readonly PdfOutlineItem[] = this.#outline()): PdfOutlineItem | null {\n    for (const item of items) {\n      if (item.id === id) return item;\n      const nested = this.#findOutlineItem(id, item.children);\n      if (nested) return nested;\n    }\n    return null;\n  }\n\n  #focusOutlineRow(id: string): void {\n    this.#outlineFocusId.set(id);\n    queueMicrotask(() => {\n      if (this.#destroyed) return;\n      const ref = this.outlineItemRefs().find(candidate => candidate.nativeElement.dataset['outlineId'] === id);\n      ref?.nativeElement.focus();\n    });\n  }\n\n  #setOutline(items: readonly PdfOutlineItem[]): void {\n    const expanded = new Set<string>();\n    const collect = (nodes: readonly PdfOutlineItem[]): void => {\n      for (const item of nodes) {\n        if (item.children.length > 0) expanded.add(item.id);\n        collect(item.children);\n      }\n    };\n    collect(items);\n    this.#outline.set(items);\n    this.#outlineExpanded.set(expanded);\n    this.#outlineFocusId.set(items[0]?.id ?? null);\n  }\n\n  async #loadOutline(doc: SdPdfDocumentProxy, token: number): Promise<readonly PdfOutlineItem[] | null> {\n    let rawItems: readonly SdPdfRawOutlineItem[] | null;\n    try {\n      rawItems = await doc.getOutline();\n    } catch {\n      return this.#isActiveLoad(token) ? [] : null;\n    }\n    if (!this.#isActiveLoad(token)) return null;\n    return this.#resolveOutlineItems(doc, rawItems ?? [], token, [], 0, { nodes: 0 }, new Set<object>());\n  }\n\n  async #resolveOutlineItems(\n    doc: SdPdfDocumentProxy,\n    rawItems: readonly SdPdfRawOutlineItem[],\n    token: number,\n    parentPath: readonly number[],\n    depth: number,\n    traversal: PdfOutlineTraversal,\n    ancestors: ReadonlySet<object>\n  ): Promise<readonly PdfOutlineItem[] | null> {\n    const items: PdfOutlineItem[] = [];\n    if (depth >= SdPreviewPdf.OUTLINE_MAX_DEPTH) return items;\n    for (let index = 0; index < rawItems.length; index++) {\n      if (!this.#isActiveLoad(token)) return null;\n      const raw = rawItems[index];\n      if (!raw || typeof raw !== 'object' || ancestors.has(raw)) continue;\n      if (traversal.nodes >= SdPreviewPdf.OUTLINE_MAX_NODES) break;\n      traversal.nodes++;\n      const path = [...parentPath, index];\n      const page = await this.#resolveOutlinePage(doc, raw, token);\n      if (!this.#isActiveLoad(token)) return null;\n      const rawChildren = Array.isArray(raw.items) ? raw.items : [];\n      const childAncestors = new Set(ancestors);\n      childAncestors.add(raw);\n      const children = await this.#resolveOutlineItems(doc, rawChildren, token, path, depth + 1, traversal, childAncestors);\n      if (!children || !this.#isActiveLoad(token)) return null;\n      const safeUrl = this.#safeOutlineUrl(raw.url);\n      items.push({\n        id: `outline-${path.join('-')}`,\n        title: raw.title?.trim() || `Page ${page ?? ''}`.trim(),\n        page,\n        ...(safeUrl ? { url: safeUrl } : {}),\n        children,\n      });\n    }\n    return items;\n  }\n\n  async #resolveOutlinePage(doc: SdPdfDocumentProxy, item: SdPdfRawOutlineItem, token: number): Promise<number | null> {\n    let destination = item.dest;\n    if (typeof destination === 'string') {\n      try {\n        destination = await doc.getDestination(destination);\n      } catch {\n        return null;\n      }\n    }\n    if (!this.#isActiveLoad(token) || !Array.isArray(destination) || destination.length === 0) return null;\n    const target: unknown = destination[0];\n    if (typeof target === 'number') return this.#validOutlinePage(Math.floor(target) + 1, doc.numPages);\n    if (!this.#isPdfReference(target)) return null;\n    const cached = doc.cachedPageNumber(target);\n    if (cached !== null) return this.#validOutlinePage(cached, doc.numPages);\n    try {\n      const index = await doc.getPageIndex(target);\n      return this.#isActiveLoad(token) ? this.#validOutlinePage(index + 1, doc.numPages) : null;\n    } catch {\n      return null;\n    }\n  }\n\n  #isPdfReference(value: unknown): value is SdPdfReference {\n    return (\n      !!value &&\n      typeof value === 'object' &&\n      'num' in value &&\n      'gen' in value &&\n      typeof value.num === 'number' &&\n      typeof value.gen === 'number'\n    );\n  }\n\n  #validOutlinePage(page: number, pageCount: number): number | null {\n    return Number.isInteger(page) && page >= 1 && page <= pageCount ? page : null;\n  }\n\n  #safeOutlineUrl(url: string | null | undefined): string | undefined {\n    const value = url?.trim();\n    return value && /^(?:https?:\\/\\/|mailto:)/i.test(value) ? value : undefined;\n  }\n\n  async #loadDocument(src: PdfSource | null | undefined): Promise<void> {\n    const token = ++this.#loadToken;\n    this.#searchToken++;\n    this.#cancelQueuedSearch();\n    this.#downloadGeneration++;\n    this.#cancelLoadingTask();\n    this.#cancelRender();\n    this.#cancelContinuousRenders();\n    this.#cancelThumbnailRenders();\n    this.#cancelPrint();\n    await this.#destroyDoc();\n    if (!this.#isActiveLoad(token)) return;\n    this.#revokeAllBlobs();\n    this.#thumbnailCacheLru.clear();\n    this.#thumbCache.set({});\n    this.#setOutline([]);\n    this.#clearPageTextCache();\n    // Reset search state — results are per-document, but keep the term so a\n    // newly-loaded source with the same term gets re-indexed automatically\n    // on the next user keystroke. Active index resets unconditionally.\n    this.#searchResults.set([]);\n    this.#searchActiveIndex.set(-1);\n    this.#searchTruncated.set(false);\n    this.#loadError.set(null);\n    this.#loadProgress.set({ loaded: 0, total: 0 });\n\n    if (!src || !this.#browser.isBrowser) {\n      this.#stage.set('empty');\n      this.#pdfDoc.set(null);\n      this.#meta.set(null);\n      this.#activePage.set(1);\n      return;\n    }\n\n    this.#stage.set('loading');\n\n    let spec: SdPdfDocumentSpec;\n    try {\n      spec = await this.#normalizeSource(src);\n    } catch (err) {\n      if (!this.#isActiveLoad(token)) return;\n      this.#emitError(this.#classifyError(err), this.#errorMessage(err));\n      return;\n    }\n    if (!this.#isActiveLoad(token)) return;\n    if (this.password()) {\n      spec.password = this.password();\n    }\n\n    let task: SdPdfLoadingTask;\n    try {\n      task = this.#pdfjs.getDocument(spec);\n      this.#currentLoadingTask = task;\n      task.onProgress = (p: { loaded: number; total: number }) => {\n        if (!this.#isActiveLoad(token) || this.#currentLoadingTask !== task) return;\n        this.#loadProgress.set({ loaded: p.loaded ?? 0, total: p.total ?? 0 });\n      };\n    } catch (err) {\n      if (this.#isActiveLoad(token)) this.#emitError(this.#classifyError(err), this.#errorMessage(err));\n      return;\n    }\n\n    let pdfDoc: SdPdfDocumentProxy;\n    try {\n      pdfDoc = await task.promise;\n    } catch (err) {\n      if (this.#currentLoadingTask === task) this.#currentLoadingTask = null;\n      if (!this.#isActiveLoad(token)) return;\n      this.#emitError(this.#classifyError(err), this.#errorMessage(err));\n      return;\n    }\n    if (this.#currentLoadingTask === task) this.#currentLoadingTask = null;\n    if (!this.#isActiveLoad(token)) {\n      await this.#destroyDocument(pdfDoc);\n      return;\n    }\n\n    let meta: PdfMeta;\n    try {\n      const m = await pdfDoc.getMetadata();\n      const info = m?.info ?? {};\n      meta = {\n        title: info.Title,\n        author: info.Author,\n        subject: info.Subject,\n        numPages: pdfDoc.numPages,\n      };\n    } catch {\n      meta = { numPages: pdfDoc.numPages };\n    }\n    if (!this.#isActiveLoad(token)) {\n      await this.#destroyDocument(pdfDoc);\n      return;\n    }\n\n    const outline = await this.#loadOutline(pdfDoc, token);\n    if (!outline || !this.#isActiveLoad(token)) {\n      await this.#destroyDocument(pdfDoc);\n      return;\n    }\n\n    this.#pdfDoc.set(pdfDoc);\n    this.#meta.set(meta);\n    this.#setOutline(outline);\n    this.#activePage.set(Math.max(1, Math.min(this.startPage(), pdfDoc.numPages)));\n    this.#ensureThumbnailPageVisible(this.#activePage());\n    this.#stage.set('ready');\n    this.#zoom.set(1);\n    this.#rotation.set(0);\n    this.#zoomMode.set(this.initialZoom());\n    this.#resetContinuousLayout(pdfDoc.numPages);\n\n    if (!this.#destroyed) {\n      this.loaded.emit({ totalPages: pdfDoc.numPages, meta });\n      this.pageChange.emit(this.#activePage());\n    }\n\n    if (this.#scrollModeInternal() === 'continuous') {\n      this.#positionContinuousPage(this.#activePage());\n    } else {\n      await this.#renderActivePage();\n    }\n  }\n\n  async #renderActivePage(): Promise<void> {\n    const pdfDoc = this.#pdfDoc();\n    if (!pdfDoc) return;\n    const token = ++this.#renderToken;\n    const pageNum = this.#activePage();\n    let page: SdPdfPageProxy;\n    try {\n      page = await pdfDoc.getPage(pageNum);\n    } catch {\n      return;\n    }\n    if (token !== this.#renderToken || this.#destroyed || this.#pdfDoc() !== pdfDoc) {\n      page.cleanup();\n      return;\n    }\n\n    const canvas = this.pageCanvasRef()?.nativeElement;\n    if (!canvas) {\n      page.cleanup();\n      return;\n    }\n\n    const rotation = this.#rotation();\n    const baseViewport = page.getViewport({ scale: 1, rotation });\n    const scale = this.#resolveScale(baseViewport);\n    this.#zoom.set(scale);\n    const { logicalViewport, renderViewport } = this.#canvasViewports(page, scale, rotation);\n\n    const ctx = canvas.getContext('2d');\n    if (!ctx) {\n      page.cleanup();\n      return;\n    }\n\n    canvas.width = Math.floor(renderViewport.width);\n    canvas.height = Math.floor(renderViewport.height);\n    canvas.style.width = `${logicalViewport.width}px`;\n    canvas.style.height = `${logicalViewport.height}px`;\n\n    this.#cancelRender();\n    const renderTask = page.render({ canvasContext: ctx, viewport: renderViewport });\n    this.#currentRenderTask = renderTask;\n    let completed = false;\n    try {\n      await renderTask.promise;\n      completed = token === this.#renderToken && !this.#destroyed && this.#pdfDoc() === pdfDoc;\n    } catch {\n      completed = false;\n    } finally {\n      if (this.#currentRenderTask === renderTask) {\n        this.#currentRenderTask = null;\n      }\n      page.cleanup();\n    }\n\n    if (completed) this.zoomChange.emit(scale);\n  }\n\n  #resolveScale(baseViewport: SdPdfViewport): number {\n    const mode = this.#zoomMode();\n    if (typeof mode === 'number') {\n      return Math.min(SdPreviewPdf.MAX_ZOOM, Math.max(SdPreviewPdf.MIN_ZOOM, mode));\n    }\n    if (mode === 'page-actual') return 1;\n    const stage = this.stageEl()?.nativeElement;\n    if (!stage) return 1;\n    const stageRect = stage.getBoundingClientRect();\n    // 32px horizontal + 96px bottom padding lives in the SCSS — subtract it so\n    // the page fits without overlapping the floating toolbar.\n    const availW = Math.max(80, stageRect.width - 48);\n    const availH = Math.max(80, stageRect.height - 120);\n    if (mode === 'page-width') {\n      return availW / baseViewport.width;\n    }\n    // page-fit\n    return Math.min(availW / baseViewport.width, availH / baseViewport.height);\n  }\n\n  #canvasViewports(\n    page: SdPdfPageProxy,\n    scale: number,\n    rotation?: number\n  ): { logicalViewport: SdPdfViewport; renderViewport: SdPdfViewport } {\n    const logicalViewport = page.getViewport({ scale, rotation });\n    const width = Math.max(1, logicalViewport.width);\n    const height = Math.max(1, logicalViewport.height);\n    const factor = Math.min(\n      1,\n      SdPreviewPdf.MAX_CANVAS_DIMENSION / width,\n      SdPreviewPdf.MAX_CANVAS_DIMENSION / height,\n      Math.sqrt(SdPreviewPdf.MAX_CANVAS_PIXELS / (width * height))\n    );\n    return {\n      logicalViewport,\n      renderViewport: factor < 1 ? page.getViewport({ scale: scale * factor, rotation }) : logicalViewport,\n    };\n  }\n\n  #cancelRender(): void {\n    if (this.#currentRenderTask) {\n      try {\n        this.#currentRenderTask.cancel();\n      } catch {\n        /* ignore */\n      }\n      this.#currentRenderTask = null;\n    }\n  }\n\n  onStageScroll(): void {\n    if (this.#scrollModeInternal() === 'continuous') this.#updateContinuousWindow(true);\n  }\n\n  #cancelLoadingTask(): void {\n    const task = this.#currentLoadingTask;\n    this.#currentLoadingTask = null;\n    if (!task?.destroy) return;\n    try {\n      void Promise.resolve(task.destroy()).catch(() => undefined);\n    } catch {\n      return;\n    }\n  }\n\n  #cancelPrint(): void {\n    this.#printGeneration++;\n    this.#cancelPrintJob();\n  }\n\n  #cancelPrintJob(): void {\n    const job = this.#currentPrintJob;\n    this.#currentPrintJob = null;\n    job?.cancel();\n  }\n\n  #isActiveLoad(token: number): boolean {\n    return !this.#destroyed && token === this.#loadToken;\n  }\n\n  #isCurrentDownload(generation: number, source: PdfSource | null, doc: SdPdfDocumentProxy | null): boolean {\n    return !this.#destroyed && generation === this.#downloadGeneration && this.source() === source && this.#pdfDoc() === doc;\n  }\n\n  async #destroyDocument(doc: SdPdfDocumentProxy): Promise<void> {\n    try {\n      await doc.destroy();\n    } catch {\n      return;\n    }\n  }\n\n  async #destroyDoc(): Promise<void> {\n    const doc = this.#pdfDoc();\n    if (!doc) return;\n    this.#pdfDoc.set(null);\n    await this.#destroyDocument(doc);\n  }\n\n  #setZoom(value: number): void {\n    const clamped = Math.min(SdPreviewPdf.MAX_ZOOM, Math.max(SdPreviewPdf.MIN_ZOOM, value));\n    this.#zoom.set(clamped);\n    if (this.#scrollModeInternal() === 'continuous') this.#invalidateContinuousLayout();\n    else void this.#renderActivePage();\n  }\n\n  async #normalizeSource(src: PdfSource): Promise<SdPdfDocumentSpec> {\n    if (typeof src === 'string') {\n      this.#filename.set(this.#guessName(src));\n      const headers = this.httpHeaders();\n      const spec: SdPdfDocumentSpec = { url: src };\n      if (headers) spec.httpHeaders = headers;\n      return spec;\n    }\n    if (this.#browser.isFile(src)) {\n      this.#filename.set(src.name);\n      this.#fileSize.set(src.size);\n      const buf = await src.arrayBuffer();\n      return { data: new Uint8Array(buf) };\n    }\n    if (this.#browser.isBlob(src)) {\n      this.#filename.set('document.pdf');\n      this.#fileSize.set(src.size);\n      const buf = await src.arrayBuffer();\n      return { data: new Uint8Array(buf) };\n    }\n    if (src instanceof ArrayBuffer) {\n      this.#filename.set('document.pdf');\n      this.#fileSize.set(src.byteLength);\n      return { data: new Uint8Array(src.slice(0)) };\n    }\n    if (src instanceof Uint8Array) {\n      this.#filename.set('document.pdf');\n      this.#fileSize.set(src.byteLength);\n      return { data: new Uint8Array(src) };\n    }\n    if (src && typeof src === 'object') {\n      if ('url' in src && typeof src.url === 'string') {\n        this.#filename.set(this.#guessName(src.url));\n        const spec: SdPdfDocumentSpec = { url: src.url };\n        // Caller-provided headers win over the [httpHeaders] input.\n        const headers = src.httpHeaders ?? this.httpHeaders();\n        if (headers) spec.httpHeaders = headers;\n        if (src.withCredentials) spec.withCredentials = true;\n        return spec;\n      }\n      if ('data' in src && (src.data instanceof ArrayBuffer || src.data instanceof Uint8Array)) {\n        this.#filename.set('document.pdf');\n        const data = src.data instanceof ArrayBuffer ? new Uint8Array(src.data.slice(0)) : new Uint8Array(src.data);\n        this.#fileSize.set(data.byteLength);\n        return { data };\n      }\n    }\n    throw new Error('Unsupported PDF source');\n  }\n\n  #guessName(url: string): string {\n    const path = url.split('?')[0];\n    const last = path.substring(path.lastIndexOf('/') + 1);\n    return last || 'document.pdf';\n  }\n\n  /** Map any thrown value into a {reason} we can render. */\n  #classifyError(err: unknown): PdfErrorReason {\n    if (!err) return 'unknown';\n    // pdfjs throws named exception classes — we sniff by name to avoid\n    // importing the constructors (keeps the bundle smaller).\n    const name = (err as { name?: string }).name;\n    if (name === 'PasswordException') return 'password';\n    if (name === 'InvalidPDFException') return 'invalid';\n    if (name === 'MissingPDFException' || name === 'UnexpectedResponseException') {\n      return 'network';\n    }\n    if (err instanceof Error && /network|fetch|cors/i.test(err.message)) {\n      return 'network';\n    }\n    return 'unknown';\n  }\n\n  #errorMessage(err: unknown): string | undefined {\n    if (err instanceof Error) return err.message;\n    return undefined;\n  }\n\n  #emitError(reason: PdfErrorReason, message?: string): void {\n    const ev: PdfErrorEvent = { reason, message };\n    this.#loadError.set(ev);\n    this.#stage.set('error');\n    this.loadError.emit(ev);\n  }\n\n  #revokeAllBlobs(): void {\n    for (const url of this.#ownedBlobUrls) {\n      this.#browser.revokeObjectUrl(url);\n    }\n    this.#ownedBlobUrls.clear();\n  }\n\n  #requiresLoadedDocumentBytes(source: PdfSource): boolean {\n    if (typeof source === 'string') return !!this.httpHeaders();\n    if (!('url' in source) || typeof source.url !== 'string') return false;\n    return !!source.httpHeaders || !!source.withCredentials || !!this.httpHeaders();\n  }\n\n  #trackTemporaryDownloadUrl(url: string | null): string | null {\n    if (url) this.#ownedBlobUrls.add(url);\n    return url;\n  }\n\n  #scheduleTemporaryDownloadUrlRelease(url: string): void {\n    const release = (): void => {\n      if (!this.#ownedBlobUrls.delete(url)) return;\n      this.#browser.revokeObjectUrl(url);\n    };\n    if (this.#browser.scheduleFrame(() => release()) === null) queueMicrotask(release);\n  }\n\n  // ==========================================\n  // SEARCH HELPERS\n  // ==========================================\n\n  /**\n   * Build the search regex. We escape every metachar so the term is matched\n   * literally (so `foo.bar` doesn't treat `.` as \"any char\"). Unicode flag\n   * `u` makes `\\b` understand Vietnamese diacritic-bearing letters as word\n   * characters — without it `\\b` would split `đ` at the d, breaking\n   * whole-word matches on Vietnamese terms.\n   */\n  #buildSearchRegex(term: string, caseSensitive: boolean, wholeWord: boolean): RegExp | null {\n    if (!term) return null;\n    const escaped = term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n    const flags = (caseSensitive ? 'g' : 'gi') + 'u';\n    const wordCharacter = '[\\\\p{L}\\\\p{M}\\\\p{N}\\\\p{Pc}]';\n    const pattern = wholeWord ? '(?<!' + wordCharacter + ')' + escaped + '(?!' + wordCharacter + ')' : escaped;\n    try {\n      return new RegExp(pattern, flags);\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Fetch (and cache) the plain text of a single page. We normalize to NFC\n   * so the same Vietnamese letter encoded as composed vs decomposed sequences\n   * (NFD) matches the same search term — pdfjs has been seen to return NFD\n   * in some PDFs.\n   */\n  async #getPageText(doc: SdPdfDocumentProxy, pageNum: number, searchToken: number, scan: PdfPageTextScan): Promise<string> {\n    const cached = scan.staged.get(pageNum) ?? scan.snapshot.get(pageNum);\n    if (cached !== undefined) {\n      this.#stagePageText(scan, pageNum, cached);\n      return cached;\n    }\n    let page: SdPdfPageProxy;\n    try {\n      page = await doc.getPage(pageNum);\n    } catch {\n      return '';\n    }\n    let text = '';\n    try {\n      const content = await page.getTextContent();\n      const items = content && typeof content === 'object' && 'items' in content && Array.isArray(content.items) ? content.items : [];\n      const parts: string[] = [];\n      for (const it of items) {\n        if (it && typeof it === 'object' && 'str' in it && typeof it.str === 'string') parts.push(it.str);\n      }\n      // Space-join so multi-word matches across textItem boundaries work.\n      text = parts.join(' ').normalize('NFC');\n    } catch {\n      text = '';\n    } finally {\n      page.cleanup();\n    }\n    if (searchToken === this.#searchToken && this.#pdfDoc() === doc && !this.#destroyed) {\n      this.#stagePageText(scan, pageNum, text);\n    }\n    return text;\n  }\n\n  #stagePageText(scan: PdfPageTextScan, pageNum: number, text: string): void {\n    scan.staged.delete(pageNum);\n    scan.staged.set(pageNum, text);\n    while (scan.staged.size > SdPreviewPdf.MAX_PAGE_TEXT_CACHE_PAGES) {\n      const oldestPage = scan.staged.keys().next().value as number | undefined;\n      if (oldestPage === undefined) break;\n      scan.staged.delete(oldestPage);\n    }\n  }\n\n  #commitPageTextScan(scan: PdfPageTextScan): void {\n    for (const [pageNum, text] of scan.staged) this.#cachePageText(pageNum, text);\n  }\n\n  #cachePageText(pageNum: number, text: string): void {\n    this.#pageTextCache.delete(pageNum);\n    this.#pageTextCache.set(pageNum, text);\n    while (this.#pageTextCache.size > SdPreviewPdf.MAX_PAGE_TEXT_CACHE_PAGES) {\n      const oldestPage = this.#pageTextCache.keys().next().value as number | undefined;\n      if (oldestPage === undefined) break;\n      this.#pageTextCache.delete(oldestPage);\n    }\n    this.#pageTextCacheSize.set(this.#pageTextCache.size);\n  }\n\n  #clearPageTextCache(): void {\n    this.#pageTextCache.clear();\n    this.#pageTextCacheSize.set(0);\n  }\n\n  #emitSearchChange(): void {\n    this.searchChange.emit({\n      term: this.#searchTerm(),\n      total: this.#searchResults().length,\n      current: this.#searchActiveIndex() + 1, // 1-based; 0 when no active\n      truncated: this.#searchTruncated(),\n    });\n  }\n\n  /**\n   * Paint highlight marks over the current page's canvas wrapper. WHY DOM\n   * append (not text layer): rendering the proper pdf.js text layer is a\n   * larger change — out-of-scope here. Instead we drop floating `<mark>`\n   * pills near the top of the page; they're a visual cue that the page\n   * contains a hit + which one is active, even when we can't place them\n   * pixel-accurately. The result-list cards still drive precise navigation.\n   *\n   * Tradeoff documented in sd-preview.md.\n   */\n  #applyHighlightsForActivePage(): void {\n    const wrap = this.#hostEl.nativeElement.querySelector('.sd-preview-pdf-page-wrap');\n    if (!wrap) return;\n    // Clear prior overlay.\n    const prior = wrap.querySelector('.sd-pdf-search-overlay');\n    if (prior) prior.remove();\n\n    const term = this.#searchTerm();\n    const results = this.#searchResults();\n    const activeIdx = this.#searchActiveIndex();\n    const activePage = this.activePage();\n    if (!term || results.length === 0) return;\n\n    const pageHits = results.map((r, i) => ({ r, i })).filter(({ r }) => r.page === activePage);\n    if (pageHits.length === 0) return;\n\n    const overlay = this.#browser.createElement('div');\n    if (!overlay) return;\n    overlay.className = 'sd-pdf-search-overlay';\n    for (const { r, i } of pageHits) {\n      const m = this.#browser.createElement('mark');\n      if (!m) continue;\n      m.className = i === activeIdx ? 'sd-pdf-search-hi sd-pdf-search-hi--active' : 'sd-pdf-search-hi';\n      m.textContent = r.term;\n      overlay.appendChild(m);\n    }\n    wrap.appendChild(overlay);\n\n    // Scroll the active mark into view if it lives on this page.\n    if (activeIdx >= 0 && results[activeIdx]?.page === activePage) {\n      const activeMark = overlay.querySelector('.sd-pdf-search-hi--active') as HTMLElement | null;\n      try {\n        activeMark?.scrollIntoView({ block: 'center', behavior: 'smooth' });\n      } catch {\n        // older Safari throws on smooth — fall back silently\n      }\n    }\n  }\n\n  #onScrollModeChanged(): void {\n    if (this.#destroyed || this.#stage() !== 'ready') return;\n    if (this.#scrollModeInternal() === 'continuous') {\n      this.#cancelRender();\n      this.#resetContinuousLayout(this.numPages());\n      this.#positionContinuousPage(this.#activePage());\n      return;\n    }\n    this.#cancelContinuousRenders();\n    this.#continuousPages.set([]);\n    this.#continuousTopSpacer.set(0);\n    this.#continuousBottomSpacer.set(0);\n    void this.#renderActivePage();\n  }\n\n  #estimatedContinuousHeight(): number {\n    const rotated = this.#rotation() % 180 !== 0;\n    const baseViewport: SdPdfViewport = rotated ? { width: 792, height: 612 } : { width: 612, height: 792 };\n    return Math.max(1, baseViewport.height * this.#resolveScale(baseViewport));\n  }\n\n  #resetContinuousLayout(pageCount: number): void {\n    const estimatedHeight = this.#estimatedContinuousHeight();\n    this.#pageHeights = Array.from({ length: pageCount }, () => estimatedHeight);\n    this.#heightIndex.reset(this.#pageHeights);\n    this.#continuousHeightVersion.update(version => version + 1);\n  }\n\n  #continuousPageIndexAt(offset: number): number {\n    return this.#heightIndex.indexAt(offset);\n  }\n\n  #updateContinuousWindow(updateActivePage: boolean): void {\n    const stage = this.stageEl()?.nativeElement;\n    const pageCount = this.#pageHeights.length;\n    if (!stage || pageCount === 0 || this.#scrollModeInternal() !== 'continuous') return;\n    const viewportHeight = Math.max(1, stage.clientHeight || stage.getBoundingClientRect().height || 1);\n    const firstVisible = this.#continuousPageIndexAt(stage.scrollTop);\n    const lastVisible = this.#continuousPageIndexAt(stage.scrollTop + viewportHeight - 1);\n    const first = Math.max(0, firstVisible - 1);\n    const last = Math.min(pageCount - 1, lastVisible + 1);\n    const pages = Array.from({ length: last - first + 1 }, (_, index) => first + index + 1);\n    this.#continuousPages.set(pages);\n    this.#continuousTopSpacer.set(this.#heightIndex.offsetAt(first));\n    const renderedEnd = this.#heightIndex.offsetAt(last) + this.#pageHeights[last];\n    this.#continuousBottomSpacer.set(Math.max(0, this.#heightIndex.total() - renderedEnd));\n\n    const retained = new Set(pages);\n    for (const [pageNumber, task] of this.#continuousTasks) {\n      if (retained.has(pageNumber)) continue;\n      task.cancel();\n      this.#continuousTasks.delete(pageNumber);\n    }\n\n    if (!updateActivePage) return;\n    const midpointPage = this.#continuousPageIndexAt(stage.scrollTop + viewportHeight / 2) + 1;\n    if (midpointPage === this.#activePage()) return;\n    this.#activePage.set(midpointPage);\n    if (!this.#destroyed) this.pageChange.emit(midpointPage);\n  }\n\n  #positionContinuousPage(pageNumber: number): void {\n    const stage = this.stageEl()?.nativeElement;\n    if (stage) stage.scrollTop = this.#heightIndex.offsetAt(pageNumber - 1);\n    this.#updateContinuousWindow(false);\n    this.#rescheduleContinuousRenders();\n  }\n\n  #invalidateContinuousLayout(): void {\n    const stage = this.stageEl()?.nativeElement;\n    const anchorIndex = stage ? this.#continuousPageIndexAt(stage.scrollTop) : 0;\n    const oldHeight = this.#pageHeights[anchorIndex] || 1;\n    const oldOffset = this.#heightIndex.offsetAt(anchorIndex);\n    const anchorRatio = stage ? Math.max(0, Math.min(1, (stage.scrollTop - oldOffset) / oldHeight)) : 0;\n    this.#cancelContinuousRenders();\n    this.#resetContinuousLayout(this.numPages());\n    if (stage) stage.scrollTop = this.#heightIndex.offsetAt(anchorIndex) + this.#pageHeights[anchorIndex] * anchorRatio;\n    this.#updateContinuousWindow(false);\n    this.#rescheduleContinuousRenders();\n  }\n\n  #rescheduleContinuousRenders(): void {\n    queueMicrotask(() => {\n      if (this.#destroyed || this.#scrollModeInternal() !== 'continuous') return;\n      this.#scheduleContinuousRenders(this.continuousCanvases().map(ref => ref.nativeElement));\n    });\n  }\n\n  #scheduleContinuousRenders(canvases: HTMLCanvasElement[]): void {\n    if (this.#continuousFrame !== null) this.#browser.cancelFrame(this.#continuousFrame);\n    if (canvases.length === 0 || this.#scrollModeInternal() !== 'continuous') {\n      this.#continuousFrame = null;\n      return;\n    }\n    this.#continuousFrame = this.#browser.scheduleFrame(() => {\n      this.#continuousFrame = null;\n      for (const canvas of canvases) void this.#renderContinuousCanvas(canvas);\n    });\n  }\n\n  async #renderContinuousCanvas(canvas: HTMLCanvasElement): Promise<void> {\n    const pageNumber = Number(canvas.getAttribute('data-page'));\n    const doc = this.#pdfDoc();\n    const generation = this.#layoutGeneration;\n    if (\n      !doc ||\n      !Number.isInteger(pageNumber) ||\n      pageNumber < 1 ||\n      this.#continuousTasks.has(pageNumber) ||\n      this.#continuousReservations.has(pageNumber)\n    )\n      return;\n    const reservation = { generation };\n    this.#continuousReservations.set(pageNumber, reservation);\n    let page: SdPdfPageProxy | null = null;\n    try {\n      page = await doc.getPage(pageNumber);\n      if (!this.#isCurrentContinuousPage(doc, generation, pageNumber)) return;\n      const rotation = this.#rotation();\n      const baseViewport = page.getViewport({ scale: 1, rotation });\n      const scale = this.#resolveScale(baseViewport);\n      const { logicalViewport, renderViewport } = this.#canvasViewports(page, scale, rotation);\n      const context = canvas.getContext('2d');\n      if (!context) return;\n      canvas.width = Math.floor(renderViewport.width);\n      canvas.height = Math.floor(renderViewport.height);\n      canvas.style.width = `${logicalViewport.width}px`;\n      canvas.style.height = `${logicalViewport.height}px`;\n      const task = page.render({ canvasContext: context, viewport: renderViewport });\n      this.#continuousTasks.set(pageNumber, task);\n      try {\n        await task.promise;\n      } catch {\n        return;\n      } finally {\n        if (this.#continuousTasks.get(pageNumber) === task) this.#continuousTasks.delete(pageNumber);\n      }\n      if (!this.#isCurrentContinuousPage(doc, generation, pageNumber)) return;\n      this.#updateContinuousMeasurement(pageNumber, logicalViewport.height);\n      this.#zoom.set(scale);\n      this.zoomChange.emit(scale);\n    } finally {\n      if (this.#continuousReservations.get(pageNumber) === reservation) this.#continuousReservations.delete(pageNumber);\n      page?.cleanup();\n    }\n  }\n\n  #isCurrentContinuousPage(doc: SdPdfDocumentProxy, generation: number, pageNumber: number): boolean {\n    return (\n      !this.#destroyed && this.#pdfDoc() === doc && this.#layoutGeneration === generation && this.#continuousPages().includes(pageNumber)\n    );\n  }\n\n  #updateContinuousMeasurement(pageNumber: number, height: number): void {\n    const index = pageNumber - 1;\n    if (!Number.isFinite(height) || height <= 0 || Math.abs((this.#pageHeights[index] ?? 0) - height) < 0.5) return;\n    const stage = this.stageEl()?.nativeElement;\n    const anchorIndex = stage ? this.#continuousPageIndexAt(stage.scrollTop) : 0;\n    const anchorDelta = stage ? stage.scrollTop - this.#heightIndex.offsetAt(anchorIndex) : 0;\n    this.#pageHeights[index] = height;\n    this.#heightIndex.updateHeight(index, height);\n    this.#continuousHeightVersion.update(version => version + 1);\n    if (stage) stage.scrollTop = this.#heightIndex.offsetAt(anchorIndex) + anchorDelta;\n    this.#updateContinuousWindow(false);\n  }\n\n  #cancelContinuousRenders(): void {\n    this.#layoutGeneration++;\n    if (this.#continuousFrame !== null) {\n      this.#browser.cancelFrame(this.#continuousFrame);\n      this.#continuousFrame = null;\n    }\n    for (const task of this.#continuousTasks.values()) task.cancel();\n    this.#continuousTasks.clear();\n    this.#continuousReservations.clear();\n  }\n\n  // ==========================================\n  // THUMBNAIL HELPERS\n  // ==========================================\n\n  /**\n   * Rebind the IntersectionObserver to whatever set of thumbnail canvases is\n   * currently mounted. Called from an effect that tracks `thumbCanvases()`.\n   */\n  #syncThumbObserver(canvases: HTMLCanvasElement[]): void {\n    this.#thumbObserverCleanup?.();\n    this.#thumbObserverCleanup = null;\n    const currentPages = new Set(canvases.map(canvas => Number(canvas.getAttribute('data-page'))).filter(page => Number.isFinite(page)));\n    this.#cancelThumbnailWorkOutside(currentPages);\n    if (canvases.length === 0) {\n      return;\n    }\n    this.#thumbObserverCleanup = this.#browser.observeIntersections(\n      canvases,\n      entries => {\n        for (const entry of entries) {\n          if (!entry.isIntersecting) continue;\n          const canvas = canvases.find(candidate => candidate === entry.target);\n          if (!canvas) continue;\n          const n = Number(canvas.getAttribute('data-page'));\n          if (!Number.isFinite(n)) continue;\n          void this.#renderThumbnail(n, canvas);\n        }\n      },\n      { rootMargin: '120px 0px 120px 0px', threshold: 0.01 }\n    );\n  }\n\n  #ensureThumbnailPageVisible(pageNumber: number): void {\n    const start = this.#thumbnailWindowStart();\n    const end = start + SdPreviewPdf.THUMBNAIL_WINDOW_SIZE;\n    if (pageNumber > start && pageNumber <= end) return;\n    const centered = pageNumber - 1 - Math.floor(SdPreviewPdf.THUMBNAIL_WINDOW_SIZE / 2);\n    const next = Math.max(0, Math.min(centered, Math.max(0, this.numPages() - SdPreviewPdf.THUMBNAIL_WINDOW_SIZE)));\n    this.#thumbnailWindowStart.set(next);\n    queueMicrotask(() => {\n      const content = this.sidebarContentRef()?.nativeElement;\n      if (content && this.#sidebarModeInternal() === 'thumbnails') {\n        content.scrollTop = next * SdPreviewPdf.THUMBNAIL_ITEM_HEIGHT;\n      }\n    });\n  }\n\n  /**\n   * Render a single page into a sidebar thumbnail canvas at ~140px width.\n   * Reserved in `#thumbnailWork` before getPage() so rapid scroll bounces\n   * cannot start duplicate work for the same mounted page.\n   *\n   * Visible for testing — tests can stub `getPage()` on the fake doc to\n   * assert this method calls `render(...)` with the right page argument.\n   */\n  async renderThumbnailForPage(pageNum: number): Promise<void> {\n    const canvas = this.thumbCanvases()\n      .map(r => r.nativeElement)\n      .find(c => Number(c.getAttribute('data-page')) === pageNum);\n    if (!canvas) return;\n    return this.#renderThumbnail(pageNum, canvas);\n  }\n\n  async #renderThumbnail(pageNum: number, canvas: HTMLCanvasElement): Promise<void> {\n    const doc = this.#pdfDoc();\n    if (!doc) return;\n    if (this.#thumbnailWork.has(pageNum)) return;\n    const cachedThumbnail = this.#getCachedThumbnail(pageNum);\n    if (cachedThumbnail) {\n      this.#paintCachedThumb(canvas, cachedThumbnail, this.#loadToken);\n      return;\n    }\n    const loadToken = this.#loadToken;\n    const work: PdfThumbnailWork = {\n      loadToken,\n      cancelled: false,\n      renderTask: null,\n      slotState: 'new',\n      resumeSlot: null,\n    };\n    this.#thumbnailWork.set(pageNum, work);\n    this.#thumbnailWorkCount.set(this.#thumbnailWork.size);\n    let page: SdPdfPageProxy | null = null;\n    let acquiredSlot = false;\n    try {\n      acquiredSlot = await this.#acquireThumbnailSlot(work);\n      if (!acquiredSlot || !this.#isThumbnailWorkActive(pageNum, work, doc)) return;\n      page = await doc.getPage(pageNum);\n      if (!this.#isThumbnailWorkActive(pageNum, work, doc)) return;\n      const baseViewport = page.getViewport({ scale: 1 });\n      const scale = 140 / Math.max(1, baseViewport.width);\n      const { logicalViewport, renderViewport } = this.#canvasViewports(page, scale);\n      canvas.width = Math.floor(renderViewport.width);\n      canvas.height = Math.floor(renderViewport.height);\n      canvas.style.width = `${logicalViewport.width}px`;\n      canvas.style.height = `${logicalViewport.height}px`;\n      const ctx = canvas.getContext('2d');\n      if (!ctx) return;\n      const renderTask = page.render({ canvasContext: ctx, viewport: renderViewport });\n      work.renderTask = renderTask;\n      try {\n        await renderTask.promise;\n      } catch {\n        return;\n      }\n      if (!this.#isThumbnailWorkActive(pageNum, work, doc)) return;\n      try {\n        const dataUrl = canvas.toDataURL('image/png');\n        this.#cacheThumbnail(pageNum, dataUrl);\n      } catch {\n        return;\n      }\n    } catch {\n      return;\n    } finally {\n      if (acquiredSlot) this.#releaseThumbnailSlot(work);\n      if (this.#thumbnailWork.get(pageNum) === work) {\n        this.#thumbnailWork.delete(pageNum);\n        this.#thumbnailWorkCount.set(this.#thumbnailWork.size);\n      }\n      page?.cleanup();\n    }\n  }\n\n  #isThumbnailWorkActive(pageNum: number, work: PdfThumbnailWork, doc: SdPdfDocumentProxy): boolean {\n    return (\n      !work.cancelled &&\n      work.loadToken === this.#loadToken &&\n      this.#isActiveLoad(work.loadToken) &&\n      this.#pdfDoc() === doc &&\n      this.#thumbnailWork.get(pageNum) === work &&\n      this.pageNumbers().includes(pageNum)\n    );\n  }\n\n  #getCachedThumbnail(pageNum: number): string | undefined {\n    const cached = this.#thumbnailCacheLru.get(pageNum);\n    if (cached === undefined) return undefined;\n    this.#thumbnailCacheLru.delete(pageNum);\n    this.#thumbnailCacheLru.set(pageNum, cached);\n    return cached;\n  }\n\n  #cacheThumbnail(pageNum: number, dataUrl: string): void {\n    this.#thumbnailCacheLru.delete(pageNum);\n    this.#thumbnailCacheLru.set(pageNum, dataUrl);\n    while (this.#thumbnailCacheLru.size > SdPreviewPdf.MAX_THUMBNAIL_CACHE_ENTRIES) {\n      const oldestPage = this.#thumbnailCacheLru.keys().next().value as number | undefined;\n      if (oldestPage === undefined) break;\n      this.#thumbnailCacheLru.delete(oldestPage);\n    }\n    this.#thumbCache.set(Object.fromEntries(this.#thumbnailCacheLru));\n  }\n\n  #cancelThumbnailRenders(): void {\n    for (const work of this.#thumbnailWork.values()) this.#cancelThumbnailWork(work);\n    this.#thumbnailWork.clear();\n    this.#thumbnailWorkCount.set(0);\n  }\n\n  #cancelThumbnailWorkOutside(currentPages: ReadonlySet<number>): void {\n    for (const [pageNumber, work] of this.#thumbnailWork) {\n      if (currentPages.has(pageNumber)) continue;\n      this.#cancelThumbnailWork(work);\n      this.#thumbnailWork.delete(pageNumber);\n    }\n    this.#thumbnailWorkCount.set(this.#thumbnailWork.size);\n  }\n\n  #cancelThumbnailWork(work: PdfThumbnailWork): void {\n    work.cancelled = true;\n    if (work.slotState === 'queued') {\n      const queueIndex = this.#thumbnailSlotQueue.indexOf(work);\n      if (queueIndex >= 0) this.#thumbnailSlotQueue.splice(queueIndex, 1);\n      work.slotState = 'released';\n      const resume = work.resumeSlot;\n      work.resumeSlot = null;\n      resume?.(false);\n    }\n    try {\n      work.renderTask?.cancel();\n    } catch {\n      // Cancellation is best-effort; the identity guard still blocks late cache writes.\n    }\n  }\n\n  #acquireThumbnailSlot(work: PdfThumbnailWork): Promise<boolean> {\n    if (work.cancelled || this.#destroyed) return Promise.resolve(false);\n    if (this.#activeThumbnailSlots < SdPreviewPdf.MAX_CONCURRENT_THUMBNAIL_WORK) {\n      this.#activeThumbnailSlots++;\n      work.slotState = 'active';\n      return Promise.resolve(true);\n    }\n    work.slotState = 'queued';\n    return new Promise<boolean>(resolve => {\n      work.resumeSlot = resolve;\n      this.#thumbnailSlotQueue.push(work);\n    });\n  }\n\n  #releaseThumbnailSlot(work: PdfThumbnailWork): void {\n    if (work.slotState !== 'active') return;\n    work.slotState = 'released';\n    this.#activeThumbnailSlots = Math.max(0, this.#activeThumbnailSlots - 1);\n    while (this.#thumbnailSlotQueue.length > 0) {\n      const next = this.#thumbnailSlotQueue.shift()!;\n      if (next.cancelled || next.slotState !== 'queued') {\n        const resumeCancelled = next.resumeSlot;\n        next.resumeSlot = null;\n        next.slotState = 'released';\n        resumeCancelled?.(false);\n        continue;\n      }\n      this.#activeThumbnailSlots++;\n      next.slotState = 'active';\n      const resume = next.resumeSlot;\n      next.resumeSlot = null;\n      resume?.(true);\n      break;\n    }\n  }\n\n  /**\n   * Paint a previously-rendered dataURL onto a freshly-mounted canvas so the\n   * mini-page reappears without re-rasterizing.\n   */\n  #paintCachedThumb(canvas: HTMLCanvasElement, dataUrl: string, loadToken: number): void {\n    const img = this.#browser.createImage();\n    if (!img) return;\n    img.onload = () => {\n      if (!this.#isActiveLoad(loadToken)) return;\n      canvas.width = img.naturalWidth;\n      canvas.height = img.naturalHeight;\n      canvas.style.width = `${img.naturalWidth}px`;\n      canvas.style.height = `${img.naturalHeight}px`;\n      const ctx = canvas.getContext('2d');\n      ctx?.drawImage(img, 0, 0);\n    };\n    img.src = dataUrl;\n  }\n}\n","<!--\n  sd-preview-pdf shell. Self-contained — sizes to its parent. Consumer wraps\n  in <sd-modal>/<sd-side-drawer>/page section. Header + sidebar + stage +\n  floating toolbar mirror Artboards A / C / E from the design handoff.\n-->\n<div class=\"sd-preview-pdf-shell\" role=\"region\">\n  @let _stage = stage();\n  @let _numPages = numPages();\n  @let _activePage = activePage();\n  @let _isSidebarOpen = isSidebarOpen();\n  @let _searchBarOpen = searchBarOpen();\n  @let _searchTerm = searchTerm();\n  @let _searchTotal = searchTotal();\n\n  <!-- ============================================\n       HEADER BAR — hidden in empty + loading per design\n       ============================================ -->\n  @if (_stage === 'ready') {\n    <div class=\"sd-preview-pdf-header\">\n      <div class=\"sd-preview-pdf-header__left\">\n        <button\n          type=\"button\"\n          class=\"sd-preview-pdf-iconbtn\"\n          [class.sd-preview-pdf-iconbtn--active]=\"_isSidebarOpen\"\n          [attr.aria-expanded]=\"_isSidebarOpen\"\n          [attr.aria-controls]=\"sidebarRegionId()\"\n          [attr.aria-label]=\"'core.component.preview-pdf.toggle-sidebar' | translate\"\n          [attr.title]=\"'core.component.preview-pdf.toggle-sidebar' | translate\"\n          [attr.data-autoId]=\"autoIdSidebarToggle()\"\n          (click)=\"toggleSidebar()\">\n          <sd-icon fontIcon=\"menu\"></sd-icon>\n        </button>\n        <span class=\"sd-preview-pdf-header__divider\"></span>\n        <div class=\"sd-preview-pdf-fileicon\" aria-hidden=\"true\">PDF</div>\n        <div class=\"sd-preview-pdf-header__meta\">\n          <div class=\"sd-preview-pdf-header__name\" [title]=\"title() || filename()\">\n            {{ title() || filename() }}\n          </div>\n          <div class=\"sd-preview-pdf-header__sub\">\n            {{ 'core.component.preview-pdf.pages-count' | translate: { count: _numPages } }}\n          </div>\n        </div>\n      </div>\n\n      <div class=\"sd-preview-pdf-header__right\">\n        <button\n          type=\"button\"\n          class=\"sd-preview-pdf-iconbtn\"\n          [class.sd-preview-pdf-iconbtn--active]=\"_searchBarOpen\"\n          [attr.aria-expanded]=\"_searchBarOpen\"\n          [attr.aria-controls]=\"searchBarId()\"\n          [attr.aria-label]=\"'core.component.preview-pdf.search' | translate\"\n          [attr.title]=\"'core.component.preview-pdf.search' | translate\"\n          [attr.data-autoId]=\"autoIdSearchToggle()\"\n          (click)=\"searchBarOpen() ? closeSearch() : openSearch()\">\n          <sd-icon fontIcon=\"search\"></sd-icon>\n        </button>\n        @if (canPrint()) {\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-iconbtn\"\n            [attr.aria-label]=\"'core.component.preview-pdf.print' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.print' | translate\"\n            [attr.data-autoId]=\"autoIdPrint()\"\n            (click)=\"printFile()\">\n            <sd-icon fontIcon=\"print\"></sd-icon>\n          </button>\n        }\n        @if (canDownload()) {\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-iconbtn\"\n            [attr.aria-label]=\"'core.component.preview-pdf.download' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.download' | translate\"\n            [attr.data-autoId]=\"autoIdDownload()\"\n            (click)=\"downloadFile()\">\n            <sd-icon fontIcon=\"download\"></sd-icon>\n          </button>\n        }\n        @if (canFullscreen()) {\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-iconbtn\"\n            [attr.aria-label]=\"'core.component.preview-pdf.fullscreen' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.fullscreen' | translate\"\n            [attr.data-autoId]=\"autoIdFullscreen()\"\n            (click)=\"toggleFullscreen()\">\n            <sd-icon [fontIcon]=\"isFullscreen() ? 'fullscreen_exit' : 'fullscreen'\"></sd-icon>\n          </button>\n        }\n      </div>\n    </div>\n\n    <!-- ============================================\n         SEARCH BAR — between header + body, only when bar is open\n         ============================================ -->\n    <div\n      class=\"sd-preview-pdf-searchbar\"\n      role=\"search\"\n      [id]=\"searchBarId()\"\n      [hidden]=\"!_searchBarOpen\"\n      [style.display]=\"_searchBarOpen ? null : 'none'\">\n      @if (_searchBarOpen) {\n        <sd-icon class=\"sd-preview-pdf-searchbar__icon\" fontIcon=\"search\"></sd-icon>\n        <input\n          #searchInput\n          type=\"text\"\n          class=\"sd-preview-pdf-searchbar__input\"\n          [attr.aria-label]=\"'core.component.preview-pdf.search-placeholder' | translate\"\n          [attr.placeholder]=\"'core.component.preview-pdf.search-placeholder' | translate\"\n          [value]=\"_searchTerm\"\n          [attr.data-autoId]=\"autoIdSearchInput()\"\n          (input)=\"onSearchInput($event)\" />\n        <span class=\"sd-preview-pdf-searchbar__counter\" aria-live=\"polite\">\n          {{ searchCurrent() }} / {{ _searchTotal }}{{ searchTruncated() ? '+' : '' }}\n        </span>\n        <button\n          type=\"button\"\n          class=\"sd-preview-pdf-iconbtn\"\n          [disabled]=\"_searchTotal === 0\"\n          [attr.aria-label]=\"'core.component.preview-pdf.search-prev' | translate\"\n          [attr.title]=\"'core.component.preview-pdf.search-prev' | translate\"\n          [attr.data-autoId]=\"autoIdSearchPrev()\"\n          (click)=\"searchPrev()\">\n          <sd-icon fontIcon=\"keyboard_arrow_up\"></sd-icon>\n        </button>\n        <button\n          type=\"button\"\n          class=\"sd-preview-pdf-iconbtn\"\n          [disabled]=\"_searchTotal === 0\"\n          [attr.aria-label]=\"'core.component.preview-pdf.search-next' | translate\"\n          [attr.title]=\"'core.component.preview-pdf.search-next' | translate\"\n          [attr.data-autoId]=\"autoIdSearchNext()\"\n          (click)=\"searchNext()\">\n          <sd-icon fontIcon=\"keyboard_arrow_down\"></sd-icon>\n        </button>\n        <span class=\"sd-preview-pdf-searchbar__divider\"></span>\n        <button\n          type=\"button\"\n          class=\"sd-preview-pdf-iconbtn\"\n          [class.sd-preview-pdf-iconbtn--active]=\"searchCaseSensitive()\"\n          [attr.aria-pressed]=\"searchCaseSensitive()\"\n          [attr.aria-label]=\"'core.component.preview-pdf.search-case' | translate\"\n          [attr.title]=\"'core.component.preview-pdf.search-case' | translate\"\n          [attr.data-autoId]=\"autoIdSearchCase()\"\n          (click)=\"toggleSearchCaseSensitive()\">\n          <sd-icon fontIcon=\"match_case\"></sd-icon>\n        </button>\n        <button\n          type=\"button\"\n          class=\"sd-preview-pdf-iconbtn\"\n          [class.sd-preview-pdf-iconbtn--active]=\"searchWholeWord()\"\n          [attr.aria-pressed]=\"searchWholeWord()\"\n          [attr.aria-label]=\"'core.component.preview-pdf.search-whole' | translate\"\n          [attr.title]=\"'core.component.preview-pdf.search-whole' | translate\"\n          [attr.data-autoId]=\"autoIdSearchWhole()\"\n          (click)=\"toggleSearchWholeWord()\">\n          <sd-icon fontIcon=\"text_fields\"></sd-icon>\n        </button>\n        <span class=\"sd-preview-pdf-searchbar__spacer\"></span>\n        <button\n          type=\"button\"\n          class=\"sd-preview-pdf-iconbtn\"\n          [attr.aria-label]=\"'core.component.preview-pdf.search-close' | translate\"\n          [attr.title]=\"'core.component.preview-pdf.search-close' | translate\"\n          [attr.data-autoId]=\"autoIdSearchClose()\"\n          (click)=\"closeSearch()\">\n          <sd-icon fontIcon=\"close\"></sd-icon>\n        </button>\n      }\n    </div>\n  }\n\n  <!-- ============================================\n       BODY — sidebar + stage\n       ============================================ -->\n  <div class=\"sd-preview-pdf-body\">\n    <!-- SIDEBAR ............................................................. -->\n    @if (_stage === 'ready') {\n      <aside\n        class=\"sd-preview-pdf-sidebar\"\n        role=\"complementary\"\n        [id]=\"sidebarRegionId()\"\n        [hidden]=\"!_isSidebarOpen\"\n        [style.display]=\"_isSidebarOpen ? null : 'none'\">\n        @if (_isSidebarOpen) {\n          @let _sidebarMode = sidebarMode();\n          <div class=\"sd-preview-pdf-sidebar__tabs\" role=\"tablist\">\n            <button\n              #sidebarTab\n              type=\"button\"\n              class=\"sd-preview-pdf-sidebar__tab\"\n              role=\"tab\"\n              [id]=\"tabThumbnailsId()\"\n              [attr.aria-selected]=\"_sidebarMode === 'thumbnails'\"\n              [attr.aria-controls]=\"sidebarPanelId()\"\n              [attr.tabindex]=\"_sidebarMode === 'thumbnails' ? 0 : -1\"\n              [class.sd-preview-pdf-sidebar__tab--active]=\"_sidebarMode === 'thumbnails'\"\n              data-sidebar-mode=\"thumbnails\"\n              [attr.data-autoId]=\"autoIdTabThumbnails()\"\n              (keydown)=\"onSidebarTabKeyDown($event, 'thumbnails')\"\n              (click)=\"setSidebarMode('thumbnails')\">\n              <sd-icon fontIcon=\"view_carousel\"></sd-icon>\n              <span>{{ 'core.component.preview-pdf.tab.thumbnails' | translate }}</span>\n            </button>\n            <button\n              #sidebarTab\n              type=\"button\"\n              class=\"sd-preview-pdf-sidebar__tab\"\n              role=\"tab\"\n              [id]=\"tabOutlineId()\"\n              [attr.aria-selected]=\"_sidebarMode === 'outline'\"\n              [attr.aria-controls]=\"sidebarPanelId()\"\n              [attr.tabindex]=\"_sidebarMode === 'outline' ? 0 : -1\"\n              [class.sd-preview-pdf-sidebar__tab--active]=\"_sidebarMode === 'outline'\"\n              data-sidebar-mode=\"outline\"\n              [attr.data-autoId]=\"autoIdTabOutline()\"\n              (keydown)=\"onSidebarTabKeyDown($event, 'outline')\"\n              (click)=\"setSidebarMode('outline')\">\n              <sd-icon fontIcon=\"list\"></sd-icon>\n              <span>{{ 'core.component.preview-pdf.tab.outline' | translate }}</span>\n            </button>\n            <button\n              #sidebarTab\n              type=\"button\"\n              class=\"sd-preview-pdf-sidebar__tab\"\n              role=\"tab\"\n              [id]=\"tabSearchId()\"\n              [attr.aria-selected]=\"_sidebarMode === 'search'\"\n              [attr.aria-controls]=\"sidebarPanelId()\"\n              [attr.tabindex]=\"_sidebarMode === 'search' ? 0 : -1\"\n              [class.sd-preview-pdf-sidebar__tab--active]=\"_sidebarMode === 'search'\"\n              data-sidebar-mode=\"search\"\n              [attr.data-autoId]=\"autoIdTabSearch()\"\n              (keydown)=\"onSidebarTabKeyDown($event, 'search')\"\n              (click)=\"setSidebarMode('search')\">\n              <sd-icon fontIcon=\"search\"></sd-icon>\n              <span>{{ 'core.component.preview-pdf.tab.search' | translate }}</span>\n            </button>\n          </div>\n\n          <div\n            #sidebarContent\n            class=\"sd-preview-pdf-sidebar__content\"\n            role=\"tabpanel\"\n            [id]=\"sidebarPanelId()\"\n            [attr.aria-labelledby]=\"sidebarActiveTabId()\"\n            (scroll)=\"onThumbnailSidebarScroll($event)\">\n            @switch (_sidebarMode) {\n              @case ('thumbnails') {\n                <ul class=\"sd-preview-pdf-thumb-list\">\n                  <li class=\"sd-preview-pdf-thumb-list__spacer\" aria-hidden=\"true\" [style.height.px]=\"thumbnailTopSpacer()\"></li>\n                  @for (p of pageNumbers(); track trackByPage($index, p)) {\n                    <li>\n                      <button\n                        type=\"button\"\n                        class=\"sd-preview-pdf-thumb\"\n                        [class.sd-preview-pdf-thumb--active]=\"p === _activePage\"\n                        [attr.aria-current]=\"p === _activePage ? 'page' : null\"\n                        [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: p, total: _numPages }\"\n                        [attr.data-autoId]=\"autoIdThumb(p - 1)\"\n                        (click)=\"goToPage(p)\">\n                        <div class=\"sd-preview-pdf-thumb__page\">\n                          <canvas #thumbCanvas class=\"sd-preview-pdf-thumb__canvas\" [attr.data-page]=\"p\" aria-hidden=\"true\"></canvas>\n                        </div>\n                        <span class=\"sd-preview-pdf-thumb__label\">{{ p }}</span>\n                      </button>\n                    </li>\n                  }\n                  <li class=\"sd-preview-pdf-thumb-list__spacer\" aria-hidden=\"true\" [style.height.px]=\"thumbnailBottomSpacer()\"></li>\n                </ul>\n              }\n              @case ('outline') {\n                <ul\n                  class=\"sd-preview-pdf-outline-tree\"\n                  role=\"tree\"\n                  [attr.aria-label]=\"'core.component.preview-pdf.tab.outline' | translate\">\n                  @for (row of visibleOutline(); track row.item.id) {\n                    <li class=\"sd-preview-pdf-outline-tree__node\" role=\"none\">\n                      <div class=\"sd-preview-pdf-outline-tree__row\" [style.padding-left.px]=\"(row.level - 1) * 16\">\n                        @if (row.item.children.length > 0) {\n                          <button\n                            type=\"button\"\n                            class=\"sd-preview-pdf-outline-tree__toggle\"\n                            tabindex=\"-1\"\n                            [attr.aria-label]=\"row.item.title\"\n                            [attr.aria-expanded]=\"isOutlineExpanded(row.item.id)\"\n                            (click)=\"toggleOutlineItem(row.item.id, $event)\">\n                            <sd-icon [fontIcon]=\"isOutlineExpanded(row.item.id) ? 'expand_more' : 'chevron_right'\"></sd-icon>\n                          </button>\n                        } @else {\n                          <span class=\"sd-preview-pdf-outline-tree__toggle-placeholder\" aria-hidden=\"true\"></span>\n                        }\n\n                        @if (row.item.url && row.item.page === null) {\n                          <a\n                            #outlineItem\n                            class=\"sd-preview-pdf-outline-tree__item\"\n                            role=\"treeitem\"\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                            [href]=\"row.item.url\"\n                            [attr.data-outline-id]=\"row.item.id\"\n                            [attr.aria-level]=\"row.level\"\n                            [attr.aria-expanded]=\"row.item.children.length > 0 ? isOutlineExpanded(row.item.id) : null\"\n                            [attr.aria-current]=\"row.item.page === _activePage ? 'page' : null\"\n                            [attr.tabindex]=\"outlineFocusId() === row.item.id ? 0 : -1\"\n                            (focus)=\"focusOutlineItem(row.item.id)\"\n                            (keydown)=\"onOutlineKeyDown($event, row.item.id)\">\n                            {{ row.item.title }}\n                          </a>\n                        } @else {\n                          <button\n                            #outlineItem\n                            type=\"button\"\n                            class=\"sd-preview-pdf-outline-tree__item\"\n                            role=\"treeitem\"\n                            [attr.data-outline-id]=\"row.item.id\"\n                            [attr.aria-level]=\"row.level\"\n                            [attr.aria-expanded]=\"row.item.children.length > 0 ? isOutlineExpanded(row.item.id) : null\"\n                            [attr.aria-current]=\"row.item.page === _activePage ? 'page' : null\"\n                            [attr.tabindex]=\"outlineFocusId() === row.item.id ? 0 : -1\"\n                            (focus)=\"focusOutlineItem(row.item.id)\"\n                            (click)=\"activateOutlineItem(row.item.id)\"\n                            (keydown)=\"onOutlineKeyDown($event, row.item.id)\">\n                            {{ row.item.title }}\n                          </button>\n                        }\n                      </div>\n                    </li>\n                  }\n                </ul>\n              }\n              @case ('search') {\n                @if (!_searchTerm) {\n                  <div class=\"sd-preview-pdf-sidebar__message\">\n                    <sd-icon fontIcon=\"search\"></sd-icon>\n                    <p>{{ 'core.component.preview-pdf.search-placeholder' | translate }}</p>\n                  </div>\n                } @else if (_searchTotal === 0) {\n                  <div class=\"sd-preview-pdf-sidebar__message\">\n                    <sd-icon fontIcon=\"search_off\"></sd-icon>\n                    <p>{{ 'core.component.preview-pdf.search-no-results' | translate }}</p>\n                  </div>\n                } @else {\n                  @if (searchTruncated()) {\n                    <p class=\"sd-preview-pdf-search-limit\" role=\"status\">\n                      {{ 'core.component.preview-pdf.search-truncated' | translate: { count: _searchTotal } }}\n                    </p>\n                  }\n                  <ul class=\"sd-preview-pdf-search-list\">\n                    @for (r of searchResults(); track $index; let i = $index) {\n                      <li>\n                        <button\n                          type=\"button\"\n                          class=\"sd-preview-pdf-search-result\"\n                          [class.sd-preview-pdf-search-result--active]=\"i === searchActiveIndex()\"\n                          [attr.data-autoId]=\"autoIdResult(i)\"\n                          (click)=\"activateSearchResult(i)\">\n                          <span class=\"sd-preview-pdf-search-result__snippet\">\n                            {{ r.before }}<mark>{{ r.term }}</mark\n                            >{{ r.after }}\n                          </span>\n                          <span class=\"sd-preview-pdf-search-result__page\">{{ r.page }}</span>\n                        </button>\n                      </li>\n                    }\n                  </ul>\n                }\n              }\n            }\n          </div>\n        }\n      </aside>\n    }\n\n    <!-- STAGE ............................................................... -->\n    <div class=\"sd-preview-pdf-stage\" #stageRef (wheel)=\"onWheel($event)\" (scroll)=\"onStageScroll()\">\n      @switch (_stage) {\n        @case ('empty') {\n          <div class=\"sd-preview-pdf-status\">\n            <div class=\"sd-preview-pdf-status__tile sd-preview-pdf-status__tile--muted\">\n              <sd-icon fontIcon=\"picture_as_pdf\"></sd-icon>\n            </div>\n            <div class=\"sd-preview-pdf-status__title\">\n              {{ 'core.component.preview-pdf.empty.title' | translate }}\n            </div>\n            <div class=\"sd-preview-pdf-status__hint\">\n              {{ 'core.component.preview-pdf.empty.subtitle' | translate }}\n            </div>\n          </div>\n        }\n        @case ('loading') {\n          @let _loadPercent = loadPercent();\n          <div class=\"sd-preview-pdf-status\">\n            <div\n              class=\"sd-preview-pdf-spinner\"\n              role=\"progressbar\"\n              [attr.aria-label]=\"'core.component.preview-pdf.loading' | translate\"\n              aria-valuemin=\"0\"\n              aria-valuemax=\"100\"\n              [attr.aria-valuenow]=\"_loadPercent\"></div>\n            <div class=\"sd-preview-pdf-status__title\">\n              {{ 'core.component.preview-pdf.loading' | translate }}\n              @if (_loadPercent > 0) {\n                <span class=\"sd-preview-pdf-progress-pct\">&nbsp;{{ _loadPercent }}%</span>\n              }\n            </div>\n            <div class=\"sd-preview-pdf-progress\">\n              <div class=\"sd-preview-pdf-progress__fill\" [style.width.%]=\"_loadPercent\"></div>\n            </div>\n          </div>\n        }\n        @case ('error') {\n          @if (loadError$(); as err) {\n            <div class=\"sd-preview-pdf-status\" role=\"alert\" aria-live=\"assertive\">\n              <div class=\"sd-preview-pdf-status__tile sd-preview-pdf-status__tile--danger\">\n                <sd-icon fontIcon=\"error\"></sd-icon>\n              </div>\n              <div class=\"sd-preview-pdf-status__title\">\n                {{ 'core.component.preview-pdf.error.' + err.reason + '.title' | translate }}\n              </div>\n              <div class=\"sd-preview-pdf-status__hint\">\n                {{ 'core.component.preview-pdf.error.' + err.reason + '.body' | translate }}\n              </div>\n              <div class=\"sd-preview-pdf-status__actions\">\n                <button type=\"button\" class=\"sd-preview-pdf-btn-primary\" (click)=\"retryLoad()\" [attr.data-autoId]=\"autoIdRetry()\">\n                  <sd-icon fontIcon=\"refresh\"></sd-icon>\n                  <span>{{ 'core.component.preview-pdf.error.retry' | translate }}</span>\n                </button>\n                @if (canDownload()) {\n                  <button type=\"button\" class=\"sd-preview-pdf-btn-secondary\" (click)=\"downloadFile()\">\n                    <sd-icon fontIcon=\"download\"></sd-icon>\n                    <span>{{ 'core.component.preview-pdf.error.download-raw' | translate }}</span>\n                  </button>\n                }\n              </div>\n            </div>\n          }\n        }\n        @default {\n          @if (scrollModeCurrent() === 'continuous') {\n            <div class=\"sd-preview-pdf-continuous-content\">\n              <div class=\"sd-preview-pdf-continuous-spacer\" [style.height.px]=\"continuousTopSpacer()\"></div>\n              @for (pageNumber of continuousPages(); track pageNumber) {\n                <div class=\"sd-preview-pdf-continuous-slot\" [style.min-height.px]=\"continuousPageHeights()[pageNumber]\">\n                  <canvas\n                    #continuousCanvas\n                    class=\"sd-preview-pdf-continuous-page\"\n                    role=\"img\"\n                    [attr.data-page]=\"pageNumber\"\n                    [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: pageNumber, total: _numPages }\">\n                  </canvas>\n                </div>\n              }\n              <div class=\"sd-preview-pdf-continuous-spacer\" [style.height.px]=\"continuousBottomSpacer()\"></div>\n            </div>\n          } @else {\n            <div class=\"sd-preview-pdf-page-wrap\">\n              <canvas\n                #pageCanvas\n                class=\"sd-preview-pdf-page\"\n                role=\"img\"\n                [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: _activePage, total: _numPages }\">\n              </canvas>\n            </div>\n          }\n        }\n      }\n\n      <!-- FLOATING TOOLBAR ........................................ -->\n      @if (showToolbar() && _stage === 'ready') {\n        @let _canPrev = canPrev();\n        @let _canNext = canNext();\n        @let _zoomMode = zoomMode();\n        @let _scrollModeCurrent = scrollModeCurrent();\n        <div class=\"sd-preview-pdf-toolbar\" role=\"toolbar\">\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn\"\n            [disabled]=\"!_canPrev\"\n            [attr.aria-label]=\"'core.component.preview-pdf.first-page' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.first-page' | translate\"\n            [attr.data-autoId]=\"autoIdFirst()\"\n            (click)=\"firstPage()\">\n            <sd-icon fontIcon=\"first_page\"></sd-icon>\n          </button>\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn\"\n            [disabled]=\"!_canPrev\"\n            [attr.aria-label]=\"'core.component.preview-pdf.prev-page' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.prev-page' | translate\"\n            [attr.data-autoId]=\"autoIdPrev()\"\n            (click)=\"prevPage()\">\n            <sd-icon fontIcon=\"chevron_left\"></sd-icon>\n          </button>\n          <span class=\"sd-preview-pdf-toolbar__page\">\n            <input\n              type=\"text\"\n              inputmode=\"numeric\"\n              class=\"sd-preview-pdf-toolbar__page-input\"\n              [value]=\"_activePage\"\n              #pageInput\n              (keydown.enter)=\"onPageInputEnter($event)\"\n              (blur)=\"onPageInputBlur($event)\"\n              [attr.aria-label]=\"'core.component.preview-pdf.page-of' | translate: { current: _activePage, total: _numPages }\"\n              [attr.data-autoId]=\"autoIdPageInput()\" />\n            <span class=\"sd-preview-pdf-toolbar__page-total\">/ {{ _numPages }}</span>\n          </span>\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn\"\n            [disabled]=\"!_canNext\"\n            [attr.aria-label]=\"'core.component.preview-pdf.next-page' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.next-page' | translate\"\n            [attr.data-autoId]=\"autoIdNext()\"\n            (click)=\"nextPage()\">\n            <sd-icon fontIcon=\"chevron_right\"></sd-icon>\n          </button>\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn\"\n            [disabled]=\"!_canNext\"\n            [attr.aria-label]=\"'core.component.preview-pdf.last-page' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.last-page' | translate\"\n            [attr.data-autoId]=\"autoIdLast()\"\n            (click)=\"lastPage()\">\n            <sd-icon fontIcon=\"last_page\"></sd-icon>\n          </button>\n\n          <span class=\"sd-preview-pdf-toolbar__divider\"></span>\n\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn\"\n            [attr.aria-label]=\"'core.component.preview-pdf.zoom-out' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.zoom-out' | translate\"\n            [attr.data-autoId]=\"autoIdZoomOut()\"\n            (click)=\"zoomOut()\">\n            <sd-icon fontIcon=\"remove\"></sd-icon>\n          </button>\n          <span class=\"sd-preview-pdf-toolbar__zoom\" aria-live=\"polite\" [attr.data-autoId]=\"autoIdZoomReadout()\">{{ zoomPercent() }}%</span>\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn\"\n            [attr.aria-label]=\"'core.component.preview-pdf.zoom-in' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.zoom-in' | translate\"\n            [attr.data-autoId]=\"autoIdZoomIn()\"\n            (click)=\"zoomIn()\">\n            <sd-icon fontIcon=\"add\"></sd-icon>\n          </button>\n\n          <span class=\"sd-preview-pdf-toolbar__divider\"></span>\n\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn sd-preview-pdf-toolbar__btn--with-label\"\n            [class.sd-preview-pdf-toolbar__btn--active]=\"_zoomMode === 'page-fit'\"\n            [attr.data-autoId]=\"autoIdFitPage()\"\n            (click)=\"setZoom('page-fit')\">\n            <sd-icon fontIcon=\"fit_screen\"></sd-icon>\n            <span>{{ 'core.component.preview-pdf.fit-page' | translate }}</span>\n          </button>\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn sd-preview-pdf-toolbar__btn--with-label\"\n            [class.sd-preview-pdf-toolbar__btn--active]=\"_zoomMode === 'page-width'\"\n            [attr.data-autoId]=\"autoIdFitWidth()\"\n            (click)=\"setZoom('page-width')\">\n            <sd-icon fontIcon=\"swap_horiz\"></sd-icon>\n            <span>{{ 'core.component.preview-pdf.fit-width' | translate }}</span>\n          </button>\n\n          <span class=\"sd-preview-pdf-toolbar__divider\"></span>\n\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn\"\n            [attr.aria-label]=\"'core.component.preview-pdf.rotate' | translate\"\n            [attr.title]=\"'core.component.preview-pdf.rotate' | translate\"\n            [attr.data-autoId]=\"autoIdRotate()\"\n            (click)=\"rotate('right')\">\n            <sd-icon fontIcon=\"rotate_right\"></sd-icon>\n          </button>\n\n          <button\n            type=\"button\"\n            class=\"sd-preview-pdf-toolbar__btn sd-preview-pdf-toolbar__btn--with-label\"\n            [attr.data-autoId]=\"autoIdScrollMode()\"\n            (click)=\"setScrollMode(_scrollModeCurrent === 'page' ? 'continuous' : 'page')\">\n            <sd-icon [fontIcon]=\"_scrollModeCurrent === 'page' ? 'description' : 'view_day'\"></sd-icon>\n            <span>\n              {{\n                (_scrollModeCurrent === 'page' ? 'core.component.preview-pdf.scroll-page' : 'core.component.preview-pdf.scroll-continuous')\n                  | translate\n              }}\n            </span>\n          </button>\n        </div>\n      }\n    </div>\n  </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["_a"],"mappings":"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"}