Files
BA-VitePress-Pages/.vitepress/theme/Layout.vue

123 lines
3.0 KiB
Vue
Raw Normal View History

2025-11-26 15:17:27 +08:00
<template>
<Splash></Splash>
<template v-if="!page.isNotFound">
<main style="min-height: 100vh">
<Navbar></Navbar>
<Banner>
<transition name="fade" mode="out-in">
<WelcomeBox v-if="!state.splashLoading && page.filePath === 'index.md'"></WelcomeBox>
<Tags v-else-if="page.filePath === 'tags/index.md'"></Tags>
<PostInnerBanner v-else></PostInnerBanner>
</transition>
</Banner>
<transition name="fade" mode="out-in">
<PostsList
v-if="page.filePath === 'index.md' || page.filePath === 'tags/index.md'"
></PostsList>
<PostViewer v-else></PostViewer>
</transition>
</main>
<Footer></Footer>
<Fireworks v-if="state.fireworksEnabled"></Fireworks>
<ClientOnly><SpinePlayer></SpinePlayer></ClientOnly>
<ToTop></ToTop>
<!-- 背景音乐元素 -->
<audio id="background-music" loop>
<source src="./assets/banner/bgm.mp3" type="audio/mpeg" />
</audio>
</template>
<NotFound v-else></NotFound>
</template>
<script setup lang="ts">
// 组件导入
import Splash from './components/Splash.vue'
import Navbar from './components/Navbar/index.vue'
import Banner from './components/Banner.vue'
import WelcomeBox from './components/Welcome-Box.vue'
import PostsList from './components/Posts-List.vue'
import Tags from './components/Tags.vue'
import PostViewer from './components/Post-Viewer.vue'
import PostInnerBanner from './components/Post-InnerBanner.vue'
import NotFound from './components/NotFound.vue'
import ToTop from './components/ToTop.vue'
import Fireworks from './components/Fireworks.vue'
import Footer from './components/Footer.vue'
// @ts-ignore
import SpinePlayer from './components/Spine-Player/index.vue'
// 路径切换
import { useData } from 'vitepress'
const { page } = useData()
import { useStore } from './store'
const { state } = useStore()
</script>
<style lang="less">
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
html {
scroll-behavior: smooth;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
body {
background-image: var(--theme-background-image);
background-color: var(--general-background-color);
background-size: cover;
background-repeat: no-repeat;
background-position: center;
background-attachment: fixed;
overflow-y: scroll;
overflow-x: hidden;
color: var(--font-color-grey);
font-family: 'Blueaka', sans-serif;
transition: background-image 0.5s, background-color 0.5s;
}
:root[theme='light'] {
--theme-background-image: url('./assets/background.svg');
}
:root[theme='dark'] {
--theme-background-image: url('./assets/background_dark.svg');
}
ul {
list-style: none;
}
a {
text-decoration: none;
}
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-thumb {
border-radius: 3px;
background: var(--color-blue);
cursor: pointer;
}
@media (max-width: 768px) {
.container {
width: 100vw;
}
}
</style>