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