.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; } } /* Statistik-Kacheln (ajax/getStats.php). Sie lagen in nackten .col ohne Breitenangabe - Bootstrap laesst sie dann nach Textlaenge umbrechen, mal zwei, mal drei je Zeile und unterschiedlich breit. Die Breite kommt jetzt aus row-cols-* in getStats.php; hier sorgt die volle Kartenhoehe dafuer, dass die Werte trotz ein- oder zweizeiliger Titel auf einer Linie stehen. */ .card.stats { height: 100%; } .card.stats .card-body { flex: 1 1 auto; } /* 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, p-2 fuer die Statistik) gelten weiter. */ .app-content .card-body { padding: .5rem; } /* Eine Kachel ist auf dem Handy rund 150 px breit. In voller Schrift passt "Verbrauchsersparnis" dort nicht in eine Zeile und wird mitten im Wort umbrochen. */ .card.stats .card-body { font-size: .8rem; } } /* Editor der Automatiken. Eine Bedingungszeile traegt Geraet, Messwert, Vergleich, Wert, Einheit und den Papierkorb nebeneinander - auf einem Handy bleiben davon "Therm OG Bad" und "te" uebrig, weil die Felder in der input-group einfach mitschrumpfen. Unter 576 px bekommen deshalb Geraet und Messwert je eine eigene Zeile; Vergleich, Wert und Einheit sind kurz genug, um zusammen in die naechste zu passen. */ @media (max-width: 575.98px) { /* Die input-group-Klasse muss mit in den Selektor: solar.css wird vor AdminLTE geladen, und Bootstraps ".input-group > .form-select" haette sonst dasselbe Gewicht und wuerde als spaeteres Blatt gewinnen. */ .input-group.auto-zeile > .auto-geraet, .input-group.auto-zeile > .auto-messwert { flex: 1 1 100%; width: auto; } } /* Raum-Modal. Ein Kommando mit mehreren Parametern ("Position+Neigung") traegt Beschriftung, zwei Zahlenfelder und den Ausloeseknopf in einer input-group - auf einem Handy schrumpfen die Felder dabei auf Nullbreite. Eine Mindestbreite laesst die Zeile stattdessen umbrechen. */ .input-group.raum-cmd > .form-control, .input-group.raum-cmd > .form-select { min-width: 5rem; } /* -------------------------------------------------------------------------- Raum-Modal: Bedienelemente Erzeugt von restricted/roomControls.php, verdrahtet in js/solar/homeMQTT.js. -------------------------------------------------------------------------- */ /* Ueberschrift einer Geraetegruppe (Beschattung, Licht, ...). Klein und ruhig - sie ordnet, sie soll nicht mit den Geraeten um Aufmerksamkeit ringen. */ .raum-gruppe { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; margin: 0.75rem 0 0.35rem; } .raum-gruppe:first-child { margin-top: 0; } /* Waehrend ein Kommando unterwegs ist. Ein "Zu" an einer Jalousie dauert ueber eine Minute; ohne sichtbare Sperre tippt man in der Zeit nach. */ .raum-geraet.raum-warte { opacity: 0.55; pointer-events: none; } .raum-geraet.raum-warte::after { content: ""; position: absolute; top: 0.5rem; right: 0.5rem; width: 0.9rem; height: 0.9rem; border: 2px solid currentColor; border-right-color: transparent; border-radius: 50%; animation: raum-dreht 0.8s linear infinite; } .raum-geraet { position: relative; } @keyframes raum-dreht { to { transform: rotate(360deg); } } /* Schieberegler stehen dicht untereinander (Position und Neigung). Ohne den Abstand kleben Beschriftung und Bahn aneinander. */ .raum-regler + .raum-regler { margin-top: 0.35rem; } .raum-regler .form-range { margin-bottom: 0; } /* Messwerte als Gitter statt als Textwurst: ein Stromzaehler hat sechzehn Werte, die in einer Zeile niemand findet. auto-fill statt fester Spalten, damit auf dem Handy zwei und auf dem Schirm vier nebeneinander passen. */ .raum-werte { display: grid; grid-template-columns: repeat(auto-fill, minmax(6.5rem, 1fr)); gap: 0.4rem; } .raum-wert { background: rgba(128, 128, 128, 0.08); border-radius: 0.35rem; padding: 0.3rem 0.45rem; overflow: hidden; } .raum-wert-zahl { font-size: 0.95rem; font-weight: 600; line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .raum-wert-einheit { font-size: 0.7rem; font-weight: 400; opacity: 0.7; } .raum-wert-name { font-size: 0.68rem; opacity: 0.7; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }