diff --git a/CHANGELOG.md b/CHANGELOG.md index 01d2193..b166be6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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. diff --git a/mindfluxfuture.md b/mindfluxfuture.md index 7b57851..ded6018 100644 --- a/mindfluxfuture.md +++ b/mindfluxfuture.md @@ -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. diff --git a/src/main/resources/static/css/neuralnet.css b/src/main/resources/static/css/neuralnet.css index 233e802..5c66176 100644 --- a/src/main/resources/static/css/neuralnet.css +++ b/src/main/resources/static/css/neuralnet.css @@ -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}} diff --git a/src/main/resources/static/js/neuralnet.js b/src/main/resources/static/js/neuralnet.js index c004631..1e9e5dc 100644 --- a/src/main/resources/static/js/neuralnet.js +++ b/src/main/resources/static/js/neuralnet.js @@ -38,12 +38,41 @@ }).join('') : 'Noch keine Verbindungen.'; 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() { diff --git a/src/main/resources/templates/dashboard.html b/src/main/resources/templates/dashboard.html index 4e62582..7b6e09a 100644 --- a/src/main/resources/templates/dashboard.html +++ b/src/main/resources/templates/dashboard.html @@ -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; } diff --git a/src/main/resources/templates/soziales.html b/src/main/resources/templates/soziales.html index 8338584..9a6fb9c 100644 --- a/src/main/resources/templates/soziales.html +++ b/src/main/resources/templates/soziales.html @@ -3,8 +3,8 @@