@internetarchive/elements 1.1.3-webdev-9240.0 → 1.1.3-webdev-9241.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 (230) hide show
  1. package/README.md +1 -1
  2. package/dist/src/elements/ia-radio-player/ia-radio-player.d.ts +0 -2
  3. package/dist/src/elements/ia-radio-player/ia-radio-player.d.ts.map +1 -1
  4. package/dist/src/elements/ia-radio-player/ia-radio-player.js +1 -6
  5. package/dist/src/elements/ia-radio-player/ia-radio-player.js.map +1 -1
  6. package/dist/src/elements/ia-topnav/assets/img/icon-audio.d.ts +3 -0
  7. package/dist/src/elements/ia-topnav/assets/img/icon-audio.d.ts.map +1 -0
  8. package/dist/src/elements/ia-topnav/assets/img/icon-audio.js +28 -0
  9. package/dist/src/elements/ia-topnav/assets/img/icon-audio.js.map +1 -0
  10. package/dist/src/elements/ia-topnav/assets/img/icon-close.d.ts +3 -0
  11. package/dist/src/elements/ia-topnav/assets/img/icon-close.d.ts.map +1 -0
  12. package/dist/src/elements/ia-topnav/assets/img/icon-close.js +20 -0
  13. package/dist/src/elements/ia-topnav/assets/img/icon-close.js.map +1 -0
  14. package/dist/src/elements/ia-topnav/assets/img/icon-donate-unpadded.d.ts +3 -0
  15. package/dist/src/elements/ia-topnav/assets/img/icon-donate-unpadded.d.ts.map +1 -0
  16. package/dist/src/elements/ia-topnav/assets/img/icon-donate-unpadded.js +19 -0
  17. package/dist/src/elements/ia-topnav/assets/img/icon-donate-unpadded.js.map +1 -0
  18. package/dist/src/elements/ia-topnav/assets/img/icon-donate.d.ts +3 -0
  19. package/dist/src/elements/ia-topnav/assets/img/icon-donate.d.ts.map +1 -0
  20. package/dist/src/elements/ia-topnav/assets/img/icon-donate.js +18 -0
  21. package/dist/src/elements/ia-topnav/assets/img/icon-donate.js.map +1 -0
  22. package/dist/src/elements/ia-topnav/assets/img/icon-ellipses.d.ts +3 -0
  23. package/dist/src/elements/ia-topnav/assets/img/icon-ellipses.d.ts.map +1 -0
  24. package/dist/src/elements/ia-topnav/assets/img/icon-ellipses.js +19 -0
  25. package/dist/src/elements/ia-topnav/assets/img/icon-ellipses.js.map +1 -0
  26. package/dist/src/elements/ia-topnav/assets/img/icon-ia-logo.d.ts +3 -0
  27. package/dist/src/elements/ia-topnav/assets/img/icon-ia-logo.d.ts.map +1 -0
  28. package/dist/src/elements/ia-topnav/assets/img/icon-ia-logo.js +30 -0
  29. package/dist/src/elements/ia-topnav/assets/img/icon-ia-logo.js.map +1 -0
  30. package/dist/src/elements/ia-topnav/assets/img/icon-images.d.ts +3 -0
  31. package/dist/src/elements/ia-topnav/assets/img/icon-images.d.ts.map +1 -0
  32. package/dist/src/elements/ia-topnav/assets/img/icon-images.js +19 -0
  33. package/dist/src/elements/ia-topnav/assets/img/icon-images.js.map +1 -0
  34. package/dist/src/elements/ia-topnav/assets/img/icon-search.d.ts +3 -0
  35. package/dist/src/elements/ia-topnav/assets/img/icon-search.d.ts.map +1 -0
  36. package/dist/src/elements/ia-topnav/assets/img/icon-search.js +19 -0
  37. package/dist/src/elements/ia-topnav/assets/img/icon-search.js.map +1 -0
  38. package/dist/src/elements/ia-topnav/assets/img/icon-software.d.ts +3 -0
  39. package/dist/src/elements/ia-topnav/assets/img/icon-software.d.ts.map +1 -0
  40. package/dist/src/elements/ia-topnav/assets/img/icon-software.js +18 -0
  41. package/dist/src/elements/ia-topnav/assets/img/icon-software.js.map +1 -0
  42. package/dist/src/elements/ia-topnav/assets/img/icon-texts.d.ts +3 -0
  43. package/dist/src/elements/ia-topnav/assets/img/icon-texts.d.ts.map +1 -0
  44. package/dist/src/elements/ia-topnav/assets/img/icon-texts.js +18 -0
  45. package/dist/src/elements/ia-topnav/assets/img/icon-texts.js.map +1 -0
  46. package/dist/src/elements/ia-topnav/assets/img/icon-upload-unpadded.d.ts +3 -0
  47. package/dist/src/elements/ia-topnav/assets/img/icon-upload-unpadded.d.ts.map +1 -0
  48. package/dist/src/elements/ia-topnav/assets/img/icon-upload-unpadded.js +18 -0
  49. package/dist/src/elements/ia-topnav/assets/img/icon-upload-unpadded.js.map +1 -0
  50. package/dist/src/elements/ia-topnav/assets/img/icon-upload.d.ts +3 -0
  51. package/dist/src/elements/ia-topnav/assets/img/icon-upload.d.ts.map +1 -0
  52. package/dist/src/elements/ia-topnav/assets/img/icon-upload.js +21 -0
  53. package/dist/src/elements/ia-topnav/assets/img/icon-upload.js.map +1 -0
  54. package/dist/src/elements/ia-topnav/assets/img/icon-user.d.ts +3 -0
  55. package/dist/src/elements/ia-topnav/assets/img/icon-user.d.ts.map +1 -0
  56. package/dist/src/elements/ia-topnav/assets/img/icon-user.js +19 -0
  57. package/dist/src/elements/ia-topnav/assets/img/icon-user.js.map +1 -0
  58. package/dist/src/elements/ia-topnav/assets/img/icon-video.d.ts +3 -0
  59. package/dist/src/elements/ia-topnav/assets/img/icon-video.d.ts.map +1 -0
  60. package/dist/src/elements/ia-topnav/assets/img/icon-video.js +19 -0
  61. package/dist/src/elements/ia-topnav/assets/img/icon-video.js.map +1 -0
  62. package/dist/src/elements/ia-topnav/assets/img/icon-web.d.ts +3 -0
  63. package/dist/src/elements/ia-topnav/assets/img/icon-web.d.ts.map +1 -0
  64. package/dist/src/elements/ia-topnav/assets/img/icon-web.js +19 -0
  65. package/dist/src/elements/ia-topnav/assets/img/icon-web.js.map +1 -0
  66. package/dist/src/elements/ia-topnav/assets/img/icon.d.ts +6 -0
  67. package/dist/src/elements/ia-topnav/assets/img/icon.d.ts.map +1 -0
  68. package/dist/src/elements/ia-topnav/assets/img/icon.js +17 -0
  69. package/dist/src/elements/ia-topnav/assets/img/icon.js.map +1 -0
  70. package/dist/src/elements/ia-topnav/assets/img/icons.d.ts +19 -0
  71. package/dist/src/elements/ia-topnav/assets/img/icons.d.ts.map +1 -0
  72. package/dist/src/elements/ia-topnav/assets/img/icons.js +33 -0
  73. package/dist/src/elements/ia-topnav/assets/img/icons.js.map +1 -0
  74. package/dist/src/elements/ia-topnav/assets/img/wayback-logo.d.ts +3 -0
  75. package/dist/src/elements/ia-topnav/assets/img/wayback-logo.d.ts.map +1 -0
  76. package/dist/src/elements/ia-topnav/assets/img/wayback-logo.js +21 -0
  77. package/dist/src/elements/ia-topnav/assets/img/wayback-logo.js.map +1 -0
  78. package/dist/src/elements/ia-topnav/assets/img/wordmark-stacked.d.ts +3 -0
  79. package/dist/src/elements/ia-topnav/assets/img/wordmark-stacked.d.ts.map +1 -0
  80. package/dist/src/elements/ia-topnav/assets/img/wordmark-stacked.js +13 -0
  81. package/dist/src/elements/ia-topnav/assets/img/wordmark-stacked.js.map +1 -0
  82. package/dist/src/elements/ia-topnav/data/menus.d.ts +17 -0
  83. package/dist/src/elements/ia-topnav/data/menus.d.ts.map +1 -0
  84. package/dist/src/elements/ia-topnav/data/menus.js +680 -0
  85. package/dist/src/elements/ia-topnav/data/menus.js.map +1 -0
  86. package/dist/src/elements/ia-topnav/dropdown-menu.d.ts +21 -0
  87. package/dist/src/elements/ia-topnav/dropdown-menu.d.ts.map +1 -0
  88. package/dist/src/elements/ia-topnav/dropdown-menu.js +315 -0
  89. package/dist/src/elements/ia-topnav/dropdown-menu.js.map +1 -0
  90. package/dist/src/elements/ia-topnav/ia-topnav-desktop-subnav.d.ts +11 -0
  91. package/dist/src/elements/ia-topnav/ia-topnav-desktop-subnav.d.ts.map +1 -0
  92. package/dist/src/elements/ia-topnav/ia-topnav-desktop-subnav.js +89 -0
  93. package/dist/src/elements/ia-topnav/ia-topnav-desktop-subnav.js.map +1 -0
  94. package/dist/src/elements/ia-topnav/ia-topnav-icon-hamburger.d.ts +6 -0
  95. package/dist/src/elements/ia-topnav/ia-topnav-icon-hamburger.d.ts.map +1 -0
  96. package/dist/src/elements/ia-topnav/ia-topnav-icon-hamburger.js +47 -0
  97. package/dist/src/elements/ia-topnav/ia-topnav-icon-hamburger.js.map +1 -0
  98. package/dist/src/elements/ia-topnav/ia-topnav-login-button.d.ts +20 -0
  99. package/dist/src/elements/ia-topnav/ia-topnav-login-button.d.ts.map +1 -0
  100. package/dist/src/elements/ia-topnav/ia-topnav-login-button.js +183 -0
  101. package/dist/src/elements/ia-topnav/ia-topnav-login-button.js.map +1 -0
  102. package/dist/src/elements/ia-topnav/ia-topnav-media-button.d.ts +31 -0
  103. package/dist/src/elements/ia-topnav/ia-topnav-media-button.d.ts.map +1 -0
  104. package/dist/src/elements/ia-topnav/ia-topnav-media-button.js +287 -0
  105. package/dist/src/elements/ia-topnav/ia-topnav-media-button.js.map +1 -0
  106. package/dist/src/elements/ia-topnav/ia-topnav-media-menu.d.ts +21 -0
  107. package/dist/src/elements/ia-topnav/ia-topnav-media-menu.d.ts.map +1 -0
  108. package/dist/src/elements/ia-topnav/ia-topnav-media-menu.js +222 -0
  109. package/dist/src/elements/ia-topnav/ia-topnav-media-menu.js.map +1 -0
  110. package/dist/src/elements/ia-topnav/ia-topnav-media-slider.d.ts +16 -0
  111. package/dist/src/elements/ia-topnav/ia-topnav-media-slider.d.ts.map +1 -0
  112. package/dist/src/elements/ia-topnav/ia-topnav-media-slider.js +221 -0
  113. package/dist/src/elements/ia-topnav/ia-topnav-media-slider.js.map +1 -0
  114. package/dist/src/elements/ia-topnav/ia-topnav-media-subnav.d.ts +20 -0
  115. package/dist/src/elements/ia-topnav/ia-topnav-media-subnav.d.ts.map +1 -0
  116. package/dist/src/elements/ia-topnav/ia-topnav-media-subnav.js +285 -0
  117. package/dist/src/elements/ia-topnav/ia-topnav-media-subnav.js.map +1 -0
  118. package/dist/src/elements/ia-topnav/ia-topnav-more-slider.d.ts +12 -0
  119. package/dist/src/elements/ia-topnav/ia-topnav-more-slider.d.ts.map +1 -0
  120. package/dist/src/elements/ia-topnav/ia-topnav-more-slider.js +65 -0
  121. package/dist/src/elements/ia-topnav/ia-topnav-more-slider.js.map +1 -0
  122. package/dist/src/elements/ia-topnav/ia-topnav-primary-nav.d.ts +53 -0
  123. package/dist/src/elements/ia-topnav/ia-topnav-primary-nav.d.ts.map +1 -0
  124. package/dist/src/elements/ia-topnav/ia-topnav-primary-nav.js +653 -0
  125. package/dist/src/elements/ia-topnav/ia-topnav-primary-nav.js.map +1 -0
  126. package/dist/src/elements/ia-topnav/ia-topnav-save-page-form.d.ts +12 -0
  127. package/dist/src/elements/ia-topnav/ia-topnav-save-page-form.d.ts.map +1 -0
  128. package/dist/src/elements/ia-topnav/ia-topnav-save-page-form.js +128 -0
  129. package/dist/src/elements/ia-topnav/ia-topnav-save-page-form.js.map +1 -0
  130. package/dist/src/elements/ia-topnav/ia-topnav-signed-out-dropdown.d.ts +4 -0
  131. package/dist/src/elements/ia-topnav/ia-topnav-signed-out-dropdown.d.ts.map +1 -0
  132. package/dist/src/elements/ia-topnav/ia-topnav-signed-out-dropdown.js +10 -0
  133. package/dist/src/elements/ia-topnav/ia-topnav-signed-out-dropdown.js.map +1 -0
  134. package/dist/src/elements/ia-topnav/ia-topnav-user-menu.d.ts +7 -0
  135. package/dist/src/elements/ia-topnav/ia-topnav-user-menu.d.ts.map +1 -0
  136. package/dist/src/elements/ia-topnav/ia-topnav-user-menu.js +39 -0
  137. package/dist/src/elements/ia-topnav/ia-topnav-user-menu.js.map +1 -0
  138. package/dist/src/elements/ia-topnav/ia-topnav-wayback-search.d.ts +10 -0
  139. package/dist/src/elements/ia-topnav/ia-topnav-wayback-search.d.ts.map +1 -0
  140. package/dist/src/elements/ia-topnav/ia-topnav-wayback-search.js +64 -0
  141. package/dist/src/elements/ia-topnav/ia-topnav-wayback-search.js.map +1 -0
  142. package/dist/src/elements/ia-topnav/ia-topnav-wayback-slider.d.ts +20 -0
  143. package/dist/src/elements/ia-topnav/ia-topnav-wayback-slider.d.ts.map +1 -0
  144. package/dist/src/elements/ia-topnav/ia-topnav-wayback-slider.js +131 -0
  145. package/dist/src/elements/ia-topnav/ia-topnav-wayback-slider.js.map +1 -0
  146. package/dist/src/elements/ia-topnav/ia-topnav.d.ts +85 -0
  147. package/dist/src/elements/ia-topnav/ia-topnav.d.ts.map +1 -0
  148. package/dist/src/elements/ia-topnav/ia-topnav.js +434 -0
  149. package/dist/src/elements/ia-topnav/ia-topnav.js.map +1 -0
  150. package/dist/src/elements/ia-topnav/lib/helpers.d.ts +13 -0
  151. package/dist/src/elements/ia-topnav/lib/helpers.d.ts.map +1 -0
  152. package/dist/src/elements/ia-topnav/lib/helpers.js +24 -0
  153. package/dist/src/elements/ia-topnav/lib/helpers.js.map +1 -0
  154. package/dist/src/elements/ia-topnav/lib/keyboard-navigation.d.ts +46 -0
  155. package/dist/src/elements/ia-topnav/lib/keyboard-navigation.d.ts.map +1 -0
  156. package/dist/src/elements/ia-topnav/lib/keyboard-navigation.js +136 -0
  157. package/dist/src/elements/ia-topnav/lib/keyboard-navigation.js.map +1 -0
  158. package/dist/src/elements/ia-topnav/models.d.ts +59 -0
  159. package/dist/src/elements/ia-topnav/models.d.ts.map +1 -0
  160. package/dist/src/elements/ia-topnav/models.js +10 -0
  161. package/dist/src/elements/ia-topnav/models.js.map +1 -0
  162. package/dist/src/elements/ia-topnav/subnav-list-styles.d.ts +2 -0
  163. package/dist/src/elements/ia-topnav/subnav-list-styles.d.ts.map +1 -0
  164. package/dist/src/elements/ia-topnav/subnav-list-styles.js +49 -0
  165. package/dist/src/elements/ia-topnav/subnav-list-styles.js.map +1 -0
  166. package/dist/src/elements/ia-topnav/tracked-element.d.ts +6 -0
  167. package/dist/src/elements/ia-topnav/tracked-element.d.ts.map +1 -0
  168. package/dist/src/elements/ia-topnav/tracked-element.js +29 -0
  169. package/dist/src/elements/ia-topnav/tracked-element.js.map +1 -0
  170. package/dist/src/elements/ia-wayback-search-form/ia-wayback-search-form.d.ts +24 -0
  171. package/dist/src/elements/ia-wayback-search-form/ia-wayback-search-form.d.ts.map +1 -0
  172. package/dist/src/elements/ia-wayback-search-form/ia-wayback-search-form.js +240 -0
  173. package/dist/src/elements/ia-wayback-search-form/ia-wayback-search-form.js.map +1 -0
  174. package/dist/src/elements/index.d.ts +3 -5
  175. package/dist/src/elements/index.d.ts.map +1 -1
  176. package/dist/src/elements/index.js +3 -5
  177. package/dist/src/elements/index.js.map +1 -1
  178. package/package.json +3 -9
  179. package/dist/src/elements/ia-reviews/assets/delete-icon.svg +0 -8
  180. package/dist/src/elements/ia-reviews/assets/star-basic.svg +0 -6
  181. package/dist/src/elements/ia-reviews/assets/star-selected.svg +0 -8
  182. package/dist/src/elements/ia-reviews/assets/star-unselected.svg +0 -8
  183. package/dist/src/elements/ia-reviews/ia-review-form.d.ts +0 -103
  184. package/dist/src/elements/ia-reviews/ia-review-form.d.ts.map +0 -1
  185. package/dist/src/elements/ia-reviews/ia-review-form.js +0 -685
  186. package/dist/src/elements/ia-reviews/ia-review-form.js.map +0 -1
  187. package/dist/src/elements/ia-reviews/ia-review.d.ts +0 -51
  188. package/dist/src/elements/ia-reviews/ia-review.d.ts.map +0 -1
  189. package/dist/src/elements/ia-reviews/ia-review.js +0 -344
  190. package/dist/src/elements/ia-reviews/ia-review.js.map +0 -1
  191. package/dist/src/elements/ia-reviews/ia-reviews.d.ts +0 -68
  192. package/dist/src/elements/ia-reviews/ia-reviews.d.ts.map +0 -1
  193. package/dist/src/elements/ia-reviews/ia-reviews.js +0 -354
  194. package/dist/src/elements/ia-reviews/ia-reviews.js.map +0 -1
  195. package/dist/src/elements/ia-reviews/mocks/mock-fetch-handler.d.ts +0 -23
  196. package/dist/src/elements/ia-reviews/mocks/mock-fetch-handler.d.ts.map +0 -1
  197. package/dist/src/elements/ia-reviews/mocks/mock-fetch-handler.js +0 -37
  198. package/dist/src/elements/ia-reviews/mocks/mock-fetch-handler.js.map +0 -1
  199. package/dist/src/elements/ia-reviews/mocks/mock-review-service.d.ts +0 -12
  200. package/dist/src/elements/ia-reviews/mocks/mock-review-service.d.ts.map +0 -1
  201. package/dist/src/elements/ia-reviews/mocks/mock-review-service.js +0 -19
  202. package/dist/src/elements/ia-reviews/mocks/mock-review-service.js.map +0 -1
  203. package/dist/src/elements/ia-reviews/models.d.ts +0 -38
  204. package/dist/src/elements/ia-reviews/models.d.ts.map +0 -1
  205. package/dist/src/elements/ia-reviews/models.js +0 -2
  206. package/dist/src/elements/ia-reviews/models.js.map +0 -1
  207. package/dist/src/elements/ia-reviews/review-service.d.ts +0 -53
  208. package/dist/src/elements/ia-reviews/review-service.d.ts.map +0 -1
  209. package/dist/src/elements/ia-reviews/review-service.js +0 -97
  210. package/dist/src/elements/ia-reviews/review-service.js.map +0 -1
  211. package/dist/src/elements/ia-reviews/utils/collapse-space.d.ts +0 -13
  212. package/dist/src/elements/ia-reviews/utils/collapse-space.d.ts.map +0 -1
  213. package/dist/src/elements/ia-reviews/utils/collapse-space.js +0 -19
  214. package/dist/src/elements/ia-reviews/utils/collapse-space.js.map +0 -1
  215. package/dist/src/elements/ia-reviews/utils/friendly-truncate.d.ts +0 -14
  216. package/dist/src/elements/ia-reviews/utils/friendly-truncate.d.ts.map +0 -1
  217. package/dist/src/elements/ia-reviews/utils/friendly-truncate.js +0 -65
  218. package/dist/src/elements/ia-reviews/utils/friendly-truncate.js.map +0 -1
  219. package/dist/src/elements/ia-reviews/utils/link-urls-in-text.d.ts +0 -9
  220. package/dist/src/elements/ia-reviews/utils/link-urls-in-text.d.ts.map +0 -1
  221. package/dist/src/elements/ia-reviews/utils/link-urls-in-text.js +0 -40
  222. package/dist/src/elements/ia-reviews/utils/link-urls-in-text.js.map +0 -1
  223. package/dist/src/elements/ia-reviews/utils/sanitize-review-body.d.ts +0 -9
  224. package/dist/src/elements/ia-reviews/utils/sanitize-review-body.d.ts.map +0 -1
  225. package/dist/src/elements/ia-reviews/utils/sanitize-review-body.js +0 -29
  226. package/dist/src/elements/ia-reviews/utils/sanitize-review-body.js.map +0 -1
  227. package/dist/src/elements/ia-reviews/utils/truncate-screenname.d.ts +0 -13
  228. package/dist/src/elements/ia-reviews/utils/truncate-screenname.d.ts.map +0 -1
  229. package/dist/src/elements/ia-reviews/utils/truncate-screenname.js +0 -19
  230. package/dist/src/elements/ia-reviews/utils/truncate-screenname.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard-navigation.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-topnav/lib/keyboard-navigation.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACrC,iBAAiB,EAAE,WAAW,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,WAAW,EAAE,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IAErB;;;;OAIG;gBACS,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM;IAY9D;;;OAGG;IACH,oBAAoB,IAAI,WAAW,EAAE;IA8CrC;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,aAAa;IA6BlC;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM;IAS1B;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,aAAa;IAWjC;;OAEG;IACH,aAAa;IAQb;;OAEG;IACH,SAAS;IAMT;;;OAGG;IACH,yBAAyB,CAAC,UAAU,GAAE,OAAe;CAYtD"}
@@ -0,0 +1,136 @@
1
+ export default class KeyboardNavigation {
2
+ /**
3
+ * Constructor for the KeyboardNavigation class.
4
+ * @param {HTMLElement} elementsContainer - The container element that holds the focusable elements.
5
+ * @param {string} menuOption - The type of menu option ('web' or 'usermenu').
6
+ */
7
+ constructor(elementsContainer, menuOption) {
8
+ this.elementsContainer = elementsContainer;
9
+ this.menuOption = menuOption;
10
+ this.focusableElements = this.getFocusableElements();
11
+ this.focusedIndex = 0; // always start from first element
12
+ if (menuOption !== 'search') {
13
+ this.focusableElements[this.focusedIndex]?.focus();
14
+ }
15
+ this.handleKeyDown = this.handleKeyDown.bind(this);
16
+ }
17
+ /**
18
+ * Gets an array of focusable elements within the container.
19
+ * @returns {HTMLElement[]} An array of focusable elements.
20
+ */
21
+ getFocusableElements() {
22
+ const focusableTagSelectors = 'a[href], button, input, [tabindex]';
23
+ const isFocusable = (el) => !el.hasAttribute('disabled') &&
24
+ el.getAttribute('aria-hidden') !== 'true' &&
25
+ el.getAttribute('tabindex') !== '-1';
26
+ let elements;
27
+ if (this.menuOption === 'web') {
28
+ // wayback focusable elements
29
+ const waybackSlider = this.elementsContainer.querySelector('ia-topnav-wayback-slider')?.shadowRoot;
30
+ const waybackSearch = waybackSlider?.querySelector('ia-topnav-wayback-search');
31
+ const waybackSearchElements = Array.from(waybackSearch?.shadowRoot?.querySelectorAll(focusableTagSelectors) ??
32
+ []);
33
+ const normalElements = Array.from(waybackSlider?.querySelectorAll(focusableTagSelectors) ?? []);
34
+ // wayback save-form focusable elements
35
+ const savePageForm = waybackSlider?.querySelector('ia-topnav-save-page-form');
36
+ const savePageFormElements = Array.from(savePageForm?.shadowRoot?.querySelectorAll(focusableTagSelectors) ?? []);
37
+ elements = [
38
+ ...waybackSearchElements,
39
+ ...normalElements,
40
+ ...savePageFormElements,
41
+ ];
42
+ }
43
+ else {
44
+ elements = this.elementsContainer.querySelectorAll(focusableTagSelectors);
45
+ }
46
+ return Array.from(elements ?? []).filter(isFocusable);
47
+ }
48
+ /**
49
+ * Handles keyboard events and focuses the appropriate element.
50
+ * @param {KeyboardEvent} event - The keyboard event object.
51
+ */
52
+ handleKeyDown(event) {
53
+ const target = event.composedPath()[0];
54
+ // Ignore events from editable fields
55
+ if (target instanceof HTMLInputElement ||
56
+ target instanceof HTMLTextAreaElement ||
57
+ target.isContentEditable) {
58
+ return;
59
+ }
60
+ const { key } = event;
61
+ const isArrowKey = [
62
+ 'ArrowDown',
63
+ 'ArrowRight',
64
+ 'ArrowUp',
65
+ 'ArrowLeft',
66
+ ].includes(key);
67
+ const isTabKey = key === 'Tab';
68
+ if (isArrowKey) {
69
+ this.handleArrowKey(key);
70
+ event.preventDefault();
71
+ }
72
+ else if (isTabKey) {
73
+ this.handleTabKey(event);
74
+ }
75
+ }
76
+ /**
77
+ * Handles arrow key events and focuses the next or previous element for topnav sub-nav and usermenu
78
+ * @param {string} key - The key that was pressed ('ArrowDown', 'ArrowRight', 'ArrowUp', or 'ArrowLeft').
79
+ */
80
+ handleArrowKey(key) {
81
+ const isDownOrRight = ['ArrowDown', 'ArrowRight'].includes(key);
82
+ if (isDownOrRight) {
83
+ this.focusNext();
84
+ }
85
+ else {
86
+ this.focusPrevious();
87
+ }
88
+ }
89
+ /**
90
+ * Handles the Tab key event and focuses the next or previous menu item.
91
+ * @param {KeyboardEvent} event - The keyboard event object.
92
+ */
93
+ handleTabKey(event) {
94
+ const isShiftPressed = event.shiftKey;
95
+ this.emitFocusToOtherMenuItems(isShiftPressed);
96
+ this.focusableElements[this.focusedIndex]?.blur();
97
+ if (!['search'].includes(this.menuOption)) {
98
+ event.preventDefault();
99
+ }
100
+ }
101
+ /**
102
+ * Focuses the previous focusable element in the container.
103
+ */
104
+ focusPrevious() {
105
+ if (this.focusableElements.length === 0)
106
+ return;
107
+ this.focusedIndex =
108
+ (this.focusedIndex - 1 + this.focusableElements.length) %
109
+ this.focusableElements.length;
110
+ this.focusableElements[this.focusedIndex]?.focus();
111
+ }
112
+ /**
113
+ * Focuses the next focusable element in the container.
114
+ */
115
+ focusNext() {
116
+ if (this.focusableElements.length === 0)
117
+ return;
118
+ this.focusedIndex = (this.focusedIndex + 1) % this.focusableElements.length;
119
+ this.focusableElements[this.focusedIndex]?.focus();
120
+ }
121
+ /**
122
+ * Focuses the other parent menu items based on the provided flag.
123
+ * @param {boolean} isPrevious - A flag indicating whether to focus the previous menu item.
124
+ */
125
+ emitFocusToOtherMenuItems(isPrevious = false) {
126
+ this.elementsContainer.dispatchEvent(new CustomEvent('focusToOtherMenuItem', {
127
+ bubbles: true,
128
+ composed: true,
129
+ detail: {
130
+ mediatype: this.menuOption,
131
+ moveTo: isPrevious ? 'prev' : 'next',
132
+ },
133
+ }));
134
+ }
135
+ }
136
+ //# sourceMappingURL=keyboard-navigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard-navigation.js","sourceRoot":"","sources":["../../../../../src/elements/ia-topnav/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 = this.elementsContainer.querySelector(\n 'ia-topnav-wayback-slider',\n )?.shadowRoot;\n const waybackSearch = waybackSlider?.querySelector(\n 'ia-topnav-wayback-search',\n );\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(\n 'ia-topnav-save-page-form',\n );\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,59 @@
1
+ /**
2
+ * The pixel width at which ia-topnav switches from mobile to desktop layout.
3
+ * Desktop styles apply at `min-width: TOPNAV_MOBILE_BREAKPOINT px`.
4
+ * Mobile styles apply at `max-width: (TOPNAV_MOBILE_BREAKPOINT - 1) px`.
5
+ *
6
+ * Exported so that host applications can derive their own media queries from
7
+ * this value rather than hard-coding it independently.
8
+ */
9
+ export declare const TOPNAV_MOBILE_BREAKPOINT = 890;
10
+ export interface IATopNavConfig {
11
+ /**
12
+ * Google Analytics event category
13
+ */
14
+ eventCategory?: string;
15
+ /**
16
+ * Copy to display for number of pages archived at the top of the Wayback search form
17
+ *
18
+ * ie. "425 billion"
19
+ */
20
+ waybackPagesArchived?: string;
21
+ /**
22
+ * Map from dropdown item ids to any callout text that should be applied beside them
23
+ */
24
+ callouts?: Record<string, string>;
25
+ }
26
+ export interface IATopNavLink {
27
+ title: string;
28
+ url?: string;
29
+ class?: string;
30
+ icon?: string;
31
+ analyticsEvent?: string;
32
+ external?: boolean;
33
+ }
34
+ export interface IATopNavMediaMenu {
35
+ heading: string;
36
+ iconLinks: IATopNavLink[];
37
+ featuredLinks: IATopNavLink[];
38
+ links: IATopNavLink[];
39
+ mobileAppsLinks: IATopNavLink[];
40
+ browserExtensionsLinks: IATopNavLink[];
41
+ archiveItLinks: IATopNavLink[];
42
+ }
43
+ export interface IATopNavMenuConfig {
44
+ audio: IATopNavMediaMenu;
45
+ images: IATopNavMediaMenu;
46
+ more: IATopNavMediaMenu;
47
+ signedOut: IATopNavLink[];
48
+ software: IATopNavMediaMenu;
49
+ texts: IATopNavMediaMenu;
50
+ user: IATopNavLink[];
51
+ userAdmin: IATopNavLink[];
52
+ userAdminFlags: IATopNavLink[];
53
+ userAdminBiblio: IATopNavLink[];
54
+ userAdminUploader: IATopNavLink[];
55
+ video: IATopNavMediaMenu;
56
+ web: IATopNavMediaMenu;
57
+ }
58
+ export type IATopNavSecondIdentitySlotMode = 'allow' | '';
59
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-topnav/models.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IAEd,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,eAAe,EAAE,YAAY,EAAE,CAAC;IAChC,sBAAsB,EAAE,YAAY,EAAE,CAAC;IACvC,cAAc,EAAE,YAAY,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,eAAe,EAAE,YAAY,EAAE,CAAC;IAChC,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAClC,KAAK,EAAE,iBAAiB,CAAC;IACzB,GAAG,EAAE,iBAAiB,CAAC;CACxB;AAED,MAAM,MAAM,8BAA8B,GAAG,OAAO,GAAG,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The pixel width at which ia-topnav switches from mobile to desktop layout.
3
+ * Desktop styles apply at `min-width: TOPNAV_MOBILE_BREAKPOINT px`.
4
+ * Mobile styles apply at `max-width: (TOPNAV_MOBILE_BREAKPOINT - 1) px`.
5
+ *
6
+ * Exported so that host applications can derive their own media queries from
7
+ * this value rather than hard-coding it independently.
8
+ */
9
+ export const TOPNAV_MOBILE_BREAKPOINT = 890;
10
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/elements/ia-topnav/models.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC","sourcesContent":["/**\n * The pixel width at which ia-topnav switches from mobile to desktop layout.\n * Desktop styles apply at `min-width: TOPNAV_MOBILE_BREAKPOINT px`.\n * Mobile styles apply at `max-width: (TOPNAV_MOBILE_BREAKPOINT - 1) px`.\n *\n * Exported so that host applications can derive their own media queries from\n * this value rather than hard-coding it independently.\n */\nexport const TOPNAV_MOBILE_BREAKPOINT = 890;\n\nexport interface IATopNavConfig {\n /**\n * Google Analytics event category\n */\n eventCategory?: string;\n\n /**\n * Copy to display for number of pages archived at the top of the Wayback search form\n *\n * ie. \"425 billion\"\n */\n waybackPagesArchived?: string;\n\n /**\n * Map from dropdown item ids to any callout text that should be applied beside them\n */\n callouts?: Record<string, string>;\n}\n\nexport interface IATopNavLink {\n title: string;\n\n url?: string;\n\n class?: string;\n\n icon?: string;\n\n analyticsEvent?: string;\n\n external?: boolean;\n}\n\nexport interface IATopNavMediaMenu {\n heading: string;\n iconLinks: IATopNavLink[];\n featuredLinks: IATopNavLink[];\n links: IATopNavLink[];\n mobileAppsLinks: IATopNavLink[];\n browserExtensionsLinks: IATopNavLink[];\n archiveItLinks: IATopNavLink[];\n}\n\nexport interface IATopNavMenuConfig {\n audio: IATopNavMediaMenu;\n images: IATopNavMediaMenu;\n more: IATopNavMediaMenu;\n signedOut: IATopNavLink[];\n software: IATopNavMediaMenu;\n texts: IATopNavMediaMenu;\n user: IATopNavLink[];\n userAdmin: IATopNavLink[];\n userAdminFlags: IATopNavLink[];\n userAdminBiblio: IATopNavLink[];\n userAdminUploader: IATopNavLink[];\n video: IATopNavMediaMenu;\n web: IATopNavMediaMenu;\n}\n\nexport type IATopNavSecondIdentitySlotMode = 'allow' | '';\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const subnavListCSS: import("lit").CSSResult;
2
+ //# sourceMappingURL=subnav-list-styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subnav-list-styles.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-topnav/subnav-list-styles.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,yBA6CzB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { css } from 'lit';
2
+ import { TOPNAV_MOBILE_BREAKPOINT } from './models.js';
3
+ export const subnavListCSS = css `
4
+ h4 {
5
+ font-size: 1.6rem;
6
+ }
7
+
8
+ a {
9
+ text-decoration: none;
10
+ color: var(--activeColor);
11
+ }
12
+
13
+ ul {
14
+ padding: 0;
15
+ margin: 0;
16
+ list-style: none;
17
+ }
18
+
19
+ li + li {
20
+ padding-top: 1.5rem;
21
+ }
22
+
23
+ @media (min-width: ${TOPNAV_MOBILE_BREAKPOINT}px) {
24
+ h4 {
25
+ margin: 0 0 1rem 0;
26
+ font-weight: 100;
27
+ }
28
+
29
+ ul {
30
+ font-size: 1.3rem;
31
+ }
32
+
33
+ li {
34
+ padding-bottom: 0.5rem;
35
+ }
36
+
37
+ li + li {
38
+ padding-top: 0;
39
+ }
40
+
41
+ li a {
42
+ display: block;
43
+ overflow: hidden;
44
+ white-space: nowrap;
45
+ text-overflow: ellipsis;
46
+ }
47
+ }
48
+ `;
49
+ //# sourceMappingURL=subnav-list-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subnav-list-styles.js","sourceRoot":"","sources":["../../../../src/elements/ia-topnav/subnav-list-styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;uBAoBT,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;CAyB9C,CAAC","sourcesContent":["import { css } from 'lit';\nimport { TOPNAV_MOBILE_BREAKPOINT } from './models';\n\nexport const subnavListCSS = css`\n h4 {\n font-size: 1.6rem;\n }\n\n a {\n text-decoration: none;\n color: var(--activeColor);\n }\n\n ul {\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n li + li {\n padding-top: 1.5rem;\n }\n\n @media (min-width: ${TOPNAV_MOBILE_BREAKPOINT}px) {\n h4 {\n margin: 0 0 1rem 0;\n font-weight: 100;\n }\n\n ul {\n font-size: 1.3rem;\n }\n\n li {\n padding-bottom: 0.5rem;\n }\n\n li + li {\n padding-top: 0;\n }\n\n li a {\n display: block;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n`;\n"]}
@@ -0,0 +1,6 @@
1
+ import { LitElement } from 'lit';
2
+ export default class TrackedElement extends LitElement {
3
+ trackClick(e: Event): void;
4
+ trackSubmit(e: Event): void;
5
+ }
6
+ //# sourceMappingURL=tracked-element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracked-element.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-topnav/tracked-element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU;IACpD,UAAU,CAAC,CAAC,EAAE,KAAK;IAcnB,WAAW,CAAC,CAAC,EAAE,KAAK;CAcrB"}
@@ -0,0 +1,29 @@
1
+ import { LitElement } from 'lit';
2
+ export default class TrackedElement extends LitElement {
3
+ trackClick(e) {
4
+ const event = e.currentTarget?.dataset?.eventClickTracking;
5
+ if (event === undefined)
6
+ return;
7
+ this.dispatchEvent(new CustomEvent('trackClick', {
8
+ bubbles: true,
9
+ composed: true,
10
+ detail: {
11
+ event,
12
+ },
13
+ }));
14
+ }
15
+ trackSubmit(e) {
16
+ const event = e.currentTarget?.dataset
17
+ ?.eventSubmitTracking;
18
+ if (event === undefined)
19
+ return;
20
+ this.dispatchEvent(new CustomEvent('trackSubmit', {
21
+ bubbles: true,
22
+ composed: true,
23
+ detail: {
24
+ event,
25
+ },
26
+ }));
27
+ }
28
+ }
29
+ //# sourceMappingURL=tracked-element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracked-element.js","sourceRoot":"","sources":["../../../../src/elements/ia-topnav/tracked-element.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU;IACpD,UAAU,CAAC,CAAQ;QACjB,MAAM,KAAK,GAAI,CAAC,CAAC,aAA6B,EAAE,OAAO,EAAE,kBAAkB,CAAC;QAC5E,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAChC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,YAAY,EAAE;YAC5B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,KAAK;aACN;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,CAAQ;QAClB,MAAM,KAAK,GAAI,CAAC,CAAC,aAA6B,EAAE,OAAO;YACrD,EAAE,mBAAmB,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAChC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,aAAa,EAAE;YAC7B,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE;gBACN,KAAK;aACN;SACF,CAAC,CACH,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { LitElement } from 'lit';\n\nexport default class TrackedElement extends LitElement {\n trackClick(e: Event) {\n const event = (e.currentTarget as HTMLElement)?.dataset?.eventClickTracking;\n if (event === undefined) return;\n this.dispatchEvent(\n new CustomEvent('trackClick', {\n bubbles: true,\n composed: true,\n detail: {\n event,\n },\n }),\n );\n }\n\n trackSubmit(e: Event) {\n const event = (e.currentTarget as HTMLElement)?.dataset\n ?.eventSubmitTracking;\n if (event === undefined) return;\n this.dispatchEvent(\n new CustomEvent('trackSubmit', {\n bubbles: true,\n composed: true,\n detail: {\n event,\n },\n }),\n );\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { CSSResultGroup, LitElement } from 'lit';
2
+ /**
3
+ * A Wayback Machine search form: a line about how many pages the Wayback
4
+ * Machine holds, its logo, and a URL or keyword field.
5
+ *
6
+ * Submitting calls `queryHandler.performQuery` with what was typed, which by
7
+ * default goes to the Wayback Machine's results for it, and fires
8
+ * `waybackSearchSubmitted`.
9
+ */
10
+ export declare class IAWaybackSearchForm extends LitElement {
11
+ queryHandler: {
12
+ performQuery: (query: string) => void;
13
+ };
14
+ /** How many pages the Wayback Machine holds. Blank shows a localized default. */
15
+ waybackPagesArchived: string;
16
+ private urlInput;
17
+ render(): import("lit").TemplateResult<1>;
18
+ handleSubmit(e: Event): void;
19
+ emitWaybackSearchSubmitted(query: string): void;
20
+ emitWaybackMachineStatsLinkClicked(): void;
21
+ emitWaybackMachineLogoLinkClicked(): void;
22
+ static get styles(): CSSResultGroup;
23
+ }
24
+ //# sourceMappingURL=ia-wayback-search-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ia-wayback-search-form.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-wayback-search-form/ia-wayback-search-form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,cAAc,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAa5D;;;;;;;GAOG;AACH,qBAEa,mBAAoB,SAAQ,UAAU;IACrB,YAAY,EAAE;QACxC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;KACvC,CAGC;IAEF,iFAAiF;IACrD,oBAAoB,SAAM;IAEvC,OAAO,CAAC,QAAQ,CAAoB;IAEnD,MAAM;IAuCN,YAAY,CAAC,CAAC,EAAE,KAAK;IAOrB,0BAA0B,CAAC,KAAK,EAAE,MAAM;IAUxC,kCAAkC;IAIlC,iCAAiC;IAIjC,MAAM,KAAK,MAAM,IAAI,cAAc,CA6IlC;CACF"}
@@ -0,0 +1,240 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, LitElement, html } from 'lit';
3
+ import { property, query } from 'lit/decorators.js';
4
+ import { customElement } from '../../util/custom-element.js';
5
+ import { localized, msg } from '@lit/localize';
6
+ import searchIcon from '../../elements/ia-topnav/assets/img/icon-search.js';
7
+ import logo from '../../elements/ia-topnav/assets/img/wayback-logo.js';
8
+ import themeStyles from '../../themes/theme-styles.js';
9
+ /** Desktop styles apply at `min-width: WAYBACK_SEARCH_DESKTOP_BREAKPOINT px`. */
10
+ const WAYBACK_SEARCH_DESKTOP_BREAKPOINT = 890;
11
+ /**
12
+ * A Wayback Machine search form: a line about how many pages the Wayback
13
+ * Machine holds, its logo, and a URL or keyword field.
14
+ *
15
+ * Submitting calls `queryHandler.performQuery` with what was typed, which by
16
+ * default goes to the Wayback Machine's results for it, and fires
17
+ * `waybackSearchSubmitted`.
18
+ */
19
+ let IAWaybackSearchForm = class IAWaybackSearchForm extends LitElement {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.queryHandler = {
23
+ performQuery: (query) => (window.location.href = `https://web.archive.org/web/*/${query}`),
24
+ };
25
+ /** How many pages the Wayback Machine holds. Blank shows a localized default. */
26
+ this.waybackPagesArchived = '';
27
+ }
28
+ render() {
29
+ const pagesArchived = this.waybackPagesArchived || msg('1 trillion');
30
+ return html `
31
+ <form method="post" @submit=${this.handleSubmit}>
32
+ <p>
33
+ ${msg(html `Search the history of more than ${pagesArchived}
34
+ <a
35
+ @click=${this.emitWaybackMachineStatsLinkClicked}
36
+ data-event-click-tracking="TopNav|WaybackMachineStatsLink"
37
+ href="https://blog.archive.org/2016/10/23/defining-web-pages-web-sites-and-web-captures/"
38
+ >web pages</a
39
+ >
40
+ on the Internet.`)}
41
+ </p>
42
+ <fieldset>
43
+ <a
44
+ @click=${this.emitWaybackMachineLogoLinkClicked}
45
+ data-event-click-tracking="TopNav|WaybackMachineLogoLink"
46
+ aria-label=${msg('Visit the Wayback Machine')}
47
+ href="https://web.archive.org"
48
+ >${logo}</a
49
+ >
50
+ <div class="search-field">
51
+ <input
52
+ type="text"
53
+ aria-label=${msg('Search the Wayback Machine')}
54
+ name="url"
55
+ id="url"
56
+ placeholder=${msg('Enter URL or keywords')}
57
+ />
58
+ ${searchIcon}
59
+ </div>
60
+ </fieldset>
61
+ </form>
62
+ `;
63
+ }
64
+ handleSubmit(e) {
65
+ e.preventDefault();
66
+ const query = this.urlInput.value;
67
+ this.emitWaybackSearchSubmitted(query);
68
+ this.queryHandler.performQuery(query);
69
+ }
70
+ emitWaybackSearchSubmitted(query) {
71
+ this.dispatchEvent(new CustomEvent('waybackSearchSubmitted', {
72
+ detail: {
73
+ query,
74
+ },
75
+ }));
76
+ }
77
+ emitWaybackMachineStatsLinkClicked() {
78
+ this.dispatchEvent(new CustomEvent('waybackMachineStatsLinkClicked'));
79
+ }
80
+ emitWaybackMachineLogoLinkClicked() {
81
+ this.dispatchEvent(new CustomEvent('waybackMachineLogoLink'));
82
+ }
83
+ static get styles() {
84
+ return [
85
+ themeStyles,
86
+ css `
87
+ :host {
88
+ --wayback-search-input-text-color--: var(
89
+ --ia-theme-secondary-text-color,
90
+ #666
91
+ );
92
+ --wayback-search-input-bg--: var(
93
+ --ia-theme-secondary-background-color,
94
+ #fff
95
+ );
96
+ /*
97
+ * Darker than the mobile glyph, which follows --iconFill. The topnav
98
+ * declares this alongside its other color knobs. The literal covers
99
+ * mounting this search on its own, where none of those greys exist,
100
+ * and it has to be a literal because fill inherits: an unresolved
101
+ * value paints black rather than falling through to another rule.
102
+ */
103
+ --wayback-search-desktop-icon-fill--: var(
104
+ --desktopSearchIconFill,
105
+ #333
106
+ );
107
+
108
+ font: normal 1.2rem/1.5 var(--themeFontFamily);
109
+ }
110
+
111
+ form {
112
+ max-width: 600px;
113
+ }
114
+
115
+ p {
116
+ margin-top: 0;
117
+ font-weight: 200;
118
+ }
119
+
120
+ a {
121
+ font-weight: 500;
122
+ text-decoration: none;
123
+ color: var(--activeColor);
124
+ }
125
+
126
+ fieldset {
127
+ padding: 0.7rem 2rem;
128
+ margin: 1.5rem 0;
129
+ box-sizing: border-box;
130
+ text-align: center;
131
+ border: none;
132
+ border-radius: 7px;
133
+ background-color: #fcf5e6;
134
+ box-shadow: 3px 3px 0 0 #c3ad97;
135
+ }
136
+
137
+ fieldset a {
138
+ font-size: 0;
139
+ }
140
+
141
+ img {
142
+ width: 100%;
143
+ max-width: 215px;
144
+ max-height: 60px;
145
+ margin-bottom: 1.3rem;
146
+ vertical-align: middle;
147
+ }
148
+
149
+ input {
150
+ display: block;
151
+ width: 100%;
152
+ height: 3rem;
153
+ padding: 0.5rem 1rem 0.5rem 3rem;
154
+ font: normal 1.2rem/1.5 var(--themeFontFamily);
155
+ color: var(--wayback-search-input-text-color--);
156
+ box-sizing: border-box;
157
+ border: 1px solid var(--grey80);
158
+ border-radius: 2rem;
159
+ background: var(--wayback-search-input-bg--);
160
+ }
161
+
162
+ input:focus {
163
+ border-color: #66afe9;
164
+ outline: none;
165
+ }
166
+
167
+ .search-field {
168
+ position: relative;
169
+ overflow: hidden;
170
+ }
171
+
172
+ .search-field svg {
173
+ position: absolute;
174
+ top: 3px;
175
+ left: 3px;
176
+ width: 2.4rem;
177
+ height: 2.4rem;
178
+ }
179
+
180
+ .search-field .fill-color {
181
+ fill: var(--iconFill);
182
+ }
183
+
184
+ @media (min-width: ${WAYBACK_SEARCH_DESKTOP_BREAKPOINT}px) {
185
+ form {
186
+ margin: 0 auto;
187
+ }
188
+
189
+ p {
190
+ margin-bottom: 3rem;
191
+ font-size: 1.6rem;
192
+ text-align: center;
193
+ }
194
+
195
+ img {
196
+ margin: 0;
197
+ }
198
+
199
+ fieldset {
200
+ margin: 0 auto;
201
+ }
202
+
203
+ fieldset a,
204
+ .search-field {
205
+ display: inline-block;
206
+ width: 49%;
207
+ vertical-align: middle;
208
+ }
209
+
210
+ fieldset a {
211
+ text-align: center;
212
+ }
213
+
214
+ .search-field svg {
215
+ top: 2px;
216
+ }
217
+
218
+ .search-field .fill-color {
219
+ fill: var(--wayback-search-desktop-icon-fill--);
220
+ }
221
+ }
222
+ `,
223
+ ];
224
+ }
225
+ };
226
+ __decorate([
227
+ property({ type: Object })
228
+ ], IAWaybackSearchForm.prototype, "queryHandler", void 0);
229
+ __decorate([
230
+ property({ type: String })
231
+ ], IAWaybackSearchForm.prototype, "waybackPagesArchived", void 0);
232
+ __decorate([
233
+ query('#url')
234
+ ], IAWaybackSearchForm.prototype, "urlInput", void 0);
235
+ IAWaybackSearchForm = __decorate([
236
+ customElement('ia-wayback-search-form'),
237
+ localized()
238
+ ], IAWaybackSearchForm);
239
+ export { IAWaybackSearchForm };
240
+ //# sourceMappingURL=ia-wayback-search-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ia-wayback-search-form.js","sourceRoot":"","sources":["../../../../src/elements/ia-wayback-search-form/ia-wayback-search-form.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAkB,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,UAAU,MAAM,gDAAgD,CAAC;AACxE,OAAO,IAAI,MAAM,iDAAiD,CAAC;AACnE,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAEnD,iFAAiF;AACjF,MAAM,iCAAiC,GAAG,GAAG,CAAC;AAE9C;;;;;;;GAOG;AAGI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,UAAU;IAA5C;;QACuB,iBAAY,GAEpC;YACF,YAAY,EAAE,CAAC,KAAa,EAAE,EAAE,CAC9B,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,iCAAiC,KAAK,EAAE,CAAC;SACpE,CAAC;QAEF,iFAAiF;QACrD,yBAAoB,GAAG,EAAE,CAAC;IAkNxD,CAAC;IA9MC,MAAM;QACJ,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACrE,OAAO,IAAI,CAAA;oCACqB,IAAI,CAAC,YAAY;;YAEzC,GAAG,CACH,IAAI,CAAA,mCAAmC,aAAa;;yBAEvC,IAAI,CAAC,kCAAkC;;;;;+BAKjC,CACpB;;;;qBAIU,IAAI,CAAC,iCAAiC;;yBAElC,GAAG,CAAC,2BAA2B,CAAC;;eAE1C,IAAI;;;;;2BAKQ,GAAG,CAAC,4BAA4B,CAAC;;;4BAGhC,GAAG,CAAC,uBAAuB,CAAC;;cAE1C,UAAU;;;;KAInB,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,CAAQ;QACnB,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,0BAA0B,CAAC,KAAa;QACtC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,wBAAwB,EAAE;YACxC,MAAM,EAAE;gBACN,KAAK;aACN;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,kCAAkC;QAChC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gCAAgC,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,iCAAiC;QAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO;YACL,WAAW;YACX,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAkGoB,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCvD;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AA1N6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAKzB;AAG0B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iEAA2B;AAE/B;IAAtB,KAAK,CAAC,MAAM,CAAC;qDAAqC;AAXxC,mBAAmB;IAF/B,aAAa,CAAC,wBAAwB,CAAC;IACvC,SAAS,EAAE;GACC,mBAAmB,CA2N/B","sourcesContent":["import { css, CSSResultGroup, LitElement, html } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { customElement } from '@src/util/custom-element';\n\nimport { localized, msg } from '@lit/localize';\n\nimport searchIcon from '@src/elements/ia-topnav/assets/img/icon-search';\nimport logo from '@src/elements/ia-topnav/assets/img/wayback-logo';\nimport themeStyles from '@src/themes/theme-styles';\n\n/** Desktop styles apply at `min-width: WAYBACK_SEARCH_DESKTOP_BREAKPOINT px`. */\nconst WAYBACK_SEARCH_DESKTOP_BREAKPOINT = 890;\n\n/**\n * A Wayback Machine search form: a line about how many pages the Wayback\n * Machine holds, its logo, and a URL or keyword field.\n *\n * Submitting calls `queryHandler.performQuery` with what was typed, which by\n * default goes to the Wayback Machine's results for it, and fires\n * `waybackSearchSubmitted`.\n */\n@customElement('ia-wayback-search-form')\n@localized()\nexport class IAWaybackSearchForm extends LitElement {\n @property({ type: Object }) queryHandler: {\n performQuery: (query: string) => void;\n } = {\n performQuery: (query: string) =>\n (window.location.href = `https://web.archive.org/web/*/${query}`),\n };\n\n /** How many pages the Wayback Machine holds. Blank shows a localized default. */\n @property({ type: String }) waybackPagesArchived = '';\n\n @query('#url') private urlInput!: HTMLInputElement;\n\n render() {\n const pagesArchived = this.waybackPagesArchived || msg('1 trillion');\n return html`\n <form method=\"post\" @submit=${this.handleSubmit}>\n <p>\n ${msg(\n html`Search the history of more than ${pagesArchived}\n <a\n @click=${this.emitWaybackMachineStatsLinkClicked}\n data-event-click-tracking=\"TopNav|WaybackMachineStatsLink\"\n href=\"https://blog.archive.org/2016/10/23/defining-web-pages-web-sites-and-web-captures/\"\n >web pages</a\n >\n on the Internet.`,\n )}\n </p>\n <fieldset>\n <a\n @click=${this.emitWaybackMachineLogoLinkClicked}\n data-event-click-tracking=\"TopNav|WaybackMachineLogoLink\"\n aria-label=${msg('Visit the Wayback Machine')}\n href=\"https://web.archive.org\"\n >${logo}</a\n >\n <div class=\"search-field\">\n <input\n type=\"text\"\n aria-label=${msg('Search the Wayback Machine')}\n name=\"url\"\n id=\"url\"\n placeholder=${msg('Enter URL or keywords')}\n />\n ${searchIcon}\n </div>\n </fieldset>\n </form>\n `;\n }\n\n handleSubmit(e: Event) {\n e.preventDefault();\n const query = this.urlInput.value;\n this.emitWaybackSearchSubmitted(query);\n this.queryHandler.performQuery(query);\n }\n\n emitWaybackSearchSubmitted(query: string) {\n this.dispatchEvent(\n new CustomEvent('waybackSearchSubmitted', {\n detail: {\n query,\n },\n }),\n );\n }\n\n emitWaybackMachineStatsLinkClicked() {\n this.dispatchEvent(new CustomEvent('waybackMachineStatsLinkClicked'));\n }\n\n emitWaybackMachineLogoLinkClicked() {\n this.dispatchEvent(new CustomEvent('waybackMachineLogoLink'));\n }\n\n static get styles(): CSSResultGroup {\n return [\n themeStyles,\n css`\n :host {\n --wayback-search-input-text-color--: var(\n --ia-theme-secondary-text-color,\n #666\n );\n --wayback-search-input-bg--: var(\n --ia-theme-secondary-background-color,\n #fff\n );\n /*\n * Darker than the mobile glyph, which follows --iconFill. The topnav\n * declares this alongside its other color knobs. The literal covers\n * mounting this search on its own, where none of those greys exist,\n * and it has to be a literal because fill inherits: an unresolved\n * value paints black rather than falling through to another rule.\n */\n --wayback-search-desktop-icon-fill--: var(\n --desktopSearchIconFill,\n #333\n );\n\n font: normal 1.2rem/1.5 var(--themeFontFamily);\n }\n\n form {\n max-width: 600px;\n }\n\n p {\n margin-top: 0;\n font-weight: 200;\n }\n\n a {\n font-weight: 500;\n text-decoration: none;\n color: var(--activeColor);\n }\n\n fieldset {\n padding: 0.7rem 2rem;\n margin: 1.5rem 0;\n box-sizing: border-box;\n text-align: center;\n border: none;\n border-radius: 7px;\n background-color: #fcf5e6;\n box-shadow: 3px 3px 0 0 #c3ad97;\n }\n\n fieldset a {\n font-size: 0;\n }\n\n img {\n width: 100%;\n max-width: 215px;\n max-height: 60px;\n margin-bottom: 1.3rem;\n vertical-align: middle;\n }\n\n input {\n display: block;\n width: 100%;\n height: 3rem;\n padding: 0.5rem 1rem 0.5rem 3rem;\n font: normal 1.2rem/1.5 var(--themeFontFamily);\n color: var(--wayback-search-input-text-color--);\n box-sizing: border-box;\n border: 1px solid var(--grey80);\n border-radius: 2rem;\n background: var(--wayback-search-input-bg--);\n }\n\n input:focus {\n border-color: #66afe9;\n outline: none;\n }\n\n .search-field {\n position: relative;\n overflow: hidden;\n }\n\n .search-field svg {\n position: absolute;\n top: 3px;\n left: 3px;\n width: 2.4rem;\n height: 2.4rem;\n }\n\n .search-field .fill-color {\n fill: var(--iconFill);\n }\n\n @media (min-width: ${WAYBACK_SEARCH_DESKTOP_BREAKPOINT}px) {\n form {\n margin: 0 auto;\n }\n\n p {\n margin-bottom: 3rem;\n font-size: 1.6rem;\n text-align: center;\n }\n\n img {\n margin: 0;\n }\n\n fieldset {\n margin: 0 auto;\n }\n\n fieldset a,\n .search-field {\n display: inline-block;\n width: 49%;\n vertical-align: middle;\n }\n\n fieldset a {\n text-align: center;\n }\n\n .search-field svg {\n top: 2px;\n }\n\n .search-field .fill-color {\n fill: var(--wayback-search-desktop-icon-fill--);\n }\n }\n `,\n ];\n }\n}\n"]}