@internetarchive/ia-topnav 1.3.9 → 1.3.10-webdev-7394.1

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 (389) hide show
  1. package/.prettierignore +1 -0
  2. package/README.md +7 -7
  3. package/demo/app-root.ts +186 -0
  4. package/demo/index.html +27 -0
  5. package/dist/demo/app-root.d.ts +8 -0
  6. package/dist/demo/app-root.js +181 -0
  7. package/dist/demo/app-root.js.map +1 -0
  8. package/dist/index.d.ts +2 -0
  9. package/dist/index.js +3 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/src/assets/img/hamburger.d.ts +7 -0
  12. package/dist/src/assets/img/hamburger.js +51 -0
  13. package/dist/src/assets/img/hamburger.js.map +1 -0
  14. package/dist/src/assets/img/ia-icon.d.ts +7 -0
  15. package/dist/src/assets/img/ia-icon.js +33 -0
  16. package/dist/src/assets/img/ia-icon.js.map +1 -0
  17. package/dist/src/assets/img/icon-audio.d.ts +2 -0
  18. package/dist/src/assets/img/icon-audio.js +28 -0
  19. package/dist/src/assets/img/icon-audio.js.map +1 -0
  20. package/dist/src/assets/img/icon-close.d.ts +2 -0
  21. package/dist/src/assets/img/icon-close.js +20 -0
  22. package/dist/src/assets/img/icon-close.js.map +1 -0
  23. package/dist/src/assets/img/icon-donate-unpadded.d.ts +2 -0
  24. package/dist/src/assets/img/icon-donate-unpadded.js +19 -0
  25. package/dist/src/assets/img/icon-donate-unpadded.js.map +1 -0
  26. package/dist/src/assets/img/icon-donate.d.ts +2 -0
  27. package/dist/src/assets/img/icon-donate.js +18 -0
  28. package/dist/src/assets/img/icon-donate.js.map +1 -0
  29. package/dist/src/assets/img/icon-ellipses.d.ts +2 -0
  30. package/dist/src/assets/img/icon-ellipses.js +19 -0
  31. package/dist/src/assets/img/icon-ellipses.js.map +1 -0
  32. package/dist/src/assets/img/icon-ia-logo.d.ts +2 -0
  33. package/dist/src/assets/img/icon-ia-logo.js +30 -0
  34. package/dist/src/assets/img/icon-ia-logo.js.map +1 -0
  35. package/dist/src/assets/img/icon-images.d.ts +2 -0
  36. package/dist/src/assets/img/icon-images.js +19 -0
  37. package/dist/src/assets/img/icon-images.js.map +1 -0
  38. package/dist/src/assets/img/icon-search.d.ts +2 -0
  39. package/dist/src/assets/img/icon-search.js +19 -0
  40. package/dist/src/assets/img/icon-search.js.map +1 -0
  41. package/dist/src/assets/img/icon-software.d.ts +2 -0
  42. package/dist/src/assets/img/icon-software.js +18 -0
  43. package/dist/src/assets/img/icon-software.js.map +1 -0
  44. package/dist/src/assets/img/icon-texts.d.ts +2 -0
  45. package/dist/src/assets/img/icon-texts.js +18 -0
  46. package/dist/src/assets/img/icon-texts.js.map +1 -0
  47. package/dist/src/assets/img/icon-upload-unpadded.d.ts +2 -0
  48. package/dist/src/assets/img/icon-upload-unpadded.js +18 -0
  49. package/dist/src/assets/img/icon-upload-unpadded.js.map +1 -0
  50. package/dist/src/assets/img/icon-upload.d.ts +2 -0
  51. package/dist/src/assets/img/icon-upload.js +21 -0
  52. package/dist/src/assets/img/icon-upload.js.map +1 -0
  53. package/dist/src/assets/img/icon-user.d.ts +2 -0
  54. package/dist/src/assets/img/icon-user.js +19 -0
  55. package/dist/src/assets/img/icon-user.js.map +1 -0
  56. package/dist/src/assets/img/icon-video.d.ts +2 -0
  57. package/dist/src/assets/img/icon-video.js +19 -0
  58. package/dist/src/assets/img/icon-video.js.map +1 -0
  59. package/dist/src/assets/img/icon-web.d.ts +2 -0
  60. package/dist/src/assets/img/icon-web.js +19 -0
  61. package/dist/src/assets/img/icon-web.js.map +1 -0
  62. package/dist/src/assets/img/icon.d.ts +5 -0
  63. package/dist/src/assets/img/icon.js +17 -0
  64. package/dist/src/assets/img/icon.js.map +1 -0
  65. package/dist/src/assets/img/icons.d.ts +18 -0
  66. package/dist/src/assets/img/icons.js +33 -0
  67. package/dist/src/assets/img/icons.js.map +1 -0
  68. package/dist/src/assets/img/wordmark-stacked.d.ts +2 -0
  69. package/dist/src/assets/img/wordmark-stacked.js +13 -0
  70. package/dist/src/assets/img/wordmark-stacked.js.map +1 -0
  71. package/dist/src/data/menus.d.ts +20 -0
  72. package/dist/src/data/menus.js +668 -0
  73. package/dist/src/data/menus.js.map +1 -0
  74. package/dist/src/desktop-subnav.d.ts +11 -0
  75. package/dist/src/desktop-subnav.js +55 -0
  76. package/dist/src/desktop-subnav.js.map +1 -0
  77. package/dist/src/dropdown-menu.d.ts +19 -0
  78. package/dist/src/dropdown-menu.js +116 -0
  79. package/dist/src/dropdown-menu.js.map +1 -0
  80. package/dist/src/ia-topnav.d.ts +68 -0
  81. package/dist/src/ia-topnav.js +315 -0
  82. package/dist/src/ia-topnav.js.map +1 -0
  83. package/dist/src/lib/formatUrl.d.ts +2 -0
  84. package/dist/src/lib/formatUrl.js +2 -0
  85. package/dist/src/lib/formatUrl.js.map +1 -0
  86. package/dist/src/lib/keyboard-navigation.d.ts +50 -0
  87. package/dist/src/lib/keyboard-navigation.js +136 -0
  88. package/dist/src/lib/keyboard-navigation.js.map +1 -0
  89. package/dist/src/lib/location-handler.d.ts +1 -0
  90. package/dist/src/lib/location-handler.js +5 -0
  91. package/dist/src/lib/location-handler.js.map +1 -0
  92. package/dist/src/lib/makeBooleanString.d.ts +2 -0
  93. package/dist/src/lib/makeBooleanString.js +12 -0
  94. package/dist/src/lib/makeBooleanString.js.map +1 -0
  95. package/dist/src/lib/query-handler.d.ts +4 -0
  96. package/dist/src/lib/query-handler.js +7 -0
  97. package/dist/src/lib/query-handler.js.map +1 -0
  98. package/dist/src/lib/toSentenceCase.d.ts +2 -0
  99. package/dist/src/lib/toSentenceCase.js +10 -0
  100. package/dist/src/lib/toSentenceCase.js.map +1 -0
  101. package/dist/src/login-button.d.ts +16 -0
  102. package/dist/src/login-button.js +83 -0
  103. package/dist/src/login-button.js.map +1 -0
  104. package/dist/src/media-button.d.ts +24 -0
  105. package/dist/src/media-button.js +119 -0
  106. package/dist/src/media-button.js.map +1 -0
  107. package/dist/src/media-menu.d.ts +20 -0
  108. package/dist/src/media-menu.js +148 -0
  109. package/dist/src/media-menu.js.map +1 -0
  110. package/dist/src/media-slider.d.ts +15 -0
  111. package/dist/src/media-slider.js +139 -0
  112. package/dist/src/media-slider.js.map +1 -0
  113. package/dist/src/media-subnav.d.ts +18 -0
  114. package/dist/src/media-subnav.js +126 -0
  115. package/dist/src/media-subnav.js.map +1 -0
  116. package/dist/src/models.d.ts +51 -0
  117. package/dist/src/models.js +25 -0
  118. package/dist/src/models.js.map +1 -0
  119. package/dist/src/more-slider.d.ts +10 -0
  120. package/dist/src/more-slider.js +50 -0
  121. package/dist/src/more-slider.js.map +1 -0
  122. package/dist/src/nav-search.d.ts +19 -0
  123. package/dist/src/nav-search.js +124 -0
  124. package/dist/src/nav-search.js.map +1 -0
  125. package/dist/src/primary-nav.d.ts +45 -0
  126. package/dist/src/primary-nav.js +280 -0
  127. package/dist/src/primary-nav.js.map +1 -0
  128. package/dist/src/save-page-form.d.ts +10 -0
  129. package/dist/src/save-page-form.js +63 -0
  130. package/dist/src/save-page-form.js.map +1 -0
  131. package/dist/src/search-menu.d.ts +20 -0
  132. package/dist/src/search-menu.js +162 -0
  133. package/dist/src/search-menu.js.map +1 -0
  134. package/dist/src/signed-out-dropdown.d.ts +4 -0
  135. package/dist/src/signed-out-dropdown.js +15 -0
  136. package/dist/src/signed-out-dropdown.js.map +1 -0
  137. package/dist/src/styles/base.d.ts +1 -0
  138. package/dist/src/styles/base.js +48 -0
  139. package/dist/src/styles/base.js.map +1 -0
  140. package/dist/src/styles/desktop-subnav.d.ts +2 -0
  141. package/dist/src/styles/desktop-subnav.js +37 -0
  142. package/dist/src/styles/desktop-subnav.js.map +1 -0
  143. package/dist/src/styles/dropdown-menu.d.ts +2 -0
  144. package/dist/src/styles/dropdown-menu.js +170 -0
  145. package/dist/src/styles/dropdown-menu.js.map +1 -0
  146. package/dist/src/styles/ia-topnav.d.ts +2 -0
  147. package/dist/src/styles/ia-topnav.js +87 -0
  148. package/dist/src/styles/ia-topnav.js.map +1 -0
  149. package/dist/src/styles/login-button.d.ts +2 -0
  150. package/dist/src/styles/login-button.js +82 -0
  151. package/dist/src/styles/login-button.js.map +1 -0
  152. package/dist/src/styles/media-button.d.ts +2 -0
  153. package/dist/src/styles/media-button.js +156 -0
  154. package/dist/src/styles/media-button.js.map +1 -0
  155. package/dist/src/styles/media-menu.d.ts +2 -0
  156. package/dist/src/styles/media-menu.js +66 -0
  157. package/dist/src/styles/media-menu.js.map +1 -0
  158. package/dist/src/styles/media-slider.d.ts +2 -0
  159. package/dist/src/styles/media-slider.js +81 -0
  160. package/dist/src/styles/media-slider.js.map +1 -0
  161. package/dist/src/styles/media-subnav.d.ts +2 -0
  162. package/dist/src/styles/media-subnav.js +159 -0
  163. package/dist/src/styles/media-subnav.js.map +1 -0
  164. package/dist/src/styles/more-slider.d.ts +2 -0
  165. package/dist/src/styles/more-slider.js +15 -0
  166. package/dist/src/styles/more-slider.js.map +1 -0
  167. package/dist/src/styles/nav-search.d.ts +2 -0
  168. package/dist/src/styles/nav-search.js +136 -0
  169. package/dist/src/styles/nav-search.js.map +1 -0
  170. package/dist/src/styles/primary-nav.d.ts +2 -0
  171. package/dist/src/styles/primary-nav.js +310 -0
  172. package/dist/src/styles/primary-nav.js.map +1 -0
  173. package/dist/src/styles/save-page-form.d.ts +2 -0
  174. package/dist/src/styles/save-page-form.js +54 -0
  175. package/dist/src/styles/save-page-form.js.map +1 -0
  176. package/dist/src/styles/search-menu.d.ts +2 -0
  177. package/dist/src/styles/search-menu.js +105 -0
  178. package/dist/src/styles/search-menu.js.map +1 -0
  179. package/dist/src/styles/signed-out-dropdown.d.ts +2 -0
  180. package/dist/src/styles/signed-out-dropdown.js +31 -0
  181. package/dist/src/styles/signed-out-dropdown.js.map +1 -0
  182. package/dist/src/styles/user-menu.d.ts +2 -0
  183. package/dist/src/styles/user-menu.js +31 -0
  184. package/dist/src/styles/user-menu.js.map +1 -0
  185. package/dist/src/styles/wayback-search.d.ts +2 -0
  186. package/dist/src/styles/wayback-search.js +48 -0
  187. package/dist/src/styles/wayback-search.js.map +1 -0
  188. package/dist/src/styles/wayback-slider.d.ts +2 -0
  189. package/dist/src/styles/wayback-slider.js +33 -0
  190. package/dist/src/styles/wayback-slider.js.map +1 -0
  191. package/dist/src/tracked-element.d.ts +5 -0
  192. package/dist/src/tracked-element.js +30 -0
  193. package/dist/src/tracked-element.js.map +1 -0
  194. package/dist/src/user-menu.d.ts +10 -0
  195. package/dist/src/user-menu.js +60 -0
  196. package/dist/src/user-menu.js.map +1 -0
  197. package/dist/src/wayback-search.d.ts +4 -0
  198. package/dist/src/wayback-search.js +14 -0
  199. package/dist/src/wayback-search.js.map +1 -0
  200. package/dist/src/wayback-slider.d.ts +18 -0
  201. package/dist/src/wayback-slider.js +99 -0
  202. package/dist/src/wayback-slider.js.map +1 -0
  203. package/dist/test/assets/img/hamburger.test.d.ts +1 -0
  204. package/dist/test/assets/img/hamburger.test.js +13 -0
  205. package/dist/test/assets/img/hamburger.test.js.map +1 -0
  206. package/dist/test/data/menus.test.d.ts +1 -0
  207. package/dist/test/data/menus.test.js +11 -0
  208. package/dist/test/data/menus.test.js.map +1 -0
  209. package/dist/test/dropdown-menu.test.d.ts +1 -0
  210. package/dist/test/dropdown-menu.test.js +20 -0
  211. package/dist/test/dropdown-menu.test.js.map +1 -0
  212. package/dist/test/ia-icon.test.d.ts +1 -0
  213. package/dist/test/ia-icon.test.js +11 -0
  214. package/dist/test/ia-icon.test.js.map +1 -0
  215. package/dist/test/ia-topnav.test.d.ts +1 -0
  216. package/dist/test/ia-topnav.test.js +232 -0
  217. package/dist/test/ia-topnav.test.js.map +1 -0
  218. package/dist/test/login-button.test.d.ts +1 -0
  219. package/dist/test/login-button.test.js +14 -0
  220. package/dist/test/login-button.test.js.map +1 -0
  221. package/dist/test/media-button.test.d.ts +1 -0
  222. package/dist/test/media-button.test.js +13 -0
  223. package/dist/test/media-button.test.js.map +1 -0
  224. package/dist/test/media-menu.test.d.ts +1 -0
  225. package/dist/test/media-menu.test.js +27 -0
  226. package/dist/test/media-menu.test.js.map +1 -0
  227. package/dist/test/media-slider.test.d.ts +1 -0
  228. package/dist/test/media-slider.test.js +47 -0
  229. package/dist/test/media-slider.test.js.map +1 -0
  230. package/dist/test/more-slider.test.d.ts +1 -0
  231. package/dist/test/more-slider.test.js +17 -0
  232. package/dist/test/more-slider.test.js.map +1 -0
  233. package/dist/test/nav-search.test.d.ts +1 -0
  234. package/dist/test/nav-search.test.js +47 -0
  235. package/dist/test/nav-search.test.js.map +1 -0
  236. package/dist/test/primary-nav.test.d.ts +1 -0
  237. package/dist/test/primary-nav.test.js +55 -0
  238. package/dist/test/primary-nav.test.js.map +1 -0
  239. package/dist/test/save-page-form.test.d.ts +1 -0
  240. package/dist/test/save-page-form.test.js +47 -0
  241. package/dist/test/save-page-form.test.js.map +1 -0
  242. package/dist/test/search-menu.test.d.ts +1 -0
  243. package/dist/test/search-menu.test.js +42 -0
  244. package/dist/test/search-menu.test.js.map +1 -0
  245. package/dist/test/user-menu.test.d.ts +1 -0
  246. package/dist/test/user-menu.test.js +28 -0
  247. package/dist/test/user-menu.test.js.map +1 -0
  248. package/dist/test/wayback-slider.test.d.ts +1 -0
  249. package/dist/test/wayback-slider.test.js +80 -0
  250. package/dist/test/wayback-slider.test.js.map +1 -0
  251. package/eslint.config.mjs +53 -0
  252. package/package.json +47 -37
  253. package/prettier.config.js +9 -0
  254. package/src/assets/img/hamburger.ts +49 -0
  255. package/src/assets/img/{ia-icon.js → ia-icon.ts} +7 -16
  256. package/src/assets/img/{icon-audio.js → icon-audio.ts} +7 -2
  257. package/src/assets/img/icon-close.ts +20 -0
  258. package/src/assets/img/icon-donate-unpadded.ts +19 -0
  259. package/src/assets/img/icon-donate.ts +18 -0
  260. package/src/assets/img/icon-ellipses.ts +19 -0
  261. package/src/assets/img/icon-ia-logo.ts +30 -0
  262. package/src/assets/img/icon-images.ts +19 -0
  263. package/src/assets/img/icon-search.ts +19 -0
  264. package/src/assets/img/icon-software.ts +18 -0
  265. package/src/assets/img/icon-texts.ts +18 -0
  266. package/src/assets/img/{icon-upload-unpadded.js → icon-upload-unpadded.ts} +6 -2
  267. package/src/assets/img/icon-upload.ts +21 -0
  268. package/src/assets/img/icon-user.ts +19 -0
  269. package/src/assets/img/icon-video.ts +19 -0
  270. package/src/assets/img/icon-web.ts +19 -0
  271. package/src/assets/img/icon.ts +8 -0
  272. package/src/assets/img/icons.ts +33 -0
  273. package/src/assets/img/{wordmark-stacked.js → wordmark-stacked.ts} +1 -1
  274. package/src/data/{menus.js → menus.ts} +172 -135
  275. package/src/desktop-subnav.ts +49 -0
  276. package/src/dropdown-menu.ts +106 -0
  277. package/src/{ia-topnav.js → ia-topnav.ts} +130 -127
  278. package/src/lib/formatUrl.ts +2 -0
  279. package/src/lib/{keyboard-navigation.js → keyboard-navigation.ts} +53 -23
  280. package/src/lib/location-handler.ts +5 -0
  281. package/src/lib/makeBooleanString.ts +12 -0
  282. package/src/lib/query-handler.ts +7 -0
  283. package/src/lib/toSentenceCase.ts +10 -0
  284. package/src/{login-button.js → login-button.ts} +27 -31
  285. package/src/{media-button.js → media-button.ts} +39 -49
  286. package/src/media-menu.ts +143 -0
  287. package/src/{media-slider.js → media-slider.ts} +53 -41
  288. package/src/media-subnav.ts +132 -0
  289. package/src/models.ts +114 -0
  290. package/src/more-slider.ts +42 -0
  291. package/src/nav-search.ts +114 -0
  292. package/src/primary-nav.ts +266 -0
  293. package/src/save-page-form.ts +59 -0
  294. package/src/search-menu.ts +156 -0
  295. package/src/signed-out-dropdown.ts +11 -0
  296. package/src/styles/{base.js → base.ts} +2 -2
  297. package/src/styles/{desktop-subnav.js → desktop-subnav.ts} +2 -2
  298. package/src/styles/{dropdown-menu.js → dropdown-menu.ts} +4 -2
  299. package/src/styles/{ia-topnav.js → ia-topnav.ts} +1 -1
  300. package/src/styles/{login-button.js → login-button.ts} +1 -1
  301. package/src/styles/{media-button.js → media-button.ts} +2 -2
  302. package/src/styles/{media-menu.js → media-menu.ts} +1 -1
  303. package/src/styles/{media-slider.js → media-slider.ts} +1 -1
  304. package/src/styles/media-subnav.ts +159 -0
  305. package/src/styles/{more-slider.js → more-slider.ts} +1 -1
  306. package/src/styles/{nav-search.js → nav-search.ts} +2 -2
  307. package/src/styles/{primary-nav.js → primary-nav.ts} +2 -3
  308. package/src/styles/{save-page-form.js → save-page-form.ts} +7 -7
  309. package/src/styles/{search-menu.js → search-menu.ts} +1 -1
  310. package/src/styles/{signed-out-dropdown.js → signed-out-dropdown.ts} +1 -1
  311. package/src/styles/{user-menu.js → user-menu.ts} +1 -1
  312. package/src/styles/{wayback-search.js → wayback-search.ts} +3 -3
  313. package/src/styles/wayback-slider.ts +33 -0
  314. package/src/tracked-element.ts +32 -0
  315. package/src/user-menu.ts +57 -0
  316. package/src/wayback-search.ts +10 -0
  317. package/src/wayback-slider.ts +88 -0
  318. package/ssl/server.crt +22 -0
  319. package/ssl/server.key +28 -0
  320. package/test/assets/img/hamburger.test.ts +18 -0
  321. package/test/data/menus.test.ts +15 -0
  322. package/test/{dropdown-menu.test.js → dropdown-menu.test.ts} +5 -7
  323. package/test/{ia-icon.test.js → ia-icon.test.ts} +6 -4
  324. package/test/ia-topnav.test.ts +344 -0
  325. package/test/login-button.test.ts +19 -0
  326. package/test/media-button.test.ts +19 -0
  327. package/test/{media-menu.test.js → media-menu.test.ts} +14 -12
  328. package/test/media-slider.test.ts +63 -0
  329. package/test/more-slider.test.ts +21 -0
  330. package/test/nav-search.test.ts +70 -0
  331. package/test/primary-nav.test.ts +94 -0
  332. package/test/save-page-form.test.ts +62 -0
  333. package/test/{search-menu.test.js → search-menu.test.ts} +19 -10
  334. package/test/{user-menu.test.js → user-menu.test.ts} +10 -9
  335. package/test/wayback-slider.test.ts +97 -0
  336. package/tsconfig.json +31 -0
  337. package/web-dev-server.config.mjs +32 -0
  338. package/web-test-runner.config.mjs +41 -0
  339. package/.eslintrc +0 -16
  340. package/index.d.ts +0 -109
  341. package/src/assets/img/hamburger.js +0 -38
  342. package/src/assets/img/icon-close.js +0 -16
  343. package/src/assets/img/icon-donate-unpadded.js +0 -16
  344. package/src/assets/img/icon-donate.js +0 -15
  345. package/src/assets/img/icon-ellipses.js +0 -15
  346. package/src/assets/img/icon-ia-logo.js +0 -22
  347. package/src/assets/img/icon-images.js +0 -15
  348. package/src/assets/img/icon-search.js +0 -15
  349. package/src/assets/img/icon-software.js +0 -15
  350. package/src/assets/img/icon-texts.js +0 -15
  351. package/src/assets/img/icon-upload.js +0 -15
  352. package/src/assets/img/icon-user.js +0 -15
  353. package/src/assets/img/icon-video.js +0 -15
  354. package/src/assets/img/icon-web.js +0 -15
  355. package/src/assets/img/icon.js +0 -18
  356. package/src/assets/img/icons.js +0 -33
  357. package/src/desktop-subnav.js +0 -45
  358. package/src/dropdown-menu.js +0 -110
  359. package/src/lib/formatUrl.js +0 -1
  360. package/src/lib/location-handler.js +0 -5
  361. package/src/lib/query-handler.js +0 -7
  362. package/src/lib/toSentenceCase.js +0 -8
  363. package/src/media-menu.js +0 -154
  364. package/src/media-subnav.js +0 -112
  365. package/src/more-slider.js +0 -33
  366. package/src/nav-search.js +0 -111
  367. package/src/primary-nav.js +0 -258
  368. package/src/save-page-form.js +0 -59
  369. package/src/search-menu.js +0 -145
  370. package/src/signed-out-dropdown.js +0 -10
  371. package/src/styles/media-subnav.js +0 -156
  372. package/src/styles/wayback-slider.js +0 -30
  373. package/src/tracked-element.js +0 -29
  374. package/src/user-menu.js +0 -56
  375. package/src/wayback-search.js +0 -18
  376. package/src/wayback-slider.js +0 -87
  377. package/test/assets/img/hamburger.test.js +0 -15
  378. package/test/assets/img/user.test.js +0 -15
  379. package/test/data/menus.test.js +0 -19
  380. package/test/ia-topnav.test.js +0 -273
  381. package/test/login-button.test.js +0 -15
  382. package/test/media-button.test.js +0 -19
  383. package/test/media-slider.test.js +0 -57
  384. package/test/more-slider.test.js +0 -13
  385. package/test/nav-search.test.js +0 -61
  386. package/test/primary-nav.test.js +0 -82
  387. package/test/save-page-form.test.js +0 -35
  388. package/test/wayback-slider.test.js +0 -80
  389. /package/{index.js → index.ts} +0 -0
@@ -0,0 +1,315 @@
1
+ import { __decorate } from "tslib";
2
+ import { LitElement, html, nothing } from 'lit';
3
+ import { customElement, property, state } from 'lit/decorators.js';
4
+ import { buildTopNavMenus, defaultTopNavConfig } from './data/menus';
5
+ import './desktop-subnav';
6
+ import './dropdown-menu';
7
+ import './media-slider';
8
+ import './primary-nav';
9
+ import './search-menu';
10
+ import './signed-out-dropdown';
11
+ import iaTopNavCSS from './styles/ia-topnav';
12
+ import './user-menu';
13
+ let IATopNav = class IATopNav extends LitElement {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.localLinks = false;
17
+ this.waybackPagesArchived = '';
18
+ this.baseHost = 'https://archive.org';
19
+ this.mediaBaseHost = 'https://archive.org';
20
+ this.admin = false;
21
+ this.canManageFlags = false;
22
+ this.config = defaultTopNavConfig;
23
+ this.hideSearch = false;
24
+ this.itemIdentifier = '';
25
+ this.mediaSliderOpen = false;
26
+ this.openMenu = '';
27
+ this.screenName = '';
28
+ this.searchIn = '';
29
+ this.searchQuery = '';
30
+ this.selectedMenuOption = '';
31
+ this.username = '';
32
+ this.userProfileImagePath = '/services/img/user/profile';
33
+ this.secondIdentitySlotMode = '';
34
+ this.menus = buildTopNavMenus();
35
+ }
36
+ get normalizedBaseHost() {
37
+ return !this.localLinks ? this.baseHost : '';
38
+ }
39
+ static get styles() {
40
+ return iaTopNavCSS;
41
+ }
42
+ updated(props) {
43
+ if (props.has('username') ||
44
+ props.has('waybackPagesArchived') ||
45
+ props.has('itemIdentifier') ||
46
+ props.has('localLinks') ||
47
+ props.has('baseHost')) {
48
+ this.menuSetup();
49
+ }
50
+ }
51
+ firstUpdated() {
52
+ // close open menu on `esc` click
53
+ document.addEventListener('keydown', (e) => {
54
+ if (e.key === 'Escape') {
55
+ this.openMenu = '';
56
+ this.mediaSliderOpen = false;
57
+ }
58
+ }, false);
59
+ }
60
+ menuSetup() {
61
+ // re/build the nav
62
+ this.menus = buildTopNavMenus(this.username, this.normalizedBaseHost, this.waybackPagesArchived, this.itemIdentifier);
63
+ }
64
+ menuToggled(e) {
65
+ const currentMenu = this.openMenu;
66
+ this.openMenu = currentMenu === e.detail.menuName ? '' : e.detail.menuName;
67
+ // Keeps media slider open if media menu is open
68
+ if (this.openMenu === 'media') {
69
+ return;
70
+ }
71
+ this.closeMediaSlider();
72
+ }
73
+ openMediaSlider() {
74
+ this.mediaSliderOpen = true;
75
+ }
76
+ closeMediaSlider() {
77
+ this.mediaSliderOpen = false;
78
+ this.selectedMenuOption = '';
79
+ }
80
+ closeMenus() {
81
+ this.openMenu = '';
82
+ this.closeMediaSlider();
83
+ }
84
+ searchInChanged(e) {
85
+ this.searchIn = e.detail.searchIn;
86
+ }
87
+ trackClick(e) {
88
+ this.dispatchEvent(new CustomEvent('analyticsClick', {
89
+ bubbles: true,
90
+ composed: true,
91
+ detail: e.detail,
92
+ }));
93
+ }
94
+ trackSubmit(e) {
95
+ this.dispatchEvent(new CustomEvent('analyticsSubmit', {
96
+ bubbles: true,
97
+ composed: true,
98
+ detail: e.detail,
99
+ }));
100
+ }
101
+ mediaTypeSelected(e) {
102
+ if (this.selectedMenuOption === e.detail.mediatype) {
103
+ this.closeMediaSlider();
104
+ return;
105
+ }
106
+ this.selectedMenuOption = e.detail.mediatype;
107
+ this.openMediaSlider();
108
+ }
109
+ get searchMenuOpened() {
110
+ return this.openMenu === 'search';
111
+ }
112
+ get signedOutOpened() {
113
+ return this.openMenu === 'login';
114
+ }
115
+ get userMenuOpened() {
116
+ return this.openMenu === 'user';
117
+ }
118
+ get searchMenuTabIndex() {
119
+ return this.searchMenuOpened ? '' : '-1';
120
+ }
121
+ get userMenuTabIndex() {
122
+ return this.userMenuOpened ? '' : '-1';
123
+ }
124
+ get signedOutTabIndex() {
125
+ return this.signedOutOpened ? '' : '-1';
126
+ }
127
+ get closeLayerClass() {
128
+ return !!this.openMenu || this.mediaSliderOpen ? 'visible' : '';
129
+ }
130
+ get userMenu() {
131
+ return html `
132
+ <user-menu
133
+ .baseHost=${this.normalizedBaseHost}
134
+ .config=${this.config}
135
+ .menuItems=${this.userMenuItems}
136
+ ?open=${this.openMenu === 'user'}
137
+ .username=${this.username}
138
+ ?hideSearch=${this.hideSearch}
139
+ tabindex="${this.userMenuTabIndex}"
140
+ @menuToggled=${this.menuToggled}
141
+ @trackClick=${this.trackClick}
142
+ @focusToOtherMenuItem=${(e) => (this.currentTab = e.detail)}
143
+ ></user-menu>
144
+ `;
145
+ }
146
+ get signedOutDropdown() {
147
+ return html `
148
+ <signed-out-dropdown
149
+ .baseHost=${this.normalizedBaseHost}
150
+ .config=${this.config}
151
+ .open=${this.signedOutOpened}
152
+ ?hideSearch=${this.hideSearch}
153
+ tabindex="${this.signedOutTabIndex}"
154
+ .menuItems=${this.signedOutMenuItems}
155
+ ></signed-out-dropdown>
156
+ `;
157
+ }
158
+ get signedOutMenuItems() {
159
+ return this.menus.signedOut;
160
+ }
161
+ /**
162
+ * Most users just get the basic menu items.
163
+ * For users with `/items` priv, additional admin menu items are included too.
164
+ * Having the `/flags` priv adds a further admin item for managing flags.
165
+ */
166
+ get userMenuItems() {
167
+ const basicItems = this.menus.user;
168
+ let adminItems = this.menus.userAdmin;
169
+ if (this.canManageFlags) {
170
+ adminItems = adminItems.concat(this.menus.userAdminFlags);
171
+ }
172
+ return this.itemIdentifier && this.admin
173
+ ? [basicItems, adminItems]
174
+ : [basicItems];
175
+ }
176
+ get desktopSubnavMenuItems() {
177
+ return this.menus.more;
178
+ }
179
+ get allowSecondaryIcon() {
180
+ return this.secondIdentitySlotMode === 'allow';
181
+ }
182
+ get secondLogoSlot() {
183
+ return this.allowSecondaryIcon
184
+ ? html `
185
+ <slot name="opt-sec-logo" slot="opt-sec-logo"></slot>
186
+ <slot name="opt-sec-logo-mobile" slot="opt-sec-logo-mobile"></slot>
187
+ `
188
+ : nothing;
189
+ }
190
+ get separatorTemplate() {
191
+ return html `<li class="divider" role="presentation"></li>`;
192
+ }
193
+ render() {
194
+ return html `
195
+ <div class="topnav">
196
+ <primary-nav
197
+ .baseHost=${this.normalizedBaseHost}
198
+ .mediaBaseHost=${this.mediaBaseHost}
199
+ .config=${this.config}
200
+ .openMenu=${this.openMenu}
201
+ .screenName=${this.screenName}
202
+ .searchIn=${this.searchIn}
203
+ .searchQuery=${this.searchQuery}
204
+ .secondIdentitySlotMode=${this.secondIdentitySlotMode}
205
+ .selectedMenuOption=${this.selectedMenuOption}
206
+ .username=${this.username}
207
+ .userProfileImagePath=${this.userProfileImagePath}
208
+ .currentTab=${this.currentTab}
209
+ ?hideSearch=${this.hideSearch}
210
+ @mediaTypeSelected=${this.mediaTypeSelected}
211
+ @trackClick=${this.trackClick}
212
+ @trackSubmit=${this.trackSubmit}
213
+ @menuToggled=${this.menuToggled}
214
+ >
215
+ ${this.secondLogoSlot}
216
+ </primary-nav>
217
+ <media-slider
218
+ .baseHost=${this.normalizedBaseHost}
219
+ .config=${this.config}
220
+ .selectedMenuOption=${this.selectedMenuOption}
221
+ .mediaSliderOpen=${this.mediaSliderOpen}
222
+ .menus=${this.menus}
223
+ tabindex="${this.mediaSliderOpen ? '1' : '-1'}"
224
+ @focusToOtherMenuItem=${(e) => (this.currentTab = e.detail)}
225
+ ></media-slider>
226
+ </div>
227
+ ${this.username ? this.userMenu : this.signedOutDropdown}
228
+ <search-menu
229
+ .baseHost=${this.normalizedBaseHost}
230
+ .config=${this.config}
231
+ .openMenu=${this.openMenu}
232
+ tabindex="${this.searchMenuTabIndex}"
233
+ ?hideSearch=${this.hideSearch}
234
+ @searchInChanged=${this.searchInChanged}
235
+ @trackClick=${this.trackClick}
236
+ @trackSubmit=${this.trackSubmit}
237
+ ></search-menu>
238
+ <desktop-subnav
239
+ .baseHost=${this.normalizedBaseHost}
240
+ .menuItems=${this.desktopSubnavMenuItems}
241
+ @focus=${this.closeMenus}
242
+ ></desktop-subnav>
243
+ <div
244
+ id="close-layer"
245
+ class="${this.closeLayerClass}"
246
+ @click=${this.closeMenus}
247
+ ></div>
248
+ `;
249
+ }
250
+ };
251
+ __decorate([
252
+ property({ type: Boolean })
253
+ ], IATopNav.prototype, "localLinks", void 0);
254
+ __decorate([
255
+ property({ type: String })
256
+ ], IATopNav.prototype, "waybackPagesArchived", void 0);
257
+ __decorate([
258
+ property({ type: String })
259
+ ], IATopNav.prototype, "baseHost", void 0);
260
+ __decorate([
261
+ property({ type: String })
262
+ ], IATopNav.prototype, "mediaBaseHost", void 0);
263
+ __decorate([
264
+ property({ type: Boolean })
265
+ ], IATopNav.prototype, "admin", void 0);
266
+ __decorate([
267
+ property({ type: Boolean })
268
+ ], IATopNav.prototype, "canManageFlags", void 0);
269
+ __decorate([
270
+ property({ type: Object })
271
+ ], IATopNav.prototype, "config", void 0);
272
+ __decorate([
273
+ property({ type: Boolean })
274
+ ], IATopNav.prototype, "hideSearch", void 0);
275
+ __decorate([
276
+ property({ type: String })
277
+ ], IATopNav.prototype, "itemIdentifier", void 0);
278
+ __decorate([
279
+ property({ type: Boolean })
280
+ ], IATopNav.prototype, "mediaSliderOpen", void 0);
281
+ __decorate([
282
+ property({ type: String })
283
+ ], IATopNav.prototype, "openMenu", void 0);
284
+ __decorate([
285
+ property({ type: String })
286
+ ], IATopNav.prototype, "screenName", void 0);
287
+ __decorate([
288
+ property({ type: String })
289
+ ], IATopNav.prototype, "searchIn", void 0);
290
+ __decorate([
291
+ property({ type: String })
292
+ ], IATopNav.prototype, "searchQuery", void 0);
293
+ __decorate([
294
+ property({ type: String })
295
+ ], IATopNav.prototype, "selectedMenuOption", void 0);
296
+ __decorate([
297
+ property({ type: String })
298
+ ], IATopNav.prototype, "username", void 0);
299
+ __decorate([
300
+ property({ type: String })
301
+ ], IATopNav.prototype, "userProfileImagePath", void 0);
302
+ __decorate([
303
+ property({ type: String })
304
+ ], IATopNav.prototype, "secondIdentitySlotMode", void 0);
305
+ __decorate([
306
+ property({ type: Object })
307
+ ], IATopNav.prototype, "currentTab", void 0);
308
+ __decorate([
309
+ state()
310
+ ], IATopNav.prototype, "menus", void 0);
311
+ IATopNav = __decorate([
312
+ customElement('ia-topnav')
313
+ ], IATopNav);
314
+ export default IATopNav;
315
+ //# sourceMappingURL=ia-topnav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ia-topnav.js","sourceRoot":"","sources":["../../src/ia-topnav.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, PropertyValues, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { buildTopNavMenus, defaultTopNavConfig } from './data/menus';\nimport './desktop-subnav';\nimport './dropdown-menu';\nimport './media-slider';\nimport {\n IATopNavConfig,\n IATopNavMenuConfig,\n IATopNavSecondIdentitySlotMode,\n} from './models';\nimport './primary-nav';\nimport './search-menu';\nimport './signed-out-dropdown';\nimport iaTopNavCSS from './styles/ia-topnav';\nimport './user-menu';\n\n@customElement('ia-topnav')\nexport default class IATopNav extends LitElement {\n @property({ type: Boolean }) localLinks = false;\n\n @property({ type: String }) waybackPagesArchived = '';\n\n @property({ type: String }) baseHost = 'https://archive.org';\n\n @property({ type: String }) mediaBaseHost = 'https://archive.org';\n\n @property({ type: Boolean }) admin = false;\n\n @property({ type: Boolean }) canManageFlags = false;\n\n @property({ type: Object }) config: IATopNavConfig = defaultTopNavConfig;\n\n @property({ type: Boolean }) hideSearch = false;\n\n @property({ type: String }) itemIdentifier = '';\n\n @property({ type: Boolean }) mediaSliderOpen = false;\n\n @property({ type: String }) openMenu = '';\n\n @property({ type: String }) screenName: string = '';\n\n @property({ type: String }) searchIn = '';\n\n @property({ type: String }) searchQuery = '';\n\n @property({ type: String }) selectedMenuOption = '';\n\n @property({ type: String }) username: string = '';\n\n @property({ type: String }) userProfileImagePath =\n '/services/img/user/profile';\n\n @property({ type: String })\n secondIdentitySlotMode: IATopNavSecondIdentitySlotMode = '';\n\n @property({ type: Object }) currentTab?: {\n mediatype: string;\n moveTo: string;\n };\n\n @state() private menus: IATopNavMenuConfig = buildTopNavMenus();\n\n private get normalizedBaseHost() {\n return !this.localLinks ? this.baseHost : '';\n }\n\n static get styles() {\n return iaTopNavCSS;\n }\n\n updated(props: PropertyValues) {\n if (\n props.has('username') ||\n props.has('waybackPagesArchived') ||\n props.has('itemIdentifier') ||\n props.has('localLinks') ||\n props.has('baseHost')\n ) {\n this.menuSetup();\n }\n }\n\n firstUpdated() {\n // close open menu on `esc` click\n document.addEventListener(\n 'keydown',\n (e) => {\n if (e.key === 'Escape') {\n this.openMenu = '';\n this.mediaSliderOpen = false;\n }\n },\n false,\n );\n }\n\n menuSetup() {\n // re/build the nav\n this.menus = buildTopNavMenus(\n this.username,\n this.normalizedBaseHost,\n this.waybackPagesArchived,\n this.itemIdentifier,\n );\n }\n\n menuToggled(e: CustomEvent) {\n const currentMenu = this.openMenu;\n this.openMenu = currentMenu === e.detail.menuName ? '' : e.detail.menuName;\n // Keeps media slider open if media menu is open\n if (this.openMenu === 'media') {\n return;\n }\n this.closeMediaSlider();\n }\n\n openMediaSlider() {\n this.mediaSliderOpen = true;\n }\n\n closeMediaSlider() {\n this.mediaSliderOpen = false;\n this.selectedMenuOption = '';\n }\n\n closeMenus() {\n this.openMenu = '';\n this.closeMediaSlider();\n }\n\n searchInChanged(e: CustomEvent) {\n this.searchIn = e.detail.searchIn;\n }\n\n trackClick(e: CustomEvent) {\n this.dispatchEvent(\n new CustomEvent('analyticsClick', {\n bubbles: true,\n composed: true,\n detail: e.detail,\n }),\n );\n }\n\n trackSubmit(e: CustomEvent) {\n this.dispatchEvent(\n new CustomEvent('analyticsSubmit', {\n bubbles: true,\n composed: true,\n detail: e.detail,\n }),\n );\n }\n\n mediaTypeSelected(e: CustomEvent) {\n if (this.selectedMenuOption === e.detail.mediatype) {\n this.closeMediaSlider();\n return;\n }\n this.selectedMenuOption = e.detail.mediatype;\n this.openMediaSlider();\n }\n\n get searchMenuOpened() {\n return this.openMenu === 'search';\n }\n\n get signedOutOpened() {\n return this.openMenu === 'login';\n }\n\n get userMenuOpened() {\n return this.openMenu === 'user';\n }\n\n get searchMenuTabIndex() {\n return this.searchMenuOpened ? '' : '-1';\n }\n\n get userMenuTabIndex() {\n return this.userMenuOpened ? '' : '-1';\n }\n\n get signedOutTabIndex() {\n return this.signedOutOpened ? '' : '-1';\n }\n\n get closeLayerClass() {\n return !!this.openMenu || this.mediaSliderOpen ? 'visible' : '';\n }\n\n get userMenu() {\n return html`\n <user-menu\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .menuItems=${this.userMenuItems}\n ?open=${this.openMenu === 'user'}\n .username=${this.username}\n ?hideSearch=${this.hideSearch}\n tabindex=\"${this.userMenuTabIndex}\"\n @menuToggled=${this.menuToggled}\n @trackClick=${this.trackClick}\n @focusToOtherMenuItem=${(e: CustomEvent) =>\n (this.currentTab = e.detail)}\n ></user-menu>\n `;\n }\n\n get signedOutDropdown() {\n return html`\n <signed-out-dropdown\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .open=${this.signedOutOpened}\n ?hideSearch=${this.hideSearch}\n tabindex=\"${this.signedOutTabIndex}\"\n .menuItems=${this.signedOutMenuItems}\n ></signed-out-dropdown>\n `;\n }\n\n get signedOutMenuItems() {\n return this.menus.signedOut;\n }\n\n /**\n * Most users just get the basic menu items.\n * For users with `/items` priv, additional admin menu items are included too.\n * Having the `/flags` priv adds a further admin item for managing flags.\n */\n get userMenuItems() {\n const basicItems = this.menus.user;\n\n let adminItems = this.menus.userAdmin;\n if (this.canManageFlags) {\n adminItems = adminItems.concat(this.menus.userAdminFlags);\n }\n\n return this.itemIdentifier && this.admin\n ? [basicItems, adminItems]\n : [basicItems];\n }\n\n get desktopSubnavMenuItems() {\n return this.menus.more;\n }\n\n get allowSecondaryIcon() {\n return this.secondIdentitySlotMode === 'allow';\n }\n\n get secondLogoSlot() {\n return this.allowSecondaryIcon\n ? html`\n <slot name=\"opt-sec-logo\" slot=\"opt-sec-logo\"></slot>\n <slot name=\"opt-sec-logo-mobile\" slot=\"opt-sec-logo-mobile\"></slot>\n `\n : nothing;\n }\n\n get separatorTemplate() {\n return html`<li class=\"divider\" role=\"presentation\"></li>`;\n }\n\n render() {\n return html`\n <div class=\"topnav\">\n <primary-nav\n .baseHost=${this.normalizedBaseHost}\n .mediaBaseHost=${this.mediaBaseHost}\n .config=${this.config}\n .openMenu=${this.openMenu}\n .screenName=${this.screenName}\n .searchIn=${this.searchIn}\n .searchQuery=${this.searchQuery}\n .secondIdentitySlotMode=${this.secondIdentitySlotMode}\n .selectedMenuOption=${this.selectedMenuOption}\n .username=${this.username}\n .userProfileImagePath=${this.userProfileImagePath}\n .currentTab=${this.currentTab}\n ?hideSearch=${this.hideSearch}\n @mediaTypeSelected=${this.mediaTypeSelected}\n @trackClick=${this.trackClick}\n @trackSubmit=${this.trackSubmit}\n @menuToggled=${this.menuToggled}\n >\n ${this.secondLogoSlot}\n </primary-nav>\n <media-slider\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .selectedMenuOption=${this.selectedMenuOption}\n .mediaSliderOpen=${this.mediaSliderOpen}\n .menus=${this.menus}\n tabindex=\"${this.mediaSliderOpen ? '1' : '-1'}\"\n @focusToOtherMenuItem=${(e: CustomEvent) =>\n (this.currentTab = e.detail)}\n ></media-slider>\n </div>\n ${this.username ? this.userMenu : this.signedOutDropdown}\n <search-menu\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .openMenu=${this.openMenu}\n tabindex=\"${this.searchMenuTabIndex}\"\n ?hideSearch=${this.hideSearch}\n @searchInChanged=${this.searchInChanged}\n @trackClick=${this.trackClick}\n @trackSubmit=${this.trackSubmit}\n ></search-menu>\n <desktop-subnav\n .baseHost=${this.normalizedBaseHost}\n .menuItems=${this.desktopSubnavMenuItems}\n @focus=${this.closeMenus}\n ></desktop-subnav>\n <div\n id=\"close-layer\"\n class=\"${this.closeLayerClass}\"\n @click=${this.closeMenus}\n ></div>\n `;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ declare const _default: (url: string | undefined, baseHost: string) => string;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ export default (url = '', baseHost) => /^https?:/.test(url) ? url : `${baseHost}${url}`;
2
+ //# sourceMappingURL=formatUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatUrl.js","sourceRoot":"","sources":["../../../src/lib/formatUrl.ts"],"names":[],"mappings":"AAAA,eAAe,CAAC,MAAc,EAAE,EAAE,QAAgB,EAAU,EAAE,CAC5D,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAG,QAAQ,GAAG,GAAG,EAAwB,CAAC","sourcesContent":["export default (url: string = '', baseHost: string): string =>\n /^https?:/.test(url) ? url : (`${baseHost}${url}` as string & Location);\n"]}
@@ -0,0 +1,50 @@
1
+ export default class KeyboardNavigation {
2
+ elementsContainer: HTMLElement;
3
+ menuOption: string;
4
+ focusableElements: HTMLElement[];
5
+ focusedIndex: number;
6
+ /**
7
+ * Constructor for the KeyboardNavigation class.
8
+ * @param {HTMLElement} elementsContainer - The container element that holds the focusable elements.
9
+ * @param {string} menuOption - The type of menu option ('web' or 'usermenu').
10
+ */
11
+ constructor(elementsContainer: HTMLElement, menuOption: string);
12
+ /**
13
+ * Returns the initial focused index based on the menu option.
14
+ * @returns {number} The initial focused index (0 for 'web', 1 for 'usermenu').
15
+ */
16
+ getInitialFocusedIndex(): number;
17
+ /**
18
+ * Gets an array of focusable elements within the container.
19
+ * @returns {HTMLElement[]} An array of focusable elements.
20
+ */
21
+ getFocusableElements(): HTMLElement[];
22
+ /**
23
+ * Handles keyboard events and focuses the appropriate element.
24
+ * @param {KeyboardEvent} event - The keyboard event object.
25
+ */
26
+ handleKeyDown(event: KeyboardEvent): void;
27
+ /**
28
+ * Handles arrow key events and focuses the next or previous element for topnav sub-nav and usermenu
29
+ * @param {string} key - The key that was pressed ('ArrowDown', 'ArrowRight', 'ArrowUp', or 'ArrowLeft').
30
+ */
31
+ handleArrowKey(key: string): void;
32
+ /**
33
+ * Focuses the previous focusable element in the container.
34
+ */
35
+ focusPrevious(): void;
36
+ /**
37
+ * Focuses the next focusable element in the container.
38
+ */
39
+ focusNext(): void;
40
+ /**
41
+ * Handles the Tab key event and focuses the next or previous menu item.
42
+ * @param {KeyboardEvent} event - The keyboard event object.
43
+ */
44
+ handleTabKey(event: KeyboardEvent): void;
45
+ /**
46
+ * Focuses the other parent menu items based on the provided flag.
47
+ * @param {boolean} isPrevious - A flag indicating whether to focus the previous menu item.
48
+ */
49
+ focusToOtherMenuItems(isPrevious?: boolean): void;
50
+ }
@@ -0,0 +1,136 @@
1
+ export default class KeyboardNavigation {
2
+ /**
3
+ * Constructor for the KeyboardNavigation class.
4
+ * @param {HTMLElement} elementsContainer - The container element that holds the focusable elements.
5
+ * @param {string} menuOption - The type of menu option ('web' or 'usermenu').
6
+ */
7
+ constructor(elementsContainer, menuOption) {
8
+ var _a;
9
+ this.elementsContainer = elementsContainer;
10
+ this.menuOption = menuOption;
11
+ this.focusableElements = this.getFocusableElements();
12
+ this.focusedIndex = this.getInitialFocusedIndex();
13
+ (_a = this.focusableElements[this.focusedIndex]) === null || _a === void 0 ? void 0 : _a.focus();
14
+ this.handleKeyDown = this.handleKeyDown.bind(this);
15
+ }
16
+ /**
17
+ * Returns the initial focused index based on the menu option.
18
+ * @returns {number} The initial focused index (0 for 'web', 1 for 'usermenu').
19
+ */
20
+ getInitialFocusedIndex() {
21
+ return this.menuOption === 'usermenu' ? 1 : 0;
22
+ }
23
+ /**
24
+ * Gets an array of focusable elements within the container.
25
+ * @returns {HTMLElement[]} An array of focusable elements.
26
+ */
27
+ getFocusableElements() {
28
+ var _a, _b, _c, _d, _e, _f;
29
+ const focusableTagSelectors = 'a[href], button, input, [tabindex]:not([tabindex="-1"])';
30
+ const isDisabledOrHidden = (el) => !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden');
31
+ let elements;
32
+ if (this.menuOption === 'web') {
33
+ // wayback focusable elements
34
+ const waybackSlider = (_a = this.elementsContainer.querySelector('wayback-slider')) === null || _a === void 0 ? void 0 : _a.shadowRoot;
35
+ const waybackSearch = waybackSlider === null || waybackSlider === void 0 ? void 0 : waybackSlider.querySelector('wayback-search');
36
+ const waybackSearchElements = Array.from((_c = (_b = waybackSearch === null || waybackSearch === void 0 ? void 0 : waybackSearch.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelectorAll(focusableTagSelectors)) !== null && _c !== void 0 ? _c : []);
37
+ const normalElements = Array.from((_d = waybackSlider === null || waybackSlider === void 0 ? void 0 : waybackSlider.querySelectorAll(focusableTagSelectors)) !== null && _d !== void 0 ? _d : []);
38
+ // wayback save-form focusable elements
39
+ const savePageForm = waybackSlider === null || waybackSlider === void 0 ? void 0 : waybackSlider.querySelector('save-page-form');
40
+ const savePageFormElements = Array.from((_f = (_e = savePageForm === null || savePageForm === void 0 ? void 0 : savePageForm.shadowRoot) === null || _e === void 0 ? void 0 : _e.querySelectorAll(focusableTagSelectors)) !== null && _f !== void 0 ? _f : []);
41
+ elements = [
42
+ ...waybackSearchElements,
43
+ ...normalElements,
44
+ ...savePageFormElements,
45
+ ];
46
+ }
47
+ else {
48
+ elements = this.elementsContainer.querySelectorAll(focusableTagSelectors);
49
+ }
50
+ return Array.from(elements).filter(isDisabledOrHidden);
51
+ }
52
+ /**
53
+ * Handles keyboard events and focuses the appropriate element.
54
+ * @param {KeyboardEvent} event - The keyboard event object.
55
+ */
56
+ handleKeyDown(event) {
57
+ const { key } = event;
58
+ const isArrowKey = [
59
+ 'ArrowDown',
60
+ 'ArrowRight',
61
+ 'ArrowUp',
62
+ 'ArrowLeft',
63
+ ].includes(key);
64
+ const isTabKey = key === 'Tab';
65
+ if (isArrowKey) {
66
+ this.handleArrowKey(key);
67
+ event.preventDefault();
68
+ }
69
+ else if (isTabKey) {
70
+ this.handleTabKey(event);
71
+ }
72
+ }
73
+ /**
74
+ * Handles arrow key events and focuses the next or previous element for topnav sub-nav and usermenu
75
+ * @param {string} key - The key that was pressed ('ArrowDown', 'ArrowRight', 'ArrowUp', or 'ArrowLeft').
76
+ */
77
+ handleArrowKey(key) {
78
+ const isDownOrRight = ['ArrowDown', 'ArrowRight'].includes(key);
79
+ if (isDownOrRight) {
80
+ this.focusNext();
81
+ }
82
+ else {
83
+ this.focusPrevious();
84
+ }
85
+ }
86
+ /**
87
+ * Focuses the previous focusable element in the container.
88
+ */
89
+ focusPrevious() {
90
+ var _a;
91
+ if (this.focusableElements.length === 0)
92
+ return;
93
+ this.focusedIndex =
94
+ (this.focusedIndex - 1 + this.focusableElements.length) %
95
+ this.focusableElements.length;
96
+ (_a = this.focusableElements[this.focusedIndex]) === null || _a === void 0 ? void 0 : _a.focus();
97
+ }
98
+ /**
99
+ * Focuses the next focusable element in the container.
100
+ */
101
+ focusNext() {
102
+ var _a;
103
+ if (this.focusableElements.length === 0)
104
+ return;
105
+ this.focusedIndex = (this.focusedIndex + 1) % this.focusableElements.length;
106
+ (_a = this.focusableElements[this.focusedIndex]) === null || _a === void 0 ? void 0 : _a.focus();
107
+ }
108
+ /**
109
+ * Handles the Tab key event and focuses the next or previous menu item.
110
+ * @param {KeyboardEvent} event - The keyboard event object.
111
+ */
112
+ handleTabKey(event) {
113
+ var _a;
114
+ if (this.menuOption) {
115
+ const isShiftPressed = event.shiftKey;
116
+ this.focusToOtherMenuItems(isShiftPressed);
117
+ }
118
+ (_a = this.focusableElements[this.focusedIndex]) === null || _a === void 0 ? void 0 : _a.blur();
119
+ event.preventDefault();
120
+ }
121
+ /**
122
+ * Focuses the other parent menu items based on the provided flag.
123
+ * @param {boolean} isPrevious - A flag indicating whether to focus the previous menu item.
124
+ */
125
+ focusToOtherMenuItems(isPrevious = false) {
126
+ this.elementsContainer.dispatchEvent(new CustomEvent('focusToOtherMenuItem', {
127
+ bubbles: true,
128
+ composed: true,
129
+ detail: {
130
+ mediatype: this.menuOption,
131
+ moveTo: isPrevious ? 'prev' : 'next',
132
+ },
133
+ }));
134
+ }
135
+ }
136
+ //# sourceMappingURL=keyboard-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard-navigation.js","sourceRoot":"","sources":["../../../src/lib/keyboard-navigation.ts"],"names":[],"mappings":"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","sourcesContent":["export default class KeyboardNavigation {\n elementsContainer: HTMLElement;\n menuOption: string;\n focusableElements: HTMLElement[];\n focusedIndex: number;\n\n /**\n * Constructor for the KeyboardNavigation class.\n * @param {HTMLElement} elementsContainer - The container element that holds the focusable elements.\n * @param {string} menuOption - The type of menu option ('web' or 'usermenu').\n */\n constructor(elementsContainer: HTMLElement, menuOption: string) {\n this.elementsContainer = elementsContainer;\n this.menuOption = menuOption;\n this.focusableElements = this.getFocusableElements();\n this.focusedIndex = this.getInitialFocusedIndex();\n\n this.focusableElements[this.focusedIndex]?.focus();\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n /**\n * Returns the initial focused index based on the menu option.\n * @returns {number} The initial focused index (0 for 'web', 1 for 'usermenu').\n */\n getInitialFocusedIndex(): number {\n return this.menuOption === 'usermenu' ? 1 : 0;\n }\n\n /**\n * Gets an array of focusable elements within the container.\n * @returns {HTMLElement[]} An array of focusable elements.\n */\n getFocusableElements(): HTMLElement[] {\n const focusableTagSelectors =\n 'a[href], button, input, [tabindex]:not([tabindex=\"-1\"])';\n const isDisabledOrHidden = (el: Element) =>\n !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden');\n\n let elements;\n if (this.menuOption === 'web') {\n // wayback focusable elements\n const waybackSlider =\n this.elementsContainer.querySelector('wayback-slider')?.shadowRoot;\n const waybackSearch = waybackSlider?.querySelector('wayback-search');\n const waybackSearchElements = Array.from(\n waybackSearch?.shadowRoot?.querySelectorAll(focusableTagSelectors) ??\n [],\n );\n\n const normalElements = Array.from(\n waybackSlider?.querySelectorAll(focusableTagSelectors) ?? [],\n );\n\n // wayback save-form focusable elements\n const savePageForm = waybackSlider?.querySelector('save-page-form');\n const savePageFormElements = Array.from(\n savePageForm?.shadowRoot?.querySelectorAll(focusableTagSelectors) ?? [],\n );\n\n elements = [\n ...waybackSearchElements,\n ...normalElements,\n ...savePageFormElements,\n ];\n } else {\n elements = this.elementsContainer.querySelectorAll(focusableTagSelectors);\n }\n\n return Array.from(elements).filter(isDisabledOrHidden) as HTMLElement[];\n }\n\n /**\n * Handles keyboard events and focuses the appropriate element.\n * @param {KeyboardEvent} event - The keyboard event object.\n */\n handleKeyDown(event: KeyboardEvent) {\n const { key } = event;\n const isArrowKey = [\n 'ArrowDown',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowLeft',\n ].includes(key);\n const isTabKey = key === 'Tab';\n\n if (isArrowKey) {\n this.handleArrowKey(key);\n event.preventDefault();\n } else if (isTabKey) {\n this.handleTabKey(event);\n }\n }\n\n /**\n * Handles arrow key events and focuses the next or previous element for topnav sub-nav and usermenu\n * @param {string} key - The key that was pressed ('ArrowDown', 'ArrowRight', 'ArrowUp', or 'ArrowLeft').\n */\n handleArrowKey(key: string) {\n const isDownOrRight = ['ArrowDown', 'ArrowRight'].includes(key);\n if (isDownOrRight) {\n this.focusNext();\n } else {\n this.focusPrevious();\n }\n }\n\n /**\n * Focuses the previous focusable element in the container.\n */\n focusPrevious() {\n if (this.focusableElements.length === 0) return;\n this.focusedIndex =\n (this.focusedIndex - 1 + this.focusableElements.length) %\n this.focusableElements.length;\n this.focusableElements[this.focusedIndex]?.focus();\n }\n\n /**\n * Focuses the next focusable element in the container.\n */\n focusNext() {\n if (this.focusableElements.length === 0) return;\n this.focusedIndex = (this.focusedIndex + 1) % this.focusableElements.length;\n this.focusableElements[this.focusedIndex]?.focus();\n }\n\n /**\n * Handles the Tab key event and focuses the next or previous menu item.\n * @param {KeyboardEvent} event - The keyboard event object.\n */\n handleTabKey(event: KeyboardEvent) {\n if (this.menuOption) {\n const isShiftPressed = event.shiftKey;\n this.focusToOtherMenuItems(isShiftPressed);\n }\n\n this.focusableElements[this.focusedIndex]?.blur();\n event.preventDefault();\n }\n\n /**\n * Focuses the other parent menu items based on the provided flag.\n * @param {boolean} isPrevious - A flag indicating whether to focus the previous menu item.\n */\n focusToOtherMenuItems(isPrevious: boolean = false) {\n this.elementsContainer.dispatchEvent(\n new CustomEvent('focusToOtherMenuItem', {\n bubbles: true,\n composed: true,\n detail: {\n mediatype: this.menuOption,\n moveTo: isPrevious ? 'prev' : 'next',\n },\n }),\n );\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export default function (url: string): void;
@@ -0,0 +1,5 @@
1
+ /* istanbul ignore file */
2
+ export default function (url) {
3
+ window.location.href = url;
4
+ }
5
+ //# sourceMappingURL=location-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location-handler.js","sourceRoot":"","sources":["../../../src/lib/location-handler.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,MAAM,CAAC,OAAO,WAAW,GAAW;IAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC;AAC7B,CAAC","sourcesContent":["/* istanbul ignore file */\n\nexport default function (url: string) {\n window.location.href = url;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function makeBooleanFromString(value: string): 'true' | 'false';
2
+ export declare function makeBooleanString(value: boolean): 'true' | 'false';
@@ -0,0 +1,12 @@
1
+ export function makeBooleanFromString(value) {
2
+ const lowerValue = value.toLowerCase();
3
+ let booleanValue = false;
4
+ if (lowerValue === 'true' || lowerValue === '1') {
5
+ booleanValue = true;
6
+ }
7
+ return makeBooleanString(booleanValue);
8
+ }
9
+ export function makeBooleanString(value) {
10
+ return value ? 'true' : 'false';
11
+ }
12
+ //# sourceMappingURL=makeBooleanString.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeBooleanString.js","sourceRoot":"","sources":["../../../src/lib/makeBooleanString.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,YAAY,GAAY,KAAK,CAAC;IAClC,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QAChD,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AAClC,CAAC","sourcesContent":["export function makeBooleanFromString(value: string): 'true' | 'false' {\n const lowerValue = value.toLowerCase();\n let booleanValue: boolean = false;\n if (lowerValue === 'true' || lowerValue === '1') {\n booleanValue = true;\n }\n return makeBooleanString(booleanValue);\n}\n\nexport function makeBooleanString(value: boolean): 'true' | 'false' {\n return value ? 'true' : 'false';\n}\n"]}
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ performQuery(query: string): void;
3
+ };
4
+ export default _default;
@@ -0,0 +1,7 @@
1
+ /* istanbul ignore file */
2
+ export default {
3
+ performQuery(query) {
4
+ window.location.href = `https://web.archive.org/web/*/${query}`;
5
+ },
6
+ };
7
+ //# sourceMappingURL=query-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-handler.js","sourceRoot":"","sources":["../../../src/lib/query-handler.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAE1B,eAAe;IACb,YAAY,CAAC,KAAa;QACxB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,iCAAiC,KAAK,EAAE,CAAC;IAClE,CAAC;CACF,CAAC","sourcesContent":["/* istanbul ignore file */\n\nexport default {\n performQuery(query: string) {\n window.location.href = `https://web.archive.org/web/*/${query}`;\n },\n};\n"]}
@@ -0,0 +1,2 @@
1
+ declare const toSentenceCase: (phrase: string) => string;
2
+ export default toSentenceCase;
@@ -0,0 +1,10 @@
1
+ const toSentenceCase = (phrase) => {
2
+ const words = phrase.split(' ');
3
+ const lastWord = words.pop();
4
+ const capitalizedWord = `${lastWord === null || lastWord === void 0 ? void 0 : lastWord.substr(0, 1).toUpperCase()}${lastWord === null || lastWord === void 0 ? void 0 : lastWord.substr(1)}`;
5
+ return words.length
6
+ ? toSentenceCase(`${words.join(' ')}${capitalizedWord}`)
7
+ : capitalizedWord;
8
+ };
9
+ export default toSentenceCase;
10
+ //# sourceMappingURL=toSentenceCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toSentenceCase.js","sourceRoot":"","sources":["../../../src/lib/toSentenceCase.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,CAAC,MAAc,EAAU,EAAE;IAChD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,eAAe,GAAG,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,OAAO,KAAK,CAAC,MAAM;QACjB,CAAC,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,EAAE,CAAC;QACxD,CAAC,CAAC,eAAe,CAAC;AACtB,CAAC,CAAC;AAEF,eAAe,cAAc,CAAC","sourcesContent":["const toSentenceCase = (phrase: string): string => {\n const words = phrase.split(' ');\n const lastWord = words.pop();\n const capitalizedWord = `${lastWord?.substr(0, 1).toUpperCase()}${lastWord?.substr(1)}`;\n return words.length\n ? toSentenceCase(`${words.join(' ')}${capitalizedWord}`)\n : capitalizedWord;\n};\n\nexport default toSentenceCase;\n"]}