Files
sub2api/frontend/src/components/layout/AuthLayout.vue

90 lines
2.9 KiB
Vue
Raw Normal View History

2025-12-18 13:50:39 +08:00
<template>
<div class="relative flex min-h-screen items-center justify-center overflow-hidden p-4">
2025-12-18 13:50:39 +08:00
<!-- Background -->
<div
class="absolute inset-0 bg-gradient-to-br from-gray-50 via-primary-50/30 to-gray-100 dark:from-dark-950 dark:via-dark-900 dark:to-dark-950"
></div>
2025-12-18 13:50:39 +08:00
<!-- Decorative Elements -->
<div class="pointer-events-none absolute inset-0 overflow-hidden">
2025-12-18 13:50:39 +08:00
<!-- Gradient Orbs -->
<div
class="absolute -right-40 -top-40 h-80 w-80 rounded-full bg-primary-400/20 blur-3xl"
></div>
<div
class="absolute -bottom-40 -left-40 h-80 w-80 rounded-full bg-primary-500/15 blur-3xl"
></div>
<div
class="absolute left-1/2 top-1/2 h-96 w-96 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-300/10 blur-3xl"
></div>
2025-12-18 13:50:39 +08:00
<!-- Grid Pattern -->
<div
class="absolute inset-0 bg-[linear-gradient(rgba(20,184,166,0.03)_1px,transparent_1px),linear-gradient(90deg,rgba(20,184,166,0.03)_1px,transparent_1px)] bg-[size:64px_64px]"
></div>
2025-12-18 13:50:39 +08:00
</div>
<!-- Content Container -->
<div class="relative z-10 w-full max-w-md">
2025-12-18 13:50:39 +08:00
<!-- Logo/Brand -->
<div class="mb-8 text-center">
2025-12-18 13:50:39 +08:00
<!-- Custom Logo or Default Logo -->
<div
class="mb-4 inline-flex h-16 w-16 items-center justify-center overflow-hidden rounded-2xl shadow-lg shadow-primary-500/30"
>
<img :src="siteLogo || '/logo.png'" alt="Logo" class="h-full w-full object-contain" />
2025-12-18 13:50:39 +08:00
</div>
<h1 class="text-gradient mb-2 text-3xl font-bold">
2025-12-18 13:50:39 +08:00
{{ siteName }}
</h1>
<p class="text-sm text-gray-500 dark:text-dark-400">
{{ siteSubtitle }}
</p>
</div>
<!-- Card Container -->
<div class="card-glass rounded-2xl p-8 shadow-glass">
<slot />
</div>
<!-- Footer Links -->
<div class="mt-6 text-center text-sm">
2025-12-18 13:50:39 +08:00
<slot name="footer" />
</div>
<!-- Copyright -->
<div class="mt-8 text-center text-xs text-gray-400 dark:text-dark-500">
2025-12-18 13:50:39 +08:00
&copy; {{ currentYear }} {{ siteName }}. All rights reserved.
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import { getPublicSettings } from '@/api/auth'
2025-12-18 13:50:39 +08:00
const siteName = ref('Sub2API')
const siteLogo = ref('')
const siteSubtitle = ref('Subscription to API Conversion Platform')
2025-12-18 13:50:39 +08:00
const currentYear = computed(() => new Date().getFullYear())
2025-12-18 13:50:39 +08:00
onMounted(async () => {
try {
const settings = await getPublicSettings()
siteName.value = settings.site_name || 'Sub2API'
siteLogo.value = settings.site_logo || ''
siteSubtitle.value = settings.site_subtitle || 'Subscription to API Conversion Platform'
2025-12-18 13:50:39 +08:00
} catch (error) {
console.error('Failed to load public settings:', error)
2025-12-18 13:50:39 +08:00
}
})
2025-12-18 13:50:39 +08:00
</script>
<style scoped>
.text-gradient {
@apply bg-gradient-to-r from-primary-600 to-primary-500 bg-clip-text text-transparent;
}
</style>