From 43c640dee65a83fbce8b23fbcd5f6a4100b8946e Mon Sep 17 00:00:00 2001 From: irrlicht Date: Sun, 27 Sep 2026 15:14:53 +0200 Subject: [PATCH] Rechtstexte wieder gestylt: als Vite-Einstiege mit app.css gebaut MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Seiten verlinkten /css/app.css, das es seit dem React-Umbau nicht mehr gibt. Jetzt liegen sie unter frontend/static/docs, Vite baut sie mit und schreibt den Link auf das gehashte app.css um; serveDoc liefert sie unter den bisherigen Adressen /static/docs/… aus web/ aus. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TiXsPUqw7oeomZ8wZrQW5q --- frontend.go | 10 ++++++++++ {static => frontend/static}/docs/beitragsordnung.html | 2 +- {static => frontend/static}/docs/datenschutz.html | 2 +- {static => frontend/static}/docs/impressum.html | 2 +- frontend/vite.config.ts | 10 ++++++++++ main.go | 3 ++- notes/frontend.md | 4 ++++ 7 files changed, 29 insertions(+), 4 deletions(-) rename {static => frontend/static}/docs/beitragsordnung.html (99%) rename {static => frontend/static}/docs/datenschutz.html (99%) rename {static => frontend/static}/docs/impressum.html (98%) diff --git a/frontend.go b/frontend.go index 12f6f3c..39e4523 100644 --- a/frontend.go +++ b/frontend.go @@ -2,7 +2,10 @@ package main import ( "net/http" + "path" "strings" + + "github.com/go-chi/chi/v5" ) // webDir enthält das gebaute React-Frontend (frontend/ -> npm run build): @@ -19,6 +22,13 @@ func serveApp(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, webDir+"/index.html") } +// serveDoc liefert einen Rechtstext. Sie werden mit dem Frontend gebaut +// (frontend/static/docs), damit sie dasselbe app.css bekommen. +func serveDoc(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Cache-Control", "no-cache") + http.ServeFile(w, r, webDir+"/static/docs/"+path.Base(chi.URLParam(r, "page"))) +} + // serveAssets liefert die gebauten JS/CSS-Dateien. Ihre Namen enthalten einen // Inhalts-Hash, sie ändern sich also nie -> dauerhaft cachebar. Verzeichnisse // gibt es nicht zu sehen (kein Listing). diff --git a/static/docs/beitragsordnung.html b/frontend/static/docs/beitragsordnung.html similarity index 99% rename from static/docs/beitragsordnung.html rename to frontend/static/docs/beitragsordnung.html index 4d76400..2ffeace 100644 --- a/static/docs/beitragsordnung.html +++ b/frontend/static/docs/beitragsordnung.html @@ -4,7 +4,7 @@ Beitragsordnung - Kontrollverlust - +
diff --git a/static/docs/datenschutz.html b/frontend/static/docs/datenschutz.html similarity index 99% rename from static/docs/datenschutz.html rename to frontend/static/docs/datenschutz.html index 4c6c462..fc80844 100644 --- a/static/docs/datenschutz.html +++ b/frontend/static/docs/datenschutz.html @@ -4,7 +4,7 @@ Datenschutz - Kontrollverlust - +
diff --git a/static/docs/impressum.html b/frontend/static/docs/impressum.html similarity index 98% rename from static/docs/impressum.html rename to frontend/static/docs/impressum.html index f10e6d3..d384c84 100644 --- a/static/docs/impressum.html +++ b/frontend/static/docs/impressum.html @@ -4,7 +4,7 @@ Impressum - Kontrollverlust - +
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 90e3a43..d619211 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -16,9 +16,19 @@ export default defineConfig({ // Das Go-Backend liefert das Build aus web/ aus (siehe frontend.go). // emptyOutDir muss explizit an sein, weil das Ziel außerhalb von frontend/ // liegt. + // Die Rechtstexte sind eigene statische Seiten ohne JS; als weitere Einstiege + // bekommen sie dasselbe gebaute app.css wie die App. build: { outDir: "../web", emptyOutDir: true, + rollupOptions: { + input: [ + "index.html", + "static/docs/impressum.html", + "static/docs/datenschutz.html", + "static/docs/beitragsordnung.html", + ], + }, }, server: { proxy: { diff --git a/main.go b/main.go index 2503763..1a98e83 100644 --- a/main.go +++ b/main.go @@ -171,8 +171,9 @@ func routes() http.Handler { http.Redirect(w, r, "/stats", http.StatusMovedPermanently) }) r.Handle("/assets/*", serveAssets()) + r.Get("/static/docs/{page}", serveDoc) - // Hochgeladene Medien + statische Dateien (Schriften, Rechtstexte). + // Hochgeladene Medien + statische Dateien (Schriften, Bilder). // nosniff (global via secHeaders) verhindert, dass der Browser eine // durchgereichte (nicht re-kodierte) Datei als HTML/JS interpretiert -> // schließt Polyglot/Stored-XSS über Bild-Uploads. diff --git a/notes/frontend.md b/notes/frontend.md index 2ca0e88..aa9c446 100644 --- a/notes/frontend.md +++ b/notes/frontend.md @@ -24,6 +24,10 @@ Vite reicht `/api` und `/static` ans Backend durch (`frontend/vite.config.ts`, (gitignored). Von dort liefert das Go-Backend aus (`frontend.go`), lokal also auch ohne Vite: `npm run build`, dann `go run .`. +Die Rechtstexte (`frontend/static/docs/*.html`) sind reine HTML-Seiten ohne JS, +aber weitere Einstiege des Builds (`vite.config.ts`). So bekommen sie dasselbe +gebaute `app.css`; ausgeliefert unter `/static/docs/…` (`serveDoc`). + ### DEV-Container `./dev-up.sh` baut das Image aus dem Arbeitsverzeichnis und startet den