@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
@@ -0,0 +1,205 @@
1
+ /**
2
+ * BookReaderTemplate to load BookNavigator components
3
+ */
4
+
5
+ import { LitElement, html, css } from 'lit-element';
6
+
7
+ import '@internetarchive/ia-item-navigator';
8
+ import '../BookNavigator/book-navigator.js';
9
+ // eslint-disable-next-line no-unused-vars
10
+ import { ModalManager } from '@internetarchive/modal-manager';
11
+ import '@internetarchive/modal-manager';
12
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
13
+
14
+ export class IaBookReader extends LitElement {
15
+ static get properties() {
16
+ return {
17
+ item: { type: Object },
18
+ baseHost: { type: String },
19
+ signedIn: { type: Boolean },
20
+ fullscreen: { type: Boolean, reflect: true, attribute: true },
21
+ sharedObserver: { type: Object, attribute: false },
22
+ modal: { type: Object, attribute: false },
23
+ loaded: { type: Boolean },
24
+ menuShortcuts: { type: Array },
25
+ menuContents: { type: Array },
26
+ };
27
+ }
28
+
29
+ constructor() {
30
+ super();
31
+ this.item = undefined;
32
+ this.bookreader = undefined;
33
+ this.baseHost = 'https://archive.org';
34
+ this.fullscreen = false;
35
+ this.signedIn = false;
36
+ /** @type {ModalManager} */
37
+ this.modal = undefined;
38
+ /** @type {SharedResizeObserver} */
39
+ this.sharedObserver = undefined;
40
+ this.loaded = false;
41
+ this.menuShortcuts = [];
42
+ this.menuContents = [];
43
+ console.log("ia-bookreader constructor", this);
44
+ }
45
+
46
+ updated() {
47
+ if (!this.modal) {
48
+ this.modal = new ModalManager();
49
+ }
50
+
51
+ if (!this.sharedObserver) {
52
+ this.sharedObserver = new SharedResizeObserver();
53
+ }
54
+ }
55
+
56
+
57
+ manageFullscreen(e) {
58
+ const { detail } = e;
59
+ const fullscreen = !!detail.isFullScreen;
60
+ this.fullscreen = fullscreen;
61
+ }
62
+
63
+ loadingStateUpdated(e) {
64
+ const { loaded } = e.detail;
65
+ this.loaded = loaded || null;
66
+ this.dispatchEvent(new CustomEvent('loadingStateUpdated', { detail: { loaded }}));
67
+ }
68
+
69
+ setMenuShortcuts(e) {
70
+ this.menuShortcuts = [...e.detail];
71
+ }
72
+
73
+ setMenuContents(e) {
74
+ const updatedContents = [...e.detail];
75
+ this.menuContents = updatedContents;
76
+ }
77
+
78
+ manageSideMenuEvents(e) {
79
+ const { menuId, action } = e.detail;
80
+ if (!menuId) {
81
+ return;
82
+ }
83
+
84
+ if (action === 'open') {
85
+ this.itemNav.openShortcut(menuId);
86
+ this.openShortcut(menuId);
87
+ } else if (action === 'toggle') {
88
+ this.itemNav.openMenu(menuId);
89
+ this.itemNav.toggleMenu();
90
+ }
91
+ }
92
+
93
+ // LINER NOTES --- iaux.min.js is loading wayy to late for booknav listener, to br. init
94
+
95
+ render() {
96
+ console.log('ia-bookreader render & its itemNav: ', this.itemNav);
97
+ return html`
98
+ <div class="ia-bookreader">
99
+ <ia-item-navigator
100
+ ?viewportInFullscreen=${this.fullscreen}
101
+ .itemType=${'open'}
102
+ .basehost=${this.baseHost}
103
+ .item=${this.item}
104
+ .modal=${this.modal}
105
+ .loaded=${this.loaded}
106
+ .sharedObserver=${this.sharedObserver}
107
+ ?signedIn=${this.signedIn}
108
+ .menuShortcuts=${this.menuShortcuts}
109
+ .menuContents=${this.menuContents}
110
+ >
111
+ <div slot="theater-main">
112
+ <book-navigator
113
+ .modal=${this.modal}
114
+ .baseHost=${this.baseHost}
115
+ .itemMD=${this.item}
116
+ ?signedIn=${this.signedIn}
117
+ ?sideMenuOpen=${this.menuOpened}
118
+ .sharedObserver=${this.sharedObserver}
119
+ @ViewportInFullScreen=${this.manageFullscreen}
120
+ @loadingStateUpdated=${this.loadingStateUpdated}
121
+ @updateSideMenu=${this.manageSideMenuEvents}
122
+ @menuUpdated=${this.setMenuContents}
123
+ @menuShortcutsUpdated=${this.setMenuShortcuts}
124
+ >
125
+ <div slot="theater-main">
126
+ <slot name="theater-main"></slot>
127
+ </div>
128
+ </book-navigator>
129
+ </div>
130
+ </ia-item-navigator>
131
+ </div>
132
+ `;
133
+ }
134
+
135
+ static get styles() {
136
+ return css`
137
+ :host {
138
+ display: block;
139
+ height: inherit;
140
+ min-height: inherit;
141
+ --primaryBGColor: var(--black, #000);
142
+ --secondaryBGColor: #222;
143
+ --tertiaryBGColor: #333;
144
+ --primaryTextColor: var(--white, #fff);
145
+ --primaryCTAFill: #194880;
146
+ --primaryCTABorder: #c5d1df;
147
+ --secondaryCTAFill: #333;
148
+ --secondaryCTABorder: #999;
149
+ --primaryErrorCTAFill: #e51c26;
150
+ --primaryErrorCTABorder: #f8c6c8;
151
+ }
152
+
153
+ :host([fullscreen]),
154
+ ia-item-navigator[viewportinfullscreen] {
155
+ position: fixed;
156
+ inset: 0;
157
+ height: 100vh;
158
+ min-height: unset;
159
+ }
160
+
161
+ div[slot="theater-main"],
162
+ div[slot="theater-main"] > * {
163
+ height: inherit;
164
+ }
165
+
166
+ slot {
167
+ display: block;
168
+ }
169
+
170
+ .ia-bookreader {
171
+ background-color: var(--primaryBGColor);
172
+ position: relative;
173
+ min-height: inherit;
174
+ height: inherit;
175
+ }
176
+
177
+ ia-item-navigator {
178
+ min-height: var(--br-height, inherit);
179
+ height: var(--br-height, inherit);
180
+ display: block;
181
+ width: 100%;
182
+ color: var(--primaryTextColor);
183
+ --menuButtonLabelDisplay: block;
184
+ --menuWidth: 320px;
185
+ --menuSliderBg: var(--secondaryBGColor);
186
+ --activeButtonBg: var(--tertiaryBGColor);
187
+ --subpanelRightBorderColor: var(--secondaryCTABorder);
188
+ --animationTiming: 100ms;
189
+ --iconFillColor: var(--primaryTextColor);
190
+ --iconStrokeColor: var(--primaryTextColor);
191
+ --menuSliderHeaderIconHeight: 2rem;
192
+ --menuSliderHeaderIconWidth: 2rem;
193
+ --iconWidth: 2.4rem;
194
+ --iconHeight: 2.4rem;
195
+ --shareLinkColor: var(--primaryTextColor);
196
+ --shareIconBorder: var(--primaryTextColor);
197
+ --shareIconBg: var(--secondaryBGColor);
198
+ --activityIndicatorLoadingDotColor: var(--primaryTextColor);
199
+ --activityIndicatorLoadingRingColor: var(--primaryTextColor);
200
+ }
201
+ `;
202
+ }
203
+ }
204
+
205
+ window.customElements.define("ia-bookreader", IaBookReader);
@@ -61,14 +61,7 @@ BookReader.prototype.setup = (function (super_) {
61
61
  /** @type { {[pageIndex: number]: SearchInsideMatchBox[]} } */
62
62
  this._searchBoxesByIndex = {};
63
63
 
64
- if (this.searchView) { return; }
65
- this.searchView = new SearchView({
66
- br: this,
67
- searchCancelledCallback: () => {
68
- this._cancelSearch();
69
- this.trigger('SearchCanceled', { term: this.searchTerm, instance: this });
70
- }
71
- });
64
+ this.searchView = undefined;
72
65
  };
73
66
  })(BookReader.prototype.setup);
74
67
 
@@ -76,7 +69,14 @@ BookReader.prototype.setup = (function (super_) {
76
69
  BookReader.prototype.init = (function (super_) {
77
70
  return function () {
78
71
  super_.call(this);
79
-
72
+ // give SearchView the most complete bookreader state
73
+ this.searchView = new SearchView({
74
+ br: this,
75
+ searchCancelledCallback: () => {
76
+ this._cancelSearch();
77
+ this.trigger('SearchCanceled', { term: this.searchTerm, instance: this });
78
+ }
79
+ });
80
80
  if (this.options.enableSearch && this.options.initialSearchTerm) {
81
81
  /**
82
82
  * this.search() take two parameter
@@ -48,7 +48,8 @@ export class UrlPlugin {
48
48
  .map(schema => pathParams[schema.name] ? `${schema.name}/${pathParams[schema.name]}` : '')
49
49
  .join('/');
50
50
 
51
- const strStrippedTrailingSlash = `${strPathParams.replace(/\/$/, '')}`;
51
+ // replace consecutive slashes with a single slash + remove trailing slashes
52
+ const strStrippedTrailingSlash = `${strPathParams.replace(/\/+/g, '/').replace(/\/+$/, '')}`;
52
53
  const concatenatedPath = `${strStrippedTrailingSlash}?${searchParams.toString()}`;
53
54
  return searchParams.toString() ? concatenatedPath : `${strStrippedTrailingSlash}`;
54
55
  }
@@ -79,9 +80,6 @@ export class UrlPlugin {
79
80
  this.urlSchema
80
81
  .filter(schema => schema.position == 'path')
81
82
  .forEach(schema => {
82
- if (!urlStrSplitSlashObj[schema.name] && schema.default) {
83
- return urlState[schema.name] = schema.default;
84
- }
85
83
  const hasPropertyKey = doesKeyExists(urlStrSplitSlashObj, schema.name);
86
84
  const hasDeprecatedKey = doesKeyExists(schema, 'deprecated_for') && hasPropertyKey;
87
85
 
@@ -139,13 +137,14 @@ export class UrlPlugin {
139
137
  */
140
138
  pushToAddressBar() {
141
139
  const urlStrPath = this.urlStateToUrlString(this.urlState);
140
+ const concatenatedPath = urlStrPath !== '/' ? urlStrPath : '';
142
141
  if (this.urlMode == 'history') {
143
142
  if (window.history && window.history.replaceState) {
144
- const newUrlPath = `${this.urlHistoryBasePath}${urlStrPath}`;
143
+ const newUrlPath = `${this.urlHistoryBasePath}${concatenatedPath}`;
145
144
  window.history.replaceState({}, null, newUrlPath);
146
145
  }
147
146
  } else {
148
- window.location.replace('#' + urlStrPath);
147
+ window.location.replace('#' + concatenatedPath);
149
148
  }
150
149
  this.oldLocationHash = urlStrPath;
151
150
  }
File without changes
@@ -1,17 +1,14 @@
1
1
  import { css, html, LitElement } from 'lit-element';
2
- import { nothing } from 'lit-html';
3
- import { ResizeObserver as roPolyfill } from '@juggle/resize-observer';
2
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
4
3
  import SearchProvider from './search/search-provider.js';
5
4
  import DownloadProvider from './downloads/downloads-provider.js';
6
5
  import VisualAdjustmentProvider from './visual-adjustments/visual-adjustments-provider.js';
7
6
  import BookmarksProvider from './bookmarks/bookmarks-provider.js';
8
- import SharingProvider from '../ItemNavigator/providers/sharing.js';
7
+ import SharingProvider from './sharing.js';
9
8
  import VolumesProvider from './volumes/volumes-provider.js';
10
9
  import BRFullscreenMgr from './br-fullscreen-mgr.js';
11
10
  import { Book } from './BookModel.js';
12
- import bookLoader from './assets/book-loader.js';
13
-
14
- const ResizeObserver = window.ResizeObserver || roPolyfill;
11
+ import iaLogo from './assets/ia-logo.js';
15
12
 
16
13
  const events = {
17
14
  menuUpdated: 'menuUpdated',
@@ -35,6 +32,9 @@ export class BookNavigator extends LitElement {
35
32
  menuShortcuts: { type: Array },
36
33
  sideMenuOpen: { type: Boolean },
37
34
  signedIn: { type: Boolean },
35
+ sharedObserver: { type: Object },
36
+ fullscreenBranding: { type: Object },
37
+ addBranding: { type: Boolean },
38
38
  };
39
39
  }
40
40
 
@@ -54,12 +54,15 @@ export class BookNavigator extends LitElement {
54
54
  this.menuShortcuts = [];
55
55
  this.sideMenuOpen = false;
56
56
  this.signedIn = false;
57
-
57
+ this.modal = undefined;
58
+ this.sharedObserver = undefined;
59
+ this.fullscreenBranding = iaLogo;
60
+ this.addBranding = true;
58
61
  // Untracked properties
59
62
  this.fullscreenMgr = null;
60
- this.brResizeObserver = null;
63
+ this.sharedObserver = null;
61
64
  this.model = new Book();
62
- this.shortcutOrder = ['volumes', 'search', 'bookmarks'];
65
+ this.shortcutOrder = ['fullscreen', 'volumes', 'search', 'bookmarks'];
63
66
  }
64
67
 
65
68
  firstUpdated() {
@@ -72,13 +75,9 @@ export class BookNavigator extends LitElement {
72
75
  if (!this.bookreader) {
73
76
  return;
74
77
  }
75
- const isFirstSideMenuUpdate = changed.has('sideMenuOpen') && (changed.get('sideMenuOpen') === undefined);
76
- if (!isFirstSideMenuUpdate) {
77
- // realign image
78
- if (this.bookreader.animating) {
79
- return;
80
- }
81
- this.bookreader.resize();
78
+ if (changed.has('signedIn') || changed.has('isAdmin')) {
79
+ /** redraw book submenus to propagate property update */
80
+ this.initializeBookSubmenus();
82
81
  }
83
82
  }
84
83
 
@@ -104,6 +103,15 @@ export class BookNavigator extends LitElement {
104
103
  */
105
104
  initializeBookSubmenus() {
106
105
  const isBookProtected = this.bookreader.options.protected;
106
+
107
+ // const baseProviderConfig = {
108
+ // modal: this.modal,
109
+ // sharedObserver: this.sharedObserver,
110
+ // bookreader: this.bookreader,
111
+ // signedIn: this.signedIn,
112
+ // isAdmin: this.isAdmin,
113
+ // };
114
+
107
115
  this.menuProviders = {
108
116
  search: new SearchProvider(
109
117
  /**
@@ -138,7 +146,7 @@ export class BookNavigator extends LitElement {
138
146
  bookreader: this.bookreader,
139
147
  }),
140
148
  share: new SharingProvider(this.book.metadata, this.baseHost, this.itemType, this.bookreader.options.subPrefix),
141
- bookmarks: new BookmarksProvider(this.bookmarksOptions, this.bookreader),
149
+ bookmarks: new BookmarksProvider(this.bookmarksOptions),
142
150
  };
143
151
 
144
152
  // add shortcut for volumes if multipleBooksList exists
@@ -167,10 +175,17 @@ export class BookNavigator extends LitElement {
167
175
  const referrerStr = `referer=${encodeURIComponent(location.href)}`;
168
176
  return {
169
177
  loginUrl: `https://${this.baseHost}/account/login?${referrerStr}`,
178
+ signedIn: this.signedIn,
170
179
  displayMode: this.signedIn ? 'bookmarks' : 'login',
171
- showItemNavigatorModal: this.showItemNavigatorModal.bind(this),
172
- closeItemNavigatorModal: this.closeItemNavigatorModal.bind(this),
173
- onBookmarksChanged: (bookmarks) => {
180
+ isAdmin: this.isAdmin,
181
+ modal: this.modal,
182
+ sharedObserver: this.sharedObserver,
183
+ bookreader: this.bookreader,
184
+ onBookmarksChanged: (bookmarks, showSidePanel = false) => {
185
+ console.log('booknav on bkch', bookmarks, showSidePanel);
186
+ if (showSidePanel) {
187
+ this.updateSideMenu('bookmarks', 'open');
188
+ }
174
189
  const method = Object.keys(bookmarks).length ? 'add' : 'remove';
175
190
  this[`${method}MenuShortcut`]('bookmarks');
176
191
  this.updateMenuContents();
@@ -178,6 +193,42 @@ export class BookNavigator extends LitElement {
178
193
  };
179
194
  }
180
195
 
196
+ /** Fullscreen Shortcut */
197
+ addFullscreenShortcut() {
198
+ const closeFS = {
199
+ icon: this.fullscreenShortcut,
200
+ id: 'fullscreen',
201
+ };
202
+ this.menuShortcuts.push(closeFS);
203
+ this.sortMenuShortcuts();
204
+ this.emitMenuShortcutsUpdated();
205
+ }
206
+
207
+ deleteFullscreenShortcut() {
208
+ console.log('delete fullscreenshortcut', this.menuShortcuts);
209
+ const updatedShortcuts = this.menuShortcuts.filter(({ id }) => {
210
+ return id !== 'fullscreen';
211
+ });
212
+ console.log('updatedShortcuts', updatedShortcuts);
213
+ this.menuShortcuts = updatedShortcuts;
214
+ this.sortMenuShortcuts();
215
+ this.emitMenuShortcutsUpdated();
216
+ }
217
+
218
+ closeFullscreen() {
219
+ this.bookreader.exitFullScreen();
220
+ }
221
+
222
+ get fullscreenShortcut() {
223
+ return html`
224
+ <button
225
+ @click=${() => this.closeFullscreen()}
226
+ title="Exit fullscreen view"
227
+ >${this.fullscreenBranding}</button>
228
+ `;
229
+ }
230
+ /** End Fullscreen Shortcut */
231
+
181
232
  /**
182
233
  * Open side menu
183
234
  * @param {string} menuId
@@ -205,7 +256,7 @@ export class BookNavigator extends LitElement {
205
256
  const availableMenus = [volumes, search, bookmarks, visualAdjustments, share].filter((menu) => !!menu);
206
257
 
207
258
  if (this.shouldShowDownloadsMenu()) {
208
- downloads.update(this.downloadableTypes);
259
+ downloads?.update(this.downloadableTypes);
209
260
  availableMenus.splice(1, 0, downloads);
210
261
  }
211
262
 
@@ -278,6 +329,13 @@ export class BookNavigator extends LitElement {
278
329
  this.dispatchEvent(event);
279
330
  }
280
331
 
332
+ emitLoadingStatusUpdate(loaded) {
333
+ const event = new CustomEvent('loadingStateUpdated', {
334
+ detail: { loaded },
335
+ });
336
+ this.dispatchEvent(event);
337
+ }
338
+
281
339
  /**
282
340
  * Core bookreader event handler registry
283
341
  *
@@ -286,22 +344,28 @@ export class BookNavigator extends LitElement {
286
344
  */
287
345
  bindEventListeners() {
288
346
  window.addEventListener('BookReader:PostInit', (e) => {
347
+ console.log('BookReader:PostInit');
289
348
  this.bookreader = e.detail.props;
290
349
  this.bookReaderLoaded = true;
291
350
  this.bookReaderCannotLoad = false;
292
351
  this.fullscreenMgr = new BRFullscreenMgr(this.bookreader.el);
293
352
 
294
353
  this.initializeBookSubmenus();
295
- setTimeout(() => this.bookreader.resize(), 0);
296
- this.brResizeObserver = new ResizeObserver((elements) => this.reactToBrResize(elements));
297
- this.brResizeObserver.observe(this.mainBRContainer);
354
+ this.startResizeObserver();
355
+ this.emitLoadingStatusUpdate(true);
298
356
  });
299
357
  window.addEventListener('BookReader:fullscreenToggled', (event) => {
358
+ console.log('BookReader:fullscreenToggled');
300
359
  const { detail: { props: brInstance = null } } = event;
301
360
  if (brInstance) {
302
361
  this.bookreader = brInstance;
303
362
  }
304
363
  this.manageFullScreenBehavior(event);
364
+ if (this.bookreader.isFullscreenActive) {
365
+ this.addFullscreenShortcut();
366
+ } else {
367
+ this.deleteFullscreenShortcut();
368
+ }
305
369
  }, { passive: true });
306
370
  window.addEventListener('BookReader:ToggleSearchMenu', (event) => {
307
371
  this.dispatchEvent(new CustomEvent(events.updateSideMenu, {
@@ -309,6 +373,7 @@ export class BookNavigator extends LitElement {
309
373
  }));
310
374
  });
311
375
  window.addEventListener('LendingFlow:PostInit', ({ detail }) => {
376
+ console.log('LendingFlow:PostInit');
312
377
  const {
313
378
  downloadTypesAvailable, lendingStatus, isAdmin, previewType,
314
379
  } = detail;
@@ -319,6 +384,8 @@ export class BookNavigator extends LitElement {
319
384
  this.bookReaderCannotLoad = previewType === 'singlePagePreview';
320
385
  });
321
386
  window.addEventListener('BRJSIA:PostInit', ({ detail }) => {
387
+ console.log('BRJSIA:PostInit');
388
+
322
389
  const { isRestricted, downloadURLs } = detail;
323
390
  this.bookReaderLoaded = true;
324
391
  this.downloadableTypes = downloadURLs;
@@ -332,17 +399,16 @@ export class BookNavigator extends LitElement {
332
399
  * - book animation is happening
333
400
  * - book is in fullscreen (fullscreen is handled separately)
334
401
  *
335
- * @param { Object } entries - resize observer entries
402
+ * @param { target: HTMLElement, contentRect: DOMRectReadOnly } entry
336
403
  */
337
- reactToBrResize(entries = []) {
404
+ handleResize({ contentRect, target }) {
338
405
  const startBrWidth = this.brWidth;
339
406
  const { animating } = this.bookreader;
340
407
 
341
- entries.forEach(({ contentRect, target }) => {
342
- if (target === this.mainBRContainer) {
343
- this.brWidth = contentRect.width;
344
- }
345
- });
408
+ if (target === this.mainBRContainer) {
409
+ this.brWidth = contentRect.width;
410
+ }
411
+
346
412
  setTimeout(() => {
347
413
  if (startBrWidth && !animating) {
348
414
  this.bookreader.resize();
@@ -350,6 +416,17 @@ export class BookNavigator extends LitElement {
350
416
  }, 0);
351
417
  }
352
418
 
419
+ async startResizeObserver() {
420
+ if (!this.sharedObserver) {
421
+ this.sharedObserver = new SharedResizeObserver();
422
+ }
423
+
424
+ this.sharedObserver?.addObserver({
425
+ handler: this,
426
+ target: this.mainBRContainer,
427
+ });
428
+ }
429
+
353
430
  /**
354
431
  * Manages Fullscreen behavior
355
432
  * This makes sure that controls are _always_ in view
@@ -357,7 +434,6 @@ export class BookNavigator extends LitElement {
357
434
  */
358
435
  manageFullScreenBehavior() {
359
436
  this.emitFullScreenState();
360
-
361
437
  if (!this.bookreader.isFullscreen()) {
362
438
  this.fullscreenMgr.teardown();
363
439
  } else {
@@ -376,32 +452,6 @@ export class BookNavigator extends LitElement {
376
452
  this.dispatchEvent(event);
377
453
  }
378
454
 
379
- emitShowItemNavigatorModal(e) {
380
- this.dispatchEvent(new CustomEvent('showItemNavigatorModal', {
381
- detail: e.detail,
382
- }));
383
- }
384
-
385
- emitCloseItemNavigatorModal() {
386
- this.dispatchEvent(new CustomEvent('closeItemNavigatorModal'));
387
- }
388
-
389
- showItemNavigatorModal(e) {
390
- this.emitShowItemNavigatorModal(e);
391
- }
392
-
393
- closeItemNavigatorModal() {
394
- this.emitCloseItemNavigatorModal();
395
- }
396
-
397
- get loader() {
398
- const loader = html`
399
- <div class="book-loader">${bookLoader}<div>
400
- <h3>Loading viewer</h3>
401
- `;
402
- return !this.bookReaderLoaded ? loader : nothing;
403
- }
404
-
405
455
  get loadingClass() {
406
456
  return !this.bookReaderLoaded ? 'loading' : '';
407
457
  }
@@ -415,56 +465,13 @@ export class BookNavigator extends LitElement {
415
465
  const placeholder = this.bookReaderCannotLoad ? this.itemImage : this.loader;
416
466
  return html`<div id="book-navigator" class="${this.loadingClass}">
417
467
  ${placeholder}
418
- <slot name="bookreader"></slot>
468
+ <slot name="theater-main"></slot>
419
469
  </div>
420
470
  `;
421
471
  }
422
472
 
423
473
  static get styles() {
424
474
  return css`
425
- #book-navigator.loading {
426
- display: flex;
427
- align-items: center;
428
- justify-content: center;
429
- min-height: 30vh;
430
- }
431
-
432
- #book-navigator .book-loader {
433
- width: 30%;
434
- margin: auto;
435
- text-align: center;
436
- color: var(--primaryTextColor);
437
- }
438
-
439
- .book-loader {
440
- position: relative;
441
- }
442
-
443
- .book-loader svg {
444
- display: block;
445
- width: 60%;
446
- max-width: 100px;
447
- height: auto;
448
- margin: auto;
449
- }
450
-
451
- svg * {
452
- fill: var(--primaryTextColor);
453
- }
454
-
455
- svg .ring {
456
- animation: rotate 1.3s infinite linear;
457
- transform-origin: 50px 50px;
458
- transform-box: fill-box;
459
- display: block; // transform won't work on inline style
460
- }
461
-
462
- @keyframes rotate {
463
- 0% {
464
- transform: rotate(-360deg);
465
- }
466
- }
467
-
468
475
  .cover-img {
469
476
  max-height: 300px;
470
477
  }
@@ -0,0 +1,15 @@
1
+ import { css } from 'lit-element';
2
+
3
+ export default css`
4
+ .blue {
5
+ --iconFillColor: var(--blueBookmarkColor, #0023f5);
6
+ }
7
+
8
+ .red {
9
+ --iconFillColor: var(--redBookmarkColor, #eb3223);
10
+ }
11
+
12
+ .green {
13
+ --iconFillColor: var(--greenBookmarkColor, #75ef4c);
14
+ }
15
+ `;