Remember NeuralNet chat and simplify notifications
mindflux-ci / build (push) Successful in 23s

This commit is contained in:
AliceDarkest
2026-07-14 16:59:30 +02:00
parent ac5e6e6496
commit ad94c232f6
6 changed files with 42 additions and 9 deletions
+4
View File
@@ -7,6 +7,10 @@ Versionierung [semantisch](https://semver.org/lang/de/).
## [Unreleased] – 2026-07-14 · SysnaptiK Neural Rebrand
### Marke & Plattform
- **NeuralNet aufgeräumt:** Der leere Gesprächshinweis verschwindet beim Öffnen
wirklich, die letzte Verbindung wird pro Konto gespeichert und beim nächsten
Besuch direkt wieder geöffnet. Die Sprechblase bleibt neutral und invertiert
nur bei ungelesenen Nachrichten.
- **NeuralNet-Benachrichtigung:** Die Dashboard-Glocke ist jetzt eine
Sprechblase. Sie zeigt den echten Zähler ungelesener Direktnachrichten und
leuchtet in der Neural-Akzentfarbe, bis die Nachrichten gelesen sind.
+1
View File
@@ -493,6 +493,7 @@ Der Verdacht „Profilbutton fehlt / Einstellungen nicht im Profil / irgendwas i
> Die dynamisch gerenderten Kontakt- und Chat-Aktionen werden direkt gebunden.
> Der Chatbereich hält Kopf, Verlauf und Eingabe als zusammenhängende Spalte.
> Die Dashboard-Sprechblase zeigt im 30-Sekunden-Takt echte ungelesene Nachrichten.
> Die zuletzt geöffnete bestätigte Verbindung wird pro Konto lokal wiederhergestellt.
> Blockieren, Melden/Moderation, Duelle und Lernlobby bleiben die nächsten Ausbauschritte.
> Ersetzt den `/soziales`-Platzhalter („Straßen? Wo wir hingehen, brauchen wir keine Straßen!"). Ziel: User können sich befreunden, intern miteinander schreiben, gemeinsam lernen und Achievements vergleichen – **vollständig selbst gehostet, ohne einen einzigen externen Dienst**, und DSGVO-konform von Grund auf.
+1 -1
View File
@@ -1,4 +1,4 @@
.nn-head{margin:1.3rem 0}.nn-head>span,.nn-chat small{color:var(--accent);font:700 .72rem/1 monospace;letter-spacing:.14em}.nn-head h1{margin:.4rem 0;color:var(--heading)}.nn-head p{color:var(--muted)}.nn-optin{max-width:700px}.nn-optin p{color:var(--muted);line-height:1.6}
.nn-app{display:grid;grid-template-columns:minmax(270px,340px) minmax(0,1fr);gap:1rem;align-items:start}.nn-sidebar{display:grid;align-content:start;gap:1rem}.nn-request div{display:flex;gap:.45rem}.nn-request .mf-input{min-width:0}.nn-section{border-top:1px solid var(--border);padding-top:.85rem}.nn-section h2{font-size:.82rem;color:var(--heading);margin:0 0 .5rem}.nn-list{display:grid;gap:.45rem}.nn-item{display:flex;align-items:center;justify-content:space-between;gap:.5rem;border:1px solid var(--border);background:var(--surface-2);padding:.55rem .65rem;border-radius:8px;color:var(--text);font-size:.84rem}.nn-item button{border:0;background:none;color:var(--secondary);font:inherit;cursor:pointer}.nn-item button:hover,.nn-item button.active{color:var(--accent)}.nn-actions{display:flex;gap:.35rem}.nn-actions button{border:1px solid var(--border);padding:.22rem .38rem;border-radius:5px}
.nn-chat{min-height:530px;display:flex;flex-direction:column}.nn-empty{flex:1;min-height:430px;display:grid;place-content:center;text-align:center;gap:.5rem;color:var(--muted)}.nn-empty strong{color:var(--heading);font-size:1.1rem}.nn-chat [data-nn-conversation]{display:flex;flex:1;flex-direction:column;min-height:494px}.nn-chat [data-nn-conversation][hidden]{display:none}.nn-chat header{border-bottom:1px solid var(--border);padding-bottom:.9rem}.nn-chat h2{margin:.25rem 0 0;color:var(--heading)}.nn-messages{display:flex;flex:1;flex-direction:column;gap:.6rem;min-height:340px;overflow:auto;padding:1rem 0}.nn-message{align-self:flex-start;max-width:min(80%,550px);padding:.65rem .8rem;border-radius:10px;background:var(--surface-2);border:1px solid var(--border);color:var(--text);line-height:1.45}.nn-message.mine{align-self:flex-end;border-color:var(--border-accent);background:color-mix(in srgb,var(--accent) 12%,var(--surface))}.nn-message small{display:block;margin-top:.35rem;color:var(--muted);font-size:.66rem}.nn-compose{display:grid;grid-template-columns:1fr auto;gap:.6rem;border-top:1px solid var(--border);padding-top:.85rem}.nn-compose textarea{min-height:52px;resize:vertical;background:var(--surface-2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:.65rem;font:inherit}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
.nn-chat{min-height:530px;display:flex;flex-direction:column}.nn-empty{flex:1;min-height:430px;display:grid;place-content:center;text-align:center;gap:.5rem;color:var(--muted)}.nn-empty[hidden]{display:none}.nn-empty strong{color:var(--heading);font-size:1.1rem}.nn-chat [data-nn-conversation]{display:flex;flex:1;flex-direction:column;min-height:494px}.nn-chat [data-nn-conversation][hidden]{display:none}.nn-chat header{border-bottom:1px solid var(--border);padding-bottom:.9rem}.nn-chat h2{margin:.25rem 0 0;color:var(--heading)}.nn-messages{display:flex;flex:1;flex-direction:column;gap:.6rem;min-height:340px;overflow:auto;padding:1rem 0}.nn-message{align-self:flex-start;max-width:min(80%,550px);padding:.65rem .8rem;border-radius:10px;background:var(--surface-2);border:1px solid var(--border);color:var(--text);line-height:1.45}.nn-message.mine{align-self:flex-end;border-color:var(--border-accent);background:color-mix(in srgb,var(--accent) 12%,var(--surface))}.nn-message small{display:block;margin-top:.35rem;color:var(--muted);font-size:.66rem}.nn-compose{display:grid;grid-template-columns:1fr auto;gap:.6rem;border-top:1px solid var(--border);padding-top:.85rem}.nn-compose textarea{min-height:52px;resize:vertical;background:var(--surface-2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:.65rem;font:inherit}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
@media(max-width:800px){.nn-app{grid-template-columns:1fr}.nn-chat{min-height:400px}.nn-chat [data-nn-conversation]{min-height:364px}.nn-messages{min-height:210px}.nn-request div{flex-wrap:wrap}.nn-request .mf-input{flex:1}}
+31 -1
View File
@@ -38,12 +38,41 @@
}).join('') : '<span class="mf-small-hint">Noch keine Verbindungen.</span>';
bindConnectionActions();
}
function selectionKey() { return 'mindflux.neuralnet.selected.' + me; }
function savedSelection() {
try { return localStorage.getItem(selectionKey()); } catch (ignored) { return null; }
}
function saveSelection(user) {
try { localStorage.setItem(selectionKey(), user); } catch (ignored) { }
}
function clearSelection() {
try { localStorage.removeItem(selectionKey()); } catch (ignored) { }
}
function closeChat() {
q('[data-nn-empty]').hidden = false;
q('[data-nn-conversation]').hidden = true;
}
async function refresh() {
var data = await api('/overview');
me = data.username;
q('#nnOptIn').hidden = data.enabled;
q('#nnApp').hidden = !data.enabled;
if (data.enabled) render(data);
if (!data.enabled) return;
var restored = false;
if (!selected) {
selected = savedSelection();
restored = Boolean(selected);
}
if (selected && !data.connections.includes(selected)) {
selected = null;
clearSelection();
closeChat();
}
render(data);
if (restored && selected) {
openChat(selected);
loadChat().catch(function (error) { message(error.message); });
}
}
async function loadChat() {
if (!selected) return;
@@ -63,6 +92,7 @@
}
async function selectChat(user) {
openChat(user);
saveSelection(user);
try { await loadChat(); } catch (error) { message(error.message); }
}
function bindConnectionActions() {
+3 -5
View File
@@ -25,13 +25,11 @@
.status-details b { color:var(--text); font-weight:600; text-align:right; }
.status-toggle { grid-column:1 / -1; justify-self:start; border:0; padding:0; background:transparent; color:var(--secondary); font:inherit; font-size:.72rem; cursor:pointer; }
.status-toggle:hover { text-decoration:underline; }
.nn-trigger { position:relative; color:var(--secondary); }
.nn-trigger.unread { color:var(--accent); border-color:color-mix(in srgb,var(--accent) 72%,var(--border)); background:color-mix(in srgb,var(--accent) 16%,var(--surface)); box-shadow:0 0 18px var(--glow-s); animation:nn-notification-pulse 1.8s ease-in-out infinite; }
.nn-trigger { position:relative; }
.nn-trigger.unread { color:var(--surface); border-color:var(--secondary); background:var(--secondary); box-shadow:0 0 14px color-mix(in srgb,var(--secondary) 30%,transparent); }
.nn-trigger svg { width:20px; height:20px; }
.nn-unread { position:absolute; top:-6px; right:-7px; min-width:17px; height:17px; padding:0 4px; display:grid; place-items:center; border:2px solid var(--surface); border-radius:99px; background:var(--accent); color:var(--accent-ink); font-size:.62rem; font-weight:900; line-height:1; box-shadow:0 0 10px var(--glow-s); }
.nn-unread { position:absolute; top:-6px; right:-7px; min-width:17px; height:17px; padding:0 4px; display:grid; place-items:center; border:2px solid var(--surface); border-radius:99px; background:var(--panel); color:var(--secondary); font-size:.62rem; font-weight:900; line-height:1; box-shadow:0 0 10px color-mix(in srgb,var(--secondary) 28%,transparent); }
.nn-unread[hidden] { display:none; }
@keyframes nn-notification-pulse { 50% { box-shadow:0 0 25px var(--glow-s); transform:translateY(-1px); } }
@media (prefers-reduced-motion:reduce) { .nn-trigger.unread { animation:none; } }
.prog-top { display:flex; justify-content:space-between; align-items:center; margin-bottom:.4rem; }
.pill { font-size:.68rem; color:var(--muted); border:1px solid var(--border); border-radius:7px; padding:.2rem .5rem; }
.prog-big { display:flex; align-items:baseline; gap:.5rem; }
+2 -2
View File
@@ -3,8 +3,8 @@
<head>
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NeuralNet – SysnaptiK Neural</title>
<link rel="stylesheet" href="/css/theme.css?v=3"><link rel="stylesheet" href="/css/neuralnet.css?v=2">
<script src="/js/theme.js?v=3"></script><script src="/js/neuralnet.js?v=4" defer></script>
<link rel="stylesheet" href="/css/theme.css?v=3"><link rel="stylesheet" href="/css/neuralnet.css?v=3">
<script src="/js/theme.js?v=3"></script><script src="/js/neuralnet.js?v=5" defer></script>
</head>
<body>
<div class="mf-theme-float"><button class="mf-theme"></button></div>