38e7731a3d
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>
353 lines
9.8 KiB
CSS
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;
|
|
}
|