2025-12-10 20:52:44 +08:00
|
|
|
<template>
|
2025-12-12 16:15:16 +08:00
|
|
|
<div
|
|
|
|
|
class="app-shell"
|
|
|
|
|
:class="{ 'pt-24': showNotice }"
|
|
|
|
|
>
|
2025-12-10 20:52:44 +08:00
|
|
|
<div
|
|
|
|
|
v-if="showNotice"
|
|
|
|
|
class="fixed top-6 left-0 right-0 z-50 flex justify-center px-4"
|
|
|
|
|
>
|
|
|
|
|
<slot name="notice" />
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="app-shell__backdrop">
|
2025-12-12 16:15:16 +08:00
|
|
|
<div class="app-shell__gradient app-shell__gradient--primary" />
|
|
|
|
|
<div class="app-shell__gradient app-shell__gradient--accent" />
|
2025-12-10 20:52:44 +08:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="app-shell__body">
|
|
|
|
|
<aside
|
|
|
|
|
v-if="$slots.sidebar"
|
|
|
|
|
class="app-shell__sidebar"
|
|
|
|
|
:class="sidebarClass"
|
|
|
|
|
>
|
|
|
|
|
<slot name="sidebar" />
|
|
|
|
|
</aside>
|
|
|
|
|
|
2025-12-12 16:15:16 +08:00
|
|
|
<div
|
|
|
|
|
class="app-shell__content"
|
|
|
|
|
:class="contentClass"
|
|
|
|
|
>
|
2025-12-10 20:52:44 +08:00
|
|
|
<slot name="header" />
|
|
|
|
|
<main :class="mainClass">
|
|
|
|
|
<slot />
|
|
|
|
|
</main>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import { computed } from 'vue'
|
|
|
|
|
|
|
|
|
|
const props = withDefaults(defineProps<{
|
|
|
|
|
showNotice?: boolean
|
|
|
|
|
contentClass?: string
|
|
|
|
|
mainClass?: string
|
|
|
|
|
sidebarClass?: string
|
|
|
|
|
}>(), {
|
|
|
|
|
showNotice: false,
|
|
|
|
|
contentClass: '',
|
|
|
|
|
mainClass: '',
|
|
|
|
|
sidebarClass: '',
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const showNotice = computed(() => props.showNotice)
|
|
|
|
|
|
|
|
|
|
// contentClass and mainClass are now just the props, base classes are in template
|
|
|
|
|
const contentClass = computed(() => props.contentClass)
|
|
|
|
|
const mainClass = computed(() => ['app-shell__main', props.mainClass].filter(Boolean).join(' '))
|
|
|
|
|
const sidebarClass = computed(() => props.sidebarClass)
|
|
|
|
|
</script>
|