main
vue 78 lines 1.9 KB
Raw
1 <template>
2 <div id="app-main" class="main">
3 <n-scrollbar ref="scrollbar">
4 <div
5 id="app-view"
6 class="view"
7 :class="{ boxed, 'view-padded': overridePadded === true, 'view-no-padded': overridePadded === false }"
8 >
9 <slot />
10 </div>
11 </n-scrollbar>
12 </div>
13 </template>
14
15 <script lang="ts" setup>
16 import type { RouteLocationNormalizedGeneric } from "vue-router"
17 import { NScrollbar } from "naive-ui"
18 import { computed, onMounted, ref } from "vue"
19 import { useRoute, useRouter } from "vue-router"
20 import { useThemeStore } from "@/stores/theme"
21
22 const themeStore = useThemeStore()
23 const router = useRouter()
24 const route = useRoute()
25 const themeBoxed = computed<boolean>(() => themeStore.isBoxed)
26 const overrideBoxed = ref<boolean | undefined>(undefined)
27 const overridePadded = ref<boolean | undefined>(undefined)
28 const boxed = computed<boolean>(() => (overrideBoxed.value !== undefined ? overrideBoxed.value : themeBoxed.value))
29 const scrollbar = ref()
30
31 function checkThemeOverrides(currentRoute: RouteLocationNormalizedGeneric) {
32 if (currentRoute.meta?.theme?.boxed?.enabled !== undefined) {
33 overrideBoxed.value = currentRoute.meta.theme.boxed.enabled
34 } else {
35 overrideBoxed.value = undefined
36 }
37
38 if (currentRoute.meta?.theme?.padded?.enabled !== undefined) {
39 overridePadded.value = currentRoute.meta.theme.padded.enabled
40 } else {
41 overridePadded.value = undefined
42 }
43 }
44
45 router.beforeEach(checkThemeOverrides)
46
47 onMounted(() => {
48 checkThemeOverrides(route)
49
50 router.afterEach(() => {
51 if (scrollbar?.value?.scrollTo) {
52 scrollbar?.value.scrollTo({ top: 0, behavior: "smooth" })
53 }
54 })
55 })
56 </script>
57
58 <style lang="scss" scoped>
59 .main {
60 width: 100%;
61 position: relative;
62 background-color: var(--bg-body-color);
63
64 .view {
65 padding: 0 var(--view-padding);
66 flex-grow: 1;
67 width: 100%;
68 margin: 0 auto;
69
70 &.boxed {
71 max-width: var(--boxed-width);
72 }
73 &.view-no-padded {
74 padding: 0;
75 }
76 }
77 }
78 </style>