epub-flow 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,63 +1,91 @@
1
- # EpubReader
1
+ # epub-flow 📖
2
2
 
3
- This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.2.0.
3
+ A premium, feature-rich EPUB reader library for Angular applications. Built with performance, aesthetics, and ease of use in mind.
4
4
 
5
- ## Code scaffolding
5
+ ## Features
6
6
 
7
- Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
7
+ - 📖 **Smooth Reading**: Powered by Epub.js for reliable rendering.
8
+ - 🌓 **Aesthetic Transitions**: Integrated Light and Dark modes with smooth color transitions.
9
+ - 📚 **Beautiful TOC**: Hierarchical Table of Contents with dot leaders and indentation.
10
+ - 🖼️ **Cover Preview**: Custom loading screen with pulse-animated book cover previews.
11
+ - 🏷️ **Annotations**: Support for highlights, notes, and bookmarks.
12
+ - 📱 **Responsive**: Mobile-first design that looks great on any screen size.
13
+ - 🔍 **Search**: Full-text search with highlighting in result snippets.
14
+ - 🛠️ **Configurable**: Toggle features like search, notes, font controls, etc.
8
15
 
9
- ```bash
10
- ng generate component component-name
11
- ```
12
-
13
- For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
14
-
15
- ```bash
16
- ng generate --help
17
- ```
18
-
19
- ## Building
16
+ ## 🚀 Installation
20
17
 
21
- To build the library, run:
18
+ Install the package and its peer dependencies:
22
19
 
23
20
  ```bash
24
- ng build epub-reader
21
+ npm install epub-flow primeng primeicons ngx-editor epubjs
25
22
  ```
26
23
 
27
- This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
24
+ ## 🛠 Setup
28
25
 
29
- ### Publishing the Library
26
+ ### 1. Import EpubReaderModule
30
27
 
31
- Once the project is built, you can publish your library by following these steps:
28
+ Add `EpubReaderModule` to your `AppModule` or standalone component:
32
29
 
33
- 1. Navigate to the `dist` directory:
34
- ```bash
35
- cd dist/epub-reader
36
- ```
30
+ ```typescript
31
+ import { EpubReaderModule } from 'epub-flow';
37
32
 
38
- 2. Run the `npm publish` command to publish your library to the npm registry:
39
- ```bash
40
- npm publish
41
- ```
33
+ @NgModule({
34
+ imports: [
35
+ EpubReaderModule,
36
+ // ... other imports
37
+ ]
38
+ })
39
+ export class AppModule { }
40
+ ```
42
41
 
43
- ## Running unit tests
42
+ ### 2. Include Required Styles
44
43
 
45
- To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
44
+ Add PrimeNG and PrimeIcons styles to your `angular.json` or `styles.scss`:
46
45
 
47
- ```bash
48
- ng test
46
+ ```scss
47
+ /* In styles.scss */
48
+ @import "primeicons/primeicons.css";
49
+ @import "primeng/resources/themes/lara-light-blue/theme.css";
50
+ @import "primeng/resources/primeng.min.css";
49
51
  ```
50
52
 
51
- ## Running end-to-end tests
52
-
53
- For end-to-end (e2e) testing, run:
53
+ ## 📖 Usage
54
54
 
55
- ```bash
56
- ng e2e
55
+ ### Basic Usage
56
+ ```html
57
+ <epub-flow [epubUrl]="'assets/books/sample.epub'"></epub-flow>
57
58
  ```
58
59
 
59
- Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
60
-
61
- ## Additional Resources
60
+ ### Advanced Usage with Feature Toggles
61
+ ```html
62
+ <epub-flow
63
+ [epubBlob]="currentBlob"
64
+ [coverPage]="'assets/cover.jpg'"
65
+ [enableDarkMode]="true"
66
+ [enableSearch]="true"
67
+ [enableHighlights]="true"
68
+ [enableBookmarks]="true"
69
+ [enableChapterList]="true"
70
+ [enableTextSelection]="true">
71
+ </epub-flow>
72
+ ```
62
73
 
63
- For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
74
+ ## ⚙️ Configuration (Inputs)
75
+
76
+ | Input | Type | Default | Description |
77
+ |---|---|---|---|
78
+ | `epubUrl` | `string` | `null` | URL to a remote EPUB file. |
79
+ | `epubBlob` | `Blob` | `null` | Local Blob or File object for direct loading. |
80
+ | `coverPage` | `string` | `null` | URL to a cover image displayed during loading. |
81
+ | `bookId` | `string \| number` | `0` | Unique ID for backend integration. |
82
+ | `enableDarkMode` | `boolean` | `true` | Toggle Dark Mode availability. |
83
+ | `enableSearch` | `boolean` | `true` | Toggle Search tool. |
84
+ | `enableHighlights` | `boolean` | `true` | Toggle Highlighting tools. |
85
+ | `enableBookmarks` | `boolean` | `true` | Toggle Bookmarking. |
86
+ | `enableChapterList` | `boolean` | `true` | Toggle Table of Contents. |
87
+ | `enableFontSize` | `boolean` | `true` | Toggle Font size controls. |
88
+ | `enableNotes` | `boolean` | `true` | Toggle Note creation. |
89
+
90
+ ## 📄 License
91
+ MIT
Binary file
@@ -2101,7 +2101,7 @@ class ReaderMainComponent {
2101
2101
  this.onDestroy$.complete();
2102
2102
  }
2103
2103
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ReaderMainComponent, deps: [{ token: i0.NgZone }, { token: HttpApiService }, { token: SharedService }, { token: EpubReaderService }, { token: i0.ChangeDetectorRef }, { token: i3.ActivatedRoute }, { token: CustomDialogService }, { token: i4.MessageService }, { token: i1$2.Location }, { token: PLATFORM_ID }, { token: i3.Router }, { token: i1$1.Overlay }], target: i0.ɵɵFactoryTarget.Component });
2104
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ReaderMainComponent, isStandalone: false, selector: "epub-flow", inputs: { epubUrl: "epubUrl", epubBlob: "epubBlob", coverPage: "coverPage", enableDarkMode: "enableDarkMode", enableSearch: "enableSearch", enableHighlights: "enableHighlights", enableBookmarks: "enableBookmarks", enableChapterList: "enableChapterList", enableTextSelection: "enableTextSelection", enableFontSize: "enableFontSize", enableNotes: "enableNotes" }, outputs: { underlineRemoveRequest: "underlineRemoveRequest" }, host: { listeners: { "document:keyup": "handleKeyUp($event)", "document:keydown": "onKeyDown($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div id=\"reader-container\" [hidden]=\"showBookPageLoader || showDwndLoader\">\n <div id=\"reader-content\" style=\"overflow: hidden;\">\n <div id=\"reader\"></div>\n </div>\n\n <div id=\"reader-footer\">\n <div class=\"footer-container\">\n <!-- Left: Previous Button -->\n <button class=\"nav-btn prev-btn\" (click)=\"prevClick()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15 18L9 12L15 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Center: Progress Bar -->\n <div class=\"progress-section\">\n <div class=\"progress-label\">Read Progress</div>\n <div class=\"progress-bar-container\">\n <div class=\"progress-track\">\n <div class=\"progress-fill\" [style.width.%]=\"readPercentage.roudedOff\"></div>\n </div>\n <input type=\"range\" class=\"progress-slider\" min=\"0\" max=\"100\" [value]=\"readPercentage.roudedOff\"\n (input)=\"onProgressChange($event)\" />\n <span class=\"progress-text\">{{ readPercentage.roudedOff }}%</span>\n </div>\n </div>\n\n <!-- Right: Menu Toggle & Next Button -->\n <div class=\"right-controls\">\n <!-- Menu Toggle Button (Green) -->\n <div class=\"menu-container relative\">\n <!-- The Menu Popup -->\n @if (isMenuOpen) {\n <div class=\"menu-popup fade-in\">\n <ul class=\"menu-list\">\n <!-- Dark Mode -->\n <!-- Dark Mode -->\n @if (enableDarkMode) {\n <li (click)=\"toggleDarkMode = !toggleDarkMode; darkMode()\">\n <div class=\"menu-item\">\n <span class=\"icon moon-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.5 10C12.7 10.3 11.9 10.5 11 10.5C7.4 10.5 4.5 7.6 4.5 4C4.5 3.1 4.7 2.3 5 1.5C2.7 2.5 1 4.8 1 7.5C1 11.1 3.9 14 7.5 14C10.2 14 12.5 12.3 13.5 10Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>{{ toggleDarkMode ? 'Light Mode' : 'Dark Mode' }}</span>\n </div>\n </li>\n }\n\n <!-- Highlights & Notes -->\n <!-- Highlights & Notes -->\n @if (enableHighlights || enableNotes) {\n <li (click)=\"openCommonPopup(1); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon notes-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 4H14M2 8H14M2 12H8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Highlights & Notes</span>\n </div>\n </li>\n }\n\n <!-- Search Book -->\n <!-- Search Book -->\n @if (enableSearch) {\n <li (click)=\"openCommonPopup(2); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon search-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 14L10.5 10.5M10.5 10.5C11.4 9.6 12 8.4 12 7C12 4.2 9.8 2 7 2C4.2 2 2 4.2 2 7C2 9.8 4.2 12 7 12C8.4 12 9.6 11.4 10.5 10.5Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Search Book</span>\n </div>\n </li>\n }\n\n <!-- Bookmark List -->\n <!-- Bookmark List -->\n @if (enableBookmarks) {\n <li (click)=\"getBookMarkList(); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon bookmark-list-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 1.33H4C3.26 1.33 2.66 1.93 2.66 2.66V13.33C2.66 14.06 3.26 14.66 4 14.66H12C12.73 14.66 13.33 14.06 13.33 13.33V2.66C13.33 1.93 12.73 1.33 12 1.33ZM6 2.66H7.33V6L6.66 5.5L6 6V2.66ZM12 13.33H4V2.66H4.66V8.66L6.66 7.16L8.66 8.66V2.66H12V13.33Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span>Bookmark List</span>\n </div>\n </li>\n }\n\n <!-- Chapters List -->\n <!-- Chapters List -->\n @if (enableChapterList) {\n <li (click)=\"showChapterPopup(); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon chapter-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 15.33H2.66C1.93 15.33 1.33 14.73 1.33 14V4.66H2.66V14H12V15.33ZM11 8.66H7V10H11V8.66ZM10 0.66H5.33C4.6 0.66 4 1.26 4 2L4 11.33C4 12.06 4.6 12.66 5.33 12.66H12.66C13.4 12.66 14 12.06 14 11.33V4.66L10 0.66ZM12.66 11.33H5.33V2H9.44L12.66 5.22V11.33Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span>Chapters List</span>\n </div>\n </li>\n }\n\n <!-- Divider Row for Quick Actions -->\n <!-- Divider Row for Quick Actions -->\n <li class=\"quick-actions-row\">\n @if (enableFontSize) {\n <div class=\"quick-action-btn\" (click)=\"changeFontSize('+')\">\n <span class=\"text-sm font-bold\">A+</span>\n </div>\n <div class=\"quick-action-btn\" (click)=\"changeFontSize('-')\">\n <span class=\"text-sm font-bold\">A-</span>\n </div>\n }\n @if (enableNotes) {\n <div class=\"quick-action-btn\" (click)=\"addNoteToPage(); isMenuOpen = false\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3 17.25V21H6.75L17.81 9.94L14.06 6.19L3 17.25ZM20.71 7.04C21.1 6.65 21.1 6.02 20.71 5.63L18.37 3.29C17.98 2.9 17.35 2.9 16.96 3.29L15.13 5.12L18.88 8.87L20.71 7.04Z\"\n fill=\"currentColor\" />\n </svg>\n </div>\n }\n @if (enableBookmarks) {\n <div class=\"quick-action-btn\" (click)=\"addBookMark(); isMenuOpen = false\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 3H7C5.9 3 5 3.9 5 5V21L12 18L19 21V5C19 3.9 18.1 3 17 3Z\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n }\n </li>\n </ul>\n </div>\n }\n\n <!-- Selection Menu Inside Footer Hub -->\n @if (freeSample === 'false') {\n @if (showHighlightOverlay) {\n <div class=\"custom-selection-toolbar selection-menu fade-in\">\n @if (enableNotes) {\n <div class=\"menu-item\" (click)=\"addNotes(); showHighlightOverlay = false\">\n <span class=\"menu-text\">Add Notes</span>\n </div>\n }\n @if (enableHighlights) {\n <div class=\"menu-item\" (click)=\"showhightLightColor = true; showHighlightOverlay = false\" title=\"Highlight\">\n <span class=\"menu-text\">Highlights</span>\n </div>\n }\n @if (enableHighlights) {\n <div class=\"menu-item\" (click)=\"addUnderline(); showHighlightOverlay = false\">\n <span class=\"menu-text\">Underline</span>\n </div>\n }\n @if (enableNotes || enableHighlights) {\n <!-- Definition often goes with these tools -->\n <div class=\"menu-item border-none\" (click)=\"openCommonPopup(4); showHighlightOverlay = false\">\n <span class=\"menu-text\">Definition</span>\n </div>\n }\n </div>\n }\n\n @if (showhightLightColor) {\n <div class=\"custom-selection-toolbar color-picker fade-in\">\n @for (color of colourCodeList; track color) {\n <div class=\"color-circle\" [style.background]=\"color\"\n (click)=\"addHighlight(color); showhightLightColor = false\"></div>\n }\n <button class=\"toolbar-btn close-colors\" (click)=\"showhightLightColor = false; showHighlightOverlay = true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 12H5\"></path>\n </svg>\n </button>\n </div>\n }\n }\n\n <!-- The Green Toggle Button -->\n <button class=\"menu-toggle-btn\" (click)=\"toggleAllMenus()\"\n [class.open]=\"isMenuOpen || showHighlightOverlay || showhightLightColor\">\n <!-- X Icon when open, Burger/Menu when closed -->\n @if (isMenuOpen || showHighlightOverlay || showhightLightColor) {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n } @else {\n <!-- Menu Grid Icon -->\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6H20M4 12H20M4 18H20\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </button>\n </div>\n\n <!-- Next Button -->\n <button class=\"nav-btn next-btn\" (click)=\"nextClick()\" [class.ml-4]=\"true\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9 18L15 12L9 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n\n@if (showBookPageLoader) {\n<div class=\"fixed inset-0 z-[45] flex items-center justify-center bg-premium-loader fade-in\">\n <div class=\"text-center\">\n <div class=\"mb-8 relative inline-block\">\n <!-- Decorative Backdrop for Book -->\n <div class=\"absolute inset-0 bg-black/5 blur-2xl rounded-full transform scale-110\"></div>\n\n <!-- Larger, Premium Book Image -->\n <img [src]=\"coverImg ?? ''\" alt=\"Loading\"\n class=\"w-56 h-80 object-cover rounded-xl shadow-premium border-[6px] border-white relative z-10 animate-pulse\" />\n </div>\n\n <!-- Enhanced Loading Text Container -->\n <div class=\"flex flex-col items-center space-y-3\">\n <div class=\"flex items-center space-x-2 text-gray-400\">\n <span class=\"text-base font-medium\">Please wait a moment</span>\n <div class=\"flex space-x-1.5\">\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce\"></div>\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce [animation-delay:-0.15s]\"></div>\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce [animation-delay:-0.3s]\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n@if (showOverlay) {\n<div class=\"screenshot-overlay\"></div>\n}\n\n<!-- Full-screen Preview End Modal -->\n@if (showPreviewModal) {\n<div class=\"fixed inset-0 z-40 bg-white dark:bg-gray-900 flex flex-col items-center justify-center text-center px-4\">\n <h2\n class=\"text-[1.375rem] sm:text-2xl font-medium leading-snug text-center text-gray-800 dark:text-white mb-6 max-w-xs sm:max-w-sm mx-auto\">\n You\u2019ve reached the end of the sample for\n </h2>\n\n <img [src]=\"coverImg ?? ''\" alt=\"Book Cover\" class=\"w-40 h-auto rounded-lg shadow-lg mb-6\" />\n</div>\n}\n\n\n<!-- Custom Chapter List Modal -->\n@if (showChapterList) {\n<div class=\"custom-modal-overlay fade-in\">\n <div class=\"custom-modal-content\">\n <app-chapterlist [chapterData]=\"chaptersData\" (chapterClick)=\"onChapterSelect($event)\"\n (closeDialog)=\"showChapterList = false\">\n </app-chapterlist>\n </div>\n</div>\n}", styles: [":host{--bg-primary: #ffffff;--bg-secondary: #f8fafc;--text-primary: #0f172a;--text-secondary: #475569;--border-base: #edf2f7;--shadow-base: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06);--accent-color: #34C759;--modal-bg: #ffffff;--modal-text: #0f172a}:host-context(.dark-mode){--bg-primary: rgb(32 33 32);--bg-secondary: rgb(42 43 42);--text-primary: #f8fafc;--text-secondary: #94a3b8;--border-base: #2d3748;--shadow-base: 0 10px 15px -3px rgba(0, 0, 0, .5);--accent-color: #32d74b;--modal-bg: rgb(32 33 32);--modal-text: #f9fafb}#reader{width:100%;height:100%}.no-select{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:default}.screenshot-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#fff;z-index:9999}img,[draggable=true]{-webkit-user-drag:none}::ng-deep *{-webkit-user-drag:none}::ng-deep .textLayer span{-webkit-user-drag:none;pointer-events:auto}.fade-in{animation:fadeIn .5s ease-in forwards}.fade-out{animation:fadeOut .5s ease-out forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.7}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media print{#viewer{display:none!important}body:before{content:\"Printing is disabled.\";font-size:24px;color:red;text-align:center;display:block;margin-top:100px}}.progress-container{position:relative;height:4px}.range-overlay{position:absolute;top:0;left:0;width:100%;z-index:10;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;touch-action:none}.range-overlay::-webkit-slider-thumb{-webkit-appearance:none;height:14px;width:14px;margin-top:-5px;border-radius:50%;background:#0ea951;border:2px solid #ffffff;box-shadow:0 1px 3px #0003;transition:background .2s ease,transform .2s ease}.range-overlay::-webkit-slider-thumb:hover{background:#0cb14f;transform:scale(1.1)}.range-overlay::-webkit-slider-thumb:active{background:#0ba046;transform:scale(1.15)}.range-overlay::-webkit-slider-runnable-track{background:transparent;height:4px}.range-overlay::-moz-range-thumb{height:16px;width:16px;border-radius:50%;background:#0ea951;border:2px solid white}.range-overlay::-moz-range-track{background:transparent;height:4px}.range-overlay::-ms-thumb{height:16px;width:16px;border-radius:50%;background:#0ea951;border:2px solid white}.range-overlay::-ms-track{background:transparent;height:4px;border-color:transparent;color:transparent}#reader-container:after{content:\"\";position:absolute;top:13%;bottom:10%;left:50%;transform:translate(-50%);width:2px;background:linear-gradient(to bottom,#06030300,#0d080833,#0000);box-shadow:0 0 10px #0000001a;z-index:1}@media (max-width: 767px){#reader-container:after{display:none!important}}@media (max-width: 991px){#reader-container:after{display:none!important}}::ng-deep nav{box-shadow:none!important}::ng-deep .highlightandNotes .ngneat-dialog-content{width:510px!important;padding:24px}::ng-deep .highlightandNotes .ngneat-close-dialog{top:1.2rem}::ng-deep .highlightandNotes.dark-mode .ngneat-dialog-content{background-color:#333;color:#fff!important}::ng-deep .highlightandNotes.dark-mode .ngneat-close-dialog{color:#fff!important}::ng-deep .highlightandNotes.dark-mode .ngneat-dialog-content{color:#fff!important}::ng-deep .highlightandNotes.dark-mode .text-\\[\\#272C47\\]{color:#fff!important}::ng-deep .highlightandNotes.dark-mode .text-black{color:#fff!important}::ng-deep .addandeditNotepopup .ngneat-dialog-content{width:690px!important}::ng-deep .crop-popup .ngneat-dialog-content{width:420px!important}:host,app-notes{background-color:var(--bg-primary);display:flex;width:100%;justify-content:center;transition:background-color .3s ease}#reader-container{width:100%;height:98vh;background-color:var(--bg-primary);padding-top:0;display:flex;flex-direction:column;overflow:hidden;transition:background-color .3s ease}#reader-content{flex:1;overflow:hidden;position:relative}#reader-footer{position:relative;width:60vw;margin:0 auto;padding:10px 38px 20px;background:var(--bg-primary);z-index:50;transition:background-color .3s ease}#reader-footer .footer-container{display:flex;justify-content:space-between;align-items:flex-end;gap:20px}#reader-footer .nav-btn{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;cursor:pointer;transition:background .2s;background:transparent;border:none;color:var(--text-primary)}#reader-footer .nav-btn:hover{background:#f5f5f5}#reader-footer .nav-btn svg{width:20px;height:20px}#reader-footer .progress-section{flex:1;display:flex;flex-direction:column;align-items:center;max-width:600px;margin:0 auto;padding-bottom:5px}#reader-footer .progress-section .progress-label{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px;color:#666;margin-bottom:6px}#reader-footer .progress-section .progress-bar-container{position:relative;width:100%;height:14px;display:flex;align-items:center}#reader-footer .progress-section .progress-bar-container .progress-track{flex:1;height:4px;background:#e7ebeb;border-radius:2px;overflow:hidden;position:relative}#reader-footer .progress-section .progress-bar-container .progress-fill{height:100%;background:#34c759;transition:width .2s ease-out;border-radius:2px}#reader-footer .progress-section .progress-bar-container .progress-slider{position:absolute;width:100%;height:100%;opacity:0;cursor:pointer;top:0;left:0;z-index:2}#reader-footer .progress-section .progress-bar-container .progress-text{margin-left:12px;font-size:12px;font-weight:600;min-width:35px;color:var(--text-primary)}#reader-footer .right-controls{display:flex;align-items:center;gap:16px}#reader-footer .menu-toggle-btn{width:48px;height:48px;border-radius:50%;background:#34c759;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 10px #34c7594d;border:none}#reader-footer .menu-toggle-btn.open{background:#34c759;transform:rotate(90deg)}#reader-footer .menu-toggle-btn:hover{transform:scale(1.05);background:#2ebd50}#reader-footer .menu-popup{position:absolute;bottom:70px;right:0;width:280px;background:var(--bg-primary);border-radius:16px;box-shadow:var(--shadow-base);padding:8px 0;z-index:100;border:1px solid var(--border-base);transform-origin:bottom right}#reader-footer .menu-popup .menu-list{list-style:none;padding:0;margin:0}#reader-footer .menu-popup .menu-list li{padding:0 8px;cursor:pointer}#reader-footer .menu-popup .menu-list .menu-item{display:flex;align-items:center;padding:12px;font-size:14px;font-weight:500;color:var(--text-primary);border-radius:8px;transition:background .1s}#reader-footer .menu-popup .menu-list .menu-item:hover{background:var(--bg-secondary)}#reader-footer .menu-popup .menu-list .menu-item .icon{width:32px;display:flex;align-items:center;justify-content:flex-start;color:var(--text-secondary)}#reader-footer .menu-popup .menu-list .menu-item .icon svg{width:18px;height:18px}#reader-footer .menu-popup .quick-actions-row{display:flex;justify-content:space-between;padding:12px 16px;margin-top:8px;border-top:1px solid #f0f0f0;gap:8px}#reader-footer .menu-popup .quick-actions-row .quick-action-btn{flex:1;height:40px;display:flex;align-items:center;justify-content:center;border-radius:8px;background:var(--bg-secondary);cursor:pointer;color:var(--text-primary);transition:all .2s}#reader-footer .menu-popup .quick-actions-row .quick-action-btn:hover{background:var(--border-base)}.calibre{padding:0!important}.hightlight-overlay ::ng-deep .p-overlay{top:-232px!important}app-chapterlist ::ng-deep #reader-content{padding:0!important}.custom-modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#0006;backdrop-filter:blur(4px);z-index:200;display:flex;align-items:center;justify-content:center}.custom-modal-content{background:var(--modal-bg);color:var(--modal-text);width:90%;max-width:500px;border-radius:12px;box-shadow:var(--shadow-base);overflow:hidden;animation:modalEnter .2s ease-out;transition:background-color .3s ease,color .3s ease}@keyframes modalEnter{0%{opacity:0;transform:scale(.95) translateY(10px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-4px)}}.animate-bounce{animation:bounce .6s infinite}.fixed{position:fixed}.inset-0{inset:0}.z-40{z-index:40}.z-45{z-index:45}.flex{display:flex}.items-center{align-items:center}.justify-center{justify-content:center}.text-center{text-align:center}.bg-white{background-color:#fff}.bg-white\\/95{background-color:#fffffff2!important}.bg-black\\/5{background-color:#0000000d}.bg-accent-color{background-color:var(--accent-color)}.bg-premium-loader{background:var(--bg-primary)}.blur-2xl{filter:blur(40px)}.transform{--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1}.relative{position:relative}.absolute{position:absolute}.inline-block{display:inline-block}.z-10{z-index:10}.mb-8{margin-bottom:2rem}.space-y-3>*+*{margin-top:.75rem}.space-x-1\\.5>*+*{margin-left:.375rem}.tracking-tight{letter-spacing:-.025em}.text-gray-800{color:#1f2937}.border-\\[6px\\]{border-width:6px}.backdrop-blur-sm{backdrop-filter:blur(4px)}.w-full{width:100%}.px-4{padding-left:1rem;padding-right:1rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mt-\\[-1\\.5rem\\]{margin-top:-1.5rem}.ml-1{margin-left:.25rem}.space-x-1>*+*{margin-left:.25rem}.space-x-2>*+*{margin-left:.5rem}.inline-flex{display:inline-flex}.text-gray-700{color:#374151}.text-gray-400{color:#9ca3af}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.w-40{width:10rem}.h-56{height:14rem}.w-56{width:14rem}.h-80{height:20rem}.w-32{width:8rem}.h-44{height:11rem}.object-cover{object-fit:cover}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.shadow-2xl{box-shadow:0 25px 50px -12px #00000040}.shadow-premium{box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a,0 0 0 1px #0000000d}.mx-auto{margin-left:auto;margin-right:auto}.border-4{border-width:4px}.border-white{border-color:#fff}.border-gray-50{border-color:#f9fafb}.w-1\\.5{width:.375rem}.h-1\\.5{height:.375rem}.bg-gray-400{background-color:#9ca3af}.rounded-full{border-radius:9999px}.custom-selection-toolbar{position:absolute;bottom:70px;right:0;z-index:100;width:280px;background:var(--bg-primary);border-radius:16px;box-shadow:var(--shadow-base);display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border-base);padding:8px 0;transform-origin:bottom right}.custom-selection-toolbar .menu-item{padding:12px 20px;border-bottom:1px solid #f1f5f9;cursor:pointer;transition:all .2s ease;display:flex;align-items:center}.custom-selection-toolbar .menu-item:hover{background:#f8fafc}.custom-selection-toolbar .menu-item:hover .menu-text{color:var(--accent-color)}.custom-selection-toolbar .menu-item.border-none{border-bottom:none}.custom-selection-toolbar .menu-item .menu-text{font-size:15px;font-weight:500;color:#334155}.custom-selection-toolbar.color-picker{width:auto;flex-direction:row;padding:8px 12px;gap:12px;align-items:center}.custom-selection-toolbar.color-picker .color-circle{width:24px;height:24px;border-radius:50%;cursor:pointer;border:2px solid white;box-shadow:0 2px 4px #0000001a;transition:transform .2s ease}.custom-selection-toolbar.color-picker .color-circle:hover{transform:scale(1.2)}.custom-selection-toolbar.color-picker .toolbar-btn{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%;border:none;background:#f1f5f9;color:#64748b;cursor:pointer;margin-left:4px}.custom-selection-toolbar.color-picker .toolbar-btn:hover{background:#e2e8f0}:host-context(.dark-mode) .custom-selection-toolbar{background:#1e293b;border-color:#334155}:host-context(.dark-mode) .custom-selection-toolbar .menu-item{border-bottom-color:#334155}:host-context(.dark-mode) .custom-selection-toolbar .menu-item:hover{background:#0f172a}:host-context(.dark-mode) .custom-selection-toolbar .menu-item .menu-text{color:#f1f5f9}:host-context(.dark-mode) .custom-selection-toolbar.color-picker .toolbar-btn{background:#334155;color:#f1f5f9}\n"], dependencies: [{ kind: "component", type: ChapterlistComponent, selector: "app-chapterlist", inputs: ["chapterData"], outputs: ["chapterClick", "closeDialog"] }] });
2104
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ReaderMainComponent, isStandalone: false, selector: "epub-flow", inputs: { epubUrl: "epubUrl", epubBlob: "epubBlob", coverPage: "coverPage", enableDarkMode: "enableDarkMode", enableSearch: "enableSearch", enableHighlights: "enableHighlights", enableBookmarks: "enableBookmarks", enableChapterList: "enableChapterList", enableTextSelection: "enableTextSelection", enableFontSize: "enableFontSize", enableNotes: "enableNotes", bookId: "bookId" }, outputs: { underlineRemoveRequest: "underlineRemoveRequest" }, host: { listeners: { "document:keyup": "handleKeyUp($event)", "document:keydown": "onKeyDown($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div id=\"reader-container\" [hidden]=\"showBookPageLoader || showDwndLoader\">\n <div id=\"reader-content\" style=\"overflow: hidden;\">\n <div id=\"reader\"></div>\n </div>\n\n <div id=\"reader-footer\">\n <div class=\"footer-container\">\n <!-- Left: Previous Button -->\n <button class=\"nav-btn prev-btn\" (click)=\"prevClick()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15 18L9 12L15 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Center: Progress Bar -->\n <div class=\"progress-section\">\n <div class=\"progress-label\">Read Progress</div>\n <div class=\"progress-bar-container\">\n <div class=\"progress-track\">\n <div class=\"progress-fill\" [style.width.%]=\"readPercentage.roudedOff\"></div>\n </div>\n <input type=\"range\" class=\"progress-slider\" min=\"0\" max=\"100\" [value]=\"readPercentage.roudedOff\"\n (input)=\"onProgressChange($event)\" />\n <span class=\"progress-text\">{{ readPercentage.roudedOff }}%</span>\n </div>\n </div>\n\n <!-- Right: Menu Toggle & Next Button -->\n <div class=\"right-controls\">\n <!-- Menu Toggle Button (Green) -->\n <div class=\"menu-container relative\">\n <!-- The Menu Popup -->\n @if (isMenuOpen) {\n <div class=\"menu-popup fade-in\">\n <ul class=\"menu-list\">\n <!-- Dark Mode -->\n <!-- Dark Mode -->\n @if (enableDarkMode) {\n <li (click)=\"toggleDarkMode = !toggleDarkMode; darkMode()\">\n <div class=\"menu-item\">\n <span class=\"icon moon-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.5 10C12.7 10.3 11.9 10.5 11 10.5C7.4 10.5 4.5 7.6 4.5 4C4.5 3.1 4.7 2.3 5 1.5C2.7 2.5 1 4.8 1 7.5C1 11.1 3.9 14 7.5 14C10.2 14 12.5 12.3 13.5 10Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>{{ toggleDarkMode ? 'Light Mode' : 'Dark Mode' }}</span>\n </div>\n </li>\n }\n\n <!-- Highlights & Notes -->\n <!-- Highlights & Notes -->\n @if (enableHighlights || enableNotes) {\n <li (click)=\"openCommonPopup(1); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon notes-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 4H14M2 8H14M2 12H8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Highlights & Notes</span>\n </div>\n </li>\n }\n\n <!-- Search Book -->\n <!-- Search Book -->\n @if (enableSearch) {\n <li (click)=\"openCommonPopup(2); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon search-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 14L10.5 10.5M10.5 10.5C11.4 9.6 12 8.4 12 7C12 4.2 9.8 2 7 2C4.2 2 2 4.2 2 7C2 9.8 4.2 12 7 12C8.4 12 9.6 11.4 10.5 10.5Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Search Book</span>\n </div>\n </li>\n }\n\n <!-- Bookmark List -->\n <!-- Bookmark List -->\n @if (enableBookmarks) {\n <li (click)=\"getBookMarkList(); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon bookmark-list-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 1.33H4C3.26 1.33 2.66 1.93 2.66 2.66V13.33C2.66 14.06 3.26 14.66 4 14.66H12C12.73 14.66 13.33 14.06 13.33 13.33V2.66C13.33 1.93 12.73 1.33 12 1.33ZM6 2.66H7.33V6L6.66 5.5L6 6V2.66ZM12 13.33H4V2.66H4.66V8.66L6.66 7.16L8.66 8.66V2.66H12V13.33Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span>Bookmark List</span>\n </div>\n </li>\n }\n\n <!-- Chapters List -->\n <!-- Chapters List -->\n @if (enableChapterList) {\n <li (click)=\"showChapterPopup(); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon chapter-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 15.33H2.66C1.93 15.33 1.33 14.73 1.33 14V4.66H2.66V14H12V15.33ZM11 8.66H7V10H11V8.66ZM10 0.66H5.33C4.6 0.66 4 1.26 4 2L4 11.33C4 12.06 4.6 12.66 5.33 12.66H12.66C13.4 12.66 14 12.06 14 11.33V4.66L10 0.66ZM12.66 11.33H5.33V2H9.44L12.66 5.22V11.33Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span>Chapters List</span>\n </div>\n </li>\n }\n\n <!-- Divider Row for Quick Actions -->\n <!-- Divider Row for Quick Actions -->\n <li class=\"quick-actions-row\">\n @if (enableFontSize) {\n <div class=\"quick-action-btn\" (click)=\"changeFontSize('+')\">\n <span class=\"text-sm font-bold\">A+</span>\n </div>\n <div class=\"quick-action-btn\" (click)=\"changeFontSize('-')\">\n <span class=\"text-sm font-bold\">A-</span>\n </div>\n }\n @if (enableNotes) {\n <div class=\"quick-action-btn\" (click)=\"addNoteToPage(); isMenuOpen = false\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3 17.25V21H6.75L17.81 9.94L14.06 6.19L3 17.25ZM20.71 7.04C21.1 6.65 21.1 6.02 20.71 5.63L18.37 3.29C17.98 2.9 17.35 2.9 16.96 3.29L15.13 5.12L18.88 8.87L20.71 7.04Z\"\n fill=\"currentColor\" />\n </svg>\n </div>\n }\n @if (enableBookmarks) {\n <div class=\"quick-action-btn\" (click)=\"addBookMark(); isMenuOpen = false\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 3H7C5.9 3 5 3.9 5 5V21L12 18L19 21V5C19 3.9 18.1 3 17 3Z\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n }\n </li>\n </ul>\n </div>\n }\n\n <!-- Selection Menu Inside Footer Hub -->\n @if (freeSample === 'false') {\n @if (showHighlightOverlay) {\n <div class=\"custom-selection-toolbar selection-menu fade-in\">\n @if (enableNotes) {\n <div class=\"menu-item\" (click)=\"addNotes(); showHighlightOverlay = false\">\n <span class=\"menu-text\">Add Notes</span>\n </div>\n }\n @if (enableHighlights) {\n <div class=\"menu-item\" (click)=\"showhightLightColor = true; showHighlightOverlay = false\" title=\"Highlight\">\n <span class=\"menu-text\">Highlights</span>\n </div>\n }\n @if (enableHighlights) {\n <div class=\"menu-item\" (click)=\"addUnderline(); showHighlightOverlay = false\">\n <span class=\"menu-text\">Underline</span>\n </div>\n }\n @if (enableNotes || enableHighlights) {\n <!-- Definition often goes with these tools -->\n <div class=\"menu-item border-none\" (click)=\"openCommonPopup(4); showHighlightOverlay = false\">\n <span class=\"menu-text\">Definition</span>\n </div>\n }\n </div>\n }\n\n @if (showhightLightColor) {\n <div class=\"custom-selection-toolbar color-picker fade-in\">\n @for (color of colourCodeList; track color) {\n <div class=\"color-circle\" [style.background]=\"color\"\n (click)=\"addHighlight(color); showhightLightColor = false\"></div>\n }\n <button class=\"toolbar-btn close-colors\" (click)=\"showhightLightColor = false; showHighlightOverlay = true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 12H5\"></path>\n </svg>\n </button>\n </div>\n }\n }\n\n <!-- The Green Toggle Button -->\n <button class=\"menu-toggle-btn\" (click)=\"toggleAllMenus()\"\n [class.open]=\"isMenuOpen || showHighlightOverlay || showhightLightColor\">\n <!-- X Icon when open, Burger/Menu when closed -->\n @if (isMenuOpen || showHighlightOverlay || showhightLightColor) {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n } @else {\n <!-- Menu Grid Icon -->\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6H20M4 12H20M4 18H20\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </button>\n </div>\n\n <!-- Next Button -->\n <button class=\"nav-btn next-btn\" (click)=\"nextClick()\" [class.ml-4]=\"true\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9 18L15 12L9 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n\n@if (showBookPageLoader) {\n<div class=\"fixed inset-0 z-[45] flex items-center justify-center bg-premium-loader fade-in\">\n <div class=\"text-center\">\n <div class=\"mb-8 relative inline-block\">\n <!-- Decorative Backdrop for Book -->\n <div class=\"absolute inset-0 bg-black/5 blur-2xl rounded-full transform scale-110\"></div>\n\n <!-- Larger, Premium Book Image -->\n <img [src]=\"coverImg ?? ''\" alt=\"Loading\"\n class=\"w-56 h-80 object-cover rounded-xl shadow-premium border-[6px] border-white relative z-10 animate-pulse\" />\n </div>\n\n <!-- Enhanced Loading Text Container -->\n <div class=\"flex flex-col items-center space-y-3\">\n <div class=\"flex items-center space-x-2 text-gray-400\">\n <span class=\"text-base font-medium\">Please wait a moment</span>\n <div class=\"flex space-x-1.5\">\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce\"></div>\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce [animation-delay:-0.15s]\"></div>\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce [animation-delay:-0.3s]\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n@if (showOverlay) {\n<div class=\"screenshot-overlay\"></div>\n}\n\n<!-- Full-screen Preview End Modal -->\n@if (showPreviewModal) {\n<div class=\"fixed inset-0 z-40 bg-white dark:bg-gray-900 flex flex-col items-center justify-center text-center px-4\">\n <h2\n class=\"text-[1.375rem] sm:text-2xl font-medium leading-snug text-center text-gray-800 dark:text-white mb-6 max-w-xs sm:max-w-sm mx-auto\">\n You\u2019ve reached the end of the sample for\n </h2>\n\n <img [src]=\"coverImg ?? ''\" alt=\"Book Cover\" class=\"w-40 h-auto rounded-lg shadow-lg mb-6\" />\n</div>\n}\n\n\n<!-- Custom Chapter List Modal -->\n@if (showChapterList) {\n<div class=\"custom-modal-overlay fade-in\">\n <div class=\"custom-modal-content\">\n <app-chapterlist [chapterData]=\"chaptersData\" (chapterClick)=\"onChapterSelect($event)\"\n (closeDialog)=\"showChapterList = false\">\n </app-chapterlist>\n </div>\n</div>\n}", styles: [":host{--bg-primary: #ffffff;--bg-secondary: #f8fafc;--text-primary: #0f172a;--text-secondary: #475569;--border-base: #edf2f7;--shadow-base: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06);--accent-color: #34C759;--modal-bg: #ffffff;--modal-text: #0f172a}:host-context(.dark-mode){--bg-primary: rgb(32 33 32);--bg-secondary: rgb(42 43 42);--text-primary: #f8fafc;--text-secondary: #94a3b8;--border-base: #2d3748;--shadow-base: 0 10px 15px -3px rgba(0, 0, 0, .5);--accent-color: #32d74b;--modal-bg: rgb(32 33 32);--modal-text: #f9fafb}#reader{width:100%;height:100%}.no-select{user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:default}.screenshot-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#fff;z-index:9999}img,[draggable=true]{-webkit-user-drag:none}::ng-deep *{-webkit-user-drag:none}::ng-deep .textLayer span{-webkit-user-drag:none;pointer-events:auto}.fade-in{animation:fadeIn .5s ease-in forwards}.fade-out{animation:fadeOut .5s ease-out forwards}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.7}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media print{#viewer{display:none!important}body:before{content:\"Printing is disabled.\";font-size:24px;color:red;text-align:center;display:block;margin-top:100px}}.progress-container{position:relative;height:4px}.range-overlay{position:absolute;top:0;left:0;width:100%;z-index:10;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;touch-action:none}.range-overlay::-webkit-slider-thumb{-webkit-appearance:none;height:14px;width:14px;margin-top:-5px;border-radius:50%;background:#0ea951;border:2px solid #ffffff;box-shadow:0 1px 3px #0003;transition:background .2s ease,transform .2s ease}.range-overlay::-webkit-slider-thumb:hover{background:#0cb14f;transform:scale(1.1)}.range-overlay::-webkit-slider-thumb:active{background:#0ba046;transform:scale(1.15)}.range-overlay::-webkit-slider-runnable-track{background:transparent;height:4px}.range-overlay::-moz-range-thumb{height:16px;width:16px;border-radius:50%;background:#0ea951;border:2px solid white}.range-overlay::-moz-range-track{background:transparent;height:4px}.range-overlay::-ms-thumb{height:16px;width:16px;border-radius:50%;background:#0ea951;border:2px solid white}.range-overlay::-ms-track{background:transparent;height:4px;border-color:transparent;color:transparent}#reader-container:after{content:\"\";position:absolute;top:13%;bottom:10%;left:50%;transform:translate(-50%);width:2px;background:linear-gradient(to bottom,#06030300,#0d080833,#0000);box-shadow:0 0 10px #0000001a;z-index:1}@media (max-width: 767px){#reader-container:after{display:none!important}}@media (max-width: 991px){#reader-container:after{display:none!important}}::ng-deep nav{box-shadow:none!important}::ng-deep .highlightandNotes .ngneat-dialog-content{width:510px!important;padding:24px}::ng-deep .highlightandNotes .ngneat-close-dialog{top:1.2rem}::ng-deep .highlightandNotes.dark-mode .ngneat-dialog-content{background-color:#333;color:#fff!important}::ng-deep .highlightandNotes.dark-mode .ngneat-close-dialog{color:#fff!important}::ng-deep .highlightandNotes.dark-mode .ngneat-dialog-content{color:#fff!important}::ng-deep .highlightandNotes.dark-mode .text-\\[\\#272C47\\]{color:#fff!important}::ng-deep .highlightandNotes.dark-mode .text-black{color:#fff!important}::ng-deep .addandeditNotepopup .ngneat-dialog-content{width:690px!important}::ng-deep .crop-popup .ngneat-dialog-content{width:420px!important}:host,app-notes{background-color:var(--bg-primary);display:flex;width:100%;justify-content:center;transition:background-color .3s ease}#reader-container{width:100%;height:98vh;background-color:var(--bg-primary);padding-top:0;display:flex;flex-direction:column;overflow:hidden;transition:background-color .3s ease}#reader-content{flex:1;overflow:hidden;position:relative}#reader-footer{position:relative;width:60vw;margin:0 auto;padding:10px 38px 20px;background:var(--bg-primary);z-index:50;transition:background-color .3s ease}#reader-footer .footer-container{display:flex;justify-content:space-between;align-items:flex-end;gap:20px}#reader-footer .nav-btn{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;cursor:pointer;transition:background .2s;background:transparent;border:none;color:var(--text-primary)}#reader-footer .nav-btn:hover{background:#f5f5f5}#reader-footer .nav-btn svg{width:20px;height:20px}#reader-footer .progress-section{flex:1;display:flex;flex-direction:column;align-items:center;max-width:600px;margin:0 auto;padding-bottom:5px}#reader-footer .progress-section .progress-label{font-size:11px;font-weight:500;text-transform:uppercase;letter-spacing:.5px;color:#666;margin-bottom:6px}#reader-footer .progress-section .progress-bar-container{position:relative;width:100%;height:14px;display:flex;align-items:center}#reader-footer .progress-section .progress-bar-container .progress-track{flex:1;height:4px;background:#e7ebeb;border-radius:2px;overflow:hidden;position:relative}#reader-footer .progress-section .progress-bar-container .progress-fill{height:100%;background:#34c759;transition:width .2s ease-out;border-radius:2px}#reader-footer .progress-section .progress-bar-container .progress-slider{position:absolute;width:100%;height:100%;opacity:0;cursor:pointer;top:0;left:0;z-index:2}#reader-footer .progress-section .progress-bar-container .progress-text{margin-left:12px;font-size:12px;font-weight:600;min-width:35px;color:var(--text-primary)}#reader-footer .right-controls{display:flex;align-items:center;gap:16px}#reader-footer .menu-toggle-btn{width:48px;height:48px;border-radius:50%;background:#34c759;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 10px #34c7594d;border:none}#reader-footer .menu-toggle-btn.open{background:#34c759;transform:rotate(90deg)}#reader-footer .menu-toggle-btn:hover{transform:scale(1.05);background:#2ebd50}#reader-footer .menu-popup{position:absolute;bottom:70px;right:0;width:280px;background:var(--bg-primary);border-radius:16px;box-shadow:var(--shadow-base);padding:8px 0;z-index:100;border:1px solid var(--border-base);transform-origin:bottom right}#reader-footer .menu-popup .menu-list{list-style:none;padding:0;margin:0}#reader-footer .menu-popup .menu-list li{padding:0 8px;cursor:pointer}#reader-footer .menu-popup .menu-list .menu-item{display:flex;align-items:center;padding:12px;font-size:14px;font-weight:500;color:var(--text-primary);border-radius:8px;transition:background .1s}#reader-footer .menu-popup .menu-list .menu-item:hover{background:var(--bg-secondary)}#reader-footer .menu-popup .menu-list .menu-item .icon{width:32px;display:flex;align-items:center;justify-content:flex-start;color:var(--text-secondary)}#reader-footer .menu-popup .menu-list .menu-item .icon svg{width:18px;height:18px}#reader-footer .menu-popup .quick-actions-row{display:flex;justify-content:space-between;padding:12px 16px;margin-top:8px;border-top:1px solid #f0f0f0;gap:8px}#reader-footer .menu-popup .quick-actions-row .quick-action-btn{flex:1;height:40px;display:flex;align-items:center;justify-content:center;border-radius:8px;background:var(--bg-secondary);cursor:pointer;color:var(--text-primary);transition:all .2s}#reader-footer .menu-popup .quick-actions-row .quick-action-btn:hover{background:var(--border-base)}.calibre{padding:0!important}.hightlight-overlay ::ng-deep .p-overlay{top:-232px!important}app-chapterlist ::ng-deep #reader-content{padding:0!important}.custom-modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:#0006;backdrop-filter:blur(4px);z-index:200;display:flex;align-items:center;justify-content:center}.custom-modal-content{background:var(--modal-bg);color:var(--modal-text);width:90%;max-width:500px;border-radius:12px;box-shadow:var(--shadow-base);overflow:hidden;animation:modalEnter .2s ease-out;transition:background-color .3s ease,color .3s ease}@keyframes modalEnter{0%{opacity:0;transform:scale(.95) translateY(10px)}to{opacity:1;transform:scale(1) translateY(0)}}@keyframes bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-4px)}}.animate-bounce{animation:bounce .6s infinite}.fixed{position:fixed}.inset-0{inset:0}.z-40{z-index:40}.z-45{z-index:45}.flex{display:flex}.items-center{align-items:center}.justify-center{justify-content:center}.text-center{text-align:center}.bg-white{background-color:#fff}.bg-white\\/95{background-color:#fffffff2!important}.bg-black\\/5{background-color:#0000000d}.bg-accent-color{background-color:var(--accent-color)}.bg-premium-loader{background:var(--bg-primary)}.blur-2xl{filter:blur(40px)}.transform{--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1}.relative{position:relative}.absolute{position:absolute}.inline-block{display:inline-block}.z-10{z-index:10}.mb-8{margin-bottom:2rem}.space-y-3>*+*{margin-top:.75rem}.space-x-1\\.5>*+*{margin-left:.375rem}.tracking-tight{letter-spacing:-.025em}.text-gray-800{color:#1f2937}.border-\\[6px\\]{border-width:6px}.backdrop-blur-sm{backdrop-filter:blur(4px)}.w-full{width:100%}.px-4{padding-left:1rem;padding-right:1rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mt-\\[-1\\.5rem\\]{margin-top:-1.5rem}.ml-1{margin-left:.25rem}.space-x-1>*+*{margin-left:.25rem}.space-x-2>*+*{margin-left:.5rem}.inline-flex{display:inline-flex}.text-gray-700{color:#374151}.text-gray-400{color:#9ca3af}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.w-40{width:10rem}.h-56{height:14rem}.w-56{width:14rem}.h-80{height:20rem}.w-32{width:8rem}.h-44{height:11rem}.object-cover{object-fit:cover}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.shadow-2xl{box-shadow:0 25px 50px -12px #00000040}.shadow-premium{box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a,0 0 0 1px #0000000d}.mx-auto{margin-left:auto;margin-right:auto}.border-4{border-width:4px}.border-white{border-color:#fff}.border-gray-50{border-color:#f9fafb}.w-1\\.5{width:.375rem}.h-1\\.5{height:.375rem}.bg-gray-400{background-color:#9ca3af}.rounded-full{border-radius:9999px}.custom-selection-toolbar{position:absolute;bottom:70px;right:0;z-index:100;width:280px;background:var(--bg-primary);border-radius:16px;box-shadow:var(--shadow-base);display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border-base);padding:8px 0;transform-origin:bottom right}.custom-selection-toolbar .menu-item{padding:12px 20px;border-bottom:1px solid #f1f5f9;cursor:pointer;transition:all .2s ease;display:flex;align-items:center}.custom-selection-toolbar .menu-item:hover{background:#f8fafc}.custom-selection-toolbar .menu-item:hover .menu-text{color:var(--accent-color)}.custom-selection-toolbar .menu-item.border-none{border-bottom:none}.custom-selection-toolbar .menu-item .menu-text{font-size:15px;font-weight:500;color:#334155}.custom-selection-toolbar.color-picker{width:auto;flex-direction:row;padding:8px 12px;gap:12px;align-items:center}.custom-selection-toolbar.color-picker .color-circle{width:24px;height:24px;border-radius:50%;cursor:pointer;border:2px solid white;box-shadow:0 2px 4px #0000001a;transition:transform .2s ease}.custom-selection-toolbar.color-picker .color-circle:hover{transform:scale(1.2)}.custom-selection-toolbar.color-picker .toolbar-btn{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:50%;border:none;background:#f1f5f9;color:#64748b;cursor:pointer;margin-left:4px}.custom-selection-toolbar.color-picker .toolbar-btn:hover{background:#e2e8f0}:host-context(.dark-mode) .custom-selection-toolbar{background:#1e293b;border-color:#334155}:host-context(.dark-mode) .custom-selection-toolbar .menu-item{border-bottom-color:#334155}:host-context(.dark-mode) .custom-selection-toolbar .menu-item:hover{background:#0f172a}:host-context(.dark-mode) .custom-selection-toolbar .menu-item .menu-text{color:#f1f5f9}:host-context(.dark-mode) .custom-selection-toolbar.color-picker .toolbar-btn{background:#334155;color:#f1f5f9}\n"], dependencies: [{ kind: "component", type: ChapterlistComponent, selector: "app-chapterlist", inputs: ["chapterData"], outputs: ["chapterClick", "closeDialog"] }] });
2105
2105
  }
2106
2106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ReaderMainComponent, decorators: [{
2107
2107
  type: Component,
@@ -2133,6 +2133,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImpo
2133
2133
  type: Input
2134
2134
  }], underlineRemoveRequest: [{
2135
2135
  type: Output
2136
+ }], bookId: [{
2137
+ type: Input
2136
2138
  }], handleKeyUp: [{
2137
2139
  type: HostListener,
2138
2140
  args: ['document:keyup', ['$event']]
@@ -1 +1 @@
1
- {"version":3,"file":"epub-flow.mjs","sources":["../../../projects/epub-reader/src/lib/epub-reader.service.ts","../../../projects/epub-reader/src/lib/custom-dialog.service.ts","../../../projects/epub-reader/src/lib/shared-mocks/services-mocks.ts","../../../projects/epub-reader/src/lib/add-notes/add-notes.component.ts","../../../projects/epub-reader/src/lib/add-notes/add-notes.component.html","../../../projects/epub-reader/src/lib/shared-mocks/no-data-found.component.ts","../../../projects/epub-reader/src/lib/shared-mocks/skeleton-loader.component.ts","../../../projects/epub-reader/src/lib/shared-mocks/skeleton-loader.component.html","../../../projects/epub-reader/src/lib/epub-common-popup/epub-common-popup.component.ts","../../../projects/epub-reader/src/lib/epub-common-popup/epub-common-popup.component.html","../../../projects/epub-reader/src/lib/shared-mocks/confirm-popup.component.ts","../../../projects/epub-reader/src/lib/chapterlist/chapterlist.component.ts","../../../projects/epub-reader/src/lib/chapterlist/chapterlist.component.html","../../../projects/epub-reader/src/lib/reader-main/reader-main.component.ts","../../../projects/epub-reader/src/lib/reader-main/reader-main.component.html","../../../projects/epub-reader/src/lib/epub-loader/epub-loader.component.ts","../../../projects/epub-reader/src/lib/epub-loader/epub-loader.component.html","../../../projects/epub-reader/src/lib/epub-reader.module.ts","../../../projects/epub-reader/src/public-api.ts","../../../projects/epub-reader/src/epub-flow.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport {\n EpubChapter,\n SearchResponseModel,\n} from './shared-mocks/models-mocks';\nimport { map, Observable } from 'rxjs';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\n\n@Injectable()\nexport class EpubReaderService {\n ePubChapters = signal<EpubChapter | null>(null);\n noteToEdit = signal<any>(null);\n searchKey = signal<string>('');\n searchResponseData = signal<SearchResponseModel[] | null>(null);\n\n\n constructor(private http: HttpClient) { }\n\n /*\n *@Desc : To update Epub chapters\n *@Author: Jaisankar\n */\n updateChapters(data: EpubChapter): void {\n this.ePubChapters.set(data);\n }\n\n /*\n *@Desc : To update Search key\n *@Author: Jaisankar\n */\n toUpdateSearchKey(data: string): void {\n this.searchKey.set(data);\n }\n\n /*\n *@Desc : To update Search key\n *@Author: Jaisankar\n */\n updateSearchData(data: SearchResponseModel[] | null): void {\n this.searchResponseData.set(data);\n }\n\n /*\n *@Desc : TO STORE SELECTED NOTES\n *@Author: ABOOBACKER\n */\n setNote(data: any) {\n this.noteToEdit.set(data);\n }\n\n /*\n *@Desc : TO GET SELECTED NOTES\n *@Author: ABOOBACKER\n */\n getNote() {\n return this.noteToEdit();\n }\n\n getDefinition(payload: any): Observable<any> {\n const headers = new HttpHeaders({\n skip: 'true', // Add the custom header\n });\n\n return this.http\n .get(`https://api.dictionaryapi.dev/api/v2/entries/en/${payload}`, {\n headers,\n })\n .pipe(map((x: any) => x?.[0] ?? []));\n }\n}\n","import { Injectable, Type, Injector } from '@angular/core';\nimport { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { Subject } from 'rxjs';\n\nexport interface DialogOptions {\n data?: any;\n windowClass?: string;\n closeButton?: boolean;\n enableClose?: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CustomDialogService {\n constructor(private overlay: Overlay, private injector: Injector) { }\n\n open(component: Type<any>, options: DialogOptions = {}) {\n // 1. Position Strategy\n const positionStrategy = this.overlay.position()\n .global()\n .centerHorizontally()\n .centerVertically();\n\n // 2. Overlay Config\n const overlayConfig = new OverlayConfig({\n positionStrategy,\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-dark-backdrop',\n scrollStrategy: this.overlay.scrollStrategies.block(),\n // You can map options.windowClass to panelClass if needed, or pass width/height\n panelClass: options.windowClass\n });\n\n // 3. Create Overlay\n const overlayRef = this.overlay.create(overlayConfig);\n\n // 4. Create DialogRef\n const ref = new CustomDialogRef();\n ref.data = options.data;\n\n // 5. Create Injector\n const injector = Injector.create({\n providers: [\n { provide: CustomDialogRef, useValue: ref },\n { provide: CustomDialogService, useValue: this }\n ],\n parent: this.injector\n });\n\n // 6. Attach Component\n const portal = new ComponentPortal(component, null, injector);\n overlayRef.attach(portal);\n\n // 7. Handle Close\n ref.afterClosed$.subscribe(() => {\n overlayRef.dispose();\n });\n\n overlayRef.backdropClick().subscribe(() => {\n if (options.enableClose !== false && !options.closeButton) {\n // If closeButton is true, usually that handles closing. \n // But for backdrop click, we check enableClose. Default is usually true.\n ref.close();\n } else if (options.enableClose === undefined) {\n ref.close();\n }\n });\n\n return ref;\n }\n\n closeAll() {\n // This is a simplified version. To properly close all, we'd need to track active refs.\n // For now, individual dialogs manage their own closure via ref.\n }\n}\n\nexport class CustomDialogRef {\n private afterClosed = new Subject<any>();\n afterClosed$ = this.afterClosed.asObservable();\n data: any;\n\n close(result?: any) {\n this.afterClosed.next(result);\n this.afterClosed.complete();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\n\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { map } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class SharedService {\n showHide(val: boolean) { }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class HttpApiService {\n\n\n getAnnotations(params: any): Observable<any> { return of({}); }\n getReadProgress(params: any): Observable<any> { return of({}); }\n getFreeSample(id: any): Observable<any> { return of(new Blob()); }\n getBook(id: any): Observable<any> { return of(new Blob()); }\n saveAnnotations(params: any): Observable<any> { return of({}); }\n saveReadProgress(params: any): Observable<any> { return of({}); }\n deleteNotes(id: any): Observable<any> { return of({}); }\n updateSearchData(data: any) { }\n addorEditeNote(payload: any): Observable<any> { return of({}); }\n\n\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n // methods\n}\n","import { Component, HostListener } from '@angular/core';\nimport {\n AbstractControl,\n FormControl,\n FormGroup,\n Validators,\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { CustomDialogRef, CustomDialogService } from '../custom-dialog.service';\nimport { Editor, Toolbar } from 'ngx-editor';\nimport { SharedService, HttpApiService } from '../shared-mocks/services-mocks';\nimport { EpubReaderService } from '../epub-reader.service';\n\nimport { Subject, takeUntil } from 'rxjs';\nimport { MessageService } from 'primeng/api';\n\n@Component({\n selector: 'app-add-notes',\n standalone: false,\n templateUrl: './add-notes.component.html',\n styleUrl: './add-notes.component.scss',\n})\nexport class AddNotesComponent {\n editor!: Editor; // Editor instance\n textToAddorEdit!: string;\n toolbar: Toolbar = [\n ['bold', 'italic'],\n ['underline', 'strike'],\n ['code', 'blockquote'],\n ['ordered_list', 'bullet_list'],\n [\n {\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n },\n ],\n ['text_color', 'background_color'],\n ['align_left', 'align_center', 'align_right', 'align_justify'],\n ];\n isSubmitting = false;\n\n\n // FormGroup for handling editor content\n form = new FormGroup({\n editorContent: new FormControl(this.textToAddorEdit),\n });\n data: any;\n // Getter for editor content\n get editorContent(): AbstractControl {\n return this.form.get('editorContent')!;\n }\n private onDestroy$: Subject<void> = new Subject<void>();\n constructor(\n public dialog: CustomDialogService,\n private sharedService: SharedService,\n private epubReader: EpubReaderService,\n private userApi: HttpApiService,\n public dialogRef: CustomDialogRef,\n private messageService: MessageService\n ) { }\n ngOnInit(): void {\n // Initialize the editor\n this.editor = new Editor();\n this.textToAddorEdit = this.dialogRef.data.notetoAddorEdit; // Access THE SELECTED NOTE\n this.form.patchValue({ editorContent: this.textToAddorEdit });\n }\n\n onSubmit(): void {\n if (this.form.valid) {\n const content = this.editorContent.value; // Retrieve content as HTML\n }\n }\n\n close() {\n this.dialogRef.close();\n }\n\n @HostListener('document:dragover', ['$event'])\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n console.log('Drag over blocked');\n }\n\n // Prevent drop\n @HostListener('document:drop', ['$event'])\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n console.log('Drop blocked');\n }\n\n // Optional: Prevent drag start\n @HostListener('document:dragstart', ['$event'])\n onDragStart(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n console.log('Drag start blocked');\n }\n\n\n @HostListener('document:contextmenu', ['$event'])\n onRightClick(event: MouseEvent) {\n event.preventDefault(); // Disable the right-click menu\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent) {\n if (event.ctrlKey && event.key === 'c') {\n event.preventDefault(); // Prevent the default copy action\n }\n }\n\n @HostListener('document:copy', ['$event'])\n onCopy(event: ClipboardEvent) {\n event.preventDefault(); // Prevent the copy event\n }\n ngOnDestroy(): void {\n // Destroy the editor instance to prevent memory leaks\n this.editor.destroy();\n }\n updateNote() {\n this.isSubmitting = true;\n\n const content = this.editorContent.value; // Retrieve content as HTML\n const payload = {\n typeId: 1,\n id: this.dialogRef.data.notedetails.id,\n bookId: this.dialogRef.data.notedetails.bookId,\n cfiLocation: this.dialogRef.data.notedetails.cfiLocation,\n annotatedNotes: this.dialogRef.data.notedetails.annotatedNotes,\n customNotes: content,\n colorCode: '',\n };\n\n this.userApi\n .addorEditeNote(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.messageService.add({\n key: 'notifyToast',\n severity: 'success', // Use 'warn' for orange color\n summary: 'Success',\n detail: res.message,\n });\n this.dialog.closeAll();\n },\n error: (err) => {\n this.isSubmitting = false; // re-enable button\n\n console.error('Error fetching eBook details:', err);\n },\n complete: () => {\n this.isSubmitting = false; // re-enable button\n },\n });\n }\n\n /**\n * @Desc : Checks if the provided content has valid, non-empty, and non-whitespace-only text.\n * @Author : Aboobacker\n * @Param : content (string) - The content to validate\n * @Returns: boolean - true if valid content exists, false otherwise\n */\n hasValidContent(content: string): boolean {\n if (!content) return false;\n const textOnly = content.replace(/<[^>]*>/g, '').trim(); // Remove HTML tags\n return textOnly.length > 0;\n }\n\n addNote() {\n this.isSubmitting = true; // re-enable button\n\n const content = this.editorContent.value; // Retrieve content as HTML\n const payload = {\n typeId: 1,\n id: 0,\n bookId: this.dialogRef.data.notedetails.bookId,\n cfiLocation: this.dialogRef.data.notedetails.cfiLocation,\n annotatedNotes: this.dialogRef.data.notetoAddorEdit,\n customNotes: content,\n colorCode: '',\n };\n this.userApi\n .addorEditeNote(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.messageService.add({\n key: 'notifyToast',\n severity: 'success', // Use 'warn' for orange color\n summary: 'Success',\n detail: res.message,\n });\n this.dialog.closeAll();\n },\n error: (err) => {\n this.isSubmitting = false; // re-enable button\n\n console.error('Error fetching eBook details:', err);\n },\n complete: () => {\n this.isSubmitting = false; // re-enable button\n\n },\n });\n }\n}\n","<div class=\"note-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">{{ dialogRef.data.addNote ? 'Add Note' : 'Edit Note' }}</h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <form class=\"note-form\" [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\">\n <!-- Editor Section -->\n <section class=\"editor-section\">\n <ngx-editor-menu [editor]=\"editor\" [toolbar]=\"toolbar\">\n </ngx-editor-menu>\n\n <ngx-editor class=\"editor-body\" [editor]=\"editor\" formControlName=\"editorContent\">\n </ngx-editor>\n </section>\n\n <!-- Validation -->\n <p class=\"error\" *ngIf=\"editorContent.invalid && editorContent.touched\">\n Content is required.\n </p>\n\n <!-- Footer / Actions -->\n <footer class=\"action-bar\">\n @if (dialogRef.data.addNote) {\n <button type=\"submit\" class=\"btn btn-primary\" (click)=\"addNote()\"\n [disabled]=\"!hasValidContent(editorContent.value) || isSubmitting\">\n Add Note\n </button>\n } @else {\n <button type=\"submit\" class=\"btn btn-primary\" (click)=\"updateNote()\"\n [disabled]=\"!hasValidContent(editorContent.value) || isSubmitting\">\n Update Note\n </button>\n }\n </footer>\n </form>\n</div>","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'app-no-data-found',\n standalone: true,\n imports: [CommonModule],\n template: `<div class=\"no-data-found\">{{ message }}</div>`\n})\nexport class NoDataFoundComponent {\n @Input() message: string = 'No Data Found';\n}\n","import { Component, Input, OnChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'app-skeleton-loader',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './skeleton-loader.component.html',\n styleUrls: ['./skeleton-loader.component.scss']\n})\nexport class SkeletonLoaderComponent implements OnChanges {\n @Input() count: number = 3;\n @Input() type: 'list' | 'text' = 'list';\n\n items: any[] = [];\n\n ngOnChanges() {\n this.items = Array(this.count).fill(0);\n }\n}\n","<div class=\"skeleton-container\">\n <div *ngFor=\"let item of items\" class=\"skeleton-item\" [ngClass]=\"type\">\n <ng-container *ngIf=\"type === 'list'\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line title\"></div>\n <div class=\"skeleton-line meta\"></div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"type === 'text'\">\n <div class=\"skeleton-line text-long\"></div>\n <div class=\"skeleton-line text-medium\"></div>\n <div class=\"skeleton-line text-short\"></div>\n </ng-container>\n </div>\n</div>","import { Component, effect, OnDestroy, OnInit } from '@angular/core';\n\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { finalize, Subject, takeUntil } from 'rxjs';\nimport { HttpApiService } from '../shared-mocks/services-mocks';\nimport { MessageService } from 'primeng/api';\nimport { CustomDialogRef, CustomDialogService } from '../custom-dialog.service';\nimport { EpubReaderService } from '../epub-reader.service';\nimport { SharedService } from '../shared-mocks/services-mocks';\nimport { notModel, SearchResponseModel } from '../shared-mocks/models-mocks';\nimport { AddNotesComponent } from '../add-notes/add-notes.component';\n\n\n@Component({\n selector: 'app-epub-common-popup',\n standalone: false,\n templateUrl: './epub-common-popup.component.html',\n styleUrl: './epub-common-popup.component.scss',\n})\nexport class EpubCommonPopupComponent implements OnInit {\n staticText = {\n validationText: { atleastThreeChara: 'Enter at least 3 characters to begin searching' },\n btnText: { cancel: 'Cancel', edit: 'Edit', remove: 'Remove' },\n htmlText: { nohighlightsavailable: 'No highlights' }\n };\n notesandHighlights!: any;\n bookMarkList!: any;\n singlenoteDetails!: any;\n notes!: any;\n isNotEndOfList: boolean = true;\n template = 2;\n htmlString!: SafeHtml;\n htmlStaticText = {\n validationText: { atleastThreeChara: 'Min 3 chars' },\n btnText: { cancel: 'Cancel', edit: 'Edit', remove: 'Remove' },\n htmlText: { nohighlightsavailable: 'No highlights' }\n };\n paginationData = {\n totalCount: 0,\n pageSize: 1000,\n currentPage: 1,\n };\n searchKey: string = '';\n searchData: SearchResponseModel[] | null = null;\n searchCharaSmall: boolean = false;\n private onDestroy$: Subject<void> = new Subject<void>();\n tabviewIndex: any = 1;\n Definition: any = [];\n isLoading: boolean = false;\n isSearchDataAvailable: boolean = false;\n\n constructor(\n private sanitizer: DomSanitizer,\n private userApi: HttpApiService,\n private messageService: MessageService,\n public dialog: CustomDialogService,\n public dialogRef: CustomDialogRef,\n private loaderService: SharedService,\n private epubService: EpubReaderService,\n private sharedService: SharedService\n ) {\n\n\n effect(() => {\n this.searchData = this.epubService.searchResponseData();\n this.isSearchDataAvailable = false; // Reset loading when data arrives\n });\n }\n ngOnInit(): void {\n this.template = this.dialogRef.data.template;\n\n if (this.dialogRef.data.template === 1) {\n this.singlenoteDetails = this.dialogRef.data.notedetails;\n const rawHtml = this.singlenoteDetails.customNotes;\n\n this.htmlString = this.sanitizer.bypassSecurityTrustHtml(rawHtml);\n }\n if (this.dialogRef.data.template === 2) {\n this.getHighlightNotes();\n }\n if (this.dialogRef.data.template === 4) {\n this.getBookmark();\n }\n if (this.dialogRef.data.template === 5) {\n this.getDefinition();\n }\n }\n\n /*\n *@Desc : Handles tab view changes\n *@Author: Aboobacker\n */\n onTabChange(data: any) {\n this.paginationData = {\n totalCount: 0,\n pageSize: 10,\n currentPage: 1,\n };\n\n if (data.index === 1) {\n //noteas\n this.tabviewIndex = data.index;\n this.getNotes();\n } else {\n //highlights\n this.getHighlightNotes();\n }\n }\n /*\n *@Desc : get highlightNotes\n *@Author: Aboobacker\n */\n getHighlightNotes() {\n this.isLoading = true;\n const payload = {\n keyword: '',\n pageSize: this.paginationData.pageSize,\n currentPage: this.paginationData.currentPage,\n id: '',\n type: 2,\n bookId: this.dialogRef.data.bookId,\n };\n\n this.userApi\n .getAnnotations(payload)\n .pipe(\n takeUntil(this.onDestroy$),\n finalize(() => this.isLoading = false)\n )\n .subscribe({\n next: (res: any) => {\n this.notesandHighlights = res.highlightedNotes?.items;\n },\n error: (err) => {\n console.error('Error fetching highlightedNotes details:', err);\n }\n });\n }\n /*\n *@Desc : get bookMarks\n *@Author: Aboobacker\n */\n getBookmark() {\n this.isLoading = true;\n const payload = {\n keyword: '',\n pageSize: 1000,\n currentPage: 1,\n id: '',\n type: 4, // type 4 is bookmark\n bookId: this.dialogRef.data.bookId,\n };\n this.userApi\n .getAnnotations(payload)\n .pipe(\n takeUntil(this.onDestroy$),\n finalize(() => this.isLoading = false)\n )\n .subscribe({\n next: (res: any) => {\n this.bookMarkList = res?.bookmarks?.items;\n }\n });\n }\n /*\n *@Desc : to get Definition\n *@Author: Aboobacker\n */\n getDefinition() {\n this.isLoading = true;\n this.epubService\n .getDefinition(this.dialogRef.data.selectedText)\n .pipe(\n takeUntil(this.onDestroy$),\n finalize(() => this.isLoading = false)\n )\n .subscribe({\n next: (res: any) => {\n // Ensure Definition is always an array to avoid template errors\n this.Definition = Array.isArray(res?.meanings) ? res.meanings : [];\n },\n error: () => {\n this.Definition = [];\n }\n });\n }\n\n /*\n *@Desc : get Notes\n *@Author: Aboobacker\n */\n getNotes() {\n this.isLoading = true;\n const payload = {\n keyword: '',\n pageSize: this.paginationData.pageSize,\n currentPage: this.paginationData.currentPage,\n id: '',\n type: 1,\n bookId: this.dialogRef.data.bookId,\n };\n\n this.userApi\n .getAnnotations(payload)\n .pipe(\n takeUntil(this.onDestroy$),\n finalize(() => this.isLoading = false)\n )\n .subscribe({\n next: (res: notModel) => {\n if (!res.notes.items.length) {\n this.isNotEndOfList = false;\n }\n\n if (this.paginationData.currentPage === 1) {\n this.notes = res.notes?.items;\n } else {\n this.notes = [...this.notes, ...res.notes.items];\n }\n },\n error: (err) => {\n console.error('Error fetching eBook details:', err);\n }\n });\n }\n\n /*\n *@Desc : delete all type of annotations\n *@Author: Aboobacker\n */\n deleteAnnotations(typeId: number, id: number) {\n this.loaderService.showHide(true);\n const payload = {\n typeId: typeId,\n id: id,\n };\n\n this.userApi\n .deleteNotes(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.loaderService.showHide(false);\n this.messageService.add({\n key: 'notifyToast',\n severity: 'success',\n summary: 'Success',\n detail: res.message,\n });\n if (this.template == 1) {\n this.dialog.closeAll();\n }\n if (this.template == 2) {\n this.getNotes();\n this.getHighlightNotes();\n }\n if (this.template == 4) {\n this.getBookmark();\n }\n },\n error: (err) => {\n console.error('Error dlt Annotations:', err);\n },\n complete: () => { },\n });\n }\n\n /*\n *@Desc : open the added note\n *@Author: Aboobacker\n */\n openNote(data: any) {\n this.dialogRef.close(data.cfiLocation);\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n enableClose: false,\n windowClass: 'highlightandNotes',\n data: {\n template: 1,\n notedetails: data,\n },\n });\n }\n\n editNote() {\n this.epubService.setNote(this.singlenoteDetails.customNotes);\n\n const dialog = this.dialog.open(AddNotesComponent, {\n closeButton: false,\n windowClass: 'addandeditNotepopup',\n data: {\n notedetails: this.singlenoteDetails,\n notetoAddorEdit: this.singlenoteDetails.customNotes,\n addNote: false,\n },\n });\n }\n\n updateSearchKey() {\n this.epubService.toUpdateSearchKey(this.searchKey);\n if (this.searchKey.length >= 3) {\n this.searchCharaSmall = false;\n this.isLoading = true; // start local loader \n } else {\n this.searchCharaSmall = true;\n }\n }\n\n clickSearchItem(cfi: string) {\n this.searchKey = '';\n this.epubService.toUpdateSearchKey('');\n this.epubService.updateSearchData(null);\n this.dialogRef.close(cfi);\n }\n\n gotoLocation(data: string) {\n this.dialogRef.close(data);\n }\n\n clearSearch() {\n this.searchKey = '';\n this.epubService.toUpdateSearchKey('');\n this.epubService.updateSearchData(null);\n this.searchCharaSmall = false;\n }\n\n close() {\n this.epubService.updateSearchData(null);\n this.dialogRef.close();\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n closePopup(cfi: string) {\n this.dialogRef.close(cfi);\n }\n\n ngOnDestroy(): void {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n}\n","<!-- Template 1: Single Note View -->\n@if (dialogRef.data.template == 1) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">Note Details</h2>\n <div class=\"header-actions\">\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"popup-content content-padded\">\n <div class=\"inner-html-class text-lg text-primary mb-6\" [innerHTML]=\"htmlString\"></div>\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn btn-secondary\" (click)=\"close()\">\n {{ htmlStaticText.btnText.cancel }}\n </button>\n <button class=\"btn btn-primary\" (click)=\"editNote()\">\n {{ htmlStaticText.btnText.edit }}\n </button>\n <button class=\"btn btn-danger\" (click)=\"deleteAnnotations(1, this.singlenoteDetails.id)\">\n {{ htmlStaticText.btnText.remove }}\n </button>\n </div>\n</div>\n}\n\n<!-- Template 2: Highlights & Notes Tabs -->\n@if (dialogRef.data.template == 2) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M16.035 2.977l4.988 4.989-12.022 12.021H4v-4.988L16.035 2.977z\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n Highlights & Notes\n </h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div class=\"popup-content\">\n <p-tabView (onChange)=\"onTabChange($event)\">\n\n <!-- Highlights Tab -->\n <p-tabPanel header=\"Highlights\">\n <div *ngIf=\"isLoading; else highlightsContent\">\n <app-skeleton-loader [count]=\"4\" type=\"list\"></app-skeleton-loader>\n </div>\n <ng-template #highlightsContent>\n <div *ngIf=\"!notesandHighlights?.length; else noteList\" class=\"empty-state\">\n {{ htmlStaticText.htmlText.nohighlightsavailable }}\n </div>\n\n <ng-template #noteList>\n <div *ngFor=\"let note of notesandHighlights\" class=\"popup-row\">\n <div class=\"row-icon-container\">\n <div class=\"w-2 h-8 rounded-full\" [style.background-color]=\"note.colorCode\"\n style=\"width: 4px; height: 32px; border-radius: 4px;\"></div>\n </div>\n\n <div class=\"row-content\" (click)=\"gotoLocation(note.cfiLocation)\">\n <div class=\"row-title line-clamp\">{{ note.annotatedNotes }}</div>\n <div class=\"row-meta\">\n <span>Page {{ note.pageNumber || 'N/A' }}</span>\n </div>\n </div>\n\n <div class=\"row-actions\">\n <button class=\"action-btn\" (click)=\"deleteAnnotations(2, note.id)\" title=\"Remove\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </p-tabPanel>\n\n <!-- Notes Tab -->\n <p-tabPanel header=\"Notes\">\n <div *ngIf=\"isLoading; else notesContent\">\n <app-skeleton-loader [count]=\"4\" type=\"list\"></app-skeleton-loader>\n </div>\n <ng-template #notesContent>\n <div *ngIf=\"!notes?.length; else notesList\" class=\"empty-state\">\n No notes available.\n </div>\n\n <ng-template #notesList>\n <div *ngFor=\"let item of notes\" class=\"popup-row\">\n <div class=\"row-icon-container\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"row-content\" (click)=\"openNote(item)\">\n <div class=\"row-title line-clamp\"\n [innerHTML]=\"item.annotatedNotes ? item.annotatedNotes : item.customNotes\"></div>\n </div>\n <div class=\"row-actions\">\n <button class=\"action-btn\" (click)=\"deleteAnnotations(1, item.id)\" title=\"Remove\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </p-tabPanel>\n\n </p-tabView>\n </div>\n</div>\n}\n\n<!-- Template 3: Search -->\n@if (dialogRef.data.template == 3) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n Search\n </h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <svg class=\"search-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\">\n <path d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <input [(ngModel)]=\"searchKey\" (keyup.enter)=\"updateSearchKey()\" type=\"text\" placeholder=\"Search in book...\"\n class=\"search-input\" autofocus />\n <div class=\"input-actions-wrapper\">\n <button *ngIf=\"searchKey\" class=\"icon-btn-clear\" (click)=\"clearSearch()\" title=\"Clear search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button class=\"btn btn-primary btn-sm\" (click)=\"updateSearchKey()\">\n Search\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"popup-content\">\n <div *ngIf=\"searchCharaSmall\" class=\"info-banner\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n <span>{{ staticText.validationText.atleastThreeChara }}</span>\n </div>\n\n <div *ngIf=\"isSearchDataAvailable; else searchResults\">\n <app-skeleton-loader [count]=\"4\" type=\"list\"></app-skeleton-loader>\n </div>\n\n <ng-template #searchResults>\n <div *ngIf=\"searchKey?.length && searchData && !searchData?.length\" class=\"empty-state\">\n <app-no-data-found></app-no-data-found>\n </div>\n\n <div class=\"search-results\">\n <div *ngFor=\"let item of searchData\" class=\"popup-row\" (click)=\"clickSearchItem(item.cfi)\">\n <div class=\"row-content\">\n <div class=\"row-title\" [innerHTML]=\"item.highlightedSentence\"></div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n</div>\n}\n\n<!-- Template 4: Bookmarks -->\n@if (dialogRef.data.template == 4) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n Bookmarks\n </h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div class=\"popup-content\">\n <div *ngIf=\"isLoading; else bookmarkContent\">\n <app-skeleton-loader [count]=\"4\" type=\"list\"></app-skeleton-loader>\n </div>\n\n <ng-template #bookmarkContent>\n <div *ngIf=\"!bookMarkList || bookMarkList.length === 0\" class=\"empty-state\">\n No bookmarks yet.\n </div>\n\n <div *ngIf=\"bookMarkList && bookMarkList.length > 0\">\n <div *ngFor=\"let bookmark of bookMarkList\" class=\"popup-row\">\n <div class=\"row-icon-container\">\n <!-- Filled Bookmark Icon for list -->\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\"\n [style.color]=\"bookmark.colorCode || '#3b82f6'\">\n <path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" />\n </svg>\n </div>\n\n <div class=\"row-content\" (click)=\"closePopup(bookmark.cfiLocation)\">\n <div class=\"row-title line-clamp\">{{ bookmark.annotatedNotes || 'Bookmark' }}</div>\n <div class=\"row-meta mt-2\">\n <div class=\"progress-container\">\n <div class=\"progress-fill\" [style.width.%]=\"bookmark.customNotes\"></div>\n </div>\n <span>{{ bookmark.customNotes }}%</span>\n </div>\n </div>\n\n <div class=\"row-actions\">\n <button class=\"action-btn\" (click)=\"deleteAnnotations(4, bookmark.id)\" title=\"Remove\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n</div>\n}\n\n<!-- Template 5: Definitions -->\n@if (dialogRef.data.template == 5) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M4 19.5A2.5 2.5 0 016.5 17H20\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n Definition\n </h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div class=\"popup-content content-padded\">\n <h3 class=\"text-xl font-bold text-primary mb-4 select-text\">\n \"{{ dialogRef.data.selectedText }}\"\n </h3>\n\n <div *ngIf=\"isLoading; else defsContent\">\n <app-skeleton-loader [count]=\"3\" type=\"text\"></app-skeleton-loader>\n </div>\n\n <ng-template #defsContent>\n <div *ngIf=\"Definition?.length > 0; else noDefs\">\n <div *ngFor=\"let entry of Definition\" class=\"definition-group\">\n <span class=\"pos-tag\">{{ entry.partOfSpeech }}</span>\n\n <div *ngFor=\"let def of entry.definitions\" class=\"def-item\">\n <p class=\"def-text\">{{ def.definition }}</p>\n <p *ngIf=\"def.example\" class=\"def-example\">\"{{ def.example }}\"</p>\n </div>\n </div>\n </div>\n\n <ng-template #noDefs>\n <div class=\"empty-state\">No definitions found.</div>\n </ng-template>\n </ng-template>\n </div>\n</div>\n}","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CustomDialogRef } from '../custom-dialog.service';\n\n@Component({\n selector: 'app-confirm-popup',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"confirm-popup-container\">\n <h3 class=\"title\">{{ data.heading }}</h3>\n <p class=\"message\">{{ data.message }}</p>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"close(false)\">{{ data.btnOneTxt }}</button>\n <button class=\"btn-confirm\" (click)=\"close(true)\">{{ data.btnTwoTxt }}</button>\n </div>\n </div>\n `,\n styles: [`\n .confirm-popup-container {\n padding: 24px;\n background: white;\n border-radius: 8px;\n min-width: 300px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n }\n .title { margin: 0 0 12px; font-size: 1.125rem; font-weight: 600; color: #111827; }\n .message { margin: 0 0 24px; color: #4b5563; font-size: 0.95rem; }\n .actions { display: flex; justify-content: flex-end; gap: 12px; }\n button {\n padding: 8px 16px;\n border-radius: 6px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n }\n .btn-cancel { background: #f3f4f6; color: #374151; }\n .btn-cancel:hover { background: #e5e7eb; }\n .btn-confirm { background: #dc2626; color: white; }\n .btn-confirm:hover { background: #b91c1c; }\n `]\n})\nexport class ConfirmPopupComponent {\n data: any;\n\n constructor(private ref: CustomDialogRef) {\n this.data = this.ref.data;\n }\n\n close(result: boolean) {\n this.ref.close(result);\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-chapterlist',\n standalone: false,\n templateUrl: './chapterlist.component.html',\n styleUrl: './chapterlist.component.scss',\n})\nexport class ChapterlistComponent implements OnInit {\n @Input() chapterData: any[] = [];\n @Output() chapterClick = new EventEmitter<string>();\n @Output() closeDialog = new EventEmitter<void>();\n\n isExpanded: boolean[] = [];\n\n ngOnInit(): void {\n if (this.chapterData) {\n this.isExpanded = new Array(this.chapterData.length).fill(false);\n }\n }\n\n toggleAccordion(index: number): void {\n this.isExpanded[index] = !this.isExpanded[index];\n }\n\n onChapterClick(href: any) {\n this.chapterClick.emit(href);\n }\n\n onClose() {\n this.closeDialog.emit();\n }\n}\n\n","<div id=\"reader-content\" class=\"chapter-list-container bg-white\">\n <!-- Header -->\n <div class=\"chapter-header\">\n\n <h2 class=\"chapter-title\">\n Contents\n </h2>\n\n <button class=\"close-btn\" aria-label=\"Close\" (click)=\"onClose()\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n </div>\n\n\n\n <!-- Chapter List -->\n <div class=\"flex-1 overflow-y-auto custom-scrollbar\">\n <!-- No chapters -->\n <div *ngIf=\"!chapterData || chapterData.length === 0\" class=\"text-sm text-gray-500 p-8 text-center italic\">\n No chapters available in this book.\n </div>\n\n <ng-container *ngFor=\"let chapter of chapterData\">\n\n <!-- Main Chapter -->\n <div class=\"chapter-row main-chapter\" (click)=\"onChapterClick(chapter.href)\">\n <div class=\"title-container\">\n <span class=\"title\">{{ chapter.title }}</span>\n <span *ngIf=\"chapter.page\" class=\"dots\"></span>\n </div>\n <span *ngIf=\"chapter.page\" class=\"page\">\n {{ chapter.page }}\n </span>\n </div>\n\n <!-- Subchapters -->\n <ng-container *ngIf=\"chapter.subchapters?.length\">\n <div *ngFor=\"let subchapter of chapter.subchapters\" class=\"chapter-row sub-chapter\"\n (click)=\"onChapterClick(subchapter.href)\">\n <div class=\"title-container\">\n <span class=\"title\">{{ subchapter.title }}</span>\n <span *ngIf=\"subchapter.page\" class=\"dots\"></span>\n </div>\n <span *ngIf=\"subchapter.page\" class=\"page\">\n {{ subchapter.page }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>","import { HttpEventType } from '@angular/common/http';\nimport {\n ChangeDetectorRef,\n Component,\n effect,\n EventEmitter,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n OnChanges,\n SimpleChanges,\n Output,\n PLATFORM_ID,\n} from '@angular/core';\nimport { SharedService, HttpApiService } from '../shared-mocks/services-mocks';\nimport {\n forkJoin,\n from,\n map,\n mergeMap,\n Observable,\n Subject,\n Subscription,\n takeUntil,\n toArray,\n} from 'rxjs';\nimport { EpubReaderService } from '../epub-reader.service';\nimport { CustomDialogService } from '../custom-dialog.service';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ChapterlistComponent } from '../chapterlist/chapterlist.component';\nimport { EpubChapter, AnnotationModel } from '../shared-mocks/models-mocks';\nimport { AddNotesComponent } from '../add-notes/add-notes.component';\nimport { EpubCommonPopupComponent } from '../epub-common-popup/epub-common-popup.component';\nimport ePub from 'epubjs';\nimport { MessageService } from 'primeng/api';\nimport { ConfirmPopupComponent } from '../shared-mocks/confirm-popup.component';\nimport { isPlatformBrowser, Location } from '@angular/common';\nimport {\n ElementRef,\n HostListener,\n Renderer2,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n@Component({\n selector: 'epub-flow',\n standalone: false,\n templateUrl: './reader-main.component.html',\n styleUrl: './reader-main.component.scss',\n})\nexport class ReaderMainComponent implements OnInit, OnDestroy, OnChanges {\n @Input() epubUrl: string | null = null;\n @Input() epubBlob: Blob | null = null;\n @Input() coverPage: string | null = null;\n\n // Feature flags\n @Input() enableDarkMode: boolean = true;\n @Input() enableSearch: boolean = true;\n @Input() enableHighlights: boolean = true;\n @Input() enableBookmarks: boolean = true;\n @Input() enableChapterList: boolean = true;\n @Input() enableTextSelection: boolean = true;\n @Input() enableFontSize: boolean = true;\n @Input() enableNotes: boolean = true;\n\n @Output() underlineRemoveRequest = new EventEmitter<{\n cfi: string;\n annotationId?: string;\n }>();\n\n book: any;\n bookId: string | number = 0;\n rendition: any;\n readPercentage = {\n roudedOff: 0,\n numberFormat: 0,\n };\n bookDwnldPerctge = 0;\n showDwndLoader: boolean = true;\n mainOvelay: boolean = false;\n showHighlightOverlay: boolean = false;\n showhightLightColor: boolean = false;\n audioNarrations: boolean = false;\n toggleDarkMode: boolean = false;\n curentPageEndCfi!: string;\n chaptersData!: EpubChapter;\n selectedData = {\n selectedCfiRange: '',\n selectedText: '',\n };\n fontSize = 100; //default font size is 100\n highlightList: AnnotationModel[] = [];\n underlineList: AnnotationModel[] = [];\n searchData: any = [];\n searchKeyword = '';\n newSentence = '';\n colourCodeList: Array<string> = ['#F44336', '#FFEB3B', '#4CAF50']; //When adding or removing new colour to the colour list it should be updated here\n readCfi: string = '';\n annotedList: any;\n readPercentagegetbyApi: any;\n freeSample: string = 'false';\n showOverlay = false;\n showBookPageLoader: boolean = true;\n showPreviewModal = false;\n hasShownPreviewMessage = false;\n maxPreviewClicks = 5;\n coverImg: string | null = null;\n isMenuOpen: boolean = false;\n selectionPosition = { top: 0, left: 0 };\n private onDestroy$: Subject<void> = new Subject<void>();\n private readProgressSub!: Subscription;\n private overlayRef?: OverlayRef;\n\n @HostListener('document:keyup', ['$event'])\n handleKeyUp(event: KeyboardEvent) {\n if (event.key === 'PrintScreen') {\n navigator.clipboard.writeText('');\n this.showOverlay = true;\n setTimeout(() => {\n this.showOverlay = false;\n }, 1500);\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent) {\n const blockedKeys = ['c', 'v', 'p', 's', 'u', 'i', 'j'];\n if ((event.ctrlKey || event.metaKey) && blockedKeys.includes(event.key.toLowerCase())) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (event.key === 'F12') {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n constructor(\n private ngZone: NgZone,\n private httpService: HttpApiService,\n private sharedService: SharedService,\n private epubService: EpubReaderService,\n private cdr: ChangeDetectorRef,\n private route: ActivatedRoute,\n public dialog: CustomDialogService,\n private messageService: MessageService,\n private location: Location,\n @Inject(PLATFORM_ID) private platformId: Object,\n private router: Router,\n private overlay: Overlay\n ) {\n effect(() => {\n this.searchKeyword = this.epubService.searchKey();\n if (this.searchKeyword && this.searchKeyword.length >= 3) {\n this.searchBook();\n }\n });\n\n const queryParams = this.route.snapshot.queryParams;\n this.bookId = queryParams['bookID'];\n this.freeSample = queryParams['freeSample'] || 'false';\n }\n\n ngOnInit(): void {\n this.coverImg = this.coverPage || this.route.snapshot.queryParams['coverImg'];\n // Load DotLottie dynamically if needed\n this.loadDotLottieIfNeeded();\n\n if (this.bookId) {\n this.initialization();\n } else if (this.epubUrl || this.epubBlob) {\n this.getBookData();\n }\n window.print = () => { };\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['coverPage'] && changes['coverPage'].currentValue) {\n this.coverImg = changes['coverPage'].currentValue;\n }\n if (\n (changes['epubUrl'] && changes['epubUrl'].currentValue) ||\n (changes['epubBlob'] && changes['epubBlob'].currentValue)\n ) {\n this.getBookData();\n }\n }\n\n loadDotLottieIfNeeded(): void {\n if (typeof (window as any).loadDotLottie === 'function') {\n (window as any).loadDotLottie();\n }\n }\n\n /*--------------------------------------------------------- Initialization -----------------------------------------------------------------------------------------*/\n /*\n *@Desc : To get the initial data to load the book, highlights, underline\n *@Author: Jaisankar\n */\n initialization() {\n const allApis: any = [\n this.httpService.getAnnotations({\n keyword: '',\n pageSize: 10,\n currentPage: 1,\n\n type: 3, // type 3 is underline\n bookId: this.bookId,\n }),\n this.httpService.getReadProgress({\n bookId: this.bookId,\n }),\n this.httpService.getAnnotations({\n keyword: '',\n pageSize: 10,\n currentPage: 1,\n\n type: 2, // type 2 is highlight\n bookId: this.bookId,\n }),\n ];\n\n forkJoin(allApis)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (value: any) => {\n this.annotedList = value;\n this.readCfi = this.annotedList[1].cfiLocation;\n this.readPercentagegetbyApi = this.annotedList[1].readProgress;\n this.highlightList = this.annotedList[2].highlightedNotes.items;\n this.underlineList = this.annotedList[0].underlinedNotes.items;\n // this.bookdetails();\n this.getBookData();\n },\n error: () => {\n // If annotations fail, we might still want to load the book if inputs are present\n this.sharedService.showHide(false);\n this.getBookData();\n },\n complete: () => { },\n });\n }\n\n goBack() {\n this.location.back();\n }\n\n audioNarration() {\n console.log('Audio Narration clicked');\n }\n\n /*\n *@Desc : To get the book data from api, initialize all event for the rendition and display the epub\n *@Author: Jaisankar\n */\n getBookData() {\n this.ngZone.run(() => {\n this.sharedService.showHide(false);\n });\n\n if (this.epubBlob) {\n this.loadBookFromBlob(this.epubBlob);\n } else if (this.epubUrl) {\n if (typeof this.epubUrl === 'string' && this.epubUrl.trim() !== '') {\n this.loadBookFromUrl(this.epubUrl);\n } else {\n this.handleBookLoadError('Invalid EPUB URL.');\n }\n } else {\n console.error('No EPUB source provided (epubUrl or epubBlob).');\n // Do not show error to user immediately if waiting for input, unless we want to enforce it.\n // But if this is called, it usually expects data.\n this.handleBookLoadError('No book source found.');\n }\n }\n\n loadBookFromUrl(url: string) {\n try {\n this.book = ePub(url);\n this.renderBook();\n } catch (err) {\n console.error('Error initializing EPUB from URL:', err);\n this.handleBookLoadError('Failed to load book from URL.');\n }\n }\n\n loadBookFromBlob(blob: Blob) {\n if (blob.size === 0) {\n this.handleBookLoadError('The provided EPUB file is empty.');\n return;\n }\n\n const reader = new FileReader();\n reader.readAsArrayBuffer(blob);\n reader.onload = async () => {\n try {\n const arrayBuffer = reader.result as ArrayBuffer;\n if (!arrayBuffer || arrayBuffer.byteLength === 0) {\n throw new Error('Empty array buffer');\n }\n this.book = ePub(arrayBuffer);\n this.renderBook();\n } catch (error) {\n console.error('Error reading blob:', error);\n this.handleBookLoadError('Failed to load the EPUB file.');\n }\n };\n reader.onerror = () => {\n this.handleBookLoadError('Error reading the file.');\n };\n }\n\n handleBookLoadError(message: string) {\n this.showBookPageLoader = false;\n this.showDwndLoader = false;\n this.messageService.add({\n key: 'notifyToast',\n severity: 'error',\n summary: 'Error',\n detail: message,\n });\n this.ngZone.run(() => {\n this.sharedService.showHide(false);\n });\n }\n\n renderBook() {\n const area = document.getElementById('reader');\n if (area) {\n area.innerHTML = ''; // Clear previous content\n }\n\n this.rendition = this.book.renderTo('reader', {\n //To render the Epub and pass the config to the library\n width: '100%', // or \"100%\", depending on your layout\n height: '100%', // optional, adjust based on your container\n allowScriptedContent: true, // Important\n spread: 'auto'\n });\n this.book.ready.then(() => {\n if (this.book.navigation.toc.length) {\n // Map through chapters and extract subchapter information\n const chapters = this.book.navigation.toc.map(\n (spineItem: any) => ({\n title:\n spineItem.label || `Chapter ${spineItem.index + 1}`,\n href:\n this.book?.spine && spineItem?.href\n ? this.book.spine.get(spineItem.href)?.href\n : '',\n subchapters: (spineItem.subitems || []).map(\n (subItem: any) => {\n const spineEntry = this.book.spine.get(subItem.href);\n return {\n title: subItem.label || `Subchapter`,\n href: spineEntry?.href || '', // fallback to empty string or some default\n };\n }\n ),\n })\n );\n this.chaptersData = chapters;\n }\n\n this.book.locations.generate(1000).then(() => {\n // Calculate page numbers for chapters\n if (this.chaptersData) {\n const updateChapterPage = (chapter: any) => {\n const spineItem = this.book.spine.get(chapter.href);\n if (spineItem) {\n const cfi = spineItem.cfiFromElement(undefined);\n chapter.page = this.book.locations.locationFromCfi(cfi);\n }\n if (chapter.subchapters) {\n chapter.subchapters.forEach((sub: any) => {\n const subSpine = this.book.spine.get(sub.href);\n if (subSpine) {\n const subCfi = subSpine.cfiFromElement(undefined);\n sub.page = this.book.locations.locationFromCfi(subCfi);\n }\n });\n }\n };\n\n this.chaptersData.forEach(updateChapterPage);\n }\n\n this.rendition.on('locationChanged', (location: any) => {\n if (this.freeSample == 'false') {\n this.applyHighlights();\n this.applyUnderline();\n }\n this.rendition.themes.default({\n '::selection': {\n background: '#cceeff', // Soft green\n color: '#1b5e20', // Dark text\n },\n '*': {\n '-webkit-tap-highlight-color': 'transparent', // removes green tap\n '-webkit-user-select': 'text',\n 'user-select': 'text',\n '-webkit-touch-callout': 'none', // removes iOS popup menu\n },\n });\n\n this.curentPageEndCfi = location.start;\n\n //To get the location changed event for calculating read percentage and saving current read percentage\n const percentage = this.book.locations.percentageFromCfi(\n location.end\n );\n this.readPercentage.roudedOff =\n Math.floor(percentage * 100) || 0;\n this.readPercentage.numberFormat = percentage;\n });\n this.showDwndLoader = false;\n\n if (\n this.showBookPageLoader === true ||\n this.showBookPageLoader === undefined\n ) {\n this.showBookPageLoader = true;\n }\n\n if (this.readCfi && this.readCfi?.length) {\n setTimeout(() => {\n this.showBookPageLoader = false;\n this.rendition.display(this.readCfi);\n }, 1500);\n\n this.ngZone.run(() => {\n this.sharedService.showHide(false);\n });\n } else {\n setTimeout(() => {\n this.showBookPageLoader = false;\n this.rendition.display();\n }, 1500);\n\n this.ngZone.run(() => {\n this.sharedService.showHide(false);\n });\n }\n });\n });\n\n //Event when new section is rendered\n this.rendition.on('rendered', (section: any) => {\n this.darkMode();\n });\n\n this.rendition.on('rendered', () => {\n this.rendition.views().forEach((view: any) => {\n let iframe = view.iframe;\n if (iframe) {\n const doc = iframe.contentDocument;\n\n // 🔒 Disable copy, drag, and right-click inside EPUB iframe\n ['copy', 'contextmenu', 'dragstart'].forEach((event) =>\n doc.addEventListener(event, (e: Event) =>\n e.preventDefault()\n )\n );\n\n // 🔒 Block all Ctrl/Cmd-based keyboard shortcuts (e.g., Ctrl+P, Ctrl+C, Cmd+S)\n doc.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n e.stopPropagation();\n }\n });\n\n // 🎨 Inject CSS to disable dragging and prevent printing from Chrome menu\n const style = doc.createElement('style');\n style.innerHTML = `\n /* Disable element dragging */\n * {\n -webkit-user-drag: none;\n user-drag: none;\n }\n\n /* Block printing via @media print */\n @media print {\n body, html {\n display: none !important;\n background: white !important;\n }\n\n body::before {\n content: \"🚫 Printing is disabled.\";\n display: block;\n font-size: 24px;\n text-align: center;\n color: red;\n margin-top: 100px;\n }\n }\n `;\n doc.head.appendChild(style);\n }\n });\n const iframe = document.querySelector('iframe');\n if (iframe) {\n const iframeDoc =\n iframe.contentDocument || iframe.contentWindow?.document;\n\n if (iframeDoc) {\n if (this.freeSample === 'true') {\n // Disable all <a> tags inside iframe\n const links = iframeDoc.querySelectorAll('a');\n links.forEach((link) => {\n link.style.pointerEvents = 'none'; // Disable clicking\n link.style.color = 'gray'; // Optional: gray out links\n // Also prevent default on click as a fallback\n link.addEventListener('click', (e) =>\n e.preventDefault()\n );\n });\n }\n\n let scrollTimeout: any = null;\n\n iframeDoc.addEventListener(\n 'wheel',\n (event: WheelEvent) => {\n event.preventDefault(); // Prevent default scroll\n\n if (scrollTimeout) {\n clearTimeout(scrollTimeout);\n }\n\n scrollTimeout = setTimeout(() => {\n if (event.deltaY > 0) {\n this.nextClick();\n } else {\n this.prevClick();\n }\n }, 150);\n },\n { passive: false }\n ); // Important!\n }\n }\n });\n\n //Event when selection is made the function will be called and the cfi and selected content will be saved\n this.rendition.on(\n 'selected',\n (cfiRange: string, contents: any) => {\n if (!this.enableTextSelection) {\n contents.window.getSelection().removeAllRanges();\n return;\n }\n\n const selection = contents.window.getSelection();\n const range = selection.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n\n // Get iframe position\n const frameRect = contents.document.defaultView.frameElement.getBoundingClientRect();\n\n this.ngZone.run(() => {\n this.selectionPosition = {\n top: frameRect.top + rect.top - 60, // Position above selection\n left: frameRect.left + rect.left + (rect.width / 2)\n };\n this.handleSelection(cfiRange, selection.toString().trim());\n });\n }\n );\n }\n\n onProgressChange(event: Event): void {\n if (this.freeSample === 'true' && this.hasShownPreviewMessage) {\n return;\n }\n const input = event.target as HTMLInputElement;\n const percent = +input.value;\n\n if (this.freeSample === 'true') {\n if (percent > this.maxPreviewClicks) {\n this.hasShownPreviewMessage = true;\n this.showPreviewModal = true;\n return;\n }\n }\n // Update progress bar in real-time\n this.readPercentage.roudedOff = percent;\n\n // Also update EPUB location in real-time\n if (this.book && this.book.locations) {\n const cfi = this.book.locations.cfiFromPercentage(percent / 100);\n this.rendition.display(cfi); // this gets called during drag\n }\n }\n\n /*--------------------------------------------- End of Initialization ---------------------------------------------------------*/\n mainOverlay() {\n this.mainOvelay = !this.mainOvelay;\n }\n\n showHighlightOverlaymethod() {\n this.showHighlightOverlay = !this.showHighlightOverlay;\n }\n\n showhightLightColormethod() {\n this.showHighlightOverlay = !this.showHighlightOverlay;\n }\n\n handleCloseButtonClick(): void {\n if (this.mainOvelay) {\n this.mainOverlay();\n } else if (this.showHighlightOverlay) {\n this.showHighlightOverlaymethod();\n } else if (this.showhightLightColor) {\n this.showhightLightColormethod();\n }\n }\n\n /*\n *@Desc : To paginate to next page and apply hightlight and underline again\n *@Author: Jaisankar\n */\n nextClick() {\n if (this.freeSample === 'true' && this.hasShownPreviewMessage) {\n return;\n }\n this.rendition\n ?.next()\n .then(() => {\n this.applyHighlights();\n this.applyUnderline();\n })\n .catch((err: any) => console.error(err));\n if (this.freeSample === 'true') {\n if (this.readPercentage.roudedOff > this.maxPreviewClicks) {\n this.hasShownPreviewMessage = true;\n this.showPreviewModal = true;\n return;\n }\n }\n }\n\n /*\n *@Desc : To paginate to previous page and apply hightlight and underline again\n *@Author: Jaisankar\n */\n prevClick() {\n this.rendition\n .prev()\n .then(() => {\n this.applyHighlights();\n this.applyUnderline();\n })\n .catch((err: any) => console.error(err));\n }\n\n /*\n *@Desc : To toggle between dark and light modes, native toggle feature of epub.js has bugs so custom method implemented\n *@Author: Jaisankar\n */\n darkMode() {\n const iframe = document.querySelector('iframe');\n const body = iframe?.contentDocument?.body;\n\n // Reset styles first\n body?.style?.removeProperty('background-color');\n body?.style?.removeProperty('color');\n\n if (this.toggleDarkMode) {\n document.body.classList.add('dark-mode');\n\n // Content colors for dark mode\n const darkBg = '#121212';\n const darkText = '#e0e0e0';\n const accentLink = '#32d74b';\n\n if (body) {\n body.style.setProperty('background-color', darkBg, 'important');\n body.style.setProperty('color', darkText, 'important');\n\n const allElements = body.querySelectorAll('div, section, article, p, li, h1, h2, h3, h4, h5, h6, span');\n allElements.forEach((el) => {\n (el as HTMLElement).style.setProperty('color', darkText, 'important');\n (el as HTMLElement).style.setProperty('background-color', 'transparent', 'important');\n });\n\n const links = body.querySelectorAll('a');\n links.forEach((a) => {\n a.style.setProperty('color', accentLink, 'important');\n });\n }\n } else {\n document.body.classList.remove('dark-mode');\n\n // Reset to light mode defaults\n if (body) {\n body.style.setProperty('background-color', '#ffffff', 'important');\n body.style.setProperty('color', '#1a1a1a', 'important');\n\n const allElements = body.querySelectorAll('div, section, article, p, li, h1, h2, h3, h4, h5, h6, span');\n allElements.forEach((el) => {\n (el as HTMLElement).style.removeProperty('color');\n (el as HTMLElement).style.removeProperty('background-color');\n });\n }\n }\n if (this.freeSample == 'false') {\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n }\n }\n\n /*\n *@Desc : To toggle fontsizes, and reapply highlights\n *@Author: Jaisankar\n */\n changeFontSize(check: string) {\n if (check === '+') {\n if (this.fontSize < 200) {\n // Check if we can increase the font size\n this.fontSize = Math.min(this.fontSize + 10, 200); // Limit max size (200%)\n }\n this.rendition.themes.fontSize(this.fontSize.toString() + '%');\n\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n } else {\n if (this.fontSize > 50) {\n // Check if we can decrease the font size\n this.fontSize = Math.max(this.fontSize - 10, 50); // Limit min size (50%)\n }\n this.rendition.themes.fontSize(this.fontSize.toString() + '%');\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n }\n }\n\n /*\n *@Desc : To save the cfi of the selected text for highlight and underline\n *@Author: Jaisankar\n */\n handleSelection(cfiRange: any, selectedText: string) {\n this.selectedData.selectedCfiRange = cfiRange;\n this.selectedData.selectedText = selectedText;\n this.showHighlightOverlay = true;\n this.isMenuOpen = false; // Hide main menu if selection happens\n if (this.mainOvelay) {\n this.mainOvelay = !this.mainOvelay;\n }\n this.cdr.detectChanges();\n }\n\n /*\n *@Desc : To show chapter popup using custom implementation\n *@Author: Jaisankar\n */\n showChapterList: boolean = false;\n showChapterPopup() {\n this.showChapterList = true;\n }\n\n onChapterSelect(href: string) {\n this.showChapterList = false;\n if (href) {\n this.rendition.display(href);\n }\n }\n\n\n /*\n *@Desc : To open add notes popup\n *@Author: Jaisankar\n */\n addNotes() {\n this.epubService.setNote(this.selectedData.selectedText);\n const notedetails = {\n bookId: this.bookId,\n cfiLocation: this.selectedData.selectedCfiRange,\n };\n const dialog = this.dialog.open(AddNotesComponent, {\n closeButton: true,\n windowClass: 'addandeditNotepopup',\n data: {\n notedetails: notedetails,\n addNote: true,\n notetoAddorEdit: this.selectedData.selectedText,\n },\n });\n }\n\n /*\n *@Desc : To first get all items in spine that is sections of epub (not chapters)\n then load that section and find the matching keywords,\n then create a span with highlight class replace this span to the sentence where the keyword is found\n return the new sentence, cfi and old sentance as an object\n *@Author: Jaisankar\n */\n searchBook() {\n from(this.book.spine.spineItems)\n .pipe(\n mergeMap((item: any) =>\n from(item.load(this.book.load.bind(this.book))).pipe(\n mergeMap(() => from(item.find(this.searchKeyword))), // Find after loading text\n map((result: any) => {\n // Create a case-insensitive regular expression for the keyword\n const regex = new RegExp(this.searchKeyword, 'gi');\n\n // Replace occurrences of the keyword with the highlighted version\n this.newSentence = result.excerpt.replace(regex, (match: any) => {\n // Wrap each match dynamically, preserving the original case\n return `<span class=\"highlight-key\">${match}</span>`;\n });\n\n // Unload after processing\n item.unload();\n\n // Create the result object\n const newReturnObj = {\n cfi: result.cfi,\n highlightedSentence: this.newSentence,\n originalSentence: result.excerpt,\n };\n\n return newReturnObj; // Return the processed result\n })\n )\n ),\n toArray() // Collect all results into a single array\n )\n .subscribe({\n next: (results: any) => {\n this.epubService.updateSearchData(results.flat()); //flat to flatten the array ex [a, [b,c] ,d ] output is [a,b,c,d]\n this.sharedService.showHide(false); //stop loader after the search result is saved\n },\n error: (err) => {\n console.error('Error:', err);\n },\n });\n }\n\n /*--------------------------------------------------------- Annotations Start -----------------------------------------------------------------------------------------*/\n /*--------------------------------------------------------- Underline Section -----------------------------------------------------------------------------------------*/\n\n /*\n *@Desc : Add underline to underline and apply underline\n *@Author: Jaisankar\n */\n addUnderline() {\n this.underlineList.push({\n typeId: 3,\n id: 0,\n userId: 0,\n libraryId: 0,\n bookId: 0,\n studentId: 0,\n cfiLocation: this.selectedData.selectedCfiRange,\n annotatedNotes: this.selectedData.selectedText,\n customNotes: null,\n colorCode: '',\n notesCapturedDate: '',\n createdBy: 0,\n });\n\n const payload = {\n typeId: 3, // type 4 is bookmark\n id: 0, // 0 for new highlight\n bookId: this.bookId,\n cfiLocation: this.selectedData.selectedCfiRange,\n annotatedNotes: this.selectedData.selectedText,\n customNotes: '',\n colorCode: '',\n };\n\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n\n if (this.bookId) {\n this.httpService\n .saveAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => { },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.getunderlineList();\n\n this.sharedService.showHide(false);\n },\n });\n }\n }\n\n /*\n *@Desc : To remove all underlines first and add underline class and then apply style to the class\n *@Author: Jaisankar\n */\n async applyUnderline() {\n for (const underline of this.underlineList) {\n await this.removeUnderline(underline.cfiLocation);\n }\n\n for (const underline of this.underlineList) {\n await this.addUnderlineClass(underline.cfiLocation);\n }\n\n await this.addStyleToUnderline();\n }\n\n /*\n *@Desc : To add the highlight class\n *@Author: Jaisankar\n */\n addUnderlineClass(cfi: string | null = null) {\n if (cfi?.length) {\n this.rendition?.annotations?.underline(\n cfi || this.selectedData.selectedCfiRange,\n { class: 'custom-underline' },\n (e: any) => {\n const target = e.target as HTMLElement;\n const cfiLocation = target.getAttribute('data-epubcfi') || target.closest('[data-epubcfi]')?.getAttribute('data-epubcfi');\n\n if (cfiLocation) {\n const dialog = this.dialog.open(ConfirmPopupComponent, {\n closeButton: false,\n data: {\n heading: 'Remove Underline?',\n message: 'Are you sure you want to remove this underline?',\n btnOneTxt: 'Cancel',\n btnTwoTxt: 'Remove',\n },\n });\n\n dialog.afterClosed$.subscribe((res: boolean) => {\n if (res) {\n if (res === true) {\n const annotation = this.underlineList.find(\n (annotation) =>\n annotation.cfiLocation === cfiLocation\n );\n\n if (annotation) {\n this.removeUnderline(cfiLocation);\n this.deleteAnnotations(3, annotation.id);\n }\n }\n }\n });\n } else {\n console.log('CFI Location not found', target); // Log target to help debug if needed\n }\n },\n 'underline'\n );\n }\n }\n\n /*\n *@Desc : To remove the highlight class\n *@Author: Jaisankar\n */\n removeUnderline(cfi: string): void {\n try {\n this.rendition?.annotations?.remove(cfi, 'underline');\n } catch (error) {\n console.error('Error removing underline:', error);\n }\n }\n\n /*\n *@Desc : To add colour to the highlights\n *@Author: Jaisankar\n */\n addStyleToUnderline() {\n // Collect all documents (main + iframes)\n const docs: Document[] = [document];\n this.rendition?.views().forEach((view: any) => {\n if (view.iframe?.contentDocument) {\n docs.push(view.iframe.contentDocument);\n }\n });\n\n const isDark = this.toggleDarkMode;\n const strokeColor = isDark ? '#FFFFFF' : '#000000';\n\n docs.forEach(doc => {\n // Target elements with standard and custom underline classes\n const underlineGroups = doc.querySelectorAll('.epubjs-underline, .underline, .custom-underline');\n\n underlineGroups.forEach((group: any) => {\n // SVG rects are often used as hit areas\n const rects = group.querySelectorAll('rect');\n rects.forEach((rect: any) => {\n rect.style.fill = 'transparent';\n rect.style.stroke = 'none';\n rect.style.pointerEvents = 'auto'; // Ensure it's clickable\n });\n\n // SVG lines are the actual underline\n const lines = group.querySelectorAll('line');\n lines.forEach((line: any) => {\n line.style.stroke = strokeColor;\n line.style.strokeWidth = '2';\n line.style.pointerEvents = 'auto';\n });\n });\n });\n }\n\n /*\n *@Desc : To get underline list\n *@Author: Jaisankar\n */\n getunderlineList() {\n const payload = {\n keyword: '',\n pageSize: 1000,\n currentPage: 1,\n id: '',\n type: 3, // type 3 is bookmark\n bookId: this.bookId,\n };\n this.httpService\n .getAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.underlineList = res.underlinedNotes.items;\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.sharedService.showHide(false);\n },\n });\n }\n\n /*--------------------------------------------------------- Highlight Section -----------------------------------------------------------------------------------------*/\n\n /*\n *@Desc : To add highlight and save to db, to add a new colour code it needs to be added to color code array \n \"colorCode\": \"#F44336\" - Red\n \"colorCode\": \"#FFEB3B\" - Yellow\n \"colorCode\": \"#4CAF50\" - Green\n *@Author: Jaisankar\n */\n addHighlight(colourCode: string) {\n //push the highlight to the array in FE\n this.highlightList.push({\n typeId: 2,\n id: 0,\n userId: 0,\n libraryId: 0,\n bookId: 0,\n studentId: 0,\n cfiLocation: this.selectedData.selectedCfiRange,\n annotatedNotes: this.selectedData.selectedText,\n customNotes: null,\n colorCode: colourCode,\n notesCapturedDate: '',\n createdBy: 0,\n });\n const payload = {\n typeId: 2, // type 4 is bookmark\n id: 0, // 0 for new highlight\n bookId: this.bookId,\n cfiLocation: this.selectedData.selectedCfiRange,\n annotatedNotes: this.selectedData.selectedText,\n customNotes: '',\n colorCode: colourCode,\n };\n\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n\n if (this.bookId) {\n this.httpService\n .saveAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => { },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.getHighlightlist();\n this.sharedService.showHide(false);\n },\n });\n }\n }\n\n /*\n *@Desc : To Remove all highlight first the add the class for highlight and then style based on class\n *@Author: Jaisankar\n */\n async applyHighlights() {\n for (const highlight of this.highlightList) {\n await this.removeHighlight(highlight.cfiLocation);\n }\n\n for (const highlight of this.highlightList) {\n await this.addHighlightClass(highlight.cfiLocation, highlight.colorCode);\n }\n\n await this.colourCodeList.forEach((colourCode) => {\n this.addColorToHighLights(colourCode);\n });\n }\n\n /*\n *@Desc : To Remove all highlights\n *@Author: Jaisankar\n */\n removeHighlight(cfi: string): void {\n try {\n this.rendition?.annotations?.remove(cfi, 'highlight');\n } catch (error) {\n console.error('Error removing highlight:', error);\n }\n }\n\n /*\n *@Desc : To add the highlight class\n *@Author: Jaisankar\n */\n addHighlightClass(\n cfi: string | null = null,\n colourCode: string | null = null\n ) {\n if (cfi?.length) {\n this.rendition?.annotations?.highlight(\n cfi || this.selectedData.selectedCfiRange,\n { class: `highlight-${colourCode}` },\n (e: any) => {\n const cfiLocation = e.target?.getAttribute('data-epubcfi');\n if (cfiLocation) {\n const targetCfiLocation = e.target?.getAttribute('data-epubcfi');\n if (targetCfiLocation) {\n const dialog = this.dialog.open(ConfirmPopupComponent, {\n closeButton: false,\n data: {\n heading: 'Remove Highlight?',\n message: 'Are you sure you want to remove this highlight?',\n btnOneTxt: 'Cancel',\n btnTwoTxt: 'Remove',\n },\n });\n\n dialog.afterClosed$.subscribe((res: boolean) => {\n if (res) {\n if (res === true) {\n const annotation = this.highlightList.find(\n (annotation) =>\n annotation.cfiLocation === targetCfiLocation\n );\n\n if (annotation) {\n this.removeHighlight(targetCfiLocation);\n this.deleteAnnotations(2, annotation.id);\n }\n }\n }\n });\n }\n } else {\n console.log('CFI Location not found');\n }\n },\n 'highlight'\n );\n }\n }\n\n /*\n *@Desc : To add colour to the highlights\n *@Author: Jaisankar\n */\n addColorToHighLights(colourCode: string) {\n const docs: Document[] = [document];\n this.rendition?.views().forEach((view: any) => {\n if (view.iframe?.contentDocument) {\n docs.push(view.iframe.contentDocument);\n }\n });\n\n docs.forEach(doc => {\n const rectElements = doc.querySelectorAll(\n `[data-class=\"highlight-${colourCode}\"] rect`\n );\n rectElements.forEach((rect: any) => {\n rect.style.fill = colourCode;\n rect.style.opacity = '0.5';\n });\n });\n }\n\n /*\n *@Desc : To get highlight list\n *@Author: Jaisankar\n */\n getHighlightlist() {\n const payload = {\n keyword: '',\n pageSize: 100,\n currentPage: 1,\n id: '',\n type: 2, // type 2 is bookmark\n bookId: this.bookId,\n };\n this.httpService\n .getAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.highlightList = res.highlightedNotes.items;\n\n if (this.bookId) {\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n }\n },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.sharedService.showHide(false);\n },\n });\n }\n\n /*--------------------------------------------------------- Bookmark Section -----------------------------------------------------------------------------------------*/\n /*\n *@Desc : To add bookmark and update in db\n *@Author: Jaisankar\n */\n addBookMark() {\n this.sharedService.showHide(true);\n let percentage = this.book.locations.percentageFromCfi(\n this.curentPageEndCfi\n );\n percentage = Math.floor(percentage * 100) || 0;\n\n this.book\n .getRange(this.curentPageEndCfi)\n .then((range: any) => {\n if (range) {\n const payload = {\n typeId: 4, // type 4 is bookmark\n id: 0, // 0 for new bookmark\n bookId: this.bookId,\n cfiLocation: this.curentPageEndCfi,\n annotatedNotes: range.startContainer?.textContent\n ?.trim()\n .substring(0, 100),\n customNotes: percentage,\n colorCode: this.getRandomHexColor,\n };\n this.httpService\n .saveAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.messageService.add({\n key: 'notifyToast',\n severity: 'success', // Use 'warn' for orange color\n summary: 'Success',\n detail: res.message,\n });\n },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.sharedService.showHide(false);\n },\n });\n }\n })\n .catch((error: any) => {\n console.error('Error');\n });\n }\n\n /*\n *@Desc : To get Bookmark list\n *@Author: Jaisankar\n */\n getBookMarkList() {\n const payload = {\n keyword: '',\n pageSize: 1000,\n currentPage: 1,\n id: '',\n type: 4, // type 4 is bookmark\n bookId: this.bookId,\n };\n\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 4,\n bookId: this.bookId,\n },\n });\n\n dialog.afterClosed$.subscribe((res: any) => {\n if (res?.length) {\n this.rendition.display(res);\n }\n });\n }\n\n /*--------------------------------------------------------- Annotations End -----------------------------------------------------------------------------------------*/\n /*\n *@Desc : To save read progress\n *@Author: Jaisankar\n */\n saveReadProgreess() {\n const payload = {\n bookId: +this.bookId,\n pageNumber: 0,\n cfiLocation: this.curentPageEndCfi,\n readProgress: this.readPercentage.numberFormat,\n };\n\n if (this.bookId) {\n this.readProgressSub = this.httpService\n .saveReadProgress(payload)\n .subscribe({\n next: () => { },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.sharedService.showHide(false);\n },\n });\n }\n }\n\n /*\n *@Desc : To open All common popup based on template\n *@Author: Aboobacker\n */\n openCommonPopup(data: any) {\n if (data == 1) {\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 2,\n bookId: this.bookId,\n selectedWord: this.selectedData.selectedText,\n },\n });\n\n dialog.afterClosed$.subscribe((res: any) => {\n if (res) {\n this.rendition.display(res);\n }\n this.highlightList.forEach((highlight) => {\n this.removeHighlight(highlight.cfiLocation);\n });\n this.getHighlightlist();\n });\n }\n\n if (data == 2) {\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 3,\n bookId: this.bookId,\n },\n });\n\n dialog.afterClosed$.subscribe((res: any) => {\n if (res) {\n this.rendition.display(res);\n }\n });\n }\n if (data == 3) {\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 4,\n bookId: this.bookId,\n },\n });\n }\n\n if (data == 4) {\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 5,\n bookId: this.bookId,\n selectedText: this.selectedData.selectedText,\n },\n });\n }\n }\n\n /*\n *@Desc : To delete Annotations\n *@Author: Aboobacker\n */\n\n deleteAnnotations(typeId: number, id: number) {\n const payload = {\n typeId: typeId,\n id: id,\n };\n\n if (this.bookId) {\n this.httpService\n .deleteNotes(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => { },\n error: (err: any) => {\n console.error('Error dlt Annotations:', err);\n },\n complete: () => {\n if (typeId === 2) {\n this.getHighlightlist();\n } else {\n this.getunderlineList();\n }\n },\n });\n }\n }\n\n /*\n *@Desc : To add note in a page\n *@Author: Aboobacker\n */\n addNoteToPage() {\n const notedetails = {\n bookId: this.bookId,\n cfiLocation: this.curentPageEndCfi,\n };\n const dialog = this.dialog.open(AddNotesComponent, {\n closeButton: true,\n windowClass: 'addandeditNotepopup',\n data: {\n notedetails: notedetails,\n addNote: true,\n notetoAddorEdit: '',\n },\n });\n }\n\n /*\n *@Desc : To generate random hexcode for bookmark\n *@Author: Jaisankar\n */\n get getRandomHexColor() {\n const randomColor = Math.floor(Math.random() * 16777215).toString(16);\n return `#${randomColor.padStart(6, '0')}`;\n }\n\n toggleAllMenus() {\n if (this.isMenuOpen || this.showHighlightOverlay || this.showhightLightColor) {\n this.isMenuOpen = false;\n this.showHighlightOverlay = false;\n this.showhightLightColor = false;\n } else {\n this.isMenuOpen = !this.isMenuOpen;\n }\n }\n\n ngOnDestroy(): void {\n if (this.rendition) {\n this.rendition.destroy();\n }\n if (isPlatformBrowser(this.platformId)) {\n document.body.classList.remove('dark-mode');\n }\n if (this.freeSample === 'false') {\n this.saveReadProgreess();\n }\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n}\n","<div id=\"reader-container\" [hidden]=\"showBookPageLoader || showDwndLoader\">\n <div id=\"reader-content\" style=\"overflow: hidden;\">\n <div id=\"reader\"></div>\n </div>\n\n <div id=\"reader-footer\">\n <div class=\"footer-container\">\n <!-- Left: Previous Button -->\n <button class=\"nav-btn prev-btn\" (click)=\"prevClick()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15 18L9 12L15 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Center: Progress Bar -->\n <div class=\"progress-section\">\n <div class=\"progress-label\">Read Progress</div>\n <div class=\"progress-bar-container\">\n <div class=\"progress-track\">\n <div class=\"progress-fill\" [style.width.%]=\"readPercentage.roudedOff\"></div>\n </div>\n <input type=\"range\" class=\"progress-slider\" min=\"0\" max=\"100\" [value]=\"readPercentage.roudedOff\"\n (input)=\"onProgressChange($event)\" />\n <span class=\"progress-text\">{{ readPercentage.roudedOff }}%</span>\n </div>\n </div>\n\n <!-- Right: Menu Toggle & Next Button -->\n <div class=\"right-controls\">\n <!-- Menu Toggle Button (Green) -->\n <div class=\"menu-container relative\">\n <!-- The Menu Popup -->\n @if (isMenuOpen) {\n <div class=\"menu-popup fade-in\">\n <ul class=\"menu-list\">\n <!-- Dark Mode -->\n <!-- Dark Mode -->\n @if (enableDarkMode) {\n <li (click)=\"toggleDarkMode = !toggleDarkMode; darkMode()\">\n <div class=\"menu-item\">\n <span class=\"icon moon-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.5 10C12.7 10.3 11.9 10.5 11 10.5C7.4 10.5 4.5 7.6 4.5 4C4.5 3.1 4.7 2.3 5 1.5C2.7 2.5 1 4.8 1 7.5C1 11.1 3.9 14 7.5 14C10.2 14 12.5 12.3 13.5 10Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>{{ toggleDarkMode ? 'Light Mode' : 'Dark Mode' }}</span>\n </div>\n </li>\n }\n\n <!-- Highlights & Notes -->\n <!-- Highlights & Notes -->\n @if (enableHighlights || enableNotes) {\n <li (click)=\"openCommonPopup(1); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon notes-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 4H14M2 8H14M2 12H8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Highlights & Notes</span>\n </div>\n </li>\n }\n\n <!-- Search Book -->\n <!-- Search Book -->\n @if (enableSearch) {\n <li (click)=\"openCommonPopup(2); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon search-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 14L10.5 10.5M10.5 10.5C11.4 9.6 12 8.4 12 7C12 4.2 9.8 2 7 2C4.2 2 2 4.2 2 7C2 9.8 4.2 12 7 12C8.4 12 9.6 11.4 10.5 10.5Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Search Book</span>\n </div>\n </li>\n }\n\n <!-- Bookmark List -->\n <!-- Bookmark List -->\n @if (enableBookmarks) {\n <li (click)=\"getBookMarkList(); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon bookmark-list-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 1.33H4C3.26 1.33 2.66 1.93 2.66 2.66V13.33C2.66 14.06 3.26 14.66 4 14.66H12C12.73 14.66 13.33 14.06 13.33 13.33V2.66C13.33 1.93 12.73 1.33 12 1.33ZM6 2.66H7.33V6L6.66 5.5L6 6V2.66ZM12 13.33H4V2.66H4.66V8.66L6.66 7.16L8.66 8.66V2.66H12V13.33Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span>Bookmark List</span>\n </div>\n </li>\n }\n\n <!-- Chapters List -->\n <!-- Chapters List -->\n @if (enableChapterList) {\n <li (click)=\"showChapterPopup(); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon chapter-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 15.33H2.66C1.93 15.33 1.33 14.73 1.33 14V4.66H2.66V14H12V15.33ZM11 8.66H7V10H11V8.66ZM10 0.66H5.33C4.6 0.66 4 1.26 4 2L4 11.33C4 12.06 4.6 12.66 5.33 12.66H12.66C13.4 12.66 14 12.06 14 11.33V4.66L10 0.66ZM12.66 11.33H5.33V2H9.44L12.66 5.22V11.33Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span>Chapters List</span>\n </div>\n </li>\n }\n\n <!-- Divider Row for Quick Actions -->\n <!-- Divider Row for Quick Actions -->\n <li class=\"quick-actions-row\">\n @if (enableFontSize) {\n <div class=\"quick-action-btn\" (click)=\"changeFontSize('+')\">\n <span class=\"text-sm font-bold\">A+</span>\n </div>\n <div class=\"quick-action-btn\" (click)=\"changeFontSize('-')\">\n <span class=\"text-sm font-bold\">A-</span>\n </div>\n }\n @if (enableNotes) {\n <div class=\"quick-action-btn\" (click)=\"addNoteToPage(); isMenuOpen = false\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3 17.25V21H6.75L17.81 9.94L14.06 6.19L3 17.25ZM20.71 7.04C21.1 6.65 21.1 6.02 20.71 5.63L18.37 3.29C17.98 2.9 17.35 2.9 16.96 3.29L15.13 5.12L18.88 8.87L20.71 7.04Z\"\n fill=\"currentColor\" />\n </svg>\n </div>\n }\n @if (enableBookmarks) {\n <div class=\"quick-action-btn\" (click)=\"addBookMark(); isMenuOpen = false\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 3H7C5.9 3 5 3.9 5 5V21L12 18L19 21V5C19 3.9 18.1 3 17 3Z\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n }\n </li>\n </ul>\n </div>\n }\n\n <!-- Selection Menu Inside Footer Hub -->\n @if (freeSample === 'false') {\n @if (showHighlightOverlay) {\n <div class=\"custom-selection-toolbar selection-menu fade-in\">\n @if (enableNotes) {\n <div class=\"menu-item\" (click)=\"addNotes(); showHighlightOverlay = false\">\n <span class=\"menu-text\">Add Notes</span>\n </div>\n }\n @if (enableHighlights) {\n <div class=\"menu-item\" (click)=\"showhightLightColor = true; showHighlightOverlay = false\" title=\"Highlight\">\n <span class=\"menu-text\">Highlights</span>\n </div>\n }\n @if (enableHighlights) {\n <div class=\"menu-item\" (click)=\"addUnderline(); showHighlightOverlay = false\">\n <span class=\"menu-text\">Underline</span>\n </div>\n }\n @if (enableNotes || enableHighlights) {\n <!-- Definition often goes with these tools -->\n <div class=\"menu-item border-none\" (click)=\"openCommonPopup(4); showHighlightOverlay = false\">\n <span class=\"menu-text\">Definition</span>\n </div>\n }\n </div>\n }\n\n @if (showhightLightColor) {\n <div class=\"custom-selection-toolbar color-picker fade-in\">\n @for (color of colourCodeList; track color) {\n <div class=\"color-circle\" [style.background]=\"color\"\n (click)=\"addHighlight(color); showhightLightColor = false\"></div>\n }\n <button class=\"toolbar-btn close-colors\" (click)=\"showhightLightColor = false; showHighlightOverlay = true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 12H5\"></path>\n </svg>\n </button>\n </div>\n }\n }\n\n <!-- The Green Toggle Button -->\n <button class=\"menu-toggle-btn\" (click)=\"toggleAllMenus()\"\n [class.open]=\"isMenuOpen || showHighlightOverlay || showhightLightColor\">\n <!-- X Icon when open, Burger/Menu when closed -->\n @if (isMenuOpen || showHighlightOverlay || showhightLightColor) {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n } @else {\n <!-- Menu Grid Icon -->\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6H20M4 12H20M4 18H20\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </button>\n </div>\n\n <!-- Next Button -->\n <button class=\"nav-btn next-btn\" (click)=\"nextClick()\" [class.ml-4]=\"true\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9 18L15 12L9 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n\n@if (showBookPageLoader) {\n<div class=\"fixed inset-0 z-[45] flex items-center justify-center bg-premium-loader fade-in\">\n <div class=\"text-center\">\n <div class=\"mb-8 relative inline-block\">\n <!-- Decorative Backdrop for Book -->\n <div class=\"absolute inset-0 bg-black/5 blur-2xl rounded-full transform scale-110\"></div>\n\n <!-- Larger, Premium Book Image -->\n <img [src]=\"coverImg ?? ''\" alt=\"Loading\"\n class=\"w-56 h-80 object-cover rounded-xl shadow-premium border-[6px] border-white relative z-10 animate-pulse\" />\n </div>\n\n <!-- Enhanced Loading Text Container -->\n <div class=\"flex flex-col items-center space-y-3\">\n <div class=\"flex items-center space-x-2 text-gray-400\">\n <span class=\"text-base font-medium\">Please wait a moment</span>\n <div class=\"flex space-x-1.5\">\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce\"></div>\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce [animation-delay:-0.15s]\"></div>\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce [animation-delay:-0.3s]\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n@if (showOverlay) {\n<div class=\"screenshot-overlay\"></div>\n}\n\n<!-- Full-screen Preview End Modal -->\n@if (showPreviewModal) {\n<div class=\"fixed inset-0 z-40 bg-white dark:bg-gray-900 flex flex-col items-center justify-center text-center px-4\">\n <h2\n class=\"text-[1.375rem] sm:text-2xl font-medium leading-snug text-center text-gray-800 dark:text-white mb-6 max-w-xs sm:max-w-sm mx-auto\">\n You’ve reached the end of the sample for\n </h2>\n\n <img [src]=\"coverImg ?? ''\" alt=\"Book Cover\" class=\"w-40 h-auto rounded-lg shadow-lg mb-6\" />\n</div>\n}\n\n\n<!-- Custom Chapter List Modal -->\n@if (showChapterList) {\n<div class=\"custom-modal-overlay fade-in\">\n <div class=\"custom-modal-content\">\n <app-chapterlist [chapterData]=\"chaptersData\" (chapterClick)=\"onChapterSelect($event)\"\n (closeDialog)=\"showChapterList = false\">\n </app-chapterlist>\n </div>\n</div>\n}","import { Component, input } from '@angular/core';\n\n@Component({\n selector: 'app-epub-loader',\n standalone: false,\n templateUrl: './epub-loader.component.html',\n styleUrl: './epub-loader.component.scss',\n})\nexport class EpubLoaderComponent {\n loadPercentage = input<any>(null);\n}\n","<div class=\"page-loader\">\n <div class=\"flex flex-col w-full loader-container\">\n <div class=\"text-black text-2xl font-bold mb-2\">Reader Loading</div>\n <p-progressBar\n [value]=\"loadPercentage()\"\n class=\"reader-progress w-full\"\n />\n <div class=\"text-percentage text-base font-normal inline-flex m-auto mt-3\">\n {{ loadPercentage() ? loadPercentage() : '0' }}\n </div>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, Routes } from '@angular/router';\nimport { ReaderMainComponent } from './reader-main/reader-main.component';\nimport { AddNotesComponent } from './add-notes/add-notes.component';\nimport { NgxEditorModule } from 'ngx-editor';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ChapterlistComponent } from './chapterlist/chapterlist.component';\nimport { TabViewModule } from 'primeng/tabview';\nimport { ProgressBarModule } from 'primeng/progressbar';\nimport { TableModule } from 'primeng/table';\nimport { ButtonModule } from 'primeng/button';\nimport { EpubCommonPopupComponent } from './epub-common-popup/epub-common-popup.component';\nimport { NoDataFoundComponent } from './shared-mocks/no-data-found.component';\nimport { EpubLoaderComponent } from './epub-loader/epub-loader.component';\nimport { CustomDialogService } from './custom-dialog.service';\nimport { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { HttpClientModule } from '@angular/common/http';\nimport { SkeletonLoaderComponent } from './shared-mocks/skeleton-loader.component';\n\nimport { EpubReaderService } from './epub-reader.service';\n\nconst routes: Routes = [\n {\n path: 'reader',\n component: ReaderMainComponent,\n pathMatch: 'full',\n },\n {\n path: 'chapter-list',\n component: ChapterlistComponent,\n },\n];\n\n@NgModule({\n declarations: [\n ReaderMainComponent,\n AddNotesComponent,\n EpubCommonPopupComponent,\n ChapterlistComponent,\n EpubLoaderComponent\n ],\n imports: [\n CommonModule,\n RouterModule.forChild(routes),\n NgxEditorModule,\n FormsModule,\n ReactiveFormsModule,\n TabViewModule,\n ProgressBarModule,\n TableModule,\n ButtonModule,\n NoDataFoundComponent,\n HttpClientModule,\n SkeletonLoaderComponent,\n ],\n providers: [\n CustomDialogService,\n EpubReaderService\n ],\n exports: [\n ReaderMainComponent,\n AddNotesComponent,\n EpubCommonPopupComponent,\n ChapterlistComponent,\n EpubLoaderComponent,\n SkeletonLoaderComponent\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class EpubReaderModule { }\n","export * from './lib/epub-reader.service';\nexport * from './lib/epub-reader.module';\nexport * from './lib/reader-main/reader-main.component';\nexport * from './lib/chapterlist/chapterlist.component';\nexport * from './lib/add-notes/add-notes.component';\nexport * from './lib/epub-common-popup/epub-common-popup.component';\nexport * from './lib/epub-loader/epub-loader.component';\nexport * from './lib/shared-mocks/skeleton-loader.component';\n// Export other components if needed\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.CustomDialogService","i2.SharedService","i3.EpubReaderService","i2.HttpApiService","i1.CustomDialogRef","i5","i3","i4.CustomDialogService","i4.CustomDialogRef","i5.EpubReaderService","i6","i9.NoDataFoundComponent","i10.SkeletonLoaderComponent","i7","i8.ChapterlistComponent"],"mappings":"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"}
1
+ {"version":3,"file":"epub-flow.mjs","sources":["../../../projects/epub-reader/src/lib/epub-reader.service.ts","../../../projects/epub-reader/src/lib/custom-dialog.service.ts","../../../projects/epub-reader/src/lib/shared-mocks/services-mocks.ts","../../../projects/epub-reader/src/lib/add-notes/add-notes.component.ts","../../../projects/epub-reader/src/lib/add-notes/add-notes.component.html","../../../projects/epub-reader/src/lib/shared-mocks/no-data-found.component.ts","../../../projects/epub-reader/src/lib/shared-mocks/skeleton-loader.component.ts","../../../projects/epub-reader/src/lib/shared-mocks/skeleton-loader.component.html","../../../projects/epub-reader/src/lib/epub-common-popup/epub-common-popup.component.ts","../../../projects/epub-reader/src/lib/epub-common-popup/epub-common-popup.component.html","../../../projects/epub-reader/src/lib/shared-mocks/confirm-popup.component.ts","../../../projects/epub-reader/src/lib/chapterlist/chapterlist.component.ts","../../../projects/epub-reader/src/lib/chapterlist/chapterlist.component.html","../../../projects/epub-reader/src/lib/reader-main/reader-main.component.ts","../../../projects/epub-reader/src/lib/reader-main/reader-main.component.html","../../../projects/epub-reader/src/lib/epub-loader/epub-loader.component.ts","../../../projects/epub-reader/src/lib/epub-loader/epub-loader.component.html","../../../projects/epub-reader/src/lib/epub-reader.module.ts","../../../projects/epub-reader/src/public-api.ts","../../../projects/epub-reader/src/epub-flow.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport {\n EpubChapter,\n SearchResponseModel,\n} from './shared-mocks/models-mocks';\nimport { map, Observable } from 'rxjs';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\n\n@Injectable()\nexport class EpubReaderService {\n ePubChapters = signal<EpubChapter | null>(null);\n noteToEdit = signal<any>(null);\n searchKey = signal<string>('');\n searchResponseData = signal<SearchResponseModel[] | null>(null);\n\n\n constructor(private http: HttpClient) { }\n\n /*\n *@Desc : To update Epub chapters\n *@Author: Jaisankar\n */\n updateChapters(data: EpubChapter): void {\n this.ePubChapters.set(data);\n }\n\n /*\n *@Desc : To update Search key\n *@Author: Jaisankar\n */\n toUpdateSearchKey(data: string): void {\n this.searchKey.set(data);\n }\n\n /*\n *@Desc : To update Search key\n *@Author: Jaisankar\n */\n updateSearchData(data: SearchResponseModel[] | null): void {\n this.searchResponseData.set(data);\n }\n\n /*\n *@Desc : TO STORE SELECTED NOTES\n *@Author: ABOOBACKER\n */\n setNote(data: any) {\n this.noteToEdit.set(data);\n }\n\n /*\n *@Desc : TO GET SELECTED NOTES\n *@Author: ABOOBACKER\n */\n getNote() {\n return this.noteToEdit();\n }\n\n getDefinition(payload: any): Observable<any> {\n const headers = new HttpHeaders({\n skip: 'true', // Add the custom header\n });\n\n return this.http\n .get(`https://api.dictionaryapi.dev/api/v2/entries/en/${payload}`, {\n headers,\n })\n .pipe(map((x: any) => x?.[0] ?? []));\n }\n}\n","import { Injectable, Type, Injector } from '@angular/core';\nimport { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { Subject } from 'rxjs';\n\nexport interface DialogOptions {\n data?: any;\n windowClass?: string;\n closeButton?: boolean;\n enableClose?: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CustomDialogService {\n constructor(private overlay: Overlay, private injector: Injector) { }\n\n open(component: Type<any>, options: DialogOptions = {}) {\n // 1. Position Strategy\n const positionStrategy = this.overlay.position()\n .global()\n .centerHorizontally()\n .centerVertically();\n\n // 2. Overlay Config\n const overlayConfig = new OverlayConfig({\n positionStrategy,\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-dark-backdrop',\n scrollStrategy: this.overlay.scrollStrategies.block(),\n // You can map options.windowClass to panelClass if needed, or pass width/height\n panelClass: options.windowClass\n });\n\n // 3. Create Overlay\n const overlayRef = this.overlay.create(overlayConfig);\n\n // 4. Create DialogRef\n const ref = new CustomDialogRef();\n ref.data = options.data;\n\n // 5. Create Injector\n const injector = Injector.create({\n providers: [\n { provide: CustomDialogRef, useValue: ref },\n { provide: CustomDialogService, useValue: this }\n ],\n parent: this.injector\n });\n\n // 6. Attach Component\n const portal = new ComponentPortal(component, null, injector);\n overlayRef.attach(portal);\n\n // 7. Handle Close\n ref.afterClosed$.subscribe(() => {\n overlayRef.dispose();\n });\n\n overlayRef.backdropClick().subscribe(() => {\n if (options.enableClose !== false && !options.closeButton) {\n // If closeButton is true, usually that handles closing. \n // But for backdrop click, we check enableClose. Default is usually true.\n ref.close();\n } else if (options.enableClose === undefined) {\n ref.close();\n }\n });\n\n return ref;\n }\n\n closeAll() {\n // This is a simplified version. To properly close all, we'd need to track active refs.\n // For now, individual dialogs manage their own closure via ref.\n }\n}\n\nexport class CustomDialogRef {\n private afterClosed = new Subject<any>();\n afterClosed$ = this.afterClosed.asObservable();\n data: any;\n\n close(result?: any) {\n this.afterClosed.next(result);\n this.afterClosed.complete();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\n\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { map } from 'rxjs/operators';\n\n@Injectable({ providedIn: 'root' })\nexport class SharedService {\n showHide(val: boolean) { }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class HttpApiService {\n\n\n getAnnotations(params: any): Observable<any> { return of({}); }\n getReadProgress(params: any): Observable<any> { return of({}); }\n getFreeSample(id: any): Observable<any> { return of(new Blob()); }\n getBook(id: any): Observable<any> { return of(new Blob()); }\n saveAnnotations(params: any): Observable<any> { return of({}); }\n saveReadProgress(params: any): Observable<any> { return of({}); }\n deleteNotes(id: any): Observable<any> { return of({}); }\n updateSearchData(data: any) { }\n addorEditeNote(payload: any): Observable<any> { return of({}); }\n\n\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n // methods\n}\n","import { Component, HostListener } from '@angular/core';\nimport {\n AbstractControl,\n FormControl,\n FormGroup,\n Validators,\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { CustomDialogRef, CustomDialogService } from '../custom-dialog.service';\nimport { Editor, Toolbar } from 'ngx-editor';\nimport { SharedService, HttpApiService } from '../shared-mocks/services-mocks';\nimport { EpubReaderService } from '../epub-reader.service';\n\nimport { Subject, takeUntil } from 'rxjs';\nimport { MessageService } from 'primeng/api';\n\n@Component({\n selector: 'app-add-notes',\n standalone: false,\n templateUrl: './add-notes.component.html',\n styleUrl: './add-notes.component.scss',\n})\nexport class AddNotesComponent {\n editor!: Editor; // Editor instance\n textToAddorEdit!: string;\n toolbar: Toolbar = [\n ['bold', 'italic'],\n ['underline', 'strike'],\n ['code', 'blockquote'],\n ['ordered_list', 'bullet_list'],\n [\n {\n heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n },\n ],\n ['text_color', 'background_color'],\n ['align_left', 'align_center', 'align_right', 'align_justify'],\n ];\n isSubmitting = false;\n\n\n // FormGroup for handling editor content\n form = new FormGroup({\n editorContent: new FormControl(this.textToAddorEdit),\n });\n data: any;\n // Getter for editor content\n get editorContent(): AbstractControl {\n return this.form.get('editorContent')!;\n }\n private onDestroy$: Subject<void> = new Subject<void>();\n constructor(\n public dialog: CustomDialogService,\n private sharedService: SharedService,\n private epubReader: EpubReaderService,\n private userApi: HttpApiService,\n public dialogRef: CustomDialogRef,\n private messageService: MessageService\n ) { }\n ngOnInit(): void {\n // Initialize the editor\n this.editor = new Editor();\n this.textToAddorEdit = this.dialogRef.data.notetoAddorEdit; // Access THE SELECTED NOTE\n this.form.patchValue({ editorContent: this.textToAddorEdit });\n }\n\n onSubmit(): void {\n if (this.form.valid) {\n const content = this.editorContent.value; // Retrieve content as HTML\n }\n }\n\n close() {\n this.dialogRef.close();\n }\n\n @HostListener('document:dragover', ['$event'])\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n console.log('Drag over blocked');\n }\n\n // Prevent drop\n @HostListener('document:drop', ['$event'])\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n console.log('Drop blocked');\n }\n\n // Optional: Prevent drag start\n @HostListener('document:dragstart', ['$event'])\n onDragStart(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n console.log('Drag start blocked');\n }\n\n\n @HostListener('document:contextmenu', ['$event'])\n onRightClick(event: MouseEvent) {\n event.preventDefault(); // Disable the right-click menu\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent) {\n if (event.ctrlKey && event.key === 'c') {\n event.preventDefault(); // Prevent the default copy action\n }\n }\n\n @HostListener('document:copy', ['$event'])\n onCopy(event: ClipboardEvent) {\n event.preventDefault(); // Prevent the copy event\n }\n ngOnDestroy(): void {\n // Destroy the editor instance to prevent memory leaks\n this.editor.destroy();\n }\n updateNote() {\n this.isSubmitting = true;\n\n const content = this.editorContent.value; // Retrieve content as HTML\n const payload = {\n typeId: 1,\n id: this.dialogRef.data.notedetails.id,\n bookId: this.dialogRef.data.notedetails.bookId,\n cfiLocation: this.dialogRef.data.notedetails.cfiLocation,\n annotatedNotes: this.dialogRef.data.notedetails.annotatedNotes,\n customNotes: content,\n colorCode: '',\n };\n\n this.userApi\n .addorEditeNote(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.messageService.add({\n key: 'notifyToast',\n severity: 'success', // Use 'warn' for orange color\n summary: 'Success',\n detail: res.message,\n });\n this.dialog.closeAll();\n },\n error: (err) => {\n this.isSubmitting = false; // re-enable button\n\n console.error('Error fetching eBook details:', err);\n },\n complete: () => {\n this.isSubmitting = false; // re-enable button\n },\n });\n }\n\n /**\n * @Desc : Checks if the provided content has valid, non-empty, and non-whitespace-only text.\n * @Author : Aboobacker\n * @Param : content (string) - The content to validate\n * @Returns: boolean - true if valid content exists, false otherwise\n */\n hasValidContent(content: string): boolean {\n if (!content) return false;\n const textOnly = content.replace(/<[^>]*>/g, '').trim(); // Remove HTML tags\n return textOnly.length > 0;\n }\n\n addNote() {\n this.isSubmitting = true; // re-enable button\n\n const content = this.editorContent.value; // Retrieve content as HTML\n const payload = {\n typeId: 1,\n id: 0,\n bookId: this.dialogRef.data.notedetails.bookId,\n cfiLocation: this.dialogRef.data.notedetails.cfiLocation,\n annotatedNotes: this.dialogRef.data.notetoAddorEdit,\n customNotes: content,\n colorCode: '',\n };\n this.userApi\n .addorEditeNote(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.messageService.add({\n key: 'notifyToast',\n severity: 'success', // Use 'warn' for orange color\n summary: 'Success',\n detail: res.message,\n });\n this.dialog.closeAll();\n },\n error: (err) => {\n this.isSubmitting = false; // re-enable button\n\n console.error('Error fetching eBook details:', err);\n },\n complete: () => {\n this.isSubmitting = false; // re-enable button\n\n },\n });\n }\n}\n","<div class=\"note-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">{{ dialogRef.data.addNote ? 'Add Note' : 'Edit Note' }}</h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n <form class=\"note-form\" [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\">\n <!-- Editor Section -->\n <section class=\"editor-section\">\n <ngx-editor-menu [editor]=\"editor\" [toolbar]=\"toolbar\">\n </ngx-editor-menu>\n\n <ngx-editor class=\"editor-body\" [editor]=\"editor\" formControlName=\"editorContent\">\n </ngx-editor>\n </section>\n\n <!-- Validation -->\n <p class=\"error\" *ngIf=\"editorContent.invalid && editorContent.touched\">\n Content is required.\n </p>\n\n <!-- Footer / Actions -->\n <footer class=\"action-bar\">\n @if (dialogRef.data.addNote) {\n <button type=\"submit\" class=\"btn btn-primary\" (click)=\"addNote()\"\n [disabled]=\"!hasValidContent(editorContent.value) || isSubmitting\">\n Add Note\n </button>\n } @else {\n <button type=\"submit\" class=\"btn btn-primary\" (click)=\"updateNote()\"\n [disabled]=\"!hasValidContent(editorContent.value) || isSubmitting\">\n Update Note\n </button>\n }\n </footer>\n </form>\n</div>","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'app-no-data-found',\n standalone: true,\n imports: [CommonModule],\n template: `<div class=\"no-data-found\">{{ message }}</div>`\n})\nexport class NoDataFoundComponent {\n @Input() message: string = 'No Data Found';\n}\n","import { Component, Input, OnChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'app-skeleton-loader',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './skeleton-loader.component.html',\n styleUrls: ['./skeleton-loader.component.scss']\n})\nexport class SkeletonLoaderComponent implements OnChanges {\n @Input() count: number = 3;\n @Input() type: 'list' | 'text' = 'list';\n\n items: any[] = [];\n\n ngOnChanges() {\n this.items = Array(this.count).fill(0);\n }\n}\n","<div class=\"skeleton-container\">\n <div *ngFor=\"let item of items\" class=\"skeleton-item\" [ngClass]=\"type\">\n <ng-container *ngIf=\"type === 'list'\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-content\">\n <div class=\"skeleton-line title\"></div>\n <div class=\"skeleton-line meta\"></div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"type === 'text'\">\n <div class=\"skeleton-line text-long\"></div>\n <div class=\"skeleton-line text-medium\"></div>\n <div class=\"skeleton-line text-short\"></div>\n </ng-container>\n </div>\n</div>","import { Component, effect, OnDestroy, OnInit } from '@angular/core';\n\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { finalize, Subject, takeUntil } from 'rxjs';\nimport { HttpApiService } from '../shared-mocks/services-mocks';\nimport { MessageService } from 'primeng/api';\nimport { CustomDialogRef, CustomDialogService } from '../custom-dialog.service';\nimport { EpubReaderService } from '../epub-reader.service';\nimport { SharedService } from '../shared-mocks/services-mocks';\nimport { notModel, SearchResponseModel } from '../shared-mocks/models-mocks';\nimport { AddNotesComponent } from '../add-notes/add-notes.component';\n\n\n@Component({\n selector: 'app-epub-common-popup',\n standalone: false,\n templateUrl: './epub-common-popup.component.html',\n styleUrl: './epub-common-popup.component.scss',\n})\nexport class EpubCommonPopupComponent implements OnInit {\n staticText = {\n validationText: { atleastThreeChara: 'Enter at least 3 characters to begin searching' },\n btnText: { cancel: 'Cancel', edit: 'Edit', remove: 'Remove' },\n htmlText: { nohighlightsavailable: 'No highlights' }\n };\n notesandHighlights!: any;\n bookMarkList!: any;\n singlenoteDetails!: any;\n notes!: any;\n isNotEndOfList: boolean = true;\n template = 2;\n htmlString!: SafeHtml;\n htmlStaticText = {\n validationText: { atleastThreeChara: 'Min 3 chars' },\n btnText: { cancel: 'Cancel', edit: 'Edit', remove: 'Remove' },\n htmlText: { nohighlightsavailable: 'No highlights' }\n };\n paginationData = {\n totalCount: 0,\n pageSize: 1000,\n currentPage: 1,\n };\n searchKey: string = '';\n searchData: SearchResponseModel[] | null = null;\n searchCharaSmall: boolean = false;\n private onDestroy$: Subject<void> = new Subject<void>();\n tabviewIndex: any = 1;\n Definition: any = [];\n isLoading: boolean = false;\n isSearchDataAvailable: boolean = false;\n\n constructor(\n private sanitizer: DomSanitizer,\n private userApi: HttpApiService,\n private messageService: MessageService,\n public dialog: CustomDialogService,\n public dialogRef: CustomDialogRef,\n private loaderService: SharedService,\n private epubService: EpubReaderService,\n private sharedService: SharedService\n ) {\n\n\n effect(() => {\n this.searchData = this.epubService.searchResponseData();\n this.isSearchDataAvailable = false; // Reset loading when data arrives\n });\n }\n ngOnInit(): void {\n this.template = this.dialogRef.data.template;\n\n if (this.dialogRef.data.template === 1) {\n this.singlenoteDetails = this.dialogRef.data.notedetails;\n const rawHtml = this.singlenoteDetails.customNotes;\n\n this.htmlString = this.sanitizer.bypassSecurityTrustHtml(rawHtml);\n }\n if (this.dialogRef.data.template === 2) {\n this.getHighlightNotes();\n }\n if (this.dialogRef.data.template === 4) {\n this.getBookmark();\n }\n if (this.dialogRef.data.template === 5) {\n this.getDefinition();\n }\n }\n\n /*\n *@Desc : Handles tab view changes\n *@Author: Aboobacker\n */\n onTabChange(data: any) {\n this.paginationData = {\n totalCount: 0,\n pageSize: 10,\n currentPage: 1,\n };\n\n if (data.index === 1) {\n //noteas\n this.tabviewIndex = data.index;\n this.getNotes();\n } else {\n //highlights\n this.getHighlightNotes();\n }\n }\n /*\n *@Desc : get highlightNotes\n *@Author: Aboobacker\n */\n getHighlightNotes() {\n this.isLoading = true;\n const payload = {\n keyword: '',\n pageSize: this.paginationData.pageSize,\n currentPage: this.paginationData.currentPage,\n id: '',\n type: 2,\n bookId: this.dialogRef.data.bookId,\n };\n\n this.userApi\n .getAnnotations(payload)\n .pipe(\n takeUntil(this.onDestroy$),\n finalize(() => this.isLoading = false)\n )\n .subscribe({\n next: (res: any) => {\n this.notesandHighlights = res.highlightedNotes?.items;\n },\n error: (err) => {\n console.error('Error fetching highlightedNotes details:', err);\n }\n });\n }\n /*\n *@Desc : get bookMarks\n *@Author: Aboobacker\n */\n getBookmark() {\n this.isLoading = true;\n const payload = {\n keyword: '',\n pageSize: 1000,\n currentPage: 1,\n id: '',\n type: 4, // type 4 is bookmark\n bookId: this.dialogRef.data.bookId,\n };\n this.userApi\n .getAnnotations(payload)\n .pipe(\n takeUntil(this.onDestroy$),\n finalize(() => this.isLoading = false)\n )\n .subscribe({\n next: (res: any) => {\n this.bookMarkList = res?.bookmarks?.items;\n }\n });\n }\n /*\n *@Desc : to get Definition\n *@Author: Aboobacker\n */\n getDefinition() {\n this.isLoading = true;\n this.epubService\n .getDefinition(this.dialogRef.data.selectedText)\n .pipe(\n takeUntil(this.onDestroy$),\n finalize(() => this.isLoading = false)\n )\n .subscribe({\n next: (res: any) => {\n // Ensure Definition is always an array to avoid template errors\n this.Definition = Array.isArray(res?.meanings) ? res.meanings : [];\n },\n error: () => {\n this.Definition = [];\n }\n });\n }\n\n /*\n *@Desc : get Notes\n *@Author: Aboobacker\n */\n getNotes() {\n this.isLoading = true;\n const payload = {\n keyword: '',\n pageSize: this.paginationData.pageSize,\n currentPage: this.paginationData.currentPage,\n id: '',\n type: 1,\n bookId: this.dialogRef.data.bookId,\n };\n\n this.userApi\n .getAnnotations(payload)\n .pipe(\n takeUntil(this.onDestroy$),\n finalize(() => this.isLoading = false)\n )\n .subscribe({\n next: (res: notModel) => {\n if (!res.notes.items.length) {\n this.isNotEndOfList = false;\n }\n\n if (this.paginationData.currentPage === 1) {\n this.notes = res.notes?.items;\n } else {\n this.notes = [...this.notes, ...res.notes.items];\n }\n },\n error: (err) => {\n console.error('Error fetching eBook details:', err);\n }\n });\n }\n\n /*\n *@Desc : delete all type of annotations\n *@Author: Aboobacker\n */\n deleteAnnotations(typeId: number, id: number) {\n this.loaderService.showHide(true);\n const payload = {\n typeId: typeId,\n id: id,\n };\n\n this.userApi\n .deleteNotes(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.loaderService.showHide(false);\n this.messageService.add({\n key: 'notifyToast',\n severity: 'success',\n summary: 'Success',\n detail: res.message,\n });\n if (this.template == 1) {\n this.dialog.closeAll();\n }\n if (this.template == 2) {\n this.getNotes();\n this.getHighlightNotes();\n }\n if (this.template == 4) {\n this.getBookmark();\n }\n },\n error: (err) => {\n console.error('Error dlt Annotations:', err);\n },\n complete: () => { },\n });\n }\n\n /*\n *@Desc : open the added note\n *@Author: Aboobacker\n */\n openNote(data: any) {\n this.dialogRef.close(data.cfiLocation);\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n enableClose: false,\n windowClass: 'highlightandNotes',\n data: {\n template: 1,\n notedetails: data,\n },\n });\n }\n\n editNote() {\n this.epubService.setNote(this.singlenoteDetails.customNotes);\n\n const dialog = this.dialog.open(AddNotesComponent, {\n closeButton: false,\n windowClass: 'addandeditNotepopup',\n data: {\n notedetails: this.singlenoteDetails,\n notetoAddorEdit: this.singlenoteDetails.customNotes,\n addNote: false,\n },\n });\n }\n\n updateSearchKey() {\n this.epubService.toUpdateSearchKey(this.searchKey);\n if (this.searchKey.length >= 3) {\n this.searchCharaSmall = false;\n this.isLoading = true; // start local loader \n } else {\n this.searchCharaSmall = true;\n }\n }\n\n clickSearchItem(cfi: string) {\n this.searchKey = '';\n this.epubService.toUpdateSearchKey('');\n this.epubService.updateSearchData(null);\n this.dialogRef.close(cfi);\n }\n\n gotoLocation(data: string) {\n this.dialogRef.close(data);\n }\n\n clearSearch() {\n this.searchKey = '';\n this.epubService.toUpdateSearchKey('');\n this.epubService.updateSearchData(null);\n this.searchCharaSmall = false;\n }\n\n close() {\n this.epubService.updateSearchData(null);\n this.dialogRef.close();\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n closePopup(cfi: string) {\n this.dialogRef.close(cfi);\n }\n\n ngOnDestroy(): void {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n}\n","<!-- Template 1: Single Note View -->\n@if (dialogRef.data.template == 1) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">Note Details</h2>\n <div class=\"header-actions\">\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n\n <div class=\"popup-content content-padded\">\n <div class=\"inner-html-class text-lg text-primary mb-6\" [innerHTML]=\"htmlString\"></div>\n </div>\n\n <div class=\"dialog-footer\">\n <button class=\"btn btn-secondary\" (click)=\"close()\">\n {{ htmlStaticText.btnText.cancel }}\n </button>\n <button class=\"btn btn-primary\" (click)=\"editNote()\">\n {{ htmlStaticText.btnText.edit }}\n </button>\n <button class=\"btn btn-danger\" (click)=\"deleteAnnotations(1, this.singlenoteDetails.id)\">\n {{ htmlStaticText.btnText.remove }}\n </button>\n </div>\n</div>\n}\n\n<!-- Template 2: Highlights & Notes Tabs -->\n@if (dialogRef.data.template == 2) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M16.035 2.977l4.988 4.989-12.022 12.021H4v-4.988L16.035 2.977z\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n Highlights & Notes\n </h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div class=\"popup-content\">\n <p-tabView (onChange)=\"onTabChange($event)\">\n\n <!-- Highlights Tab -->\n <p-tabPanel header=\"Highlights\">\n <div *ngIf=\"isLoading; else highlightsContent\">\n <app-skeleton-loader [count]=\"4\" type=\"list\"></app-skeleton-loader>\n </div>\n <ng-template #highlightsContent>\n <div *ngIf=\"!notesandHighlights?.length; else noteList\" class=\"empty-state\">\n {{ htmlStaticText.htmlText.nohighlightsavailable }}\n </div>\n\n <ng-template #noteList>\n <div *ngFor=\"let note of notesandHighlights\" class=\"popup-row\">\n <div class=\"row-icon-container\">\n <div class=\"w-2 h-8 rounded-full\" [style.background-color]=\"note.colorCode\"\n style=\"width: 4px; height: 32px; border-radius: 4px;\"></div>\n </div>\n\n <div class=\"row-content\" (click)=\"gotoLocation(note.cfiLocation)\">\n <div class=\"row-title line-clamp\">{{ note.annotatedNotes }}</div>\n <div class=\"row-meta\">\n <span>Page {{ note.pageNumber || 'N/A' }}</span>\n </div>\n </div>\n\n <div class=\"row-actions\">\n <button class=\"action-btn\" (click)=\"deleteAnnotations(2, note.id)\" title=\"Remove\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </p-tabPanel>\n\n <!-- Notes Tab -->\n <p-tabPanel header=\"Notes\">\n <div *ngIf=\"isLoading; else notesContent\">\n <app-skeleton-loader [count]=\"4\" type=\"list\"></app-skeleton-loader>\n </div>\n <ng-template #notesContent>\n <div *ngIf=\"!notes?.length; else notesList\" class=\"empty-state\">\n No notes available.\n </div>\n\n <ng-template #notesList>\n <div *ngFor=\"let item of notes\" class=\"popup-row\">\n <div class=\"row-icon-container\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M11 4H4a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2v-7\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 013 3L12 15l-4 1 1-4 9.5-9.5z\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"row-content\" (click)=\"openNote(item)\">\n <div class=\"row-title line-clamp\"\n [innerHTML]=\"item.annotatedNotes ? item.annotatedNotes : item.customNotes\"></div>\n </div>\n <div class=\"row-actions\">\n <button class=\"action-btn\" (click)=\"deleteAnnotations(1, item.id)\" title=\"Remove\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </ng-template>\n </ng-template>\n </p-tabPanel>\n\n </p-tabView>\n </div>\n</div>\n}\n\n<!-- Template 3: Search -->\n@if (dialogRef.data.template == 3) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n Search\n </h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div class=\"search-container\">\n <div class=\"search-input-wrapper\">\n <svg class=\"search-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\">\n <path d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <input [(ngModel)]=\"searchKey\" (keyup.enter)=\"updateSearchKey()\" type=\"text\" placeholder=\"Search in book...\"\n class=\"search-input\" autofocus />\n <div class=\"input-actions-wrapper\">\n <button *ngIf=\"searchKey\" class=\"icon-btn-clear\" (click)=\"clearSearch()\" title=\"Clear search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n <button class=\"btn btn-primary btn-sm\" (click)=\"updateSearchKey()\">\n Search\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"popup-content\">\n <div *ngIf=\"searchCharaSmall\" class=\"info-banner\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n <span>{{ staticText.validationText.atleastThreeChara }}</span>\n </div>\n\n <div *ngIf=\"isSearchDataAvailable; else searchResults\">\n <app-skeleton-loader [count]=\"4\" type=\"list\"></app-skeleton-loader>\n </div>\n\n <ng-template #searchResults>\n <div *ngIf=\"searchKey?.length && searchData && !searchData?.length\" class=\"empty-state\">\n <app-no-data-found></app-no-data-found>\n </div>\n\n <div class=\"search-results\">\n <div *ngFor=\"let item of searchData\" class=\"popup-row\" (click)=\"clickSearchItem(item.cfi)\">\n <div class=\"row-content\">\n <div class=\"row-title\" [innerHTML]=\"item.highlightedSentence\"></div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n</div>\n}\n\n<!-- Template 4: Bookmarks -->\n@if (dialogRef.data.template == 4) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n Bookmarks\n </h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div class=\"popup-content\">\n <div *ngIf=\"isLoading; else bookmarkContent\">\n <app-skeleton-loader [count]=\"4\" type=\"list\"></app-skeleton-loader>\n </div>\n\n <ng-template #bookmarkContent>\n <div *ngIf=\"!bookMarkList || bookMarkList.length === 0\" class=\"empty-state\">\n No bookmarks yet.\n </div>\n\n <div *ngIf=\"bookMarkList && bookMarkList.length > 0\">\n <div *ngFor=\"let bookmark of bookMarkList\" class=\"popup-row\">\n <div class=\"row-icon-container\">\n <!-- Filled Bookmark Icon for list -->\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\"\n [style.color]=\"bookmark.colorCode || '#3b82f6'\">\n <path d=\"M5 5a2 2 0 012-2h10a2 2 0 012 2v16l-7-3.5L5 21V5z\" />\n </svg>\n </div>\n\n <div class=\"row-content\" (click)=\"closePopup(bookmark.cfiLocation)\">\n <div class=\"row-title line-clamp\">{{ bookmark.annotatedNotes || 'Bookmark' }}</div>\n <div class=\"row-meta mt-2\">\n <div class=\"progress-container\">\n <div class=\"progress-fill\" [style.width.%]=\"bookmark.customNotes\"></div>\n </div>\n <span>{{ bookmark.customNotes }}%</span>\n </div>\n </div>\n\n <div class=\"row-actions\">\n <button class=\"action-btn\" (click)=\"deleteAnnotations(4, bookmark.id)\" title=\"Remove\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n</div>\n}\n\n<!-- Template 5: Definitions -->\n@if (dialogRef.data.template == 5) {\n<div class=\"popup-container\">\n <div class=\"popup-header\">\n <h2 class=\"popup-title\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M4 19.5A2.5 2.5 0 016.5 17H20\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.5 2H20v20H6.5A2.5 2.5 0 014 19.5v-15A2.5 2.5 0 016.5 2z\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n Definition\n </h2>\n <button class=\"close-btn\" (click)=\"close()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n\n <div class=\"popup-content content-padded\">\n <h3 class=\"text-xl font-bold text-primary mb-4 select-text\">\n \"{{ dialogRef.data.selectedText }}\"\n </h3>\n\n <div *ngIf=\"isLoading; else defsContent\">\n <app-skeleton-loader [count]=\"3\" type=\"text\"></app-skeleton-loader>\n </div>\n\n <ng-template #defsContent>\n <div *ngIf=\"Definition?.length > 0; else noDefs\">\n <div *ngFor=\"let entry of Definition\" class=\"definition-group\">\n <span class=\"pos-tag\">{{ entry.partOfSpeech }}</span>\n\n <div *ngFor=\"let def of entry.definitions\" class=\"def-item\">\n <p class=\"def-text\">{{ def.definition }}</p>\n <p *ngIf=\"def.example\" class=\"def-example\">\"{{ def.example }}\"</p>\n </div>\n </div>\n </div>\n\n <ng-template #noDefs>\n <div class=\"empty-state\">No definitions found.</div>\n </ng-template>\n </ng-template>\n </div>\n</div>\n}","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CustomDialogRef } from '../custom-dialog.service';\n\n@Component({\n selector: 'app-confirm-popup',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"confirm-popup-container\">\n <h3 class=\"title\">{{ data.heading }}</h3>\n <p class=\"message\">{{ data.message }}</p>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"close(false)\">{{ data.btnOneTxt }}</button>\n <button class=\"btn-confirm\" (click)=\"close(true)\">{{ data.btnTwoTxt }}</button>\n </div>\n </div>\n `,\n styles: [`\n .confirm-popup-container {\n padding: 24px;\n background: white;\n border-radius: 8px;\n min-width: 300px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n }\n .title { margin: 0 0 12px; font-size: 1.125rem; font-weight: 600; color: #111827; }\n .message { margin: 0 0 24px; color: #4b5563; font-size: 0.95rem; }\n .actions { display: flex; justify-content: flex-end; gap: 12px; }\n button {\n padding: 8px 16px;\n border-radius: 6px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n border: none;\n }\n .btn-cancel { background: #f3f4f6; color: #374151; }\n .btn-cancel:hover { background: #e5e7eb; }\n .btn-confirm { background: #dc2626; color: white; }\n .btn-confirm:hover { background: #b91c1c; }\n `]\n})\nexport class ConfirmPopupComponent {\n data: any;\n\n constructor(private ref: CustomDialogRef) {\n this.data = this.ref.data;\n }\n\n close(result: boolean) {\n this.ref.close(result);\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-chapterlist',\n standalone: false,\n templateUrl: './chapterlist.component.html',\n styleUrl: './chapterlist.component.scss',\n})\nexport class ChapterlistComponent implements OnInit {\n @Input() chapterData: any[] = [];\n @Output() chapterClick = new EventEmitter<string>();\n @Output() closeDialog = new EventEmitter<void>();\n\n isExpanded: boolean[] = [];\n\n ngOnInit(): void {\n if (this.chapterData) {\n this.isExpanded = new Array(this.chapterData.length).fill(false);\n }\n }\n\n toggleAccordion(index: number): void {\n this.isExpanded[index] = !this.isExpanded[index];\n }\n\n onChapterClick(href: any) {\n this.chapterClick.emit(href);\n }\n\n onClose() {\n this.closeDialog.emit();\n }\n}\n\n","<div id=\"reader-content\" class=\"chapter-list-container bg-white\">\n <!-- Header -->\n <div class=\"chapter-header\">\n\n <h2 class=\"chapter-title\">\n Contents\n </h2>\n\n <button class=\"close-btn\" aria-label=\"Close\" (click)=\"onClose()\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n </div>\n\n\n\n <!-- Chapter List -->\n <div class=\"flex-1 overflow-y-auto custom-scrollbar\">\n <!-- No chapters -->\n <div *ngIf=\"!chapterData || chapterData.length === 0\" class=\"text-sm text-gray-500 p-8 text-center italic\">\n No chapters available in this book.\n </div>\n\n <ng-container *ngFor=\"let chapter of chapterData\">\n\n <!-- Main Chapter -->\n <div class=\"chapter-row main-chapter\" (click)=\"onChapterClick(chapter.href)\">\n <div class=\"title-container\">\n <span class=\"title\">{{ chapter.title }}</span>\n <span *ngIf=\"chapter.page\" class=\"dots\"></span>\n </div>\n <span *ngIf=\"chapter.page\" class=\"page\">\n {{ chapter.page }}\n </span>\n </div>\n\n <!-- Subchapters -->\n <ng-container *ngIf=\"chapter.subchapters?.length\">\n <div *ngFor=\"let subchapter of chapter.subchapters\" class=\"chapter-row sub-chapter\"\n (click)=\"onChapterClick(subchapter.href)\">\n <div class=\"title-container\">\n <span class=\"title\">{{ subchapter.title }}</span>\n <span *ngIf=\"subchapter.page\" class=\"dots\"></span>\n </div>\n <span *ngIf=\"subchapter.page\" class=\"page\">\n {{ subchapter.page }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n</div>","import { HttpEventType } from '@angular/common/http';\nimport {\n ChangeDetectorRef,\n Component,\n effect,\n EventEmitter,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n OnInit,\n OnChanges,\n SimpleChanges,\n Output,\n PLATFORM_ID,\n} from '@angular/core';\nimport { SharedService, HttpApiService } from '../shared-mocks/services-mocks';\nimport {\n forkJoin,\n from,\n map,\n mergeMap,\n Observable,\n Subject,\n Subscription,\n takeUntil,\n toArray,\n} from 'rxjs';\nimport { EpubReaderService } from '../epub-reader.service';\nimport { CustomDialogService } from '../custom-dialog.service';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ChapterlistComponent } from '../chapterlist/chapterlist.component';\nimport { EpubChapter, AnnotationModel } from '../shared-mocks/models-mocks';\nimport { AddNotesComponent } from '../add-notes/add-notes.component';\nimport { EpubCommonPopupComponent } from '../epub-common-popup/epub-common-popup.component';\nimport ePub from 'epubjs';\nimport { MessageService } from 'primeng/api';\nimport { ConfirmPopupComponent } from '../shared-mocks/confirm-popup.component';\nimport { isPlatformBrowser, Location } from '@angular/common';\nimport {\n ElementRef,\n HostListener,\n Renderer2,\n signal,\n ViewChild,\n} from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n@Component({\n selector: 'epub-flow',\n standalone: false,\n templateUrl: './reader-main.component.html',\n styleUrl: './reader-main.component.scss',\n})\nexport class ReaderMainComponent implements OnInit, OnDestroy, OnChanges {\n @Input() epubUrl: string | null = null;\n @Input() epubBlob: Blob | null = null;\n @Input() coverPage: string | null = null;\n\n // Feature flags\n @Input() enableDarkMode: boolean = true;\n @Input() enableSearch: boolean = true;\n @Input() enableHighlights: boolean = true;\n @Input() enableBookmarks: boolean = true;\n @Input() enableChapterList: boolean = true;\n @Input() enableTextSelection: boolean = true;\n @Input() enableFontSize: boolean = true;\n @Input() enableNotes: boolean = true;\n\n @Output() underlineRemoveRequest = new EventEmitter<{\n cfi: string;\n annotationId?: string;\n }>();\n\n book: any;\n @Input() bookId: string | number = 0;\n rendition: any;\n readPercentage = {\n roudedOff: 0,\n numberFormat: 0,\n };\n bookDwnldPerctge = 0;\n showDwndLoader: boolean = true;\n mainOvelay: boolean = false;\n showHighlightOverlay: boolean = false;\n showhightLightColor: boolean = false;\n audioNarrations: boolean = false;\n toggleDarkMode: boolean = false;\n curentPageEndCfi!: string;\n chaptersData!: EpubChapter;\n selectedData = {\n selectedCfiRange: '',\n selectedText: '',\n };\n fontSize = 100; //default font size is 100\n highlightList: AnnotationModel[] = [];\n underlineList: AnnotationModel[] = [];\n searchData: any = [];\n searchKeyword = '';\n newSentence = '';\n colourCodeList: Array<string> = ['#F44336', '#FFEB3B', '#4CAF50']; //When adding or removing new colour to the colour list it should be updated here\n readCfi: string = '';\n annotedList: any;\n readPercentagegetbyApi: any;\n freeSample: string = 'false';\n showOverlay = false;\n showBookPageLoader: boolean = true;\n showPreviewModal = false;\n hasShownPreviewMessage = false;\n maxPreviewClicks = 5;\n coverImg: string | null = null;\n isMenuOpen: boolean = false;\n selectionPosition = { top: 0, left: 0 };\n private onDestroy$: Subject<void> = new Subject<void>();\n private readProgressSub!: Subscription;\n private overlayRef?: OverlayRef;\n\n @HostListener('document:keyup', ['$event'])\n handleKeyUp(event: KeyboardEvent) {\n if (event.key === 'PrintScreen') {\n navigator.clipboard.writeText('');\n this.showOverlay = true;\n setTimeout(() => {\n this.showOverlay = false;\n }, 1500);\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent) {\n const blockedKeys = ['c', 'v', 'p', 's', 'u', 'i', 'j'];\n if ((event.ctrlKey || event.metaKey) && blockedKeys.includes(event.key.toLowerCase())) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (event.key === 'F12') {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n constructor(\n private ngZone: NgZone,\n private httpService: HttpApiService,\n private sharedService: SharedService,\n private epubService: EpubReaderService,\n private cdr: ChangeDetectorRef,\n private route: ActivatedRoute,\n public dialog: CustomDialogService,\n private messageService: MessageService,\n private location: Location,\n @Inject(PLATFORM_ID) private platformId: Object,\n private router: Router,\n private overlay: Overlay\n ) {\n effect(() => {\n this.searchKeyword = this.epubService.searchKey();\n if (this.searchKeyword && this.searchKeyword.length >= 3) {\n this.searchBook();\n }\n });\n\n const queryParams = this.route.snapshot.queryParams;\n this.bookId = queryParams['bookID'];\n this.freeSample = queryParams['freeSample'] || 'false';\n }\n\n ngOnInit(): void {\n this.coverImg = this.coverPage || this.route.snapshot.queryParams['coverImg'];\n // Load DotLottie dynamically if needed\n this.loadDotLottieIfNeeded();\n\n if (this.bookId) {\n this.initialization();\n } else if (this.epubUrl || this.epubBlob) {\n this.getBookData();\n }\n window.print = () => { };\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['coverPage'] && changes['coverPage'].currentValue) {\n this.coverImg = changes['coverPage'].currentValue;\n }\n if (\n (changes['epubUrl'] && changes['epubUrl'].currentValue) ||\n (changes['epubBlob'] && changes['epubBlob'].currentValue)\n ) {\n this.getBookData();\n }\n }\n\n loadDotLottieIfNeeded(): void {\n if (typeof (window as any).loadDotLottie === 'function') {\n (window as any).loadDotLottie();\n }\n }\n\n /*--------------------------------------------------------- Initialization -----------------------------------------------------------------------------------------*/\n /*\n *@Desc : To get the initial data to load the book, highlights, underline\n *@Author: Jaisankar\n */\n initialization() {\n const allApis: any = [\n this.httpService.getAnnotations({\n keyword: '',\n pageSize: 10,\n currentPage: 1,\n\n type: 3, // type 3 is underline\n bookId: this.bookId,\n }),\n this.httpService.getReadProgress({\n bookId: this.bookId,\n }),\n this.httpService.getAnnotations({\n keyword: '',\n pageSize: 10,\n currentPage: 1,\n\n type: 2, // type 2 is highlight\n bookId: this.bookId,\n }),\n ];\n\n forkJoin(allApis)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (value: any) => {\n this.annotedList = value;\n this.readCfi = this.annotedList[1].cfiLocation;\n this.readPercentagegetbyApi = this.annotedList[1].readProgress;\n this.highlightList = this.annotedList[2].highlightedNotes.items;\n this.underlineList = this.annotedList[0].underlinedNotes.items;\n // this.bookdetails();\n this.getBookData();\n },\n error: () => {\n // If annotations fail, we might still want to load the book if inputs are present\n this.sharedService.showHide(false);\n this.getBookData();\n },\n complete: () => { },\n });\n }\n\n goBack() {\n this.location.back();\n }\n\n audioNarration() {\n console.log('Audio Narration clicked');\n }\n\n /*\n *@Desc : To get the book data from api, initialize all event for the rendition and display the epub\n *@Author: Jaisankar\n */\n getBookData() {\n this.ngZone.run(() => {\n this.sharedService.showHide(false);\n });\n\n if (this.epubBlob) {\n this.loadBookFromBlob(this.epubBlob);\n } else if (this.epubUrl) {\n if (typeof this.epubUrl === 'string' && this.epubUrl.trim() !== '') {\n this.loadBookFromUrl(this.epubUrl);\n } else {\n this.handleBookLoadError('Invalid EPUB URL.');\n }\n } else {\n console.error('No EPUB source provided (epubUrl or epubBlob).');\n // Do not show error to user immediately if waiting for input, unless we want to enforce it.\n // But if this is called, it usually expects data.\n this.handleBookLoadError('No book source found.');\n }\n }\n\n loadBookFromUrl(url: string) {\n try {\n this.book = ePub(url);\n this.renderBook();\n } catch (err) {\n console.error('Error initializing EPUB from URL:', err);\n this.handleBookLoadError('Failed to load book from URL.');\n }\n }\n\n loadBookFromBlob(blob: Blob) {\n if (blob.size === 0) {\n this.handleBookLoadError('The provided EPUB file is empty.');\n return;\n }\n\n const reader = new FileReader();\n reader.readAsArrayBuffer(blob);\n reader.onload = async () => {\n try {\n const arrayBuffer = reader.result as ArrayBuffer;\n if (!arrayBuffer || arrayBuffer.byteLength === 0) {\n throw new Error('Empty array buffer');\n }\n this.book = ePub(arrayBuffer);\n this.renderBook();\n } catch (error) {\n console.error('Error reading blob:', error);\n this.handleBookLoadError('Failed to load the EPUB file.');\n }\n };\n reader.onerror = () => {\n this.handleBookLoadError('Error reading the file.');\n };\n }\n\n handleBookLoadError(message: string) {\n this.showBookPageLoader = false;\n this.showDwndLoader = false;\n this.messageService.add({\n key: 'notifyToast',\n severity: 'error',\n summary: 'Error',\n detail: message,\n });\n this.ngZone.run(() => {\n this.sharedService.showHide(false);\n });\n }\n\n renderBook() {\n const area = document.getElementById('reader');\n if (area) {\n area.innerHTML = ''; // Clear previous content\n }\n\n this.rendition = this.book.renderTo('reader', {\n //To render the Epub and pass the config to the library\n width: '100%', // or \"100%\", depending on your layout\n height: '100%', // optional, adjust based on your container\n allowScriptedContent: true, // Important\n spread: 'auto'\n });\n this.book.ready.then(() => {\n if (this.book.navigation.toc.length) {\n // Map through chapters and extract subchapter information\n const chapters = this.book.navigation.toc.map(\n (spineItem: any) => ({\n title:\n spineItem.label || `Chapter ${spineItem.index + 1}`,\n href:\n this.book?.spine && spineItem?.href\n ? this.book.spine.get(spineItem.href)?.href\n : '',\n subchapters: (spineItem.subitems || []).map(\n (subItem: any) => {\n const spineEntry = this.book.spine.get(subItem.href);\n return {\n title: subItem.label || `Subchapter`,\n href: spineEntry?.href || '', // fallback to empty string or some default\n };\n }\n ),\n })\n );\n this.chaptersData = chapters;\n }\n\n this.book.locations.generate(1000).then(() => {\n // Calculate page numbers for chapters\n if (this.chaptersData) {\n const updateChapterPage = (chapter: any) => {\n const spineItem = this.book.spine.get(chapter.href);\n if (spineItem) {\n const cfi = spineItem.cfiFromElement(undefined);\n chapter.page = this.book.locations.locationFromCfi(cfi);\n }\n if (chapter.subchapters) {\n chapter.subchapters.forEach((sub: any) => {\n const subSpine = this.book.spine.get(sub.href);\n if (subSpine) {\n const subCfi = subSpine.cfiFromElement(undefined);\n sub.page = this.book.locations.locationFromCfi(subCfi);\n }\n });\n }\n };\n\n this.chaptersData.forEach(updateChapterPage);\n }\n\n this.rendition.on('locationChanged', (location: any) => {\n if (this.freeSample == 'false') {\n this.applyHighlights();\n this.applyUnderline();\n }\n this.rendition.themes.default({\n '::selection': {\n background: '#cceeff', // Soft green\n color: '#1b5e20', // Dark text\n },\n '*': {\n '-webkit-tap-highlight-color': 'transparent', // removes green tap\n '-webkit-user-select': 'text',\n 'user-select': 'text',\n '-webkit-touch-callout': 'none', // removes iOS popup menu\n },\n });\n\n this.curentPageEndCfi = location.start;\n\n //To get the location changed event for calculating read percentage and saving current read percentage\n const percentage = this.book.locations.percentageFromCfi(\n location.end\n );\n this.readPercentage.roudedOff =\n Math.floor(percentage * 100) || 0;\n this.readPercentage.numberFormat = percentage;\n });\n this.showDwndLoader = false;\n\n if (\n this.showBookPageLoader === true ||\n this.showBookPageLoader === undefined\n ) {\n this.showBookPageLoader = true;\n }\n\n if (this.readCfi && this.readCfi?.length) {\n setTimeout(() => {\n this.showBookPageLoader = false;\n this.rendition.display(this.readCfi);\n }, 1500);\n\n this.ngZone.run(() => {\n this.sharedService.showHide(false);\n });\n } else {\n setTimeout(() => {\n this.showBookPageLoader = false;\n this.rendition.display();\n }, 1500);\n\n this.ngZone.run(() => {\n this.sharedService.showHide(false);\n });\n }\n });\n });\n\n //Event when new section is rendered\n this.rendition.on('rendered', (section: any) => {\n this.darkMode();\n });\n\n this.rendition.on('rendered', () => {\n this.rendition.views().forEach((view: any) => {\n let iframe = view.iframe;\n if (iframe) {\n const doc = iframe.contentDocument;\n\n // 🔒 Disable copy, drag, and right-click inside EPUB iframe\n ['copy', 'contextmenu', 'dragstart'].forEach((event) =>\n doc.addEventListener(event, (e: Event) =>\n e.preventDefault()\n )\n );\n\n // 🔒 Block all Ctrl/Cmd-based keyboard shortcuts (e.g., Ctrl+P, Ctrl+C, Cmd+S)\n doc.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.ctrlKey || e.metaKey) {\n e.preventDefault();\n e.stopPropagation();\n }\n });\n\n // 🎨 Inject CSS to disable dragging and prevent printing from Chrome menu\n const style = doc.createElement('style');\n style.innerHTML = `\n /* Disable element dragging */\n * {\n -webkit-user-drag: none;\n user-drag: none;\n }\n\n /* Block printing via @media print */\n @media print {\n body, html {\n display: none !important;\n background: white !important;\n }\n\n body::before {\n content: \"🚫 Printing is disabled.\";\n display: block;\n font-size: 24px;\n text-align: center;\n color: red;\n margin-top: 100px;\n }\n }\n `;\n doc.head.appendChild(style);\n }\n });\n const iframe = document.querySelector('iframe');\n if (iframe) {\n const iframeDoc =\n iframe.contentDocument || iframe.contentWindow?.document;\n\n if (iframeDoc) {\n if (this.freeSample === 'true') {\n // Disable all <a> tags inside iframe\n const links = iframeDoc.querySelectorAll('a');\n links.forEach((link) => {\n link.style.pointerEvents = 'none'; // Disable clicking\n link.style.color = 'gray'; // Optional: gray out links\n // Also prevent default on click as a fallback\n link.addEventListener('click', (e) =>\n e.preventDefault()\n );\n });\n }\n\n let scrollTimeout: any = null;\n\n iframeDoc.addEventListener(\n 'wheel',\n (event: WheelEvent) => {\n event.preventDefault(); // Prevent default scroll\n\n if (scrollTimeout) {\n clearTimeout(scrollTimeout);\n }\n\n scrollTimeout = setTimeout(() => {\n if (event.deltaY > 0) {\n this.nextClick();\n } else {\n this.prevClick();\n }\n }, 150);\n },\n { passive: false }\n ); // Important!\n }\n }\n });\n\n //Event when selection is made the function will be called and the cfi and selected content will be saved\n this.rendition.on(\n 'selected',\n (cfiRange: string, contents: any) => {\n if (!this.enableTextSelection) {\n contents.window.getSelection().removeAllRanges();\n return;\n }\n\n const selection = contents.window.getSelection();\n const range = selection.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n\n // Get iframe position\n const frameRect = contents.document.defaultView.frameElement.getBoundingClientRect();\n\n this.ngZone.run(() => {\n this.selectionPosition = {\n top: frameRect.top + rect.top - 60, // Position above selection\n left: frameRect.left + rect.left + (rect.width / 2)\n };\n this.handleSelection(cfiRange, selection.toString().trim());\n });\n }\n );\n }\n\n onProgressChange(event: Event): void {\n if (this.freeSample === 'true' && this.hasShownPreviewMessage) {\n return;\n }\n const input = event.target as HTMLInputElement;\n const percent = +input.value;\n\n if (this.freeSample === 'true') {\n if (percent > this.maxPreviewClicks) {\n this.hasShownPreviewMessage = true;\n this.showPreviewModal = true;\n return;\n }\n }\n // Update progress bar in real-time\n this.readPercentage.roudedOff = percent;\n\n // Also update EPUB location in real-time\n if (this.book && this.book.locations) {\n const cfi = this.book.locations.cfiFromPercentage(percent / 100);\n this.rendition.display(cfi); // this gets called during drag\n }\n }\n\n /*--------------------------------------------- End of Initialization ---------------------------------------------------------*/\n mainOverlay() {\n this.mainOvelay = !this.mainOvelay;\n }\n\n showHighlightOverlaymethod() {\n this.showHighlightOverlay = !this.showHighlightOverlay;\n }\n\n showhightLightColormethod() {\n this.showHighlightOverlay = !this.showHighlightOverlay;\n }\n\n handleCloseButtonClick(): void {\n if (this.mainOvelay) {\n this.mainOverlay();\n } else if (this.showHighlightOverlay) {\n this.showHighlightOverlaymethod();\n } else if (this.showhightLightColor) {\n this.showhightLightColormethod();\n }\n }\n\n /*\n *@Desc : To paginate to next page and apply hightlight and underline again\n *@Author: Jaisankar\n */\n nextClick() {\n if (this.freeSample === 'true' && this.hasShownPreviewMessage) {\n return;\n }\n this.rendition\n ?.next()\n .then(() => {\n this.applyHighlights();\n this.applyUnderline();\n })\n .catch((err: any) => console.error(err));\n if (this.freeSample === 'true') {\n if (this.readPercentage.roudedOff > this.maxPreviewClicks) {\n this.hasShownPreviewMessage = true;\n this.showPreviewModal = true;\n return;\n }\n }\n }\n\n /*\n *@Desc : To paginate to previous page and apply hightlight and underline again\n *@Author: Jaisankar\n */\n prevClick() {\n this.rendition\n .prev()\n .then(() => {\n this.applyHighlights();\n this.applyUnderline();\n })\n .catch((err: any) => console.error(err));\n }\n\n /*\n *@Desc : To toggle between dark and light modes, native toggle feature of epub.js has bugs so custom method implemented\n *@Author: Jaisankar\n */\n darkMode() {\n const iframe = document.querySelector('iframe');\n const body = iframe?.contentDocument?.body;\n\n // Reset styles first\n body?.style?.removeProperty('background-color');\n body?.style?.removeProperty('color');\n\n if (this.toggleDarkMode) {\n document.body.classList.add('dark-mode');\n\n // Content colors for dark mode\n const darkBg = '#121212';\n const darkText = '#e0e0e0';\n const accentLink = '#32d74b';\n\n if (body) {\n body.style.setProperty('background-color', darkBg, 'important');\n body.style.setProperty('color', darkText, 'important');\n\n const allElements = body.querySelectorAll('div, section, article, p, li, h1, h2, h3, h4, h5, h6, span');\n allElements.forEach((el) => {\n (el as HTMLElement).style.setProperty('color', darkText, 'important');\n (el as HTMLElement).style.setProperty('background-color', 'transparent', 'important');\n });\n\n const links = body.querySelectorAll('a');\n links.forEach((a) => {\n a.style.setProperty('color', accentLink, 'important');\n });\n }\n } else {\n document.body.classList.remove('dark-mode');\n\n // Reset to light mode defaults\n if (body) {\n body.style.setProperty('background-color', '#ffffff', 'important');\n body.style.setProperty('color', '#1a1a1a', 'important');\n\n const allElements = body.querySelectorAll('div, section, article, p, li, h1, h2, h3, h4, h5, h6, span');\n allElements.forEach((el) => {\n (el as HTMLElement).style.removeProperty('color');\n (el as HTMLElement).style.removeProperty('background-color');\n });\n }\n }\n if (this.freeSample == 'false') {\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n }\n }\n\n /*\n *@Desc : To toggle fontsizes, and reapply highlights\n *@Author: Jaisankar\n */\n changeFontSize(check: string) {\n if (check === '+') {\n if (this.fontSize < 200) {\n // Check if we can increase the font size\n this.fontSize = Math.min(this.fontSize + 10, 200); // Limit max size (200%)\n }\n this.rendition.themes.fontSize(this.fontSize.toString() + '%');\n\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n } else {\n if (this.fontSize > 50) {\n // Check if we can decrease the font size\n this.fontSize = Math.max(this.fontSize - 10, 50); // Limit min size (50%)\n }\n this.rendition.themes.fontSize(this.fontSize.toString() + '%');\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n }\n }\n\n /*\n *@Desc : To save the cfi of the selected text for highlight and underline\n *@Author: Jaisankar\n */\n handleSelection(cfiRange: any, selectedText: string) {\n this.selectedData.selectedCfiRange = cfiRange;\n this.selectedData.selectedText = selectedText;\n this.showHighlightOverlay = true;\n this.isMenuOpen = false; // Hide main menu if selection happens\n if (this.mainOvelay) {\n this.mainOvelay = !this.mainOvelay;\n }\n this.cdr.detectChanges();\n }\n\n /*\n *@Desc : To show chapter popup using custom implementation\n *@Author: Jaisankar\n */\n showChapterList: boolean = false;\n showChapterPopup() {\n this.showChapterList = true;\n }\n\n onChapterSelect(href: string) {\n this.showChapterList = false;\n if (href) {\n this.rendition.display(href);\n }\n }\n\n\n /*\n *@Desc : To open add notes popup\n *@Author: Jaisankar\n */\n addNotes() {\n this.epubService.setNote(this.selectedData.selectedText);\n const notedetails = {\n bookId: this.bookId,\n cfiLocation: this.selectedData.selectedCfiRange,\n };\n const dialog = this.dialog.open(AddNotesComponent, {\n closeButton: true,\n windowClass: 'addandeditNotepopup',\n data: {\n notedetails: notedetails,\n addNote: true,\n notetoAddorEdit: this.selectedData.selectedText,\n },\n });\n }\n\n /*\n *@Desc : To first get all items in spine that is sections of epub (not chapters)\n then load that section and find the matching keywords,\n then create a span with highlight class replace this span to the sentence where the keyword is found\n return the new sentence, cfi and old sentance as an object\n *@Author: Jaisankar\n */\n searchBook() {\n from(this.book.spine.spineItems)\n .pipe(\n mergeMap((item: any) =>\n from(item.load(this.book.load.bind(this.book))).pipe(\n mergeMap(() => from(item.find(this.searchKeyword))), // Find after loading text\n map((result: any) => {\n // Create a case-insensitive regular expression for the keyword\n const regex = new RegExp(this.searchKeyword, 'gi');\n\n // Replace occurrences of the keyword with the highlighted version\n this.newSentence = result.excerpt.replace(regex, (match: any) => {\n // Wrap each match dynamically, preserving the original case\n return `<span class=\"highlight-key\">${match}</span>`;\n });\n\n // Unload after processing\n item.unload();\n\n // Create the result object\n const newReturnObj = {\n cfi: result.cfi,\n highlightedSentence: this.newSentence,\n originalSentence: result.excerpt,\n };\n\n return newReturnObj; // Return the processed result\n })\n )\n ),\n toArray() // Collect all results into a single array\n )\n .subscribe({\n next: (results: any) => {\n this.epubService.updateSearchData(results.flat()); //flat to flatten the array ex [a, [b,c] ,d ] output is [a,b,c,d]\n this.sharedService.showHide(false); //stop loader after the search result is saved\n },\n error: (err) => {\n console.error('Error:', err);\n },\n });\n }\n\n /*--------------------------------------------------------- Annotations Start -----------------------------------------------------------------------------------------*/\n /*--------------------------------------------------------- Underline Section -----------------------------------------------------------------------------------------*/\n\n /*\n *@Desc : Add underline to underline and apply underline\n *@Author: Jaisankar\n */\n addUnderline() {\n this.underlineList.push({\n typeId: 3,\n id: 0,\n userId: 0,\n libraryId: 0,\n bookId: 0,\n studentId: 0,\n cfiLocation: this.selectedData.selectedCfiRange,\n annotatedNotes: this.selectedData.selectedText,\n customNotes: null,\n colorCode: '',\n notesCapturedDate: '',\n createdBy: 0,\n });\n\n const payload = {\n typeId: 3, // type 4 is bookmark\n id: 0, // 0 for new highlight\n bookId: this.bookId,\n cfiLocation: this.selectedData.selectedCfiRange,\n annotatedNotes: this.selectedData.selectedText,\n customNotes: '',\n colorCode: '',\n };\n\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n\n if (this.bookId) {\n this.httpService\n .saveAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => { },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.getunderlineList();\n\n this.sharedService.showHide(false);\n },\n });\n }\n }\n\n /*\n *@Desc : To remove all underlines first and add underline class and then apply style to the class\n *@Author: Jaisankar\n */\n async applyUnderline() {\n for (const underline of this.underlineList) {\n await this.removeUnderline(underline.cfiLocation);\n }\n\n for (const underline of this.underlineList) {\n await this.addUnderlineClass(underline.cfiLocation);\n }\n\n await this.addStyleToUnderline();\n }\n\n /*\n *@Desc : To add the highlight class\n *@Author: Jaisankar\n */\n addUnderlineClass(cfi: string | null = null) {\n if (cfi?.length) {\n this.rendition?.annotations?.underline(\n cfi || this.selectedData.selectedCfiRange,\n { class: 'custom-underline' },\n (e: any) => {\n const target = e.target as HTMLElement;\n const cfiLocation = target.getAttribute('data-epubcfi') || target.closest('[data-epubcfi]')?.getAttribute('data-epubcfi');\n\n if (cfiLocation) {\n const dialog = this.dialog.open(ConfirmPopupComponent, {\n closeButton: false,\n data: {\n heading: 'Remove Underline?',\n message: 'Are you sure you want to remove this underline?',\n btnOneTxt: 'Cancel',\n btnTwoTxt: 'Remove',\n },\n });\n\n dialog.afterClosed$.subscribe((res: boolean) => {\n if (res) {\n if (res === true) {\n const annotation = this.underlineList.find(\n (annotation) =>\n annotation.cfiLocation === cfiLocation\n );\n\n if (annotation) {\n this.removeUnderline(cfiLocation);\n this.deleteAnnotations(3, annotation.id);\n }\n }\n }\n });\n } else {\n console.log('CFI Location not found', target); // Log target to help debug if needed\n }\n },\n 'underline'\n );\n }\n }\n\n /*\n *@Desc : To remove the highlight class\n *@Author: Jaisankar\n */\n removeUnderline(cfi: string): void {\n try {\n this.rendition?.annotations?.remove(cfi, 'underline');\n } catch (error) {\n console.error('Error removing underline:', error);\n }\n }\n\n /*\n *@Desc : To add colour to the highlights\n *@Author: Jaisankar\n */\n addStyleToUnderline() {\n // Collect all documents (main + iframes)\n const docs: Document[] = [document];\n this.rendition?.views().forEach((view: any) => {\n if (view.iframe?.contentDocument) {\n docs.push(view.iframe.contentDocument);\n }\n });\n\n const isDark = this.toggleDarkMode;\n const strokeColor = isDark ? '#FFFFFF' : '#000000';\n\n docs.forEach(doc => {\n // Target elements with standard and custom underline classes\n const underlineGroups = doc.querySelectorAll('.epubjs-underline, .underline, .custom-underline');\n\n underlineGroups.forEach((group: any) => {\n // SVG rects are often used as hit areas\n const rects = group.querySelectorAll('rect');\n rects.forEach((rect: any) => {\n rect.style.fill = 'transparent';\n rect.style.stroke = 'none';\n rect.style.pointerEvents = 'auto'; // Ensure it's clickable\n });\n\n // SVG lines are the actual underline\n const lines = group.querySelectorAll('line');\n lines.forEach((line: any) => {\n line.style.stroke = strokeColor;\n line.style.strokeWidth = '2';\n line.style.pointerEvents = 'auto';\n });\n });\n });\n }\n\n /*\n *@Desc : To get underline list\n *@Author: Jaisankar\n */\n getunderlineList() {\n const payload = {\n keyword: '',\n pageSize: 1000,\n currentPage: 1,\n id: '',\n type: 3, // type 3 is bookmark\n bookId: this.bookId,\n };\n this.httpService\n .getAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.underlineList = res.underlinedNotes.items;\n if (this.underlineList.length) {\n this.applyUnderline();\n }\n },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.sharedService.showHide(false);\n },\n });\n }\n\n /*--------------------------------------------------------- Highlight Section -----------------------------------------------------------------------------------------*/\n\n /*\n *@Desc : To add highlight and save to db, to add a new colour code it needs to be added to color code array \n \"colorCode\": \"#F44336\" - Red\n \"colorCode\": \"#FFEB3B\" - Yellow\n \"colorCode\": \"#4CAF50\" - Green\n *@Author: Jaisankar\n */\n addHighlight(colourCode: string) {\n //push the highlight to the array in FE\n this.highlightList.push({\n typeId: 2,\n id: 0,\n userId: 0,\n libraryId: 0,\n bookId: 0,\n studentId: 0,\n cfiLocation: this.selectedData.selectedCfiRange,\n annotatedNotes: this.selectedData.selectedText,\n customNotes: null,\n colorCode: colourCode,\n notesCapturedDate: '',\n createdBy: 0,\n });\n const payload = {\n typeId: 2, // type 4 is bookmark\n id: 0, // 0 for new highlight\n bookId: this.bookId,\n cfiLocation: this.selectedData.selectedCfiRange,\n annotatedNotes: this.selectedData.selectedText,\n customNotes: '',\n colorCode: colourCode,\n };\n\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n\n if (this.bookId) {\n this.httpService\n .saveAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => { },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.getHighlightlist();\n this.sharedService.showHide(false);\n },\n });\n }\n }\n\n /*\n *@Desc : To Remove all highlight first the add the class for highlight and then style based on class\n *@Author: Jaisankar\n */\n async applyHighlights() {\n for (const highlight of this.highlightList) {\n await this.removeHighlight(highlight.cfiLocation);\n }\n\n for (const highlight of this.highlightList) {\n await this.addHighlightClass(highlight.cfiLocation, highlight.colorCode);\n }\n\n await this.colourCodeList.forEach((colourCode) => {\n this.addColorToHighLights(colourCode);\n });\n }\n\n /*\n *@Desc : To Remove all highlights\n *@Author: Jaisankar\n */\n removeHighlight(cfi: string): void {\n try {\n this.rendition?.annotations?.remove(cfi, 'highlight');\n } catch (error) {\n console.error('Error removing highlight:', error);\n }\n }\n\n /*\n *@Desc : To add the highlight class\n *@Author: Jaisankar\n */\n addHighlightClass(\n cfi: string | null = null,\n colourCode: string | null = null\n ) {\n if (cfi?.length) {\n this.rendition?.annotations?.highlight(\n cfi || this.selectedData.selectedCfiRange,\n { class: `highlight-${colourCode}` },\n (e: any) => {\n const cfiLocation = e.target?.getAttribute('data-epubcfi');\n if (cfiLocation) {\n const targetCfiLocation = e.target?.getAttribute('data-epubcfi');\n if (targetCfiLocation) {\n const dialog = this.dialog.open(ConfirmPopupComponent, {\n closeButton: false,\n data: {\n heading: 'Remove Highlight?',\n message: 'Are you sure you want to remove this highlight?',\n btnOneTxt: 'Cancel',\n btnTwoTxt: 'Remove',\n },\n });\n\n dialog.afterClosed$.subscribe((res: boolean) => {\n if (res) {\n if (res === true) {\n const annotation = this.highlightList.find(\n (annotation) =>\n annotation.cfiLocation === targetCfiLocation\n );\n\n if (annotation) {\n this.removeHighlight(targetCfiLocation);\n this.deleteAnnotations(2, annotation.id);\n }\n }\n }\n });\n }\n } else {\n console.log('CFI Location not found');\n }\n },\n 'highlight'\n );\n }\n }\n\n /*\n *@Desc : To add colour to the highlights\n *@Author: Jaisankar\n */\n addColorToHighLights(colourCode: string) {\n const docs: Document[] = [document];\n this.rendition?.views().forEach((view: any) => {\n if (view.iframe?.contentDocument) {\n docs.push(view.iframe.contentDocument);\n }\n });\n\n docs.forEach(doc => {\n const rectElements = doc.querySelectorAll(\n `[data-class=\"highlight-${colourCode}\"] rect`\n );\n rectElements.forEach((rect: any) => {\n rect.style.fill = colourCode;\n rect.style.opacity = '0.5';\n });\n });\n }\n\n /*\n *@Desc : To get highlight list\n *@Author: Jaisankar\n */\n getHighlightlist() {\n const payload = {\n keyword: '',\n pageSize: 100,\n currentPage: 1,\n id: '',\n type: 2, // type 2 is bookmark\n bookId: this.bookId,\n };\n this.httpService\n .getAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.highlightList = res.highlightedNotes.items;\n\n if (this.bookId) {\n if (this.highlightList.length) {\n this.applyHighlights();\n }\n }\n },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.sharedService.showHide(false);\n },\n });\n }\n\n /*--------------------------------------------------------- Bookmark Section -----------------------------------------------------------------------------------------*/\n /*\n *@Desc : To add bookmark and update in db\n *@Author: Jaisankar\n */\n addBookMark() {\n this.sharedService.showHide(true);\n let percentage = this.book.locations.percentageFromCfi(\n this.curentPageEndCfi\n );\n percentage = Math.floor(percentage * 100) || 0;\n\n this.book\n .getRange(this.curentPageEndCfi)\n .then((range: any) => {\n if (range) {\n const payload = {\n typeId: 4, // type 4 is bookmark\n id: 0, // 0 for new bookmark\n bookId: this.bookId,\n cfiLocation: this.curentPageEndCfi,\n annotatedNotes: range.startContainer?.textContent\n ?.trim()\n .substring(0, 100),\n customNotes: percentage,\n colorCode: this.getRandomHexColor,\n };\n this.httpService\n .saveAnnotations(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => {\n this.messageService.add({\n key: 'notifyToast',\n severity: 'success', // Use 'warn' for orange color\n summary: 'Success',\n detail: res.message,\n });\n },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.sharedService.showHide(false);\n },\n });\n }\n })\n .catch((error: any) => {\n console.error('Error');\n });\n }\n\n /*\n *@Desc : To get Bookmark list\n *@Author: Jaisankar\n */\n getBookMarkList() {\n const payload = {\n keyword: '',\n pageSize: 1000,\n currentPage: 1,\n id: '',\n type: 4, // type 4 is bookmark\n bookId: this.bookId,\n };\n\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 4,\n bookId: this.bookId,\n },\n });\n\n dialog.afterClosed$.subscribe((res: any) => {\n if (res?.length) {\n this.rendition.display(res);\n }\n });\n }\n\n /*--------------------------------------------------------- Annotations End -----------------------------------------------------------------------------------------*/\n /*\n *@Desc : To save read progress\n *@Author: Jaisankar\n */\n saveReadProgreess() {\n const payload = {\n bookId: +this.bookId,\n pageNumber: 0,\n cfiLocation: this.curentPageEndCfi,\n readProgress: this.readPercentage.numberFormat,\n };\n\n if (this.bookId) {\n this.readProgressSub = this.httpService\n .saveReadProgress(payload)\n .subscribe({\n next: () => { },\n error: () => {\n this.sharedService.showHide(false);\n },\n complete: () => {\n this.sharedService.showHide(false);\n },\n });\n }\n }\n\n /*\n *@Desc : To open All common popup based on template\n *@Author: Aboobacker\n */\n openCommonPopup(data: any) {\n if (data == 1) {\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 2,\n bookId: this.bookId,\n selectedWord: this.selectedData.selectedText,\n },\n });\n\n dialog.afterClosed$.subscribe((res: any) => {\n if (res) {\n this.rendition.display(res);\n }\n this.highlightList.forEach((highlight) => {\n this.removeHighlight(highlight.cfiLocation);\n });\n this.getHighlightlist();\n });\n }\n\n if (data == 2) {\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 3,\n bookId: this.bookId,\n },\n });\n\n dialog.afterClosed$.subscribe((res: any) => {\n if (res) {\n this.rendition.display(res);\n }\n });\n }\n if (data == 3) {\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 4,\n bookId: this.bookId,\n },\n });\n }\n\n if (data == 4) {\n const dialog = this.dialog.open(EpubCommonPopupComponent, {\n closeButton: true,\n windowClass: 'highlightandNotes',\n data: {\n template: 5,\n bookId: this.bookId,\n selectedText: this.selectedData.selectedText,\n },\n });\n }\n }\n\n /*\n *@Desc : To delete Annotations\n *@Author: Aboobacker\n */\n\n deleteAnnotations(typeId: number, id: number) {\n const payload = {\n typeId: typeId,\n id: id,\n };\n\n if (this.bookId) {\n this.httpService\n .deleteNotes(payload)\n .pipe(takeUntil(this.onDestroy$))\n .subscribe({\n next: (res: any) => { },\n error: (err: any) => {\n console.error('Error dlt Annotations:', err);\n },\n complete: () => {\n if (typeId === 2) {\n this.getHighlightlist();\n } else {\n this.getunderlineList();\n }\n },\n });\n }\n }\n\n /*\n *@Desc : To add note in a page\n *@Author: Aboobacker\n */\n addNoteToPage() {\n const notedetails = {\n bookId: this.bookId,\n cfiLocation: this.curentPageEndCfi,\n };\n const dialog = this.dialog.open(AddNotesComponent, {\n closeButton: true,\n windowClass: 'addandeditNotepopup',\n data: {\n notedetails: notedetails,\n addNote: true,\n notetoAddorEdit: '',\n },\n });\n }\n\n /*\n *@Desc : To generate random hexcode for bookmark\n *@Author: Jaisankar\n */\n get getRandomHexColor() {\n const randomColor = Math.floor(Math.random() * 16777215).toString(16);\n return `#${randomColor.padStart(6, '0')}`;\n }\n\n toggleAllMenus() {\n if (this.isMenuOpen || this.showHighlightOverlay || this.showhightLightColor) {\n this.isMenuOpen = false;\n this.showHighlightOverlay = false;\n this.showhightLightColor = false;\n } else {\n this.isMenuOpen = !this.isMenuOpen;\n }\n }\n\n ngOnDestroy(): void {\n if (this.rendition) {\n this.rendition.destroy();\n }\n if (isPlatformBrowser(this.platformId)) {\n document.body.classList.remove('dark-mode');\n }\n if (this.freeSample === 'false') {\n this.saveReadProgreess();\n }\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n}\n","<div id=\"reader-container\" [hidden]=\"showBookPageLoader || showDwndLoader\">\n <div id=\"reader-content\" style=\"overflow: hidden;\">\n <div id=\"reader\"></div>\n </div>\n\n <div id=\"reader-footer\">\n <div class=\"footer-container\">\n <!-- Left: Previous Button -->\n <button class=\"nav-btn prev-btn\" (click)=\"prevClick()\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M15 18L9 12L15 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n\n <!-- Center: Progress Bar -->\n <div class=\"progress-section\">\n <div class=\"progress-label\">Read Progress</div>\n <div class=\"progress-bar-container\">\n <div class=\"progress-track\">\n <div class=\"progress-fill\" [style.width.%]=\"readPercentage.roudedOff\"></div>\n </div>\n <input type=\"range\" class=\"progress-slider\" min=\"0\" max=\"100\" [value]=\"readPercentage.roudedOff\"\n (input)=\"onProgressChange($event)\" />\n <span class=\"progress-text\">{{ readPercentage.roudedOff }}%</span>\n </div>\n </div>\n\n <!-- Right: Menu Toggle & Next Button -->\n <div class=\"right-controls\">\n <!-- Menu Toggle Button (Green) -->\n <div class=\"menu-container relative\">\n <!-- The Menu Popup -->\n @if (isMenuOpen) {\n <div class=\"menu-popup fade-in\">\n <ul class=\"menu-list\">\n <!-- Dark Mode -->\n <!-- Dark Mode -->\n @if (enableDarkMode) {\n <li (click)=\"toggleDarkMode = !toggleDarkMode; darkMode()\">\n <div class=\"menu-item\">\n <span class=\"icon moon-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13.5 10C12.7 10.3 11.9 10.5 11 10.5C7.4 10.5 4.5 7.6 4.5 4C4.5 3.1 4.7 2.3 5 1.5C2.7 2.5 1 4.8 1 7.5C1 11.1 3.9 14 7.5 14C10.2 14 12.5 12.3 13.5 10Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>{{ toggleDarkMode ? 'Light Mode' : 'Dark Mode' }}</span>\n </div>\n </li>\n }\n\n <!-- Highlights & Notes -->\n <!-- Highlights & Notes -->\n @if (enableHighlights || enableNotes) {\n <li (click)=\"openCommonPopup(1); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon notes-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 4H14M2 8H14M2 12H8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Highlights & Notes</span>\n </div>\n </li>\n }\n\n <!-- Search Book -->\n <!-- Search Book -->\n @if (enableSearch) {\n <li (click)=\"openCommonPopup(2); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon search-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 14L10.5 10.5M10.5 10.5C11.4 9.6 12 8.4 12 7C12 4.2 9.8 2 7 2C4.2 2 2 4.2 2 7C2 9.8 4.2 12 7 12C8.4 12 9.6 11.4 10.5 10.5Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </span>\n <span>Search Book</span>\n </div>\n </li>\n }\n\n <!-- Bookmark List -->\n <!-- Bookmark List -->\n @if (enableBookmarks) {\n <li (click)=\"getBookMarkList(); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon bookmark-list-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 1.33H4C3.26 1.33 2.66 1.93 2.66 2.66V13.33C2.66 14.06 3.26 14.66 4 14.66H12C12.73 14.66 13.33 14.06 13.33 13.33V2.66C13.33 1.93 12.73 1.33 12 1.33ZM6 2.66H7.33V6L6.66 5.5L6 6V2.66ZM12 13.33H4V2.66H4.66V8.66L6.66 7.16L8.66 8.66V2.66H12V13.33Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span>Bookmark List</span>\n </div>\n </li>\n }\n\n <!-- Chapters List -->\n <!-- Chapters List -->\n @if (enableChapterList) {\n <li (click)=\"showChapterPopup(); isMenuOpen = false\">\n <div class=\"menu-item\">\n <span class=\"icon chapter-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 15.33H2.66C1.93 15.33 1.33 14.73 1.33 14V4.66H2.66V14H12V15.33ZM11 8.66H7V10H11V8.66ZM10 0.66H5.33C4.6 0.66 4 1.26 4 2L4 11.33C4 12.06 4.6 12.66 5.33 12.66H12.66C13.4 12.66 14 12.06 14 11.33V4.66L10 0.66ZM12.66 11.33H5.33V2H9.44L12.66 5.22V11.33Z\"\n fill=\"currentColor\" />\n </svg>\n </span>\n <span>Chapters List</span>\n </div>\n </li>\n }\n\n <!-- Divider Row for Quick Actions -->\n <!-- Divider Row for Quick Actions -->\n <li class=\"quick-actions-row\">\n @if (enableFontSize) {\n <div class=\"quick-action-btn\" (click)=\"changeFontSize('+')\">\n <span class=\"text-sm font-bold\">A+</span>\n </div>\n <div class=\"quick-action-btn\" (click)=\"changeFontSize('-')\">\n <span class=\"text-sm font-bold\">A-</span>\n </div>\n }\n @if (enableNotes) {\n <div class=\"quick-action-btn\" (click)=\"addNoteToPage(); isMenuOpen = false\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3 17.25V21H6.75L17.81 9.94L14.06 6.19L3 17.25ZM20.71 7.04C21.1 6.65 21.1 6.02 20.71 5.63L18.37 3.29C17.98 2.9 17.35 2.9 16.96 3.29L15.13 5.12L18.88 8.87L20.71 7.04Z\"\n fill=\"currentColor\" />\n </svg>\n </div>\n }\n @if (enableBookmarks) {\n <div class=\"quick-action-btn\" (click)=\"addBookMark(); isMenuOpen = false\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 3H7C5.9 3 5 3.9 5 5V21L12 18L19 21V5C19 3.9 18.1 3 17 3Z\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </div>\n }\n </li>\n </ul>\n </div>\n }\n\n <!-- Selection Menu Inside Footer Hub -->\n @if (freeSample === 'false') {\n @if (showHighlightOverlay) {\n <div class=\"custom-selection-toolbar selection-menu fade-in\">\n @if (enableNotes) {\n <div class=\"menu-item\" (click)=\"addNotes(); showHighlightOverlay = false\">\n <span class=\"menu-text\">Add Notes</span>\n </div>\n }\n @if (enableHighlights) {\n <div class=\"menu-item\" (click)=\"showhightLightColor = true; showHighlightOverlay = false\" title=\"Highlight\">\n <span class=\"menu-text\">Highlights</span>\n </div>\n }\n @if (enableHighlights) {\n <div class=\"menu-item\" (click)=\"addUnderline(); showHighlightOverlay = false\">\n <span class=\"menu-text\">Underline</span>\n </div>\n }\n @if (enableNotes || enableHighlights) {\n <!-- Definition often goes with these tools -->\n <div class=\"menu-item border-none\" (click)=\"openCommonPopup(4); showHighlightOverlay = false\">\n <span class=\"menu-text\">Definition</span>\n </div>\n }\n </div>\n }\n\n @if (showhightLightColor) {\n <div class=\"custom-selection-toolbar color-picker fade-in\">\n @for (color of colourCodeList; track color) {\n <div class=\"color-circle\" [style.background]=\"color\"\n (click)=\"addHighlight(color); showhightLightColor = false\"></div>\n }\n <button class=\"toolbar-btn close-colors\" (click)=\"showhightLightColor = false; showHighlightOverlay = true\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M19 12H5\"></path>\n </svg>\n </button>\n </div>\n }\n }\n\n <!-- The Green Toggle Button -->\n <button class=\"menu-toggle-btn\" (click)=\"toggleAllMenus()\"\n [class.open]=\"isMenuOpen || showHighlightOverlay || showhightLightColor\">\n <!-- X Icon when open, Burger/Menu when closed -->\n @if (isMenuOpen || showHighlightOverlay || showhightLightColor) {\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n } @else {\n <!-- Menu Grid Icon -->\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6H20M4 12H20M4 18H20\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </button>\n </div>\n\n <!-- Next Button -->\n <button class=\"nav-btn next-btn\" (click)=\"nextClick()\" [class.ml-4]=\"true\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9 18L15 12L9 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n\n@if (showBookPageLoader) {\n<div class=\"fixed inset-0 z-[45] flex items-center justify-center bg-premium-loader fade-in\">\n <div class=\"text-center\">\n <div class=\"mb-8 relative inline-block\">\n <!-- Decorative Backdrop for Book -->\n <div class=\"absolute inset-0 bg-black/5 blur-2xl rounded-full transform scale-110\"></div>\n\n <!-- Larger, Premium Book Image -->\n <img [src]=\"coverImg ?? ''\" alt=\"Loading\"\n class=\"w-56 h-80 object-cover rounded-xl shadow-premium border-[6px] border-white relative z-10 animate-pulse\" />\n </div>\n\n <!-- Enhanced Loading Text Container -->\n <div class=\"flex flex-col items-center space-y-3\">\n <div class=\"flex items-center space-x-2 text-gray-400\">\n <span class=\"text-base font-medium\">Please wait a moment</span>\n <div class=\"flex space-x-1.5\">\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce\"></div>\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce [animation-delay:-0.15s]\"></div>\n <div class=\"w-1.5 h-1.5 bg-accent-color rounded-full animate-bounce [animation-delay:-0.3s]\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n}\n@if (showOverlay) {\n<div class=\"screenshot-overlay\"></div>\n}\n\n<!-- Full-screen Preview End Modal -->\n@if (showPreviewModal) {\n<div class=\"fixed inset-0 z-40 bg-white dark:bg-gray-900 flex flex-col items-center justify-center text-center px-4\">\n <h2\n class=\"text-[1.375rem] sm:text-2xl font-medium leading-snug text-center text-gray-800 dark:text-white mb-6 max-w-xs sm:max-w-sm mx-auto\">\n You’ve reached the end of the sample for\n </h2>\n\n <img [src]=\"coverImg ?? ''\" alt=\"Book Cover\" class=\"w-40 h-auto rounded-lg shadow-lg mb-6\" />\n</div>\n}\n\n\n<!-- Custom Chapter List Modal -->\n@if (showChapterList) {\n<div class=\"custom-modal-overlay fade-in\">\n <div class=\"custom-modal-content\">\n <app-chapterlist [chapterData]=\"chaptersData\" (chapterClick)=\"onChapterSelect($event)\"\n (closeDialog)=\"showChapterList = false\">\n </app-chapterlist>\n </div>\n</div>\n}","import { Component, input } from '@angular/core';\n\n@Component({\n selector: 'app-epub-loader',\n standalone: false,\n templateUrl: './epub-loader.component.html',\n styleUrl: './epub-loader.component.scss',\n})\nexport class EpubLoaderComponent {\n loadPercentage = input<any>(null);\n}\n","<div class=\"page-loader\">\n <div class=\"flex flex-col w-full loader-container\">\n <div class=\"text-black text-2xl font-bold mb-2\">Reader Loading</div>\n <p-progressBar\n [value]=\"loadPercentage()\"\n class=\"reader-progress w-full\"\n />\n <div class=\"text-percentage text-base font-normal inline-flex m-auto mt-3\">\n {{ loadPercentage() ? loadPercentage() : '0' }}\n </div>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, Routes } from '@angular/router';\nimport { ReaderMainComponent } from './reader-main/reader-main.component';\nimport { AddNotesComponent } from './add-notes/add-notes.component';\nimport { NgxEditorModule } from 'ngx-editor';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ChapterlistComponent } from './chapterlist/chapterlist.component';\nimport { TabViewModule } from 'primeng/tabview';\nimport { ProgressBarModule } from 'primeng/progressbar';\nimport { TableModule } from 'primeng/table';\nimport { ButtonModule } from 'primeng/button';\nimport { EpubCommonPopupComponent } from './epub-common-popup/epub-common-popup.component';\nimport { NoDataFoundComponent } from './shared-mocks/no-data-found.component';\nimport { EpubLoaderComponent } from './epub-loader/epub-loader.component';\nimport { CustomDialogService } from './custom-dialog.service';\nimport { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { HttpClientModule } from '@angular/common/http';\nimport { SkeletonLoaderComponent } from './shared-mocks/skeleton-loader.component';\n\nimport { EpubReaderService } from './epub-reader.service';\n\nconst routes: Routes = [\n {\n path: 'reader',\n component: ReaderMainComponent,\n pathMatch: 'full',\n },\n {\n path: 'chapter-list',\n component: ChapterlistComponent,\n },\n];\n\n@NgModule({\n declarations: [\n ReaderMainComponent,\n AddNotesComponent,\n EpubCommonPopupComponent,\n ChapterlistComponent,\n EpubLoaderComponent\n ],\n imports: [\n CommonModule,\n RouterModule.forChild(routes),\n NgxEditorModule,\n FormsModule,\n ReactiveFormsModule,\n TabViewModule,\n ProgressBarModule,\n TableModule,\n ButtonModule,\n NoDataFoundComponent,\n HttpClientModule,\n SkeletonLoaderComponent,\n ],\n providers: [\n CustomDialogService,\n EpubReaderService\n ],\n exports: [\n ReaderMainComponent,\n AddNotesComponent,\n EpubCommonPopupComponent,\n ChapterlistComponent,\n EpubLoaderComponent,\n SkeletonLoaderComponent\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n})\nexport class EpubReaderModule { }\n","export * from './lib/epub-reader.service';\nexport * from './lib/epub-reader.module';\nexport * from './lib/reader-main/reader-main.component';\nexport * from './lib/chapterlist/chapterlist.component';\nexport * from './lib/add-notes/add-notes.component';\nexport * from './lib/epub-common-popup/epub-common-popup.component';\nexport * from './lib/epub-loader/epub-loader.component';\nexport * from './lib/shared-mocks/skeleton-loader.component';\n// Export other components if needed\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.CustomDialogService","i2.SharedService","i3.EpubReaderService","i2.HttpApiService","i1.CustomDialogRef","i5","i3","i4.CustomDialogService","i4.CustomDialogRef","i5.EpubReaderService","i6","i9.NoDataFoundComponent","i10.SkeletonLoaderComponent","i7","i8.ChapterlistComponent"],"mappings":"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"}
@@ -132,5 +132,5 @@ export declare class ReaderMainComponent implements OnInit, OnDestroy, OnChanges
132
132
  toggleAllMenus(): void;
133
133
  ngOnDestroy(): void;
134
134
  static ɵfac: i0.ɵɵFactoryDeclaration<ReaderMainComponent, never>;
135
- static ɵcmp: i0.ɵɵComponentDeclaration<ReaderMainComponent, "epub-flow", never, { "epubUrl": { "alias": "epubUrl"; "required": false; }; "epubBlob": { "alias": "epubBlob"; "required": false; }; "coverPage": { "alias": "coverPage"; "required": false; }; "enableDarkMode": { "alias": "enableDarkMode"; "required": false; }; "enableSearch": { "alias": "enableSearch"; "required": false; }; "enableHighlights": { "alias": "enableHighlights"; "required": false; }; "enableBookmarks": { "alias": "enableBookmarks"; "required": false; }; "enableChapterList": { "alias": "enableChapterList"; "required": false; }; "enableTextSelection": { "alias": "enableTextSelection"; "required": false; }; "enableFontSize": { "alias": "enableFontSize"; "required": false; }; "enableNotes": { "alias": "enableNotes"; "required": false; }; }, { "underlineRemoveRequest": "underlineRemoveRequest"; }, never, never, false, never>;
135
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReaderMainComponent, "epub-flow", never, { "epubUrl": { "alias": "epubUrl"; "required": false; }; "epubBlob": { "alias": "epubBlob"; "required": false; }; "coverPage": { "alias": "coverPage"; "required": false; }; "enableDarkMode": { "alias": "enableDarkMode"; "required": false; }; "enableSearch": { "alias": "enableSearch"; "required": false; }; "enableHighlights": { "alias": "enableHighlights"; "required": false; }; "enableBookmarks": { "alias": "enableBookmarks"; "required": false; }; "enableChapterList": { "alias": "enableChapterList"; "required": false; }; "enableTextSelection": { "alias": "enableTextSelection"; "required": false; }; "enableFontSize": { "alias": "enableFontSize"; "required": false; }; "enableNotes": { "alias": "enableNotes"; "required": false; }; "bookId": { "alias": "bookId"; "required": false; }; }, { "underlineRemoveRequest": "underlineRemoveRequest"; }, never, never, false, never>;
136
136
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "epub-flow",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.2.0",
6
6
  "@angular/core": "^19.2.0",
Binary file