133 lines
3.5 KiB
Vue
133 lines
3.5 KiB
Vue
<template>
|
|
<header class="navbar">
|
|
<SidebarButton @toggle-sidebar="$emit('toggle-sidebar')"/>
|
|
|
|
<router-link
|
|
:to="$localePath"
|
|
class="home-link">
|
|
<img
|
|
class="logo"
|
|
v-if="$themeConfig.logo"
|
|
:src="$withBase($themeConfig.logo)"
|
|
:alt="$siteTitle">
|
|
<span
|
|
ref="siteName"
|
|
class="site-name"
|
|
v-if="$siteTitle">{{ $siteTitle }}</span>
|
|
</router-link>
|
|
|
|
<div
|
|
class="links"
|
|
:style="linksWrapMaxWidth ? {
|
|
'max-width': linksWrapMaxWidth + 'px'
|
|
} : {}">
|
|
|
|
<Theme v-if="hasThemes" />
|
|
<Screenfull class="screenfull" />
|
|
<AlgoliaSearchBox
|
|
v-if="isAlgoliaSearch"
|
|
:options="algolia"/>
|
|
<SearchBox v-else-if="$themeConfig.search !== false && $frontmatter.search !== false"/>
|
|
<NavLinks class="can-hide"/>
|
|
</div>
|
|
</header>
|
|
</template>
|
|
|
|
<script>
|
|
import AlgoliaSearchBox from '@AlgoliaSearchBox'
|
|
import SearchBox from '@SearchBox'
|
|
import SidebarButton from '@theme/components/SidebarButton.vue'
|
|
import NavLinks from '@theme/components/NavLinks.vue'
|
|
import Theme from '@theme/components/Theme'
|
|
|
|
export default {
|
|
components: { SidebarButton, NavLinks, SearchBox, AlgoliaSearchBox, Theme },
|
|
|
|
data () {
|
|
return {
|
|
linksWrapMaxWidth: null,
|
|
hasThemes: false
|
|
}
|
|
},
|
|
|
|
mounted () {
|
|
const MOBILE_DESKTOP_BREAKPOINT = 719 // refer to config.styl
|
|
const NAVBAR_VERTICAL_PADDING = parseInt(css(this.$el, 'paddingLeft')) + parseInt(css(this.$el, 'paddingRight'))
|
|
const { themePicker } = this.$themeConfig
|
|
const handleLinksWrapWidth = () => {
|
|
if (document.documentElement.clientWidth < MOBILE_DESKTOP_BREAKPOINT) {
|
|
this.linksWrapMaxWidth = null
|
|
} else {
|
|
this.linksWrapMaxWidth = this.$el.offsetWidth - NAVBAR_VERTICAL_PADDING -
|
|
(this.$refs.siteName && this.$refs.siteName.offsetWidth || 0)
|
|
}
|
|
}
|
|
handleLinksWrapWidth()
|
|
window.addEventListener('resize', handleLinksWrapWidth, false)
|
|
this.hasThemes = themePicker === undefined ? true : themePicker
|
|
},
|
|
|
|
computed: {
|
|
algolia () {
|
|
return this.$themeLocaleConfig.algolia || this.$themeConfig.algolia || {}
|
|
},
|
|
|
|
isAlgoliaSearch () {
|
|
return this.algolia && this.algolia.apiKey && this.algolia.indexName
|
|
}
|
|
}
|
|
}
|
|
|
|
function css (el, property) {
|
|
// NOTE: Known bug, will return 'auto' if style value is 'auto'
|
|
const win = el.ownerDocument.defaultView
|
|
// null means not to return pseudo styles
|
|
return win.getComputedStyle(el, null)[property]
|
|
}
|
|
</script>
|
|
|
|
<style lang="stylus">
|
|
$navbar-vertical-padding = 0.7rem
|
|
$navbar-horizontal-padding = 1.5rem
|
|
|
|
.navbar
|
|
padding $navbar-vertical-padding $navbar-horizontal-padding
|
|
line-height $navbarHeight - 1.4rem
|
|
box-shadow 0 1px 6px 0 rgba(32,33,36,.28)
|
|
a, span, img
|
|
display inline-block
|
|
.logo
|
|
height $navbarHeight - 1.4rem
|
|
min-width $navbarHeight - 1.4rem
|
|
margin-right 0.8rem
|
|
vertical-align top
|
|
.site-name
|
|
font-size 1.2rem
|
|
font-weight 600
|
|
color $textColor
|
|
position relative
|
|
.links
|
|
padding-left 1.5rem
|
|
box-sizing border-box
|
|
background-color white
|
|
white-space nowrap
|
|
font-size 0.9rem
|
|
position absolute
|
|
right $navbar-horizontal-padding
|
|
top $navbar-vertical-padding
|
|
display flex
|
|
.search-box
|
|
flex: 0 0 auto
|
|
vertical-align top
|
|
.screenfull
|
|
margin-right 1rem
|
|
|
|
@media (max-width: $MQMobile)
|
|
.navbar
|
|
padding-left 4rem
|
|
.can-hide
|
|
display none
|
|
.links
|
|
padding-left 1.5rem
|
|
</style>
|