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

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 +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 +115 -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 +123 -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/assets/img/user.test.d.ts +1 -0
  207. package/dist/test/assets/img/user.test.js +12 -0
  208. package/dist/test/assets/img/user.test.js.map +1 -0
  209. package/dist/test/data/menus.test.d.ts +1 -0
  210. package/dist/test/data/menus.test.js +11 -0
  211. package/dist/test/data/menus.test.js.map +1 -0
  212. package/dist/test/dropdown-menu.test.d.ts +1 -0
  213. package/dist/test/dropdown-menu.test.js +20 -0
  214. package/dist/test/dropdown-menu.test.js.map +1 -0
  215. package/dist/test/ia-icon.test.d.ts +1 -0
  216. package/dist/test/ia-icon.test.js +11 -0
  217. package/dist/test/ia-icon.test.js.map +1 -0
  218. package/dist/test/ia-topnav.test.d.ts +1 -0
  219. package/dist/test/ia-topnav.test.js +232 -0
  220. package/dist/test/ia-topnav.test.js.map +1 -0
  221. package/dist/test/login-button.test.d.ts +1 -0
  222. package/dist/test/login-button.test.js +14 -0
  223. package/dist/test/login-button.test.js.map +1 -0
  224. package/dist/test/media-button.test.d.ts +1 -0
  225. package/dist/test/media-button.test.js +13 -0
  226. package/dist/test/media-button.test.js.map +1 -0
  227. package/dist/test/media-menu.test.d.ts +1 -0
  228. package/dist/test/media-menu.test.js +27 -0
  229. package/dist/test/media-menu.test.js.map +1 -0
  230. package/dist/test/media-slider.test.d.ts +1 -0
  231. package/dist/test/media-slider.test.js +47 -0
  232. package/dist/test/media-slider.test.js.map +1 -0
  233. package/dist/test/more-slider.test.d.ts +1 -0
  234. package/dist/test/more-slider.test.js +17 -0
  235. package/dist/test/more-slider.test.js.map +1 -0
  236. package/dist/test/nav-search.test.d.ts +1 -0
  237. package/dist/test/nav-search.test.js +47 -0
  238. package/dist/test/nav-search.test.js.map +1 -0
  239. package/dist/test/primary-nav.test.d.ts +1 -0
  240. package/dist/test/primary-nav.test.js +65 -0
  241. package/dist/test/primary-nav.test.js.map +1 -0
  242. package/dist/test/save-page-form.test.d.ts +1 -0
  243. package/dist/test/save-page-form.test.js +47 -0
  244. package/dist/test/save-page-form.test.js.map +1 -0
  245. package/dist/test/search-menu.test.d.ts +1 -0
  246. package/dist/test/search-menu.test.js +42 -0
  247. package/dist/test/search-menu.test.js.map +1 -0
  248. package/dist/test/user-menu.test.d.ts +1 -0
  249. package/dist/test/user-menu.test.js +28 -0
  250. package/dist/test/user-menu.test.js.map +1 -0
  251. package/dist/test/wayback-slider.test.d.ts +1 -0
  252. package/dist/test/wayback-slider.test.js +80 -0
  253. package/dist/test/wayback-slider.test.js.map +1 -0
  254. package/eslint.config.mjs +53 -0
  255. package/package.json +47 -37
  256. package/prettier.config.js +9 -0
  257. package/src/assets/img/hamburger.ts +49 -0
  258. package/src/assets/img/{ia-icon.js → ia-icon.ts} +7 -16
  259. package/src/assets/img/{icon-audio.js → icon-audio.ts} +7 -2
  260. package/src/assets/img/icon-close.ts +20 -0
  261. package/src/assets/img/icon-donate-unpadded.ts +19 -0
  262. package/src/assets/img/icon-donate.ts +18 -0
  263. package/src/assets/img/icon-ellipses.ts +19 -0
  264. package/src/assets/img/icon-ia-logo.ts +30 -0
  265. package/src/assets/img/icon-images.ts +19 -0
  266. package/src/assets/img/icon-search.ts +19 -0
  267. package/src/assets/img/icon-software.ts +18 -0
  268. package/src/assets/img/icon-texts.ts +18 -0
  269. package/src/assets/img/{icon-upload-unpadded.js → icon-upload-unpadded.ts} +6 -2
  270. package/src/assets/img/icon-upload.ts +21 -0
  271. package/src/assets/img/icon-user.ts +19 -0
  272. package/src/assets/img/icon-video.ts +19 -0
  273. package/src/assets/img/icon-web.ts +19 -0
  274. package/src/assets/img/icon.ts +8 -0
  275. package/src/assets/img/icons.ts +33 -0
  276. package/src/assets/img/{wordmark-stacked.js → wordmark-stacked.ts} +1 -1
  277. package/src/data/{menus.js → menus.ts} +172 -135
  278. package/src/desktop-subnav.ts +49 -0
  279. package/src/dropdown-menu.ts +105 -0
  280. package/src/{ia-topnav.js → ia-topnav.ts} +130 -127
  281. package/src/lib/formatUrl.ts +2 -0
  282. package/src/lib/{keyboard-navigation.js → keyboard-navigation.ts} +53 -23
  283. package/src/lib/location-handler.ts +5 -0
  284. package/src/lib/makeBooleanString.ts +12 -0
  285. package/src/lib/query-handler.ts +7 -0
  286. package/src/lib/toSentenceCase.ts +10 -0
  287. package/src/{login-button.js → login-button.ts} +27 -31
  288. package/src/{media-button.js → media-button.ts} +39 -49
  289. package/src/media-menu.ts +143 -0
  290. package/src/{media-slider.js → media-slider.ts} +53 -41
  291. package/src/media-subnav.ts +132 -0
  292. package/src/models.ts +114 -0
  293. package/src/more-slider.ts +42 -0
  294. package/src/nav-search.ts +113 -0
  295. package/src/primary-nav.ts +266 -0
  296. package/src/save-page-form.ts +59 -0
  297. package/src/search-menu.ts +156 -0
  298. package/src/signed-out-dropdown.ts +11 -0
  299. package/src/styles/{base.js → base.ts} +2 -2
  300. package/src/styles/{desktop-subnav.js → desktop-subnav.ts} +2 -2
  301. package/src/styles/{dropdown-menu.js → dropdown-menu.ts} +4 -2
  302. package/src/styles/{ia-topnav.js → ia-topnav.ts} +1 -1
  303. package/src/styles/{login-button.js → login-button.ts} +1 -1
  304. package/src/styles/{media-button.js → media-button.ts} +2 -2
  305. package/src/styles/{media-menu.js → media-menu.ts} +1 -1
  306. package/src/styles/{media-slider.js → media-slider.ts} +1 -1
  307. package/src/styles/media-subnav.ts +159 -0
  308. package/src/styles/{more-slider.js → more-slider.ts} +1 -1
  309. package/src/styles/{nav-search.js → nav-search.ts} +2 -2
  310. package/src/styles/{primary-nav.js → primary-nav.ts} +2 -3
  311. package/src/styles/{save-page-form.js → save-page-form.ts} +7 -7
  312. package/src/styles/{search-menu.js → search-menu.ts} +1 -1
  313. package/src/styles/{signed-out-dropdown.js → signed-out-dropdown.ts} +1 -1
  314. package/src/styles/{user-menu.js → user-menu.ts} +1 -1
  315. package/src/styles/{wayback-search.js → wayback-search.ts} +3 -3
  316. package/src/styles/wayback-slider.ts +33 -0
  317. package/src/tracked-element.ts +32 -0
  318. package/src/user-menu.ts +57 -0
  319. package/src/wayback-search.ts +10 -0
  320. package/src/wayback-slider.ts +88 -0
  321. package/ssl/server.crt +22 -0
  322. package/ssl/server.key +28 -0
  323. package/test/assets/img/hamburger.test.ts +18 -0
  324. package/test/assets/img/user.test.ts +15 -0
  325. package/test/data/menus.test.ts +15 -0
  326. package/test/{dropdown-menu.test.js → dropdown-menu.test.ts} +4 -4
  327. package/test/{ia-icon.test.js → ia-icon.test.ts} +6 -4
  328. package/test/ia-topnav.test.ts +344 -0
  329. package/test/login-button.test.ts +19 -0
  330. package/test/media-button.test.ts +19 -0
  331. package/test/{media-menu.test.js → media-menu.test.ts} +14 -12
  332. package/test/media-slider.test.ts +63 -0
  333. package/test/more-slider.test.ts +21 -0
  334. package/test/nav-search.test.ts +70 -0
  335. package/test/primary-nav.test.ts +110 -0
  336. package/test/save-page-form.test.ts +62 -0
  337. package/test/{search-menu.test.js → search-menu.test.ts} +19 -10
  338. package/test/{user-menu.test.js → user-menu.test.ts} +10 -9
  339. package/test/wayback-slider.test.ts +97 -0
  340. package/tsconfig.json +31 -0
  341. package/web-dev-server.config.mjs +32 -0
  342. package/web-test-runner.config.mjs +41 -0
  343. package/.eslintrc +0 -16
  344. package/index.d.ts +0 -109
  345. package/src/assets/img/hamburger.js +0 -38
  346. package/src/assets/img/icon-close.js +0 -16
  347. package/src/assets/img/icon-donate-unpadded.js +0 -16
  348. package/src/assets/img/icon-donate.js +0 -15
  349. package/src/assets/img/icon-ellipses.js +0 -15
  350. package/src/assets/img/icon-ia-logo.js +0 -22
  351. package/src/assets/img/icon-images.js +0 -15
  352. package/src/assets/img/icon-search.js +0 -15
  353. package/src/assets/img/icon-software.js +0 -15
  354. package/src/assets/img/icon-texts.js +0 -15
  355. package/src/assets/img/icon-upload.js +0 -15
  356. package/src/assets/img/icon-user.js +0 -15
  357. package/src/assets/img/icon-video.js +0 -15
  358. package/src/assets/img/icon-web.js +0 -15
  359. package/src/assets/img/icon.js +0 -18
  360. package/src/assets/img/icons.js +0 -33
  361. package/src/desktop-subnav.js +0 -45
  362. package/src/dropdown-menu.js +0 -110
  363. package/src/lib/formatUrl.js +0 -1
  364. package/src/lib/location-handler.js +0 -5
  365. package/src/lib/query-handler.js +0 -7
  366. package/src/lib/toSentenceCase.js +0 -8
  367. package/src/media-menu.js +0 -154
  368. package/src/media-subnav.js +0 -112
  369. package/src/more-slider.js +0 -33
  370. package/src/nav-search.js +0 -111
  371. package/src/primary-nav.js +0 -258
  372. package/src/save-page-form.js +0 -59
  373. package/src/search-menu.js +0 -145
  374. package/src/signed-out-dropdown.js +0 -10
  375. package/src/styles/media-subnav.js +0 -156
  376. package/src/styles/wayback-slider.js +0 -30
  377. package/src/tracked-element.js +0 -29
  378. package/src/user-menu.js +0 -56
  379. package/src/wayback-search.js +0 -18
  380. package/src/wayback-slider.js +0 -87
  381. package/test/assets/img/hamburger.test.js +0 -15
  382. package/test/assets/img/user.test.js +0 -15
  383. package/test/data/menus.test.js +0 -19
  384. package/test/ia-topnav.test.js +0 -273
  385. package/test/login-button.test.js +0 -15
  386. package/test/media-button.test.js +0 -19
  387. package/test/media-slider.test.js +0 -57
  388. package/test/more-slider.test.js +0 -13
  389. package/test/nav-search.test.js +0 -61
  390. package/test/primary-nav.test.js +0 -82
  391. package/test/save-page-form.test.js +0 -35
  392. package/test/wayback-slider.test.js +0 -80
  393. /package/{index.js → index.ts} +0 -0
@@ -0,0 +1,88 @@
1
+ import { html } from 'lit';
2
+ import './wayback-search';
3
+ import TrackedElement from './tracked-element';
4
+ import './save-page-form';
5
+ import queryHandler from './lib/query-handler';
6
+ import waybackSliderCSS from './styles/wayback-slider';
7
+ import toSentenceCase from './lib/toSentenceCase';
8
+ import formatUrl from './lib/formatUrl';
9
+ import { customElement, property } from 'lit/decorators.js';
10
+ import { IATopNavConfig, IATopNavLink } from './models';
11
+ import { defaultTopNavConfig } from './data/menus';
12
+
13
+ @customElement('wayback-slider')
14
+ export class WaybackSlider extends TrackedElement {
15
+ @property({ type: Array }) archiveItLinks: IATopNavLink[] = [];
16
+ @property({ type: String }) baseHost = '';
17
+ @property({ type: Array }) browserExtensionsLinks: IATopNavLink[] = [];
18
+ @property({ type: Object }) config: IATopNavConfig = defaultTopNavConfig;
19
+ @property({ type: Array }) mobileAppsLinks: IATopNavLink[] = [];
20
+
21
+ static get styles() {
22
+ return waybackSliderCSS;
23
+ }
24
+
25
+ get mobileAppsItems() {
26
+ return this.linkList(this.mobileAppsLinks, 'Wayback');
27
+ }
28
+
29
+ get browserExtensionsItems() {
30
+ return this.linkList(this.browserExtensionsLinks, 'Wayback');
31
+ }
32
+
33
+ get archiveItItems() {
34
+ return this.linkList(this.archiveItLinks, 'ArchiveIt');
35
+ }
36
+
37
+ private linkList(links: IATopNavLink[], eventPrefix: string) {
38
+ return links.map(
39
+ (link) =>
40
+ html`<li>
41
+ <a
42
+ .href=${formatUrl(link.url, this.baseHost)}
43
+ @click=${this.trackClick}
44
+ data-event-click-tracking="${this.analyticsEvent(
45
+ `${eventPrefix}${link.title}`,
46
+ )}"
47
+ target=${link.external ? '_blank' : ''}
48
+ rel=${link.external ? 'noreferrer noopener' : ''}
49
+ >${link.title}</a
50
+ >
51
+ </li>`,
52
+ );
53
+ }
54
+
55
+ analyticsEvent(title: string) {
56
+ return `${this.config?.eventCategory}|${toSentenceCase(title)}`;
57
+ }
58
+
59
+ render() {
60
+ return html`
61
+ <div class="grid">
62
+ <wayback-search
63
+ .waybackPagesArchived=${this.config.waybackPagesArchived ?? ''}
64
+ .queryHandler=${queryHandler}
65
+ ></wayback-search>
66
+ <div class="link-lists">
67
+ <div>
68
+ <h4>Mobile Apps</h4>
69
+ <ul class="mobile-apps">
70
+ ${this.mobileAppsItems}
71
+ </ul>
72
+ <h4>Browser Extensions</h4>
73
+ <ul class="browser-extensions">
74
+ ${this.browserExtensionsItems}
75
+ </ul>
76
+ </div>
77
+ <div>
78
+ <h4>Archive-It Subscription</h4>
79
+ <ul class="archive-it">
80
+ ${this.archiveItItems}
81
+ </ul>
82
+ </div>
83
+ </div>
84
+ <save-page-form .config=${this.config}></save-page-form>
85
+ </div>
86
+ `;
87
+ }
88
+ }
package/ssl/server.crt ADDED
@@ -0,0 +1,22 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDszCCApugAwIBAgIUYr5csS2ntaMTww0b5QoFI0xlOpUwDQYJKoZIhvcNAQEL
3
+ BQAwaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh
4
+ bmNpc2NvMRkwFwYDVQQKDBBJbnRlcm5ldCBBcmNoaXZlMRowGAYDVQQDDBFsb2Nh
5
+ bC5hcmNoaXZlLm9yZzAeFw0yNTAzMDcxOTM1MzRaFw0yNTA0MDYxOTM1MzRaMGkx
6
+ CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNj
7
+ bzEZMBcGA1UECgwQSW50ZXJuZXQgQXJjaGl2ZTEaMBgGA1UEAwwRbG9jYWwuYXJj
8
+ aGl2ZS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZqbS9hNS3
9
+ 8AtcA7Uszq7EA7RavuHc8AcpbURa6Y7NORs0SmfDD0oLptQ7DX5pSuHyOeDHzQ3U
10
+ XRCUDAhAD1XlaYQ6PPdiJPRAe4ACELzgDzepxVz3pdKPcfXd5/mHV3ghUZya2XW5
11
+ DSF1CRYUX2j10a+JORJIG4bhvTg4HxTJZZDuaNfBMC6ZSn7d9YLQoAf1MLLJm43Y
12
+ cj1WlOnyG4DHxNEqEk260BlbBywJH+SJA6GA0GR2bnzYZaDnZ0wqea0Zamx8ijpd
13
+ JxBUxYOqLfzs2KREVkkGOmsFEu82W6G3D4bKsY1UNaWXb/jcl3UkXIJJij6CdbbM
14
+ QkUJc8dow3sVAgMBAAGjUzBRMB0GA1UdDgQWBBSla0L0Yhpx9/DEV4uJ6OoHH92Q
15
+ bTAfBgNVHSMEGDAWgBSla0L0Yhpx9/DEV4uJ6OoHH92QbTAPBgNVHRMBAf8EBTAD
16
+ AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBEzt9sgWtwjLI7AVrejDSE6F/01ng4bTni
17
+ 0PJXa7IpwjhAApVWcjxDKp8SkDUAcZNULqBGvpPicqjnKf+wxk3xTMc7pvLqzOor
18
+ pm+plDUBfCEbrv1ouLDMgOtxQxbwbBUPySsLoNmDUGAGnL2zENX7qidOOmmSQEN4
19
+ jZuPtiEkgTqmtkfHaRX/7jhmGVfxMxj0Krlar1/cSbvwaVs4kRSjiL9/avT+AX59
20
+ 0QoNYTLGcBP0RKia8NF2A3cgUivIMFZQDvdsiAvqY+DbC7Mnyv4Sj/ZHHwVa9+8k
21
+ iRU56DrOt7sgaa/oQfzWnvRtL0F5eXC3veqM4qZrXs9hHeGlgPFo
22
+ -----END CERTIFICATE-----
package/ssl/server.key ADDED
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZqbS9hNS38Atc
3
+ A7Uszq7EA7RavuHc8AcpbURa6Y7NORs0SmfDD0oLptQ7DX5pSuHyOeDHzQ3UXRCU
4
+ DAhAD1XlaYQ6PPdiJPRAe4ACELzgDzepxVz3pdKPcfXd5/mHV3ghUZya2XW5DSF1
5
+ CRYUX2j10a+JORJIG4bhvTg4HxTJZZDuaNfBMC6ZSn7d9YLQoAf1MLLJm43Ycj1W
6
+ lOnyG4DHxNEqEk260BlbBywJH+SJA6GA0GR2bnzYZaDnZ0wqea0Zamx8ijpdJxBU
7
+ xYOqLfzs2KREVkkGOmsFEu82W6G3D4bKsY1UNaWXb/jcl3UkXIJJij6CdbbMQkUJ
8
+ c8dow3sVAgMBAAECggEANgLpITAhcuVDhFk9L3m4H1bF/dCpDmCXfl2pXR/guicm
9
+ C4M9HUeheaOzvVWbXThiOe/HyfylpmFTmFEmCPNlPrDAyYzQXE/MNmYO/TQ3Eihk
10
+ iSG68I764XKHbsG+Byoa2rW8NSaqEjniZ/7Rtkt4qasXMmdxlGgUP9bq6O45g8HV
11
+ kHxneFlA2KbrvmWnBi7NTea9+tp61NWiq5n97UgHacQR6KkYIpbxd7uNSnCSdmXt
12
+ pcwzO4ZPabJ2/DKRjePhU5OggPh+9AhJ3jsBo99GwYPgSZDh8E3vh2OWOtLBMUH3
13
+ rmAYwlRT2aZ5hy5yi+4QD98WoUQtsr+9n757F8V6MQKBgQDzZycdgaKwWd5d34NN
14
+ 0TkFtPQPwxxJTCCs3I3q02uWcS3svQzBK0cWb4nISO04TnJ3MnXo83dgGhCMF+uZ
15
+ FCXxAA53z8F92iZo+ELlXFDFwNeNYih/afDA42tWZ6TlVsDnZ4zQgRjHS7jEF/JV
16
+ 0ZgwGpw5725JQt64dic8wTOcDQKBgQDk7YYACQcWTnmjDhZQ3PZSX4fcTtzPZKZj
17
+ fa1GrXEaUH1hSyc9VmY6qJpUmXexpvtr194nXE+O5wbThOHcBjVlo2Qv+vswmUX3
18
+ WEcVzTVN4/fODCLCqFcMNIr+BzwZfwpT+p0u8g9FxDy1gGmvkxwIu8DCpnUT12Xj
19
+ hm2wO+UxKQKBgFxCSDBF9+2SUtgQJYv0dwGzwiLLWMhro6MCAoT02D3w7nBihBgg
20
+ GFTnuDkDc285ROfrZ4gB6MizeHwxgOrIGU2NMO62/+d9LbvyBiE76Z3bZ5i+kQ0i
21
+ kc/7I69fn8ASLxJHTLenh0XbbNBfJ0riJCZvn7HSEGKShysyFdNQhAhtAoGAFYVi
22
+ 0IQIv4cXFkYPwQBUw7+pVQOw7GpI3heFf5x0goXIk6nuAW0q5R7Oi192CiRphGTh
23
+ xI+ABy4ezSmz1exbfreShpQwowv1sOACpsEI3s6skBlB90y+Ci6yVlk1xCvWO7jW
24
+ qAAngWaGUoXE6bWJsCR+ZY4ieYAJWw9bJnMrA6kCgYAzV4Xeoh5ofENZM21wKW3W
25
+ iCzRibPObv6Vb/j9A9yT57yzI3BdfvsX5zmuSvOJm1DimgGY9nCJUzUEYG0a1Dhh
26
+ /rqObPoVIFGesmvwflVYFktmVHk7ycEDVreSTz23cvmraPz1fnpdKeuEs4sRQJV7
27
+ iJhLoxX5SJlJc0RXMhgHGQ==
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,18 @@
1
+ import { html, fixture, expect } from '@open-wc/testing';
2
+ import '../../../src/assets/img/hamburger';
3
+ import { HamBurger } from '../../../src/assets/img/hamburger';
4
+
5
+ describe('<icon-hamburger>', () => {
6
+ it('toggles close icon when property toggled', async () => {
7
+ const icon = await fixture<HamBurger>(
8
+ html`<icon-hamburger></icon-hamburger>`,
9
+ );
10
+
11
+ icon.active = true;
12
+ await icon.updateComplete;
13
+
14
+ const titleElement = icon.shadowRoot?.querySelector('svg title');
15
+
16
+ expect(titleElement?.getAttribute('id')).to.match(/close/);
17
+ });
18
+ });
@@ -0,0 +1,15 @@
1
+ import { html, fixture, expect } from '@open-wc/testing';
2
+ import '../../../src/assets/img/icon-user';
3
+
4
+ describe('<user-image>', () => {
5
+ it('toggles active class when property toggled', async () => {
6
+ const icon = await fixture(html`<user-image></user-image>`);
7
+
8
+ // icon.active = true;
9
+ // await icon.updateComplete;
10
+
11
+ // const styleElement = icon.shadowRoot.querySelector('svg > path');
12
+
13
+ // expect(styleElement.classList.contains('active')).to.be.true;
14
+ });
15
+ });
@@ -0,0 +1,15 @@
1
+ import { expect } from '@open-wc/testing';
2
+ import { buildTopNavMenus } from '../../src/data/menus';
3
+
4
+ describe('Menu data', () => {
5
+ it('returns a collection for each media category', () => {
6
+ const menus = buildTopNavMenus();
7
+
8
+ ['texts', 'video', 'audio', 'software', 'images', 'user', 'more'].forEach(
9
+ (category) => {
10
+ const menus = buildTopNavMenus();
11
+ // expect(menus[category]).to.not.be.undefined;
12
+ },
13
+ );
14
+ });
15
+ });
@@ -8,7 +8,7 @@ const component = html`<dropdown-menu></dropdown-menu>`;
8
8
 
9
9
  describe('<dropdown-menu>', () => {
10
10
  it('sets default properties', async () => {
11
- const el = await fixture(component);
11
+ const el = await fixture<DropdownMenu>(component);
12
12
 
13
13
  expect(el.animate).to.be.false;
14
14
  expect(el.open).to.be.false;
@@ -16,10 +16,10 @@ describe('<dropdown-menu>', () => {
16
16
  });
17
17
 
18
18
  it('renders a closed class if component is animating', async () => {
19
- const el = await fixture(component);
19
+ const el = await fixture<DropdownMenu>(component);
20
20
 
21
- el.animate = true;
21
+ el.animated = true;
22
22
  await el.updateComplete;
23
- expect(el.shadowRoot.querySelector('.closed')).to.not.be.undefined;
23
+ expect(el.shadowRoot?.querySelector('.closed')).to.not.be.undefined;
24
24
  });
25
25
  });
@@ -1,13 +1,15 @@
1
1
  import { html, fixture, expect } from '@open-wc/testing';
2
- import '../src/assets/img/ia-icon';
2
+ import { IAIcon } from '../src/assets/img/ia-icon';
3
3
 
4
4
  describe('<ia-icon>', () => {
5
5
  it('renders an icon with a fill color', async () => {
6
6
  const iconType = 'web';
7
- const fill = '#999';
8
- const iaIcon = await fixture(html`<ia-icon .icon=${iconType} .fill=${fill}></ia-icon>`);
7
+ // const fill = '#999';
8
+ const iaIcon = await fixture<IAIcon>(
9
+ html`<ia-icon .icon=${iconType}></ia-icon>`,
10
+ );
9
11
 
10
12
  expect(iaIcon.icon).to.equal(iconType);
11
- expect(iaIcon.fill).to.equal(fill);
13
+ // expect(iaIcon.fill).to.equal(fill);
12
14
  });
13
15
  });
@@ -0,0 +1,344 @@
1
+ import {
2
+ html,
3
+ fixture,
4
+ expect,
5
+ oneEvent,
6
+ fixtureCleanup,
7
+ elementUpdated,
8
+ } from '@open-wc/testing';
9
+
10
+ import '../src/ia-topnav';
11
+ import IATopNav from '../src/ia-topnav';
12
+ import { SearchMenu } from '../src/search-menu';
13
+ import { SignedOutDropdown } from '../src/signed-out-dropdown';
14
+ import UserMenu from '../src/user-menu';
15
+ import { IATopNavConfig, IATopNavSecondIdentitySlotMode } from '../src/models';
16
+
17
+ // const container = (
18
+ // {
19
+ // username = '',
20
+ // screenName = '',
21
+ // config = {},
22
+ // localLinks = true,
23
+ // secondIdentitySlotMode = '',
24
+ // }: {
25
+ // username?: string;
26
+ // screenName?: string;
27
+ // config?: IATopNavConfig;
28
+ // localLinks: boolean;
29
+ // secondIdentitySlotMode?: IATopNavSecondIdentitySlotMode;
30
+ // } = {
31
+ // localLinks: true,
32
+ // },
33
+ // ) =>
34
+ // html`<ia-topnav
35
+ // .screenName=${screenName}
36
+ // username=${username}
37
+ // ?localLinks=${localLinks}
38
+ // .config=${config}
39
+ // .secondIdentitySlotMode=${secondIdentitySlotMode}
40
+ // ></ia-topnav>`;
41
+
42
+ const verifyClosed = (instance: IATopNav) => {
43
+ expect(instance.mediaSliderOpen).to.be.false;
44
+ expect(instance.selectedMenuOption).to.equal('');
45
+ };
46
+
47
+ const verifyOpened = (instance: IATopNav, mediatype: string) => {
48
+ expect(instance.mediaSliderOpen).to.be.true;
49
+ expect(instance.selectedMenuOption).to.equal(mediatype);
50
+ };
51
+
52
+ afterEach(() => {
53
+ fixtureCleanup();
54
+ });
55
+
56
+ describe('<ia-topnav>', () => {
57
+ it('assigns a value to "search in" from outside event', async () => {
58
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
59
+ const query = 'atari';
60
+ const searchMenu = el.shadowRoot?.querySelector(
61
+ 'search-menu',
62
+ ) as SearchMenu;
63
+
64
+ const inputEvent = new InputEvent('input');
65
+ Object.defineProperty(inputEvent, 'target', {
66
+ value: { value: query },
67
+ writable: false,
68
+ });
69
+
70
+ searchMenu?.searchInChanged(inputEvent);
71
+ await el.updateComplete;
72
+
73
+ expect(el.searchIn).to.equal(query);
74
+ });
75
+
76
+ it('dispatches an analyticsClick event when trackClick event fired', async () => {
77
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
78
+ const clickEvent = new MouseEvent('click');
79
+
80
+ setTimeout(() =>
81
+ el.shadowRoot
82
+ ?.querySelector('primary-nav')
83
+ ?.shadowRoot?.querySelector('.hamburger')
84
+ ?.dispatchEvent(clickEvent),
85
+ );
86
+ const response = await oneEvent(el, 'trackClick');
87
+
88
+ expect(response).to.exist;
89
+ });
90
+
91
+ it('dispatches an analyticsSubmit event when trackSubmit event fired', async () => {
92
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
93
+ const submitEvent = new Event('submit');
94
+ const form = el.shadowRoot
95
+ ?.querySelector('primary-nav')
96
+ ?.shadowRoot?.querySelector('nav-search')
97
+ ?.shadowRoot?.querySelector('form');
98
+
99
+ form?.addEventListener('submit', (e) => e.preventDefault());
100
+ (form?.querySelector('[name=query]') as HTMLInputElement).value = 'atari';
101
+ setTimeout(() => form?.dispatchEvent(submitEvent));
102
+ const response = await oneEvent(el, 'trackSubmit');
103
+
104
+ expect(response).to.exist;
105
+ });
106
+
107
+ it('closes all menus when close-layer clicked', async () => {
108
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
109
+
110
+ el.openMenu = 'media';
111
+ el.selectedMenuOption = 'texts';
112
+ el.mediaSliderOpen = true;
113
+ await el.updateComplete;
114
+ el.closeMenus();
115
+ await el.updateComplete;
116
+
117
+ expect(el.mediaSliderOpen).to.be.false;
118
+ expect(el.openMenu).to.equal('');
119
+ expect(el.selectedMenuOption).to.equal('');
120
+ });
121
+
122
+ it('sets media slider to closed', async () => {
123
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
124
+
125
+ el.mediaSliderOpen = true;
126
+ el.selectedMenuOption = 'foo';
127
+ el.closeMediaSlider();
128
+
129
+ verifyClosed(el);
130
+ });
131
+
132
+ it('toggles media slider visibility and starts animation', async () => {
133
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
134
+ const mediatype = 'foo';
135
+
136
+ el.selectedMenuOption = mediatype;
137
+ el.openMediaSlider();
138
+
139
+ verifyOpened(el, mediatype);
140
+ });
141
+
142
+ it('closes media slider if selected menu type is the open menu type', async () => {
143
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
144
+ const mediatype = 'foo';
145
+
146
+ el.selectedMenuOption = mediatype;
147
+
148
+ const event = new CustomEvent('mediaTypeSelected', {
149
+ detail: {
150
+ mediatype,
151
+ },
152
+ });
153
+
154
+ el.mediaTypeSelected(event);
155
+
156
+ verifyClosed(el);
157
+ });
158
+
159
+ it('opens media slider menu and starts animation', async () => {
160
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
161
+ const mediatype = 'foo';
162
+
163
+ const event = new CustomEvent('mediaTypeSelected', {
164
+ detail: {
165
+ mediatype,
166
+ },
167
+ });
168
+
169
+ el.mediaTypeSelected(event);
170
+
171
+ verifyOpened(el, mediatype);
172
+ });
173
+
174
+ it('closes slider when menu closed', async () => {
175
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
176
+
177
+ el.openMenu = 'media';
178
+ el.selectedMenuOption = 'foo';
179
+ el.mediaSliderOpen = true;
180
+ await el.updateComplete;
181
+
182
+ const event = new CustomEvent('menuToggled', {
183
+ detail: {
184
+ menuName: '',
185
+ },
186
+ });
187
+
188
+ el.menuToggled(event);
189
+ await el.updateComplete;
190
+
191
+ expect(el.selectedMenuOption).to.equal('');
192
+ });
193
+
194
+ it('toggles search menu tabindex when dropdown open', async () => {
195
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
196
+
197
+ el.openMenu = 'search';
198
+ await el.updateComplete;
199
+
200
+ expect(
201
+ el.shadowRoot?.querySelector('search-menu')?.getAttribute('tabindex'),
202
+ ).to.equal('');
203
+ });
204
+
205
+ it('toggles user menu tabindex when dropdown open', async () => {
206
+ const el = await fixture<IATopNav>(
207
+ html` <ia-topnav username="shaneriley" ?localLinks=${false}></ia-topnav>`,
208
+ );
209
+
210
+ el.openMenu = 'user';
211
+ await el.updateComplete;
212
+
213
+ expect(
214
+ el.shadowRoot?.querySelector('user-menu')?.getAttribute('tabindex'),
215
+ ).to.equal('');
216
+ });
217
+
218
+ it('toggles signed out menu tabindex when dropdown open', async () => {
219
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
220
+
221
+ el.openMenu = 'login';
222
+ await el.updateComplete;
223
+
224
+ expect(
225
+ el.shadowRoot
226
+ ?.querySelector('signed-out-dropdown')
227
+ ?.getAttribute('tabindex'),
228
+ ).to.equal('');
229
+ });
230
+
231
+ it('toggles search menu when search toggle button clicked', async () => {
232
+ const el = await fixture<IATopNav>(html` <ia-topnav></ia-topnav>`);
233
+ (
234
+ el.shadowRoot
235
+ ?.querySelector('primary-nav')
236
+ ?.shadowRoot?.querySelector('.search-trigger') as HTMLButtonElement
237
+ ).click();
238
+ await el.updateComplete;
239
+
240
+ expect(el.openMenu).to.equal('search');
241
+ });
242
+
243
+ it('toggles user menu when search user avatar clicked', async () => {
244
+ const el = await fixture<IATopNav>(
245
+ html` <ia-topnav
246
+ username="shaneriley"
247
+ screenName="shaneriley"
248
+ ?localLinks=${false}
249
+ ></ia-topnav>`,
250
+ // container({
251
+ // username: 'shaneriley',
252
+ // screenName: 'shaneriley',
253
+ // localLinks: false,
254
+ // }),
255
+ );
256
+
257
+ (
258
+ el.shadowRoot
259
+ ?.querySelector('primary-nav')
260
+ ?.shadowRoot?.querySelector('.user-menu') as HTMLButtonElement
261
+ ).click();
262
+ await el.updateComplete;
263
+
264
+ expect(el.openMenu).to.equal('user');
265
+ });
266
+
267
+ it('uses localLinks for archive.org logo link', async () => {
268
+ const el = await fixture<IATopNav>(
269
+ html` <ia-topnav ?localLinks=${false}></ia-topnav>`,
270
+ );
271
+ const logoLink = el.shadowRoot
272
+ ?.querySelector('primary-nav')
273
+ ?.shadowRoot?.querySelector('.link-home');
274
+ expect(logoLink?.getAttribute('href')).to.match(/\/\/archive\.org/);
275
+ });
276
+
277
+ describe('sets localLinks properly', async () => {
278
+ it('uses localLinks to archive.org links on common child components', async () => {
279
+ const el = await fixture<IATopNav>(
280
+ html` <ia-topnav ?localLinks=${false}></ia-topnav>`,
281
+ );
282
+ const componentSelectors = [
283
+ 'primary-nav',
284
+ 'media-slider',
285
+ 'desktop-subnav',
286
+ 'search-menu',
287
+ ];
288
+ componentSelectors.forEach((selector) => {
289
+ const component = el.shadowRoot?.querySelector(selector) as unknown as {
290
+ baseHost: string;
291
+ };
292
+ expect(component?.baseHost).to.equal('https://archive.org');
293
+ });
294
+ });
295
+
296
+ it('uses localLinks to archive.org links on the signed out dropdown', async () => {
297
+ const el = await fixture<IATopNav>(
298
+ html` <ia-topnav ?localLinks=${false}></ia-topnav>`,
299
+ );
300
+ const signedOutDropdown = el.shadowRoot?.querySelector(
301
+ 'signed-out-dropdown',
302
+ ) as SignedOutDropdown;
303
+ expect(signedOutDropdown?.baseHost).to.equal('https://archive.org');
304
+ });
305
+
306
+ it('uses localLinks to archive.org links on the user dropdown', async () => {
307
+ const el = await fixture<IATopNav>(
308
+ html` <ia-topnav username="foopey" ?localLinks=${false}></ia-topnav>`,
309
+ );
310
+ const signedOutDropdown = el.shadowRoot?.querySelector(
311
+ 'user-menu',
312
+ ) as UserMenu;
313
+ expect(signedOutDropdown.baseHost).to.equal('https://archive.org');
314
+ });
315
+ });
316
+
317
+ describe('slot pass throughs', () => {
318
+ describe('slot for <primary-nav>', () => {
319
+ it('opens a slot with `secondIdentitySlotMode`', async () => {
320
+ const el = await fixture<IATopNav>(
321
+ html`<ia-topnav
322
+ ?localLinks=${false}
323
+ username="boop"
324
+ screenName="somesuperlongscreenname"
325
+ secondIdentitySlotMode="allow"
326
+ ></ia-topnav>`,
327
+ );
328
+
329
+ const slot = el.shadowRoot
330
+ ?.querySelector('primary-nav')
331
+ ?.querySelector('slot');
332
+ expect(slot).to.exist;
333
+ expect(slot?.getAttribute('name')).to.equal('opt-sec-logo');
334
+
335
+ el.secondIdentitySlotMode = '';
336
+ await elementUpdated(el);
337
+ const noSlot = el.shadowRoot
338
+ ?.querySelector('primary-nav')
339
+ ?.querySelector('slot');
340
+ expect(noSlot).to.not.exist;
341
+ });
342
+ });
343
+ });
344
+ });
@@ -0,0 +1,19 @@
1
+ import { html, fixture, expect } from '@open-wc/testing';
2
+ import '../src/login-button';
3
+ import { LoginButton } from '../src/login-button';
4
+
5
+ const component = html`<login-button></login-button>`;
6
+
7
+ describe('<login-button>', () => {
8
+ it('toggles active class when avatar clicked', async () => {
9
+ const el = await fixture<LoginButton>(component);
10
+ const toggle = el.shadowRoot?.querySelector(
11
+ '.dropdown-toggle',
12
+ ) as HTMLAnchorElement;
13
+
14
+ toggle?.click();
15
+ await el.updateComplete;
16
+
17
+ expect(el.shadowRoot?.querySelector('.active')).to.not.be.undefined;
18
+ });
19
+ });
@@ -0,0 +1,19 @@
1
+ import { html, fixture, expect, oneEvent } from '@open-wc/testing';
2
+
3
+ import '../src/media-button';
4
+ import { MediaButton } from '../src/media-button';
5
+
6
+ describe('<media-button>', () => {
7
+ it('emits an event when button pressed', async () => {
8
+ const el = await fixture<MediaButton>(html`<media-button></media-button>`);
9
+
10
+ const link = el.shadowRoot?.querySelector(
11
+ '.menu-item',
12
+ ) as HTMLAnchorElement;
13
+
14
+ setTimeout(() => link.click());
15
+ const response = await oneEvent(el, 'mediaTypeSelected');
16
+
17
+ expect(response).to.exist;
18
+ });
19
+ });
@@ -1,40 +1,42 @@
1
1
  import { html, fixture, expect } from '@open-wc/testing';
2
2
 
3
3
  import '../src/media-menu';
4
+ import { MediaMenu } from '../src/media-menu';
4
5
 
5
6
  const component = html`<media-menu></media-menu>`;
6
7
 
7
8
  describe('<media-menu>', () => {
8
9
  it('sets default properties', async () => {
9
- const mediaMenu = await fixture(component);
10
+ const mediaMenu = await fixture<MediaMenu>(component);
10
11
 
11
12
  expect(mediaMenu.openMenu).to.equal('');
12
13
  expect(mediaMenu.selectedMenuOption).to.equal('');
13
14
  });
14
15
 
15
16
  it('renders menu icon as selected when selectedMenuOption matches', async () => {
16
- const mediaMenu = await fixture(component);
17
+ const mediaMenu = await fixture<MediaMenu>(component);
17
18
  const mediaType = 'texts';
18
19
 
19
20
  mediaMenu.selectedMenuOption = mediaType;
20
21
  await mediaMenu.updateComplete;
21
22
 
22
- const textsButton = mediaMenu
23
- .shadowRoot
24
- .querySelector(`[data-mediatype=${mediaType}`)
25
- .shadowRoot
26
- .querySelector('.selected');
23
+ const textsButton = mediaMenu.shadowRoot
24
+ ?.querySelector(`[data-mediatype=${mediaType}`)
25
+ ?.shadowRoot?.querySelector('.selected');
27
26
 
28
27
  expect(textsButton).to.not.be.null;
29
28
  });
30
29
 
31
30
  it('renders with closed class if done animating', async () => {
32
- const mediaMenu = await fixture(component);
31
+ const mediaMenu = await fixture<MediaMenu>(component);
33
32
 
34
- mediaMenu.mediaMenuAnimate = true;
35
- await mediaMenu.updateComplete;
33
+ // mediaMenu.mediaMenuAnimate = true;
34
+ // await mediaMenu.updateComplete;
36
35
 
37
- expect(mediaMenu.shadowRoot.querySelector('.media-menu-container').classList.contains('closed'))
38
- .to.be.true;
36
+ expect(
37
+ mediaMenu.shadowRoot
38
+ ?.querySelector('.media-menu-container')
39
+ ?.classList.contains('closed'),
40
+ ).to.be.true;
39
41
  });
40
42
  });