<script setup lang="ts">
|
|
import { ref, computed } from 'vue';
|
|
import { useI18n } from 'vue-i18n';
|
|
|
|
|
|
const { t, locale } = useI18n();
|
|
const isMenuOpen = ref(false);
|
|
|
|
// 切换菜单
|
|
const toggleMenu = () => {
|
|
isMenuOpen.value = !isMenuOpen.value;
|
|
};
|
|
|
|
// 切换语言
|
|
const changeLanguage = (lang: string) => {
|
|
emit('changeLanguage', lang);
|
|
};
|
|
|
|
// 语言选项
|
|
const languages = [
|
|
{ code: 'en', name: t('language.en') },
|
|
{ code: 'zh', name: t('language.zh') },
|
|
{ code: 'ja', name: t('language.ja') },
|
|
{ code: 'ar', name: t('language.ar') },
|
|
{ code: 'fr', name: t('language.fr') },
|
|
{ code: 'ko', name: t('language.ko') },
|
|
{ code: 'ms', name: t('language.ms') },
|
|
{ code: 'pt', name: t('language.pt') },
|
|
{ code: 'ru', name: t('language.ru') },
|
|
{ code: 'th', name: t('language.th') },
|
|
{ code: 'vi', name: t('language.vi') },
|
|
];
|
|
|
|
// 当前语言
|
|
const currentLanguage = computed(() => {
|
|
return languages.find(lang => lang.code === locale.value)?.name || t('language.en');
|
|
});
|
|
|
|
// 语言下拉菜单
|
|
const isLangDropdownOpen = ref(false);
|
|
const toggleLangDropdown = () => {
|
|
isLangDropdownOpen.value = !isLangDropdownOpen.value;
|
|
};
|
|
|
|
// 定义emit
|
|
const emit = defineEmits(['changeLanguage']);
|
|
</script>
|
|
|
|
<template>
|
|
<header class="bg-background-dark text-text py-4 px-6 md:px-12 lg:px-24 fixed w-full z-50">
|
|
<div class="container mx-auto flex justify-between items-center">
|
|
<!-- Logo -->
|
|
<router-link to="/" class="flex items-center animate__animated animate__fadeIn animate__duration-fast">
|
|
<img src="/public/real_logo.png" alt="MOSE Logo" class="h-8 w-auto mr-2" />
|
|
<!-- <span class="text-xl font-bold text-primary-light">MOSE</span> -->
|
|
</router-link>
|
|
|
|
<!-- Desktop Navigation -->
|
|
<nav class="hidden md:flex items-center space-x-6">
|
|
<!-- 首页 -->
|
|
<router-link
|
|
to="/"
|
|
class="text-text-secondary hover:text-text transition-colors duration-200 animate__animated animate__fadeInDown animate__duration-fast"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/' }"
|
|
>
|
|
{{ t('nav.home') }}
|
|
</router-link>
|
|
|
|
<!-- 生态系统 -->
|
|
<router-link
|
|
to="/ecosystem"
|
|
class="text-text-secondary hover:text-text transition-colors duration-200 animate__animated animate__fadeInDown animate__duration-fast animate__delay-xs"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/ecosystem' }"
|
|
>
|
|
{{ t('nav.ecosystem') }}
|
|
</router-link>
|
|
|
|
<!-- 技术 -->
|
|
<router-link
|
|
to="/technology"
|
|
class="text-text-secondary hover:text-text transition-colors duration-200 animate__animated animate__fadeInDown animate__duration-fast animate__delay-sm"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/technology' }"
|
|
>
|
|
{{ t('nav.technology') }}
|
|
</router-link>
|
|
|
|
<!-- 关于我们 -->
|
|
<router-link
|
|
to="/about"
|
|
class="text-text-secondary hover:text-text transition-colors duration-200 animate__animated animate__fadeInDown animate__duration-fast animate__delay-sm"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/about' }"
|
|
>
|
|
{{ t('nav.about') }}
|
|
</router-link>
|
|
|
|
<!-- 社区 -->
|
|
<router-link
|
|
to="/community"
|
|
class="text-text-secondary hover:text-text transition-colors duration-200 animate__animated animate__fadeInDown animate__duration-fast animate__delay-lg"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/community' }"
|
|
>
|
|
{{ t('nav.community') }}
|
|
</router-link>
|
|
|
|
<!-- 常见问题 -->
|
|
<router-link
|
|
to="/faq"
|
|
class="text-text-secondary hover:text-text transition-colors duration-200 animate__animated animate__fadeInDown animate__duration-fast animate__delay-lg"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/faq' }"
|
|
>
|
|
{{ t('nav.faq') }}
|
|
</router-link>
|
|
|
|
<!-- 联系我们 -->
|
|
<router-link
|
|
to="/contact"
|
|
class="text-text-secondary hover:text-text transition-colors duration-200 animate__animated animate__fadeInDown animate__duration-fast animate__delay-lg"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/contact' }"
|
|
>
|
|
{{ t('nav.contact') }}
|
|
</router-link>
|
|
|
|
<!-- 动画演示 -->
|
|
<!-- <router-link
|
|
to="/animations"
|
|
class="text-text-secondary hover:text-text transition-colors duration-200 animate__animated animate__fadeInDown animate__duration-fast animate__delay-lg"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/animations' }"
|
|
>
|
|
动画演示
|
|
</router-link> -->
|
|
|
|
<!-- Language Selector -->
|
|
<div class="relative animate__animated animate__fadeInDown animate__delay-lg animate__duration-fast">
|
|
<button
|
|
@click="toggleLangDropdown"
|
|
class="flex items-center text-text-secondary hover:text-text"
|
|
>
|
|
{{ currentLanguage }}
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4 ml-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
</svg>
|
|
</button>
|
|
|
|
<div
|
|
v-show="isLangDropdownOpen"
|
|
class="absolute right-0 mt-2 w-40 bg-background-light rounded-md shadow-lg py-1 z-10 animate__animated animate__fadeIn animate__duration-very-fast"
|
|
>
|
|
<button
|
|
v-for="lang in languages"
|
|
:key="lang.code"
|
|
@click="changeLanguage(lang.code); toggleLangDropdown()"
|
|
class="block w-full text-left px-4 py-2 text-text-secondary hover:bg-background hover:text-text"
|
|
:class="{ 'text-primary-light': locale === lang.code }"
|
|
>
|
|
{{ lang.name }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<!-- Mobile Menu Button -->
|
|
<button
|
|
@click="toggleMenu"
|
|
class="md:hidden text-text-secondary hover:text-text focus:outline-none animate__animated animate__fadeIn animate__duration-fast"
|
|
>
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
class="h-6 w-6"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
stroke="currentColor"
|
|
>
|
|
<path
|
|
v-if="!isMenuOpen"
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
stroke-width="2"
|
|
d="M4 6h16M4 12h16M4 18h16"
|
|
/>
|
|
<path
|
|
v-else
|
|
stroke-linecap="round"
|
|
stroke-linejoin="round"
|
|
stroke-width="2"
|
|
d="M6 18L18 6M6 6l12 12"
|
|
/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
|
|
<!-- Mobile Menu -->
|
|
<div
|
|
v-show="isMenuOpen"
|
|
class="md:hidden bg-background-light mt-4 rounded-lg py-4 px-6 shadow-lg animate__animated animate__duration-fast"
|
|
:class="{'animate__fadeIn': isMenuOpen, 'animate__fadeOut': !isMenuOpen}"
|
|
>
|
|
<div class="flex flex-col space-y-4">
|
|
<!-- 首页 -->
|
|
<router-link
|
|
to="/"
|
|
class="text-text-secondary hover:text-text py-2 animate__animated animate__fadeInRight animate__duration-fast"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/' }"
|
|
@click="isMenuOpen = false"
|
|
>
|
|
{{ t('nav.home') }}
|
|
</router-link>
|
|
|
|
<!-- 生态系统 -->
|
|
<router-link
|
|
to="/ecosystem"
|
|
class="text-text-secondary hover:text-text py-2 animate__animated animate__fadeInRight animate__duration-fast animate__delay-xs"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/ecosystem' }"
|
|
@click="isMenuOpen = false"
|
|
>
|
|
{{ t('nav.ecosystem') }}
|
|
</router-link>
|
|
|
|
<!-- 技术 -->
|
|
<router-link
|
|
to="/technology"
|
|
class="text-text-secondary hover:text-text py-2 animate__animated animate__fadeInRight animate__duration-fast animate__delay-sm"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/technology' }"
|
|
@click="isMenuOpen = false"
|
|
>
|
|
{{ t('nav.technology') }}
|
|
</router-link>
|
|
|
|
<!-- 关于我们 -->
|
|
<router-link
|
|
to="/about"
|
|
class="text-text-secondary hover:text-text py-2 animate__animated animate__fadeInRight animate__duration-fast animate__delay-sm"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/about' }"
|
|
@click="isMenuOpen = false"
|
|
>
|
|
{{ t('nav.about') }}
|
|
</router-link>
|
|
|
|
<!-- 社区 -->
|
|
<router-link
|
|
to="/community"
|
|
class="text-text-secondary hover:text-text py-2 animate__animated animate__fadeInRight animate__duration-fast animate__delay-md"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/community' }"
|
|
@click="isMenuOpen = false"
|
|
>
|
|
{{ t('nav.community') }}
|
|
</router-link>
|
|
|
|
<!-- 常见问题 -->
|
|
<router-link
|
|
to="/faq"
|
|
class="text-text-secondary hover:text-text py-2 animate__animated animate__fadeInRight animate__duration-fast animate__delay-lg"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/faq' }"
|
|
@click="isMenuOpen = false"
|
|
>
|
|
{{ t('nav.faq') }}
|
|
</router-link>
|
|
|
|
<!-- 联系我们 -->
|
|
<router-link
|
|
to="/contact"
|
|
class="text-text-secondary hover:text-text py-2 animate__animated animate__fadeInRight animate__duration-fast animate__delay-lg"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/contact' }"
|
|
@click="isMenuOpen = false"
|
|
>
|
|
{{ t('nav.contact') }}
|
|
</router-link>
|
|
|
|
<!-- 动画演示 -->
|
|
<!-- <router-link
|
|
to="/animations"
|
|
class="text-text-secondary hover:text-text py-2 animate__animated animate__fadeInRight animate__duration-fast animate__delay-lg"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/animations' }"
|
|
@click="isMenuOpen = false"
|
|
>
|
|
动画演示
|
|
</router-link> -->
|
|
|
|
<!-- 翻译工具 -->
|
|
<!-- <router-link
|
|
to="/translate"
|
|
class="text-text-secondary hover:text-text py-2 animate__animated animate__fadeInRight animate__duration-fast animate__delay-lg"
|
|
:class="{ 'text-primary-light font-medium': $route.path === '/translate' }"
|
|
@click="isMenuOpen = false"
|
|
>
|
|
翻译工具
|
|
</router-link> -->
|
|
|
|
<!-- Mobile Language Selector -->
|
|
<div class="py-2 border-t border-background animate__animated animate__fadeInUp animate__delay-lg animate__duration-fast">
|
|
<!-- <p class="text-text-secondary mb-2">{{ t('language.en') }}</p> -->
|
|
<div class="flex flex-col space-y-2">
|
|
<button
|
|
v-for="lang in languages"
|
|
:key="lang.code"
|
|
@click="changeLanguage(lang.code); isMenuOpen = false"
|
|
class="text-left text-text-secondary hover:text-text"
|
|
:class="{ 'text-primary-light': locale === lang.code }"
|
|
>
|
|
{{ lang.name }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<!-- Spacer to prevent content from hiding under fixed header -->
|
|
<div class="h-16"></div>
|
|
</template>
|