feat(v3): Wortwahl entjargonisiert, Layout-Reorganisation, Score mit Farb-Tint
Wortwahl (User-feedback: "vermeide Konfidenz, neutralere Formulierung
als Heuchelei"):
- "Konfidenz" → "Bewertungs-Sicherheit" (Tooltip behält wissenschaftl. Begriff)
- "Heuchelei-Marker"/"Opportunismus-Marker" → einheitlich
"Wahlprogramm-Konflikt" (Tooltip behält wissenschaftl. Klassifikation)
- "Mehrheit kontra GWÖ-Empfehlung" → "Mehrheit gegen GWÖ-Empfehlung"
- Marker-Legende-Block entfernt (Tooltip pro Marker reicht)
Layout-Reorganisation:
- Stärkster/Schwächster Wert nach oben — zwischen Bewertung und
User-Aktionen (vorher in "Rest"). Grid 2-spaltig, responsive.
- Konsistenz-Hinweis ("Mehrheit ... GWÖ-Empfehlung") an die Spitze
des Abstimmungsergebnis-Blocks (vorher in "Rest").
- Marker-Legende komplett raus.
Visuelles:
- Score x/10 mit Farb-Tint hinterlegt: --score-{high,mid,low}-bg/-fg
aus tokens.css. Farbe folgt der Score-Schwelle (≥7 grün, 4-6 mittel,
<4 rot).
- Globale `body.v2 p { max-width: 72ch }` mit höherer Spezifität für
.v3-page-Children überschrieben — alle Body-Texte nehmen volle Breite.
Programm-Treue Fallback:
- Wenn keine Zitate für ein Programm gefunden: erklärender
Hinweistext im Body-Bereich, statt leerer Block.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f471586f33
commit
9eaa376fbe
@ -88,15 +88,22 @@
|
|||||||
.v3-score-num {
|
.v3-score-num {
|
||||||
font-family: var(--font-sans);
|
font-family: var(--font-sans);
|
||||||
font-weight: 900;
|
font-weight: 900;
|
||||||
font-size: 56px;
|
font-size: 52px;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
color: var(--ecg-dark);
|
padding: 8px 16px 6px;
|
||||||
|
border-radius: 4px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: baseline;
|
||||||
|
background: var(--score-mid-bg);
|
||||||
|
color: var(--score-mid-fg);
|
||||||
}
|
}
|
||||||
|
.v3-score-num.good { background: var(--score-high-bg); color: var(--score-high-fg); }
|
||||||
|
.v3-score-num.mid { background: var(--score-mid-bg); color: var(--score-mid-fg); }
|
||||||
|
.v3-score-num.low { background: var(--score-low-bg); color: var(--score-low-fg); }
|
||||||
.v3-score-slash {
|
.v3-score-slash {
|
||||||
font-size: 30px;
|
font-size: 26px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: var(--ecg-dark);
|
opacity: 0.55;
|
||||||
opacity: 0.4;
|
|
||||||
margin-left: 2px;
|
margin-left: 2px;
|
||||||
}
|
}
|
||||||
.v3-empfehlung {
|
.v3-empfehlung {
|
||||||
@ -774,3 +781,30 @@
|
|||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
color: var(--ecg-blue);
|
color: var(--ecg-blue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ── Volle Breite für Body-Texte: globale `body.v2 p { max-width: 72ch }`
|
||||||
|
Regel überschreiben (höhere Spezifität durch body.v2 + .v3-page). */
|
||||||
|
body.v2 .v3-page p { max-width: none; }
|
||||||
|
|
||||||
|
/* ── Stärken/Schwächen oben, nebeneinander wenn Platz ────────────── */
|
||||||
|
.v3-werte-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
.v3-werte-grid .v2-kasten {
|
||||||
|
margin: 0; /* gridded, kein zusätzlicher Margin */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Fallback-Text wenn keine Zitate gefunden ────────────────────── */
|
||||||
|
.v3-prog-no-zitate {
|
||||||
|
font-size: 12.5px;
|
||||||
|
line-height: 1.55;
|
||||||
|
color: var(--ecg-dark);
|
||||||
|
opacity: 0.72;
|
||||||
|
background: var(--surface);
|
||||||
|
border-left: 2px dashed var(--hairline);
|
||||||
|
padding: 8px 12px;
|
||||||
|
margin: 4px 0 0;
|
||||||
|
border-radius: 0 2px 2px 0;
|
||||||
|
}
|
||||||
|
|||||||
@ -94,7 +94,8 @@
|
|||||||
<section class="v3-section v3-bewertung">
|
<section class="v3-section v3-bewertung">
|
||||||
{% set s = (antrag.score | default(0)) | float %}
|
{% set s = (antrag.score | default(0)) | float %}
|
||||||
<div class="v3-bewertung-head">
|
<div class="v3-bewertung-head">
|
||||||
<div class="v3-score-num">
|
<div class="v3-score-num
|
||||||
|
{% if s >= 7 %}good{% elif s >= 4 %}mid{% else %}low{% endif %}">
|
||||||
{{ "%.1f"|format(s) }}<span class="v3-score-slash">/10</span>
|
{{ "%.1f"|format(s) }}<span class="v3-score-slash">/10</span>
|
||||||
</div>
|
</div>
|
||||||
{% if antrag.verdict_title %}
|
{% if antrag.verdict_title %}
|
||||||
@ -105,8 +106,8 @@
|
|||||||
</div>
|
</div>
|
||||||
{% if antrag.konfidenz %}
|
{% if antrag.konfidenz %}
|
||||||
<span class="v3-konfidenz v3-konfidenz-{{ antrag.konfidenz | lower }}"
|
<span class="v3-konfidenz v3-konfidenz-{{ antrag.konfidenz | lower }}"
|
||||||
title="Bewertungs-Konfidenz: wie sicher ist das LLM in dieser Einschätzung?">
|
title="Wie sicher ist die Bewertung des LLM? — wissenschaftlicher Begriff: Konfidenz.">
|
||||||
Konfidenz: {{ antrag.konfidenz }}
|
Bewertungs-Sicherheit: {{ antrag.konfidenz }}
|
||||||
</span>
|
</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
@ -117,6 +118,35 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{# 3b ── Stärkster + Schwächster Wert (nach Bewertung, vor User-Aktionen) #}
|
||||||
|
{% if antrag.staerkster_wert or antrag.staerken or antrag.schwaechster_wert or antrag.schwaechen %}
|
||||||
|
<section class="v3-section v3-werte-grid">
|
||||||
|
{% if antrag.staerkster_wert and antrag.staerkster_wert.text %}
|
||||||
|
<div class="v2-kasten outline-green">
|
||||||
|
<h4>Stärkster Wert{% if antrag.staerkster_wert.titel %} — {{ antrag.staerkster_wert.titel }}{% endif %}</h4>
|
||||||
|
<p>{{ antrag.staerkster_wert.text }}</p>
|
||||||
|
</div>
|
||||||
|
{% elif antrag.staerken %}
|
||||||
|
<div class="v2-kasten outline-green">
|
||||||
|
<h4>Stärken</h4>
|
||||||
|
<ul>{% for s in antrag.staerken %}<li>{{ s }}</li>{% endfor %}</ul>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if antrag.schwaechster_wert and antrag.schwaechster_wert.text %}
|
||||||
|
<div class="v2-kasten outline-blue">
|
||||||
|
<h4>Schwächster Wert{% if antrag.schwaechster_wert.titel %} — {{ antrag.schwaechster_wert.titel }}{% endif %}</h4>
|
||||||
|
<p>{{ antrag.schwaechster_wert.text }}</p>
|
||||||
|
</div>
|
||||||
|
{% elif antrag.schwaechen %}
|
||||||
|
<div class="v2-kasten outline-blue">
|
||||||
|
<h4>Schwächen</h4>
|
||||||
|
<ul>{% for s in antrag.schwaechen %}<li>{{ s }}</li>{% endfor %}</ul>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{# 4 ── Merken + Bewertung treffend (User-Aktionen) ──────────────── #}
|
{# 4 ── Merken + Bewertung treffend (User-Aktionen) ──────────────── #}
|
||||||
<section class="v3-section v3-userrow">
|
<section class="v3-section v3-userrow">
|
||||||
<button id="v2-merkliste-btn" onclick="v2DetailMerklisteToggle()" class="v3-action-btn">
|
<button id="v2-merkliste-btn" onclick="v2DetailMerklisteToggle()" class="v3-action-btn">
|
||||||
@ -187,6 +217,13 @@
|
|||||||
{{ quote_card(z.text, z.source, True, False, z.pdf_href) }}
|
{{ quote_card(z.text, z.source, True, False, z.pdf_href) }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<p class="v3-prog-no-zitate">
|
||||||
|
Keine wörtlich passenden Stellen im {{ prog_label }} gefunden.
|
||||||
|
Die Bewertung beruht auf inhaltlicher Auslegung — entweder benennt das Programm
|
||||||
|
das konkrete Thema nicht explizit, oder es bleibt zu allgemein, um wörtlich
|
||||||
|
zugeordnet zu werden.
|
||||||
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</details>
|
</details>
|
||||||
@ -228,6 +265,17 @@
|
|||||||
{% if antrag.plenum_votes %}
|
{% if antrag.plenum_votes %}
|
||||||
<section class="v3-section v3-vote-section">
|
<section class="v3-section v3-vote-section">
|
||||||
<h3 class="v3-h3">Abstimmungsergebnis</h3>
|
<h3 class="v3-h3">Abstimmungsergebnis</h3>
|
||||||
|
|
||||||
|
{# Konsistenz-Hinweis: GWÖ-Empfehlung vs tatsaechlicher Beschluss #}
|
||||||
|
{% set _state = consistency_state(antrag.verdict_title, antrag.plenum_votes) %}
|
||||||
|
{% set _decisive = decisive_outcome(antrag.plenum_votes) %}
|
||||||
|
{% if _state %}
|
||||||
|
<div class="v3-konsistenz {{ _state }}">
|
||||||
|
<strong>{% if _state == 'conflict' %}Mehrheit gegen GWÖ-Empfehlung{% else %}Mehrheit deckt sich mit GWÖ-Empfehlung{% endif %}</strong>
|
||||||
|
— Empfohlen: <em>{{ antrag.verdict_title }}</em>; Beschluss: <em>{{ _decisive | capitalize }}</em>.
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% set ergebnis_color = {
|
{% set ergebnis_color = {
|
||||||
"angenommen":"#2da44e","abgelehnt":"#cf222e","überwiesen":"#0969da",
|
"angenommen":"#2da44e","abgelehnt":"#cf222e","überwiesen":"#0969da",
|
||||||
"zurückgezogen":"#8250df","bestätigt":"#2da44e","sammel":"#0969da",
|
"zurückgezogen":"#8250df","bestätigt":"#2da44e","sammel":"#0969da",
|
||||||
@ -268,7 +316,7 @@
|
|||||||
<div><span class="v3-vote-side ja">Ja:</span>
|
<div><span class="v3-vote-side ja">Ja:</span>
|
||||||
{% for f in v.fraktionen_ja %}
|
{% for f in v.fraktionen_ja %}
|
||||||
{% set _opp = opportunismus_score(f, antrag.fraktions_scores) %}
|
{% set _opp = opportunismus_score(f, antrag.fraktions_scores) %}
|
||||||
<span class="v3-vote-pill ja">{{ f }}{% if _opp is not none %}<span class="v3-marker opp" tabindex="0" role="button" title="Opportunismus-Marker — Ja trotz schwacher Wahlprogramm-Übereinstimmung (WP-Score {{ '%.0f' | format(_opp) }}/10).">!</span>{% endif %}</span>
|
<span class="v3-vote-pill ja">{{ f }}{% if _opp is not none %}<span class="v3-marker opp" tabindex="0" role="button" title="Wahlprogramm-Konflikt — Diese Fraktion stimmte mit Ja, obwohl der Antrag schlecht zum eigenen Wahlprogramm passt (Wahlprogramm-Score {{ '%.0f' | format(_opp) }}/10). Wissenschaftliche Klassifikation: Opportunismus-Indikator.">!</span>{% endif %}</span>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -276,7 +324,7 @@
|
|||||||
<div><span class="v3-vote-side nein">Nein:</span>
|
<div><span class="v3-vote-side nein">Nein:</span>
|
||||||
{% for f in v.fraktionen_nein %}
|
{% for f in v.fraktionen_nein %}
|
||||||
{% set _wp = heuchelei_score(f, antrag.fraktions_scores) %}
|
{% set _wp = heuchelei_score(f, antrag.fraktions_scores) %}
|
||||||
<span class="v3-vote-pill nein">{{ f }}{% if _wp is not none %}<span class="v3-marker heuchelei" tabindex="0" role="button" title="Heuchelei-Marker — Nein trotz hoher Wahlprogramm-Übereinstimmung (WP-Score {{ '%.0f' | format(_wp) }}/10).">⚠</span>{% endif %}</span>
|
<span class="v3-vote-pill nein">{{ f }}{% if _wp is not none %}<span class="v3-marker heuchelei" tabindex="0" role="button" title="Wahlprogramm-Konflikt — Diese Fraktion stimmte mit Nein, obwohl der Antrag inhaltlich gut zum eigenen Wahlprogramm passt (Wahlprogramm-Score {{ '%.0f' | format(_wp) }}/10). Wissenschaftliche Klassifikation: Heuchelei-Indikator.">⚠</span>{% endif %}</span>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -355,69 +403,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# 9e Stärken / Schwächen #}
|
{# News-Box (per JS gefuellt) #}
|
||||||
{% if antrag.staerkster_wert and antrag.staerkster_wert.text %}
|
|
||||||
<div class="v2-kasten outline-green">
|
|
||||||
<h4>Stärkster Wert{% if antrag.staerkster_wert.titel %} — {{ antrag.staerkster_wert.titel }}{% endif %}</h4>
|
|
||||||
<p>{{ antrag.staerkster_wert.text }}</p>
|
|
||||||
</div>
|
|
||||||
{% elif antrag.staerken %}
|
|
||||||
<div class="v2-kasten outline-green">
|
|
||||||
<h4>Stärken</h4>
|
|
||||||
<ul>
|
|
||||||
{% for s in antrag.staerken %}<li>{{ s }}</li>{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if antrag.schwaechster_wert and antrag.schwaechster_wert.text %}
|
|
||||||
<div class="v2-kasten outline-blue">
|
|
||||||
<h4>Schwächster Wert{% if antrag.schwaechster_wert.titel %} — {{ antrag.schwaechster_wert.titel }}{% endif %}</h4>
|
|
||||||
<p>{{ antrag.schwaechster_wert.text }}</p>
|
|
||||||
</div>
|
|
||||||
{% elif antrag.schwaechen %}
|
|
||||||
<div class="v2-kasten outline-blue">
|
|
||||||
<h4>Schwächen</h4>
|
|
||||||
<ul>
|
|
||||||
{% for s in antrag.schwaechen %}<li>{{ s }}</li>{% endfor %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{# 9f Konsistenz-Hinweis #}
|
|
||||||
{% if antrag.plenum_votes %}
|
|
||||||
{% set _state = consistency_state(antrag.verdict_title, antrag.plenum_votes) %}
|
|
||||||
{% set _decisive = decisive_outcome(antrag.plenum_votes) %}
|
|
||||||
{% if _state %}
|
|
||||||
<div class="v3-konsistenz {{ _state }}">
|
|
||||||
<strong>{% if _state == 'conflict' %}Mehrheit kontra GWÖ-Empfehlung{% else %}Mehrheit deckt sich mit GWÖ-Empfehlung{% endif %}</strong>
|
|
||||||
— Empfohlen: <em>{{ antrag.verdict_title }}</em>; Beschluss: <em>{{ _decisive | capitalize }}</em>.
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{# 9g Marker-Legende — nur wenn ⚠ oder ! im Vote-Block vorkam #}
|
|
||||||
{% set _legende = namespace(heuchelei=false, opp=false) %}
|
|
||||||
{% for vv in (antrag.plenum_votes or []) %}
|
|
||||||
{% for f in (vv.fraktionen_nein or []) %}
|
|
||||||
{% if heuchelei_score(f, antrag.fraktions_scores) is not none %}{% set _legende.heuchelei = true %}{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% for f in (vv.fraktionen_ja or []) %}
|
|
||||||
{% if opportunismus_score(f, antrag.fraktions_scores) is not none %}{% set _legende.opp = true %}{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
{% if _legende.heuchelei or _legende.opp %}
|
|
||||||
<div class="v3-marker-legend">
|
|
||||||
{% if _legende.heuchelei %}
|
|
||||||
<div><span class="v3-marker heuchelei">⚠</span> <strong>Heuchelei:</strong> Nein trotz hoher Wahlprogramm-Übereinstimmung (WP ≥ 7/10).</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if _legende.opp %}
|
|
||||||
<div><span class="v3-marker opp">!</span> <strong>Opportunismus:</strong> Ja trotz schwacher Wahlprogramm-Übereinstimmung (WP < 3/10).</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{# 9h News-Box (per JS gefuellt) #}
|
|
||||||
<div id="ad-news-box" class="v3-news-box" style="display:none;">
|
<div id="ad-news-box" class="v3-news-box" style="display:none;">
|
||||||
<h3 class="v3-h3">Aktuelle News passend zu diesem Antrag</h3>
|
<h3 class="v3-h3">Aktuelle News passend zu diesem Antrag</h3>
|
||||||
<p class="v3-news-meta">Embedding-Match aus den letzten 90 Tagen. Quelle: Tagesschau-API + Bundestag-RSS.</p>
|
<p class="v3-news-meta">Embedding-Match aus den letzten 90 Tagen. Quelle: Tagesschau-API + Bundestag-RSS.</p>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user