Files
audi-app/companion-app/src/stile/rahmen.css
T
tobias 38e7731a3d Rollende Zeitraeume, zwei Gesten, CI-Symbole und das Screening faellt nach (2026.9.2.8-.12)
Gemeldet vom Eigentuemer an der realen Instanz, in einem Zug abgearbeitet.

STATISTIK. "Monat kleiner als Woche" war kein Rechenfehler, sondern die
Definition: am 02.09. begann die Kalenderwoche am 31.08., der Monat erst am
01.09. Umgestellt auf rollende Fenster (1/7/30/365 Tage), damit 1 ⊂ 7 ⊂ 30 ⊂
365 an jedem Tag gilt. "Jahr" meint damit nicht mehr das Kalenderjahr - so
entschieden. Zwei neue Tests halten die Verschachtelung fest.

Aus dem Langzeitverbrauch sind Herleitung und Erklaerabsatz aus der ANSICHT
genommen, nicht aus der Rechnung; das Datum des letzten Tankstops ebenfalls.

UEBERSICHT. Unter "Letzter Tankvorgang" steht das Datum statt der Tankstelle.

BILDER. Die Draufsicht war der einzige sichtbare Bildplatz ohne Zugang -
bilder.py kannte den Dateinamen, BILDER/BILDPLAETZE nicht. Jetzt ein Platz wie
jeder andere. Die Vorschau in den Einstellungen schneidet Fotos nicht mehr an,
und der Bildbereich der Fahrzeugseite steht eingerueckt statt randlos.

ZAHNRAD. Es lag mit seiner 44px-Trefferflaeche 21px im Kachelinhalt und fing
die obere Haelfte des ersten Knopfes ab (Versicherung, "Inland"). Die Kopfzeile
bekommt jetzt die Hoehe, die es braucht.

SCREENING. Lief ausschliesslich bei einer Aenderung des Kilometerstands, also
nur waehrend der Fahrt - im Stand blieben Ortsnamen und Verbrauch liegen. Jetzt
zusaetzlich einmal nach dem Start, und danach faellt es selbst nach, solange
ein Lauf sein Ortsbudget aufbraucht UND dabei etwas aufloest. Kein Dauertakt:
die Kette endet, sobald ein Lauf mit uebrigem Budget durchkommt.

GESTEN. Zum Loeschen nach links wischen, jetzt auch im Radarchiv (das Panel
hatte die Mechanik, das Archiv war nie angeschlossen; die App hatte sie gar
nicht). Vom linken Rand nach rechts wischen = zurueck, jetzt auch in der App,
mit denselben Zahlen wie im Panel und in beiden mit sichtbarer Rueckmeldung.

CI-SYMBOLE. Das Kachel-Zahnrad ist settings-s - im Panel stand der Pfad
sechsmal wortgleich im Markup, jetzt einmal als CI.settingsS. Das
handgezeichnete Zahnrad der Seitenleiste ist ersetzt und geloescht. Die
Zapfsaeule des Tanken-Reiters ist fuel-station-s, Faktor 0,84 um die
Rastermitte - live per getBBox() gemessen, damit sie auf dieselbe senkrechte
Spanne kommt wie Statistik.

Zurueckgenommen: die Titel der Unterseiten stehen wieder mittig. Zentriert ist
Apples HIG fuer Navigationsleisten; die linksbuendigen Titel sind die der
Hauptbereiche und folgen der anderen Regel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 15:48:24 +02:00

353 lines
9.8 KiB
CSS

/*
* Rahmen der App (Shell.tsx): Kopfzeile, Seitenleiste, Inhaltsfläche.
* Farben und Radien ausschließlich aus den Tokens von @audi-dash/ui.
*/
.dm-spalte {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
height: 100%;
}
/* ------------------------------------------------------------- Kopfzeile */
/* 1:1 die .topbar des Panels (audi-dashboard-ios.css:
`padding:56px 20px 4px 16px; gap:4px`, keine Trennlinie). Die 56px oben sind
dort die fest einkompilierte Statusleisten-Reserve - das Panel läuft auf dem
Telefon als PWA und kennt env() gar nicht. Diese App läuft zusätzlich in
einer nativen Hülle, wo die echte Reserve aus dem Gerät kommt; max() liefert
deshalb im Browser exakt die 56px des Panels und auf dem Gerät den realen
Sicherheitsabstand. */
.dm-kopf {
display: flex;
align-items: center;
gap: var(--sp-1);
/* Nur der sichere Bereich, kein Aufschlag: das Panel setzt hier zwar
ebenfalls 56px (.topbar in audi-dashboard-ios.css), die liegen dort
aber unter der eigenen Kopfleiste von Home Assistant. In der nativen
Huelle steht darueber nichts ausser der Statusleiste, dieselbe Zahl
ergab deshalb ein sichtbar leeres Band ueber der Ueberschrift.
env(safe-area-inset-top) haelt die Statusleiste weiterhin frei -
ohne Einzug (Browser, iPad, geraetelose Vorschau) beginnt der Titel
jetzt direkt oben. */
padding: env(safe-area-inset-top, 0px) 20px 4px 16px;
background: var(--canvas);
}
/* Unterseite: kompakter, zentrierter Titel wie in einer iOS-Navigationsleiste
(`.phone:has(.back.on) .topbar/.head/.title` im Panel). */
.dm-kopf--unterseite {
padding: env(safe-area-inset-top, 0px) 16px 6px;
gap: var(--sp-2);
}
.dm-kopf__titel {
flex: 1;
min-width: 0;
}
/* Mittig, und zwar mit Absicht: Apples Human Interface Guidelines kennen
genau zwei Titelformen - den großen, linksbündigen Titel auf oberster
Ebene und den kleinen, ZENTRIERTEN in der Navigationsleiste einer
Detailseite. Beides steht hier nebeneinander: Hauptbereiche groß und
links, Unterseiten 17px und mittig.
Am 02.09.2026 kurzzeitig auf linksbündig gestellt (auf Ansage, "wie alle
anderen auch") und auf Rückfrage des Eigentümers am selben Tag wieder
zurückgenommen: die anderen Titel sind die der Hauptbereiche, und die
folgen der anderen Regel. Nicht erneut ändern, ohne diese beiden Formen
auseinanderzuhalten. */
.dm-kopf--unterseite .dm-kopf__titel {
text-align: center;
}
.dm-kopf--unterseite .ads-title {
font-size: 17px;
}
/* Datenstand unter dem Titel der Übersicht (`.sync` im Panel). */
.dm-stand {
display: flex;
align-items: center;
gap: 6px;
margin-top: 3px;
font-size: 12.5px;
color: var(--fg3);
}
/* Ziehen zum Aktualisieren (`.ptr` im Panel): ein Band der Höhe 0, das
während der Geste wächst. */
.dm-ptr {
height: 0;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
color: var(--fg3);
font-size: 12.5px;
transition: height .2s;
flex: 0 0 auto;
}
.dm-ptr--dreht svg {
animation: dm-drehen 1s linear infinite;
}
@keyframes dm-drehen {
to {
transform: rotate(360deg);
}
}
/* Maße und Farbe wie im Panel: `.back{width:34px;height:34px;margin-left:-8px}`
mit `.back svg{width:22px;height:22px;color:var(--fg)}`, und
`.rings{min-width:44px;min-height:44px;margin-left:8px;margin-right:-10px;
padding:0 10px}`. Der Zurück-Pfeil war hier 44px breit und in --fg2 statt
--fg - sichtbar heller und weiter eingerückt als im Panel. */
.dm-kopf__zurueck,
.dm-kopf__aktion {
flex: none;
display: grid;
place-items: center;
border: 0;
border-radius: var(--r-pill);
background: transparent;
cursor: pointer;
}
.dm-kopf__zurueck {
width: 34px;
height: 34px;
margin-left: -8px;
color: var(--fg);
}
/* Spiegelbild des Zurueck-Pfeils auf der rechten Seite, damit der
zentrierte Titel wirklich in der Mitte der Kopfzeile steht und nicht in
der Mitte des Rests. Gleiche Masse, gleicher negativer Aussenabstand -
die 34px, die links vom Pfeil samt Abstand belegt werden, stehen damit
auch rechts. */
.dm-kopf__gegengewicht {
flex: none;
width: 34px;
height: 34px;
margin-right: -8px;
}
.dm-kopf__aktion {
min-width: 44px;
height: 44px;
margin-left: var(--sp-2);
margin-right: -10px;
padding: 0 10px;
color: var(--fg2);
}
.dm-kopf__zurueck:hover,
.dm-kopf__aktion:hover {
background: var(--shade);
color: var(--fg);
}
/* Kein rotes Aktiv-Signal hier: Rot bleibt Akzent/destruktiv, keine
Navigationsfarbe (dieselbe Regel wie beim Panel-Zurückpfeil, den primären
Aktionsknöpfen und der Arbeitsweg-Pille - siehe AGENTS.md 2026-08-13/17).
Der Ringe-Knopf selbst hat im Panel auch kein eigenes Aktiv-Aussehen. */
/* ---------------------------------------------------------- Inhaltsfläche */
/* Seitenrand und Kachelabstand kommen 1:1 vom Panel (`main#view{--seitenrand:16px;
padding:0 var(--seitenrand) 30px}` in audi-dashboard-ios.css). Bis 2026-08-30
standen hier --sp-4/--sp-5 aus dem Design-System: 22px Seitenrand statt 16px
(jede Kachel 20px schmaler als im Panel), 16px Innenabstand oben, den das Panel
gar nicht hat, und zusätzlich zum margin-bottom der Kachel noch ein
flex-gap - live gemessen ergab das 24px zwischen zwei Kacheln, wo das Panel
14px zeigt. Das war app-weit der größte Formatunterschied überhaupt. Der
Abstand kommt jetzt wie im Panel allein aus dem margin-bottom der Kachel,
deshalb kein gap mehr. */
.dm-inhalt {
--seitenrand: 16px;
flex: 1;
padding: 0 var(--seitenrand) 30px;
display: flex;
flex-direction: column;
}
/* Kachelmaße wie im Panel (`.tile{padding:16px 18px;margin-bottom:14px}`,
audi-dashboard-ios.css). @audi-dash/ui leitet beides aus --sp-5/--sp-3 ab
(22px rundum, 12px Abstand) - als markenneutraler Kit richtig, hier aber
sichtbar anders als das Panel. Gleiches Muster wie die Schrift-Auflagen in
audi-schrift.css: design-system bleibt unangetastet, companion-app legt
lokal die gemessenen Panel-Werte darüber. */
.ads-tile {
padding: 16px 18px;
margin-bottom: 14px;
}
/* .tile.flat setzt im Panel nur das Padding zurück, der Abstand bleibt. */
.ads-tile--flat {
padding: 0;
}
/* Inhalte dürfen nie gestaucht werden — die Fläche scrollt stattdessen.
Ohne das quetscht Flex jeden Block mit `overflow: hidden` auf Höhe 0,
sobald die Seite länger ist als der Bildschirm: `overflow: hidden` setzt
die automatische Mindesthöhe auf 0, und dann greift flex-shrink ungebremst.
Genau so verschwand das Fahrzeugbild samt Modellname und Kennzeichen. */
.dm-inhalt > * {
flex: none;
}
.dm-inhalt--breit {
padding: var(--sp-5) 32px 32px;
}
/* Mehrspaltige Anordnung auf großen Flächen: Kacheln nebeneinander statt
untereinander. Die Screens setzen die Klasse dort, wo es sinnvoll ist. */
.dm-raster {
display: grid;
gap: var(--sp-3);
grid-template-columns: 1fr;
}
@media (min-width: 1000px) {
.dm-raster {
grid-template-columns: repeat(2, minmax(0, 1fr));
align-items: start;
}
.dm-raster--drei {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.dm-raster__breit {
grid-column: 1 / -1;
}
}
/* Listen- und Detailansicht nebeneinander (Fahrten, Tanken auf großer Fläche) */
.dm-zweispalter {
display: grid;
gap: var(--sp-4);
grid-template-columns: 1fr;
align-items: start;
}
@media (min-width: 1000px) {
.dm-zweispalter {
grid-template-columns: minmax(0, 4fr) minmax(0, 5fr);
}
}
/* ----------------------------------------------------------- Seitenleiste */
.dm-seitenleiste {
flex: 0 0 240px;
width: 240px;
height: 100%;
box-sizing: border-box;
border-right: 1px solid var(--line);
padding: 24px 14px 16px;
display: flex;
flex-direction: column;
gap: 2px;
background: var(--canvas);
}
.dm-seitenleiste__marke {
padding: 0 10px var(--sp-4);
}
.dm-seitenleiste__punkt {
display: flex;
align-items: center;
gap: var(--sp-3);
width: 100%;
padding: 11px 10px;
border: 0;
border-radius: var(--r-func);
background: transparent;
color: var(--fg2);
font-size: 14px;
font-weight: 300;
text-align: left;
cursor: pointer;
}
.dm-seitenleiste__punkt:hover {
background: var(--shade);
color: var(--fg);
}
.dm-seitenleiste__punkt--an {
background: var(--tile);
color: var(--fg);
}
.dm-seitenleiste__fuss {
margin-top: auto;
padding-top: var(--sp-3);
border-top: 1px solid var(--line);
}
/* Zurück-Weg auf großer Fläche: als Brotkrume über dem Inhalt statt als
Pfeil in der Kopfzeile — auf dem Handy nimmt der Pfeil den Platz ein. */
.dm-brotkrume {
padding: var(--sp-4) 32px 0;
}
.dm-brotkrume button {
display: inline-flex;
align-items: center;
gap: 6px;
border: 0;
background: transparent;
color: var(--fg2);
font-size: 13px;
font-weight: 300;
cursor: pointer;
padding: 6px 0;
}
.dm-brotkrume button:hover {
color: var(--fg);
}
/* ------------------------------------------------------------ Tab-Leiste */
/* Die Menüleiste des Panels liegt als durchscheinende, weichgezeichnete
Fläche über dem Inhalt (`.tabbar` in audi-dashboard-ios.css:
rgba(12,16,20,.72) bzw. rgba(242,242,247,.78) plus
backdrop-filter:saturate(180%) blur(24px), dazu 26px Polster unten für den
Home-Indikator). Hier war sie deckend und ohne dieses Polster. */
.dm-tableiste {
flex: none;
padding-bottom: max(env(safe-area-inset-bottom, 0px), 26px);
border-top: 1px solid var(--line);
background: rgba(12, 16, 20, .72);
-webkit-backdrop-filter: saturate(180%) blur(24px);
backdrop-filter: saturate(180%) blur(24px);
}
[data-theme="tag"] .dm-tableiste {
background: rgba(242, 242, 247, .78);
}
.dm-seitenleiste__marke {
display: flex;
align-items: center;
gap: var(--sp-2);
padding: 0 10px var(--sp-4);
}
.dm-szene__marke {
display: flex;
align-items: center;
/* `.badge` im Panel: 10px zwischen Typenschild und Zusatz. */
gap: 10px;
flex-wrap: wrap;
}