fix: Programm-Treue im BELEGE-Layout, default-OPEN statt default-closed

User-Feedback: voriges Layout war "Usability-Alptraum" — alle 8 Blöcke
(4 Fraktionen × 2 Programme) waren default-closed, was 8 Klicks pro
Antrag bedeutete um Begründungen zu lesen.

Fix: <details open> als Default. Inhalt sofort vollständig sichtbar
beim Scrollen. Faltmechanismus bleibt für User, die die Liste nur
skimmen wollen — Chevron ▾ am Label rotiert beim Falten. Hover-Affordanz
über Label-Color-Change zum Brand-Blau (kein extra Caret-Element).

Layout-Spec bleibt: pro Partei zwei Treue-Blöcke (Wahlprogramm,
Parteiprogramm). Summary = Label + Score-Chip rechts. Body =
Einschätzung-Text + Belege via quote_card-Macro.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dotty Dotter 2026-05-07 10:03:04 +02:00
parent c4750d3274
commit bd0fe54559
2 changed files with 56 additions and 90 deletions

View File

@ -979,25 +979,33 @@ body.v2 ul.v2-manual ul li::before {
background: rgba(0, 157, 165, 0.15);
}
/* Aufklappbare Programm-Blöcke (Wahlprogramm/Parteiprogramm) */
/* Programm-Block (Wahlprogramm/Parteiprogramm) im BELEGE-Layout.
<details open> per Default alles sichtbar, Faltmechanismus optional.
Pro Fraktion zwei Blöcke; der zweite hat eine zarte Trenn-Linie. */
.v2-treue-block {
border-top: 1px solid var(--hairline);
margin: 0;
margin: 8px 0 0;
padding-top: 8px;
}
.v2-treue-block:first-of-type {
border-top: none;
.v2-treue-block + .v2-treue-block {
border-top: 1px dashed var(--hairline);
}
/* Summary = klickbare Header-Zeile. list-style:none entfernt das native
Marker-Dreieck, wir setzen einen eigenen subtilen Chevron rechts. */
.v2-treue-block > summary {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 0;
cursor: pointer;
list-style: none;
cursor: pointer;
user-select: none;
outline-offset: 2px;
}
.v2-treue-block > summary::-webkit-details-marker {
display: none;
.v2-treue-block > summary::-webkit-details-marker { display: none; }
.v2-treue-block > summary:hover .v2-treue-label { color: var(--ecg-blue); }
.v2-treue-row {
display: flex;
align-items: baseline;
gap: 8px;
margin-bottom: 4px;
}
.v2-treue-label {
font-family: var(--font-mono);
@ -1006,40 +1014,27 @@ body.v2 ul.v2-manual ul li::before {
letter-spacing: 0.07em;
color: #0d6f76;
font-weight: 600;
transition: color 0.12s ease;
}
.v2-treue-label::after {
content: "▾";
margin-left: 6px;
font-size: 9px;
opacity: 0.5;
display: inline-block;
transition: transform 0.15s ease;
}
.v2-treue-block:not([open]) > summary .v2-treue-label::after {
transform: rotate(-90deg);
}
.v2-treue-spacer {
flex: 1 1 auto;
}
.v2-treue-caret {
font-family: var(--font-mono);
font-size: 10px;
color: var(--ecg-dark);
opacity: 0.5;
transition: transform 0.15s ease;
}
.v2-treue-block[open] > summary .v2-treue-caret {
transform: rotate(180deg);
}
.v2-treue-body {
padding: 4px 0 10px;
font-size: 12.5px;
line-height: 1.5;
}
.v2-einschaetzung {
margin-bottom: 8px;
}
.v2-einschaetzung-label {
font-family: var(--font-mono);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.07em;
color: var(--ecg-dark);
opacity: 0.6;
margin-bottom: 4px;
}
.v2-einschaetzung-text {
color: var(--ecg-dark);
font-size: 13px;
line-height: 1.55;
color: var(--ecg-dark);
margin-top: 2px;
}
.v2-belege {
margin-top: 6px;

View File

@ -382,15 +382,14 @@
{{ matrix_mini(antrag.matrix) }}
{% endif %}
{# Programm-Treue im BELEGE-Layout: pro Partei zwei aufklappbare Blöcke
(Wahlprogramm + Parteiprogramm). Summary zeigt Bewertung, expand
enthält Einschätzung + Belege. #}
{# Programm-Treue im BELEGE-Layout: pro Partei zwei <details>-Blöcke
(Wahlprogramm + Parteiprogramm). Summary zeigt Bewertung,
expanded zeigt Einschätzung + Belege. Default OPEN — alles sofort
lesbar, der Faltmechanismus ist optional zum Skimmen. #}
{% if antrag.fraktions_scores %}
<h3 class="v2-h3" style="margin-top:24px;">Programm-Treue pro Fraktion</h3>
<div class="v2-fraktions-scores">
{% for fs in antrag.fraktions_scores %}
{% set wp_score = fs.wahlprogramm.score | float %}
{% set pp_score = fs.parteiprogramm.score | float %}
<div class="v2-fraktion-row">
<div class="v2-fraktion-head">
<span class="v2-fraktion-label">{{ fs.fraktion }}</span>
@ -398,56 +397,28 @@
{% if fs.ist_regierung %}<span class="v2-pill v2-pill-reg">Regierungsfraktion</span>{% endif %}
</div>
<details class="v2-treue-block">
<summary>
<span class="v2-treue-label">Wahlprogramm</span>
{% for prog_key, prog_label in [("wahlprogramm","Wahlprogramm"), ("parteiprogramm","Parteiprogramm")] %}
{% set prog = fs[prog_key] %}
{% set p_score = prog.score | float %}
<details class="v2-treue-block" open>
<summary class="v2-treue-row">
<span class="v2-treue-label">{{ prog_label }}</span>
<span class="v2-treue-spacer"></span>
<span class="v2-score-chip {% if wp_score >= 7 %}chip-green{% elif wp_score >= 4 %}chip-mid{% else %}chip-red{% endif %}">{{ "%.0f"|format(wp_score) }}/10</span>
<span class="v2-treue-caret" aria-hidden="true"></span>
<span class="v2-score-chip {% if p_score >= 7 %}chip-green{% elif p_score >= 4 %}chip-mid{% else %}chip-red{% endif %}">{{ "%.0f"|format(p_score) }}/10</span>
</summary>
<div class="v2-treue-body">
{% if fs.wahlprogramm.begruendung %}
<div class="v2-einschaetzung">
<div class="v2-einschaetzung-label">Einschätzung</div>
<div class="v2-einschaetzung-text">{{ fs.wahlprogramm.begruendung }}</div>
</div>
{% if prog.begruendung %}
<div class="v2-einschaetzung-text">{{ prog.begruendung }}</div>
{% endif %}
{% if fs.wahlprogramm.zitate %}
{% if prog.zitate %}
<div class="v2-belege">
<div class="v2-einschaetzung-label">Belege</div>
{% for z in fs.wahlprogramm.zitate %}
{% for z in prog.zitate %}
{{ quote_card(z.text, z.source, True, False, z.pdf_href) }}
{% endfor %}
</div>
{% endif %}
</div>
</details>
<details class="v2-treue-block">
<summary>
<span class="v2-treue-label">Parteiprogramm</span>
<span class="v2-treue-spacer"></span>
<span class="v2-score-chip {% if pp_score >= 7 %}chip-green{% elif pp_score >= 4 %}chip-mid{% else %}chip-red{% endif %}">{{ "%.0f"|format(pp_score) }}/10</span>
<span class="v2-treue-caret" aria-hidden="true"></span>
</summary>
<div class="v2-treue-body">
{% if fs.parteiprogramm.begruendung %}
<div class="v2-einschaetzung">
<div class="v2-einschaetzung-label">Einschätzung</div>
<div class="v2-einschaetzung-text">{{ fs.parteiprogramm.begruendung }}</div>
</div>
{% endif %}
{% if fs.parteiprogramm.zitate %}
<div class="v2-belege">
<div class="v2-einschaetzung-label">Belege</div>
{% for z in fs.parteiprogramm.zitate %}
{{ quote_card(z.text, z.source, True, False, z.pdf_href) }}
{% endfor %}
</div>
{% endif %}
</div>
</details>
</div>
{% endfor %}
</div>
{% endif %}