|
1 | 1 | <template> |
2 | | - <FlashMessage /> |
3 | | - <auth-wraper :title="props.title"> |
4 | | - <template v-slot:form> |
| 2 | + <div class="min-h-screen bg-gradient-to-br from-slate-900 via-purple-900 to-slate-900 flex items-center justify-center p-4"> |
| 3 | + <!-- Background Pattern --> |
| 4 | + <div class="absolute inset-0 opacity-10"> |
| 5 | + <div class="absolute inset-0" style="background-image: radial-gradient(circle at 1px 1px, rgba(255,255,255,0.15) 1px, transparent 0); background-size: 20px 20px;"></div> |
| 6 | + </div> |
| 7 | + |
| 8 | + <!-- Flash Message --> |
| 9 | + <FlashMessage /> |
| 10 | + |
| 11 | + <!-- Main Container --> |
| 12 | + <div class="relative z-10 w-full max-w-md"> |
| 13 | + <!-- Card Container --> |
| 14 | + <div class="bg-white/10 backdrop-blur-lg rounded-3xl shadow-2xl border border-white/20 p-8"> |
| 15 | + <!-- Header --> |
| 16 | + <div class="text-center mb-8"> |
| 17 | + <div class="w-20 h-20 bg-gradient-to-r from-green-400 to-blue-500 rounded-2xl flex items-center justify-center mx-auto mb-4 shadow-2xl"> |
| 18 | + <svg class="w-10 h-10 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"> |
| 19 | + <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" /> |
| 20 | + </svg> |
| 21 | + </div> |
| 22 | + <h1 class="text-3xl font-bold text-white mb-2">{{ props.title }}</h1> |
| 23 | + <p class="text-white/70">Welcome to Skeleton Admin</p> |
| 24 | + </div> |
| 25 | + |
| 26 | + <!-- Form Slot --> |
5 | 27 | <slot name="form" /> |
6 | | - </template> |
7 | | - <template v-slot:links> |
8 | | - <slot name="links" /> |
9 | | - </template> |
10 | | - </auth-wraper> |
11 | | - <footer class="footer footer-center p-4 bg-base-300 font-bold"> |
12 | | - <div> |
13 | | - <p> |
14 | | - Copyright © {{ currentYear }} - All right reserved by |
15 | | - <a target="_blank" href="https://github.com/mariojgt/skeleton-admin" |
16 | | - >Skeleton-admin</a |
17 | | - > |
18 | | - </p> |
| 28 | + |
| 29 | + <!-- Links Slot --> |
| 30 | + <div class="mt-8 text-center"> |
| 31 | + <slot name="links" /> |
| 32 | + </div> |
| 33 | + </div> |
| 34 | + |
| 35 | + <!-- Footer --> |
| 36 | + <footer class="text-center mt-8 text-white/60 text-sm"> |
| 37 | + <p> |
| 38 | + Copyright © {{ currentYear }} - All rights reserved by |
| 39 | + <a |
| 40 | + target="_blank" |
| 41 | + href="https://github.com/mariojgt/skeleton-admin" |
| 42 | + class="text-white/80 hover:text-white transition-colors duration-200 underline" |
| 43 | + > |
| 44 | + Skeleton Admin |
| 45 | + </a> |
| 46 | + </p> |
| 47 | + </footer> |
19 | 48 | </div> |
20 | | - </footer> |
| 49 | + </div> |
21 | 50 | </template> |
22 | 51 |
|
23 | 52 | <script setup> |
24 | | -import { watch, onMounted } from "vue"; |
25 | | -// Call the auth wrhaper compnent |
26 | | -import AuthWraper from "@backend_components/Auth/AuthWrap.vue"; |
27 | | -import FlashMessage from "@backend_components/Backend/Global/FlashMessage.vue"; |
| 53 | +import { onMounted } from "vue" |
| 54 | +import FlashMessage from "@backend_components/Backend/Global/FlashMessage.vue" |
28 | 55 |
|
29 | 56 | const props = defineProps({ |
30 | 57 | title: { |
31 | 58 | type: String, |
32 | | - default: "Title", |
| 59 | + default: "Sign In", |
33 | 60 | }, |
34 | | -}); |
| 61 | +}) |
35 | 62 |
|
36 | 63 | // Load the saved theme |
37 | 64 | const loadLocalStorageTheme = async () => { |
38 | | - // Find the html element |
39 | | - const html = document.querySelector("html"); |
40 | | - // Set a default theme |
41 | | - html.setAttribute("data-theme", "forest"); |
42 | | - // Get the theme from the local storage |
43 | | - const theme = localStorage.getItem("theme-backend"); |
44 | | - // if not found set the default theme |
| 65 | + const html = document.querySelector("html") |
| 66 | + html.setAttribute("data-theme", "forest") |
| 67 | +
|
| 68 | + const theme = localStorage.getItem("theme-backend") |
45 | 69 | if (theme) { |
46 | | - // Add the data-theme attribute |
47 | | - html.setAttribute("data-theme", theme); |
| 70 | + html.setAttribute("data-theme", theme) |
48 | 71 | } else { |
49 | | - html.setAttribute("data-theme", "admin"); |
| 72 | + html.setAttribute("data-theme", "admin") |
50 | 73 | } |
51 | | -}; |
| 74 | +} |
52 | 75 |
|
53 | | -// On mount load the saved theme from the local storage |
54 | 76 | onMounted(() => { |
55 | | - loadLocalStorageTheme(); |
56 | | -}); |
| 77 | + loadLocalStorageTheme() |
| 78 | +}) |
57 | 79 |
|
58 | | -// Footer date |
59 | | -const currentYear = new Date().getFullYear(); |
| 80 | +const currentYear = new Date().getFullYear() |
60 | 81 | </script> |
61 | 82 |
|
62 | | -<style></style> |
| 83 | +<style scoped> |
| 84 | +/* Gradient animation */ |
| 85 | +@keyframes gradient { |
| 86 | + 0% { background-position: 0% 50%; } |
| 87 | + 50% { background-position: 100% 50%; } |
| 88 | + 100% { background-position: 0% 50%; } |
| 89 | +} |
| 90 | +
|
| 91 | +.bg-gradient-to-br { |
| 92 | + background-size: 200% 200%; |
| 93 | + animation: gradient 15s ease infinite; |
| 94 | +} |
| 95 | +
|
| 96 | +/* Glass morphism effect */ |
| 97 | +.backdrop-blur-lg { |
| 98 | + backdrop-filter: blur(16px); |
| 99 | + -webkit-backdrop-filter: blur(16px); |
| 100 | +} |
| 101 | +</style> |
0 commit comments