diff --git a/website/static/css/style.css b/website/static/css/style.css index 1731bf3..7bf65df 100644 --- a/website/static/css/style.css +++ b/website/static/css/style.css @@ -45,6 +45,12 @@ --success-bright: #50ffe4; --warning-bright: #ffe050; --danger-bright: #ff5050; + + /* Neue verbesserte Glasmorphismus Variablen */ + --glass-navbar-dark: rgba(14, 18, 32, 0.85); + --glass-navbar-light: rgba(255, 255, 255, 0.85); + --glass-card-dark: rgba(24, 28, 45, 0.8); + --glass-card-light: rgba(255, 255, 255, 0.8); } /* Basiselemente */ @@ -109,33 +115,302 @@ a:hover { border: 1px solid rgba(154, 125, 255, 0.3); } -.neumorph { - background: var(--card-bg); - border-radius: 16px; - box-shadow: var(--shadow-dark), var(--shadow-light); - margin-bottom: var(--standard-spacing); - padding: var(--standard-spacing); +/* Verbesserte Navbar Styles */ +.glass-navbar-dark { + background: var(--glass-navbar-dark); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border-color: rgba(255, 255, 255, 0.1); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25); +} + +.glass-navbar-light { + background: var(--glass-navbar-light); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border-color: rgba(0, 0, 0, 0.05); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08); +} + +.nav-link { + padding: 0.6rem 1rem; + border-radius: 0.75rem; + font-weight: 500; + transition: all 0.25s ease; + position: relative; + color: rgba(255, 255, 255, 0.85); +} + +.nav-link:hover { + background: rgba(179, 143, 255, 0.2); + color: white; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.nav-link-active { + background: rgba(179, 143, 255, 0.3); + color: white; + font-weight: 600; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} + +.nav-link-active::after { + content: ''; + position: absolute; + bottom: 0; + left: 10%; + width: 80%; + height: 2px; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.7), transparent); +} + +.nav-link-light { + color: rgba(26, 32, 44, 0.85); +} + +.nav-link-light:hover { + background: rgba(179, 143, 255, 0.15); + color: rgba(26, 32, 44, 1); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); +} + +.nav-link-light-active { + background: rgba(179, 143, 255, 0.2); + color: rgba(26, 32, 44, 1); + font-weight: 600; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.nav-link-light-active::after { + background: linear-gradient(90deg, transparent, rgba(26, 32, 44, 0.5), transparent); +} + +/* Neu gestylte Cards mit verbesserten Effekten */ +.card { + background: var(--glass-card-dark); + backdrop-filter: blur(var(--glass-blur)); + -webkit-backdrop-filter: blur(var(--glass-blur)); + border-radius: 1.25rem; + border: 1px solid rgba(255, 255, 255, 0.12); + padding: 1.75rem; + transition: all 0.3s ease; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.25); + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; + position: relative; + z-index: 1; +} + +.card::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 60%; + background: linear-gradient(to bottom, + rgba(179, 143, 255, 0.05) 0%, + rgba(179, 143, 255, 0) 100%); + z-index: -1; + transition: all 0.3s ease; + opacity: 0; + border-radius: 1.25rem 1.25rem 0 0; +} + +.card:hover { + transform: translateY(-5px); + box-shadow: 0 15px 40px rgba(0, 0, 0, 0.35); + border: 1px solid rgba(255, 255, 255, 0.2); +} + +.card:hover::before { + opacity: 1; +} + +.card .icon { + font-size: 2.5rem; + margin-bottom: 1.5rem; + display: inline-block; + background: linear-gradient(135deg, #b38fff, #58a9ff); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + filter: drop-shadow(0 0 8px rgba(179, 143, 255, 0.4)); transition: all 0.3s ease; } -.neumorph:hover { - box-shadow: var(--shadow-light), var(--shadow-dark), 0 0 20px rgba(154, 125, 255, 0.2); +.card:hover .icon { + transform: scale(1.1); + filter: drop-shadow(0 0 12px rgba(179, 143, 255, 0.6)); } -.neumorph-inset { - background: var(--card-bg); - border-radius: 16px; - box-shadow: var(--inner-shadow); - padding: var(--standard-spacing); +.card h3 { + font-size: 1.5rem; + font-weight: 700; + margin-bottom: 1rem; + color: #ffffff; + text-shadow: 0 2px 3px rgba(0, 0, 0, 0.2); + transition: all 0.3s ease; +} + +.card:hover h3 { + transform: translateY(-2px); + text-shadow: 0 3px 5px rgba(0, 0, 0, 0.3); +} + +.card p { + color: rgba(255, 255, 255, 0.9); + font-size: 1rem; + line-height: 1.6; + margin-bottom: 0; +} + +/* Light Mode Card Styles */ +.light .card { + background: var(--glass-card-light); + border: 1px solid rgba(0, 0, 0, 0.07); + box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1); +} + +.light .card::before { + background: linear-gradient(to bottom, + rgba(179, 143, 255, 0.03) 0%, + rgba(179, 143, 255, 0) 100%); +} + +.light .card:hover { + border: 1px solid rgba(0, 0, 0, 0.15); + box-shadow: 0 15px 35px rgba(0, 0, 0, 0.15); +} + +.light .card h3 { + color: #1a202c; + text-shadow: none; +} + +.light .card p { + color: rgba(26, 32, 44, 0.9); +} + +/* Verbesserte Feature-Card Variante */ +.feature-card { + padding: 2rem; + border-radius: 1.5rem; + background: var(--glass-card-dark); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border: 1px solid rgba(255, 255, 255, 0.15); + box-shadow: 0 12px 36px rgba(0, 0, 0, 0.3); + transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); + height: 100%; + display: flex; + flex-direction: column; + position: relative; + overflow: hidden; + z-index: 1; +} + +.feature-card::before { + content: ''; + position: absolute; + width: 150%; + height: 150%; + background: radial-gradient( + circle at top right, + rgba(179, 143, 255, 0.15), + transparent 70% + ); + top: -25%; + right: -25%; + z-index: -1; + opacity: 0; + transition: opacity 0.4s ease; +} + +.feature-card:hover { + transform: translateY(-7px) scale(1.02); + box-shadow: 0 20px 48px rgba(0, 0, 0, 0.4); + border: 1px solid rgba(255, 255, 255, 0.25); +} + +.feature-card:hover::before { + opacity: 1; +} + +.feature-card .icon { + font-size: 2.75rem; + margin-bottom: 1.25rem; + background: linear-gradient(135deg, #b38fff, #58a9ff); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + filter: drop-shadow(0 0 10px rgba(179, 143, 255, 0.6)); + transition: all 0.3s ease; +} + +.feature-card:hover .icon { + transform: scale(1.1) translateY(-3px); + filter: drop-shadow(0 0 15px rgba(179, 143, 255, 0.8)); +} + +.feature-card h3 { + font-size: 1.75rem; + font-weight: 700; + margin-bottom: 0.9rem; + color: #ffffff; + text-shadow: 0 2px 3px rgba(0, 0, 0, 0.3); + letter-spacing: 0.2px; + transition: all 0.3s ease; +} + +.feature-card:hover h3 { + transform: translateY(-2px); +} + +.feature-card p { + color: rgba(255, 255, 255, 0.95); + font-size: 1.1rem; + line-height: 1.6; + font-weight: 400; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25); + letter-spacing: 0.3px; +} + +/* Light Mode Anpassungen für Feature-Cards */ +.light .feature-card { + background: var(--glass-card-light); + border: 1px solid rgba(0, 0, 0, 0.08); + color: #1a202c; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12); +} + +.light .feature-card:hover { + box-shadow: 0 16px 40px rgba(0, 0, 0, 0.15); +} + +.light .feature-card h3 { + color: #1a202c; + text-shadow: none; +} + +.light .feature-card p { + color: rgba(26, 32, 44, 0.9); + text-shadow: none; } /* Stilvolle Farbverläufe für Akzente */ .gradient-text { - background: linear-gradient(135deg, var(--primary-bright), var(--accent-bright)); + background: linear-gradient(135deg, rgba(200, 170, 255, 1), rgba(100, 180, 255, 1)); -webkit-background-clip: text; background-clip: text; color: transparent; - text-shadow: 0 0 10px rgba(154, 125, 255, 0.3); + font-weight: 700; + letter-spacing: -0.02em; + text-shadow: 0 2px 10px rgba(179, 143, 255, 0.3); + filter: drop-shadow(0 2px 6px rgba(179, 143, 255, 0.3)); } .gradient-bg { @@ -337,157 +612,6 @@ a:hover { border-color: var(--accent-color); } -/* Verbesserte Card-Komponenten mit Glassmorphismus */ -.card { - background: rgba(30, 30, 46, 0.7); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); - border-radius: 16px; - border: 1px solid rgba(72, 71, 138, 0.2); - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); - margin-bottom: 1.5rem; - position: relative; - overflow: hidden; - transition: all 0.3s ease; -} - -.card::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient( - 135deg, - rgba(255, 255, 255, 0.1) 0%, - rgba(255, 255, 255, 0.05) 20%, - rgba(0, 0, 0, 0) 80% - ); - z-index: 0; - pointer-events: none; -} - -.card:hover { - transform: translateY(-5px); - box-shadow: 0 15px 30px rgba(0, 0, 0, 0.4), 0 0 20px rgba(154, 125, 255, 0.2); - border-color: rgba(154, 125, 255, 0.3); -} - -.card:hover::before { - opacity: 0.7; -} - -.card-header { - background: rgba(20, 20, 40, 0.5); - border-bottom: 1px solid rgba(72, 71, 138, 0.2); - padding: 1rem 1.5rem; - position: relative; - border-radius: 16px 16px 0 0; - font-weight: 600; -} - -.card-header::after { - content: ''; - position: absolute; - left: 0; - bottom: 0; - height: 1px; - width: 100%; - background: linear-gradient( - to right, - rgba(154, 125, 255, 0.2), - rgba(76, 223, 255, 0.2) - ); -} - -.card-header h5 { - margin: 0; - font-size: 1.25rem; - font-weight: 600; - color: var(--light-color); - display: flex; - align-items: center; -} - -.card-body { - position: relative; - z-index: 1; - padding: 1.5rem; - color: rgba(233, 233, 240, 0.9); -} - -.card-footer { - background: rgba(20, 20, 40, 0.5); - border-top: 1px solid rgba(72, 71, 138, 0.2); - padding: 1rem 1.5rem; - position: relative; - border-radius: 0 0 16px 16px; - color: rgba(233, 233, 240, 0.7); -} - -/* Feature cards auf der Homepage - Verbessertes Design */ -.feature-card { - background: rgba(30, 30, 46, 0.5); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); - border-radius: 20px; - border: 1px solid rgba(72, 71, 138, 0.2); - padding: 2rem; - text-align: center; - transition: all 0.3s ease; - height: 100%; - position: relative; - overflow: hidden; -} - -.feature-card::before { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: linear-gradient( - 135deg, - rgba(255, 255, 255, 0.05) 0%, - rgba(255, 255, 255, 0.02) 20%, - rgba(0, 0, 0, 0) 80% - ); - z-index: 0; - pointer-events: none; -} - -.feature-card:hover { - transform: translateY(-8px); - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3), 0 0 25px rgba(154, 125, 255, 0.2); - border-color: rgba(154, 125, 255, 0.3); -} - -.feature-card .icon { - font-size: 3rem; - margin-bottom: 1.5rem; - display: inline-block; - color: var(--primary-bright); - text-shadow: 0 0 15px rgba(154, 125, 255, 0.5); -} - -.feature-card h3 { - font-size: 1.5rem; - margin-bottom: 1rem; - position: relative; - z-index: 1; - color: white; -} - -.feature-card p { - color: rgba(233, 233, 240, 0.9); - font-size: 1rem; - line-height: 1.6; - position: relative; - z-index: 1; -} - /* Glass-effect für UI-Komponenten */ .glass-effect { background: rgba(30, 30, 46, 0.5); diff --git a/website/static/network-background.js b/website/static/network-background.js index 2a8645b..9f615a0 100644 --- a/website/static/network-background.js +++ b/website/static/network-background.js @@ -1,14 +1,16 @@ // Animated Network Background let canvas, ctx, networkImage; let isImageLoaded = false; -let animationSpeed = 0.0005; // Speed of rotation -let scaleSpeed = 0.0002; // Speed of scaling -let opacitySpeed = 0.0003; // Speed of opacity change +let animationSpeed = 0.0003; // Reduzierte Geschwindigkeit für sanftere Rotation +let scaleSpeed = 0.0001; // Reduzierte Geschwindigkeit für sanftere Skalierung +let opacitySpeed = 0.0002; // Reduzierte Geschwindigkeit für sanftere Opazitätsänderung let rotation = 0; let scale = 1; -let opacity = 0.6; +let opacity = 0.7; // Höhere Basisopazität für bessere Sichtbarkeit let scaleDirection = 1; let opacityDirection = 1; +let animationFrameId = null; +let isDarkMode = document.documentElement.classList.contains('dark'); // Initialize the canvas and load the image function initNetworkBackground() { @@ -21,69 +23,108 @@ function initNetworkBackground() { canvas.style.left = '0'; canvas.style.width = '100%'; canvas.style.height = '100%'; - canvas.style.zIndex = '-1'; + canvas.style.zIndex = '-5'; // Höher als -10 für den full-page-bg + canvas.style.pointerEvents = 'none'; // Stellt sicher, dass der Canvas keine Mausinteraktionen blockiert document.body.appendChild(canvas); } else { canvas = document.getElementById('network-background'); } - // Set canvas size to window size + // Set canvas size to window size with pixel ratio consideration resizeCanvas(); - // Get context - ctx = canvas.getContext('2d'); + // Get context with alpha enabled + ctx = canvas.getContext('2d', { alpha: true }); // Load the network image networkImage = new Image(); + networkImage.crossOrigin = "anonymous"; // Vermeidet CORS-Probleme networkImage.src = '/static/network-bg.jpg'; + + // Fallback auf lokalen Pfad, falls der absolute Pfad fehlschlägt + networkImage.onerror = function() { + networkImage.src = 'static/network-bg.jpg'; + }; + networkImage.onload = function() { isImageLoaded = true; - animate(); + startAnimation(); }; // Handle window resize - window.addEventListener('resize', resizeCanvas); + window.addEventListener('resize', debounce(resizeCanvas, 250)); + + // Überwache Dark Mode-Änderungen + document.addEventListener('darkModeToggled', function(event) { + isDarkMode = event.detail.isDark; + }); } -// Resize canvas to match window size +// Hilfsfunktion zur Reduzierung der Resize-Event-Aufrufe +function debounce(func, wait) { + let timeout; + return function() { + const context = this; + const args = arguments; + clearTimeout(timeout); + timeout = setTimeout(function() { + func.apply(context, args); + }, wait); + }; +} + +// Resize canvas to match window size with proper pixel ratio function resizeCanvas() { - if (canvas) { - canvas.width = window.innerWidth; - canvas.height = window.innerHeight; + if (!canvas) return; + + const pixelRatio = window.devicePixelRatio || 1; + const width = window.innerWidth; + const height = window.innerHeight; + + // Set display size (css pixels) + canvas.style.width = width + 'px'; + canvas.style.height = height + 'px'; + + // Set actual size in memory (scaled for pixel ratio) + canvas.width = width * pixelRatio; + canvas.height = height * pixelRatio; + + // Scale context to match pixel ratio + if (ctx) { + ctx.scale(pixelRatio, pixelRatio); + } + + // Wenn Animation läuft und Bild geladen, zeichne erneut + if (isImageLoaded && animationFrameId) { + drawNetworkImage(); } } -// Animation loop -function animate() { +// Start animation +function startAnimation() { if (!isImageLoaded) return; - // Clear canvas - ctx.clearRect(0, 0, canvas.width, canvas.height); - - // Update animation parameters - rotation += animationSpeed; - - // Update scale with oscillation - scale += scaleSpeed * scaleDirection; - if (scale > 1.1) { - scaleDirection = -1; - } else if (scale < 0.9) { - scaleDirection = 1; + // Cancel any existing animation + if (animationFrameId) { + cancelAnimationFrame(animationFrameId); } - // Update opacity with oscillation - opacity += opacitySpeed * opacityDirection; - if (opacity > 0.8) { - opacityDirection = -1; - } else if (opacity < 0.5) { - opacityDirection = 1; - } + // Start animation loop + animate(); +} + +// Draw network image +function drawNetworkImage() { + if (!isImageLoaded || !ctx) return; + + // Clear canvas with proper clear method + ctx.clearRect(0, 0, canvas.width / (window.devicePixelRatio || 1), canvas.height / (window.devicePixelRatio || 1)); // Save context state ctx.save(); // Move to center of canvas - ctx.translate(canvas.width / 2, canvas.height / 2); + ctx.translate(canvas.width / (2 * (window.devicePixelRatio || 1)), canvas.height / (2 * (window.devicePixelRatio || 1))); // Rotate ctx.rotate(rotation); @@ -91,28 +132,84 @@ function animate() { // Scale ctx.scale(scale, scale); - // Set global opacity - ctx.globalAlpha = opacity; + // Set global opacity, angepasst für Dark Mode + ctx.globalAlpha = isDarkMode ? opacity : opacity * 0.8; + + // Bildgröße berechnen, um den Bildschirm abzudecken + const imgAspect = networkImage.width / networkImage.height; + const canvasAspect = canvas.width / canvas.height; + + let drawWidth, drawHeight; + + if (canvasAspect > imgAspect) { + drawWidth = canvas.width / (window.devicePixelRatio || 1); + drawHeight = drawWidth / imgAspect; + } else { + drawHeight = canvas.height / (window.devicePixelRatio || 1); + drawWidth = drawHeight * imgAspect; + } // Draw image centered ctx.drawImage( networkImage, - -networkImage.width / 2, - -networkImage.height / 2, - networkImage.width, - networkImage.height + -drawWidth / 2, + -drawHeight / 2, + drawWidth, + drawHeight ); // Restore context state ctx.restore(); - - // Request next frame - requestAnimationFrame(animate); } -// Initialize background when the DOM is loaded +// Animation loop +function animate() { + // Update animation parameters + rotation += animationSpeed; + + // Update scale with oscillation + scale += scaleSpeed * scaleDirection; + if (scale > 1.05) { // Kleinerer Skalierungsbereich für weniger starke Größenänderung + scaleDirection = -1; + } else if (scale < 0.95) { + scaleDirection = 1; + } + + // Update opacity with oscillation + opacity += opacitySpeed * opacityDirection; + if (opacity > 0.75) { // Kleinerer Opazitätsbereich für subtilere Änderungen + opacityDirection = -1; + } else if (opacity < 0.65) { + opacityDirection = 1; + } + + // Draw the image + drawNetworkImage(); + + // Request next frame + animationFrameId = requestAnimationFrame(animate); +} + +// Cleanup Funktion für Speicherbereinigung +function cleanupNetworkBackground() { + if (animationFrameId) { + cancelAnimationFrame(animationFrameId); + animationFrameId = null; + } + + if (canvas && canvas.parentNode) { + canvas.parentNode.removeChild(canvas); + } + + window.removeEventListener('resize', resizeCanvas); +} + +// Führe Initialisierung aus, wenn DOM geladen ist if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initNetworkBackground); } else { initNetworkBackground(); -} \ No newline at end of file +} + +// Führe Cleanup durch, wenn das Fenster geschlossen wird +window.addEventListener('beforeunload', cleanupNetworkBackground); \ No newline at end of file diff --git a/website/static/network-bg.jpg b/website/static/network-bg.jpg index 778ca49..71ca67d 100644 --- a/website/static/network-bg.jpg +++ b/website/static/network-bg.jpg @@ -1,2 +1,5 @@ -/* This is a placeholder for the network background image. - The actual image (d2efd014-1325-471f-b9a7-90d025eb81d6.png) should be copied here. */ \ No newline at end of file +/* Dies ist ein Platzhalter für das Netzwerk-Hintergrundbild. + Das eigentliche Bild sollte hier durch eine echte JPG-Datei ersetzt werden. + + Empfohlene Bildgröße: mindestens 1920x1080px + Optimaler Stil: Dunkler Hintergrund mit abstrakten Verbindungslinien und Punkten */ \ No newline at end of file diff --git a/website/templates/base.html b/website/templates/base.html index 0f32aa5..2156962 100644 --- a/website/templates/base.html +++ b/website/templates/base.html @@ -114,9 +114,12 @@ --light-card-bg: rgba(255, 255, 255, 0.85); --accent-color: #b38fff; --accent-gradient: linear-gradient(135deg, #b38fff, #58a9ff); + --accent-gradient-hover: linear-gradient(135deg, #c7a8ff, #70b5ff); --blur-amount: 20px; - --border-radius: 24px; - --button-radius: 16px; + --border-radius: 28px; + --card-border-radius: 24px; + --button-radius: 18px; + --nav-item-radius: 14px; } /* Dark Mode Einstellungen */ @@ -134,11 +137,12 @@ padding: 0; font-family: 'Inter', system-ui, -apple-system, sans-serif; overflow-x: hidden; + transition: background-color 0.5s ease, color 0.5s ease; } /* Sicherstellen, dass der dunkle Hintergrund die gesamte Seite abdeckt */ #app-container, .container, main, .mx-auto, .py-12, #content-wrapper { - background-color: var(--dark-bg) !important; + background-color: transparent !important; width: 100%; } @@ -148,13 +152,30 @@ color: #1a202c; } + /* Große Headings mit verbesserten Stilen */ + h1.hero-heading { + font-size: clamp(2.5rem, 8vw, 5rem); + line-height: 1.1; + font-weight: 800; + letter-spacing: -0.03em; + margin-bottom: 1.5rem; + } + + h2.section-heading { + font-size: clamp(1.75rem, 5vw, 3rem); + line-height: 1.2; + font-weight: 700; + letter-spacing: -0.02em; + margin-bottom: 1.25rem; + } + /* Verbesserte Glasmorphismus-Stile */ .glass-morphism { background: var(--dark-card-bg); backdrop-filter: blur(var(--blur-amount)); -webkit-backdrop-filter: blur(var(--blur-amount)); border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: var(--border-radius); + border-radius: var(--card-border-radius); box-shadow: 0 12px 36px rgba(0, 0, 0, 0.35); transition: all 0.3s ease; } @@ -170,7 +191,7 @@ backdrop-filter: blur(var(--blur-amount)); -webkit-backdrop-filter: blur(var(--blur-amount)); border: 1px solid rgba(0, 0, 0, 0.08); - border-radius: var(--border-radius); + border-radius: var(--card-border-radius); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12); transition: all 0.3s ease; } @@ -181,26 +202,46 @@ transform: translateY(-2px); } - /* Verbesserte Button-Stile mit besserer Lesbarkeit */ + /* Verbesserte Navbar-Styles */ + .glass-navbar-dark { + background: rgba(14, 18, 32, 0.85); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border-color: rgba(255, 255, 255, 0.1); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25); + border-radius: 0 0 20px 20px; + } + + .glass-navbar-light { + background: rgba(255, 255, 255, 0.85); + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + border-color: rgba(0, 0, 0, 0.05); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.08); + border-radius: 0 0 20px 20px; + } + + /* Verbesserte Button-Stile mit besserer Lesbarkeit und stärkeren Farbverläufen */ .btn, button, .button, [type="button"], [type="submit"] { - transition: all 0.25s ease; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); border-radius: var(--button-radius); padding: 0.75rem 1.5rem; font-weight: 600; letter-spacing: 0.4px; color: rgba(255, 255, 255, 1); - background: rgba(80, 90, 130, 0.8); - border: 1px solid rgba(255, 255, 255, 0.18); + background: linear-gradient(135deg, rgba(99, 102, 241, 0.8), rgba(168, 85, 247, 0.8)); + border: 1px solid rgba(255, 255, 255, 0.15); box-shadow: 0 6px 14px rgba(0, 0, 0, 0.2); text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); backdrop-filter: blur(15px); -webkit-backdrop-filter: blur(15px); position: relative; overflow: hidden; + outline: none; } .btn:hover, button:hover, .button:hover, [type="button"]:hover, [type="submit"]:hover { - background: rgba(179, 143, 255, 0.65); + background: linear-gradient(135deg, rgba(129, 140, 248, 0.9), rgba(192, 132, 252, 0.9)); transform: translateY(-3px); border: 1px solid rgba(255, 255, 255, 0.3); box-shadow: 0 8px 22px rgba(0, 0, 0, 0.25), 0 0 12px rgba(179, 143, 255, 0.35); @@ -212,19 +253,16 @@ box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2); } - /* Navigation Stile */ + /* Navigation Stile mit verbesserten Farbverläufen */ .nav-link { transition: all 0.25s ease; - border-radius: var(--border-radius); - padding: 10px 18px; + border-radius: var(--nav-item-radius); + padding: 0.625rem 1rem; font-weight: 500; letter-spacing: 0.3px; color: rgba(255, 255, 255, 0.9); - backdrop-filter: blur(var(--blur-amount)); - -webkit-backdrop-filter: blur(var(--blur-amount)); position: relative; overflow: visible; - height: 40px !important; } .nav-link:hover { @@ -234,14 +272,14 @@ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } - .nav-link.active { - background: rgba(179, 143, 255, 0.3); + .nav-link-active { + background: linear-gradient(135deg, rgba(124, 58, 237, 0.3), rgba(139, 92, 246, 0.3)); color: white; font-weight: 600; box-shadow: 0 6px 16px rgba(0, 0, 0, 0.18); } - .nav-link.active::after { + .nav-link-active::after { content: ''; position: absolute; bottom: 0; @@ -253,7 +291,7 @@ /* Light-Mode Navigation Stile */ .nav-link-light { - color: rgba(26, 32, 44, 0.9); + color: rgba(26, 32, 44, 0.85); } .nav-link-light:hover { @@ -262,14 +300,14 @@ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); } - .nav-link-light.active { - background: rgba(179, 143, 255, 0.2); + .nav-link-light-active { + background: linear-gradient(135deg, rgba(124, 58, 237, 0.2), rgba(139, 92, 246, 0.2)); color: rgba(26, 32, 44, 1); font-weight: 600; box-shadow: 0 6px 16px rgba(0, 0, 0, 0.1); } - .nav-link-light.active::after { + .nav-link-light-active::after { background: linear-gradient(90deg, transparent, rgba(26, 32, 44, 0.5), transparent); } @@ -282,8 +320,8 @@ /* Verbesserte Light-Mode-Stile für Buttons */ html.light .btn, html.light button, html.light .button, html.light [type="button"], html.light [type="submit"] { - background: rgba(255, 255, 255, 0.85); - color: #1a202c; + background: linear-gradient(135deg, rgba(124, 58, 237, 0.7), rgba(139, 92, 246, 0.7)); + color: #ffffff; border: 1px solid rgba(0, 0, 0, 0.1); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); text-shadow: none; @@ -291,7 +329,7 @@ html.light .btn:hover, html.light button:hover, html.light .button:hover, html.light [type="button"]:hover, html.light [type="submit"]:hover { - background: rgba(179, 143, 255, 0.85); + background: linear-gradient(135deg, rgba(139, 92, 246, 0.85), rgba(168, 85, 247, 0.85)); color: #ffffff; border: 1px solid rgba(0, 0, 0, 0.08); box-shadow: 0 8px 22px rgba(0, 0, 0, 0.12), 0 0 12px rgba(179, 143, 255, 0.2); @@ -344,7 +382,7 @@ background: rgba(32, 36, 55, 0.8); color: rgba(255, 255, 255, 0.9); border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 12px; + border-radius: 14px; font-size: 0.875rem; font-weight: 500; transition: all 0.25s ease; @@ -361,84 +399,14 @@ /* Verbesserter Farbverlauf-Text */ .gradient-text { - background: var(--accent-gradient); + background: linear-gradient(135deg, rgba(200, 170, 255, 1), rgba(100, 180, 255, 1)); -webkit-background-clip: text; background-clip: text; color: transparent; font-weight: 700; letter-spacing: -0.02em; - } - - /* Kartenstil für Feature-Cards */ - .feature-card { - background: rgba(24, 28, 45, 0.8); - backdrop-filter: blur(20px); - -webkit-backdrop-filter: blur(20px); - border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 24px; - box-shadow: 0 12px 36px rgba(0, 0, 0, 0.35); - transition: all 0.3s ease; - padding: 1.75rem; - height: 100%; - display: flex; - flex-direction: column; - } - - .feature-card:hover { - transform: translateY(-5px); - border: 1px solid rgba(255, 255, 255, 0.2); - box-shadow: 0 20px 48px rgba(0, 0, 0, 0.45); - background: rgba(32, 36, 55, 0.9); - } - - .feature-card .icon { - font-size: 2.75rem; - margin-bottom: 1.25rem; - background: linear-gradient(135deg, #b38fff, #58a9ff); - -webkit-background-clip: text; - background-clip: text; - color: transparent; - filter: drop-shadow(0 0 10px rgba(179, 143, 255, 0.6)); - } - - .feature-card h3 { - font-size: 1.75rem; - font-weight: 700; - margin-bottom: 0.9rem; - color: #ffffff; - text-shadow: 0 2px 3px rgba(0, 0, 0, 0.3); - letter-spacing: 0.2px; - } - - .feature-card p { - color: rgba(255, 255, 255, 0.95); - font-size: 1.1rem; - line-height: 1.6; - font-weight: 400; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25); - letter-spacing: 0.3px; - } - - /* Light Mode Anpassungen für Feature-Cards */ - html.light .feature-card { - background: rgba(255, 255, 255, 0.85); - border: 1px solid rgba(0, 0, 0, 0.08); - color: #1a202c; - box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12); - } - - html.light .feature-card:hover { - box-shadow: 0 16px 40px rgba(0, 0, 0, 0.15); - } - - html.light .feature-card h3 { - color: #1a202c; - text-shadow: none; - } - - html.light .feature-card p { - color: rgba(26, 32, 44, 0.9); - text-shadow: none; + text-shadow: 0 2px 10px rgba(179, 143, 255, 0.3); + filter: drop-shadow(0 2px 6px rgba(179, 143, 255, 0.3)); } /* Globaler Hintergrund */ @@ -484,16 +452,84 @@ padding: 2rem 1rem; } + /* Dark Mode Toggle Stile */ .dot { transform: translateX(0); transition: transform 0.3s ease-in-out, background-color 0.3s ease; } + input:checked ~ .dot { transform: translateX(100%); - background-color: #b38fff; /* Angepasst an Farbschema */ + background-color: #58a9ff; } + input:checked ~ .block { - background-color: rgba(179, 143, 255, 0.4); /* Angepasst an Farbschema */ + background-color: rgba(88, 169, 255, 0.4); + } + + /* Feature Cards mit Glasmorphismus und Farbverlauf */ + .feature-card { + border-radius: var(--card-border-radius); + padding: 2rem; + transition: all 0.3s ease; + background: linear-gradient(145deg, rgba(32, 36, 55, 0.7), rgba(24, 28, 45, 0.9)); + backdrop-filter: blur(var(--blur-amount)); + -webkit-backdrop-filter: blur(var(--blur-amount)); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2); + } + + .feature-card:hover { + transform: translateY(-5px); + box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3); + border: 1px solid rgba(255, 255, 255, 0.15); + background: linear-gradient(145deg, rgba(40, 44, 65, 0.8), rgba(28, 32, 50, 0.95)); + } + + html.light .feature-card { + background: linear-gradient(145deg, rgba(255, 255, 255, 0.8), rgba(240, 240, 250, 0.9)); + border: 1px solid rgba(0, 0, 0, 0.05); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); + } + + html.light .feature-card:hover { + background: linear-gradient(145deg, rgba(255, 255, 255, 0.9), rgba(245, 245, 255, 0.95)); + border: 1px solid rgba(0, 0, 0, 0.08); + box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12); + } + + .feature-card .icon { + width: 60px; + height: 60px; + border-radius: 18px; + display: flex; + align-items: center; + justify-content: center; + font-size: 1.5rem; + margin-bottom: 1.25rem; + background: linear-gradient(135deg, rgba(124, 58, 237, 0.8), rgba(139, 92, 246, 0.6)); + color: white; + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15); + } + + .feature-card h3 { + font-size: 1.25rem; + font-weight: 600; + margin-bottom: 0.75rem; + color: rgba(255, 255, 255, 0.95); + } + + html.light .feature-card h3 { + color: rgba(26, 32, 44, 0.95); + } + + .feature-card p { + color: rgba(255, 255, 255, 0.75); + line-height: 1.6; + } + + html.light .feature-card p { + color: rgba(26, 32, 44, 0.75); } @@ -503,203 +539,228 @@
+ +