123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- <template>
- <nav
- class="nav-links"
- v-if="userLinks.length || repoLink"
- >
- <!-- user links -->
- <div
- class="nav-item"
- v-for="item in userLinks"
- :key="item.link"
- >
- <DropdownLink
- v-if="item.type === 'links'"
- :item="item"
- />
- <NavLink
- v-else
- :item="item"
- />
- </div>
- <!-- repo link -->
- <a
- v-if="repoLink"
- :href="repoLink"
- class="repo-link"
- target="_blank"
- rel="noopener noreferrer"
- >
- {{ repoLabel }}
- <OutboundLink/>
- </a>
- </nav>
- </template>
- <script>
- import DropdownLink from '@theme/components/DropdownLink.vue'
- import { resolveNavLinkItem } from '../util'
- import NavLink from '@theme/components/NavLink.vue'
- export default {
- components: { NavLink, DropdownLink },
- computed: {
- userNav () {
- return this.$themeLocaleConfig.nav || this.$site.themeConfig.nav || []
- },
- nav () {
- const { locales } = this.$site
- if (locales && Object.keys(locales).length > 1) {
- const currentLink = this.$page.path
- const routes = this.$router.options.routes
- const themeLocales = this.$site.themeConfig.locales || {}
- const languageDropdown = {
- text: this.$themeLocaleConfig.selectText || 'Languages',
- ariaLabel: this.$themeLocaleConfig.ariaLabel || 'Select language',
- items: Object.keys(locales).map(path => {
- const locale = locales[path]
- const text = themeLocales[path] && themeLocales[path].label || locale.lang
- let link
- // Stay on the current page
- if (locale.lang === this.$lang) {
- link = currentLink
- } else {
- // Try to stay on the same page
- link = currentLink.replace(this.$localeConfig.path, path)
- // fallback to homepage
- if (!routes.some(route => route.path === link)) {
- link = path
- }
- }
- return { text, link }
- })
- }
- return [...this.userNav, languageDropdown]
- }
- return this.userNav
- },
- userLinks () {
- return (this.nav || []).map(link => {
- return Object.assign(resolveNavLinkItem(link), {
- items: (link.items || []).map(resolveNavLinkItem)
- })
- })
- },
- repoLink () {
- const { repo } = this.$site.themeConfig
- if (repo) {
- return /^https?:/.test(repo)
- ? repo
- : `https://github.com/${repo}`
- }
- return null
- },
- repoLabel () {
- if (!this.repoLink) return
- if (this.$site.themeConfig.repoLabel) {
- return this.$site.themeConfig.repoLabel
- }
- const repoHost = this.repoLink.match(/^https?:\/\/[^/]+/)[0]
- const platforms = ['GitHub', 'GitLab', 'Bitbucket']
- for (let i = 0; i < platforms.length; i++) {
- const platform = platforms[i]
- if (new RegExp(platform, 'i').test(repoHost)) {
- return platform
- }
- }
- return 'Source'
- }
- }
- }
- </script>
- <style lang="stylus">
- .action-button-secondary
- margin-right 20px;
- .nav-links
- display inline-block
- a
- line-height 1.4rem
- color inherit
- &:hover, &.router-link-active
- color $accentColor
- .nav-item
- position relative
- display inline-block
- margin-left 1.1rem
- line-height 2rem
- &:first-child
- margin-left 0
- .repo-link
- margin-left 1.5rem
- @media (max-width: $MQNarrow)
- .nav-links
- .nav-item
- margin-left 1rem
- @media (max-width: $MQMobile)
- .nav-links
- .nav-item, .repo-link
- margin-left 0
- @media (min-width: $MQMobile)
- .nav-links a
- &:hover, &.router-link-active
- color $accentColor
- font-weight bolder
- .nav-item > a:not(.external)
- &:hover, &.router-link-active
- margin-bottom -2px
- border-bottom 2px solid lighten($accentColor, 8%)
- </style>
|