diff --git a/CHANGELOG.md b/CHANGELOG.md index b4c5e39..3acaa25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,19 @@ Versionierung [semantisch](https://semver.org/lang/de/). ## [Unreleased] – 2026-07-14 · SysnaptiK Neural Rebrand ### Marke & Plattform +- **Echter Lernnetz-Status:** Der Dashboard-Status prüft nun serverseitig den + Fortschrittsspeicher und zeigt nachvollziehbar „bereit“ oder „eingeschränkt“ samt + Zeitstempel und registrierten Lernmodulen. Der dekorative 100%-Ring wurde entfernt. +- **Akzente klar getrennt:** MindMatch ist nun Magenta, SyntaxSaga ein kühleres Violett, + SystemEscape Gelb-Bernstein und FinalProtocol Koralle. Die Plattformkarten sind damit + auf einen Blick unterscheidbar, ohne die Farben in den Spielen selbst anzutasten. +- **Fortschrittsdiagramme korrigiert:** Donut- und Wochenchart lesen den Neural-Akzent + nun von der Plattformhülle statt den alten globalen Orange-Token zu verwenden. +- **Alte Platzhalter-Copy entfernt:** Die Registrierungsrakete und der Zeitreise-Spruch + auf der Vorbereitungsseite wurden durch neutrale SysnaptiK-Neural-Texte ersetzt. +- **Admin-Umfang transparent:** Das Admin-Dashboard benennt jetzt klar, welche + Inhaltsverwaltungen vorhanden sind und dass ServiceClash, NetWorker und FinalProtocol + noch direkt mit der Anwendung ausgeliefert werden. - **Bestehendes Emblem bewahrt:** Die kurzfristig ergänzte CSS-Knotenmarke wurde zurückgenommen. Das vorhandene Emblem bleibt als Wiedererkennungszeichen bestehen, weil es die neue neuronale Metapher bereits passend transportiert. diff --git a/mindfluxfuture.md b/mindfluxfuture.md index a90bd72..99c378b 100644 --- a/mindfluxfuture.md +++ b/mindfluxfuture.md @@ -103,7 +103,8 @@ Accessibility-Widget soll anschließend jeweils den lokalen Akzent übernehmen. > Plattformseiten und FinalProtocol. Die Spielwurzeln sind explizit vom Plattform-Scope > ausgeschlossen und behalten ihre jeweiligen internen Skins. NeuralPause ersetzt die > sichtbare FluxTimer-/Zeitreise-Copy. Domain-/DNS-Umzug und technische Paket-/Tabellennamen -> bleiben bewusst separate Schritte. +> bleiben bewusst separate Schritte. Der Dashboard-Status ist als echter Lernnetz-Status +> umgesetzt: Er prüft den Fortschrittsspeicher statt eine feste Verfügbarkeit vorzutäuschen. ### Ziel und Abgrenzung diff --git a/src/main/java/com/example/mindflux/controller/PlatformStatusController.java b/src/main/java/com/example/mindflux/controller/PlatformStatusController.java new file mode 100644 index 0000000..32f863d --- /dev/null +++ b/src/main/java/com/example/mindflux/controller/PlatformStatusController.java @@ -0,0 +1,24 @@ +package com.example.mindflux.controller; + +import com.example.mindflux.dto.PlatformStatus; +import com.example.mindflux.service.PlatformStatusService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PlatformStatusController { + + private final PlatformStatusService platformStatusService; + + public PlatformStatusController(PlatformStatusService platformStatusService) { + this.platformStatusService = platformStatusService; + } + + @GetMapping("/api/platform/status") + public ResponseEntity status() { + PlatformStatus status = platformStatusService.currentStatus(); + return ResponseEntity.status(status.ready() ? HttpStatus.OK : HttpStatus.SERVICE_UNAVAILABLE).body(status); + } +} diff --git a/src/main/java/com/example/mindflux/dto/PlatformStatus.java b/src/main/java/com/example/mindflux/dto/PlatformStatus.java new file mode 100644 index 0000000..057bad8 --- /dev/null +++ b/src/main/java/com/example/mindflux/dto/PlatformStatus.java @@ -0,0 +1,18 @@ +package com.example.mindflux.dto; + +import java.time.Instant; + +/** + * Ein bewusst kleiner, nachvollziehbarer Plattformzustand für das Dashboard. + * Er behauptet keine fiktive Verfügbarkeit, sondern prüft den Speicher, der + * Spielstände und Fortschritt tatsächlich trägt. + */ +public record PlatformStatus( + boolean storageConnected, + int registeredModules, + Instant checkedAt +) { + public boolean ready() { + return storageConnected; + } +} diff --git a/src/main/java/com/example/mindflux/service/PlatformStatusService.java b/src/main/java/com/example/mindflux/service/PlatformStatusService.java new file mode 100644 index 0000000..8bdb6c2 --- /dev/null +++ b/src/main/java/com/example/mindflux/service/PlatformStatusService.java @@ -0,0 +1,37 @@ +package com.example.mindflux.service; + +import com.example.mindflux.dto.PlatformStatus; +import com.example.mindflux.repository.GameScoreRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DataAccessException; +import org.springframework.stereotype.Service; + +import java.time.Instant; + +@Service +public class PlatformStatusService { + + private static final Logger log = LoggerFactory.getLogger(PlatformStatusService.class); + private static final int REGISTERED_MODULES = 9; + + private final GameScoreRepository gameScoreRepository; + + public PlatformStatusService(GameScoreRepository gameScoreRepository) { + this.gameScoreRepository = gameScoreRepository; + } + + /** + * Die Abfrage ist absichtlich echt: Nur wenn der Fortschrittsspeicher lesbar + * ist, meldet das Dashboard das Lernnetz als bereit. + */ + public PlatformStatus currentStatus() { + try { + gameScoreRepository.count(); + return new PlatformStatus(true, REGISTERED_MODULES, Instant.now()); + } catch (DataAccessException exception) { + log.warn("Fortschrittsspeicher ist für den Lernnetz-Status nicht erreichbar: {}", exception.getMessage()); + return new PlatformStatus(false, REGISTERED_MODULES, Instant.now()); + } + } +} diff --git a/src/main/resources/static/css/platform-neural.css b/src/main/resources/static/css/platform-neural.css index 8d9d592..fcfbe7c 100644 --- a/src/main/resources/static/css/platform-neural.css +++ b/src/main/resources/static/css/platform-neural.css @@ -38,15 +38,15 @@ body.sn-platform .mf-panel, body.sn-platform .mf-card, body.sn-platform .mf-prof body.sn-platform .mf-card { overflow:hidden; } body.sn-platform .mf-card::after { content:""; position:absolute; inset:0; pointer-events:none; opacity:.55; background:radial-gradient(circle at 90% 8%,color-mix(in srgb,var(--accent) 22%,transparent) 0 1px,transparent 2px),linear-gradient(132deg,transparent 0 45%,color-mix(in srgb,var(--accent) 12%,transparent) 45.2% 45.4%,transparent 45.6%); } body.sn-platform .mf-card > * { position:relative; z-index:1; } -body.sn-platform .mf-card-mindmatch { --accent:#c078f2; --accent-2:#ebc0ff; --glow-s:rgba(192,120,242,.40); } +body.sn-platform .mf-card-mindmatch { --accent:#df68b9; --accent-2:#ffc0e7; --glow-s:rgba(223,104,185,.40); } body.sn-platform .mf-card-techtacular { --accent:#d6db47; --accent-2:#f2f58a; --glow-s:rgba(214,219,71,.36); } body.sn-platform .mf-card-devlab { --accent:#78d7a0; --accent-2:#b4ebc8; --glow-s:rgba(120,215,160,.40); } -body.sn-platform .mf-card-syntaxsaga { --accent:#b176ef; --accent-2:#dfbfff; --glow-s:rgba(177,118,239,.40); } -body.sn-platform .mf-card-codeescape { --accent:#e5ae5b; --accent-2:#f8d09b; --glow-s:rgba(229,174,91,.38); } +body.sn-platform .mf-card-syntaxsaga { --accent:#9276f0; --accent-2:#d1c8ff; --glow-s:rgba(146,118,240,.40); } +body.sn-platform .mf-card-codeescape { --accent:#edcb4c; --accent-2:#fff0a8; --glow-s:rgba(237,203,76,.38); } body.sn-platform .mf-card-serviceclash { --accent:#3abec5; --accent-2:#9de9e6; --glow-s:rgba(58,190,197,.38); } body.sn-platform .mf-card-bughunter { --accent:#e85e68; --accent-2:#ffb6bd; --glow-s:rgba(232,94,104,.38); } body.sn-platform .mf-card-networker { --accent:#55bdf0; --accent-2:#b2e7ff; --glow-s:rgba(85,189,240,.38); } -body.sn-platform .mf-card-finalprotocol { --accent:#f09043; --accent-2:#ffd0a2; --glow-s:rgba(240,144,67,.38); } +body.sn-platform .mf-card-finalprotocol { --accent:#ed7849; --accent-2:#ffd0b5; --glow-s:rgba(237,120,73,.38); } body.sn-platform .mf-footer { background:rgba(3,11,13,.72); border-color:#173438; } body.sn-platform .mf-center { min-height:100vh; position:relative; } body.sn-platform .auth-container { background:linear-gradient(145deg,rgba(10,29,32,.98),rgba(4,14,17,.98)); border-color:rgba(120,215,160,.46); } diff --git a/src/main/resources/templates/admin/dashboard.html b/src/main/resources/templates/admin/dashboard.html index a1946da..c060ee8 100644 --- a/src/main/resources/templates/admin/dashboard.html +++ b/src/main/resources/templates/admin/dashboard.html @@ -35,7 +35,7 @@
Control Center

✨ Admin-Dashboard ✨

-

Hier steuerst du die Plattform und ihre Lerninhalte.

+

Hier steuerst du die verfügbaren Lerninhalte und die Benutzerverwaltung.

@@ -52,7 +52,8 @@ 🕵️ BugHunter-Fallakten verwalten

- Hier entsteht noch Großes... ✨ Bleib dran! + Für ServiceClash, NetWorker und FinalProtocol gibt es derzeit bewusst keine + Inhaltsverwaltung: Ihre Aufgaben werden noch direkt mit der Anwendung ausgeliefert.

diff --git a/src/main/resources/templates/dashboard.html b/src/main/resources/templates/dashboard.html index 7485676..c6f17e0 100644 --- a/src/main/resources/templates/dashboard.html +++ b/src/main/resources/templates/dashboard.html @@ -10,10 +10,21 @@