@internetarchive/bookreader 5.0.0-9-multiple-files → 5.0.0-90

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 (333) hide show
  1. package/.eslintrc.js +21 -19
  2. package/.github/workflows/node.js.yml +81 -7
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +505 -1442
  6. package/BookReader/BookReader.js +2 -21564
  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 -12
  13. package/BookReader/icons/2up.svg +1 -15
  14. package/BookReader/icons/advance.svg +3 -26
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -0
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -17
  19. package/BookReader/icons/fullscreen_exit.svg +1 -17
  20. package/BookReader/icons/hamburger.svg +1 -15
  21. package/BookReader/icons/left-arrow.svg +1 -12
  22. package/BookReader/icons/magnify-minus.svg +1 -16
  23. package/BookReader/icons/magnify-plus.svg +1 -17
  24. package/BookReader/icons/magnify.svg +1 -15
  25. package/BookReader/icons/pause.svg +1 -23
  26. package/BookReader/icons/play.svg +1 -22
  27. package/BookReader/icons/playback-speed.svg +1 -34
  28. package/BookReader/icons/read-aloud.svg +1 -22
  29. package/BookReader/icons/review.svg +3 -22
  30. package/BookReader/icons/thumbnails.svg +1 -17
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -22
  33. package/BookReader/images/BRicons.svg +5 -94
  34. package/BookReader/images/books_graphic.svg +1 -177
  35. package/BookReader/images/icon_book.svg +1 -12
  36. package/BookReader/images/icon_bookmark.svg +1 -12
  37. package/BookReader/images/icon_gear.svg +1 -14
  38. package/BookReader/images/icon_hamburger.svg +1 -20
  39. package/BookReader/images/icon_home.svg +1 -21
  40. package/BookReader/images/icon_info.svg +1 -11
  41. package/BookReader/images/icon_one_page.svg +1 -8
  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 -15
  45. package/BookReader/images/icon_search_button.svg +1 -8
  46. package/BookReader/images/icon_share.svg +1 -9
  47. package/BookReader/images/icon_skip-ahead.svg +1 -6
  48. package/BookReader/images/icon_skip-back.svg +2 -13
  49. package/BookReader/images/icon_speaker.svg +1 -18
  50. package/BookReader/images/icon_speaker_open.svg +1 -10
  51. package/BookReader/images/icon_thumbnails.svg +1 -12
  52. package/BookReader/images/icon_toc.svg +1 -5
  53. package/BookReader/images/icon_two_pages.svg +1 -9
  54. package/BookReader/images/marker_chap-off.svg +1 -11
  55. package/BookReader/images/marker_chap-on.svg +1 -11
  56. package/BookReader/images/marker_srch-on.svg +1 -11
  57. package/BookReader/images/unviewable_page.png +0 -0
  58. package/BookReader/jquery-3.js +2 -0
  59. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  60. package/BookReader/plugins/plugin.archive_analytics.js +1 -172
  61. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  62. package/BookReader/plugins/plugin.autoplay.js +1 -165
  63. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  64. package/BookReader/plugins/plugin.chapters.js +22 -301
  65. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  66. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  67. package/BookReader/plugins/plugin.iframe.js +1 -74
  68. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  69. package/BookReader/plugins/plugin.iiif.js +2 -0
  70. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  71. package/BookReader/plugins/plugin.resume.js +1 -368
  72. package/BookReader/plugins/plugin.resume.js.map +1 -1
  73. package/BookReader/plugins/plugin.search.js +2 -1420
  74. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  75. package/BookReader/plugins/plugin.search.js.map +1 -1
  76. package/BookReader/plugins/plugin.text_selection.js +2 -1080
  77. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  78. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  79. package/BookReader/plugins/plugin.tts.js +2 -9193
  80. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  81. package/BookReader/plugins/plugin.tts.js.map +1 -1
  82. package/BookReader/plugins/plugin.url.js +1 -269
  83. package/BookReader/plugins/plugin.url.js.map +1 -1
  84. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  85. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  86. package/BookReader/webcomponents-bundle.js +3 -0
  87. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  88. package/BookReader/webcomponents-bundle.js.map +1 -0
  89. package/BookReaderDemo/BookReaderDemo.css +18 -19
  90. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  91. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  92. package/BookReaderDemo/IADemoBr.js +144 -0
  93. package/BookReaderDemo/demo-advanced.html +2 -2
  94. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  95. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  96. package/BookReaderDemo/demo-fullscreen.html +2 -4
  97. package/BookReaderDemo/demo-iiif.html +99 -12
  98. package/BookReaderDemo/demo-internetarchive.html +214 -18
  99. package/BookReaderDemo/demo-multiple.html +2 -1
  100. package/BookReaderDemo/demo-preview-pages.html +526 -525
  101. package/BookReaderDemo/demo-simple.html +2 -1
  102. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
  103. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  104. package/BookReaderDemo/immersion-1up.html +2 -2
  105. package/BookReaderDemo/immersion-mode.html +2 -4
  106. package/BookReaderDemo/toggle_controls.html +3 -2
  107. package/BookReaderDemo/view_mode.html +2 -1
  108. package/BookReaderDemo/viewmode-cycle.html +2 -3
  109. package/CHANGELOG.md +595 -33
  110. package/README.md +14 -1
  111. package/babel.config.js +20 -0
  112. package/codecov.yml +6 -0
  113. package/index.html +5 -2
  114. package/jsconfig.json +19 -0
  115. package/netlify.toml +9 -0
  116. package/package.json +70 -62
  117. package/renovate.json +52 -0
  118. package/scripts/preversion.js +0 -1
  119. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  120. package/src/BookNavigator/assets/button-base.js +10 -2
  121. package/src/BookNavigator/assets/ia-logo.js +17 -0
  122. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  123. package/src/BookNavigator/assets/icon_close.js +1 -1
  124. package/src/BookNavigator/book-navigator.js +590 -0
  125. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  126. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  127. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  128. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +4 -9
  129. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  130. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  131. package/src/BookNavigator/delete-modal-actions.js +1 -1
  132. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  133. package/src/BookNavigator/downloads/downloads.js +29 -25
  134. package/src/BookNavigator/search/search-provider.js +80 -28
  135. package/src/BookNavigator/search/search-results.js +29 -26
  136. package/src/BookNavigator/sharing.js +27 -0
  137. package/src/BookNavigator/viewable-files.js +95 -0
  138. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
  139. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +7 -7
  140. package/src/BookReader/BookModel.js +76 -41
  141. package/src/BookReader/DragScrollable.js +233 -0
  142. package/src/BookReader/ImageCache.js +48 -15
  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 +777 -0
  147. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  148. package/src/BookReader/ModeSmoothZoom.js +312 -0
  149. package/src/BookReader/ModeThumb.js +19 -13
  150. package/src/BookReader/Navbar/Navbar.js +70 -54
  151. package/src/BookReader/PageContainer.js +116 -22
  152. package/src/BookReader/ReduceSet.js +3 -3
  153. package/src/BookReader/Toolbar/Toolbar.js +14 -41
  154. package/src/BookReader/events.js +2 -3
  155. package/src/BookReader/options.js +73 -15
  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/classes.js +1 -1
  160. package/src/BookReader/utils.js +128 -13
  161. package/src/BookReader.js +562 -1078
  162. package/src/BookReaderPlugin.js +44 -0
  163. package/src/assets/icons/close-circle-dark.svg +1 -0
  164. package/src/assets/icons/magnify-minus.svg +3 -7
  165. package/src/assets/icons/magnify-plus.svg +3 -7
  166. package/src/assets/icons/voice.svg +1 -0
  167. package/src/assets/images/unviewable_page.png +0 -0
  168. package/src/css/BookReader.scss +1 -17
  169. package/src/css/_BRBookmarks.scss +1 -1
  170. package/src/css/_BRComponent.scss +1 -1
  171. package/src/css/_BRicon.scss +8 -2
  172. package/src/css/_BRmain.scss +33 -27
  173. package/src/css/_BRnav.scss +12 -42
  174. package/src/css/_BRpages.scss +170 -42
  175. package/src/css/_BRsearch.scss +68 -230
  176. package/src/css/_BRtoolbar.scss +5 -5
  177. package/src/css/_TextSelection.scss +87 -27
  178. package/src/css/_colorbox.scss +2 -2
  179. package/src/css/_controls.scss +24 -7
  180. package/src/css/_icons.scss +7 -1
  181. package/src/ia-bookreader/ia-bookreader.js +224 -0
  182. package/src/plugins/plugin.archive_analytics.js +84 -78
  183. package/src/plugins/plugin.autoplay.js +99 -104
  184. package/src/plugins/plugin.chapters.js +237 -191
  185. package/src/plugins/plugin.iframe.js +1 -1
  186. package/src/plugins/plugin.iiif.js +141 -0
  187. package/src/plugins/plugin.resume.js +53 -50
  188. package/src/plugins/plugin.text_selection.js +503 -175
  189. package/src/plugins/plugin.vendor-fullscreen.js +7 -7
  190. package/src/plugins/search/plugin.search.js +183 -121
  191. package/src/plugins/search/utils.js +43 -0
  192. package/src/plugins/search/view.js +67 -202
  193. package/src/plugins/tts/AbstractTTSEngine.js +75 -45
  194. package/src/plugins/tts/FestivalTTSEngine.js +21 -31
  195. package/src/plugins/tts/PageChunk.js +16 -23
  196. package/src/plugins/tts/PageChunkIterator.js +11 -17
  197. package/src/plugins/tts/WebTTSEngine.js +88 -72
  198. package/src/plugins/tts/plugin.tts.js +310 -350
  199. package/src/plugins/tts/utils.js +16 -26
  200. package/src/plugins/url/UrlPlugin.js +191 -0
  201. package/src/plugins/{plugin.url.js → url/plugin.url.js} +47 -18
  202. package/src/util/browserSniffing.js +22 -0
  203. package/src/util/docCookies.js +21 -2
  204. package/src/util/strings.js +1 -0
  205. package/tests/e2e/README.md +37 -0
  206. package/tests/e2e/autoplay.test.js +9 -6
  207. package/tests/e2e/base.test.js +8 -16
  208. package/tests/e2e/helpers/base.js +55 -50
  209. package/tests/e2e/helpers/debug.js +1 -1
  210. package/tests/e2e/helpers/mockSearch.js +19 -22
  211. package/tests/e2e/helpers/params.js +17 -0
  212. package/tests/e2e/helpers/rightToLeft.js +8 -14
  213. package/tests/e2e/helpers/search.js +73 -0
  214. package/tests/e2e/models/Navigation.js +20 -37
  215. package/tests/e2e/rightToLeft.test.js +4 -5
  216. package/tests/e2e/viewmode.test.js +40 -33
  217. package/tests/jest/BookNavigator/book-navigator.test.js +661 -0
  218. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  219. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  220. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  221. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  222. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  223. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  224. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  225. package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +109 -60
  226. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  227. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +80 -0
  228. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  229. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  230. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  231. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  232. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  233. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  234. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  235. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  236. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  237. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  238. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +42 -29
  239. package/tests/jest/BookReader/PageContainer.test.js +238 -0
  240. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  241. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +3 -3
  242. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  243. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  244. package/tests/jest/BookReader/utils/SelectionObserver.test.js +57 -0
  245. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  246. package/tests/jest/BookReader/utils.test.js +250 -0
  247. package/tests/jest/BookReader.keyboard.test.js +190 -0
  248. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +10 -2
  249. package/tests/{BookReader.test.js → jest/BookReader.test.js} +43 -53
  250. package/tests/jest/plugins/plugin.archive_analytics.test.js +20 -0
  251. package/tests/jest/plugins/plugin.autoplay.test.js +35 -0
  252. package/tests/jest/plugins/plugin.chapters.test.js +195 -0
  253. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +4 -4
  254. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +22 -35
  255. package/tests/jest/plugins/plugin.text_selection.test.js +316 -0
  256. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  257. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +26 -47
  258. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +42 -9
  259. package/tests/jest/plugins/search/utils.js +25 -0
  260. package/tests/jest/plugins/search/utils.test.js +29 -0
  261. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +30 -10
  262. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  263. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  264. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  265. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  266. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  267. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  268. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +57 -18
  269. package/tests/jest/setup.js +3 -0
  270. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  271. package/tests/jest/util/docCookies.test.js +24 -0
  272. package/tests/{util → jest/util}/strings.test.js +1 -1
  273. package/tests/{utils.js → jest/utils.js} +38 -0
  274. package/webpack.config.js +16 -10
  275. package/.babelrc +0 -12
  276. package/.dependabot/config.yml +0 -6
  277. package/.testcaferc.json +0 -5
  278. package/BookReader/bookreader-component-bundle.js +0 -14330
  279. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  280. package/BookReader/bookreader-component-bundle.js.map +0 -1
  281. package/BookReader/icons/sort-ascending.svg +0 -1
  282. package/BookReader/icons/sort-descending.svg +0 -1
  283. package/BookReader/jquery-1.10.1.js +0 -108
  284. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  285. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  286. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  287. package/BookReader/plugins/plugin.mobile_nav.js +0 -335
  288. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  289. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  290. package/BookReaderDemo/IIIFBookReader.js +0 -207
  291. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  292. package/BookReaderDemo/demo-autoplay.html +0 -38
  293. package/BookReaderDemo/demo-iiif.js +0 -26
  294. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  295. package/karma.conf.js +0 -23
  296. package/src/BookNavigator/BookModel.js +0 -14
  297. package/src/BookNavigator/BookNavigator.js +0 -452
  298. package/src/BookNavigator/assets/book-loader.js +0 -27
  299. package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
  300. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  301. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  302. package/src/BookNavigator/search/a-search-result.js +0 -55
  303. package/src/BookNavigator/volumes/volumes-provider.js +0 -108
  304. package/src/BookNavigator/volumes/volumes.js +0 -162
  305. package/src/BookReader/DebugConsole.js +0 -54
  306. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  307. package/src/ItemNavigator/ItemNavigator.js +0 -372
  308. package/src/ItemNavigator/providers/sharing.js +0 -29
  309. package/src/assets/icons/sort-ascending.svg +0 -1
  310. package/src/assets/icons/sort-descending.svg +0 -1
  311. package/src/css/_MobileNav.scss +0 -194
  312. package/src/dragscrollable-br.js +0 -261
  313. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  314. package/src/plugins/plugin.mobile_nav.js +0 -287
  315. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  316. package/tests/BookReader/DebugConsole.test.js +0 -25
  317. package/tests/BookReader/Mode1Up.test.js +0 -164
  318. package/tests/BookReader/Mode2Up.test.js +0 -247
  319. package/tests/BookReader/PageContainer.test.js +0 -115
  320. package/tests/BookReader/utils.test.js +0 -109
  321. package/tests/e2e/helpers/desktopSearch.js +0 -72
  322. package/tests/e2e/helpers/mobileSearch.js +0 -85
  323. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  324. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  325. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  326. package/tests/karma/BookNavigator/volumes.test.js +0 -133
  327. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  328. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  329. package/tests/plugins/plugin.autoplay.test.js +0 -52
  330. package/tests/plugins/plugin.chapters.test.js +0 -130
  331. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  332. package/tests/plugins/plugin.text_selection.test.js +0 -203
  333. package/tests/util/docCookies.test.js +0 -15
@@ -1,5 +1,6 @@
1
1
  // @ts-check
2
- import { calcScreenDPI, notInArray } from '../BookReader/utils.js';
2
+ import { Mode1UpLit } from './Mode1UpLit.js';
3
+ import { DragScrollable } from './DragScrollable.js';
3
4
  /** @typedef {import('../BookReader.js').default} BookReader */
4
5
  /** @typedef {import('./BookModel.js').BookModel} BookModel */
5
6
  /** @typedef {import('./BookModel.js').PageIndex} PageIndex */
@@ -12,392 +13,96 @@ export class Mode1Up {
12
13
  constructor(br, bookModel) {
13
14
  this.br = br;
14
15
  this.book = bookModel;
16
+ this.mode1UpLit = new Mode1UpLit(bookModel, br);
15
17
 
16
18
  /** @private */
17
- this.$documentContainer = $('<div class="BRpageview" />');
18
- /** @private */
19
- this.screenDPI = calcScreenDPI();
20
- /** @private */
21
- this.LEAF_SPACING_IN = 0.2;
19
+ this.$el = $(this.mode1UpLit)
20
+ // We CANNOT use `br-mode-1up` as a class, because it's the same
21
+ // as the name of the web component, and the webcomponents polyfill
22
+ // uses the name of component as a class for style scoping 😒
23
+ .addClass('br-mode-1up__root BRmode1up');
22
24
 
23
- /**
24
- * How much smaller the picture on screen is than the real-world item
25
- *
26
- * Mode1Up doesn't use the br.reduce because it is DPI aware. The reduction factor
27
- * of a given leaf can change (since leaves can have different DPIs), but the real-world
28
- * reduction is constant throughout.
29
- */
30
- this.realWorldReduce = 1;
25
+ /** Has mode1up ever been rendered before? */
26
+ this.everShown = false;
31
27
  }
32
28
 
29
+ // TODO: Might not need this anymore? Might want to delete.
33
30
  /** @private */
34
- get $scrollContainer() { return this.br.refs.$brContainer; }
31
+ get $brContainer() { return this.br.refs.$brContainer; }
35
32
 
36
33
  /**
37
34
  * This is called when we switch to one page view
38
35
  */
39
36
  prepare() {
40
37
  const startLeaf = this.br.currentIndex();
41
-
42
- this.$scrollContainer
38
+ this.$brContainer
43
39
  .empty()
44
- .css({ overflowX: 'auto', overflowY: 'scroll' })
45
- .append(this.$documentContainer);
46
-
47
- // Attaches to first child - child must be present
48
- this.$scrollContainer.dragscrollable();
49
- this.br.bindGestures(this.$scrollContainer);
50
-
51
- // This calls drawLeafs
52
- this.resizePageView();
53
-
54
- this.br.jumpToIndex(startLeaf);
55
- this.br.updateBrClasses();
56
- }
57
-
58
- /**
59
- * Get the number of pixels required to display the given inches with the given reduce
60
- * @param {number} inches
61
- * @param reduce Reduction factor currently at play
62
- * @param screenDPI The DPI of the screen
63
- **/
64
- physicalInchesToDisplayPixels(inches, reduce = this.realWorldReduce, screenDPI = this.screenDPI) {
65
- return inches * screenDPI / reduce;
66
- }
67
-
68
- /**
69
- * Iterate over pages, augmented with their top/bottom bounds
70
- * @param reduce Reduction factor currently at play
71
- * @param pageSpacing Inches of space to place between pages
72
- **/
73
- * pagesWithBounds(reduce = this.realWorldReduce, pageSpacing = this.LEAF_SPACING_IN) {
74
- let leafTop = 0;
75
- let leafBottom = 0;
76
-
77
- for (const page of this.book.pagesIterator({ combineConsecutiveUnviewables: true })) {
78
- const height = this.physicalInchesToDisplayPixels(page.heightInches, reduce);
79
- leafBottom += height;
80
- yield { page, top: leafTop, bottom: leafBottom };
81
- leafTop += height + this.physicalInchesToDisplayPixels(pageSpacing, reduce);
82
- leafBottom += this.physicalInchesToDisplayPixels(pageSpacing, reduce);
83
- }
84
- }
85
-
86
- /**
87
- * How much do the two bounds intersection?
88
- * @param {{ top: number; bottom: number; }} bound1
89
- * @param {{ top: number; bottom: number; }} bound2
90
- * @returns {number}
91
- */
92
- static boundIntersection(bound1, bound2) {
93
- const intersect = (bound1.bottom >= bound2.top) && (bound1.top <= bound2.bottom);
94
- if (!intersect) return 0;
95
-
96
- const boundingBox = {
97
- top: Math.min(bound1.top, bound2.top),
98
- bottom: Math.max(bound1.bottom, bound2.bottom),
99
- };
100
- const intersection = {
101
- top: Math.max(bound1.top, bound2.top),
102
- bottom: Math.min(bound1.bottom, bound2.bottom),
103
- };
104
- return (intersection.bottom - intersection.top) / (boundingBox.bottom - boundingBox.top);
105
- }
106
-
107
- /**
108
- * Find the pages that intersect the current viewport, including 1 before/after
109
- **/
110
- * findIntersectingPages() {
111
- // Rectangle of interest
112
- const height = this.$scrollContainer.height();
113
- const scrollTop = this.$scrollContainer.scrollTop();
114
- const scrollBottom = scrollTop + height;
115
- const scrollRegion = { top: scrollTop, bottom: scrollBottom };
116
-
117
- let prev = null;
118
- for (const {page, top, bottom} of this.pagesWithBounds()) {
119
- const intersection = Mode1Up.boundIntersection({ top, bottom }, scrollRegion);
120
- const cur = {page, top, bottom, intersection: intersection};
121
- if (intersection) {
122
- // Also yield the page just before the visible page
123
- if (prev && !prev.intersection) yield prev;
124
- yield cur;
125
- }
126
- // Also yield the page just after the last visible page
127
- else if (!cur.intersection && prev?.intersection) {
128
- yield cur;
129
- break;
40
+ .css({ overflow: 'hidden' })
41
+ .append(this.$el);
42
+
43
+ // Need this in a setTimeout so that it happens after the browser has _actually_
44
+ // appended the element to the DOM
45
+ setTimeout(async () => {
46
+ if (!this.everShown) {
47
+ this.mode1UpLit.initFirstRender(startLeaf);
48
+ this.everShown = true;
49
+ this.mode1UpLit.requestUpdate();
50
+ await this.mode1UpLit.updateComplete;
51
+ new DragScrollable(this.mode1UpLit, {
52
+ preventDefault: true,
53
+ dragSelector: '.br-mode-1up__visible-world',
54
+ // Only handle mouse events; let browser/interact.js handle touch
55
+ dragstart: 'mousedown',
56
+ dragcontinue: 'mousemove',
57
+ dragend: 'mouseup',
58
+ });
130
59
  }
131
- prev = cur;
132
- }
133
- }
134
-
135
- drawLeafs() {
136
- const pagesToDisplay = Array.from(this.findIntersectingPages());
137
-
138
- if (pagesToDisplay.length) {
139
- const documentContainerWidth = this.$documentContainer.width();
140
-
141
- // The first page that's reasonably in view we set to the current index
142
- const firstProperPage = (
143
- pagesToDisplay.find(({intersection}) => intersection > 0.33) ||
144
- pagesToDisplay[0]
145
- ).page;
146
- this.br.updateFirstIndex(firstProperPage.index);
147
-
148
- for (const {page, top, bottom} of pagesToDisplay) {
149
- if (!this.br.displayedIndices.includes(page.index)) {
150
- const height = bottom - top;
151
- const width = this.physicalInchesToDisplayPixels(page.widthInches);
152
- const reduce = page.width / width;
153
-
154
- const pageContainer = this.br._createPageContainer(page.index)
155
- .update({
156
- dimensions: {
157
- width,
158
- height,
159
- top,
160
- left: Math.floor((documentContainerWidth - width) / 2),
161
- },
162
- reduce,
163
- });
164
- pageContainer.$container.appendTo(this.$documentContainer);
165
- }
166
- }
167
- }
168
-
169
- // Remove any pages we no longer need
170
- const displayedIndices = pagesToDisplay.map(({page}) => page.index);
171
- for (const index of this.br.displayedIndices) {
172
- if (notInArray(index, displayedIndices)) {
173
- this.br.$(`.pagediv${index}`).remove();
174
- }
175
- }
176
-
177
- this.br.displayedIndices = displayedIndices;
178
- if (this.br.enableSearch) this.br.updateSearchHilites();
179
-
180
- this.br.updateToolbarZoom(this.realWorldReduce);
181
-
182
- // Update the slider
183
- this.br.updateNavIndexThrottled();
60
+ this.mode1UpLit.jumpToIndex(startLeaf);
61
+ setTimeout(() => {
62
+ // Must explicitly call updateVisibleRegion, since no
63
+ // scroll event seems to fire.
64
+ this.mode1UpLit.updateVisibleRegion();
65
+ });
66
+ });
67
+ this.br.updateBrClasses();
184
68
  }
185
69
 
186
70
  /**
71
+ * BREAKING CHANGE: No longer supports pageX/pageY
187
72
  * @param {PageIndex} index
188
73
  * @param {number} [pageX] x position on the page (in pixels) to center on
189
74
  * @param {number} [pageY] y position on the page (in pixels) to center on
190
75
  * @param {boolean} [noAnimate]
191
76
  */
192
77
  jumpToIndex(index, pageX, pageY, noAnimate) {
193
- const prevCurrentIndex = this.br.currentIndex();
194
- const { abs } = Math;
195
- let offset = 0;
196
- let leafTop = this.getPageTop(index);
197
- let leafLeft = 0;
198
-
199
- if (pageY) {
200
- const page = this.book.getPage(index);
201
- const clientHeight = this.$scrollContainer.prop('clientHeight');
202
- offset = this.physicalInchesToDisplayPixels((pageY / page.height) * page.heightInches) - (clientHeight / 2);
203
- leafTop += offset;
204
- } else {
205
- // Show page just a little below the top
206
- leafTop -= this.br.padding / 2;
207
- }
208
-
209
- if (pageX) {
210
- const page = this.book.getPage(index);
211
- const clientWidth = this.$scrollContainer.prop('clientWidth');
212
- offset = this.physicalInchesToDisplayPixels((pageX / page.width) * page.widthInches) - (clientWidth / 2);
213
- leafLeft += offset;
214
- } else {
215
- // Preserve left position
216
- leafLeft = this.$scrollContainer.scrollLeft();
217
- }
218
-
219
- // Only animate for small distances
220
- if (!noAnimate && abs(prevCurrentIndex - index) <= 4) {
221
- this.animating = true;
222
- this.$scrollContainer.stop(true).animate({
223
- scrollTop: leafTop,
224
- scrollLeft: leafLeft,
225
- }, 'fast', () => { this.animating = false });
226
- } else {
227
- this.$scrollContainer.stop(true).prop('scrollTop', leafTop);
228
- }
78
+ // Only smooth for small distances
79
+ const distance = Math.abs(this.br.currentIndex() - index);
80
+ const smooth = !noAnimate && distance > 0 && distance <= 4;
81
+ this.mode1UpLit.jumpToIndex(index, { smooth });
229
82
  }
230
83
 
231
84
  /**
232
85
  * @param {'in' | 'out'} direction
233
86
  */
234
87
  zoom(direction) {
235
- const nextReductionFactor = this.br.nextReduce(this.realWorldReduce, direction, this.br.onePage.reductionFactors);
236
-
237
- if (this.realWorldReduce == nextReductionFactor.reduce) {
238
- // Already at this level
239
- return;
240
- }
241
-
242
- this.realWorldReduce = nextReductionFactor.reduce;
243
- this.br.onePage.autofit = nextReductionFactor.autofit;
244
-
245
- this.resizePageView();
246
- this.br.updateToolbarZoom(this.realWorldReduce);
247
-
248
- // Recalculate search hilites
249
- if (this.br.enableSearch) {
250
- this.br.removeSearchHilites();
251
- this.br.updateSearchHilites();
88
+ switch (direction) {
89
+ case 'in':
90
+ this.mode1UpLit.zoomIn();
91
+ break;
92
+ case 'out':
93
+ this.mode1UpLit.zoomOut();
94
+ break;
95
+ default:
96
+ console.error(`Unsupported direction: ${direction}`);
252
97
  }
253
98
  }
254
99
 
255
- /**
256
- * Returns the reduce factor which has the pages fill the width of the viewport.
257
- */
258
- getAutofitWidth() {
259
- const widthPadding = 20;
260
- const availableWidth = this.$scrollContainer.prop('clientWidth') - 2 * widthPadding;
261
-
262
- const medianWidthInches = this.book.getMedianPageSizeInches().width;
263
- const medianPageWidth = this.physicalInchesToDisplayPixels(medianWidthInches, 1);
264
- return medianPageWidth / availableWidth;
265
- }
266
-
267
- getAutofitHeight() {
268
- // make sure a little of adjacent pages show
269
- const availableHeight = this.$scrollContainer.innerHeight() - 2 * this.br.padding;
270
- const medianHeightInches = this.book.getMedianPageSizeInches().height;
271
- const medianPageHeight = this.physicalInchesToDisplayPixels(medianHeightInches, 1);
272
-
273
- return medianPageHeight / availableHeight;
274
- }
275
-
276
- /**
277
- * Returns where the top of the page with given index should be in one page view
278
- * @param {PageIndex} index
279
- * @return {number}
280
- */
281
- getPageTop(index) {
282
- for (const {page, top} of this.pagesWithBounds()) {
283
- if (page.index == index) return top;
284
- }
285
- }
286
-
287
- /**
288
- * Update the reduction factors for 1up mode given the available width and height.
289
- * Recalculates the autofit reduction factors.
290
- */
291
- calculateReductionFactors() {
292
- this.br.onePage.reductionFactors = this.br.reductionFactors.concat(
293
- [
294
- { reduce: this.getAutofitWidth(), autofit: 'width' },
295
- { reduce: this.getAutofitHeight(), autofit: 'height' },
296
- ]);
297
- this.br.onePage.reductionFactors.sort(this.br._reduceSort);
298
- }
299
-
300
100
  /**
301
101
  * Resize the current one page view
302
102
  * Note this calls drawLeafs
303
103
  */
304
104
  resizePageView() {
305
- const viewWidth = this.$scrollContainer.prop('clientWidth');
306
- const oldScrollTop = this.$scrollContainer.prop('scrollTop');
307
- const oldPageViewHeight = this.$documentContainer.height();
308
- const oldPageViewWidth = this.$documentContainer.width();
309
-
310
- // May have come here after preparing the view, in which case the scrollTop and view height are not set
311
-
312
- let scrollRatio = 0;
313
- let oldCenterX;
314
- if (oldScrollTop > 0) {
315
- // We have scrolled - implies view has been set up
316
- const oldCenterY = this.centerY();
317
- oldCenterX = this.centerX();
318
- scrollRatio = oldCenterY / oldPageViewHeight;
319
- } else {
320
- // Have not scrolled, e.g. because in new container
321
-
322
- // We set the scroll ratio so that the current index will still be considered the
323
- // current index in drawLeafsOnePage after we create the new view container
324
-
325
- // Make sure this will count as current page after resize
326
- const fudgeFactor = 0.6 * this.physicalInchesToDisplayPixels(this.book.getPage(this.br.currentIndex()).heightInches);
327
- const oldLeafTop = this.getPageTop(this.br.currentIndex()) + fudgeFactor;
328
- const oldViewDimensions = this.calculateViewDimensions();
329
- scrollRatio = oldLeafTop / oldViewDimensions.height;
330
- }
331
-
332
- // Recalculate 1up reduction factors
333
- this.calculateReductionFactors();
334
- // Update current reduce (if in autofit)
335
- if (this.br.onePage.autofit) {
336
- const reductionFactor = this.br.nextReduce(this.realWorldReduce, this.br.onePage.autofit, this.br.onePage.reductionFactors);
337
- this.realWorldReduce = reductionFactor.reduce;
338
- }
339
-
340
- const viewDimensions = this.calculateViewDimensions();
341
- this.$documentContainer.height(viewDimensions.height);
342
- this.$documentContainer.width(viewDimensions.width);
343
-
344
- // Remove all pages
345
- this.$documentContainer.empty();
346
- this.br.displayedIndices = [];
347
-
348
- // Scroll to the right spot
349
- const newCenterX = oldCenterX * (viewWidth / oldPageViewWidth);
350
- const newCenterY = scrollRatio * viewDimensions.height;
351
- const sizeX = this.$scrollContainer.prop('clientWidth'); // Use clientWidth because of scroll bar
352
- const sizeY = this.$scrollContainer.height();
353
- this.$scrollContainer.prop({
354
- scrollLeft: Math.max(0, newCenterX - sizeX / 2),
355
- scrollTop: Math.max(0, newCenterY - sizeY / 2),
356
- });
357
-
358
- // Draw all visible pages
359
- this.drawLeafs();
360
-
361
- if (this.br.enableSearch) {
362
- this.br.removeSearchHilites();
363
- this.br.updateSearchHilites();
364
- }
365
- }
366
-
367
- /**
368
- * Calculate the total width/height in pixels of the document container
369
- * @param {number} reduce
370
- * @param {number} leafSpacing spacing between pages in inches
371
- */
372
- calculateViewDimensions(reduce = this.realWorldReduce, leafSpacing = this.LEAF_SPACING_IN) {
373
- let width = 0;
374
- let height = 0;
375
- for (const {page, bottom} of this.pagesWithBounds(reduce, leafSpacing)) {
376
- const pageWidth = this.physicalInchesToDisplayPixels(page.widthInches, reduce);
377
- width = Math.max(width, pageWidth);
378
- height = bottom;
379
- }
380
- return { width, height };
381
- }
382
-
383
- /**
384
- * Returns the current offset of the viewport center in scaled document coordinates.
385
- */
386
- centerX($scrollContainer = this.$scrollContainer, $documentContainer = this.$documentContainer) {
387
- let centerX;
388
- if ($documentContainer.width() < $scrollContainer.prop('clientWidth')) { // fully shown
389
- centerX = $documentContainer.width();
390
- } else {
391
- centerX = $scrollContainer.scrollLeft() + $scrollContainer.prop('clientWidth') / 2;
392
- }
393
- return Math.floor(centerX);
394
- }
395
-
396
- /**
397
- * Returns the current offset of the viewport center in scaled document coordinates.
398
- */
399
- centerY($scrollContainer = this.$scrollContainer) {
400
- const centerY = $scrollContainer.scrollTop() + $scrollContainer.height() / 2;
401
- return Math.floor(centerY);
105
+ this.mode1UpLit.htmlDimensionsCacher.updateClientSizes();
106
+ this.mode1UpLit.requestUpdate();
402
107
  }
403
108
  }