📚 Improved build scripts & optimized CSS files for enhanced performance 🎉
This commit is contained in:
parent
7cd02bd99e
commit
0c99c6ceba
40
backend/build-optimized.bat
Normal file
40
backend/build-optimized.bat
Normal 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
|
42
backend/build-optimized.sh
Normal file
42
backend/build-optimized.sh
Normal 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"
|
@ -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
|
||||
---
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
=================================================================
|
||||
MYP Installation FEHLER Log - 2025-06-03 13:38:42
|
||||
MYP Installation FEHLER Log - 2025-06-03 13:52:05
|
||||
=================================================================
|
||||
|
||||
|
4
backend/logs/myp-install-warnings.log
Normal file
4
backend/logs/myp-install-warnings.log
Normal file
@ -0,0 +1,4 @@
|
||||
=================================================================
|
||||
MYP Installation WARNUNGEN Log - 2025-06-03 13:52:05
|
||||
=================================================================
|
||||
|
140
backend/logs/myp-install.log
Normal file
140
backend/logs/myp-install.log
Normal 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
|
||||
=================================================================
|
||||
|
||||
[0;32m[2025-06-03 13:52:05] === MODUS: ROBUSTE ABHÄNGIGKEITEN-INSTALLATION FÜR MANUELLES TESTEN ===[0m
|
||||
[0;32m[2025-06-03 13:52:05] ✅ Root-Berechtigung bestätigt[0m
|
||||
[0;32m[2025-06-03 13:52:05] === SYSTEM-RESSOURCEN PRÜFUNG ===[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe RAM...[0m
|
||||
[0;35m[FORTSCHRITT] Verfügbarer RAM: 24031MB[0m
|
||||
[0;36m[ERFOLG] ✅ Ausreichend RAM verfügbar (24031MB)[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Festplattenplatz...[0m
|
||||
[0;35m[FORTSCHRITT] Verfügbarer Festplattenplatz: 12,5GB (12825MB)[0m
|
||||
[0;36m[ERFOLG] ✅ Ausreichend Festplattenplatz verfügbar (12,5GB)[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe CPU...[0m
|
||||
[0;35m[FORTSCHRITT] CPU: 8 Kern(e) - 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz[0m
|
||||
[0;36m[ERFOLG] ✅ CPU-Information erfolgreich ermittelt[0m
|
||||
[0;32m[2025-06-03 13:52:05] ✅ System-Ressourcen-Prüfung abgeschlossen[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Debian/Raspbian-System...[0m
|
||||
[0;34m[DEBUG] Debian erkannt über /etc/debian_version: 12.11[0m
|
||||
[0;32m[2025-06-03 13:52:05] ✅ Debian/Raspbian-basiertes System erkannt (Version: 12.11)[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Raspberry Pi Hardware...[0m
|
||||
[0;34m[INFO] 💻 Standard-PC/Server System (kein Raspberry Pi)[0m
|
||||
[0;34m[DEBUG] Kein Raspberry Pi erkannt. Hardware-Info:[0m
|
||||
[0;34m[DEBUG] - Device Tree: nicht verfügbar[0m
|
||||
[0;34m[DEBUG] - CPU Hardware: nicht verfügbar[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe System-Architektur...[0m
|
||||
[0;34m[INFO] 📐 System-Architektur: x86_64[0m
|
||||
[0;34m[INFO] → 64-Bit x86 Architektur erkannt[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Kernel-Version...[0m
|
||||
[0;34m[INFO] 🐧 Kernel-Version: 6.1.0-37-amd64[0m
|
||||
[0;34m[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[0m
|
||||
[0;32m[2025-06-03 13:52:06] ✅ System-Analyse abgeschlossen[0m
|
||||
[0;35m[FORTSCHRITT] Prüfe Internetverbindung (erweiterte Methoden)...[0m
|
||||
[0;35m[FORTSCHRITT] Teste DNS-Auflösung...[0m
|
||||
[0;34m[DEBUG] DNS-Test Details: Teste DNS für 8.8.8.8: Erfolg mit nslookup. [0m
|
||||
[0;36m[ERFOLG] ✅ Internetverbindung verfügbar[0m
|
||||
[0;34m[INFO] 🔍 Erkannt via: DNS-Auflösung (nslookup: 8.8.8.8)[0m
|
||||
[0;35m[FORTSCHRITT] Ermittle externe IP-Adresse...[0m
|
||||
[0;34m[INFO] 🌐 Externe IP: 163.116.178.31[0m
|
||||
[0;34m[DEBUG] Externe IP ermittelt über ifconfig.me: 163.116.178.31[0m
|
||||
[0;32m[2025-06-03 13:52:06] === KONFIGURIERE HOSTNAME ===[0m
|
||||
[0;32m[2025-06-03 13:52:06] ✅ Hostname bereits korrekt: 'raspberrypi'[0m
|
||||
[0;32m[2025-06-03 13:52:06] ✅ Hostname-Auflösung funktioniert: raspberrypi -> 127.0.1.1[0m
|
||||
[0;32m[2025-06-03 13:52:06] === ROBUSTE SYSTEM-UPDATE ===[0m
|
||||
[0;35m[FORTSCHRITT] Konfiguriere APT für bessere Zuverlässigkeit...[0m
|
||||
[0;35m[FORTSCHRITT] Validiere APT-Repositories...[0m
|
||||
[0;32m[2025-06-03 13:52:06] ✅ Source-Repositories deaktiviert (nicht benötigt)[0m
|
||||
[0;35m[FORTSCHRITT] Aktualisiere Paketlisten mit Retry...[0m
|
||||
[0;35m[FORTSCHRITT] Führe System-Upgrade durch...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere essenzielle System-Tools...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: ca-certificates[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: gnupg[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: curl[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: wget[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: git[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: nano[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: htop[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: rsync[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: unzip[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: sudo[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: systemd[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: lsb-release[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: apt-transport-https[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: software-properties-common[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: bc[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: dbus[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: systemd-timesyncd[0m
|
||||
[0;35m[FORTSCHRITT] Synchronisiere Systemzeit...[0m
|
||||
[0;32m[2025-06-03 13:52:15] ✅ Robustes System-Update abgeschlossen[0m
|
||||
[0;32m[2025-06-03 13:52:15] === KONFIGURIERE ROBUSTE NETZWERK-SICHERHEIT ===[0m
|
||||
[0;35m[FORTSCHRITT] Deaktiviere IPv6 (robust)...[0m
|
||||
[0;35m[FORTSCHRITT] Deaktiviere IPv6 in GRUB...[0m
|
||||
[0;34m[INFO] IPv6 bereits in GRUB deaktiviert[0m
|
||||
[0;35m[FORTSCHRITT] Erstelle robuste sysctl-Konfiguration...[0m
|
||||
[0;36m[ERFOLG] ✅ Basis-sysctl-Konfiguration erstellt[0m
|
||||
[0;34m[DEBUG] sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf[0m
|
||||
[0;35m[FORTSCHRITT] Wende sysctl-Einstellungen an (non-blocking)...[0m
|
||||
[0;35m[FORTSCHRITT] Versuche komplette sysctl-Datei anzuwenden...[0m
|
||||
[0;36m[ERFOLG] ✅ MYP sysctl-Einstellungen erfolgreich angewendet[0m
|
||||
[0;34m[DEBUG] Überspringe system-weites sysctl -p (zu riskant)[0m
|
||||
[0;35m[FORTSCHRITT] Deaktiviere IPv6 in Netzwerk-Interfaces (vorsichtig)...[0m
|
||||
[0;34m[DEBUG] systemd-networkd nicht aktiv - überspringe[0m
|
||||
[0;34m[DEBUG] NetworkManager nicht aktiv - überspringe[0m
|
||||
[0;34m[DEBUG] IPv6 Einträge in /etc/hosts auskommentiert[0m
|
||||
[0;32m[2025-06-03 13:52:15] ✅ Robuste Netzwerk-Sicherheit konfiguriert:[0m
|
||||
[0;32m[2025-06-03 13:52:15] 🚫 IPv6 Deaktivierung konfiguriert[0m
|
||||
[0;32m[2025-06-03 13:52:15] 🛡️ Netzwerk-Sicherheitsregeln gesetzt[0m
|
||||
[0;32m[2025-06-03 13:52:15] 🔒 Basis-Firewall-Schutz aktiviert[0m
|
||||
[0;32m[2025-06-03 13:52:15] 📝 Sysctl-Konfiguration erstellt: /etc/sysctl.d/99-myp-security.conf[0m
|
||||
[0;32m[2025-06-03 13:52:15] 🔧 Netzwerk-Services entsprechend konfiguriert[0m
|
||||
[0;32m[2025-06-03 13:52:15] ⚙️ Einstellungen werden beim nächsten Boot aktiv[0m
|
||||
[0;34m[DEBUG] Alternative sysctl-Anwendung:[0m
|
||||
[0;34m[DEBUG] - Manuell: sysctl -p /etc/sysctl.d/99-myp-security.conf[0m
|
||||
[0;34m[DEBUG] - Automatisch: Beim nächsten Neustart aktiv[0m
|
||||
[0;34m[DEBUG] - Verifikation: sysctl net.ipv6.conf.all.disable_ipv6[0m
|
||||
[0;32m[2025-06-03 13:52:15] === ROBUSTE PYTHON-INSTALLATION ===[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Python 3 und Build-Abhängigkeiten...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-pip[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-setuptools[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-venv[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: python3-wheel[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: build-essential[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libssl-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libffi-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libbz2-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libreadline-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libsqlite3-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libncurses5-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: libncursesw5-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: zlib1g-dev[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: sqlite3[0m
|
||||
[0;35m[FORTSCHRITT] Validiere Python-Installation...[0m
|
||||
[0;32m[2025-06-03 13:52:22] ✅ Python Version: 3.11.2[0m
|
||||
[0;35m[FORTSCHRITT] Konfiguriere pip für bessere Zuverlässigkeit...[0m
|
||||
[0;35m[FORTSCHRITT] Erstelle systemweite pip-Konfiguration...[0m
|
||||
[0;35m[FORTSCHRITT] Konfiguriere pip für alle Benutzer...[0m
|
||||
[0;32m[2025-06-03 13:52:22] ✅ pip konfiguriert für Benutzer: user[0m
|
||||
[0;35m[FORTSCHRITT] Aktualisiere pip mit Retry...[0m
|
||||
[0;32m[2025-06-03 13:52:23] ✅ pip Version: 25.1.1[0m
|
||||
[0;32m[2025-06-03 13:52:23] ✅ Robuste Python-Umgebung installiert[0m
|
||||
[0;32m[2025-06-03 13:52:23] === ROBUSTE NODE.JS UND NPM INSTALLATION ===[0m
|
||||
[0;35m[FORTSCHRITT] Bereinige alte Node.js-Installationen...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Node.js mit Fallback-Strategie...[0m
|
||||
[0;35m[FORTSCHRITT] Verwende Debian Repository als Fallback...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: nodejs npm[0m
|
||||
[0;32m[2025-06-03 13:53:55] ✅ Node.js via Debian Repository installiert[0m
|
||||
[0;35m[FORTSCHRITT] Validiere Node.js Installation...[0m
|
||||
[0;32m[2025-06-03 13:53:55] ✅ Node.js Version: v18.19.0[0m
|
||||
[0;32m[2025-06-03 13:53:56] ✅ npm Version: 9.2.0[0m
|
||||
[0;35m[FORTSCHRITT] Optimiere npm-Konfiguration...[0m
|
||||
[0;32m[2025-06-03 13:53:57] ✅ Node.js und npm erfolgreich installiert[0m
|
||||
[0;32m[2025-06-03 13:53:57] === ROBUSTE SSL-ZERTIFIKATE KONFIGURATION ===[0m
|
||||
[0;35m[FORTSCHRITT] Installiere SSL-Grundkomponenten...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Pakete: ca-certificates openssl[0m
|
||||
[0;35m[FORTSCHRITT] Aktualisiere CA-Zertifikate...[0m
|
||||
[0;35m[FORTSCHRITT] Installiere Mercedes Corporate Zertifikate (robust)...[0m
|
128
backend/setup.sh
128
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 ===========================
|
||||
|
84
backend/static/css/animations-optimized.css
Normal file
84
backend/static/css/animations-optimized.css
Normal 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;
|
||||
}
|
520
backend/static/css/components-optimized.css
Normal file
520
backend/static/css/components-optimized.css
Normal 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);
|
||||
}
|
||||
}
|
74
backend/static/css/glassmorphism-optimized.css
Normal file
74
backend/static/css/glassmorphism-optimized.css
Normal 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 */
|
310
backend/static/css/professional-theme-optimized.css
Normal file
310
backend/static/css/professional-theme-optimized.css
Normal 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;
|
||||
}
|
105
backend/tailwind.config.optimized.js
Normal file
105
backend/tailwind.config.optimized.js
Normal 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,
|
||||
},
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user