gwoe-antragspruefer/app/templates/v2/components/appshell.html
Dotty Dotter 565849bd84 feat(#139,#129,#138,#141): v2-Frontend (ECOnGOOD-CD), Login-Modal, Auto-DL, OG-Cards
v2-Frontend (#139, ECOnGOOD CD Manual Juni 2024):
- app/static/v2/: tokens.css, fonts.css, v2.css, Nunito-Sans woff2, Phosphor-Icons (21 SVGs)
- app/templates/v2/: base.html + 11 Screens + 8 Component-Macros
- AppShell mit Sidebar (Lesen/Pruefen/Daten/Admin), v2-Detail mit allen Features
  (ScoreHero, MatrixMini, QuoteCard, Redline, Fraktions-Scores)
- v2 ist jetzt Default unter / — classic unter /classic
- Login-Modal in v2-Topbar mit Tabs Anmelden/Registrieren (#129)
- Phosphor-Icons in Sidebar + Topbar mit dynamischem Theme-Toggle
- Keyboard-Shortcuts (j/k/Enter/Esc/?/path), Landtag-Suche, Antrag-Historie,
  Sort-Dropdown, Matrix-Feld-Info-Modal, Bookmarks/Comments/Voting/Share/Re-Analyze

Backend-Erweiterungen:
- main.py: ~30 neue Routes (/v2/*, /antrag/{ds}, /api/auth/{login,refresh,logout},
  /api/me/merkliste/*, /api/admin/*, /v2/admin/*, OG-Cards, etc.)
- og_card.py + og_template: Open-Graph-Bilder via Playwright (#141)
- wahlprogramm_fetch.py + wahlprogramm-links.yaml: SHA-Gate Auto-DL (#138)
- auswertungen.py: BL-Filter + get_wahlperioden Helper (#137)
- auth.py: Direct-Access-Grant + Refresh-Token-Cookie

Classic-Updates:
- Header-DRY via _header.html, Auswertungen redirected, Batch-Inline raus

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 20:55:57 +02:00

134 lines
5.2 KiB
HTML

{#
appshell.html — AppShell-Macro für GWÖ-Antragsprüfer v2
Rendert die zweispaltige Shell mit Sidebar (230 px Desktop) und Drawer
(< 900 px). Wird per {% include %} aus base.html eingebettet;
der eigentliche Seiteninhalt kommt über den Jinja2-Block "main".
Navigation-Gruppen: LESEN / PRÜFEN / DATEN / ADMIN (laut Brief §04).
Aktiver Eintrag: v2_active_nav wird vom Screen-Template gesetzt.
#}
{# Overlay für mobilen Drawer #}
<div id="v2-overlay" class="v2-overlay"></div>
<div class="v2-shell">
{# ── Sidebar ──────────────────────────────────────────────────── #}
<aside id="v2-sidebar" class="v2-sidebar">
<div class="v2-brand">
GWÖ-<span class="grn">ANTRAGS</span><span class="blu">PRÜFER</span>
</div>
<div class="v2-brand-sub">Matrix 2.0 · Gemeinden</div>
<nav aria-label="Hauptnavigation">
<div class="v2-nav-group">
<div class="v2-nav-label">— Lesen</div>
<a href="/"
class="v2-nav-item {% if v2_active_nav == 'durchsuchen' %}active{% endif %}"
aria-current="{% if v2_active_nav == 'durchsuchen' %}page{% endif %}">
Durchsuchen
{% if assessment_count is defined and assessment_count %}
<span class="v2-nav-count">{{ assessment_count }}</span>
{% endif %}
</a>
<a href="/v2/merkliste"
class="v2-nav-item {% if v2_active_nav == 'merkliste' %}active{% endif %}">
Merkliste
</a>
<a href="/v2/tags"
class="v2-nav-item {% if v2_active_nav == 'tags' %}active{% endif %}">
Tags
</a>
<a href="/v2/cluster"
class="v2-nav-item {% if v2_active_nav == 'cluster' %}active{% endif %}">
Cluster
</a>
</div>
<div class="v2-nav-group">
<div class="v2-nav-label">— Prüfen</div>
<a href="/v2/neu"
class="v2-nav-item {% if v2_active_nav == 'neu' %}active{% endif %}">
Neuer Antrag
</a>
<a href="/v2/batch"
class="v2-nav-item {% if v2_active_nav == 'batch' %}active{% endif %}">
Batch-Analyse
</a>
</div>
<div class="v2-nav-group">
<div class="v2-nav-label">— Daten</div>
<a href="/auswertungen"
class="v2-nav-item {% if v2_active_nav == 'auswertungen' %}active{% endif %}">
Auswertungen
</a>
<a href="/api/auswertungen/export.csv"
class="v2-nav-item {% if v2_active_nav == 'export' %}active{% endif %}">
Export · API
</a>
<a href="/api/feed.xml"
class="v2-nav-item {% if v2_active_nav == 'feed' %}active{% endif %}">
Atom-Feed
</a>
</div>
{% if is_admin is defined and is_admin %}
<div class="v2-nav-group">
<div class="v2-nav-label">— Administration</div>
<a href="/v2/admin/freischaltungen"
class="v2-nav-item {% if v2_active_nav == 'freischaltungen' %}active{% endif %}">
Freischaltungen
</a>
<a href="/v2/admin/queue"
class="v2-nav-item {% if v2_active_nav == 'queue' %}active{% endif %}">
Queue
</a>
<a href="/v2/admin/abos"
class="v2-nav-item {% if v2_active_nav == 'abos' %}active{% endif %}">
Abos
</a>
</div>
{% endif %}
</nav>
</aside>
{# ── Topbar ───────────────────────────────────────────────────── #}
<header class="v2-topbar">
<button id="v2-menu-toggle" class="v2-menu-toggle" aria-label="Navigation öffnen">
&#9776;
</button>
<span class="v2-topbar-spacer"></span>
<a href="/classic" class="v2-back-link">Klassische Ansicht</a>
<a href="/methodik">Methodik</a>
<a href="/quellen">Quellen</a>
<button id="v2-theme-toggle"
aria-label="Farbschema wechseln (Hell / Dunkel / Auto)"
onclick="window.__v2CycleTheme && window.__v2CycleTheme()"
style="background:none;border:none;cursor:pointer;font-family:var(--font-mono);font-size:11px;color:var(--ecg-dark);letter-spacing:0.06em;text-transform:uppercase;opacity:0.75;padding:0;">
Auto
</button>
</header>
{# ── Main Content ─────────────────────────────────────────────── #}
<main class="v2-main" id="v2-main">
{% block main %}{% endblock %}
</main>
{# ── Footer ───────────────────────────────────────────────────── #}
<footer class="v2-footer">
<span>GWÖ-Antragsprüfer · Matrix 2.0 · CC BY 4.0</span>
<a href="/methodik">Methodik</a>
<a href="/quellen">Quellen</a>
<a href="/impressum">Impressum</a>
<a href="/datenschutz">Datenschutz</a>
<a href="https://repo.toppyr.de/tobias/gwoe-antragspruefer">Quellcode</a>
<span class="v2-topbar-spacer"></span>
<a href="/classic" style="color:var(--ecg-green);opacity:1;">Zurück zur klassischen Ansicht</a>
</footer>
</div>{# .v2-shell #}