@internetarchive/bookreader 5.0.0-12-fixsorting-8 → 5.0.0-120

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 (420) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +670 -1190
  4. package/BookReader/bergamot-translator-worker.js +2966 -0
  5. package/BookReader/bergamot-translator-worker.wasm +0 -0
  6. package/BookReader/hypothesis/LICENSE +50 -0
  7. package/BookReader/hypothesis/README.md +55 -0
  8. package/BookReader/hypothesis/build/boot-template.js +1 -0
  9. package/BookReader/hypothesis/build/boot.js +1 -0
  10. package/BookReader/hypothesis/build/manifest.json +20 -0
  11. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +199 -0
  12. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  13. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +811 -0
  14. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +437 -0
  16. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/styles/annotator.css +4 -0
  18. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  19. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  20. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  40. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  41. package/BookReader/hypothesis/build/styles/katex.min.css +3 -0
  42. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +14 -0
  44. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/sidebar.css +4 -0
  46. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/ui-playground.css +4 -0
  48. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  49. package/BookReader/hypothesis/package.json +126 -0
  50. package/BookReader/ia-bookreader.js +1886 -0
  51. package/BookReader/{BookReader.js.LICENSE.txt → ia-bookreader.js.LICENSE.txt} +26 -20
  52. package/BookReader/ia-bookreader.js.map +1 -0
  53. package/BookReader/icons/1up.svg +1 -12
  54. package/BookReader/icons/2up.svg +1 -15
  55. package/BookReader/icons/advance.svg +3 -26
  56. package/BookReader/icons/chevron-right.svg +1 -1
  57. package/BookReader/icons/close-circle-dark.svg +1 -1
  58. package/BookReader/icons/close-circle.svg +1 -1
  59. package/BookReader/icons/fullscreen.svg +1 -17
  60. package/BookReader/icons/fullscreen_exit.svg +1 -17
  61. package/BookReader/icons/hamburger.svg +1 -15
  62. package/BookReader/icons/left-arrow.svg +1 -12
  63. package/BookReader/icons/magnify-minus.svg +1 -16
  64. package/BookReader/icons/magnify-plus.svg +1 -17
  65. package/BookReader/icons/magnify.svg +1 -15
  66. package/BookReader/icons/pause.svg +1 -23
  67. package/BookReader/icons/play.svg +1 -22
  68. package/BookReader/icons/playback-speed.svg +1 -34
  69. package/BookReader/icons/read-aloud.svg +1 -22
  70. package/BookReader/icons/review.svg +3 -22
  71. package/BookReader/icons/slider-toggle.svg +1 -0
  72. package/BookReader/icons/thumbnails.svg +1 -17
  73. package/BookReader/icons/voice.svg +1 -0
  74. package/BookReader/icons/volume-full.svg +1 -22
  75. package/BookReader/images/BRicons.svg +5 -94
  76. package/BookReader/images/books_graphic.svg +1 -177
  77. package/BookReader/images/hypothesis.ico +0 -0
  78. package/BookReader/images/icon_book.svg +1 -12
  79. package/BookReader/images/icon_bookmark.svg +1 -12
  80. package/BookReader/images/icon_experiment.svg +1 -0
  81. package/BookReader/images/icon_gear.svg +1 -14
  82. package/BookReader/images/icon_hamburger.svg +1 -20
  83. package/BookReader/images/icon_home.svg +1 -21
  84. package/BookReader/images/icon_info.svg +1 -11
  85. package/BookReader/images/icon_one_page.svg +1 -8
  86. package/BookReader/images/icon_pause.svg +1 -1
  87. package/BookReader/images/icon_play.svg +1 -1
  88. package/BookReader/images/icon_playback-rate.svg +1 -15
  89. package/BookReader/images/icon_search_button.svg +1 -8
  90. package/BookReader/images/icon_share.svg +1 -9
  91. package/BookReader/images/icon_skip-ahead.svg +1 -6
  92. package/BookReader/images/icon_skip-back.svg +2 -13
  93. package/BookReader/images/icon_speaker.svg +1 -18
  94. package/BookReader/images/icon_speaker_open.svg +1 -10
  95. package/BookReader/images/icon_thumbnails.svg +1 -12
  96. package/BookReader/images/icon_toc.svg +1 -5
  97. package/BookReader/images/icon_two_pages.svg +1 -9
  98. package/BookReader/images/marker_chap-off.svg +1 -11
  99. package/BookReader/images/marker_chap-on.svg +1 -11
  100. package/BookReader/images/marker_srch-on.svg +1 -11
  101. package/BookReader/images/translate.svg +1 -0
  102. package/BookReader/images/unviewable_page.png +0 -0
  103. package/BookReader/jquery-3.js +2 -0
  104. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  105. package/BookReader/plugins/plugin.archive_analytics.js +1 -172
  106. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  107. package/BookReader/plugins/plugin.autoplay.js +1 -165
  108. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  109. package/BookReader/plugins/plugin.chapters.js +19 -301
  110. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  111. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  112. package/BookReader/plugins/plugin.experiments.js +3 -0
  113. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  114. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  115. package/BookReader/plugins/plugin.iframe.js +1 -74
  116. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  117. package/BookReader/plugins/plugin.iiif.js +2 -0
  118. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  119. package/BookReader/plugins/plugin.resume.js +1 -368
  120. package/BookReader/plugins/plugin.resume.js.map +1 -1
  121. package/BookReader/plugins/plugin.search.js +2 -1385
  122. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  123. package/BookReader/plugins/plugin.search.js.map +1 -1
  124. package/BookReader/plugins/plugin.text_selection.js +2 -1080
  125. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  126. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  127. package/BookReader/plugins/plugin.translate.js +3 -0
  128. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  129. package/BookReader/plugins/plugin.translate.js.map +1 -0
  130. package/BookReader/plugins/plugin.tts.js +2 -9193
  131. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  132. package/BookReader/plugins/plugin.tts.js.map +1 -1
  133. package/BookReader/plugins/plugin.url.js +1 -269
  134. package/BookReader/plugins/plugin.url.js.map +1 -1
  135. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  136. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  137. package/BookReader/plugins/translator-worker.js +2 -0
  138. package/BookReader/plugins/translator-worker.js.map +1 -0
  139. package/BookReader/silence.mp3 +0 -0
  140. package/BookReader/translator-worker.js +475 -0
  141. package/BookReader/webcomponents-bundle.js +3 -0
  142. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  143. package/BookReader/webcomponents-bundle.js.map +1 -0
  144. package/README.md +17 -4
  145. package/dist/esm/ia-bookreader.js +3 -0
  146. package/dist/esm/ia-bookreader.js.LICENSE.txt +17 -0
  147. package/dist/esm/ia-bookreader.js.map +1 -0
  148. package/dist/esm/plugins/plugin.archive_analytics.js +2 -0
  149. package/dist/esm/plugins/plugin.archive_analytics.js.map +1 -0
  150. package/dist/esm/plugins/plugin.autoplay.js +2 -0
  151. package/dist/esm/plugins/plugin.autoplay.js.map +1 -0
  152. package/dist/esm/plugins/plugin.chapters.js +2 -0
  153. package/dist/esm/plugins/plugin.chapters.js.map +1 -0
  154. package/dist/esm/plugins/plugin.experiments.js +2 -0
  155. package/dist/esm/plugins/plugin.experiments.js.map +1 -0
  156. package/dist/esm/plugins/plugin.iframe.js +2 -0
  157. package/dist/esm/plugins/plugin.iframe.js.map +1 -0
  158. package/dist/esm/plugins/plugin.iiif.js +2 -0
  159. package/dist/esm/plugins/plugin.iiif.js.map +1 -0
  160. package/dist/esm/plugins/plugin.resume.js +2 -0
  161. package/dist/esm/plugins/plugin.resume.js.map +1 -0
  162. package/dist/esm/plugins/plugin.search.js +2 -0
  163. package/dist/esm/plugins/plugin.search.js.map +1 -0
  164. package/dist/esm/plugins/plugin.text_selection.js +2 -0
  165. package/dist/esm/plugins/plugin.text_selection.js.map +1 -0
  166. package/dist/esm/plugins/plugin.translate.js +2 -0
  167. package/dist/esm/plugins/plugin.translate.js.map +1 -0
  168. package/dist/esm/plugins/plugin.tts.js +2 -0
  169. package/dist/esm/plugins/plugin.tts.js.map +1 -0
  170. package/dist/esm/plugins/plugin.url.js +2 -0
  171. package/dist/esm/plugins/plugin.url.js.map +1 -0
  172. package/dist/esm/plugins/plugin.vendor-fullscreen.js +2 -0
  173. package/dist/esm/plugins/plugin.vendor-fullscreen.js.map +1 -0
  174. package/jsconfig.json +18 -0
  175. package/package.json +113 -71
  176. package/src/BookReader/BookModel.js +92 -46
  177. package/src/BookReader/DragScrollable.js +233 -0
  178. package/src/BookReader/ImageCache.js +49 -16
  179. package/src/BookReader/Mode1Up.js +66 -365
  180. package/src/BookReader/Mode1UpLit.js +392 -0
  181. package/src/BookReader/Mode2Up.js +87 -1315
  182. package/src/BookReader/Mode2UpLit.js +786 -0
  183. package/src/BookReader/ModeAbstract.js +43 -0
  184. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  185. package/src/BookReader/ModeSmoothZoom.js +312 -0
  186. package/src/BookReader/ModeThumb.js +29 -15
  187. package/src/BookReader/Navbar/Navbar.js +204 -84
  188. package/src/BookReader/PageContainer.js +120 -23
  189. package/src/BookReader/ReduceSet.js +2 -2
  190. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  191. package/src/BookReader/events.js +3 -3
  192. package/src/BookReader/options.js +105 -18
  193. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  194. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  195. package/src/BookReader/utils/SelectionObserver.js +72 -0
  196. package/src/BookReader/utils/classes.js +1 -1
  197. package/src/BookReader/utils.js +136 -12
  198. package/src/BookReader.js +732 -1231
  199. package/src/BookReaderPlugin.js +52 -0
  200. package/src/assets/icons/magnify-minus.svg +3 -7
  201. package/src/assets/icons/magnify-plus.svg +3 -7
  202. package/src/assets/icons/slider-toggle.svg +1 -0
  203. package/src/assets/icons/voice.svg +1 -0
  204. package/src/assets/images/hypothesis.ico +0 -0
  205. package/src/assets/images/icon_experiment.svg +1 -0
  206. package/src/assets/images/translate.svg +1 -0
  207. package/src/assets/images/unviewable_page.png +0 -0
  208. package/src/assets/silence.mp3 +0 -0
  209. package/src/css/BookReader.scss +1 -5
  210. package/src/css/_BRBookmarks.scss +1 -1
  211. package/src/css/_BRComponent.scss +1 -1
  212. package/src/css/_BRicon.scss +8 -2
  213. package/src/css/_BRmain.scss +16 -3
  214. package/src/css/_BRnav.scss +74 -70
  215. package/src/css/_BRpages.scss +174 -42
  216. package/src/css/_BRsearch.scss +69 -30
  217. package/src/css/_BRtoolbar.scss +5 -5
  218. package/src/css/_TextSelection.scss +249 -25
  219. package/src/css/_colorbox.scss +2 -2
  220. package/src/css/_controls.scss +24 -7
  221. package/src/css/_icons.scss +8 -1
  222. package/src/{BookNavigator/assets → css}/button-base.js +2 -2
  223. package/src/css/icon_checkmark.js +9 -0
  224. package/src/css/sharedStyles.js +15 -0
  225. package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
  226. package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
  227. package/src/ia-bookreader/ia-bookreader.js +686 -0
  228. package/src/ia-bookreader/sharing.js +27 -0
  229. package/src/ia-bookreader/viewable-files.js +98 -0
  230. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
  231. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
  232. package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
  233. package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
  234. package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
  235. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  236. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
  237. package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
  238. package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
  239. package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
  240. package/src/plugins/plugin.archive_analytics.js +84 -78
  241. package/src/plugins/plugin.autoplay.js +99 -104
  242. package/src/plugins/plugin.chapters.js +323 -205
  243. package/src/plugins/plugin.experiments.js +375 -0
  244. package/src/plugins/plugin.iframe.js +36 -37
  245. package/src/plugins/plugin.iiif.js +147 -0
  246. package/src/plugins/plugin.resume.js +54 -51
  247. package/src/plugins/plugin.text_selection.js +464 -219
  248. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  249. package/src/plugins/search/plugin.search.js +347 -397
  250. package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
  251. package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
  252. package/src/plugins/search/utils.js +50 -0
  253. package/src/plugins/search/view.js +51 -69
  254. package/src/plugins/translate/TranslationManager.js +164 -0
  255. package/src/plugins/translate/plugin.translate.js +559 -0
  256. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  257. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  258. package/src/plugins/tts/PageChunk.js +117 -23
  259. package/src/plugins/tts/PageChunkIterator.js +11 -17
  260. package/src/plugins/tts/WebTTSEngine.js +132 -92
  261. package/src/plugins/tts/plugin.tts.js +341 -351
  262. package/src/plugins/tts/utils.js +76 -67
  263. package/src/plugins/url/UrlPlugin.js +213 -0
  264. package/src/plugins/{plugin.url.js → url/plugin.url.js} +54 -18
  265. package/src/util/TextSelectionManager.js +1464 -0
  266. package/src/util/browserSniffing.js +42 -1
  267. package/src/util/cache.js +20 -0
  268. package/src/util/docCookies.js +21 -2
  269. package/src/util/dom.js +88 -0
  270. package/src/util/generators.js +89 -0
  271. package/src/util/lit.js +15 -0
  272. package/src/util/strings.js +11 -0
  273. package/.babelrc +0 -12
  274. package/.dependabot/config.yml +0 -6
  275. package/.eslintrc.js +0 -50
  276. package/.gitattributes +0 -2
  277. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  278. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  279. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  280. package/.github/workflows/node.js.yml +0 -37
  281. package/.github/workflows/npm-publish.yml +0 -47
  282. package/.testcaferc.json +0 -5
  283. package/BookReader/BookReader.js +0 -21613
  284. package/BookReader/BookReader.js.map +0 -1
  285. package/BookReader/bookreader-component-bundle.js +0 -14497
  286. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  287. package/BookReader/bookreader-component-bundle.js.map +0 -1
  288. package/BookReader/jquery-1.10.1.js +0 -108
  289. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  290. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  291. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  292. package/BookReader/plugins/plugin.mobile_nav.js +0 -335
  293. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  294. package/BookReaderDemo/BookReaderDemo.css +0 -41
  295. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  296. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  297. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  298. package/BookReaderDemo/IIIFBookReader.js +0 -207
  299. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  300. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  301. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  302. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  303. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  304. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  305. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  306. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  307. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  308. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  309. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  310. package/BookReaderDemo/demo-advanced.html +0 -33
  311. package/BookReaderDemo/demo-autoplay.html +0 -38
  312. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  313. package/BookReaderDemo/demo-embed.html +0 -26
  314. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  315. package/BookReaderDemo/demo-fullscreen.html +0 -33
  316. package/BookReaderDemo/demo-iiif.html +0 -34
  317. package/BookReaderDemo/demo-iiif.js +0 -26
  318. package/BookReaderDemo/demo-internetarchive.html +0 -74
  319. package/BookReaderDemo/demo-multiple.html +0 -43
  320. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  321. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  322. package/BookReaderDemo/demo-simple.html +0 -34
  323. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  324. package/BookReaderDemo/immersion-1up.html +0 -64
  325. package/BookReaderDemo/immersion-mode.html +0 -35
  326. package/BookReaderDemo/toggle_controls.html +0 -53
  327. package/BookReaderDemo/view_mode.html +0 -39
  328. package/BookReaderDemo/viewmode-cycle.html +0 -41
  329. package/CHANGELOG.md +0 -499
  330. package/CONTRIBUTING.md +0 -7
  331. package/codecov.yml +0 -17
  332. package/index.html +0 -31
  333. package/karma.conf.js +0 -23
  334. package/screenshot.png +0 -0
  335. package/scripts/postversion.js +0 -10
  336. package/scripts/preversion.js +0 -14
  337. package/scripts/version.js +0 -26
  338. package/src/BookNavigator/BookModel.js +0 -14
  339. package/src/BookNavigator/BookNavigator.js +0 -459
  340. package/src/BookNavigator/assets/book-loader.js +0 -27
  341. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  342. package/src/BookNavigator/assets/icon_close.js +0 -3
  343. package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
  344. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  345. package/src/BookNavigator/assets/icon_sort_neutral.js +0 -5
  346. package/src/BookNavigator/assets/icon_volumes.js +0 -11
  347. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  348. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  349. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  350. package/src/BookNavigator/search/a-search-result.js +0 -55
  351. package/src/BookNavigator/volumes/volumes-provider.js +0 -83
  352. package/src/BookNavigator/volumes/volumes.js +0 -178
  353. package/src/BookReader/DebugConsole.js +0 -54
  354. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  355. package/src/ItemNavigator/ItemNavigator.js +0 -376
  356. package/src/ItemNavigator/providers/sharing.js +0 -33
  357. package/src/css/_MobileNav.scss +0 -194
  358. package/src/dragscrollable-br.js +0 -261
  359. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  360. package/src/plugins/plugin.mobile_nav.js +0 -287
  361. package/tests/BookReader/BookModel.test.js +0 -312
  362. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  363. package/tests/BookReader/DebugConsole.test.js +0 -25
  364. package/tests/BookReader/ImageCache.test.js +0 -150
  365. package/tests/BookReader/Mode1Up.test.js +0 -164
  366. package/tests/BookReader/Mode2Up.test.js +0 -247
  367. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  368. package/tests/BookReader/PageContainer.test.js +0 -115
  369. package/tests/BookReader/ReduceSet.test.js +0 -38
  370. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  371. package/tests/BookReader/utils/classes.test.js +0 -88
  372. package/tests/BookReader/utils.test.js +0 -109
  373. package/tests/BookReader.options.test.js +0 -39
  374. package/tests/BookReader.test.js +0 -301
  375. package/tests/e2e/README.md +0 -75
  376. package/tests/e2e/autoplay.test.js +0 -13
  377. package/tests/e2e/base.test.js +0 -35
  378. package/tests/e2e/helpers/base.js +0 -263
  379. package/tests/e2e/helpers/debug.js +0 -13
  380. package/tests/e2e/helpers/desktopSearch.js +0 -72
  381. package/tests/e2e/helpers/mobileSearch.js +0 -85
  382. package/tests/e2e/helpers/mockSearch.js +0 -93
  383. package/tests/e2e/helpers/rightToLeft.js +0 -29
  384. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  385. package/tests/e2e/models/BookReader.js +0 -11
  386. package/tests/e2e/models/Navigation.js +0 -56
  387. package/tests/e2e/rightToLeft.test.js +0 -20
  388. package/tests/e2e/viewmode.test.js +0 -37
  389. package/tests/karma/BookNavigator/book-navigator.test.js +0 -139
  390. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  391. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  392. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  393. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  394. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +0 -40
  395. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  396. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +0 -141
  397. package/tests/karma/BookNavigator/volumes/volumes.test.js +0 -98
  398. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  399. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  400. package/tests/plugins/plugin.autoplay.test.js +0 -52
  401. package/tests/plugins/plugin.chapters.test.js +0 -130
  402. package/tests/plugins/plugin.iframe.test.js +0 -42
  403. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  404. package/tests/plugins/plugin.resume.test.js +0 -98
  405. package/tests/plugins/plugin.text_selection.test.js +0 -203
  406. package/tests/plugins/plugin.url.test.js +0 -129
  407. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  408. package/tests/plugins/search/plugin.search.test.js +0 -173
  409. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  410. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  411. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  412. package/tests/plugins/tts/PageChunk.test.js +0 -57
  413. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  414. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  415. package/tests/plugins/tts/utils.test.js +0 -133
  416. package/tests/util/browserSniffing.test.js +0 -56
  417. package/tests/util/docCookies.test.js +0 -15
  418. package/tests/util/strings.test.js +0 -63
  419. package/tests/utils.js +0 -42
  420. package/webpack.config.js +0 -86
@@ -0,0 +1,686 @@
1
+ // @ts-check
2
+ /**
3
+ * Wrapping web component for Internet Archive's BookReader. Currently operates
4
+ * more as a shell ; requires BookReader to be instantiated independently in the
5
+ * main slot.
6
+ */
7
+
8
+ import { LitElement, html, css } from 'lit';
9
+
10
+ // Loads the BookReader core (defines window.BookReader), so this is the one entrypoint
11
+ import '../BookReader.js';
12
+ import '@internetarchive/ia-item-navigator';
13
+ import '@internetarchive/modal-manager';
14
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
15
+ import '@internetarchive/icon-ia-logo';
16
+ import SearchProvider from '../plugins/search/search-provider.js';
17
+ import DownloadProvider from './downloads/downloads-provider.js';
18
+ import VisualAdjustmentProvider from './visual-adjustments/visual-adjustments-provider.js';
19
+ import BookmarksProvider from '../plugins/bookmarks/bookmarks-provider.js';
20
+ import SharingProvider from './sharing.js';
21
+ import ViewableFilesProvider from './viewable-files.js';
22
+ import { sortBy } from '../BookReader/utils.js';
23
+ /** @typedef {import('@/src/BookReader.js').default} BookReader */
24
+ /** @typedef {import('@internetarchive/modal-manager').ModalManager} ModalManager */
25
+
26
+
27
+ export class IaBookReader extends LitElement {
28
+ static get properties() {
29
+ return {
30
+ item: { type: Object },
31
+ baseHost: { type: String },
32
+ signedIn: { type: Boolean },
33
+ fullscreen: { type: Boolean, reflect: true, attribute: true },
34
+ sharedObserver: { type: Object, attribute: false },
35
+ modal: { type: Object, attribute: false },
36
+ loaded: { type: Boolean },
37
+ menuShortcuts: { type: Array },
38
+ menuContents: { type: Array },
39
+ bookReaderLoaded: { type: Boolean },
40
+ bookreader: { type: Object },
41
+ bookIsRestricted: { type: Boolean },
42
+ downloadableTypes: { type: Array },
43
+ isAdmin: { type: Boolean },
44
+ lendingInitialized: { type: Boolean },
45
+ lendingStatus: { type: Object },
46
+ menuProviders: { type: Object },
47
+ fullscreenBranding: { type: Object },
48
+ };
49
+ }
50
+
51
+ /** @type {import('@internetarchive/ia-item-navigator').ItemNavigator} */
52
+ get itemNav() {
53
+ return this.shadowRoot.querySelector('iaux-item-navigator');
54
+ }
55
+
56
+ constructor() {
57
+ super();
58
+ /** The IA metadata item */
59
+ this.item = undefined;
60
+ /** @type {BookReader} */
61
+ this.bookreader = undefined;
62
+ this.baseHost = 'archive.org';
63
+ this.fullscreen = false;
64
+ this.signedIn = false;
65
+ /** @type {ModalManager} */
66
+ this.modal = undefined;
67
+ /** @type {SharedResizeObserver} */
68
+ this.sharedObserver = undefined;
69
+ this.loaded = false;
70
+ /** @type {Array<{ id: string, icon: string | import('lit').TemplateResult }>} */
71
+ this.menuShortcuts = [];
72
+ this.menuContents = [];
73
+ this.openMenuName = '';
74
+
75
+ this.bookReaderCannotLoad = false;
76
+ this.bookReaderLoaded = false;
77
+ this.bookIsRestricted = false;
78
+ this.downloadableTypes = [];
79
+ this.isAdmin = false;
80
+ this.lendingInitialized = false;
81
+ this.lendingStatus = {};
82
+ this.menuProviders = {
83
+ /** @type {BookmarksProvider} */
84
+ bookmarks: null,
85
+ /** @type {SearchProvider} */
86
+ search: null,
87
+ /** @type {DownloadProvider} */
88
+ downloads: null,
89
+ /** @type {VisualAdjustmentProvider} */
90
+ visualAdjustments: null,
91
+ /** @type {SharingProvider} */
92
+ share: null,
93
+ /** @type {ViewableFilesProvider} */
94
+ volumes: null,
95
+ };
96
+ this.signedIn = false;
97
+ this.fullscreenBranding = html`<ia-icon-ia-logo aria-hidden="true"></ia-icon-ia-logo>`;
98
+ // Untracked properties
99
+ this._sharedObserverHandler = { handleResize: this.handleResize.bind(this) };
100
+ this._brWidth = 0;
101
+ this._brHeight = 0;
102
+ this.shortcutOrder = [
103
+ /**
104
+ * sets exit FS button (`this.fullscreenBranding`)
105
+ * when `br.options.enableFSLogoShortcut`
106
+ */
107
+ 'fullscreen',
108
+ 'volumes',
109
+ 'chapters',
110
+ 'search',
111
+ 'translate',
112
+ 'bookmarks',
113
+ 'downloads',
114
+ 'visualAdjustments',
115
+ 'share',
116
+ 'experiments',
117
+ ];
118
+ }
119
+
120
+ disconnectedCallback() {
121
+ super.disconnectedCallback();
122
+ this.unloadSharedObserver();
123
+ }
124
+
125
+ firstUpdated() {
126
+ if (!this.modal) {
127
+ this.setModalManager();
128
+ }
129
+
130
+ if (!this.sharedObserver) {
131
+ this.sharedObserver = new SharedResizeObserver();
132
+ }
133
+
134
+ this._bindEventListeners();
135
+ this.loaded = true;
136
+ }
137
+
138
+ /**
139
+ * @param {import('lit').PropertyValues} changed
140
+ */
141
+ updated(changed) {
142
+ if (!this.bookreader || !this.item || !this.bookReaderLoaded) {
143
+ return;
144
+ }
145
+
146
+ const reload = changed.has('loaded') && this.loaded;
147
+ if (reload
148
+ || changed.has('item')
149
+ || changed.has('bookreader')
150
+ || changed.has('signedIn')
151
+ || changed.has('isAdmin')
152
+ || changed.has('modal')) {
153
+ this.initializeBookSubmenus();
154
+ }
155
+
156
+ if (changed.has('sharedObserver') && this.bookreader) {
157
+ this.loadSharedObserver();
158
+ this.initializeBookSubmenus();
159
+ }
160
+
161
+ if (changed.has('downloadableTypes')) {
162
+ this.initializeBookSubmenus();
163
+ }
164
+ }
165
+
166
+ loadSharedObserver() {
167
+ this.unloadSharedObserver();
168
+ this.sharedObserver?.addObserver({
169
+ target: this.mainBRContainer,
170
+ handler: this._sharedObserverHandler,
171
+ });
172
+ }
173
+
174
+ unloadSharedObserver() {
175
+ this.sharedObserver?.removeObserver({
176
+ target: this.mainBRContainer,
177
+ handler: this._sharedObserverHandler,
178
+ });
179
+ }
180
+
181
+ /**
182
+ * Uses resize observer to fire BookReader's `resize` functionality
183
+ * We do not want to trigger resize IF:
184
+ * - book animation is happening
185
+ * - book is in fullscreen (fullscreen is handled separately)
186
+ *
187
+ * @param { target: HTMLElement, contentRect: DOMRectReadOnly } entry
188
+ */
189
+ handleResize({ contentRect, target }) {
190
+ const startBrWidth = this._brWidth;
191
+ const startBrHeight = this._brHeight;
192
+ const { animating } = this.bookreader;
193
+
194
+ if (target === this.mainBRContainer) {
195
+ this._brWidth = contentRect.width;
196
+ this._brHeight = contentRect.height;
197
+ }
198
+
199
+ if (!startBrWidth && this._brWidth) {
200
+ // loading up, let's update side menus
201
+ this.initializeBookSubmenus();
202
+ }
203
+
204
+ const widthChange = startBrWidth !== this._brWidth;
205
+ const heightChange = startBrHeight !== this._brHeight;
206
+
207
+ if (!animating && (widthChange || heightChange)) {
208
+ this.bookreader?.resize();
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Manages Fullscreen behavior
214
+ * This makes sure that controls are _always_ in view
215
+ * We need this to accommodate LOAN BAR during fullscreen
216
+ */
217
+ manageFullScreenBehavior() {
218
+ if (!this.bookreader.options.enableFSLogoShortcut) {
219
+ return;
220
+ }
221
+
222
+ this.fullscreen = this.bookreader.isFullscreen();
223
+ this.dispatchEvent(new CustomEvent('fullscreenStateUpdated', { detail: { fullscreen: this.fullscreen }}));
224
+ if (this.fullscreen) {
225
+ this.addFullscreenShortcut();
226
+ } else {
227
+ this.deleteFullscreenShortcut();
228
+ }
229
+ }
230
+
231
+ /** Creates modal DOM & attaches to `<body>` */
232
+ setModalManager() {
233
+ /** @type {ModalManager} */
234
+ // modal-manager is a page-wide singleton appended to <body>, so a document-level lookup is intended
235
+ // eslint-disable-next-line no-restricted-properties
236
+ let modalManager = document.querySelector('modal-manager');
237
+ if (!modalManager) {
238
+ modalManager = /** @type {ModalManager} */(document.createElement('modal-manager'));
239
+ document.body.appendChild(modalManager);
240
+ }
241
+
242
+ this.modal = modalManager;
243
+ }
244
+
245
+ /**
246
+ * Instantiates books submenus & their update callbacks
247
+ *
248
+ * NOTE: we are doing our best to scope bookreader's instance.
249
+ * If your submenu provider uses a bookreader instance to read, manually
250
+ * manipulate BookReader, please update ia-bookreader's instance of it
251
+ * to keep it in sync.
252
+ */
253
+ initializeBookSubmenus() {
254
+ const providers = {
255
+ visualAdjustments: new VisualAdjustmentProvider({
256
+ ...this.baseProviderConfig,
257
+ /** Update menu contents */
258
+ onProviderChange: () => {
259
+ this.updateMenuContents();
260
+ },
261
+ }),
262
+ };
263
+
264
+ if (this.baseProviderConfig.item) {
265
+ // Share options currently rely on IA item metadata
266
+ providers.share = new SharingProvider(this.baseProviderConfig);
267
+ }
268
+
269
+ if (this.shouldShowDownloadsMenu()) {
270
+ providers.downloads = new DownloadProvider(this.baseProviderConfig);
271
+ }
272
+
273
+ // Note plugins will never be null-ish in runtime, but some of the unit tests
274
+ // stub BR with a nullish value there.
275
+ if (this.bookreader.options.plugins?.search?.enabled) {
276
+ providers.search = new SearchProvider({
277
+ ...this.baseProviderConfig,
278
+ /**
279
+ * Search specific menu updates
280
+ * @param {BookReader} brInstance
281
+ * @param {Partial<{ searchCanceled: boolean, openMenu: boolean }>} searchUpdates
282
+ */
283
+ onProviderChange: (brInstance = null, searchUpdates = {}) => {
284
+ if (brInstance) {
285
+ /** @type {BookReader} refresh br instance reference */
286
+ this.bookreader = brInstance;
287
+ }
288
+
289
+ this.updateMenuContents();
290
+
291
+ if (searchUpdates.openMenu === false) {
292
+ return;
293
+ }
294
+
295
+ if (this.isWideEnoughToOpenMenu && !searchUpdates?.searchCanceled) {
296
+ /* open side search menu */
297
+ setTimeout(() => {
298
+ this.updateSideMenu('search', 'open');
299
+ }, 0);
300
+ }
301
+ },
302
+ });
303
+ }
304
+
305
+ if (this.bookreader.options.enableBookmarks) {
306
+ providers.bookmarks = new BookmarksProvider({
307
+ ...this.baseProviderConfig,
308
+ onProviderChange: (bookmarks) => {
309
+ if (Object.keys(bookmarks).length) {
310
+ this.addMenuShortcut('bookmarks');
311
+ } else {
312
+ this.removeMenuShortcut('bookmarks');
313
+ }
314
+ this.updateMenuContents();
315
+ },
316
+ });
317
+ }
318
+
319
+ // add shortcut for volumes if multipleBooksList exists
320
+ if (this.bookreader.options.enableMultipleBooks) {
321
+ providers.volumes = new ViewableFilesProvider({
322
+ ...this.baseProviderConfig,
323
+ onProviderChange: (brInstance = null, volumesUpdates = {}) => {
324
+ if (brInstance) {
325
+ /* refresh br instance reference */
326
+ this.bookreader = brInstance;
327
+ }
328
+ this.updateMenuContents();
329
+ if (this.isWideEnoughToOpenMenu) {
330
+ /* open side search menu */
331
+ setTimeout(() => {
332
+ this.updateSideMenu('volumes', 'open');
333
+ });
334
+ }
335
+ },
336
+ });
337
+ }
338
+
339
+ Object.assign(this.menuProviders, providers);
340
+ this.addMenuShortcut('search');
341
+ this.addMenuShortcut('volumes');
342
+ this.updateMenuContents();
343
+ }
344
+
345
+ /** gets element that houses the bookreader in light dom */
346
+ get mainBRContainer() {
347
+ return this.bookreader?.refs?.$br?.[0];
348
+ }
349
+
350
+ get baseProviderConfig() {
351
+ return {
352
+ baseHost: this.baseHost,
353
+ modal: this.modal,
354
+ sharedObserver: this.sharedObserver,
355
+ bookreader: this.bookreader,
356
+ item: this.item,
357
+ signedIn: this.signedIn,
358
+ isAdmin: this.isAdmin,
359
+ /** @type {function(BookReader, object): void} */
360
+ onProviderChange: () => {},
361
+ };
362
+ }
363
+
364
+ get isWideEnoughToOpenMenu() {
365
+ return this._brWidth >= 640;
366
+ }
367
+
368
+ /**
369
+ * Open side menu
370
+ * @param {string} menuId
371
+ * @param {('open'|'close'|'toggle')} action
372
+ */
373
+ updateSideMenu(menuId = '', action = 'open') {
374
+ if (!menuId) {
375
+ return;
376
+ }
377
+
378
+ this.openMenuName = menuId;
379
+
380
+ if (action === 'open') {
381
+ this.itemNav?.openShortcut(menuId);
382
+ } else if (action === 'toggle') {
383
+ this.itemNav?.toggleMenu();
384
+ }
385
+ }
386
+
387
+ /** Fullscreen Shortcut */
388
+ addFullscreenShortcut() {
389
+ this.menuShortcuts.push({
390
+ icon: this.fullscreenShortcut,
391
+ id: 'fullscreen',
392
+ });
393
+ this._sortMenuShortcuts();
394
+ }
395
+
396
+ deleteFullscreenShortcut() {
397
+ this.menuShortcuts = this.menuShortcuts
398
+ .filter(s => s.id !== 'fullscreen');
399
+ this._sortMenuShortcuts();
400
+ }
401
+
402
+ get fullscreenShortcut() {
403
+ return html`
404
+ <button
405
+ @click=${() => this.bookreader.exitFullScreen()}
406
+ title="Exit fullscreen view"
407
+ >${this.fullscreenBranding}</button>
408
+ `;
409
+ }
410
+ /** End Fullscreen Shortcut */
411
+
412
+ /**
413
+ * Sets order of menu and emits custom event when done
414
+ */
415
+ updateMenuContents() {
416
+ const availableMenus = sortBy(
417
+ Object.entries(this.menuProviders)
418
+ .filter(([id, menu]) => !!menu)
419
+ .filter(([id, menu]) => {
420
+ return id === 'downloads' ? this.shouldShowDownloadsMenu() : true;
421
+ }),
422
+ ([id, menu]) => {
423
+ const index = this.shortcutOrder.indexOf(id);
424
+ return index === -1 ? this.shortcutOrder.length : index;
425
+ },
426
+ ).map(([id, menu]) => menu);
427
+
428
+ if (this.shouldShowDownloadsMenu()) {
429
+ this.menuProviders.downloads?.update(this.downloadableTypes);
430
+ }
431
+
432
+ this.menuContents = availableMenus;
433
+ }
434
+
435
+ /**
436
+ * Confirms if we should show the downloads menu
437
+ * @returns {boolean}
438
+ */
439
+ shouldShowDownloadsMenu() {
440
+ if (!this.downloadableTypes.length) { return false; }
441
+ if (this.bookIsRestricted === false) { return true; }
442
+ if (this.isAdmin) { return true; }
443
+ const { user_loan_record = {} } = this.lendingStatus;
444
+ const hasNoLoanRecord = Array.isArray(user_loan_record); /* (bc PHP assoc. arrays) */
445
+
446
+ if (hasNoLoanRecord) { return false; }
447
+
448
+ const hasValidLoan = user_loan_record.type && (user_loan_record.type !== 'SESSION_LOAN');
449
+ return hasValidLoan;
450
+ }
451
+
452
+ /**
453
+ * Adds a provider object to the menuShortcuts array property if it isn't
454
+ * already added, then sorts menuShortcuts based on shortcutOrder.
455
+ *
456
+ * @param {string} menuId - a string matching the id property of a provider
457
+ */
458
+ addMenuShortcut(menuId) {
459
+ if (this.menuShortcuts.find((m) => m.id === menuId)) {
460
+ // menu is already there
461
+ return;
462
+ }
463
+
464
+ if (!this.menuProviders[menuId]) {
465
+ // no provider for this menu
466
+ return;
467
+ }
468
+
469
+ this.menuShortcuts.push(this.menuProviders[menuId]);
470
+ this._sortMenuShortcuts();
471
+ }
472
+
473
+ /**
474
+ * @param {string} menuId
475
+ */
476
+ removeMenuShortcut(menuId) {
477
+ this.menuShortcuts = this.menuShortcuts.filter((m) => m.id !== menuId);
478
+ this._sortMenuShortcuts();
479
+ }
480
+
481
+ /**
482
+ * Sorts the menuShortcuts property by comparing each provider's id to
483
+ * the id in each iteration over the shortcutOrder array.
484
+ */
485
+ _sortMenuShortcuts() {
486
+ this.menuShortcuts = sortBy(
487
+ this.menuShortcuts,
488
+ (shortcut) => {
489
+ const index = this.shortcutOrder.indexOf(shortcut.id);
490
+ return index === -1 ? this.shortcutOrder.length : index;
491
+ },
492
+ );
493
+ }
494
+
495
+ /**
496
+ * Core bookreader event handler registry
497
+ *
498
+ * NOTE: we are trying to keep bookreader's instance in scope
499
+ * Please update ia-bookreader's instance reference of it to keep it current
500
+ */
501
+ _bindEventListeners() {
502
+ window.addEventListener('BookReader:PostInit', /** @param {CustomEvent} e */ (e) => {
503
+ this.bookreader = e.detail.props;
504
+ this.bookreader.shell = this;
505
+ this.bookReaderLoaded = true;
506
+ this.bookReaderCannotLoad = false;
507
+ this.loaded = true;
508
+ this.loadSharedObserver();
509
+ setTimeout(() => this.bookreader.resize(), 0);
510
+ });
511
+ window.addEventListener('BookReader:fullscreenToggled', /** @param {CustomEvent} event */ (event) => {
512
+ const brInstance = event.detail.props;
513
+ if (brInstance) {
514
+ this.bookreader = brInstance;
515
+ }
516
+ this.manageFullScreenBehavior();
517
+ }, { passive: true });
518
+ window.addEventListener('BookReader:ToggleSearchMenu', /** @param {CustomEvent} event */ (event) => {
519
+ this.updateSideMenu('search', 'toggle');
520
+ });
521
+ window.addEventListener('LendingFlow:PostInit', /** @param {CustomEvent} detail */ ({ detail }) => {
522
+ const {
523
+ downloadTypesAvailable, lendingStatus, isAdmin, previewType,
524
+ } = detail;
525
+ this.lendingInitialized = true;
526
+ this.downloadableTypes = downloadTypesAvailable;
527
+ this.lendingStatus = lendingStatus;
528
+ this.isAdmin = isAdmin;
529
+ this.bookReaderCannotLoad = previewType === 'singlePagePreview';
530
+ this.loaded = true;
531
+ });
532
+ window.addEventListener('BRJSIA:PostInit', /** @param {CustomEvent} detail */ ({ detail }) => {
533
+ const { isRestricted, downloadURLs } = detail;
534
+ this.bookReaderLoaded = true;
535
+ this.downloadableTypes = downloadURLs;
536
+ this.bookIsRestricted = isRestricted;
537
+ });
538
+ window.addEventListener('contextmenu', (e) => this._manageContextMenuVisibility(e), { capture: true });
539
+ }
540
+
541
+ /**
542
+ * @param {PointerEvent} e
543
+ **/
544
+ _manageContextMenuVisibility(e) {
545
+ const target = /** @type {HTMLElement} */(e.target);
546
+
547
+ window['archive_analytics']?.send_event(
548
+ 'BookReader',
549
+ `contextmenu-${this.bookIsRestricted ? 'restricted' : 'unrestricted'}`,
550
+ target?.classList?.value,
551
+ );
552
+ if (!this.bookIsRestricted) {
553
+ return;
554
+ }
555
+
556
+ const imagePane = target.classList.value.match(/BRscreen|BRpageimage/g);
557
+ if (!imagePane) {
558
+ return;
559
+ }
560
+
561
+ e.preventDefault();
562
+ return false;
563
+ }
564
+
565
+ get itemImage() {
566
+ const identifier = this.item?.metadata.identifier;
567
+ const url = `https://${this.baseHost}/services/img/${identifier}`;
568
+ return html`<img class="cover-img" src=${url} alt="cover image for ${identifier}">`;
569
+ }
570
+
571
+ get placeholder() {
572
+ return html`<div class="placeholder">${this.itemImage}</div>`;
573
+ }
574
+
575
+ render() {
576
+ return html`
577
+ <iaux-item-navigator
578
+ ?viewportInFullscreen=${this.fullscreen}
579
+ .basehost=${this.baseHost}
580
+ .item=${this.item}
581
+ .modal=${this.modal}
582
+ .loaded=${this.loaded}
583
+ .sharedObserver=${this.sharedObserver}
584
+ ?signedIn=${this.signedIn}
585
+ .menuShortcuts=${this.menuShortcuts}
586
+ .menuContents=${this.menuContents}
587
+ .openMenu=${this.openMenuName}
588
+ >
589
+ <div slot="header">
590
+ <slot name="header"></slot>
591
+ </div>
592
+ <div slot="main">
593
+ ${this.bookReaderCannotLoad ? this.placeholder : html`<slot name="main"></slot>`}
594
+ </div>
595
+ </iaux-item-navigator>
596
+ `;
597
+ }
598
+
599
+ static get styles() {
600
+ return css`
601
+ :host {
602
+ display: block;
603
+ --primaryBGColor: var(--black, #000);
604
+ --secondaryBGColor: #222;
605
+ --tertiaryBGColor: #333;
606
+ --primaryTextColor: var(--white, #fff);
607
+ --primaryCTAFill: #194880;
608
+ --primaryCTABorder: #c5d1df;
609
+ --secondaryCTAFill: #333;
610
+ --secondaryCTABorder: #999;
611
+ --primaryErrorCTAFill: #e51c26;
612
+ --primaryErrorCTABorder: #f8c6c8;
613
+ background-color: var(--primaryBGColor);
614
+ position: relative;
615
+ }
616
+
617
+ :host([fullscreen]),
618
+ iaux-item-navigator[viewportinfullscreen] {
619
+ position: fixed;
620
+ inset: 0;
621
+ height: 100%;
622
+ min-height: unset;
623
+ }
624
+
625
+ div[slot="header"] {
626
+ display: flex;
627
+ width: 100%;
628
+ }
629
+
630
+ div[slot="main"] {
631
+ display: flex;
632
+ width: 100%;
633
+ height: 100%;
634
+ }
635
+
636
+ slot {
637
+ display: block;
638
+ flex: 1;
639
+ }
640
+
641
+ slot,
642
+ slot > * {
643
+ display: block;
644
+ height: 100%;
645
+ width: inherit;
646
+ }
647
+ .placeholder {
648
+ display: flex;
649
+ align-items: center;
650
+ justify-content: center;
651
+ flex-direction: column;
652
+ margin: 5%;
653
+ }
654
+ .cover-img {
655
+ max-height: 300px;
656
+ }
657
+
658
+ iaux-item-navigator {
659
+ display: block;
660
+ width: 100%;
661
+ min-height: var(--br-height, inherit);
662
+ height: var(--br-height, 100%);
663
+ color: var(--primaryTextColor);
664
+ --menuButtonLabelDisplay: block;
665
+ --menuWidth: 320px;
666
+ --menuSliderBg: var(--secondaryBGColor);
667
+ --activeButtonBg: var(--tertiaryBGColor);
668
+ --subpanelRightBorderColor: var(--secondaryCTABorder);
669
+ --animationTiming: 100ms;
670
+ --iconFillColor: var(--primaryTextColor);
671
+ --iconStrokeColor: var(--primaryTextColor);
672
+ --menuSliderHeaderIconHeight: 2rem;
673
+ --menuSliderHeaderIconWidth: 2rem;
674
+ --iconWidth: 2.4rem;
675
+ --iconHeight: 2.4rem;
676
+ --shareLinkColor: var(--primaryTextColor);
677
+ --shareIconBorder: var(--primaryTextColor);
678
+ --shareIconBg: var(--secondaryBGColor);
679
+ --activityIndicatorLoadingDotColor: var(--primaryTextColor);
680
+ --activityIndicatorLoadingRingColor: var(--primaryTextColor);
681
+ }
682
+ `;
683
+ }
684
+ }
685
+
686
+ window.customElements.define("ia-bookreader", IaBookReader);
@@ -0,0 +1,27 @@
1
+ import { html } from 'lit';
2
+ import { iauxShareIcon } from '@internetarchive/ia-item-navigator/dist/src/menus/share-panel.js';
3
+ import '@internetarchive/ia-item-navigator/dist/src/menus/share-panel.js';
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.subPrefix || '';
14
+ const label = `Share this book`;
15
+ this.icon = html`${iauxShareIcon}`;
16
+ this.label = label;
17
+ this.id = 'share';
18
+ this.component = html`<iaux-in-share-panel
19
+ .identifier=${identifier}
20
+ .type=${`book`}
21
+ .creator=${creatorToUse}
22
+ .description=${title}
23
+ .baseHost=${baseHost}
24
+ .fileSubPrefix=${subPrefix}
25
+ ></iaux-in-share-panel>`;
26
+ }
27
+ }