@internetarchive/bookreader 5.0.0-11-multiple-files → 5.0.0-110
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.
- package/BookReader/474.js +2 -0
- package/BookReader/474.js.map +1 -0
- package/BookReader/BookReader.css +616 -1467
- package/BookReader/BookReader.js +2 -21564
- package/BookReader/BookReader.js.LICENSE.txt +20 -20
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/bergamot-translator-worker.js +2966 -0
- package/BookReader/bergamot-translator-worker.wasm +0 -0
- package/BookReader/hypothesis/LICENSE +50 -0
- package/BookReader/hypothesis/README.md +55 -0
- package/BookReader/hypothesis/build/boot.js +1 -0
- package/BookReader/hypothesis/build/manifest.json +20 -0
- package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
- package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
- package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/highlights.css +2 -0
- package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
- package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
- package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
- package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
- package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
- package/BookReader/hypothesis/package.json +126 -0
- package/BookReader/ia-bookreader-bundle.js +1907 -0
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +19 -0
- package/BookReader/ia-bookreader-bundle.js.map +1 -0
- package/BookReader/icons/1up.svg +1 -12
- package/BookReader/icons/2up.svg +1 -15
- package/BookReader/icons/advance.svg +3 -26
- package/BookReader/icons/chevron-right.svg +1 -1
- package/BookReader/icons/close-circle-dark.svg +1 -0
- package/BookReader/icons/close-circle.svg +1 -1
- package/BookReader/icons/fullscreen.svg +1 -17
- package/BookReader/icons/fullscreen_exit.svg +1 -17
- package/BookReader/icons/hamburger.svg +1 -15
- package/BookReader/icons/left-arrow.svg +1 -12
- package/BookReader/icons/magnify-minus.svg +1 -16
- package/BookReader/icons/magnify-plus.svg +1 -17
- package/BookReader/icons/magnify.svg +1 -15
- package/BookReader/icons/pause.svg +1 -23
- package/BookReader/icons/play.svg +1 -22
- package/BookReader/icons/playback-speed.svg +1 -34
- package/BookReader/icons/read-aloud.svg +1 -22
- package/BookReader/icons/review.svg +3 -22
- package/BookReader/icons/slider-toggle.svg +1 -0
- package/BookReader/icons/thumbnails.svg +1 -17
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/icons/volume-full.svg +1 -22
- package/BookReader/images/BRicons.svg +5 -94
- package/BookReader/images/books_graphic.svg +1 -177
- package/BookReader/images/hypothesis.ico +0 -0
- package/BookReader/images/icon_book.svg +1 -12
- package/BookReader/images/icon_bookmark.svg +1 -12
- package/BookReader/images/icon_experiment.svg +1 -0
- package/BookReader/images/icon_gear.svg +1 -14
- package/BookReader/images/icon_hamburger.svg +1 -20
- package/BookReader/images/icon_home.svg +1 -21
- package/BookReader/images/icon_info.svg +1 -11
- package/BookReader/images/icon_one_page.svg +1 -8
- package/BookReader/images/icon_pause.svg +1 -1
- package/BookReader/images/icon_play.svg +1 -1
- package/BookReader/images/icon_playback-rate.svg +1 -15
- package/BookReader/images/icon_search_button.svg +1 -8
- package/BookReader/images/icon_share.svg +1 -9
- package/BookReader/images/icon_skip-ahead.svg +1 -6
- package/BookReader/images/icon_skip-back.svg +2 -13
- package/BookReader/images/icon_speaker.svg +1 -18
- package/BookReader/images/icon_speaker_open.svg +1 -10
- package/BookReader/images/icon_thumbnails.svg +1 -12
- package/BookReader/images/icon_toc.svg +1 -5
- package/BookReader/images/icon_two_pages.svg +1 -9
- package/BookReader/images/marker_chap-off.svg +1 -11
- package/BookReader/images/marker_chap-on.svg +1 -11
- package/BookReader/images/marker_srch-on.svg +1 -11
- package/BookReader/images/translate.svg +1 -0
- package/BookReader/images/unviewable_page.png +0 -0
- package/BookReader/jquery-3.js +2 -0
- package/BookReader/jquery-3.js.LICENSE.txt +24 -0
- package/BookReader/plugins/plugin.archive_analytics.js +1 -172
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -165
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +19 -301
- package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.experiments.js +3 -0
- package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.experiments.js.map +1 -0
- package/BookReader/plugins/plugin.iframe.js +1 -74
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.iiif.js +2 -0
- package/BookReader/plugins/plugin.iiif.js.map +1 -0
- package/BookReader/plugins/plugin.resume.js +1 -368
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +2 -1420
- package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +2 -1080
- package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.translate.js +137 -0
- package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.translate.js.map +1 -0
- package/BookReader/plugins/plugin.tts.js +2 -9193
- package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +1 -269
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
- package/BookReader/plugins/translator-worker.js +2 -0
- package/BookReader/plugins/translator-worker.js.map +1 -0
- package/BookReader/silence.mp3 +0 -0
- package/BookReader/translator-worker.js +475 -0
- package/BookReader/webcomponents-bundle.js +3 -0
- package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
- package/BookReader/webcomponents-bundle.js.map +1 -0
- package/README.md +14 -3
- package/jsconfig.json +19 -0
- package/package.json +92 -70
- package/src/BookReader/BookModel.js +92 -46
- package/src/BookReader/DragScrollable.js +233 -0
- package/src/BookReader/ImageCache.js +49 -16
- package/src/BookReader/Mode1Up.js +66 -356
- package/src/BookReader/Mode1UpLit.js +392 -0
- package/src/BookReader/Mode2Up.js +87 -1315
- package/src/BookReader/Mode2UpLit.js +788 -0
- package/src/BookReader/ModeAbstract.js +43 -0
- package/src/BookReader/ModeCoordinateSpace.js +29 -0
- package/src/BookReader/ModeSmoothZoom.js +312 -0
- package/src/BookReader/ModeThumb.js +30 -16
- package/src/BookReader/Navbar/Navbar.js +201 -76
- package/src/BookReader/PageContainer.js +120 -23
- package/src/BookReader/ReduceSet.js +3 -3
- package/src/BookReader/Toolbar/Toolbar.js +19 -41
- package/src/BookReader/events.js +3 -3
- package/src/BookReader/options.js +94 -17
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils/SelectionObserver.js +45 -0
- package/src/BookReader/utils/classes.js +1 -1
- package/src/BookReader/utils.js +141 -13
- package/src/BookReader.js +711 -1241
- package/src/BookReaderPlugin.js +52 -0
- package/src/assets/icons/close-circle-dark.svg +1 -0
- package/src/assets/icons/magnify-minus.svg +3 -7
- package/src/assets/icons/magnify-plus.svg +3 -7
- package/src/assets/icons/slider-toggle.svg +1 -0
- package/src/assets/icons/voice.svg +1 -0
- package/src/assets/images/hypothesis.ico +0 -0
- package/src/assets/images/icon_experiment.svg +1 -0
- package/src/assets/images/translate.svg +1 -0
- package/src/assets/images/unviewable_page.png +0 -0
- package/src/assets/silence.mp3 +0 -0
- package/src/css/BookReader.scss +1 -17
- package/src/css/_BRBookmarks.scss +1 -1
- package/src/css/_BRComponent.scss +1 -1
- package/src/css/_BRicon.scss +8 -2
- package/src/css/_BRmain.scss +33 -27
- package/src/css/_BRnav.scss +74 -70
- package/src/css/_BRpages.scss +171 -42
- package/src/css/_BRsearch.scss +69 -235
- package/src/css/_BRtoolbar.scss +5 -5
- package/src/css/_TextSelection.scss +129 -24
- package/src/css/_colorbox.scss +2 -2
- package/src/css/_controls.scss +24 -7
- package/src/css/_icons.scss +14 -1
- package/src/{BookNavigator/assets → css}/button-base.js +10 -3
- package/src/css/icon_checkmark.js +9 -0
- package/src/css/sharedStyles.js +15 -0
- package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
- package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +29 -25
- package/src/ia-bookreader/ia-bookreader.js +666 -0
- package/src/ia-bookreader/sharing.js +27 -0
- package/src/ia-bookreader/viewable-files.js +98 -0
- package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
- package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
- package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
- package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
- package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +44 -32
- package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
- package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +5 -10
- package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
- package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
- package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
- package/src/plugins/plugin.archive_analytics.js +84 -78
- package/src/plugins/plugin.autoplay.js +99 -104
- package/src/plugins/plugin.chapters.js +310 -201
- package/src/plugins/plugin.experiments.js +321 -0
- package/src/plugins/plugin.iframe.js +1 -1
- package/src/plugins/plugin.iiif.js +141 -0
- package/src/plugins/plugin.resume.js +53 -50
- package/src/plugins/plugin.text_selection.js +522 -219
- package/src/plugins/plugin.vendor-fullscreen.js +7 -7
- package/src/plugins/search/plugin.search.js +380 -360
- package/src/{BookNavigator → plugins}/search/search-provider.js +94 -32
- package/src/{BookNavigator → plugins}/search/search-results.js +108 -90
- package/src/plugins/search/utils.js +50 -0
- package/src/plugins/search/view.js +79 -210
- package/src/plugins/translate/TranslationManager.js +164 -0
- package/src/plugins/translate/plugin.translate.js +512 -0
- package/src/plugins/tts/AbstractTTSEngine.js +78 -49
- package/src/plugins/tts/FestivalTTSEngine.js +21 -31
- package/src/plugins/tts/PageChunk.js +33 -21
- package/src/plugins/tts/PageChunkIterator.js +11 -17
- package/src/plugins/tts/WebTTSEngine.js +131 -91
- package/src/plugins/tts/plugin.tts.js +345 -350
- package/src/plugins/tts/utils.js +77 -49
- package/src/plugins/url/UrlPlugin.js +191 -0
- package/src/plugins/{plugin.url.js → url/plugin.url.js} +47 -18
- package/src/util/TextSelectionManager.js +282 -0
- package/src/util/browserSniffing.js +33 -1
- package/src/util/cache.js +20 -0
- package/src/util/docCookies.js +21 -2
- package/src/util/lit.js +15 -0
- package/src/util/strings.js +1 -0
- package/.babelrc +0 -12
- package/.dependabot/config.yml +0 -6
- package/.eslintrc.js +0 -49
- package/.gitattributes +0 -2
- package/.github/ISSUE_TEMPLATE/bug.md +0 -32
- package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
- package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
- package/.github/workflows/node.js.yml +0 -28
- package/.github/workflows/npm-publish.yml +0 -47
- package/.testcaferc.json +0 -5
- package/BookReader/bookreader-component-bundle.js +0 -14330
- package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
- package/BookReader/bookreader-component-bundle.js.map +0 -1
- package/BookReader/icons/sort-ascending.svg +0 -1
- package/BookReader/icons/sort-descending.svg +0 -1
- package/BookReader/jquery-1.10.1.js +0 -108
- package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.menu_toggle.js +0 -369
- package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
- package/BookReader/plugins/plugin.mobile_nav.js +0 -335
- package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
- package/BookReaderDemo/BookReaderDemo.css +0 -41
- package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
- package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
- package/BookReaderDemo/BookReaderJSSimple.js +0 -55
- package/BookReaderDemo/IIIFBookReader.js +0 -207
- package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
- package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
- package/BookReaderDemo/demo-advanced.html +0 -33
- package/BookReaderDemo/demo-autoplay.html +0 -38
- package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
- package/BookReaderDemo/demo-embed.html +0 -26
- package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
- package/BookReaderDemo/demo-fullscreen.html +0 -33
- package/BookReaderDemo/demo-iiif.html +0 -34
- package/BookReaderDemo/demo-iiif.js +0 -26
- package/BookReaderDemo/demo-internetarchive.html +0 -74
- package/BookReaderDemo/demo-multiple.html +0 -43
- package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
- package/BookReaderDemo/demo-preview-pages.html +0 -1092
- package/BookReaderDemo/demo-simple.html +0 -34
- package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
- package/BookReaderDemo/immersion-1up.html +0 -64
- package/BookReaderDemo/immersion-mode.html +0 -35
- package/BookReaderDemo/toggle_controls.html +0 -53
- package/BookReaderDemo/view_mode.html +0 -39
- package/BookReaderDemo/viewmode-cycle.html +0 -41
- package/CHANGELOG.md +0 -476
- package/CONTRIBUTING.md +0 -7
- package/codecov.yml +0 -17
- package/index.html +0 -31
- package/karma.conf.js +0 -23
- package/screenshot.png +0 -0
- package/scripts/postversion.js +0 -10
- package/scripts/preversion.js +0 -14
- package/scripts/version.js +0 -26
- package/src/BookNavigator/BookModel.js +0 -14
- package/src/BookNavigator/BookNavigator.js +0 -451
- package/src/BookNavigator/assets/book-loader.js +0 -27
- package/src/BookNavigator/assets/icon_checkmark.js +0 -6
- package/src/BookNavigator/assets/icon_close.js +0 -3
- package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
- package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
- package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
- package/src/BookNavigator/downloads/downloads-provider.js +0 -66
- package/src/BookNavigator/search/a-search-result.js +0 -55
- package/src/BookNavigator/volumes/volumes-provider.js +0 -75
- package/src/BookNavigator/volumes/volumes.js +0 -161
- package/src/BookReader/DebugConsole.js +0 -54
- package/src/BookReaderComponent/BookReaderComponent.js +0 -112
- package/src/ItemNavigator/ItemNavigator.js +0 -372
- package/src/ItemNavigator/providers/sharing.js +0 -29
- package/src/assets/icons/sort-ascending.svg +0 -1
- package/src/assets/icons/sort-descending.svg +0 -1
- package/src/css/_MobileNav.scss +0 -194
- package/src/dragscrollable-br.js +0 -261
- package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
- package/src/plugins/plugin.mobile_nav.js +0 -287
- package/tests/BookReader/BookModel.test.js +0 -312
- package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
- package/tests/BookReader/DebugConsole.test.js +0 -25
- package/tests/BookReader/ImageCache.test.js +0 -150
- package/tests/BookReader/Mode1Up.test.js +0 -164
- package/tests/BookReader/Mode2Up.test.js +0 -247
- package/tests/BookReader/Navbar/Navbar.test.js +0 -169
- package/tests/BookReader/PageContainer.test.js +0 -115
- package/tests/BookReader/ReduceSet.test.js +0 -38
- package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
- package/tests/BookReader/utils/classes.test.js +0 -88
- package/tests/BookReader/utils.test.js +0 -109
- package/tests/BookReader.options.test.js +0 -39
- package/tests/BookReader.test.js +0 -301
- package/tests/e2e/README.md +0 -75
- package/tests/e2e/autoplay.test.js +0 -13
- package/tests/e2e/base.test.js +0 -35
- package/tests/e2e/helpers/base.js +0 -258
- package/tests/e2e/helpers/debug.js +0 -13
- package/tests/e2e/helpers/desktopSearch.js +0 -72
- package/tests/e2e/helpers/mobileSearch.js +0 -85
- package/tests/e2e/helpers/mockSearch.js +0 -93
- package/tests/e2e/helpers/rightToLeft.js +0 -29
- package/tests/e2e/ia-production/ia-prod-base.js +0 -17
- package/tests/e2e/models/BookReader.js +0 -11
- package/tests/e2e/models/Navigation.js +0 -56
- package/tests/e2e/rightToLeft.test.js +0 -20
- package/tests/e2e/viewmode.test.js +0 -37
- package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
- package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
- package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
- package/tests/karma/BookNavigator/search-results.test.js +0 -240
- package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
- package/tests/karma/BookNavigator/volumes.test.js +0 -133
- package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
- package/tests/plugins/plugin.archive_analytics.test.js +0 -23
- package/tests/plugins/plugin.autoplay.test.js +0 -52
- package/tests/plugins/plugin.chapters.test.js +0 -130
- package/tests/plugins/plugin.iframe.test.js +0 -42
- package/tests/plugins/plugin.mobile_nav.test.js +0 -66
- package/tests/plugins/plugin.resume.test.js +0 -98
- package/tests/plugins/plugin.text_selection.test.js +0 -203
- package/tests/plugins/plugin.url.test.js +0 -129
- package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
- package/tests/plugins/search/plugin.search.test.js +0 -166
- package/tests/plugins/search/plugin.search.view.test.js +0 -106
- package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
- package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
- package/tests/plugins/tts/PageChunk.test.js +0 -57
- package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
- package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
- package/tests/plugins/tts/utils.test.js +0 -133
- package/tests/util/browserSniffing.test.js +0 -56
- package/tests/util/docCookies.test.js +0 -15
- package/tests/util/strings.test.js +0 -63
- package/tests/utils.js +0 -42
- 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)
|
|
57
|
-
)
|
|
56
|
+
.html(br.bookUrlText || br.bookTitle),
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
package/src/BookReader/events.js
CHANGED
|
@@ -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
|
-
//
|
|
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,3 +1,4 @@
|
|
|
1
|
+
// @ts-check
|
|
1
2
|
/** @typedef {import('./BookModel.js').PageNumString} PageNumString */
|
|
2
3
|
/** @typedef {import('./BookModel.js').LeafNum} LeafNum */
|
|
3
4
|
|
|
@@ -25,9 +26,13 @@ export const DEFAULT_OPTIONS = {
|
|
|
25
26
|
thumbMaxLoading: 4,
|
|
26
27
|
/** spacing between thumbnails */
|
|
27
28
|
thumbPadding: 10,
|
|
29
|
+
/** min zoom in columns */
|
|
30
|
+
thumbMinZoomColumns: 2,
|
|
31
|
+
/** max zoom out columns */
|
|
32
|
+
thumbMaxZoomColumns: 8,
|
|
28
33
|
|
|
29
34
|
/** @type {number | 'fast' | 'slow'} speed for flip animation */
|
|
30
|
-
flipSpeed:
|
|
35
|
+
flipSpeed: 400,
|
|
31
36
|
|
|
32
37
|
showToolbar: true,
|
|
33
38
|
showNavbar: true,
|
|
@@ -61,7 +66,7 @@ export const DEFAULT_OPTIONS = {
|
|
|
61
66
|
{reduce: 2, autofit: null},
|
|
62
67
|
{reduce: 3, autofit: null},
|
|
63
68
|
{reduce: 4, autofit: null},
|
|
64
|
-
{reduce: 6, autofit: null}
|
|
69
|
+
{reduce: 6, autofit: null},
|
|
65
70
|
],
|
|
66
71
|
|
|
67
72
|
/** Object to hold parameters related to 1up mode */
|
|
@@ -79,7 +84,7 @@ export const DEFAULT_OPTIONS = {
|
|
|
79
84
|
/** Width of book spine $$$ consider sizing based on book length */
|
|
80
85
|
bookSpineDivWidth: 64,
|
|
81
86
|
/** @type {AutoFitValues} */
|
|
82
|
-
autofit: 'auto'
|
|
87
|
+
autofit: 'auto',
|
|
83
88
|
},
|
|
84
89
|
|
|
85
90
|
onePageMinBreakpoint: 800,
|
|
@@ -92,6 +97,11 @@ export const DEFAULT_OPTIONS = {
|
|
|
92
97
|
/** @type {string} */
|
|
93
98
|
bookUrlTitle: null,
|
|
94
99
|
enableBookTitleLink: true,
|
|
100
|
+
/**
|
|
101
|
+
* @type {string} A globally unique URI for the book. This is used to
|
|
102
|
+
* save data like annotations the user makes to the book.
|
|
103
|
+
*/
|
|
104
|
+
bookUri: null,
|
|
95
105
|
/**
|
|
96
106
|
* @type {string} language in ISO 639-1 (PRIVATE: Will also
|
|
97
107
|
* handle language name in English, native name, 639-2/T, or 639-2/B . (archive.org books
|
|
@@ -136,8 +146,26 @@ export const DEFAULT_OPTIONS = {
|
|
|
136
146
|
* but going forward we'll keep them here.
|
|
137
147
|
**/
|
|
138
148
|
plugins: {
|
|
139
|
-
/** @type {import('../plugins/plugin.
|
|
140
|
-
|
|
149
|
+
/** @type {Partial<import('../plugins/plugin.archive_analytics.js').ArchiveAnalyticsPlugin['options'>]}*/
|
|
150
|
+
archiveAnalytics: {},
|
|
151
|
+
/** @type {Partial<import('../plugins/plugin.autoplay.js').AutoplayPlugin['options'>]}*/
|
|
152
|
+
autoplay: {},
|
|
153
|
+
/** @type {Partial<import('../plugins/plugin.chapters.js').ChaptersPlugin['options']>} */
|
|
154
|
+
chapters: {},
|
|
155
|
+
/** @type {Partial<import('../plugins/plugin.experiments.js').ExperimentsPlugin['options']>} */
|
|
156
|
+
experiments: {},
|
|
157
|
+
/** @type {Partial<import('../plugins/plugin.iiif.js').IiifPlugin['options']>} */
|
|
158
|
+
iiif: {},
|
|
159
|
+
/** @type {Partial<import('../plugins/plugin.resume.js').ResumePlugin['options']>} */
|
|
160
|
+
resume: {},
|
|
161
|
+
/** @type {Partial<import('../plugins/search/plugin.search.js').SearchPlugin['options']>} */
|
|
162
|
+
search: {},
|
|
163
|
+
/** @type {Partial<import('../plugins/plugin.text_selection.js').TextSelectionPlugin['options']>} */
|
|
164
|
+
textSelection: {},
|
|
165
|
+
/** @type {Partial<import('../plugins/translate/plugin.translate.js').TranslatePlugin['options']>} */
|
|
166
|
+
translate: {},
|
|
167
|
+
/** @type {Partial<import('../plugins/tts/plugin.tts.js').TtsPlugin['options']>} */
|
|
168
|
+
tts: {},
|
|
141
169
|
},
|
|
142
170
|
|
|
143
171
|
/**
|
|
@@ -176,16 +204,32 @@ export const DEFAULT_OPTIONS = {
|
|
|
176
204
|
*/
|
|
177
205
|
data: [],
|
|
178
206
|
|
|
179
|
-
/**
|
|
207
|
+
/** @type {import('../plugins/plugin.chapters.js').TocEntry[]} */
|
|
208
|
+
table_of_contents: null,
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Advanced methods for page rendering.
|
|
212
|
+
* All option functions have their `this` object set to the BookReader instance.
|
|
213
|
+
**/
|
|
214
|
+
|
|
180
215
|
/** @type {() => number} */
|
|
181
216
|
getNumLeafs: null,
|
|
182
217
|
/** @type {(index: number) => number} */
|
|
183
218
|
getPageWidth: null,
|
|
184
219
|
/** @type {(index: number) => number} */
|
|
185
220
|
getPageHeight: null,
|
|
186
|
-
/** @type {(index: number, reduce: number, rotate: number) =>
|
|
221
|
+
/** @type {(index: number, reduce: number, rotate: number) => string} */
|
|
187
222
|
getPageURI: null,
|
|
188
223
|
|
|
224
|
+
/**
|
|
225
|
+
* @type {(img: HTMLImageElement, uri: string) => Promise<void>}
|
|
226
|
+
* Render the page URI into the image element. Perform any necessary preloading,
|
|
227
|
+
* authentication, etc.
|
|
228
|
+
*/
|
|
229
|
+
renderPageURI(img, uri) {
|
|
230
|
+
img.src = uri;
|
|
231
|
+
},
|
|
232
|
+
|
|
189
233
|
/**
|
|
190
234
|
* @type {(index: number) => 'L' | 'R'}
|
|
191
235
|
* Return which side, left or right, that a given page should be displayed on
|
|
@@ -214,35 +258,41 @@ export const DEFAULT_OPTIONS = {
|
|
|
214
258
|
getEmbedCode: null,
|
|
215
259
|
|
|
216
260
|
controls: {
|
|
261
|
+
toggleSlider: {
|
|
262
|
+
visible: true,
|
|
263
|
+
label: 'Toggle page controls',
|
|
264
|
+
className: 'toggle_slider',
|
|
265
|
+
iconClassName: 'toggle-slider',
|
|
266
|
+
},
|
|
217
267
|
bookLeft: {
|
|
218
268
|
visible: true,
|
|
219
269
|
label: 'Flip left',
|
|
220
270
|
className: 'book_left',
|
|
221
|
-
iconClassName: 'left-arrow'
|
|
271
|
+
iconClassName: 'left-arrow',
|
|
222
272
|
},
|
|
223
273
|
bookRight: {
|
|
224
274
|
visible: true,
|
|
225
275
|
label: 'Flip right',
|
|
226
276
|
className: 'book_right',
|
|
227
|
-
iconClassName: 'left-arrow hflip'
|
|
277
|
+
iconClassName: 'left-arrow hflip',
|
|
228
278
|
},
|
|
229
279
|
onePage: {
|
|
230
280
|
visible: true,
|
|
231
281
|
label: 'One-page view',
|
|
232
282
|
className: 'onepg',
|
|
233
|
-
iconClassName: 'onepg'
|
|
283
|
+
iconClassName: 'onepg',
|
|
234
284
|
},
|
|
235
285
|
twoPage: {
|
|
236
286
|
visible: true,
|
|
237
287
|
label: 'Two-page view',
|
|
238
288
|
className: 'twopg',
|
|
239
|
-
iconClassName: 'twopg'
|
|
289
|
+
iconClassName: 'twopg',
|
|
240
290
|
},
|
|
241
291
|
thumbnail: {
|
|
242
292
|
visible: true,
|
|
243
293
|
label: 'Thumbnail view',
|
|
244
294
|
className: 'thumb',
|
|
245
|
-
iconClassName: 'thumb'
|
|
295
|
+
iconClassName: 'thumb',
|
|
246
296
|
},
|
|
247
297
|
viewmode: {
|
|
248
298
|
visible: true,
|
|
@@ -253,19 +303,19 @@ export const DEFAULT_OPTIONS = {
|
|
|
253
303
|
visible: true,
|
|
254
304
|
label: 'Zoom out',
|
|
255
305
|
className: 'zoom_out',
|
|
256
|
-
iconClassName: 'magnify'
|
|
306
|
+
iconClassName: 'magnify',
|
|
257
307
|
},
|
|
258
308
|
zoomIn: {
|
|
259
309
|
visible: true,
|
|
260
310
|
label: 'Zoom in',
|
|
261
311
|
className: 'zoom_in',
|
|
262
|
-
iconClassName: 'magnify plus'
|
|
312
|
+
iconClassName: 'magnify plus',
|
|
263
313
|
},
|
|
264
314
|
fullScreen: {
|
|
265
315
|
visible: true,
|
|
266
|
-
label: '
|
|
316
|
+
label: 'Go fullscreen',
|
|
267
317
|
className: 'full',
|
|
268
|
-
iconClassName: 'fullscreen'
|
|
318
|
+
iconClassName: 'fullscreen',
|
|
269
319
|
},
|
|
270
320
|
},
|
|
271
321
|
|
|
@@ -275,6 +325,12 @@ export const DEFAULT_OPTIONS = {
|
|
|
275
325
|
*/
|
|
276
326
|
startFullscreen: false,
|
|
277
327
|
|
|
328
|
+
/**
|
|
329
|
+
* @type {Boolean}
|
|
330
|
+
* will show logo at fullscreen mode
|
|
331
|
+
*/
|
|
332
|
+
enableFSLogoShortcut: false,
|
|
333
|
+
|
|
278
334
|
/**
|
|
279
335
|
* @type {Boolean}
|
|
280
336
|
* On init, by default, we want to handle resizing bookreader
|
|
@@ -288,9 +344,24 @@ export const DEFAULT_OPTIONS = {
|
|
|
288
344
|
* On init, by default, we want to use srcSet for images
|
|
289
345
|
*/
|
|
290
346
|
useSrcSet: false,
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* @type {string}
|
|
350
|
+
* Path to the image to display when a page is unviewable (i.e. when
|
|
351
|
+
* displaying a preview of a book).
|
|
352
|
+
*
|
|
353
|
+
* Relative to the imagesBaseURL if a relative path is specified.
|
|
354
|
+
*/
|
|
355
|
+
unviewablePageURI: './unviewable_page.png',
|
|
291
356
|
};
|
|
292
357
|
|
|
293
|
-
/**
|
|
358
|
+
/**
|
|
359
|
+
* @typedef {'width' | 'height' | 'auto' | 'none'} AutoFitValues
|
|
360
|
+
* - width: fill the width of the container
|
|
361
|
+
* - height: fill the height of the container
|
|
362
|
+
* - auto: fill the width or height of the container, whichever is smaller
|
|
363
|
+
* - none: do not autofit
|
|
364
|
+
**/
|
|
294
365
|
|
|
295
366
|
/**
|
|
296
367
|
* @typedef {object} ReductionFactor
|
|
@@ -318,3 +389,9 @@ export const DEFAULT_OPTIONS = {
|
|
|
318
389
|
|
|
319
390
|
/** @typedef {typeof DEFAULT_OPTIONS} BookReaderOptions */
|
|
320
391
|
|
|
392
|
+
/**
|
|
393
|
+
* Thrown when an error occurs while parsing options.
|
|
394
|
+
* Potentially recoverable and non-halting.
|
|
395
|
+
*/
|
|
396
|
+
export class OptionsParseError extends Error {
|
|
397
|
+
}
|
|
@@ -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,45 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
export class SelectionObserver {
|
|
3
|
+
selecting = false;
|
|
4
|
+
startedInSelector = false;
|
|
5
|
+
/** @type {HTMLElement} */
|
|
6
|
+
target = null;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @param {string} selector
|
|
10
|
+
* @param {function('started' | 'cleared', HTMLElement): any} handler
|
|
11
|
+
*/
|
|
12
|
+
constructor(selector, handler) {
|
|
13
|
+
this.selector = selector;
|
|
14
|
+
this.handler = handler;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
attach() {
|
|
18
|
+
// We can't just use selectstart, because safari on iOS just
|
|
19
|
+
// randomly decides when to fire it 😤
|
|
20
|
+
// document.addEventListener("selectstart", this._onSelectStart);
|
|
21
|
+
// This has to be on document :/
|
|
22
|
+
document.addEventListener("selectionchange", this._onSelectionChange);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
detach() {
|
|
26
|
+
document.removeEventListener("selectionchange", this._onSelectionChange);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
_onSelectionChange = () => {
|
|
30
|
+
const sel = window.getSelection();
|
|
31
|
+
|
|
32
|
+
if (!this.selecting && sel.toString()) {
|
|
33
|
+
const target = $(sel.anchorNode).closest(this.selector)[0];
|
|
34
|
+
if (!target) return;
|
|
35
|
+
this.target = target;
|
|
36
|
+
this.selecting = true;
|
|
37
|
+
this.handler('started', this.target);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (this.selecting && (sel.isCollapsed || !sel.toString() || !$(sel.anchorNode).closest(this.selector)[0])) {
|
|
41
|
+
this.selecting = false;
|
|
42
|
+
this.handler('cleared', this.target);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|