.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. -------------------------------------------------------------------------- */ /* Die Geraetegruppen als Tabs. Auf einem Handy passen fuenf Beschriftungen nicht nebeneinander - dann scrollt die Leiste seitwaerts, statt die Namen umzubrechen. */ .raum-tabs { overflow-x: auto; overflow-y: hidden; scrollbar-width: none; } .raum-tabs::-webkit-scrollbar { display: none; } .raum-tabs .nav-link { padding: 0.25rem 0.6rem; font-size: 0.8rem; white-space: nowrap; } /* 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.6; } .raum-wert-name { font-size: 0.68rem; opacity: 0.6; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* -------------------------------------------------------------------------- Raum-Modal: Jalousien -------------------------------------------------------------------------- */ /* Fahrknoepfe, Hoehe und Neigung nebeneinander. Die Neigung nimmt den Rest - sie ist die einzige der drei Spalten, die von Breite profitiert. */ .raum-jalousie { display: flex; align-items: stretch; gap: 0.6rem; } .raum-jalousie .raum-neigung-block { flex: 1 1 auto; min-width: 0; align-self: center; } .raum-jalousie .dropdown { align-self: flex-start; } /* Auf, Stop, Zu untereinander - die Knoepfe zeigen in die Richtung, in die sie fahren. Schmal, weil nur Symbole darin stehen. */ .raum-fahrt { flex: 0 0 auto; } .raum-fahrt .btn { padding: 0.2rem 0.55rem; line-height: 1.4; } /* Die Hoehe als senkrechter Regler: der Griff steht dort, wo der Rollladen steht. writing-mode ist der Weg, den Chrome und Firefox heute gehen - slider-vertical war nie standardisiert und ist inzwischen entfernt. */ .raum-position { flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; gap: 0.1rem; } .raum-position input[type='range'] { writing-mode: vertical-rl; width: 1.2rem; height: 4.5rem; padding: 0; margin: 0; } /* Die gefuellte Bahn laeuft hier von oben nach unten mit - "voll" heisst heruntergefahren. */ .raum-position input[type='range']::-webkit-slider-runnable-track { background: linear-gradient(to bottom, #00788F, #00788F), #D7D7D7; background-size: 100% var(--background-size, 0%); } /* Die Endstellungen in Worten statt in Prozent. */ .raum-ende { font-size: 0.68rem; opacity: 0.65; line-height: 1.1; } /* Die Lamellen zur Neigung. Ihre Hoehe setzt lamellenZeichnen() in js/solar/homeMQTT.js - schmal mit Luft dazwischen heisst offen, aneinanderliegend heisst geschlossen. */ .raum-lamellen { display: block; width: 100%; height: 1.8rem; margin: 0.1rem 0; /* Der Rahmen macht aus dem Streifen ein Fenster - ohne ihn liest sich das geschlossene Bild wie eine zweite Reglerbahn. */ background: rgba(0, 120, 143, 0.14); border: 1px solid rgba(128, 128, 128, 0.35); border-radius: 0.2rem; } .raum-lamelle { fill: currentColor; opacity: 0.6; }