Rechtstexte, FinalFlux-Überarbeitung, neue Login-Optik, Konto-Löschung-Fix, BTTF-Farbrelaunch

- Rechtsseiten: Impressum-Platzhalter + echte Nutzungsbedingungen/AGB,
  Datenschutz (DSGVO) und Richtlinien; LegalController/ImpressumController,
  Footer app-weit verlinkt, Seiten als permitAll freigegeben.
- FinalFlux: 28 Themen / ~742 Fragen überarbeitet (plausible Distraktoren statt
  Dummy-Antworten, echte Erklärungen) + echte Lehrtexte je Seite;
  Netzwerktopologien mit Inline-SVG-Diagrammen (Stern/Bus/Ring/Mesh/Baum).
- Login/Registrierung als kombiniertes Dual-Panel (Slide-Overlay + Neon-Hover-
  Button), ausgelagert nach auth.css; Register-Duplikat -> /?registerError.
- Konto löschen repariert: @Transactional + Löschen von Spielständen,
  Achievements und Profilbild-Datei (DSGVO Art. 17). Impressum-Zurück-Link
  login-abhängig.
- App-weiter Farb-Relaunch auf "Back to the Future"-Palette: Feuer-Amber primär
  + Flux-Blau sekundär, warmer Glow; Dark/Light bleiben. Spiele-Feedback ohne
  Grün: richtig = Blau + Haken, falsch = Rot + Kreuz (neue Tokens
  --success/--danger/--secondary). Legacy-Cyan in style.css auf Variablen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
AliceDarkest
2026-06-29 19:08:05 +02:00
parent fc98e5aad1
commit 34b050503d
94 changed files with 6712 additions and 4220 deletions
+116 -67
View File
@@ -6,85 +6,134 @@
<title>Mindflux – Deine Zukunft beginnt hier</title>
<link rel="stylesheet" href="/css/theme.css">
<script src="/js/theme.js"></script>
<style>
.mf-auth { width:100%; max-width:880px; display:grid; grid-template-columns:1.1fr 1fr; gap:1.4rem; align-items:stretch; }
.mf-auth .info { background:var(--surface); border:1px solid var(--border); border-radius:18px; padding:2rem; box-shadow:var(--g-soft); }
.mf-auth .info h2 { color:var(--heading); font-size:1.25rem; font-weight:800; margin-bottom:.7rem; }
.mf-auth .info p { color:var(--muted); font-size:.92rem; line-height:1.6; margin-bottom:.8rem; }
.mf-authlogo { display:flex; flex-direction:column; align-items:center; gap:.5rem; margin-bottom:1.4rem; text-align:center; }
.mf-authlogo .mark { width:64px; height:64px; background:var(--accent);
-webkit-mask:url("/img/mindflux-emblem.png") center/contain no-repeat; mask:url("/img/mindflux-emblem.png") center/contain no-repeat;
filter:drop-shadow(0 0 12px var(--glow-s)); }
.mf-authlogo b { color:var(--accent); font-weight:800; letter-spacing:.16em; font-size:1.2rem; text-shadow:0 0 14px var(--glow-s); }
.mf-authlogo span { color:var(--muted); font-size:.62rem; letter-spacing:.24em; }
.login-box h2 { color:var(--heading); font-size:1.15rem; font-weight:800; margin-bottom:1.1rem; text-align:center; }
.login-box .alt { color:var(--muted); font-size:.85rem; text-align:center; margin:1.1rem 0 .6rem; }
.login-box .mf-btn { width:100%; }
.mf-foot { margin-top:1.6rem; color:var(--muted); font-size:.78rem; text-align:center; line-height:2; }
.mf-foot a { color:var(--muted); text-decoration:none; }
.mf-foot a:hover { color:var(--accent); }
@media (max-width:760px){ .mf-auth { grid-template-columns:1fr; } }
</style>
<link rel="stylesheet" href="/css/auth.css">
</head>
<body>
<div class="mf-theme-float"><button class="mf-theme"></button></div>
<div class="mf-center">
<div>
<div class="mf-auth">
<!-- Infotext -->
<div class="info">
<p class="mf-eyebrow" style="margin-bottom:.6rem">Willkommen bei Mindflux</p>
<h2>Worum geht's bei Mindflux?</h2>
<p>
Mindflux ist deine moderne Lernplattform zur gezielten Prüfungsvorbereitung in der IT-Ausbildung.
Trainiere Fragen, baue dein Wissen auf – und das mit Stil.
Unterstützt von Zeitreise-Ästhetik, Technik-Liebe und einer ordentlichen Portion Motivation.
</p>
<p>
Registriere dich kostenlos, erstelle Quizfragen, lerne systematisch – und bring dein Wissen auf 88 Meilen pro Stunde 🚀
</p>
<div class="auth-stage">
<div class="auth-container" id="authContainer">
<!-- ===== Sign In ===== -->
<div class="form-box login">
<div class="inner">
<div class="auth-head">
<span class="mark"></span>
<b>MINDFLUX</b>
<h2>Willkommen zurück</h2>
<span class="sub">Melde dich an, um weiterzulernen.</span>
</div>
<div th:if="${param.error}" class="mf-alert err">Benutzername oder Passwort sind falsch.</div>
<div th:if="${param.logout}" class="mf-alert ok">Du hast dich erfolgreich abgemeldet.</div>
<div th:if="${param.registerSuccess}" class="mf-alert ok">Registrierung erfolgreich! Du kannst dich jetzt einloggen.</div>
<form th:action="@{/login}" method="post">
<div class="mf-field">
<label class="mf-label" for="login-username">Benutzername</label>
<input id="login-username" class="mf-input" type="text" name="username" placeholder="Benutzername" required th:value="${param.username}">
</div>
<!-- Login/Registrierung -->
<div class="mf-cardbox login-box">
<div class="mf-authlogo">
<span class="mark"></span>
<b>MINDFLUX</b>
<span>DEIN FLUXKOMPENSATOR FÜRS GEHIRN</span>
</div>
<h2>Login</h2>
<form th:action="@{/login}" method="post">
<div class="mf-field">
<label class="mf-label" for="username">Benutzername</label>
<input id="username" class="mf-input" type="text" name="username" placeholder="Benutzername" required />
</div>
<div class="mf-field">
<label class="mf-label" for="password">Passwort</label>
<input id="password" class="mf-input" type="password" name="password" placeholder="Passwort" required />
</div>
<button class="mf-btn" type="submit">Einloggen</button>
</form>
<p class="alt">Noch keinen Account?</p>
<form th:action="@{/register}" method="get">
<button class="mf-btn outline" type="submit">Registrieren</button>
</form>
<div class="mf-field">
<label class="mf-label" for="login-password">Passwort</label>
<input id="login-password" class="mf-input" type="password" name="password" placeholder="Passwort" required>
</div>
<button class="neon-btn" type="submit"><span class="lock">🔒</span> Login</button>
</form>
<p class="mobile-switch">Noch keinen Account? <a data-goto="signup">Jetzt registrieren</a></p>
</div>
</div>
<!-- ===== Sign Up ===== -->
<div class="form-box signup">
<div class="inner">
<div class="auth-head">
<span class="mark"></span>
<b>MINDFLUX</b>
<h2>Account erstellen</h2>
<span class="sub">Kostenlos – und in 30 Sekunden startklar.</span>
</div>
<div th:if="${param.registerError}" class="mf-alert err">Benutzername bereits vergeben.</div>
<form th:action="@{/register}" method="post">
<div class="mf-field">
<label class="mf-label" for="reg-username">Benutzername</label>
<input id="reg-username" class="mf-input" type="text" name="username" placeholder="Benutzername" required>
</div>
<div class="mf-field">
<label class="mf-label" for="reg-email">E-Mail</label>
<input id="reg-email" class="mf-input" type="email" name="email" placeholder="E-Mail" required>
</div>
<div class="mf-field">
<label class="mf-label" for="reg-password">Passwort</label>
<input id="reg-password" class="mf-input" type="password" name="password" placeholder="Passwort" required>
</div>
<button class="neon-btn" type="submit"><span class="lock">🚀</span> Account erstellen</button>
</form>
<p class="mobile-switch">Schon dabei? <a data-goto="login">Zum Login</a></p>
</div>
</div>
<!-- ===== Overlay ===== -->
<div class="overlay-container">
<div class="overlay">
<!-- sichtbar im Signup-Modus -> zurück zum Login -->
<div class="overlay-panel overlay-left">
<span class="o-emblem"></span>
<h3>Schon dabei?</h3>
<p>Melde dich an und mach bei 88 Meilen pro Stunde weiter. 🚀</p>
<button type="button" class="ghost-btn" id="toLogin">Zum Login</button>
</div>
<!-- sichtbar im Login-Modus -> zum Signup -->
<div class="overlay-panel overlay-right">
<span class="o-emblem"></span>
<h3>Neu bei Mindflux?</h3>
<p>Erstelle deinen kostenlosen Account und schalte die volle Lernplattform frei.</p>
<button type="button" class="ghost-btn" id="toSignup">Account erstellen</button>
</div>
</div>
</div>
<footer class="mf-footer">
<a href="#">Support</a>
<a href="#">Feedback</a>
<a href="#">Nutzungsbedingungen</a>
<a href="#">Richtlinien</a>
<a href="#">Datenschutz</a>
<a href="#">Impressum</a>
</footer>
</div>
<footer class="mf-footer">
<a href="#">Support</a>
<a href="#">Feedback</a>
<a href="/nutzungsbedingungen">Nutzungsbedingungen</a>
<a href="/richtlinien">Richtlinien</a>
<a href="/datenschutz">Datenschutz</a>
<a href="/impressum">Impressum</a>
</footer>
</div>
</div>
<script>
(function () {
var c = document.getElementById('authContainer');
var toSignup = document.getElementById('toSignup');
var toLogin = document.getElementById('toLogin');
if (toSignup) toSignup.addEventListener('click', function () { c.classList.add('active'); });
if (toLogin) toLogin.addEventListener('click', function () { c.classList.remove('active'); });
document.querySelectorAll('[data-goto="signup"]').forEach(function (el) {
el.addEventListener('click', function (e) { e.preventDefault(); c.classList.add('active'); });
});
document.querySelectorAll('[data-goto="login"]').forEach(function (el) {
el.addEventListener('click', function (e) { e.preventDefault(); c.classList.remove('active'); });
});
// Bei Registrierungsfehler direkt das Signup-Panel öffnen
if (new URLSearchParams(window.location.search).has('registerError')) {
c.classList.add('active');
}
})();
</script>
</body>
</html>