Updated apps

This commit is contained in:
2026-07-20 22:52:35 -04:00
parent 28a8cb98f6
commit a0c3271743
1164 changed files with 94781 additions and 6892 deletions
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
export const T_VERSION = "3.28";
export const T_VERSION = "3.29";
export const LANG_NAMES = Object.freeze({
en: "English", cs: "Čeština", da: "Dansk", de: "Deutsch", es: "Español",
@@ -11,6 +11,12 @@ export const I18N = Object.freeze({
tr: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Bu karşılaştırma kart yüklendiğinde gizli başlar - lejanttaki girdisine tıklayarak gösterebilirsiniz. Not: lejantta ANA seriye tıklamak tüm karşılaştırma grubunu birlikte açıp kapatır.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Nokta Boyutu",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Veri noktası dairelerinin piksel cinsinden yarıçapı. Otomatik boyut için boş bırakın (Çizgi Kalınlığı ile ölçeklenir). Scatter ve radar modlarındaki nokta boyutunu da belirler.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Genişletilmiş Pencere",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Seçili dönemin N katını render eder ve en yeni kısma kaydırılmış açılır: ekran tam seçtiğiniz dönemi gösterir - kaydırmasız haliyle aynı ölçek ve aynı bucket'lar - ve fazladan geçmişe doğru kaydırabilirsiniz. Date picker'ı takip eder: Hafta görünümünde 2 ile mevcut haftanın arkasında bir hafta daha kaydırılabilir olur. 1 veya boş = kapalı. Aktifken Visible Window'u geçersiz kılar.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Geçici sıfırları yok say",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Bazı entegrasyonlar cihaz kapalıyken ya da yeniden başlarken düz 0 bildirir, sonra önceki toplama geri döner - her iniş sayaç sıfırlaması sayılır ve geri dönen değer yeniden tüketim olarak eklenir. Etkinleştirildiğinde sıfır okumaları tamamen atlanır; uzun dönem istatistiklerinde değişim, kirlenmiş toplamlar yerine state kolonundan yeniden hesaplanır. Gerçekten sıfırlanıp sıfırdan saymaya devam eden sayaçlar yine doğru çalışır.",
@@ -755,6 +761,12 @@ export const I18N = Object.freeze({
de: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Dieser Vergleich startet beim Laden der Karte ausgeblendet - einblenden per Klick auf seinen Legendeneintrag. Hinweis: Ein Klick auf die HAUPTserie in der Legende schaltet die ganze Vergleichsgruppe gemeinsam um.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Punktgröße",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Radius der Datenpunktkreise in Pixeln. Leer lassen für automatische Größe basierend auf der Linienbreite. Bestimmt auch die Punktgröße im Scatter- und Radar-Modus.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Erweitertes Fenster",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Rendert das N-fache des gewählten Zeitraums und öffnet zum neuesten Teil gescrollt: Der Bildschirm zeigt genau den gewählten Zeitraum - gleiche Skala und gleiche Buckets wie ohne Scrollen - und Sie können in die zusätzliche Historie zurückscrollen. Folgt dem Date Picker: In der Wochenansicht mit 2 ist hinter der aktuellen Woche eine weitere Woche scrollbar. 1 oder leer = aus. Übersteuert bei Aktivierung das Sichtbare Fenster.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Transiente Nullwerte ignorieren",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Manche Integrationen melden eine glatte 0, während das Gerät aus ist oder neu startet, und springen dann auf den vorherigen Zählerstand zurück - jeder Einbruch gilt dann als Zählerreset und der wiederhergestellte Wert wird erneut als Verbrauch gezählt. Aktivieren, um Null-Messwerte vollständig zu überspringen; bei Langzeitstatistiken wird die Änderung aus der State-Spalte neu berechnet und umgeht die verfälschten Summen. Zähler, die wirklich auf null zurückspringen und von dort weiterzählen, funktionieren weiterhin.",
@@ -1499,6 +1511,12 @@ export const I18N = Object.freeze({
cs: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Toto porovnání je při načtení karty skryté - zobrazíte jej kliknutím na jeho položku v legendě. Pozn.: kliknutí na HLAVNÍ řadu v legendě přepíná celou skupinu porovnání najednou.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Velikost bodů",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Poloměr kruhů datových bodů v pixelech. Ponechte prázdné pro automatickou velikost podle šířky čáry. Určuje také velikost bodů v režimech scatter a radar.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Rozšířené okno",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Vykreslí N-násobek zvoleného období a otevře se posunuté na nejnovější část: obrazovka ukazuje přesně zvolené období - stejné měřítko i stejné intervaly jako bez posouvání - a navíc lze rolovat zpět do historie. Řídí se výběrem data: v týdenním zobrazení s hodnotou 2 je za aktuálním týdnem rolovatelný jeden týden navíc. 1 nebo prázdné = vypnuto. Při aktivaci má přednost před Viditelným oknem.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ignorovat přechodné nuly",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Některé integrace hlásí doslovnou 0, když je zařízení vypnuté nebo se restartuje, a pak skočí zpět na předchozí součet - každý propad se pak počítá jako reset měřiče a obnovená hodnota se znovu započítá jako spotřeba. Po zapnutí se nulová čtení zcela přeskočí; u dlouhodobých statistik se změna přepočítá ze sloupce state a obejde znečištěné součty. Měřiče, které se skutečně vynulují a počítají dál od nuly, fungují i nadále.",
@@ -2268,6 +2286,12 @@ export const I18N = Object.freeze({
da: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Denne sammenligning starter skjult, når kortet indlæses - vis den ved at klikke på dens post i signaturforklaringen. Bemærk: et klik på HOVEDserien i signaturforklaringen slår hele sammenligningsgruppen til/fra samlet.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Punktstørrelse",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Radius af datapunktcirklerne i pixels. Lad stå tomt for automatisk størrelse baseret på linjebredden. Bestemmer også punktstørrelsen i scatter- og radartilstand.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Udvidet vindue",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Renderer N gange den valgte periode og åbner rullet til den nyeste del: skærmen viser præcis den valgte periode - samme skala og samme intervaller som uden rulning - og du kan rulle tilbage gennem den ekstra historik. Følger datovælgeren: i ugevisning med 2 kan der rulles én ekstra uge bag den aktuelle. 1 eller tom = fra. Tilsidesætter Synligt vindue, når aktiv.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ignorér forbigående nuller",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Nogle integrationer rapporterer et rent 0, mens enheden er slukket eller genstarter, og hopper derefter tilbage til den tidligere total - hvert dyk tælles så som en målernulstilling, og den gendannede værdi tælles igen som forbrug. Aktivér for helt at springe nul-aflæsninger over; med langtidsstatistik genberegnes ændringen fra state-kolonnen uden om de forurenede summer. Målere, der reelt nulstilles og tæller videre fra nul, virker stadig.",
@@ -3037,6 +3061,12 @@ export const I18N = Object.freeze({
es: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Esta comparación empieza oculta al cargar la tarjeta - revélala haciendo clic en su entrada de la leyenda. Nota: hacer clic en la serie PRINCIPAL de la leyenda alterna todo el grupo de comparación a la vez.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Tamaño de punto",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Radio de los círculos de puntos de datos en píxeles. Déjelo vacío para un tamaño automático según el grosor de línea. También define el tamaño de los puntos en los modos scatter y radar.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Ventana extendida",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Renderiza N veces el periodo seleccionado y se abre desplazado a la parte más reciente: la pantalla muestra exactamente el periodo elegido - misma escala y mismos intervalos que sin desplazamiento - y puedes desplazarte hacia atrás por el historial extra. Sigue al selector de fechas: en la vista semanal con 2, hay una semana adicional desplazable detrás de la actual. 1 o vacío = desactivado. Anula la Ventana visible mientras está activo.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ignorar ceros transitorios",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Algunas integraciones informan un 0 literal mientras el dispositivo está apagado o reiniciándose, y luego saltan de vuelta al total anterior - cada caída se cuenta entonces como un reinicio del contador y el valor restaurado se vuelve a contar como consumo. Actívalo para omitir por completo las lecturas en cero; con estadísticas a largo plazo el cambio se recalcula desde la columna state, evitando las sumas contaminadas. Los contadores que realmente se reinician a cero y siguen contando desde ahí siguen funcionando.",
@@ -3806,6 +3836,12 @@ export const I18N = Object.freeze({
fi: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Tämä vertailu on piilotettu kortin latautuessa - näytä se napsauttamalla sen selitemerkintää. Huom: PÄÄsarjan napsautus selitteessä vaihtaa koko vertailuryhmän tilan yhdessä.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Pisteen koko",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Datapisteympyröiden säde pikseleinä. Jätä tyhjäksi automaattista kokoa varten (perustuu viivan leveyteen). Määrittää myös pisteiden koon scatter- ja tutkatiloissa.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Laajennettu ikkuna",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Renderöi valitun jakson N-kertaisena ja avautuu vieritettynä uusimpaan osaan: näyttö näyttää täsmälleen valitsemasi jakson - sama mittakaava ja samat jaksovälit kuin ilman vieritystä - ja voit vierittää taaksepäin lisähistoriaan. Seuraa päivämäärävalitsinta: viikkonäkymässä arvolla 2 nykyisen viikon takana on vieritettävissä yksi lisäviikko. 1 tai tyhjä = pois. Ohittaa Näkyvän ikkunan ollessaan käytössä.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ohita hetkelliset nollat",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Jotkin integraatiot ilmoittavat pelkän nollan laitteen ollessa sammuksissa tai käynnistymässä ja palaavat sitten aiempaan kokonaislukemaan - jokainen pudotus tulkitaan mittarin nollaukseksi ja palautunut arvo lasketaan uudelleen kulutukseksi. Kytke päälle ohittaaksesi nollalukemat kokonaan; pitkän aikavälin tilastoissa muutos lasketaan uudelleen state-sarakkeesta ohittaen saastuneet summat. Aidosti nollautuvat ja nollasta jatkavat mittarit toimivat edelleen.",
@@ -4575,6 +4611,12 @@ export const I18N = Object.freeze({
fr: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Cette comparaison démarre masquée au chargement de la carte - révélez-la en cliquant sur son entrée de légende. Remarque : cliquer sur la série PRINCIPALE dans la légende bascule tout le groupe de comparaison ensemble.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Taille des points",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Rayon des cercles de points de données en pixels. Laissez vide pour une taille automatique basée sur l'épaisseur de ligne. Définit aussi la taille des points dans les modes scatter et radar.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Fenêtre étendue",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Rend N fois la période sélectionnée et s'ouvre défilé sur la partie la plus récente : l'écran montre exactement la période choisie - même échelle et mêmes intervalles que sans défilement - et vous pouvez remonter dans l'historique supplémentaire. Suit le sélecteur de dates : en vue Semaine avec 2, une semaine supplémentaire est accessible derrière la semaine courante. 1 ou vide = désactivé. Prime sur la Fenêtre visible lorsqu'actif.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ignorer les zéros transitoires",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Certaines intégrations rapportent un 0 littéral quand l'appareil est éteint ou redémarre, puis reviennent au total précédent - chaque creux est alors compté comme une remise à zéro du compteur et la valeur restaurée est recomptée comme consommation. Activez pour ignorer complètement les lectures à zéro ; avec les statistiques à long terme, la variation est recalculée depuis la colonne state, en contournant les sommes polluées. Les compteurs qui se remettent réellement à zéro et repartent de zéro fonctionnent toujours.",
@@ -5344,6 +5386,12 @@ export const I18N = Object.freeze({
it: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Questo confronto parte nascosto al caricamento della card - rivelalo cliccando la sua voce in legenda. Nota: cliccare la serie PRINCIPALE nella legenda commuta insieme l'intero gruppo di confronto.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Dimensione punti",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Raggio dei cerchi dei punti dati in pixel. Lasciare vuoto per la dimensione automatica basata sullo spessore della linea. Definisce anche la dimensione dei punti nelle modalità scatter e radar.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Finestra estesa",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Renderizza N volte il periodo selezionato e si apre scorrendo alla parte più recente: lo schermo mostra esattamente il periodo scelto - stessa scala e stessi intervalli di senza scorrimento - e puoi scorrere indietro nella cronologia extra. Segue il selettore di date: nella vista Settimana con 2, dietro la settimana corrente è scorribile una settimana in più. 1 o vuoto = disattivato. Ha priorità sulla Finestra visibile quando attivo.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ignora zeri transitori",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Alcune integrazioni riportano uno 0 letterale mentre il dispositivo è spento o si sta riavviando, per poi tornare al totale precedente - ogni calo viene quindi contato come azzeramento del contatore e il valore ripristinato viene ricontato come consumo. Attiva per saltare del tutto le letture a zero; con le statistiche a lungo termine la variazione viene ricalcolata dalla colonna state, aggirando le somme inquinate. I contatori che si azzerano davvero e continuano a contare da zero funzionano comunque.",
@@ -6113,6 +6161,12 @@ export const I18N = Object.freeze({
nl: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Deze vergelijking start verborgen wanneer de kaart laadt - toon hem door op zijn legenda-item te klikken. Let op: klikken op de HOOFDreeks in de legenda schakelt de hele vergelijkingsgroep samen.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Puntgrootte",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Straal van de datapuntcirkels in pixels. Laat leeg voor automatische grootte op basis van de lijndikte. Bepaalt ook de puntgrootte in scatter- en radarmodus.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Uitgebreid venster",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Rendert N keer de geselecteerde periode en opent gescrold naar het nieuwste deel: het scherm toont precies de gekozen periode - zelfde schaal en zelfde buckets als zonder scrollen - en je kunt terugscrollen door de extra geschiedenis. Volgt de datumkiezer: in de weekweergave met 2 is er één extra week scrollbaar achter de huidige. 1 of leeg = uit. Heeft voorrang op Zichtbaar venster wanneer actief.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Tijdelijke nullen negeren",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Sommige integraties melden een letterlijke 0 terwijl het apparaat uit staat of herstart, en springen daarna terug naar het vorige totaal - elke dip telt dan als een meterreset en de herstelde waarde wordt opnieuw als verbruik geteld. Schakel in om nulmetingen volledig over te slaan; bij langetermijnstatistieken wordt de verandering herberekend uit de state-kolom, buiten de vervuilde sommen om. Meters die echt naar nul resetten en vanaf daar doortellen blijven gewoon werken.",
@@ -6882,6 +6936,12 @@ export const I18N = Object.freeze({
nb: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Denne sammenligningen starter skjult når kortet lastes - vis den ved å klikke på oppføringen i tegnforklaringen. Merk: å klikke på HOVEDserien i tegnforklaringen veksler hele sammenligningsgruppen samlet.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Punktstørrelse",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Radius for datapunktsirklene i piksler. La stå tom for automatisk størrelse basert på linjebredden. Bestemmer også punktstørrelsen i scatter- og radarmodus.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Utvidet vindu",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Rendrer N ganger den valgte perioden og åpner rullet til den nyeste delen: skjermen viser nøyaktig perioden du valgte - samme skala og samme intervaller som uten rulling - og du kan rulle bakover i den ekstra historikken. Følger datovelgeren: i ukevisning med 2 kan én ekstra uke rulles bak den gjeldende. 1 eller tom = av. Overstyrer Synlig vindu når aktiv.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ignorer forbigående nuller",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Noen integrasjoner rapporterer en ren 0 mens enheten er av eller starter på nytt, og hopper deretter tilbake til forrige total - hvert fall telles da som en tellernullstilling, og den gjenopprettede verdien telles på nytt som forbruk. Aktiver for å hoppe helt over null-avlesninger; med langtidsstatistikk beregnes endringen på nytt fra state-kolonnen, utenom de forurensede summene. Tellere som faktisk nullstilles og teller videre fra null, fungerer fortsatt.",
@@ -7651,6 +7711,12 @@ export const I18N = Object.freeze({
pl: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "To porównanie startuje ukryte przy ładowaniu karty - pokaż je, klikając jego wpis w legendzie. Uwaga: kliknięcie GŁÓWNEJ serii w legendzie przełącza całą grupę porównań razem.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Rozmiar punktów",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Promień okręgów punktów danych w pikselach. Pozostaw puste dla automatycznego rozmiaru na podstawie szerokości linii. Określa również rozmiar punktów w trybach scatter i radar.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Rozszerzone okno",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Renderuje N-krotność wybranego okresu i otwiera się przewinięte do najnowszej części: ekran pokazuje dokładnie wybrany okres - ta sama skala i te same przedziały co bez przewijania - a dodatkową historię można przewijać wstecz. Podąża za wyborem daty: w widoku tygodnia z wartością 2 za bieżącym tygodniem można przewinąć jeszcze jeden. 1 lub puste = wyłączone. Gdy aktywne, ma pierwszeństwo przed Widocznym oknem.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ignoruj przejściowe zera",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Niektóre integracje zgłaszają dosłowne 0, gdy urządzenie jest wyłączone lub restartuje się, a potem wracają do poprzedniej sumy - każdy spadek liczony jest wtedy jako zerowanie licznika, a przywrócona wartość ponownie jako zużycie. Włącz, aby całkowicie pomijać odczyty zerowe; przy statystykach długoterminowych zmiana jest przeliczana z kolumny state, z pominięciem zanieczyszczonych sum. Liczniki, które naprawdę zerują się i liczą dalej od zera, nadal działają.",
@@ -8420,6 +8486,12 @@ export const I18N = Object.freeze({
pt: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Esta comparação começa oculta quando o cartão carrega - revele-a clicando na sua entrada da legenda. Nota: clicar na série PRINCIPAL na legenda alterna todo o grupo de comparação em conjunto.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Tamanho do ponto",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Raio dos círculos dos pontos de dados em pixels. Deixe vazio para tamanho automático com base na espessura da linha. Também define o tamanho dos pontos nos modos scatter e radar.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Janela estendida",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Renderiza N vezes o período selecionado e abre deslocado para a parte mais recente: o ecrã mostra exatamente o período escolhido - mesma escala e mesmos intervalos que sem deslocamento - e pode recuar pelo histórico extra. Segue o seletor de datas: na vista de Semana com 2, há uma semana extra deslocável atrás da atual. 1 ou vazio = desligado. Sobrepõe-se à Janela visível enquanto ativo.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ignorar zeros transitórios",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Algumas integrações reportam um 0 literal enquanto o dispositivo está desligado ou a reiniciar, voltando depois ao total anterior - cada queda é então contada como reinício do contador e o valor restaurado é contado novamente como consumo. Ative para ignorar por completo as leituras a zero; com estatísticas de longo prazo a variação é recalculada a partir da coluna state, contornando as somas contaminadas. Contadores que realmente voltam a zero e continuam a contar a partir daí continuam a funcionar.",
@@ -9189,6 +9261,12 @@ export const I18N = Object.freeze({
ru: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Это сравнение при загрузке карточки скрыто - раскройте его щелчком по его записи в легенде. Примечание: щелчок по ОСНОВНОЙ серии в легенде переключает всю группу сравнения вместе.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Размер точек",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Радиус кружков точек данных в пикселях. Оставьте пустым для автоматического размера на основе толщины линии. Также задаёт размер точек в режимах scatter и radar.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Расширенное окно",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Отрисовывает выбранный период в N-кратном размере и открывается прокрученным к самой свежей части: на экране ровно выбранный период - тот же масштаб и те же интервалы, что и без прокрутки - а дополнительную историю можно листать назад. Следует за выбором даты: в недельном виде со значением 2 за текущей неделей доступна ещё одна. 1 или пусто = выключено. При активации имеет приоритет над Видимым окном.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Игнорировать временные нули",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Некоторые интеграции сообщают буквальный 0, пока устройство выключено или перезапускается, а затем возвращаются к прежнему итогу - каждый провал засчитывается как сброс счётчика, и восстановленное значение снова учитывается как потребление. Включите, чтобы полностью пропускать нулевые показания; для долгосрочной статистики изменение пересчитывается по колонке state, минуя испорченные суммы. Счётчики, которые действительно сбрасываются в ноль и продолжают счёт с нуля, работают по-прежнему.",
@@ -9958,6 +10036,12 @@ export const I18N = Object.freeze({
sv: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "Denna jämförelse startar dold när kortet läses in - visa den genom att klicka på dess post i teckenförklaringen. Obs: att klicka på HUVUDserien i teckenförklaringen växlar hela jämförelsegruppen tillsammans.",
// --- added in 3.29 round 2 (point size)
"Point Size": "Punktstorlek",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "Radie för datapunktcirklarna i pixlar. Lämna tomt för automatisk storlek baserat på linjebredden. Bestämmer även punktstorleken i scatter- och radarläge.",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "Utökat fönster",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "Renderar N gånger den valda perioden och öppnas rullad till den senaste delen: skärmen visar exakt den period du valt - samma skala och samma intervall som utan rullning - och du kan rulla bakåt genom den extra historiken. Följer datumväljaren: i veckovyn med 2 kan en extra vecka rullas bakom den aktuella. 1 eller tomt = av. Åsidosätter Synligt fönster när det är aktivt.",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "Ignorera tillfälliga nollor",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "Vissa integrationer rapporterar en ren nolla medan enheten är avstängd eller startar om, och hoppar sedan tillbaka till föregående totalsumma - varje dipp räknas då som en mätarnollställning och det återställda värdet räknas igen som förbrukning. Aktivera för att hoppa över nollavläsningar helt; med långtidsstatistik räknas förändringen om från state-kolumnen, förbi de förorenade summorna. Mätare som verkligen nollställs och fortsätter räkna från noll fungerar fortfarande.",
@@ -10727,6 +10811,12 @@ export const I18N = Object.freeze({
zh: Object.freeze({
// --- added in 3.26 round 3 (compare hide on load)
"This comparison starts hidden when the card loads - reveal it by clicking its legend entry. Note: clicking the MAIN series in the legend toggles the whole comparison group together.": "此对比在卡片加载时默认隐藏 - 点击其图例条目即可显示。注意:点击图例中的主序列会同时切换整个对比组。",
// --- added in 3.29 round 2 (point size)
"Point Size": "数据点大小",
"Radius of the data point circles in pixels. Leave empty for automatic sizing based on Line Width. Also sets the dot size in scatter and radar modes.": "数据点圆圈的半径(像素)。留空则根据线宽自动调整。同时决定散点图和雷达图模式中的点大小。",
// --- added in 3.29 round 1 (extended window multiplier)
"Extended Window": "扩展窗口",
"Renders N times the selected period and opens scrolled to the newest part: the screen shows exactly the period you picked - same scale and buckets as without scrolling - and you can scroll back through the extra history. Follows the date picker: on a Week view with 2, one extra week is scrollable behind the current one. 1 or empty = off. Overrides Visible Window while active.": "以所选时段的 N 倍进行渲染,并在打开时滚动到最新部分:屏幕上正好显示你选择的时段 - 与不滚动时相同的刻度和分桶 - 并且可以向后滚动查看额外的历史。跟随日期选择器:周视图下设为 2 时,当前周后面还可再滚动一周。1 或留空 = 关闭。启用时优先于可见窗口。",
// --- added in 3.27 round 2 (change_ignore_zero)
"Ignore transient zeros": "忽略瞬时零值",
"Some integrations report a literal 0 while the device is off or restarting, then jump back to the previous total - each dip is then counted as a meter reset and the restored value re-counted as new consumption. Enable to skip zero readings entirely; with long-term statistics the change is recomputed from the state column, bypassing the polluted sums. Counters that genuinely reset to zero and keep counting from there still work.": "某些集成在设备关闭或重启时会上报字面量 0,随后又跳回之前的累计值 - 每次下探都会被当作电表重置,恢复的数值被再次计为新消耗。启用后将完全跳过零读数;对于长期统计,变化量将从 state 列重新计算,绕过被污染的累计值。真正归零并从零继续计数的计数器仍可正常工作。",
@@ -374,26 +374,37 @@
const normalized = typeof size === "string" ? size.trim().toLowerCase() : "";
return ["small", "medium", "large"].includes(normalized) ? normalized : fallback;
}
function normalizeHeroFontSize(value) {
if (!Number.isFinite(value)) return null;
return Math.min(112, Math.max(12, value));
}
function normalizeLayoutConfig(entityConfig, cardConfig) {
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y;
const cardLayout = cardConfig == null ? void 0 : cardConfig.layout;
const entityLayout = entityConfig == null ? void 0 : entityConfig.layout;
const entityLabel = entityLayout == null ? void 0 : entityLayout.label;
const entityHero = entityLayout == null ? void 0 : entityLayout.hero;
const cardLabel = cardLayout == null ? void 0 : cardLayout.label;
const cardHero = cardLayout == null ? void 0 : cardLayout.hero;
const isCardLevelNormalization = !cardConfig;
const rawHeight = (_d = (_c = (_b = (_a = entityLayout == null ? void 0 : entityLayout.height) != null ? _a : entityConfig.height) != null ? _b : cardLayout == null ? void 0 : cardLayout.height) != null ? _c : cardConfig == null ? void 0 : cardConfig.height) != null ? _d : 38;
const heightExplicit = (entityLayout == null ? void 0 : entityLayout.height) !== void 0 || entityConfig._height_explicit === true || !isCardLevelNormalization && entityConfig.height !== void 0 || (cardLayout == null ? void 0 : cardLayout.height_explicit) === true || (cardConfig == null ? void 0 : cardConfig._height_explicit) === true;
const labelPosition = normalizeLabelPosition(
(_h = (_g = (_f = (_e = entityLabel == null ? void 0 : entityLabel.position) != null ? _e : entityConfig.label_position) != null ? _f : cardLabel == null ? void 0 : cardLabel.position) != null ? _g : cardLayout == null ? void 0 : cardLayout.label_position) != null ? _h : cardConfig == null ? void 0 : cardConfig.label_position,
"left"
);
const heroFontSize = labelPosition === "hero" ? normalizeHeroFontSize((_i = entityHero == null ? void 0 : entityHero.value_size) != null ? _i : cardHero == null ? void 0 : cardHero.value_size) : null;
return {
label: {
position: normalizeLabelPosition(
(_h = (_g = (_f = (_e = entityLabel == null ? void 0 : entityLabel.position) != null ? _e : entityConfig.label_position) != null ? _f : cardLabel == null ? void 0 : cardLabel.position) != null ? _g : cardLayout == null ? void 0 : cardLayout.label_position) != null ? _h : cardConfig == null ? void 0 : cardConfig.label_position,
"left"
),
width: (_m = (_l = (_k = (_j = (_i = entityLabel == null ? void 0 : entityLabel.width) != null ? _i : entityConfig.label_width) != null ? _j : cardLabel == null ? void 0 : cardLabel.width) != null ? _k : cardLayout == null ? void 0 : cardLayout.label_width) != null ? _l : cardConfig == null ? void 0 : cardConfig.label_width) != null ? _m : 100,
hero_size: normalizeHeroSize(
(_v = (_u = (_t = (_s = (_r = (_q = (_p = (_o = (_n = entityLabel == null ? void 0 : entityLabel.hero_size) != null ? _n : entityLabel == null ? void 0 : entityLabel.heroSize) != null ? _o : entityConfig.hero_size) != null ? _p : entityConfig.heroSize) != null ? _q : cardLabel == null ? void 0 : cardLabel.hero_size) != null ? _r : cardLabel == null ? void 0 : cardLabel.heroSize) != null ? _s : cardLayout == null ? void 0 : cardLayout.hero_size) != null ? _t : cardLayout == null ? void 0 : cardLayout.heroSize) != null ? _u : cardConfig == null ? void 0 : cardConfig.hero_size) != null ? _v : cardConfig == null ? void 0 : cardConfig.heroSize,
position: labelPosition,
width: (_n = (_m = (_l = (_k = (_j = entityLabel == null ? void 0 : entityLabel.width) != null ? _j : entityConfig.label_width) != null ? _k : cardLabel == null ? void 0 : cardLabel.width) != null ? _l : cardLayout == null ? void 0 : cardLayout.label_width) != null ? _m : cardConfig == null ? void 0 : cardConfig.label_width) != null ? _n : 100
},
hero: {
size: normalizeHeroSize(
(_y = (_x = (_w = (_v = (_u = (_t = (_s = (_r = (_q = (_p = (_o = entityHero == null ? void 0 : entityHero.size) != null ? _o : entityLabel == null ? void 0 : entityLabel.hero_size) != null ? _p : entityLabel == null ? void 0 : entityLabel.heroSize) != null ? _q : entityConfig.hero_size) != null ? _r : entityConfig.heroSize) != null ? _s : cardHero == null ? void 0 : cardHero.size) != null ? _t : cardLabel == null ? void 0 : cardLabel.hero_size) != null ? _u : cardLabel == null ? void 0 : cardLabel.heroSize) != null ? _v : cardLayout == null ? void 0 : cardLayout.hero_size) != null ? _w : cardLayout == null ? void 0 : cardLayout.heroSize) != null ? _x : cardConfig == null ? void 0 : cardConfig.hero_size) != null ? _y : cardConfig == null ? void 0 : cardConfig.heroSize,
"medium"
)
),
value_size: heroFontSize
},
height: clampSupportedRowHeight(rawHeight),
height_explicit: heightExplicit
@@ -2871,7 +2882,7 @@
return 0;
}
_measureHeroValueWidth(heroLine, valueEl, valueFit = "normal", hideUnit = false) {
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
const layer = (_a = this.shadowRoot) == null ? void 0 : _a.querySelector(".measure-layer");
if (!layer || !heroLine || !valueEl) return 0;
const display = this._decodeDataAttr(valueEl.dataset.display || valueEl.textContent || "");
@@ -2884,6 +2895,11 @@
wrapper.dataset.heroValueFit = valueFit;
wrapper.dataset.hideHeroUnit = hideUnit ? "true" : "false";
wrapper.style.display = "inline-block";
this._setStyleIfChanged(
wrapper,
"--sbcp-hero-base-size",
((_c = (_b = heroLine.style) == null ? void 0 : _b.getPropertyValue) == null ? void 0 : _c.call(_b, "--sbcp-hero-base-size")) || null
);
const measureValue = document.createElement("span");
measureValue.className = "hero-value";
measureValue.dataset.display = valueEl.dataset.display || "";
@@ -2923,11 +2939,11 @@
wrapper.appendChild(measureValue);
layer.replaceChildren(wrapper);
return Math.max(
Math.ceil((_c = (_b = measureValue.getBoundingClientRect) == null ? void 0 : _b.call(measureValue).width) != null ? _c : 0),
Math.ceil((_e = (_d = measureValue.getBoundingClientRect) == null ? void 0 : _d.call(measureValue).width) != null ? _e : 0),
Math.ceil(measureValue.scrollWidth || 0),
Math.ceil((_f = (_e = (_d = text == null ? void 0 : text.getBoundingClientRect) == null ? void 0 : _d.call(text).width) != null ? _e : text == null ? void 0 : text.scrollWidth) != null ? _f : 0),
Math.ceil((_i = (_h = (_g = number == null ? void 0 : number.getBoundingClientRect) == null ? void 0 : _g.call(number).width) != null ? _h : number == null ? void 0 : number.scrollWidth) != null ? _i : 0),
Math.ceil((_l = (_k = (_j = unitGroup == null ? void 0 : unitGroup.getBoundingClientRect) == null ? void 0 : _j.call(unitGroup).width) != null ? _k : unitGroup == null ? void 0 : unitGroup.scrollWidth) != null ? _l : 0)
Math.ceil((_h = (_g = (_f = text == null ? void 0 : text.getBoundingClientRect) == null ? void 0 : _f.call(text).width) != null ? _g : text == null ? void 0 : text.scrollWidth) != null ? _h : 0),
Math.ceil((_k = (_j = (_i = number == null ? void 0 : number.getBoundingClientRect) == null ? void 0 : _i.call(number).width) != null ? _j : number == null ? void 0 : number.scrollWidth) != null ? _k : 0),
Math.ceil((_n = (_m = (_l = unitGroup == null ? void 0 : unitGroup.getBoundingClientRect) == null ? void 0 : _l.call(unitGroup).width) != null ? _m : unitGroup == null ? void 0 : unitGroup.scrollWidth) != null ? _n : 0)
);
}
_applyHeroValueFit() {
@@ -3715,9 +3731,10 @@
${this._formatAboveValueMarkup(stateDisplay, unit, false)}
</div>
</div>` : "";
const heroSize = (_q = layout.label.hero_size) != null ? _q : "small";
const heroSize = (_q = layout.hero.size) != null ? _q : "small";
const heroFontSize = layout.hero.value_size;
const heroHeader = lp === "hero" ? `
<div class="hero-line" data-hero-size="${heroSize}">
<div class="hero-line" data-hero-size="${heroSize}"${Number.isFinite(heroFontSize) ? ` style="--sbcp-hero-base-size:${heroFontSize}px"` : ""}>
<div class="hero-header">
<span class="hero-label label-left-text">${escapedName}</span>
<span class="hero-value" data-display="${this._encodeDataAttr(stateDisplay)}" data-unit="${this._encodeDataAttr(unit)}">${this._formatRightValueMarkup(stateDisplay, unit, false)}</span>
@@ -3839,6 +3856,12 @@ ${paintLayers}
}
const heroHeader = row.querySelector(".hero-header");
if (heroHeader) {
const heroLine = row.querySelector(".hero-line");
this._setStyleIfChanged(
heroLine,
"--sbcp-hero-base-size",
Number.isFinite(ecfg.layout.hero.value_size) ? `${ecfg.layout.hero.value_size}px` : null
);
heroHeader.innerHTML = `<span class="hero-label label-left-text">${escapeHtml(rowViewModel.name)}</span><span class="hero-value" data-display="${this._encodeDataAttr(display)}" data-unit="${this._encodeDataAttr(displayUnit)}">${this._formatRightValueMarkup(display, displayUnit, false)}</span>`;
}
const aboveLabel = heroHeader ? null : row.querySelector(".above-bar-label");
@@ -4557,8 +4580,10 @@ ${paintLayers}
const nextTarget = this._cloneDeep(target);
const nextLayout = this._cloneDeep(nextTarget.layout);
const nextLabel = this._isObject(nextLayout.label) ? this._cloneDeep(nextLayout.label) : null;
const nextHero = this._isObject(nextLayout.hero) ? this._cloneDeep(nextLayout.hero) : null;
const height = this._normalizeNumberValue(nextLayout.height);
const width = this._normalizeNumberValue(nextLabel == null ? void 0 : nextLabel.width);
const valueSize = this._normalizeHeroValueSizeValue(nextHero == null ? void 0 : nextHero.value_size);
const position = this._normalizeTextValue(nextLabel == null ? void 0 : nextLabel.position).trim();
if (height !== null && height >= 24) {
nextLayout.height = height;
@@ -4585,6 +4610,18 @@ ${paintLayers}
delete nextLayout.label;
}
}
if (nextHero) {
if (valueSize !== null) {
nextHero.value_size = valueSize;
} else {
delete nextHero.value_size;
}
if (Object.keys(nextHero).length) {
nextLayout.hero = nextHero;
} else {
delete nextLayout.hero;
}
}
if (Object.keys(nextLayout).length) {
nextTarget.layout = nextLayout;
} else {
@@ -4772,9 +4809,11 @@ ${paintLayers}
case "peak":
return ["enabled", "color"];
case "layout":
return ["height", "label"];
return ["height", "label", "hero"];
case "layout.label":
return ["position", "hero_size", "width"];
case "layout.hero":
return ["size", "value_size"];
case "formatting":
return ["unit", "decimal"];
case "bar":
@@ -5235,7 +5274,7 @@ ${paintLayers}
return this._getScopedValue(scope, ["unit"]) !== void 0 || this._getScopedValue(scope, ["decimal"]) !== void 0;
}
_getScopedLayoutValue(scope, key) {
var _a, _b, _c, _d, _e, _f, _g;
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
if (key === "height") {
return (_b = (_a = this._getScopedValue(scope, ["layout", "height"])) != null ? _a : this._getScopedValue(scope, ["height"])) != null ? _b : "";
}
@@ -5246,7 +5285,10 @@ ${paintLayers}
return (_f = (_e = this._getScopedValue(scope, ["layout", "label", "width"])) != null ? _e : this._getScopedValue(scope, ["label_width"])) != null ? _f : "";
}
if (key === "hero_size") {
return (_g = this._getScopedValue(scope, ["layout", "label", "hero_size"])) != null ? _g : "";
return (_h = (_g = this._getScopedValue(scope, ["layout", "hero", "size"])) != null ? _g : this._getScopedValue(scope, ["layout", "label", "hero_size"])) != null ? _h : "";
}
if (key === "value_size") {
return (_i = this._getScopedValue(scope, ["layout", "hero", "value_size"])) != null ? _i : "";
}
return "";
}
@@ -5261,7 +5303,10 @@ ${paintLayers}
return this._getEffectiveScopedDisplayValue(scope, ["layout", "label", "width"], [["label_width"]]);
}
if (key === "hero_size") {
return this._getEffectiveScopedDisplayValue(scope, ["layout", "label", "hero_size"]);
return this._getEffectiveScopedDisplayValue(scope, ["layout", "hero", "size"], [["layout", "label", "hero_size"]]);
}
if (key === "value_size") {
return this._getEffectiveScopedDisplayValue(scope, ["layout", "hero", "value_size"]);
}
return "";
}
@@ -5283,24 +5328,50 @@ ${paintLayers}
prunePaths: [["layout", "label"], ["layout"]],
rerender: true
});
this._removeCanonicalScopedValue(scope, ["layout", "hero"], {
prunePaths: [["layout"]],
rerender: true
});
return true;
}
_setLayoutLabelPosition(value) {
return this._setScopedLayoutLabelPosition({ type: "card" }, value);
}
_setScopedLayoutHeroSize(scope, value) {
if (!value || value === "medium") {
return this._removeCanonicalScopedValue(scope, ["layout", "label", "hero_size"], {
prunePaths: [["layout", "label"], ["layout"]]
if (!value) {
return this._removeCanonicalScopedValue(scope, ["layout", "hero", "size"], {
deprecatedKeys: [["layout", "label", "hero_size"]],
prunePaths: [["layout", "hero"], ["layout"]]
});
}
return this._setCanonicalScopedValue(scope, ["layout", "label", "hero_size"], value, {
prunePaths: [["layout", "label"], ["layout"]]
return this._setCanonicalScopedValue(scope, ["layout", "hero", "size"], value, {
deprecatedKeys: [["layout", "label", "hero_size"]],
prunePaths: [["layout", "hero"], ["layout"]]
});
}
_setLayoutHeroSize(value) {
return this._setScopedLayoutHeroSize({ type: "card" }, value);
}
_normalizeHeroValueSizeValue(value) {
const numericValue = this._normalizeNumberValue(value);
if (numericValue === null) return null;
return Math.min(112, Math.max(12, numericValue));
}
_setScopedLayoutHeroValueSize(scope, value) {
if (value === "" || value === null || value === void 0) {
return this._removeCanonicalScopedValue(scope, ["layout", "hero", "value_size"], {
prunePaths: [["layout", "hero"], ["layout"]]
});
}
const valueSize = this._normalizeHeroValueSizeValue(value);
if (valueSize === null) return false;
return this._setCanonicalScopedValue(scope, ["layout", "hero", "value_size"], valueSize, {
prunePaths: [["layout", "hero"], ["layout"]]
});
}
_setLayoutHeroValueSize(value) {
return this._setScopedLayoutHeroValueSize({ type: "card" }, value);
}
_setScopedLayoutHeight(scope, value) {
const numericValue = this._normalizeNumberValue(value);
if (value === "" || value === null || value === void 0) {
@@ -5342,6 +5413,7 @@ ${paintLayers}
nextTarget = this._deletePathValue(nextTarget, ["layout", "label", "position"]);
nextTarget = this._deletePathValue(nextTarget, ["layout", "label", "hero_size"]);
nextTarget = this._deletePathValue(nextTarget, ["layout", "label", "width"]);
nextTarget = this._deletePathValue(nextTarget, ["layout", "hero"]);
nextTarget = this._deletePathValue(nextTarget, ["height"]);
nextTarget = this._deletePathValue(nextTarget, ["label_position"]);
nextTarget = this._deletePathValue(nextTarget, ["label_width"]);
@@ -5357,6 +5429,9 @@ ${paintLayers}
if (this._isObject(layoutValue) && (Object.prototype.hasOwnProperty.call(layoutValue, "height") || this._isObject(labelValue) && (Object.prototype.hasOwnProperty.call(labelValue, "position") || Object.prototype.hasOwnProperty.call(labelValue, "hero_size") || Object.prototype.hasOwnProperty.call(labelValue, "width")))) {
return true;
}
if (this._isObject(layoutValue) && this._isObject(layoutValue.hero) && Object.keys(layoutValue.hero).length) {
return true;
}
return this._getScopedValue(scope, ["height"]) !== void 0 || this._getScopedValue(scope, ["label_position"]) !== void 0 || this._getScopedValue(scope, ["label_width"]) !== void 0;
}
_setScaleBound(key, value) {
@@ -7468,6 +7543,7 @@ ${paintLayers}
const fillStyle = this._getFillStyleValue();
const layoutLabelPosition = this._getScopedLayoutValue({ type: "card" }, "position") || "left";
const layoutHeroSize = this._getScopedLayoutValue({ type: "card" }, "hero_size") || "medium";
const layoutHeroValueSize = this._getScopedLayoutValue({ type: "card" }, "value_size");
const layoutHeight = this._getScopedLayoutValue({ type: "card" }, "height");
const layoutLabelWidth = this._getScopedLayoutValue({ type: "card" }, "width");
const barColor = this._getScopedBarColorValue({ type: "card" });
@@ -8123,6 +8199,11 @@ ${paintLayers}
<option value="large"${(this._getEffectiveScopedLayoutValue(scope, "hero_size") || "medium") === "large" ? " selected" : ""}>large</option>
</select>
</div>
<div class="field-row">
<label for="entity-${index}-hero-value-size">Maximum font size</label>
<input id="entity-${index}-hero-value-size" type="number" min="12" max="112" step="1" data-kind="entity-layout-hero-value-size" data-index="${index}" value="${this._escapeAttribute(this._getEffectiveScopedLayoutValue(scope, "value_size"))}" placeholder="use Hero size preset">
<div class="section-note">The hero value may render smaller when needed to fit. A custom value overrides the Hero size preset.</div>
</div>
` : ""}
<div class="field-row">
<label for="entity-${index}-label-width">Label width</label>
@@ -8834,6 +8915,11 @@ ${paintLayers}
<option value="large"${layoutHeroSize === "large" ? " selected" : ""}>large</option>
</select>
</div>
<div class="field-row">
<label for="layout-hero-value-size">Maximum font size</label>
<input id="layout-hero-value-size" type="number" min="12" max="112" step="1" data-field="layout-hero-value-size" value="${this._escapeAttribute(layoutHeroValueSize)}" placeholder="use Hero size preset">
<div class="section-note">The hero value may render smaller when needed to fit. A custom value overrides the Hero size preset.</div>
</div>
` : ""}
<div class="field-row">
<label for="layout-label-width">Label width</label>
@@ -9226,6 +9312,7 @@ ${paintLayers}
if (field === "formatting-decimal") return void this._setScopedFormattingDecimal({ type: "card" }, value);
if (field === "layout-label-position") return void this._setLayoutLabelPosition(value);
if (field === "layout-label-hero-size") return void this._setLayoutHeroSize(value);
if (field === "layout-hero-value-size") return void this._setLayoutHeroValueSize(value);
if (field === "layout-height") return void this._setLayoutHeight(value);
if (field === "layout-label-width") return void this._setScopedLayoutLabelWidth({ type: "card" }, value);
if (field === "scale-min") return void this._setScaleBound("min", value);
@@ -9315,6 +9402,9 @@ ${paintLayers}
if (kind === "entity-layout-label-hero-size") {
return void this._setScopedLayoutHeroSize({ type: "entity", index: Number(target.dataset.index) }, value);
}
if (kind === "entity-layout-hero-value-size") {
return void this._setScopedLayoutHeroValueSize({ type: "entity", index: Number(target.dataset.index) }, value);
}
if (kind === "entity-layout-label-width") {
return void this._setScopedLayoutLabelWidth({ type: "entity", index: Number(target.dataset.index) }, value);
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.