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