Reserviert für dich
-
+
{{ item.anzeige_titel }} ist jetzt für dich zurückgelegt.
@@ -13,7 +13,7 @@
zurückgenommen werden, ohne dass jemand ein Konto braucht. #}
-
+
Ohne diesen Link kannst du die Reservierung nicht selbst aufheben –
dann hilft nur eine kurze Nachricht.
diff --git a/app/version.py b/app/version.py
new file mode 100644
index 0000000..1498ee4
--- /dev/null
+++ b/app/version.py
@@ -0,0 +1,33 @@
+"""Versionsangabe für die Fusszeile.
+
+Gleiche Idee wie in der Kantone-App: die CI reicht Tag und Commit als
+Build-Argumente durch. Lokal bleiben beide leer, dann erscheint der
+Build-Zeitpunkt - der ändert sich bei jedem Neubau und zeigt damit sofort,
+ob wirklich der neue Stand läuft.
+"""
+
+import os
+from functools import lru_cache
+from pathlib import Path
+
+BUILD_DATEI = Path("/app/build.txt")
+
+
+@lru_cache
+def version_info() -> dict[str, str]:
+ version = os.getenv("APP_VERSION", "").strip()
+ revision = os.getenv("APP_REVISION", "").strip()
+
+ if version:
+ return {"art": "release", "label": f"Version {version}",
+ "titel": f"Commit {revision[:7]}" if revision else ""}
+
+ if revision:
+ return {"art": "commit", "label": f"Commit {revision[:7]}",
+ "titel": "Kein Release - aus einem einzelnen Commit gebaut"}
+
+ build = ""
+ if BUILD_DATEI.is_file():
+ build = BUILD_DATEI.read_text(encoding="utf-8").strip()
+ return {"art": "lokal", "label": build or "Entwicklungsstand",
+ "titel": "Lokal gebaut, ohne Versionsangabe"}
diff --git a/tailwind-input.css b/tailwind-input.css
index 9f99c7d..81b6ce9 100644
--- a/tailwind-input.css
+++ b/tailwind-input.css
@@ -9,13 +9,26 @@
@apply inline-flex items-center justify-center gap-2 min-h-[44px]
px-4 rounded-xl font-semibold transition;
}
- .knopf-haupt { @apply knopf bg-marke-700 text-white hover:bg-marke-800; }
- .knopf-still { @apply knopf bg-slate-100 text-slate-700 hover:bg-slate-200; }
+ .knopf-haupt {
+ @apply knopf bg-marke-700 text-white hover:bg-marke-800
+ dark:bg-marke-600 dark:hover:bg-marke-700;
+ }
+ .knopf-still {
+ @apply knopf bg-slate-100 text-slate-700 hover:bg-slate-200
+ dark:bg-slate-700 dark:text-slate-100 dark:hover:bg-slate-600;
+ }
.feld {
@apply w-full min-h-[44px] px-3 rounded-xl border border-slate-300
bg-white text-slate-900 focus:outline-none focus:ring-2
- focus:ring-marke-600;
+ focus:ring-marke-600
+ dark:border-slate-600 dark:bg-slate-800 dark:text-slate-100;
+ }
+ .etikett {
+ @apply block text-sm font-medium text-slate-600 mb-1
+ dark:text-slate-300;
+ }
+ .karte {
+ @apply bg-white rounded-2xl shadow-sm overflow-hidden
+ dark:bg-slate-800;
}
- .etikett { @apply block text-sm font-medium text-slate-600 mb-1; }
- .karte { @apply bg-white rounded-2xl shadow-sm overflow-hidden; }
}
diff --git a/tailwind.config.js b/tailwind.config.js
index 6429b03..6d38e56 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -4,6 +4,9 @@
* app/static/style.css und ist darum nicht im Repository.
*/
module.exports = {
+ // Umschaltbar per Klasse am , gesetzt von app/static/theme.js.
+ // Nicht "media": sonst liesse sich nur dem System folgen, ohne eigene Wahl.
+ darkMode: "class",
content: ["./app/templates/**/*.html"],
theme: {
extend: {
diff --git a/tests/test_seiten.py b/tests/test_seiten.py
index 6b85e3a..b69aa8c 100644
--- a/tests/test_seiten.py
+++ b/tests/test_seiten.py
@@ -221,3 +221,45 @@ def test_seiten_laden_nichts_von_fremden_servern(client, kategorie_id):
html = client.get(pfad).text
fremde = re.findall(r'(?:src|href)="(?:https?:)?//[^"]+"', html)
assert not fremde, f"{pfad} lädt von aussen: {fremde}"
+
+
+# --------------------------------------------------------- Darstellung ---
+
+def test_fusszeile_zeigt_die_version(client, monkeypatch):
+ """Die CI reicht Tag und Commit durch; lokal steht der Build-Zeitpunkt."""
+ from app.version import version_info
+
+ version_info.cache_clear()
+ monkeypatch.setenv("APP_VERSION", "1.2.3")
+ monkeypatch.setenv("APP_REVISION", "abcdef1234567")
+ try:
+ assert "Version 1.2.3" in client.get("/").text
+ finally:
+ version_info.cache_clear()
+
+
+def test_ohne_tag_erscheint_der_commit(client, monkeypatch):
+ from app.version import version_info
+
+ version_info.cache_clear()
+ monkeypatch.setenv("APP_VERSION", "")
+ monkeypatch.setenv("APP_REVISION", "abcdef1234567")
+ try:
+ assert "Commit abcdef1" in client.get("/").text
+ finally:
+ version_info.cache_clear()
+
+
+def test_farbschema_skript_laeuft_vor_dem_zeichnen(client):
+ """Ohne das blitzt beim Laden kurz die helle Fassung auf."""
+ html = client.get("/").text
+ theme = html.index('src="/static/theme.js"')
+ koerper = html.index(" stehen"
+ # und darf nicht verzögert werden
+ zeile = html[html.rindex("