@internetarchive/bookreader 5.0.0-10-alpha-1 → 5.0.0-100

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 (374) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +428 -1139
  4. package/BookReader/BookReader.js +1 -1
  5. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  6. package/BookReader/BookReader.js.map +1 -1
  7. package/BookReader/bergamot-translator-worker.js +2966 -0
  8. package/BookReader/bergamot-translator-worker.wasm +0 -0
  9. package/BookReader/hypothesis/LICENSE +50 -0
  10. package/BookReader/hypothesis/README.md +55 -0
  11. package/BookReader/hypothesis/build/boot.js +1 -0
  12. package/BookReader/hypothesis/build/manifest.json +20 -0
  13. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
  14. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
  16. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
  18. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  19. package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
  20. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  40. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  41. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  42. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
  44. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
  46. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
  48. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  49. package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
  50. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  51. package/BookReader/hypothesis/package.json +126 -0
  52. package/BookReader/ia-bookreader-bundle.js +1782 -0
  53. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  54. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  55. package/BookReader/icons/1up.svg +1 -1
  56. package/BookReader/icons/2up.svg +1 -1
  57. package/BookReader/icons/advance.svg +1 -1
  58. package/BookReader/icons/chevron-right.svg +1 -1
  59. package/BookReader/icons/close-circle-dark.svg +1 -1
  60. package/BookReader/icons/close-circle.svg +1 -1
  61. package/BookReader/icons/fullscreen.svg +1 -1
  62. package/BookReader/icons/fullscreen_exit.svg +1 -1
  63. package/BookReader/icons/hamburger.svg +1 -1
  64. package/BookReader/icons/left-arrow.svg +1 -1
  65. package/BookReader/icons/magnify-minus.svg +1 -1
  66. package/BookReader/icons/magnify-plus.svg +1 -1
  67. package/BookReader/icons/magnify.svg +1 -1
  68. package/BookReader/icons/pause.svg +1 -1
  69. package/BookReader/icons/play.svg +1 -1
  70. package/BookReader/icons/playback-speed.svg +1 -1
  71. package/BookReader/icons/read-aloud.svg +1 -1
  72. package/BookReader/icons/review.svg +1 -1
  73. package/BookReader/icons/thumbnails.svg +1 -1
  74. package/BookReader/icons/voice.svg +1 -0
  75. package/BookReader/icons/volume-full.svg +1 -1
  76. package/BookReader/images/BRicons.svg +3 -3
  77. package/BookReader/images/books_graphic.svg +1 -1
  78. package/BookReader/images/hypothesis.ico +0 -0
  79. package/BookReader/images/icon_book.svg +1 -1
  80. package/BookReader/images/icon_bookmark.svg +1 -1
  81. package/BookReader/images/icon_experiment.svg +1 -0
  82. package/BookReader/images/icon_gear.svg +1 -1
  83. package/BookReader/images/icon_hamburger.svg +1 -1
  84. package/BookReader/images/icon_home.svg +1 -1
  85. package/BookReader/images/icon_info.svg +1 -1
  86. package/BookReader/images/icon_one_page.svg +1 -1
  87. package/BookReader/images/icon_pause.svg +1 -1
  88. package/BookReader/images/icon_play.svg +1 -1
  89. package/BookReader/images/icon_playback-rate.svg +1 -1
  90. package/BookReader/images/icon_search_button.svg +1 -1
  91. package/BookReader/images/icon_share.svg +1 -1
  92. package/BookReader/images/icon_skip-ahead.svg +1 -1
  93. package/BookReader/images/icon_skip-back.svg +1 -1
  94. package/BookReader/images/icon_speaker.svg +1 -1
  95. package/BookReader/images/icon_speaker_open.svg +1 -1
  96. package/BookReader/images/icon_thumbnails.svg +1 -1
  97. package/BookReader/images/icon_toc.svg +1 -1
  98. package/BookReader/images/icon_two_pages.svg +1 -1
  99. package/BookReader/images/marker_chap-off.svg +1 -1
  100. package/BookReader/images/marker_chap-on.svg +1 -1
  101. package/BookReader/images/marker_srch-on.svg +1 -1
  102. package/BookReader/images/translate.svg +1 -0
  103. package/BookReader/images/unviewable_page.png +0 -0
  104. package/BookReader/jquery-3.js +2 -0
  105. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  106. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  107. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  108. package/BookReader/plugins/plugin.autoplay.js +1 -1
  109. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  110. package/BookReader/plugins/plugin.chapters.js +25 -1
  111. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  112. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  113. package/BookReader/plugins/plugin.experiments.js +3 -0
  114. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  115. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  116. package/BookReader/plugins/plugin.iframe.js +1 -1
  117. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  118. package/BookReader/plugins/plugin.iiif.js +2 -0
  119. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  120. package/BookReader/plugins/plugin.resume.js +1 -1
  121. package/BookReader/plugins/plugin.resume.js.map +1 -1
  122. package/BookReader/plugins/plugin.search.js +2 -1
  123. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  124. package/BookReader/plugins/plugin.search.js.map +1 -1
  125. package/BookReader/plugins/plugin.text_selection.js +2 -1
  126. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  127. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  128. package/BookReader/plugins/plugin.translate.js +137 -0
  129. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  130. package/BookReader/plugins/plugin.translate.js.map +1 -0
  131. package/BookReader/plugins/plugin.tts.js +1 -1
  132. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  133. package/BookReader/plugins/plugin.tts.js.map +1 -1
  134. package/BookReader/plugins/plugin.url.js +1 -1
  135. package/BookReader/plugins/plugin.url.js.map +1 -1
  136. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  137. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  138. package/BookReader/plugins/translator-worker.js +2 -0
  139. package/BookReader/plugins/translator-worker.js.map +1 -0
  140. package/BookReader/silence.mp3 +0 -0
  141. package/BookReader/translator-worker.js +475 -0
  142. package/BookReader/webcomponents-bundle.js +3 -0
  143. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  144. package/BookReader/webcomponents-bundle.js.map +1 -0
  145. package/README.md +14 -3
  146. package/jsconfig.json +19 -0
  147. package/package.json +84 -64
  148. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  149. package/src/BookNavigator/assets/button-base.js +2 -1
  150. package/src/BookNavigator/assets/ia-logo.js +17 -0
  151. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  152. package/src/BookNavigator/assets/icon_close.js +1 -1
  153. package/src/BookNavigator/book-navigator.js +620 -0
  154. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  155. package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -3
  156. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  157. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +2 -2
  158. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  159. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  160. package/src/BookNavigator/delete-modal-actions.js +1 -1
  161. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  162. package/src/BookNavigator/downloads/downloads.js +24 -4
  163. package/src/BookNavigator/search/search-provider.js +55 -27
  164. package/src/BookNavigator/search/search-results.js +25 -11
  165. package/src/BookNavigator/sharing.js +27 -0
  166. package/src/BookNavigator/viewable-files.js +95 -0
  167. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
  168. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +9 -9
  169. package/src/BookReader/BookModel.js +92 -46
  170. package/src/BookReader/DragScrollable.js +233 -0
  171. package/src/BookReader/ImageCache.js +49 -16
  172. package/src/BookReader/Mode1Up.js +58 -360
  173. package/src/BookReader/Mode1UpLit.js +393 -0
  174. package/src/BookReader/Mode2Up.js +75 -1318
  175. package/src/BookReader/Mode2UpLit.js +787 -0
  176. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  177. package/src/BookReader/ModeSmoothZoom.js +312 -0
  178. package/src/BookReader/ModeThumb.js +20 -12
  179. package/src/BookReader/Navbar/Navbar.js +130 -53
  180. package/src/BookReader/PageContainer.js +120 -23
  181. package/src/BookReader/ReduceSet.js +2 -2
  182. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  183. package/src/BookReader/events.js +2 -3
  184. package/src/BookReader/options.js +87 -16
  185. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  186. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  187. package/src/BookReader/utils/SelectionObserver.js +45 -0
  188. package/src/BookReader/utils/classes.js +1 -1
  189. package/src/BookReader/utils.js +136 -12
  190. package/src/BookReader.js +641 -1192
  191. package/src/BookReaderPlugin.js +52 -0
  192. package/src/assets/icons/magnify-minus.svg +3 -7
  193. package/src/assets/icons/magnify-plus.svg +3 -7
  194. package/src/assets/icons/voice.svg +1 -0
  195. package/src/assets/images/hypothesis.ico +0 -0
  196. package/src/assets/images/icon_experiment.svg +1 -0
  197. package/src/assets/images/translate.svg +1 -0
  198. package/src/assets/images/unviewable_page.png +0 -0
  199. package/src/assets/silence.mp3 +0 -0
  200. package/src/css/BookReader.scss +1 -5
  201. package/src/css/_BRBookmarks.scss +1 -1
  202. package/src/css/_BRComponent.scss +1 -1
  203. package/src/css/_BRicon.scss +8 -2
  204. package/src/css/_BRmain.scss +16 -3
  205. package/src/css/_BRnav.scss +12 -66
  206. package/src/css/_BRpages.scss +163 -43
  207. package/src/css/_BRsearch.scss +69 -30
  208. package/src/css/_BRtoolbar.scss +5 -5
  209. package/src/css/_TextSelection.scss +129 -24
  210. package/src/css/_colorbox.scss +2 -2
  211. package/src/css/_controls.scss +24 -7
  212. package/src/css/_icons.scss +1 -1
  213. package/src/ia-bookreader/ia-bookreader.js +224 -0
  214. package/src/plugins/plugin.archive_analytics.js +84 -78
  215. package/src/plugins/plugin.autoplay.js +99 -104
  216. package/src/plugins/plugin.chapters.js +314 -205
  217. package/src/plugins/plugin.experiments.js +321 -0
  218. package/src/plugins/plugin.iframe.js +1 -1
  219. package/src/plugins/plugin.iiif.js +141 -0
  220. package/src/plugins/plugin.resume.js +54 -51
  221. package/src/plugins/plugin.text_selection.js +510 -219
  222. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  223. package/src/plugins/search/plugin.search.js +370 -392
  224. package/src/plugins/search/utils.js +43 -0
  225. package/src/plugins/search/view.js +49 -67
  226. package/src/plugins/translate/TranslationManager.js +162 -0
  227. package/src/plugins/translate/plugin.translate.js +523 -0
  228. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  229. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  230. package/src/plugins/tts/PageChunk.js +33 -21
  231. package/src/plugins/tts/PageChunkIterator.js +11 -17
  232. package/src/plugins/tts/WebTTSEngine.js +131 -91
  233. package/src/plugins/tts/plugin.tts.js +344 -350
  234. package/src/plugins/tts/utils.js +49 -47
  235. package/src/plugins/url/UrlPlugin.js +191 -0
  236. package/src/plugins/{plugin.url.js → url/plugin.url.js} +44 -15
  237. package/src/util/TextSelectionManager.js +282 -0
  238. package/src/util/browserSniffing.js +33 -1
  239. package/src/util/cache.js +20 -0
  240. package/src/util/docCookies.js +21 -2
  241. package/src/util/strings.js +1 -0
  242. package/.babelrc +0 -12
  243. package/.dependabot/config.yml +0 -6
  244. package/.eslintrc.js +0 -50
  245. package/.gitattributes +0 -2
  246. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  247. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  248. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  249. package/.github/workflows/node.js.yml +0 -37
  250. package/.github/workflows/npm-publish.yml +0 -47
  251. package/.testcaferc.json +0 -5
  252. package/BookReader/bookreader-component-bundle.js +0 -1450
  253. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  254. package/BookReader/bookreader-component-bundle.js.map +0 -1
  255. package/BookReader/jquery-1.10.1.js +0 -2
  256. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  257. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  258. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  259. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  260. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  261. package/BookReaderDemo/BookReaderDemo.css +0 -41
  262. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  263. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  264. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  265. package/BookReaderDemo/IIIFBookReader.js +0 -207
  266. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  267. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  268. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  273. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  274. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  275. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  276. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  277. package/BookReaderDemo/demo-advanced.html +0 -33
  278. package/BookReaderDemo/demo-autoplay.html +0 -38
  279. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  280. package/BookReaderDemo/demo-embed.html +0 -26
  281. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  282. package/BookReaderDemo/demo-fullscreen.html +0 -33
  283. package/BookReaderDemo/demo-iiif.html +0 -34
  284. package/BookReaderDemo/demo-iiif.js +0 -26
  285. package/BookReaderDemo/demo-internetarchive.html +0 -74
  286. package/BookReaderDemo/demo-multiple.html +0 -43
  287. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  288. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  289. package/BookReaderDemo/demo-simple.html +0 -34
  290. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  291. package/BookReaderDemo/immersion-1up.html +0 -64
  292. package/BookReaderDemo/immersion-mode.html +0 -35
  293. package/BookReaderDemo/toggle_controls.html +0 -53
  294. package/BookReaderDemo/view_mode.html +0 -39
  295. package/BookReaderDemo/viewmode-cycle.html +0 -41
  296. package/CHANGELOG.md +0 -493
  297. package/CONTRIBUTING.md +0 -7
  298. package/codecov.yml +0 -17
  299. package/index.html +0 -31
  300. package/karma.conf.js +0 -23
  301. package/screenshot.png +0 -0
  302. package/scripts/postversion.js +0 -10
  303. package/scripts/preversion.js +0 -14
  304. package/scripts/version.js +0 -26
  305. package/src/BookNavigator/BookModel.js +0 -14
  306. package/src/BookNavigator/BookNavigator.js +0 -446
  307. package/src/BookNavigator/assets/book-loader.js +0 -27
  308. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  309. package/src/BookNavigator/search/a-search-result.js +0 -55
  310. package/src/BookReader/DebugConsole.js +0 -54
  311. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  312. package/src/ItemNavigator/ItemNavigator.js +0 -376
  313. package/src/ItemNavigator/providers/sharing.js +0 -29
  314. package/src/css/_MobileNav.scss +0 -194
  315. package/src/dragscrollable-br.js +0 -261
  316. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  317. package/src/plugins/plugin.mobile_nav.js +0 -287
  318. package/tests/BookReader/BookModel.test.js +0 -312
  319. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  320. package/tests/BookReader/DebugConsole.test.js +0 -25
  321. package/tests/BookReader/ImageCache.test.js +0 -150
  322. package/tests/BookReader/Mode1Up.test.js +0 -164
  323. package/tests/BookReader/Mode2Up.test.js +0 -247
  324. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  325. package/tests/BookReader/PageContainer.test.js +0 -115
  326. package/tests/BookReader/ReduceSet.test.js +0 -38
  327. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  328. package/tests/BookReader/utils/classes.test.js +0 -88
  329. package/tests/BookReader/utils.test.js +0 -109
  330. package/tests/BookReader.options.test.js +0 -39
  331. package/tests/BookReader.test.js +0 -301
  332. package/tests/e2e/README.md +0 -75
  333. package/tests/e2e/autoplay.test.js +0 -13
  334. package/tests/e2e/base.test.js +0 -35
  335. package/tests/e2e/helpers/base.js +0 -263
  336. package/tests/e2e/helpers/debug.js +0 -13
  337. package/tests/e2e/helpers/desktopSearch.js +0 -72
  338. package/tests/e2e/helpers/mobileSearch.js +0 -85
  339. package/tests/e2e/helpers/mockSearch.js +0 -93
  340. package/tests/e2e/helpers/rightToLeft.js +0 -29
  341. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  342. package/tests/e2e/models/BookReader.js +0 -11
  343. package/tests/e2e/models/Navigation.js +0 -56
  344. package/tests/e2e/rightToLeft.test.js +0 -20
  345. package/tests/e2e/viewmode.test.js +0 -37
  346. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  347. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  348. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  349. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  350. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  351. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  352. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  353. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  354. package/tests/plugins/plugin.autoplay.test.js +0 -52
  355. package/tests/plugins/plugin.chapters.test.js +0 -130
  356. package/tests/plugins/plugin.iframe.test.js +0 -42
  357. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  358. package/tests/plugins/plugin.resume.test.js +0 -98
  359. package/tests/plugins/plugin.text_selection.test.js +0 -203
  360. package/tests/plugins/plugin.url.test.js +0 -129
  361. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  362. package/tests/plugins/search/plugin.search.test.js +0 -173
  363. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  364. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  365. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  366. package/tests/plugins/tts/PageChunk.test.js +0 -57
  367. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  368. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  369. package/tests/plugins/tts/utils.test.js +0 -133
  370. package/tests/util/browserSniffing.test.js +0 -56
  371. package/tests/util/docCookies.test.js +0 -15
  372. package/tests/util/strings.test.js +0 -63
  373. package/tests/utils.js +0 -42
  374. package/webpack.config.js +0 -86
@@ -1,85 +1,160 @@
1
- /* global BookReader */
1
+ // @ts-check
2
+ import { css, html, LitElement, nothing } from "lit";
3
+ import { customElement, property } from 'lit/decorators.js';
4
+ import { ifDefined } from 'lit/directives/if-defined.js';
5
+ import { styleMap } from 'lit/directives/style-map.js';
6
+ import '@internetarchive/icon-toc/icon-toc.js';
7
+ import { BookReaderPlugin } from "../BookReaderPlugin.js";
8
+ import { applyVariables } from "../util/strings.js";
9
+ /** @typedef {import('@/src/BookReader/BookModel.js').PageIndex} PageIndex */
10
+ /** @typedef {import('@/src/BookReader/BookModel.js').PageString} PageString */
11
+ /** @typedef {import('@/src/BookReader/BookModel.js').LeafNum} LeafNum */
12
+
13
+ // @ts-ignore
14
+ const BookReader = /** @type {typeof import('@/src/BookReader.js').default} */(window.BookReader);
15
+
2
16
  /**
3
17
  * Plugin for chapter markers in BookReader. Fetches from openlibrary.org
4
18
  * Could be forked, or extended to alter behavior
5
19
  */
20
+ export class ChaptersPlugin extends BookReaderPlugin {
21
+ options = {
22
+ enabled: true,
23
+
24
+ /**
25
+ * The Open Library host to fetch/query Open Library.
26
+ * @type {import('@/src/util/strings.js').StringWithVars}
27
+ */
28
+ openLibraryHost: 'https://openlibrary.org',
29
+
30
+ /**
31
+ * The Open Library edition to fetch the table of contents from.
32
+ * E.g. 'OL12345M'
33
+ *
34
+ * @type {import('@/src/util/strings.js').StringWithVars}
35
+ */
36
+ openLibraryId: '',
37
+
38
+ /**
39
+ * The Internet Archive identifier to fetch the Open Library table
40
+ * of contents from.
41
+ * E.g. 'goody'
42
+ *
43
+ * @type {import('@/src/util/strings.js').StringWithVars}
44
+ */
45
+ internetArchiveId: '',
46
+
47
+ /**
48
+ * @deprecated
49
+ * Old name for openLibraryHost
50
+ * @type {import('@/src/util/strings.js').StringWithVars}
51
+ */
52
+ olHost: 'https://openlibrary.org',
53
+
54
+ /**
55
+ * @deprecated
56
+ * Old name for internetArchiveId
57
+ * @type {import('@/src/util/strings.js').StringWithVars}
58
+ */
59
+ bookId: '{{bookId}}',
60
+ }
61
+
62
+ /** @type {TocEntry[]} */
63
+ _tocEntries;
6
64
 
7
- jQuery.extend(BookReader.defaultOptions, {
8
- olHost: 'https://openlibrary.org',
9
- enableChaptersPlugin: true,
10
- bookId: '',
11
- });
12
-
13
- /** @override Extend the constructor to add search properties */
14
- BookReader.prototype.setup = (function (super_) {
15
- return function (options) {
16
- super_.call(this, options);
17
-
18
- this.olHost = options.olHost;
19
- this.enableChaptersPlugin = options.enableChaptersPlugin;
20
- this.bookId = options.bookId;
21
- };
22
- })(BookReader.prototype.setup);
23
-
24
- /** @override Extend to call Open Library for TOC */
25
- BookReader.prototype.init = (function(super_) {
26
- return function() {
27
- super_.call(this);
28
- if (this.enableChaptersPlugin && this.ui !== 'embed') {
29
- this.getOpenLibraryRecord();
65
+ /** @type {BRChaptersPanel} */
66
+ _chaptersPanel;
67
+
68
+ /** @override */
69
+ setup(options) {
70
+ super.setup(options);
71
+ this.options.internetArchiveId = this.options.internetArchiveId || this.options.bookId;
72
+ this.options.openLibraryHost = this.options.openLibraryHost || this.options.olHost;
73
+ }
74
+
75
+ /** @override Extend to call Open Library for TOC */
76
+ async init() {
77
+ if (!this.options.enabled || this.br.ui === 'embed') {
78
+ return;
30
79
  }
31
- if (this.enableMobileNav) {
32
- this.bind(BookReader.eventNames.mobileNavOpen,
33
- () => {
34
- this.updateTOCState(this.firstIndex, this._tocEntries);
35
- if ($('table-contents-list').parent().hasClass('mm-opened')) {
36
- this.updateTOCState(this.firstIndex, this._tocEntries);
37
- }
38
- }
39
- );
40
- $(".BRmobileMenu__tableContents").click(
41
- () => {
42
- this.updateTOCState(this.firstIndex, this._tocEntries);
43
- }
44
- );
80
+
81
+ let rawTableOfContents = null;
82
+ // Prefer explicit TOC if specified
83
+ if (this.br.options.table_of_contents?.length) {
84
+ rawTableOfContents = this.br.options.table_of_contents;
85
+ } else {
86
+ // Otherwise fetch from OL
87
+ const olEdition = await this.getOpenLibraryRecord();
88
+ if (olEdition?.table_of_contents?.length) {
89
+ rawTableOfContents = olEdition.table_of_contents;
90
+ }
45
91
  }
46
- };
47
- })(BookReader.prototype.init);
48
92
 
49
- /**
50
- * Adds chapter marker to navigation scrubber
51
- *
52
- * @param {string} chapterTitle
53
- * @param {string} pageNumber
54
- * @param {number} pageIndex
55
- */
56
- BookReader.prototype.addChapter = function(chapterTitle, pageNumber, pageIndex) {
57
- const uiStringPage = 'Page'; // i18n
58
- const percentThrough = BookReader.util.cssPercentage(pageIndex, this.getNumLeafs() - 1);
59
- const jumpToChapter = (event) => {
60
- this.jumpToIndex($(event.delegateTarget).data('pageIndex'));
61
- $('.current-chapter').removeClass('current-chapter');
62
- $(event.delegateTarget).addClass('current-chapter');
63
- };
64
- const title = `${chapterTitle} | `;
65
- const pageStr = `${uiStringPage} ${pageNumber}`;
66
-
67
- //adding items to mobile table of contents
68
- const mobileChapter = $(`<li></li>`).append($(`<span class='BRTOCElementTitle'></span>`).text(title))
69
- .append($(`<span class='BRTOCElementPage'></span>`).text(pageStr));
70
- mobileChapter.addClass('BRtable-contents-el')
71
- .appendTo(this.$('.table-contents-list'))
72
- .data({ pageIndex });
73
-
74
- //adds .BRchapters to the slider only if pageIndex exists
75
- if (pageIndex != undefined) {
93
+ if (rawTableOfContents) {
94
+ this._tocEntries = rawTableOfContents
95
+ .map(rawTOCEntry => (Object.assign({}, rawTOCEntry, {
96
+ pageIndex: (
97
+ typeof(rawTOCEntry.leaf) == 'number' ? this.br.book.leafNumToIndex(rawTOCEntry.leaf) :
98
+ rawTOCEntry.pagenum ? this.br.book.getPageIndex(rawTOCEntry.pagenum) :
99
+ undefined
100
+ ),
101
+ })));
102
+ this._render();
103
+ this.br.bind(BookReader.eventNames.pageChanged, () => this._updateCurrent());
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Update the table of contents based on array of TOC entries.
109
+ */
110
+ _render() {
111
+ this.br.shell.menuProviders['chapters'] = {
112
+ id: 'chapters',
113
+ icon: html`<ia-icon-toc style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon-toc>`,
114
+ label: 'Table of Contents',
115
+ component: html`<br-chapters-panel
116
+ .contents="${this._tocEntries}"
117
+ .jumpToPage="${(pageIndex) => {
118
+ this._updateCurrent(pageIndex);
119
+ this.br.jumpToIndex(pageIndex);
120
+ }}"
121
+ @connected="${(e) => {
122
+ this._chaptersPanel = e.target;
123
+ this._updateCurrent();
124
+ }}"
125
+ />`,
126
+ };
127
+ this.br.shell.addMenuShortcut('chapters');
128
+ this.br.shell.updateMenuContents();
129
+ this._tocEntries.forEach((tocEntry, i) => this._renderMarker(tocEntry, i));
130
+ }
131
+
132
+ /**
133
+ * @param {TocEntry} tocEntry
134
+ * @param {number} entryIndex
135
+ */
136
+ _renderMarker(tocEntry, entryIndex) {
137
+ if (tocEntry.pageIndex == undefined) return;
138
+
139
+ //creates a string with non-void tocEntry.label and tocEntry.title
140
+ const chapterStr = [tocEntry.label, tocEntry.title]
141
+ .filter(x => x)
142
+ .join(' ') || `Chapter ${entryIndex + 1}`;
143
+
144
+ const percentThrough = BookReader.util.cssPercentage(tocEntry.pageIndex, this.br.book.getNumLeafs() - 1);
76
145
  $(`<div></div>`)
77
- .append($('<div />').text(title + pageStr))
146
+ .append(
147
+ $('<div />')
148
+ .text(chapterStr)
149
+ .append(
150
+ $('<div class="BRchapterPage" />')
151
+ .text(this.br.book.getPageName(tocEntry.pageIndex)),
152
+ ),
153
+ )
78
154
  .addClass('BRchapter')
79
155
  .css({ left: percentThrough })
80
- .appendTo(this.$('.BRnavline'))
81
- .data({ pageIndex })
82
- .hover(event => {
156
+ .appendTo(this.br.$('.BRnavline'))
157
+ .on("mouseenter", event => {
83
158
  // remove hover effect from other markers then turn on just for this
84
159
  const marker = event.currentTarget;
85
160
  const tooltip = marker.querySelector('div');
@@ -89,163 +164,197 @@ BookReader.prototype.addChapter = function(chapterTitle, pageNumber, pageIndex)
89
164
  if (tooltipOffset.x - boxSizeAdjust < 0) {
90
165
  tooltip.style.setProperty('transform', `translateX(-${targetOffset.left - boxSizeAdjust}px)`);
91
166
  }
92
- this.$('.BRsearch,.BRchapter').removeClass('front');
167
+ this.br.$('.BRsearch,.BRchapter').removeClass('front');
93
168
  $(event.target).addClass('front');
94
- },
95
- event => $(event.target).removeClass('front')
96
- )
97
- .on('click', jumpToChapter);
169
+ })
170
+ .on("mouseleave", event => $(event.target).removeClass('front'))
171
+ .on('click', () => {
172
+ this._updateCurrent(tocEntry.pageIndex);
173
+ this.br.jumpToIndex(tocEntry.pageIndex);
174
+ });
98
175
 
99
- //adding clickable properties to mobile chapters
100
- mobileChapter.bind('click', jumpToChapter)
101
- .addClass('chapter-clickable')
102
- .attr("data-event-click-tracking","BRTOCPanel|GoToChapter");
176
+ this.br.$('.BRchapter, .BRsearch').each((i, el) => {
177
+ const $el = $(el);
178
+ $el
179
+ .on("mouseenter", () => $el.addClass('front'))
180
+ .on("mouseleave", () => $el.removeClass('front'));
181
+ });
103
182
  }
104
183
 
105
- };
184
+ /**
185
+ * This makes a call to OL API and calls the given callback function with the
186
+ * response from the API.
187
+ */
188
+ async getOpenLibraryRecord() {
189
+ const olHost = applyVariables(this.options.openLibraryHost, this.br.options.vars);
106
190
 
107
- /*
108
- * Remove all chapters.
109
- */
110
- BookReader.prototype.removeChapters = function() {
111
- this.$('.BRnavpos .BRchapter').remove();
112
- };
191
+ if (this.options.openLibraryId) {
192
+ const openLibraryId = applyVariables(this.options.openLibraryId, this.br.options.vars);
193
+ return await $.ajax({ url: `${olHost}/books/${openLibraryId}.json` });
194
+ }
113
195
 
114
- /**
115
- * Update the table of contents based on array of TOC entries.
116
- * @param {TocEntry[]} tocEntries
117
- */
118
- BookReader.prototype.updateTOC = function(tocEntries) {
119
- this.removeChapters();
120
- if (this.enableMobileNav && tocEntries.length > 0) {
121
- this.$(".BRmobileMenu__tableContents").show();
196
+ if (this.options.internetArchiveId) {
197
+ const ocaid = applyVariables(this.options.internetArchiveId, this.br.options.vars);
198
+
199
+ // Try looking up by ocaid first, then by source_record
200
+ const baseQueryUrl = `${olHost}/query.json?type=/type/edition&*=&`;
201
+
202
+ let data = await $.ajax({
203
+ url: baseQueryUrl + new URLSearchParams({ ocaid, limit: '1' }),
204
+ });
205
+
206
+ if (!data || !data.length) {
207
+ // try source_records
208
+ data = await $.ajax({
209
+ url: baseQueryUrl + new URLSearchParams({ source_records: `ia:${ocaid}`, limit: '1' }),
210
+ });
211
+ }
212
+
213
+ return data?.[0];
214
+ }
215
+
216
+ return null;
122
217
  }
123
- for (let i = 0; i < tocEntries.length; i++) {
124
- this.addChapterFromEntry(tocEntries[i]);
218
+
219
+ /**
220
+ * @private
221
+ * Highlights the current chapter based on current page
222
+ * @param {PageIndex} curIndex
223
+ */
224
+ _updateCurrent(
225
+ curIndex = (this.br.mode == 2 ? Math.max(...this.br.displayedIndices) : this.br.firstIndex),
226
+ ) {
227
+ const tocEntriesIndexed = this._tocEntries.filter((el) => el.pageIndex != undefined).reverse();
228
+ const currChapter = tocEntriesIndexed[
229
+ // subtract one so that 2up shows the right label
230
+ tocEntriesIndexed.findIndex((chapter) => chapter.pageIndex <= curIndex)
231
+ ];
232
+ if (this._chaptersPanel) {
233
+ this._chaptersPanel.currentChapter = currChapter;
234
+ }
125
235
  }
126
- this._tocEntries = tocEntries;
127
- $('.table-contents-list').children().each((i, el) => {
128
- tocEntries[i].mobileHTML = el;
129
- });
130
- };
236
+ }
237
+ BookReader?.registerPlugin('chapters', ChaptersPlugin);
131
238
 
132
239
  /**
133
240
  * @typedef {Object} TocEntry
134
- * Table of contents entry as defined -- format is defined by Open Library
135
- * @property {string} pagenum
136
- * @property {number} level
137
- * @property {string} label
138
- * @property {{type: '/type/toc_item'}} type
139
- * @property {string} title
140
- * @property {HTMLElement} mobileHTML
141
- * @property {number} pageIndex
142
-
241
+ * Table of contents entry as defined by Open Library, with some extra values for internal use
242
+ * @property {number} [level]
243
+ * @property {string} [label]
244
+ * @property {string} [title]
245
+ * @property {PageString} [pagenum]
246
+ * @property {LeafNum} [leaf]
247
+ * @property {number} [pageIndex] - Added
143
248
  *
144
249
  * @example {
145
250
  * "pagenum": "17",
146
251
  * "level": 1,
147
252
  * "label": "CHAPTER I",
148
- * "type": {"key": "/type/toc_item"},
149
253
  * "title": "THE COUNTRY AND THE MISSION"
150
254
  * }
151
255
  */
152
256
 
153
- /**
154
- * @param {TocEntry} tocEntryObject
155
- */
156
- BookReader.prototype.addChapterFromEntry = function(tocEntryObject) {
157
- tocEntryObject.pageIndex = this.getPageIndex(tocEntryObject['pagenum']);
158
- //creates a string with non-void tocEntryObject.label and tocEntryObject.title
159
- const chapterStr = [tocEntryObject.label, tocEntryObject.title]
160
- .filter(x => x)
161
- .join(' ');
162
- this.addChapter(chapterStr, tocEntryObject['pagenum'], tocEntryObject.pageIndex);
163
- this.$('.BRchapter, .BRsearch').each((i, el) => {
164
- const $el = $(el);
165
- $el.hover(
166
- () => $el.addClass('front'),
167
- () => $el.removeClass('front'));
168
- });
169
- };
257
+ @customElement('br-chapters-panel')
258
+ export class BRChaptersPanel extends LitElement {
259
+ /** @type {TocEntry[]} */
260
+ @property({ type: Array })
261
+ contents = [];
170
262
 
171
- /**
172
- * getOpenLibraryRecord
173
- *
174
- * The bookreader is designed to call openlibrary API and constructs the
175
- * "Return book" button using the response.
176
- *
177
- * This makes a call to OL API and calls the given callback function with the
178
- * response from the API.
179
- */
180
- BookReader.prototype.getOpenLibraryRecord = function () {
181
- // Try looking up by ocaid first, then by source_record
182
- const baseURL = `${this.olHost}/query.json?type=/type/edition&*=`;
183
- const fetchUrlByBookId = `${baseURL}&ocaid=${this.bookId}`;
184
-
185
- /*
186
- * Update Chapter markers based on received record from Open Library.
187
- * Notes that Open Library record is used for extra metadata, and also for lending
188
- */
189
- const setUpChapterMarkers = (olObject) => {
190
- if (olObject && olObject.table_of_contents) {
191
- // XXX check here that TOC is valid
192
- this.updateTOC(olObject.table_of_contents);
263
+ /** @type {TocEntry?} */
264
+ @property({ type: Object })
265
+ currentChapter = {};
266
+
267
+ /** @type {(pageIndex: PageIndex) => void} */
268
+ jumpToPage = () => {};
269
+
270
+ /**
271
+ * @param {TocEntry[]} contents
272
+ */
273
+ constructor(contents) {
274
+ super();
275
+ this.contents = contents;
276
+ }
277
+
278
+ render() {
279
+ return html`
280
+ <ol>
281
+ ${this.contents.map(tocEntry => this.renderTOCEntry(tocEntry))}
282
+ </ol>
283
+ `;
284
+ }
285
+
286
+ /**
287
+ * @param {TocEntry} tocEntry
288
+ */
289
+ renderTOCEntry(tocEntry) {
290
+ const chapterTitle = [tocEntry.label, tocEntry.title]
291
+ .filter(x => x)
292
+ .join(' ');
293
+ const clickable = tocEntry.pageIndex != undefined;
294
+ // note the click-tracking won't work...
295
+ return html`
296
+ <li
297
+ class="
298
+ BRtable-contents-el
299
+ ${clickable ? 'clickable' : ''}
300
+ ${tocEntry == this.currentChapter ? 'current' : ''}
301
+ "
302
+ style="${styleMap({marginLeft: (tocEntry.level - 1) * 10 + 'px'})}"
303
+ data-event-click-tracking="${ifDefined(clickable ? "BRTOCPanel|GoToChapter" : undefined)}"
304
+ @click="${() => this.jumpToPage(tocEntry.pageIndex)}"
305
+ >
306
+ ${chapterTitle}
307
+ ${tocEntry.pagenum ? html`
308
+ <br />
309
+ <span class="BRTOCElementPage">Page ${tocEntry.pagenum}</span>
310
+ ` : nothing}
311
+ </li>`;
312
+ }
313
+
314
+ connectedCallback() {
315
+ super.connectedCallback();
316
+ this.dispatchEvent(new CustomEvent('connected'));
317
+ }
318
+
319
+ updated(changedProperties) {
320
+ if (changedProperties.has('currentChapter')) {
321
+ this.shadowRoot.querySelector('li.current')?.scrollIntoView({
322
+ block: 'nearest',
323
+ behavior: 'smooth',
324
+ });
193
325
  }
194
- };
195
-
196
- $.ajax({ url: fetchUrlByBookId, dataType: 'jsonp' })
197
- .then(data => {
198
- if (data && data.length > 0) {
199
- return data;
200
- } else {
201
- // try sourceid
202
- return $.ajax({ url: `${baseURL}&source_records=ia:${this.bookId}`, dataType: 'jsonp' });
326
+ }
327
+
328
+ static get styles() {
329
+ return css`
330
+ ol {
331
+ padding: 0;
332
+ margin: 0;
333
+ margin-right: 5px;
203
334
  }
204
- })
205
- .then(data => {
206
- if (data && data.length > 0) {
207
- setUpChapterMarkers(data[0]);
335
+ li {
336
+ padding: 10px;
337
+ overflow: hidden;
338
+ border-radius: 4px;
339
+ }
340
+ li.clickable {
341
+ font-weight: normal;
342
+ cursor: pointer;
343
+ transition: background-color 0.2s;
208
344
  }
209
- });
210
- };
211
-
212
- // Extend buildMobileDrawerElement with table of contents list
213
- BookReader.prototype.buildMobileDrawerElement = (function (super_) {
214
- return function () {
215
- const $el = super_.call(this);
216
- if (this.enableMobileNav && this.options.enableChaptersPlugin) {
217
- $el.find('.BRmobileMenu__moreInfoRow').after($(`
218
- <li class="BRmobileMenu__tableContents" data-event-click-tracking="BRSidebar|TOCPanel">
219
- <span>
220
- <span class="DrawerIconWrapper">
221
- <img class="DrawerIcon" src="${this.imagesBaseURL}icon_toc.svg" alt="toc-icon"/>
222
- </span>
223
- Table of Contents
224
- </span>
225
- <div>
226
- <ol class="table-contents-list">
227
- </ol>
228
- </div>
229
- </li>`).hide());
230
- }
231
- return $el;
232
- };
233
- })(BookReader.prototype.buildMobileDrawerElement);
234
345
 
235
- /**
236
- * highlights the current chapter based on current page
237
- * @private
238
- * @param {TocEntry[]} tocEntries
239
- * @param {number} tocEntries
240
- */
241
- BookReader.prototype.updateTOCState = function(currIndex, tocEntries) {
242
- //this function won't have any effects if called before OpenLibrary request is finished
243
- if (!tocEntries) {return;}
244
- $('.current-chapter').removeClass('current-chapter');
245
- const tocEntriesIndexed = tocEntries.filter((el) => el.pageIndex != undefined).reverse();
246
- const currChapter = tocEntriesIndexed[tocEntriesIndexed.findIndex(
247
- (el) => el.pageIndex <= currIndex)];
248
- if (currChapter != undefined) {
249
- $(currChapter.mobileHTML).addClass('current-chapter');
346
+ li.clickable:not(.current):hover {
347
+ background-color: rgba(255,255,255, 0.05);
348
+ }
349
+
350
+ li.current {
351
+ background-color: rgba(255,255,255,0.9);
352
+ color: #333;
353
+ }
354
+
355
+ .BRTOCElementPage {
356
+ font-size: 0.85em;
357
+ opacity: .8;
358
+ }`;
250
359
  }
251
- };
360
+ }