@internetarchive/bookreader 5.0.0-5 → 5.0.0-50-a1

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 (260) hide show
  1. package/.eslintrc.js +17 -15
  2. package/.github/workflows/node.js.yml +77 -6
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +131 -339
  6. package/BookReader/BookReader.js +1 -1
  7. package/BookReader/BookReader.js.LICENSE.txt +24 -0
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1493 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +17 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/close-circle-dark.svg +1 -0
  13. package/BookReader/icons/magnify-minus.svg +1 -1
  14. package/BookReader/icons/magnify-plus.svg +1 -1
  15. package/BookReader/icons/pause.svg +1 -1
  16. package/BookReader/icons/playback-speed.svg +1 -1
  17. package/BookReader/icons/read-aloud.svg +1 -1
  18. package/BookReader/icons/voice.svg +1 -0
  19. package/BookReader/images/BRicons.svg +2 -2
  20. package/BookReader/images/books_graphic.svg +1 -1
  21. package/BookReader/images/icon_book.svg +1 -1
  22. package/BookReader/images/icon_gear.svg +1 -1
  23. package/BookReader/images/icon_info.svg +1 -1
  24. package/BookReader/images/icon_playback-rate.svg +1 -1
  25. package/BookReader/images/icon_search_button.svg +1 -1
  26. package/BookReader/images/icon_share.svg +1 -1
  27. package/BookReader/images/icon_speaker.svg +1 -1
  28. package/BookReader/images/icon_speaker_open.svg +1 -1
  29. package/BookReader/images/marker_chap-off.svg +1 -1
  30. package/BookReader/images/marker_chap-on.svg +1 -1
  31. package/BookReader/images/marker_srch-on.svg +1 -1
  32. package/BookReader/jquery-3.js +2 -0
  33. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  34. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  35. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  36. package/BookReader/plugins/plugin.autoplay.js +1 -1
  37. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  38. package/BookReader/plugins/plugin.chapters.js +1 -1
  39. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  40. package/BookReader/plugins/plugin.iframe.js +1 -1
  41. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  42. package/BookReader/plugins/plugin.mobile_nav.js +1 -1
  43. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  44. package/BookReader/plugins/plugin.resume.js +1 -1
  45. package/BookReader/plugins/plugin.resume.js.map +1 -1
  46. package/BookReader/plugins/plugin.search.js +1 -1
  47. package/BookReader/plugins/plugin.search.js.map +1 -1
  48. package/BookReader/plugins/plugin.text_selection.js +1 -1
  49. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  50. package/BookReader/plugins/plugin.tts.js +1 -1
  51. package/BookReader/plugins/plugin.tts.js.map +1 -1
  52. package/BookReader/plugins/plugin.url.js +1 -1
  53. package/BookReader/plugins/plugin.url.js.map +1 -1
  54. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  55. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  56. package/BookReader/webcomponents-bundle.js +3 -0
  57. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  58. package/BookReader/webcomponents-bundle.js.map +1 -0
  59. package/BookReaderDemo/BookReaderDemo.css +14 -1
  60. package/BookReaderDemo/IADemoBr.js +148 -0
  61. package/BookReaderDemo/demo-advanced.html +2 -2
  62. package/BookReaderDemo/demo-autoplay.html +2 -1
  63. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  64. package/BookReaderDemo/demo-fullscreen-mobile.html +2 -1
  65. package/BookReaderDemo/demo-fullscreen.html +2 -1
  66. package/BookReaderDemo/demo-iiif.html +2 -1
  67. package/BookReaderDemo/demo-internetarchive.html +84 -17
  68. package/BookReaderDemo/demo-multiple.html +2 -1
  69. package/BookReaderDemo/demo-preview-pages.html +2 -1
  70. package/BookReaderDemo/demo-simple.html +2 -1
  71. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -1
  72. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  73. package/BookReaderDemo/immersion-1up.html +2 -1
  74. package/BookReaderDemo/immersion-mode.html +2 -1
  75. package/BookReaderDemo/toggle_controls.html +2 -1
  76. package/BookReaderDemo/view_mode.html +2 -1
  77. package/BookReaderDemo/viewmode-cycle.html +2 -3
  78. package/CHANGELOG.md +202 -0
  79. package/README.md +14 -1
  80. package/babel.config.js +18 -0
  81. package/codecov.yml +6 -0
  82. package/index.html +3 -0
  83. package/jsconfig.json +19 -0
  84. package/package.json +66 -56
  85. package/renovate.json +52 -0
  86. package/scripts/preversion.js +4 -1
  87. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  88. package/src/BookNavigator/assets/button-base.js +9 -2
  89. package/src/BookNavigator/assets/ia-logo.js +17 -0
  90. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  91. package/src/BookNavigator/assets/icon_close.js +1 -1
  92. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  93. package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
  94. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  95. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  96. package/src/BookNavigator/book-navigator.js +583 -0
  97. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  98. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  99. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  100. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +3 -8
  101. package/src/BookNavigator/bookmarks/bookmarks-provider.js +21 -8
  102. package/src/BookNavigator/bookmarks/ia-bookmarks.js +102 -66
  103. package/src/BookNavigator/delete-modal-actions.js +1 -1
  104. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  105. package/src/BookNavigator/downloads/downloads.js +41 -25
  106. package/src/BookNavigator/search/a-search-result.js +18 -13
  107. package/src/BookNavigator/search/search-provider.js +80 -28
  108. package/src/BookNavigator/search/search-results.js +10 -18
  109. package/src/BookNavigator/sharing.js +27 -0
  110. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +11 -10
  111. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  112. package/src/BookNavigator/volumes/volumes-provider.js +114 -0
  113. package/src/BookNavigator/volumes/volumes.js +188 -0
  114. package/src/BookReader/BookModel.js +0 -29
  115. package/src/BookReader/DebugConsole.js +3 -3
  116. package/src/BookReader/DragScrollable.js +233 -0
  117. package/src/BookReader/Mode1Up.js +51 -351
  118. package/src/BookReader/Mode1UpLit.js +441 -0
  119. package/src/BookReader/Mode2Up.js +120 -105
  120. package/src/BookReader/ModeSmoothZoom.js +179 -0
  121. package/src/BookReader/ModeThumb.js +17 -11
  122. package/src/BookReader/Navbar/Navbar.js +10 -36
  123. package/src/BookReader/PageContainer.js +69 -6
  124. package/src/BookReader/ReduceSet.js +1 -1
  125. package/src/BookReader/Toolbar/Toolbar.js +10 -37
  126. package/src/BookReader/options.js +10 -0
  127. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  128. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  129. package/src/BookReader/utils.js +92 -13
  130. package/src/BookReader.js +431 -620
  131. package/src/assets/icons/close-circle-dark.svg +1 -0
  132. package/src/assets/icons/magnify-minus.svg +3 -7
  133. package/src/assets/icons/magnify-plus.svg +3 -7
  134. package/src/assets/icons/voice.svg +1 -0
  135. package/src/css/BookReader.scss +0 -12
  136. package/src/css/_BRComponent.scss +1 -1
  137. package/src/css/_BRmain.scss +19 -24
  138. package/src/css/_BRnav.scss +4 -26
  139. package/src/css/_BRpages.scss +35 -0
  140. package/src/css/_BRsearch.scss +25 -216
  141. package/src/css/_TextSelection.scss +14 -17
  142. package/src/css/_colorbox.scss +2 -2
  143. package/src/css/_controls.scss +17 -5
  144. package/src/css/_icons.scss +6 -0
  145. package/src/ia-bookreader/ia-bookreader.js +224 -0
  146. package/src/plugins/plugin.autoplay.js +4 -4
  147. package/src/plugins/plugin.chapters.js +28 -35
  148. package/src/plugins/plugin.mobile_nav.js +11 -10
  149. package/src/plugins/plugin.resume.js +3 -3
  150. package/src/plugins/plugin.text_selection.js +26 -39
  151. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  152. package/src/plugins/search/plugin.search.js +174 -116
  153. package/src/plugins/search/view.js +63 -179
  154. package/src/plugins/tts/AbstractTTSEngine.js +46 -37
  155. package/src/plugins/tts/FestivalTTSEngine.js +13 -14
  156. package/src/plugins/tts/PageChunk.js +15 -21
  157. package/src/plugins/tts/PageChunkIterator.js +8 -12
  158. package/src/plugins/tts/WebTTSEngine.js +66 -69
  159. package/src/plugins/tts/plugin.tts.js +92 -109
  160. package/src/plugins/tts/utils.js +0 -9
  161. package/src/plugins/url/UrlPlugin.js +184 -0
  162. package/src/plugins/{plugin.url.js → url/plugin.url.js} +28 -6
  163. package/src/util/manifestGenerator.js +0 -0
  164. package/tests/e2e/README.md +37 -0
  165. package/tests/e2e/autoplay.test.js +2 -2
  166. package/tests/e2e/base.test.js +7 -7
  167. package/tests/e2e/helpers/base.js +9 -3
  168. package/tests/e2e/helpers/debug.js +1 -1
  169. package/tests/e2e/helpers/desktopSearch.js +14 -13
  170. package/tests/e2e/helpers/mobileSearch.js +3 -3
  171. package/tests/e2e/helpers/params.js +17 -0
  172. package/tests/e2e/models/Navigation.js +13 -4
  173. package/tests/e2e/rightToLeft.test.js +4 -5
  174. package/tests/e2e/viewmode.test.js +38 -33
  175. package/tests/jest/BookNavigator/book-navigator.test.js +634 -0
  176. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  177. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  178. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  179. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  180. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  181. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  182. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  183. package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +102 -58
  184. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  185. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  186. package/tests/jest/BookNavigator/volumes/volumes-provider.test.js +184 -0
  187. package/tests/jest/BookNavigator/volumes/volumes.test.js +97 -0
  188. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +34 -14
  189. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +176 -0
  190. package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
  191. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  192. package/tests/jest/BookReader/Mode1UpLit.test.js +92 -0
  193. package/tests/{BookReader → jest/BookReader}/Mode2Up.test.js +36 -15
  194. package/tests/jest/BookReader/ModeSmoothZoom.test.js +149 -0
  195. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  196. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +7 -7
  197. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +88 -6
  198. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  199. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  200. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  201. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  202. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  203. package/tests/jest/BookReader/utils.test.js +186 -0
  204. package/tests/jest/BookReader.keyboard.test.js +190 -0
  205. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  206. package/tests/{BookReader.test.js → jest/BookReader.test.js} +18 -37
  207. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  208. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +4 -4
  209. package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +10 -11
  210. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  211. package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
  212. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  213. package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +39 -47
  214. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  215. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +63 -47
  216. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +35 -6
  217. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +9 -9
  218. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  219. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  220. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  221. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +1 -1
  222. package/tests/{plugins → jest/plugins}/tts/utils.test.js +3 -28
  223. package/tests/jest/plugins/url/UrlPlugin.test.js +190 -0
  224. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +33 -14
  225. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  226. package/tests/{util → jest/util}/docCookies.test.js +1 -1
  227. package/tests/{util → jest/util}/strings.test.js +1 -1
  228. package/tests/{utils.js → jest/utils.js} +38 -0
  229. package/webpack.config.js +11 -5
  230. package/.babelrc +0 -12
  231. package/.dependabot/config.yml +0 -6
  232. package/.testcaferc.json +0 -5
  233. package/BookReader/bookreader-component-bundle.js +0 -1450
  234. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  235. package/BookReader/bookreader-component-bundle.js.map +0 -1
  236. package/BookReader/jquery-1.10.1.js +0 -2
  237. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  238. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  239. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  240. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  241. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  242. package/karma.conf.js +0 -23
  243. package/src/BookNavigator/BookModel.js +0 -14
  244. package/src/BookNavigator/BookNavigator.js +0 -438
  245. package/src/BookNavigator/assets/book-loader.js +0 -27
  246. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  247. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  248. package/src/ItemNavigator/ItemNavigator.js +0 -372
  249. package/src/ItemNavigator/providers/sharing.js +0 -29
  250. package/src/Layers/sharing/sharing-provider.js +0 -22
  251. package/src/dragscrollable-br.js +0 -261
  252. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  253. package/src/plugins/plugin.bookmarks.js +0 -50
  254. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  255. package/tests/BookReader/Mode1Up.test.js +0 -164
  256. package/tests/BookReader/utils.test.js +0 -109
  257. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  258. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  259. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  260. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
@@ -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,91 @@ 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/HammerJS 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
+ });
62
+ this.br.updateBrClasses();
184
63
  }
185
64
 
186
65
  /**
66
+ * BREAKING CHANGE: No longer supports pageX/pageY
187
67
  * @param {PageIndex} index
188
68
  * @param {number} [pageX] x position on the page (in pixels) to center on
189
69
  * @param {number} [pageY] y position on the page (in pixels) to center on
190
70
  * @param {boolean} [noAnimate]
191
71
  */
192
72
  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
- }
73
+ // Only smooth for small distances
74
+ const distance = Math.abs(this.br.currentIndex() - index);
75
+ const smooth = !noAnimate && distance <= 4;
76
+ this.mode1UpLit.jumpToIndex(index, { smooth });
229
77
  }
230
78
 
231
79
  /**
232
80
  * @param {'in' | 'out'} direction
233
81
  */
234
82
  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();
83
+ switch (direction) {
84
+ case 'in':
85
+ this.mode1UpLit.zoomIn();
86
+ break;
87
+ case 'out':
88
+ this.mode1UpLit.zoomOut();
89
+ break;
90
+ default:
91
+ console.error(`Unsupported direction: ${direction}`);
252
92
  }
253
93
  }
254
94
 
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
95
  /**
301
96
  * Resize the current one page view
302
97
  * Note this calls drawLeafs
303
98
  */
304
99
  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);
100
+ this.mode1UpLit.htmlDimensionsCacher.updateClientSizes();
101
+ this.mode1UpLit.requestUpdate();
402
102
  }
403
103
  }