📚 Improved build scripts & optimized CSS files for enhanced performance 🎉

This commit is contained in:
Till Tomczak 2025-06-03 13:58:44 +02:00
parent 7cd02bd99e
commit 0c99c6ceba
12 changed files with 1453 additions and 48 deletions

View File

@ -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

View File

@ -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"

View File

@ -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
---

View File

@ -1,4 +1,4 @@
=================================================================
MYP Installation FEHLER Log - 2025-06-03 13:38:42
MYP Installation FEHLER Log - 2025-06-03 13:52:05
=================================================================

View File

@ -0,0 +1,4 @@
=================================================================
MYP Installation WARNUNGEN Log - 2025-06-03 13:52:05
=================================================================

View File

@ -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)...

View File

@ -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 ===========================

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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 */

View File

@ -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;
}

View File

@ -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,
},
}