@internetarchive/bookreader 5.0.0-11 → 5.0.0-110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +604 -1239
  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 +1907 -0
  53. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +19 -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/slider-toggle.svg +1 -0
  74. package/BookReader/icons/thumbnails.svg +1 -1
  75. package/BookReader/icons/voice.svg +1 -0
  76. package/BookReader/icons/volume-full.svg +1 -1
  77. package/BookReader/images/BRicons.svg +3 -3
  78. package/BookReader/images/books_graphic.svg +1 -1
  79. package/BookReader/images/hypothesis.ico +0 -0
  80. package/BookReader/images/icon_book.svg +1 -1
  81. package/BookReader/images/icon_bookmark.svg +1 -1
  82. package/BookReader/images/icon_experiment.svg +1 -0
  83. package/BookReader/images/icon_gear.svg +1 -1
  84. package/BookReader/images/icon_hamburger.svg +1 -1
  85. package/BookReader/images/icon_home.svg +1 -1
  86. package/BookReader/images/icon_info.svg +1 -1
  87. package/BookReader/images/icon_one_page.svg +1 -1
  88. package/BookReader/images/icon_pause.svg +1 -1
  89. package/BookReader/images/icon_play.svg +1 -1
  90. package/BookReader/images/icon_playback-rate.svg +1 -1
  91. package/BookReader/images/icon_search_button.svg +1 -1
  92. package/BookReader/images/icon_share.svg +1 -1
  93. package/BookReader/images/icon_skip-ahead.svg +1 -1
  94. package/BookReader/images/icon_skip-back.svg +1 -1
  95. package/BookReader/images/icon_speaker.svg +1 -1
  96. package/BookReader/images/icon_speaker_open.svg +1 -1
  97. package/BookReader/images/icon_thumbnails.svg +1 -1
  98. package/BookReader/images/icon_toc.svg +1 -1
  99. package/BookReader/images/icon_two_pages.svg +1 -1
  100. package/BookReader/images/marker_chap-off.svg +1 -1
  101. package/BookReader/images/marker_chap-on.svg +1 -1
  102. package/BookReader/images/marker_srch-on.svg +1 -1
  103. package/BookReader/images/translate.svg +1 -0
  104. package/BookReader/images/unviewable_page.png +0 -0
  105. package/BookReader/jquery-3.js +2 -0
  106. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  107. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  108. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  109. package/BookReader/plugins/plugin.autoplay.js +1 -1
  110. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  111. package/BookReader/plugins/plugin.chapters.js +22 -1
  112. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  113. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  114. package/BookReader/plugins/plugin.experiments.js +3 -0
  115. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  116. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  117. package/BookReader/plugins/plugin.iframe.js +1 -1
  118. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  119. package/BookReader/plugins/plugin.iiif.js +2 -0
  120. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  121. package/BookReader/plugins/plugin.resume.js +1 -1
  122. package/BookReader/plugins/plugin.resume.js.map +1 -1
  123. package/BookReader/plugins/plugin.search.js +2 -1
  124. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  125. package/BookReader/plugins/plugin.search.js.map +1 -1
  126. package/BookReader/plugins/plugin.text_selection.js +2 -1
  127. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  128. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  129. package/BookReader/plugins/plugin.translate.js +137 -0
  130. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  131. package/BookReader/plugins/plugin.translate.js.map +1 -0
  132. package/BookReader/plugins/plugin.tts.js +1 -1
  133. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  134. package/BookReader/plugins/plugin.tts.js.map +1 -1
  135. package/BookReader/plugins/plugin.url.js +1 -1
  136. package/BookReader/plugins/plugin.url.js.map +1 -1
  137. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  138. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  139. package/BookReader/plugins/translator-worker.js +2 -0
  140. package/BookReader/plugins/translator-worker.js.map +1 -0
  141. package/BookReader/silence.mp3 +0 -0
  142. package/BookReader/translator-worker.js +475 -0
  143. package/BookReader/webcomponents-bundle.js +3 -0
  144. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  145. package/BookReader/webcomponents-bundle.js.map +1 -0
  146. package/README.md +14 -3
  147. package/jsconfig.json +19 -0
  148. package/package.json +92 -70
  149. package/src/BookReader/BookModel.js +92 -46
  150. package/src/BookReader/DragScrollable.js +233 -0
  151. package/src/BookReader/ImageCache.js +49 -16
  152. package/src/BookReader/Mode1Up.js +66 -365
  153. package/src/BookReader/Mode1UpLit.js +392 -0
  154. package/src/BookReader/Mode2Up.js +87 -1315
  155. package/src/BookReader/Mode2UpLit.js +788 -0
  156. package/src/BookReader/ModeAbstract.js +43 -0
  157. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  158. package/src/BookReader/ModeSmoothZoom.js +312 -0
  159. package/src/BookReader/ModeThumb.js +29 -15
  160. package/src/BookReader/Navbar/Navbar.js +201 -76
  161. package/src/BookReader/PageContainer.js +120 -23
  162. package/src/BookReader/ReduceSet.js +2 -2
  163. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  164. package/src/BookReader/events.js +3 -3
  165. package/src/BookReader/options.js +94 -17
  166. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  167. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  168. package/src/BookReader/utils/SelectionObserver.js +45 -0
  169. package/src/BookReader/utils/classes.js +1 -1
  170. package/src/BookReader/utils.js +136 -12
  171. package/src/BookReader.js +678 -1226
  172. package/src/BookReaderPlugin.js +52 -0
  173. package/src/assets/icons/magnify-minus.svg +3 -7
  174. package/src/assets/icons/magnify-plus.svg +3 -7
  175. package/src/assets/icons/slider-toggle.svg +1 -0
  176. package/src/assets/icons/voice.svg +1 -0
  177. package/src/assets/images/hypothesis.ico +0 -0
  178. package/src/assets/images/icon_experiment.svg +1 -0
  179. package/src/assets/images/translate.svg +1 -0
  180. package/src/assets/images/unviewable_page.png +0 -0
  181. package/src/assets/silence.mp3 +0 -0
  182. package/src/css/BookReader.scss +1 -5
  183. package/src/css/_BRBookmarks.scss +1 -1
  184. package/src/css/_BRComponent.scss +1 -1
  185. package/src/css/_BRicon.scss +8 -2
  186. package/src/css/_BRmain.scss +16 -3
  187. package/src/css/_BRnav.scss +74 -70
  188. package/src/css/_BRpages.scss +171 -42
  189. package/src/css/_BRsearch.scss +69 -30
  190. package/src/css/_BRtoolbar.scss +5 -5
  191. package/src/css/_TextSelection.scss +129 -24
  192. package/src/css/_colorbox.scss +2 -2
  193. package/src/css/_controls.scss +24 -7
  194. package/src/css/_icons.scss +8 -1
  195. package/src/{BookNavigator/assets → css}/button-base.js +2 -2
  196. package/src/css/icon_checkmark.js +9 -0
  197. package/src/css/sharedStyles.js +15 -0
  198. package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
  199. package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
  200. package/src/ia-bookreader/ia-bookreader.js +666 -0
  201. package/src/ia-bookreader/sharing.js +27 -0
  202. package/src/ia-bookreader/viewable-files.js +98 -0
  203. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
  204. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
  205. package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
  206. package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
  207. package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
  208. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  209. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
  210. package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
  211. package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
  212. package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
  213. package/src/plugins/plugin.archive_analytics.js +84 -78
  214. package/src/plugins/plugin.autoplay.js +99 -104
  215. package/src/plugins/plugin.chapters.js +314 -205
  216. package/src/plugins/plugin.experiments.js +321 -0
  217. package/src/plugins/plugin.iframe.js +1 -1
  218. package/src/plugins/plugin.iiif.js +141 -0
  219. package/src/plugins/plugin.resume.js +54 -51
  220. package/src/plugins/plugin.text_selection.js +522 -219
  221. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  222. package/src/plugins/search/plugin.search.js +374 -392
  223. package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
  224. package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
  225. package/src/plugins/search/utils.js +50 -0
  226. package/src/plugins/search/view.js +50 -68
  227. package/src/plugins/translate/TranslationManager.js +164 -0
  228. package/src/plugins/translate/plugin.translate.js +512 -0
  229. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  230. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  231. package/src/plugins/tts/PageChunk.js +33 -21
  232. package/src/plugins/tts/PageChunkIterator.js +11 -17
  233. package/src/plugins/tts/WebTTSEngine.js +131 -91
  234. package/src/plugins/tts/plugin.tts.js +345 -350
  235. package/src/plugins/tts/utils.js +77 -49
  236. package/src/plugins/url/UrlPlugin.js +191 -0
  237. package/src/plugins/{plugin.url.js → url/plugin.url.js} +44 -15
  238. package/src/util/TextSelectionManager.js +282 -0
  239. package/src/util/browserSniffing.js +33 -1
  240. package/src/util/cache.js +20 -0
  241. package/src/util/docCookies.js +21 -2
  242. package/src/util/lit.js +15 -0
  243. package/src/util/strings.js +1 -0
  244. package/.babelrc +0 -12
  245. package/.dependabot/config.yml +0 -6
  246. package/.eslintrc.js +0 -50
  247. package/.gitattributes +0 -2
  248. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  249. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  250. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  251. package/.github/workflows/node.js.yml +0 -37
  252. package/.github/workflows/npm-publish.yml +0 -47
  253. package/.testcaferc.json +0 -5
  254. package/BookReader/bookreader-component-bundle.js +0 -1450
  255. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  256. package/BookReader/bookreader-component-bundle.js.map +0 -1
  257. package/BookReader/jquery-1.10.1.js +0 -2
  258. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  259. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  260. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  261. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  262. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  263. package/BookReaderDemo/BookReaderDemo.css +0 -41
  264. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  265. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  266. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  267. package/BookReaderDemo/IIIFBookReader.js +0 -207
  268. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  273. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  274. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  275. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  276. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  277. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  278. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  279. package/BookReaderDemo/demo-advanced.html +0 -33
  280. package/BookReaderDemo/demo-autoplay.html +0 -38
  281. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  282. package/BookReaderDemo/demo-embed.html +0 -26
  283. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  284. package/BookReaderDemo/demo-fullscreen.html +0 -33
  285. package/BookReaderDemo/demo-iiif.html +0 -34
  286. package/BookReaderDemo/demo-iiif.js +0 -26
  287. package/BookReaderDemo/demo-internetarchive.html +0 -74
  288. package/BookReaderDemo/demo-multiple.html +0 -43
  289. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  290. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  291. package/BookReaderDemo/demo-simple.html +0 -34
  292. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  293. package/BookReaderDemo/immersion-1up.html +0 -64
  294. package/BookReaderDemo/immersion-mode.html +0 -35
  295. package/BookReaderDemo/toggle_controls.html +0 -53
  296. package/BookReaderDemo/view_mode.html +0 -39
  297. package/BookReaderDemo/viewmode-cycle.html +0 -41
  298. package/CHANGELOG.md +0 -495
  299. package/CONTRIBUTING.md +0 -7
  300. package/codecov.yml +0 -17
  301. package/index.html +0 -31
  302. package/karma.conf.js +0 -23
  303. package/screenshot.png +0 -0
  304. package/scripts/postversion.js +0 -10
  305. package/scripts/preversion.js +0 -14
  306. package/scripts/version.js +0 -26
  307. package/src/BookNavigator/BookModel.js +0 -14
  308. package/src/BookNavigator/BookNavigator.js +0 -446
  309. package/src/BookNavigator/assets/book-loader.js +0 -27
  310. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  311. package/src/BookNavigator/assets/icon_close.js +0 -3
  312. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  313. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  314. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  315. package/src/BookNavigator/search/a-search-result.js +0 -55
  316. package/src/BookReader/DebugConsole.js +0 -54
  317. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  318. package/src/ItemNavigator/ItemNavigator.js +0 -376
  319. package/src/ItemNavigator/providers/sharing.js +0 -29
  320. package/src/css/_MobileNav.scss +0 -194
  321. package/src/dragscrollable-br.js +0 -261
  322. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  323. package/src/plugins/plugin.mobile_nav.js +0 -287
  324. package/tests/BookReader/BookModel.test.js +0 -312
  325. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  326. package/tests/BookReader/DebugConsole.test.js +0 -25
  327. package/tests/BookReader/ImageCache.test.js +0 -150
  328. package/tests/BookReader/Mode1Up.test.js +0 -164
  329. package/tests/BookReader/Mode2Up.test.js +0 -247
  330. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  331. package/tests/BookReader/PageContainer.test.js +0 -115
  332. package/tests/BookReader/ReduceSet.test.js +0 -38
  333. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  334. package/tests/BookReader/utils/classes.test.js +0 -88
  335. package/tests/BookReader/utils.test.js +0 -109
  336. package/tests/BookReader.options.test.js +0 -39
  337. package/tests/BookReader.test.js +0 -301
  338. package/tests/e2e/README.md +0 -75
  339. package/tests/e2e/autoplay.test.js +0 -13
  340. package/tests/e2e/base.test.js +0 -35
  341. package/tests/e2e/helpers/base.js +0 -263
  342. package/tests/e2e/helpers/debug.js +0 -13
  343. package/tests/e2e/helpers/desktopSearch.js +0 -72
  344. package/tests/e2e/helpers/mobileSearch.js +0 -85
  345. package/tests/e2e/helpers/mockSearch.js +0 -93
  346. package/tests/e2e/helpers/rightToLeft.js +0 -29
  347. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  348. package/tests/e2e/models/BookReader.js +0 -11
  349. package/tests/e2e/models/Navigation.js +0 -56
  350. package/tests/e2e/rightToLeft.test.js +0 -20
  351. package/tests/e2e/viewmode.test.js +0 -37
  352. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  353. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  354. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  355. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  356. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  357. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  358. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  359. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  360. package/tests/plugins/plugin.autoplay.test.js +0 -52
  361. package/tests/plugins/plugin.chapters.test.js +0 -130
  362. package/tests/plugins/plugin.iframe.test.js +0 -42
  363. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  364. package/tests/plugins/plugin.resume.test.js +0 -98
  365. package/tests/plugins/plugin.text_selection.test.js +0 -203
  366. package/tests/plugins/plugin.url.test.js +0 -129
  367. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  368. package/tests/plugins/search/plugin.search.test.js +0 -173
  369. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  370. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  371. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  372. package/tests/plugins/tts/PageChunk.test.js +0 -57
  373. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  374. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  375. package/tests/plugins/tts/utils.test.js +0 -133
  376. package/tests/util/browserSniffing.test.js +0 -56
  377. package/tests/util/docCookies.test.js +0 -15
  378. package/tests/util/strings.test.js +0 -63
  379. package/tests/utils.js +0 -42
  380. package/webpack.config.js +0 -86
@@ -0,0 +1,98 @@
1
+ import { html } from 'lit';
2
+
3
+ import { viewableFilesIcon } from '@internetarchive/ia-item-navigator/dist/src/menus/viewable-files.js';
4
+ import '@internetarchive/ia-item-navigator/dist/src/menus/viewable-files.js';
5
+
6
+ /**
7
+ * * @typedef { 'title_asc' | 'title_desc' | 'default'} SortTypesT
8
+ */
9
+ const sortTypes = {
10
+ title_asc: 'title_asc',
11
+ title_desc: 'title_desc',
12
+ default: 'default',
13
+ };
14
+ export default class ViewableFilesProvider {
15
+ /**
16
+ * @param {object} options
17
+ * @param {import('../BookReader').default} options.bookreader
18
+ * @param {string} options.baseHost
19
+ * @param {function} options.onProviderChange
20
+ */
21
+ constructor({ baseHost, bookreader, onProviderChange }) {
22
+ /** @type {import('../BookReader').default} */
23
+ this.bookreader = bookreader;
24
+ this.onProviderChange = onProviderChange;
25
+ this.baseHost = baseHost;
26
+
27
+ const files = bookreader.options.multipleBooksList.by_subprefix;
28
+ this.viewableFiles = Object.keys(files).map(item => files[item]);
29
+ this.volumeCount = Object.keys(files).length;
30
+
31
+ this.id = "volumes";
32
+ this.label = `Viewable files (${this.volumeCount})`;
33
+ this.icon = html`${viewableFilesIcon}`;
34
+ this.sortOrderBy = sortTypes.default;
35
+
36
+ this.component = document.createElement("iaux-in-viewable-files-panel");
37
+ this.component.addSortToUrl = true;
38
+ this.component.subPrefix = bookreader.options.subPrefix || "";
39
+ this.component.baseHost = baseHost;
40
+ this.component.fileList = [...this.viewableFiles];
41
+
42
+ this.sortFilesComponent = document.createElement("iaux-in-sort-files-button");
43
+ this.sortFilesComponent.fileListRaw = this.viewableFiles;
44
+ this.sortFilesComponent.addEventListener('fileListSorted', (e) => this.handleFileListSorted(e));
45
+ this.actionButton = this.sortFilesComponent;
46
+
47
+ // get sort state from query param
48
+ if (this.bookreader.urlPlugin) {
49
+ this.bookreader.urlPlugin.pullFromAddressBar();
50
+
51
+ const urlSortValue = this.bookreader.urlPlugin.getUrlParam('sort');
52
+ if (urlSortValue === sortTypes.title_asc || urlSortValue === sortTypes.title_desc) {
53
+ this.sortOrderBy = urlSortValue;
54
+ }
55
+ }
56
+
57
+ this.sortFilesComponent.sortVolumes(this.sortOrderBy);
58
+
59
+ this.onProviderChange(this.bookreader);
60
+ }
61
+
62
+ /** @param { SortTypesT } sortType */
63
+ async handleFileListSorted(event) {
64
+ const { sortType, sortedFiles } = event.detail;
65
+
66
+ this.viewableFiles = sortedFiles;
67
+ this.sortOrderBy = sortType;
68
+
69
+ // update the component
70
+ this.component.fileList = [...this.viewableFiles];
71
+ await this.component.updateComplete;
72
+
73
+ if (this.bookreader.urlPlugin) {
74
+ this.bookreader.urlPlugin.pullFromAddressBar();
75
+ if (this.sortOrderBy !== sortTypes.default) {
76
+ this.bookreader.urlPlugin.setUrlParam('sort', this.sortOrderBy);
77
+ } else {
78
+ this.bookreader.urlPlugin.removeUrlParam('sort');
79
+ }
80
+ }
81
+
82
+ this.onProviderChange(this.bookreader);
83
+
84
+ this.multipleFilesClicked(this.sortOrderBy);
85
+ }
86
+
87
+ /**
88
+ * @param { SortTypesT } orderBy
89
+ */
90
+ multipleFilesClicked(orderBy) {
91
+ window.archive_analytics?.send_event(
92
+ 'BookReader',
93
+ `VolumesSort|${orderBy}`,
94
+ window.location.path,
95
+ );
96
+ }
97
+
98
+ }
@@ -1,4 +1,5 @@
1
- import { html } from 'lit-element';
1
+ import { html } from 'lit';
2
+ import '@internetarchive/icon-visual-adjustment/icon-visual-adjustment.js';
2
3
  import './visual-adjustments.js';
3
4
 
4
5
  const visualAdjustmentOptions = [{
@@ -6,32 +7,31 @@ const visualAdjustmentOptions = [{
6
7
  name: 'Adjust brightness',
7
8
  active: false,
8
9
  min: 0,
9
- max: 150,
10
+ max: 200,
10
11
  step: 1,
11
- value: 100,
12
+ value: 120,
12
13
  }, {
13
14
  id: 'contrast',
14
15
  name: 'Adjust contrast',
15
16
  active: false,
16
17
  min: 0,
17
- max: 150,
18
+ max: 200,
18
19
  step: 1,
19
- value: 100,
20
+ value: 120,
20
21
  }, {
21
22
  id: 'invert',
22
- name: 'Inverted colors (dark mode)',
23
+ name: 'Invert colors (dark mode)',
23
24
  active: false,
24
25
  }, {
25
26
  id: 'grayscale',
26
- name: 'Grayscale',
27
+ name: 'Convert to grayscale',
27
28
  active: false,
28
29
  }];
29
30
 
30
- export default class {
31
- constructor(options) {
32
- const { onOptionChange = () => {}, bookContainerSelector, bookreader } = options;
33
- this.onOptionChange = onOptionChange;
34
- this.bookContainerSelector = bookContainerSelector;
31
+ export default class VisualAdjustmentsProvider {
32
+ constructor({ onProviderChange, bookreader }) {
33
+ this.onProviderChange = onProviderChange;
34
+ this.bookContainer = bookreader.refs.$brContainer;
35
35
  this.bookreader = bookreader;
36
36
 
37
37
  this.onAdjustmentChange = this.onAdjustmentChange.bind(this);
@@ -41,10 +41,10 @@ export default class {
41
41
  this.onZoomOut = this.onZoomOut.bind(this);
42
42
 
43
43
  this.activeCount = 0;
44
- this.icon = html`<ia-icon icon="visualAdjustment" style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon>`;
44
+ this.icon = html`<ia-icon-visual-adjustment aria-hidden="true" role="presentation" style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon-visual-adjustment>`;
45
45
  this.label = 'Visual Adjustments';
46
46
  this.menuDetails = this.updateOptionsCount();
47
- this.id = 'adjustment';
47
+ this.id = 'visualAdjustments';
48
48
  this.component = html`
49
49
  <ia-book-visual-adjustments
50
50
  .options=${visualAdjustmentOptions}
@@ -60,7 +60,7 @@ export default class {
60
60
  }
61
61
 
62
62
  onZoomOut() {
63
- this.bookreader.zoom();
63
+ this.bookreader.zoom(-1);
64
64
  }
65
65
 
66
66
  onAdjustmentChange(event) {
@@ -76,7 +76,7 @@ export default class {
76
76
  return newValue ? [...values, newValue] : values;
77
77
  }, []).join(' ');
78
78
 
79
- document.querySelector(this.bookContainerSelector).style.setProperty('filter', filters);
79
+ this.bookContainer.css('filter', filters);
80
80
 
81
81
  this.optionUpdateComplete(event);
82
82
  }
@@ -84,7 +84,7 @@ export default class {
84
84
  optionUpdateComplete(event) {
85
85
  this.activeCount = event.detail.activeCount;
86
86
  this.updateOptionsCount(event);
87
- this.onOptionChange(event);
87
+ this.onProviderChange();
88
88
  }
89
89
 
90
90
  updateOptionsCount() {
@@ -1,9 +1,9 @@
1
- import { css, html, LitElement } from "lit-element";
2
- import { repeat } from "lit-html/directives/repeat.js";
3
- import { nothing } from "lit-html";
4
- import checkmarkIcon from '../assets/icon_checkmark.js';
5
- import "@internetarchive/icon-magnify-minus/icon-magnify-minus";
6
- import "@internetarchive/icon-magnify-plus/icon-magnify-plus";
1
+ import { css, html, LitElement, nothing } from "lit";
2
+ import { classMap } from 'lit/directives/class-map.js';
3
+ import { repeat } from "lit/directives/repeat.js";
4
+ import { sharedStyles } from '../../css/sharedStyles.js';
5
+ import "@internetarchive/icon-magnify-minus/icon-magnify-minus.js";
6
+ import "@internetarchive/icon-magnify-plus/icon-magnify-plus.js";
7
7
 
8
8
  const namespacedEvent = (eventName) => `visualAdjustment${eventName}`;
9
9
 
@@ -43,7 +43,7 @@ export class IABookVisualAdjustments extends LitElement {
43
43
  get activeOptions() {
44
44
  return this.options.reduce(
45
45
  (results, option) => (option.active ? [...results, option.id] : results),
46
- []
46
+ [],
47
47
  );
48
48
  }
49
49
 
@@ -71,7 +71,7 @@ export class IABookVisualAdjustments extends LitElement {
71
71
  bubbles: true,
72
72
  composed: true,
73
73
  detail,
74
- })
74
+ }),
75
75
  );
76
76
  }
77
77
 
@@ -93,12 +93,19 @@ export class IABookVisualAdjustments extends LitElement {
93
93
  changeActiveStateFor(optionName) {
94
94
  const updatedOptions = [...this.options];
95
95
  const checkedOption = updatedOptions.find(
96
- (option) => option.id === optionName
96
+ (option) => option.id === optionName,
97
97
  );
98
98
  checkedOption.active = !checkedOption.active;
99
99
  this.options = updatedOptions;
100
100
  this.activeCount = this.activeOptions.length;
101
101
  this.emitOptionChangedEvent(checkedOption.id);
102
+ if (checkedOption.active && checkedOption.value !== undefined) {
103
+ // move focus to the range input
104
+ const rangeInput = this.shadowRoot.querySelector(`input[name="${checkedOption.id}_range"]`);
105
+ requestAnimationFrame(() => {
106
+ rangeInput?.focus();
107
+ });
108
+ }
102
109
  }
103
110
 
104
111
  setRangeValue(id, value) {
@@ -110,7 +117,8 @@ export class IABookVisualAdjustments extends LitElement {
110
117
  /* render */
111
118
  rangeSlider(option) {
112
119
  return html`
113
- <div class=${`range${option.active ? " visible" : ""}`}>
120
+ <label class=${`range${option.active ? " visible" : ""}`}>
121
+ <span class="sr-only">${option.name}</span>
114
122
  <input
115
123
  type="range"
116
124
  name="${option.id}_range"
@@ -118,30 +126,30 @@ export class IABookVisualAdjustments extends LitElement {
118
126
  max=${option.max || 100}
119
127
  step=${option.step || 1}
120
128
  .value=${option.value}
129
+ aria-valuetext=${`${option.value}%`}
121
130
  @input=${(e) => this.setRangeValue(option.id, e.target.value)}
122
131
  @change=${() => this.emitOptionChangedEvent()}
123
132
  />
124
- <p>${option.value}%</p>
125
- </div>
133
+ <span aria-hidden="true">${option.value}%</span>
134
+ </label>
126
135
  `;
127
136
  }
128
137
 
129
138
  adjustmentCheckbox(option) {
130
- const formID = `adjustment_${option.id}`;
131
- return html`<li>
132
- <label for="${formID}">
133
- <span class="name">${option.name}</span>
134
- <input
135
- type="checkbox"
136
- name="${formID}"
137
- id="${formID}"
138
- @change=${() => this.changeActiveStateFor(option.id)}
139
- ?checked=${option.active}
140
- />
141
- <span class="icon"></span>
142
- </label>
143
- ${option.value !== undefined ? this.rangeSlider(option) : nothing}
144
- </li>`;
139
+ return html`
140
+ <div
141
+ class="adjustment-option ${classMap({active: option.active, 'has-range': option.value !== undefined})}">
142
+ <label class="checkbox-label">
143
+ ${option.name}
144
+ <input
145
+ type="checkbox"
146
+ @change=${() => this.changeActiveStateFor(option.id)}
147
+ ?checked=${option.active}
148
+ />
149
+ </label>
150
+ ${option.value !== undefined ? this.rangeSlider(option) : nothing}
151
+ </div>
152
+ `;
145
153
  }
146
154
 
147
155
  get headerSection() {
@@ -157,12 +165,12 @@ export class IABookVisualAdjustments extends LitElement {
157
165
 
158
166
  get zoomControls() {
159
167
  return html`
160
- <h4>Zoom</h4>
161
- <button class="zoom_out" @click=${this.emitZoomOut} title="zoom out">
162
- <ia-icon-magnify-minus></ia-icon-magnify-minus>
168
+ <h4>Adjust zoom</h4>
169
+ <button class="zoom_out" @click=${this.emitZoomOut} title="Zoom out" aria-label="Zoom out">
170
+ <ia-icon-magnify-minus aria-hidden="true" role="presentation"></ia-icon-magnify-minus>
163
171
  </button>
164
- <button class="zoom_in" @click=${this.emitZoomIn} title="zoom in">
165
- <ia-icon-magnify-plus></ia-icon-magnify-plus>
172
+ <button class="zoom_in" @click=${this.emitZoomIn} title="Zoom in" aria-label="Zoom in">
173
+ <ia-icon-magnify-plus aria-hidden="true" role="presentation"></ia-icon-magnify-plus>
166
174
  </button>
167
175
  `;
168
176
  }
@@ -171,21 +179,20 @@ export class IABookVisualAdjustments extends LitElement {
171
179
  render() {
172
180
  return html`
173
181
  ${this.headerSection}
174
- <ul>
175
- ${repeat(this.options, (option) => option.id, this.adjustmentCheckbox.bind(this))}
176
- </ul>
182
+ ${repeat(this.options, (option) => option.id, this.adjustmentCheckbox.bind(this))}
177
183
  ${this.showZoomControls ? this.zoomControls : nothing}
178
184
  `;
179
185
  }
180
186
 
181
187
  static get styles() {
182
- return css`
188
+ const main = css`
183
189
  :host {
184
190
  display: block;
185
191
  height: 100%;
186
192
  overflow-y: auto;
187
193
  font-size: 1.4rem;
188
194
  box-sizing: border-box;
195
+ padding: 10px 10px 0 0;
189
196
  }
190
197
 
191
198
  header {
@@ -207,49 +214,48 @@ export class IABookVisualAdjustments extends LitElement {
207
214
  font-style: italic;
208
215
  }
209
216
 
210
- ul {
211
- padding: 1rem 2rem 0 0;
212
- list-style: none;
213
- margin-top: 0;
217
+ .adjustment-option {
218
+ border: 2px solid transparent;
219
+ border-radius: 4px;
220
+ margin-bottom: 4px;
214
221
  }
215
-
216
- [type="checkbox"] {
217
- display: none;
222
+ .adjustment-option.has-range.active {
223
+ border: 2px solid rgba(255, 255, 255, 0.2);
218
224
  }
219
225
 
220
- label {
226
+ .checkbox-label {
221
227
  display: flex;
222
228
  justify-content: space-between;
223
- align-items: baseline;
229
+ align-items: center;
224
230
  font-size: 1.4rem;
225
231
  font-weight: bold;
226
- line-height: 150%;
227
- vertical-align: middle;
232
+ cursor: pointer;
233
+ padding: 6px 8px;
234
+ transition: background-color 0.2s;
235
+ border-radius: inherit;
228
236
  }
229
-
230
- .icon {
231
- display: inline-block;
232
- width: 14px;
233
- height: 14px;
234
- margin-left: .7rem;
235
- border: 1px solid var(--primaryTextColor);
236
- border-radius: 2px;
237
- background: var(--activeButtonBg) 50% 50% no-repeat;
237
+ .checkbox-label:hover {
238
+ background-color: rgba(255, 255, 255, 0.1);
239
+ }
240
+ .adjustment-option.has-range.active > .checkbox-label {
241
+ border-radius: 4px 4px 0 0;
238
242
  }
239
- :checked + .icon {
240
- background-image: url('${checkmarkIcon}');
243
+
244
+ [type="checkbox"] {
245
+ transform: scale(1.5);
241
246
  }
242
247
 
243
248
  .range {
244
249
  display: none;
245
- padding-top: .5rem;
250
+ padding: 10px;
251
+ align-items: center;
252
+ gap: 10px;
246
253
  }
247
254
  .range.visible {
248
255
  display: flex;
249
256
  }
250
-
251
- .range p {
252
- margin-left: 1rem;
257
+ .range input[type="range"] {
258
+ flex: 1;
253
259
  }
254
260
 
255
261
  h4 {
@@ -262,19 +268,21 @@ export class IABookVisualAdjustments extends LitElement {
262
268
  -webkit-appearance: none;
263
269
  appearance: none;
264
270
  border: none;
265
- border-radius: 0;
266
271
  background: transparent;
267
- outline: none;
268
272
  cursor: pointer;
269
273
  --iconFillColor: var(--primaryTextColor);
270
274
  --iconStrokeColor: var(--primaryTextColor);
271
275
  height: 4rem;
272
276
  width: 4rem;
277
+ transition: background-color 0.2s;
278
+ border-radius: 4px;
273
279
  }
274
280
 
275
- button * {
276
- display: inline-block;
277
- }`;
281
+ button:hover {
282
+ background-color: rgba(255, 255, 255, 0.1);
283
+ }
284
+ `;
285
+ return [sharedStyles, main];
278
286
  }
279
287
  }
280
288
  customElements.define('ia-book-visual-adjustments', IABookVisualAdjustments);
@@ -1,4 +1,4 @@
1
- import { LitElement, html, css } from 'lit-element';
1
+ import { LitElement, html, css } from 'lit';
2
2
 
3
3
  export default class BookmarkButton extends LitElement {
4
4
  static get styles() {
@@ -12,7 +12,7 @@ export default class BookmarkButton extends LitElement {
12
12
  height: 4rem;
13
13
  width: 4rem;
14
14
  background: transparent;
15
- cursor: url('/images/bookreader/bookmark-add.png'), pointer;
15
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 0 16 24' width='16'%3E%3Cg fill='%23333' fill-rule='evenodd'%3E%3Cpath d='m15 0c.5522847 0 1 .44771525 1 1v23l-8-5.4545455-8 5.4545455v-23c0-.55228475.44771525-1 1-1zm-2 2h-10c-.51283584 0-.93550716.38604019-.99327227.88337887l-.00672773.11662113v18l6-4.3181818 6 4.3181818v-18c0-.51283584-.3860402-.93550716-.8833789-.99327227z'/%3E%3Cpath d='m8.75 6v2.25h2.25v1.5h-2.25v2.25h-1.5v-2.25h-2.25v-1.5h2.25v-2.25z' fill-rule='nonzero'/%3E%3C/g%3E%3C/svg%3E"), pointer;
16
16
  position: relative;
17
17
  }
18
18
  button > * {
@@ -40,6 +40,7 @@ export default class BookmarkButton extends LitElement {
40
40
  constructor() {
41
41
  super();
42
42
  this.state = 'hollow';
43
+ this.side = undefined;
43
44
  }
44
45
 
45
46
  handleClick(e) {
@@ -55,7 +56,7 @@ export default class BookmarkButton extends LitElement {
55
56
  const position = this.side || 'right';
56
57
  return html`
57
58
  <button title=${this.title} @click=${this.handleClick} class=${position}>
58
- <icon-bookmark state=${this.state}></icon-bookmark>
59
+ <icon-bookmark state=${this.state} aria-hidden="true"></icon-bookmark>
59
60
  </button>
60
61
  `;
61
62
  }
@@ -1,4 +1,4 @@
1
- import { css } from 'lit-element';
1
+ import { css } from 'lit';
2
2
 
3
3
  export default css`
4
4
  .blue {
@@ -1,8 +1,7 @@
1
- import { nothing } from 'lit-html';
2
- import { repeat } from 'lit-html/directives/repeat.js';
3
- import { css, html, LitElement } from 'lit-element';
4
- import bookmarkColorsCSS from '../assets/bookmark-colors.js';
5
- import buttonCSS from '../assets/button-base.js';
1
+ import { repeat } from 'lit/directives/repeat.js';
2
+ import { css, html, LitElement, nothing } from 'lit';
3
+ import bookmarkColorsCSS from './bookmark-colors.js';
4
+ import buttonCSS from '../../css/button-base.js';
6
5
 
7
6
  export class IABookmarkEdit extends LitElement {
8
7
  static get properties() {
@@ -65,12 +64,12 @@ export class IABookmarkEdit extends LitElement {
65
64
 
66
65
  bookmarkColor(color) {
67
66
  return html`
68
- <li>
67
+ <div class="color-option">
69
68
  <input type="radio" name="color" id="color_${color.id}" .value=${color.id} @change=${() => this.changeColorTo(color.id)} ?checked=${this.bookmark.color === color.id}>
70
- <label for="color_${color.id}">
71
- <icon-bookmark class=${color.className}></icon-bookmark>
69
+ <label for="color_${color.id}" title=${color.className}>
70
+ <icon-bookmark class=${color.className} aria-hidden="true"></icon-bookmark>
72
71
  </label>
73
- </li>
72
+ </div>
74
73
  `;
75
74
  }
76
75
 
@@ -88,18 +87,18 @@ export class IABookmarkEdit extends LitElement {
88
87
  ${this.renderHeader ? IABookmarkEdit.headerSection : nothing}
89
88
  ${this.showBookmark ? this.bookmarkTemplate : nothing}
90
89
  <form action="" method="put" @submit=${this.emitSaveEvent}>
90
+ <label for="note">Note <small>(optional)</small></label>
91
+ <textarea rows="4" cols="80" name="note" id="note" @change=${this.updateNote}>${this.bookmark.note}</textarea>
91
92
  <fieldset>
92
- <label for="note">Note <small>(optional)</small></label>
93
- <textarea rows="4" cols="80" name="note" id="note" @change=${this.updateNote}>${this.bookmark.note}</textarea>
94
- <label for="color">Bookmark color</label>
95
- <ul>
93
+ <legend>Bookmark color</legend>
94
+ <div class="color-options">
96
95
  ${repeat(this.bookmarkColors, color => color.id, this.bookmarkColor.bind(this))}
97
- </ul>
98
- <div class="actions">
99
- <button type="button" class="ia-button cancel" @click=${this.emitDeleteEvent}>Delete</button>
100
- <input class="ia-button" type="submit" value="Save">
101
96
  </div>
102
97
  </fieldset>
98
+ <div class="actions">
99
+ <button type="button" class="ia-button cancel" @click=${this.emitDeleteEvent}>Delete</button>
100
+ <input class="ia-button" type="submit" value="Save">
101
+ </div>
103
102
  </form>
104
103
  `;
105
104
  }
@@ -129,11 +128,11 @@ export class IABookmarkEdit extends LitElement {
129
128
  }
130
129
 
131
130
  fieldset {
132
- padding: 2rem 0 0 0;
131
+ padding: 0;
133
132
  border: none;
134
133
  }
135
134
 
136
- label {
135
+ label, legend {
137
136
  display: block;
138
137
  font-weight: bold;
139
138
  }
@@ -153,21 +152,24 @@ export class IABookmarkEdit extends LitElement {
153
152
  resize: vertical;
154
153
  }
155
154
 
156
- ul {
157
- display: grid;
158
- grid-template-columns: repeat(3, auto);
159
- grid-gap: 0 2rem;
160
- justify-content: start;
161
- padding: 1rem 0 0 0;
162
- margin: 0 0 2rem 0;
163
- list-style: none;
155
+ .color-options {
156
+ display: flex;
157
+ gap: 10px;
158
+ }
159
+
160
+ .color-option {
161
+ position: relative;
164
162
  }
165
163
 
166
- li input {
167
- display: none;
164
+ .color-option input {
165
+ position: absolute;
166
+ opacity: 0;
167
+ width: 0;
168
+ height: 0;
169
+ pointer-events: none;
168
170
  }
169
171
 
170
- li label {
172
+ .color-option label {
171
173
  display: block;
172
174
  min-width: 50px;
173
175
  padding-top: .4rem;
@@ -177,10 +179,19 @@ export class IABookmarkEdit extends LitElement {
177
179
  cursor: pointer;
178
180
  }
179
181
 
180
- li input:checked + label {
182
+ .color-option input:checked + label {
181
183
  border-color: var(--primaryTextColor);
182
184
  }
183
185
 
186
+ .color-option input:focus + label {
187
+ outline: 2px solid currentColor;
188
+ outline-offset: 2px;
189
+ }
190
+
191
+ .color-option input:focus:not(:focus-visible) + label {
192
+ outline: none;
193
+ }
194
+
184
195
  input[type="submit"] {
185
196
  background: var(--primaryCTAFill);
186
197
  border-color: var(--primaryCTABorder);
@@ -203,6 +214,7 @@ export class IABookmarkEdit extends LitElement {
203
214
  }
204
215
 
205
216
  .actions {
217
+ margin-top: 20px;
206
218
  display: grid;
207
219
  grid-template-columns: auto auto;
208
220
  grid-gap: 0 1rem;