ngx-extended-pdf-viewer
Version:
Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.
1 lines • 964 kB
Source Map (JSON)
{"version":3,"file":"ngx-extended-pdf-viewer.mjs","sources":["../../../projects/ngx-extended-pdf-viewer/src/lib/options/editor-annotations.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/options/pdf-default-options.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/dynamic-css/positioning.service.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/focus-management.service.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/events/find-result.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-notification-service.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/ngx-extended-pdf-viewer.service.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/options/pdf-cursor-tools.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/options/pdf-viewer.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/options/verbosity-level.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dummy-components/pdf-dummy-components.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dummy-components/pdf-dummy-components.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/services/ios-canvas-optimization.service.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/utils/blob-conversion.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/ngx-form-support.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/ngx-keyboard-manager.service.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/options/pdf-sidebar-views.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-csp-policy.service.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-script-loader.service.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/responsive-visibility.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/unit-to-px.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/dynamic-css/dynamic-css.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/dynamic-css/dynamic-css.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/theme/acroform-default-theme/pdf-acroform-default-theme.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-add-signature-dialog/pdf-add-signature-dialog.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-add-signature-dialog/pdf-add-signature-dialog.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-comment-manager-dialog/pdf-comment-manager-dialog.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-comment-manager-dialog/pdf-comment-manager-dialog.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-context-menu/pdf-context-menu.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-context-menu/pdf-context-menu.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/theme/pdf-dark-theme/pdf-dark-theme.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/theme/pdf-dark-theme/pdf-dark-theme.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-alt-text-dialog/pdf-alt-text-dialog.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-alt-text-dialog/pdf-alt-text-dialog.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-alt-text-settings-dialog/pdf-alt-text-settings-dialog.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-alt-text-settings-dialog/pdf-alt-text-settings-dialog.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-document-properties-dialog/pdf-document-properties-dialog.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-document-properties-dialog/pdf-document-properties-dialog.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-edit-signature-dialog/pdf-edit-signature-dialog.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-edit-signature-dialog/pdf-edit-signature-dialog.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-error-message/pdf-error-message.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-error-message/pdf-error-message.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-message-container/pdf-findbar-message-container.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-message-container/pdf-findbar-message-container.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-two-container/pdf-find-entire-word/pdf-find-entire-word.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-two-container/pdf-find-entire-word/pdf-find-entire-word.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-one-container/pdf-find-highlight-all/pdf-find-highlight-all.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-one-container/pdf-find-highlight-all/pdf-find-highlight-all.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-find-next/pdf-find-next.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-find-next/pdf-find-next.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-find-previous/pdf-find-previous.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-find-previous/pdf-find-previous.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-search-input-field/pdf-search-input-field.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-search-input-field/pdf-search-input-field.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-find-input-area/pdf-find-input-area.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-find-input-area/pdf-find-input-area.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-one-container/pdf-find-match-case/pdf-find-match-case.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-one-container/pdf-find-match-case/pdf-find-match-case.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-one-container/pdf-find-multiple/pdf-find-multiple.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-one-container/pdf-find-multiple/pdf-find-multiple.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-one-container/pdf-find-regexp/pdf-find-regexp.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-one-container/pdf-find-regexp/pdf-find-regexp.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-three-container/pdf-find-results-count/pdf-find-results-count.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-three-container/pdf-find-results-count/pdf-find-results-count.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-two-container/pdf-match-diacritics/pdf-match-diacritics.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar-options-two-container/pdf-match-diacritics/pdf-match-diacritics.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-findbar/pdf-findbar.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/theme/pdf-light-theme/pdf-light-theme.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/theme/pdf-light-theme/pdf-light-theme.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-password-dialog/pdf-password-dialog.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-password-dialog/pdf-password-dialog.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-prepare-printing-dialog/pdf-prepare-printing-dialog.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-dialog/pdf-prepare-printing-dialog/pdf-prepare-printing-dialog.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-shy-button/pdf-shy-button-service.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/secondary-toolbar/sanitized-html.pipe.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/secondary-toolbar/pdf-secondary-toolbar/pdf-secondary-toolbar.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/secondary-toolbar/pdf-secondary-toolbar/pdf-secondary-toolbar.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/sidebar/pdf-sidebar/pdf-sidebar-content/pdf-sidebar-content.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/sidebar/pdf-sidebar/pdf-sidebar-content/pdf-sidebar-content.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/sidebar/pdf-sidebar/pdf-sidebar-toolbar/pdf-sidebar-toolbar.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/sidebar/pdf-sidebar/pdf-sidebar-toolbar/pdf-sidebar-toolbar.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/sidebar/pdf-sidebar/pdf-sidebar.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/sidebar/pdf-sidebar/pdf-sidebar.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-shy-button/pdf-shy-button.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-shy-button/pdf-shy-button.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-book-mode/pdf-book-mode.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-book-mode/pdf-book-mode.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-document-properties/pdf-document-properties.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-document-properties/pdf-document-properties.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-download/pdf-download.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-download/pdf-download.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-comment-editor/pdf-comment-editor.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-comment-editor/pdf-comment-editor.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-draw-editor/pdf-draw-editor.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-draw-editor/pdf-draw-editor.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-editor-signature/pdf-editor-signature.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-editor-signature/pdf-editor-signature.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-highlight-editor/pdf-highlight-editor.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-highlight-editor/pdf-highlight-editor.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-stamp-editor/pdf-stamp-editor.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-stamp-editor/pdf-stamp-editor.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-text-editor/pdf-text-editor.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-text-editor/pdf-text-editor.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-editor/pdf-editor.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-editor/pdf-editor.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-even-spread/pdf-even-spread.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-even-spread/pdf-even-spread.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-find-button/pdf-find-button.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-find-button/pdf-find-button.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-hand-tool/pdf-hand-tool.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-hand-tool/pdf-hand-tool.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-page-flip-tool/pdf-page-flip-tool.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-page-flip-tool/pdf-page-flip-tool.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/options/pdf-scroll-mode.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-horizontal-scroll/pdf-horizontal-scroll.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-horizontal-scroll/pdf-horizontal-scroll.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-infinite-scroll/pdf-infinite-scroll.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-infinite-scroll/pdf-infinite-scroll.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-move-down/pdf-move-down.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-move-down/pdf-move-down.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-move-up/pdf-move-up.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-move-up/pdf-move-up.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-no-spread/pdf-no-spread.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-no-spread/pdf-no-spread.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-odd-spread/pdf-odd-spread.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-odd-spread/pdf-odd-spread.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-open-file/pdf-open-file.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-open-file/pdf-open-file.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-first-page/pdf-first-page.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-first-page/pdf-first-page.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-last-page/pdf-last-page.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-last-page/pdf-last-page.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-next-page/pdf-next-page.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-next-page/pdf-next-page.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-page-number/pdf-page-number.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-page-number/pdf-page-number.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-previous-page/pdf-previous-page.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-previous-page/pdf-previous-page.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-paging-area.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-paging-area/pdf-paging-area.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-presentation-mode/pdf-presentation-mode.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-presentation-mode/pdf-presentation-mode.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-print/pdf-print.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-print/pdf-print.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-rotate-page-cw/pdf-rotate-page-cw.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-rotate-page-cw/pdf-rotate-page-cw.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-rotate-page-ccw/pdf-rotate-page-ccw.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-rotate-page-ccw/pdf-rotate-page-ccw.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-select-tool/pdf-select-tool.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-select-tool/pdf-select-tool.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-single-page-mode/pdf-single-page-mode.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-single-page-mode/pdf-single-page-mode.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-toggle-secondary-toolbar/pdf-toggle-secondary-toolbar.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-toggle-secondary-toolbar/pdf-toggle-secondary-toolbar.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-toggle-sidebar/pdf-toggle-sidebar.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-toggle-sidebar/pdf-toggle-sidebar.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-vertical-scroll-button/pdf-vertical-scroll-mode.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-vertical-scroll-button/pdf-vertical-scroll-mode.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-wrapped-scroll-mode/pdf-wrapped-scroll-mode.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-wrapped-scroll-mode/pdf-wrapped-scroll-mode.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-zoom-toolbar/pdf-zoom-dropdown/pdf-zoom-dropdown.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-zoom-toolbar/pdf-zoom-dropdown/pdf-zoom-dropdown.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-zoom-toolbar/pdf-zoom-in/pdf-zoom-in.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-zoom-toolbar/pdf-zoom-in/pdf-zoom-in.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-zoom-toolbar/pdf-zoom-out/pdf-zoom-out.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-zoom-toolbar/pdf-zoom-out/pdf-zoom-out.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-zoom-toolbar/pdf-zoom-toolbar.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-zoom-toolbar/pdf-zoom-toolbar.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-toolbar/pdf-toolbar.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-toolbar/pdf-toolbar.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/translate.pipe.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/ngx-extended-pdf-viewer.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/ngx-extended-pdf-viewer.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-rotate-page/pdf-rotate-page.component.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/toolbar/pdf-rotate-page/pdf-rotate-page.component.html","../../../projects/ngx-extended-pdf-viewer/src/lib/ngx-extended-pdf-viewer.module.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/options/annotation-layer-builder.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/options/link-target.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/options/password-prompt.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/options/pdf-spread-mode.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/pdf-document-properties-extractor.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/utils/print-range.ts","../../../projects/ngx-extended-pdf-viewer/src/lib/utils/text-conversion.ts","../../../projects/ngx-extended-pdf-viewer/src/public_api.ts","../../../projects/ngx-extended-pdf-viewer/src/ngx-extended-pdf-viewer.ts"],"sourcesContent":["export enum AnnotationMode {\n DISABLE = 0,\n ENABLE = 1,\n ENABLE_FORMS = 2,\n ENABLE_STORAGE = 3,\n}\n\nexport enum AnnotationEditorType {\n DISABLE = -1,\n NONE = 0,\n FREETEXT = 3,\n HIGHLIGHT = 9,\n STAMP = 13,\n INK = 15,\n POPUP = 16,\n SIGNATURE = 101,\n COMMENT = 102,\n}\n\nexport const AnnotationEditorParamsType = {\n RESIZE: 1,\n CREATE: 2,\n FREETEXT_SIZE: 11,\n FREETEXT_COLOR: 12,\n FREETEXT_OPACITY: 13,\n INK_COLOR: 21,\n INK_THICKNESS: 22,\n INK_OPACITY: 23,\n HIGHLIGHT_COLOR: 31,\n HIGHLIGHT_THICKNESS: 32,\n HIGHLIGHT_FREE: 33,\n HIGHLIGHT_SHOW_ALL: 34,\n HIGHLIGHT_DEFAULT_COLOR: 35,\n DRAW_STEP: 41,\n};\n\nexport type AnnotationEditorTypeValue = -1 | 0 | 3 | 9 | 13 | 15 | 16;\n\nexport type InkPaths = {\n lines: Array<Array<number>>; // Array of bezier curve arrays\n points: Array<Array<number>>; // Array of raw point arrays\n};\n\nexport type InkEditorAnnotation = {\n annotationType: 15;\n color: Array<number>; // an array of three integer numbers\n thickness: number;\n opacity: number;\n paths: InkPaths;\n pageIndex: number;\n rect: Array<number>; // [left, bottom, right, top]\n rotation: 0 | 90 | 180 | 270; // in degrees\n isCopy?: boolean;\n id?: string; // #3076 added by ngx-extended-pdf-viewer - temporary, changes every session; do not persist it\n customId?: string; // #3225 added by ngx-extended-pdf-viewer - your own stable id (e.g. a UUID); set it before storing and it survives addEditorAnnotation()\n};\n\nexport type FreeTextEditorAnnotation = {\n annotationType: 3;\n color: Array<number>; // an array of three integer numbers\n fontSize: number;\n value: string;\n pageIndex: number;\n rect: Array<number>; // rect[1] is the y position; rect[2] is the x position\n rotation: 0 | 90 | 180 | 270; // in degrees\n isCopy?: boolean;\n id?: string; // #3076 added by ngx-extended-pdf-viewer - temporary, changes every session; do not persist it\n customId?: string; // #3225 added by ngx-extended-pdf-viewer - your own stable id (e.g. a UUID); set it before storing and it survives addEditorAnnotation()\n};\n\nexport type StampEditorAnnotation = {\n annotationType: 13;\n pageIndex: number;\n bitmapUrl: string | Blob;\n rect: Array<number>; // [left, bottom, right, top]\n rotation: 0 | 90 | 180 | 270; // in degrees\n isCopy?: boolean;\n id?: string; // #3076 added by ngx-extended-pdf-viewer - temporary, changes every session; do not persist it\n customId?: string; // #3225 added by ngx-extended-pdf-viewer - your own stable id (e.g. a UUID); set it before storing and it survives addEditorAnnotation()\n};\n\nexport type HighlightEditorAnnotation = {\n annotationType: 9;\n color: Array<number>; // an array of three integer numbers\n opacity: number;\n thickness: number;\n boxes?: Array<{ x: number; y: number; width: number; height: number }>; // page-relative coords (0-1 range)\n quadPoints?: any; // Object with numeric keys containing text bounds\n outlines?: Array<Array<number>>; // Array of coordinate arrays for highlight shapes\n pageIndex: number;\n rect: Array<number>; // [left, bottom, right, top]\n rotation: 0 | 90 | 180 | 270; // in degrees\n isCopy?: boolean;\n id?: string; // #3076 added by ngx-extended-pdf-viewer - temporary, changes every session; do not persist it\n customId?: string; // #3225 added by ngx-extended-pdf-viewer - your own stable id (e.g. a UUID); set it before storing and it survives addEditorAnnotation()\n};\n\nexport type PopupEditorAnnotation = {\n annotationType: 16;\n content: string;\n pageIndex: number;\n rect: Array<number>; // [left, bottom, right, top]\n rotation: 0 | 90 | 180 | 270; // in degrees\n isCopy?: boolean;\n id?: string; // #3076 added by ngx-extended-pdf-viewer - temporary, changes every session; do not persist it\n customId?: string; // #3225 added by ngx-extended-pdf-viewer - your own stable id (e.g. a UUID); set it before storing and it survives addEditorAnnotation()\n};\n\nexport type EditorAnnotation = InkEditorAnnotation | FreeTextEditorAnnotation | StampEditorAnnotation | HighlightEditorAnnotation | PopupEditorAnnotation;\n","import { AnnotationMode } from './editor-annotations';\n\nconst _isIE11 = typeof window === 'undefined' ? false : !!(<any>globalThis).MSInputMethodContext && !!(<any>document).documentMode;\nconst isEdge = typeof navigator === 'undefined' || /Edge\\/\\d./i.test(navigator.userAgent);\nconst needsES5 = typeof ReadableStream === 'undefined' || typeof Promise['allSettled'] === 'undefined';\n\nexport const pdfjsVersion = '6.1.1164';\nexport const pdfjsBleedingEdgeVersion = '6.1.1164';\nexport function getVersionSuffix(folder: string): string {\n if (folder?.includes('bleeding-edge')) {\n return pdfjsBleedingEdgeVersion;\n }\n return pdfjsVersion;\n}\n\nexport function assetsUrl(url: string, postfixIfPathIsRelativ = ''): string {\n if (url.includes('://')) {\n // the assets folder is on an absolute path (like https://example.com/assets)\n return url;\n }\n return `./${url + postfixIfPathIsRelativ}`;\n}\n\n// #3209: a relative asset URL such as \"./assets/pdf.worker-x.min.mjs\" is\n// resolved by pdf.js (and the browser's `new Worker()`) against the current\n// route or, with a `<base href>`, gets the base applied twice — producing\n// mangled URLs like \".../crossdomainproxy//crossdomainproxy/../...\". Resolving\n// against `document.baseURI` here yields a stable absolute URL, mirroring the\n// wasmUrl (#3140) fix. Absolute folders and SSR (no `document`) keep the exact\n// string `assetsUrl()` already produced, so existing setups are unaffected.\nexport function resolveAssetUrlAgainstBaseHref(composedUrl: string): string {\n if (composedUrl.startsWith('./') && typeof document !== 'undefined') {\n return new URL(composedUrl, document.baseURI).href;\n }\n return composedUrl;\n}\n\nexport function isBleedingEdge(): boolean {\n return pdfDefaultOptions.assetsFolder?.includes('bleeding-edge');\n}\n\n/**\n * True when the pdf.js engine that will be loaded is at least the given\n * `major.minor` version. Prefer this over {@link isBleedingEdge} for gating a\n * feature: the bleeding-edge/stable split is a moving target (stable advances\n * over time), whereas a feature is permanently tied to the pdf.js version that\n * introduced it. The version is derived from the bundle that `assetsFolder`\n * selects (`getVersionSuffix`).\n */\nexport function isPdfjsVersionAtLeast(major: number, minor: number): boolean {\n const [maj = 0, min = 0] = getVersionSuffix(pdfDefaultOptions.assetsFolder)\n .split('.')\n .map((part) => parseInt(part, 10) || 0);\n return maj > major || (maj === major && min >= minor);\n}\n\ndeclare const process: any;\n\nfunction isTestEnvironment(): boolean {\n return (\n typeof process !== 'undefined' &&\n typeof (process as any).env !== 'undefined' &&\n ((process as any).env.NODE_ENV === 'test' || (process as any).env.JEST_WORKER_ID !== undefined || (process as any).env.VITEST !== undefined)\n );\n}\n\nexport function getSafeCanvasSize(): number {\n if (typeof window === 'undefined' || typeof document === 'undefined' || isTestEnvironment()) {\n return 4096;\n }\n\n // Use PDF.js defaults for maximum compatibility\n // The IOSCanvasOptimizationService handles dynamic optimization\n const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);\n const isMobile = /Android|iPhone|iPad|iPod/.test(navigator.userAgent);\n\n if (isIOS || isMobile) {\n return 5242880; // PDF.js iOS/Android limit (5 megapixels)\n }\n\n return 33554432; // PDF.js desktop default (32 megapixels)\n}\n\n// sonar ignore next line\nexport const pdfDefaultOptions = {\n needsES5: _isIE11 || isEdge || needsES5,\n annotationEditorMode: 0,\n annotationMode: AnnotationMode.ENABLE_FORMS,\n defaultZoomDelay: 400, // milliseconds\n cursorToolOnLoad: 0,\n defaultUrl: '',\n defaultZoomValue: '',\n disableHistory: false,\n disablePageLabels: false,\n enableComment: true,\n enablePermissions: false,\n docBaseUrl: '',\n enablePrintAutoRotate: true,\n enableSignatureEditor: false,\n externalLinkRel: 'noopener noreferrer nofollow',\n externalLinkTarget: 0,\n findController: undefined as any, // must extend PDFFindController\n historyUpdateUrl: false,\n ignoreDestinationZoom: false,\n imageResourcesPath: './images/',\n maxCanvasPixels: getSafeCanvasSize(),\n forcePageColors: false,\n pageColorsBackground: 'Canvas',\n pageColorsForeground: 'CanvasText',\n pdfBugEnabled: false,\n printResolution: 150,\n rangeChunkSize: 65536,\n removePageBorders: false,\n enableXfa: true,\n fontExtraProperties: false,\n sidebarViewOnLoad: -1,\n scrollModeOnLoad: -1,\n spreadModeOnLoad: -1,\n textLayerMode: 1,\n // viewerCssTheme: 0, // not supported by ngx-extended-pdf-viewer, use [theme] instead\n viewOnLoad: 0,\n cMapPacked: true,\n // #3232 (see the comment on sandboxBundleSrc below): the `/..` cancelled out\n // the assets folder, so the cmaps and the standard fonts were looked up as\n // siblings of that folder. They ship *inside* it, exactly like the wasm files.\n // The mistake used to be masked because the resulting relative path was\n // resolved against the current route; since #3209 it resolves against\n // `document.baseURI`, which turns it into a plain 404 at the site root.\n cMapUrl: function () {\n return resolveAssetUrlAgainstBaseHref(`${assetsUrl(pdfDefaultOptions.assetsFolder)}/cmaps/`);\n },\n disableAutoFetch: false,\n disableFontFace: false,\n disableRange: false,\n disableStream: true,\n isOffscreenCanvasSupported: true,\n maxImageSize: -1,\n pdfBug: false,\n verbosity: 1,\n workerPort: null as any,\n assetsFolder: 'assets',\n _internalFilenameSuffix: '.min', // don't modify this - it's an internal field\n // #3232: unlike workerSrc, this path was missing the assets-folder prefix\n // (`./pdf.sandbox-…` instead of `./assets/pdf.sandbox-…`). It used to work by\n // accident because pdf.js's dynamic `import()` resolved the bare specifier\n // relative to the viewer module (which lives in the assets folder). Once\n // #3209 started resolving against `document.baseURI` (the page root), the\n // missing folder made it 404 at the site root, so the scripting sandbox no\n // longer loaded and JS embedded in PDFs stopped running. Prefix the folder\n // like workerSrc does so it resolves to the file that actually ships.\n sandboxBundleSrc: function () {\n return resolveAssetUrlAgainstBaseHref(\n pdfDefaultOptions.needsES5\n ? `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs`\n : `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.sandbox-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${pdfDefaultOptions._internalFilenameSuffix}.mjs`\n );\n },\n workerSrc: function () {\n return resolveAssetUrlAgainstBaseHref(\n pdfDefaultOptions.needsES5\n ? `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}-es5.mjs`\n : `${assetsUrl(pdfDefaultOptions.assetsFolder)}/pdf.worker-${getVersionSuffix(assetsUrl(pdfDefaultOptions.assetsFolder))}${\n pdfDefaultOptions._internalFilenameSuffix\n }.mjs`\n );\n },\n // #3232: see the comment on cMapUrl - the standard fonts ship inside the\n // assets folder, too.\n standardFontDataUrl: () => resolveAssetUrlAgainstBaseHref(`${assetsUrl(pdfDefaultOptions.assetsFolder)}/standard_fonts/`),\n // #3140: wasm files live inside the assets folder (not as a sibling).\n // Resolve against document.baseURI so the path stays correct on sub-routes\n // (pdf.js's QuickJS loader resolves wasmUrl against `location.href`, which\n // otherwise turns `./assets/wasm/` into `/<route>/assets/wasm/`).\n wasmUrl: () => {\n const folder = pdfDefaultOptions.assetsFolder;\n if (folder?.includes('://')) {\n return `${folder}/wasm/`;\n }\n if (typeof document !== 'undefined') {\n return new URL(`${folder}/wasm/`, document.baseURI).href;\n }\n return `./${folder}/wasm/`;\n },\n\n // options specific to ngx-extended-pdf-viewer (as opposed to being used by pdf.js)\n doubleTapZoomFactor: 'page-width',\n doubleTapZoomsInHandMode: true,\n doubleTapZoomsInTextSelectionMode: false,\n doubleTapResetsZoomOnSecondDoubleTap: false,\n enableScripting: false,\n enableCatalogAAJavaScript: false,\n enableOpenActionJavaScript: false,\n defaultCacheSize: 50,\n passwordPrompt: undefined as any,\n enableHWA: true, // enable hardware acceleration. Active since pdf.js 4.4, default true since pdf.js 5.6.\n enableWebGPU: true, // enable WebGPU mesh shading for improved rendering performance\n enableNewBadge: false, // show a \"New\" badge on the manage button (upstream default for MOZCENTRAL only)\n imagesRightClickMinSize: -1, // minimum size (px) for right-clickable images in text layer; -1 = disabled\n positionPopupDialogsWithJavaScript: true,\n enablePageReordering: false, // allows users to reorder pages by dragging thumbnails\n enableSplitMerge: false, // allows users to copy, cut, delete, and export selected pages\n enableMerge: false, // adds an \"Add file\" button to the sidebar that merges another PDF/image into the current document\n useWasm: true, // set to false to disable WebAssembly for image decoding (uses *_nowasm_fallback.js instead). Required for CSPs that forbid `wasm-unsafe-eval`.\n enableAltText: false, // enables the alt-text editor for images that the user adds via the stamp/image annotation tool\n enableAutoLinking: true, // detects URLs and email addresses in the text layer and turns them into clickable links\n enableHighlightFloatingButton: false, // shows a floating \"Highlight\" shortcut next to selected text (experimental upstream)\n pdfBackgroundColor: '', // background color for PDF content rendering\n};\n","import { pdfDefaultOptions } from '../options/pdf-default-options';\n\nexport class PositioningService {\n private static readonly DOORHANGER_OFFSET = 17;\n private static readonly TOOLBAR_MARGIN = 4;\n\n // Button → popup pairs for all positionable popups\n private static readonly POPUP_PAIRS: Array<[string, string]> = [\n ['primaryViewFind', 'findbar'],\n ['secondaryToolbarToggle', 'secondaryToolbar'],\n ['primaryEditorFreeText', 'editorFreeTextParamsToolbar'],\n ['primaryEditorInk', 'editorInkParamsToolbar'],\n ['primaryEditorHighlight', 'editorHighlightParamsToolbar'],\n ['primaryEditorStamp', 'editorStampParamsToolbar'],\n ['editorCommentButton', 'editorCommentParamsToolbar'],\n ['primaryEditorSignatureButton', 'editorSignatureParamsToolbar'],\n ];\n\n public positionPopupBelowItsButton(buttonId: string, popupId: string): void {\n if (!pdfDefaultOptions.positionPopupDialogsWithJavaScript) {\n return;\n }\n\n setTimeout(() => {\n const button = this.findVisibleButton(buttonId);\n const popup = this.getPopupElement(popupId);\n\n if (!button || !popup) return;\n\n this.applyPopupPositioning(button, popup);\n });\n }\n\n /**\n * Re-positions all currently open/visible popups. Call this when the\n * toolbar layout changes (e.g., mobileFriendlyZoom changes at runtime).\n */\n public repositionOpenPopups(): void {\n if (!pdfDefaultOptions.positionPopupDialogsWithJavaScript) {\n return;\n }\n\n setTimeout(() => {\n for (const [buttonId, popupId] of PositioningService.POPUP_PAIRS) {\n const popup = document.querySelector<HTMLElement>(`#${popupId}`);\n if (!popup) continue;\n\n // A popup is \"open\" if it's visible (no hidden class/attribute and has offsetParent)\n const isVisible = !popup.classList.contains('hidden') && !popup.hasAttribute('hidden') && popup.offsetParent !== null;\n if (!isVisible) continue;\n\n const button = this.findVisibleButton(buttonId);\n if (!button) continue;\n\n this.applyPopupPositioning(button, popup);\n }\n });\n }\n\n private findVisibleButton(buttonId: string): HTMLElement | null {\n const findVisible = (selector: string) => Array.from(document.querySelectorAll<HTMLElement>(`#${selector}`)).find((el) => el.offsetParent !== null);\n\n return findVisible(buttonId) || findVisible('secondaryToolbarToggle') || null;\n }\n\n private getPopupElement(popupId: string): HTMLElement | null {\n const popup = document.querySelector<HTMLElement>(`#${popupId}`);\n return popup?.offsetParent ? popup : null;\n }\n\n private applyPopupPositioning(button: HTMLElement, popup: HTMLElement): void {\n const popupContainer = popup.offsetParent as HTMLElement;\n const buttonRect = button.getBoundingClientRect();\n const containerRect = popupContainer.getBoundingClientRect();\n\n const isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n let isRightAligned = isRTL;\n if (popup.classList.contains('doorHangerRight')) {\n isRightAligned = !isRTL;\n }\n\n this.setBasicPopupStyles(popup, isRightAligned);\n this.setHorizontalPosition(popup, buttonRect, containerRect, isRightAligned);\n this.setVerticalPosition(popup, containerRect);\n }\n\n private setBasicPopupStyles(popup: HTMLElement, isRightAligned: boolean): void {\n Object.assign(popup.style, {\n position: 'absolute',\n display: 'block',\n transformOrigin: isRightAligned ? 'top right' : 'top left',\n });\n }\n\n private setHorizontalPosition(popup: HTMLElement, buttonRect: DOMRect, containerRect: DOMRect, isRightAligned: boolean): void {\n const centerOffset = buttonRect.width / 2 - PositioningService.DOORHANGER_OFFSET;\n\n if (isRightAligned) {\n popup.style.right = `${containerRect.right - buttonRect.right + centerOffset}px`;\n popup.style.left = '';\n } else {\n popup.style.left = `${buttonRect.left - containerRect.left + centerOffset}px`;\n popup.style.right = '';\n }\n }\n\n private setVerticalPosition(popup: HTMLElement, containerRect: DOMRect): void {\n const toolbarContainer = document.querySelector<HTMLElement>('#toolbarContainer');\n if (!toolbarContainer) return;\n\n const toolbarRect = toolbarContainer.getBoundingClientRect();\n const top = toolbarRect.bottom - containerRect.top + PositioningService.TOOLBAR_MARGIN;\n popup.style.top = `${top}px`;\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class FocusManagementService {\n private previousActiveElement: HTMLElement | null = null;\n private ariaLiveRegion: HTMLDivElement | null = null;\n private keydownHandler: ((event: KeyboardEvent) => void) | null = null;\n\n constructor() {\n this.initializeAriaLiveRegion();\n }\n\n /**\n * Initializes a hidden aria-live region for screen reader announcements\n */\n private initializeAriaLiveRegion(): void {\n /* istanbul ignore next -- SSR guard, untestable in JSDOM */\n if (typeof document === 'undefined') {\n return; // SSR guard\n }\n\n this.ariaLiveRegion = document.createElement('div');\n this.ariaLiveRegion.setAttribute('aria-live', 'polite');\n this.ariaLiveRegion.setAttribute('aria-atomic', 'true');\n this.ariaLiveRegion.setAttribute('class', 'sr-only');\n this.ariaLiveRegion.style.position = 'absolute';\n this.ariaLiveRegion.style.left = '-10000px';\n this.ariaLiveRegion.style.width = '1px';\n this.ariaLiveRegion.style.height = '1px';\n this.ariaLiveRegion.style.overflow = 'hidden';\n\n if (document.body) {\n document.body.appendChild(this.ariaLiveRegion);\n } else {\n // If body is not ready yet, wait for DOMContentLoaded\n document.addEventListener('DOMContentLoaded', () => {\n if (this.ariaLiveRegion) {\n document.body.appendChild(this.ariaLiveRegion);\n }\n });\n }\n }\n\n /**\n * Announces a message to screen readers via aria-live region\n * @param message The message to announce\n */\n public announce(message: string): void {\n if (!this.ariaLiveRegion) {\n return;\n }\n\n // Clear previous message\n this.ariaLiveRegion.textContent = '';\n\n // Announce new message after a brief delay to ensure screen readers pick it up\n setTimeout(() => {\n if (this.ariaLiveRegion) {\n this.ariaLiveRegion.textContent = message;\n }\n }, 100);\n }\n\n /**\n * Moves focus to the first focusable element within a dialog\n * @param dialogId The ID of the dialog element\n * @param announceMessage Optional message to announce when dialog opens\n * @param buttonId Optional ID of the button that triggered the dialog (for reliable focus return)\n */\n public moveFocusToDialog(dialogId: string, announceMessage?: string, buttonId?: string): void {\n if (typeof document === 'undefined') {\n return; // SSR guard\n }\n\n // Store the button element for reliable focus return\n // Use buttonId if provided, otherwise fall back to activeElement\n if (buttonId) {\n const button = document.getElementById(buttonId);\n if (button) {\n this.previousActiveElement = button;\n }\n } else {\n const activeElement = document.activeElement as HTMLElement;\n if (activeElement && activeElement !== document.body) {\n this.previousActiveElement = activeElement;\n }\n }\n\n // Find dialog and first focusable element\n const dialog = document.getElementById(dialogId);\n if (!dialog) {\n console.warn(`Dialog with ID \"${dialogId}\" not found`);\n return;\n }\n\n // Check if dialog is visible\n if (dialog.classList.contains('hidden') || dialog.style.display === 'none') {\n console.warn(`Dialog \"${dialogId}\" is not visible`);\n return;\n }\n\n // Set up focus cycling\n this.setupFocusCycling(dialog);\n\n const firstFocusable = this.findFirstFocusableElement(dialog);\n\n if (firstFocusable) {\n // Small delay to ensure dialog is fully rendered\n setTimeout(() => {\n firstFocusable.focus();\n }, 50);\n }\n\n // Announce dialog opening to screen readers\n if (announceMessage) {\n this.announce(announceMessage);\n }\n }\n\n /**\n * Sets up focus cycling so that tabbing past the last element returns to the toolbar\n * @param dialog The dialog element\n */\n private setupFocusCycling(dialog: HTMLElement): void {\n // Clean up any existing handler\n this.cleanupFocusCycling();\n\n this.keydownHandler = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') {\n return;\n }\n\n const focusableElements = this.getAllFocusableElements(dialog);\n if (focusableElements.length === 0) {\n return;\n }\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n const activeElement = document.activeElement;\n\n // Tab on last element -> go to toolbar (previous element that opened the dialog)\n if (!event.shiftKey && activeElement === lastElement) {\n event.preventDefault();\n if (this.previousActiveElement) {\n this.previousActiveElement.focus();\n }\n }\n // Shift+Tab on first element -> go to last element in dialog\n else if (event.shiftKey && activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n };\n\n document.addEventListener('keydown', this.keydownHandler);\n }\n\n /**\n * Cleans up focus cycling event listeners\n */\n private cleanupFocusCycling(): void {\n if (this.keydownHandler) {\n document.removeEventListener('keydown', this.keydownHandler);\n this.keydownHandler = null;\n }\n }\n\n /**\n * Gets all focusable elements within a container\n * @param container The container element\n * @returns Array of focusable elements\n */\n private getAllFocusableElements(container: HTMLElement): HTMLElement[] {\n const focusableSelectors = [\n 'a[href]',\n 'area[href]',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'iframe',\n 'object',\n 'embed',\n '[contenteditable]',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(',');\n\n const elements = container.querySelectorAll<HTMLElement>(focusableSelectors);\n return Array.from(elements).filter((el) => this.isVisible(el));\n }\n\n /**\n * Returns focus to the previously focused element (typically the button that opened the dialog)\n * @param announceMessage Optional message to announce when dialog closes\n */\n public returnFocusToPrevious(announceMessage?: string): void {\n // Clean up focus cycling\n this.cleanupFocusCycling();\n\n if (this.previousActiveElement) {\n this.previousActiveElement.focus();\n this.previousActiveElement = null;\n }\n\n // Announce dialog closing to screen readers\n if (announceMessage) {\n this.announce(announceMessage);\n }\n }\n\n /**\n * Finds the first focusable element within a container\n * @param container The container element to search within\n * @returns The first focusable element or null\n */\n private findFirstFocusableElement(container: HTMLElement | null): HTMLElement | null {\n if (!container) {\n return null;\n }\n\n const focusableSelectors = [\n 'a[href]',\n 'area[href]',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'iframe',\n 'object',\n 'embed',\n '[contenteditable]',\n '[tabindex]:not([tabindex=\"-1\"])',\n ].join(',');\n\n const focusableElements = container.querySelectorAll<HTMLElement>(focusableSelectors);\n\n // Return first visible and focusable element\n for (const element of Array.from(focusableElements)) {\n if (this.isVisible(element)) {\n return element;\n }\n }\n\n return null;\n }\n\n /**\n * Checks if an element is visible\n * @param element The element to check\n * @returns True if the element is visible\n */\n private isVisible(element: HTMLElement): boolean {\n const style = globalThis.window.getComputedStyle(element);\n return style.display !== 'none' && style.visibility !== 'hidden' && element.offsetParent !== null;\n }\n}\n","export enum FindState {\n FOUND = 0,\n NOT_FOUND = 1,\n WRAPPED = 2,\n PENDING = 3,\n}\n\nexport interface FindResultMatchesCount {\n current: number;\n total: number;\n matches: Array<any>;\n matchesLength: Array<any>;\n caseSensitive: boolean;\n entireWord: boolean;\n findPrevious: boolean;\n highlightAll: boolean;\n matchDiacritics: boolean;\n query: string | string[] | RegExp;\n type: 'findagain' | 'highlightallchange' | 'casesensitivitychange' | 'entirewordchange' | 'diacriticmatchingchange' | 'find';\n}\n\nexport interface FindResult {\n state: FindState;\n previous: any;\n matchesCount: FindResultMatchesCount;\n rawquery: string;\n}\n","import { Injectable, effect, signal } from '@angular/core';\nimport { getVersionSuffix, pdfDefaultOptions } from './options/pdf-default-options';\nimport { IPDFViewerApplication } from './options/pdf-viewer-application';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PDFNotificationService {\n // this event is fired when the pdf.js library has been loaded and objects like PDFApplication are available\n public onPDFJSInitSignal = signal<IPDFViewerApplication | undefined>(undefined);\n\n public pdfjsVersion = getVersionSuffix(pdfDefaultOptions.assetsFolder);\n\n public constructor() {\n effect(() => {\n if (this.onPDFJSInitSignal()) {\n this.pdfjsVersion = getVersionSuffix(pdfDefaultOptions.assetsFolder);\n }\n });\n }\n}\n","import { effect, Injectable, Renderer2, RendererFactory2, signal } from '@angular/core';\nimport { AnnotationEditorParamsType, AnnotationMode, EditorAnnotation, HighlightEditorAnnotation, StampEditorAnnotation } from './options/editor-annotations';\nimport { PdfLayer } from './options/optional_content_config';\nimport { PdfPageInfo, PdfPageSelection } from './options/pdf-page-info';\nimport { PDFPrintRange } from './options/pdf-print-range';\nimport { IPDFViewerApplication, PDFDocumentProxy, PDFFindParameters, PDFPageProxy, TextItem, TextMarkedContent } from './options/pdf-viewer-application';\nimport { ZoomType } from './options/zoom-type';\nimport { PDFNotificationService } from './pdf-notification-service';\n\nexport interface FindOptions {\n highlightAll?: boolean;\n matchCase?: boolean;\n wholeWords?: boolean;\n matchDiacritics?: boolean;\n dontScrollIntoView?: boolean;\n findMultiple?: boolean;\n regexp?: boolean;\n useSecondaryFindcontroller?: boolean;\n}\n\ninterface DrawContext {\n ctx: CanvasRenderingContext2D;\n canvas: HTMLCanvasElement;\n}\n\n