@internetarchive/bookreader 5.0.0-95 → 5.0.0-96

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 (305) hide show
  1. package/BookReader/BookReader.css +2251 -0
  2. package/BookReader/BookReader.js +3 -0
  3. package/BookReader/BookReader.js.LICENSE.txt +72 -0
  4. package/BookReader/BookReader.js.map +1 -0
  5. package/BookReader/hypothesis/LICENSE +50 -0
  6. package/BookReader/hypothesis/README.md +55 -0
  7. package/BookReader/hypothesis/build/boot.js +1 -0
  8. package/BookReader/hypothesis/build/manifest.json +20 -0
  9. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
  10. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  11. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
  12. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  13. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
  14. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
  16. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  17. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  18. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  19. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  20. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  38. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  39. package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
  40. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  41. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
  42. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
  44. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
  46. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  47. package/BookReader/hypothesis/package.json +126 -0
  48. package/BookReader/ia-bookreader-bundle.js +1782 -0
  49. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  50. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  51. package/BookReader/icons/1up.svg +1 -0
  52. package/BookReader/icons/2up.svg +1 -0
  53. package/BookReader/icons/advance.svg +3 -0
  54. package/BookReader/icons/chevron-right.svg +1 -0
  55. package/BookReader/icons/close-circle-dark.svg +1 -0
  56. package/BookReader/icons/close-circle.svg +1 -0
  57. package/BookReader/icons/fullscreen.svg +1 -0
  58. package/BookReader/icons/fullscreen_exit.svg +1 -0
  59. package/BookReader/icons/hamburger.svg +1 -0
  60. package/BookReader/icons/left-arrow.svg +1 -0
  61. package/BookReader/icons/magnify-minus.svg +1 -0
  62. package/BookReader/icons/magnify-plus.svg +1 -0
  63. package/BookReader/icons/magnify.svg +1 -0
  64. package/BookReader/icons/pause.svg +1 -0
  65. package/BookReader/icons/play.svg +1 -0
  66. package/BookReader/icons/playback-speed.svg +1 -0
  67. package/BookReader/icons/read-aloud.svg +1 -0
  68. package/BookReader/icons/review.svg +3 -0
  69. package/BookReader/icons/thumbnails.svg +1 -0
  70. package/BookReader/icons/voice.svg +1 -0
  71. package/BookReader/icons/volume-full.svg +1 -0
  72. package/BookReader/images/BRicons.png +0 -0
  73. package/BookReader/images/BRicons.svg +5 -0
  74. package/BookReader/images/BRicons_ia.png +0 -0
  75. package/BookReader/images/back_pages.png +0 -0
  76. package/BookReader/images/book_bottom_icon.png +0 -0
  77. package/BookReader/images/book_down_icon.png +0 -0
  78. package/BookReader/images/book_left_icon.png +0 -0
  79. package/BookReader/images/book_leftmost_icon.png +0 -0
  80. package/BookReader/images/book_right_icon.png +0 -0
  81. package/BookReader/images/book_rightmost_icon.png +0 -0
  82. package/BookReader/images/book_top_icon.png +0 -0
  83. package/BookReader/images/book_up_icon.png +0 -0
  84. package/BookReader/images/books_graphic.svg +1 -0
  85. package/BookReader/images/booksplit.png +0 -0
  86. package/BookReader/images/control_pause_icon.png +0 -0
  87. package/BookReader/images/control_play_icon.png +0 -0
  88. package/BookReader/images/embed_icon.png +0 -0
  89. package/BookReader/images/hypothesis.ico +0 -0
  90. package/BookReader/images/icon-home-ia.png +0 -0
  91. package/BookReader/images/icon_OL-logo-xs.png +0 -0
  92. package/BookReader/images/icon_alert-xs.png +0 -0
  93. package/BookReader/images/icon_book.svg +1 -0
  94. package/BookReader/images/icon_bookmark.svg +1 -0
  95. package/BookReader/images/icon_close-pop.png +0 -0
  96. package/BookReader/images/icon_download.png +0 -0
  97. package/BookReader/images/icon_gear.svg +1 -0
  98. package/BookReader/images/icon_hamburger.svg +1 -0
  99. package/BookReader/images/icon_home.png +0 -0
  100. package/BookReader/images/icon_home.svg +1 -0
  101. package/BookReader/images/icon_home_ia.png +0 -0
  102. package/BookReader/images/icon_indicator.png +0 -0
  103. package/BookReader/images/icon_info.svg +1 -0
  104. package/BookReader/images/icon_one_page.svg +1 -0
  105. package/BookReader/images/icon_pause.svg +1 -0
  106. package/BookReader/images/icon_play.svg +1 -0
  107. package/BookReader/images/icon_playback-rate.svg +1 -0
  108. package/BookReader/images/icon_return.png +0 -0
  109. package/BookReader/images/icon_search_button.svg +1 -0
  110. package/BookReader/images/icon_share.svg +1 -0
  111. package/BookReader/images/icon_skip-ahead.svg +1 -0
  112. package/BookReader/images/icon_skip-back.svg +2 -0
  113. package/BookReader/images/icon_speaker.svg +1 -0
  114. package/BookReader/images/icon_speaker_open.svg +1 -0
  115. package/BookReader/images/icon_thumbnails.svg +1 -0
  116. package/BookReader/images/icon_toc.svg +1 -0
  117. package/BookReader/images/icon_two_pages.svg +1 -0
  118. package/BookReader/images/icon_zoomer.png +0 -0
  119. package/BookReader/images/loading.gif +0 -0
  120. package/BookReader/images/logo_icon.png +0 -0
  121. package/BookReader/images/marker_chap-off.png +0 -0
  122. package/BookReader/images/marker_chap-off.svg +1 -0
  123. package/BookReader/images/marker_chap-off_ia.png +0 -0
  124. package/BookReader/images/marker_chap-on.png +0 -0
  125. package/BookReader/images/marker_chap-on.svg +1 -0
  126. package/BookReader/images/marker_srch-on.svg +1 -0
  127. package/BookReader/images/marker_srchchap-off.png +0 -0
  128. package/BookReader/images/marker_srchchap-on.png +0 -0
  129. package/BookReader/images/nav_control-dn.png +0 -0
  130. package/BookReader/images/nav_control-dn_ia.png +0 -0
  131. package/BookReader/images/nav_control-up.png +0 -0
  132. package/BookReader/images/nav_control-up_ia.png +0 -0
  133. package/BookReader/images/nav_control.png +0 -0
  134. package/BookReader/images/one_page_mode_icon.png +0 -0
  135. package/BookReader/images/paper-badge.png +0 -0
  136. package/BookReader/images/print_icon.png +0 -0
  137. package/BookReader/images/progressbar.gif +0 -0
  138. package/BookReader/images/right_edges.png +0 -0
  139. package/BookReader/images/slider.png +0 -0
  140. package/BookReader/images/slider_ia.png +0 -0
  141. package/BookReader/images/thumbnail_mode_icon.png +0 -0
  142. package/BookReader/images/transparent.png +0 -0
  143. package/BookReader/images/two_page_mode_icon.png +0 -0
  144. package/BookReader/images/unviewable_page.png +0 -0
  145. package/BookReader/images/zoom_in_icon.png +0 -0
  146. package/BookReader/images/zoom_out_icon.png +0 -0
  147. package/BookReader/jquery-3.js +2 -0
  148. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  149. package/BookReader/plugins/plugin.archive_analytics.js +2 -0
  150. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -0
  151. package/BookReader/plugins/plugin.autoplay.js +2 -0
  152. package/BookReader/plugins/plugin.autoplay.js.map +1 -0
  153. package/BookReader/plugins/plugin.chapters.js +26 -0
  154. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  155. package/BookReader/plugins/plugin.chapters.js.map +1 -0
  156. package/BookReader/plugins/plugin.experiments.js +3 -0
  157. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  158. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  159. package/BookReader/plugins/plugin.iframe.js +2 -0
  160. package/BookReader/plugins/plugin.iframe.js.map +1 -0
  161. package/BookReader/plugins/plugin.iiif.js +2 -0
  162. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  163. package/BookReader/plugins/plugin.resume.js +2 -0
  164. package/BookReader/plugins/plugin.resume.js.map +1 -0
  165. package/BookReader/plugins/plugin.search.js +3 -0
  166. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  167. package/BookReader/plugins/plugin.search.js.map +1 -0
  168. package/BookReader/plugins/plugin.text_selection.js +3 -0
  169. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  170. package/BookReader/plugins/plugin.text_selection.js.map +1 -0
  171. package/BookReader/plugins/plugin.tts.js +3 -0
  172. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +29 -0
  173. package/BookReader/plugins/plugin.tts.js.map +1 -0
  174. package/BookReader/plugins/plugin.url.js +2 -0
  175. package/BookReader/plugins/plugin.url.js.map +1 -0
  176. package/BookReader/plugins/plugin.vendor-fullscreen.js +2 -0
  177. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -0
  178. package/BookReader/webcomponents-bundle.js +3 -0
  179. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  180. package/BookReader/webcomponents-bundle.js.map +1 -0
  181. package/package.json +6 -1
  182. package/src/BookReader/BookModel.js +564 -0
  183. package/src/BookReader/DragScrollable.js +233 -0
  184. package/src/BookReader/ImageCache.js +149 -0
  185. package/src/BookReader/Mode1Up.js +110 -0
  186. package/src/BookReader/Mode1UpLit.js +388 -0
  187. package/src/BookReader/Mode2Up.js +107 -0
  188. package/src/BookReader/Mode2UpLit.js +777 -0
  189. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  190. package/src/BookReader/ModeSmoothZoom.js +312 -0
  191. package/src/BookReader/ModeThumb.js +344 -0
  192. package/src/BookReader/Navbar/Navbar.js +355 -0
  193. package/src/BookReader/PageContainer.js +172 -0
  194. package/src/BookReader/ReduceSet.js +26 -0
  195. package/src/BookReader/Toolbar/Toolbar.js +362 -0
  196. package/src/BookReader/events.js +19 -0
  197. package/src/BookReader/options.js +387 -0
  198. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  199. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  200. package/src/BookReader/utils/SelectionObserver.js +45 -0
  201. package/src/BookReader/utils/classes.js +36 -0
  202. package/src/BookReader/utils.js +313 -0
  203. package/.eslintrc.cjs +0 -51
  204. package/.gitattributes +0 -2
  205. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  206. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  207. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  208. package/.github/workflows/node.js.yml +0 -102
  209. package/.github/workflows/npm-publish.yml +0 -23
  210. package/.testcaferc.cjs +0 -10
  211. package/BookReaderDemo/BookReaderDemo.css +0 -40
  212. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -112
  213. package/BookReaderDemo/BookReaderJSSimple.js +0 -56
  214. package/BookReaderDemo/IADemoBr.js +0 -149
  215. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  216. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  217. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  218. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  219. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  220. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  221. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  222. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  223. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  224. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  225. package/BookReaderDemo/demo-advanced.html +0 -33
  226. package/BookReaderDemo/demo-embed-iframe-src.html +0 -85
  227. package/BookReaderDemo/demo-embed.html +0 -26
  228. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -34
  229. package/BookReaderDemo/demo-fullscreen.html +0 -31
  230. package/BookReaderDemo/demo-iiif.html +0 -121
  231. package/BookReaderDemo/demo-internetarchive.html +0 -271
  232. package/BookReaderDemo/demo-multiple.html +0 -44
  233. package/BookReaderDemo/demo-preview-pages.html +0 -1093
  234. package/BookReaderDemo/demo-simple.html +0 -35
  235. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -34
  236. package/BookReaderDemo/ia-multiple-volumes-manifest.js +0 -169
  237. package/BookReaderDemo/immersion-1up.html +0 -64
  238. package/BookReaderDemo/immersion-mode.html +0 -33
  239. package/BookReaderDemo/toggle_controls.html +0 -54
  240. package/BookReaderDemo/view_mode.html +0 -40
  241. package/BookReaderDemo/viewmode-cycle.html +0 -40
  242. package/CHANGELOG.md +0 -1087
  243. package/CONTRIBUTING.md +0 -7
  244. package/babel.config.cjs +0 -20
  245. package/codecov.yml +0 -23
  246. package/index.html +0 -34
  247. package/netlify.toml +0 -9
  248. package/renovate.json +0 -52
  249. package/screenshot.png +0 -0
  250. package/scripts/postversion.js +0 -11
  251. package/scripts/preversion.js +0 -15
  252. package/scripts/version.js +0 -24
  253. package/tests/e2e/README.md +0 -112
  254. package/tests/e2e/autoplay.test.js +0 -16
  255. package/tests/e2e/base.test.js +0 -27
  256. package/tests/e2e/helpers/base.js +0 -263
  257. package/tests/e2e/helpers/debug.js +0 -13
  258. package/tests/e2e/helpers/mockSearch.js +0 -90
  259. package/tests/e2e/helpers/params.js +0 -17
  260. package/tests/e2e/helpers/rightToLeft.js +0 -23
  261. package/tests/e2e/helpers/search.js +0 -73
  262. package/tests/e2e/models/BookReader.js +0 -11
  263. package/tests/e2e/models/Navigation.js +0 -39
  264. package/tests/e2e/rightToLeft.test.js +0 -19
  265. package/tests/e2e/viewmode.test.js +0 -44
  266. package/tests/jest/BookNavigator/book-navigator.test.js +0 -653
  267. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +0 -43
  268. package/tests/jest/BookNavigator/bookmarks/bookmark-edit.test.js +0 -132
  269. package/tests/jest/BookNavigator/bookmarks/bookmarks-list.test.js +0 -221
  270. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +0 -45
  271. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +0 -67
  272. package/tests/jest/BookNavigator/downloads/downloads.test.js +0 -53
  273. package/tests/jest/BookNavigator/search/search-provider.test.js +0 -179
  274. package/tests/jest/BookNavigator/search/search-results.test.js +0 -289
  275. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +0 -49
  276. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +0 -80
  277. package/tests/jest/BookNavigator/visual-adjustments.test.js +0 -200
  278. package/tests/jest/BookReader.keyboard.test.js +0 -190
  279. package/tests/jest/BookReader.options.test.js +0 -47
  280. package/tests/jest/BookReader.test.js +0 -316
  281. package/tests/jest/plugins/plugin.archive_analytics.test.js +0 -20
  282. package/tests/jest/plugins/plugin.autoplay.test.js +0 -35
  283. package/tests/jest/plugins/plugin.chapters.test.js +0 -193
  284. package/tests/jest/plugins/plugin.iframe.test.js +0 -42
  285. package/tests/jest/plugins/plugin.resume.test.js +0 -85
  286. package/tests/jest/plugins/plugin.text_selection.test.js +0 -447
  287. package/tests/jest/plugins/plugin.vendor-fullscreen.test.js +0 -65
  288. package/tests/jest/plugins/search/plugin.search.test.js +0 -120
  289. package/tests/jest/plugins/search/plugin.search.view.test.js +0 -131
  290. package/tests/jest/plugins/search/utils.js +0 -25
  291. package/tests/jest/plugins/search/utils.test.js +0 -29
  292. package/tests/jest/plugins/tts/AbstractTTSEngine.test.js +0 -173
  293. package/tests/jest/plugins/tts/FestivalTTSEngine.test.js +0 -59
  294. package/tests/jest/plugins/tts/PageChunk.test.js +0 -57
  295. package/tests/jest/plugins/tts/PageChunkIterator.test.js +0 -179
  296. package/tests/jest/plugins/tts/WebTTSEngine.test.js +0 -178
  297. package/tests/jest/plugins/tts/utils.test.js +0 -74
  298. package/tests/jest/plugins/url/UrlPlugin.test.js +0 -198
  299. package/tests/jest/plugins/url/plugin.url.test.js +0 -168
  300. package/tests/jest/setup.js +0 -3
  301. package/tests/jest/util/browserSniffing.test.js +0 -62
  302. package/tests/jest/util/docCookies.test.js +0 -24
  303. package/tests/jest/util/strings.test.js +0 -63
  304. package/tests/jest/utils.js +0 -83
  305. package/webpack.config.js +0 -97
@@ -0,0 +1,362 @@
1
+ import 'jquery-colorbox';
2
+ import { escapeHTML } from '../utils.js';
3
+ import { EVENTS } from '../events.js';
4
+ /** @typedef {import("../../BookReader.js").default} BookReader */
5
+
6
+ export class Toolbar {
7
+ /**
8
+ * @param {BookReader} br
9
+ */
10
+ constructor(br) {
11
+ this.br = br;
12
+ }
13
+
14
+ /**
15
+ * This method builds the html for the toolbar. It can be decorated to extend
16
+ * the toolbar.
17
+ * @return {JQuery}
18
+ */
19
+ buildToolbarElement() {
20
+ const { br } = this;
21
+ const logoHtml = !br.showLogo ? '' : `
22
+ <span class="BRtoolbarSection BRtoolbarSectionLogo">
23
+ <a class="logo" href="${br.logoURL}"></a>
24
+ </span>`;
25
+
26
+ // Add large screen navigation
27
+ br.refs.$BRtoolbar = $(`
28
+ <div class="BRtoolbar header">
29
+ <div class="BRtoolbarbuttons">
30
+ <div class="BRtoolbarLeft">
31
+ ${logoHtml}
32
+ <span class="BRtoolbarSection BRtoolbarSectionTitle"></span>
33
+ </div>
34
+ <div class="BRtoolbarRight">
35
+ <span class="BRtoolbarSection BRtoolbarSectionInfo">
36
+ <button class="BRpill info js-tooltip">Info</button>
37
+ <button class="BRpill share js-tooltip">Share</button>
38
+ </span>
39
+ </div>
40
+ </div>
41
+ </div>`);
42
+ // TODO actual hamburger menu
43
+ // <span class="BRtoolbarSection BRtoolbarSectionMenu">
44
+ // <button class="BRpill BRtoolbarHamburger">
45
+ // <img src="${br.imagesBaseURL}icon_hamburger.svg" />
46
+ // <div class="BRhamburgerDrawer"><ul><li>hi</li></ul></div>
47
+ // </button>
48
+ // </span>
49
+
50
+ const $titleSectionEl = br.refs.$BRtoolbar.find('.BRtoolbarSectionTitle');
51
+ if (br.bookUrl && br.options.enableBookTitleLink) {
52
+ $titleSectionEl.append(
53
+ $('<a>')
54
+ .attr({href: br.bookUrl, title: br.bookUrlTitle})
55
+ .addClass('BRreturn')
56
+ .html(br.bookUrlText || br.bookTitle),
57
+ );
58
+ } else if (br.bookTitle) {
59
+ $titleSectionEl.append(br.bookUrlText || br.bookTitle);
60
+ }
61
+
62
+ // Call _bindNavigationHandlers on the plugins
63
+ for (const plugin of Object.values(br.plugins)) {
64
+ plugin._configureToolbar(br.refs.$BRtoolbar);
65
+ }
66
+
67
+ // const $hamburger = br.refs.$BRtoolbar.find('BRtoolbarHamburger');
68
+ return br.refs.$BRtoolbar;
69
+ }
70
+
71
+ /**
72
+ * Initializes the toolbar (top)
73
+ * @param {string} mode
74
+ * @param {string} ui
75
+ */
76
+ initToolbar(mode, ui) {
77
+ const { br } = this;
78
+ br.refs.$br.append(this.buildToolbarElement());
79
+
80
+ br.$('.BRnavCntl').addClass('BRup');
81
+ br.$('.pause').hide();
82
+
83
+ // We build in mode 2
84
+ br.refs.$BRtoolbar.append();
85
+
86
+ // Hide mode buttons and autoplay if 2up is not available
87
+ // $$$ if we end up with more than two modes we should show the applicable buttons
88
+ if ( !br.canSwitchToMode(br.constMode2up) ) {
89
+ br.$('.two_page_mode, .play, .pause').hide();
90
+ }
91
+ if ( !br.canSwitchToMode(br.constModeThumb) ) {
92
+ br.$('.thumbnail_mode').hide();
93
+ }
94
+
95
+ // Hide one page button if it is the only mode available
96
+ if ( ! (br.canSwitchToMode(br.constMode2up) || br.canSwitchToMode(br.constModeThumb)) ) {
97
+ br.$('.one_page_mode').hide();
98
+ }
99
+
100
+ $('<div style="display: none;"></div>')
101
+ .append(blankShareDiv())
102
+ .append(blankInfoDiv())
103
+ .appendTo(br.refs.$br);
104
+
105
+ br.$('.BRinfo .BRfloatTitle a')
106
+ .attr({href: br.bookUrl})
107
+ .text(br.bookTitle)
108
+ .addClass('title');
109
+
110
+ // These functions can be overridden
111
+ this.buildInfoDiv(br.$('.BRinfo'));
112
+ this.buildShareDiv(br.$('.BRshare'));
113
+
114
+ br.$('.share').colorbox({
115
+ inline: true,
116
+ opacity: "0.5",
117
+ href: br.$('.BRshare'),
118
+ onLoad: () => {
119
+ br.trigger(EVENTS.stop);
120
+ br.$('.BRpageviewValue').val(window.location.href);
121
+ },
122
+ });
123
+ br.$('.info').colorbox({
124
+ inline: true,
125
+ opacity: "0.5",
126
+ href: br.$('.BRinfo'),
127
+ onLoad: () => {
128
+ br.trigger(EVENTS.stop);
129
+ },
130
+ });
131
+ }
132
+
133
+ /**
134
+ * @param {JQuery} $shareDiv
135
+ */
136
+ buildShareDiv($shareDiv) {
137
+ const { br } = this;
138
+ const pageView = document.location + '';
139
+ const bookView = (pageView + '').replace(/#.*/,'');
140
+
141
+ const embedHtml = !br.getEmbedCode ? '' : `
142
+ <div class="share-embed">
143
+ <p class="share-embed-prompt">Copy and paste one of these options to share this book elsewhere.</p>
144
+ <form method="post" action="">
145
+ <fieldset class="fieldset-share-pageview">
146
+ <label for="pageview">Link to this page view</label>
147
+ <input type="text" name="pageview" class="BRpageviewValue" value="${pageView}"/>
148
+ </fieldset>
149
+ <fieldset class="fieldset-share-book-link">
150
+ <label for="booklink">Link to the book</label>
151
+ <input type="text" name="booklink" class="booklink" value="${bookView}"/>
152
+ </fieldset>
153
+ <fieldset class="fieldset-embed">
154
+ <label for="iframe">Embed a mini Book Reader</label>
155
+ <fieldset class="sub">
156
+ <label class="sub">
157
+ <input type="radio" name="pages" value="${br.constMode1up}" checked="checked"/>
158
+ 1 page
159
+ </label>
160
+ <label class="sub">
161
+ <input type="radio" name="pages" value="${br.constMode2up}"/>
162
+ 2 pages
163
+ </label>
164
+ <label class="sub">
165
+ <input type="checkbox" name="thispage" value="thispage"/>
166
+ Open to this page?
167
+ </label>
168
+ </fieldset>
169
+ <textarea cols="30" rows="4" name="iframe" class="BRframeEmbed"></textarea>
170
+ </fieldset>
171
+ </form>
172
+ </div>`;
173
+
174
+ const $form = $(`
175
+ <div class="share-title">Share this book</div>
176
+ <div class="share-social">
177
+ <label class="sub open-to-this-page">
178
+ <input class="thispage-social" type="checkbox" />
179
+ Open to this page?
180
+ </label>
181
+ <div><button class="BRaction share facebook-share-button"><i class="BRicon fb" /> Facebook</button></div>
182
+ <div><button class="BRaction share twitter-share-button"><i class="BRicon twitter" /> Twitter</button></div>
183
+ <div><button class="BRaction share email-share-button"><i class="BRicon email" /> Email</button></div>
184
+ </div>
185
+ ${embedHtml}
186
+ <div class="BRfloatFoot">
187
+ <button class="share-finished" type="button" onclick="$.fn.colorbox.close();">Finished</button>
188
+ </div>`);
189
+
190
+ $form.appendTo($shareDiv);
191
+
192
+ $form.find('.fieldset-embed input').on('change', event => {
193
+ const form = $(event.target).parents('form').first();
194
+ const params = {};
195
+ params.mode = $(form.find('.fieldset-embed input[name=pages]:checked')).val();
196
+ if (form.find('.fieldset-embed input[name=thispage]').prop('checked')) {
197
+ params.page = br.book.getPageNum(br.currentIndex());
198
+ }
199
+
200
+ if (br.getEmbedCode) {
201
+ // $$$ changeable width/height to be added to share UI
202
+ const frameWidth = "480px";
203
+ const frameHeight = "430px";
204
+ form.find('.BRframeEmbed').val(br.getEmbedCode(frameWidth, frameHeight, params));
205
+ }
206
+ });
207
+
208
+ $form.find('input, textarea').on('focus', event => event.target.select());
209
+
210
+ // Bind share buttons
211
+
212
+ // Use url without hashes
213
+ $form.find('.facebook-share-button').on("click", () => {
214
+ const params = $.param({ u: this._getSocialShareUrl() });
215
+ const url = 'https://www.facebook.com/sharer.php?' + params;
216
+ createPopup(url, 600, 400, 'Share');
217
+ });
218
+ $form.find('.twitter-share-button').on("click", () => {
219
+ const params = $.param({
220
+ url: this._getSocialShareUrl(),
221
+ text: br.bookTitle,
222
+ });
223
+ const url = 'https://twitter.com/intent/tweet?' + params;
224
+ createPopup(url, 600, 400, 'Share');
225
+ });
226
+ $form.find('.email-share-button').on("click", () => {
227
+ const body = `${br.bookTitle}\n\n${this._getSocialShareUrl()}`;
228
+ window.location.href = `mailto:?subject=${encodeURI(br.bookTitle)}&body=${encodeURI(body)}`;
229
+ });
230
+
231
+ $form.find('input[name=thispage]').trigger('change');
232
+
233
+ $form.appendTo($shareDiv);
234
+ }
235
+
236
+ _getSocialShareUrl() {
237
+ const { br } = this;
238
+ const shareThisPage = br.$('.thispage-social').prop('checked');
239
+ if (shareThisPage) {
240
+ return window.location.href;
241
+ } else {
242
+ return `${document.location.protocol}//${window.location.hostname}${window.location.pathname}`;
243
+ }
244
+ }
245
+
246
+ /**
247
+ * @param {JQuery} $infoDiv DOM element. Appends info to this element
248
+ * Can be overridden or extended
249
+ */
250
+ buildInfoDiv($infoDiv) {
251
+ const { br } = this;
252
+ // Remove these legacy elements
253
+ $infoDiv.find('.BRfloatBody, .BRfloatCover, .BRfloatFoot').remove();
254
+
255
+ const $leftCol = $(`<div class="BRinfoLeftCol"></div>`);
256
+ if (br.thumbnail) {
257
+ $leftCol.append($(`
258
+ <div class="BRimageW">
259
+ <img src="${br.thumbnail}" alt="${escapeHTML(br.bookTitle)}" />
260
+ </div>`));
261
+ }
262
+
263
+ const $rightCol = $(`<div class="BRinfoRightCol">`);
264
+
265
+ // A loop to build fields
266
+ for (const {extraValueClass = '', label, value} of br.metadata) {
267
+ const escapedValue = label === 'Title' ? escapeHTML(value) : value;
268
+ $rightCol.append($(`
269
+ <div class="BRinfoValueWrapper">
270
+ <div class="BRinfoLabel">${label}</div>
271
+ <div class="BRinfoValue ${extraValueClass}">${escapedValue}</div>
272
+ </div>`));
273
+ }
274
+
275
+ const moreInfoText = br.bookUrlMoreInfo ? br.bookUrlMoreInfo : br.bookTitle;
276
+ if (moreInfoText && br.bookUrl) {
277
+ $rightCol.append($(`
278
+ <div class="BRinfoValueWrapper">
279
+ <div class="BRinfoMoreInfoWrapper">
280
+ <a class="BRinfoMoreInfo" href="${br.bookUrl}">
281
+ ${escapeHTML(moreInfoText)}
282
+ </a>
283
+ </div>
284
+ </div>`));
285
+ }
286
+
287
+ const $footer = $(`<div class="BRfloatFoot BRinfoFooter"></div>`);
288
+ const $children = $('<div class="BRinfoW mv20-lg">').append([
289
+ $leftCol,
290
+ $rightCol,
291
+ $('<br style="clear:both"/>'),
292
+ ]);
293
+
294
+ $infoDiv
295
+ .append($children, $footer)
296
+ .addClass('wide');
297
+ }
298
+
299
+ /**
300
+ * @return {number} (in pixels) of the toolbar height. 0 if no toolbar.
301
+ */
302
+ getToolBarHeight() {
303
+ const { $BRtoolbar } = this.br.refs;
304
+ if ($BRtoolbar && $BRtoolbar.css('display') === 'block') {
305
+ return ($BRtoolbar.outerHeight() + parseInt($BRtoolbar.css('top')));
306
+ } else {
307
+ return 0;
308
+ }
309
+ }
310
+ }
311
+
312
+ function blankInfoDiv() {
313
+ return $(`
314
+ <div class="BRfloat BRinfo">
315
+ <div class="BRfloatHead">About this book
316
+ <button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="br-colorbox-shift">Close</span></button>
317
+ </div>
318
+ <div class="BRfloatBody">
319
+ <div class="BRfloatCover"></div>
320
+ <div class="BRfloatMeta">
321
+ <div class="BRfloatTitle">
322
+ <h2><a /></h2>
323
+ </div>
324
+ </div>
325
+ </div>
326
+ <div class="BRfloatFoot">
327
+ <a href="https://openlibrary.org/dev/docs/bookreader">About the BookReader</a>
328
+ </div>
329
+ </div>`);
330
+ }
331
+
332
+ function blankShareDiv() {
333
+ return $(`
334
+ <div class="BRfloat BRshare">
335
+ <div class="BRfloatHead">
336
+ Share
337
+ <button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="br-colorbox-shift">Close</span></button>
338
+ </div>
339
+ </div>`);
340
+ }
341
+
342
+ /**
343
+ * Helper opens a popup window. On mobile it only opens a new tab. Used for share.
344
+ * @param {string} href
345
+ * @param {number} width
346
+ * @param {number} height
347
+ * @param {string} name
348
+ */
349
+ export function createPopup(href, width, height, name) {
350
+ // Fixes dual-screen position
351
+ const dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left;
352
+ const dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top;
353
+
354
+ const win_w = window.innerWidth || document.documentElement.clientWidth || screen.width;
355
+ const win_h = window.innerHeight || document.documentElement.clientHeight || screen.height;
356
+
357
+ const left = ((win_w / 2) - (width / 2)) + dualScreenLeft;
358
+ const top = ((win_h / 2) - (height / 2)) + dualScreenTop;
359
+ const opts = `status=1,width=${width},height=${height},top=${top},left=${left}`;
360
+
361
+ window.open(href, name, opts);
362
+ }
@@ -0,0 +1,19 @@
1
+ /** @enum {string} */
2
+ export const EVENTS = {
3
+ /** Indicates that the fragment (a serialization of the reader
4
+ * state) has changed. */
5
+ fragmentChange: 'fragmentChange',
6
+ pageChanged: 'pageChanged',
7
+ PostInit: 'PostInit',
8
+ stop: 'stop',
9
+ resize: 'resize',
10
+ userAction: 'userAction', // event to know if user is actively reading
11
+ // menu click events
12
+ fullscreenToggled: 'fullscreenToggled',
13
+ zoomOut: 'zoomOut',
14
+ zoomIn: 'zoomIn',
15
+ '1PageViewSelected': '1PageViewSelected',
16
+ '2PageViewSelected': '2PageViewSelected',
17
+ /* currently 3 represents thumbnail view */
18
+ '3PageViewSelected': '3PageViewSelected',
19
+ };