|
@@ -2,12 +2,15 @@
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
import { RouterLink, useRoute } from 'vue-router'
|
|
import { RouterLink, useRoute } from 'vue-router'
|
|
|
import { navigation } from '@/router'
|
|
import { navigation } from '@/router'
|
|
|
-import { computed } from 'vue'
|
|
|
|
|
|
|
+import { computed, ref } from 'vue'
|
|
|
|
|
|
|
|
// 计算当前是否在文档页面
|
|
// 计算当前是否在文档页面
|
|
|
const route = useRoute()
|
|
const route = useRoute()
|
|
|
const isDocView = computed(() => route.name === 'doc')
|
|
const isDocView = computed(() => route.name === 'doc')
|
|
|
|
|
|
|
|
|
|
+// 移动端菜单状态
|
|
|
|
|
+const showMobileMenu = ref(false)
|
|
|
|
|
+
|
|
|
defineOptions({ name: 'Header' })
|
|
defineOptions({ name: 'Header' })
|
|
|
|
|
|
|
|
defineProps({
|
|
defineProps({
|
|
@@ -48,20 +51,37 @@ defineProps({
|
|
|
<!-- Logo 区域 -->
|
|
<!-- Logo 区域 -->
|
|
|
<div class="logo-section">
|
|
<div class="logo-section">
|
|
|
<RouterLink to="/">
|
|
<RouterLink to="/">
|
|
|
- <img src="@/assets/icons/logo.svg" alt="Pendulum Logo" class="logo" />
|
|
|
|
|
- <span class="logo-text">Pendulum 开放平台</span>
|
|
|
|
|
|
|
+ <img src="@/assets/icons/logo.svg" alt="One Myriad" class="logo" />
|
|
|
|
|
+ <span class="logo-text">One Myriad 开放平台</span>
|
|
|
</RouterLink>
|
|
</RouterLink>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <!-- 简化后的导航菜单 -->
|
|
|
|
|
- <nav class="nav-menu">
|
|
|
|
|
|
|
+ <!-- 移动端菜单按钮 -->
|
|
|
|
|
+ <button
|
|
|
|
|
+ class="mobile-menu-button"
|
|
|
|
|
+ @click="showMobileMenu = !showMobileMenu"
|
|
|
|
|
+ aria-label="Toggle menu"
|
|
|
|
|
+ >
|
|
|
|
|
+ <span class="bar" :class="{ 'bar-1': showMobileMenu }"></span>
|
|
|
|
|
+ <span class="bar" :class="{ 'bar-2': showMobileMenu }"></span>
|
|
|
|
|
+ <span class="bar" :class="{ 'bar-3': showMobileMenu }"></span>
|
|
|
|
|
+ </button>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 导航菜单 -->
|
|
|
|
|
+ <nav class="nav-menu" :class="{ 'mobile-show': showMobileMenu }">
|
|
|
<ul class="menu-list">
|
|
<ul class="menu-list">
|
|
|
<li
|
|
<li
|
|
|
v-for="item in navigation"
|
|
v-for="item in navigation"
|
|
|
:key="item.name"
|
|
:key="item.name"
|
|
|
class="menu-item"
|
|
class="menu-item"
|
|
|
>
|
|
>
|
|
|
- <RouterLink :to="item.path" class="menu-link">{{ item.title }}</RouterLink>
|
|
|
|
|
|
|
+ <RouterLink
|
|
|
|
|
+ :to="item.path"
|
|
|
|
|
+ class="menu-link"
|
|
|
|
|
+ @click="showMobileMenu = false"
|
|
|
|
|
+ >
|
|
|
|
|
+ {{ item.title }}
|
|
|
|
|
+ </RouterLink>
|
|
|
</li>
|
|
</li>
|
|
|
</ul>
|
|
</ul>
|
|
|
</nav>
|
|
</nav>
|
|
@@ -191,6 +211,38 @@ defineProps({
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 移动端菜单按钮
|
|
|
|
|
+.mobile-menu-button {
|
|
|
|
|
+ display: none;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ justify-content: space-around;
|
|
|
|
|
+ width: 32px;
|
|
|
|
|
+ height: 32px;
|
|
|
|
|
+ background: transparent;
|
|
|
|
|
+ border: none;
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ padding: 0;
|
|
|
|
|
+ z-index: 10;
|
|
|
|
|
+
|
|
|
|
|
+ .bar {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 2px;
|
|
|
|
|
+ background: v.$text-primary;
|
|
|
|
|
+ transition: all 0.3s ease;
|
|
|
|
|
+ transform-origin: center;
|
|
|
|
|
+
|
|
|
|
|
+ &.bar-1 {
|
|
|
|
|
+ transform: translateY(8px) rotate(45deg);
|
|
|
|
|
+ }
|
|
|
|
|
+ &.bar-2 {
|
|
|
|
|
+ opacity: 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ &.bar-3 {
|
|
|
|
|
+ transform: translateY(-8px) rotate(-45deg);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 移动端适配
|
|
// 移动端适配
|
|
|
@include v.responsive(medium) {
|
|
@include v.responsive(medium) {
|
|
|
.header-container {
|
|
.header-container {
|
|
@@ -215,35 +267,68 @@ defineProps({
|
|
|
@include v.responsive(small) {
|
|
@include v.responsive(small) {
|
|
|
.header-container {
|
|
.header-container {
|
|
|
padding: 0 v.$spacing-sm;
|
|
padding: 0 v.$spacing-sm;
|
|
|
|
|
+ position: relative;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.logo-text {
|
|
.logo-text {
|
|
|
display: none;
|
|
display: none;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ .mobile-menu-button {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
.nav-menu {
|
|
.nav-menu {
|
|
|
- margin: 0 v.$spacing-sm;
|
|
|
|
|
|
|
+ position: fixed;
|
|
|
|
|
+ top: 64px;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: calc(100vh - 64px);
|
|
|
|
|
+ background: v.$background-light;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ padding: 2rem;
|
|
|
|
|
+ transform: translateX(-100%);
|
|
|
|
|
+ transition: transform 0.3s ease;
|
|
|
|
|
+ margin: 0;
|
|
|
|
|
+ z-index: 9;
|
|
|
|
|
+ overflow-y: auto;
|
|
|
|
|
+
|
|
|
|
|
+ &.mobile-show {
|
|
|
|
|
+ transform: translateX(0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .menu-list {
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 1rem;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
.menu-item {
|
|
.menu-item {
|
|
|
- padding: 0 v.$spacing-xs;
|
|
|
|
|
|
|
+ padding: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.menu-link {
|
|
.menu-link {
|
|
|
- font-size: v.$font-size-xs;
|
|
|
|
|
|
|
+ font-size: 1rem;
|
|
|
|
|
+ padding: 0.5rem 0;
|
|
|
|
|
+ display: block;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .action-section {
|
|
|
|
|
- gap: v.$spacing-sm;
|
|
|
|
|
-
|
|
|
|
|
- .action-link {
|
|
|
|
|
- display: none;
|
|
|
|
|
|
|
+ .mobile-action-section {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 1rem;
|
|
|
|
|
+ margin-top: 2rem;
|
|
|
|
|
+
|
|
|
|
|
+ .action-link, .action-button {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ padding: 0.75rem;
|
|
|
|
|
+ font-size: 1rem;
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- .action-button {
|
|
|
|
|
- padding: v.$spacing-xs v.$spacing-sm;
|
|
|
|
|
- font-size: v.$font-size-xs;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ .action-section {
|
|
|
|
|
+ display: none;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|