/* ==========================================================================
Grundton der Oberflaeche
Die Seite laeuft auf AdminLTE, also auf Bootstrap. Beide beziehen ihre
Farben aus Variablen - deshalb wird hier nicht Regel fuer Regel
ueberschrieben, sondern die Palette ausgetauscht: ein paar Variablen am
Wurzelelement, und Karten, Tabellen, Abzeichen und Knoepfe folgen von
selbst. Was danach noch kommt, sind wenige gezielte Regeln fuer die Dinge,
die Bootstrap fest verdrahtet hat (Kartenrahmen, Kopfzeilen, Trennlinien).
Die Palette selbst ist die des Jahresvergleichs: ein leicht blaustichiges
Anthrazit als Grund, eine Spur hellere Flaeche fuer Karten, Haarlinien statt
Rahmen - und Bernstein als einzige Akzentfarbe, weil das auf dieser Seite
die Farbe der eigenen Anlage ist. Gruen, Rot und Gelb bleiben den
Zustaenden vorbehalten und sind kein Schmuck.
========================================================================== */
:root,
[data-bs-theme="dark"] {
--ton-grund: #191d20; /* Seitenhintergrund */
--ton-flaeche: #23282c; /* Karten */
--ton-flaeche-2: #2b3237; /* Kopfzeilen, Tabellenkopf */
--ton-linie: rgba(138, 148, 158, .20);
--ton-linie-satt: rgba(138, 148, 158, .38);
--ton-schrift: #e8ede9;
--ton-schrift-2: #9aa6ad;
--ton-schrift-3: #6f7a81;
--ton-sonne: #f0b429; /* die eigene Anlage */
--ton-sonne-rgb: 240, 180, 41;
--ton-gut: #4caf7d;
--ton-schlecht: #e06060;
/* Zwei Radien statt einem. Der grosse gilt fuer Flaechen (Karten, Modale,
Eingabefelder), der kleine fuer alles, was in einer Reihe steht -
Schalter, kleine Knoepfe, Abzeichen. Bootstrap kennt beide, benutzte
bisher aber nur den grossen; der kleine stand auf seiner Vorgabe von
.25rem und wirkte daneben eckig. */
--ton-radius: .875rem;
--ton-radius-klein: .5rem;
/* Die Anzeigeschrift. Poppins liegt seit jeher unter assets/fonts und trug
bisher nur die Etagenknoepfe im Aussenplan - eine ganze Schrift fuer vier
Buchstaben. Als Variable traegt sie jetzt alle Ueberschriften: waermer
und eine Spur weniger technisch als die Source Sans 3 des Fliesstextes,
ohne dass eine zweite Datei geladen wird. Zahlenkolonnen und Fliesstext
bleiben unberuehrt - Poppins hat keine Tabellenziffern. */
--font-anzeige: Poppins, system-ui, -apple-system, "Segoe UI", sans-serif;
/* ... und dieselben Werte dort, wo Bootstrap sie sucht. */
--bs-body-bg: var(--ton-grund);
--bs-body-bg-rgb: 25, 29, 32;
--bs-body-color: var(--ton-schrift);
--bs-body-color-rgb: 232, 237, 233;
--bs-emphasis-color: #fff;
--bs-secondary-color: var(--ton-schrift-2);
--bs-secondary-bg: var(--ton-flaeche-2);
--bs-tertiary-color: var(--ton-schrift-3);
--bs-tertiary-bg: var(--ton-flaeche-2);
--bs-border-color: var(--ton-linie-satt);
--bs-border-radius: var(--ton-radius);
--bs-border-radius-sm: var(--ton-radius-klein);
--bs-link-color: var(--ton-sonne);
--bs-link-hover-color: #ffc94d;
--bs-heading-color: var(--ton-schrift);
}
/* Ueberschriften in der Anzeigeschrift. Bewusst nur Ueberschriften: der
Fliesstext und alle Zahlenkolonnen bleiben bei der Schrift des Themes,
weil Poppins keine Tabellenziffern mitbringt und Messwerte sonst
springen wuerden. */
h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6,
.card-title,
.modal-title {
font-family: var(--font-anzeige);
font-weight: 600;
letter-spacing: -.01em;
}
/* Der Rumpf traegt zwei Grundfarben: die Seite und die Leisten drumherum.
AdminLTE setzt sie ueber eigene Klassen, die hier auf denselben Ton
gebracht werden - sonst steht eine Karte auf drei verschiedenen Grautoenen. */
body.bg-body-tertiary,
.app-content,
.app-content-header { background: var(--ton-grund); }
.app-header.bg-body,
.app-sidebar.bg-body-secondary {
background: var(--ton-flaeche) !important;
border-color: var(--ton-linie) !important;
}
.app-header { box-shadow: 0 1px 0 var(--ton-linie); }
/* --- Eigene Symbole ------------------------------------------------------
Fuer Dinge, die Bootstrap Icons nicht kennt. Gezeichnet als Maske in
currentColor, damit sie sich wie ein Symbol aus der Schrift verhalten:
- Groesse, Farbe und Ausrichtung wie
bei allen anderen. bootstrap-icons.min.css laedt nach dieser Datei, daher
.bi doppelt im Selektor.
bi-beschattung: Kasten, zwei Lamellen, Endleiste - ein Raffstore. Bewusst
nur vier Balken mit viel Luft dazwischen: mit Fuehrungsschienen und drei
Lamellen lief das Zeichen bei 16 px zu einem Block zusammen. Ueberall dasselbe: Raum-Modal, Zeitleiste, Editor.
-------------------------------------------------------------------------- */
.bi.bi-beschattung::before {
content: "";
width: 1em;
height: 1em;
background-color: currentColor;
-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 16 16%22%3E%3Crect x=%221.5%22 y=%221.6%22 width=%2213%22 height=%222.6%22 rx=%22.9%22/%3E%3Crect x=%222.6%22 y=%225.7%22 width=%2210.8%22 height=%221.7%22 rx=%22.85%22/%3E%3Crect x=%222.6%22 y=%228.6%22 width=%2210.8%22 height=%221.7%22 rx=%22.85%22/%3E%3Crect x=%221.5%22 y=%2211.8%22 width=%2213%22 height=%222.6%22 rx=%22.9%22/%3E%3C/svg%3E") center / contain no-repeat;
mask: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 16 16%22%3E%3Crect x=%221.5%22 y=%221.6%22 width=%2213%22 height=%222.6%22 rx=%22.9%22/%3E%3Crect x=%222.6%22 y=%225.7%22 width=%2210.8%22 height=%221.7%22 rx=%22.85%22/%3E%3Crect x=%222.6%22 y=%228.6%22 width=%2210.8%22 height=%221.7%22 rx=%22.85%22/%3E%3Crect x=%221.5%22 y=%2211.8%22 width=%2213%22 height=%222.6%22 rx=%22.9%22/%3E%3C/svg%3E") center / contain no-repeat;
}
/* --- Karten --------------------------------------------------------------
Eine Karte ist eine Flaeche, kein Kasten: ein Ton heller als der Grund, eine
Haarlinie als Rand, kein Schlagschatten. Der Schatten trennte frueher, was
der Farbunterschied jetzt allein leistet. */
.card {
background: var(--ton-flaeche);
border: 1px solid var(--ton-linie);
border-radius: var(--ton-radius);
box-shadow: none;
}
.card-header {
background: transparent;
border-bottom: 1px solid var(--ton-linie);
padding-inline: 1rem;
}
.card-title {
font-size: 1rem;
font-weight: 500;
letter-spacing: -.01em;
}
.card-body { padding: 1rem; }
.card-footer {
background: transparent;
border-top: 1px solid var(--ton-linie);
}
/* Werkzeugknoepfe in der Kopfzeile: ruhig, bis man sie braucht. */
.btn-tool {
color: var(--ton-schrift-3);
transition: color .18s, background .18s;
border-radius: .35rem;
}
.btn-tool:hover,
.btn-tool:focus-visible { color: var(--ton-schrift); background: rgba(138, 148, 158, .12); }
/* --- Menue ---------------------------------------------------------------
Der aktive Punkt traegt die Akzentfarbe, nicht das Blau des Themes -
sonst haette die Seite zwei Hauptfarben. */
.sidebar-menu .nav-link {
border-radius: .45rem;
color: var(--ton-schrift-2);
}
.sidebar-menu .nav-link:hover { background: rgba(138, 148, 158, .1); color: var(--ton-schrift); }
.sidebar-menu .nav-link.active,
.sidebar-menu .nav-link.active:hover {
background: rgba(var(--ton-sonne-rgb), .16);
color: var(--ton-sonne);
}
.sidebar-brand { border-bottom: 1px solid var(--ton-linie); }
.brand-text { font-weight: 400; letter-spacing: .01em; }
/* --- Schrift -------------------------------------------------------------
Zahlen stehen ueberall in Spalten untereinander - mit Ziffern gleicher
Breite bleiben sie ausgerichtet, auch wenn sich der Wert aendert. */
.card-body,
.table,
.info-box-number,
.progress-bar { font-variant-numeric: tabular-nums; }
.app-content-header h3 {
font-weight: 500;
letter-spacing: -.01em;
}
/* --- Tabellen ------------------------------------------------------------ */
.table {
--bs-table-bg: transparent;
--bs-table-color: var(--ton-schrift);
--bs-table-border-color: var(--ton-linie);
--bs-table-hover-bg: rgba(138, 148, 158, .06);
--bs-table-striped-bg: rgba(138, 148, 158, .04);
}
.table > thead {
color: var(--ton-schrift-2);
font-size: .82rem;
font-weight: 500;
}
/* --- Abzeichen -----------------------------------------------------------
Gedaempft statt grell: ein Abzeichen soll den Zustand sagen, nicht die
Kachel dominieren. */
.badge { font-weight: 500; letter-spacing: .01em; }
.badge.text-bg-secondary {
background: rgba(138, 148, 158, .18) !important;
color: var(--ton-schrift-2) !important;
}
.badge.text-bg-success {
background: rgba(76, 175, 125, .18) !important;
color: var(--ton-gut) !important;
}
.badge.text-bg-warning {
background: rgba(240, 180, 41, .18) !important;
color: var(--ton-sonne) !important;
}
.badge.text-bg-danger {
background: rgba(224, 96, 96, .18) !important;
color: var(--ton-schlecht) !important;
}
.badge.text-bg-info {
background: rgba(122, 167, 199, .18) !important;
color: #9cc4de !important;
}
/* --- Formulare ----------------------------------------------------------- */
.form-control,
.form-select {
background: rgba(0, 0, 0, .18);
border-color: var(--ton-linie-satt);
color: var(--ton-schrift);
}
.form-control:focus,
.form-select:focus {
background: rgba(0, 0, 0, .18);
border-color: var(--ton-sonne);
box-shadow: 0 0 0 .2rem rgba(var(--ton-sonne-rgb), .2);
color: var(--ton-schrift);
}
.form-check-input:checked { background-color: var(--ton-sonne); border-color: var(--ton-sonne); }
.form-check-input:focus { box-shadow: 0 0 0 .2rem rgba(var(--ton-sonne-rgb), .2); }
/* Sichtbarer Tastaturfokus, einheitlich - AdminLTE setzt ihn stellenweise ab. */
a:focus-visible,
button:focus-visible,
[tabindex]:focus-visible {
outline: 2px solid var(--ton-sonne);
outline-offset: 2px;
}
/* --- Trennlinien und Modals ---------------------------------------------- */
hr { border-color: var(--ton-linie); opacity: 1; }
.modal-content {
background: var(--ton-flaeche);
border: 1px solid var(--ton-linie-satt);
border-radius: var(--ton-radius);
}
.modal-header,
.modal-footer { border-color: var(--ton-linie); }
/* ==========================================================================
Jahresstatistik (js/solar/jahresstatistik.js)
Die Tabelle traegt die Seite "Vergangenheit" und steht in kleiner Form auch
auf der Solarseite. Sie ist zum Lesen einer Zeile gebaut: Kennzahlen links,
Jahre nebeneinander, die Veraenderung als Zahl - nicht als blosser Pfeil.
========================================================================== */
/* Der Baustein setzt seine Bloecke selbst auf Abstand - und zwar auf denselben
wie den zwischen den Leitzahlen und den Innenabstand der Karte. Alle Nahtstellen
sind dadurch gleich weit, gleich ob die Werkzeugleiste dabei ist oder nicht. */
.jahresstatistik {
display: flex;
flex-direction: column;
gap: var(--stat-abstand, 1.25rem);
}
/* Der Innenabstand der Karte gehoert zum selben Mass - sonst sitzt die erste
Kachel enger unter der Ueberschrift als die zweite unter der ersten.
Der Vorsatz .app-content ist noetig, nicht schmueckend: weiter unten in
dieser Datei setzt .app-content .card-body auf dem Handy einen kleineren
Innenabstand, und bei gleicher Spezifitaet gewaenne die spaetere Regel. */
.app-content .card-body.statistik { padding: var(--stat-abstand, 1.25rem); }
/* Auf dem Handy ruecken alle Nahtstellen zusammen - aber gemeinsam, sonst
waere die Gleichheit wieder dahin. */
@media (max-width: 767.98px) {
.jahresstatistik,
.app-content .card-body.statistik { --stat-abstand: 1rem; }
}
/* --- Leitzahlen ---------------------------------------------------------- */
.jahresstatistik .leitzahlen {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
gap: var(--stat-abstand, 1.25rem);
}
.jahresstatistik .leitzahl {
background: rgba(138, 148, 158, .07);
border: 1px solid var(--ton-linie);
border-radius: var(--ton-radius);
padding: .9rem 1.05rem 1rem;
}
.jahresstatistik .leitzahl .name { font-size: .78rem; color: var(--ton-schrift-2); }
.jahresstatistik .leitzahl .zahl {
display: flex;
align-items: baseline;
gap: .35rem;
margin-top: .3rem;
font-size: 1.9rem;
font-weight: 500;
line-height: 1.1;
font-variant-numeric: tabular-nums;
}
.jahresstatistik .leitzahl .einheit {
font-size: .95rem;
font-weight: 400;
color: var(--ton-schrift-2);
}
.jahresstatistik .leitzahl .fuss {
margin-top: .45rem;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: .5rem;
font-size: .76rem;
color: var(--ton-schrift-3);
}
.jahresstatistik .leitzahl.betont { border-color: rgba(var(--ton-sonne-rgb), .45); }
.jahresstatistik .leitzahl.betont .zahl { color: var(--ton-sonne); }
/* Die Veraenderung: Richtung und Groesse, nicht nur Richtung. */
.jahresstatistik .delta {
display: inline-flex;
align-items: center;
gap: .25rem;
font-size: .78rem;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.jahresstatistik .delta.gut { color: var(--ton-gut); }
.jahresstatistik .delta.schlecht { color: var(--ton-schlecht); }
.jahresstatistik .delta.gleich { color: var(--ton-schrift-3); }
/* --- Werkzeugleiste ------------------------------------------------------ */
.jahresstatistik .werkzeuge {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: .75rem 1.25rem;
}
.jahresstatistik .umschalter {
display: inline-flex;
border: 1px solid var(--ton-linie-satt);
border-radius: .45rem;
overflow: hidden;
}
.jahresstatistik .umschalter button {
appearance: none;
border: 0;
background: none;
color: var(--ton-schrift-2);
font: inherit;
font-size: .82rem;
padding: .4rem .9rem;
cursor: pointer;
transition: background .18s, color .18s;
}
.jahresstatistik .umschalter button + button { border-left: 1px solid var(--ton-linie-satt); }
.jahresstatistik .umschalter button:hover { background: rgba(138, 148, 158, .1); }
.jahresstatistik .umschalter button[aria-pressed="true"] {
background: rgba(var(--ton-sonne-rgb), .16);
color: var(--ton-sonne);
}
/* Das Jahrfenster: zwei Pfeile und dazwischen, was gerade zu sehen ist. */
.jahresstatistik .jahrwahl {
display: inline-flex;
align-items: center;
gap: .35rem;
font-size: .82rem;
color: var(--ton-schrift-2);
}
.jahresstatistik .jahrwahl button {
appearance: none;
border: 1px solid var(--ton-linie-satt);
background: none;
color: var(--ton-schrift-2);
border-radius: .35rem;
width: 1.9rem;
height: 1.9rem;
line-height: 1;
cursor: pointer;
transition: background .18s, color .18s, opacity .18s;
}
.jahresstatistik .jahrwahl button:hover:not(:disabled) {
background: rgba(138, 148, 158, .12);
color: var(--ton-schrift);
}
.jahresstatistik .jahrwahl button:disabled { opacity: .3; cursor: default; }
.jahresstatistik .jahrwahl .fenster { font-variant-numeric: tabular-nums; min-width: 5.5rem; text-align: center; }
.jahresstatistik .kasten {
display: inline-flex;
align-items: center;
gap: .45rem;
font-size: .82rem;
color: var(--ton-schrift-2);
cursor: pointer;
user-select: none;
}
.jahresstatistik .kasten input { accent-color: var(--ton-sonne); width: 1rem; height: 1rem; }
/* --- Die Tabelle --------------------------------------------------------- */
.jahresstatistik .tafel-scroll {
overflow-x: auto;
border: 1px solid var(--ton-linie);
border-radius: var(--ton-radius);
}
.jahresstatistik .tafel {
width: 100%;
border-collapse: collapse;
font-size: .88rem;
margin: 0;
}
.jahresstatistik .tafel thead th {
background: var(--ton-flaeche-2);
text-align: right;
font-weight: 500;
font-size: .78rem;
padding: .55rem .9rem .5rem;
border-bottom: 1px solid var(--ton-linie-satt);
white-space: nowrap;
}
.jahresstatistik .tafel thead th:first-child { text-align: left; }
.jahresstatistik .tafel thead th.jetzt { color: var(--ton-sonne); }
.jahresstatistik .tafel thead .zeitraum {
display: block;
font-weight: 400;
font-size: .68rem;
color: var(--ton-schrift-3);
letter-spacing: .03em;
}
.jahresstatistik .tafel tbody td {
padding: .4rem .9rem;
border-bottom: 1px solid var(--ton-linie);
text-align: right;
font-variant-numeric: tabular-nums;
white-space: nowrap;
}
.jahresstatistik .tafel tbody td.name {
text-align: left;
width: 40%;
min-width: 14rem;
white-space: normal;
}
.jahresstatistik .tafel tbody tr:last-child td { border-bottom: 0; }
@media (hover: hover) {
.jahresstatistik .tafel tbody tr:hover td { background: rgba(138, 148, 158, .06); }
.jahresstatistik .tafel tbody tr.gruppe:hover td { background: none; }
}
/* Gruppenkopf: kein Kasten, nur eine Zaesur. */
.jahresstatistik .tafel tr.gruppe td {
padding: 1rem .9rem .25rem;
border-bottom: 1px solid var(--ton-linie-satt);
font-size: .7rem;
letter-spacing: .13em;
text-transform: uppercase;
color: var(--ton-schrift-3);
text-align: left;
}
/* Die Summenzeile traegt das Gewicht, die Teile darunter nicht. */
.jahresstatistik .tafel tr.summe td { font-size: .95rem; }
.jahresstatistik .tafel tr.summe td.name { font-weight: 500; }
.jahresstatistik .tafel tr.summe .wert-jetzt { color: var(--ton-sonne); }
/* Einrueckung: "davon" teilt die Summe auf, "darin" greift etwas heraus, das
schon in einer Zeile darueber steckt. */
.jahresstatistik .tafel td.name .stufe-1 {
padding-left: 1.4rem;
position: relative;
display: inline-block;
}
.jahresstatistik .tafel td.name .stufe-1::before {
content: "";
position: absolute;
left: .45rem;
top: .75em;
width: .55rem;
border-top: 1px solid var(--ton-linie-satt);
}
.jahresstatistik .tafel tr.teilmenge td { color: var(--ton-schrift-2); font-size: .82rem; }
/* Zweite Stufe. Der Strich sitzt tiefer eingerueckt als der der ersten und
zeigt damit, an welcher Zeile die Teilmenge haengt. */
.jahresstatistik .tafel td.name .stufe-2 {
padding-left: 2.8rem;
position: relative;
display: inline-block;
}
.jahresstatistik .tafel td.name .stufe-2::before {
content: "";
position: absolute;
left: 1.85rem;
top: .75em;
width: .55rem;
border-top: 1px dashed var(--ton-linie-satt);
}
.jahresstatistik .tafel .darin {
font-size: .68rem;
letter-spacing: .06em;
text-transform: uppercase;
color: var(--ton-schrift-3);
margin-right: .4rem;
}
.jahresstatistik .tafel .einheit-klein {
font-size: .7rem;
color: var(--ton-schrift-3);
margin-left: .4rem;
}
.jahresstatistik .tafel .wert-alt { color: var(--ton-schrift-2); }
.jahresstatistik .tafel .leer { color: var(--ton-schrift-3); text-align: left; }
/* Die Gesamtspalte ist eine andere Art Zahl als ein Jahreswert - sie steht
deshalb abgesetzt und ruhiger. */
.jahresstatistik .tafel .gesamt {
border-left: 1px solid var(--ton-linie-satt);
color: var(--ton-schrift-2);
}
.jahresstatistik .tafel thead th.gesamt { color: var(--ton-schrift-2); }
/* Aufklappbare Teilzeilen */
.jahresstatistik .tafel button.klapp {
appearance: none;
background: none;
border: 0;
color: inherit;
font: inherit;
padding: 0;
cursor: pointer;
display: inline-flex;
flex-wrap: wrap;
align-items: center;
gap: .2rem .4rem;
text-align: left;
}
.jahresstatistik .tafel button.klapp .pfeil {
display: inline-block;
width: .55rem;
color: var(--ton-schrift-3);
transition: transform .18s;
}
.jahresstatistik .tafel button.klapp[aria-expanded="true"] .pfeil { transform: rotate(90deg); }
/* Was hinter einer zugeklappten Zeile steckt - sonst waere das Zugeklappte
nicht nur zusammengefasst, sondern verschwunden. */
.jahresstatistik .tafel .posten {
margin-left: .55rem;
padding: .05rem .45rem;
border: 1px solid var(--ton-linie-satt);
border-radius: 1rem;
font-size: .68rem;
font-weight: 400;
letter-spacing: .03em;
color: var(--ton-schrift-3);
white-space: nowrap;
}
@media (hover: hover) {
.jahresstatistik .tafel button.klapp:hover .posten {
border-color: var(--ton-sonne);
color: var(--ton-sonne);
}
}
.jahresstatistik .tafel tr.versteckt { display: none; }
/* --- Monatsverlauf ------------------------------------------------------- */
.jahresstatistik .tafel th.verlauf,
.jahresstatistik .tafel td.verlauf { width: 7.5rem; }
.jahresstatistik .spark {
display: block;
/* Waagerecht faehrt der Finger die Monate ab, senkrecht scrollt die Seite
weiter - ohne diese Angabe verschluckt der Browser das Wischen. */
touch-action: pan-y;
}
.jahresstatistik .spark rect.balken { fill: var(--ton-linie-satt); transition: fill .15s; }
.jahresstatistik .spark rect.balken.jetzt { fill: var(--ton-sonne); }
.jahresstatistik .spark rect.balken.aktiv { fill: var(--ton-sonne); }
.jahresstatistik .spark line.basis { stroke: var(--ton-linie); stroke-width: 1; }
/* Die ganze Zelle nimmt die Beruehrung an, nicht nur die Balken darin -
ein SVG-Wurzelelement laesst sich nicht mit Innenabstand vergroessern. */
.jahresstatistik .tafel td.verlauf { touch-action: pan-y; cursor: crosshair; }
.spark-tipp {
position: fixed;
z-index: 1080;
pointer-events: none;
background: #12161a;
border: 1px solid var(--ton-linie-satt);
border-radius: .35rem;
padding: .3rem .55rem;
font-size: .75rem;
font-variant-numeric: tabular-nums;
box-shadow: 0 .4rem 1.2rem rgba(0, 0, 0, .5);
opacity: 0;
transition: opacity .12s;
}
.spark-tipp.an { opacity: 1; }
/* --- Fussnoten ----------------------------------------------------------- */
.jahresstatistik .fussnoten {
display: grid;
gap: .5rem;
font-size: .78rem;
color: var(--ton-schrift-2);
max-width: 68ch;
}
.jahresstatistik .fussnoten p { margin: 0; }
.jahresstatistik .fussnoten b { color: var(--ton-schrift); font-weight: 500; }
@media (max-width: 575.98px) {
.jahresstatistik .tafel tbody td.name { min-width: 11rem; }
.jahresstatistik .werkzeuge { gap: .6rem .9rem; }
}
@media (prefers-reduced-motion: reduce) {
.jahresstatistik .umschalter button,
.jahresstatistik .jahrwahl button,
.jahresstatistik .spark rect.balken,
.jahresstatistik .tafel button.klapp .pfeil,
.spark-tipp { transition: none; }
}
.winddir {
position:absolute;
left:60%;
width:25%;
height:40%;
padding: 0;
background-image: url('../assets/img/arrow.svg');
background-size:contain;
background-repeat: no-repeat;
background-position: center;
}
/* Schieberegler in den Modals (Autoladung, Heizstab, Thermostat).
Der gefuellte Anteil kommt aus --background-size, gesetzt von
bindModalSlider() in js/solar/common.js. */
input[type='range']::-webkit-slider-runnable-track {
background: linear-gradient(to right, #00788F, #00788F), #D7D7D7;
background-size: var(--background-size, 0%) 100%;
background-repeat: no-repeat;
}
/* Diagramme (Chart.js). Die Hoehe kommt aus diesem Container, nicht aus dem
canvas - die Charts laufen mit maintainAspectRatio: false. Auf dem Handy
ist der Container nur rund 300 px breit; mit 400 px Hoehe wird aus einer
Zeitreihe ein Hochformat, in dem die Zeitachse die kurze Seite ist. */
.chart-container {
position: relative;
width: 100%;
height: 400px;
}
@media (max-width: 767.98px) {
.chart-container {
height: 250px;
}
}
/* Auf dem Handy gehen von 375 px rund 75 an Innenabstaende verloren, und
zwischen den Karten stehen 24 px. Beides wird hier enger gefasst - nur
im Inhaltsbereich, damit Seitenleiste, Kopfzeile und Modals unberuehrt
bleiben. Die Abstandsklassen von Bootstrap (mb-4) tragen !important,
deshalb steht es auch hier. */
@media (max-width: 767.98px) {
.app-content {
padding: 0 .25rem;
}
.app-content-header {
padding: .5rem .25rem;
}
.app-content .row {
--bs-gutter-x: .5rem;
}
.app-content .card {
margin-bottom: .75rem !important;
}
/* Nur der Standardwert wird kleiner; eigene Angaben im Markup (p-0 fuer
das Realtime-SVG) gelten weiter. */
.app-content .card-body {
padding: .5rem;
}
/* Die Jahrestabelle scrollt auf dem Handy seitwaerts; damit moeglichst
viel davon ohne Schieben zu sehen ist, ruecken die Spalten enger
zusammen. */
.jahresstatistik .tafel tbody td,
.jahresstatistik .tafel thead th {
padding-inline: .55rem;
}
}
/* --------------------------------------------------------------------------
Drei Klassen, die der Automatik-Editor gebraucht hat - hier, nicht dort
Sie stehen absichtlich in der gemeinsamen Datei und nicht als Sonderfall
im Editor. Zwei davon sind allgemein genug, um anderswo zu taugen; die
dritte ist eine echte Ausnahme und als einzelne Klasse auch als solche
erkennbar.
-------------------------------------------------------------------------- */
/* Ein Auswahlfeld, das wie Text aussieht, bis man es anfaehrt.
Eine Bedingung hat sechs Bestandteile, aber nur zwei davon traegt man
wirklich ein: Vergleich und Wert. Standen alle sechs als gleich schwere
Kaesten nebeneinander, sagte nichts mehr, worauf es ankommt. Die
gepunktete Linie sagt "anklickbar", ohne den Platz und das Gewicht eines
Eingabefelds zu nehmen.
Bewusst allgemein: dieselbe Not haben das Raum-Modal und die
Kachel-Einstellungen, wo ebenfalls jede Kleinigkeit in einem Kasten
steht. Taugt fuer