vp-navbar.vue 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <script setup lang="ts">
  2. import { computed } from 'vue'
  3. import { inBrowser, useData } from 'vitepress'
  4. import VPNavbarSearch from './navbar/vp-search.vue'
  5. import VPNavbarMenu from './navbar/vp-menu.vue'
  6. import VPNavbarThemeToggler from './navbar/vp-theme-toggler.vue'
  7. import VPNavbarTranslation from './navbar/vp-translation.vue'
  8. import VPNavbarSocialLinks from './navbar/vp-social-links.vue'
  9. import VPNavbarHamburger from './navbar/vp-hamburger.vue'
  10. defineProps<{
  11. fullScreen: boolean
  12. }>()
  13. defineEmits(['toggle'])
  14. const { theme, page } = useData()
  15. const currentLink = computed(() => {
  16. if (!inBrowser) {
  17. return `/${page.value?.frontmatter?.lang || ''}/`
  18. }
  19. const existLangIndex = theme.value.langs.findIndex(lang => window?.location?.pathname.startsWith(`/${lang}`))
  20. return existLangIndex === -1 ? '/' : `/${theme.value.langs[existLangIndex]}/`
  21. })
  22. </script>
  23. <template>
  24. <div class="navbar-wrapper">
  25. <div class="header-container">
  26. <div class="logo-container">
  27. <a :href="currentLink">
  28. <img class="logo" src="/images/element-plus-logo.svg" alt="Element Plus Logo" />
  29. </a>
  30. </div>
  31. <div class="content">
  32. <VPNavbarSearch class="search" :options="theme.agolia" multilang />
  33. <VPNavbarMenu class="menu" />
  34. <VPNavbarThemeToggler class="theme-toggler" />
  35. <VPNavbarTranslation class="translation" />
  36. <VPNavbarSocialLinks class="social-links" />
  37. <VPNavbarHamburger :active="fullScreen" class="hamburger" @click="$emit('toggle')" />
  38. </div>
  39. </div>
  40. </div>
  41. </template>
  42. <style scoped lang="scss">
  43. .logo-container {
  44. display: flex;
  45. align-items: center;
  46. height: var(--header-height);
  47. > a {
  48. height: 28px;
  49. width: 128px;
  50. }
  51. .logo {
  52. position: relative;
  53. height: 100%;
  54. }
  55. }
  56. </style>