2026-01-15 13:51:44 +08:00
|
|
|
<template>
|
|
|
|
|
<div class="min-h-screen bg-art-bg text-art-text">
|
2026-01-16 11:06:59 +08:00
|
|
|
<!-- Global Noise (Only for frontend) -->
|
|
|
|
|
<div v-if="!isAdminOrLogin" class="fixed inset-0 pointer-events-none z-[60] bg-noise opacity-30 mix-blend-overlay"></div>
|
2026-01-15 13:51:44 +08:00
|
|
|
|
|
|
|
|
<!-- Toast Container -->
|
|
|
|
|
<div id="toast-container" class="toast-container"></div>
|
|
|
|
|
|
2026-01-16 11:06:59 +08:00
|
|
|
<!-- Header (Hide on Admin & Login) -->
|
|
|
|
|
<Header v-if="!isAdminOrLogin" />
|
2026-01-15 13:51:44 +08:00
|
|
|
|
2026-01-16 11:06:59 +08:00
|
|
|
<!-- Mobile Menu (Hide on Admin & Login) -->
|
|
|
|
|
<MobileMenu v-if="!isAdminOrLogin" />
|
2026-01-15 13:51:44 +08:00
|
|
|
|
|
|
|
|
<!-- Main Content -->
|
2026-01-16 11:06:59 +08:00
|
|
|
<!-- Conditional classes: Apply max-w-7xl only for frontend pages -->
|
|
|
|
|
<main :class="[
|
|
|
|
|
isAdminOrLogin ? 'w-full h-full' : 'pt-32 pb-20 px-6 max-w-7xl mx-auto relative z-10'
|
|
|
|
|
]">
|
2026-01-15 13:51:44 +08:00
|
|
|
<router-view />
|
|
|
|
|
</main>
|
|
|
|
|
|
2026-01-16 11:06:59 +08:00
|
|
|
<!-- Footer (Hide on Admin & Login) -->
|
|
|
|
|
<Footer v-if="!isAdminOrLogin" />
|
2026-01-15 13:51:44 +08:00
|
|
|
|
2026-01-16 11:06:59 +08:00
|
|
|
<!-- Snippet Modal (Hide on Admin & Login) -->
|
|
|
|
|
<SnippetModal v-if="!isAdminOrLogin" />
|
2026-01-15 13:51:44 +08:00
|
|
|
|
2026-01-16 11:06:59 +08:00
|
|
|
<!-- Inquiry Modal (Hide on Admin & Login) -->
|
|
|
|
|
<InquiryModal v-if="!isAdminOrLogin" />
|
2026-01-15 13:51:44 +08:00
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
2026-01-16 11:06:59 +08:00
|
|
|
import { computed } from 'vue'
|
|
|
|
|
import { useRoute } from 'vue-router'
|
2026-01-15 13:51:44 +08:00
|
|
|
import Header from './components/Header.vue'
|
|
|
|
|
import MobileMenu from './components/MobileMenu.vue'
|
|
|
|
|
import Footer from './components/Footer.vue'
|
|
|
|
|
import SnippetModal from './components/SnippetModal.vue'
|
|
|
|
|
import InquiryModal from './components/InquiryModal.vue'
|
2026-01-16 11:06:59 +08:00
|
|
|
|
|
|
|
|
const route = useRoute()
|
|
|
|
|
|
|
|
|
|
// Check if current route is Admin or Login page
|
|
|
|
|
const isAdminOrLogin = computed(() => {
|
|
|
|
|
const path = route.path
|
|
|
|
|
return path.startsWith('/admin') || path === '/login'
|
|
|
|
|
})
|
|
|
|
|
</script>
|