vp-navbar.vue 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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) =>
  20. window?.location?.pathname.startsWith(`/${lang}`)
  21. )
  22. return existLangIndex === -1 ? '/' : `/${theme.value.langs[existLangIndex]}/`
  23. })
  24. </script>
  25. <template>
  26. <div class="navbar-wrapper">
  27. <div class="header-container">
  28. <div class="logo-container">
  29. <a :href="currentLink">
  30. <img
  31. class="logo"
  32. src="/images/element-plus-logo.svg"
  33. alt="Element Plus Logo"
  34. />
  35. </a>
  36. </div>
  37. <div class="content">
  38. <VPNavbarSearch class="search" :options="theme.agolia" multilang />
  39. <VPNavbarMenu class="menu" />
  40. <VPNavbarThemeToggler class="theme-toggler" />
  41. <VPNavbarTranslation class="translation" />
  42. <VPNavbarSocialLinks class="social-links" />
  43. <VPNavbarHamburger
  44. :active="fullScreen"
  45. class="hamburger"
  46. @click="$emit('toggle')"
  47. />
  48. </div>
  49. </div>
  50. </div>
  51. </template>
  52. <style scoped lang="scss">
  53. .logo-container {
  54. display: flex;
  55. align-items: center;
  56. height: var(--header-height);
  57. > a {
  58. height: 28px;
  59. width: 128px;
  60. }
  61. .logo {
  62. position: relative;
  63. height: 100%;
  64. }
  65. }
  66. </style>