@internetarchive/bookreader 5.0.0-10-alpha-3 → 5.0.0-101

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 (374) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +431 -1134
  4. package/BookReader/BookReader.js +1 -1
  5. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  6. package/BookReader/BookReader.js.map +1 -1
  7. package/BookReader/bergamot-translator-worker.js +2966 -0
  8. package/BookReader/bergamot-translator-worker.wasm +0 -0
  9. package/BookReader/hypothesis/LICENSE +50 -0
  10. package/BookReader/hypothesis/README.md +55 -0
  11. package/BookReader/hypothesis/build/boot.js +1 -0
  12. package/BookReader/hypothesis/build/manifest.json +20 -0
  13. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
  14. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
  16. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
  18. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  19. package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
  20. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  40. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  41. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  42. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
  44. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
  46. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
  48. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  49. package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
  50. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  51. package/BookReader/hypothesis/package.json +126 -0
  52. package/BookReader/ia-bookreader-bundle.js +1782 -0
  53. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  54. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  55. package/BookReader/icons/1up.svg +1 -1
  56. package/BookReader/icons/2up.svg +1 -1
  57. package/BookReader/icons/advance.svg +1 -1
  58. package/BookReader/icons/chevron-right.svg +1 -1
  59. package/BookReader/icons/close-circle-dark.svg +1 -1
  60. package/BookReader/icons/close-circle.svg +1 -1
  61. package/BookReader/icons/fullscreen.svg +1 -1
  62. package/BookReader/icons/fullscreen_exit.svg +1 -1
  63. package/BookReader/icons/hamburger.svg +1 -1
  64. package/BookReader/icons/left-arrow.svg +1 -1
  65. package/BookReader/icons/magnify-minus.svg +1 -1
  66. package/BookReader/icons/magnify-plus.svg +1 -1
  67. package/BookReader/icons/magnify.svg +1 -1
  68. package/BookReader/icons/pause.svg +1 -1
  69. package/BookReader/icons/play.svg +1 -1
  70. package/BookReader/icons/playback-speed.svg +1 -1
  71. package/BookReader/icons/read-aloud.svg +1 -1
  72. package/BookReader/icons/review.svg +1 -1
  73. package/BookReader/icons/thumbnails.svg +1 -1
  74. package/BookReader/icons/voice.svg +1 -0
  75. package/BookReader/icons/volume-full.svg +1 -1
  76. package/BookReader/images/BRicons.svg +3 -3
  77. package/BookReader/images/books_graphic.svg +1 -1
  78. package/BookReader/images/hypothesis.ico +0 -0
  79. package/BookReader/images/icon_book.svg +1 -1
  80. package/BookReader/images/icon_bookmark.svg +1 -1
  81. package/BookReader/images/icon_experiment.svg +1 -0
  82. package/BookReader/images/icon_gear.svg +1 -1
  83. package/BookReader/images/icon_hamburger.svg +1 -1
  84. package/BookReader/images/icon_home.svg +1 -1
  85. package/BookReader/images/icon_info.svg +1 -1
  86. package/BookReader/images/icon_one_page.svg +1 -1
  87. package/BookReader/images/icon_pause.svg +1 -1
  88. package/BookReader/images/icon_play.svg +1 -1
  89. package/BookReader/images/icon_playback-rate.svg +1 -1
  90. package/BookReader/images/icon_search_button.svg +1 -1
  91. package/BookReader/images/icon_share.svg +1 -1
  92. package/BookReader/images/icon_skip-ahead.svg +1 -1
  93. package/BookReader/images/icon_skip-back.svg +1 -1
  94. package/BookReader/images/icon_speaker.svg +1 -1
  95. package/BookReader/images/icon_speaker_open.svg +1 -1
  96. package/BookReader/images/icon_thumbnails.svg +1 -1
  97. package/BookReader/images/icon_toc.svg +1 -1
  98. package/BookReader/images/icon_two_pages.svg +1 -1
  99. package/BookReader/images/marker_chap-off.svg +1 -1
  100. package/BookReader/images/marker_chap-on.svg +1 -1
  101. package/BookReader/images/marker_srch-on.svg +1 -1
  102. package/BookReader/images/translate.svg +1 -0
  103. package/BookReader/images/unviewable_page.png +0 -0
  104. package/BookReader/jquery-3.js +2 -0
  105. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  106. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  107. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  108. package/BookReader/plugins/plugin.autoplay.js +1 -1
  109. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  110. package/BookReader/plugins/plugin.chapters.js +25 -1
  111. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  112. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  113. package/BookReader/plugins/plugin.experiments.js +3 -0
  114. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  115. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  116. package/BookReader/plugins/plugin.iframe.js +1 -1
  117. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  118. package/BookReader/plugins/plugin.iiif.js +2 -0
  119. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  120. package/BookReader/plugins/plugin.resume.js +1 -1
  121. package/BookReader/plugins/plugin.resume.js.map +1 -1
  122. package/BookReader/plugins/plugin.search.js +2 -1
  123. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  124. package/BookReader/plugins/plugin.search.js.map +1 -1
  125. package/BookReader/plugins/plugin.text_selection.js +2 -1
  126. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  127. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  128. package/BookReader/plugins/plugin.translate.js +137 -0
  129. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  130. package/BookReader/plugins/plugin.translate.js.map +1 -0
  131. package/BookReader/plugins/plugin.tts.js +1 -1
  132. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  133. package/BookReader/plugins/plugin.tts.js.map +1 -1
  134. package/BookReader/plugins/plugin.url.js +1 -1
  135. package/BookReader/plugins/plugin.url.js.map +1 -1
  136. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  137. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  138. package/BookReader/plugins/translator-worker.js +2 -0
  139. package/BookReader/plugins/translator-worker.js.map +1 -0
  140. package/BookReader/silence.mp3 +0 -0
  141. package/BookReader/translator-worker.js +475 -0
  142. package/BookReader/webcomponents-bundle.js +3 -0
  143. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  144. package/BookReader/webcomponents-bundle.js.map +1 -0
  145. package/README.md +14 -3
  146. package/jsconfig.json +19 -0
  147. package/package.json +84 -64
  148. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  149. package/src/BookNavigator/assets/button-base.js +2 -1
  150. package/src/BookNavigator/assets/ia-logo.js +17 -0
  151. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  152. package/src/BookNavigator/assets/icon_close.js +1 -1
  153. package/src/BookNavigator/book-navigator.js +620 -0
  154. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  155. package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -3
  156. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  157. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +2 -2
  158. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  159. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  160. package/src/BookNavigator/delete-modal-actions.js +1 -1
  161. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  162. package/src/BookNavigator/downloads/downloads.js +24 -4
  163. package/src/BookNavigator/search/search-provider.js +55 -27
  164. package/src/BookNavigator/search/search-results.js +25 -11
  165. package/src/BookNavigator/sharing.js +27 -0
  166. package/src/BookNavigator/viewable-files.js +95 -0
  167. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
  168. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +9 -9
  169. package/src/BookReader/BookModel.js +92 -46
  170. package/src/BookReader/DragScrollable.js +233 -0
  171. package/src/BookReader/ImageCache.js +49 -16
  172. package/src/BookReader/Mode1Up.js +58 -360
  173. package/src/BookReader/Mode1UpLit.js +393 -0
  174. package/src/BookReader/Mode2Up.js +75 -1318
  175. package/src/BookReader/Mode2UpLit.js +787 -0
  176. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  177. package/src/BookReader/ModeSmoothZoom.js +312 -0
  178. package/src/BookReader/ModeThumb.js +20 -12
  179. package/src/BookReader/Navbar/Navbar.js +130 -53
  180. package/src/BookReader/PageContainer.js +120 -23
  181. package/src/BookReader/ReduceSet.js +2 -2
  182. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  183. package/src/BookReader/events.js +2 -3
  184. package/src/BookReader/options.js +87 -16
  185. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  186. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  187. package/src/BookReader/utils/SelectionObserver.js +45 -0
  188. package/src/BookReader/utils/classes.js +1 -1
  189. package/src/BookReader/utils.js +136 -12
  190. package/src/BookReader.js +641 -1192
  191. package/src/BookReaderPlugin.js +52 -0
  192. package/src/assets/icons/magnify-minus.svg +3 -7
  193. package/src/assets/icons/magnify-plus.svg +3 -7
  194. package/src/assets/icons/voice.svg +1 -0
  195. package/src/assets/images/hypothesis.ico +0 -0
  196. package/src/assets/images/icon_experiment.svg +1 -0
  197. package/src/assets/images/translate.svg +1 -0
  198. package/src/assets/images/unviewable_page.png +0 -0
  199. package/src/assets/silence.mp3 +0 -0
  200. package/src/css/BookReader.scss +1 -5
  201. package/src/css/_BRBookmarks.scss +1 -1
  202. package/src/css/_BRComponent.scss +1 -1
  203. package/src/css/_BRicon.scss +8 -2
  204. package/src/css/_BRmain.scss +16 -3
  205. package/src/css/_BRnav.scss +12 -66
  206. package/src/css/_BRpages.scss +171 -42
  207. package/src/css/_BRsearch.scss +69 -30
  208. package/src/css/_BRtoolbar.scss +5 -5
  209. package/src/css/_TextSelection.scss +129 -24
  210. package/src/css/_colorbox.scss +2 -2
  211. package/src/css/_controls.scss +24 -7
  212. package/src/css/_icons.scss +1 -1
  213. package/src/ia-bookreader/ia-bookreader.js +224 -0
  214. package/src/plugins/plugin.archive_analytics.js +84 -78
  215. package/src/plugins/plugin.autoplay.js +99 -104
  216. package/src/plugins/plugin.chapters.js +314 -205
  217. package/src/plugins/plugin.experiments.js +321 -0
  218. package/src/plugins/plugin.iframe.js +1 -1
  219. package/src/plugins/plugin.iiif.js +141 -0
  220. package/src/plugins/plugin.resume.js +54 -51
  221. package/src/plugins/plugin.text_selection.js +510 -219
  222. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  223. package/src/plugins/search/plugin.search.js +370 -392
  224. package/src/plugins/search/utils.js +43 -0
  225. package/src/plugins/search/view.js +49 -67
  226. package/src/plugins/translate/TranslationManager.js +162 -0
  227. package/src/plugins/translate/plugin.translate.js +523 -0
  228. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  229. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  230. package/src/plugins/tts/PageChunk.js +33 -21
  231. package/src/plugins/tts/PageChunkIterator.js +11 -17
  232. package/src/plugins/tts/WebTTSEngine.js +131 -91
  233. package/src/plugins/tts/plugin.tts.js +344 -350
  234. package/src/plugins/tts/utils.js +49 -47
  235. package/src/plugins/url/UrlPlugin.js +191 -0
  236. package/src/plugins/{plugin.url.js → url/plugin.url.js} +44 -15
  237. package/src/util/TextSelectionManager.js +282 -0
  238. package/src/util/browserSniffing.js +33 -1
  239. package/src/util/cache.js +20 -0
  240. package/src/util/docCookies.js +21 -2
  241. package/src/util/strings.js +1 -0
  242. package/.babelrc +0 -12
  243. package/.dependabot/config.yml +0 -6
  244. package/.eslintrc.js +0 -50
  245. package/.gitattributes +0 -2
  246. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  247. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  248. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  249. package/.github/workflows/node.js.yml +0 -37
  250. package/.github/workflows/npm-publish.yml +0 -47
  251. package/.testcaferc.json +0 -5
  252. package/BookReader/bookreader-component-bundle.js +0 -1450
  253. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  254. package/BookReader/bookreader-component-bundle.js.map +0 -1
  255. package/BookReader/jquery-1.10.1.js +0 -2
  256. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  257. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  258. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  259. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  260. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  261. package/BookReaderDemo/BookReaderDemo.css +0 -41
  262. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  263. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  264. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  265. package/BookReaderDemo/IIIFBookReader.js +0 -207
  266. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  267. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  268. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  273. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  274. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  275. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  276. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  277. package/BookReaderDemo/demo-advanced.html +0 -33
  278. package/BookReaderDemo/demo-autoplay.html +0 -38
  279. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  280. package/BookReaderDemo/demo-embed.html +0 -26
  281. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  282. package/BookReaderDemo/demo-fullscreen.html +0 -33
  283. package/BookReaderDemo/demo-iiif.html +0 -34
  284. package/BookReaderDemo/demo-iiif.js +0 -26
  285. package/BookReaderDemo/demo-internetarchive.html +0 -74
  286. package/BookReaderDemo/demo-multiple.html +0 -43
  287. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  288. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  289. package/BookReaderDemo/demo-simple.html +0 -34
  290. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  291. package/BookReaderDemo/immersion-1up.html +0 -64
  292. package/BookReaderDemo/immersion-mode.html +0 -35
  293. package/BookReaderDemo/toggle_controls.html +0 -53
  294. package/BookReaderDemo/view_mode.html +0 -39
  295. package/BookReaderDemo/viewmode-cycle.html +0 -41
  296. package/CHANGELOG.md +0 -493
  297. package/CONTRIBUTING.md +0 -7
  298. package/codecov.yml +0 -17
  299. package/index.html +0 -31
  300. package/karma.conf.js +0 -23
  301. package/screenshot.png +0 -0
  302. package/scripts/postversion.js +0 -10
  303. package/scripts/preversion.js +0 -14
  304. package/scripts/version.js +0 -26
  305. package/src/BookNavigator/BookModel.js +0 -14
  306. package/src/BookNavigator/BookNavigator.js +0 -446
  307. package/src/BookNavigator/assets/book-loader.js +0 -27
  308. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  309. package/src/BookNavigator/search/a-search-result.js +0 -55
  310. package/src/BookReader/DebugConsole.js +0 -54
  311. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  312. package/src/ItemNavigator/ItemNavigator.js +0 -376
  313. package/src/ItemNavigator/providers/sharing.js +0 -29
  314. package/src/css/_MobileNav.scss +0 -194
  315. package/src/dragscrollable-br.js +0 -261
  316. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  317. package/src/plugins/plugin.mobile_nav.js +0 -287
  318. package/tests/BookReader/BookModel.test.js +0 -312
  319. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  320. package/tests/BookReader/DebugConsole.test.js +0 -25
  321. package/tests/BookReader/ImageCache.test.js +0 -150
  322. package/tests/BookReader/Mode1Up.test.js +0 -164
  323. package/tests/BookReader/Mode2Up.test.js +0 -247
  324. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  325. package/tests/BookReader/PageContainer.test.js +0 -115
  326. package/tests/BookReader/ReduceSet.test.js +0 -38
  327. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  328. package/tests/BookReader/utils/classes.test.js +0 -88
  329. package/tests/BookReader/utils.test.js +0 -109
  330. package/tests/BookReader.options.test.js +0 -39
  331. package/tests/BookReader.test.js +0 -301
  332. package/tests/e2e/README.md +0 -75
  333. package/tests/e2e/autoplay.test.js +0 -13
  334. package/tests/e2e/base.test.js +0 -35
  335. package/tests/e2e/helpers/base.js +0 -263
  336. package/tests/e2e/helpers/debug.js +0 -13
  337. package/tests/e2e/helpers/desktopSearch.js +0 -72
  338. package/tests/e2e/helpers/mobileSearch.js +0 -85
  339. package/tests/e2e/helpers/mockSearch.js +0 -93
  340. package/tests/e2e/helpers/rightToLeft.js +0 -29
  341. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  342. package/tests/e2e/models/BookReader.js +0 -11
  343. package/tests/e2e/models/Navigation.js +0 -56
  344. package/tests/e2e/rightToLeft.test.js +0 -20
  345. package/tests/e2e/viewmode.test.js +0 -37
  346. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  347. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  348. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  349. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  350. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  351. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  352. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  353. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  354. package/tests/plugins/plugin.autoplay.test.js +0 -52
  355. package/tests/plugins/plugin.chapters.test.js +0 -130
  356. package/tests/plugins/plugin.iframe.test.js +0 -42
  357. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  358. package/tests/plugins/plugin.resume.test.js +0 -98
  359. package/tests/plugins/plugin.text_selection.test.js +0 -203
  360. package/tests/plugins/plugin.url.test.js +0 -129
  361. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  362. package/tests/plugins/search/plugin.search.test.js +0 -173
  363. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  364. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  365. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  366. package/tests/plugins/tts/PageChunk.test.js +0 -57
  367. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  368. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  369. package/tests/plugins/tts/utils.test.js +0 -133
  370. package/tests/util/browserSniffing.test.js +0 -56
  371. package/tests/util/docCookies.test.js +0 -15
  372. package/tests/util/strings.test.js +0 -63
  373. package/tests/utils.js +0 -42
  374. package/webpack.config.js +0 -86
@@ -0,0 +1,620 @@
1
+ // eslint-disable-next-line no-unused-vars
2
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
3
+ // eslint-disable-next-line no-unused-vars
4
+ import { ModalManager } from '@internetarchive/modal-manager';
5
+ import { css, html, LitElement, nothing } from 'lit';
6
+ import SearchProvider from './search/search-provider.js';
7
+ import DownloadProvider from './downloads/downloads-provider.js';
8
+ import VisualAdjustmentProvider from './visual-adjustments/visual-adjustments-provider.js';
9
+ import BookmarksProvider from './bookmarks/bookmarks-provider.js';
10
+ import SharingProvider from './sharing.js';
11
+ import ViewableFilesProvider from './viewable-files.js';
12
+ import iaLogo from './assets/ia-logo.js';
13
+ import { sortBy } from '../BookReader/utils.js';
14
+ /** @typedef {import('@/src/BookReader.js').default} BookReader */
15
+
16
+ const events = {
17
+ menuUpdated: 'menuUpdated',
18
+ updateSideMenu: 'updateSideMenu',
19
+ PostInit: 'PostInit',
20
+ ViewportInFullScreen: 'ViewportInFullScreen',
21
+ };
22
+ export class BookNavigator extends LitElement {
23
+ static get properties() {
24
+ return {
25
+ itemMD: { type: Object },
26
+ bookReaderLoaded: { type: Boolean },
27
+ bookreader: { type: Object },
28
+ bookIsRestricted: { type: Boolean },
29
+ downloadableTypes: { type: Array },
30
+ isAdmin: { type: Boolean },
31
+ lendingInitialized: { type: Boolean },
32
+ lendingStatus: { type: Object },
33
+ menuProviders: { type: Object },
34
+ menuShortcuts: { type: Array },
35
+ signedIn: { type: Boolean },
36
+ loaded: { type: Boolean },
37
+ sharedObserver: { type: Object, attribute: false },
38
+ modal: { type: Object, attribute: false },
39
+ fullscreenBranding: { type: Object },
40
+ };
41
+ }
42
+
43
+ constructor() {
44
+ super();
45
+ this.itemMD = undefined;
46
+ this.loaded = false;
47
+ this.bookReaderCannotLoad = false;
48
+ this.bookReaderLoaded = false;
49
+ this.bookreader = null;
50
+ this.bookIsRestricted = false;
51
+ this.downloadableTypes = [];
52
+ this.isAdmin = false;
53
+ this.lendingInitialized = false;
54
+ this.lendingStatus = {};
55
+ this.menuProviders = {
56
+ /** @type {BookmarksProvider} */
57
+ bookmarks: null,
58
+ /** @type {SearchProvider} */
59
+ search: null,
60
+ /** @type {DownloadProvider} */
61
+ downloads: null,
62
+ /** @type {VisualAdjustmentProvider} */
63
+ visualAdjustments: null,
64
+ /** @type {SharingProvider} */
65
+ share: null,
66
+ /** @type {ViewableFilesProvider} */
67
+ volumes: null,
68
+ };
69
+ this.menuShortcuts = [];
70
+ this.signedIn = false;
71
+ /** @type {ModalManager} */
72
+ this.modal = undefined;
73
+ /** @type {SharedResizeObserver} */
74
+ this.sharedObserver = undefined;
75
+ this.fullscreenBranding = iaLogo;
76
+ // Untracked properties
77
+ this.sharedObserverHandler = undefined;
78
+ this.brWidth = 0;
79
+ this.brHeight = 0;
80
+ this.shortcutOrder = [
81
+ /**
82
+ * sets exit FS button (`this.fullscreenBranding1)
83
+ * when `br.options.enableFSLogoShortcut`
84
+ */
85
+ 'fullscreen',
86
+ 'volumes',
87
+ 'chapters',
88
+ 'search',
89
+ 'translate',
90
+ 'bookmarks',
91
+ 'downloads',
92
+ 'visualAdjustments',
93
+ 'share',
94
+ 'experiments',
95
+ ];
96
+ }
97
+
98
+ disconnectedCallback() {
99
+ this.sharedObserver.removeObserver({
100
+ target: this.mainBRContainer,
101
+ handler: this.sharedObserverHandler,
102
+ });
103
+ }
104
+
105
+ firstUpdated() {
106
+ this.bindEventListeners();
107
+ this.emitPostInit();
108
+ this.loaded = true;
109
+ }
110
+
111
+ updated(changed) {
112
+ if (!this.bookreader || !this.itemMD || !this.bookReaderLoaded) {
113
+ return;
114
+ }
115
+
116
+ const reload = changed.has('loaded') && this.loaded;
117
+ if (reload
118
+ || changed.has('itemMD')
119
+ || changed.has('bookreader')
120
+ || changed.has('signedIn')
121
+ || changed.has('isAdmin')
122
+ || changed.has('modal')) {
123
+ this.initializeBookSubmenus();
124
+ }
125
+
126
+ if (changed.has('sharedObserver') && this.bookreader) {
127
+ this.loadSharedObserver();
128
+ this.initializeBookSubmenus();
129
+ }
130
+
131
+ if (changed.has('downloadableTypes')) {
132
+ this.initializeBookSubmenus();
133
+ }
134
+ }
135
+
136
+ /**
137
+ * Global event emitter for when Book Navigator loads
138
+ */
139
+ emitPostInit() {
140
+ // emit global event when book nav has loaded with current bookreader selector
141
+ this.dispatchEvent(new CustomEvent(`BrBookNav:${events.PostInit}`, {
142
+ detail: { brSelector: this.bookreader?.el },
143
+ bubbles: true,
144
+ composed: true,
145
+ }));
146
+ }
147
+
148
+ /**
149
+ * @typedef {{
150
+ * baseHost: string,
151
+ * modal: ModalManager,
152
+ * sharedObserver: SharedResizeObserver,
153
+ * bookreader: BookReader,
154
+ * item: Item,
155
+ * signedIn: boolean,
156
+ * isAdmin: boolean,
157
+ * onProviderChange: (BookReader, object) => void,
158
+ * }} baseProviderConfig
159
+ *
160
+ * @return {baseProviderConfig}
161
+ */
162
+ get baseProviderConfig() {
163
+ return {
164
+ baseHost: this.baseHost,
165
+ modal: this.modal,
166
+ sharedObserver: this.sharedObserver,
167
+ bookreader: this.bookreader,
168
+ item: this.itemMD,
169
+ signedIn: this.signedIn,
170
+ isAdmin: this.isAdmin,
171
+ onProviderChange: () => {},
172
+ };
173
+ }
174
+
175
+ get isWideEnoughToOpenMenu() {
176
+ return this.brWidth >= 640;
177
+ }
178
+ /**
179
+ * Instantiates books submenus & their update callbacks
180
+ *
181
+ * NOTE: we are doing our best to scope bookreader's instance.
182
+ * If your submenu provider uses a bookreader instance to read, manually
183
+ * manipulate BookReader, please update the navigator's instance of it
184
+ * to keep it in sync.
185
+ */
186
+ initializeBookSubmenus() {
187
+ const providers = {
188
+ visualAdjustments: new VisualAdjustmentProvider({
189
+ ...this.baseProviderConfig,
190
+ /** Update menu contents */
191
+ onProviderChange: () => {
192
+ this.updateMenuContents();
193
+ },
194
+ }),
195
+ };
196
+
197
+ if (this.baseProviderConfig.item) {
198
+ // Share options currently rely on IA item metadata
199
+ providers.share = new SharingProvider(this.baseProviderConfig);
200
+ }
201
+
202
+ if (this.shouldShowDownloadsMenu()) {
203
+ providers.downloads = new DownloadProvider(this.baseProviderConfig);
204
+ }
205
+
206
+ // Note plugins will never be null-ish in runtime, but some of the unit tests
207
+ // stub BR with a nullish value there.
208
+ if (this.bookreader.options.plugins?.search?.enabled) {
209
+ providers.search = new SearchProvider({
210
+ ...this.baseProviderConfig,
211
+ /**
212
+ * Search specific menu updates
213
+ * @param {BookReader} brInstance
214
+ * @param {{ searchCanceled: boolean }} searchUpdates
215
+ */
216
+ onProviderChange: (brInstance = null, searchUpdates = {}) => {
217
+ if (brInstance) {
218
+ /** @type {BookReader} refresh br instance reference */
219
+ this.bookreader = brInstance;
220
+ }
221
+
222
+ this.updateMenuContents();
223
+
224
+ if (searchUpdates.openMenu === false) {
225
+ return;
226
+ }
227
+
228
+ if (this.isWideEnoughToOpenMenu && !searchUpdates?.searchCanceled) {
229
+ /* open side search menu */
230
+ setTimeout(() => {
231
+ this.updateSideMenu('search', 'open');
232
+ }, 0);
233
+ }
234
+ },
235
+ });
236
+ }
237
+
238
+ if (this.bookreader.options.enableBookmarks) {
239
+ providers.bookmarks = new BookmarksProvider({
240
+ ...this.baseProviderConfig,
241
+ onProviderChange: (bookmarks) => {
242
+ const method = Object.keys(bookmarks).length ? 'add' : 'remove';
243
+ this[`${method}MenuShortcut`]('bookmarks');
244
+ this.updateMenuContents();
245
+ },
246
+ });
247
+ }
248
+
249
+ // add shortcut for volumes if multipleBooksList exists
250
+ if (this.bookreader.options.enableMultipleBooks) {
251
+ providers.volumes = new ViewableFilesProvider({
252
+ ...this.baseProviderConfig,
253
+ onProviderChange: (brInstance = null, volumesUpdates = {}) => {
254
+ if (brInstance) {
255
+ /* refresh br instance reference */
256
+ this.bookreader = brInstance;
257
+ }
258
+ this.updateMenuContents();
259
+ if (this.isWideEnoughToOpenMenu) {
260
+ /* open side search menu */
261
+ setTimeout(() => {
262
+ this.updateSideMenu('volumes', 'open');
263
+ });
264
+ }
265
+ },
266
+ });
267
+ }
268
+
269
+ Object.assign(this.menuProviders, providers);
270
+ this.addMenuShortcut('search');
271
+ this.addMenuShortcut('volumes');
272
+ this.updateMenuContents();
273
+ }
274
+
275
+ /** gets element that houses the bookreader in light dom */
276
+ get mainBRContainer() {
277
+ return document.querySelector(this.bookreader?.el);
278
+ }
279
+
280
+ /** Fullscreen Shortcut */
281
+ addFullscreenShortcut() {
282
+ const closeFS = {
283
+ icon: this.fullscreenShortcut,
284
+ id: 'fullscreen',
285
+ };
286
+ this.menuShortcuts.push(closeFS);
287
+ this.sortMenuShortcuts();
288
+ this.emitMenuShortcutsUpdated();
289
+ }
290
+
291
+ deleteFullscreenShortcut() {
292
+ const updatedShortcuts = this.menuShortcuts.filter(({ id }) => {
293
+ return id !== 'fullscreen';
294
+ });
295
+ this.menuShortcuts = updatedShortcuts;
296
+ this.sortMenuShortcuts();
297
+ this.emitMenuShortcutsUpdated();
298
+ }
299
+
300
+ closeFullscreen() {
301
+ this.bookreader.exitFullScreen();
302
+ }
303
+
304
+ get fullscreenShortcut() {
305
+ return html`
306
+ <button
307
+ @click=${() => this.closeFullscreen()}
308
+ title="Exit fullscreen view"
309
+ >${this.fullscreenBranding}</button>
310
+ `;
311
+ }
312
+ /** End Fullscreen Shortcut */
313
+
314
+ /**
315
+ * Open side menu
316
+ * @param {string} menuId
317
+ * @param {('open'|'close'|'toggle')} action
318
+ */
319
+ updateSideMenu(menuId = '', action = 'open') {
320
+ if (!menuId) {
321
+ return;
322
+ }
323
+ const event = new CustomEvent(
324
+ events.updateSideMenu, {
325
+ detail: { menuId, action },
326
+ },
327
+ );
328
+ this.dispatchEvent(event);
329
+ }
330
+
331
+ /**
332
+ * Sets order of menu and emits custom event when done
333
+ */
334
+ updateMenuContents() {
335
+ const availableMenus = sortBy(
336
+ Object.entries(this.menuProviders)
337
+ .filter(([id, menu]) => !!menu)
338
+ .filter(([id, menu]) => {
339
+ return id === 'downloads' ? this.shouldShowDownloadsMenu() : true;
340
+ }),
341
+ ([id, menu]) => {
342
+ const index = this.shortcutOrder.indexOf(id);
343
+ return index === -1 ? this.shortcutOrder.length : index;
344
+ },
345
+ ).map(([id, menu]) => menu);
346
+
347
+ if (this.shouldShowDownloadsMenu()) {
348
+ this.menuProviders.downloads?.update(this.downloadableTypes);
349
+ }
350
+
351
+ const event = new CustomEvent(
352
+ events.menuUpdated, {
353
+ detail: availableMenus,
354
+ },
355
+ );
356
+ this.dispatchEvent(event);
357
+ }
358
+
359
+ /**
360
+ * Confirms if we should show the downloads menu
361
+ * @returns {bool}
362
+ */
363
+ shouldShowDownloadsMenu() {
364
+ if (!this.downloadableTypes.length) { return false; }
365
+ if (this.bookIsRestricted === false) { return true; }
366
+ if (this.isAdmin) { return true; }
367
+ const { user_loan_record = {} } = this.lendingStatus;
368
+ const hasNoLoanRecord = Array.isArray(user_loan_record); /* (bc PHP assoc. arrays) */
369
+
370
+ if (hasNoLoanRecord) { return false; }
371
+
372
+ const hasValidLoan = user_loan_record.type && (user_loan_record.type !== 'SESSION_LOAN');
373
+ return hasValidLoan;
374
+ }
375
+
376
+ /**
377
+ * Adds a provider object to the menuShortcuts array property if it isn't
378
+ * already added. menuShortcuts are then sorted by shortcutOrder and
379
+ * a menuShortcutsUpdated event is emitted.
380
+ *
381
+ * @param {string} menuId - a string matching the id property of a provider
382
+ */
383
+ addMenuShortcut(menuId) {
384
+ if (this.menuShortcuts.find((m) => m.id === menuId)) {
385
+ // menu is already there
386
+ return;
387
+ }
388
+
389
+ if (!this.menuProviders[menuId]) {
390
+ // no provider for this menu
391
+ return;
392
+ }
393
+
394
+ this.menuShortcuts.push(this.menuProviders[menuId]);
395
+ this.sortMenuShortcuts();
396
+ this.emitMenuShortcutsUpdated();
397
+ }
398
+
399
+ /**
400
+ * Removes a provider object from the menuShortcuts array and emits a
401
+ * menuShortcutsUpdated event.
402
+ *
403
+ * @param {string} menuId - a string matching the id property of a provider
404
+ */
405
+ removeMenuShortcut(menuId) {
406
+ this.menuShortcuts = this.menuShortcuts.filter((m) => m.id !== menuId);
407
+ this.emitMenuShortcutsUpdated();
408
+ }
409
+
410
+ /**
411
+ * Sorts the menuShortcuts property by comparing each provider's id to
412
+ * the id in each iteration over the shortcutOrder array.
413
+ */
414
+ sortMenuShortcuts() {
415
+ this.menuShortcuts = sortBy(
416
+ this.menuShortcuts,
417
+ (shortcut) => {
418
+ const index = this.shortcutOrder.indexOf(shortcut.id);
419
+ return index === -1 ? this.shortcutOrder.length : index;
420
+ },
421
+ );
422
+ }
423
+
424
+ emitMenuShortcutsUpdated() {
425
+ const event = new CustomEvent('menuShortcutsUpdated', {
426
+ detail: this.menuShortcuts,
427
+ });
428
+ this.dispatchEvent(event);
429
+ }
430
+
431
+ emitLoadingStatusUpdate(loaded) {
432
+ const event = new CustomEvent('loadingStateUpdated', {
433
+ detail: { loaded },
434
+ });
435
+ this.dispatchEvent(event);
436
+ }
437
+
438
+ /**
439
+ * Core bookreader event handler registry
440
+ *
441
+ * NOTE: we are trying to keep bookreader's instance in scope
442
+ * Please update Book Navigator's instance reference of it to keep it current
443
+ */
444
+ bindEventListeners() {
445
+ window.addEventListener('BookReader:PostInit', (e) => {
446
+ this.bookreader = e.detail.props;
447
+ this.bookreader.shell = this;
448
+ this.bookReaderLoaded = true;
449
+ this.bookReaderCannotLoad = false;
450
+ this.emitLoadingStatusUpdate(true);
451
+ this.loadSharedObserver();
452
+ setTimeout(() => {
453
+ this.bookreader.resize();
454
+ }, 0);
455
+ });
456
+ window.addEventListener('BookReader:fullscreenToggled', (event) => {
457
+ const { detail: { props: brInstance = null } } = event;
458
+ if (brInstance) {
459
+ this.bookreader = brInstance;
460
+ }
461
+ this.manageFullScreenBehavior();
462
+ }, { passive: true });
463
+ window.addEventListener('BookReader:ToggleSearchMenu', (event) => {
464
+ this.dispatchEvent(new CustomEvent(events.updateSideMenu, {
465
+ detail: { menuId: 'search', action: 'toggle' },
466
+ }));
467
+ });
468
+ window.addEventListener('LendingFlow:PostInit', ({ detail }) => {
469
+ const {
470
+ downloadTypesAvailable, lendingStatus, isAdmin, previewType,
471
+ } = detail;
472
+ this.lendingInitialized = true;
473
+ this.downloadableTypes = downloadTypesAvailable;
474
+ this.lendingStatus = lendingStatus;
475
+ this.isAdmin = isAdmin;
476
+ this.bookReaderCannotLoad = previewType === 'singlePagePreview';
477
+ this.emitLoadingStatusUpdate(true);
478
+ });
479
+ window.addEventListener('BRJSIA:PostInit', ({ detail }) => {
480
+ const { isRestricted, downloadURLs } = detail;
481
+ this.bookReaderLoaded = true;
482
+ this.downloadableTypes = downloadURLs;
483
+ this.bookIsRestricted = isRestricted;
484
+ });
485
+ window.addEventListener('contextmenu', (e) => this.manageContextMenuVisibility(e), { capture: true });
486
+ }
487
+
488
+ /** Display an element's context menu */
489
+ manageContextMenuVisibility(e) {
490
+ window.archive_analytics?.send_event(
491
+ 'BookReader',
492
+ `contextmenu-${this.bookIsRestricted ? 'restricted' : 'unrestricted'}`,
493
+ e.target?.classList?.value,
494
+ );
495
+ if (!this.bookIsRestricted) {
496
+ return;
497
+ }
498
+
499
+ const imagePane = e.target.classList.value.match(/BRscreen|BRpageimage/g);
500
+ if (!imagePane) {
501
+ return;
502
+ }
503
+
504
+ e.preventDefault();
505
+ return false;
506
+ }
507
+
508
+ loadSharedObserver() {
509
+ this.sharedObserverHandler = { handleResize: this.handleResize.bind(this) };
510
+ this.sharedObserver?.addObserver({
511
+ target: this.mainBRContainer,
512
+ handler: this.sharedObserverHandler,
513
+ });
514
+ }
515
+
516
+ /**
517
+ * Uses resize observer to fire BookReader's `resize` functionality
518
+ * We do not want to trigger resize IF:
519
+ * - book animation is happening
520
+ * - book is in fullscreen (fullscreen is handled separately)
521
+ *
522
+ * @param { target: HTMLElement, contentRect: DOMRectReadOnly } entry
523
+ */
524
+ handleResize({ contentRect, target }) {
525
+ const startBrWidth = this.brWidth;
526
+ const startBrHeight = this.brHeight;
527
+ const { animating } = this.bookreader;
528
+
529
+ if (target === this.mainBRContainer) {
530
+ this.brWidth = contentRect.width;
531
+ this.brHeight = contentRect.height;
532
+ }
533
+
534
+ if (!startBrWidth && this.brWidth) {
535
+ // loading up, let's update side menus
536
+ this.initializeBookSubmenus();
537
+ }
538
+
539
+ const widthChange = startBrWidth !== this.brWidth;
540
+ const heightChange = startBrHeight !== this.brHeight;
541
+
542
+ if (!animating && (widthChange || heightChange)) {
543
+ this.bookreader?.resize();
544
+ }
545
+ }
546
+
547
+ /**
548
+ * Manages Fullscreen behavior
549
+ * This makes sure that controls are _always_ in view
550
+ * We need this to accommodate LOAN BAR during fullscreen
551
+ */
552
+ manageFullScreenBehavior() {
553
+ this.emitFullScreenState();
554
+
555
+ if (!this.bookreader.options.enableFSLogoShortcut) {
556
+ return;
557
+ }
558
+
559
+ const isFullScreen = this.bookreader.isFullscreen();
560
+ if (isFullScreen) {
561
+ this.addFullscreenShortcut();
562
+ } else {
563
+ this.deleteFullscreenShortcut();
564
+ }
565
+ }
566
+
567
+ /**
568
+ * Relays fullscreen toggle events
569
+ */
570
+ emitFullScreenState() {
571
+ const isFullScreen = this.bookreader.isFullscreen();
572
+ const event = new CustomEvent('ViewportInFullScreen', {
573
+ detail: { isFullScreen },
574
+ });
575
+ this.dispatchEvent(event);
576
+ }
577
+
578
+ get itemImage() {
579
+ const identifier = this.itemMD?.metadata.identifier;
580
+ const url = `https://${this.baseHost}/services/img/${identifier}`;
581
+ return html`<img class="cover-img" src=${url} alt="cover image for ${identifier}">`;
582
+ }
583
+
584
+ get placeholder() {
585
+ return html`<div class="placeholder">${this.itemImage}</div>`;
586
+ }
587
+
588
+ render() {
589
+ return html`<div id="book-navigator__root">
590
+ ${this.bookReaderCannotLoad ? this.placeholder : nothing}
591
+ ${!this.bookReaderCannotLoad ? html`<slot name="main"></slot>` : nothing}
592
+ </div>
593
+ `;
594
+ }
595
+
596
+ static get styles() {
597
+ return css`
598
+ :host,
599
+ #book-navigator__root,
600
+ slot,
601
+ slot > * {
602
+ display: block;
603
+ height: inherit;
604
+ width: inherit;
605
+ }
606
+ .placeholder {
607
+ display: flex;
608
+ align-items: center;
609
+ justify-content: center;
610
+ flex-direction: column;
611
+ margin: 5%;
612
+ }
613
+ .cover-img {
614
+ max-height: 300px;
615
+ }
616
+ `;
617
+ }
618
+ }
619
+
620
+ customElements.define('book-navigator', BookNavigator);
@@ -1,4 +1,4 @@
1
- import { LitElement, html, css } from 'lit-element';
1
+ import { LitElement, html, css } from 'lit';
2
2
 
3
3
  export default class BookmarkButton extends LitElement {
4
4
  static get styles() {
@@ -12,7 +12,7 @@ export default class BookmarkButton extends LitElement {
12
12
  height: 4rem;
13
13
  width: 4rem;
14
14
  background: transparent;
15
- cursor: url('/images/bookreader/bookmark-add.png'), pointer;
15
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 0 16 24' width='16'%3E%3Cg fill='%23333' fill-rule='evenodd'%3E%3Cpath d='m15 0c.5522847 0 1 .44771525 1 1v23l-8-5.4545455-8 5.4545455v-23c0-.55228475.44771525-1 1-1zm-2 2h-10c-.51283584 0-.93550716.38604019-.99327227.88337887l-.00672773.11662113v18l6-4.3181818 6 4.3181818v-18c0-.51283584-.3860402-.93550716-.8833789-.99327227z'/%3E%3Cpath d='m8.75 6v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25v-2.25z' fill-rule='nonzero'/%3E%3C/g%3E%3C/svg%3E"), pointer;
16
16
  position: relative;
17
17
  }
18
18
  button > * {
@@ -40,6 +40,7 @@ export default class BookmarkButton extends LitElement {
40
40
  constructor() {
41
41
  super();
42
42
  this.state = 'hollow';
43
+ this.side = undefined;
43
44
  }
44
45
 
45
46
  handleClick(e) {
@@ -1,6 +1,5 @@
1
- import { nothing } from 'lit-html';
2
- import { repeat } from 'lit-html/directives/repeat.js';
3
- import { css, html, LitElement } from 'lit-element';
1
+ import { repeat } from 'lit/directives/repeat.js';
2
+ import { css, html, LitElement, nothing } from 'lit';
4
3
  import bookmarkColorsCSS from '../assets/bookmark-colors.js';
5
4
  import buttonCSS from '../assets/button-base.js';
6
5
 
@@ -1,6 +1,5 @@
1
- import { nothing } from 'lit-html';
2
- import { repeat } from 'lit-html/directives/repeat.js';
3
- import { css, html, LitElement } from 'lit-element';
1
+ import { repeat } from 'lit/directives/repeat.js';
2
+ import { css, html, LitElement, nothing } from 'lit';
4
3
  import './bookmark-edit.js';
5
4
  import '@internetarchive/icon-edit-pencil/icon-edit-pencil.js';
6
5
  import bookmarkColorsCSS from '../assets/bookmark-colors.js';
@@ -1,10 +1,10 @@
1
- import { LitElement, html } from 'lit-element';
1
+ import { LitElement, html } from 'lit';
2
2
  import buttonStyles from '../assets/button-base.js';
3
3
 
4
4
  class BookmarksLogin extends LitElement {
5
5
  static get properties() {
6
6
  return {
7
- url: { type: String }
7
+ url: { type: String },
8
8
  };
9
9
  }
10
10