@internetarchive/bookreader 5.0.0-3 → 5.0.0-30-d

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 (391) hide show
  1. package/.eslintrc.js +17 -5
  2. package/.github/dependabot.yml +8 -0
  3. package/.github/workflows/node.js.yml +10 -1
  4. package/.husky/_/husky.sh +30 -0
  5. package/.testcaferc.js +10 -0
  6. package/BookReader/BookReader.css +75 -323
  7. package/BookReader/BookReader.js +32261 -2
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +15235 -0
  10. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  11. package/BookReader/icons/close-circle-dark.svg +1 -0
  12. package/BookReader/icons/voice.svg +1 -0
  13. package/BookReader/jquery-1.10.1.js +108 -2
  14. package/BookReader/plugins/plugin.archive_analytics.js +170 -1
  15. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  16. package/BookReader/plugins/plugin.autoplay.js +163 -1
  17. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  18. package/BookReader/plugins/plugin.chapters.js +333 -1
  19. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  20. package/BookReader/plugins/plugin.iframe.js +72 -1
  21. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  22. package/BookReader/plugins/plugin.mobile_nav.js +332 -1
  23. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  24. package/BookReader/plugins/plugin.resume.js +241 -1
  25. package/BookReader/plugins/plugin.resume.js.map +1 -1
  26. package/BookReader/plugins/plugin.search.js +1261 -1
  27. package/BookReader/plugins/plugin.search.js.map +1 -1
  28. package/BookReader/plugins/plugin.text_selection.js +839 -1
  29. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  30. package/BookReader/plugins/plugin.tts.js +9115 -2
  31. package/BookReader/plugins/plugin.tts.js.map +1 -1
  32. package/BookReader/plugins/plugin.url.js +811 -1
  33. package/BookReader/plugins/plugin.url.js.map +1 -1
  34. package/BookReader/plugins/plugin.vendor-fullscreen.js +326 -1
  35. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  36. package/BookReader/webcomponents-bundle.js +412 -0
  37. package/BookReader/webcomponents-bundle.js.map +1 -0
  38. package/BookReaderDemo/BookReaderDemo.css +14 -1
  39. package/BookReaderDemo/IADemoBr.js +107 -0
  40. package/BookReaderDemo/demo-advanced.html +1 -1
  41. package/BookReaderDemo/demo-autoplay.html +1 -0
  42. package/BookReaderDemo/demo-embed-iframe-src.html +1 -0
  43. package/BookReaderDemo/demo-fullscreen-mobile.html +1 -0
  44. package/BookReaderDemo/demo-fullscreen.html +1 -0
  45. package/BookReaderDemo/demo-iiif.html +1 -0
  46. package/BookReaderDemo/demo-internetarchive.html +66 -18
  47. package/BookReaderDemo/demo-multiple.html +1 -0
  48. package/BookReaderDemo/demo-preview-pages.html +1 -0
  49. package/BookReaderDemo/demo-simple.html +1 -0
  50. package/BookReaderDemo/demo-vendor-fullscreen.html +1 -0
  51. package/BookReaderDemo/immersion-1up.html +1 -0
  52. package/BookReaderDemo/immersion-mode.html +1 -0
  53. package/BookReaderDemo/toggle_controls.html +1 -0
  54. package/BookReaderDemo/view_mode.html +1 -0
  55. package/BookReaderDemo/viewmode-cycle.html +1 -2
  56. package/CHANGELOG.md +114 -0
  57. package/babel.config.js +18 -0
  58. package/index.html +3 -0
  59. package/jsconfig.json +19 -0
  60. package/package.json +45 -27
  61. package/src/BookNavigator/assets/button-base.js +8 -1
  62. package/src/BookNavigator/assets/ia-logo.js +17 -0
  63. package/src/BookNavigator/assets/icon_sort_asc.js +5 -0
  64. package/src/BookNavigator/assets/icon_sort_desc.js +5 -0
  65. package/src/BookNavigator/assets/icon_sort_neutral.js +5 -0
  66. package/src/BookNavigator/assets/icon_volumes.js +11 -0
  67. package/src/BookNavigator/book-navigator.js +528 -0
  68. package/src/BookNavigator/bookmarks/bookmark-button.js +2 -1
  69. package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -1
  70. package/src/BookNavigator/bookmarks/bookmarks-list.js +1 -0
  71. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +4 -9
  72. package/src/BookNavigator/bookmarks/bookmarks-provider.js +32 -11
  73. package/src/BookNavigator/bookmarks/ia-bookmarks.js +88 -43
  74. package/src/BookNavigator/downloads/downloads-provider.js +22 -16
  75. package/src/BookNavigator/downloads/downloads.js +16 -23
  76. package/src/BookNavigator/search/a-search-result.js +1 -0
  77. package/src/BookNavigator/search/search-provider.js +54 -20
  78. package/src/BookNavigator/search/search-results.js +7 -18
  79. package/src/BookNavigator/sharing.js +27 -0
  80. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +10 -12
  81. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +1 -0
  82. package/src/BookNavigator/volumes/volumes-provider.js +114 -0
  83. package/src/BookNavigator/volumes/volumes.js +189 -0
  84. package/src/BookReader/DebugConsole.js +3 -3
  85. package/src/BookReader/DragScrollable.js +233 -0
  86. package/src/BookReader/Mode1Up.js +50 -351
  87. package/src/BookReader/Mode1UpLit.js +434 -0
  88. package/src/BookReader/Mode2Up.js +94 -72
  89. package/src/BookReader/ModeSmoothZoom.js +177 -0
  90. package/src/BookReader/ModeThumb.js +16 -8
  91. package/src/BookReader/Navbar/Navbar.js +2 -31
  92. package/src/BookReader/PageContainer.js +47 -2
  93. package/src/BookReader/ReduceSet.js +1 -1
  94. package/src/BookReader/Toolbar/Toolbar.js +5 -5
  95. package/src/BookReader/options.js +10 -0
  96. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  97. package/src/BookReader/utils.js +68 -13
  98. package/src/BookReader.js +316 -232
  99. package/src/assets/icons/close-circle-dark.svg +1 -0
  100. package/src/assets/icons/voice.svg +1 -0
  101. package/src/css/BookReader.scss +0 -12
  102. package/src/css/_BRComponent.scss +1 -1
  103. package/src/css/_BRmain.scss +19 -24
  104. package/src/css/_BRnav.scss +4 -26
  105. package/src/css/_BRpages.scss +35 -0
  106. package/src/css/_BRsearch.scss +11 -215
  107. package/src/css/_TextSelection.scss +1 -17
  108. package/src/css/_controls.scss +16 -3
  109. package/src/css/_icons.scss +6 -0
  110. package/src/ia-bookreader/ia-bookreader.js +206 -0
  111. package/src/plugins/plugin.chapters.js +15 -18
  112. package/src/plugins/plugin.mobile_nav.js +11 -10
  113. package/src/plugins/plugin.resume.js +3 -3
  114. package/src/plugins/plugin.text_selection.js +17 -29
  115. package/src/plugins/plugin.vendor-fullscreen.js +4 -4
  116. package/src/plugins/search/plugin.search.js +113 -104
  117. package/src/plugins/search/view.js +48 -163
  118. package/src/plugins/tts/AbstractTTSEngine.js +7 -0
  119. package/src/plugins/tts/FestivalTTSEngine.js +2 -2
  120. package/src/plugins/tts/WebTTSEngine.js +5 -0
  121. package/src/plugins/tts/plugin.tts.js +67 -102
  122. package/src/plugins/url/UrlPlugin.js +184 -0
  123. package/src/plugins/url/plugin.url.js +220 -0
  124. package/{src → stat}/BookNavigator/BookModel.js +0 -0
  125. package/{src → stat}/BookNavigator/BookNavigator.js +151 -104
  126. package/stat/BookNavigator/assets/bookmark-colors.js +15 -0
  127. package/stat/BookNavigator/assets/button-base.js +61 -0
  128. package/stat/BookNavigator/assets/ia-logo.js +17 -0
  129. package/stat/BookNavigator/assets/icon_checkmark.js +6 -0
  130. package/stat/BookNavigator/assets/icon_close.js +3 -0
  131. package/stat/BookNavigator/assets/icon_sort_asc.js +5 -0
  132. package/stat/BookNavigator/assets/icon_sort_desc.js +5 -0
  133. package/stat/BookNavigator/assets/icon_sort_neutral.js +5 -0
  134. package/stat/BookNavigator/assets/icon_volumes.js +11 -0
  135. package/stat/BookNavigator/bookmarks/bookmark-button.js +64 -0
  136. package/stat/BookNavigator/bookmarks/bookmark-edit.js +215 -0
  137. package/stat/BookNavigator/bookmarks/bookmarks-list.js +285 -0
  138. package/stat/BookNavigator/bookmarks/bookmarks-loginCTA.js +28 -0
  139. package/stat/BookNavigator/bookmarks/bookmarks-provider.js +56 -0
  140. package/stat/BookNavigator/bookmarks/ia-bookmarks.js +523 -0
  141. package/{src → stat}/BookNavigator/br-fullscreen-mgr.js +1 -2
  142. package/stat/BookNavigator/delete-modal-actions.js +49 -0
  143. package/stat/BookNavigator/downloads/downloads-provider.js +72 -0
  144. package/stat/BookNavigator/downloads/downloads.js +139 -0
  145. package/stat/BookNavigator/provider-config.js +0 -0
  146. package/stat/BookNavigator/search/a-search-result.js +55 -0
  147. package/stat/BookNavigator/search/search-provider.js +180 -0
  148. package/stat/BookNavigator/search/search-results.js +360 -0
  149. package/stat/BookNavigator/sharing.js +31 -0
  150. package/stat/BookNavigator/visual-adjustments/visual-adjustments-provider.js +94 -0
  151. package/stat/BookNavigator/visual-adjustments/visual-adjustments.js +280 -0
  152. package/stat/BookNavigator/volumes/volumes-provider.js +83 -0
  153. package/stat/BookNavigator/volumes/volumes.js +178 -0
  154. package/stat/BookReader/BookModel.js +518 -0
  155. package/stat/BookReader/DebugConsole.js +54 -0
  156. package/stat/BookReader/DragScrollable.js +233 -0
  157. package/stat/BookReader/ImageCache.js +116 -0
  158. package/stat/BookReader/Mode1Up.js +102 -0
  159. package/stat/BookReader/Mode1UpLit.js +434 -0
  160. package/stat/BookReader/Mode2Up.js +1372 -0
  161. package/stat/BookReader/ModeSmoothZoom.js +177 -0
  162. package/stat/BookReader/ModeThumb.js +344 -0
  163. package/stat/BookReader/Navbar/Navbar.js +310 -0
  164. package/stat/BookReader/PageContainer.js +120 -0
  165. package/stat/BookReader/ReduceSet.js +26 -0
  166. package/stat/BookReader/Toolbar/Toolbar.js +384 -0
  167. package/stat/BookReader/events.js +20 -0
  168. package/stat/BookReader/options.js +324 -0
  169. package/stat/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  170. package/stat/BookReader/utils/classes.js +36 -0
  171. package/stat/BookReader/utils.js +240 -0
  172. package/stat/BookReader.js +2550 -0
  173. package/{src → stat}/BookReaderComponent/BookReaderComponent.js +16 -11
  174. package/stat/assets/icons/1up.svg +12 -0
  175. package/stat/assets/icons/2up.svg +15 -0
  176. package/stat/assets/icons/advance.svg +26 -0
  177. package/stat/assets/icons/chevron-right.svg +1 -0
  178. package/stat/assets/icons/close-circle-dark.svg +1 -0
  179. package/stat/assets/icons/close-circle.svg +1 -0
  180. package/stat/assets/icons/fullscreen.svg +17 -0
  181. package/stat/assets/icons/fullscreen_exit.svg +17 -0
  182. package/stat/assets/icons/hamburger.svg +15 -0
  183. package/stat/assets/icons/left-arrow.svg +12 -0
  184. package/stat/assets/icons/magnify-minus.svg +16 -0
  185. package/stat/assets/icons/magnify-plus.svg +17 -0
  186. package/stat/assets/icons/magnify.svg +15 -0
  187. package/stat/assets/icons/pause.svg +23 -0
  188. package/stat/assets/icons/play.svg +22 -0
  189. package/stat/assets/icons/playback-speed.svg +34 -0
  190. package/stat/assets/icons/read-aloud.svg +22 -0
  191. package/stat/assets/icons/review.svg +22 -0
  192. package/stat/assets/icons/thumbnails.svg +17 -0
  193. package/stat/assets/icons/voice.svg +1 -0
  194. package/stat/assets/icons/volume-full.svg +22 -0
  195. package/stat/assets/images/BRicons.png +0 -0
  196. package/stat/assets/images/BRicons.svg +94 -0
  197. package/stat/assets/images/BRicons_ia.png +0 -0
  198. package/stat/assets/images/back_pages.png +0 -0
  199. package/stat/assets/images/book_bottom_icon.png +0 -0
  200. package/stat/assets/images/book_down_icon.png +0 -0
  201. package/stat/assets/images/book_left_icon.png +0 -0
  202. package/stat/assets/images/book_leftmost_icon.png +0 -0
  203. package/stat/assets/images/book_right_icon.png +0 -0
  204. package/stat/assets/images/book_rightmost_icon.png +0 -0
  205. package/stat/assets/images/book_top_icon.png +0 -0
  206. package/stat/assets/images/book_up_icon.png +0 -0
  207. package/stat/assets/images/books_graphic.svg +177 -0
  208. package/stat/assets/images/booksplit.png +0 -0
  209. package/stat/assets/images/control_pause_icon.png +0 -0
  210. package/stat/assets/images/control_play_icon.png +0 -0
  211. package/stat/assets/images/embed_icon.png +0 -0
  212. package/stat/assets/images/icon-home-ia.png +0 -0
  213. package/stat/assets/images/icon_OL-logo-xs.png +0 -0
  214. package/stat/assets/images/icon_alert-xs.png +0 -0
  215. package/stat/assets/images/icon_book.svg +12 -0
  216. package/stat/assets/images/icon_bookmark.svg +12 -0
  217. package/stat/assets/images/icon_close-pop.png +0 -0
  218. package/stat/assets/images/icon_download.png +0 -0
  219. package/stat/assets/images/icon_gear.svg +14 -0
  220. package/stat/assets/images/icon_hamburger.svg +20 -0
  221. package/stat/assets/images/icon_home.png +0 -0
  222. package/stat/assets/images/icon_home.svg +21 -0
  223. package/stat/assets/images/icon_home_ia.png +0 -0
  224. package/stat/assets/images/icon_indicator.png +0 -0
  225. package/stat/assets/images/icon_info.svg +11 -0
  226. package/stat/assets/images/icon_one_page.svg +8 -0
  227. package/stat/assets/images/icon_pause.svg +1 -0
  228. package/stat/assets/images/icon_play.svg +1 -0
  229. package/stat/assets/images/icon_playback-rate.svg +15 -0
  230. package/stat/assets/images/icon_return.png +0 -0
  231. package/stat/assets/images/icon_search_button.svg +8 -0
  232. package/stat/assets/images/icon_share.svg +9 -0
  233. package/stat/assets/images/icon_skip-ahead.svg +6 -0
  234. package/stat/assets/images/icon_skip-back.svg +13 -0
  235. package/stat/assets/images/icon_speaker.svg +18 -0
  236. package/stat/assets/images/icon_speaker_open.svg +10 -0
  237. package/stat/assets/images/icon_thumbnails.svg +12 -0
  238. package/stat/assets/images/icon_toc.svg +5 -0
  239. package/stat/assets/images/icon_two_pages.svg +9 -0
  240. package/stat/assets/images/icon_zoomer.png +0 -0
  241. package/stat/assets/images/loading.gif +0 -0
  242. package/stat/assets/images/logo_icon.png +0 -0
  243. package/stat/assets/images/marker_chap-off.png +0 -0
  244. package/stat/assets/images/marker_chap-off.svg +11 -0
  245. package/stat/assets/images/marker_chap-off_ia.png +0 -0
  246. package/stat/assets/images/marker_chap-on.png +0 -0
  247. package/stat/assets/images/marker_chap-on.svg +11 -0
  248. package/stat/assets/images/marker_srch-on.svg +11 -0
  249. package/stat/assets/images/marker_srchchap-off.png +0 -0
  250. package/stat/assets/images/marker_srchchap-on.png +0 -0
  251. package/stat/assets/images/nav_control-dn.png +0 -0
  252. package/stat/assets/images/nav_control-dn_ia.png +0 -0
  253. package/stat/assets/images/nav_control-up.png +0 -0
  254. package/stat/assets/images/nav_control-up_ia.png +0 -0
  255. package/stat/assets/images/nav_control.png +0 -0
  256. package/stat/assets/images/one_page_mode_icon.png +0 -0
  257. package/stat/assets/images/paper-badge.png +0 -0
  258. package/stat/assets/images/print_icon.png +0 -0
  259. package/stat/assets/images/progressbar.gif +0 -0
  260. package/stat/assets/images/right_edges.png +0 -0
  261. package/stat/assets/images/slider.png +0 -0
  262. package/stat/assets/images/slider_ia.png +0 -0
  263. package/stat/assets/images/thumbnail_mode_icon.png +0 -0
  264. package/stat/assets/images/transparent.png +0 -0
  265. package/stat/assets/images/two_page_mode_icon.png +0 -0
  266. package/stat/assets/images/zoom_in_icon.png +0 -0
  267. package/stat/assets/images/zoom_out_icon.png +0 -0
  268. package/stat/css/BookReader.scss +89 -0
  269. package/stat/css/_BRBookmarks.scss +29 -0
  270. package/stat/css/_BRComponent.scss +13 -0
  271. package/stat/css/_BRfloat.scss +197 -0
  272. package/stat/css/_BRicon.scss +48 -0
  273. package/stat/css/_BRmain.scss +251 -0
  274. package/stat/css/_BRnav.scss +359 -0
  275. package/stat/css/_BRpages.scss +139 -0
  276. package/stat/css/_BRsearch.scss +226 -0
  277. package/stat/css/_BRtoolbar.scss +84 -0
  278. package/stat/css/_BRvendor.scss +5 -0
  279. package/stat/css/_MobileNav.scss +194 -0
  280. package/stat/css/_TextSelection.scss +32 -0
  281. package/stat/css/_colorbox.scss +52 -0
  282. package/stat/css/_controls.scss +253 -0
  283. package/stat/css/_icons.scss +121 -0
  284. package/stat/jquery-wrapper.js +4 -0
  285. package/stat/plugins/plugin.archive_analytics.js +86 -0
  286. package/stat/plugins/plugin.autoplay.js +129 -0
  287. package/stat/plugins/plugin.chapters.js +248 -0
  288. package/stat/plugins/plugin.iframe.js +48 -0
  289. package/stat/plugins/plugin.mobile_nav.js +288 -0
  290. package/stat/plugins/plugin.resume.js +68 -0
  291. package/stat/plugins/plugin.text_selection.js +291 -0
  292. package/{src → stat}/plugins/plugin.url.js +4 -4
  293. package/stat/plugins/plugin.vendor-fullscreen.js +247 -0
  294. package/stat/plugins/search/plugin.search.js +439 -0
  295. package/stat/plugins/search/view.js +439 -0
  296. package/stat/plugins/tts/AbstractTTSEngine.js +249 -0
  297. package/stat/plugins/tts/FestivalTTSEngine.js +169 -0
  298. package/stat/plugins/tts/PageChunk.js +107 -0
  299. package/stat/plugins/tts/PageChunkIterator.js +163 -0
  300. package/stat/plugins/tts/WebTTSEngine.js +357 -0
  301. package/stat/plugins/tts/plugin.tts.js +357 -0
  302. package/stat/plugins/tts/tooltip_dict.js +15 -0
  303. package/stat/plugins/tts/utils.js +91 -0
  304. package/stat/util/browserSniffing.js +30 -0
  305. package/stat/util/debouncer.js +26 -0
  306. package/stat/util/docCookies.js +67 -0
  307. package/stat/util/strings.js +34 -0
  308. package/tests/e2e/README.md +37 -0
  309. package/tests/e2e/autoplay.test.js +2 -2
  310. package/tests/e2e/base.test.js +5 -7
  311. package/tests/e2e/helpers/base.js +8 -3
  312. package/tests/e2e/helpers/debug.js +1 -1
  313. package/tests/e2e/helpers/desktopSearch.js +1 -1
  314. package/tests/e2e/helpers/mobileSearch.js +3 -3
  315. package/tests/e2e/helpers/params.js +17 -0
  316. package/tests/e2e/rightToLeft.test.js +4 -5
  317. package/tests/e2e/viewmode.test.js +30 -31
  318. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +3 -3
  319. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +176 -0
  320. package/tests/{BookReader → jest/BookReader}/DebugConsole.test.js +1 -1
  321. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  322. package/tests/jest/BookReader/Mode1UpLit.test.js +87 -0
  323. package/tests/{BookReader → jest/BookReader}/Mode2Up.test.js +5 -7
  324. package/tests/jest/BookReader/ModeSmoothZoom.test.js +149 -0
  325. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  326. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +7 -7
  327. package/tests/{BookReader → jest/BookReader}/PageContainer.test.js +74 -2
  328. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  329. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +2 -2
  330. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  331. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  332. package/tests/jest/BookReader/utils.test.js +136 -0
  333. package/tests/jest/BookReader.keyboard.test.js +190 -0
  334. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +9 -1
  335. package/tests/{BookReader.test.js → jest/BookReader.test.js} +20 -4
  336. package/tests/{plugins → jest/plugins}/plugin.archive_analytics.test.js +2 -2
  337. package/tests/{plugins → jest/plugins}/plugin.autoplay.test.js +2 -2
  338. package/tests/{plugins → jest/plugins}/plugin.chapters.test.js +8 -8
  339. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +2 -2
  340. package/tests/{plugins → jest/plugins}/plugin.mobile_nav.test.js +5 -5
  341. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +3 -3
  342. package/tests/{plugins → jest/plugins}/plugin.text_selection.test.js +14 -24
  343. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  344. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +12 -5
  345. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +6 -6
  346. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +3 -3
  347. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  348. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  349. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  350. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +1 -1
  351. package/tests/{plugins → jest/plugins}/tts/utils.test.js +3 -3
  352. package/tests/jest/plugins/url/UrlPlugin.test.js +175 -0
  353. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +33 -14
  354. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  355. package/tests/{util → jest/util}/docCookies.test.js +1 -1
  356. package/tests/{util → jest/util}/strings.test.js +1 -1
  357. package/tests/{utils.js → jest/utils.js} +38 -0
  358. package/tests/karma/BookNavigator/book-navigator.test.js +485 -0
  359. package/tests/karma/BookNavigator/bookmarks/bookmark-button.test.js +44 -0
  360. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +1 -3
  361. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +1 -2
  362. package/tests/karma/BookNavigator/downloads/downloads-provider.test.js +67 -0
  363. package/tests/karma/BookNavigator/downloads/downloads.test.js +54 -0
  364. package/tests/karma/BookNavigator/search/search-provider.test.js +123 -0
  365. package/tests/karma/BookNavigator/{search-results.test.js → search/search-results.test.js} +1 -4
  366. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +49 -0
  367. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -2
  368. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +184 -0
  369. package/tests/karma/BookNavigator/volumes/volumes.test.js +98 -0
  370. package/webpack.config.js +11 -5
  371. package/.babelrc +0 -12
  372. package/.dependabot/config.yml +0 -6
  373. package/.testcaferc.json +0 -5
  374. package/BookReader/BookReader.js.LICENSE.txt +0 -72
  375. package/BookReader/bookreader-component-bundle.js +0 -1450
  376. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  377. package/BookReader/bookreader-component-bundle.js.map +0 -1
  378. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  379. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  380. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  381. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +0 -27
  382. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  383. package/src/BookNavigator/assets/book-loader.js +0 -27
  384. package/src/ItemNavigator/ItemNavigator.js +0 -372
  385. package/src/ItemNavigator/providers/sharing.js +0 -29
  386. package/src/dragscrollable-br.js +0 -261
  387. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  388. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  389. package/tests/BookReader/Mode1Up.test.js +0 -164
  390. package/tests/BookReader/utils.test.js +0 -109
  391. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
@@ -1,8 +1,6 @@
1
1
  import { html } from 'lit-element';
2
-
3
- /* define subpanel */
4
- import { IABookVisualAdjustments } from './visual-adjustments.js';
5
- customElements.define('ia-book-visual-adjustments', IABookVisualAdjustments);
2
+ import '@internetarchive/icon-visual-adjustment/icon-visual-adjustment';
3
+ import './visual-adjustments';
6
4
 
7
5
  const visualAdjustmentOptions = [{
8
6
  id: 'brightness',
@@ -30,11 +28,11 @@ const visualAdjustmentOptions = [{
30
28
  active: false,
31
29
  }];
32
30
 
33
- export default class {
31
+ export default class VisualAdjustmentsProvider {
34
32
  constructor(options) {
35
- const { onOptionChange = () => {}, bookContainerSelector, bookreader } = options;
36
- this.onOptionChange = onOptionChange;
37
- this.bookContainerSelector = bookContainerSelector;
33
+ const { onProviderChange, bookreader } = options;
34
+ this.onProviderChange = onProviderChange;
35
+ this.bookContainer = bookreader.refs.$brContainer;
38
36
  this.bookreader = bookreader;
39
37
 
40
38
  this.onAdjustmentChange = this.onAdjustmentChange.bind(this);
@@ -44,7 +42,7 @@ export default class {
44
42
  this.onZoomOut = this.onZoomOut.bind(this);
45
43
 
46
44
  this.activeCount = 0;
47
- this.icon = html`<ia-icon icon="visualAdjustment" style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon>`;
45
+ this.icon = html`<ia-icon-visual-adjustment style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon-visual-adjustment>`;
48
46
  this.label = 'Visual Adjustments';
49
47
  this.menuDetails = this.updateOptionsCount();
50
48
  this.id = 'adjustment';
@@ -63,7 +61,7 @@ export default class {
63
61
  }
64
62
 
65
63
  onZoomOut() {
66
- this.bookreader.zoom();
64
+ this.bookreader.zoom(-1);
67
65
  }
68
66
 
69
67
  onAdjustmentChange(event) {
@@ -79,7 +77,7 @@ export default class {
79
77
  return newValue ? [...values, newValue] : values;
80
78
  }, []).join(' ');
81
79
 
82
- document.querySelector(this.bookContainerSelector).style.setProperty('filter', filters);
80
+ this.bookContainer.css('filter', filters);
83
81
 
84
82
  this.optionUpdateComplete(event);
85
83
  }
@@ -87,7 +85,7 @@ export default class {
87
85
  optionUpdateComplete(event) {
88
86
  this.activeCount = event.detail.activeCount;
89
87
  this.updateOptionsCount(event);
90
- this.onOptionChange(event);
88
+ this.onProviderChange();
91
89
  }
92
90
 
93
91
  updateOptionsCount() {
@@ -277,3 +277,4 @@ export class IABookVisualAdjustments extends LitElement {
277
277
  }`;
278
278
  }
279
279
  }
280
+ customElements.define('ia-book-visual-adjustments', IABookVisualAdjustments);
@@ -0,0 +1,114 @@
1
+ import { html } from 'lit-element';
2
+
3
+ import sortDescIcon from '../assets/icon_sort_desc.js';
4
+ import sortAscIcon from '../assets/icon_sort_asc.js';
5
+ import sortNeutralIcon from '../assets/icon_sort_neutral.js';
6
+ import volumesIcon from '../assets/icon_volumes.js';
7
+
8
+ import './volumes.js';
9
+
10
+ const sortType = {
11
+ title_asc: 'title_asc',
12
+ title_desc: 'title_desc',
13
+ default: 'default'
14
+ };
15
+ export default class VolumesProvider {
16
+ /**
17
+ * @param {import('../../BookReader').default} bookreader
18
+ */
19
+ constructor({ baseHost, bookreader, onProviderChange }) {
20
+ this.onProviderChange = onProviderChange;
21
+ this.component = document.createElement("viewable-files");
22
+
23
+ const files = bookreader.options.multipleBooksList.by_subprefix;
24
+ this.viewableFiles = Object.keys(files).map(item => files[item]);
25
+ this.volumeCount = Object.keys(files).length;
26
+
27
+ /** @type {import('../../BookReader').default} */
28
+ this.bookreader = bookreader;
29
+
30
+ this.component.subPrefix = bookreader.options.subPrefix || "";
31
+ this.component.hostUrl = baseHost;
32
+ this.component.viewableFiles = this.viewableFiles;
33
+
34
+ this.id = "volumes";
35
+ this.label = `Viewable files (${this.volumeCount})`;
36
+ this.icon = html`${volumesIcon}`;
37
+
38
+ this.sortOrderBy = sortType.default;
39
+
40
+ // get sort state from query param
41
+ if (this.bookreader.urlPlugin) {
42
+ this.bookreader.urlPlugin.pullFromAddressBar();
43
+
44
+ const urlSortValue = this.bookreader.urlPlugin.getUrlParam('sort');
45
+ if (urlSortValue === sortType.title_asc || urlSortValue === sortType.title_desc) {
46
+ this.sortOrderBy = urlSortValue;
47
+ }
48
+ }
49
+ this.sortVolumes(this.sortOrderBy);
50
+ }
51
+
52
+ get sortButton() {
53
+ const sortIcons = {
54
+ default: html`
55
+ <button class="sort-by neutral-icon" aria-label="Sort volumes in initial order" @click=${() => this.sortVolumes("title_asc")}>${sortNeutralIcon}</button>
56
+ `,
57
+ title_asc: html`
58
+ <button class="sort-by asc-icon" aria-label="Sort volumes in ascending order" @click=${() => this.sortVolumes("title_desc")}>${sortAscIcon}</button>
59
+ `,
60
+ title_desc: html`
61
+ <button class="sort-by desc-icon" aria-label="Sort volumes in descending order" @click=${() => this.sortVolumes("default")}>${sortDescIcon}</button>
62
+ `,
63
+ };
64
+
65
+ return sortIcons[this.sortOrderBy];
66
+ }
67
+
68
+ /**
69
+ * @param {'default' | 'title_asc' | 'title_desc'} sortByType
70
+ */
71
+ sortVolumes(sortByType) {
72
+ let sortedFiles = [];
73
+
74
+ const files = this.viewableFiles;
75
+ sortedFiles = files.sort((a, b) => {
76
+ if (sortByType === sortType.title_asc) return a.title.localeCompare(b.title);
77
+ else if (sortByType === sortType.title_desc) return b.title.localeCompare(a.title);
78
+ else return a.orig_sort - b.orig_sort;
79
+ });
80
+
81
+ this.sortOrderBy = sortByType;
82
+ this.component.sortOrderBy = sortByType;
83
+ this.component.viewableFiles = [...sortedFiles];
84
+ this.actionButton = this.sortButton;
85
+
86
+ if (this.bookreader.urlPlugin) {
87
+ this.bookreader.urlPlugin.pullFromAddressBar();
88
+ if (this.sortOrderBy !== sortType.default) {
89
+ this.bookreader.urlPlugin.setUrlParam('sort', sortByType);
90
+ } else {
91
+ this.bookreader.urlPlugin.removeUrlParam('sort');
92
+ }
93
+ }
94
+
95
+ this.onProviderChange(this.bookreader);
96
+
97
+ this.multipleFilesClicked(sortByType);
98
+ }
99
+
100
+ /**
101
+ * @param {'default' | 'title_asc' | 'title_desc'} orderBy
102
+ */
103
+ multipleFilesClicked(orderBy) {
104
+ if (!window.archive_analytics) {
105
+ return;
106
+ }
107
+ window.archive_analytics?.send_event_no_sampling(
108
+ 'BookReader',
109
+ `VolumesSort|${orderBy}`,
110
+ window.location.path,
111
+ );
112
+ }
113
+
114
+ }
@@ -0,0 +1,189 @@
1
+ import { css, html, LitElement } from 'lit-element';
2
+ import { nothing } from 'lit-html';
3
+ import { repeat } from 'lit-html/directives/repeat';
4
+
5
+ export class Volumes extends LitElement {
6
+ static get properties() {
7
+ return {
8
+ subPrefix: { type: String },
9
+ hostUrl: { type: String },
10
+ viewableFiles: { type: Array },
11
+ sortOrderBy: { type: String },
12
+ };
13
+ }
14
+
15
+ constructor() {
16
+ super();
17
+ this.hostUrl = '';
18
+ this.sortOrderBy = '';
19
+ this.subPrefix = '';
20
+ this.viewableFiles = [];
21
+ }
22
+
23
+ firstUpdated() {
24
+ const activeFile = this.shadowRoot.querySelector('.content.active');
25
+ // allow for css animations to run before scrolling to active file
26
+ setTimeout(() => {
27
+ // scroll active file into view if needed
28
+ // note: `scrollIntoViewIfNeeded` handles auto-scroll gracefully for Chrome, Safari
29
+ // Firefox does not have this capability yet as it does not support `scrollIntoViewIfNeeded`
30
+ if (activeFile?.scrollIntoViewIfNeeded) {
31
+ activeFile?.scrollIntoViewIfNeeded(true);
32
+ return;
33
+ }
34
+
35
+ // Todo: support `scrollIntoView` or `parentContainer.crollTop = x` for FF & "IE 11"
36
+ // currently, the hard `position: absolutes` misaligns subpanel when `scrollIntoView` is applied :(
37
+ }, 350);
38
+ }
39
+
40
+ volumeItemWithImageTitle(item) {
41
+ const hrefUrl = this.sortOrderBy === 'default'
42
+ ? `${this.hostUrl}${item.url_path}`
43
+ : `${this.hostUrl}${item.url_path}?sort=${this.sortOrderBy}`;
44
+
45
+ return html`
46
+ <li class="content active">
47
+ <div class="separator"></div>
48
+ <a class="container" href="${hrefUrl}">
49
+ <div class="image">
50
+ <img src="${item.image}">
51
+ </div>
52
+ <div class="text">
53
+ <p class="item-title">${item.title}</p>
54
+ <small>by: ${item.author}</small>
55
+ </div>
56
+ </a>
57
+ </li>
58
+ `;
59
+ }
60
+
61
+ volumeItem(item) {
62
+ const activeClass = this.subPrefix === item.file_subprefix ? ' active' : '';
63
+
64
+ const hrefUrl = this.sortOrderBy === 'default'
65
+ ? `${this.hostUrl}${item.url_path}`
66
+ : `${this.hostUrl}${item.url_path}?sort=${this.sortOrderBy}`;
67
+
68
+ return html`
69
+ <li>
70
+ <div class="separator"></div>
71
+ <div class="content${activeClass}">
72
+ <a href="https://${hrefUrl}">
73
+ <p class="item-title">${item.title}</p>
74
+ </a>
75
+ </div>
76
+ </li>
77
+ `;
78
+ }
79
+
80
+ get volumesList() {
81
+ const volumes = repeat(this.viewableFiles, volume => volume?.file_prefix, this.volumeItem.bind(this));
82
+ return html`
83
+ <ul>
84
+ ${volumes}
85
+ <div class="separator"></div>
86
+ </ul>
87
+ `;
88
+ }
89
+
90
+ render() {
91
+ return html`
92
+ ${this.viewableFiles.length ? this.volumesList : nothing}
93
+ `;
94
+ }
95
+
96
+ static get styles() {
97
+ return css`
98
+ :host {
99
+ display: block;
100
+ overflow-y: auto;
101
+ box-sizing: border-box;
102
+ color: var(--primaryTextColor);
103
+ margin-top: 14px;
104
+ margin-bottom: 2rem;
105
+ --activeBorderWidth: 2px;
106
+ }
107
+
108
+ a {
109
+ color: #ffffff;
110
+ text-decoration: none
111
+ }
112
+
113
+ img {
114
+ width: 35px;
115
+ height: 45px;
116
+ }
117
+
118
+ ul {
119
+ padding: 0;
120
+ list-style: none;
121
+ margin: var(--activeBorderWidth) 0.5rem 1rem 0;
122
+ }
123
+
124
+ ul > li:first-child .separator {
125
+ display: none;
126
+ }
127
+
128
+ li {
129
+ cursor: pointer;
130
+ outline: none;
131
+ position: relative;
132
+ }
133
+
134
+ li .content {
135
+ padding: 2px 0 4px 2px;
136
+ border: var(--activeBorderWidth) solid transparent;
137
+ padding: .2rem 0 .4rem .2rem;
138
+ }
139
+
140
+ li .content.active {
141
+ border: var(--activeBorderWidth) solid #538bc5;
142
+ }
143
+
144
+ small {
145
+ font-style: italic;
146
+ white-space: initial;
147
+ }
148
+
149
+ .container {
150
+ display: flex;
151
+ align-items: center;
152
+ justify-content: center
153
+ }
154
+
155
+ .item-title {
156
+ margin-block-start: 0em;
157
+ margin-block-end: 0em;
158
+ font-size: 14px;
159
+ font-weight: bold;
160
+ word-wrap: break-word;
161
+ padding-left: 5px;
162
+ }
163
+
164
+ .separator {
165
+ background-color: var(--secondaryBGColor);
166
+ width: 98%;
167
+ margin: 1px auto;
168
+ height: 1px;
169
+ }
170
+
171
+ .text {
172
+ padding-left: 10px;
173
+ }
174
+
175
+ .icon {
176
+ display: inline-block;
177
+ width: 14px;
178
+ height: 14px;
179
+ margin-left: .7rem;
180
+ border: 1px solid var(--primaryTextColor);
181
+ border-radius: 2px;
182
+ background: var(--activeButtonBg) 50% 50% no-repeat;
183
+ }
184
+
185
+ `;
186
+ }
187
+ }
188
+
189
+ customElements.define('viewable-files', Volumes);
@@ -19,7 +19,7 @@ export class DebugConsole {
19
19
  </form>`);
20
20
  this.$log.append(this.$form);
21
21
 
22
- this.$form.submit(ev => {
22
+ this.$form.on("submit", ev => {
23
23
  ev.preventDefault();
24
24
  const result = eval(this.$form.find('input').val());
25
25
  this.logToScreen([result]);
@@ -29,7 +29,7 @@ export class DebugConsole {
29
29
  console.log = (...args) => {
30
30
  _realLog(...args);
31
31
  this.logToScreen(args);
32
- }
32
+ };
33
33
 
34
34
  window.onerror = (...args) => this.logToScreen(args);
35
35
  }
@@ -40,7 +40,7 @@ export class DebugConsole {
40
40
  */
41
41
  logToScreen(args) {
42
42
  const html = args.map(JSON.stringify).join(',');
43
- const $lastEntry = this.$log.children('.log-entry:last-child')
43
+ const $lastEntry = this.$log.children('.log-entry:last-child');
44
44
  if ($lastEntry.find('.entry-code').html() == html) {
45
45
  $lastEntry.find('.count').text(`(${++this.currentRun})`);
46
46
  } else {
@@ -0,0 +1,233 @@
1
+ // @ts-check
2
+ /*
3
+ * jQuery dragscrollable Plugin
4
+ * Based off version: 1.0 (25-Jun-2009)
5
+ * Copyright (c) 2009 Miquel Herrera
6
+ *
7
+ * Portions Copyright (c) 2010 Reg Braithwaite
8
+ * Copyright (c) 2010 Internet Archive / Michael Ang
9
+ * Copyright (c) 2016 Internet Archive / Richard Caceres
10
+ *
11
+ * Dual licensed under the MIT and GPL licenses:
12
+ * http://www.opensource.org/licenses/mit-license.php
13
+ * http://www.gnu.org/licenses/gpl.html
14
+ */
15
+
16
+ /**
17
+ * @param {string} string_of_events
18
+ * @param {string} ns
19
+ * @returns
20
+ */
21
+ function append_namespace(string_of_events, ns) {
22
+ return string_of_events
23
+ .split(' ')
24
+ .map(event_name => event_name + ns)
25
+ .join(' ');
26
+ }
27
+
28
+ function left_top(event) {
29
+ /** @type {number} */
30
+ let x;
31
+ /** @type {number} */
32
+ let y;
33
+ if (typeof(event.clientX) != 'undefined') {
34
+ x = event.clientX;
35
+ y = event.clientY;
36
+ }
37
+ else if (typeof(event.screenX) != 'undefined') {
38
+ x = event.screenX;
39
+ y = event.screenY;
40
+ }
41
+ else if (typeof(event.targetTouches) != 'undefined') {
42
+ x = event.targetTouches[0].pageX;
43
+ y = event.targetTouches[0].pageY;
44
+ }
45
+ else if (typeof(event.originalEvent) == 'undefined') {
46
+ console.error("don't understand x and y for " + event.type, event);
47
+ }
48
+ else if (typeof(event.originalEvent.clientX) != 'undefined') {
49
+ x = event.originalEvent.clientX;
50
+ y = event.originalEvent.clientY;
51
+ }
52
+ else if (typeof(event.originalEvent.screenX) != 'undefined') {
53
+ x = event.originalEvent.screenX;
54
+ y = event.originalEvent.screenY;
55
+ }
56
+ else if (typeof(event.originalEvent.targetTouches) != 'undefined') {
57
+ x = event.originalEvent.targetTouches[0].pageX;
58
+ y = event.originalEvent.targetTouches[0].pageY;
59
+ }
60
+
61
+ return { left: x, top: y };
62
+ }
63
+
64
+ const DEFAULT_OPTIONS = {
65
+ /**
66
+ * @type {String|HTMLElement} jQuery selector to apply to each wrapped element to
67
+ * find which will be the dragging elements. Defaults to the first child of scrollable
68
+ * element
69
+ */
70
+ dragSelector: '>:first',
71
+
72
+ /** Will the dragging element accept propagated events? default is yes, a propagated
73
+ * mouse event on a inner element will be accepted and processed. If set to false,
74
+ * only events originated on the draggable elements will be processed. */
75
+ acceptPropagatedEvent: true,
76
+
77
+ /**
78
+ * Prevents the event to propagate further effectively disabling other default actions
79
+ */
80
+ preventDefault: true,
81
+
82
+ dragstart: 'mousedown touchstart',
83
+ dragcontinue: 'mousemove touchmove',
84
+ dragend: 'mouseup touchend', // mouseleave
85
+ dragMinDistance: 5,
86
+ namespace: '.ds',
87
+
88
+ /** Scroll the window rather than the element */
89
+ scrollWindow: false,
90
+ };
91
+
92
+ /**
93
+ * Adds the ability to manage elements scroll by dragging
94
+ * one or more of its descendant elements. Options parameter
95
+ * allow to specifically select which inner elements will
96
+ * respond to the drag events.
97
+ * usage examples:
98
+ *
99
+ * To add the scroll by drag to the element id=viewport when dragging its
100
+ * first child accepting any propagated events
101
+ * `new DragScrollable($('#viewport')[0]);`
102
+ *
103
+ * To add the scroll by drag ability to any element div of class viewport
104
+ * when dragging its first descendant of class dragMe responding only to
105
+ * evcents originated on the '.dragMe' elements.
106
+ * ```js
107
+ * new DragScrollable($('div.viewport')[0], {
108
+ * dragSelector: '.dragMe:first',
109
+ * acceptPropagatedEvent: false
110
+ * });
111
+ * ```
112
+ *
113
+ * Notice that some 'viewports' could be nested within others but events
114
+ * would not interfere as acceptPropagatedEvent is set to false.
115
+ */
116
+ export class DragScrollable {
117
+ /**
118
+ * @param {HTMLElement} element
119
+ * @param {Partial<DEFAULT_OPTIONS>} options
120
+ */
121
+ constructor(element, options = {}) {
122
+ this.handling_element = $(element);
123
+ /** @type {typeof DEFAULT_OPTIONS} */
124
+ this.settings = $.extend({}, DEFAULT_OPTIONS, options || {});
125
+ this.firstCoord = { left: 0, top: 0 };
126
+ this.lastCoord = { left: 0, top: 0 };
127
+
128
+ this.settings.dragstart = append_namespace(this.settings.dragstart, this.settings.namespace);
129
+ this.settings.dragcontinue = append_namespace(this.settings.dragcontinue, this.settings.namespace);
130
+ //settings.dragend = append_namespace(settings.dragend, settings.namespace);
131
+
132
+ // Set mouse initiating event on the desired descendant
133
+ this.handling_element.find(this.settings.dragSelector)
134
+ .on(this.settings.dragstart, this._dragStartHandler);
135
+ }
136
+
137
+ _shouldAbort() {
138
+ const isTouchDevice = !!('ontouchstart' in window) || !!('msmaxtouchpoints' in window.navigator);
139
+ return isTouchDevice;
140
+ }
141
+
142
+ /** @param {MouseEvent} event */
143
+ _dragStartHandler = (event) => {
144
+ if (this._shouldAbort()) { return true; }
145
+
146
+ // mousedown, left click, check propagation
147
+ if (event.which > 1 ||
148
+ (!this.settings.acceptPropagatedEvent && event.target != this.handling_element[0])) {
149
+ return false;
150
+ }
151
+
152
+ // Initial coordinates will be the last when dragging
153
+ this.lastCoord = this.firstCoord = left_top(event);
154
+
155
+ this.handling_element
156
+ .on(this.settings.dragcontinue, this._dragContinueHandler)
157
+ //.on(this.settings.dragend, this._dragEndHandler)
158
+ ;
159
+
160
+ // Note, we bind using addEventListener so we can use "capture" binding
161
+ // instead of "bubble" binding
162
+ this.settings.dragend.split(' ').forEach(event_name => {
163
+ this.handling_element[0].addEventListener(event_name, this._dragEndHandler, true);
164
+ });
165
+
166
+ if (this.settings.preventDefault) {
167
+ event.preventDefault();
168
+ return false;
169
+ }
170
+ }
171
+
172
+ /** @param {MouseEvent} event */
173
+ _dragContinueHandler = (event) => { // User is dragging
174
+ // console.log('drag continue');
175
+ if (this._shouldAbort()) { return true; }
176
+
177
+ const lt = left_top(event);
178
+
179
+ // How much did the mouse move?
180
+ const delta = {
181
+ left: (lt.left - this.lastCoord.left),
182
+ top: (lt.top - this.lastCoord.top)
183
+ };
184
+
185
+ const scrollTarget = this.settings.scrollWindow ? $(window) : this.handling_element;
186
+
187
+ // Set the scroll position relative to what ever the scroll is now
188
+ scrollTarget.scrollLeft( scrollTarget.scrollLeft() - delta.left );
189
+ scrollTarget.scrollTop( scrollTarget.scrollTop() - delta.top );
190
+
191
+ // Save where the cursor is
192
+ this.lastCoord = lt;
193
+
194
+ if (this.settings.preventDefault) {
195
+ event.preventDefault();
196
+ return false;
197
+ }
198
+ }
199
+
200
+ /** @param {MouseEvent} event */
201
+ _dragEndHandler = (event) => { // Stop scrolling
202
+ //console.log('dragEndHandler');
203
+
204
+ if (this._shouldAbort()) { return true; }
205
+
206
+ this.handling_element
207
+ .off(this.settings.dragcontinue)
208
+ // Note, for some reason, even though I removeEventListener below,
209
+ // this call to unbind is still necessary. I don't know why.
210
+ .off(this.settings.dragend);
211
+
212
+ // Note, we bind using addEventListener so we can use "capture" binding
213
+ // instead of "bubble" binding
214
+ this.settings.dragend.split(' ').forEach(event_name => {
215
+ this.handling_element[0].removeEventListener(event_name, this._dragEndHandler, true);
216
+ });
217
+
218
+ // How much did the mouse move total?
219
+ const delta = {
220
+ left: Math.abs(this.lastCoord.left - this.firstCoord.left),
221
+ top: Math.abs(this.lastCoord.top - this.firstCoord.top)
222
+ };
223
+ const distance = Math.max(delta.left, delta.top);
224
+
225
+ // Allow event to propagate if min distance was not achieved
226
+ if (this.settings.preventDefault && distance > this.settings.dragMinDistance) {
227
+ event.preventDefault();
228
+ event.stopImmediatePropagation();
229
+ event.stopPropagation();
230
+ return false;
231
+ }
232
+ }
233
+ }