SSR-Renderer entfernt, Fokus auf SPA + JSON-API

Die Kernlogik bleibt von der Schnittstelle getrennt; der letzte SSR-Stand
liegt im Tag ssr-archiv. Die Moderationsseite bleibt, liefert Fehler aber
als JSON.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TiXsPUqw7oeomZ8wZrQW5q
This commit is contained in:
irrlicht
2026-09-26 21:28:34 +02:00
co-authored by Claude Opus 5.5
parent eccddcebe6
commit c6ab082f8c
26 changed files with 50 additions and 2603 deletions
+1 -18
View File
@@ -305,8 +305,7 @@ img.avatar-lg { width: 72px; height: 72px; }
/* Melden sitzt rechtsbündig in der Meta-Zeile (weit weg von den Interaktionen).
margin-left:auto schiebt es im Byline-Flex ganz nach rechts; position:relative
verankert das aufklappende Grund-Feld. Der <details>-Zweischritt (erst öffnen,
dann absenden) verhindert versehentliche Meldungen; nativ (details/summary +
echtes Formular), damit es später auch ohne JS funktioniert. */
dann absenden) verhindert versehentliche Meldungen. */
details.report {
margin-left: auto;
position: relative;
@@ -440,19 +439,3 @@ hr {
flex-basis: 13rem;
white-space: normal;
}
/* Blätternavigation des serverseitig gerenderten Feeds. Ohne JavaScript gibt
es kein Nachladen beim Scrollen -- stattdessen Zurück/Weiter am Seitenende.
space-between hält die Seitenanzeige mittig, auch wenn auf der ersten bzw.
letzten Seite einer der beiden Links fehlt. */
.pager {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin: 1.5rem 0;
}
.pager > span {
flex: 1;
text-align: center;
}
+1 -4
View File
@@ -21,10 +21,7 @@
<main>
<noscript>
<p class="msg">Diese Startseite braucht derzeit noch JavaScript. Ohne JS
nutzbar ist bereits alles Wesentliche – Lesen, Schreiben, Antworten,
Abstimmen und Melden: <a href="/feed">zum Feed</a> ·
<a href="/auth/login">Login</a> · <a href="/auth/register">Registrieren</a>.</p>
<p class="msg">Diese Seite braucht JavaScript.</p>
</noscript>
<!-- Login / Registrierung -->
+3 -6
View File
@@ -1,8 +1,6 @@
"use strict";
// Accept: application/json markiert diese Aufrufe als API-Zugriffe. Endpunkte,
// die auch ein Browser-Formular bedienen (siehe wantsJSON im Backend),
// antworten daraufhin mit JSON statt mit einem Redirect auf eine HTML-Seite.
// Die API antwortet ausschließlich mit JSON; der Accept-Header sagt das explizit.
const JSON_HEADERS = { Accept: "application/json" };
const api = {
@@ -230,9 +228,8 @@ function setupBump(el, e) {
// setupReport verdrahtet den Melden-Aufklapper. Der <details>-Zweischritt
// (öffnen -> absenden) verhindert versehentliche Meldungen und hält das Grund-
// Feld eingeklappt. Das Formular ist ein echtes method=post-Form, damit es
// später auch ohne JS funktioniert; hier fangen wir den Submit nur ab, um
// Inline-Feedback zu geben statt die Seite neu zu laden. stopPropagation, weil
// Feld eingeklappt. Der Submit wird abgefangen, um Inline-Feedback zu geben
// statt die Seite neu zu laden. stopPropagation, weil
// die Karte sonst bei jedem Klick nach /e/{pid} navigieren würde.
function setupReport(el, pid) {
const details = el.querySelector("details.report");