feat(was-ist-neu): Ankuendigungs-Seite zur 2.0 mit Intention pro Block
Erklaert die acht groessten Veraenderungen seit 1.0 — Buerger:innen-Modus, Tour mit Sprachausgabe, Stimmverhalten, Aktuelle-Themen-Dashboard, Programme mit zeitpunkt-genauer Bewertung, Scorecards, Auswertungen und Quellen-Suche — jeweils mit kurzer Intention und Umsetzungsbeschreibung. Topbar-Link rechts oben (vor Methodik), Endpoint /was-ist-neu, Template unter v2/screens/was-ist-neu.html. Eigene neu-* CSS-Klassen analog zu methodik.html, daher kein neuer Inline-Style-Eintrag.
This commit is contained in:
parent
e7ba6ee19c
commit
fabe3c6514
14
app/main.py
14
app/main.py
@ -2029,6 +2029,20 @@ async def methodik_page(request: Request, current_user: Optional[dict] = Depends
|
||||
})
|
||||
|
||||
|
||||
@app.get("/was-ist-neu", response_class=HTMLResponse)
|
||||
async def was_ist_neu_page(request: Request, current_user: Optional[dict] = Depends(get_current_user)):
|
||||
"""Was-ist-neu-Seite zur 2.0-Ankuendigung.
|
||||
|
||||
Erklaert die acht groessten Veraenderungen seit 1.0 mit Intention und
|
||||
grober Umsetzung pro Block.
|
||||
"""
|
||||
return templates.TemplateResponse("v2/screens/was-ist-neu.html", {
|
||||
"request": request,
|
||||
"app_name": settings.app_name,
|
||||
**_v2_template_context(current_user),
|
||||
})
|
||||
|
||||
|
||||
@app.get("/quellen", response_class=HTMLResponse)
|
||||
async def quellen_page(request: Request, current_user: Optional[dict] = Depends(get_current_user)):
|
||||
"""Quellen-Seite mit allen Wahl- und Parteiprogrammen, nach BL gruppiert."""
|
||||
|
||||
@ -81,6 +81,7 @@
|
||||
<header class="v2-topbar">
|
||||
<button id="v2-menu-toggle" class="v2-menu-toggle" aria-label="Navigation öffnen">☰</button>
|
||||
<span class="v2-topbar-spacer"></span>
|
||||
<a href="/was-ist-neu">{{ icon("file-plus", 13) }} Was ist neu</a>
|
||||
<a href="/methodik">{{ icon("info", 13) }} Methodik</a>
|
||||
<a href="/quellen">{{ icon("book-open", 13) }} Quellen</a>
|
||||
{# Tour-Link: nur sichtbar wenn die aktuelle Page Tour-Stationen
|
||||
|
||||
323
app/templates/v2/screens/was-ist-neu.html
Normal file
323
app/templates/v2/screens/was-ist-neu.html
Normal file
@ -0,0 +1,323 @@
|
||||
{% extends "v2/base.html" %}
|
||||
|
||||
{% block title %}Was ist neu — GWÖ-Antragsprüfer{% endblock %}
|
||||
|
||||
{% set v2_active_nav = "" %}
|
||||
|
||||
{% block head_extra %}
|
||||
<style>
|
||||
.neu-layout {
|
||||
display: grid;
|
||||
grid-template-columns: 220px 1fr;
|
||||
gap: 2rem;
|
||||
align-items: start;
|
||||
}
|
||||
@media (max-width: 720px) {
|
||||
.neu-layout { grid-template-columns: 1fr; }
|
||||
.neu-toc { display: none; }
|
||||
}
|
||||
.neu-toc {
|
||||
position: sticky;
|
||||
top: 72px;
|
||||
font-size: 12px;
|
||||
font-family: var(--font-mono);
|
||||
line-height: 1.8;
|
||||
border-left: 2px solid var(--ecg-green);
|
||||
padding-left: 12px;
|
||||
color: var(--ecg-dark);
|
||||
opacity: 0.85;
|
||||
}
|
||||
.neu-toc a {
|
||||
display: block;
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
opacity: 0.75;
|
||||
transition: opacity 0.1s;
|
||||
}
|
||||
.neu-toc a:hover { opacity: 1; color: var(--ecg-green); }
|
||||
.neu-body {
|
||||
max-width: 720px;
|
||||
font-family: var(--font-text);
|
||||
line-height: 1.65;
|
||||
color: var(--ecg-dark);
|
||||
}
|
||||
.neu-body h2 {
|
||||
font-family: var(--font-display);
|
||||
font-size: 20px;
|
||||
color: var(--ecg-teal);
|
||||
margin: 2.5rem 0 0.75rem;
|
||||
padding-bottom: 4px;
|
||||
border-bottom: 2px solid var(--ecg-teal);
|
||||
}
|
||||
.neu-body h2:first-child { margin-top: 0; }
|
||||
.neu-body h3 {
|
||||
font-family: var(--font-display);
|
||||
font-size: 14px;
|
||||
color: var(--ecg-green);
|
||||
margin: 1.25rem 0 0.5rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
}
|
||||
.neu-body p { margin: 0.75rem 0; }
|
||||
.neu-body ul { margin: 0.5rem 0 0.75rem; padding-left: 1.25rem; }
|
||||
.neu-body li { margin: 0.25rem 0; }
|
||||
.neu-body code {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 0.9em;
|
||||
background: var(--ecg-card-bg);
|
||||
padding: 1px 4px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.neu-body a { color: var(--ecg-blue); }
|
||||
|
||||
.neu-hero {
|
||||
background: var(--ecg-card-bg);
|
||||
border-left: 4px solid var(--ecg-teal);
|
||||
padding: 1rem 1.25rem;
|
||||
margin: 0 0 2rem;
|
||||
font-family: var(--font-text);
|
||||
line-height: 1.55;
|
||||
}
|
||||
.neu-hero strong { color: var(--ecg-teal); }
|
||||
.neu-hero .neu-hero-meta {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 11px;
|
||||
color: var(--ecg-dark);
|
||||
opacity: 0.7;
|
||||
margin-top: 0.4rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
}
|
||||
|
||||
.neu-intent-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
gap: 0.75rem;
|
||||
margin: 0.75rem 0 1.25rem;
|
||||
}
|
||||
.neu-intent {
|
||||
border: 1px solid var(--ecg-border, #e0d8c8);
|
||||
border-radius: 4px;
|
||||
padding: 0.75rem 1rem;
|
||||
background: var(--ecg-card-bg);
|
||||
}
|
||||
.neu-intent .neu-intent-label {
|
||||
font-family: var(--font-mono);
|
||||
font-size: 10px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
color: var(--ecg-green);
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
.neu-intent p { margin: 0.25rem 0 0; font-size: 14px; }
|
||||
</style>
|
||||
{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
<div class="neu-layout">
|
||||
|
||||
<aside class="neu-toc">
|
||||
<a href="#einstieg">Worum geht es</a>
|
||||
<a href="#buerger-modus">Bürger:innen-Modus</a>
|
||||
<a href="#tour">Tour mit Sprachausgabe</a>
|
||||
<a href="#stimmverhalten">Stimmverhalten</a>
|
||||
<a href="#aktuelle-themen">Aktuelle Themen</a>
|
||||
<a href="#programme">Wahlprogramme</a>
|
||||
<a href="#scorecards">Scorecards</a>
|
||||
<a href="#auswertungen">Auswertungen</a>
|
||||
<a href="#quellen">Quellen-Suche</a>
|
||||
<a href="#sicherheit">Anmeldung</a>
|
||||
</aside>
|
||||
|
||||
<article class="neu-body">
|
||||
|
||||
<h2 id="einstieg">Was ist neu in 2.0</h2>
|
||||
|
||||
<div class="neu-hero">
|
||||
Version 2.0 verschiebt den Fokus: weg vom Antragstext-Werkzeug, hin zur
|
||||
politischen Konsequenzanalyse. Die zentrale Frage lautet jetzt nicht
|
||||
mehr <em>„Wie gemeinwohlorientiert ist der Antrag?"</em>, sondern
|
||||
<em>„Stimmen Programmtreue und Abstimmungsverhalten zusammen?"</em>.
|
||||
Dazu kommen Quellen aus 16 Bundesländern, ein Bürger:innen-Modus und
|
||||
eine geführte Einführung mit Sprachausgabe.
|
||||
<div class="neu-hero-meta">Version 2.0 · 2026-05-10 · 230 Commits seit 1.0</div>
|
||||
</div>
|
||||
|
||||
<h2 id="buerger-modus">Bürger:innen-Modus und neues Antrag-Detail</h2>
|
||||
|
||||
<div class="neu-intent-grid">
|
||||
<div class="neu-intent">
|
||||
<div class="neu-intent-label">Intention</div>
|
||||
<p>Ein Antrag soll für Interessierte ohne Politikerfahrung lesbar sein,
|
||||
nicht nur für Profis. In 1.0 traf die Detailseite gleich mit Profi-Vokabular auf.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Umsetzung</h3>
|
||||
<ul>
|
||||
<li>Einspaltiges Layout, Score und Kernbotschaft stehen oben.</li>
|
||||
<li>Fünf-Werte-Bars (Würde, Solidarität, Nachhaltigkeit, Gerechtigkeit, Demokratie)
|
||||
statt der dichten 5×5-Matrix als erster Eindruck. Die Matrix bleibt darunter
|
||||
ausklappbar für Profis.</li>
|
||||
<li>Glossar für Fachbegriffe direkt im Text.</li>
|
||||
<li>Klickbare Matrix-Zellen mit Begründung pro Feld, statt nur Symbole.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="tour">Geführte Tour mit Sprachausgabe</h2>
|
||||
|
||||
<div class="neu-intent-grid">
|
||||
<div class="neu-intent">
|
||||
<div class="neu-intent-label">Intention</div>
|
||||
<p>Wer das System neu sieht, soll sich nicht durch Doku quälen müssen.
|
||||
Lesen ist außerdem mühsam — Vorlesen mit echter Stimme nimmt die Hürde,
|
||||
nebenbei zu erklären, was passiert.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Umsetzung</h3>
|
||||
<ul>
|
||||
<li>Pro Seite eigene Stationen, je rund fünf Schritte.</li>
|
||||
<li>Spotlight-Effekt auf das gerade beschriebene Element.</li>
|
||||
<li>Sprache: ElevenLabs-Stimme „Domi", deutsch. Web-Speech-Stimme als Fallback,
|
||||
wenn die Sprachausgabe nicht verfügbar ist.</li>
|
||||
<li>Aufruf über das Tour-Symbol oben rechts in der Topbar.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="stimmverhalten">Stimmverhalten und Konsistenz-Marker</h2>
|
||||
|
||||
<div class="neu-intent-grid">
|
||||
<div class="neu-intent">
|
||||
<div class="neu-intent-label">Intention</div>
|
||||
<p>Eine GWÖ-Bewertung allein bleibt abstrakt. Erst der Vergleich zwischen
|
||||
programmatischer Empfehlung und realem Vote zeigt, ob Fraktionen ihrer
|
||||
eigenen Programmatik treu bleiben oder sich opportunistisch verhalten.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Umsetzung</h3>
|
||||
<ul>
|
||||
<li>Plenarprotokolle aus neun Bundesländern und dem Bund automatisch eingelesen
|
||||
(Brandenburg, Berlin, Bremen, Hamburg, Hessen, NRW, Saarland, Schleswig-Holstein,
|
||||
Thüringen sowie Bundestag).</li>
|
||||
<li>Pro Antrag wird sichtbar, welche Fraktion Ja, Nein oder Enthaltung gestimmt hat,
|
||||
inklusive Mehrheits-Bar.</li>
|
||||
<li>Heuchelei-Marker (⚠) bei Nein-Stimmen trotz hoher Programmtreue.</li>
|
||||
<li>Opportunismus-Marker (!) bei Ja-Stimmen trotz niedriger Programmtreue.</li>
|
||||
<li>Eigener <a href="/stimmverhalten">Stimmverhalten-Tab</a> mit Aufschlüsselung pro Berührungsgruppe (Lieferant*innen, Mitarbeiter*innen, Kund*innen, Gesellschaft, Mitwelt).</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="aktuelle-themen">Aktuelle-Themen-Dashboard mit Pressemitteilungs-Generator</h2>
|
||||
|
||||
<div class="neu-intent-grid">
|
||||
<div class="neu-intent">
|
||||
<div class="neu-intent-label">Intention</div>
|
||||
<p>Politische Anträge stehen nie isoliert. Wo welche aktuelle Nachricht zu
|
||||
welchem Antrag gehört, soll auf einen Blick sichtbar sein — und sich daraus
|
||||
sofort ein Pressemitteilungs- oder Mastodon-Thread-Entwurf ziehen lassen,
|
||||
der Kontext mitnimmt.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Umsetzung</h3>
|
||||
<ul>
|
||||
<li>News-Aggregator zieht aus Tagesschau-API und Bundestag-RSS.</li>
|
||||
<li>Automatischer Match News × Antrag über semantische Ähnlichkeit.</li>
|
||||
<li>PM-Generator mit zwei Stilen: klassische Pressemitteilung
|
||||
oder Mastodon-/Twitter-Thread (drei bis fünf Posts, jeweils unter 280 Zeichen).</li>
|
||||
<li>Versionierung pro Drucksache–News-Paar, damit Iterationen sichtbar bleiben.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="programme">Programme aus 15 Jahren — zeitpunkt-genaue Bewertung</h2>
|
||||
|
||||
<div class="neu-intent-grid">
|
||||
<div class="neu-intent">
|
||||
<div class="neu-intent-label">Intention</div>
|
||||
<p>Ein Antrag aus 2018 muss gegen das Wahlprogramm 2017 bewertet werden, nicht
|
||||
gegen 2022. Anachronismen verzerren die Aussage zur Programmtreue.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Umsetzung</h3>
|
||||
<ul>
|
||||
<li>287 Wahl- und Grundsatzprogramme zurück bis 2011 indexiert
|
||||
(alle 16 Bundesländer plus Bund).</li>
|
||||
<li>Die Bewertung filtert Embeddings nach dem Antragsdatum und zieht
|
||||
nur Programme heran, die zum damaligen Zeitpunkt galten.</li>
|
||||
<li>Im Antrag-Detail steht der Bewertungs-Kontext mit Direktlinks zu den
|
||||
herangezogenen Programmen.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="scorecards">Scorecards für Social-Sharing</h2>
|
||||
|
||||
<div class="neu-intent-grid">
|
||||
<div class="neu-intent">
|
||||
<div class="neu-intent-label">Intention</div>
|
||||
<p>Eine Bewertung soll teilbar sein — auf Mastodon, Threads, Instagram.
|
||||
Jede Plattform hat ihre eigenen Bildformat-Vorlieben.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Umsetzung</h3>
|
||||
<ul>
|
||||
<li>Vier Layouts: Portrait (Instagram-/Threads-1080×1350), Landscape, klassisch und kompakt.</li>
|
||||
<li>PNG-Export direkt aus der Antragsseite.</li>
|
||||
<li>Werkstatt unter <code>/v2/scorecard-werkstatt</code> für Live-Vorschau und Format-Wechsel.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="auswertungen">Auswertungen über Heuchelei und Konsistenz</h2>
|
||||
|
||||
<div class="neu-intent-grid">
|
||||
<div class="neu-intent">
|
||||
<div class="neu-intent-label">Intention</div>
|
||||
<p>Stark gemittelte Statistiken („SPD-Schnitt 6,4") sind selten aussagekräftig.
|
||||
Die Frage ist, wo sich Fraktionen widersprechen und wo sie konsistent handeln.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Umsetzung</h3>
|
||||
<ul>
|
||||
<li>Heuchelei-Quote pro Fraktion, mit Drilldown auf die einzelnen Anträge.</li>
|
||||
<li>Empfehlungs-Konsistenz-Tab: Wie oft folgt eine Fraktion der GWÖ-Empfehlung?</li>
|
||||
<li>Score-Histogram statt nur Mittelwert.</li>
|
||||
<li>Cross-Bundesland-Vergleich: gleiche Fraktion, verschiedene Länder.</li>
|
||||
<li>CSV-Export der Long-Format-Daten für eigene Analysen.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="quellen">Quellen-Volltextsuche</h2>
|
||||
|
||||
<div class="neu-intent-grid">
|
||||
<div class="neu-intent">
|
||||
<div class="neu-intent-label">Intention</div>
|
||||
<p>Wer nachschauen will, was eine Partei zu einem bestimmten Thema im
|
||||
Wahlprogramm geschrieben hat, soll das ohne PDF-Download tun können.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Umsetzung</h3>
|
||||
<ul>
|
||||
<li>Semantische Suche über alle 287 Programme — nicht nur Stichwort, sondern Bedeutung.</li>
|
||||
<li>Filter zwischen aktuellen Programmen und „inkl. historisch".</li>
|
||||
<li>Direkter Link auf die Original-PDF-Seite mit visuell hervorgehobenem Zitat.</li>
|
||||
</ul>
|
||||
|
||||
<h2 id="sicherheit">Anmeldung über Single Sign-On</h2>
|
||||
|
||||
<div class="neu-intent-grid">
|
||||
<div class="neu-intent">
|
||||
<div class="neu-intent-label">Intention</div>
|
||||
<p>Lese-Endpoints bleiben offen. Schreib-Endpoints (Bewertung anlegen,
|
||||
PM generieren, Bookmarks setzen) brauchen eine Anmeldung — ohne zusätzliche
|
||||
Passwortverwaltung im System selbst.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>Umsetzung</h3>
|
||||
<ul>
|
||||
<li>Single Sign-On über Keycloak (sso.toppyr.de).</li>
|
||||
<li>Rollen-Trennung: Standard-User für Bewertung, Admin-Rolle für Batch-Läufe und Auto-Bewertung.</li>
|
||||
<li>Approve-Flow für neue Konten mit Mail-Benachrichtigung.</li>
|
||||
</ul>
|
||||
|
||||
</article>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Loading…
Reference in New Issue
Block a user