diff --git a/backend/build-optimized.bat b/backend/build-optimized.bat new file mode 100644 index 00000000..b4ef0c36 --- /dev/null +++ b/backend/build-optimized.bat @@ -0,0 +1,40 @@ +@echo off +echo Building optimized CSS for Raspberry Pi... + +REM Ensure output directory exists +if not exist "static\css\dist" mkdir "static\css\dist" + +REM Build Tailwind CSS with optimizations +call npx tailwindcss -c tailwind.config.optimized.js -i static/css/input.css -o static/css/dist/output-optimized.css --minify + +REM Combine optimized CSS files +echo /* MYP Platform Optimized CSS for Raspberry Pi */ > static\css\dist\combined-optimized.css +echo /* Generated on %date% %time% */ >> static\css\dist\combined-optimized.css +echo. >> static\css\dist\combined-optimized.css + +REM Add Tailwind output +type static\css\dist\output-optimized.css >> static\css\dist\combined-optimized.css +echo. >> static\css\dist\combined-optimized.css + +REM Add optimized component styles +echo /* Glassmorphism Optimized */ >> static\css\dist\combined-optimized.css +type static\css\glassmorphism-optimized.css >> static\css\dist\combined-optimized.css +echo. >> static\css\dist\combined-optimized.css + +echo /* Professional Theme Optimized */ >> static\css\dist\combined-optimized.css +type static\css\professional-theme-optimized.css >> static\css\dist\combined-optimized.css +echo. >> static\css\dist\combined-optimized.css + +echo /* Components Optimized */ >> static\css\dist\combined-optimized.css +type static\css\components-optimized.css >> static\css\dist\combined-optimized.css +echo. >> static\css\dist\combined-optimized.css + +echo /* Animations Disabled */ >> static\css\dist\combined-optimized.css +type static\css\animations-optimized.css >> static\css\dist\combined-optimized.css + +REM Minify the combined file +call npx cssnano static\css\dist\combined-optimized.css static\css\dist\combined-optimized.min.css + +echo Build complete! Optimized CSS saved to static\css\dist\combined-optimized.min.css +echo File size comparison: +dir static\css\dist\output.css static\css\dist\combined-optimized.min.css 2>nul || echo Original file not found for comparison \ No newline at end of file diff --git a/backend/build-optimized.sh b/backend/build-optimized.sh new file mode 100644 index 00000000..c66278c1 --- /dev/null +++ b/backend/build-optimized.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Build optimized CSS for Raspberry Pi deployment +echo "Building optimized CSS for Raspberry Pi..." + +# Ensure output directory exists +mkdir -p static/css/dist + +# Build Tailwind CSS with optimizations +npx tailwindcss -c tailwind.config.optimized.js -i static/css/input.css -o static/css/dist/output-optimized.css --minify + +# Combine optimized CSS files +echo "/* MYP Platform Optimized CSS for Raspberry Pi */" > static/css/dist/combined-optimized.css +echo "/* Generated on $(date) */" >> static/css/dist/combined-optimized.css +echo "" >> static/css/dist/combined-optimized.css + +# Add Tailwind output +cat static/css/dist/output-optimized.css >> static/css/dist/combined-optimized.css +echo "" >> static/css/dist/combined-optimized.css + +# Add optimized component styles +echo "/* Glassmorphism Optimized */" >> static/css/dist/combined-optimized.css +cat static/css/glassmorphism-optimized.css >> static/css/dist/combined-optimized.css +echo "" >> static/css/dist/combined-optimized.css + +echo "/* Professional Theme Optimized */" >> static/css/dist/combined-optimized.css +cat static/css/professional-theme-optimized.css >> static/css/dist/combined-optimized.css +echo "" >> static/css/dist/combined-optimized.css + +echo "/* Components Optimized */" >> static/css/dist/combined-optimized.css +cat static/css/components-optimized.css >> static/css/dist/combined-optimized.css +echo "" >> static/css/dist/combined-optimized.css + +echo "/* Animations Disabled */" >> static/css/dist/combined-optimized.css +cat static/css/animations-optimized.css >> static/css/dist/combined-optimized.css + +# Minify the combined file +npx cssnano static/css/dist/combined-optimized.css static/css/dist/combined-optimized.min.css + +echo "Build complete! Optimized CSS saved to static/css/dist/combined-optimized.min.css" +echo "File size comparison:" +ls -lh static/css/dist/output.css static/css/dist/combined-optimized.min.css 2>/dev/null || echo "Original file not found for comparison" \ No newline at end of file diff --git a/backend/logs/myp-install-debug.log b/backend/logs/myp-install-debug.log index 3d2769e7..45a31807 100644 --- a/backend/logs/myp-install-debug.log +++ b/backend/logs/myp-install-debug.log @@ -1,32 +1,68 @@ ================================================================= -MYP Installation DEBUG Log - 2025-06-03 13:38:42 +MYP Installation DEBUG Log - 2025-06-03 13:52:05 ================================================================= -[2025-06-03 13:38:42] DEBUG von setup.sh:449 +[2025-06-03 13:52:05] DEBUG von setup.sh:449 Debian erkannt über /etc/debian_version: 12.11 --- -[2025-06-03 13:38:42] DEBUG von setup.sh:517 +[2025-06-03 13:52:05] DEBUG von setup.sh:517 Kein Raspberry Pi erkannt. Hardware-Info: --- -[2025-06-03 13:38:42] DEBUG von setup.sh:518 +[2025-06-03 13:52:05] DEBUG von setup.sh:518 - Device Tree: nicht verfügbar --- -[2025-06-03 13:38:42] DEBUG von setup.sh:519 +[2025-06-03 13:52:05] DEBUG von setup.sh:519 - CPU Hardware: nicht verfügbar --- -[2025-06-03 13:38:42] DEBUG von setup.sh:559 +[2025-06-03 13:52:06] DEBUG von setup.sh:559 Vollständige Kernel-Info: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux --- -[2025-06-03 13:38:43] DEBUG von setup.sh:615 +[2025-06-03 13:52:06] DEBUG von setup.sh:615 DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup. --- -[2025-06-03 13:38:43] DEBUG von setup.sh:716 +[2025-06-03 13:52:06] DEBUG von setup.sh:716 Externe IP ermittelt über ifconfig.me: 163.116.178.31 --- +[2025-06-03 13:52:15] DEBUG von setup.sh:1221 +sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf +--- + +[2025-06-03 13:52:15] DEBUG von setup.sh:1330 +Überspringe system-weites sysctl -p (zu riskant) +--- + +[2025-06-03 13:52:15] DEBUG von setup.sh:1356 +systemd-networkd nicht aktiv - überspringe +--- + +[2025-06-03 13:52:15] DEBUG von setup.sh:1382 +NetworkManager nicht aktiv - überspringe +--- + +[2025-06-03 13:52:15] DEBUG von setup.sh:1388 +IPv6 Einträge in /etc/hosts auskommentiert +--- + +[2025-06-03 13:52:15] DEBUG von setup.sh:1404 +Alternative sysctl-Anwendung: +--- + +[2025-06-03 13:52:15] DEBUG von setup.sh:1405 + - Manuell: sysctl -p /etc/sysctl.d/99-myp-security.conf +--- + +[2025-06-03 13:52:15] DEBUG von setup.sh:1406 + - Automatisch: Beim nächsten Neustart aktiv +--- + +[2025-06-03 13:52:15] DEBUG von setup.sh:1407 + - Verifikation: sysctl net.ipv6.conf.all.disable_ipv6 +--- + diff --git a/backend/logs/myp-install-errors.log b/backend/logs/myp-install-errors.log index 6114614a..b6f65a1b 100644 --- a/backend/logs/myp-install-errors.log +++ b/backend/logs/myp-install-errors.log @@ -1,4 +1,4 @@ ================================================================= -MYP Installation FEHLER Log - 2025-06-03 13:38:42 +MYP Installation FEHLER Log - 2025-06-03 13:52:05 ================================================================= diff --git a/backend/logs/myp-install-warnings.log b/backend/logs/myp-install-warnings.log new file mode 100644 index 00000000..fc795d6e --- /dev/null +++ b/backend/logs/myp-install-warnings.log @@ -0,0 +1,4 @@ +================================================================= +MYP Installation WARNUNGEN Log - 2025-06-03 13:52:05 +================================================================= + diff --git a/backend/logs/myp-install.log b/backend/logs/myp-install.log new file mode 100644 index 00000000..46008943 --- /dev/null +++ b/backend/logs/myp-install.log @@ -0,0 +1,140 @@ +================================================================= +MYP Installation Log - 2025-06-03 13:52:05 +Script Version: 4.1.0 +System: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux +================================================================= + +[2025-06-03 13:52:05] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN === +[2025-06-03 13:52:05] ✅ Root-Berechtigung bestätigt +[2025-06-03 13:52:05] === SYSTEM-RESSOURCEN PRÜFUNG === +[FORTSCHRITT] Prüfe RAM... +[FORTSCHRITT] Verfügbarer RAM: 24031MB +[ERFOLG] ✅ Ausreichend RAM verfügbar (24031MB) +[FORTSCHRITT] Prüfe Festplattenplatz... +[FORTSCHRITT] Verfügbarer Festplattenplatz: 12,5GB (12825MB) +[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (12,5GB) +[FORTSCHRITT] Prüfe CPU... +[FORTSCHRITT] CPU: 8 Kern(e) - 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz +[ERFOLG] ✅ CPU-Information erfolgreich ermittelt +[2025-06-03 13:52:05] ✅ System-Ressourcen-Prüfung abgeschlossen +[FORTSCHRITT] Prüfe Debian/Raspbian-System... +[DEBUG] Debian erkannt über /etc/debian_version: 12.11 +[2025-06-03 13:52:05] ✅ Debian/Raspbian-basiertes System erkannt (Version: 12.11) +[FORTSCHRITT] Prüfe Raspberry Pi Hardware... +[INFO] 💻 Standard-PC/Server System (kein Raspberry Pi) +[DEBUG] Kein Raspberry Pi erkannt. Hardware-Info: +[DEBUG] - Device Tree: nicht verfügbar +[DEBUG] - CPU Hardware: nicht verfügbar +[FORTSCHRITT] Prüfe System-Architektur... +[INFO] 📐 System-Architektur: x86_64 +[INFO] → 64-Bit x86 Architektur erkannt +[FORTSCHRITT] Prüfe Kernel-Version... +[INFO] 🐧 Kernel-Version: 6.1.0-37-amd64 +[DEBUG] Vollständige Kernel-Info: Linux raspberrypi 6.1.0-37-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64 GNU/Linux +[2025-06-03 13:52:06] ✅ System-Analyse abgeschlossen +[FORTSCHRITT] Prüfe Internetverbindung (erweiterte Methoden)... +[FORTSCHRITT] Teste DNS-Auflösung... +[DEBUG] DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup.  +[ERFOLG] ✅ Internetverbindung verfügbar +[INFO] 🔍 Erkannt via: DNS-Auflösung (nslookup: 8.8.8.8) +[FORTSCHRITT] Ermittle externe IP-Adresse... +[INFO] 🌐 Externe IP: 163.116.178.31 +[DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.178.31 +[2025-06-03 13:52:06] === KONFIGURIERE HOSTNAME === +[2025-06-03 13:52:06] ✅ Hostname bereits korrekt: 'raspberrypi' +[2025-06-03 13:52:06] ✅ Hostname-Auflösung funktioniert: raspberrypi -> 127.0.1.1 +[2025-06-03 13:52:06] === ROBUSTE SYSTEM-UPDATE === +[FORTSCHRITT] Konfiguriere APT für bessere Zuverlässigkeit... +[FORTSCHRITT] Validiere APT-Repositories... +[2025-06-03 13:52:06] ✅ Source-Repositories deaktiviert (nicht benötigt) +[FORTSCHRITT] Aktualisiere Paketlisten mit Retry... +[FORTSCHRITT] Führe System-Upgrade durch... +[FORTSCHRITT] Installiere essenzielle System-Tools... +[FORTSCHRITT] Installiere Pakete: ca-certificates +[FORTSCHRITT] Installiere Pakete: gnupg +[FORTSCHRITT] Installiere Pakete: curl +[FORTSCHRITT] Installiere Pakete: wget +[FORTSCHRITT] Installiere Pakete: git +[FORTSCHRITT] Installiere Pakete: nano +[FORTSCHRITT] Installiere Pakete: htop +[FORTSCHRITT] Installiere Pakete: rsync +[FORTSCHRITT] Installiere Pakete: unzip +[FORTSCHRITT] Installiere Pakete: sudo +[FORTSCHRITT] Installiere Pakete: systemd +[FORTSCHRITT] Installiere Pakete: lsb-release +[FORTSCHRITT] Installiere Pakete: apt-transport-https +[FORTSCHRITT] Installiere Pakete: software-properties-common +[FORTSCHRITT] Installiere Pakete: bc +[FORTSCHRITT] Installiere Pakete: dbus +[FORTSCHRITT] Installiere Pakete: systemd-timesyncd +[FORTSCHRITT] Synchronisiere Systemzeit... +[2025-06-03 13:52:15] ✅ Robustes System-Update abgeschlossen +[2025-06-03 13:52:15] === KONFIGURIERE ROBUSTE NETZWERK-SICHERHEIT === +[FORTSCHRITT] Deaktiviere IPv6 (robust)... +[FORTSCHRITT] Deaktiviere IPv6 in GRUB... +[INFO] IPv6 bereits in GRUB deaktiviert +[FORTSCHRITT] Erstelle robuste sysctl-Konfiguration... +[ERFOLG] ✅ Basis-sysctl-Konfiguration erstellt +[DEBUG] sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf +[FORTSCHRITT] Wende sysctl-Einstellungen an (non-blocking)... +[FORTSCHRITT] Versuche komplette sysctl-Datei anzuwenden... +[ERFOLG] ✅ MYP sysctl-Einstellungen erfolgreich angewendet +[DEBUG] Überspringe system-weites sysctl -p (zu riskant) +[FORTSCHRITT] Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)... +[DEBUG] systemd-networkd nicht aktiv - überspringe +[DEBUG] NetworkManager nicht aktiv - überspringe +[DEBUG] IPv6 Einträge in /etc/hosts auskommentiert +[2025-06-03 13:52:15] ✅ Robuste Netzwerk-Sicherheit konfiguriert: +[2025-06-03 13:52:15] 🚫 IPv6 Deaktivierung konfiguriert +[2025-06-03 13:52:15] 🛡️ Netzwerk-Sicherheitsregeln gesetzt +[2025-06-03 13:52:15] 🔒 Basis-Firewall-Schutz aktiviert +[2025-06-03 13:52:15] 📝 Sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf +[2025-06-03 13:52:15] 🔧 Netzwerk-Services entsprechend konfiguriert +[2025-06-03 13:52:15] ⚙️ Einstellungen werden beim nächsten Boot aktiv +[DEBUG] Alternative sysctl-Anwendung: +[DEBUG] - Manuell: sysctl -p /etc/sysctl.d/99-myp-security.conf +[DEBUG] - Automatisch: Beim nächsten Neustart aktiv +[DEBUG] - Verifikation: sysctl net.ipv6.conf.all.disable_ipv6 +[2025-06-03 13:52:15] === ROBUSTE PYTHON-INSTALLATION === +[FORTSCHRITT] Installiere Python 3 und Build-Abhängigkeiten... +[FORTSCHRITT] Installiere Pakete: python3 +[FORTSCHRITT] Installiere Pakete: python3-pip +[FORTSCHRITT] Installiere Pakete: python3-dev +[FORTSCHRITT] Installiere Pakete: python3-setuptools +[FORTSCHRITT] Installiere Pakete: python3-venv +[FORTSCHRITT] Installiere Pakete: python3-wheel +[FORTSCHRITT] Installiere Pakete: build-essential +[FORTSCHRITT] Installiere Pakete: libssl-dev +[FORTSCHRITT] Installiere Pakete: libffi-dev +[FORTSCHRITT] Installiere Pakete: libbz2-dev +[FORTSCHRITT] Installiere Pakete: libreadline-dev +[FORTSCHRITT] Installiere Pakete: libsqlite3-dev +[FORTSCHRITT] Installiere Pakete: libncurses5-dev +[FORTSCHRITT] Installiere Pakete: libncursesw5-dev +[FORTSCHRITT] Installiere Pakete: zlib1g-dev +[FORTSCHRITT] Installiere Pakete: sqlite3 +[FORTSCHRITT] Validiere Python-Installation... +[2025-06-03 13:52:22] ✅ Python Version: 3.11.2 +[FORTSCHRITT] Konfiguriere pip für bessere Zuverlässigkeit... +[FORTSCHRITT] Erstelle systemweite pip-Konfiguration... +[FORTSCHRITT] Konfiguriere pip für alle Benutzer... +[2025-06-03 13:52:22] ✅ pip konfiguriert für Benutzer: user +[FORTSCHRITT] Aktualisiere pip mit Retry... +[2025-06-03 13:52:23] ✅ pip Version: 25.1.1 +[2025-06-03 13:52:23] ✅ Robuste Python-Umgebung installiert +[2025-06-03 13:52:23] === ROBUSTE NODE.JS UND NPM INSTALLATION === +[FORTSCHRITT] Bereinige alte Node.js-Installationen... +[FORTSCHRITT] Installiere Node.js mit Fallback-Strategie... +[FORTSCHRITT] Verwende Debian Repository als Fallback... +[FORTSCHRITT] Installiere Pakete: nodejs npm +[2025-06-03 13:53:55] ✅ Node.js via Debian Repository installiert +[FORTSCHRITT] Validiere Node.js Installation... +[2025-06-03 13:53:55] ✅ Node.js Version: v18.19.0 +[2025-06-03 13:53:56] ✅ npm Version: 9.2.0 +[FORTSCHRITT] Optimiere npm-Konfiguration... +[2025-06-03 13:53:57] ✅ Node.js und npm erfolgreich installiert +[2025-06-03 13:53:57] === ROBUSTE SSL-ZERTIFIKATE KONFIGURATION === +[FORTSCHRITT] Installiere SSL-Grundkomponenten... +[FORTSCHRITT] Installiere Pakete: ca-certificates openssl +[FORTSCHRITT] Aktualisiere CA-Zertifikate... +[FORTSCHRITT] Installiere Mercedes Corporate Zertifikate (robust)... diff --git a/backend/setup.sh b/backend/setup.sh index 5848bb05..3fd27020 100644 --- a/backend/setup.sh +++ b/backend/setup.sh @@ -1248,43 +1248,87 @@ EOF debug "Raspberry Pi Optimierungen zur sysctl-Konfiguration hinzugefügt" fi - # Sysctl-Einstellungen vorsichtig anwenden - progress "Wende sysctl-Einstellungen an..." + # Sysctl-Einstellungen vorsichtig anwenden (non-blocking) + progress "Wende sysctl-Einstellungen an (non-blocking)..." - # Versuche sysctl-Einstellungen einzeln anzuwenden (robuster) - if sysctl -p >/dev/null 2>&1; then - success "✅ Alle sysctl-Einstellungen erfolgreich angewendet" - else - warning "⚠️ Einige sysctl-Einstellungen konnten nicht angewendet werden" - debug "sysctl -p Fehlerausgabe: $(sysctl -p 2>&1 || echo 'Befehl fehlgeschlagen')" + # Teste unsere spezielle sysctl-Datei zuerst (mit mehreren Fallbacks) + if [ -f "$myp_sysctl_file" ]; then + local sysctl_success=false - # Versuche kritische Einstellungen einzeln (IPv6 deaktivieren) - progress "Wende kritische Einstellungen einzeln an..." - - local critical_settings=( - "net.ipv6.conf.all.disable_ipv6=1" - "net.ipv6.conf.default.disable_ipv6=1" - "net.ipv4.ip_forward=0" - "net.ipv4.tcp_syncookies=1" - ) - - local applied_count=0 - for setting in "${critical_settings[@]}"; do - if sysctl -w "$setting" >/dev/null 2>&1; then - ((applied_count++)) - debug "Erfolgreich angewendet: $setting" - else - debug "Fehlgeschlagen: $setting" - fi - done - - if [ $applied_count -gt 0 ]; then - success "✅ $applied_count kritische sysctl-Einstellungen angewendet" + # Strategie 1: Komplette Datei mit Timeout anwenden + progress "Versuche komplette sysctl-Datei anzuwenden..." + if timeout 10 sysctl -p "$myp_sysctl_file" >/dev/null 2>&1; then + success "✅ MYP sysctl-Einstellungen erfolgreich angewendet" + sysctl_success=true else - warning "⚠️ Keine sysctl-Einstellungen konnten angewendet werden" + warning "⚠️ Komplette sysctl-Datei fehlgeschlagen" + debug "sysctl -p $myp_sysctl_file Fehlerausgabe: $(timeout 5 sysctl -p "$myp_sysctl_file" 2>&1 || echo 'Timeout oder Fehler')" fi + + # Strategie 2: Nur IPv6-Deaktivierung (kritisch) + if [ "$sysctl_success" = false ]; then + progress "Versuche nur IPv6-Deaktivierung..." + local ipv6_settings=( + "net.ipv6.conf.all.disable_ipv6=1" + "net.ipv6.conf.default.disable_ipv6=1" + ) + + local ipv6_applied=0 + for setting in "${ipv6_settings[@]}"; do + if timeout 3 sysctl -w "$setting" >/dev/null 2>&1; then + ((ipv6_applied++)) + debug "IPv6-Setting angewendet: $setting" + else + debug "IPv6-Setting fehlgeschlagen: $setting" + fi + done + + if [ $ipv6_applied -gt 0 ]; then + success "✅ IPv6-Deaktivierung teilweise erfolgreich ($ipv6_applied/2)" + sysctl_success=true + fi + fi + + # Strategie 3: Sicherheits-Grundeinstellungen + if [ "$sysctl_success" = false ]; then + progress "Versuche Basis-Sicherheitseinstellungen..." + local security_settings=( + "net.ipv4.ip_forward=0" + "net.ipv4.tcp_syncookies=1" + ) + + local security_applied=0 + for setting in "${security_settings[@]}"; do + if timeout 3 sysctl -w "$setting" >/dev/null 2>&1; then + ((security_applied++)) + debug "Sicherheits-Setting angewendet: $setting" + else + debug "Sicherheits-Setting fehlgeschlagen: $setting" + fi + done + + if [ $security_applied -gt 0 ]; then + success "✅ Basis-Sicherheitseinstellungen angewendet ($security_applied/2)" + sysctl_success=true + fi + fi + + # Strategie 4: Vollständig überspringen (Graceful Degradation) + if [ "$sysctl_success" = false ]; then + warning "⚠️ Alle sysctl-Anwendungen fehlgeschlagen" + warning "⚠️ Einstellungen werden beim nächsten Neustart automatisch aktiv" + info " 📁 Konfiguration verfügbar in: $myp_sysctl_file" + info " 🔧 Manuelle Anwendung: sudo sysctl -p $myp_sysctl_file" + debug "Sysctl komplett übersprungen - System läuft mit Standard-Einstellungen" + fi + else + warning "⚠️ MYP sysctl-Konfigurationsdatei nicht gefunden" + debug "Überspringe sysctl-Anwendung komplett" fi + # Niemals das System-weite sysctl -p ausführen (zu problematisch) + debug "Überspringe system-weites sysctl -p (zu riskant)" + # IPv6 in Netzwerk-Interfaces deaktivieren (robust) progress "Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)..." @@ -1347,14 +1391,20 @@ EOF fi fi - log "✅ Erweiterte Netzwerk-Sicherheit konfiguriert:" - log " 🚫 IPv6 vollständig deaktiviert" - log " 🛡️ IP-Spoofing-Schutz aktiviert" - log " 🔒 SYN-Flood-Schutz aktiviert" - log " 📝 Verdächtige Pakete werden geloggt" - log " 🚫 Paketweiterleitung deaktiviert" - log " ⚡ TCP-Performance optimiert" - log " 🔐 RFC-Compliance für TCP aktiviert" + # Abschließende Zusammenfassung + log "✅ Robuste Netzwerk-Sicherheit konfiguriert:" + log " 🚫 IPv6 Deaktivierung konfiguriert" + log " 🛡️ Netzwerk-Sicherheitsregeln gesetzt" + log " 🔒 Basis-Firewall-Schutz aktiviert" + log " 📝 Sysctl-Konfiguration erstellt: $myp_sysctl_file" + log " 🔧 Netzwerk-Services entsprechend konfiguriert" + log " ⚙️ Einstellungen werden beim nächsten Boot aktiv" + + # Alternative für sysctl-Probleme dokumentieren + debug "Alternative sysctl-Anwendung:" + debug " - Manuell: sysctl -p $myp_sysctl_file" + debug " - Automatisch: Beim nächsten Neustart aktiv" + debug " - Verifikation: sysctl net.ipv6.conf.all.disable_ipv6" } # =========================== DESKTOP-ENVIRONMENT ENTFERNUNG =========================== diff --git a/backend/static/css/animations-optimized.css b/backend/static/css/animations-optimized.css new file mode 100644 index 00000000..9d3a325b --- /dev/null +++ b/backend/static/css/animations-optimized.css @@ -0,0 +1,84 @@ +/** + * Optimized Animations for Raspberry Pi + * All animations removed for performance + */ + +/* Keine Animationen - alle entfernt */ + +/* Placeholder für Animation-Klassen ohne Effekte */ +.fade-in, +.fade-out, +.slide-up, +.slide-down, +.slide-left, +.slide-right, +.scale-in, +.scale-out, +.rotate-in, +.rotate-out, +.bounce, +.pulse, +.ping, +.spin, +.wiggle, +.swing, +.rubberBand, +.flash, +.shake, +.flip, +.zoom-in, +.zoom-out { + /* Keine Animation */ +} + +/* Keine Keyframes definiert */ + +/* Utility Classes ohne Effekte */ +.animate-none { animation: none !important; } +.animate-spin { /* Keine Animation */ } +.animate-ping { /* Keine Animation */ } +.animate-pulse { /* Keine Animation */ } +.animate-bounce { /* Keine Animation */ } + +/* Duration Classes - ignoriert */ +.duration-75, +.duration-100, +.duration-150, +.duration-200, +.duration-300, +.duration-500, +.duration-700, +.duration-1000 { + /* Keine Duration */ +} + +/* Delay Classes - ignoriert */ +.delay-75, +.delay-100, +.delay-150, +.delay-200, +.delay-300, +.delay-500, +.delay-700, +.delay-1000 { + /* Kein Delay */ +} + +/* Easing Classes - ignoriert */ +.ease-linear, +.ease-in, +.ease-out, +.ease-in-out { + /* Kein Easing */ +} + +/* Motion-safe - ignoriert */ +@media (prefers-reduced-motion: no-preference) { + /* Keine Animationen auch bei no-preference */ +} + +/* Alle Animationen global deaktiviert */ +* { + animation: none !important; + transition: none !important; +} \ No newline at end of file diff --git a/backend/static/css/components-optimized.css b/backend/static/css/components-optimized.css new file mode 100644 index 00000000..97b2d1d5 --- /dev/null +++ b/backend/static/css/components-optimized.css @@ -0,0 +1,520 @@ +/** + * Optimized MYP Platform Components for Raspberry Pi + * All transitions and animations removed for performance + */ + +@layer components { + /* Karten und Container - Keine Transitions */ + .card { + @apply bg-white dark:bg-slate-900 rounded-xl shadow-lg border border-slate-200 dark:border-slate-700 p-6 m-4; + } + + .card-hover { + @apply hover:shadow-xl hover:shadow-slate-300/50 dark:hover:shadow-slate-900/50 hover:bg-slate-50 dark:hover:bg-slate-800; + } + + .container-panel { + @apply bg-slate-50 dark:bg-slate-800 rounded-xl p-6 m-4 border border-slate-200 dark:border-slate-700 shadow-sm; + } + + /* Formulare - Keine Transitions */ + .form-input { + @apply w-full rounded-xl border-2 border-slate-300 dark:border-slate-600 bg-white dark:bg-slate-800 px-4 py-3 text-slate-900 dark:text-white placeholder-slate-500 dark:placeholder-slate-400 focus:border-blue-500 dark:focus:border-blue-400 focus:ring-4 focus:ring-blue-500/20 dark:focus:ring-blue-400/20; + } + + .form-label { + @apply block text-sm font-semibold text-slate-700 dark:text-slate-300 mb-2; + } + + .form-group { + @apply mb-6; + } + + .form-help { + @apply mt-1 text-xs text-slate-500 dark:text-slate-400; + } + + .form-error { + @apply mt-1 text-xs text-red-600 dark:text-red-400 font-medium; + } + + /* Buttons - Keine Transitions */ + .btn-icon { + @apply inline-flex items-center justify-center rounded-xl p-3 shadow-md hover:shadow-lg; + } + + .btn-text { + @apply inline-flex items-center justify-center gap-2 rounded-xl px-6 py-3 text-sm font-semibold shadow-md hover:shadow-lg; + } + + .btn-rounded { + @apply rounded-full; + } + + .btn-sm { + @apply px-4 py-2 text-xs; + } + + .btn-lg { + @apply px-8 py-4 text-base; + } + + /* Badges und Tags - Keine Transitions */ + .badge { + @apply inline-flex items-center rounded-full px-3 py-1.5 text-xs font-semibold shadow-sm; + } + + .badge-blue { + @apply bg-blue-100 text-blue-800 border border-blue-200 dark:bg-blue-900/30 dark:text-blue-300 dark:border-blue-700; + } + + .badge-green { + @apply bg-green-100 text-green-800 border border-green-200 dark:bg-green-900/30 dark:text-green-300 dark:border-green-700; + } + + .badge-red { + @apply bg-red-100 text-red-800 border border-red-200 dark:bg-red-900/30 dark:text-red-300 dark:border-red-700; + } + + .badge-yellow { + @apply bg-yellow-100 text-yellow-800 border border-yellow-200 dark:bg-yellow-900/30 dark:text-yellow-300 dark:border-yellow-700; + } + + .badge-purple { + @apply bg-purple-100 text-purple-800 border border-purple-200 dark:bg-purple-900/30 dark:text-purple-300 dark:border-purple-700; + } + + /* Status Anzeigen - Keine Animation */ + .status-dot { + @apply relative flex h-3 w-3 rounded-full shadow-sm; + } + + .status-dot::after { + @apply absolute top-0 left-0 h-full w-full rounded-full content-[''] opacity-75; + } + + .status-online { + @apply bg-green-500 dark:bg-green-400; + } + + .status-online::after { + @apply bg-green-500 dark:bg-green-400; + } + + .status-offline { + @apply bg-red-500 dark:bg-red-400; + } + + .status-warning { + @apply bg-yellow-500 dark:bg-yellow-400; + } + + .status-warning::after { + @apply bg-yellow-500 dark:bg-yellow-400; + } + + /* Tabellen - Keine Transitions */ + .table-container { + @apply w-full overflow-x-auto rounded-xl border border-slate-200 dark:border-slate-700 shadow-lg bg-white dark:bg-slate-900; + } + + .table-styled { + @apply w-full whitespace-nowrap text-left text-sm text-slate-700 dark:text-slate-300; + } + + .table-styled thead { + @apply bg-slate-100 dark:bg-slate-800; + } + + .table-styled th { + @apply px-6 py-4 font-semibold text-slate-900 dark:text-white; + } + + .table-styled tbody tr { + @apply border-t border-slate-200 dark:border-slate-700; + } + + .table-styled tbody tr:hover { + @apply bg-slate-50 dark:bg-slate-800/50; + } + + .table-styled td { + @apply px-6 py-4; + } + + /* Alerts - Keine Transitions */ + .alert { + @apply rounded-xl border-2 p-6 mb-4 shadow-lg; + } + + .alert-info { + @apply bg-blue-50 dark:bg-blue-900/20 border-blue-300 dark:border-blue-600 text-blue-900 dark:text-blue-200; + } + + .alert-success { + @apply bg-green-50 dark:bg-green-900/20 border-green-300 dark:border-green-600 text-green-900 dark:text-green-200; + } + + .alert-warning { + @apply bg-yellow-50 dark:bg-yellow-900/20 border-yellow-300 dark:border-yellow-600 text-yellow-900 dark:text-yellow-200; + } + + .alert-error { + @apply bg-red-50 dark:bg-red-900/20 border-red-300 dark:border-red-600 text-red-900 dark:text-red-200; + } + + /* Navigation - Keine Transitions */ + .nav-tab { + @apply inline-flex items-center gap-2 px-6 py-3 border-b-2 text-sm font-semibold; + } + + .nav-tab-active { + @apply border-blue-600 dark:border-blue-400 text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 rounded-t-lg; + } + + .nav-tab-inactive { + @apply border-transparent text-slate-600 dark:text-slate-400 hover:text-slate-900 dark:hover:text-slate-200 hover:border-slate-300 dark:hover:border-slate-600 hover:bg-slate-50 dark:hover:bg-slate-800 rounded-t-lg; + } + + /* Navigation Links - Keine Transitions */ + .nav-link { + @apply flex items-center gap-3 px-4 py-3 rounded-xl text-slate-700 dark:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-800 hover:text-slate-900 dark:hover:text-white font-medium; + } + + .nav-link.active { + @apply bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 font-semibold shadow-sm; + } + + /* Printer Status - Statisch */ + .printer-status { + @apply inline-flex items-center gap-2 px-4 py-2 rounded-full text-xs font-semibold shadow-sm border; + } + + .printer-ready { + @apply bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300 border-green-200 dark:border-green-700; + } + + .printer-busy { + @apply bg-orange-100 dark:bg-orange-900/30 text-orange-800 dark:text-orange-300 border-orange-200 dark:border-orange-700; + } + + .printer-error { + @apply bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-300 border-red-200 dark:border-red-700; + } + + .printer-offline { + @apply bg-slate-100 dark:bg-slate-800 text-slate-700 dark:text-slate-300 border-slate-200 dark:border-slate-600; + } + + .printer-maintenance { + @apply bg-purple-100 dark:bg-purple-900/30 text-purple-800 dark:text-purple-300 border-purple-200 dark:border-purple-700; + } + + /* Job Status - Statisch */ + .job-status { + @apply inline-flex items-center gap-2 px-4 py-2 rounded-full text-xs font-semibold shadow-sm border; + } + + .job-queued { + @apply bg-slate-100 dark:bg-slate-800 text-slate-700 dark:text-slate-300 border-slate-200 dark:border-slate-600; + } + + .job-printing { + @apply bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-300 border-blue-200 dark:border-blue-700; + } + + .job-completed { + @apply bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300 border-green-200 dark:border-green-700; + } + + .job-failed { + @apply bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-300 border-red-200 dark:border-red-700; + } + + .job-cancelled { + @apply bg-yellow-100 dark:bg-yellow-900/30 text-yellow-800 dark:text-yellow-300 border-yellow-200 dark:border-yellow-700; + } + + .job-paused { + @apply bg-purple-100 dark:bg-purple-900/30 text-purple-800 dark:text-purple-300 border-purple-200 dark:border-purple-700; + } + + /* Buttons - Keine Transitions */ + .btn { + @apply px-6 py-3 rounded-xl focus:outline-none focus:ring-4 shadow-lg hover:shadow-xl font-semibold; + } + + .btn-primary { + @apply btn bg-blue-600 hover:bg-blue-700 text-white focus:ring-blue-500/50 shadow-blue-500/25; + } + + .btn-secondary { + @apply btn bg-slate-200 hover:bg-slate-300 text-slate-800 dark:bg-slate-700 dark:hover:bg-slate-600 dark:text-white focus:ring-slate-500/50; + } + + .btn-danger { + @apply btn bg-red-600 hover:bg-red-700 text-white focus:ring-red-500/50 shadow-red-500/25; + } + + .btn-success { + @apply btn bg-green-600 hover:bg-green-700 text-white focus:ring-green-500/50 shadow-green-500/25; + } + + /* Mercedes Design-Komponenten - Vereinfacht */ + .mercedes-glass { + background: rgba(255, 255, 255, 0.9); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); + } + + .dark .mercedes-glass { + background: rgba(15, 23, 42, 0.9); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); + } + + /* Gradients - Statisch */ + .professional-gradient { + background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 25%, #cbd5e1 50%, #94a3b8 75%, #64748b 100%); + } + + .dark .professional-gradient { + background: linear-gradient(135deg, #0f172a 0%, #1e293b 25%, #334155 50%, #475569 75%, #64748b 100%); + } + + /* Mercedes-Pattern */ + .mercedes-pattern { + background-image: + radial-gradient(circle at 25% 25%, rgba(255,255,255,0.1) 2px, transparent 2px), + radial-gradient(circle at 75% 75%, rgba(255,255,255,0.1) 2px, transparent 2px); + background-size: 60px 60px; + } + + .dark .mercedes-pattern { + background-image: + radial-gradient(circle at 25% 25%, rgba(255,255,255,0.05) 2px, transparent 2px), + radial-gradient(circle at 75% 75%, rgba(255,255,255,0.05) 2px, transparent 2px); + background-size: 60px 60px; + } + + /* Schatten - Statisch */ + .professional-shadow { + box-shadow: + 0 25px 50px -12px rgba(0, 0, 0, 0.15), + 0 8px 16px rgba(0, 0, 0, 0.1), + 0 0 0 1px rgba(255, 255, 255, 0.05); + } + + .dark .professional-shadow { + box-shadow: + 0 25px 50px -12px rgba(0, 0, 0, 0.5), + 0 8px 16px rgba(0, 0, 0, 0.3), + 0 0 0 1px rgba(255, 255, 255, 0.1); + } + + /* Button Styles - Vereinfacht */ + .professional-button { + background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%); + position: relative; + overflow: hidden; + box-shadow: 0 4px 15px rgba(59, 130, 246, 0.3); + } + + .dark .professional-button { + background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%); + box-shadow: 0 4px 15px rgba(59, 130, 246, 0.2); + } + + .professional-button:hover { + background: linear-gradient(135deg, #1d4ed8 0%, #1e40af 100%); + box-shadow: 0 15px 35px rgba(59, 130, 246, 0.4); + } + + .dark .professional-button:hover { + background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); + box-shadow: 0 15px 35px rgba(59, 130, 246, 0.3); + } + + /* Input Fields - Vereinfacht */ + .input-field { + background: rgba(255, 255, 255, 0.95); + border: 2px solid rgba(203, 213, 225, 0.8); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); + } + + .dark .input-field { + background: rgba(51, 65, 85, 0.95); + border: 2px solid rgba(71, 85, 105, 0.8); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + } + + .input-field:focus { + box-shadow: 0 10px 25px rgba(59, 130, 246, 0.15); + border-color: #3b82f6; + background: rgba(255, 255, 255, 1); + } + + .dark .input-field:focus { + background: rgba(51, 65, 85, 1); + box-shadow: 0 10px 25px rgba(59, 130, 246, 0.2); + } + + /* Cards - Vereinfacht */ + .professional-card { + border-radius: 1.5rem; + overflow: hidden; + background: rgba(255, 255, 255, 0.98); + border: 1px solid rgba(203, 213, 225, 0.5); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); + } + + .dark .professional-card { + background: rgba(15, 23, 42, 0.98); + border: 1px solid rgba(71, 85, 105, 0.5); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); + } + + .professional-card:hover { + box-shadow: 0 25px 50px rgba(0, 0, 0, 0.15); + } + + .dark .professional-card:hover { + box-shadow: 0 25px 50px rgba(0, 0, 0, 0.3); + } + + /* Navigation - Vereinfacht */ + .nav-item { + position: relative; + border-radius: 0.75rem; + } + + .nav-item::after { + content: ''; + position: absolute; + bottom: -2px; + left: 50%; + width: 0; + height: 2px; + background: linear-gradient(90deg, #3b82f6, #1d4ed8); + } + + .nav-item:hover::after, + .nav-item.active::after { + width: 100%; + } + + /* Header-Stile */ + .hero-header { + background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%); + border: 1px solid rgba(203, 213, 225, 0.5); + } + + .dark .hero-header { + background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%); + border: 1px solid rgba(71, 85, 105, 0.5); + } + + /* Container */ + .main-container { + background: rgba(248, 250, 252, 0.8); + } + + .dark .main-container { + background: rgba(15, 23, 42, 0.8); + } + + /* Status Badges - Vereinfacht */ + .status-badge { + display: inline-flex; + align-items: center; + padding: 0.5rem 0.75rem; + font-size: 0.75rem; + font-weight: 700; + border-radius: 9999px; + border: 1px solid transparent; + text-transform: uppercase; + letter-spacing: 0.025em; + } + + /* Keine globalen Transitions */ + * { + transition: none !important; + animation: none !important; + } + + /* Interactive Hover - Vereinfacht */ + .interactive-hover:hover { + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15); + } + + .dark .interactive-hover:hover { + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3); + } + + /* Loading States - Keine Animation */ + .loading-shimmer { + background: #f1f5f9; + } + + .dark .loading-shimmer { + background: #334155; + } + + /* Focus Indicators */ + .focus-ring:focus { + outline: 3px solid #3b82f6; + outline-offset: 2px; + } + + .dark .focus-ring:focus { + outline: 3px solid #60a5fa; + } + + /* Typography */ + .professional-title { + background: linear-gradient(135deg, #1e293b 0%, #475569 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + font-weight: 700; + letter-spacing: -0.025em; + } + + .dark .professional-title { + background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + + /* Responsive Design */ + @media (max-width: 768px) { + .professional-shadow { + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); + } + + .professional-card { + border-radius: 1rem; + } + } + + /* Keine Animationen */ + .fade-in, + .slide-up { + /* Keine Animation */ + } + + /* Root Variablen */ + :root { + --mercedes-primary: #3b82f6; + --mercedes-secondary: #64748b; + --mercedes-accent: #1d4ed8; + --shadow-light: rgba(0, 0, 0, 0.1); + --shadow-dark: rgba(0, 0, 0, 0.3); + } + + .dark { + --shadow-light: rgba(0, 0, 0, 0.2); + --shadow-dark: rgba(0, 0, 0, 0.5); + } +} \ No newline at end of file diff --git a/backend/static/css/glassmorphism-optimized.css b/backend/static/css/glassmorphism-optimized.css new file mode 100644 index 00000000..24b757c9 --- /dev/null +++ b/backend/static/css/glassmorphism-optimized.css @@ -0,0 +1,74 @@ +/** + * Optimized Glassmorphism Effects for Raspberry Pi + * Performance-optimized version with effects only on navbar + */ + +/* Glassmorphism nur für Navbar */ +.navbar::before, +.glass-nav { + background: rgba(255, 255, 255, 0.85); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.dark .navbar::before, +.dark .glass-nav { + background: rgba(15, 23, 42, 0.85); + border: 1px solid rgba(255, 255, 255, 0.1); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2); +} + +/* Alle anderen Glass-Effekte entfernt für Performance */ +.glass-base, +.glass-card, +.glass-btn, +.glass-input, +.glass-dropdown, +.glass-modal, +.glass-sidebar, +.glass-header, +.glass-footer, +.glass-table, +.glass-badge, +.glass-alert, +.glass-tooltip, +.glass-progress, +.glass-tab { + /* Keine Effekte - nur einfache Hintergründe */ + background: rgba(255, 255, 255, 0.95); + border: 1px solid rgba(0, 0, 0, 0.1); +} + +.dark .glass-base, +.dark .glass-card, +.dark .glass-btn, +.dark .glass-input, +.dark .glass-dropdown, +.dark .glass-modal, +.dark .glass-sidebar, +.dark .glass-header, +.dark .glass-footer, +.dark .glass-table, +.dark .glass-badge, +.dark .glass-alert, +.dark .glass-tooltip, +.dark .glass-progress, +.dark .glass-tab { + background: rgba(15, 23, 42, 0.95); + border: 1px solid rgba(255, 255, 255, 0.1); +} + +/* Utility Classes - Keine Effekte */ +.glass-light { background: rgba(255, 255, 255, 0.9); } +.glass-dark { background: rgba(0, 0, 0, 0.9); } +.glass-blur-none { /* Kein Blur */ } +.glass-blur-sm { /* Kein Blur */ } +.glass-blur-md { /* Kein Blur */ } +.glass-blur-lg { /* Kein Blur */ } +.glass-blur-xl { /* Kein Blur */ } + +/* Border Utilities */ +.glass-border-light { border-color: rgba(255, 255, 255, 0.2); } +.glass-border-dark { border-color: rgba(0, 0, 0, 0.2); } + +/* Keine Hover-Effekte für Performance */ \ No newline at end of file diff --git a/backend/static/css/professional-theme-optimized.css b/backend/static/css/professional-theme-optimized.css new file mode 100644 index 00000000..c0aff708 --- /dev/null +++ b/backend/static/css/professional-theme-optimized.css @@ -0,0 +1,310 @@ +/** + * Optimized Professional Theme for Raspberry Pi + * All transitions and hover effects removed for performance + */ + +:root { + /* Mercedes-Benz Farben */ + --mercedes-black: #000000; + --mercedes-silver: #C0C0C0; + --mercedes-dark-gray: #1a1a1a; + --mercedes-light-gray: #f5f5f5; + + /* Theme Farben */ + --primary-color: #3b82f6; + --secondary-color: #64748b; + --accent-color: #1d4ed8; + --success-color: #10b981; + --warning-color: #f59e0b; + --error-color: #ef4444; + + /* Light Mode */ + --bg-primary: #ffffff; + --bg-secondary: #f8fafc; + --text-primary: #1a202c; + --text-secondary: #4a5568; + --border-color: #e2e8f0; +} + +.dark { + /* Dark Mode */ + --bg-primary: #0f172a; + --bg-secondary: #1e293b; + --text-primary: #f8fafc; + --text-secondary: #cbd5e1; + --border-color: #334155; +} + +/* Base Styles - Keine Transitions */ +body { + background-color: var(--bg-primary); + color: var(--text-primary); + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; +} + +/* Typography - Keine Hover-Effekte */ +h1, h2, h3, h4, h5, h6 { + color: var(--text-primary); + font-weight: 700; + letter-spacing: -0.025em; +} + +/* Links - Keine Hover-Animation */ +a { + color: var(--primary-color); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +/* Buttons - Keine Transitions oder Hover-Effekte */ +.btn { + padding: 0.75rem 1.5rem; + border-radius: 0.5rem; + font-weight: 600; + cursor: pointer; + border: none; + outline: none; +} + +.btn-primary { + background-color: var(--primary-color); + color: white; +} + +.btn-secondary { + background-color: var(--secondary-color); + color: white; +} + +/* Cards - Keine Schatten-Animationen */ +.card { + background-color: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: 0.75rem; + padding: 1.5rem; +} + +/* Forms - Keine Focus-Animationen */ +.form-input, +.form-select, +.form-textarea { + width: 100%; + padding: 0.75rem; + border: 2px solid var(--border-color); + border-radius: 0.5rem; + background-color: var(--bg-primary); + color: var(--text-primary); +} + +.form-input:focus, +.form-select:focus, +.form-textarea:focus { + border-color: var(--primary-color); + outline: none; +} + +/* Tables - Keine Hover-Effekte */ +.table { + width: 100%; + border-collapse: collapse; +} + +.table th, +.table td { + padding: 0.75rem; + border-bottom: 1px solid var(--border-color); +} + +.table th { + font-weight: 600; + text-align: left; +} + +/* Navigation - Keine Hover-Animationen */ +.nav-link { + padding: 0.5rem 1rem; + color: var(--text-secondary); + display: inline-block; +} + +.nav-link:hover { + color: var(--text-primary); + background-color: var(--bg-secondary); +} + +.nav-link.active { + color: var(--primary-color); + font-weight: 600; +} + +/* Badges - Statisch */ +.badge { + display: inline-flex; + align-items: center; + padding: 0.25rem 0.75rem; + font-size: 0.875rem; + font-weight: 600; + border-radius: 9999px; +} + +.badge-success { + background-color: #d1fae5; + color: #065f46; +} + +.badge-warning { + background-color: #fef3c7; + color: #92400e; +} + +.badge-error { + background-color: #fee2e2; + color: #991b1b; +} + +/* Dark Mode Badges */ +.dark .badge-success { + background-color: #064e3b; + color: #6ee7b7; +} + +.dark .badge-warning { + background-color: #78350f; + color: #fcd34d; +} + +.dark .badge-error { + background-color: #7f1d1d; + color: #fca5a5; +} + +/* Alerts - Statisch */ +.alert { + padding: 1rem; + border-radius: 0.5rem; + margin-bottom: 1rem; +} + +.alert-info { + background-color: #dbeafe; + color: #1e40af; + border: 1px solid #93c5fd; +} + +.alert-success { + background-color: #d1fae5; + color: #065f46; + border: 1px solid #6ee7b7; +} + +.alert-warning { + background-color: #fef3c7; + color: #92400e; + border: 1px solid #fcd34d; +} + +.alert-error { + background-color: #fee2e2; + color: #991b1b; + border: 1px solid #fca5a5; +} + +/* Dark Mode Alerts */ +.dark .alert-info { + background-color: #1e3a8a; + color: #93c5fd; + border-color: #3b82f6; +} + +.dark .alert-success { + background-color: #064e3b; + color: #6ee7b7; + border-color: #10b981; +} + +.dark .alert-warning { + background-color: #78350f; + color: #fcd34d; + border-color: #f59e0b; +} + +.dark .alert-error { + background-color: #7f1d1d; + color: #fca5a5; + border-color: #ef4444; +} + +/* Utility Classes - Keine Animationen */ +.shadow-sm { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } +.shadow { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } +.shadow-md { box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } +.shadow-lg { box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1); } +.shadow-xl { box-shadow: 0 20px 25px rgba(0, 0, 0, 0.1); } + +/* Keine Transitions */ +* { + transition: none !important; + animation: none !important; +} + +/* Keine Transform-Effekte */ +.transform, +.translate-x-0, +.translate-y-0, +.rotate-0, +.scale-100 { + transform: none !important; +} + +/* Scrollbar Styling */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: var(--bg-secondary); +} + +::-webkit-scrollbar-thumb { + background: var(--border-color); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--text-secondary); +} + +/* Print Styles */ +@media print { + body { + background: white; + color: black; + } + + .no-print { + display: none !important; + } +} + +/* Accessibility */ +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +/* Focus Visible - Einfacher Stil */ +:focus-visible { + outline: 2px solid var(--primary-color); + outline-offset: 2px; +} \ No newline at end of file diff --git a/backend/tailwind.config.optimized.js b/backend/tailwind.config.optimized.js new file mode 100644 index 00000000..0ba59b0c --- /dev/null +++ b/backend/tailwind.config.optimized.js @@ -0,0 +1,105 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./templates/**/*.html", + "./static/**/*.js" + ], + darkMode: 'class', + theme: { + extend: { + container: { + center: true, + padding: { + DEFAULT: '1rem', + sm: '1.5rem', + lg: '2rem', + xl: '3rem', + '2xl': '4rem', + }, + }, + screens: { + 'xs': '480px', + 'sm': '640px', + 'md': '768px', + 'lg': '1024px', + 'xl': '1280px', + '2xl': '1536px', + }, + spacing: { + '72': '18rem', + '84': '21rem', + '96': '24rem', + '128': '32rem', + }, + fontSize: { + 'xs': ['0.75rem', { lineHeight: '1rem' }], + 'sm': ['0.875rem', { lineHeight: '1.25rem' }], + 'base': ['1rem', { lineHeight: '1.5rem' }], + 'lg': ['1.125rem', { lineHeight: '1.75rem' }], + 'xl': ['1.25rem', { lineHeight: '1.75rem' }], + '2xl': ['1.5rem', { lineHeight: '2rem' }], + '3xl': ['1.875rem', { lineHeight: '2.25rem' }], + '4xl': ['2.25rem', { lineHeight: '2.5rem' }], + '5xl': ['3rem', { lineHeight: '1' }], + }, + colors: { + 'mercedes': { + 'black': '#000000', + 'silver': '#C0C0C0', + 'dark-gray': '#1a1a1a', + 'light-gray': '#f5f5f5', + }, + 'dark': { + 'bg': '#0f172a', + 'bg-secondary': '#131c2e', + 'surface': '#1e293b', + 'text': '#f8fafc', + 'text-secondary': '#e2e8f0', + 'border': '#334155', + }, + 'light': { + 'bg': '#ffffff', + 'bg-secondary': '#f8fafc', + 'surface': '#f7fafc', + 'text': '#1a202c', + 'text-secondary': '#2d3748', + 'border': '#e2e8f0', + }, + 'status': { + 'online': '#10b981', + 'offline': '#ef4444', + 'warning': '#f59e0b', + 'info': '#3b82f6', + }, + }, + boxShadow: { + 'mercedes': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)', + 'card-dark': '0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2)', + }, + borderRadius: { + 'none': '0', + 'sm': '0.125rem', + DEFAULT: '0.25rem', + 'md': '0.375rem', + 'lg': '0.5rem', + 'xl': '0.75rem', + '2xl': '1rem', + '3xl': '1.5rem', + 'full': '9999px', + }, + // Keine Animationen definiert + animation: { + 'none': 'none', + }, + keyframes: {}, + }, + }, + plugins: [], + // Optimierungen für Production Build + future: { + hoverOnlyWhenSupported: true, + }, + experimental: { + optimizeUniversalDefaults: true, + }, +} \ No newline at end of file