@internetarchive/bookreader 5.0.0-8 → 5.0.0-80

Sign up to get free protection for your applications and to get access to all the features.
Files changed (313) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +73 -10
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +398 -1133
  6. package/BookReader/BookReader.js +1 -1
  7. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1782 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/1up.svg +1 -1
  13. package/BookReader/icons/2up.svg +1 -1
  14. package/BookReader/icons/advance.svg +1 -1
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -1
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -1
  19. package/BookReader/icons/fullscreen_exit.svg +1 -1
  20. package/BookReader/icons/hamburger.svg +1 -1
  21. package/BookReader/icons/left-arrow.svg +1 -1
  22. package/BookReader/icons/magnify-minus.svg +1 -1
  23. package/BookReader/icons/magnify-plus.svg +1 -1
  24. package/BookReader/icons/magnify.svg +1 -1
  25. package/BookReader/icons/pause.svg +1 -1
  26. package/BookReader/icons/play.svg +1 -1
  27. package/BookReader/icons/playback-speed.svg +1 -1
  28. package/BookReader/icons/read-aloud.svg +1 -1
  29. package/BookReader/icons/review.svg +1 -1
  30. package/BookReader/icons/thumbnails.svg +1 -1
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -1
  33. package/BookReader/images/BRicons.svg +3 -3
  34. package/BookReader/images/books_graphic.svg +1 -1
  35. package/BookReader/images/icon_book.svg +1 -1
  36. package/BookReader/images/icon_bookmark.svg +1 -1
  37. package/BookReader/images/icon_gear.svg +1 -1
  38. package/BookReader/images/icon_hamburger.svg +1 -1
  39. package/BookReader/images/icon_home.svg +1 -1
  40. package/BookReader/images/icon_info.svg +1 -1
  41. package/BookReader/images/icon_one_page.svg +1 -1
  42. package/BookReader/images/icon_pause.svg +1 -1
  43. package/BookReader/images/icon_play.svg +1 -1
  44. package/BookReader/images/icon_playback-rate.svg +1 -1
  45. package/BookReader/images/icon_search_button.svg +1 -1
  46. package/BookReader/images/icon_share.svg +1 -1
  47. package/BookReader/images/icon_skip-ahead.svg +1 -1
  48. package/BookReader/images/icon_skip-back.svg +1 -1
  49. package/BookReader/images/icon_speaker.svg +1 -1
  50. package/BookReader/images/icon_speaker_open.svg +1 -1
  51. package/BookReader/images/icon_thumbnails.svg +1 -1
  52. package/BookReader/images/icon_toc.svg +1 -1
  53. package/BookReader/images/icon_two_pages.svg +1 -1
  54. package/BookReader/images/marker_chap-off.svg +1 -1
  55. package/BookReader/images/marker_chap-on.svg +1 -1
  56. package/BookReader/images/marker_srch-on.svg +1 -1
  57. package/BookReader/jquery-3.js +2 -0
  58. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  59. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  60. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  61. package/BookReader/plugins/plugin.autoplay.js +1 -1
  62. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  63. package/BookReader/plugins/plugin.chapters.js +25 -1
  64. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  65. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  66. package/BookReader/plugins/plugin.iframe.js +1 -1
  67. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  68. package/BookReader/plugins/plugin.iiif.js +2 -0
  69. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  70. package/BookReader/plugins/plugin.resume.js +1 -1
  71. package/BookReader/plugins/plugin.resume.js.map +1 -1
  72. package/BookReader/plugins/plugin.search.js +2 -1
  73. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  74. package/BookReader/plugins/plugin.search.js.map +1 -1
  75. package/BookReader/plugins/plugin.text_selection.js +2 -1
  76. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  77. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  78. package/BookReader/plugins/plugin.tts.js +1 -1
  79. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  80. package/BookReader/plugins/plugin.tts.js.map +1 -1
  81. package/BookReader/plugins/plugin.url.js +1 -1
  82. package/BookReader/plugins/plugin.url.js.map +1 -1
  83. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  84. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  85. package/BookReader/webcomponents-bundle.js +3 -0
  86. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  87. package/BookReader/webcomponents-bundle.js.map +1 -0
  88. package/BookReaderDemo/BookReaderDemo.css +18 -19
  89. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  90. package/BookReaderDemo/BookReaderJSAutoplay.js +4 -1
  91. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  92. package/BookReaderDemo/IADemoBr.js +147 -0
  93. package/BookReaderDemo/demo-advanced.html +2 -2
  94. package/BookReaderDemo/demo-autoplay.html +2 -3
  95. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  96. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  97. package/BookReaderDemo/demo-fullscreen.html +2 -4
  98. package/BookReaderDemo/demo-iiif.html +99 -12
  99. package/BookReaderDemo/demo-internetarchive.html +214 -18
  100. package/BookReaderDemo/demo-multiple.html +2 -1
  101. package/BookReaderDemo/demo-preview-pages.html +2 -1
  102. package/BookReaderDemo/demo-simple.html +2 -1
  103. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
  104. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  105. package/BookReaderDemo/immersion-1up.html +2 -2
  106. package/BookReaderDemo/immersion-mode.html +2 -4
  107. package/BookReaderDemo/toggle_controls.html +3 -2
  108. package/BookReaderDemo/view_mode.html +2 -1
  109. package/BookReaderDemo/viewmode-cycle.html +2 -3
  110. package/CHANGELOG.md +536 -33
  111. package/README.md +14 -1
  112. package/babel.config.js +20 -0
  113. package/codecov.yml +6 -0
  114. package/index.html +4 -1
  115. package/jsconfig.json +19 -0
  116. package/netlify.toml +9 -0
  117. package/package.json +70 -60
  118. package/renovate.json +52 -0
  119. package/scripts/preversion.js +0 -1
  120. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  121. package/src/BookNavigator/assets/button-base.js +4 -2
  122. package/src/BookNavigator/assets/ia-logo.js +17 -0
  123. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  124. package/src/BookNavigator/assets/icon_close.js +1 -1
  125. package/src/BookNavigator/book-navigator.js +590 -0
  126. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  127. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  128. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  129. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  130. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  131. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  132. package/src/BookNavigator/delete-modal-actions.js +1 -1
  133. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  134. package/src/BookNavigator/downloads/downloads.js +41 -25
  135. package/src/BookNavigator/search/search-provider.js +49 -27
  136. package/src/BookNavigator/search/search-results.js +23 -9
  137. package/src/BookNavigator/sharing.js +27 -0
  138. package/src/BookNavigator/viewable-files.js +95 -0
  139. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  140. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  141. package/src/BookReader/BookModel.js +64 -34
  142. package/src/BookReader/DragScrollable.js +233 -0
  143. package/src/BookReader/Mode1Up.js +56 -351
  144. package/src/BookReader/Mode1UpLit.js +388 -0
  145. package/src/BookReader/Mode2Up.js +73 -1318
  146. package/src/BookReader/Mode2UpLit.js +776 -0
  147. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  148. package/src/BookReader/ModeSmoothZoom.js +312 -0
  149. package/src/BookReader/ModeThumb.js +18 -12
  150. package/src/BookReader/Navbar/Navbar.js +14 -40
  151. package/src/BookReader/PageContainer.js +81 -6
  152. package/src/BookReader/ReduceSet.js +1 -1
  153. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  154. package/src/BookReader/events.js +2 -3
  155. package/src/BookReader/options.js +27 -2
  156. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  157. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  158. package/src/BookReader/utils/SelectionObserver.js +45 -0
  159. package/src/BookReader/utils.js +118 -13
  160. package/src/BookReader.js +427 -1061
  161. package/src/assets/icons/magnify-minus.svg +3 -7
  162. package/src/assets/icons/magnify-plus.svg +3 -7
  163. package/src/assets/icons/voice.svg +1 -0
  164. package/src/css/BookReader.scss +1 -5
  165. package/src/css/_BRBookmarks.scss +1 -1
  166. package/src/css/_BRComponent.scss +1 -1
  167. package/src/css/_BRmain.scss +16 -3
  168. package/src/css/_BRnav.scss +12 -39
  169. package/src/css/_BRpages.scss +149 -40
  170. package/src/css/_BRsearch.scss +68 -25
  171. package/src/css/_BRtoolbar.scss +5 -5
  172. package/src/css/_TextSelection.scss +87 -27
  173. package/src/css/_colorbox.scss +2 -2
  174. package/src/css/_controls.scss +20 -7
  175. package/src/css/_icons.scss +1 -1
  176. package/src/ia-bookreader/ia-bookreader.js +224 -0
  177. package/src/plugins/plugin.archive_analytics.js +3 -3
  178. package/src/plugins/plugin.autoplay.js +5 -11
  179. package/src/plugins/plugin.chapters.js +237 -191
  180. package/src/plugins/plugin.iiif.js +151 -0
  181. package/src/plugins/plugin.resume.js +3 -3
  182. package/src/plugins/plugin.text_selection.js +464 -134
  183. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  184. package/src/plugins/search/plugin.search.js +142 -125
  185. package/src/plugins/search/utils.js +43 -0
  186. package/src/plugins/search/view.js +33 -58
  187. package/src/plugins/tts/AbstractTTSEngine.js +71 -40
  188. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  189. package/src/plugins/tts/PageChunk.js +15 -21
  190. package/src/plugins/tts/PageChunkIterator.js +8 -12
  191. package/src/plugins/tts/WebTTSEngine.js +87 -71
  192. package/src/plugins/tts/plugin.tts.js +96 -127
  193. package/src/plugins/tts/utils.js +15 -25
  194. package/src/plugins/url/UrlPlugin.js +191 -0
  195. package/src/plugins/{plugin.url.js → url/plugin.url.js} +45 -16
  196. package/src/util/browserSniffing.js +22 -0
  197. package/src/util/docCookies.js +21 -2
  198. package/tests/e2e/README.md +37 -0
  199. package/tests/e2e/autoplay.test.js +2 -2
  200. package/tests/e2e/base.test.js +8 -16
  201. package/tests/e2e/helpers/base.js +53 -48
  202. package/tests/e2e/helpers/debug.js +1 -1
  203. package/tests/e2e/helpers/params.js +17 -0
  204. package/tests/e2e/helpers/rightToLeft.js +8 -14
  205. package/tests/e2e/helpers/search.js +73 -0
  206. package/tests/e2e/models/Navigation.js +20 -37
  207. package/tests/e2e/rightToLeft.test.js +4 -5
  208. package/tests/e2e/viewmode.test.js +40 -33
  209. package/tests/jest/BookNavigator/book-navigator.test.js +661 -0
  210. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  211. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  212. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  213. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  214. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  215. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  216. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  217. package/tests/{karma → jest}/BookNavigator/search/search-results.test.js +109 -60
  218. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  219. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +80 -0
  220. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  221. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  222. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  223. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  224. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  225. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  226. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  227. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  228. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  229. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  230. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +10 -10
  231. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  232. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  233. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  234. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  235. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  236. package/tests/jest/BookReader/utils/SelectionObserver.test.js +57 -0
  237. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  238. package/tests/jest/BookReader/utils.test.js +229 -0
  239. package/tests/jest/BookReader.keyboard.test.js +190 -0
  240. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  241. package/tests/{BookReader.test.js → jest/BookReader.test.js} +26 -37
  242. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  243. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  244. package/tests/jest/plugins/plugin.chapters.test.js +195 -0
  245. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  246. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  247. package/tests/jest/plugins/plugin.text_selection.test.js +317 -0
  248. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  249. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +25 -47
  250. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +39 -6
  251. package/tests/jest/plugins/search/utils.js +25 -0
  252. package/tests/jest/plugins/search/utils.test.js +29 -0
  253. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +29 -9
  254. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  255. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  256. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  257. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  258. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  259. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  260. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +53 -14
  261. package/tests/jest/setup.js +3 -0
  262. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  263. package/tests/jest/util/docCookies.test.js +24 -0
  264. package/tests/{util → jest/util}/strings.test.js +1 -1
  265. package/tests/{utils.js → jest/utils.js} +38 -0
  266. package/webpack.config.js +12 -6
  267. package/.babelrc +0 -12
  268. package/.dependabot/config.yml +0 -6
  269. package/.testcaferc.json +0 -5
  270. package/BookReader/bookreader-component-bundle.js +0 -1450
  271. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  272. package/BookReader/bookreader-component-bundle.js.map +0 -1
  273. package/BookReader/jquery-1.10.1.js +0 -2
  274. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  275. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  276. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  277. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  278. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  279. package/BookReaderDemo/IIIFBookReader.js +0 -207
  280. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  281. package/BookReaderDemo/demo-iiif.js +0 -26
  282. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  283. package/karma.conf.js +0 -23
  284. package/src/BookNavigator/BookModel.js +0 -14
  285. package/src/BookNavigator/BookNavigator.js +0 -446
  286. package/src/BookNavigator/assets/book-loader.js +0 -27
  287. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  288. package/src/BookNavigator/search/a-search-result.js +0 -55
  289. package/src/BookReader/DebugConsole.js +0 -54
  290. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  291. package/src/ItemNavigator/ItemNavigator.js +0 -376
  292. package/src/ItemNavigator/providers/sharing.js +0 -29
  293. package/src/css/_MobileNav.scss +0 -194
  294. package/src/dragscrollable-br.js +0 -261
  295. package/src/lit-wrapper.js +0 -2
  296. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  297. package/src/plugins/plugin.mobile_nav.js +0 -287
  298. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  299. package/tests/BookReader/DebugConsole.test.js +0 -25
  300. package/tests/BookReader/Mode1Up.test.js +0 -164
  301. package/tests/BookReader/Mode2Up.test.js +0 -247
  302. package/tests/BookReader/utils.test.js +0 -109
  303. package/tests/e2e/helpers/desktopSearch.js +0 -72
  304. package/tests/e2e/helpers/mobileSearch.js +0 -85
  305. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  306. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  307. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  308. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  309. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  310. package/tests/plugins/plugin.chapters.test.js +0 -130
  311. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  312. package/tests/plugins/plugin.text_selection.test.js +0 -203
  313. package/tests/util/docCookies.test.js +0 -15
@@ -1,324 +0,0 @@
1
-
2
- /* global BookReader */
3
- /**
4
- * Plugin for managing menu visibility
5
- * Enabling this plug-in:
6
- * + removes the "menu tab" triangle
7
- * + toggles nav at: book center tap/click
8
- * + toggles nav at: black background tap/click
9
- *
10
- * Handles to events at CAPTURE phase
11
- *
12
- * This uses core BookReader functions and parameters to check its UI state:
13
- * - br.refs = (at best) ui references that are present at any given time
14
- * - br.navigationIsVisible() - checks using refs to confirm the navbar's presence
15
- * - br.showNavigation() & br.hideNavigation()
16
- * - br.constMode1up checks against br.mode;
17
- *
18
- * The list of BookReader custom events this plugin taps into are mainly
19
- * listed in the `.init` function
20
- */
21
-
22
- (function addMenuToggler() {
23
- jQuery.extend(BookReader.defaultOptions, {
24
- enableMenuToggle: true
25
- });
26
-
27
- /**
28
- * `holdOffOnToggle` is used in fn `toggleRouter`
29
- * to determine if menu toggle should happen
30
- * set by `registerDragHandlers`
31
- */
32
- let holdOffOnToggle = false;
33
-
34
- /**
35
- * Hides Nav arrow tab
36
- *
37
- * @param { object } br - BookReader instance
38
- */
39
- function hideArrow(br) {
40
- if (!br.refs || !br.refs.$BRnav) {
41
- return;
42
- }
43
- const $menuTab = br.refs.$BRnav.children('.BRnavCntl');
44
- $menuTab.css('display', 'none');
45
- }
46
-
47
- /**
48
- * Sets up nav - hides arrow tab & adds click events
49
- *
50
- * @param { object } br - BookReader instance
51
- */
52
- function setupNavForToggle(br) {
53
- hideArrow(br);
54
- registerClickHandlers(br);
55
- }
56
-
57
- /**
58
- * Resets nav to always show
59
- * hides arrow tab, removes click events, shows nav chrome
60
- *
61
- * @param { object } br - BookReader instance
62
- */
63
- function alwaysShowNav(br) {
64
- hideArrow(br);
65
- removeClickHandlers(br);
66
- br.showNavigation();
67
- }
68
-
69
- /**
70
- * Removes click handlers on elements that house the book pages
71
- *
72
- * @param { object } br - BookReader instance
73
- */
74
- const removeClickHandlers = function removeClickHandlers(br) {
75
- if (br.refs.$brPageViewEl) {
76
- br.refs.$brPageViewEl[0].removeEventListener('click', onBookClick, true);
77
- }
78
- if (br.refs.$brTwoPageView) {
79
- br.refs.$brTwoPageView[0].removeEventListener('click', onBookClick, true);
80
- }
81
- }
82
-
83
- /**
84
- * Toggle functionality
85
- * Responsible for calling native functions `hideNavigation` & `showNavigation`
86
- * Makes sure only 1 toggle action is taken at a time using `togglingNav` switch.
87
- *
88
- * @params { object } br - bookreader instance
89
- */
90
- let togglingNav = false; /* flag to make sure animations only fire once */
91
- const toggleNav = function toggleNav(br) {
92
- if (togglingNav) {
93
- return;
94
- }
95
-
96
- togglingNav = true;
97
- const navToggled = function navToggled() {
98
- togglingNav = false;
99
- window.removeEventListener('BookReader:navToggled', navToggled);
100
- };
101
- $(document).on('BookReader:navToggled', navToggled);
102
-
103
- const menuIsShowing = br.navigationIsVisible();
104
- if (menuIsShowing) {
105
- br.hideNavigation();
106
- } else {
107
- br.showNavigation();
108
- }
109
- }
110
-
111
- /**
112
- * Check if div `BRcontainer` is scrollable.
113
- * This normally happens when bookreader is zoomed in.
114
- * not using br.refs, because `scrollWidth` & `offsetWidth` is not easily accessible.
115
- */
116
- const isBRcontainerScrollable = function isBRcontainerScrollable() {
117
- const brContainer = document.querySelector('.BRcontainer');
118
- const scrollWidth = brContainer.scrollWidth;
119
- const offsetWidth = brContainer.offsetWidth;
120
-
121
- return scrollWidth > offsetWidth;
122
- }
123
-
124
- /**
125
- * Confirms whether or not the click happened in the nav toggle zone
126
- *
127
- * @param { MouseEvent } event - JS click event object
128
- * @param { DOM } book - DOM element that represents book
129
- */
130
- const isCenterClick = function isCenterClick(event, book) {
131
- const clickPosition = event.clientX;
132
- const bookWidth = book.offsetWidth;
133
- const leftOffset = book.offsetLeft
134
- const bookEndPageFlipArea = Math.round(bookWidth / 3);
135
- const leftThreshold = Math.round(bookEndPageFlipArea + leftOffset); // without it, the click area is small
136
- const rightThreshold = Math.round(bookWidth - bookEndPageFlipArea + leftOffset);
137
- const isOkOnRight = clickPosition > leftThreshold;
138
- const isOkOnLeft = clickPosition < rightThreshold;
139
- const isCenterClick = isOkOnRight && isOkOnLeft;
140
-
141
- return isCenterClick;
142
- }
143
-
144
- /**
145
- * Confirms whether or not the click happened in the background
146
- *
147
- * @param { DOM } element
148
- */
149
- const isBackground = function isBackground(element) {
150
- const isBackgroundClick = $(element).hasClass('BookReader')
151
- || $(element).hasClass('BRcontainer') /* main black theatre */
152
- || $(element).hasClass('BRemptypage') /* empty page placeholder */
153
- || $(element).hasClass('BRpageview') /* empty page placeholder, 1up */
154
- || $(element).hasClass('BRtwopageview'); /* empty page placeholder, 2up */
155
- return isBackgroundClick;
156
- };
157
-
158
- /**
159
- * Main hook into toggle functionality
160
- * This is the only function that should be called by the event handlers
161
- *
162
- * @param { object } br - BookReader instance
163
- * @param { MouseEvent } e - JS event object
164
- * @param { boolean } atBookCenter - optional
165
- */
166
- const toggleRouter = function toggleRouter (br, e, atBookCenter) {
167
- if (holdOffOnToggle) {
168
- return;
169
- }
170
-
171
- const book = isBRcontainerScrollable() ? br.refs.$brContainer[0] : e.currentTarget;
172
- const is1UpMode = br.constMode1up === br.mode;
173
- const validBookClick = is1UpMode || isCenterClick(e, book);
174
- const isValidClickArea = atBookCenter ? validBookClick : isBackground(e.target);
175
- if (isValidClickArea) {
176
- toggleNav(br, atBookCenter);
177
-
178
- if (atBookCenter) {
179
- e.stopPropagation(); // don't turn the page. this takes prescendence
180
- }
181
- }
182
- }
183
-
184
- /**
185
- * background click event handler
186
- * @param { object } br - BookReader instance
187
- * @param { MouseEvent } e - JS event object
188
- */
189
- function onBackgroundClick(br, e) {
190
- toggleRouter(br, e);
191
- }
192
-
193
- /**
194
- * actual book container click event handler
195
- *
196
- * @param { object } br - BookReader instance
197
- * @param { MouseEvent } e - JS event object
198
- */
199
- function onBookClick(br, e) {
200
-
201
- const atBookCenter = true;
202
- toggleRouter(br, e, atBookCenter);
203
- }
204
-
205
- let initialX;
206
- let initialY;
207
- /**
208
- * attaches mouseup & mousedown event handlers to assess if user is dragging
209
- * sets `initialX`, `initialY`, and `holdOffOnToggle`
210
- */
211
- function registerDragHandlers() {
212
- const background = document.querySelector('.BookReader');
213
- if (!background) {
214
- return;
215
- }
216
-
217
- background.addEventListener('mousedown', function (e) {
218
- initialX = e.screenX;
219
- initialY = e.screenY;
220
-
221
- holdOffOnToggle = true;
222
- }, true);
223
- background.addEventListener('mouseup', function (e) {
224
- const isDrag = (Math.abs(initialX - e.screenX) > 5 || Math.abs(initialY - e.screenY) > 5);
225
-
226
- if (!isDrag) {
227
- holdOffOnToggle = false;
228
- initialX = 0;
229
- initialY = 0;
230
- }
231
- }, true);
232
- }
233
-
234
- /**
235
- * attaches click handlers to background & book
236
- * @param { object } br - BookReader instance
237
- */
238
- function registerClickHandlers(br) {
239
- const background = document.querySelector('.BookReader');
240
- if (!background) {
241
- return;
242
- }
243
-
244
- background.addEventListener('click', onBackgroundClick.bind(null, br), { capture: true, passive: true });
245
-
246
- const desk = document.querySelector('.BRcontainer') || {};
247
- const book = desk.firstChild;
248
-
249
- if (book) {
250
- book.addEventListener('click', onBookClick.bind(null, br), true);
251
- registerDragHandlers();
252
- }
253
- }
254
-
255
- /**
256
- * Install menu toggle
257
- * attaches event handlers, sets up DOM on load
258
- */
259
- const installMenuToggle = function installMenuToggle(br) {
260
- let hasNav = false;
261
-
262
- try {
263
- hasNav = br.navigationIsVisible();
264
- } catch (error) {
265
- hasNav = false;
266
- }
267
-
268
- if (!hasNav) {
269
- return;
270
- }
271
-
272
- const menuToggleEventRegister = function menuToggleEventRegister(e) {
273
- registerClickHandlers(br);
274
- };
275
-
276
- const setupDOMandHandlers = function setupDOMandHandlers(e) {
277
- setupNavForToggle(br);
278
- };
279
-
280
- const persistNav = function persistNav(e) {
281
- alwaysShowNav(br);
282
- };
283
-
284
- const whenToToggleNav = [
285
- 'BookReader:1PageViewSelected',
286
- 'BookReader:2PageViewSelected',
287
- 'BookReader:zoomIn',
288
- 'BookReader:zoomOut',
289
- 'BookReader:resize'
290
- ];
291
-
292
- const whenTolwaysShowNavWhen = [
293
- 'BookReader:3PageViewSelected'
294
- ];
295
-
296
- $(document).on(whenTolwaysShowNavWhen.join(' '), persistNav);
297
- $(document).on(whenToToggleNav.join(' '), menuToggleEventRegister);
298
- $(window).on('orientationchange', menuToggleEventRegister);
299
- $(document).on('BookReader:fullscreenToggled', setupDOMandHandlers);
300
- $(window).on('DOMContentLoaded', setupDOMandHandlers);
301
- setupDOMandHandlers();
302
- };
303
-
304
- /**
305
- * Add to BookReader
306
- */
307
- BookReader.prototype.setup = (function(super_) {
308
- return function(options) {
309
- super_.call(this, options);
310
- };
311
- })(BookReader.prototype.setup);
312
-
313
- /**
314
- * Initialize plugin
315
- */
316
- BookReader.prototype.init = (function(super_) {
317
- return function() {
318
- super_.call(this);
319
- if (this.options.enableMenuToggle) {
320
- installMenuToggle(this);
321
- }
322
- };
323
- })(BookReader.prototype.init);
324
- })();
@@ -1,287 +0,0 @@
1
- /* global BookReader */
2
- /**
3
- * Adds mobile navigation at responsive breakpoint
4
- */
5
-
6
- import * as utils from '../BookReader/utils.js';
7
- import 'jquery.mmenu/dist/js/jquery.mmenu.min.js';
8
- import 'jquery.mmenu/dist/addons/navbars/jquery.mmenu.navbars.min.js';
9
-
10
- //contains all filters and labels for checkboxs
11
- const FILTERLIST = [
12
- {
13
- filter: "grayscale(100%)",
14
- label: "Grayscale"
15
- },
16
- {
17
- filter: "brightness(120%)",
18
- label: "High brightness"
19
- },
20
- {
21
- filter: "invert(100%)",
22
- label: "Inverted (dark mode)"
23
- },
24
- {
25
- filter: "contrast(120%)",
26
- label: "High contrast"
27
- },
28
- ]
29
-
30
- jQuery.extend(BookReader.defaultOptions, {
31
- enableMobileNav: true,
32
- mobileNavTitle: 'Internet Archive',
33
- mobileNavFullscreenOnly: false,
34
- });
35
-
36
- BookReader.prototype.setup = (function(super_) {
37
- return function (options) {
38
- super_.call(this, options);
39
-
40
- this.enableMobileNav = options.enableMobileNav;
41
- this.mobileNavTitle = options.mobileNavTitle;
42
- this.mobileNavFullscreenOnly = options.mobileNavFullscreenOnly;
43
-
44
- this.refs.$mmenu = null;
45
- };
46
- })(BookReader.prototype.setup);
47
-
48
-
49
- // Extend initToolbar
50
- BookReader.prototype.initToolbar = (function (super_) {
51
- return function (mode, ui) {
52
- let $mmenuEl;
53
- if (this.enableMobileNav) {
54
- const $drawerEl = this.buildMobileDrawerElement();
55
- this.refs.$br.append($drawerEl);
56
-
57
- // Render info into mobile info before mmenu
58
- this.buildInfoDiv(this.$('.BRmobileInfo'));
59
- this.buildShareDiv(this.$('.BRmobileShare'));
60
-
61
- $mmenuEl = $drawerEl;
62
- $mmenuEl.mmenu({
63
- navbars: [
64
- { "position": "top" },
65
- ],
66
- navbar: {
67
- add: true,
68
- title: this.mobileNavTitle,
69
- titleLink: 'panel'
70
- },
71
- extensions: [ "panelshadow" ],
72
- }, {
73
- offCanvas: {
74
- wrapPageIfNeeded: false,
75
- zposition: 'next',
76
- pageSelector: this.el,
77
- }
78
- });
79
-
80
- const $BRpageviewField = $mmenuEl.find('.BRpageviewValue');
81
- $mmenuEl.data('mmenu').bind('opened', () => {
82
- // Update "Link to this page view" link
83
- if ($BRpageviewField.length) {
84
- $BRpageviewField.val(window.location.href);
85
- }
86
- });
87
-
88
- //apply filters when checkboxs clicked
89
- $drawerEl.find('.BRcheckbox-filters').click(() => applyFilters($drawerEl, this));
90
-
91
- // Bind mobile switch buttons
92
- $drawerEl.find('.DrawerLayoutButton.one_page_mode').click(
93
- () => this.switchMode(this.constMode1up));
94
- $drawerEl.find('.DrawerLayoutButton.two_page_mode').click(
95
- () => this.switchMode(this.constMode2up));
96
- $drawerEl.find('.DrawerLayoutButton.thumbnail_mode').click(
97
- () => this.switchMode(this.constModeThumb));
98
-
99
- if (this.mobileNavFullscreenOnly) {
100
- $(document.body).addClass('BRbodyMobileNavEnabledFullscreen');
101
- } else {
102
- $(document.body).addClass('BRbodyMobileNavEnabled');
103
- }
104
-
105
- this.refs.$mmenu = $mmenuEl;
106
-
107
- }
108
-
109
- // Call the parent method at the end, because it binds events to DOM
110
- super_.apply(this, arguments);
111
-
112
-
113
- if (this.enableMobileNav) {
114
- // Need to bind more, console after toolbar is initialized
115
- this.$('.BRmobileHamburger').click(() => {
116
- if ($mmenuEl.data('mmenu').getInstance().vars.opened) {
117
- $mmenuEl.data('mmenu').close();
118
- } else {
119
- $mmenuEl.data('mmenu').open();
120
- this.trigger("mobileNavOpen");
121
- }
122
- });
123
-
124
-
125
- const closeMobileMenu = (e) => {
126
- // Need to close the mobile menu to reset DOM & Style
127
- // driven by menu plugin
128
- const width = $( window ).width();
129
- const mobileMenuIsOpen = $mmenuEl.data('mmenu').getInstance().vars.opened;
130
- // $brBreakPointMobile: 800px;
131
- if (mobileMenuIsOpen && (width >= 800)) {
132
- $mmenuEl.data('mmenu').close ();
133
- }
134
- };
135
-
136
- window.addEventListener('resize', utils.debounce(closeMobileMenu, 900));
137
- }
138
- };
139
- })(BookReader.prototype.initToolbar);
140
-
141
-
142
- BookReader.prototype.buildToolbarElement = (function (super_) {
143
- return function () {
144
- const $el = super_.call(this);
145
- if (this.enableMobileNav) {
146
- const escapedTitle = BookReader.util.escapeHTML(this.bookTitle);
147
- const toolbar = `
148
- <span class="BRmobileHamburgerWrapper">
149
- <button class="BRmobileHamburger"></button>
150
- <span class="BRtoolbarMobileTitle" title="${escapedTitle}">${escapedTitle}</span>
151
- </span>
152
- `;
153
- $el
154
- .addClass('responsive')
155
- .prepend($(toolbar));
156
- }
157
- return $el;
158
- };
159
- })(BookReader.prototype.buildToolbarElement);
160
-
161
- /**
162
- * This method builds the html for the mobile drawer. It can be decorated to
163
- * extend the default drawer.
164
- * @return {jqueryElement}
165
- */
166
- BookReader.prototype.buildMobileDrawerElement = function() {
167
- let experimentalHtml = '';
168
- //builds filters checkbox html
169
- if (this.enableExperimentalControls) {
170
- experimentalHtml = `
171
- <p class="DrawerSettingsTitle">Visual Adjustment</p>
172
- <div class="BRcheckbox-group-filters">
173
- `;
174
- FILTERLIST.forEach( (el, i) => {
175
- const checkboxHtml = `
176
- <input type="checkbox" class="BRcheckbox-filters" id="filter${i}">
177
- <label for="filter${i}" class="BRcheckbox-label-filters">${el.label}</label><br>
178
-
179
- `;
180
- experimentalHtml = experimentalHtml.concat(checkboxHtml);
181
- })
182
- experimentalHtml = experimentalHtml.concat("</div>");
183
- }
184
-
185
-
186
- const settingsSection = `
187
- <span>
188
- <span class="DrawerIconWrapper">
189
- <img class="DrawerIcon" src="${`${this.imagesBaseURL}icon_gear.svg`}" alt="settings-icon"/>
190
- </span>
191
- Settings
192
- </span>
193
- <div class=DrawerSettingsWrapper>
194
- <div class="DrawerSettingsLayoutWrapper">
195
- <button class="DrawerLayoutButton one_page_mode">
196
- <img src="${this.imagesBaseURL}icon_one_page.svg" alt="Single Page"/>
197
- <br>
198
- One Page
199
- </button>
200
- <button class="DrawerLayoutButton two_page_mode TwoPagesButton">
201
- <img src="${this.imagesBaseURL}icon_two_pages.svg" alt="Two Pages"/>
202
- <br>
203
- Two Pages
204
- </button>
205
- <button class="DrawerLayoutButton thumbnail_mode">
206
- <img src="${this.imagesBaseURL}icon_thumbnails.svg" alt="Thumbnails"/>
207
- <br>
208
- Thumbnails
209
- </button>
210
- </div>
211
- <br>
212
- <div class="DrawerSettingsTitle">Zoom</div>
213
- <button class='BRicon zoom_out'></button>
214
- <button class='BRicon zoom_in'></button>
215
- <br style="clear:both"><br><br>
216
- ${experimentalHtml}
217
- </div>
218
- `;
219
- const moreInfo = `
220
- <span>
221
- <span class="DrawerIconWrapper ">
222
- <img class="DrawerIcon" src="${this.imagesBaseURL}icon_info.svg" alt="info-icon"/>
223
- </span>
224
- About This Book
225
- </span>
226
- <div class="BRmobileInfo"></div>
227
- `;
228
- const share = `
229
- <span>
230
- <span class="DrawerIconWrapper">
231
- <img class="DrawerIcon" src="${this.imagesBaseURL}icon_share.svg" alt="info-share"/>
232
- </span>
233
- Share This Book
234
- </span>
235
- <div class="BRmobileShare"></div>
236
- `;
237
- const navMenu = `
238
- <nav id="BRmobileMenu" class="BRmobileMenu">
239
- <ul>
240
- <li class="BRmobileMenu__settings">${settingsSection}</li>
241
- <li class="BRmobileMenu__moreInfoRow">${moreInfo}</li>
242
- <li class="BRmobileMenu__share">${share}</li>
243
- </ul>
244
- </nav>
245
- `;
246
-
247
- const $el = $(navMenu);
248
- return $el;
249
- };
250
-
251
- /**
252
- * Mmenu moves itself out side of the root BookReader element, so we need to
253
- * include it in the scoped $ function.
254
- */
255
- BookReader.prototype.$ = (function (super_) {
256
- return function (arg) {
257
- let $results = super_.call(this, arg);
258
- if (this.refs.$mmenu) {
259
- $results = $results.add(this.refs.$mmenu.find(arg));
260
- }
261
- return $results;
262
- };
263
- })(BookReader.prototype.$);
264
-
265
- /**
266
- * Dynamically creates styles combining different filters for BookReaders imgs
267
- * based on filters checkbox
268
- */
269
- const applyFilters = (drawerEl, br) => {
270
- let filterStr = "";
271
-
272
- $('.BRcheckbox-filters').each(
273
- (i, el) => {
274
- br.refs.$br.removeClass("filter-applied");
275
- if ($(el).is(':checked')) {
276
- br.refs.$br.addClass($(el).attr("filter-applied"));
277
- filterStr = filterStr + FILTERLIST[i].filter;
278
- }
279
- }
280
- );
281
- const filtersSheet = $("#filtersStyle")[0] || document.createElement('style');
282
- filtersSheet.id = "filtersStyle";
283
- filtersSheet.innerHTML = `.BRpagecontainer img {
284
- filter: ${filterStr};
285
- -webkit-filter: ${filterStr};}`;
286
- document.body.appendChild(filtersSheet);
287
- }