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