Fahrzeugbild zeigt die Fahrt: Strasse, Baeume, etwas Fahrtwind
Ob das Auto gerade rollt, stand bisher nur klein unter der Karte
("unterwegs - zuletzt: ..."). Im Bild selbst, wo man zuerst hinsieht, war es
nicht zu erkennen.
Waehrend der Fahrt liegt jetzt eine Strasse unter dem Wagen: dunkler Belag,
gestrichelte Markierungen in den Randstreifen neben den Raedern, zwei Reihen
Baumkronen, die aussen vorbeiziehen. Dazu vier Windstreifen - zwei neben dem
Wagen, zwei ueber ihn hinweg, heller und duenner, damit sie wie Luft wirken
und nicht wie ein Riss im Lack.
Beide Schleifen treffen sich selbst: die Striche wandern um eine
Strich-Lueckenlaenge (46), die Baumreihen um ihren Abstand (160) - danach
steht das Muster wieder wie zuvor, und man sieht keinen Sprung. Markierungen
und Baeume laufen mit derselben Geschwindigkeit, der Wind etwa anderthalbmal
so schnell; groessere Unterschiede lassen die Bewegungen auseinanderfallen.
Dazu ein Abzeichen "unterwegs" im Kopf der Kachel - fuer Vorleseprogramme und
fuer alle, die Bewegungen abgeschaltet haben; dann steht die Landschaft still
(prefers-reduced-motion).
Der Zustand kommt aus park_state der juengsten Zeile; der Broker kennt ihn
nicht, unter solarManager/ev* stehen nur Ladestand, Reichweite und Ladung.
Unterwegs fragt der Sammler alle vier Minuten, die Seite laedt jede Minute
nach - die Anzeige hinkt also um wenige Minuten hinterher.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+108
@@ -1131,6 +1131,114 @@ input[type='range']::-webkit-slider-runnable-track {
|
|||||||
stroke-width: 2;
|
stroke-width: 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* --- Strasse ------------------------------------------------------------
|
||||||
|
Sichtbar nur waehrend der Fahrt. Sie traegt die eigentliche Bewegung: der
|
||||||
|
Belag dunkelt die Flaeche ab, die Markierungen laufen in den Randstreifen
|
||||||
|
neben den Raedern, die Baeume ziehen aussen vorbei.
|
||||||
|
|
||||||
|
Beide Schleifen sind so gebaut, dass sie sich selbst treffen: die Striche
|
||||||
|
wandern um eine Strich-Lueckenlaenge (26 + 20 = 46), die Baumreihen um
|
||||||
|
ihren Abstand (160). Nach einem Durchlauf steht das Muster wieder wie
|
||||||
|
zuvor - deshalb sieht man keinen Sprung.
|
||||||
|
|
||||||
|
Alle drei laufen mit derselben Geschwindigkeit von rund 180 Einheiten je
|
||||||
|
Sekunde: Markierungen und Baeume gehoeren zur selben Landschaft, und ein
|
||||||
|
Baum, der langsamer zurueckbleibt als der Strich daneben, faellt sofort
|
||||||
|
auf. */
|
||||||
|
.skoda-auto .strasse { display: none; }
|
||||||
|
.skoda-auto.faehrt .strasse { display: block; }
|
||||||
|
|
||||||
|
.skoda-auto .strasse .belag {
|
||||||
|
fill: rgba(8, 10, 12, 0.35);
|
||||||
|
}
|
||||||
|
|
||||||
|
.skoda-auto .strasse .markierung line {
|
||||||
|
stroke: rgba(232, 237, 233, 0.35);
|
||||||
|
stroke-width: 3;
|
||||||
|
stroke-dasharray: 26 20;
|
||||||
|
animation: skoda-markierung 0.26s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.skoda-auto .strasse .baum {
|
||||||
|
fill: rgba(96, 140, 104, 0.55);
|
||||||
|
stroke: rgba(52, 84, 60, 0.7);
|
||||||
|
stroke-width: 1.2;
|
||||||
|
}
|
||||||
|
.skoda-auto .strasse .baumreihe { animation: skoda-baeume 0.9s linear infinite; }
|
||||||
|
/* Die rechte Reihe etwas langsamer und mit Vorlauf - sonst stehen sich die
|
||||||
|
Baeume paarweise gegenueber. */
|
||||||
|
.skoda-auto .strasse .rechts { animation-duration: 1.05s; animation-delay: -0.4s; }
|
||||||
|
|
||||||
|
@keyframes skoda-markierung {
|
||||||
|
from { transform: translateY(0); }
|
||||||
|
to { transform: translateY(46px); }
|
||||||
|
}
|
||||||
|
@keyframes skoda-baeume {
|
||||||
|
from { transform: translateY(0); }
|
||||||
|
to { transform: translateY(160px); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --- Fahrtwind ----------------------------------------------------------
|
||||||
|
Vier Streifen neben dem Wagen, die von vorn nach hinten laufen. Sichtbar
|
||||||
|
nur, solange zeichneFahrt() dem SVG die Klasse "faehrt" gibt.
|
||||||
|
|
||||||
|
Die Laenge der Streifen steckt im Markup (y1/y2), die Bewegung hier: jede
|
||||||
|
Spur laeuft in eigenem Takt und mit eigenem Vorlauf ueber das Bild, sonst
|
||||||
|
marschieren die vier im Gleichschritt und es sieht nach Zebrastreifen aus
|
||||||
|
statt nach Fahrt. Der Weg reicht von weit oberhalb bis weit unterhalb der
|
||||||
|
viewBox (-8 bis 508), damit kein Streifen im Bild entsteht oder endet. */
|
||||||
|
.skoda-auto .fahrtwind { display: none; }
|
||||||
|
.skoda-auto.faehrt .fahrtwind { display: block; }
|
||||||
|
/* Die Streifen ueber dem Wagen liegen ueber den beiden Knoepfen; sie duerfen
|
||||||
|
deren Beruehrungen nicht abfangen. */
|
||||||
|
.skoda-auto .fahrtwind-oben { pointer-events: none; }
|
||||||
|
|
||||||
|
.skoda-auto .fahrtwind line {
|
||||||
|
stroke: rgba(var(--skoda-blech), 0.75);
|
||||||
|
stroke-width: 4;
|
||||||
|
stroke-linecap: round;
|
||||||
|
animation: skoda-fahrtwind 1.1s linear infinite;
|
||||||
|
}
|
||||||
|
/* Vier Spuren, jede mit eigenem Takt und Vorlauf. Der Wind zieht etwa
|
||||||
|
anderthalbmal so schnell wie die Landschaft: schneller, weil Luft ueber den
|
||||||
|
Wagen streicht, aber nicht so viel schneller, dass die beiden Bewegungen
|
||||||
|
auseinanderfallen. */
|
||||||
|
.skoda-auto .fahrtwind .b1 { animation-duration: 2.40s; animation-delay: -0.30s; opacity: .5; }
|
||||||
|
.skoda-auto .fahrtwind .b6 { animation-duration: 2.60s; animation-delay: -1.70s; opacity: .5; }
|
||||||
|
|
||||||
|
/* Ueber dem Fahrzeug: heller, duenner, durchsichtiger. Der Wind zieht ueber
|
||||||
|
das Blech hinweg - er soll sich darauf legen, nicht hineinschneiden. Die
|
||||||
|
Streifen stehen dafuer in einer eigenen Gruppe am Ende des SVG (siehe
|
||||||
|
dort); ihre geringe Deckung haelt Ladestand und Umrisse lesbar. */
|
||||||
|
.skoda-auto .fahrtwind .ueber {
|
||||||
|
stroke: rgba(232, 237, 233, 0.85);
|
||||||
|
stroke-width: 3;
|
||||||
|
}
|
||||||
|
.skoda-auto .fahrtwind .b7 { animation-duration: 2.30s; animation-delay: -0.60s; opacity: .34; }
|
||||||
|
.skoda-auto .fahrtwind .b10 { animation-duration: 2.70s; animation-delay: -1.20s; opacity: .34; }
|
||||||
|
|
||||||
|
@keyframes skoda-fahrtwind {
|
||||||
|
from { transform: translateY(0); }
|
||||||
|
to { transform: translateY(680px); }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wer Bewegung abbestellt hat, bekommt sie nicht - aber auch keine leere
|
||||||
|
Stelle: die Streifen stehen dann ruhig neben dem Wagen, und das Abzeichen
|
||||||
|
"unterwegs" im Kopf der Kachel sagt es ohnehin in Worten. */
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.skoda-auto .fahrtwind line {
|
||||||
|
animation: none;
|
||||||
|
transform: translateY(250px);
|
||||||
|
opacity: .45;
|
||||||
|
}
|
||||||
|
/* Strasse und Baeume bleiben stehen - zu sehen ist dann eine Standaufnahme
|
||||||
|
statt einer Fahrt, und das Abzeichen "unterwegs" sagt den Rest. */
|
||||||
|
.skoda-auto .strasse .markierung line,
|
||||||
|
.skoda-auto .strasse .baumreihe {
|
||||||
|
animation: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.skoda-auto .rad rect { fill: rgba(18, 20, 24, 0.9); }
|
.skoda-auto .rad rect { fill: rgba(18, 20, 24, 0.9); }
|
||||||
.skoda-auto .spiegel rect { fill: rgba(var(--skoda-blech), 0.55); }
|
.skoda-auto .spiegel rect { fill: rgba(var(--skoda-blech), 0.55); }
|
||||||
.skoda-auto .spoiler { fill: rgba(var(--skoda-blech), 0.55); }
|
.skoda-auto .spoiler { fill: rgba(var(--skoda-blech), 0.55); }
|
||||||
|
|||||||
+30
-1
@@ -426,7 +426,16 @@ function liveWerte() {
|
|||||||
klima: stand ? stand.ac_state : null,
|
klima: stand ? stand.ac_state : null,
|
||||||
// null heißt: das Fahrzeug meldet den Zustand des Schlosses selbst nicht.
|
// null heißt: das Fahrzeug meldet den Zustand des Schlosses selbst nicht.
|
||||||
verriegelt: (stand && stand.locked !== null && stand.locked !== undefined)
|
verriegelt: (stand && stand.locked !== null && stand.locked !== undefined)
|
||||||
? Number(stand.locked) === 1 : null
|
? Number(stand.locked) === 1 : null,
|
||||||
|
/*
|
||||||
|
* Fährt gerade. Kommt allein aus der Tabelle - der Broker kennt den
|
||||||
|
* Parkzustand nicht, unter solarManager/ev* stehen nur Ladestand,
|
||||||
|
* Reichweite und Ladung. Der Sammler fragt das Fahrzeug unterwegs alle
|
||||||
|
* vier Minuten, die Seite lädt jede Minute nach: die Anzeige hinkt also
|
||||||
|
* um wenige Minuten hinterher. Für "rollt gerade" reicht das; ein
|
||||||
|
* Tachometer ist es nicht.
|
||||||
|
*/
|
||||||
|
faehrt: !!(stand && stand.park_state === "IN_MOTION")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -538,6 +547,25 @@ function zeichneAbzeichen(w) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fahrt anzeigen: Fahrtwind am Fahrzeug, Abzeichen im Kopf der Kachel.
|
||||||
|
*
|
||||||
|
* Zwei Wege für dieselbe Aussage, und beide werden gebraucht. Die Streifen
|
||||||
|
* sieht man aus dem Augenwinkel, ohne zu lesen - dafür sind sie da. Wer die
|
||||||
|
* Seite vorgelesen bekommt oder Bewegungen abgeschaltet hat, hat von ihnen
|
||||||
|
* nichts; deshalb steht es zusätzlich als Wort neben Schloss und Ladezustand.
|
||||||
|
*/
|
||||||
|
function zeichneFahrt(w) {
|
||||||
|
const bild = $("skodaAuto");
|
||||||
|
if (bild) {
|
||||||
|
bild.classList.toggle("faehrt", w.faehrt);
|
||||||
|
}
|
||||||
|
const abzeichen = $("skodaUnterwegs");
|
||||||
|
if (abzeichen) {
|
||||||
|
abzeichen.hidden = !w.faehrt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Herkunft des Ladestroms: was die Anlage im Augenblick liefert, gegen das,
|
* Herkunft des Ladestroms: was die Anlage im Augenblick liefert, gegen das,
|
||||||
* was die Wallbox zieht. Ohne Ladung hat der Balken nichts zu teilen und
|
* was die Wallbox zieht. Ohne Ladung hat der Balken nichts zu teilen und
|
||||||
@@ -570,6 +598,7 @@ function zeichneLive() {
|
|||||||
zeichneKlimaknopf(w);
|
zeichneKlimaknopf(w);
|
||||||
zeichneKennzahlen(w);
|
zeichneKennzahlen(w);
|
||||||
zeichneAbzeichen(w);
|
zeichneAbzeichen(w);
|
||||||
|
zeichneFahrt(w);
|
||||||
zeichneLadequelle(w);
|
zeichneLadequelle(w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,8 @@
|
|||||||
<div class="card-header pb-0 pt-1">
|
<div class="card-header pb-0 pt-1">
|
||||||
<h3 class="card-title">Übersicht</h3>
|
<h3 class="card-title">Übersicht</h3>
|
||||||
<div class="card-tools d-flex align-items-center gap-2">
|
<div class="card-tools d-flex align-items-center gap-2">
|
||||||
|
<!-- Nur unterwegs sichtbar; zeichneFahrt() blendet es ein. -->
|
||||||
|
<span class="badge text-bg-info" id="skodaUnterwegs" hidden>unterwegs</span>
|
||||||
<span class="badge text-bg-secondary" id="skodaSchloss">–</span>
|
<span class="badge text-bg-secondary" id="skodaSchloss">–</span>
|
||||||
<span class="badge text-bg-secondary" id="skodaLadeZustand">–</span>
|
<span class="badge text-bg-secondary" id="skodaLadeZustand">–</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -108,6 +110,64 @@
|
|||||||
d="M0 0 C 1.5 -4, 5 -7, 7.5 -5 C 9.6 -3.2, 5.5 -0.8, 0 0 Z"/>
|
d="M0 0 C 1.5 -4, 5 -7, 7.5 -5 C 9.6 -3.2, 5.5 -0.8, 0 0 Z"/>
|
||||||
</defs>
|
</defs>
|
||||||
|
|
||||||
|
<!-- Die Straße, über die der Wagen fährt. Ganz zuerst
|
||||||
|
gezeichnet, damit alles andere darauf liegt.
|
||||||
|
|
||||||
|
Der Belag deckt die ganze Zeichenfläche, die
|
||||||
|
Fahrbahnmarkierungen laufen in den beiden Randstreifen
|
||||||
|
neben den Rädern - dort ist Platz, ohne dem Fahrzeug
|
||||||
|
ins Bild zu geraten. Die Striche wandern um genau eine
|
||||||
|
Strich-Lücke-Länge; danach steht das Muster wieder so
|
||||||
|
da wie zuvor, und die Schleife ist unsichtbar.
|
||||||
|
|
||||||
|
Dasselbe bei den Bäumen: ihr Abstand ist der Weg einer
|
||||||
|
Umdrehung. Die beiden Reihen laufen versetzt und
|
||||||
|
verschieden schnell, sonst fährt man durch eine Allee
|
||||||
|
aus Zwillingen. -->
|
||||||
|
<g class="strasse" aria-hidden="true">
|
||||||
|
<rect class="belag" x="-16" y="-8" width="256" height="516"/>
|
||||||
|
<g class="markierung">
|
||||||
|
<line x1="-2" y1="-60" x2="-2" y2="560"/>
|
||||||
|
<line x1="226" y1="-60" x2="226" y2="560"/>
|
||||||
|
</g>
|
||||||
|
<g class="baumreihe links">
|
||||||
|
<circle class="baum" cx="-9" cy="-100" r="6.5"/>
|
||||||
|
<circle class="baum" cx="-8" cy="60" r="5.5"/>
|
||||||
|
<circle class="baum" cx="-9" cy="220" r="6.5"/>
|
||||||
|
<circle class="baum" cx="-8" cy="380" r="6"/>
|
||||||
|
<circle class="baum" cx="-9" cy="540" r="6.5"/>
|
||||||
|
</g>
|
||||||
|
<g class="baumreihe rechts">
|
||||||
|
<circle class="baum" cx="233" cy="-20" r="6"/>
|
||||||
|
<circle class="baum" cx="233" cy="140" r="6.5"/>
|
||||||
|
<circle class="baum" cx="232" cy="300" r="5.5"/>
|
||||||
|
<circle class="baum" cx="234" cy="460" r="6.5"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<!-- Fahrtwind: zeigt an, dass das Fahrzeug gerade rollt.
|
||||||
|
Die Streifen laufen von vorn nach hinten, also im Bild
|
||||||
|
von oben nach unten - das Auto zeigt nach oben.
|
||||||
|
|
||||||
|
Je eine Spur läuft links und rechts am Wagen vorbei,
|
||||||
|
zwei weitere ziehen über ihn hinweg - der Wind macht
|
||||||
|
am Blech ja nicht halt. Die über dem Fahrzeug sind
|
||||||
|
heller und dünner, damit sie wie Luft darüber wirken
|
||||||
|
und nicht wie ein Riss im Lack; die Mitte bleibt frei,
|
||||||
|
dort stehen Ladestand und Reichweite.
|
||||||
|
|
||||||
|
Wenige Streifen mit ungleichem Takt: die Bewegung
|
||||||
|
kommt jetzt vor allem von der Straße darunter, der
|
||||||
|
Wind setzt nur noch einen Akzent.
|
||||||
|
|
||||||
|
Sichtbar nur, solange das SVG die Klasse "faehrt"
|
||||||
|
trägt (siehe zeichneFahrt()); aria-hidden, weil der
|
||||||
|
Zustand als Abzeichen im Kopf schon dasteht. -->
|
||||||
|
<g id="fahrtwind" class="fahrtwind" aria-hidden="true">
|
||||||
|
<line class="boe b1" x1="-6" y1="-120" x2="-6" y2="-60"/>
|
||||||
|
<line class="boe b6" x1="230" y1="-120" x2="230" y2="-70"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
<!-- Räder. Vorderachse bei 860 mm, Hinterachse bei 3625 mm
|
<!-- Räder. Vorderachse bei 860 mm, Hinterachse bei 3625 mm
|
||||||
ab Bugspitze - der Radstand von 2765 mm maßstäblich. -->
|
ab Bugspitze - der Radstand von 2765 mm maßstäblich. -->
|
||||||
<g class="rad">
|
<g class="rad">
|
||||||
@@ -358,6 +418,18 @@
|
|||||||
</g>
|
</g>
|
||||||
<title>Klima und Lüftung steuern</title>
|
<title>Klima und Lüftung steuern</title>
|
||||||
</g>
|
</g>
|
||||||
|
|
||||||
|
<!-- Der Teil des Fahrtwinds, der über das Fahrzeug zieht.
|
||||||
|
Eigene Gruppe am Ende des Bildes, weil die Reihenfolge
|
||||||
|
im Markup die Malreihenfolge ist - weiter oben lägen
|
||||||
|
die Streifen unter der Karosserie und wären nicht zu
|
||||||
|
sehen. pointer-events: none steht im Stylesheet: sie
|
||||||
|
liegen über den beiden Knöpfen und dürfen deren
|
||||||
|
Berührungen nicht abfangen. -->
|
||||||
|
<g class="fahrtwind fahrtwind-oben" aria-hidden="true">
|
||||||
|
<line class="boe ueber b7" x1="62" y1="-120" x2="62" y2="-65"/>
|
||||||
|
<line class="boe ueber b10" x1="163" y1="-120" x2="163" y2="-60"/>
|
||||||
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
||||||
<p class="skoda-hinweis">
|
<p class="skoda-hinweis">
|
||||||
|
|||||||
Reference in New Issue
Block a user