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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/.eslintrc.js +21 -19
  2. package/.github/workflows/node.js.yml +81 -7
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +505 -1442
  6. package/BookReader/BookReader.js +2 -21564
  7. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1782 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/1up.svg +1 -12
  13. package/BookReader/icons/2up.svg +1 -15
  14. package/BookReader/icons/advance.svg +3 -26
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -0
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -17
  19. package/BookReader/icons/fullscreen_exit.svg +1 -17
  20. package/BookReader/icons/hamburger.svg +1 -15
  21. package/BookReader/icons/left-arrow.svg +1 -12
  22. package/BookReader/icons/magnify-minus.svg +1 -16
  23. package/BookReader/icons/magnify-plus.svg +1 -17
  24. package/BookReader/icons/magnify.svg +1 -15
  25. package/BookReader/icons/pause.svg +1 -23
  26. package/BookReader/icons/play.svg +1 -22
  27. package/BookReader/icons/playback-speed.svg +1 -34
  28. package/BookReader/icons/read-aloud.svg +1 -22
  29. package/BookReader/icons/review.svg +3 -22
  30. package/BookReader/icons/thumbnails.svg +1 -17
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -22
  33. package/BookReader/images/BRicons.svg +5 -94
  34. package/BookReader/images/books_graphic.svg +1 -177
  35. package/BookReader/images/icon_book.svg +1 -12
  36. package/BookReader/images/icon_bookmark.svg +1 -12
  37. package/BookReader/images/icon_gear.svg +1 -14
  38. package/BookReader/images/icon_hamburger.svg +1 -20
  39. package/BookReader/images/icon_home.svg +1 -21
  40. package/BookReader/images/icon_info.svg +1 -11
  41. package/BookReader/images/icon_one_page.svg +1 -8
  42. package/BookReader/images/icon_pause.svg +1 -1
  43. package/BookReader/images/icon_play.svg +1 -1
  44. package/BookReader/images/icon_playback-rate.svg +1 -15
  45. package/BookReader/images/icon_search_button.svg +1 -8
  46. package/BookReader/images/icon_share.svg +1 -9
  47. package/BookReader/images/icon_skip-ahead.svg +1 -6
  48. package/BookReader/images/icon_skip-back.svg +2 -13
  49. package/BookReader/images/icon_speaker.svg +1 -18
  50. package/BookReader/images/icon_speaker_open.svg +1 -10
  51. package/BookReader/images/icon_thumbnails.svg +1 -12
  52. package/BookReader/images/icon_toc.svg +1 -5
  53. package/BookReader/images/icon_two_pages.svg +1 -9
  54. package/BookReader/images/marker_chap-off.svg +1 -11
  55. package/BookReader/images/marker_chap-on.svg +1 -11
  56. package/BookReader/images/marker_srch-on.svg +1 -11
  57. package/BookReader/images/unviewable_page.png +0 -0
  58. package/BookReader/jquery-3.js +2 -0
  59. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  60. package/BookReader/plugins/plugin.archive_analytics.js +1 -172
  61. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  62. package/BookReader/plugins/plugin.autoplay.js +1 -165
  63. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  64. package/BookReader/plugins/plugin.chapters.js +22 -301
  65. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  66. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  67. package/BookReader/plugins/plugin.iframe.js +1 -74
  68. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  69. package/BookReader/plugins/plugin.iiif.js +2 -0
  70. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  71. package/BookReader/plugins/plugin.resume.js +1 -368
  72. package/BookReader/plugins/plugin.resume.js.map +1 -1
  73. package/BookReader/plugins/plugin.search.js +2 -1420
  74. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  75. package/BookReader/plugins/plugin.search.js.map +1 -1
  76. package/BookReader/plugins/plugin.text_selection.js +2 -1080
  77. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  78. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  79. package/BookReader/plugins/plugin.tts.js +2 -9193
  80. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  81. package/BookReader/plugins/plugin.tts.js.map +1 -1
  82. package/BookReader/plugins/plugin.url.js +1 -269
  83. package/BookReader/plugins/plugin.url.js.map +1 -1
  84. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  85. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  86. package/BookReader/webcomponents-bundle.js +3 -0
  87. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  88. package/BookReader/webcomponents-bundle.js.map +1 -0
  89. package/BookReaderDemo/BookReaderDemo.css +18 -19
  90. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  91. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  92. package/BookReaderDemo/IADemoBr.js +144 -0
  93. package/BookReaderDemo/demo-advanced.html +2 -2
  94. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  95. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  96. package/BookReaderDemo/demo-fullscreen.html +2 -4
  97. package/BookReaderDemo/demo-iiif.html +99 -12
  98. package/BookReaderDemo/demo-internetarchive.html +214 -18
  99. package/BookReaderDemo/demo-multiple.html +2 -1
  100. package/BookReaderDemo/demo-preview-pages.html +526 -525
  101. package/BookReaderDemo/demo-simple.html +2 -1
  102. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
  103. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  104. package/BookReaderDemo/immersion-1up.html +2 -2
  105. package/BookReaderDemo/immersion-mode.html +2 -4
  106. package/BookReaderDemo/toggle_controls.html +3 -2
  107. package/BookReaderDemo/view_mode.html +2 -1
  108. package/BookReaderDemo/viewmode-cycle.html +2 -3
  109. package/CHANGELOG.md +595 -33
  110. package/README.md +14 -1
  111. package/babel.config.js +20 -0
  112. package/codecov.yml +6 -0
  113. package/index.html +5 -2
  114. package/jsconfig.json +19 -0
  115. package/netlify.toml +9 -0
  116. package/package.json +70 -62
  117. package/renovate.json +52 -0
  118. package/scripts/preversion.js +0 -1
  119. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  120. package/src/BookNavigator/assets/button-base.js +10 -2
  121. package/src/BookNavigator/assets/ia-logo.js +17 -0
  122. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  123. package/src/BookNavigator/assets/icon_close.js +1 -1
  124. package/src/BookNavigator/book-navigator.js +590 -0
  125. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  126. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  127. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  128. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +4 -9
  129. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  130. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  131. package/src/BookNavigator/delete-modal-actions.js +1 -1
  132. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  133. package/src/BookNavigator/downloads/downloads.js +29 -25
  134. package/src/BookNavigator/search/search-provider.js +80 -28
  135. package/src/BookNavigator/search/search-results.js +29 -26
  136. package/src/BookNavigator/sharing.js +27 -0
  137. package/src/BookNavigator/viewable-files.js +95 -0
  138. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
  139. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +7 -7
  140. package/src/BookReader/BookModel.js +76 -41
  141. package/src/BookReader/DragScrollable.js +233 -0
  142. package/src/BookReader/ImageCache.js +48 -15
  143. package/src/BookReader/Mode1Up.js +56 -351
  144. package/src/BookReader/Mode1UpLit.js +388 -0
  145. package/src/BookReader/Mode2Up.js +73 -1318
  146. package/src/BookReader/Mode2UpLit.js +777 -0
  147. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  148. package/src/BookReader/ModeSmoothZoom.js +312 -0
  149. package/src/BookReader/ModeThumb.js +19 -13
  150. package/src/BookReader/Navbar/Navbar.js +70 -54
  151. package/src/BookReader/PageContainer.js +116 -22
  152. package/src/BookReader/ReduceSet.js +3 -3
  153. package/src/BookReader/Toolbar/Toolbar.js +14 -41
  154. package/src/BookReader/events.js +2 -3
  155. package/src/BookReader/options.js +73 -15
  156. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  157. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  158. package/src/BookReader/utils/SelectionObserver.js +45 -0
  159. package/src/BookReader/utils/classes.js +1 -1
  160. package/src/BookReader/utils.js +128 -13
  161. package/src/BookReader.js +562 -1078
  162. package/src/BookReaderPlugin.js +44 -0
  163. package/src/assets/icons/close-circle-dark.svg +1 -0
  164. package/src/assets/icons/magnify-minus.svg +3 -7
  165. package/src/assets/icons/magnify-plus.svg +3 -7
  166. package/src/assets/icons/voice.svg +1 -0
  167. package/src/assets/images/unviewable_page.png +0 -0
  168. package/src/css/BookReader.scss +1 -17
  169. package/src/css/_BRBookmarks.scss +1 -1
  170. package/src/css/_BRComponent.scss +1 -1
  171. package/src/css/_BRicon.scss +8 -2
  172. package/src/css/_BRmain.scss +33 -27
  173. package/src/css/_BRnav.scss +12 -42
  174. package/src/css/_BRpages.scss +170 -42
  175. package/src/css/_BRsearch.scss +68 -230
  176. package/src/css/_BRtoolbar.scss +5 -5
  177. package/src/css/_TextSelection.scss +87 -27
  178. package/src/css/_colorbox.scss +2 -2
  179. package/src/css/_controls.scss +24 -7
  180. package/src/css/_icons.scss +7 -1
  181. package/src/ia-bookreader/ia-bookreader.js +224 -0
  182. package/src/plugins/plugin.archive_analytics.js +84 -78
  183. package/src/plugins/plugin.autoplay.js +99 -104
  184. package/src/plugins/plugin.chapters.js +237 -191
  185. package/src/plugins/plugin.iframe.js +1 -1
  186. package/src/plugins/plugin.iiif.js +141 -0
  187. package/src/plugins/plugin.resume.js +53 -50
  188. package/src/plugins/plugin.text_selection.js +503 -175
  189. package/src/plugins/plugin.vendor-fullscreen.js +7 -7
  190. package/src/plugins/search/plugin.search.js +183 -121
  191. package/src/plugins/search/utils.js +43 -0
  192. package/src/plugins/search/view.js +67 -202
  193. package/src/plugins/tts/AbstractTTSEngine.js +75 -45
  194. package/src/plugins/tts/FestivalTTSEngine.js +21 -31
  195. package/src/plugins/tts/PageChunk.js +16 -23
  196. package/src/plugins/tts/PageChunkIterator.js +11 -17
  197. package/src/plugins/tts/WebTTSEngine.js +88 -72
  198. package/src/plugins/tts/plugin.tts.js +310 -350
  199. package/src/plugins/tts/utils.js +16 -26
  200. package/src/plugins/url/UrlPlugin.js +191 -0
  201. package/src/plugins/{plugin.url.js → url/plugin.url.js} +47 -18
  202. package/src/util/browserSniffing.js +22 -0
  203. package/src/util/docCookies.js +21 -2
  204. package/src/util/strings.js +1 -0
  205. package/tests/e2e/README.md +37 -0
  206. package/tests/e2e/autoplay.test.js +9 -6
  207. package/tests/e2e/base.test.js +8 -16
  208. package/tests/e2e/helpers/base.js +55 -50
  209. package/tests/e2e/helpers/debug.js +1 -1
  210. package/tests/e2e/helpers/mockSearch.js +19 -22
  211. package/tests/e2e/helpers/params.js +17 -0
  212. package/tests/e2e/helpers/rightToLeft.js +8 -14
  213. package/tests/e2e/helpers/search.js +73 -0
  214. package/tests/e2e/models/Navigation.js +20 -37
  215. package/tests/e2e/rightToLeft.test.js +4 -5
  216. package/tests/e2e/viewmode.test.js +40 -33
  217. package/tests/jest/BookNavigator/book-navigator.test.js +661 -0
  218. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  219. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  220. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  221. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  222. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  223. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  224. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  225. package/tests/{karma/BookNavigator → jest/BookNavigator/search}/search-results.test.js +109 -60
  226. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  227. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +80 -0
  228. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  229. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  230. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  231. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  232. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  233. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  234. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  235. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  236. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  237. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  238. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +42 -29
  239. package/tests/jest/BookReader/PageContainer.test.js +238 -0
  240. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  241. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +3 -3
  242. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  243. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  244. package/tests/jest/BookReader/utils/SelectionObserver.test.js +57 -0
  245. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  246. package/tests/jest/BookReader/utils.test.js +250 -0
  247. package/tests/jest/BookReader.keyboard.test.js +190 -0
  248. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +10 -2
  249. package/tests/{BookReader.test.js → jest/BookReader.test.js} +43 -53
  250. package/tests/jest/plugins/plugin.archive_analytics.test.js +20 -0
  251. package/tests/jest/plugins/plugin.autoplay.test.js +35 -0
  252. package/tests/jest/plugins/plugin.chapters.test.js +195 -0
  253. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +4 -4
  254. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +22 -35
  255. package/tests/jest/plugins/plugin.text_selection.test.js +316 -0
  256. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  257. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +26 -47
  258. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +42 -9
  259. package/tests/jest/plugins/search/utils.js +25 -0
  260. package/tests/jest/plugins/search/utils.test.js +29 -0
  261. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +30 -10
  262. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  263. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  264. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  265. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  266. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  267. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  268. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +57 -18
  269. package/tests/jest/setup.js +3 -0
  270. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  271. package/tests/jest/util/docCookies.test.js +24 -0
  272. package/tests/{util → jest/util}/strings.test.js +1 -1
  273. package/tests/{utils.js → jest/utils.js} +38 -0
  274. package/webpack.config.js +16 -10
  275. package/.babelrc +0 -12
  276. package/.dependabot/config.yml +0 -6
  277. package/.testcaferc.json +0 -5
  278. package/BookReader/bookreader-component-bundle.js +0 -14330
  279. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  280. package/BookReader/bookreader-component-bundle.js.map +0 -1
  281. package/BookReader/icons/sort-ascending.svg +0 -1
  282. package/BookReader/icons/sort-descending.svg +0 -1
  283. package/BookReader/jquery-1.10.1.js +0 -108
  284. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  285. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  286. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  287. package/BookReader/plugins/plugin.mobile_nav.js +0 -335
  288. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  289. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  290. package/BookReaderDemo/IIIFBookReader.js +0 -207
  291. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  292. package/BookReaderDemo/demo-autoplay.html +0 -38
  293. package/BookReaderDemo/demo-iiif.js +0 -26
  294. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  295. package/karma.conf.js +0 -23
  296. package/src/BookNavigator/BookModel.js +0 -14
  297. package/src/BookNavigator/BookNavigator.js +0 -452
  298. package/src/BookNavigator/assets/book-loader.js +0 -27
  299. package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
  300. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  301. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  302. package/src/BookNavigator/search/a-search-result.js +0 -55
  303. package/src/BookNavigator/volumes/volumes-provider.js +0 -108
  304. package/src/BookNavigator/volumes/volumes.js +0 -162
  305. package/src/BookReader/DebugConsole.js +0 -54
  306. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  307. package/src/ItemNavigator/ItemNavigator.js +0 -372
  308. package/src/ItemNavigator/providers/sharing.js +0 -29
  309. package/src/assets/icons/sort-ascending.svg +0 -1
  310. package/src/assets/icons/sort-descending.svg +0 -1
  311. package/src/css/_MobileNav.scss +0 -194
  312. package/src/dragscrollable-br.js +0 -261
  313. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  314. package/src/plugins/plugin.mobile_nav.js +0 -287
  315. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  316. package/tests/BookReader/DebugConsole.test.js +0 -25
  317. package/tests/BookReader/Mode1Up.test.js +0 -164
  318. package/tests/BookReader/Mode2Up.test.js +0 -247
  319. package/tests/BookReader/PageContainer.test.js +0 -115
  320. package/tests/BookReader/utils.test.js +0 -109
  321. package/tests/e2e/helpers/desktopSearch.js +0 -72
  322. package/tests/e2e/helpers/mobileSearch.js +0 -85
  323. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  324. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  325. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  326. package/tests/karma/BookNavigator/volumes.test.js +0 -133
  327. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  328. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  329. package/tests/plugins/plugin.autoplay.test.js +0 -52
  330. package/tests/plugins/plugin.chapters.test.js +0 -130
  331. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  332. package/tests/plugins/plugin.text_selection.test.js +0 -203
  333. package/tests/util/docCookies.test.js +0 -15
@@ -0,0 +1,224 @@
1
+ /**
2
+ * BookReaderTemplate to load BookNavigator components
3
+ */
4
+
5
+ import { LitElement, html, css } from 'lit';
6
+
7
+ import '@internetarchive/ia-item-navigator';
8
+ import '../BookNavigator/book-navigator.js';
9
+ // eslint-disable-next-line no-unused-vars
10
+ import { ModalManager } from '@internetarchive/modal-manager';
11
+ import '@internetarchive/modal-manager';
12
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
13
+
14
+ export class IaBookReader extends LitElement {
15
+ static get properties() {
16
+ return {
17
+ item: { type: Object },
18
+ baseHost: { type: String },
19
+ signedIn: { type: Boolean },
20
+ fullscreen: { type: Boolean, reflect: true, attribute: true },
21
+ sharedObserver: { type: Object, attribute: false },
22
+ modal: { type: Object, attribute: false },
23
+ loaded: { type: Boolean },
24
+ menuShortcuts: { type: Array },
25
+ menuContents: { type: Array },
26
+ };
27
+ }
28
+
29
+ constructor() {
30
+ super();
31
+ this.item = undefined;
32
+ this.bookreader = undefined;
33
+ this.baseHost = 'archive.org';
34
+ this.fullscreen = false;
35
+ this.signedIn = false;
36
+ /** @type {ModalManager} */
37
+ this.modal = undefined;
38
+ /** @type {SharedResizeObserver} */
39
+ this.sharedObserver = undefined;
40
+ this.loaded = false;
41
+ this.menuShortcuts = [];
42
+ this.menuContents = [];
43
+ this.openMenuName = '';
44
+ }
45
+
46
+ updated() {
47
+ if (!this.modal) {
48
+ this.setModalManager();
49
+ }
50
+
51
+ if (!this.sharedObserver) {
52
+ this.sharedObserver = new SharedResizeObserver();
53
+ }
54
+ }
55
+
56
+ get itemNav() {
57
+ return this.shadowRoot.querySelector('iaux-item-navigator');
58
+ }
59
+
60
+ /** Creates modal DOM & attaches to `<body>` */
61
+ setModalManager() {
62
+ let modalManager = document.querySelector('modal-manager');
63
+ if (!modalManager) {
64
+ modalManager = document.createElement(
65
+ 'modal-manager',
66
+ );
67
+ document.body.appendChild(modalManager);
68
+ }
69
+
70
+ this.modal = modalManager;
71
+ }
72
+
73
+ manageFullscreen(e) {
74
+ const { detail } = e;
75
+ const fullscreen = !!detail.isFullScreen;
76
+ this.fullscreen = fullscreen;
77
+ this.dispatchEvent(new CustomEvent('fullscreenStateUpdated', { detail: { fullscreen }}));
78
+
79
+ }
80
+
81
+ loadingStateUpdated(e) {
82
+ const { loaded } = e.detail;
83
+ this.loaded = loaded || null;
84
+ this.dispatchEvent(new CustomEvent('loadingStateUpdated', { detail: { loaded }}));
85
+ }
86
+
87
+ setMenuShortcuts(e) {
88
+ this.menuShortcuts = [...e.detail];
89
+ }
90
+
91
+ setMenuContents(e) {
92
+ const updatedContents = [...e.detail];
93
+ this.menuContents = updatedContents;
94
+ }
95
+
96
+ manageSideMenuEvents(e) {
97
+ const { menuId, action } = e.detail;
98
+ if (!menuId) {
99
+ return;
100
+ }
101
+
102
+ this.openMenuName = menuId;
103
+
104
+ if (action === 'open') {
105
+ this.itemNav?.openShortcut(menuId);
106
+ } else if (action === 'toggle') {
107
+ this.itemNav?.toggleMenu();
108
+ }
109
+ }
110
+
111
+ render() {
112
+ return html`
113
+ <div class="main-component">
114
+ <iaux-item-navigator
115
+ ?viewportInFullscreen=${this.fullscreen}
116
+ .basehost=${this.baseHost}
117
+ .item=${this.item}
118
+ .modal=${this.modal}
119
+ .loaded=${this.loaded}
120
+ .sharedObserver=${this.sharedObserver}
121
+ ?signedIn=${this.signedIn}
122
+ .menuShortcuts=${this.menuShortcuts}
123
+ .menuContents=${this.menuContents}
124
+ .openMenu=${this.openMenuName}
125
+ >
126
+ <div slot="header">
127
+ <slot name="header"></slot>
128
+ </div>
129
+ <div slot="main">
130
+ <book-navigator
131
+ .modal=${this.modal}
132
+ .baseHost=${this.baseHost}
133
+ .itemMD=${this.item}
134
+ ?signedIn=${this.signedIn}
135
+ ?sideMenuOpen=${this.menuOpened}
136
+ .sharedObserver=${this.sharedObserver}
137
+ @ViewportInFullScreen=${this.manageFullscreen}
138
+ @loadingStateUpdated=${this.loadingStateUpdated}
139
+ @updateSideMenu=${this.manageSideMenuEvents}
140
+ @menuUpdated=${this.setMenuContents}
141
+ @menuShortcutsUpdated=${this.setMenuShortcuts}
142
+ >
143
+ <div slot="main">
144
+ <slot name="main"></slot>
145
+ </div>
146
+ </book-navigator>
147
+ </div>
148
+ </iaux-item-navigator>
149
+ </div>
150
+ `;
151
+ }
152
+
153
+ static get styles() {
154
+ return css`
155
+ :host {
156
+ display: block;
157
+ --primaryBGColor: var(--black, #000);
158
+ --secondaryBGColor: #222;
159
+ --tertiaryBGColor: #333;
160
+ --primaryTextColor: var(--white, #fff);
161
+ --primaryCTAFill: #194880;
162
+ --primaryCTABorder: #c5d1df;
163
+ --secondaryCTAFill: #333;
164
+ --secondaryCTABorder: #999;
165
+ --primaryErrorCTAFill: #e51c26;
166
+ --primaryErrorCTABorder: #f8c6c8;
167
+ background-color: var(--primaryBGColor);
168
+ position: relative;
169
+ }
170
+
171
+ :host([fullscreen]),
172
+ iaux-item-navigator[viewportinfullscreen] {
173
+ position: fixed;
174
+ inset: 0;
175
+ height: 100%;
176
+ min-height: unset;
177
+ }
178
+
179
+ .main-component {
180
+ height: 100%;
181
+ width: 100%;
182
+ min-height: inherit;
183
+ }
184
+
185
+ div[slot="header"],
186
+ div[slot="main"] {
187
+ display: flex;
188
+ width: 100%;
189
+ }
190
+
191
+ slot {
192
+ display: block;
193
+ flex: 1;
194
+ }
195
+
196
+ iaux-item-navigator {
197
+ min-height: var(--br-height, inherit);
198
+ height: var(--br-height, inherit);
199
+ display: block;
200
+ width: 100%;
201
+ color: var(--primaryTextColor);
202
+ --menuButtonLabelDisplay: block;
203
+ --menuWidth: 320px;
204
+ --menuSliderBg: var(--secondaryBGColor);
205
+ --activeButtonBg: var(--tertiaryBGColor);
206
+ --subpanelRightBorderColor: var(--secondaryCTABorder);
207
+ --animationTiming: 100ms;
208
+ --iconFillColor: var(--primaryTextColor);
209
+ --iconStrokeColor: var(--primaryTextColor);
210
+ --menuSliderHeaderIconHeight: 2rem;
211
+ --menuSliderHeaderIconWidth: 2rem;
212
+ --iconWidth: 2.4rem;
213
+ --iconHeight: 2.4rem;
214
+ --shareLinkColor: var(--primaryTextColor);
215
+ --shareIconBorder: var(--primaryTextColor);
216
+ --shareIconBg: var(--secondaryBGColor);
217
+ --activityIndicatorLoadingDotColor: var(--primaryTextColor);
218
+ --activityIndicatorLoadingRingColor: var(--primaryTextColor);
219
+ }
220
+ `;
221
+ }
222
+ }
223
+
224
+ window.customElements.define("ia-bookreader", IaBookReader);
@@ -1,86 +1,92 @@
1
- /* global BookReader, archive_analytics */
2
- /**
3
- * Plugin for Archive.org analytics
4
- */
5
- jQuery.extend(BookReader.defaultOptions, {
6
- enableArchiveAnalytics: true,
7
- /** Provide a means of debugging, cause otherwise it's impossible to test locally */
8
- debugArchiveAnaltyics: false,
9
- });
10
-
11
- BookReader.prototype.init = (function(super_) {
12
- return function() {
13
- super_.call(this);
14
-
15
- if (this.options.enableArchiveAnalytics) {
16
- this.bind(BookReader.eventNames.fragmentChange, () => this.archiveAnalyticsSendFragmentChange());
17
- }
18
- };
19
- })(BookReader.prototype.init);
1
+ // @ts-check
2
+ import { BookReaderPlugin } from "../BookReaderPlugin.js";
3
+
4
+ const BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);
5
+
20
6
 
21
- /** @private */
22
- BookReader.prototype.archiveAnalyticsSendFragmentChange = function() {
23
- if (!window.archive_analytics) {
24
- return;
7
+ export class ArchiveAnalyticsPlugin extends BookReaderPlugin {
8
+ options = {
9
+ enabled: true,
10
+ /** Provide a means of debugging, cause otherwise it's impossible to test locally */
11
+ debug: false,
25
12
  }
26
13
 
27
- const prevFragment = this.archiveAnalyticsSendFragmentChange.prevFragment;
28
-
29
- const params = this.paramsFromCurrent();
30
- const newFragment = this.fragmentFromParams(params);
31
-
32
- if (prevFragment != newFragment) {
33
- const values = {
34
- bookreader: "user_changed_view",
35
- itemid: this.bookId,
36
- cache_bust: Math.random()
37
- };
38
- // EEK! offsite embedding and /details/ page books look the same in analytics, otherwise!
39
- values.offsite = 1;
40
- values.details = 0;
41
- try {
42
- values.offsite = window.top.location.hostname.match(/\.archive.org$/)
43
- ? 0
44
- : 1;
45
- values.details =
46
- !values.offsite && window.top.location.pathname.match(/^\/details\//)
47
- ? 1
48
- : 0;
49
- } catch (e) {}
50
- // avoids embed cross site exceptions -- but on (+) side, means it is and keeps marked offite!
51
-
52
- // Send bookreader ping
53
- archive_analytics.send_ping(values, null, "augment_for_ao_site");
54
-
55
- // Also send tracking event ping
56
- const additionalEventParams = this.options.lendingInfo && this.options.lendingInfo.loanId
57
- ? { loanId: this.options.lendingInfo.loanId }
58
- : {};
59
- archive_analytics.send_event('BookReader', 'UserChangedView', window.location.pathname, additionalEventParams);
60
-
61
- this.archiveAnalyticsSendFragmentChange.prevFragment = newFragment;
14
+ /** @type {string} */
15
+ _prevFragment = null;
16
+
17
+ /** @override */
18
+ init() {
19
+ if (this.options.enabled) {
20
+ this.br.bind(BookReader.eventNames.fragmentChange, () => this.sendFragmentChange());
21
+ }
62
22
  }
63
- };
64
-
65
- /**
66
- * Sends a tracking "Event". See https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#events
67
- * @param {string} category
68
- * @param {string} action
69
- * @param {number} [value] (must be an int)
70
- * @param {Object} [additionalEventParams]
71
- */
72
- BookReader.prototype.archiveAnalyticsSendEvent = function(category, action, value, additionalEventParams) {
73
- if (!this.options.enableArchiveAnalytics) return;
74
-
75
- if (this.options.debugArchiveAnaltyics) {
76
- console.log("archiveAnalyticsSendEvent", arguments, window.archive_analytics);
23
+
24
+ /** @private */
25
+ sendFragmentChange() {
26
+ if (!window.archive_analytics) {
27
+ return;
28
+ }
29
+
30
+ const prevFragment = this._prevFragment;
31
+
32
+ const params = this.br.paramsFromCurrent();
33
+ const newFragment = this.br.fragmentFromParams(params);
34
+
35
+ if (prevFragment != newFragment) {
36
+ const values = {
37
+ bookreader: "user_changed_view",
38
+ itemid: this.br.bookId,
39
+ cache_bust: Math.random(),
40
+ };
41
+ // EEK! offsite embedding and /details/ page books look the same in analytics, otherwise!
42
+ values.offsite = 1;
43
+ values.details = 0;
44
+ try {
45
+ values.offsite = window.top.location.hostname.match(/\.archive.org$/)
46
+ ? 0
47
+ : 1;
48
+ values.details =
49
+ !values.offsite && window.top.location.pathname.match(/^\/details\//)
50
+ ? 1
51
+ : 0;
52
+ } catch (e) { }
53
+ // avoids embed cross site exceptions -- but on (+) side, means it is and keeps marked offite!
54
+
55
+ // Send bookreader ping
56
+ window.archive_analytics.send_ping(values, null, "augment_for_ao_site");
57
+
58
+ // Also send tracking event ping
59
+ const additionalEventParams = this.br.options.lendingInfo?.loanId
60
+ ? { loanId: this.br.options.lendingInfo.loanId }
61
+ : {};
62
+ window.archive_analytics.send_event('BookReader', 'UserChangedView', window.location.pathname, additionalEventParams);
63
+
64
+ this._prevFragment = newFragment;
65
+ }
77
66
  }
78
67
 
79
- if (!window.archive_analytics) return;
68
+ /**
69
+ * Sends a tracking "Event". See https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#events
70
+ * @param {string} category
71
+ * @param {string} action
72
+ * @param {number} [value] (must be an int)
73
+ * @param {Object} [additionalEventParams]
74
+ */
75
+ sendEvent(category, action, value, additionalEventParams) {
76
+ if (!this.options.enabled) return;
80
77
 
81
- additionalEventParams = additionalEventParams || {};
82
- if (typeof(value) == 'number') {
83
- additionalEventParams.ev = value;
78
+ if (this.options.debug) {
79
+ console.log("archiveAnalyticsSendEvent", arguments, window.archive_analytics);
80
+ }
81
+
82
+ if (!window.archive_analytics) return;
83
+
84
+ additionalEventParams = additionalEventParams || {};
85
+ if (typeof (value) == 'number') {
86
+ additionalEventParams.ev = value;
87
+ }
88
+ window.archive_analytics.send_event(category, action, null, additionalEventParams);
84
89
  }
85
- window.archive_analytics.send_event(category, action, null, additionalEventParams);
86
- };
90
+ }
91
+
92
+ BookReader?.registerPlugin('archiveAnalytics', ArchiveAnalyticsPlugin);
@@ -1,129 +1,124 @@
1
- /*global BookReader */
1
+ // @ts-check
2
+ import { EVENTS } from "../BookReader/events";
3
+ import { parseAnimationSpeed } from "../BookReader/utils";
4
+ import { BookReaderPlugin } from "../BookReaderPlugin";
2
5
 
3
6
  /**
4
7
  * Plugin which adds an autoplay feature. Useful for kiosk situations.
5
8
  */
6
- jQuery.extend(BookReader.defaultOptions, {
7
- enableAutoPlayPlugin: true
8
- });
9
+ export class AutoplayPlugin extends BookReaderPlugin {
10
+ options = {
11
+ enabled: true,
12
+ /**
13
+ * @type {number | 'fast' | 'slow'}
14
+ * How quickly the flip animation should run.
15
+ **/
16
+ flipSpeed: 1500,
17
+ /** How long to pause on each page between flips */
18
+ flipDelay: 5000,
19
+ /** Allow controlling the autoflip/speed/delay from the url */
20
+ urlParams: true,
21
+ }
9
22
 
10
- /**
11
- * @override BookReader.setup
12
- */
13
- BookReader.prototype.setup = (function(super_) {
14
- return function (options) {
15
- super_.call(this, options);
23
+ timer = null;
16
24
 
17
- this.auto = false;
18
- this.autoTimer = null;
19
- this.flipDelay = 5000;
20
- };
21
- })(BookReader.prototype.setup);
25
+ /** @override */
26
+ init() {
27
+ if (!this.options.enabled) return;
22
28
 
23
- /**
24
- * @override BookReader.init
25
- */
26
- BookReader.prototype.init = (function(super_) {
27
- return function (options) {
28
- super_.call(this, options);
29
-
30
- if (!this.options.enableAutoPlayPlugin) return;
31
- this.bind(BookReader.eventNames.stop, () => this.autoStop());
32
- };
33
- })(BookReader.prototype.init);
29
+ this.br.bind(EVENTS.stop, () => this.stop());
34
30
 
35
- /**
36
- * @override BookReader.bindNavigationHandlers
37
- */
38
- BookReader.prototype.bindNavigationHandlers = (function(super_) {
39
- return function() {
40
- super_.call(this);
31
+ if (this.options.urlParams) {
32
+ const urlParams = new URLSearchParams(window.location.search);
33
+ if (urlParams.get('flipSpeed')) {
34
+ this.options.flipSpeed = parseAnimationSpeed(urlParams.get('flipSpeed')) || this.options.flipSpeed;
35
+ }
36
+ if (urlParams.get('flipDelay')) {
37
+ this.options.flipDelay = parseAnimationSpeed(urlParams.get('flipDelay')) || this.options.flipDelay;
38
+ }
39
+ if (urlParams.get('autoflip') === '1') {
40
+ this.toggle();
41
+ }
42
+ }
43
+ }
41
44
 
42
- if (!this.options.enableAutoPlayPlugin) return;
45
+ /** @override */
46
+ _bindNavigationHandlers() {
47
+ if (!this.options.enabled) return;
43
48
 
44
- // Note the mobile plugin attaches itself to body, so we need to select outside
45
- const jIcons = this.$('.BRicon').add('.BRmobileMenu .BRicon');
49
+ const jIcons = this.br.$('.BRicon');
46
50
 
47
- jIcons.filter('.play').click(() => {
48
- this.autoToggle();
51
+ jIcons.filter('.play').on('click', () => {
52
+ this.toggle();
49
53
  return false;
50
54
  });
51
55
 
52
- jIcons.filter('.pause').click(() => {
53
- this.autoToggle();
56
+ jIcons.filter('.pause').on('click', () => {
57
+ this.toggle();
54
58
  return false;
55
59
  });
56
- };
57
- })(BookReader.prototype.bindNavigationHandlers);
58
-
59
- /**
60
- * Starts autoplay mode
61
- * @param {object} overrides
62
- * @param {number} overrides.flipSpeed
63
- * @param {number} overrides.flipDelay
64
- */
65
- BookReader.prototype.autoToggle = function(overrides) {
66
- if (!this.options.enableAutoPlayPlugin) return;
67
-
68
- const options = $.extend({
69
- flipSpeed: this.flipSpeed,
70
- flipDelay: this.flipDelay
71
- }, overrides);
72
-
73
- this.flipSpeed = typeof options.flipSpeed === "number" ? options.flipSpeed : this.flipSpeed;
74
- this.flipDelay = typeof options.flipDelay === "number" ? options.flipDelay : this.flipDelay;
75
- this.trigger(BookReader.eventNames.stop);
76
-
77
- let bComingFrom1up = false;
78
- if (this.constMode2up != this.mode) {
79
- bComingFrom1up = true;
80
- this.switchMode(this.constMode2up);
81
- }
82
-
83
- // Change to autofit if book is too large
84
- if (this.reduce < this.twoPageGetAutofitReduce()) {
85
- this.zoom('auto');
86
60
  }
87
61
 
88
- if (null == this.autoTimer) {
89
- // $$$ Draw events currently cause layout problems when they occur during animation.
90
- // There is a specific problem when changing from 1-up immediately to autoplay in RTL so
91
- // we workaround for now by not triggering immediate animation in that case.
92
- // See https://bugs.launchpad.net/gnubook/+bug/328327
93
- if (('rl' == this.pageProgression) && bComingFrom1up) {
94
- // don't flip immediately -- wait until timer fires
95
- } else {
96
- // flip immediately
97
- this.flipFwdToIndex();
62
+ /**
63
+ * Starts autoplay mode
64
+ * @param {object} overrides
65
+ * @param {number} overrides.flipSpeed
66
+ * @param {number} overrides.flipDelay
67
+ */
68
+ toggle(overrides = null) {
69
+ if (!this.options.enabled) return;
70
+
71
+ Object.assign(this.options, overrides);
72
+ this.br.trigger(EVENTS.stop);
73
+
74
+ let bComingFrom1up = false;
75
+ if (this.br.constMode2up != this.br.mode) {
76
+ bComingFrom1up = true;
77
+ this.br.switchMode(this.br.constMode2up);
98
78
  }
99
79
 
100
- this.$('.play').hide();
101
- this.$('.pause').show();
102
- this.autoTimer = setInterval(() => {
103
- if (this.animating) return;
104
-
105
- if (Math.max(this.twoPage.currentIndexL, this.twoPage.currentIndexR) >= this.lastDisplayableIndex()) {
106
- this.flipBackToIndex(1); // $$$ really what we want?
80
+ if (null == this.timer) {
81
+ // $$$ Draw events currently cause layout problems when they occur during animation.
82
+ // There is a specific problem when changing from 1-up immediately to autoplay in RTL so
83
+ // we workaround for now by not triggering immediate animation in that case.
84
+ // See https://bugs.launchpad.net/gnubook/+bug/328327
85
+ if (('rl' == this.br.pageProgression) && bComingFrom1up) {
86
+ // don't flip immediately -- wait until timer fires
107
87
  } else {
108
- this.flipFwdToIndex();
88
+ // flip immediately
89
+ this.br.next({ triggerStop: false, flipSpeed: this.options.flipSpeed });
109
90
  }
110
- }, this.flipDelay);
111
- } else {
112
- this.autoStop();
91
+
92
+ this.br.$('.play').hide();
93
+ this.br.$('.pause').show();
94
+ this.timer = setInterval(() => {
95
+ if (this.br.animating) return;
96
+
97
+ if (Math.max(this.br.twoPage.currentIndexL, this.br.twoPage.currentIndexR) >= this.br.book.getNumLeafs() - 1) {
98
+ this.br.prev({ triggerStop: false, flipSpeed: this.options.flipSpeed }); // $$$ really what we want?
99
+ } else {
100
+ this.br.next({ triggerStop: false, flipSpeed: this.options.flipSpeed });
101
+ }
102
+ }, parseAnimationSpeed(this.options.flipDelay));
103
+ } else {
104
+ this.stop();
105
+ }
113
106
  }
114
- };
115
107
 
116
- /**
117
- * Stop autoplay mode, allowing animations to finish
118
- */
119
- BookReader.prototype.autoStop = function() {
120
- if (!this.options.enableAutoPlayPlugin) return;
121
-
122
- if (null != this.autoTimer) {
123
- clearInterval(this.autoTimer);
124
- this.flipSpeed = 'fast';
125
- this.$('.pause').hide();
126
- this.$('.play').show();
127
- this.autoTimer = null;
108
+ /**
109
+ * Stop autoplay mode, allowing animations to finish
110
+ */
111
+ stop() {
112
+ if (!this.options.enabled) return;
113
+
114
+ if (null != this.timer) {
115
+ clearInterval(this.timer);
116
+ this.br.$('.pause').hide();
117
+ this.br.$('.play').show();
118
+ this.timer = null;
119
+ }
128
120
  }
129
- };
121
+ }
122
+
123
+ const BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);
124
+ BookReader?.registerPlugin('autoplay', AutoplayPlugin);