Achivements abends um 19 uhr
This commit is contained in:
336
public/404.html
Normal file
336
public/404.html
Normal file
@@ -0,0 +1,336 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>404 - Seite nicht gefunden | NinjaCross</title>
|
||||
<link rel="icon" type="image/x-icon" href="/pictures/favicon.ico">
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Animated background particles */
|
||||
.particles {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.particle {
|
||||
position: absolute;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border-radius: 50%;
|
||||
animation: float 6s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.particle:nth-child(1) { width: 4px; height: 4px; left: 10%; animation-delay: 0s; }
|
||||
.particle:nth-child(2) { width: 6px; height: 6px; left: 20%; animation-delay: 1s; }
|
||||
.particle:nth-child(3) { width: 3px; height: 3px; left: 30%; animation-delay: 2s; }
|
||||
.particle:nth-child(4) { width: 5px; height: 5px; left: 40%; animation-delay: 3s; }
|
||||
.particle:nth-child(5) { width: 4px; height: 4px; left: 50%; animation-delay: 4s; }
|
||||
.particle:nth-child(6) { width: 7px; height: 7px; left: 60%; animation-delay: 5s; }
|
||||
.particle:nth-child(7) { width: 3px; height: 3px; left: 70%; animation-delay: 0.5s; }
|
||||
.particle:nth-child(8) { width: 5px; height: 5px; left: 80%; animation-delay: 1.5s; }
|
||||
.particle:nth-child(9) { width: 4px; height: 4px; left: 90%; animation-delay: 2.5s; }
|
||||
|
||||
@keyframes float {
|
||||
0%, 100% { transform: translateY(100vh) rotate(0deg); opacity: 0; }
|
||||
10% { opacity: 1; }
|
||||
90% { opacity: 1; }
|
||||
50% { transform: translateY(-10vh) rotate(180deg); }
|
||||
}
|
||||
|
||||
/* Main container */
|
||||
.container {
|
||||
text-align: center;
|
||||
z-index: 10;
|
||||
position: relative;
|
||||
max-width: 600px;
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
/* Ninja emoji with animation */
|
||||
.ninja-emoji {
|
||||
font-size: 8rem;
|
||||
margin-bottom: 1rem;
|
||||
display: inline-block;
|
||||
animation: ninja-bounce 2s ease-in-out infinite;
|
||||
filter: drop-shadow(0 0 20px rgba(0, 255, 255, 0.5));
|
||||
}
|
||||
|
||||
@keyframes ninja-bounce {
|
||||
0%, 100% { transform: translateY(0) rotate(0deg); }
|
||||
25% { transform: translateY(-20px) rotate(-5deg); }
|
||||
50% { transform: translateY(-10px) rotate(0deg); }
|
||||
75% { transform: translateY(-15px) rotate(5deg); }
|
||||
}
|
||||
|
||||
/* 404 number with glow effect */
|
||||
.error-code {
|
||||
font-size: 6rem;
|
||||
font-weight: bold;
|
||||
background: linear-gradient(45deg, #00ffff, #ff00ff, #ffff00, #00ffff);
|
||||
background-size: 400% 400%;
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
animation: gradient-shift 3s ease-in-out infinite;
|
||||
margin-bottom: 1rem;
|
||||
text-shadow: 0 0 30px rgba(0, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
@keyframes gradient-shift {
|
||||
0% { background-position: 0% 50%; }
|
||||
50% { background-position: 100% 50%; }
|
||||
100% { background-position: 0% 50%; }
|
||||
}
|
||||
|
||||
/* Error message */
|
||||
.error-message {
|
||||
font-size: 1.5rem;
|
||||
color: #ffffff;
|
||||
margin-bottom: 2rem;
|
||||
opacity: 0;
|
||||
animation: fade-in-up 1s ease-out 0.5s forwards;
|
||||
}
|
||||
|
||||
@keyframes fade-in-up {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Description */
|
||||
.description {
|
||||
font-size: 1.1rem;
|
||||
color: #b0b0b0;
|
||||
margin-bottom: 3rem;
|
||||
line-height: 1.6;
|
||||
opacity: 0;
|
||||
animation: fade-in-up 1s ease-out 1s forwards;
|
||||
}
|
||||
|
||||
/* Action buttons */
|
||||
.actions {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
opacity: 0;
|
||||
animation: fade-in-up 1s ease-out 1.5s forwards;
|
||||
}
|
||||
|
||||
.btn {
|
||||
padding: 12px 24px;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: linear-gradient(135deg, #00ffff, #0080ff);
|
||||
color: white;
|
||||
box-shadow: 0 4px 15px rgba(0, 255, 255, 0.3);
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 6px 20px rgba(0, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
.btn-secondary {
|
||||
background: transparent;
|
||||
color: #00ffff;
|
||||
border: 2px solid #00ffff;
|
||||
}
|
||||
|
||||
.btn-secondary:hover {
|
||||
background: #00ffff;
|
||||
color: #1a1a2e;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
/* Glitch effect for 404 */
|
||||
.glitch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.glitch::before,
|
||||
.glitch::after {
|
||||
content: '404';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(45deg, #00ffff, #ff00ff, #ffff00, #00ffff);
|
||||
background-size: 400% 400%;
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
|
||||
.glitch::before {
|
||||
animation: glitch-1 0.5s infinite;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.glitch::after {
|
||||
animation: glitch-2 0.5s infinite;
|
||||
z-index: -2;
|
||||
}
|
||||
|
||||
@keyframes glitch-1 {
|
||||
0%, 100% { transform: translate(0); }
|
||||
20% { transform: translate(-2px, 2px); }
|
||||
40% { transform: translate(-2px, -2px); }
|
||||
60% { transform: translate(2px, 2px); }
|
||||
80% { transform: translate(2px, -2px); }
|
||||
}
|
||||
|
||||
@keyframes glitch-2 {
|
||||
0%, 100% { transform: translate(0); }
|
||||
20% { transform: translate(2px, -2px); }
|
||||
40% { transform: translate(2px, 2px); }
|
||||
60% { transform: translate(-2px, -2px); }
|
||||
80% { transform: translate(-2px, 2px); }
|
||||
}
|
||||
|
||||
/* Responsive design */
|
||||
@media (max-width: 768px) {
|
||||
.ninja-emoji { font-size: 6rem; }
|
||||
.error-code { font-size: 4rem; }
|
||||
.error-message { font-size: 1.2rem; }
|
||||
.description { font-size: 1rem; }
|
||||
.actions { flex-direction: column; align-items: center; }
|
||||
.btn { width: 200px; }
|
||||
}
|
||||
|
||||
/* Loading animation for page load */
|
||||
.container {
|
||||
animation: page-load 1s ease-out;
|
||||
}
|
||||
|
||||
@keyframes page-load {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: scale(0.8);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Animated background particles -->
|
||||
<div class="particles">
|
||||
<div class="particle"></div>
|
||||
<div class="particle"></div>
|
||||
<div class="particle"></div>
|
||||
<div class="particle"></div>
|
||||
<div class="particle"></div>
|
||||
<div class="particle"></div>
|
||||
<div class="particle"></div>
|
||||
<div class="particle"></div>
|
||||
<div class="particle"></div>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<!-- Animated ninja emoji -->
|
||||
<div class="ninja-emoji">🥷</div>
|
||||
|
||||
<!-- Glitchy 404 number -->
|
||||
<div class="error-code glitch">404</div>
|
||||
|
||||
<!-- Error message -->
|
||||
<h1 class="error-message">Oops! Diese Seite ist im Ninja-Modus verschwunden!</h1>
|
||||
|
||||
<!-- Description -->
|
||||
<p class="description">
|
||||
Die Seite, die du suchst, hat sich wie ein echter Ninja versteckt.<br>
|
||||
Vielleicht ist sie auf einer geheimen Mission oder hat sich in der Dunkelheit versteckt.
|
||||
</p>
|
||||
|
||||
<!-- Action buttons -->
|
||||
<div class="actions">
|
||||
<a href="/" class="btn btn-primary">🏠 Zur Hauptseite</a>
|
||||
<a href="/dashboard.html" class="btn btn-secondary">📊 Dashboard</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Add some interactive effects
|
||||
document.addEventListener('mousemove', (e) => {
|
||||
const particles = document.querySelectorAll('.particle');
|
||||
const x = e.clientX / window.innerWidth;
|
||||
const y = e.clientY / window.innerHeight;
|
||||
|
||||
particles.forEach((particle, index) => {
|
||||
const speed = (index + 1) * 0.5;
|
||||
const xOffset = (x - 0.5) * speed * 20;
|
||||
const yOffset = (y - 0.5) * speed * 20;
|
||||
|
||||
particle.style.transform = `translate(${xOffset}px, ${yOffset}px)`;
|
||||
});
|
||||
});
|
||||
|
||||
// Add click effect on ninja emoji
|
||||
document.querySelector('.ninja-emoji').addEventListener('click', () => {
|
||||
const ninja = document.querySelector('.ninja-emoji');
|
||||
ninja.style.animation = 'none';
|
||||
ninja.style.transform = 'scale(1.2) rotate(360deg)';
|
||||
|
||||
setTimeout(() => {
|
||||
ninja.style.animation = 'ninja-bounce 2s ease-in-out infinite';
|
||||
ninja.style.transform = '';
|
||||
}, 500);
|
||||
});
|
||||
|
||||
// Add some console easter egg
|
||||
console.log(`
|
||||
🥷 NINJA 404 CONSOLE EASTER EGG 🥷
|
||||
|
||||
Du hast die geheime Konsole gefunden!
|
||||
Hier ist ein Ninja-Haiku für dich:
|
||||
|
||||
"Versteckte Seite
|
||||
Wie ein Ninja in der Nacht
|
||||
Kehrt bald zurück"
|
||||
|
||||
- Der NinjaCross Server
|
||||
`);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -354,6 +354,41 @@ body {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.btn-discord {
|
||||
width: 100%;
|
||||
background: #5865F2;
|
||||
color: white;
|
||||
border: 1px solid #4752C4;
|
||||
padding: 12px 16px;
|
||||
border-radius: 8px;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 12px;
|
||||
font-size: 0.95rem;
|
||||
box-shadow: 0 1px 3px rgba(88, 101, 242, 0.3);
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.btn-discord:hover {
|
||||
background: #4752C4;
|
||||
border-color: #3C45A5;
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 12px rgba(88, 101, 242, 0.4);
|
||||
}
|
||||
|
||||
.btn-discord:active {
|
||||
transform: translateY(0);
|
||||
box-shadow: 0 1px 3px rgba(88, 101, 242, 0.3);
|
||||
}
|
||||
|
||||
.btn-discord svg {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* Divider */
|
||||
.divider {
|
||||
position: relative;
|
||||
|
||||
@@ -39,6 +39,32 @@ async function signInWithGoogle() {
|
||||
}
|
||||
}
|
||||
|
||||
// Discord OAuth Sign In
|
||||
async function signInWithDiscord() {
|
||||
try {
|
||||
setLoading(true);
|
||||
clearMessage();
|
||||
|
||||
const { data, error } = await supabase.auth.signInWithOAuth({
|
||||
provider: 'discord',
|
||||
options: {
|
||||
redirectTo: `${window.location.origin}/auth/callback`
|
||||
}
|
||||
});
|
||||
|
||||
if (error) {
|
||||
console.error('Discord OAuth error:', error);
|
||||
showMessage('Fehler bei der Discord-Anmeldung: ' + error.message, 'error');
|
||||
}
|
||||
// Note: OAuth redirects the page, so we don't need to handle success here
|
||||
} catch (error) {
|
||||
console.error('Discord OAuth error:', error);
|
||||
showMessage('Fehler bei der Discord-Anmeldung: ' + error.message, 'error');
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle between login and register forms
|
||||
function toggleForm() {
|
||||
const loginForm = document.getElementById('loginForm');
|
||||
@@ -94,6 +120,9 @@ function setupEventListeners() {
|
||||
// Handle Google OAuth
|
||||
document.getElementById('googleSignInBtn').addEventListener('click', signInWithGoogle);
|
||||
|
||||
// Handle Discord OAuth
|
||||
document.getElementById('discordSignInBtn').addEventListener('click', signInWithDiscord);
|
||||
|
||||
// Cookie settings button
|
||||
const cookieSettingsBtn = document.getElementById('cookie-settings-footer');
|
||||
if (cookieSettingsBtn) {
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<!-- Login Form -->
|
||||
<div id="loginForm" class="form-container active">
|
||||
<h2 style="text-align: center; margin-bottom: 1.5rem; color: #e2e8f0; font-weight: 600;">Welcome Back</h2>
|
||||
<!-- Google OAuth Button -->
|
||||
<!-- OAuth Buttons -->
|
||||
<div class="oauth-container">
|
||||
<button type="button" id="googleSignInBtn" class="btn btn-google">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
@@ -39,6 +39,13 @@
|
||||
</svg>
|
||||
Continue with Google
|
||||
</button>
|
||||
|
||||
<button type="button" id="discordSignInBtn" class="btn btn-discord">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="#5865F2" d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z"/>
|
||||
</svg>
|
||||
Continue with Discord
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="divider">
|
||||
|
||||
Reference in New Issue
Block a user