Ortsnamen aus dem Backend, Verbrauchsfaktor aus dem Tankbeleg, Radzaehler ueber Fahrten

Ortsauflösung serverseitig (geokodierung.py): der Ort steht jetzt in der Fahrt
statt im Zwischenspeicher jedes Geräts. Beide Oberflächen fragen nichts mehr ab.

Verbrauchskorrektur (verbrauchskorrektur.py): Faktor = Beleg-Liter / Summe der
Einzelfahrten, voll zu voll. Statt einer Schranke am Faktor wird der Nenner
geprüft - decken die erkannten Fahrten 90-110 % der Tacho-Spanne ab? Ausgelöst
beim Schreiben eines Tankvorgangs, nicht erst bei der nächsten Fahrt.

Radzähler: summiert die Fahrten des montierten Satzes statt Tacho-Deltas. Der
alte Weg hatte Fahrzeugwechsel als gefahrene Strecke verbucht (375.962 km bei
einem Tacho von 61.823).

Null heißt unbekannt: ein Kilometerstand von 0 oder ein leeres Feld werden zu
None normalisiert, statt an sechs Lesestellen als "Tachostand null" zu gelten.
Momentanwerte der Sensoren gelten nur für einen Tankvorgang von jetzt.

Oberfläche, beide Codebasen: Wertespalte der Fahrtenliste ausgerichtet, Ort ->
Ort in "Zuletzt", "Räder" statt "Reifen", "Termin vereinbart" entfernt,
Markenlogo 20 % größer, Übersicht-Symbol auf volle Rasterbreite.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-02 11:28:37 +02:00
co-authored by Claude Opus 5
parent 78a8017e95
commit 2af5c469d6
27 changed files with 1575 additions and 352 deletions
@@ -459,14 +459,26 @@ button.sicherheitszeile:active { background: var(--tile-2); }
border-bottom: 1px solid var(--line);
color: inherit;
}
.leaf .k { font-size: 14px; color: var(--fg); display: flex; flex-direction: column; gap: 3px; line-height: 1.35; }
/* Das Label nimmt den freien Platz und kuerzt bei Bedarf mit Auslassung.
Ohne flex:1 blieb in der Zeile freier Raum, und weil sie DREI Kinder hat
(Label, Werte, Pfeil), verteilte space-between ihn ZWISCHEN alle drei - die
Wertespalte stand damit in der Mitte, ihre Lage abhaengig von der Laenge des
Ortsnamens. Gemessen: rechte Kante bei 549px in der einen Zeile, 520px in
der naechsten. Mit flex:1 bleibt kein freier Raum uebrig, Werte und Pfeil
sitzen buendig rechts.
min-width:0 ist noetig, damit ein Flex-Kind ueberhaupt unter seine
Inhaltsbreite schrumpfen darf - ohne das greift text-overflow nie. */
.leaf .k { font-size: 14px; color: var(--fg); display: flex; flex-direction: column; gap: 3px; line-height: 1.35; flex: 1 1 auto; min-width: 0; }
.leaf .k > * { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.leaf .k small { font-size: 12.5px; color: var(--fg3); }
/* Feste Mindestbreite, damit Strecke und Verbrauch ueber alle Zeilen hinweg
in einer Spalte stehen. Ohne sie waechst der Kasten mit dem Inhalt: gemessen
86px bei "11,4 l/100 km" gegen 37px bei einer Zeile ohne Werte, und die
Zahlen standen entsprechend versetzt. 92px traegt die laengste Form
("11,4 l/100 km") ohne Umbruch. */
.leaf .v { font-size: 13px; color: var(--fg2); text-align: right; display: flex; flex-direction: column; gap: 3px; flex: 0 0 auto; min-width: 92px; }
.leaf .v { font-size: 13px; color: var(--fg2); text-align: right; display: flex; flex-direction: column; gap: 3px; flex: 0 0 92px; }
.leaf .v small { font-size: 12.5px; color: var(--fg3); }
/* .teaser (die "Zuletzt"-Kachel auf der Übersicht, teaser()): genau zwei
Zeilen mit sehr unterschiedlich breiten Werten ("offen" vs. "51,59 l") -
@@ -665,9 +677,10 @@ img.carfix.klein { aspect-ratio: auto; height: auto; }
.marke { display: inline-flex; align-items: center; gap: 6px; }
.marke-logo { display: inline-flex; align-items: center; }
/* Auf Zeilenhoehe (16px) statt 13px: das Markenlogo stand neben Text
derselben Zeile und wirkte daneben zu klein. */
.marke-logo img { height: 16px; width: auto; }
/* 19,2px = 16px + 20%. Der Eigentuemer wollte das Markenlogo in JEDER
Darstellung um ein Fuenftel groesser; es steht ueberall neben Text der
Zeilenhoehe 16px, also hier eine Zahl statt mehrerer Sondergroessen. */
.marke-logo img { height: 19.2px; width: auto; }
.marke-logo .ph { display: none; font-size: 11px; letter-spacing: .06em; text-transform: uppercase; color: var(--fg3); }
.marke-logo.logo-fehlt img { display: none; }
.marke-logo.logo-fehlt .ph { display: inline; }