@internetarchive/bookreader 5.0.0-28 → 5.0.0-30-a

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.
Files changed (233) hide show
  1. package/.husky/_/husky.sh +30 -0
  2. package/BookReader/BookReader.css +1 -1
  3. package/BookReader/BookReader.js +1 -1
  4. package/BookReader/BookReader.js.map +1 -1
  5. package/BookReader/ia-bookreader-bundle.js +1458 -0
  6. package/BookReader/{bookreader-component-bundle.js.LICENSE.txt → ia-bookreader-bundle.js.LICENSE.txt} +12 -0
  7. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  8. package/BookReader/plugins/plugin.search.js +1 -1
  9. package/BookReader/plugins/plugin.search.js.map +1 -1
  10. package/BookReader/plugins/plugin.url.js +1 -1
  11. package/BookReader/plugins/plugin.url.js.map +1 -1
  12. package/BookReaderDemo/BookReaderDemo.css +14 -1
  13. package/BookReaderDemo/IADemoBr.js +107 -0
  14. package/BookReaderDemo/demo-internetarchive.html +64 -99
  15. package/CHANGELOG.md +4 -0
  16. package/package.json +9 -6
  17. package/src/BookNavigator/assets/ia-logo.js +17 -0
  18. package/src/BookNavigator/book-navigator.js +528 -0
  19. package/src/BookNavigator/bookmarks/bookmark-button.js +2 -1
  20. package/src/BookNavigator/bookmarks/bookmarks-provider.js +20 -8
  21. package/src/BookNavigator/bookmarks/ia-bookmarks.js +84 -51
  22. package/src/BookNavigator/downloads/downloads-provider.js +5 -9
  23. package/src/BookNavigator/downloads/downloads.js +1 -0
  24. package/src/BookNavigator/search/search-provider.js +15 -8
  25. package/src/BookNavigator/sharing.js +27 -0
  26. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +9 -8
  27. package/src/BookNavigator/volumes/volumes-provider.js +3 -4
  28. package/src/BookReader/options.js +6 -0
  29. package/src/BookReader.js +20 -8
  30. package/src/css/_BRComponent.scss +1 -1
  31. package/src/ia-bookreader/ia-bookreader.js +205 -0
  32. package/src/plugins/search/plugin.search.js +9 -9
  33. package/src/plugins/url/UrlPlugin.js +5 -6
  34. package/{src → stat}/BookNavigator/BookModel.js +0 -0
  35. package/{src → stat}/BookNavigator/BookNavigator.js +109 -102
  36. package/stat/BookNavigator/assets/bookmark-colors.js +15 -0
  37. package/stat/BookNavigator/assets/button-base.js +61 -0
  38. package/stat/BookNavigator/assets/ia-logo.js +17 -0
  39. package/stat/BookNavigator/assets/icon_checkmark.js +6 -0
  40. package/stat/BookNavigator/assets/icon_close.js +3 -0
  41. package/stat/BookNavigator/assets/icon_sort_asc.js +5 -0
  42. package/stat/BookNavigator/assets/icon_sort_desc.js +5 -0
  43. package/stat/BookNavigator/assets/icon_sort_neutral.js +5 -0
  44. package/stat/BookNavigator/assets/icon_volumes.js +11 -0
  45. package/stat/BookNavigator/bookmarks/bookmark-button.js +64 -0
  46. package/stat/BookNavigator/bookmarks/bookmark-edit.js +215 -0
  47. package/stat/BookNavigator/bookmarks/bookmarks-list.js +285 -0
  48. package/stat/BookNavigator/bookmarks/bookmarks-loginCTA.js +28 -0
  49. package/stat/BookNavigator/bookmarks/bookmarks-provider.js +56 -0
  50. package/stat/BookNavigator/bookmarks/ia-bookmarks.js +523 -0
  51. package/{src → stat}/BookNavigator/br-fullscreen-mgr.js +1 -2
  52. package/stat/BookNavigator/delete-modal-actions.js +49 -0
  53. package/stat/BookNavigator/downloads/downloads-provider.js +72 -0
  54. package/stat/BookNavigator/downloads/downloads.js +139 -0
  55. package/stat/BookNavigator/provider-config.js +0 -0
  56. package/stat/BookNavigator/search/a-search-result.js +55 -0
  57. package/stat/BookNavigator/search/search-provider.js +180 -0
  58. package/stat/BookNavigator/search/search-results.js +360 -0
  59. package/{src/ItemNavigator/providers → stat/BookNavigator}/sharing.js +3 -5
  60. package/stat/BookNavigator/visual-adjustments/visual-adjustments-provider.js +94 -0
  61. package/stat/BookNavigator/visual-adjustments/visual-adjustments.js +280 -0
  62. package/stat/BookNavigator/volumes/volumes-provider.js +83 -0
  63. package/stat/BookNavigator/volumes/volumes.js +178 -0
  64. package/stat/BookReader/BookModel.js +518 -0
  65. package/stat/BookReader/DebugConsole.js +54 -0
  66. package/stat/BookReader/DragScrollable.js +233 -0
  67. package/stat/BookReader/ImageCache.js +116 -0
  68. package/stat/BookReader/Mode1Up.js +102 -0
  69. package/stat/BookReader/Mode1UpLit.js +434 -0
  70. package/stat/BookReader/Mode2Up.js +1372 -0
  71. package/stat/BookReader/ModeSmoothZoom.js +177 -0
  72. package/stat/BookReader/ModeThumb.js +344 -0
  73. package/stat/BookReader/Navbar/Navbar.js +310 -0
  74. package/stat/BookReader/PageContainer.js +120 -0
  75. package/stat/BookReader/ReduceSet.js +26 -0
  76. package/stat/BookReader/Toolbar/Toolbar.js +384 -0
  77. package/stat/BookReader/events.js +20 -0
  78. package/stat/BookReader/options.js +324 -0
  79. package/stat/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  80. package/stat/BookReader/utils/classes.js +36 -0
  81. package/stat/BookReader/utils.js +240 -0
  82. package/stat/BookReader.js +2550 -0
  83. package/{src → stat}/BookReaderComponent/BookReaderComponent.js +15 -10
  84. package/stat/assets/icons/1up.svg +12 -0
  85. package/stat/assets/icons/2up.svg +15 -0
  86. package/stat/assets/icons/advance.svg +26 -0
  87. package/stat/assets/icons/chevron-right.svg +1 -0
  88. package/stat/assets/icons/close-circle-dark.svg +1 -0
  89. package/stat/assets/icons/close-circle.svg +1 -0
  90. package/stat/assets/icons/fullscreen.svg +17 -0
  91. package/stat/assets/icons/fullscreen_exit.svg +17 -0
  92. package/stat/assets/icons/hamburger.svg +15 -0
  93. package/stat/assets/icons/left-arrow.svg +12 -0
  94. package/stat/assets/icons/magnify-minus.svg +16 -0
  95. package/stat/assets/icons/magnify-plus.svg +17 -0
  96. package/stat/assets/icons/magnify.svg +15 -0
  97. package/stat/assets/icons/pause.svg +23 -0
  98. package/stat/assets/icons/play.svg +22 -0
  99. package/stat/assets/icons/playback-speed.svg +34 -0
  100. package/stat/assets/icons/read-aloud.svg +22 -0
  101. package/stat/assets/icons/review.svg +22 -0
  102. package/stat/assets/icons/thumbnails.svg +17 -0
  103. package/stat/assets/icons/voice.svg +1 -0
  104. package/stat/assets/icons/volume-full.svg +22 -0
  105. package/stat/assets/images/BRicons.png +0 -0
  106. package/stat/assets/images/BRicons.svg +94 -0
  107. package/stat/assets/images/BRicons_ia.png +0 -0
  108. package/stat/assets/images/back_pages.png +0 -0
  109. package/stat/assets/images/book_bottom_icon.png +0 -0
  110. package/stat/assets/images/book_down_icon.png +0 -0
  111. package/stat/assets/images/book_left_icon.png +0 -0
  112. package/stat/assets/images/book_leftmost_icon.png +0 -0
  113. package/stat/assets/images/book_right_icon.png +0 -0
  114. package/stat/assets/images/book_rightmost_icon.png +0 -0
  115. package/stat/assets/images/book_top_icon.png +0 -0
  116. package/stat/assets/images/book_up_icon.png +0 -0
  117. package/stat/assets/images/books_graphic.svg +177 -0
  118. package/stat/assets/images/booksplit.png +0 -0
  119. package/stat/assets/images/control_pause_icon.png +0 -0
  120. package/stat/assets/images/control_play_icon.png +0 -0
  121. package/stat/assets/images/embed_icon.png +0 -0
  122. package/stat/assets/images/icon-home-ia.png +0 -0
  123. package/stat/assets/images/icon_OL-logo-xs.png +0 -0
  124. package/stat/assets/images/icon_alert-xs.png +0 -0
  125. package/stat/assets/images/icon_book.svg +12 -0
  126. package/stat/assets/images/icon_bookmark.svg +12 -0
  127. package/stat/assets/images/icon_close-pop.png +0 -0
  128. package/stat/assets/images/icon_download.png +0 -0
  129. package/stat/assets/images/icon_gear.svg +14 -0
  130. package/stat/assets/images/icon_hamburger.svg +20 -0
  131. package/stat/assets/images/icon_home.png +0 -0
  132. package/stat/assets/images/icon_home.svg +21 -0
  133. package/stat/assets/images/icon_home_ia.png +0 -0
  134. package/stat/assets/images/icon_indicator.png +0 -0
  135. package/stat/assets/images/icon_info.svg +11 -0
  136. package/stat/assets/images/icon_one_page.svg +8 -0
  137. package/stat/assets/images/icon_pause.svg +1 -0
  138. package/stat/assets/images/icon_play.svg +1 -0
  139. package/stat/assets/images/icon_playback-rate.svg +15 -0
  140. package/stat/assets/images/icon_return.png +0 -0
  141. package/stat/assets/images/icon_search_button.svg +8 -0
  142. package/stat/assets/images/icon_share.svg +9 -0
  143. package/stat/assets/images/icon_skip-ahead.svg +6 -0
  144. package/stat/assets/images/icon_skip-back.svg +13 -0
  145. package/stat/assets/images/icon_speaker.svg +18 -0
  146. package/stat/assets/images/icon_speaker_open.svg +10 -0
  147. package/stat/assets/images/icon_thumbnails.svg +12 -0
  148. package/stat/assets/images/icon_toc.svg +5 -0
  149. package/stat/assets/images/icon_two_pages.svg +9 -0
  150. package/stat/assets/images/icon_zoomer.png +0 -0
  151. package/stat/assets/images/loading.gif +0 -0
  152. package/stat/assets/images/logo_icon.png +0 -0
  153. package/stat/assets/images/marker_chap-off.png +0 -0
  154. package/stat/assets/images/marker_chap-off.svg +11 -0
  155. package/stat/assets/images/marker_chap-off_ia.png +0 -0
  156. package/stat/assets/images/marker_chap-on.png +0 -0
  157. package/stat/assets/images/marker_chap-on.svg +11 -0
  158. package/stat/assets/images/marker_srch-on.svg +11 -0
  159. package/stat/assets/images/marker_srchchap-off.png +0 -0
  160. package/stat/assets/images/marker_srchchap-on.png +0 -0
  161. package/stat/assets/images/nav_control-dn.png +0 -0
  162. package/stat/assets/images/nav_control-dn_ia.png +0 -0
  163. package/stat/assets/images/nav_control-up.png +0 -0
  164. package/stat/assets/images/nav_control-up_ia.png +0 -0
  165. package/stat/assets/images/nav_control.png +0 -0
  166. package/stat/assets/images/one_page_mode_icon.png +0 -0
  167. package/stat/assets/images/paper-badge.png +0 -0
  168. package/stat/assets/images/print_icon.png +0 -0
  169. package/stat/assets/images/progressbar.gif +0 -0
  170. package/stat/assets/images/right_edges.png +0 -0
  171. package/stat/assets/images/slider.png +0 -0
  172. package/stat/assets/images/slider_ia.png +0 -0
  173. package/stat/assets/images/thumbnail_mode_icon.png +0 -0
  174. package/stat/assets/images/transparent.png +0 -0
  175. package/stat/assets/images/two_page_mode_icon.png +0 -0
  176. package/stat/assets/images/zoom_in_icon.png +0 -0
  177. package/stat/assets/images/zoom_out_icon.png +0 -0
  178. package/stat/css/BookReader.scss +89 -0
  179. package/stat/css/_BRBookmarks.scss +29 -0
  180. package/stat/css/_BRComponent.scss +13 -0
  181. package/stat/css/_BRfloat.scss +197 -0
  182. package/stat/css/_BRicon.scss +48 -0
  183. package/stat/css/_BRmain.scss +251 -0
  184. package/stat/css/_BRnav.scss +359 -0
  185. package/stat/css/_BRpages.scss +139 -0
  186. package/stat/css/_BRsearch.scss +226 -0
  187. package/stat/css/_BRtoolbar.scss +84 -0
  188. package/stat/css/_BRvendor.scss +5 -0
  189. package/stat/css/_MobileNav.scss +194 -0
  190. package/stat/css/_TextSelection.scss +32 -0
  191. package/stat/css/_colorbox.scss +52 -0
  192. package/stat/css/_controls.scss +253 -0
  193. package/stat/css/_icons.scss +121 -0
  194. package/stat/jquery-wrapper.js +4 -0
  195. package/stat/plugins/plugin.archive_analytics.js +86 -0
  196. package/stat/plugins/plugin.autoplay.js +129 -0
  197. package/stat/plugins/plugin.chapters.js +248 -0
  198. package/stat/plugins/plugin.iframe.js +48 -0
  199. package/stat/plugins/plugin.mobile_nav.js +288 -0
  200. package/stat/plugins/plugin.resume.js +68 -0
  201. package/stat/plugins/plugin.text_selection.js +291 -0
  202. package/stat/plugins/plugin.url.js +198 -0
  203. package/stat/plugins/plugin.vendor-fullscreen.js +247 -0
  204. package/stat/plugins/search/plugin.search.js +439 -0
  205. package/stat/plugins/search/view.js +439 -0
  206. package/stat/plugins/tts/AbstractTTSEngine.js +249 -0
  207. package/stat/plugins/tts/FestivalTTSEngine.js +169 -0
  208. package/stat/plugins/tts/PageChunk.js +107 -0
  209. package/stat/plugins/tts/PageChunkIterator.js +163 -0
  210. package/stat/plugins/tts/WebTTSEngine.js +357 -0
  211. package/stat/plugins/tts/plugin.tts.js +357 -0
  212. package/stat/plugins/tts/tooltip_dict.js +15 -0
  213. package/stat/plugins/tts/utils.js +91 -0
  214. package/stat/util/browserSniffing.js +30 -0
  215. package/stat/util/debouncer.js +26 -0
  216. package/stat/util/docCookies.js +67 -0
  217. package/stat/util/strings.js +34 -0
  218. package/tests/e2e/viewmode.test.js +30 -30
  219. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +64 -52
  220. package/tests/jest/plugins/url/UrlPlugin.test.js +33 -10
  221. package/tests/karma/BookNavigator/book-navigator.test.js +413 -108
  222. package/tests/karma/BookNavigator/bookmarks/bookmark-button.test.js +44 -0
  223. package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +6 -3
  224. package/tests/karma/BookNavigator/search/search-provider.test.js +106 -6
  225. package/tests/karma/BookNavigator/search/search-results.test.js +0 -2
  226. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +29 -20
  227. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +41 -17
  228. package/webpack.config.js +1 -1
  229. package/.nvmrc +0 -1
  230. package/BookReader/bookreader-component-bundle.js +0 -1436
  231. package/BookReader/bookreader-component-bundle.js.map +0 -1
  232. package/src/BookNavigator/assets/book-loader.js +0 -27
  233. package/src/ItemNavigator/ItemNavigator.js +0 -377
@@ -1,5 +1,7 @@
1
- import { render, nothing } from 'lit-html';
1
+ import { render } from 'lit-html';
2
2
  import { LitElement, html, css } from 'lit-element';
3
+ // eslint-disable-next-line no-unused-vars
4
+ import { ModalConfig, ModalManager } from '@internetarchive/modal-manager';
3
5
  import buttonStyles from '../assets/button-base.js';
4
6
  import './bookmarks-loginCTA.js';
5
7
 
@@ -57,9 +59,11 @@ class IABookmarks extends LitElement {
57
59
  activeBookmarkID: { type: String },
58
60
  bookmarks: { type: Array },
59
61
  bookreader: { type: Object },
60
- options: { type: Object },
61
62
  displayMode: { type: String },
62
63
  editedBookmark: { type: Object },
64
+ deleteModalConfig: { type: Object},
65
+ modal: { attribute: false },
66
+ loginOptions: { type: Object, attribute: false }
63
67
  };
64
68
  }
65
69
 
@@ -92,7 +96,12 @@ class IABookmarks extends LitElement {
92
96
  this.bookmarks = [];
93
97
  this.bookreader = {};
94
98
  this.editedBookmark = {};
95
- this.options = {};
99
+ /** @type {ModalManager} */
100
+ this.modal = undefined;
101
+ this.loginOptions = {
102
+ loginClicked: () => {},
103
+ loginUrl: '',
104
+ };
96
105
  /**
97
106
  * Toggles display to either bookmarks or login cta
98
107
  * @param {('bookmarks'|'login')} displayMode
@@ -113,9 +122,18 @@ class IABookmarks extends LitElement {
113
122
  // eslint-disable-next-line
114
123
  this.defaultColor = this.bookmarkColors[0];
115
124
  this.api = api;
125
+ this.deleteModalConfig = new ModalConfig({
126
+ title: 'Delete Bookmark',
127
+ headline: 'This bookmark contains a note. Deleting it will permanently delete the note. Are you sure?',
128
+ headerColor: '#194880',
129
+ });
116
130
  }
117
131
 
118
- updated() {
132
+ updated(changed) {
133
+ if (changed.has('displayMode')) {
134
+ this.updateDisplay();
135
+ }
136
+
119
137
  this.emitBookmarksChanged();
120
138
  }
121
139
 
@@ -124,13 +142,24 @@ class IABookmarks extends LitElement {
124
142
  if (this.displayMode === 'login') {
125
143
  return;
126
144
  }
145
+ this.setBREventListeners();
146
+ this.initializeBookmarks();
147
+ }
148
+
149
+ updateDisplay() {
150
+ if (this.displayMode === 'bookmarks') {
151
+ this.fetchUserBookmarks();
152
+ }
153
+ }
154
+
155
+ fetchUserBookmarks() {
127
156
  this.fetchBookmarks()
128
- .then(() => this.initializeBookmarks())
129
- .catch((err) => this.displayMode = 'login');
157
+ .then(() => {
158
+ this.initializeBookmarks();
159
+ });
130
160
  }
131
161
 
132
- initializeBookmarks() {
133
- this.displayMode = 'bookmarks';
162
+ setBREventListeners() {
134
163
  ['3PageViewSelected'].forEach((event) => {
135
164
  window.addEventListener(`BookReader:${event}`, (e) => {
136
165
  setTimeout(() => {
@@ -150,12 +179,12 @@ class IABookmarks extends LitElement {
150
179
  });
151
180
  ['zoomOut', 'zoomIn', 'resize'].forEach((event) => {
152
181
  window.addEventListener(`BookReader:${event}`, () => {
153
- if (this.bookreader.mode === this.bookreader.constModeThumb) {
154
- this.renderBookmarkButtons();
155
- }
182
+ this.renderBookmarkButtons();
156
183
  });
157
184
  });
185
+ }
158
186
 
187
+ initializeBookmarks() {
159
188
  this.renderBookmarkButtons();
160
189
  this.markActiveBookmark(true);
161
190
  this.emitBookmarksChanged();
@@ -198,13 +227,22 @@ class IABookmarks extends LitElement {
198
227
  }
199
228
 
200
229
  fetchBookmarks() {
201
- return this.api.getAll().then((res) => res.json()).then(({
202
- success,
203
- error = 'Something happened while fetching bookmarks.',
204
- value: bkmrks = [],
205
- }) => {
230
+ return this.api.getAll().then((res) => {
231
+ let response;
232
+ try {
233
+ response = JSON.parse(res);
234
+ } catch (e) {
235
+ response = { error: e.message };
236
+ }
237
+ return response;
238
+ }).then((response) => {
239
+ const {
240
+ success,
241
+ error = 'Something happened while fetching bookmarks.',
242
+ value: bkmrks = [],
243
+ } = response;
206
244
  if (!success) {
207
- throw new Error(`Failed to load bookmarks: ${error}`);
245
+ console?.warn('Error fetching bookmarks', error);
208
246
  }
209
247
 
210
248
  const bookmarks = {};
@@ -253,7 +291,9 @@ class IABookmarks extends LitElement {
253
291
 
254
292
  pages.forEach((pageEl) => {
255
293
  const existingButton = pageEl.querySelector('.bookmark-button');
256
- if (existingButton) { existingButton.remove(); }
294
+ if (existingButton) {
295
+ existingButton.remove();
296
+ }
257
297
  const pageID = +pageEl.classList.value.match(/pagediv\d+/)[0].replace(/\D/g, '');
258
298
  const pageBookmark = this.getBookmark(pageID);
259
299
  const bookmarkState = pageBookmark ? 'filled' : 'hollow';
@@ -393,33 +433,26 @@ class IABookmarks extends LitElement {
393
433
  confirmDeletion(pageID) {
394
434
  const existingBookmark = this.getBookmark(pageID);
395
435
  if (existingBookmark.note) {
396
- this.emitShowModal(pageID);
436
+ this.displayDeletionModal(pageID);
397
437
  return;
398
438
  }
399
439
  this.deleteBookmark({ detail: { id: `${pageID}` } });
400
440
  }
401
441
 
402
- emitShowModal(pageID) {
403
- this.dispatchEvent(new CustomEvent('showItemNavigatorModal', {
404
- bubbles: true,
405
- composed: true,
406
- detail: {
407
- customModalContent: html`
408
- <delete-modal-actions
409
- .deleteAction=${() => this.deleteBookmark({ detail: { id: `${pageID}` } })}
410
- .cancelAction=${() => this.emitCloseModal()}
411
- .pageID=${pageID}
412
- ></delete-modal-actions>
413
- `,
414
- },
415
- }));
416
- }
442
+ displayDeletionModal(pageID) {
443
+ const customModalContent = html`
444
+ <delete-modal-actions
445
+ .deleteAction=${() => this.deleteBookmark({ detail: { id: `${pageID}` } })}
446
+ .cancelAction=${() => this.modal.closeModal()}
447
+ .pageID=${pageID}
448
+ ></delete-modal-actions>
449
+ `;
417
450
 
418
- emitCloseModal() {
419
- this.dispatchEvent(new CustomEvent('closeItemNavigatorModal', {
420
- bubbles: true,
421
- composed: true,
422
- }));
451
+
452
+ this.modal.showModal({
453
+ config: this.deleteModalConfig,
454
+ customModalContent,
455
+ });
423
456
  }
424
457
 
425
458
  deleteBookmark({ detail }) {
@@ -430,18 +463,10 @@ class IABookmarks extends LitElement {
430
463
 
431
464
  this.api.delete(detail.id);
432
465
  this.editedBookmark = {};
433
- this.emitCloseModal();
466
+ this.modal.closeModal();
434
467
  this.renderBookmarkButtons();
435
468
  }
436
469
 
437
- /**
438
- * call `loginClicked` callback
439
- */
440
- loginClick() {
441
- const { loginClicked = () => {} } = this.options;
442
- loginClicked();
443
- }
444
-
445
470
  /**
446
471
  * Tells us if we should allow user to add bookmark via menu panel
447
472
  * returns { Boolean }
@@ -487,15 +512,23 @@ class IABookmarks extends LitElement {
487
512
  `;
488
513
  }
489
514
 
515
+ get bookmarkHelperMessage() {
516
+ return html`<p>Please use 1up or 2up view modes to add bookmark.</p>`;
517
+ }
518
+
490
519
  render() {
491
- const { loginUrl } = this.options;
492
520
  const bookmarks = html`
493
521
  ${this.bookmarksList}
494
- ${this.allowAddingBookmark ? this.addBookmarkButton : nothing}
522
+ ${this.allowAddingBookmark ? this.addBookmarkButton : this.bookmarkHelperMessage}
495
523
  `;
496
524
  return html`
497
525
  <section class="bookmarks">
498
- ${this.displayMode === 'login' ? html`<bookmarks-login @click=${this.loginClick} .url=${loginUrl}></bookmarks-login>` : bookmarks}
526
+ ${ this.displayMode === 'login'
527
+ ? html`<bookmarks-login
528
+ @click=${() => this.loginOptions.loginClicked()}
529
+ .url=${this.loginOptions.loginUrl}></bookmarks-login>`
530
+ : bookmarks
531
+ }
499
532
  </section>
500
533
  `;
501
534
  }
@@ -1,9 +1,6 @@
1
1
  import { html } from 'lit-element';
2
-
3
- /* register subpanel */
4
- import { IABookDownloads } from './downloads';
5
-
6
- customElements.define('ia-book-downloads', IABookDownloads);
2
+ import '@internetarchive/icon-dl/icon-dl';
3
+ import './downloads';
7
4
 
8
5
  const menuBase = {
9
6
  pdf: {
@@ -25,14 +22,14 @@ const publicMenuBase = {
25
22
 
26
23
  export default class DownloadsProvider {
27
24
 
28
- constructor(isBookProtected) {
29
- this.icon = html`<ia-icon icon="download" style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon>`;
25
+ constructor({ bookreader }) {
26
+ this.icon = html`<ia-icon-dl style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon-dl>`;
30
27
  this.label = 'Downloadable files';
31
28
  this.menuDetails = '';
32
29
  this.downloads = [];
33
30
  this.id = 'downloads';
34
31
  this.component = '';
35
- this.isBookProtected = isBookProtected;
32
+ this.isBookProtected = bookreader?.options?.isProtected || false;
36
33
 
37
34
  this.computeAvailableTypes = this.computeAvailableTypes.bind(this);
38
35
  this.update = this.update.bind(this);
@@ -72,5 +69,4 @@ export default class DownloadsProvider {
72
69
  get menu () {
73
70
  return html`<ia-book-downloads .downloads=${this.downloads}></ia-book-downloads>`;
74
71
  }
75
-
76
72
  }
@@ -136,3 +136,4 @@ export class IABookDownloads extends LitElement {
136
136
  return [buttonStyles, mainCss];
137
137
  }
138
138
  }
139
+ customElements.define('ia-book-downloads', IABookDownloads);
@@ -1,6 +1,6 @@
1
1
  import { html } from 'lit-element';
2
2
  import { nothing } from 'lit-html';
3
-
3
+ import '@internetarchive/icon-search/icon-search';
4
4
  import './search-results';
5
5
 
6
6
  let searchState = {
@@ -10,8 +10,11 @@ let searchState = {
10
10
  queryInProgress: false,
11
11
  errorMessage: '',
12
12
  };
13
- export default class {
14
- constructor(onSearchChange = () => {}, brInstance) {
13
+ export default class SearchProvider {
14
+ constructor({
15
+ onProviderChange,
16
+ bookreader
17
+ }) {
15
18
  /* search menu events */
16
19
  this.onBookSearchInitiated = this.onBookSearchInitiated.bind(this);
17
20
  /* bookreader search events */
@@ -29,9 +32,9 @@ export default class {
29
32
  this.advanceToPage = this.advanceToPage.bind(this);
30
33
  this.updateMenu = this.updateMenu.bind(this);
31
34
 
32
- this.onSearchChange = onSearchChange;
33
- this.bookreader = brInstance;
34
- this.icon = html`<ia-icon icon="search" style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon>`;
35
+ this.onProviderChange = onProviderChange;
36
+ this.bookreader = bookreader;
37
+ this.icon = html`<ia-icon-search style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon-search>`;
35
38
  this.label = 'Search inside';
36
39
  this.menuDetails = this.getMenuDetails();
37
40
  this.id = 'search';
@@ -75,7 +78,10 @@ export default class {
75
78
  }
76
79
 
77
80
  onSearchStarted(e) {
78
- const { term = '' } = e.detail.props;
81
+ const { term = '', instance } = e.detail.props;
82
+ if (instance) {
83
+ this.bookreader = instance;
84
+ }
79
85
  searchState.query = term;
80
86
  searchState.results = [];
81
87
  searchState.resultsCount = 0;
@@ -104,6 +110,7 @@ export default class {
104
110
  };
105
111
 
106
112
  const messageToShow = errorMessages[errorType] ?? errorMessages.default;
113
+ searchState.query = instance?.searchResults?.q || '';
107
114
  searchState.results = [];
108
115
  searchState.resultsCount = 0;
109
116
  searchState.queryInProgress = false;
@@ -148,7 +155,7 @@ export default class {
148
155
  updateMenu(searchUpdates = {}) {
149
156
  this.menuDetails = this.getMenuDetails();
150
157
  this.component = this.getComponent();
151
- this.onSearchChange(this.bookreader, searchUpdates);
158
+ this.onProviderChange(this.bookreader, searchUpdates);
152
159
  }
153
160
 
154
161
  getComponent() {
@@ -0,0 +1,27 @@
1
+ import { html } from 'lit-element';
2
+ import '@internetarchive/icon-share/icon-share';
3
+ import '@internetarchive/ia-sharing-options';
4
+
5
+ export default class SharingProvider {
6
+ constructor({
7
+ item,
8
+ baseHost,
9
+ bookreader
10
+ }) {
11
+ const { identifier, creator, title } = item?.metadata;
12
+ const creatorToUse = Array.isArray(creator) ? creator[0] : creator;
13
+ const subPrefix = bookreader.options.subPrefix || '';
14
+ const label = `Share this book`;
15
+ this.icon = html`<ia-icon-share style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon-share>`;
16
+ this.label = label;
17
+ this.id = 'share';
18
+ this.component = html`<ia-sharing-options
19
+ .identifier=${identifier}
20
+ .type=${`book`}
21
+ .creator=${creatorToUse}
22
+ .description=${title}
23
+ .baseHost=${baseHost}
24
+ .fileSubPrefix=${subPrefix}
25
+ ></ia-sharing-options>`;
26
+ }
27
+ }
@@ -1,5 +1,6 @@
1
1
  import { html } from 'lit-element';
2
- import './visual-adjustments.js';
2
+ import '@internetarchive/icon-visual-adjustment/icon-visual-adjustment';
3
+ import './visual-adjustments';
3
4
 
4
5
  const visualAdjustmentOptions = [{
5
6
  id: 'brightness',
@@ -27,11 +28,11 @@ const visualAdjustmentOptions = [{
27
28
  active: false,
28
29
  }];
29
30
 
30
- export default class {
31
+ export default class VisualAdjustmentsProvider {
31
32
  constructor(options) {
32
- const { onOptionChange = () => {}, bookContainerSelector, bookreader } = options;
33
- this.onOptionChange = onOptionChange;
34
- this.bookContainerSelector = bookContainerSelector;
33
+ const { onProviderChange, bookreader } = options;
34
+ this.onProviderChange = onProviderChange;
35
+ this.bookContainer = bookreader.refs.$brContainer;
35
36
  this.bookreader = bookreader;
36
37
 
37
38
  this.onAdjustmentChange = this.onAdjustmentChange.bind(this);
@@ -41,7 +42,7 @@ export default class {
41
42
  this.onZoomOut = this.onZoomOut.bind(this);
42
43
 
43
44
  this.activeCount = 0;
44
- this.icon = html`<ia-icon icon="visualAdjustment" style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon>`;
45
+ this.icon = html`<ia-icon-visual-adjustment style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon-visual-adjustment>`;
45
46
  this.label = 'Visual Adjustments';
46
47
  this.menuDetails = this.updateOptionsCount();
47
48
  this.id = 'adjustment';
@@ -76,7 +77,7 @@ export default class {
76
77
  return newValue ? [...values, newValue] : values;
77
78
  }, []).join(' ');
78
79
 
79
- document.querySelector(this.bookContainerSelector).style.setProperty('filter', filters);
80
+ this.bookContainer.css('filter', filters);
80
81
 
81
82
  this.optionUpdateComplete(event);
82
83
  }
@@ -84,7 +85,7 @@ export default class {
84
85
  optionUpdateComplete(event) {
85
86
  this.activeCount = event.detail.activeCount;
86
87
  this.updateOptionsCount(event);
87
- this.onOptionChange(event);
88
+ this.onProviderChange();
88
89
  }
89
90
 
90
91
  updateOptionsCount() {
@@ -13,12 +13,11 @@ const sortType = {
13
13
  default: 'default'
14
14
  };
15
15
  export default class VolumesProvider {
16
-
17
16
  /**
18
17
  * @param {import('../../BookReader').default} bookreader
19
18
  */
20
- constructor(baseHost, bookreader, optionChange) {
21
- this.optionChange = optionChange;
19
+ constructor({ baseHost, bookreader, onProviderChange }) {
20
+ this.onProviderChange = onProviderChange;
22
21
  this.component = document.createElement("viewable-files");
23
22
 
24
23
  const files = bookreader.options.multipleBooksList.by_subprefix;
@@ -93,7 +92,7 @@ export default class VolumesProvider {
93
92
  }
94
93
  }
95
94
 
96
- this.optionChange(this.bookreader);
95
+ this.onProviderChange(this.bookreader);
97
96
 
98
97
  this.multipleFilesClicked(sortByType);
99
98
  }
@@ -279,6 +279,12 @@ export const DEFAULT_OPTIONS = {
279
279
  */
280
280
  startFullscreen: false,
281
281
 
282
+ /**
283
+ * @type {Boolean}
284
+ * will show logo at fullscreen mode
285
+ */
286
+ enableFSLogoShortcut: false,
287
+
282
288
  /**
283
289
  * @type {Boolean}
284
290
  * On init, by default, we want to handle resizing bookreader
package/src/BookReader.js CHANGED
@@ -178,7 +178,7 @@ BookReader.prototype.setup = function(options) {
178
178
  */
179
179
  this.firstIndex = null;
180
180
  this.lastDisplayableIndex2up = null;
181
- this.isFullscreenActive = false;
181
+ this.isFullscreenActive = options.startFullscreen || false;
182
182
  this.lastScroll = null;
183
183
 
184
184
  this.showLogo = options.showLogo;
@@ -486,7 +486,6 @@ BookReader.prototype.getInitialMode = function(params) {
486
486
  if ('undefined' != typeof(params.mode)) {
487
487
  nextMode = params.mode;
488
488
  } else if (this.ui == 'full'
489
- && this.enableMobileNav
490
489
  && this.isFullscreenActive
491
490
  && windowWidth <= this.onePageMinBreakpoint
492
491
  ) {
@@ -588,14 +587,16 @@ BookReader.prototype.init = function() {
588
587
  this.suppressFragmentChange = false;
589
588
  }
590
589
 
590
+ if (this.options.startFullscreen) {
591
+ this.enterFullscreen(true);
592
+ }
593
+
591
594
  this.init.initComplete = true;
592
595
  this.trigger(BookReader.eventNames.PostInit);
593
596
 
594
597
  // Must be called after this.init.initComplete set to true to allow
595
598
  // BookReader.prototype.resize to run.
596
- if (this.options.startFullscreen) {
597
- this.toggleFullscreen();
598
- }
599
+
599
600
  };
600
601
 
601
602
  /**
@@ -604,7 +605,6 @@ BookReader.prototype.init = function() {
604
605
  */
605
606
  BookReader.prototype.trigger = function(name, props = this) {
606
607
  const eventName = 'BookReader:' + name;
607
- $(document).trigger(eventName, props);
608
608
 
609
609
  utils.polyfillCustomEvent(window);
610
610
  window.dispatchEvent(new CustomEvent(eventName, {
@@ -612,6 +612,7 @@ BookReader.prototype.trigger = function(name, props = this) {
612
612
  composed: true,
613
613
  detail: { props },
614
614
  }));
615
+ $(document).trigger(eventName, props);
615
616
  };
616
617
 
617
618
  BookReader.prototype.bind = function(name, callback) {
@@ -1184,9 +1185,10 @@ BookReader.prototype.enterFullscreen = async function(bindKeyboardControls = tru
1184
1185
  }
1185
1186
 
1186
1187
  this.isFullscreenActive = true;
1188
+ // prioritize class updates so CSS can propagate
1189
+ this.updateBrClasses();
1187
1190
  this.animating = true;
1188
1191
  await new Promise(res => this.refs.$brContainer.animate({opacity: 1}, 'fast', 'linear', res));
1189
- this.resize();
1190
1192
  if (this.activeMode instanceof Mode1Up) {
1191
1193
  this.activeMode.mode1UpLit.scale = this.activeMode.mode1UpLit.computeDefaultScale(this._models.book.getPage(currentIndex));
1192
1194
  // Need the new scale to be applied before calling jumpToIndex
@@ -1198,7 +1200,14 @@ BookReader.prototype.enterFullscreen = async function(bindKeyboardControls = tru
1198
1200
  this.textSelectionPlugin?.stopPageFlip(this.refs.$brContainer);
1199
1201
  // Add "?view=theater"
1200
1202
  this.trigger(BookReader.eventNames.fragmentChange);
1203
+ // trigger event here, so that animations,
1204
+ // class updates happen before book-nav relays to web components
1201
1205
  this.trigger(BookReader.eventNames.fullscreenToggled);
1206
+
1207
+ setTimeout(() => {
1208
+ // resize book after all events & css updates
1209
+ this.resize();
1210
+ }, 0);
1202
1211
  };
1203
1212
 
1204
1213
  /**
@@ -1221,6 +1230,10 @@ BookReader.prototype.exitFullScreen = async function () {
1221
1230
  }
1222
1231
 
1223
1232
  this.isFullscreenActive = false;
1233
+ // Trigger fullscreen event immediately
1234
+ // so that book-nav can relay to web components
1235
+ this.trigger(BookReader.eventNames.fullscreenToggled);
1236
+
1224
1237
  this.updateBrClasses();
1225
1238
  this.animating = true;
1226
1239
  await new Promise((res => this.refs.$brContainer.animate({opacity: 1}, 'fast', 'linear', res)));
@@ -1236,7 +1249,6 @@ BookReader.prototype.exitFullScreen = async function () {
1236
1249
  this.textSelectionPlugin?.stopPageFlip(this.refs.$brContainer);
1237
1250
  // Remove "?view=theater"
1238
1251
  this.trigger(BookReader.eventNames.fragmentChange);
1239
- this.trigger(BookReader.eventNames.fullscreenToggled);
1240
1252
  };
1241
1253
 
1242
1254
  /**
@@ -2,7 +2,7 @@
2
2
  * Hide modal-manager that loads item-navigator-modal
3
3
  * loading bookmarks related alert messages
4
4
  */
5
- #item-navigator-modal {
5
+ modal-manager[mode="closed"] {
6
6
  display: none
7
7
  }
8
8