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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +670 -1190
  4. package/BookReader/bergamot-translator-worker.js +2966 -0
  5. package/BookReader/bergamot-translator-worker.wasm +0 -0
  6. package/BookReader/hypothesis/LICENSE +50 -0
  7. package/BookReader/hypothesis/README.md +55 -0
  8. package/BookReader/hypothesis/build/boot-template.js +1 -0
  9. package/BookReader/hypothesis/build/boot.js +1 -0
  10. package/BookReader/hypothesis/build/manifest.json +20 -0
  11. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +199 -0
  12. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  13. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +811 -0
  14. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +437 -0
  16. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/styles/annotator.css +4 -0
  18. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  19. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  20. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  40. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  41. package/BookReader/hypothesis/build/styles/katex.min.css +3 -0
  42. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +14 -0
  44. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/sidebar.css +4 -0
  46. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/ui-playground.css +4 -0
  48. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  49. package/BookReader/hypothesis/package.json +126 -0
  50. package/BookReader/ia-bookreader.js +1886 -0
  51. package/BookReader/{BookReader.js.LICENSE.txt → ia-bookreader.js.LICENSE.txt} +26 -20
  52. package/BookReader/ia-bookreader.js.map +1 -0
  53. package/BookReader/icons/1up.svg +1 -12
  54. package/BookReader/icons/2up.svg +1 -15
  55. package/BookReader/icons/advance.svg +3 -26
  56. package/BookReader/icons/chevron-right.svg +1 -1
  57. package/BookReader/icons/close-circle-dark.svg +1 -1
  58. package/BookReader/icons/close-circle.svg +1 -1
  59. package/BookReader/icons/fullscreen.svg +1 -17
  60. package/BookReader/icons/fullscreen_exit.svg +1 -17
  61. package/BookReader/icons/hamburger.svg +1 -15
  62. package/BookReader/icons/left-arrow.svg +1 -12
  63. package/BookReader/icons/magnify-minus.svg +1 -16
  64. package/BookReader/icons/magnify-plus.svg +1 -17
  65. package/BookReader/icons/magnify.svg +1 -15
  66. package/BookReader/icons/pause.svg +1 -23
  67. package/BookReader/icons/play.svg +1 -22
  68. package/BookReader/icons/playback-speed.svg +1 -34
  69. package/BookReader/icons/read-aloud.svg +1 -22
  70. package/BookReader/icons/review.svg +3 -22
  71. package/BookReader/icons/slider-toggle.svg +1 -0
  72. package/BookReader/icons/thumbnails.svg +1 -17
  73. package/BookReader/icons/voice.svg +1 -0
  74. package/BookReader/icons/volume-full.svg +1 -22
  75. package/BookReader/images/BRicons.svg +5 -94
  76. package/BookReader/images/books_graphic.svg +1 -177
  77. package/BookReader/images/hypothesis.ico +0 -0
  78. package/BookReader/images/icon_book.svg +1 -12
  79. package/BookReader/images/icon_bookmark.svg +1 -12
  80. package/BookReader/images/icon_experiment.svg +1 -0
  81. package/BookReader/images/icon_gear.svg +1 -14
  82. package/BookReader/images/icon_hamburger.svg +1 -20
  83. package/BookReader/images/icon_home.svg +1 -21
  84. package/BookReader/images/icon_info.svg +1 -11
  85. package/BookReader/images/icon_one_page.svg +1 -8
  86. package/BookReader/images/icon_pause.svg +1 -1
  87. package/BookReader/images/icon_play.svg +1 -1
  88. package/BookReader/images/icon_playback-rate.svg +1 -15
  89. package/BookReader/images/icon_search_button.svg +1 -8
  90. package/BookReader/images/icon_share.svg +1 -9
  91. package/BookReader/images/icon_skip-ahead.svg +1 -6
  92. package/BookReader/images/icon_skip-back.svg +2 -13
  93. package/BookReader/images/icon_speaker.svg +1 -18
  94. package/BookReader/images/icon_speaker_open.svg +1 -10
  95. package/BookReader/images/icon_thumbnails.svg +1 -12
  96. package/BookReader/images/icon_toc.svg +1 -5
  97. package/BookReader/images/icon_two_pages.svg +1 -9
  98. package/BookReader/images/marker_chap-off.svg +1 -11
  99. package/BookReader/images/marker_chap-on.svg +1 -11
  100. package/BookReader/images/marker_srch-on.svg +1 -11
  101. package/BookReader/images/translate.svg +1 -0
  102. package/BookReader/images/unviewable_page.png +0 -0
  103. package/BookReader/jquery-3.js +2 -0
  104. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  105. package/BookReader/plugins/plugin.archive_analytics.js +1 -172
  106. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  107. package/BookReader/plugins/plugin.autoplay.js +1 -165
  108. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  109. package/BookReader/plugins/plugin.chapters.js +19 -301
  110. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  111. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  112. package/BookReader/plugins/plugin.experiments.js +3 -0
  113. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  114. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  115. package/BookReader/plugins/plugin.iframe.js +1 -74
  116. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  117. package/BookReader/plugins/plugin.iiif.js +2 -0
  118. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  119. package/BookReader/plugins/plugin.resume.js +1 -368
  120. package/BookReader/plugins/plugin.resume.js.map +1 -1
  121. package/BookReader/plugins/plugin.search.js +2 -1385
  122. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  123. package/BookReader/plugins/plugin.search.js.map +1 -1
  124. package/BookReader/plugins/plugin.text_selection.js +2 -1080
  125. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  126. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  127. package/BookReader/plugins/plugin.translate.js +3 -0
  128. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  129. package/BookReader/plugins/plugin.translate.js.map +1 -0
  130. package/BookReader/plugins/plugin.tts.js +2 -9193
  131. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  132. package/BookReader/plugins/plugin.tts.js.map +1 -1
  133. package/BookReader/plugins/plugin.url.js +1 -269
  134. package/BookReader/plugins/plugin.url.js.map +1 -1
  135. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  136. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  137. package/BookReader/plugins/translator-worker.js +2 -0
  138. package/BookReader/plugins/translator-worker.js.map +1 -0
  139. package/BookReader/silence.mp3 +0 -0
  140. package/BookReader/translator-worker.js +475 -0
  141. package/BookReader/webcomponents-bundle.js +3 -0
  142. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  143. package/BookReader/webcomponents-bundle.js.map +1 -0
  144. package/README.md +17 -4
  145. package/dist/esm/ia-bookreader.js +3 -0
  146. package/dist/esm/ia-bookreader.js.LICENSE.txt +17 -0
  147. package/dist/esm/ia-bookreader.js.map +1 -0
  148. package/dist/esm/plugins/plugin.archive_analytics.js +2 -0
  149. package/dist/esm/plugins/plugin.archive_analytics.js.map +1 -0
  150. package/dist/esm/plugins/plugin.autoplay.js +2 -0
  151. package/dist/esm/plugins/plugin.autoplay.js.map +1 -0
  152. package/dist/esm/plugins/plugin.chapters.js +2 -0
  153. package/dist/esm/plugins/plugin.chapters.js.map +1 -0
  154. package/dist/esm/plugins/plugin.experiments.js +2 -0
  155. package/dist/esm/plugins/plugin.experiments.js.map +1 -0
  156. package/dist/esm/plugins/plugin.iframe.js +2 -0
  157. package/dist/esm/plugins/plugin.iframe.js.map +1 -0
  158. package/dist/esm/plugins/plugin.iiif.js +2 -0
  159. package/dist/esm/plugins/plugin.iiif.js.map +1 -0
  160. package/dist/esm/plugins/plugin.resume.js +2 -0
  161. package/dist/esm/plugins/plugin.resume.js.map +1 -0
  162. package/dist/esm/plugins/plugin.search.js +2 -0
  163. package/dist/esm/plugins/plugin.search.js.map +1 -0
  164. package/dist/esm/plugins/plugin.text_selection.js +2 -0
  165. package/dist/esm/plugins/plugin.text_selection.js.map +1 -0
  166. package/dist/esm/plugins/plugin.translate.js +2 -0
  167. package/dist/esm/plugins/plugin.translate.js.map +1 -0
  168. package/dist/esm/plugins/plugin.tts.js +2 -0
  169. package/dist/esm/plugins/plugin.tts.js.map +1 -0
  170. package/dist/esm/plugins/plugin.url.js +2 -0
  171. package/dist/esm/plugins/plugin.url.js.map +1 -0
  172. package/dist/esm/plugins/plugin.vendor-fullscreen.js +2 -0
  173. package/dist/esm/plugins/plugin.vendor-fullscreen.js.map +1 -0
  174. package/jsconfig.json +18 -0
  175. package/package.json +113 -71
  176. package/src/BookReader/BookModel.js +92 -46
  177. package/src/BookReader/DragScrollable.js +233 -0
  178. package/src/BookReader/ImageCache.js +49 -16
  179. package/src/BookReader/Mode1Up.js +66 -365
  180. package/src/BookReader/Mode1UpLit.js +392 -0
  181. package/src/BookReader/Mode2Up.js +87 -1315
  182. package/src/BookReader/Mode2UpLit.js +786 -0
  183. package/src/BookReader/ModeAbstract.js +43 -0
  184. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  185. package/src/BookReader/ModeSmoothZoom.js +312 -0
  186. package/src/BookReader/ModeThumb.js +29 -15
  187. package/src/BookReader/Navbar/Navbar.js +204 -84
  188. package/src/BookReader/PageContainer.js +120 -23
  189. package/src/BookReader/ReduceSet.js +2 -2
  190. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  191. package/src/BookReader/events.js +3 -3
  192. package/src/BookReader/options.js +105 -18
  193. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  194. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  195. package/src/BookReader/utils/SelectionObserver.js +72 -0
  196. package/src/BookReader/utils/classes.js +1 -1
  197. package/src/BookReader/utils.js +136 -12
  198. package/src/BookReader.js +732 -1231
  199. package/src/BookReaderPlugin.js +52 -0
  200. package/src/assets/icons/magnify-minus.svg +3 -7
  201. package/src/assets/icons/magnify-plus.svg +3 -7
  202. package/src/assets/icons/slider-toggle.svg +1 -0
  203. package/src/assets/icons/voice.svg +1 -0
  204. package/src/assets/images/hypothesis.ico +0 -0
  205. package/src/assets/images/icon_experiment.svg +1 -0
  206. package/src/assets/images/translate.svg +1 -0
  207. package/src/assets/images/unviewable_page.png +0 -0
  208. package/src/assets/silence.mp3 +0 -0
  209. package/src/css/BookReader.scss +1 -5
  210. package/src/css/_BRBookmarks.scss +1 -1
  211. package/src/css/_BRComponent.scss +1 -1
  212. package/src/css/_BRicon.scss +8 -2
  213. package/src/css/_BRmain.scss +16 -3
  214. package/src/css/_BRnav.scss +74 -70
  215. package/src/css/_BRpages.scss +174 -42
  216. package/src/css/_BRsearch.scss +69 -30
  217. package/src/css/_BRtoolbar.scss +5 -5
  218. package/src/css/_TextSelection.scss +249 -25
  219. package/src/css/_colorbox.scss +2 -2
  220. package/src/css/_controls.scss +24 -7
  221. package/src/css/_icons.scss +8 -1
  222. package/src/{BookNavigator/assets → css}/button-base.js +2 -2
  223. package/src/css/icon_checkmark.js +9 -0
  224. package/src/css/sharedStyles.js +15 -0
  225. package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
  226. package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
  227. package/src/ia-bookreader/ia-bookreader.js +686 -0
  228. package/src/ia-bookreader/sharing.js +27 -0
  229. package/src/ia-bookreader/viewable-files.js +98 -0
  230. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
  231. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
  232. package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
  233. package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
  234. package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
  235. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  236. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
  237. package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
  238. package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
  239. package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
  240. package/src/plugins/plugin.archive_analytics.js +84 -78
  241. package/src/plugins/plugin.autoplay.js +99 -104
  242. package/src/plugins/plugin.chapters.js +323 -205
  243. package/src/plugins/plugin.experiments.js +375 -0
  244. package/src/plugins/plugin.iframe.js +36 -37
  245. package/src/plugins/plugin.iiif.js +147 -0
  246. package/src/plugins/plugin.resume.js +54 -51
  247. package/src/plugins/plugin.text_selection.js +464 -219
  248. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  249. package/src/plugins/search/plugin.search.js +347 -397
  250. package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
  251. package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
  252. package/src/plugins/search/utils.js +50 -0
  253. package/src/plugins/search/view.js +51 -69
  254. package/src/plugins/translate/TranslationManager.js +164 -0
  255. package/src/plugins/translate/plugin.translate.js +559 -0
  256. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  257. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  258. package/src/plugins/tts/PageChunk.js +117 -23
  259. package/src/plugins/tts/PageChunkIterator.js +11 -17
  260. package/src/plugins/tts/WebTTSEngine.js +132 -92
  261. package/src/plugins/tts/plugin.tts.js +341 -351
  262. package/src/plugins/tts/utils.js +76 -67
  263. package/src/plugins/url/UrlPlugin.js +213 -0
  264. package/src/plugins/{plugin.url.js → url/plugin.url.js} +54 -18
  265. package/src/util/TextSelectionManager.js +1464 -0
  266. package/src/util/browserSniffing.js +42 -1
  267. package/src/util/cache.js +20 -0
  268. package/src/util/docCookies.js +21 -2
  269. package/src/util/dom.js +88 -0
  270. package/src/util/generators.js +89 -0
  271. package/src/util/lit.js +15 -0
  272. package/src/util/strings.js +11 -0
  273. package/.babelrc +0 -12
  274. package/.dependabot/config.yml +0 -6
  275. package/.eslintrc.js +0 -50
  276. package/.gitattributes +0 -2
  277. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  278. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  279. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  280. package/.github/workflows/node.js.yml +0 -37
  281. package/.github/workflows/npm-publish.yml +0 -47
  282. package/.testcaferc.json +0 -5
  283. package/BookReader/BookReader.js +0 -21613
  284. package/BookReader/BookReader.js.map +0 -1
  285. package/BookReader/bookreader-component-bundle.js +0 -14497
  286. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  287. package/BookReader/bookreader-component-bundle.js.map +0 -1
  288. package/BookReader/jquery-1.10.1.js +0 -108
  289. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  290. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  291. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  292. package/BookReader/plugins/plugin.mobile_nav.js +0 -335
  293. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  294. package/BookReaderDemo/BookReaderDemo.css +0 -41
  295. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  296. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  297. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  298. package/BookReaderDemo/IIIFBookReader.js +0 -207
  299. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  300. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  301. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  302. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  303. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  304. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  305. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  306. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  307. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  308. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  309. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  310. package/BookReaderDemo/demo-advanced.html +0 -33
  311. package/BookReaderDemo/demo-autoplay.html +0 -38
  312. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  313. package/BookReaderDemo/demo-embed.html +0 -26
  314. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  315. package/BookReaderDemo/demo-fullscreen.html +0 -33
  316. package/BookReaderDemo/demo-iiif.html +0 -34
  317. package/BookReaderDemo/demo-iiif.js +0 -26
  318. package/BookReaderDemo/demo-internetarchive.html +0 -74
  319. package/BookReaderDemo/demo-multiple.html +0 -43
  320. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  321. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  322. package/BookReaderDemo/demo-simple.html +0 -34
  323. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  324. package/BookReaderDemo/immersion-1up.html +0 -64
  325. package/BookReaderDemo/immersion-mode.html +0 -35
  326. package/BookReaderDemo/toggle_controls.html +0 -53
  327. package/BookReaderDemo/view_mode.html +0 -39
  328. package/BookReaderDemo/viewmode-cycle.html +0 -41
  329. package/CHANGELOG.md +0 -499
  330. package/CONTRIBUTING.md +0 -7
  331. package/codecov.yml +0 -17
  332. package/index.html +0 -31
  333. package/karma.conf.js +0 -23
  334. package/screenshot.png +0 -0
  335. package/scripts/postversion.js +0 -10
  336. package/scripts/preversion.js +0 -14
  337. package/scripts/version.js +0 -26
  338. package/src/BookNavigator/BookModel.js +0 -14
  339. package/src/BookNavigator/BookNavigator.js +0 -459
  340. package/src/BookNavigator/assets/book-loader.js +0 -27
  341. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  342. package/src/BookNavigator/assets/icon_close.js +0 -3
  343. package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
  344. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  345. package/src/BookNavigator/assets/icon_sort_neutral.js +0 -5
  346. package/src/BookNavigator/assets/icon_volumes.js +0 -11
  347. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  348. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  349. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  350. package/src/BookNavigator/search/a-search-result.js +0 -55
  351. package/src/BookNavigator/volumes/volumes-provider.js +0 -83
  352. package/src/BookNavigator/volumes/volumes.js +0 -178
  353. package/src/BookReader/DebugConsole.js +0 -54
  354. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  355. package/src/ItemNavigator/ItemNavigator.js +0 -376
  356. package/src/ItemNavigator/providers/sharing.js +0 -33
  357. package/src/css/_MobileNav.scss +0 -194
  358. package/src/dragscrollable-br.js +0 -261
  359. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  360. package/src/plugins/plugin.mobile_nav.js +0 -287
  361. package/tests/BookReader/BookModel.test.js +0 -312
  362. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  363. package/tests/BookReader/DebugConsole.test.js +0 -25
  364. package/tests/BookReader/ImageCache.test.js +0 -150
  365. package/tests/BookReader/Mode1Up.test.js +0 -164
  366. package/tests/BookReader/Mode2Up.test.js +0 -247
  367. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  368. package/tests/BookReader/PageContainer.test.js +0 -115
  369. package/tests/BookReader/ReduceSet.test.js +0 -38
  370. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  371. package/tests/BookReader/utils/classes.test.js +0 -88
  372. package/tests/BookReader/utils.test.js +0 -109
  373. package/tests/BookReader.options.test.js +0 -39
  374. package/tests/BookReader.test.js +0 -301
  375. package/tests/e2e/README.md +0 -75
  376. package/tests/e2e/autoplay.test.js +0 -13
  377. package/tests/e2e/base.test.js +0 -35
  378. package/tests/e2e/helpers/base.js +0 -263
  379. package/tests/e2e/helpers/debug.js +0 -13
  380. package/tests/e2e/helpers/desktopSearch.js +0 -72
  381. package/tests/e2e/helpers/mobileSearch.js +0 -85
  382. package/tests/e2e/helpers/mockSearch.js +0 -93
  383. package/tests/e2e/helpers/rightToLeft.js +0 -29
  384. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  385. package/tests/e2e/models/BookReader.js +0 -11
  386. package/tests/e2e/models/Navigation.js +0 -56
  387. package/tests/e2e/rightToLeft.test.js +0 -20
  388. package/tests/e2e/viewmode.test.js +0 -37
  389. package/tests/karma/BookNavigator/book-navigator.test.js +0 -139
  390. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  391. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  392. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  393. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  394. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +0 -40
  395. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  396. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +0 -141
  397. package/tests/karma/BookNavigator/volumes/volumes.test.js +0 -98
  398. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  399. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  400. package/tests/plugins/plugin.autoplay.test.js +0 -52
  401. package/tests/plugins/plugin.chapters.test.js +0 -130
  402. package/tests/plugins/plugin.iframe.test.js +0 -42
  403. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  404. package/tests/plugins/plugin.resume.test.js +0 -98
  405. package/tests/plugins/plugin.text_selection.test.js +0 -203
  406. package/tests/plugins/plugin.url.test.js +0 -129
  407. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  408. package/tests/plugins/search/plugin.search.test.js +0 -173
  409. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  410. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  411. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  412. package/tests/plugins/tts/PageChunk.test.js +0 -57
  413. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  414. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  415. package/tests/plugins/tts/utils.test.js +0 -133
  416. package/tests/util/browserSniffing.test.js +0 -56
  417. package/tests/util/docCookies.test.js +0 -15
  418. package/tests/util/strings.test.js +0 -63
  419. package/tests/utils.js +0 -42
  420. package/webpack.config.js +0 -86
@@ -53,12 +53,17 @@ export class Toolbar {
53
53
  $('<a>')
54
54
  .attr({href: br.bookUrl, title: br.bookUrlTitle})
55
55
  .addClass('BRreturn')
56
- .html(br.bookUrlText || br.bookTitle)
56
+ .html(br.bookUrlText || br.bookTitle),
57
57
  );
58
58
  } else if (br.bookTitle) {
59
59
  $titleSectionEl.append(br.bookUrlText || br.bookTitle);
60
60
  }
61
61
 
62
+ // Call _bindNavigationHandlers on the plugins
63
+ for (const plugin of Object.values(br.plugins)) {
64
+ plugin._configureToolbar(br.refs.$BRtoolbar);
65
+ }
66
+
62
67
  // const $hamburger = br.refs.$BRtoolbar.find('BRtoolbarHamburger');
63
68
  return br.refs.$BRtoolbar;
64
69
  }
@@ -75,8 +80,6 @@ export class Toolbar {
75
80
  br.$('.BRnavCntl').addClass('BRup');
76
81
  br.$('.pause').hide();
77
82
 
78
- this.updateToolbarZoom(br.reduce); // Pretty format
79
-
80
83
  // We build in mode 2
81
84
  br.refs.$BRtoolbar.append();
82
85
 
@@ -115,7 +118,7 @@ export class Toolbar {
115
118
  onLoad: () => {
116
119
  br.trigger(EVENTS.stop);
117
120
  br.$('.BRpageviewValue').val(window.location.href);
118
- }
121
+ },
119
122
  });
120
123
  br.$('.info').colorbox({
121
124
  inline: true,
@@ -123,35 +126,10 @@ export class Toolbar {
123
126
  href: br.$('.BRinfo'),
124
127
  onLoad: () => {
125
128
  br.trigger(EVENTS.stop);
126
- }
129
+ },
127
130
  });
128
131
  }
129
132
 
130
- /**
131
- * @deprecated
132
- * @todo .BRzoom doesn't exist anywhere, so this is likely dead code
133
- * Update the displayed zoom factor based on reduction factor
134
- * @param {number} reduce
135
- */
136
- updateToolbarZoom(reduce) {
137
- const { br } = this;
138
- // $$$ TODO preserve zoom/fit for each mode
139
- const autofit = br.mode == br.constMode2up ? br.twoPage.autofit : br.onePage.autofit;
140
- /** @type {string} */
141
- let value;
142
- if (autofit) {
143
- value = autofit.slice(0,1).toUpperCase() + autofit.slice(1);
144
- } else {
145
- value = (100 / reduce)
146
- .toFixed(2)
147
- // Strip trailing zeroes and decimal if all zeroes
148
- .replace(/0+$/,'')
149
- .replace(/\.$/,'')
150
- + '%';
151
- }
152
- br.$('.BRzoom').text(value);
153
- }
154
-
155
133
  /**
156
134
  * @param {JQuery} $shareDiv
157
135
  */
@@ -212,11 +190,11 @@ export class Toolbar {
212
190
  $form.appendTo($shareDiv);
213
191
 
214
192
  $form.find('.fieldset-embed input').on('change', event => {
215
- const form = $(event.target).parents('form:first');
193
+ const form = $(event.target).parents('form').first();
216
194
  const params = {};
217
195
  params.mode = $(form.find('.fieldset-embed input[name=pages]:checked')).val();
218
196
  if (form.find('.fieldset-embed input[name=thispage]').prop('checked')) {
219
- params.page = br.getPageNum(br.currentIndex());
197
+ params.page = br.book.getPageNum(br.currentIndex());
220
198
  }
221
199
 
222
200
  if (br.getEmbedCode) {
@@ -232,20 +210,20 @@ export class Toolbar {
232
210
  // Bind share buttons
233
211
 
234
212
  // Use url without hashes
235
- $form.find('.facebook-share-button').click(() => {
213
+ $form.find('.facebook-share-button').on("click", () => {
236
214
  const params = $.param({ u: this._getSocialShareUrl() });
237
215
  const url = 'https://www.facebook.com/sharer.php?' + params;
238
216
  createPopup(url, 600, 400, 'Share');
239
217
  });
240
- $form.find('.twitter-share-button').click(() => {
218
+ $form.find('.twitter-share-button').on("click", () => {
241
219
  const params = $.param({
242
220
  url: this._getSocialShareUrl(),
243
- text: br.bookTitle
221
+ text: br.bookTitle,
244
222
  });
245
223
  const url = 'https://twitter.com/intent/tweet?' + params;
246
224
  createPopup(url, 600, 400, 'Share');
247
225
  });
248
- $form.find('.email-share-button').click(() => {
226
+ $form.find('.email-share-button').on("click", () => {
249
227
  const body = `${br.bookTitle}\n\n${this._getSocialShareUrl()}`;
250
228
  window.location.href = `mailto:?subject=${encodeURI(br.bookTitle)}&body=${encodeURI(body)}`;
251
229
  });
@@ -331,11 +309,11 @@ export class Toolbar {
331
309
  }
332
310
  }
333
311
 
334
- export function blankInfoDiv() {
312
+ function blankInfoDiv() {
335
313
  return $(`
336
314
  <div class="BRfloat BRinfo">
337
315
  <div class="BRfloatHead">About this book
338
- <button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="shift">Close</span></button>
316
+ <button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="br-colorbox-shift">Close</span></button>
339
317
  </div>
340
318
  <div class="BRfloatBody">
341
319
  <div class="BRfloatCover"></div>
@@ -351,12 +329,12 @@ export function blankInfoDiv() {
351
329
  </div>`);
352
330
  }
353
331
 
354
- export function blankShareDiv() {
332
+ function blankShareDiv() {
355
333
  return $(`
356
334
  <div class="BRfloat BRshare">
357
335
  <div class="BRfloatHead">
358
336
  Share
359
- <button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="shift">Close</span></button>
337
+ <button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="br-colorbox-shift">Close</span></button>
360
338
  </div>
361
339
  </div>`);
362
340
  }
@@ -3,11 +3,12 @@ export const EVENTS = {
3
3
  /** Indicates that the fragment (a serialization of the reader
4
4
  * state) has changed. */
5
5
  fragmentChange: 'fragmentChange',
6
+ pageChanged: 'pageChanged',
7
+ beforePageChanged: 'beforePageChanged',
6
8
  PostInit: 'PostInit',
7
9
  stop: 'stop',
8
10
  resize: 'resize',
9
- // nav events:
10
- navToggled: 'navToggled',
11
+ userAction: 'userAction', // event to know if user is actively reading
11
12
  // menu click events
12
13
  fullscreenToggled: 'fullscreenToggled',
13
14
  zoomOut: 'zoomOut',
@@ -16,5 +17,4 @@ export const EVENTS = {
16
17
  '2PageViewSelected': '2PageViewSelected',
17
18
  /* currently 3 represents thumbnail view */
18
19
  '3PageViewSelected': '3PageViewSelected',
19
- mobileNavOpen: 'mobileNavOpen',
20
20
  };
@@ -1,5 +1,8 @@
1
+ // @ts-check
1
2
  /** @typedef {import('./BookModel.js').PageNumString} PageNumString */
2
3
  /** @typedef {import('./BookModel.js').LeafNum} LeafNum */
4
+ /** @typedef {import('./BookModel.js').PageModel} PageModel */
5
+ /** @typedef {import('./BookModel.js').PageIndex} PageIndex */
3
6
 
4
7
  export const DEFAULT_OPTIONS = {
5
8
  /**
@@ -25,9 +28,13 @@ export const DEFAULT_OPTIONS = {
25
28
  thumbMaxLoading: 4,
26
29
  /** spacing between thumbnails */
27
30
  thumbPadding: 10,
31
+ /** min zoom in columns */
32
+ thumbMinZoomColumns: 2,
33
+ /** max zoom out columns */
34
+ thumbMaxZoomColumns: 8,
28
35
 
29
36
  /** @type {number | 'fast' | 'slow'} speed for flip animation */
30
- flipSpeed: 'fast',
37
+ flipSpeed: 400,
31
38
 
32
39
  showToolbar: true,
33
40
  showNavbar: true,
@@ -61,7 +68,7 @@ export const DEFAULT_OPTIONS = {
61
68
  {reduce: 2, autofit: null},
62
69
  {reduce: 3, autofit: null},
63
70
  {reduce: 4, autofit: null},
64
- {reduce: 6, autofit: null}
71
+ {reduce: 6, autofit: null},
65
72
  ],
66
73
 
67
74
  /** Object to hold parameters related to 1up mode */
@@ -79,7 +86,7 @@ export const DEFAULT_OPTIONS = {
79
86
  /** Width of book spine $$$ consider sizing based on book length */
80
87
  bookSpineDivWidth: 64,
81
88
  /** @type {AutoFitValues} */
82
- autofit: 'auto'
89
+ autofit: 'auto',
83
90
  },
84
91
 
85
92
  onePageMinBreakpoint: 800,
@@ -92,6 +99,11 @@ export const DEFAULT_OPTIONS = {
92
99
  /** @type {string} */
93
100
  bookUrlTitle: null,
94
101
  enableBookTitleLink: true,
102
+ /**
103
+ * @type {string} A globally unique URI for the book. This is used to
104
+ * save data like annotations the user makes to the book.
105
+ */
106
+ bookUri: null,
95
107
  /**
96
108
  * @type {string} language in ISO 639-1 (PRIVATE: Will also
97
109
  * handle language name in English, native name, 639-2/T, or 639-2/B . (archive.org books
@@ -118,7 +130,7 @@ export const DEFAULT_OPTIONS = {
118
130
  enableExperimentalControls: false,
119
131
 
120
132
  /** CSS selectors */
121
- /** Where BookReader mounts to */
133
+ /** @type {string | HTMLElement} Where BookReader mounts to; a CSS selector or an element */
122
134
  el: '#BookReader',
123
135
 
124
136
  /** @type {'lr' | 'rl'} Page progression */
@@ -136,8 +148,26 @@ export const DEFAULT_OPTIONS = {
136
148
  * but going forward we'll keep them here.
137
149
  **/
138
150
  plugins: {
139
- /** @type {import('../plugins/plugin.text_selection.js').TextSelectionPluginOptions} */
140
- textSelection: null,
151
+ /** @type {Partial<import('../plugins/plugin.archive_analytics.js').ArchiveAnalyticsPlugin['options'>]}*/
152
+ archiveAnalytics: {},
153
+ /** @type {Partial<import('../plugins/plugin.autoplay.js').AutoplayPlugin['options'>]}*/
154
+ autoplay: {},
155
+ /** @type {Partial<import('../plugins/plugin.chapters.js').ChaptersPlugin['options']>} */
156
+ chapters: {},
157
+ /** @type {Partial<import('../plugins/plugin.experiments.js').ExperimentsPlugin['options']>} */
158
+ experiments: {},
159
+ /** @type {Partial<import('../plugins/plugin.iiif.js').IiifPlugin['options']>} */
160
+ iiif: {},
161
+ /** @type {Partial<import('../plugins/plugin.resume.js').ResumePlugin['options']>} */
162
+ resume: {},
163
+ /** @type {Partial<import('../plugins/search/plugin.search.js').SearchPlugin['options']>} */
164
+ search: {},
165
+ /** @type {Partial<import('../plugins/plugin.text_selection.js').TextSelectionPlugin['options']>} */
166
+ textSelection: {},
167
+ /** @type {Partial<import('../plugins/translate/plugin.translate.js').TranslatePlugin['options']>} */
168
+ translate: {},
169
+ /** @type {Partial<import('../plugins/tts/plugin.tts.js').TtsPlugin['options']>} */
170
+ tts: {},
141
171
  },
142
172
 
143
173
  /**
@@ -176,15 +206,39 @@ export const DEFAULT_OPTIONS = {
176
206
  */
177
207
  data: [],
178
208
 
179
- /** Advanced methods for page rendering */
209
+ /** @type {import('../plugins/plugin.chapters.js').TocEntry[]} */
210
+ table_of_contents: null,
211
+
212
+ /**
213
+ * Advanced methods for page rendering.
214
+ * All option functions have their `this` object set to the BookReader instance.
215
+ **/
216
+
180
217
  /** @type {() => number} */
181
218
  getNumLeafs: null,
182
219
  /** @type {(index: number) => number} */
183
220
  getPageWidth: null,
184
221
  /** @type {(index: number) => number} */
185
222
  getPageHeight: null,
186
- /** @type {(index: number, reduce: number, rotate: number) => *} */
223
+ /** @type {(index: number, reduce: number, rotate: number) => string} */
187
224
  getPageURI: null,
225
+ /** @type {(page: PageModel) => Promise<PageIndex[]> | PageIndex[]} */
226
+ requestPage(page) {
227
+ return [];
228
+ },
229
+ /** @type {(textFragment: import('../util/TextSelectionManager.js').BookReaderTextFragment) => Promise<boolean> | boolean} */
230
+ verifyTextFragment(textFragment) {
231
+ return true;
232
+ },
233
+
234
+ /**
235
+ * @type {(img: HTMLImageElement, uri: string) => Promise<void> | void}
236
+ * Render the page URI into the image element. Perform any necessary preloading,
237
+ * authentication, etc.
238
+ */
239
+ renderPageURI(img, uri) {
240
+ img.src = uri;
241
+ },
188
242
 
189
243
  /**
190
244
  * @type {(index: number) => 'L' | 'R'}
@@ -214,35 +268,41 @@ export const DEFAULT_OPTIONS = {
214
268
  getEmbedCode: null,
215
269
 
216
270
  controls: {
271
+ toggleSlider: {
272
+ visible: true,
273
+ label: 'Toggle page controls',
274
+ className: 'toggle_slider',
275
+ iconClassName: 'toggle-slider',
276
+ },
217
277
  bookLeft: {
218
278
  visible: true,
219
279
  label: 'Flip left',
220
280
  className: 'book_left',
221
- iconClassName: 'left-arrow'
281
+ iconClassName: 'left-arrow',
222
282
  },
223
283
  bookRight: {
224
284
  visible: true,
225
285
  label: 'Flip right',
226
286
  className: 'book_right',
227
- iconClassName: 'left-arrow hflip'
287
+ iconClassName: 'left-arrow hflip',
228
288
  },
229
289
  onePage: {
230
290
  visible: true,
231
291
  label: 'One-page view',
232
292
  className: 'onepg',
233
- iconClassName: 'onepg'
293
+ iconClassName: 'onepg',
234
294
  },
235
295
  twoPage: {
236
296
  visible: true,
237
297
  label: 'Two-page view',
238
298
  className: 'twopg',
239
- iconClassName: 'twopg'
299
+ iconClassName: 'twopg',
240
300
  },
241
301
  thumbnail: {
242
302
  visible: true,
243
303
  label: 'Thumbnail view',
244
304
  className: 'thumb',
245
- iconClassName: 'thumb'
305
+ iconClassName: 'thumb',
246
306
  },
247
307
  viewmode: {
248
308
  visible: true,
@@ -253,19 +313,19 @@ export const DEFAULT_OPTIONS = {
253
313
  visible: true,
254
314
  label: 'Zoom out',
255
315
  className: 'zoom_out',
256
- iconClassName: 'magnify'
316
+ iconClassName: 'magnify',
257
317
  },
258
318
  zoomIn: {
259
319
  visible: true,
260
320
  label: 'Zoom in',
261
321
  className: 'zoom_in',
262
- iconClassName: 'magnify plus'
322
+ iconClassName: 'magnify plus',
263
323
  },
264
324
  fullScreen: {
265
325
  visible: true,
266
- label: 'Toggle fullscreen',
326
+ label: 'Go fullscreen',
267
327
  className: 'full',
268
- iconClassName: 'fullscreen'
328
+ iconClassName: 'fullscreen',
269
329
  },
270
330
  },
271
331
 
@@ -275,6 +335,12 @@ export const DEFAULT_OPTIONS = {
275
335
  */
276
336
  startFullscreen: false,
277
337
 
338
+ /**
339
+ * @type {Boolean}
340
+ * will show logo at fullscreen mode
341
+ */
342
+ enableFSLogoShortcut: false,
343
+
278
344
  /**
279
345
  * @type {Boolean}
280
346
  * On init, by default, we want to handle resizing bookreader
@@ -288,9 +354,24 @@ export const DEFAULT_OPTIONS = {
288
354
  * On init, by default, we want to use srcSet for images
289
355
  */
290
356
  useSrcSet: false,
357
+
358
+ /**
359
+ * @type {string}
360
+ * Path to the image to display when a page is unviewable (i.e. when
361
+ * displaying a preview of a book).
362
+ *
363
+ * Relative to the imagesBaseURL if a relative path is specified.
364
+ */
365
+ unviewablePageURI: './unviewable_page.png',
291
366
  };
292
367
 
293
- /** @typedef {'width' | 'height' | 'auto' | 'none'} AutoFitValues */
368
+ /**
369
+ * @typedef {'width' | 'height' | 'auto' | 'none'} AutoFitValues
370
+ * - width: fill the width of the container
371
+ * - height: fill the height of the container
372
+ * - auto: fill the width or height of the container, whichever is smaller
373
+ * - none: do not autofit
374
+ **/
294
375
 
295
376
  /**
296
377
  * @typedef {object} ReductionFactor
@@ -318,3 +399,9 @@ export const DEFAULT_OPTIONS = {
318
399
 
319
400
  /** @typedef {typeof DEFAULT_OPTIONS} BookReaderOptions */
320
401
 
402
+ /**
403
+ * Thrown when an error occurs while parsing options.
404
+ * Potentially recoverable and non-halting.
405
+ */
406
+ export class OptionsParseError extends Error {
407
+ }
@@ -0,0 +1,44 @@
1
+ // @ts-check
2
+ import { debounce } from '../utils.js';
3
+
4
+ /**
5
+ * Computing these things repeatedly is expensive (the browser needs to
6
+ * do a lot of computations/redrawing to make sure these are correct),
7
+ * so we store them here, and only recompute them when necessary:
8
+ * - window resize could have cause the container to change size
9
+ * - zoom could have cause scrollbars to appear/disappear, changing
10
+ * the client size.
11
+ */
12
+ export class HTMLDimensionsCacher {
13
+ clientWidth = 100;
14
+ clientHeight = 100;
15
+
16
+ boundingClientRect = { top: 0, left: 0 };
17
+
18
+ /**
19
+ * @param {HTMLElement} element
20
+ */
21
+ constructor(element) {
22
+ /** @type {HTMLElement} */
23
+ this.element = element;
24
+ }
25
+
26
+ updateClientSizes = () => {
27
+ const bc = this.element.getBoundingClientRect();
28
+ this.clientWidth = this.element.clientWidth;
29
+ this.clientHeight = this.element.clientHeight;
30
+ this.boundingClientRect.top = bc.top;
31
+ this.boundingClientRect.left = bc.left;
32
+ }
33
+ debouncedUpdateClientSizes = debounce(this.updateClientSizes, 150, false);
34
+
35
+ /** @param {EventTarget} win */
36
+ attachResizeListener(win = window) {
37
+ win.addEventListener('resize', this.debouncedUpdateClientSizes);
38
+ }
39
+
40
+ /** @param {EventTarget} win */
41
+ detachResizeListener(win = window) {
42
+ win.removeEventListener('resize', this.debouncedUpdateClientSizes);
43
+ }
44
+ }
@@ -0,0 +1,31 @@
1
+ /** Adds a class while the given element is experiencing scrolling */
2
+ export class ScrollClassAdder {
3
+ /**
4
+ * @param {HTMLElement} element
5
+ * @param {string} className
6
+ */
7
+ constructor(element, className) {
8
+ /** @type {HTMLElement} */
9
+ this.element = element;
10
+ /** @type {string} */
11
+ this.className = className;
12
+ this.timeout = null;
13
+ }
14
+
15
+ attach() {
16
+ this.element.addEventListener('scroll', this.onScroll);
17
+ }
18
+
19
+ detach() {
20
+ this.element.removeEventListener('scroll', this.onScroll);
21
+ }
22
+
23
+ onScroll = () => {
24
+ this.element.classList.add(this.className);
25
+ clearTimeout(this.timeout);
26
+ // TODO: Also remove class on mousemove, touch, click, etc.
27
+ this.timeout = setTimeout(() => {
28
+ this.element.classList.remove(this.className);
29
+ }, 600);
30
+ }
31
+ }
@@ -0,0 +1,72 @@
1
+ // @ts-check
2
+ /**
3
+ * Like `Selection.isCollapsed`, but checks the ranges too. WebKit reports
4
+ * `isCollapsed` as true for any selection inside a shadow root, even when
5
+ * it has text.
6
+ * https://bugs.webkit.org/show_bug.cgi?id=281587
7
+ * @param {Selection} selection
8
+ * @returns {boolean}
9
+ */
10
+ export function isSelectionCollapsed(selection) {
11
+ if (!selection.isCollapsed) return false;
12
+ for (let i = 0; i < selection.rangeCount; i++) {
13
+ if (!selection.getRangeAt(i).collapsed) return false;
14
+ }
15
+ return true;
16
+ }
17
+
18
+ export class SelectionObserver {
19
+ selecting = false;
20
+ startedInSelector = false;
21
+ /** @type {HTMLElement} */
22
+ target = null;
23
+ /** @type {Node | null} */
24
+ lastKnownFocusNode = null;
25
+
26
+ /**
27
+ * @param {string} selector
28
+ * @param {function('started' | 'cleared' | 'changed', HTMLElement): any} handler
29
+ */
30
+ constructor(selector, handler) {
31
+ this.selector = selector;
32
+ this.handler = handler;
33
+ }
34
+
35
+ attach() {
36
+ // We can't just use selectstart, because safari on iOS just
37
+ // randomly decides when to fire it 😤
38
+ // document.addEventListener("selectstart", this._onSelectStart);
39
+ // This has to be on document :/
40
+ document.addEventListener("selectionchange", this._onSelectionChange);
41
+ }
42
+
43
+ detach() {
44
+ document.removeEventListener("selectionchange", this._onSelectionChange);
45
+ }
46
+
47
+ _onSelectionChange = () => {
48
+ const sel = window.getSelection();
49
+ if (!sel) return;
50
+ const isCollapsed = isSelectionCollapsed(sel);
51
+
52
+ if (!this.selecting && sel.toString()) {
53
+ const target = $(sel.anchorNode).closest(this.selector)[0];
54
+ if (!target) return;
55
+ this.target = target;
56
+ this.selecting = true;
57
+ this.lastKnownFocusNode = sel.focusNode;
58
+ this.handler('started', this.target);
59
+ }
60
+
61
+ if (this.selecting && this.lastKnownFocusNode != sel.focusNode && sel.toString() && !isCollapsed) {
62
+ this.lastKnownFocusNode = sel.focusNode;
63
+ this.handler('changed', this.target);
64
+ }
65
+
66
+ if (this.selecting && (isCollapsed || !sel.toString() || !$(sel.anchorNode).closest(this.selector)[0])) {
67
+ this.selecting = false;
68
+ this.lastKnownFocusNode = null;
69
+ this.handler('cleared', this.target);
70
+ }
71
+ };
72
+ }
@@ -31,6 +31,6 @@ export function exposeOverrideable(FromClass, fromMethod, fromTransform, ToClass
31
31
  return overrideFn.apply(newThis, arguments);
32
32
  };
33
33
  wrapper = overrideFn;
34
- }
34
+ },
35
35
  });
36
36
  }