@internetarchive/bookreader 5.0.0-36 → 5.0.0-39

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 (280) hide show
  1. package/.github/workflows/node.js.yml +69 -7
  2. package/.github/workflows/npm-publish.yml +2 -16
  3. package/BookReader/BookReader.css +8 -0
  4. package/BookReader/BookReader.js +1 -1
  5. package/BookReader/BookReader.js.LICENSE.txt +8 -29
  6. package/BookReader/BookReader.js.map +1 -1
  7. package/BookReader/ia-bookreader-bundle.js +144 -119
  8. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +15 -12
  9. package/BookReader/ia-bookreader-bundle.js.map +1 -1
  10. package/BookReader/icons/magnify-minus.svg +1 -1
  11. package/BookReader/icons/magnify-plus.svg +1 -1
  12. package/BookReader/plugins/plugin.autoplay.js +1 -1
  13. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  14. package/BookReader/plugins/plugin.chapters.js +1 -1
  15. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  16. package/BookReader/plugins/plugin.mobile_nav.js +1 -1
  17. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  18. package/BookReader/plugins/plugin.resume.js +1 -1
  19. package/BookReader/plugins/plugin.resume.js.map +1 -1
  20. package/BookReader/plugins/plugin.search.js +1 -1
  21. package/BookReader/plugins/plugin.search.js.map +1 -1
  22. package/BookReader/plugins/plugin.text_selection.js +1 -1
  23. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  24. package/BookReader/plugins/plugin.tts.js +1 -1
  25. package/BookReader/plugins/plugin.tts.js.map +1 -1
  26. package/BookReader/plugins/plugin.url.js +1 -1
  27. package/BookReader/plugins/plugin.url.js.map +1 -1
  28. package/CHANGELOG.md +26 -0
  29. package/README.md +14 -1
  30. package/codecov.yml +6 -0
  31. package/package.json +30 -33
  32. package/renovate.json +43 -0
  33. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  34. package/src/BookNavigator/assets/button-base.js +1 -1
  35. package/src/BookNavigator/assets/ia-logo.js +1 -1
  36. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  37. package/src/BookNavigator/assets/icon_close.js +1 -1
  38. package/src/BookNavigator/assets/icon_sort_asc.js +1 -1
  39. package/src/BookNavigator/assets/icon_sort_desc.js +1 -1
  40. package/src/BookNavigator/assets/icon_sort_neutral.js +1 -1
  41. package/src/BookNavigator/assets/icon_volumes.js +1 -1
  42. package/src/BookNavigator/book-navigator.js +1 -2
  43. package/src/BookNavigator/bookmarks/bookmark-button.js +1 -1
  44. package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -3
  45. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  46. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +1 -1
  47. package/src/BookNavigator/bookmarks/bookmarks-provider.js +1 -1
  48. package/src/BookNavigator/bookmarks/ia-bookmarks.js +4 -7
  49. package/src/BookNavigator/delete-modal-actions.js +1 -1
  50. package/src/BookNavigator/downloads/downloads-provider.js +1 -1
  51. package/src/BookNavigator/downloads/downloads.js +1 -2
  52. package/src/BookNavigator/search/a-search-result.js +2 -3
  53. package/src/BookNavigator/search/search-provider.js +1 -2
  54. package/src/BookNavigator/search/search-results.js +1 -2
  55. package/src/BookNavigator/sharing.js +1 -1
  56. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +1 -1
  57. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  58. package/src/BookNavigator/volumes/volumes-provider.js +1 -1
  59. package/src/BookNavigator/volumes/volumes.js +2 -3
  60. package/src/BookReader/Mode1Up.js +2 -1
  61. package/src/BookReader/Mode1UpLit.js +10 -3
  62. package/src/BookReader/Mode2Up.js +11 -0
  63. package/src/BookReader/ModeSmoothZoom.js +2 -0
  64. package/src/BookReader/PageContainer.js +10 -4
  65. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  66. package/src/BookReader.js +4 -2
  67. package/src/assets/icons/magnify-minus.svg +3 -7
  68. package/src/assets/icons/magnify-plus.svg +3 -7
  69. package/src/css/_TextSelection.scss +13 -0
  70. package/src/ia-bookreader/ia-bookreader.js +1 -1
  71. package/src/plugins/plugin.chapters.js +11 -15
  72. package/src/plugins/plugin.text_selection.js +9 -10
  73. package/src/plugins/search/plugin.search.js +8 -18
  74. package/src/plugins/search/view.js +2 -0
  75. package/src/plugins/tts/AbstractTTSEngine.js +9 -4
  76. package/src/plugins/tts/FestivalTTSEngine.js +10 -11
  77. package/src/plugins/tts/PageChunk.js +11 -20
  78. package/src/plugins/tts/WebTTSEngine.js +22 -26
  79. package/tests/e2e/base.test.js +4 -5
  80. package/tests/e2e/helpers/desktopSearch.js +13 -12
  81. package/tests/e2e/models/Navigation.js +12 -3
  82. package/tests/e2e/rightToLeft.test.js +1 -1
  83. package/tests/e2e/viewmode.test.js +37 -31
  84. package/tests/jest/BookReader/Mode1UpLit.test.js +2 -1
  85. package/tests/jest/BookReader/PageContainer.test.js +5 -4
  86. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  87. package/tests/jest/plugins/plugin.text_selection.test.js +25 -23
  88. package/tests/jest/plugins/search/plugin.search.test.js +12 -20
  89. package/tests/jest/plugins/tts/AbstractTTSEngine.test.js +3 -3
  90. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +2 -2
  91. package/tests/karma/BookNavigator/downloads/downloads.test.js +1 -1
  92. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +3 -3
  93. package/webpack.config.js +1 -1
  94. package/.github/dependabot.yml +0 -8
  95. package/.husky/_/husky.sh +0 -30
  96. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  97. package/stat/BookNavigator/BookModel.js +0 -14
  98. package/stat/BookNavigator/BookNavigator.js +0 -482
  99. package/stat/BookNavigator/assets/bookmark-colors.js +0 -15
  100. package/stat/BookNavigator/assets/button-base.js +0 -61
  101. package/stat/BookNavigator/assets/ia-logo.js +0 -17
  102. package/stat/BookNavigator/assets/icon_checkmark.js +0 -6
  103. package/stat/BookNavigator/assets/icon_close.js +0 -3
  104. package/stat/BookNavigator/assets/icon_sort_asc.js +0 -5
  105. package/stat/BookNavigator/assets/icon_sort_desc.js +0 -5
  106. package/stat/BookNavigator/assets/icon_sort_neutral.js +0 -5
  107. package/stat/BookNavigator/assets/icon_volumes.js +0 -11
  108. package/stat/BookNavigator/bookmarks/bookmark-button.js +0 -64
  109. package/stat/BookNavigator/bookmarks/bookmark-edit.js +0 -215
  110. package/stat/BookNavigator/bookmarks/bookmarks-list.js +0 -285
  111. package/stat/BookNavigator/bookmarks/bookmarks-loginCTA.js +0 -28
  112. package/stat/BookNavigator/bookmarks/bookmarks-provider.js +0 -56
  113. package/stat/BookNavigator/bookmarks/ia-bookmarks.js +0 -523
  114. package/stat/BookNavigator/br-fullscreen-mgr.js +0 -82
  115. package/stat/BookNavigator/delete-modal-actions.js +0 -49
  116. package/stat/BookNavigator/downloads/downloads-provider.js +0 -72
  117. package/stat/BookNavigator/downloads/downloads.js +0 -139
  118. package/stat/BookNavigator/provider-config.js +0 -0
  119. package/stat/BookNavigator/search/a-search-result.js +0 -55
  120. package/stat/BookNavigator/search/search-provider.js +0 -180
  121. package/stat/BookNavigator/search/search-results.js +0 -360
  122. package/stat/BookNavigator/sharing.js +0 -31
  123. package/stat/BookNavigator/visual-adjustments/visual-adjustments-provider.js +0 -94
  124. package/stat/BookNavigator/visual-adjustments/visual-adjustments.js +0 -280
  125. package/stat/BookNavigator/volumes/volumes-provider.js +0 -83
  126. package/stat/BookNavigator/volumes/volumes.js +0 -178
  127. package/stat/BookReader/BookModel.js +0 -518
  128. package/stat/BookReader/DebugConsole.js +0 -54
  129. package/stat/BookReader/DragScrollable.js +0 -233
  130. package/stat/BookReader/ImageCache.js +0 -116
  131. package/stat/BookReader/Mode1Up.js +0 -102
  132. package/stat/BookReader/Mode1UpLit.js +0 -434
  133. package/stat/BookReader/Mode2Up.js +0 -1372
  134. package/stat/BookReader/ModeSmoothZoom.js +0 -177
  135. package/stat/BookReader/ModeThumb.js +0 -344
  136. package/stat/BookReader/Navbar/Navbar.js +0 -310
  137. package/stat/BookReader/PageContainer.js +0 -120
  138. package/stat/BookReader/ReduceSet.js +0 -26
  139. package/stat/BookReader/Toolbar/Toolbar.js +0 -384
  140. package/stat/BookReader/events.js +0 -20
  141. package/stat/BookReader/options.js +0 -324
  142. package/stat/BookReader/utils/HTMLDimensionsCacher.js +0 -44
  143. package/stat/BookReader/utils/classes.js +0 -36
  144. package/stat/BookReader/utils.js +0 -240
  145. package/stat/BookReader.js +0 -2550
  146. package/stat/BookReaderComponent/BookReaderComponent.js +0 -117
  147. package/stat/assets/icons/1up.svg +0 -12
  148. package/stat/assets/icons/2up.svg +0 -15
  149. package/stat/assets/icons/advance.svg +0 -26
  150. package/stat/assets/icons/chevron-right.svg +0 -1
  151. package/stat/assets/icons/close-circle-dark.svg +0 -1
  152. package/stat/assets/icons/close-circle.svg +0 -1
  153. package/stat/assets/icons/fullscreen.svg +0 -17
  154. package/stat/assets/icons/fullscreen_exit.svg +0 -17
  155. package/stat/assets/icons/hamburger.svg +0 -15
  156. package/stat/assets/icons/left-arrow.svg +0 -12
  157. package/stat/assets/icons/magnify-minus.svg +0 -16
  158. package/stat/assets/icons/magnify-plus.svg +0 -17
  159. package/stat/assets/icons/magnify.svg +0 -15
  160. package/stat/assets/icons/pause.svg +0 -23
  161. package/stat/assets/icons/play.svg +0 -22
  162. package/stat/assets/icons/playback-speed.svg +0 -34
  163. package/stat/assets/icons/read-aloud.svg +0 -22
  164. package/stat/assets/icons/review.svg +0 -22
  165. package/stat/assets/icons/thumbnails.svg +0 -17
  166. package/stat/assets/icons/voice.svg +0 -1
  167. package/stat/assets/icons/volume-full.svg +0 -22
  168. package/stat/assets/images/BRicons.png +0 -0
  169. package/stat/assets/images/BRicons.svg +0 -94
  170. package/stat/assets/images/BRicons_ia.png +0 -0
  171. package/stat/assets/images/back_pages.png +0 -0
  172. package/stat/assets/images/book_bottom_icon.png +0 -0
  173. package/stat/assets/images/book_down_icon.png +0 -0
  174. package/stat/assets/images/book_left_icon.png +0 -0
  175. package/stat/assets/images/book_leftmost_icon.png +0 -0
  176. package/stat/assets/images/book_right_icon.png +0 -0
  177. package/stat/assets/images/book_rightmost_icon.png +0 -0
  178. package/stat/assets/images/book_top_icon.png +0 -0
  179. package/stat/assets/images/book_up_icon.png +0 -0
  180. package/stat/assets/images/books_graphic.svg +0 -177
  181. package/stat/assets/images/booksplit.png +0 -0
  182. package/stat/assets/images/control_pause_icon.png +0 -0
  183. package/stat/assets/images/control_play_icon.png +0 -0
  184. package/stat/assets/images/embed_icon.png +0 -0
  185. package/stat/assets/images/icon-home-ia.png +0 -0
  186. package/stat/assets/images/icon_OL-logo-xs.png +0 -0
  187. package/stat/assets/images/icon_alert-xs.png +0 -0
  188. package/stat/assets/images/icon_book.svg +0 -12
  189. package/stat/assets/images/icon_bookmark.svg +0 -12
  190. package/stat/assets/images/icon_close-pop.png +0 -0
  191. package/stat/assets/images/icon_download.png +0 -0
  192. package/stat/assets/images/icon_gear.svg +0 -14
  193. package/stat/assets/images/icon_hamburger.svg +0 -20
  194. package/stat/assets/images/icon_home.png +0 -0
  195. package/stat/assets/images/icon_home.svg +0 -21
  196. package/stat/assets/images/icon_home_ia.png +0 -0
  197. package/stat/assets/images/icon_indicator.png +0 -0
  198. package/stat/assets/images/icon_info.svg +0 -11
  199. package/stat/assets/images/icon_one_page.svg +0 -8
  200. package/stat/assets/images/icon_pause.svg +0 -1
  201. package/stat/assets/images/icon_play.svg +0 -1
  202. package/stat/assets/images/icon_playback-rate.svg +0 -15
  203. package/stat/assets/images/icon_return.png +0 -0
  204. package/stat/assets/images/icon_search_button.svg +0 -8
  205. package/stat/assets/images/icon_share.svg +0 -9
  206. package/stat/assets/images/icon_skip-ahead.svg +0 -6
  207. package/stat/assets/images/icon_skip-back.svg +0 -13
  208. package/stat/assets/images/icon_speaker.svg +0 -18
  209. package/stat/assets/images/icon_speaker_open.svg +0 -10
  210. package/stat/assets/images/icon_thumbnails.svg +0 -12
  211. package/stat/assets/images/icon_toc.svg +0 -5
  212. package/stat/assets/images/icon_two_pages.svg +0 -9
  213. package/stat/assets/images/icon_zoomer.png +0 -0
  214. package/stat/assets/images/loading.gif +0 -0
  215. package/stat/assets/images/logo_icon.png +0 -0
  216. package/stat/assets/images/marker_chap-off.png +0 -0
  217. package/stat/assets/images/marker_chap-off.svg +0 -11
  218. package/stat/assets/images/marker_chap-off_ia.png +0 -0
  219. package/stat/assets/images/marker_chap-on.png +0 -0
  220. package/stat/assets/images/marker_chap-on.svg +0 -11
  221. package/stat/assets/images/marker_srch-on.svg +0 -11
  222. package/stat/assets/images/marker_srchchap-off.png +0 -0
  223. package/stat/assets/images/marker_srchchap-on.png +0 -0
  224. package/stat/assets/images/nav_control-dn.png +0 -0
  225. package/stat/assets/images/nav_control-dn_ia.png +0 -0
  226. package/stat/assets/images/nav_control-up.png +0 -0
  227. package/stat/assets/images/nav_control-up_ia.png +0 -0
  228. package/stat/assets/images/nav_control.png +0 -0
  229. package/stat/assets/images/one_page_mode_icon.png +0 -0
  230. package/stat/assets/images/paper-badge.png +0 -0
  231. package/stat/assets/images/print_icon.png +0 -0
  232. package/stat/assets/images/progressbar.gif +0 -0
  233. package/stat/assets/images/right_edges.png +0 -0
  234. package/stat/assets/images/slider.png +0 -0
  235. package/stat/assets/images/slider_ia.png +0 -0
  236. package/stat/assets/images/thumbnail_mode_icon.png +0 -0
  237. package/stat/assets/images/transparent.png +0 -0
  238. package/stat/assets/images/two_page_mode_icon.png +0 -0
  239. package/stat/assets/images/zoom_in_icon.png +0 -0
  240. package/stat/assets/images/zoom_out_icon.png +0 -0
  241. package/stat/css/BookReader.scss +0 -89
  242. package/stat/css/_BRBookmarks.scss +0 -29
  243. package/stat/css/_BRComponent.scss +0 -13
  244. package/stat/css/_BRfloat.scss +0 -197
  245. package/stat/css/_BRicon.scss +0 -48
  246. package/stat/css/_BRmain.scss +0 -251
  247. package/stat/css/_BRnav.scss +0 -359
  248. package/stat/css/_BRpages.scss +0 -139
  249. package/stat/css/_BRsearch.scss +0 -226
  250. package/stat/css/_BRtoolbar.scss +0 -84
  251. package/stat/css/_BRvendor.scss +0 -5
  252. package/stat/css/_MobileNav.scss +0 -194
  253. package/stat/css/_TextSelection.scss +0 -32
  254. package/stat/css/_colorbox.scss +0 -52
  255. package/stat/css/_controls.scss +0 -253
  256. package/stat/css/_icons.scss +0 -121
  257. package/stat/jquery-wrapper.js +0 -4
  258. package/stat/plugins/plugin.archive_analytics.js +0 -86
  259. package/stat/plugins/plugin.autoplay.js +0 -129
  260. package/stat/plugins/plugin.chapters.js +0 -248
  261. package/stat/plugins/plugin.iframe.js +0 -48
  262. package/stat/plugins/plugin.mobile_nav.js +0 -288
  263. package/stat/plugins/plugin.resume.js +0 -68
  264. package/stat/plugins/plugin.text_selection.js +0 -291
  265. package/stat/plugins/plugin.url.js +0 -198
  266. package/stat/plugins/plugin.vendor-fullscreen.js +0 -247
  267. package/stat/plugins/search/plugin.search.js +0 -439
  268. package/stat/plugins/search/view.js +0 -439
  269. package/stat/plugins/tts/AbstractTTSEngine.js +0 -249
  270. package/stat/plugins/tts/FestivalTTSEngine.js +0 -169
  271. package/stat/plugins/tts/PageChunk.js +0 -107
  272. package/stat/plugins/tts/PageChunkIterator.js +0 -163
  273. package/stat/plugins/tts/WebTTSEngine.js +0 -357
  274. package/stat/plugins/tts/plugin.tts.js +0 -357
  275. package/stat/plugins/tts/tooltip_dict.js +0 -15
  276. package/stat/plugins/tts/utils.js +0 -91
  277. package/stat/util/browserSniffing.js +0 -30
  278. package/stat/util/debouncer.js +0 -26
  279. package/stat/util/docCookies.js +0 -67
  280. package/stat/util/strings.js +0 -34
@@ -1,14 +0,0 @@
1
- export class Book {
2
- constructor() {
3
- this.metadata = {};
4
- this.isRestricted = null;
5
- }
6
-
7
- setMetadata(itemMetadata) {
8
- this.metadata = itemMetadata;
9
- }
10
-
11
- setRestriction(isRestricted) {
12
- this.isRestricted = isRestricted;
13
- }
14
- }
@@ -1,482 +0,0 @@
1
- import { css, html, LitElement } from 'lit-element';
2
- import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
3
- import SearchProvider from './search/search-provider.js';
4
- import DownloadProvider from './downloads/downloads-provider.js';
5
- import VisualAdjustmentProvider from './visual-adjustments/visual-adjustments-provider.js';
6
- import BookmarksProvider from './bookmarks/bookmarks-provider.js';
7
- import SharingProvider from './sharing.js';
8
- import VolumesProvider from './volumes/volumes-provider.js';
9
- import BRFullscreenMgr from './br-fullscreen-mgr.js';
10
- import { Book } from './BookModel.js';
11
- import iaLogo from './assets/ia-logo.js';
12
-
13
- const events = {
14
- menuUpdated: 'menuUpdated',
15
- updateSideMenu: 'updateSideMenu',
16
- PostInit: 'PostInit',
17
- ViewportInFullScreen: 'ViewportInFullScreen',
18
- };
19
- export class BookNavigator extends LitElement {
20
- static get properties() {
21
- return {
22
- book: { type: Object },
23
- pageContainerSelector: { type: String },
24
- brWidth: { type: Number },
25
- bookReaderLoaded: { type: Boolean },
26
- bookreader: { type: Object },
27
- downloadableTypes: { type: Array },
28
- isAdmin: { type: Boolean },
29
- lendingInitialized: { type: Boolean },
30
- lendingStatus: { type: Object },
31
- menuProviders: { type: Object },
32
- menuShortcuts: { type: Array },
33
- sideMenuOpen: { type: Boolean },
34
- signedIn: { type: Boolean },
35
- sharedObserver: { type: Object },
36
- fullscreenBranding: { type: Object },
37
- addBranding: { type: Boolean },
38
- };
39
- }
40
-
41
- constructor() {
42
- super();
43
- this.book = {};
44
- this.pageContainerSelector = '.BRcontainer';
45
- this.brWidth = 0;
46
- this.bookReaderCannotLoad = false;
47
- this.bookReaderLoaded = false;
48
- this.bookreader = null;
49
- this.downloadableTypes = [];
50
- this.isAdmin = false;
51
- this.lendingInitialized = false;
52
- this.lendingStatus = {};
53
- this.menuProviders = {};
54
- this.menuShortcuts = [];
55
- this.sideMenuOpen = false;
56
- this.signedIn = false;
57
- this.modal = undefined;
58
- this.sharedObserver = undefined;
59
- this.fullscreenBranding = iaLogo;
60
- this.addBranding = true;
61
- // Untracked properties
62
- this.fullscreenMgr = null;
63
- this.sharedObserver = null;
64
- this.model = new Book();
65
- this.shortcutOrder = ['fullscreen', 'volumes', 'search', 'bookmarks'];
66
- }
67
-
68
- firstUpdated() {
69
- this.model.setMetadata(this.book);
70
- this.bindEventListeners();
71
- this.emitPostInit();
72
- }
73
-
74
- updated(changed) {
75
- if (!this.bookreader) {
76
- return;
77
- }
78
- if (changed.has('signedIn') || changed.has('isAdmin')) {
79
- /** redraw book submenus to propagate property update */
80
- this.initializeBookSubmenus();
81
- }
82
- }
83
-
84
- /**
85
- * Global event emitter for when Book Navigator loads
86
- */
87
- emitPostInit() {
88
- // emit global event when book nav has loaded with current bookreader selector
89
- this.dispatchEvent(new CustomEvent(`BrBookNav:${events.PostInit}`, {
90
- detail: { brSelector: this.bookreader?.el },
91
- bubbles: true,
92
- composed: true,
93
- }));
94
- }
95
-
96
- /**
97
- * Instantiates books submenus & their update callbacks
98
- *
99
- * NOTE: we are doing our best to scope bookreader's instance.
100
- * If your submenu provider uses a bookreader instance to read, manually
101
- * manipulate BookReader, please update the navigator's instance of it
102
- * to keep it in sync.
103
- */
104
- initializeBookSubmenus() {
105
- const isBookProtected = this.bookreader.options.protected;
106
-
107
- // const baseProviderConfig = {
108
- // modal: this.modal,
109
- // sharedObserver: this.sharedObserver,
110
- // bookreader: this.bookreader,
111
- // signedIn: this.signedIn,
112
- // isAdmin: this.isAdmin,
113
- // };
114
-
115
- this.menuProviders = {
116
- search: new SearchProvider(
117
- /**
118
- * Search specific menu updates
119
- * @param {BookReader} brInstance
120
- * @param {{ searchCanceled: boolean }} searchUpdates
121
- */
122
- (brInstance = null, searchUpdates = {}) => {
123
- if (brInstance) {
124
- /* refresh br instance reference */
125
- this.bookreader = brInstance;
126
- }
127
- this.updateMenuContents();
128
- const wideEnoughToOpenMenu = this.brWidth >= 640;
129
- if (wideEnoughToOpenMenu && !searchUpdates?.searchCanceled) {
130
- /* open side search menu */
131
- this.updateSideMenu('search', 'open');
132
- }
133
- },
134
- this.bookreader,
135
- ),
136
- downloads: new DownloadProvider(isBookProtected),
137
- visualAdjustments: new VisualAdjustmentProvider({
138
- onOptionChange: (event, brInstance = null) => {
139
- if (brInstance) {
140
- /* refresh br instance reference */
141
- this.bookreader = brInstance;
142
- }
143
- this.updateMenuContents();
144
- },
145
- bookContainerSelector: this.pageContainerSelector,
146
- bookreader: this.bookreader,
147
- }),
148
- share: new SharingProvider(this.book.metadata, this.baseHost, this.itemType, this.bookreader.options.subPrefix),
149
- bookmarks: new BookmarksProvider(this.bookmarksOptions),
150
- };
151
-
152
- // add shortcut for volumes if multipleBooksList exists
153
- if (this.bookreader.options.enableMultipleBooks) {
154
- this.menuProviders.volumes = new VolumesProvider(this.baseHost, this.bookreader, (brInstance) => {
155
- if (brInstance) {
156
- /* refresh br instance reference */
157
- this.bookreader = brInstance;
158
- }
159
- this.updateMenuContents();
160
- this.updateSideMenu('volumes', 'open');
161
- });
162
- this.addMenuShortcut('volumes');
163
- }
164
-
165
- this.addMenuShortcut('search'); /* start with search as a shortcut */
166
- this.updateMenuContents();
167
- }
168
-
169
- /** gets element that houses the bookreader in light dom */
170
- get mainBRContainer() {
171
- return document.querySelector(this.bookreader.el);
172
- }
173
-
174
- get bookmarksOptions() {
175
- const referrerStr = `referer=${encodeURIComponent(location.href)}`;
176
- return {
177
- loginUrl: `https://${this.baseHost}/account/login?${referrerStr}`,
178
- signedIn: this.signedIn,
179
- displayMode: this.signedIn ? 'bookmarks' : 'login',
180
- isAdmin: this.isAdmin,
181
- modal: this.modal,
182
- sharedObserver: this.sharedObserver,
183
- bookreader: this.bookreader,
184
- onBookmarksChanged: (bookmarks, showSidePanel = false) => {
185
- console.log('booknav on bkch', bookmarks, showSidePanel);
186
- if (showSidePanel) {
187
- this.updateSideMenu('bookmarks', 'open');
188
- }
189
- const method = Object.keys(bookmarks).length ? 'add' : 'remove';
190
- this[`${method}MenuShortcut`]('bookmarks');
191
- this.updateMenuContents();
192
- },
193
- };
194
- }
195
-
196
- /** Fullscreen Shortcut */
197
- addFullscreenShortcut() {
198
- const closeFS = {
199
- icon: this.fullscreenShortcut,
200
- id: 'fullscreen',
201
- };
202
- this.menuShortcuts.push(closeFS);
203
- this.sortMenuShortcuts();
204
- this.emitMenuShortcutsUpdated();
205
- }
206
-
207
- deleteFullscreenShortcut() {
208
- console.log('delete fullscreenshortcut', this.menuShortcuts);
209
- const updatedShortcuts = this.menuShortcuts.filter(({ id }) => {
210
- return id !== 'fullscreen';
211
- });
212
- console.log('updatedShortcuts', updatedShortcuts);
213
- this.menuShortcuts = updatedShortcuts;
214
- this.sortMenuShortcuts();
215
- this.emitMenuShortcutsUpdated();
216
- }
217
-
218
- closeFullscreen() {
219
- this.bookreader.exitFullScreen();
220
- }
221
-
222
- get fullscreenShortcut() {
223
- return html`
224
- <button
225
- @click=${() => this.closeFullscreen()}
226
- title="Exit fullscreen view"
227
- >${this.fullscreenBranding}</button>
228
- `;
229
- }
230
- /** End Fullscreen Shortcut */
231
-
232
- /**
233
- * Open side menu
234
- * @param {string} menuId
235
- * @param {('open'|'close'|'toggle')} action
236
- */
237
- updateSideMenu(menuId = '', action = 'open') {
238
- if (!menuId || !action) {
239
- return;
240
- }
241
- const event = new CustomEvent(
242
- events.updateSideMenu, {
243
- detail: { menuId, action },
244
- },
245
- );
246
- this.dispatchEvent(event);
247
- }
248
-
249
- /**
250
- * Sets order of menu and emits custom event when done
251
- */
252
- updateMenuContents() {
253
- const {
254
- search, downloads, visualAdjustments, share, bookmarks, volumes
255
- } = this.menuProviders;
256
- const availableMenus = [volumes, search, bookmarks, visualAdjustments, share].filter((menu) => !!menu);
257
-
258
- if (this.shouldShowDownloadsMenu()) {
259
- downloads?.update(this.downloadableTypes);
260
- availableMenus.splice(1, 0, downloads);
261
- }
262
-
263
- const event = new CustomEvent(
264
- events.menuUpdated, {
265
- detail: availableMenus,
266
- },
267
- );
268
- this.dispatchEvent(event);
269
- }
270
-
271
- /**
272
- * Confirms if we should show the downloads menu
273
- * @returns {bool}
274
- */
275
- shouldShowDownloadsMenu() {
276
- if (this.model.isRestricted === false) { return true; }
277
- if (this.isAdmin) { return true; }
278
- const { user_loan_record = {} } = this.lendingStatus;
279
- const hasNoLoanRecord = Array.isArray(user_loan_record); /* (bc PHP assoc. arrays) */
280
-
281
- if (hasNoLoanRecord) { return false; }
282
-
283
- const hasValidLoan = user_loan_record.type && (user_loan_record.type !== 'SESSION_LOAN');
284
- return hasValidLoan;
285
- }
286
-
287
- /**
288
- * Adds a provider object to the menuShortcuts array property if it isn't
289
- * already added. menuShortcuts are then sorted by shortcutOrder and
290
- * a menuShortcutsUpdated event is emitted.
291
- *
292
- * @param {string} menuId - a string matching the id property of a provider
293
- */
294
- addMenuShortcut(menuId) {
295
- if (this.menuShortcuts.find((m) => m.id === menuId)) { return; }
296
-
297
- this.menuShortcuts.push(this.menuProviders[menuId]);
298
- this.sortMenuShortcuts();
299
- this.emitMenuShortcutsUpdated();
300
- }
301
-
302
- /**
303
- * Removes a provider object from the menuShortcuts array and emits a
304
- * menuShortcutsUpdated event.
305
- *
306
- * @param {string} menuId - a string matching the id property of a provider
307
- */
308
- removeMenuShortcut(menuId) {
309
- this.menuShortcuts = this.menuShortcuts.filter((m) => m.id !== menuId);
310
- this.emitMenuShortcutsUpdated();
311
- }
312
-
313
- /**
314
- * Sorts the menuShortcuts property by comparing each provider's id to
315
- * the id in each iteration over the shortcutOrder array.
316
- */
317
- sortMenuShortcuts() {
318
- this.menuShortcuts = this.shortcutOrder.reduce((shortcuts, id) => {
319
- const menu = this.menuShortcuts.find((m) => m.id === id);
320
- if (menu) { shortcuts.push(menu); }
321
- return shortcuts;
322
- }, []);
323
- }
324
-
325
- emitMenuShortcutsUpdated() {
326
- const event = new CustomEvent('menuShortcutsUpdated', {
327
- detail: this.menuShortcuts,
328
- });
329
- this.dispatchEvent(event);
330
- }
331
-
332
- emitLoadingStatusUpdate(loaded) {
333
- const event = new CustomEvent('loadingStateUpdated', {
334
- detail: { loaded },
335
- });
336
- this.dispatchEvent(event);
337
- }
338
-
339
- /**
340
- * Core bookreader event handler registry
341
- *
342
- * NOTE: we are trying to keep bookreader's instance in scope
343
- * Please update Book Navigator's instance reference of it to keep it current
344
- */
345
- bindEventListeners() {
346
- window.addEventListener('BookReader:PostInit', (e) => {
347
- console.log('BookReader:PostInit');
348
- this.bookreader = e.detail.props;
349
- this.bookReaderLoaded = true;
350
- this.bookReaderCannotLoad = false;
351
- this.fullscreenMgr = new BRFullscreenMgr(this.bookreader.el);
352
-
353
- this.initializeBookSubmenus();
354
- this.startResizeObserver();
355
- this.emitLoadingStatusUpdate(true);
356
- });
357
- window.addEventListener('BookReader:fullscreenToggled', (event) => {
358
- console.log('BookReader:fullscreenToggled');
359
- const { detail: { props: brInstance = null } } = event;
360
- if (brInstance) {
361
- this.bookreader = brInstance;
362
- }
363
- this.manageFullScreenBehavior(event);
364
- if (this.bookreader.isFullscreenActive) {
365
- this.addFullscreenShortcut();
366
- } else {
367
- this.deleteFullscreenShortcut();
368
- }
369
- }, { passive: true });
370
- window.addEventListener('BookReader:ToggleSearchMenu', (event) => {
371
- this.dispatchEvent(new CustomEvent(events.updateSideMenu, {
372
- detail: { menuId: 'search', action: 'toggle' },
373
- }));
374
- });
375
- window.addEventListener('LendingFlow:PostInit', ({ detail }) => {
376
- console.log('LendingFlow:PostInit');
377
- const {
378
- downloadTypesAvailable, lendingStatus, isAdmin, previewType,
379
- } = detail;
380
- this.lendingInitialized = true;
381
- this.downloadableTypes = downloadTypesAvailable;
382
- this.lendingStatus = lendingStatus;
383
- this.isAdmin = isAdmin;
384
- this.bookReaderCannotLoad = previewType === 'singlePagePreview';
385
- });
386
- window.addEventListener('BRJSIA:PostInit', ({ detail }) => {
387
- console.log('BRJSIA:PostInit');
388
-
389
- const { isRestricted, downloadURLs } = detail;
390
- this.bookReaderLoaded = true;
391
- this.downloadableTypes = downloadURLs;
392
- this.model.setRestriction(isRestricted);
393
- });
394
- }
395
-
396
- /**
397
- * Uses resize observer to fire BookReader's `resize` functionality
398
- * We do not want to trigger resize IF:
399
- * - book animation is happening
400
- * - book is in fullscreen (fullscreen is handled separately)
401
- *
402
- * @param { target: HTMLElement, contentRect: DOMRectReadOnly } entry
403
- */
404
- handleResize({ contentRect, target }) {
405
- const startBrWidth = this.brWidth;
406
- const { animating } = this.bookreader;
407
-
408
- if (target === this.mainBRContainer) {
409
- this.brWidth = contentRect.width;
410
- }
411
-
412
- setTimeout(() => {
413
- if (startBrWidth && !animating) {
414
- this.bookreader.resize();
415
- }
416
- }, 0);
417
- }
418
-
419
- async startResizeObserver() {
420
- if (!this.sharedObserver) {
421
- this.sharedObserver = new SharedResizeObserver();
422
- }
423
-
424
- this.sharedObserver?.addObserver({
425
- handler: this,
426
- target: this.mainBRContainer,
427
- });
428
- }
429
-
430
- /**
431
- * Manages Fullscreen behavior
432
- * This makes sure that controls are _always_ in view
433
- * We need this to accommodate LOAN BAR during fullscreen
434
- */
435
- manageFullScreenBehavior() {
436
- this.emitFullScreenState();
437
- if (!this.bookreader.isFullscreen()) {
438
- this.fullscreenMgr.teardown();
439
- } else {
440
- this.fullscreenMgr.setup(this.bookreader);
441
- }
442
- }
443
-
444
- /**
445
- * Intercepts and relays fullscreen toggle events
446
- */
447
- emitFullScreenState() {
448
- const isFullScreen = this.bookreader.isFullscreen();
449
- const event = new CustomEvent('ViewportInFullScreen', {
450
- detail: { isFullScreen },
451
- });
452
- this.dispatchEvent(event);
453
- }
454
-
455
- get loadingClass() {
456
- return !this.bookReaderLoaded ? 'loading' : '';
457
- }
458
-
459
- get itemImage() {
460
- const url = `https://${this.baseHost}/services/img/${this.book.metadata.identifier}`;
461
- return html`<img class="cover-img" src="${url}" alt="cover image for ${this.book.metadata.identifier}">`;
462
- }
463
-
464
- render() {
465
- const placeholder = this.bookReaderCannotLoad ? this.itemImage : this.loader;
466
- return html`<div id="book-navigator" class="${this.loadingClass}">
467
- ${placeholder}
468
- <slot name="main"></slot>
469
- </div>
470
- `;
471
- }
472
-
473
- static get styles() {
474
- return css`
475
- .cover-img {
476
- max-height: 300px;
477
- }
478
- `;
479
- }
480
- }
481
-
482
- customElements.define('book-navigator', BookNavigator);
@@ -1,15 +0,0 @@
1
- import { css } from 'lit-element';
2
-
3
- export default css`
4
- .blue {
5
- --iconFillColor: var(--blueBookmarkColor, #0023f5);
6
- }
7
-
8
- .red {
9
- --iconFillColor: var(--redBookmarkColor, #eb3223);
10
- }
11
-
12
- .green {
13
- --iconFillColor: var(--greenBookmarkColor, #75ef4c);
14
- }
15
- `;
@@ -1,61 +0,0 @@
1
- import { css } from 'lit-element';
2
-
3
- export default css`
4
- .ia-button {
5
- min-height: 3rem;
6
- border: none;
7
- outline: none;
8
- cursor: pointer;
9
- color: var(--primaryTextColor);
10
- line-height: normal;
11
- border-radius: .4rem;
12
- text-align: center;
13
- vertical-align: middle;
14
- font-size: 1.4rem;
15
- display: inline-block;
16
- padding: .6rem 1.2rem;
17
- border: 1px solid transparent;
18
-
19
- white-space: nowrap;
20
- -webkit-user-select: none;
21
- -moz-user-select: none;
22
- -ms-user-select: none;
23
- -o-user-select: none;
24
- user-select: none;
25
- }
26
-
27
- .ia-button.link,
28
- .ia-button.external {
29
- min-height: unset;
30
- text-decoration: none;
31
- }
32
-
33
- .ia-button:disabled,
34
- .ia-button.disabled {
35
- cursor: not-allowed;
36
- opacity: 0.5;
37
- }
38
-
39
- .ia-button.transparent {
40
- background-color: transparent;
41
- }
42
-
43
- .ia-button.slim {
44
- padding: 0;
45
- }
46
-
47
- .ia-button.primary {
48
- background-color: var(--primaryCTAFill);
49
- border-color: var(--primaryCTABorder);
50
- }
51
-
52
- .ia-button.cancel {
53
- background-color: var(--primaryErrorCTAFill);
54
- border-color: var(--primaryErrorCTABorder);
55
- }
56
-
57
- .ia-button.external {
58
- background: var(--secondaryCTAFill);
59
- border-color: var(--secondaryCTABorder);
60
- }
61
- `;
@@ -1,17 +0,0 @@
1
- import { svg } from 'lit-element';
2
-
3
- export default svg`
4
- <svg class="ia-logo" width="27" height="30" viewBox="0 0 27 30" xmlns="http://www.w3.org/2000/svg" aria-labelledby="logoTitleID logoDescID">
5
- <title id="logoTitleID">Internet Archive logo</title>
6
- <desc id="logoDescID">A line drawing of the Internet Archive headquarters building façade.</desc>
7
- <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8
- <mask id="mask-2" fill="white">
9
- <path d="M26.6666667,28.6046512 L26.6666667,30 L0,30 L0.000283687943,28.6046512 L26.6666667,28.6046512 Z M25.6140351,26.5116279 L25.6140351,28.255814 L1.05263158,28.255814 L1.05263158,26.5116279 L25.6140351,26.5116279 Z M3.62469203,7.6744186 L3.91746909,7.82153285 L4.0639977,10.1739544 L4.21052632,13.9963932 L4.21052632,17.6725617 L4.0639977,22.255044 L4.03962296,25.3421929 L3.62469203,25.4651163 L2.16024641,25.4651163 L1.72094074,25.3421929 L1.55031755,22.255044 L1.40350877,17.6970339 L1.40350877,14.0211467 L1.55031755,10.1739544 L1.68423854,7.80887484 L1.98962322,7.6744186 L3.62469203,7.6744186 Z M24.6774869,7.6744186 L24.9706026,7.82153285 L25.1168803,10.1739544 L25.2631579,13.9963932 L25.2631579,17.6725617 L25.1168803,22.255044 L25.0927809,25.3421929 L24.6774869,25.4651163 L23.2130291,25.4651163 L22.7736357,25.3421929 L22.602418,22.255044 L22.4561404,17.6970339 L22.4561404,14.0211467 L22.602418,10.1739544 L22.7369262,7.80887484 L23.0420916,7.6744186 L24.6774869,7.6744186 Z M9.94042303,7.6744186 L10.2332293,7.82153285 L10.3797725,10.1739544 L10.5263158,13.9963932 L10.5263158,17.6725617 L10.3797725,22.255044 L10.3556756,25.3421929 L9.94042303,25.4651163 L8.47583122,25.4651163 L8.0362015,25.3421929 L7.86556129,22.255044 L7.71929825,17.6970339 L7.71929825,14.0211467 L7.86556129,10.1739544 L8.00005604,7.80887484 L8.30491081,7.6744186 L9.94042303,7.6744186 Z M18.0105985,7.6744186 L18.3034047,7.82153285 L18.449948,10.1739544 L18.5964912,13.9963932 L18.5964912,17.6725617 L18.449948,22.255044 L18.425851,25.3421929 L18.0105985,25.4651163 L16.5460067,25.4651163 L16.1066571,25.3421929 L15.9357367,22.255044 L15.7894737,17.6970339 L15.7894737,14.0211467 L15.9357367,10.1739544 L16.0702315,7.80887484 L16.3753664,7.6744186 L18.0105985,7.6744186 Z M25.6140351,4.53488372 L25.6140351,6.97674419 L1.05263158,6.97674419 L1.05263158,4.53488372 L25.6140351,4.53488372 Z M13.0806755,0 L25.9649123,2.93331338 L25.4484139,3.8372093 L0.771925248,3.8372093 L0,3.1041615 L13.0806755,0 Z" id="path-1"></path>
10
- </mask>
11
- <use fill="#FFFFFF" xlink:href="#path-1"></use>
12
- <g mask="url(#mask-2)" fill="#FFFFFF">
13
- <path d="M0,0 L26.6666667,0 L26.6666667,30 L0,30 L0,0 Z" id="swatch"></path>
14
- </g>
15
- </g>
16
- </svg>
17
- `;
@@ -1,6 +0,0 @@
1
- import { css } from 'lit-element';
2
-
3
- // Original SVG object for reference
4
- // <svg height="10" viewBox="0 0 13 10" width="13" xmlns="http://www.w3.org/2000/svg"><path d="m4.33333333 10-4.33333333-4.16666667 1.73333333-1.66666666 2.6 2.5 6.93333337-6.66666667 1.7333333 1.66666667z" fill="#fff" fill-rule="evenodd"/></svg>
5
-
6
- export default css`data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjEwIiB2aWV3Qm94PSIwIDAgMTMgMTAiIHdpZHRoPSIxMyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtNC4zMzMzMzMzMyAxMC00LjMzMzMzMzMzLTQuMTY2NjY2NjcgMS43MzMzMzMzMy0xLjY2NjY2NjY2IDIuNiAyLjUgNi45MzMzMzMzNy02LjY2NjY2NjY3IDEuNzMzMzMzMyAxLjY2NjY2NjY3eiIgZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+`;
@@ -1,3 +0,0 @@
1
- import { css } from 'lit-element';
2
-
3
- export default css`data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNDAgNDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgYXJpYS1sYWJlbGxlZGJ5PSJjbG9zZVRpdGxlSUQgY2xvc2VEZXNjSUQiPjxwYXRoIGQ9Ik0yOS4xOTIgMTAuODA4YTEuNSAxLjUgMCAwMTAgMi4xMkwyMi4xMjIgMjBsNy4wNyA3LjA3MmExLjUgMS41IDAgMDEtMi4xMiAyLjEyMWwtNy4wNzMtNy4wNy03LjA3IDcuMDdhMS41IDEuNSAwIDAxLTIuMTIxLTIuMTJsNy4wNy03LjA3My03LjA3LTcuMDdhMS41IDEuNSAwIDAxMi4xMi0yLjEyMUwyMCAxNy44NzhsNy4wNzItNy4wN2ExLjUgMS41IDAgMDEyLjEyMSAweiIgY2xhc3M9ImZpbGwtY29sb3IiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==`;
@@ -1,5 +0,0 @@
1
- import { html } from 'lit-html';
2
-
3
- export default html`
4
- <svg name="sort-asc" height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m2.32514544 8.30769231.7756949-2.08468003h2.92824822l.75630252 2.08468003h1.01809955l-2.70523594-6.92307693h-1.01809955l-2.69553976 6.92307693zm3.41305753-2.86037492h-2.34647705l1.17323853-3.22883h.01939237z" fill="#fff" fill-rule="nonzero"/><path d="m7.1689722 16.6153846v-.7756949h-4.4117647l4.29541047-5.3716871v-.77569491h-5.06140918v.77569491h3.97543633l-4.30510666 5.3716871v.7756949z" fill="#fff" fill-rule="nonzero"/><path d="m10.3846154 11.0769231 2.7692308 5.5384615 2.7692307-5.5384615m-2.7692307 4.1538461v-13.15384612" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.661538" transform="matrix(1 0 0 -1 0 18.692308)"/></g></svg>
5
- `;
@@ -1,5 +0,0 @@
1
- import { html } from 'lit-html';
2
-
3
- export default html`
4
- <svg name="sort-desc" height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m2.32514544 8.30769231.7756949-2.08468003h2.92824822l.75630252 2.08468003h1.01809955l-2.70523594-6.92307693h-1.01809955l-2.69553976 6.92307693zm3.41305753-2.86037492h-2.34647705l1.17323853-3.22883h.01939237z" fill="#fff" fill-rule="nonzero"/><path d="m7.1689722 16.6153846v-.7756949h-4.4117647l4.29541047-5.3716871v-.77569491h-5.06140918v.77569491h3.97543633l-4.30510666 5.3716871v.7756949z" fill="#fff" fill-rule="nonzero"/><path d="m10.3846154 11.0769231 2.7692308 5.5384615 2.7692307-5.5384615m-2.7692307 4.1538461v-13.15384612" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.661538"/></g></svg>
5
- `;
@@ -1,5 +0,0 @@
1
- import { html } from 'lit-html';
2
-
3
- export default html`
4
- <svg name="sort-neutral" height="18" viewBox="0 0 18 18" width="18" xmlns="http://www.w3.org/2000/svg"><g fill="#fff" fill-rule="evenodd"><path d="m2.32514544 8.30769231.7756949-2.08468003h2.92824822l.75630252 2.08468003h1.01809955l-2.70523594-6.92307693h-1.01809955l-2.69553976 6.92307693zm3.41305753-2.86037492h-2.34647705l1.17323853-3.22883h.01939237z" fill-rule="nonzero"/><path d="m7.1689722 16.6153846v-.7756949h-4.4117647l4.29541047-5.3716871v-.77569491h-5.06140918v.77569491h3.97543633l-4.30510666 5.3716871v.7756949z" fill-rule="nonzero"/><circle cx="13" cy="9" r="2"/></g></svg>
5
- `;
@@ -1,11 +0,0 @@
1
- import { html } from 'lit-html';
2
-
3
- export default html`
4
- <svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" aria-labelledby="volumesTitleID volumesDescID">
5
- <title id="volumesTitleID">Volumes icon</title>
6
- <desc id="volumesDescID">Three books stacked on each other</desc>
7
- <g fill="#ffffff">
8
- <path fill="#ffffff" d="m9.83536396 0h10.07241114c.1725502.47117517.3378411.76385809.4958725.87804878.1295523.11419069.3199719.1998337.5712586.25692905.2512868.05709534.4704647.08564301.6575337.08564301h.2806036v15.24362526h-4.3355343v3.8106985h-4.44275v3.7250554h-12.01318261c-.27306495 0-.50313194-.085643-.69020098-.256929-.18706903-.1712861-.30936193-.3425721-.36687867-.5138581l-.06449694-.2785477v-14.2159091c0-.32815965.08627512-.5922949.25882537-.79240577.17255024-.20011086.34510049-.32150776.51765073-.36419068l.25882537-.0640244h3.36472977v-2.54767184c0-.31374722.08627513-.57067627.25882537-.77078714.17255025-.20011086.34510049-.32150776.51765074-.36419068l.25882536-.06402439h3.36472978v-2.56929047c0-.32815964.08627512-.5922949.25882537-.79240576.17255024-.20011087.34510049-.31430156.51765073-.34257207zm10.78355264 15.6294346v-13.53076498c-.2730649-.08536585-.4456152-.16380266-.5176507-.23531042-.1725502-.1424612-.2730649-.27078714-.3015441-.38497783v13.36031043h-9.87808272c0 .0144124-.02149898.0144124-.06449694 0-.04299795-.0144124-.08962561.006929-.13988296.0640244-.05025735.0570953-.07538603.1427383-.07538603.256929s.02149898.210643.06449694.289357c.04299795.078714.08599591.1322062.12899387.1604767l.06449693.0216187h10.71905571zm-10.2449613-2.4412417h7.98003v-11.60421286h-7.98003zm1.6827837-9.41990022h4.6153002c.1725502 0 .3199718.05349224.4422647.16047672s.1834393.23891353.1834393.39578714c0 .15687362-.0611464.28519956-.1834393.38497783s-.2697145.1496674-.4422647.1496674h-4.6153002c-.1725503 0-.3199719-.04988913-.4422647-.1496674-.1222929-.09977827-.1834394-.22810421-.1834394-.38497783 0-.15687361.0611465-.28880266.1834394-.39578714.1222928-.10698448.2697144-.16047672.4422647-.16047672zm-6.08197737 13.50997782h7.72120467v-.8131929h-3.79610541c-.27306495 0-.49950224-.085643-.67931188-.256929-.17980964-.1712861-.29847284-.3425721-.35598958-.5138581l-.06449694-.2785477v-10.02023282h-2.82530086zm6.77217827-11.36890243h3.2139578c.1295522 0 .240956.05709534.3342113.17128603.0932554.11419069.139883.24972284.139883.40659645 0 .15687362-.0466276.28880267-.139883.39578714-.0932553.10698448-.2046591.16047672-.3342113.16047672h-3.2139578c-.1295523 0-.2373264-.05349224-.3233223-.16047672-.0859959-.10698447-.1289938-.23891352-.1289938-.39578714 0-.15687361.0429979-.29240576.1289938-.40659645s.19377-.17128603.3233223-.17128603zm-11.15043132 15.11557653h7.69942646v-.7491685h-3.79610539c-.25854616 0-.48135376-.0892462-.66842279-.2677384-.18706904-.1784922-.30936193-.3605876-.36687868-.546286l-.06449694-.2569291v-10.04101994h-2.80352266zm14.62237682-4.5606985h-.8191949v2.1410754h-9.89986085s-.04299796.0285477-.12899387.085643c-.08599592.0570954-.12201369.1427384-.10805331.2569291 0 .1141907.01786928.210643.05360784.289357.03573856.0787139.07538603.125.1189424.138858l.06449694.0432373h10.71905575v-2.9542683zm-4.3991936 3.8106985h-.8191949v2.077051h-9.8563045c0 .0144124-.02149898.0144124-.06449694 0-.04299795-.0144125-.08962561.0105321-.13988296.0748337-.05025735.0643015-.07538603.1607538-.07538603.289357 0 .1141906.02149898.2070399.06449694.2785476.04299795.0715078.08599591.1141907.12899387.1280488l.06449693.0216186h10.69811519v-2.8686252z" />
9
- </g>
10
- </svg>
11
- `;