diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..5ee7abd8 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm exec lint-staged diff --git a/custom_components/hass_datapoints/hass-datapoints-cards.js b/custom_components/hass_datapoints/hass-datapoints-cards.js index e3e65a61..69a923ff 100644 --- a/custom_components/hass_datapoints/hass-datapoints-cards.js +++ b/custom_components/hass_datapoints/hass-datapoints-cards.js @@ -735,7 +735,7 @@ } //#endregion //#region custom_components/hass_datapoints/src/cards/action/action.styles.ts - var styles$78 = i$5` + var styles$79 = i$5` :host { display: block; } @@ -844,7 +844,7 @@ ]; //#endregion //#region custom_components/hass_datapoints/src/atoms/display/color-swatch/color-swatch.styles.ts - var styles$77 = i$5` + var styles$78 = i$5` :host { display: block; } @@ -1021,13 +1021,13 @@ `; } }; - _defineProperty(ColorSwatch, "styles", styles$77); + _defineProperty(ColorSwatch, "styles", styles$78); __decorate([n$1({ type: String })], ColorSwatch.prototype, "color", null); __decorate([n$1({ type: String })], ColorSwatch.prototype, "label", null); customElements.define("color-swatch", ColorSwatch); //#endregion //#region custom_components/hass_datapoints/src/atoms/display/feedback-banner/feedback-banner.styles.ts - var styles$76 = i$5` + var styles$77 = i$5` :host { display: block; } @@ -1059,14 +1059,14 @@ var _kind_accessor_storage = /* @__PURE__ */ new WeakMap(); var _text_accessor_storage$2 = /* @__PURE__ */ new WeakMap(); var _visible_accessor_storage$2 = /* @__PURE__ */ new WeakMap(); - var _variant_accessor_storage = /* @__PURE__ */ new WeakMap(); + var _variant_accessor_storage$1 = /* @__PURE__ */ new WeakMap(); var FeedbackBanner = class extends i$2 { constructor(..._args) { super(..._args); _classPrivateFieldInitSpec(this, _kind_accessor_storage, ""); _classPrivateFieldInitSpec(this, _text_accessor_storage$2, ""); _classPrivateFieldInitSpec(this, _visible_accessor_storage$2, false); - _classPrivateFieldInitSpec(this, _variant_accessor_storage, "default"); + _classPrivateFieldInitSpec(this, _variant_accessor_storage$1, "default"); } get kind() { return _classPrivateFieldGet2(_kind_accessor_storage, this); @@ -1087,10 +1087,10 @@ _classPrivateFieldSet2(_visible_accessor_storage$2, this, value); } get variant() { - return _classPrivateFieldGet2(_variant_accessor_storage, this); + return _classPrivateFieldGet2(_variant_accessor_storage$1, this); } set variant(value) { - _classPrivateFieldSet2(_variant_accessor_storage, this, value); + _classPrivateFieldSet2(_variant_accessor_storage$1, this, value); } render() { if (!this.text) return A; @@ -1104,7 +1104,7 @@ `; } }; - _defineProperty(FeedbackBanner, "styles", styles$76); + _defineProperty(FeedbackBanner, "styles", styles$77); __decorate([n$1({ type: String })], FeedbackBanner.prototype, "kind", null); __decorate([n$1({ type: String })], FeedbackBanner.prototype, "text", null); __decorate([n$1({ type: Boolean })], FeedbackBanner.prototype, "visible", null); @@ -1112,7 +1112,7 @@ customElements.define("feedback-banner", FeedbackBanner); //#endregion //#region custom_components/hass_datapoints/src/cards/action/action-targets/action-targets.styles.ts - var styles$75 = i$5` + var styles$76 = i$5` :host { display: block; } @@ -1124,7 +1124,7 @@ `; //#endregion //#region custom_components/hass_datapoints/src/molecules/chip-group/chip-group.styles.ts - var styles$74 = i$5` + var styles$75 = i$5` :host { display: block; } @@ -1141,7 +1141,7 @@ `; //#endregion //#region custom_components/hass_datapoints/src/atoms/form/entity-chip/entity-chip.styles.ts - var styles$73 = i$5` + var styles$74 = i$5` :host { display: inline-flex; } @@ -1272,7 +1272,7 @@ `; } }; - _defineProperty(EntityChip, "styles", styles$73); + _defineProperty(EntityChip, "styles", styles$74); __decorate([n$1({ type: String })], EntityChip.prototype, "type", null); __decorate([n$1({ type: String, @@ -1346,7 +1346,7 @@ `; } }; - _defineProperty(ChipGroup, "styles", styles$74); + _defineProperty(ChipGroup, "styles", styles$75); __decorate([n$1({ type: Array })], ChipGroup.prototype, "items", null); __decorate([n$1({ type: Object })], ChipGroup.prototype, "hass", null); __decorate([n$1({ type: Boolean })], ChipGroup.prototype, "removable", null); @@ -1433,7 +1433,7 @@ `; } }; - _defineProperty(CardActionTargets, "styles", styles$75); + _defineProperty(CardActionTargets, "styles", styles$76); __decorate([n$1({ attribute: false })], CardActionTargets.prototype, "hass", null); __decorate([n$1({ type: Boolean, @@ -1796,7 +1796,7 @@ _feedbackText: { state: true }, _feedbackVisible: { state: true } }); - _defineProperty(HassDatapointsActionCard, "styles", styles$78); + _defineProperty(HassDatapointsActionCard, "styles", styles$79); __decorate([e$4("#msg")], HassDatapointsActionCard.prototype, "_msgEl", null); __decorate([e$4("#btn")], HassDatapointsActionCard.prototype, "_btnEl", null); __decorate([e$4("#ann")], HassDatapointsActionCard.prototype, "_annEl", null); @@ -2223,10 +2223,10 @@ ]; //#endregion //#region custom_components/hass_datapoints/src/cards/action/i18n/fi.ts - var fi_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$167 }); - var translations$167; - var init_fi$28 = __esmMin((() => { - translations$167 = { + var fi_exports$29 = /* @__PURE__ */ __exportAll({ translations: () => translations$173 }); + var translations$173; + var init_fi$29 = __esmMin((() => { + translations$173 = { General: "Yleiset", "Related items": "Liittyvät kohteet", "Datapoint Appearance": "Datapisteen ulkoasu", @@ -2243,20 +2243,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/history-chart/i18n/fi.ts - var fi_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$166 }); - var translations$166; - var init_fi$27 = __esmMin((() => { - translations$166 = { + var fi_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$172 }); + var translations$172; + var init_fi$28 = __esmMin((() => { + translations$172 = { "Date window:": "Aikaikkuna:", "Actual:": "Todellinen:" }; })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/i18n/fi.ts - var fi_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$165 }); - var translations$165; - var init_fi$26 = __esmMin((() => { - translations$165 = { + var fi_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$171 }); + var translations$171; + var init_fi$27 = __esmMin((() => { + translations$171 = { General: "Yleiset", Entity: "Entiteetti", "Multiple entities": "Useita entiteettejä", @@ -2273,10 +2273,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/list/i18n/fi.ts - var fi_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$164 }); - var translations$164; - var init_fi$25 = __esmMin((() => { - translations$164 = { + var fi_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$170 }); + var translations$170; + var init_fi$26 = __esmMin((() => { + translations$170 = { "Search datapoints…": "Hae datapisteitä…", "Delete record": "Poista tietue", Delete: "Poista", @@ -2294,10 +2294,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/quick/i18n/fi.ts - var fi_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$163 }); - var translations$163; - var init_fi$24 = __esmMin((() => { - translations$163 = { + var fi_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$169 }); + var translations$169; + var init_fi$25 = __esmMin((() => { + translations$169 = { General: "Yleiset", "Icon & colour": "Kuvake ja väri", "Related items": "Liittyvät kohteet", @@ -2315,10 +2315,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/sensor/i18n/fi.ts - var fi_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$162 }); - var translations$162; - var init_fi$23 = __esmMin((() => { - translations$162 = { + var fi_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$168 }); + var translations$168; + var init_fi$24 = __esmMin((() => { + translations$168 = { Entity: "Entiteetti", Display: "Näyttö", "Records list": "Tietueiden luettelo", @@ -2338,10 +2338,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/chart/i18n/fi.ts - var fi_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$161 }); - var translations$161; - var init_fi$22 = __esmMin((() => { - translations$161 = { + var fi_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$167 }); + var translations$167; + var init_fi$23 = __esmMin((() => { + translations$167 = { "⚠️ Anomaly Insight": "⚠️ Poikkeavuushavainto", "⚠️ Multi-method Anomaly": "⚠️ Monimenetelmäinen poikkeavuus", "Click the highlighted circle to add an annotation.": "Klikkaa korostettua ympyrää lisätäksesi huomautuksen.", @@ -2376,10 +2376,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/ha/i18n/fi.ts - var fi_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$160 }); - var translations$160; - var init_fi$21 = __esmMin((() => { - translations$160 = { + var fi_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$166 }); + var translations$166; + var init_fi$22 = __esmMin((() => { + translations$166 = { "Confirm delete": "Vahvista poisto", "Are you sure you want to delete this item?": "Oletko varma, että haluat poistaa tämän kohteen?", Cancel: "Peruuta", @@ -2394,10 +2394,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/history-page/i18n/fi.ts - var fi_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$159 }); - var translations$159; - var init_fi$20 = __esmMin((() => { - translations$159 = { + var fi_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$165 }); + var translations$165; + var init_fi$21 = __esmMin((() => { + translations$165 = { "entity_id={0}": "entity_id={0}", "device_id={0}": "device_id={0}", "area_id={0}": "area_id={0}", @@ -2495,20 +2495,68 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/timeline/i18n/fi.ts - var fi_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$158 }); - var translations$158; - var init_fi$19 = __esmMin((() => { - translations$158 = { + var fi_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$164 }); + var translations$164; + var init_fi$20 = __esmMin((() => { + translations$164 = { Wk: "Vk", "Week of": "Viikko" }; })); //#endregion + //#region custom_components/hass_datapoints/src/molecules/analysis-aggregate-group/i18n/fi.ts + var fi_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$163 }); + var translations$163; + var init_fi$19 = __esmMin((() => { + translations$163 = { + "Aggregate series": "Koosteet", + "Count changes to a state": "Laske muutokset tilaan", + "Count all state changes": "Laske kaikki tilamuutokset", + "Time in a state": "Aika tilassa", + "Percentage of time in a state": "Tilassa vietetyn ajan osuus prosentteina", + Hourly: "Tunneittain", + Daily: "Päivittäin", + Weekly: "Viikoittain", + Monthly: "Kuukausittain", + On: "Päällä", + Off: "Pois", + Open: "Auki", + Closed: "Kiinni", + Detected: "Havaittu", + Clear: "Vapaa", + Occupied: "Varattu", + Unlocked: "Avattu", + Locked: "Lukittu", + Mean: "Keskiarvo", + Minimum: "Pienin", + Maximum: "Suurin", + Median: "Mediaani", + "First reading": "Ensimmäinen lukema", + "Last reading": "Viimeisin lukema", + "All event types": "Kaikki tapahtumatyypit", + Consumption: "Kulutus", + "Meter reset detected": "Mittarin nollaus havaittu", + "Ambiguous meter reset, not counted": "Epäselvä mittarin nollaus, ei laskettu", + Cumulative: "Kumulatiivinen", + "Reset total to zoomed range": "Nollaa kokonaismäärä zoomattuun alueeseen", + "Partial period": "Osittainen jakso", + "Incomplete history": "Puutteellinen historia", + "Dashed outlines mark partial periods cut by the selected range; hatched or dotted marks show periods with gaps in recorded history.": "Katkoviivareunat osoittavat valitun aikavälin reunoilla katkenneet osittaiset jaksot; viivoitetut tai pisteviivamerkinnät osoittavat jaksot, joiden tallennetussa historiassa on aukkoja.", + "Counts only include activity in retained history; earlier activity is not shown.": "Laskennat sisältävät vain säilytetyn historian toiminnan; aiempaa toimintaa ei näytetä.", + "Count events": "Laske tapahtumat", + Interval: "Jakso", + State: "Tila", + "Every minute": "Joka minuutti", + "Every 15 minutes": "Joka 15. minuutti", + "Every 30 minutes": "Joka 30. minuutti" + }; + })); + //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-anomaly-group/i18n/fi.ts - var fi_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$157 }); - var translations$157; + var fi_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$162 }); + var translations$162; var init_fi$18 = __esmMin((() => { - translations$157 = { + translations$162 = { Direction: "Suunta", Both: "Molemmat", Above: "Yläpuolella", @@ -2556,10 +2604,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-delta-group/i18n/fi.ts - var fi_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$156 }); - var translations$156; + var fi_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$161 }); + var translations$161; var init_fi$17 = __esmMin((() => { - translations$156 = { + translations$161 = { "Show delta vs selected date window": "Näytä delta vs. valittu aikaikkuna", "Select a date window tab to enable delta analysis.": "Valitse aikaikkuna-välilehti ottaaksesi delta-analyysin käyttöön.", "Show delta in tooltip": "Näytä delta työkaluvihjeessä", @@ -2568,10 +2616,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-rate-group/i18n/fi.ts - var fi_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$155 }); - var translations$155; + var fi_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$160 }); + var translations$160; var init_fi$16 = __esmMin((() => { - translations$155 = { + translations$160 = { "Show rate of change": "Näytä muutosnopeus", "Show rate of change crosshairs": "Näytä muutosnopeuden tähtäin", "Rate window": "Muutosikkuna", @@ -2583,10 +2631,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-sample-group/i18n/fi.ts - var fi_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$154 }); - var translations$154; + var fi_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$159 }); + var translations$159; var init_fi$15 = __esmMin((() => { - translations$154 = { + translations$159 = { Downsampling: "Alasnäytteistys", Interval: "Väli", Aggregate: "Kooste", @@ -2618,20 +2666,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-summary-group/i18n/fi.ts - var fi_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$153 }); - var translations$153; + var fi_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$158 }); + var translations$158; var init_fi$14 = __esmMin((() => { - translations$153 = { + translations$158 = { "Show min / max / mean": "Näytä min / max / keskiarvo", "Show range shading": "Näytä aluevarjostus" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-threshold-group/i18n/fi.ts - var fi_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$152 }); - var translations$152; + var fi_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$157 }); + var translations$157; var init_fi$13 = __esmMin((() => { - translations$152 = { + translations$157 = { "Show threshold analysis": "Näytä kynnysanalyysi", "Shade threshold area": "Varjosta kynnysalue", Threshold: "Kynnys", @@ -2642,10 +2690,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-trend-group/i18n/fi.ts - var fi_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$151 }); - var translations$151; + var fi_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$156 }); + var translations$156; var init_fi$12 = __esmMin((() => { - translations$151 = { + translations$156 = { "Show trend lines": "Näytä trendiviivat", "Show trend crosshairs": "Näytä trenditähtäin", "Trend method": "Trendimenetelmä", @@ -2663,10 +2711,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/anomaly-monitor-wizard/i18n/fi.ts - var fi_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$150 }); - var translations$150; + var fi_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$155 }); + var translations$155; var init_fi$11 = __esmMin((() => { - translations$150 = { + translations$155 = { "Add all series from chart": "Lisää kaikki sarjat kaaviosta", "Add from current chart": "Lisää nykyisestä kaaviosta", "Create anomaly monitor": "Luo poikkeamamonitori", @@ -2676,17 +2724,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/comparison-tab-rail/i18n/fi.ts - var fi_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$149 }); - var translations$149; + var fi_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$154 }); + var translations$154; var init_fi$10 = __esmMin((() => { - translations$149 = { "Add date window": "Lisää aikaikkuna" }; + translations$154 = { "Add date window": "Lisää aikaikkuna" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/date-window-dialog/i18n/fi.ts - var fi_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$148 }); - var translations$148; + var fi_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$153 }); + var translations$153; var init_fi$9 = __esmMin((() => { - translations$148 = { + translations$153 = { "A date window saves a named date range as a tab, so you can quickly preview it against the selected range or jump the chart back to it later.": "Aikaikkuna tallentaa nimetyn päivävälin välilehteksi, jotta voit nopeasti esikatsella sitä suhteessa valittuun alueeseen tai palata kaavion kyseiseen ajanjaksoon.", Name: "Nimi", "e.g. Heating season start": "esim. Lämmityskausi alkaa", @@ -2703,10 +2751,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/sidebar-options/sections/i18n/fi.ts - var fi_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$147 }); - var translations$147; + var fi_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$152 }); + var translations$152; var init_fi$8 = __esmMin((() => { - translations$147 = { + translations$152 = { Datapoints: "Datapisteet", "Choose which annotation datapoints appear on the chart.": "Valitse, mitkä huomautusten datapisteet näkyvät kaaviossa.", "Linked to selected targets": "Linkitetty valittuihin kohteisiin", @@ -2716,10 +2764,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row/i18n/fi.ts - var fi_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$146 }); - var translations$146; + var fi_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$151 }); + var translations$151; var init_fi$7 = __esmMin((() => { - translations$146 = { + translations$151 = { "Analysis configured": "Analyysi määritetty", "Configure analysis": "Määritä analyysi", "Stepped series": "Porrastettu sarja", @@ -2731,17 +2779,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row-list/i18n/fi.ts - var fi_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$145 }); - var translations$145; + var fi_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$150 }); + var translations$150; var init_fi$6 = __esmMin((() => { - translations$145 = {}; + translations$150 = {}; })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/ai-query-brief-dialog/i18n/fi.ts - var fi_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$144 }); - var translations$144; + var fi_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$149 }); + var translations$149; var init_fi$5 = __esmMin((() => { - translations$144 = { + translations$149 = { "AI query brief": "AI-kyselytiivistelma", "This brief is intended for another AI to fetch raw Home Assistant history and hass_datapoints anomaly details. Review it, then copy it into your AI tool of choice.": "Tama tiivistelma on tarkoitettu toiselle AI:lle Home Assistantin raakadat historian ja hass_datapointsin poikkeamien lisatietojen hakemista varten. Tarkista se ja kopioi sitten haluamaasi AI-tyokaluun.", "Copy-ready brief": "Kopiointivalmis tiivistelma", @@ -2753,10 +2801,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/history-targets/i18n/fi.ts - var fi_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$143 }); - var translations$143; + var fi_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$148 }); + var translations$148; var init_fi$4 = __esmMin((() => { - translations$143 = { + translations$148 = { Targets: "Kohteet", "Each row controls one chart series.": "Jokainen rivi ohjaa yhtä kaaviosarjaa.", "Add target": "Lisää kohde", @@ -2765,10 +2813,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/panel-shell/i18n/fi.ts - var fi_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$142 }); - var translations$142; + var fi_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$147 }); + var translations$147; var init_fi$3 = __esmMin((() => { - translations$142 = { + translations$147 = { "Loading Datapoints…": "Ladataan Datapoints…", Datapoints: "Datapoints", "Page options": "Sivun asetukset", @@ -2783,10 +2831,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/range-toolbar/i18n/fi.ts - var fi_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$141 }); - var translations$141; + var fi_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$146 }); + var translations$146; var init_fi$2 = __esmMin((() => { - translations$141 = { + translations$146 = { "Toggle sidebar": "Vaihda sivupalkki", Start: "Alku", End: "Loppu", @@ -2811,16 +2859,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/i18n/fi.ts - var fi_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$140 }); - var translations$140; + var fi_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$145 }); + var translations$145; var init_fi$1 = __esmMin((() => { - translations$140 = { "Selected range": "Valittu aikaväli" }; + translations$145 = { "Selected range": "Valittu aikaväli" }; })); //#endregion //#region custom_components/hass_datapoints/src/lib/i18n/locales/fi.ts var fi_exports = /* @__PURE__ */ __exportAll({ templates: () => templates$5 }); var modules$5, merged$5, templates$5; var init_fi = __esmMin((() => { + init_fi$29(); init_fi$28(); init_fi$27(); init_fi$26(); @@ -2850,16 +2899,17 @@ init_fi$2(); init_fi$1(); modules$5 = /* #__PURE__ */ Object.assign({ - "../../../cards/action/i18n/fi.ts": fi_exports$28, - "../../../cards/history/history-chart/i18n/fi.ts": fi_exports$27, - "../../../cards/history/i18n/fi.ts": fi_exports$26, - "../../../cards/list/i18n/fi.ts": fi_exports$25, - "../../../cards/quick/i18n/fi.ts": fi_exports$24, - "../../../cards/sensor/i18n/fi.ts": fi_exports$23, - "../../chart/i18n/fi.ts": fi_exports$22, - "../../ha/i18n/fi.ts": fi_exports$21, - "../../history-page/i18n/fi.ts": fi_exports$20, - "../../timeline/i18n/fi.ts": fi_exports$19, + "../../../cards/action/i18n/fi.ts": fi_exports$29, + "../../../cards/history/history-chart/i18n/fi.ts": fi_exports$28, + "../../../cards/history/i18n/fi.ts": fi_exports$27, + "../../../cards/list/i18n/fi.ts": fi_exports$26, + "../../../cards/quick/i18n/fi.ts": fi_exports$25, + "../../../cards/sensor/i18n/fi.ts": fi_exports$24, + "../../chart/i18n/fi.ts": fi_exports$23, + "../../ha/i18n/fi.ts": fi_exports$22, + "../../history-page/i18n/fi.ts": fi_exports$21, + "../../timeline/i18n/fi.ts": fi_exports$20, + "../../../molecules/analysis-aggregate-group/i18n/fi.ts": fi_exports$19, "../../../molecules/analysis-anomaly-group/i18n/fi.ts": fi_exports$18, "../../../molecules/analysis-delta-group/i18n/fi.ts": fi_exports$17, "../../../molecules/analysis-rate-group/i18n/fi.ts": fi_exports$16, @@ -2885,10 +2935,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/action/i18n/fr.ts - var fr_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$139 }); - var translations$139; - var init_fr$28 = __esmMin((() => { - translations$139 = { + var fr_exports$29 = /* @__PURE__ */ __exportAll({ translations: () => translations$144 }); + var translations$144; + var init_fr$29 = __esmMin((() => { + translations$144 = { General: "Général", "Related items": "Éléments liés", "Datapoint Appearance": "Apparence du point de données", @@ -2905,20 +2955,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/history-chart/i18n/fr.ts - var fr_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$138 }); - var translations$138; - var init_fr$27 = __esmMin((() => { - translations$138 = { + var fr_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$143 }); + var translations$143; + var init_fr$28 = __esmMin((() => { + translations$143 = { "Date window:": "Fenêtre de dates :", "Actual:": "Réel :" }; })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/i18n/fr.ts - var fr_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$137 }); - var translations$137; - var init_fr$26 = __esmMin((() => { - translations$137 = { + var fr_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$142 }); + var translations$142; + var init_fr$27 = __esmMin((() => { + translations$142 = { General: "Général", Entity: "Entité", "Multiple entities": "Plusieurs entités", @@ -2935,10 +2985,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/list/i18n/fr.ts - var fr_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$136 }); - var translations$136; - var init_fr$25 = __esmMin((() => { - translations$136 = { + var fr_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$141 }); + var translations$141; + var init_fr$26 = __esmMin((() => { + translations$141 = { "Search datapoints…": "Rechercher des points de données…", "Delete record": "Supprimer l’enregistrement", Delete: "Supprimer", @@ -2956,10 +3006,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/quick/i18n/fr.ts - var fr_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$135 }); - var translations$135; - var init_fr$24 = __esmMin((() => { - translations$135 = { + var fr_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$140 }); + var translations$140; + var init_fr$25 = __esmMin((() => { + translations$140 = { General: "Général", "Icon & colour": "Icône et couleur", "Related items": "Éléments liés", @@ -2977,10 +3027,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/sensor/i18n/fr.ts - var fr_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$134 }); - var translations$134; - var init_fr$23 = __esmMin((() => { - translations$134 = { + var fr_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$139 }); + var translations$139; + var init_fr$24 = __esmMin((() => { + translations$139 = { Entity: "Entité", Display: "Affichage", "Records list": "Liste des enregistrements", @@ -3000,10 +3050,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/chart/i18n/fr.ts - var fr_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$133 }); - var translations$133; - var init_fr$22 = __esmMin((() => { - translations$133 = { + var fr_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$138 }); + var translations$138; + var init_fr$23 = __esmMin((() => { + translations$138 = { "⚠️ Anomaly Insight": "⚠️ Analyse d’anomalie", "⚠️ Multi-method Anomaly": "⚠️ Anomalie multi-méthodes", "Click the highlighted circle to add an annotation.": "Cliquez sur le cercle en surbrillance pour ajouter une annotation.", @@ -3038,10 +3088,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/ha/i18n/fr.ts - var fr_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$132 }); - var translations$132; - var init_fr$21 = __esmMin((() => { - translations$132 = { + var fr_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$137 }); + var translations$137; + var init_fr$22 = __esmMin((() => { + translations$137 = { "Confirm delete": "Confirmer la suppression", "Are you sure you want to delete this item?": "Voulez-vous vraiment supprimer cet élément ?", Cancel: "Annuler", @@ -3056,10 +3106,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/history-page/i18n/fr.ts - var fr_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$131 }); - var translations$131; - var init_fr$20 = __esmMin((() => { - translations$131 = { + var fr_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$136 }); + var translations$136; + var init_fr$21 = __esmMin((() => { + translations$136 = { "entity_id={0}": "entity_id={0}", "device_id={0}": "device_id={0}", "area_id={0}": "area_id={0}", @@ -3157,20 +3207,68 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/timeline/i18n/fr.ts - var fr_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$130 }); - var translations$130; - var init_fr$19 = __esmMin((() => { - translations$130 = { + var fr_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$135 }); + var translations$135; + var init_fr$20 = __esmMin((() => { + translations$135 = { Wk: "Sem.", "Week of": "Semaine du" }; })); //#endregion + //#region custom_components/hass_datapoints/src/molecules/analysis-aggregate-group/i18n/fr.ts + var fr_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$134 }); + var translations$134; + var init_fr$19 = __esmMin((() => { + translations$134 = { + "Aggregate series": "Séries agrégées", + "Count changes to a state": "Compter les passages à un état", + "Count all state changes": "Compter tous les changements d'état", + "Time in a state": "Durée dans un état", + "Percentage of time in a state": "Pourcentage du temps dans un état", + Hourly: "Par heure", + Daily: "Par jour", + Weekly: "Par semaine", + Monthly: "Par mois", + On: "Allumé", + Off: "Éteint", + Open: "Ouvert", + Closed: "Fermé", + Detected: "Détecté", + Clear: "Libre", + Occupied: "Occupé", + Unlocked: "Déverrouillé", + Locked: "Verrouillé", + Mean: "Moyenne", + Minimum: "Minimum", + Maximum: "Maximum", + Median: "Médiane", + "First reading": "Première mesure", + "Last reading": "Dernière mesure", + "All event types": "Tous les types d'événement", + Consumption: "Consommation", + "Meter reset detected": "Réinitialisation du compteur détectée", + "Ambiguous meter reset, not counted": "Réinitialisation du compteur ambiguë, non comptée", + Cumulative: "Cumulé", + "Reset total to zoomed range": "Réinitialiser le total sur la plage zoomée", + "Partial period": "Période partielle", + "Incomplete history": "Historique incomplet", + "Dashed outlines mark partial periods cut by the selected range; hatched or dotted marks show periods with gaps in recorded history.": "Les contours en pointillés signalent les périodes partielles coupées par la plage sélectionnée ; les marques hachurées ou pointillées indiquent des périodes avec des lacunes dans l'historique enregistré.", + "Counts only include activity in retained history; earlier activity is not shown.": "Les décomptes n'incluent que l'activité de l'historique conservé ; l'activité antérieure n'est pas affichée.", + "Count events": "Compter les événements", + Interval: "Intervalle", + State: "État", + "Every minute": "Chaque minute", + "Every 15 minutes": "Toutes les 15 minutes", + "Every 30 minutes": "Toutes les 30 minutes" + }; + })); + //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-anomaly-group/i18n/fr.ts - var fr_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$129 }); - var translations$129; + var fr_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$133 }); + var translations$133; var init_fr$18 = __esmMin((() => { - translations$129 = { + translations$133 = { Direction: "Sens", Both: "Les deux", Above: "Au-dessus", @@ -3218,10 +3316,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-delta-group/i18n/fr.ts - var fr_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$128 }); - var translations$128; + var fr_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$132 }); + var translations$132; var init_fr$17 = __esmMin((() => { - translations$128 = { + translations$132 = { "Show delta vs selected date window": "Afficher le delta par rapport à la fenêtre de dates sélectionnée", "Select a date window tab to enable delta analysis.": "Sélectionnez un onglet de fenêtre de dates pour activer l’analyse delta.", "Show delta in tooltip": "Afficher le delta dans l’infobulle", @@ -3230,10 +3328,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-rate-group/i18n/fr.ts - var fr_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$127 }); - var translations$127; + var fr_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$131 }); + var translations$131; var init_fr$16 = __esmMin((() => { - translations$127 = { + translations$131 = { "Show rate of change": "Afficher le taux de variation", "Show rate of change crosshairs": "Afficher les repères du taux de variation", "Rate window": "Fenêtre de variation", @@ -3245,10 +3343,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-sample-group/i18n/fr.ts - var fr_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$126 }); - var translations$126; + var fr_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$130 }); + var translations$130; var init_fr$15 = __esmMin((() => { - translations$126 = { + translations$130 = { Downsampling: "Rééchantillonnage", Interval: "Intervalle", Aggregate: "Agrégat", @@ -3280,20 +3378,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-summary-group/i18n/fr.ts - var fr_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$125 }); - var translations$125; + var fr_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$129 }); + var translations$129; var init_fr$14 = __esmMin((() => { - translations$125 = { + translations$129 = { "Show min / max / mean": "Afficher min / max / moyenne", "Show range shading": "Afficher l’ombrage de la plage" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-threshold-group/i18n/fr.ts - var fr_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$124 }); - var translations$124; + var fr_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$128 }); + var translations$128; var init_fr$13 = __esmMin((() => { - translations$124 = { + translations$128 = { "Show threshold analysis": "Afficher l’analyse de seuil", "Shade threshold area": "Ombrer la zone du seuil", Threshold: "Seuil", @@ -3304,10 +3402,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-trend-group/i18n/fr.ts - var fr_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$123 }); - var translations$123; + var fr_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$127 }); + var translations$127; var init_fr$12 = __esmMin((() => { - translations$123 = { + translations$127 = { "Show trend lines": "Afficher les lignes de tendance", "Show trend crosshairs": "Afficher les repères de tendance", "Trend method": "Méthode de tendance", @@ -3325,10 +3423,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/anomaly-monitor-wizard/i18n/fr.ts - var fr_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$122 }); - var translations$122; + var fr_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$126 }); + var translations$126; var init_fr$11 = __esmMin((() => { - translations$122 = { + translations$126 = { "Add all series from chart": "Ajouter toutes les séries du graphique", "Add from current chart": "Ajouter depuis le graphique actuel", "Create anomaly monitor": "Créer un moniteur d'anomalies", @@ -3338,17 +3436,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/comparison-tab-rail/i18n/fr.ts - var fr_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$121 }); - var translations$121; + var fr_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$125 }); + var translations$125; var init_fr$10 = __esmMin((() => { - translations$121 = { "Add date window": "Ajouter une fenêtre de dates" }; + translations$125 = { "Add date window": "Ajouter une fenêtre de dates" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/date-window-dialog/i18n/fr.ts - var fr_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$120 }); - var translations$120; + var fr_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$124 }); + var translations$124; var init_fr$9 = __esmMin((() => { - translations$120 = { + translations$124 = { "A date window saves a named date range as a tab, so you can quickly preview it against the selected range or jump the chart back to it later.": "Une fenêtre de dates enregistre une plage de dates nommée comme onglet afin que vous puissiez la prévisualiser rapidement par rapport à la plage sélectionnée ou y revenir plus tard dans le graphique.", Name: "Nom", "e.g. Heating season start": "ex. Début de la saison de chauffe", @@ -3365,10 +3463,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/sidebar-options/sections/i18n/fr.ts - var fr_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$119 }); - var translations$119; + var fr_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$123 }); + var translations$123; var init_fr$8 = __esmMin((() => { - translations$119 = { + translations$123 = { Datapoints: "Points de données", "Choose which annotation datapoints appear on the chart.": "Choisissez quels points de données d’annotation apparaissent sur le graphique.", "Linked to selected targets": "Liés aux cibles sélectionnées", @@ -3378,10 +3476,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row/i18n/fr.ts - var fr_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$118 }); - var translations$118; + var fr_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$122 }); + var translations$122; var init_fr$7 = __esmMin((() => { - translations$118 = { + translations$122 = { "Analysis configured": "Analyse configurée", "Configure analysis": "Configurer l’analyse", "Stepped series": "Série en escalier", @@ -3393,17 +3491,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row-list/i18n/fr.ts - var fr_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$117 }); - var translations$117; + var fr_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$121 }); + var translations$121; var init_fr$6 = __esmMin((() => { - translations$117 = {}; + translations$121 = {}; })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/ai-query-brief-dialog/i18n/fr.ts - var fr_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$116 }); - var translations$116; + var fr_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$120 }); + var translations$120; var init_fr$5 = __esmMin((() => { - translations$116 = { + translations$120 = { "AI query brief": "Brief de requete IA", "This brief is intended for another AI to fetch raw Home Assistant history and hass_datapoints anomaly details. Review it, then copy it into your AI tool of choice.": "Ce brief est destine a une autre IA afin de recuperer l'historique brut de Home Assistant et les details d'anomalie de hass_datapoints. Relisez-le, puis copiez-le dans l'outil IA de votre choix.", "Copy-ready brief": "Brief pret a copier", @@ -3415,10 +3513,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/history-targets/i18n/fr.ts - var fr_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$115 }); - var translations$115; + var fr_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$119 }); + var translations$119; var init_fr$4 = __esmMin((() => { - translations$115 = { + translations$119 = { Targets: "Cibles", "Each row controls one chart series.": "Chaque ligne contrôle une série du graphique.", "Add target": "Ajouter une cible", @@ -3427,10 +3525,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/panel-shell/i18n/fr.ts - var fr_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$114 }); - var translations$114; + var fr_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$118 }); + var translations$118; var init_fr$3 = __esmMin((() => { - translations$114 = { + translations$118 = { "Loading Datapoints…": "Chargement des points de données…", Datapoints: "Points de données", "Page options": "Options de la page", @@ -3445,10 +3543,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/range-toolbar/i18n/fr.ts - var fr_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$113 }); - var translations$113; + var fr_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$117 }); + var translations$117; var init_fr$2 = __esmMin((() => { - translations$113 = { + translations$117 = { "Toggle sidebar": "Basculer la barre latérale", Start: "Début", End: "Fin", @@ -3473,16 +3571,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/i18n/fr.ts - var fr_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$112 }); - var translations$112; + var fr_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$116 }); + var translations$116; var init_fr$1 = __esmMin((() => { - translations$112 = { "Selected range": "Période sélectionnée" }; + translations$116 = { "Selected range": "Période sélectionnée" }; })); //#endregion //#region custom_components/hass_datapoints/src/lib/i18n/locales/fr.ts var fr_exports = /* @__PURE__ */ __exportAll({ templates: () => templates$4 }); var modules$4, merged$4, templates$4; var init_fr = __esmMin((() => { + init_fr$29(); init_fr$28(); init_fr$27(); init_fr$26(); @@ -3512,16 +3611,17 @@ init_fr$2(); init_fr$1(); modules$4 = /* #__PURE__ */ Object.assign({ - "../../../cards/action/i18n/fr.ts": fr_exports$28, - "../../../cards/history/history-chart/i18n/fr.ts": fr_exports$27, - "../../../cards/history/i18n/fr.ts": fr_exports$26, - "../../../cards/list/i18n/fr.ts": fr_exports$25, - "../../../cards/quick/i18n/fr.ts": fr_exports$24, - "../../../cards/sensor/i18n/fr.ts": fr_exports$23, - "../../chart/i18n/fr.ts": fr_exports$22, - "../../ha/i18n/fr.ts": fr_exports$21, - "../../history-page/i18n/fr.ts": fr_exports$20, - "../../timeline/i18n/fr.ts": fr_exports$19, + "../../../cards/action/i18n/fr.ts": fr_exports$29, + "../../../cards/history/history-chart/i18n/fr.ts": fr_exports$28, + "../../../cards/history/i18n/fr.ts": fr_exports$27, + "../../../cards/list/i18n/fr.ts": fr_exports$26, + "../../../cards/quick/i18n/fr.ts": fr_exports$25, + "../../../cards/sensor/i18n/fr.ts": fr_exports$24, + "../../chart/i18n/fr.ts": fr_exports$23, + "../../ha/i18n/fr.ts": fr_exports$22, + "../../history-page/i18n/fr.ts": fr_exports$21, + "../../timeline/i18n/fr.ts": fr_exports$20, + "../../../molecules/analysis-aggregate-group/i18n/fr.ts": fr_exports$19, "../../../molecules/analysis-anomaly-group/i18n/fr.ts": fr_exports$18, "../../../molecules/analysis-delta-group/i18n/fr.ts": fr_exports$17, "../../../molecules/analysis-rate-group/i18n/fr.ts": fr_exports$16, @@ -3547,10 +3647,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/action/i18n/de.ts - var de_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$111 }); - var translations$111; - var init_de$28 = __esmMin((() => { - translations$111 = { + var de_exports$29 = /* @__PURE__ */ __exportAll({ translations: () => translations$115 }); + var translations$115; + var init_de$29 = __esmMin((() => { + translations$115 = { General: "Allgemein", "Related items": "Verknüpfte Elemente", "Datapoint Appearance": "Darstellung des Datenpunkts", @@ -3567,20 +3667,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/history-chart/i18n/de.ts - var de_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$110 }); - var translations$110; - var init_de$27 = __esmMin((() => { - translations$110 = { + var de_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$114 }); + var translations$114; + var init_de$28 = __esmMin((() => { + translations$114 = { "Date window:": "Datumsfenster:", "Actual:": "Tatsächlich:" }; })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/i18n/de.ts - var de_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$109 }); - var translations$109; - var init_de$26 = __esmMin((() => { - translations$109 = { + var de_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$113 }); + var translations$113; + var init_de$27 = __esmMin((() => { + translations$113 = { General: "Allgemein", Entity: "Entität", "Multiple entities": "Mehrere Entitäten", @@ -3597,10 +3697,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/list/i18n/de.ts - var de_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$108 }); - var translations$108; - var init_de$25 = __esmMin((() => { - translations$108 = { + var de_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$112 }); + var translations$112; + var init_de$26 = __esmMin((() => { + translations$112 = { "Search datapoints…": "Datenpunkte suchen…", "Delete record": "Eintrag löschen", Delete: "Löschen", @@ -3618,10 +3718,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/quick/i18n/de.ts - var de_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$107 }); - var translations$107; - var init_de$24 = __esmMin((() => { - translations$107 = { + var de_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$111 }); + var translations$111; + var init_de$25 = __esmMin((() => { + translations$111 = { General: "Allgemein", "Icon & colour": "Symbol und Farbe", "Related items": "Verknüpfte Elemente", @@ -3639,10 +3739,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/sensor/i18n/de.ts - var de_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$106 }); - var translations$106; - var init_de$23 = __esmMin((() => { - translations$106 = { + var de_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$110 }); + var translations$110; + var init_de$24 = __esmMin((() => { + translations$110 = { Entity: "Entität", Display: "Anzeige", "Records list": "Eintragsliste", @@ -3662,10 +3762,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/chart/i18n/de.ts - var de_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$105 }); - var translations$105; - var init_de$22 = __esmMin((() => { - translations$105 = { + var de_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$109 }); + var translations$109; + var init_de$23 = __esmMin((() => { + translations$109 = { "⚠️ Anomaly Insight": "⚠️ Anomalie-Einblick", "⚠️ Multi-method Anomaly": "⚠️ Anomalie mit mehreren Methoden", "Click the highlighted circle to add an annotation.": "Klicken Sie auf den hervorgehobenen Kreis, um eine Anmerkung hinzuzufügen.", @@ -3700,10 +3800,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/ha/i18n/de.ts - var de_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$104 }); - var translations$104; - var init_de$21 = __esmMin((() => { - translations$104 = { + var de_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$108 }); + var translations$108; + var init_de$22 = __esmMin((() => { + translations$108 = { "Confirm delete": "Löschen bestätigen", "Are you sure you want to delete this item?": "Möchten Sie dieses Element wirklich löschen?", Cancel: "Abbrechen", @@ -3718,10 +3818,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/history-page/i18n/de.ts - var de_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$103 }); - var translations$103; - var init_de$20 = __esmMin((() => { - translations$103 = { + var de_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$107 }); + var translations$107; + var init_de$21 = __esmMin((() => { + translations$107 = { "entity_id={0}": "entity_id={0}", "device_id={0}": "device_id={0}", "area_id={0}": "area_id={0}", @@ -3819,20 +3919,68 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/timeline/i18n/de.ts - var de_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$102 }); - var translations$102; - var init_de$19 = __esmMin((() => { - translations$102 = { + var de_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$106 }); + var translations$106; + var init_de$20 = __esmMin((() => { + translations$106 = { Wk: "KW", "Week of": "Woche von" }; })); //#endregion + //#region custom_components/hass_datapoints/src/molecules/analysis-aggregate-group/i18n/de.ts + var de_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$105 }); + var translations$105; + var init_de$19 = __esmMin((() => { + translations$105 = { + "Aggregate series": "Aggregierte Serien", + "Count changes to a state": "Wechsel in einen Zustand zählen", + "Count all state changes": "Alle Zustandswechsel zählen", + "Time in a state": "Zeit in einem Zustand", + "Percentage of time in a state": "Zeitanteil in einem Zustand in Prozent", + Hourly: "Stündlich", + Daily: "Täglich", + Weekly: "Wöchentlich", + Monthly: "Monatlich", + On: "An", + Off: "Aus", + Open: "Offen", + Closed: "Geschlossen", + Detected: "Erkannt", + Clear: "Frei", + Occupied: "Belegt", + Unlocked: "Entsperrt", + Locked: "Gesperrt", + Mean: "Mittelwert", + Minimum: "Minimum", + Maximum: "Maximum", + Median: "Median", + "First reading": "Erster Messwert", + "Last reading": "Letzter Messwert", + "All event types": "Alle Ereignistypen", + Consumption: "Verbrauch", + "Meter reset detected": "Zählerrücksetzung erkannt", + "Ambiguous meter reset, not counted": "Unklare Zählerrücksetzung, nicht gezählt", + Cumulative: "Kumulativ", + "Reset total to zoomed range": "Summe auf den gezoomten Bereich zurücksetzen", + "Partial period": "Teilperiode", + "Incomplete history": "Unvollständiger Verlauf", + "Dashed outlines mark partial periods cut by the selected range; hatched or dotted marks show periods with gaps in recorded history.": "Gestrichelte Umrandungen kennzeichnen Teilperioden am Rand des gewählten Bereichs; schraffierte oder gepunktete Markierungen zeigen Zeiträume mit Lücken im aufgezeichneten Verlauf.", + "Counts only include activity in retained history; earlier activity is not shown.": "Zählungen enthalten nur Aktivität im gespeicherten Verlauf; frühere Aktivität wird nicht angezeigt.", + "Count events": "Ereignisse zählen", + Interval: "Intervall", + State: "Zustand", + "Every minute": "Jede Minute", + "Every 15 minutes": "Alle 15 Minuten", + "Every 30 minutes": "Alle 30 Minuten" + }; + })); + //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-anomaly-group/i18n/de.ts - var de_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$101 }); - var translations$101; + var de_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$104 }); + var translations$104; var init_de$18 = __esmMin((() => { - translations$101 = { + translations$104 = { Direction: "Richtung", Both: "Beide", Above: "Oberhalb", @@ -3880,10 +4028,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-delta-group/i18n/de.ts - var de_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$100 }); - var translations$100; + var de_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$103 }); + var translations$103; var init_de$17 = __esmMin((() => { - translations$100 = { + translations$103 = { "Show delta vs selected date window": "Delta gegenüber dem ausgewählten Datumsfenster anzeigen", "Select a date window tab to enable delta analysis.": "Wählen Sie einen Tab für ein Datumsfenster, um die Delta-Analyse zu aktivieren.", "Show delta in tooltip": "Delta im Tooltip anzeigen", @@ -3892,10 +4040,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-rate-group/i18n/de.ts - var de_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$99 }); - var translations$99; + var de_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$102 }); + var translations$102; var init_de$16 = __esmMin((() => { - translations$99 = { + translations$102 = { "Show rate of change": "Änderungsrate anzeigen", "Show rate of change crosshairs": "Fadenkreuz für Änderungsrate anzeigen", "Rate window": "Ratenfenster", @@ -3907,10 +4055,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-sample-group/i18n/de.ts - var de_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$98 }); - var translations$98; + var de_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$101 }); + var translations$101; var init_de$15 = __esmMin((() => { - translations$98 = { + translations$101 = { Downsampling: "Downsampling", Interval: "Intervall", Aggregate: "Aggregation", @@ -3942,20 +4090,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-summary-group/i18n/de.ts - var de_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$97 }); - var translations$97; + var de_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$100 }); + var translations$100; var init_de$14 = __esmMin((() => { - translations$97 = { + translations$100 = { "Show min / max / mean": "Min / Max / Mittelwert anzeigen", "Show range shading": "Bereichsschattierung anzeigen" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-threshold-group/i18n/de.ts - var de_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$96 }); - var translations$96; + var de_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$99 }); + var translations$99; var init_de$13 = __esmMin((() => { - translations$96 = { + translations$99 = { "Show threshold analysis": "Schwellwertanalyse anzeigen", "Shade threshold area": "Schwellwertbereich schattieren", Threshold: "Schwellenwert", @@ -3966,10 +4114,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-trend-group/i18n/de.ts - var de_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$95 }); - var translations$95; + var de_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$98 }); + var translations$98; var init_de$12 = __esmMin((() => { - translations$95 = { + translations$98 = { "Show trend lines": "Trendlinien anzeigen", "Show trend crosshairs": "Fadenkreuz für Trend anzeigen", "Trend method": "Trendmethode", @@ -3987,10 +4135,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/anomaly-monitor-wizard/i18n/de.ts - var de_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$94 }); - var translations$94; + var de_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$97 }); + var translations$97; var init_de$11 = __esmMin((() => { - translations$94 = { + translations$97 = { "Add all series from chart": "Alle Reihen aus dem Diagramm hinzufügen", "Add from current chart": "Aus aktuellem Diagramm hinzufügen", "Create anomaly monitor": "Anomaliemonitor erstellen", @@ -4000,17 +4148,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/comparison-tab-rail/i18n/de.ts - var de_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$93 }); - var translations$93; + var de_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$96 }); + var translations$96; var init_de$10 = __esmMin((() => { - translations$93 = { "Add date window": "Datumsfenster hinzufügen" }; + translations$96 = { "Add date window": "Datumsfenster hinzufügen" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/date-window-dialog/i18n/de.ts - var de_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$92 }); - var translations$92; + var de_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$95 }); + var translations$95; var init_de$9 = __esmMin((() => { - translations$92 = { + translations$95 = { "A date window saves a named date range as a tab, so you can quickly preview it against the selected range or jump the chart back to it later.": "Ein Datumsfenster speichert einen benannten Datumsbereich als Registerkarte, damit Sie ihn schnell mit dem ausgewählten Bereich vergleichen oder später im Diagramm wieder dorthin springen können.", Name: "Name", "e.g. Heating season start": "z. B. Beginn der Heizsaison", @@ -4027,10 +4175,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/sidebar-options/sections/i18n/de.ts - var de_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$91 }); - var translations$91; + var de_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$94 }); + var translations$94; var init_de$8 = __esmMin((() => { - translations$91 = { + translations$94 = { Datapoints: "Datenpunkte", "Choose which annotation datapoints appear on the chart.": "Wählen Sie aus, welche Anmerkungs-Datenpunkte im Diagramm angezeigt werden.", "Linked to selected targets": "Mit ausgewählten Zielen verknüpft", @@ -4040,10 +4188,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row/i18n/de.ts - var de_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$90 }); - var translations$90; + var de_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$93 }); + var translations$93; var init_de$7 = __esmMin((() => { - translations$90 = { + translations$93 = { "Analysis configured": "Analyse konfiguriert", "Configure analysis": "Analyse konfigurieren", "Stepped series": "Stufenserie", @@ -4055,17 +4203,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row-list/i18n/de.ts - var de_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$89 }); - var translations$89; + var de_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$92 }); + var translations$92; var init_de$6 = __esmMin((() => { - translations$89 = {}; + translations$92 = {}; })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/ai-query-brief-dialog/i18n/de.ts - var de_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$88 }); - var translations$88; + var de_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$91 }); + var translations$91; var init_de$5 = __esmMin((() => { - translations$88 = { + translations$91 = { "AI query brief": "KI-Abfragebriefing", "This brief is intended for another AI to fetch raw Home Assistant history and hass_datapoints anomaly details. Review it, then copy it into your AI tool of choice.": "Dieses Briefing ist fuer eine andere KI gedacht, damit sie rohe Home-Assistant-Verlaeufe und hass_datapoints-Anomaliedetails abrufen kann. Pruefe es und kopiere es dann in dein KI-Werkzeug deiner Wahl.", "Copy-ready brief": "Kopierfertiges Briefing", @@ -4077,10 +4225,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/history-targets/i18n/de.ts - var de_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$87 }); - var translations$87; + var de_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$90 }); + var translations$90; var init_de$4 = __esmMin((() => { - translations$87 = { + translations$90 = { Targets: "Ziele", "Each row controls one chart series.": "Jede Zeile steuert eine Diagrammserie.", "Add target": "Ziel hinzufügen", @@ -4089,10 +4237,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/panel-shell/i18n/de.ts - var de_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$86 }); - var translations$86; + var de_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$89 }); + var translations$89; var init_de$3 = __esmMin((() => { - translations$86 = { + translations$89 = { "Loading Datapoints…": "Datenpunkte werden geladen…", Datapoints: "Datenpunkte", "Page options": "Seitenoptionen", @@ -4107,10 +4255,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/range-toolbar/i18n/de.ts - var de_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$85 }); - var translations$85; + var de_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$88 }); + var translations$88; var init_de$2 = __esmMin((() => { - translations$85 = { + translations$88 = { "Toggle sidebar": "Seitenleiste umschalten", Start: "Start", End: "Ende", @@ -4135,16 +4283,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/i18n/de.ts - var de_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$84 }); - var translations$84; + var de_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$87 }); + var translations$87; var init_de$1 = __esmMin((() => { - translations$84 = { "Selected range": "Ausgewählter Zeitraum" }; + translations$87 = { "Selected range": "Ausgewählter Zeitraum" }; })); //#endregion //#region custom_components/hass_datapoints/src/lib/i18n/locales/de.ts var de_exports = /* @__PURE__ */ __exportAll({ templates: () => templates$3 }); var modules$3, merged$3, templates$3; var init_de = __esmMin((() => { + init_de$29(); init_de$28(); init_de$27(); init_de$26(); @@ -4174,16 +4323,17 @@ init_de$2(); init_de$1(); modules$3 = /* #__PURE__ */ Object.assign({ - "../../../cards/action/i18n/de.ts": de_exports$28, - "../../../cards/history/history-chart/i18n/de.ts": de_exports$27, - "../../../cards/history/i18n/de.ts": de_exports$26, - "../../../cards/list/i18n/de.ts": de_exports$25, - "../../../cards/quick/i18n/de.ts": de_exports$24, - "../../../cards/sensor/i18n/de.ts": de_exports$23, - "../../chart/i18n/de.ts": de_exports$22, - "../../ha/i18n/de.ts": de_exports$21, - "../../history-page/i18n/de.ts": de_exports$20, - "../../timeline/i18n/de.ts": de_exports$19, + "../../../cards/action/i18n/de.ts": de_exports$29, + "../../../cards/history/history-chart/i18n/de.ts": de_exports$28, + "../../../cards/history/i18n/de.ts": de_exports$27, + "../../../cards/list/i18n/de.ts": de_exports$26, + "../../../cards/quick/i18n/de.ts": de_exports$25, + "../../../cards/sensor/i18n/de.ts": de_exports$24, + "../../chart/i18n/de.ts": de_exports$23, + "../../ha/i18n/de.ts": de_exports$22, + "../../history-page/i18n/de.ts": de_exports$21, + "../../timeline/i18n/de.ts": de_exports$20, + "../../../molecules/analysis-aggregate-group/i18n/de.ts": de_exports$19, "../../../molecules/analysis-anomaly-group/i18n/de.ts": de_exports$18, "../../../molecules/analysis-delta-group/i18n/de.ts": de_exports$17, "../../../molecules/analysis-rate-group/i18n/de.ts": de_exports$16, @@ -4209,10 +4359,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/action/i18n/es.ts - var es_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$83 }); - var translations$83; - var init_es$28 = __esmMin((() => { - translations$83 = { + var es_exports$29 = /* @__PURE__ */ __exportAll({ translations: () => translations$86 }); + var translations$86; + var init_es$29 = __esmMin((() => { + translations$86 = { General: "General", "Related items": "Elementos relacionados", "Datapoint Appearance": "Apariencia del punto de datos", @@ -4229,20 +4379,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/history-chart/i18n/es.ts - var es_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$82 }); - var translations$82; - var init_es$27 = __esmMin((() => { - translations$82 = { + var es_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$85 }); + var translations$85; + var init_es$28 = __esmMin((() => { + translations$85 = { "Date window:": "Ventana de fechas:", "Actual:": "Real:" }; })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/i18n/es.ts - var es_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$81 }); - var translations$81; - var init_es$26 = __esmMin((() => { - translations$81 = { + var es_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$84 }); + var translations$84; + var init_es$27 = __esmMin((() => { + translations$84 = { General: "General", Entity: "Entidad", "Multiple entities": "Varias entidades", @@ -4259,10 +4409,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/list/i18n/es.ts - var es_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$80 }); - var translations$80; - var init_es$25 = __esmMin((() => { - translations$80 = { + var es_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$83 }); + var translations$83; + var init_es$26 = __esmMin((() => { + translations$83 = { "Search datapoints…": "Buscar puntos de datos…", "Delete record": "Eliminar registro", Delete: "Eliminar", @@ -4280,10 +4430,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/quick/i18n/es.ts - var es_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$79 }); - var translations$79; - var init_es$24 = __esmMin((() => { - translations$79 = { + var es_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$82 }); + var translations$82; + var init_es$25 = __esmMin((() => { + translations$82 = { General: "General", "Icon & colour": "Icono y color", "Related items": "Elementos relacionados", @@ -4301,10 +4451,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/sensor/i18n/es.ts - var es_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$78 }); - var translations$78; - var init_es$23 = __esmMin((() => { - translations$78 = { + var es_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$81 }); + var translations$81; + var init_es$24 = __esmMin((() => { + translations$81 = { Entity: "Entidad", Display: "Visualización", "Records list": "Lista de registros", @@ -4324,10 +4474,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/chart/i18n/es.ts - var es_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$77 }); - var translations$77; - var init_es$22 = __esmMin((() => { - translations$77 = { + var es_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$80 }); + var translations$80; + var init_es$23 = __esmMin((() => { + translations$80 = { "⚠️ Anomaly Insight": "⚠️ Información de anomalía", "⚠️ Multi-method Anomaly": "⚠️ Anomalía multimétodo", "Click the highlighted circle to add an annotation.": "Haz clic en el círculo resaltado para añadir una anotación.", @@ -4362,10 +4512,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/ha/i18n/es.ts - var es_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$76 }); - var translations$76; - var init_es$21 = __esmMin((() => { - translations$76 = { + var es_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$79 }); + var translations$79; + var init_es$22 = __esmMin((() => { + translations$79 = { "Confirm delete": "Confirmar eliminación", "Are you sure you want to delete this item?": "¿Seguro que quieres eliminar este elemento?", Cancel: "Cancelar", @@ -4380,10 +4530,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/history-page/i18n/es.ts - var es_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$75 }); - var translations$75; - var init_es$20 = __esmMin((() => { - translations$75 = { + var es_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$78 }); + var translations$78; + var init_es$21 = __esmMin((() => { + translations$78 = { "entity_id={0}": "entity_id={0}", "device_id={0}": "device_id={0}", "area_id={0}": "area_id={0}", @@ -4481,20 +4631,68 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/timeline/i18n/es.ts - var es_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$74 }); - var translations$74; - var init_es$19 = __esmMin((() => { - translations$74 = { + var es_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$77 }); + var translations$77; + var init_es$20 = __esmMin((() => { + translations$77 = { Wk: "Sem.", "Week of": "Semana del" }; })); //#endregion + //#region custom_components/hass_datapoints/src/molecules/analysis-aggregate-group/i18n/es.ts + var es_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$76 }); + var translations$76; + var init_es$19 = __esmMin((() => { + translations$76 = { + "Aggregate series": "Series agregadas", + "Count changes to a state": "Contar cambios a un estado", + "Count all state changes": "Contar todos los cambios de estado", + "Time in a state": "Tiempo en un estado", + "Percentage of time in a state": "Porcentaje de tiempo en un estado", + Hourly: "Por hora", + Daily: "Diario", + Weekly: "Semanal", + Monthly: "Mensual", + On: "Encendido", + Off: "Apagado", + Open: "Abierto", + Closed: "Cerrado", + Detected: "Detectado", + Clear: "Libre", + Occupied: "Ocupado", + Unlocked: "Desbloqueado", + Locked: "Bloqueado", + Mean: "Media", + Minimum: "Mínimo", + Maximum: "Máximo", + Median: "Mediana", + "First reading": "Primera lectura", + "Last reading": "Última lectura", + "All event types": "Todos los tipos de evento", + Consumption: "Consumo", + "Meter reset detected": "Reinicio del contador detectado", + "Ambiguous meter reset, not counted": "Reinicio del contador ambiguo, no contabilizado", + Cumulative: "Acumulado", + "Reset total to zoomed range": "Reiniciar el total al rango ampliado", + "Partial period": "Periodo parcial", + "Incomplete history": "Historial incompleto", + "Dashed outlines mark partial periods cut by the selected range; hatched or dotted marks show periods with gaps in recorded history.": "Los contornos discontinuos marcan los periodos parciales cortados por el rango seleccionado; las marcas rayadas o punteadas indican periodos con huecos en el historial registrado.", + "Counts only include activity in retained history; earlier activity is not shown.": "Los recuentos solo incluyen la actividad del historial conservado; la actividad anterior no se muestra.", + "Count events": "Contar eventos", + Interval: "Intervalo", + State: "Estado", + "Every minute": "Cada minuto", + "Every 15 minutes": "Cada 15 minutos", + "Every 30 minutes": "Cada 30 minutos" + }; + })); + //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-anomaly-group/i18n/es.ts - var es_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$73 }); - var translations$73; + var es_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$75 }); + var translations$75; var init_es$18 = __esmMin((() => { - translations$73 = { + translations$75 = { Direction: "Dirección", Both: "Ambos", Above: "Por encima", @@ -4542,10 +4740,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-delta-group/i18n/es.ts - var es_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$72 }); - var translations$72; + var es_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$74 }); + var translations$74; var init_es$17 = __esmMin((() => { - translations$72 = { + translations$74 = { "Show delta vs selected date window": "Mostrar delta frente a la ventana de fechas seleccionada", "Select a date window tab to enable delta analysis.": "Selecciona una pestaña de ventana de fechas para habilitar el análisis delta.", "Show delta in tooltip": "Mostrar delta en la información sobre herramientas", @@ -4554,10 +4752,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-rate-group/i18n/es.ts - var es_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$71 }); - var translations$71; + var es_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$73 }); + var translations$73; var init_es$16 = __esmMin((() => { - translations$71 = { + translations$73 = { "Show rate of change": "Mostrar tasa de cambio", "Show rate of change crosshairs": "Mostrar guías de la tasa de cambio", "Rate window": "Ventana de tasa", @@ -4569,10 +4767,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-sample-group/i18n/es.ts - var es_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$70 }); - var translations$70; + var es_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$72 }); + var translations$72; var init_es$15 = __esmMin((() => { - translations$70 = { + translations$72 = { Downsampling: "Submuestreo", Interval: "Intervalo", Aggregate: "Agregado", @@ -4604,20 +4802,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-summary-group/i18n/es.ts - var es_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$69 }); - var translations$69; + var es_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$71 }); + var translations$71; var init_es$14 = __esmMin((() => { - translations$69 = { + translations$71 = { "Show min / max / mean": "Mostrar mín. / máx. / media", "Show range shading": "Mostrar sombreado del rango" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-threshold-group/i18n/es.ts - var es_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$68 }); - var translations$68; + var es_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$70 }); + var translations$70; var init_es$13 = __esmMin((() => { - translations$68 = { + translations$70 = { "Show threshold analysis": "Mostrar análisis de umbral", "Shade threshold area": "Sombrear área del umbral", Threshold: "Umbral", @@ -4628,10 +4826,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-trend-group/i18n/es.ts - var es_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$67 }); - var translations$67; + var es_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$69 }); + var translations$69; var init_es$12 = __esmMin((() => { - translations$67 = { + translations$69 = { "Show trend lines": "Mostrar líneas de tendencia", "Show trend crosshairs": "Mostrar guías de tendencia", "Trend method": "Método de tendencia", @@ -4649,10 +4847,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/anomaly-monitor-wizard/i18n/es.ts - var es_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$66 }); - var translations$66; + var es_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$68 }); + var translations$68; var init_es$11 = __esmMin((() => { - translations$66 = { + translations$68 = { "Add all series from chart": "Añadir todas las series del gráfico", "Add from current chart": "Añadir desde el gráfico actual", "Create anomaly monitor": "Crear monitor de anomalías", @@ -4662,17 +4860,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/comparison-tab-rail/i18n/es.ts - var es_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$65 }); - var translations$65; + var es_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$67 }); + var translations$67; var init_es$10 = __esmMin((() => { - translations$65 = { "Add date window": "Añadir ventana de fechas" }; + translations$67 = { "Add date window": "Añadir ventana de fechas" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/date-window-dialog/i18n/es.ts - var es_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$64 }); - var translations$64; + var es_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$66 }); + var translations$66; var init_es$9 = __esmMin((() => { - translations$64 = { + translations$66 = { "A date window saves a named date range as a tab, so you can quickly preview it against the selected range or jump the chart back to it later.": "Una ventana de fechas guarda un rango de fechas con nombre como pestaña, para que puedas previsualizarlo rápidamente frente al rango seleccionado o volver más tarde a él en el gráfico.", Name: "Nombre", "e.g. Heating season start": "p. ej., inicio de la temporada de calefacción", @@ -4689,10 +4887,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/sidebar-options/sections/i18n/es.ts - var es_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$63 }); - var translations$63; + var es_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$65 }); + var translations$65; var init_es$8 = __esmMin((() => { - translations$63 = { + translations$65 = { Datapoints: "Puntos de datos", "Choose which annotation datapoints appear on the chart.": "Elige qué puntos de datos de anotación aparecen en el gráfico.", "Linked to selected targets": "Vinculados a los objetivos seleccionados", @@ -4702,10 +4900,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row/i18n/es.ts - var es_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$62 }); - var translations$62; + var es_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$64 }); + var translations$64; var init_es$7 = __esmMin((() => { - translations$62 = { + translations$64 = { "Analysis configured": "Análisis configurado", "Configure analysis": "Configurar análisis", "Stepped series": "Serie escalonada", @@ -4717,17 +4915,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row-list/i18n/es.ts - var es_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$61 }); - var translations$61; + var es_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$63 }); + var translations$63; var init_es$6 = __esmMin((() => { - translations$61 = {}; + translations$63 = {}; })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/ai-query-brief-dialog/i18n/es.ts - var es_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$60 }); - var translations$60; + var es_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$62 }); + var translations$62; var init_es$5 = __esmMin((() => { - translations$60 = { + translations$62 = { "AI query brief": "Resumen de consulta para IA", "This brief is intended for another AI to fetch raw Home Assistant history and hass_datapoints anomaly details. Review it, then copy it into your AI tool of choice.": "Este resumen esta pensado para que otra IA obtenga el historial sin procesar de Home Assistant y los detalles de anomalias de hass_datapoints. Revisalo y luego copialo en la herramienta de IA que prefieras.", "Copy-ready brief": "Resumen listo para copiar", @@ -4739,10 +4937,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/history-targets/i18n/es.ts - var es_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$59 }); - var translations$59; + var es_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$61 }); + var translations$61; var init_es$4 = __esmMin((() => { - translations$59 = { + translations$61 = { Targets: "Objetivos", "Each row controls one chart series.": "Cada fila controla una serie del gráfico.", "Add target": "Añadir objetivo", @@ -4751,10 +4949,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/panel-shell/i18n/es.ts - var es_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$58 }); - var translations$58; + var es_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$60 }); + var translations$60; var init_es$3 = __esmMin((() => { - translations$58 = { + translations$60 = { "Loading Datapoints…": "Cargando puntos de datos…", Datapoints: "Puntos de datos", "Page options": "Opciones de la página", @@ -4769,10 +4967,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/range-toolbar/i18n/es.ts - var es_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$57 }); - var translations$57; + var es_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$59 }); + var translations$59; var init_es$2 = __esmMin((() => { - translations$57 = { + translations$59 = { "Toggle sidebar": "Alternar barra lateral", Start: "Inicio", End: "Fin", @@ -4797,16 +4995,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/i18n/es.ts - var es_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$56 }); - var translations$56; + var es_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$58 }); + var translations$58; var init_es$1 = __esmMin((() => { - translations$56 = { "Selected range": "Intervalo seleccionado" }; + translations$58 = { "Selected range": "Intervalo seleccionado" }; })); //#endregion //#region custom_components/hass_datapoints/src/lib/i18n/locales/es.ts var es_exports = /* @__PURE__ */ __exportAll({ templates: () => templates$2 }); var modules$2, merged$2, templates$2; var init_es = __esmMin((() => { + init_es$29(); init_es$28(); init_es$27(); init_es$26(); @@ -4836,16 +5035,17 @@ init_es$2(); init_es$1(); modules$2 = /* #__PURE__ */ Object.assign({ - "../../../cards/action/i18n/es.ts": es_exports$28, - "../../../cards/history/history-chart/i18n/es.ts": es_exports$27, - "../../../cards/history/i18n/es.ts": es_exports$26, - "../../../cards/list/i18n/es.ts": es_exports$25, - "../../../cards/quick/i18n/es.ts": es_exports$24, - "../../../cards/sensor/i18n/es.ts": es_exports$23, - "../../chart/i18n/es.ts": es_exports$22, - "../../ha/i18n/es.ts": es_exports$21, - "../../history-page/i18n/es.ts": es_exports$20, - "../../timeline/i18n/es.ts": es_exports$19, + "../../../cards/action/i18n/es.ts": es_exports$29, + "../../../cards/history/history-chart/i18n/es.ts": es_exports$28, + "../../../cards/history/i18n/es.ts": es_exports$27, + "../../../cards/list/i18n/es.ts": es_exports$26, + "../../../cards/quick/i18n/es.ts": es_exports$25, + "../../../cards/sensor/i18n/es.ts": es_exports$24, + "../../chart/i18n/es.ts": es_exports$23, + "../../ha/i18n/es.ts": es_exports$22, + "../../history-page/i18n/es.ts": es_exports$21, + "../../timeline/i18n/es.ts": es_exports$20, + "../../../molecules/analysis-aggregate-group/i18n/es.ts": es_exports$19, "../../../molecules/analysis-anomaly-group/i18n/es.ts": es_exports$18, "../../../molecules/analysis-delta-group/i18n/es.ts": es_exports$17, "../../../molecules/analysis-rate-group/i18n/es.ts": es_exports$16, @@ -4871,10 +5071,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/action/i18n/pt.ts - var pt_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$55 }); - var translations$55; - var init_pt$28 = __esmMin((() => { - translations$55 = { + var pt_exports$29 = /* @__PURE__ */ __exportAll({ translations: () => translations$57 }); + var translations$57; + var init_pt$29 = __esmMin((() => { + translations$57 = { General: "Geral", "Related items": "Itens relacionados", "Datapoint Appearance": "Aspeto do ponto de dados", @@ -4891,20 +5091,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/history-chart/i18n/pt.ts - var pt_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$54 }); - var translations$54; - var init_pt$27 = __esmMin((() => { - translations$54 = { + var pt_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$56 }); + var translations$56; + var init_pt$28 = __esmMin((() => { + translations$56 = { "Date window:": "Janela de datas:", "Actual:": "Real:" }; })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/i18n/pt.ts - var pt_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$53 }); - var translations$53; - var init_pt$26 = __esmMin((() => { - translations$53 = { + var pt_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$55 }); + var translations$55; + var init_pt$27 = __esmMin((() => { + translations$55 = { General: "Geral", Entity: "Entidade", "Multiple entities": "Múltiplas entidades", @@ -4921,10 +5121,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/list/i18n/pt.ts - var pt_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$52 }); - var translations$52; - var init_pt$25 = __esmMin((() => { - translations$52 = { + var pt_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$54 }); + var translations$54; + var init_pt$26 = __esmMin((() => { + translations$54 = { "Search datapoints…": "Pesquisar pontos de dados…", "Delete record": "Eliminar registo", Delete: "Eliminar", @@ -4942,10 +5142,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/quick/i18n/pt.ts - var pt_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$51 }); - var translations$51; - var init_pt$24 = __esmMin((() => { - translations$51 = { + var pt_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$53 }); + var translations$53; + var init_pt$25 = __esmMin((() => { + translations$53 = { General: "Geral", "Icon & colour": "Ícone e cor", "Related items": "Itens relacionados", @@ -4963,10 +5163,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/sensor/i18n/pt.ts - var pt_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$50 }); - var translations$50; - var init_pt$23 = __esmMin((() => { - translations$50 = { + var pt_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$52 }); + var translations$52; + var init_pt$24 = __esmMin((() => { + translations$52 = { Entity: "Entidade", Display: "Visualização", "Records list": "Lista de registos", @@ -4986,10 +5186,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/chart/i18n/pt.ts - var pt_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$49 }); - var translations$49; - var init_pt$22 = __esmMin((() => { - translations$49 = { + var pt_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$51 }); + var translations$51; + var init_pt$23 = __esmMin((() => { + translations$51 = { "⚠️ Anomaly Insight": "⚠️ Informação de anomalia", "⚠️ Multi-method Anomaly": "⚠️ Anomalia multimétodo", "Click the highlighted circle to add an annotation.": "Clique no círculo destacado para adicionar uma anotação.", @@ -5024,10 +5224,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/ha/i18n/pt.ts - var pt_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$48 }); - var translations$48; - var init_pt$21 = __esmMin((() => { - translations$48 = { + var pt_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$50 }); + var translations$50; + var init_pt$22 = __esmMin((() => { + translations$50 = { "Confirm delete": "Confirmar eliminação", "Are you sure you want to delete this item?": "Tem a certeza de que pretende eliminar este item?", Cancel: "Cancelar", @@ -5042,10 +5242,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/history-page/i18n/pt.ts - var pt_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$47 }); - var translations$47; - var init_pt$20 = __esmMin((() => { - translations$47 = { + var pt_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$49 }); + var translations$49; + var init_pt$21 = __esmMin((() => { + translations$49 = { "entity_id={0}": "entity_id={0}", "device_id={0}": "device_id={0}", "area_id={0}": "area_id={0}", @@ -5143,20 +5343,68 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/timeline/i18n/pt.ts - var pt_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$46 }); - var translations$46; - var init_pt$19 = __esmMin((() => { - translations$46 = { + var pt_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$48 }); + var translations$48; + var init_pt$20 = __esmMin((() => { + translations$48 = { Wk: "Sem.", "Week of": "Semana de" }; })); //#endregion + //#region custom_components/hass_datapoints/src/molecules/analysis-aggregate-group/i18n/pt.ts + var pt_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$47 }); + var translations$47; + var init_pt$19 = __esmMin((() => { + translations$47 = { + "Aggregate series": "Séries agregadas", + "Count changes to a state": "Contar mudanças para um estado", + "Count all state changes": "Contar todas as mudanças de estado", + "Time in a state": "Tempo num estado", + "Percentage of time in a state": "Percentagem de tempo num estado", + Hourly: "Por hora", + Daily: "Diário", + Weekly: "Semanal", + Monthly: "Mensal", + On: "Ligado", + Off: "Desligado", + Open: "Aberto", + Closed: "Fechado", + Detected: "Detetado", + Clear: "Livre", + Occupied: "Ocupado", + Unlocked: "Desbloqueado", + Locked: "Bloqueado", + Mean: "Média", + Minimum: "Mínimo", + Maximum: "Máximo", + Median: "Mediana", + "First reading": "Primeira leitura", + "Last reading": "Última leitura", + "All event types": "Todos os tipos de evento", + Consumption: "Consumo", + "Meter reset detected": "Reposição do contador detetada", + "Ambiguous meter reset, not counted": "Reposição do contador ambígua, não contabilizada", + Cumulative: "Acumulado", + "Reset total to zoomed range": "Repor o total no intervalo ampliado", + "Partial period": "Período parcial", + "Incomplete history": "Histórico incompleto", + "Dashed outlines mark partial periods cut by the selected range; hatched or dotted marks show periods with gaps in recorded history.": "Os contornos tracejados indicam períodos parciais cortados pelo intervalo selecionado; as marcas tracejadas finas ou pontilhadas indicam períodos com lacunas no histórico registado.", + "Counts only include activity in retained history; earlier activity is not shown.": "As contagens só incluem a atividade do histórico retido; a atividade anterior não é mostrada.", + "Count events": "Contar eventos", + Interval: "Intervalo", + State: "Estado", + "Every minute": "A cada minuto", + "Every 15 minutes": "A cada 15 minutos", + "Every 30 minutes": "A cada 30 minutos" + }; + })); + //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-anomaly-group/i18n/pt.ts - var pt_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$45 }); - var translations$45; + var pt_exports$18 = /* @__PURE__ */ __exportAll({ translations: () => translations$46 }); + var translations$46; var init_pt$18 = __esmMin((() => { - translations$45 = { + translations$46 = { Direction: "Direção", Both: "Ambos", Above: "Acima", @@ -5204,10 +5452,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-delta-group/i18n/pt.ts - var pt_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$44 }); - var translations$44; + var pt_exports$17 = /* @__PURE__ */ __exportAll({ translations: () => translations$45 }); + var translations$45; var init_pt$17 = __esmMin((() => { - translations$44 = { + translations$45 = { "Show delta vs selected date window": "Mostrar delta face à janela de datas selecionada", "Select a date window tab to enable delta analysis.": "Selecione um separador de janela de datas para ativar a análise delta.", "Show delta in tooltip": "Mostrar delta na dica", @@ -5216,10 +5464,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-rate-group/i18n/pt.ts - var pt_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$43 }); - var translations$43; + var pt_exports$16 = /* @__PURE__ */ __exportAll({ translations: () => translations$44 }); + var translations$44; var init_pt$16 = __esmMin((() => { - translations$43 = { + translations$44 = { "Show rate of change": "Mostrar taxa de variação", "Show rate of change crosshairs": "Mostrar guias da taxa de variação", "Rate window": "Janela da taxa", @@ -5231,10 +5479,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-sample-group/i18n/pt.ts - var pt_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$42 }); - var translations$42; + var pt_exports$15 = /* @__PURE__ */ __exportAll({ translations: () => translations$43 }); + var translations$43; var init_pt$15 = __esmMin((() => { - translations$42 = { + translations$43 = { Downsampling: "Reamostragem", Interval: "Intervalo", Aggregate: "Agregado", @@ -5266,20 +5514,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-summary-group/i18n/pt.ts - var pt_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$41 }); - var translations$41; + var pt_exports$14 = /* @__PURE__ */ __exportAll({ translations: () => translations$42 }); + var translations$42; var init_pt$14 = __esmMin((() => { - translations$41 = { + translations$42 = { "Show min / max / mean": "Mostrar mín. / máx. / média", "Show range shading": "Mostrar sombreamento do intervalo" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-threshold-group/i18n/pt.ts - var pt_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$40 }); - var translations$40; + var pt_exports$13 = /* @__PURE__ */ __exportAll({ translations: () => translations$41 }); + var translations$41; var init_pt$13 = __esmMin((() => { - translations$40 = { + translations$41 = { "Show threshold analysis": "Mostrar análise de limiar", "Shade threshold area": "Sombrear área do limiar", Threshold: "Limiar", @@ -5290,10 +5538,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/analysis-trend-group/i18n/pt.ts - var pt_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$39 }); - var translations$39; + var pt_exports$12 = /* @__PURE__ */ __exportAll({ translations: () => translations$40 }); + var translations$40; var init_pt$12 = __esmMin((() => { - translations$39 = { + translations$40 = { "Show trend lines": "Mostrar linhas de tendência", "Show trend crosshairs": "Mostrar guias da tendência", "Trend method": "Método de tendência", @@ -5311,10 +5559,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/anomaly-monitor-wizard/i18n/pt.ts - var pt_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$38 }); - var translations$38; + var pt_exports$11 = /* @__PURE__ */ __exportAll({ translations: () => translations$39 }); + var translations$39; var init_pt$11 = __esmMin((() => { - translations$38 = { + translations$39 = { "Add all series from chart": "Adicionar todas as séries do gráfico", "Add from current chart": "Adicionar do gráfico atual", "Create anomaly monitor": "Criar monitor de anomalias", @@ -5324,17 +5572,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/comparison-tab-rail/i18n/pt.ts - var pt_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$37 }); - var translations$37; + var pt_exports$10 = /* @__PURE__ */ __exportAll({ translations: () => translations$38 }); + var translations$38; var init_pt$10 = __esmMin((() => { - translations$37 = { "Add date window": "Adicionar janela de datas" }; + translations$38 = { "Add date window": "Adicionar janela de datas" }; })); //#endregion //#region custom_components/hass_datapoints/src/molecules/date-window-dialog/i18n/pt.ts - var pt_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$36 }); - var translations$36; + var pt_exports$9 = /* @__PURE__ */ __exportAll({ translations: () => translations$37 }); + var translations$37; var init_pt$9 = __esmMin((() => { - translations$36 = { + translations$37 = { "A date window saves a named date range as a tab, so you can quickly preview it against the selected range or jump the chart back to it later.": "Uma janela de datas guarda um intervalo de datas com nome como separador, para que possa pré-visualizá-lo rapidamente face ao intervalo selecionado ou regressar mais tarde a ele no gráfico.", Name: "Nome", "e.g. Heating season start": "ex.: início da época de aquecimento", @@ -5351,10 +5599,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/sidebar-options/sections/i18n/pt.ts - var pt_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$35 }); - var translations$35; + var pt_exports$8 = /* @__PURE__ */ __exportAll({ translations: () => translations$36 }); + var translations$36; var init_pt$8 = __esmMin((() => { - translations$35 = { + translations$36 = { Datapoints: "Pontos de dados", "Choose which annotation datapoints appear on the chart.": "Escolha quais os pontos de dados de anotação que aparecem no gráfico.", "Linked to selected targets": "Ligados aos alvos selecionados", @@ -5364,10 +5612,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row/i18n/pt.ts - var pt_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$34 }); - var translations$34; + var pt_exports$7 = /* @__PURE__ */ __exportAll({ translations: () => translations$35 }); + var translations$35; var init_pt$7 = __esmMin((() => { - translations$34 = { + translations$35 = { "Analysis configured": "Análise configurada", "Configure analysis": "Configurar análise", "Stepped series": "Série em degraus", @@ -5379,17 +5627,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/molecules/target-row-list/i18n/pt.ts - var pt_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$33 }); - var translations$33; + var pt_exports$6 = /* @__PURE__ */ __exportAll({ translations: () => translations$34 }); + var translations$34; var init_pt$6 = __esmMin((() => { - translations$33 = {}; + translations$34 = {}; })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/ai-query-brief-dialog/i18n/pt.ts - var pt_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$32 }); - var translations$32; + var pt_exports$5 = /* @__PURE__ */ __exportAll({ translations: () => translations$33 }); + var translations$33; var init_pt$5 = __esmMin((() => { - translations$32 = { + translations$33 = { "AI query brief": "Resumo de consulta para IA", "This brief is intended for another AI to fetch raw Home Assistant history and hass_datapoints anomaly details. Review it, then copy it into your AI tool of choice.": "Este resumo foi feito para outra IA obter o historico bruto do Home Assistant e os detalhes de anomalias do hass_datapoints. Revise-o e depois copie-o para a ferramenta de IA de sua escolha.", "Copy-ready brief": "Resumo pronto para copiar", @@ -5401,10 +5649,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/history-targets/i18n/pt.ts - var pt_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$31 }); - var translations$31; + var pt_exports$4 = /* @__PURE__ */ __exportAll({ translations: () => translations$32 }); + var translations$32; var init_pt$4 = __esmMin((() => { - translations$31 = { + translations$32 = { Targets: "Alvos", "Each row controls one chart series.": "Cada linha controla uma série do gráfico.", "Add target": "Adicionar alvo", @@ -5413,10 +5661,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/panel-shell/i18n/pt.ts - var pt_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$30 }); - var translations$30; + var pt_exports$3 = /* @__PURE__ */ __exportAll({ translations: () => translations$31 }); + var translations$31; var init_pt$3 = __esmMin((() => { - translations$30 = { + translations$31 = { "Loading Datapoints…": "A carregar pontos de dados…", Datapoints: "Pontos de dados", "Page options": "Opções da página", @@ -5431,10 +5679,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/components/range-toolbar/i18n/pt.ts - var pt_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$29 }); - var translations$29; + var pt_exports$2 = /* @__PURE__ */ __exportAll({ translations: () => translations$30 }); + var translations$30; var init_pt$2 = __esmMin((() => { - translations$29 = { + translations$30 = { "Toggle sidebar": "Alternar barra lateral", Start: "Início", End: "Fim", @@ -5459,16 +5707,17 @@ })); //#endregion //#region custom_components/hass_datapoints/src/panels/datapoints/i18n/pt.ts - var pt_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$28 }); - var translations$28; + var pt_exports$1 = /* @__PURE__ */ __exportAll({ translations: () => translations$29 }); + var translations$29; var init_pt$1 = __esmMin((() => { - translations$28 = { "Selected range": "Intervalo selecionado" }; + translations$29 = { "Selected range": "Intervalo selecionado" }; })); //#endregion //#region custom_components/hass_datapoints/src/lib/i18n/locales/pt.ts var pt_exports = /* @__PURE__ */ __exportAll({ templates: () => templates$1 }); var modules$1, merged$1, templates$1; var init_pt = __esmMin((() => { + init_pt$29(); init_pt$28(); init_pt$27(); init_pt$26(); @@ -5498,16 +5747,17 @@ init_pt$2(); init_pt$1(); modules$1 = /* #__PURE__ */ Object.assign({ - "../../../cards/action/i18n/pt.ts": pt_exports$28, - "../../../cards/history/history-chart/i18n/pt.ts": pt_exports$27, - "../../../cards/history/i18n/pt.ts": pt_exports$26, - "../../../cards/list/i18n/pt.ts": pt_exports$25, - "../../../cards/quick/i18n/pt.ts": pt_exports$24, - "../../../cards/sensor/i18n/pt.ts": pt_exports$23, - "../../chart/i18n/pt.ts": pt_exports$22, - "../../ha/i18n/pt.ts": pt_exports$21, - "../../history-page/i18n/pt.ts": pt_exports$20, - "../../timeline/i18n/pt.ts": pt_exports$19, + "../../../cards/action/i18n/pt.ts": pt_exports$29, + "../../../cards/history/history-chart/i18n/pt.ts": pt_exports$28, + "../../../cards/history/i18n/pt.ts": pt_exports$27, + "../../../cards/list/i18n/pt.ts": pt_exports$26, + "../../../cards/quick/i18n/pt.ts": pt_exports$25, + "../../../cards/sensor/i18n/pt.ts": pt_exports$24, + "../../chart/i18n/pt.ts": pt_exports$23, + "../../ha/i18n/pt.ts": pt_exports$22, + "../../history-page/i18n/pt.ts": pt_exports$21, + "../../timeline/i18n/pt.ts": pt_exports$20, + "../../../molecules/analysis-aggregate-group/i18n/pt.ts": pt_exports$19, "../../../molecules/analysis-anomaly-group/i18n/pt.ts": pt_exports$18, "../../../molecules/analysis-delta-group/i18n/pt.ts": pt_exports$17, "../../../molecules/analysis-rate-group/i18n/pt.ts": pt_exports$16, @@ -5533,10 +5783,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/action/i18n/zh-hans.ts - var zh_hans_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$27 }); - var translations$27; - var init_zh_hans$28 = __esmMin((() => { - translations$27 = { + var zh_hans_exports$29 = /* @__PURE__ */ __exportAll({ translations: () => translations$28 }); + var translations$28; + var init_zh_hans$29 = __esmMin((() => { + translations$28 = { General: "常规", "Related items": "关联项", "Datapoint Appearance": "数据点外观", @@ -5553,20 +5803,20 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/history-chart/i18n/zh-hans.ts - var zh_hans_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$26 }); - var translations$26; - var init_zh_hans$27 = __esmMin((() => { - translations$26 = { + var zh_hans_exports$28 = /* @__PURE__ */ __exportAll({ translations: () => translations$27 }); + var translations$27; + var init_zh_hans$28 = __esmMin((() => { + translations$27 = { "Date window:": "日期窗口:", "Actual:": "实际:" }; })); //#endregion //#region custom_components/hass_datapoints/src/cards/history/i18n/zh-hans.ts - var zh_hans_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$25 }); - var translations$25; - var init_zh_hans$26 = __esmMin((() => { - translations$25 = { + var zh_hans_exports$27 = /* @__PURE__ */ __exportAll({ translations: () => translations$26 }); + var translations$26; + var init_zh_hans$27 = __esmMin((() => { + translations$26 = { General: "常规", Entity: "实体", "Multiple entities": "多个实体", @@ -5583,10 +5833,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/list/i18n/zh-hans.ts - var zh_hans_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$24 }); - var translations$24; - var init_zh_hans$25 = __esmMin((() => { - translations$24 = { + var zh_hans_exports$26 = /* @__PURE__ */ __exportAll({ translations: () => translations$25 }); + var translations$25; + var init_zh_hans$26 = __esmMin((() => { + translations$25 = { "Search datapoints…": "搜索数据点…", "Delete record": "删除记录", Delete: "删除", @@ -5604,10 +5854,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/quick/i18n/zh-hans.ts - var zh_hans_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$23 }); - var translations$23; - var init_zh_hans$24 = __esmMin((() => { - translations$23 = { + var zh_hans_exports$25 = /* @__PURE__ */ __exportAll({ translations: () => translations$24 }); + var translations$24; + var init_zh_hans$25 = __esmMin((() => { + translations$24 = { General: "常规", "Icon & colour": "图标和颜色", "Related items": "关联项", @@ -5625,10 +5875,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/cards/sensor/i18n/zh-hans.ts - var zh_hans_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$22 }); - var translations$22; - var init_zh_hans$23 = __esmMin((() => { - translations$22 = { + var zh_hans_exports$24 = /* @__PURE__ */ __exportAll({ translations: () => translations$23 }); + var translations$23; + var init_zh_hans$24 = __esmMin((() => { + translations$23 = { Entity: "实体", Display: "显示", "Records list": "记录列表", @@ -5648,10 +5898,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/chart/i18n/zh-hans.ts - var zh_hans_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$21 }); - var translations$21; - var init_zh_hans$22 = __esmMin((() => { - translations$21 = { + var zh_hans_exports$23 = /* @__PURE__ */ __exportAll({ translations: () => translations$22 }); + var translations$22; + var init_zh_hans$23 = __esmMin((() => { + translations$22 = { "⚠️ Anomaly Insight": "⚠️ 异常洞察", "⚠️ Multi-method Anomaly": "⚠️ 多方法异常", "Click the highlighted circle to add an annotation.": "点击高亮圆圈以添加注释。", @@ -5686,10 +5936,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/ha/i18n/zh-hans.ts - var zh_hans_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$20 }); - var translations$20; - var init_zh_hans$21 = __esmMin((() => { - translations$20 = { + var zh_hans_exports$22 = /* @__PURE__ */ __exportAll({ translations: () => translations$21 }); + var translations$21; + var init_zh_hans$22 = __esmMin((() => { + translations$21 = { "Confirm delete": "确认删除", "Are you sure you want to delete this item?": "确定要删除此项目吗?", Cancel: "取消", @@ -5704,10 +5954,10 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/history-page/i18n/zh-hans.ts - var zh_hans_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$19 }); - var translations$19; - var init_zh_hans$20 = __esmMin((() => { - translations$19 = { + var zh_hans_exports$21 = /* @__PURE__ */ __exportAll({ translations: () => translations$20 }); + var translations$20; + var init_zh_hans$21 = __esmMin((() => { + translations$20 = { "entity_id={0}": "entity_id={0}", "device_id={0}": "device_id={0}", "area_id={0}": "area_id={0}", @@ -5805,12 +6055,60 @@ })); //#endregion //#region custom_components/hass_datapoints/src/lib/timeline/i18n/zh-hans.ts + var zh_hans_exports$20 = /* @__PURE__ */ __exportAll({ translations: () => translations$19 }); + var translations$19; + var init_zh_hans$20 = __esmMin((() => { + translations$19 = { + Wk: "周", + "Week of": "所在周" + }; + })); + //#endregion + //#region custom_components/hass_datapoints/src/molecules/analysis-aggregate-group/i18n/zh-hans.ts var zh_hans_exports$19 = /* @__PURE__ */ __exportAll({ translations: () => translations$18 }); var translations$18; var init_zh_hans$19 = __esmMin((() => { translations$18 = { - Wk: "周", - "Week of": "所在周" + "Aggregate series": "聚合序列", + "Count changes to a state": "统计变为某状态的次数", + "Count all state changes": "统计所有状态变化次数", + "Time in a state": "处于某状态的时长", + "Percentage of time in a state": "处于某状态的时间百分比", + Hourly: "每小时", + Daily: "每天", + Weekly: "每周", + Monthly: "每月", + On: "开", + Off: "关", + Open: "打开", + Closed: "关闭", + Detected: "已检测到", + Clear: "无人", + Occupied: "有人", + Unlocked: "已解锁", + Locked: "已锁定", + Mean: "平均值", + Minimum: "最小值", + Maximum: "最大值", + Median: "中位数", + "First reading": "首次读数", + "Last reading": "最后读数", + "All event types": "所有事件类型", + Consumption: "用量", + "Meter reset detected": "检测到电表重置", + "Ambiguous meter reset, not counted": "重置情况不明确,未计入", + Cumulative: "累计", + "Reset total to zoomed range": "将累计值重置为缩放范围", + "Partial period": "部分时段", + "Incomplete history": "历史记录不完整", + "Dashed outlines mark partial periods cut by the selected range; hatched or dotted marks show periods with gaps in recorded history.": "虚线轮廓表示被所选范围截断的部分时段;阴影或点状标记表示已记录历史中存在缺口的时段。", + "Counts only include activity in retained history; earlier activity is not shown.": "计数仅包含保留历史中的活动;更早的活动不会显示。", + "Count events": "统计事件数", + Interval: "间隔", + State: "状态", + "Every minute": "每分钟", + "Every 15 minutes": "每 15 分钟", + "Every 30 minutes": "每 30 分钟" }; })); //#endregion @@ -6131,6 +6429,7 @@ var zh_hans_exports = /* @__PURE__ */ __exportAll({ templates: () => templates }); var modules, merged, templates; var init_zh_hans = __esmMin((() => { + init_zh_hans$29(); init_zh_hans$28(); init_zh_hans$27(); init_zh_hans$26(); @@ -6160,16 +6459,17 @@ init_zh_hans$2(); init_zh_hans$1(); modules = /* #__PURE__ */ Object.assign({ - "../../../cards/action/i18n/zh-hans.ts": zh_hans_exports$28, - "../../../cards/history/history-chart/i18n/zh-hans.ts": zh_hans_exports$27, - "../../../cards/history/i18n/zh-hans.ts": zh_hans_exports$26, - "../../../cards/list/i18n/zh-hans.ts": zh_hans_exports$25, - "../../../cards/quick/i18n/zh-hans.ts": zh_hans_exports$24, - "../../../cards/sensor/i18n/zh-hans.ts": zh_hans_exports$23, - "../../chart/i18n/zh-hans.ts": zh_hans_exports$22, - "../../ha/i18n/zh-hans.ts": zh_hans_exports$21, - "../../history-page/i18n/zh-hans.ts": zh_hans_exports$20, - "../../timeline/i18n/zh-hans.ts": zh_hans_exports$19, + "../../../cards/action/i18n/zh-hans.ts": zh_hans_exports$29, + "../../../cards/history/history-chart/i18n/zh-hans.ts": zh_hans_exports$28, + "../../../cards/history/i18n/zh-hans.ts": zh_hans_exports$27, + "../../../cards/list/i18n/zh-hans.ts": zh_hans_exports$26, + "../../../cards/quick/i18n/zh-hans.ts": zh_hans_exports$25, + "../../../cards/sensor/i18n/zh-hans.ts": zh_hans_exports$24, + "../../chart/i18n/zh-hans.ts": zh_hans_exports$23, + "../../ha/i18n/zh-hans.ts": zh_hans_exports$22, + "../../history-page/i18n/zh-hans.ts": zh_hans_exports$21, + "../../timeline/i18n/zh-hans.ts": zh_hans_exports$20, + "../../../molecules/analysis-aggregate-group/i18n/zh-hans.ts": zh_hans_exports$19, "../../../molecules/analysis-anomaly-group/i18n/zh-hans.ts": zh_hans_exports$18, "../../../molecules/analysis-delta-group/i18n/zh-hans.ts": zh_hans_exports$17, "../../../molecules/analysis-rate-group/i18n/zh-hans.ts": zh_hans_exports$16, @@ -6240,7 +6540,7 @@ } //#endregion //#region custom_components/hass_datapoints/src/cards/action/editor.styles.ts - var styles$72 = i$5` + var styles$73 = i$5` .note { font-size: 0.78rem; color: var(--secondary-text-color); @@ -6248,7 +6548,7 @@ `; //#endregion //#region custom_components/hass_datapoints/src/molecules/editor-base/editor-base.styles.ts - var styles$71 = i$5` + var styles$72 = i$5` :host { display: block; } @@ -6299,7 +6599,7 @@ this._config = cfg; this._fire(cfg); } - }, _defineProperty(_EditorBase, "styles", styles$71), _EditorBase); + }, _defineProperty(_EditorBase, "styles", styles$72), _EditorBase); __decorate([r$2()], EditorBase.prototype, "_config", null); __decorate([n$1({ type: Object })], EditorBase.prototype, "hass", null); EditorBase = __decorate([localized()], EditorBase); @@ -6377,7 +6677,7 @@ } //#endregion //#region custom_components/hass_datapoints/src/atoms/display/section-heading/section-heading.styles.ts - var styles$70 = i$5` + var styles$71 = i$5` :host { display: block; } @@ -6407,12 +6707,12 @@ return b`
${this.text}
`; } }; - _defineProperty(SectionHeading, "styles", styles$70); + _defineProperty(SectionHeading, "styles", styles$71); __decorate([n$1({ type: String })], SectionHeading.prototype, "text", null); customElements.define("section-heading", SectionHeading); //#endregion //#region custom_components/hass_datapoints/src/atoms/form/editor-text-field/editor-text-field.styles.ts - var styles$69 = i$5` + var styles$70 = i$5` :host { display: block; } @@ -6489,7 +6789,7 @@ >`; } }; - _defineProperty(EditorTextField, "styles", styles$69); + _defineProperty(EditorTextField, "styles", styles$70); __decorate([n$1({ type: String })], EditorTextField.prototype, "label", null); __decorate([n$1({ type: String })], EditorTextField.prototype, "value", null); __decorate([n$1({ type: String })], EditorTextField.prototype, "type", null); @@ -6498,7 +6798,7 @@ customElements.define("editor-text-field", EditorTextField); //#endregion //#region custom_components/hass_datapoints/src/atoms/form/editor-switch/editor-switch.styles.ts - var styles$68 = i$5` + var styles$69 = i$5` :host { display: block; } @@ -6596,14 +6896,14 @@ `; } }; - _defineProperty(EditorSwitch, "styles", styles$68); + _defineProperty(EditorSwitch, "styles", styles$69); __decorate([n$1({ type: String })], EditorSwitch.prototype, "label", null); __decorate([n$1({ type: Boolean })], EditorSwitch.prototype, "checked", null); __decorate([n$1({ type: String })], EditorSwitch.prototype, "tooltip", null); customElements.define("editor-switch", EditorSwitch); //#endregion //#region custom_components/hass_datapoints/src/atoms/form/editor-icon-picker/editor-icon-picker.styles.ts - var styles$67 = i$5` + var styles$68 = i$5` :host { display: block; } @@ -6661,7 +6961,7 @@ >`; } }; - _defineProperty(EditorIconPicker, "styles", styles$67); + _defineProperty(EditorIconPicker, "styles", styles$68); __decorate([n$1({ type: String })], EditorIconPicker.prototype, "label", null); __decorate([n$1({ type: String })], EditorIconPicker.prototype, "value", null); __decorate([n$1({ type: Object })], EditorIconPicker.prototype, "hass", null); @@ -6778,7 +7078,7 @@ `; } }; - _defineProperty(HassDatapointsActionCardEditor, "styles", [EditorBase.styles, styles$72]); + _defineProperty(HassDatapointsActionCardEditor, "styles", [EditorBase.styles, styles$73]); __decorate([e$4("#target-picker")], HassDatapointsActionCardEditor.prototype, "_targetPickerEl", null); __decorate([r$1("ha-selector")], HassDatapointsActionCardEditor.prototype, "_selectorEls", null); //#endregion @@ -7022,7 +7322,7 @@ } //#endregion //#region custom_components/hass_datapoints/src/cards/dev-tool/dev-tool.styles.ts - var styles$66 = i$5` + var styles$67 = i$5` :host { display: block; } @@ -7097,7 +7397,7 @@ _defineProperty(HassDatapointsDevToolCardEditor, "styles", [EditorBase.styles]); //#endregion //#region custom_components/hass_datapoints/src/cards/dev-tool/dev-tool-results/dev-tool-results.styles.ts - var styles$65 = i$5` + var styles$66 = i$5` :host { display: block; margin-top: 18px; @@ -7464,7 +7764,7 @@ `; } }; - _defineProperty(CardDevToolResults, "styles", styles$65); + _defineProperty(CardDevToolResults, "styles", styles$66); __decorate([n$1({ attribute: false })], CardDevToolResults.prototype, "results", null); __decorate([n$1({ type: Boolean })], CardDevToolResults.prototype, "isAdmin", null); __decorate([n$1({ type: String })], CardDevToolResults.prototype, "statusKind", null); @@ -7474,7 +7774,7 @@ customElements.define("dev-tool-results", CardDevToolResults); //#endregion //#region custom_components/hass_datapoints/src/cards/dev-tool/dev-tool-windows/dev-tool-windows.styles.ts - var styles$64 = i$5` + var styles$65 = i$5` :host { display: block; } @@ -7717,7 +8017,7 @@ `; } }; - _defineProperty(CardDevToolWindows, "styles", styles$64); + _defineProperty(CardDevToolWindows, "styles", styles$65); __decorate([n$1({ attribute: false })], CardDevToolWindows.prototype, "windows", null); __decorate([r$2()], CardDevToolWindows.prototype, "_nextWindowId", null); customElements.define("dev-tool-windows", CardDevToolWindows); @@ -8228,7 +8528,7 @@ return document.createElement("hass-datapoints-dev-tool-card-editor"); } }; - _defineProperty(HassDatapointsDevToolCard, "styles", styles$66); + _defineProperty(HassDatapointsDevToolCard, "styles", styles$67); __decorate([r$2()], HassDatapointsDevToolCard.prototype, "_config", null); __decorate([r$2()], HassDatapointsDevToolCard.prototype, "_hass", null); __decorate([r$2()], HassDatapointsDevToolCard.prototype, "_entities", null); @@ -8395,58 +8695,946 @@ this._resizeObserver = null; } } - static getStubConfig() { - return { title: "" }; + static getStubConfig() { + return { title: "" }; + } + }; + //#endregion + //#region custom_components/hass_datapoints/src/cards/history/history.styles.ts + var styles$64 = i$5` + :host { + display: block; + height: 100%; + } + + ha-card { + height: 100%; + display: flex; + flex-direction: column; + overflow: hidden; + } + + .card-header { + margin: 0; + padding: 12px 16px 0; + font-size: 24px; + font-weight: 400; + line-height: 48px; + color: var(--primary-text-color); + flex: 0 0 auto; + display: flex; + justify-content: space-between; + gap: 8px; + } + + .card-header-title { + min-width: 0; + font: inherit; + line-height: inherit; + font-weight: inherit; + } + + .card-header-action { + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + align-self: center; + } + + hass-datapoints-history-chart { + flex: 1 1 auto; + min-height: 0; + } +`; + //#endregion + //#region custom_components/hass_datapoints/src/lib/domain/aggregation/calendar.ts + var HOUR_MS$2 = 36e5; + var MINUTE_MS$2 = 6e4; + /** Sub-day intervals of fixed length, aligned to the local wall clock. */ + var FIXED_INTERVAL_MS = { + minute: MINUTE_MS$2, + "15min": 15 * MINUTE_MS$2, + "30min": 30 * MINUTE_MS$2, + hour: HOUR_MS$2 + }; + var formatters = /* @__PURE__ */ new Map(); + function getFormatter(timeZone) { + let formatter = formatters.get(timeZone); + if (!formatter) { + formatter = new Intl.DateTimeFormat("en-US", { + timeZone, + hourCycle: "h23", + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric" + }); + formatters.set(timeZone, formatter); + } + return formatter; + } + function getLocalParts(ts, timeZone) { + const values = {}; + for (const part of getFormatter(timeZone).formatToParts(ts)) if (part.type !== "literal") values[part.type] = Number(part.value); + return { + year: values.year, + month: values.month, + day: values.day, + minute: values.minute, + second: values.second, + weekday: new Date(Date.UTC(values.year, values.month - 1, values.day)).getUTCDay() + }; + } + function getOffsetMs(ts, timeZone) { + const whole = Math.floor(ts / 1e3) * 1e3; + const values = {}; + for (const part of getFormatter(timeZone).formatToParts(whole)) if (part.type !== "literal") values[part.type] = Number(part.value); + return Date.UTC(values.year, values.month - 1, values.day, values.hour, values.minute, values.second) - whole; + } + /** Local midnight (in `timeZone`) of a possibly un-normalised calendar date. */ + function localMidnight(year, month, day, timeZone) { + const wall = Date.UTC(year, month - 1, day); + return wall - getOffsetMs(wall - getOffsetMs(wall, timeZone), timeZone); + } + function getPeriodStart(ts, interval, timeZone) { + const p = getLocalParts(ts, timeZone); + const fixedMs = FIXED_INTERVAL_MS[interval]; + if (fixedMs) { + const ms = (ts % 1e3 + 1e3) % 1e3; + const offsetMinutes = p.minute % (fixedMs / MINUTE_MS$2); + return ts - ms - p.second * 1e3 - offsetMinutes * MINUTE_MS$2; + } + if (interval === "day") return localMidnight(p.year, p.month, p.day, timeZone); + if (interval === "week") return localMidnight(p.year, p.month, p.day - (p.weekday + 6) % 7, timeZone); + return localMidnight(p.year, p.month, 1, timeZone); + } + function getNextPeriodStart(periodStart, interval, timeZone) { + const fixedMs = FIXED_INTERVAL_MS[interval]; + if (fixedMs) return periodStart + fixedMs; + const p = getLocalParts(periodStart + HOUR_MS$2 * 2, timeZone); + if (interval === "day") return localMidnight(p.year, p.month, p.day + 1, timeZone); + if (interval === "week") return localMidnight(p.year, p.month, p.day + 7, timeZone); + return localMidnight(p.year, p.month + 1, 1, timeZone); + } + /** + * Calendar periods overlapping `range`, clipped to it. Periods cut by the + * range edge are flagged partial; the full period bounds are preserved. + */ + function getPeriods(range, interval, timeZone) { + const periods = []; + if (!(range.end > range.start)) return periods; + let periodStart = getPeriodStart(range.start, interval, timeZone); + while (periodStart < range.end) { + const periodEnd = getNextPeriodStart(periodStart, interval, timeZone); + const start = Math.max(periodStart, range.start); + const end = Math.min(periodEnd, range.end); + periods.push({ + periodStart, + periodEnd, + start, + end, + partial: start !== periodStart || end !== periodEnd + }); + periodStart = periodEnd; + } + return periods; + } + //#endregion + //#region custom_components/hass_datapoints/src/lib/domain/aggregation/calculate.ts + var MINUTE_MS$1 = 6e4; + var UNKNOWN_STATES$1 = /* @__PURE__ */ new Set(["unknown", "unavailable"]); + var CUMULATIVE_OPERATIONS$1 = /* @__PURE__ */ new Set([ + "consumption", + "transition_count", + "state_duration", + "event_count" + ]); + function isKnownState(state) { + return typeof state === "string" && !UNKNOWN_STATES$1.has(state); + } + function overlap(a, b) { + return Math.max(0, Math.min(a.end, b.end) - Math.max(a.start, b.start)); + } + /** + * Bucket time-ordered items into periods in one sweep. Minute-level intervals + * over long ranges create tens of thousands of periods, so per-period filters + * over every item would be quadratic. + */ + function groupByPeriod(items, periods, timeOf) { + const sorted = [...items].sort((a, b) => timeOf(a) - timeOf(b)); + const groups = periods.map(() => []); + let cursor = 0; + sorted.forEach((item) => { + const time = timeOf(item); + while (cursor < periods.length && time >= periods[cursor].end) cursor += 1; + if (cursor < periods.length && time >= periods[cursor].start) groups[cursor].push(item); + }); + return groups; + } + function sortSamples(samples) { + return [...samples].sort((a, b) => a.time - b.time); + } + /** Known (covered) time within each period, in one sweep over the coverage. */ + function knownDurationsOf(periods, coverage) { + if (!coverage) return periods.map((period) => period.end - period.start); + const sorted = [...coverage].sort((a, b) => a.start - b.start); + let first = 0; + return periods.map((period) => { + while (first < sorted.length && sorted[first].end <= period.start) first += 1; + let known = 0; + for (let i = first; i < sorted.length && sorted[i].start < period.end; i += 1) known += overlap(period, sorted[i]); + return known; + }); + } + /** Known-state spans over `range`, seeded by the last sample at/before start. */ + function buildStateSpans(samples, range, coverage) { + const stateful = sortSamples(samples).filter((s) => typeof s.state === "string"); + const points = []; + let seed; + for (const s of stateful) if (s.time <= range.start) seed = { + time: range.start, + state: s.state + }; + else if (s.time < range.end) points.push({ + time: s.time, + state: s.state + }); + if (seed) points.unshift(seed); + const spans = []; + points.forEach((point, i) => { + if (!isKnownState(point.state)) return; + const end = i + 1 < points.length ? points[i + 1].time : range.end; + const span = { + start: point.time, + end, + state: point.state + }; + if (!coverage) { + spans.push(span); + return; + } + for (const c of coverage) { + const start = Math.max(span.start, c.start); + const clippedEnd = Math.min(span.end, c.end); + if (clippedEnd > start) spans.push({ + start, + end: clippedEnd, + state: span.state + }); + } + }); + return spans; + } + function median(values) { + const sorted = [...values].sort((a, b) => a - b); + const mid = Math.floor(sorted.length / 2); + return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2; + } + function calculateMeasurement(input, periods) { + const grouped = groupByPeriod(sortSamples(input.samples).filter((s) => !s.boundary && typeof s.value === "number" && Number.isFinite(s.value)), periods, (s) => s.time); + return periods.map((_period, index) => { + const values = grouped[index].map((s) => s.value); + if (!values.length) return { + value: null, + reasons: ["no-data"] + }; + const op = input.definition.operation; + let value; + if (op === "min") value = Math.min(...values); + else if (op === "max") value = Math.max(...values); + else if (op === "median") value = median(values); + else if (op === "first") value = values[0]; + else if (op === "last") value = values[values.length - 1]; + else value = values.reduce((sum, v) => sum + v, 0) / values.length; + return { + value, + reasons: [] + }; + }); + } + function calculateTransitions(input, periods) { + const selected = input.definition.states ?? []; + const stateful = sortSamples(input.samples).filter((s) => typeof s.state === "string"); + const times = []; + stateful.forEach((curr, i) => { + const prev = stateful[i - 1]; + if (!prev || curr.time <= input.range.start || curr.time >= input.range.end || !isKnownState(prev.state) || !isKnownState(curr.state) || prev.state === curr.state || selected.length > 0 && !selected.includes(curr.state)) return; + times.push(curr.time); + }); + const grouped = groupByPeriod(times, periods, (t) => t); + return periods.map((_period, index) => ({ + value: grouped[index].length, + reasons: [] + })); + } + function calculateDurations(input, periods, percentage) { + const selected = input.definition.states ?? []; + if (!selected.length) return periods.map(() => ({ + value: null, + reasons: ["no-state-selected"] + })); + const spans = buildStateSpans(input.samples, input.range, input.coverage).sort((a, b) => a.start - b.start); + let first = 0; + return periods.map((period) => { + let known = 0; + let matching = 0; + while (first < spans.length && spans[first].end <= period.start) first += 1; + for (let i = first; i < spans.length && spans[i].start < period.end; i += 1) { + const ms = overlap(period, spans[i]); + known += ms; + if (selected.includes(spans[i].state)) matching += ms; + } + if (percentage) return known > 0 ? { + value: matching / known * 100, + reasons: [] + } : { + value: null, + reasons: ["no-known-time"] + }; + return known > 0 ? { + value: matching / MINUTE_MS$1, + reasons: [] + } : { + value: null, + reasons: ["no-known-time"] + }; + }); + } + function calculateEvents(input, periods) { + const types = input.definition.eventTypes ?? []; + const grouped = groupByPeriod(input.samples.filter((s) => !s.boundary && typeof s.eventType === "string" && (types.length === 0 || types.includes(s.eventType))).map((s) => s.eventTime ?? s.time), periods, (t) => t); + return periods.map((_period, index) => ({ + value: grouped[index].length, + reasons: [] + })); + } + function calculateConsumption(input, periods) { + const deltas = []; + for (const s of input.samples) if (typeof s.change === "number" && Number.isFinite(s.change) && s.time >= input.range.start && s.time < input.range.end) deltas.push({ + time: s.time, + value: s.change + }); + const readings = sortSamples(input.samples).filter((s) => { + const v = s.sum ?? s.value; + return s.change === void 0 && typeof v === "number" && Number.isFinite(v); + }); + readings.forEach((curr, i) => { + const prev = readings[i - 1]; + if (!prev || curr.time <= input.range.start || curr.time >= input.range.end) return; + const usesSum = typeof curr.sum === "number" && typeof prev.sum === "number"; + const currValue = usesSum ? curr.sum : curr.value; + const delta = currValue - (usesSum ? prev.sum : prev.value); + if (usesSum || delta >= 0) deltas.push({ + time: curr.time, + value: delta + }); + else if (input.stateClass === "total_increasing" || curr.lastReset !== void 0 && curr.lastReset !== prev.lastReset) deltas.push({ + time: curr.time, + value: currValue, + reason: "reset" + }); + else if (input.stateClass === "total") deltas.push({ + time: curr.time, + value: delta + }); + else deltas.push({ + time: curr.time, + value: 0, + reason: "ambiguous-reset" + }); + }); + const grouped = groupByPeriod(deltas, periods, (d) => d.time); + return periods.map((_period, index) => { + const inside = grouped[index]; + if (!inside.length) return { + value: null, + reasons: ["no-data"] + }; + return { + value: inside.reduce((sum, d) => sum + d.value, 0), + reasons: [...new Set(inside.flatMap((d) => d.reason ? [d.reason] : []))] + }; + }); + } + function toCumulative(operation, periods, buckets) { + const startsAtZeroActivity = operation !== "consumption"; + let running = 0; + let started = false; + const keptBuckets = []; + const keptPeriods = []; + buckets.forEach((bucket, i) => { + if (!started) { + started = bucket.value !== null && (!startsAtZeroActivity || bucket.value > 0); + if (!started) return; + } + running += bucket.value ?? 0; + keptBuckets.push({ + value: running, + reasons: bucket.reasons + }); + keptPeriods.push(periods[i]); + }); + return { + buckets: keptBuckets, + periods: keptPeriods, + started + }; + } + function calculateAggregate(input) { + const { definition } = input; + const cumulative = definition.mode === "cumulative" && CUMULATIVE_OPERATIONS$1.has(definition.operation); + if (cumulative && definition.resetOnZoom && input.zoom) { + const start = Math.max(input.range.start, input.zoom.start); + const end = Math.min(input.range.end, input.zoom.end); + if (end > start) return calculateAggregate({ + ...input, + zoom: void 0, + range: { + start, + end + } + }); + } + let periods = getPeriods(input.range, definition.interval, input.timeZone); + const op = definition.operation; + let buckets; + let unit = input.unit ?? ""; + if (op === "transition_count") { + buckets = calculateTransitions(input, periods); + unit = ""; + } else if (op === "state_duration") { + buckets = calculateDurations(input, periods, false); + unit = "min"; + } else if (op === "state_percentage") { + buckets = calculateDurations(input, periods, true); + unit = "%"; + } else if (op === "event_count") { + buckets = calculateEvents(input, periods); + unit = ""; + } else if (op === "consumption") buckets = calculateConsumption(input, periods); + else buckets = calculateMeasurement(input, periods); + let started = true; + if (cumulative) { + const result = toCumulative(op, periods, buckets); + ({buckets, periods, started} = result); + } + const knownDurations = knownDurationsOf(periods, input.coverage); + const points = periods.map((period, i) => { + const totalDuration = period.end - period.start; + const knownDuration = knownDurations[i]; + const reasons = [...buckets[i].reasons]; + const incomplete = knownDuration < totalDuration; + if (incomplete) reasons.push("incomplete-coverage"); + return { + ...period, + time: period.start, + value: knownDuration === 0 ? null : buckets[i].value, + incomplete: incomplete || reasons.includes("no-data"), + knownDuration, + totalDuration, + reasons + }; + }); + const isBar = !cumulative && ![ + "mean", + "min", + "max", + "median", + "first", + "last" + ].includes(op); + return { + points, + unit, + presentation: isBar ? "bar" : "line", + baseline: cumulative && started && points.length ? 0 : null + }; + } + //#endregion + //#region custom_components/hass_datapoints/src/lib/domain/aggregation/labels.ts + var BINARY_AGGREGATE_KINDS = [ + { + value: "transition_count", + label: "Count changes to a state" + }, + { + value: "all_changes", + label: "Count all state changes" + }, + { + value: "state_duration", + label: "Time in a state" + }, + { + value: "state_percentage", + label: "Percentage of time in a state" + } + ]; + var AGGREGATE_INTERVAL_OPTIONS = [ + { + value: "minute", + label: "Every minute" + }, + { + value: "15min", + label: "Every 15 minutes" + }, + { + value: "30min", + label: "Every 30 minutes" + }, + { + value: "hour", + label: "Hourly" + }, + { + value: "day", + label: "Daily" + }, + { + value: "week", + label: "Weekly" + }, + { + value: "month", + label: "Monthly" + } + ]; + var STATE_LABELS = { + door: ["Open", "Closed"], + garage_door: ["Open", "Closed"], + window: ["Open", "Closed"], + opening: ["Open", "Closed"], + motion: ["Detected", "Clear"], + occupancy: ["Occupied", "Clear"], + lock: ["Unlocked", "Locked"] + }; + /** On/off options labelled for the entity's device class (e.g. Open/Closed). */ + function getBinaryStateOptions(deviceClass) { + const [on, off] = STATE_LABELS[deviceClass ?? ""] ?? ["On", "Off"]; + return [{ + value: "on", + label: on + }, { + value: "off", + label: off + }]; + } + function getBinaryAggregateKind(definition) { + if (definition.operation === "transition_count") return definition.states?.length ? "transition_count" : "all_changes"; + return definition.operation === "state_percentage" ? "state_percentage" : "state_duration"; + } + /** Apply a user-facing kind to a definition, keeping states consistent. */ + function applyBinaryAggregateKind(definition, kind, defaultState = "on") { + const states = definition.states?.length ? definition.states : [defaultState]; + if (kind === "all_changes") return { + ...definition, + operation: "transition_count", + states: [] + }; + const operation = kind; + const mode = operation === "state_percentage" ? "interval" : definition.mode; + return { + ...definition, + operation, + mode, + states + }; + } + function createBinaryAggregate(existingIds, defaultState = "on") { + let id; + do + id = `agg_${Math.random().toString(36).slice(2, 8)}`; + while (existingIds.includes(id)); + return { + id, + operation: "transition_count", + interval: "day", + mode: "interval", + states: [defaultState], + resetOnZoom: false + }; + } + var MEASUREMENT_OPERATIONS = [ + { + value: "mean", + label: "Mean" + }, + { + value: "min", + label: "Minimum" + }, + { + value: "max", + label: "Maximum" + }, + { + value: "median", + label: "Median" + }, + { + value: "first", + label: "First reading" + }, + { + value: "last", + label: "Last reading" } + ]; + /** Everything offered on a numeric row: measurement summaries plus consumption. */ + var NUMERIC_AGGREGATE_OPERATIONS = [...MEASUREMENT_OPERATIONS, { + value: "consumption", + label: "Consumption" + }]; + function isNumericAggregateOperation(operation) { + return NUMERIC_AGGREGATE_OPERATIONS.some((o) => o.value === operation); + } + var MEASUREMENT_VALUES = new Set(MEASUREMENT_OPERATIONS.map((o) => o.value)); + function isMeasurementOperation(operation) { + return MEASUREMENT_VALUES.has(operation); + } + function createMeasurementAggregate(existingIds, operation = "mean") { + return { + ...createBinaryAggregate(existingIds), + operation, + states: void 0 + }; + } + function createEventAggregate(existingIds, eventTypes = []) { + return { + ...createBinaryAggregate(existingIds), + operation: "event_count", + states: void 0, + eventTypes + }; + } + /** + * Dash pattern (px on/off) per aggregation type. Aggregate lines keep the + * source series' colour, so the pattern is what tells them apart. + */ + var DASH_PATTERNS = { + mean: [10, 4], + min: [2, 4], + max: [ + 2, + 4, + 10, + 4 + ], + median: [ + 6, + 3, + 2, + 3 + ], + first: [1, 5], + last: [ + 1, + 3, + 1, + 3, + 8, + 3 + ], + consumption: [10, 4], + transition_count: [10, 4], + state_duration: [2, 4], + state_percentage: [ + 2, + 4, + 10, + 4 + ], + event_count: [ + 6, + 3, + 2, + 3 + ] }; + function getAggregateDashPattern(operation) { + return DASH_PATTERNS[operation] ?? [6, 3]; + } //#endregion - //#region custom_components/hass_datapoints/src/cards/history/history.styles.ts - var styles$63 = i$5` - :host { - display: block; - height: 100%; - } - - ha-card { - height: 100%; - display: flex; - flex-direction: column; - overflow: hidden; - } - - .card-header { - margin: 0; - padding: 12px 16px 0; - font-size: 24px; - font-weight: 400; - line-height: 48px; - color: var(--primary-text-color); - flex: 0 0 auto; - display: flex; - justify-content: space-between; - gap: 8px; - } - - .card-header-title { - min-width: 0; - font: inherit; - line-height: inherit; - font-weight: inherit; - } - - .card-header-action { - display: inline-flex; - align-items: center; - justify-content: center; - flex: 0 0 auto; - align-self: center; - } - - hass-datapoints-history-chart { - flex: 1 1 auto; - min-height: 0; - } -`; + //#region custom_components/hass_datapoints/src/lib/chart/chart-aggregates.ts + var UNKNOWN_STATES = /* @__PURE__ */ new Set(["unknown", "unavailable"]); + /** Append the cumulative marker so the legend tells totals from per-period bars. */ + function withCumulativeSuffix(definition, label) { + return definition.mode === "cumulative" ? `${label} · ${msg("Cumulative")}` : label; + } + /** Coverage flags and tooltip notes for each plotted period. */ + function periodDetails(valued, reasonNotes) { + return { + periodFlags: valued.map((p) => ({ + partial: p.partial, + incomplete: p.incomplete + })), + periodNotes: valued.map((p) => [ + p.partial ? msg("Partial period") : "", + p.incomplete ? msg("Incomplete history") : "", + reasonNotes ? reasonNotes(p.reasons) : "" + ].filter(Boolean).join(", ")) + }; + } + function getAggregateSeriesId(entityId, definitionId) { + return `aggregate:${entityId}:${definitionId}`; + } + /** Spans where a known (not unknown/unavailable) state was recorded. */ + function buildCoverage(samples, range) { + const sorted = [...samples].sort((a, b) => a.time - b.time); + const coverage = []; + let seed; + const inRange = []; + for (const sample of sorted) if (sample.time <= range.start) seed = sample; + else if (sample.time < range.end) inRange.push(sample); + const points = seed ? [{ + ...seed, + time: range.start + }, ...inRange] : inRange; + points.forEach((point, i) => { + if (!point.state || UNKNOWN_STATES.has(point.state)) return; + const end = i + 1 < points.length ? points[i + 1].time : range.end; + if (end > point.time) coverage.push({ + start: point.time, + end + }); + }); + return coverage; + } + function describe(definition, stateLabel) { + const kind = getBinaryAggregateKind(definition); + const kindLabel = msg(BINARY_AGGREGATE_KINDS.find((k) => k.value === kind)?.label ?? kind); + return `${msg(AGGREGATE_INTERVAL_OPTIONS.find((o) => o.value === definition.interval)?.label ?? definition.interval)} · ${kindLabel}${kind === "all_changes" ? "" : ` (${stateLabel})`}`; + } + /** + * Calculate every configured aggregate for a binary row and shape the results + * as chart series. Periods with no known history have no bar (never zero). + */ + function buildBinaryAggregateSeries(args) { + const samples = args.stateList.map((entry) => ({ + time: Math.round(entry.lu * 1e3), + state: entry.s + })); + const coverage = buildCoverage(samples, args.range); + const stateOptions = getBinaryStateOptions(args.deviceClass); + return args.definitions.filter((definition) => definition.visible !== false).flatMap((definition) => { + const result = calculateAggregate({ + definition, + samples, + range: args.range, + zoom: args.zoom, + timeZone: args.timeZone, + coverage + }); + const valued = result.points.filter((p) => typeof p.value === "number" && Number.isFinite(p.value)); + const pts = valued.map((p) => [(p.start + p.end) / 2, p.value]); + if (!pts.length) return []; + const stateValue = definition.states?.[0] ?? stateOptions[0].value; + const stateLabel = msg(stateOptions.find((o) => o.value === stateValue)?.label ?? stateValue); + const id = getAggregateSeriesId(args.entityId, definition.id); + return [{ + entityId: id, + legendEntityId: id, + sourceEntityId: args.entityId, + definitionId: definition.id, + label: definition.label || withCumulativeSuffix(definition, `${args.entityLabel} · ${describe(definition, stateLabel)}`), + unit: result.unit, + pts, + periods: valued.map((p) => ({ + start: p.start, + end: p.end + })), + ...periodDetails(valued), + color: definition.color || args.color, + dashPattern: getAggregateDashPattern(definition.operation), + axisKey: `aggregate:${result.unit || "count"}`, + bars: result.presentation === "bar", + result + }]; + }); + } + /** Aggregate numeric history into per-period measurement summaries (lines). */ + function buildMeasurementAggregateSeries(args) { + const samples = args.stateList.flatMap((entry) => { + const value = parseFloat(entry.s); + return Number.isNaN(value) ? [] : [{ + time: Math.round(entry.lu * 1e3), + value + }]; + }); + if (!samples.length) return []; + return args.definitions.filter((definition) => definition.visible !== false && isMeasurementOperation(definition.operation)).flatMap((definition) => { + const result = calculateAggregate({ + definition, + samples, + range: args.range, + zoom: args.zoom, + timeZone: args.timeZone, + unit: args.unit, + coverage: [args.range] + }); + const valued = result.points.filter((p) => typeof p.value === "number" && Number.isFinite(p.value)); + if (!valued.length) return []; + const operationLabel = msg(MEASUREMENT_OPERATIONS.find((o) => o.value === definition.operation)?.label ?? definition.operation); + const intervalLabel = msg(AGGREGATE_INTERVAL_OPTIONS.find((o) => o.value === definition.interval)?.label ?? definition.interval); + const id = getAggregateSeriesId(args.entityId, definition.id); + return [{ + entityId: id, + legendEntityId: id, + sourceEntityId: args.entityId, + definitionId: definition.id, + label: definition.label || withCumulativeSuffix(definition, `${args.entityLabel} · ${intervalLabel} · ${operationLabel}`), + unit: args.unit, + pts: valued.map((p) => [(p.start + p.end) / 2, p.value]), + periods: valued.map((p) => ({ + start: p.start, + end: p.end + })), + ...periodDetails(valued), + color: definition.color || args.color, + dashPattern: getAggregateDashPattern(definition.operation), + axisKey: args.axisKey, + bars: result.presentation === "bar", + result + }]; + }); + } + /** + * Turn an event entity's recorded states into occurrences. The state value is + * the event timestamp and `event_type` is an attribute. States at or before the + * range start are the initial snapshot, not events that happened in range. + */ + function extractEventSamples(states, range) { + return states.flatMap((entry) => { + const raw = entry.s ?? entry.state; + if (raw === void 0 || UNKNOWN_STATES.has(raw)) return []; + const eventType = (entry.a ?? entry.attributes)?.event_type; + if (typeof eventType !== "string" || !eventType) return []; + const recordedAt = typeof entry.lu === "number" ? entry.lu * 1e3 : Date.parse(entry.last_updated ?? ""); + const parsed = Date.parse(raw); + const eventTime = Number.isFinite(parsed) ? parsed : recordedAt; + if (!Number.isFinite(eventTime)) return []; + return [{ + time: Number.isFinite(recordedAt) ? recordedAt : eventTime, + eventTime, + eventType, + boundary: Number.isFinite(recordedAt) && recordedAt <= range.start + }]; + }); + } + /** Count event occurrences per calendar period as bars (or cumulative lines). */ + function buildEventAggregateSeries(args) { + if (!args.states.length) return []; + const samples = extractEventSamples(args.states, args.range); + return args.definitions.filter((definition) => definition.visible !== false && definition.operation === "event_count").flatMap((definition) => { + const result = calculateAggregate({ + definition, + samples, + range: args.range, + zoom: args.zoom, + timeZone: args.timeZone, + coverage: [args.range] + }); + const valued = result.points.filter((p) => typeof p.value === "number" && Number.isFinite(p.value)); + if (!valued.length) return []; + const intervalLabel = msg(AGGREGATE_INTERVAL_OPTIONS.find((o) => o.value === definition.interval)?.label ?? definition.interval); + const typesLabel = definition.eventTypes?.length ? definition.eventTypes.join(", ") : msg("All event types"); + const id = getAggregateSeriesId(args.entityId, definition.id); + return [{ + entityId: id, + legendEntityId: id, + sourceEntityId: args.entityId, + definitionId: definition.id, + label: definition.label || withCumulativeSuffix(definition, `${args.entityLabel} · ${intervalLabel} · ${typesLabel}`), + unit: result.unit, + pts: valued.map((p) => [(p.start + p.end) / 2, p.value]), + periods: valued.map((p) => ({ + start: p.start, + end: p.end + })), + ...periodDetails(valued), + color: definition.color || args.color, + dashPattern: getAggregateDashPattern(definition.operation), + axisKey: `aggregate:${result.unit || "count"}`, + bars: result.presentation === "bar", + result + }]; + }); + } + var STATISTICS_PERIOD_MS = 36e5; + function describeConsumptionReasons(reasons) { + const notes = []; + if (reasons.includes("reset")) notes.push(msg("Meter reset detected")); + if (reasons.includes("ambiguous-reset")) notes.push(msg("Ambiguous meter reset, not counted")); + return notes.join(", "); + } + /** + * Consumption per period for total / total_increasing meters. Statistics + * `change` is used where HA has compiled it; raw readings cover the rest. + */ + function buildConsumptionAggregateSeries(args) { + const readings = args.readings.flatMap((entry) => { + const value = parseFloat(entry.s); + return Number.isNaN(value) ? [] : [{ + time: Math.round(entry.lu * 1e3), + value + }]; + }); + const changeSamples = args.changes.map((entry) => ({ + time: entry.time, + change: entry.change + })); + let samples; + if (changeSamples.length) { + const cutoff = changeSamples[changeSamples.length - 1].time + STATISTICS_PERIOD_MS; + const before = readings.filter((r) => r.time < cutoff); + const seed = before[before.length - 1]; + samples = [ + ...changeSamples, + ...seed ? [seed] : [], + ...readings.filter((r) => r.time >= cutoff) + ]; + } else samples = readings; + if (!samples.length) return []; + return args.definitions.filter((definition) => definition.visible !== false && definition.operation === "consumption").flatMap((definition) => { + const result = calculateAggregate({ + definition, + samples, + range: args.range, + zoom: args.zoom, + timeZone: args.timeZone, + stateClass: args.stateClass, + unit: args.unit, + coverage: [args.range] + }); + const valued = result.points.filter((p) => typeof p.value === "number" && Number.isFinite(p.value)); + if (!valued.length) return []; + const intervalLabel = msg(AGGREGATE_INTERVAL_OPTIONS.find((o) => o.value === definition.interval)?.label ?? definition.interval); + const id = getAggregateSeriesId(args.entityId, definition.id); + return [{ + entityId: id, + legendEntityId: id, + sourceEntityId: args.entityId, + definitionId: definition.id, + label: definition.label || withCumulativeSuffix(definition, `${args.entityLabel} · ${intervalLabel} · ${msg("Consumption")}`), + unit: args.unit, + pts: valued.map((p) => [(p.start + p.end) / 2, p.value]), + periods: valued.map((p) => ({ + start: p.start, + end: p.end + })), + ...periodDetails(valued, describeConsumptionReasons), + color: definition.color || args.color, + dashPattern: getAggregateDashPattern(definition.operation), + axisKey: `aggregate:${args.unit || "count"}`, + bars: result.presentation === "bar", + result + }]; + }); + } //#endregion //#region custom_components/hass_datapoints/src/cards/history/data/downsampling.ts /** @@ -8647,6 +9835,24 @@ merged.sort((a, b) => a.lu - b.lu); return merged; } + /** + * Per-period consumption from HA cumulative statistics (`change`). Entities + * without cumulative statistics yield an empty list. + */ + function normalizeStatisticsChanges(entityId, statsData) { + const statEntries = statsData && typeof statsData === "object" ? statsData[entityId] ?? [] : []; + return (Array.isArray(statEntries) ? statEntries : []).flatMap((entry) => { + const change = Number(entry?.change); + const raw = entry?.start; + let time; + if (typeof raw === "number") time = raw > 1e11 ? raw : raw * 1e3; + else time = new Date(raw).getTime(); + return entry?.change == null || !Number.isFinite(change) || !Number.isFinite(time) ? [] : [{ + time: Math.round(time), + change + }]; + }).sort((a, b) => a.time - b.time); + } //#endregion //#region custom_components/hass_datapoints/src/cards/history/data/axis-extent.ts /** @@ -9181,7 +10387,33 @@ const top = Math.min(y, baselineY); const height = Math.max(1, Math.abs(baselineY - y)); const left = x - barWidth / 2; + const style = options.pointStyles?.[i]; + if (style?.partial) ctx.fillStyle = hexToRgba(color, fillAlpha * .5); + else ctx.fillStyle = hexToRgba(color, fillAlpha); ctx.fillRect(left, top, barWidth, height); + if (style?.incomplete) { + ctx.save(); + ctx.beginPath(); + ctx.rect(left, top, barWidth, height); + ctx.clip(); + ctx.strokeStyle = color; + ctx.lineWidth = 1; + ctx.beginPath(); + for (let d = -height; d < barWidth; d += 5) { + ctx.moveTo(left + d, top + height); + ctx.lineTo(left + d + height, top); + } + ctx.stroke(); + ctx.restore(); + } + if (style?.partial || style?.incomplete) { + ctx.save(); + ctx.setLineDash(style.partial ? [4, 3] : [1, 2]); + ctx.strokeStyle = color; + ctx.lineWidth = 1; + ctx.strokeRect(left + .5, top + .5, barWidth - 1, height - 1); + ctx.restore(); + } } ctx.restore(); } @@ -10203,7 +11435,7 @@ if (anomalyTooltip) anomalyTooltip.style.display = "none"; clearAnnotationTooltips(card); } - function resolveTooltipSeriesLabel(entry) { + function resolveBaseTooltipSeriesLabel(entry) { const isSubordinate = entry.grouped === true && entry.rawVisible === true; const isComparisonDerived = entry.comparisonDerived === true && entry.grouped === true; if (entry.comparison === true) { @@ -10238,6 +11470,10 @@ } return String(entry.label || ""); } + function resolveTooltipSeriesLabel(entry) { + const label = resolveBaseTooltipSeriesLabel(entry); + return entry.periodLabel ? `${label} (${entry.periodLabel})` : label; + } function showLineChartTooltip(card, hover, clientX, clientY) { const root = getRoot(card); const tooltip = root.getElementById("tooltip"); @@ -10716,18 +11952,33 @@ const rawTimeMs = t0 + ratio * (t1 - t0); const timeMs = resolveLineChartHoverTime(resolvedSeries, rawTimeMs, options.hoverSnapMode || "follow_series"); const x = renderer.xOf(timeMs, t0, t1); + const resolveSeriesValue = (seriesItem) => { + if (!seriesItem.periods) return { value: renderer._interpolateValue(seriesItem.pts || [], timeMs, seriesItem.stepped) }; + const index = seriesItem.periods.findIndex((period) => timeMs >= period.start && timeMs < period.end); + if (index === -1) return { value: null }; + const point = seriesItem.pts?.[index]; + const { start, end } = (seriesItem.labelPeriods ?? seriesItem.periods)[index]; + const note = seriesItem.periodNotes?.[index]; + return { + value: point ? point[1] : null, + periodLabel: `${formatTooltipDateTimeFromMs(start)} – ${formatTooltipDateTimeFromMs(end)}${note ? ` · ${note}` : ""}` + }; + }; const values = resolvedSeries.map((seriesItem) => { - const value = renderer._interpolateValue(seriesItem.pts || [], timeMs, seriesItem.stepped); + const { value, periodLabel } = resolveSeriesValue(seriesItem); const axis = resolveHoverAxis(seriesItem); - return buildHoverValueEntry(seriesItem, value, axis, {}, { + return buildHoverValueEntry(seriesItem, value, axis, periodLabel ? { periodLabel } : {}, { includePosition: value != null, x }); }); const comparisonValues = comparisonSeries.map((seriesItem) => { - const value = renderer._interpolateValue(seriesItem.pts || [], timeMs, seriesItem.stepped); + const { value, periodLabel } = resolveSeriesValue(seriesItem); const axis = resolveHoverAxis(seriesItem); - return buildHoverValueEntry(seriesItem, value, axis, { comparison: true }, { + return buildHoverValueEntry(seriesItem, value, axis, { + comparison: true, + ...periodLabel ? { periodLabel } : {} + }, { includePosition: value != null, x }); @@ -11349,6 +12600,93 @@ no_attributes: options.no_attributes !== false })); } + /** + * Like {@link fetchHistoryDuringPeriod}, but keeps state attributes for HA + * `event.*` entities (their `event_type` attribute is what event counting + * needs). Every other entity keeps the lean `no_attributes` request. + */ + async function fetchHistoryWithEventAttributes(hass, startTime, endTime, entityIds, options = {}) { + const ids = normalizeCacheIdList(entityIds); + const eventIds = ids.filter((id) => id.startsWith("event.")); + if (!eventIds.length) return await fetchHistoryDuringPeriod(hass, startTime, endTime, ids, options); + const otherIds = ids.filter((id) => !id.startsWith("event.")); + const [others, events] = await Promise.all([otherIds.length ? fetchHistoryDuringPeriod(hass, startTime, endTime, otherIds, options) : Promise.resolve({}), fetchHistoryDuringPeriod(hass, startTime, endTime, eventIds, { + ...options, + no_attributes: false + })]); + return { + ...others, + ...events + }; + } + //#endregion + //#region custom_components/hass_datapoints/src/lib/domain/aggregation/types.ts + var AGGREGATE_OPERATIONS = [ + "mean", + "min", + "max", + "median", + "first", + "last", + "consumption", + "transition_count", + "state_duration", + "state_percentage", + "event_count" + ]; + var AGGREGATE_INTERVALS = [ + "minute", + "15min", + "30min", + "hour", + "day", + "week", + "month" + ]; + //#endregion + //#region custom_components/hass_datapoints/src/lib/domain/aggregation/aggregation.ts + function normalizeAggregateDefinitions(value) { + if (!Array.isArray(value)) return []; + const ids = /* @__PURE__ */ new Set(); + return value.flatMap((item) => { + if (!item || typeof item !== "object" || typeof item.id !== "string" || !item.id || ids.has(item.id) || !AGGREGATE_OPERATIONS.includes(item.operation) || !AGGREGATE_INTERVALS.includes(item.interval)) return []; + ids.add(item.id); + const definition = { + id: item.id, + operation: item.operation, + interval: item.interval, + mode: item.mode === "cumulative" && [ + "consumption", + "transition_count", + "state_duration", + "event_count" + ].includes(item.operation) ? "cumulative" : "interval", + resetOnZoom: item.resetOnZoom === true + }; + for (const key of ["states", "eventTypes"]) if (Array.isArray(item[key])) definition[key] = [...new Set(item[key].filter((v) => typeof v === "string" && v.length > 0))]; + for (const key of ["color", "label"]) if (typeof item[key] === "string") definition[key] = item[key]; + if (typeof item.visible === "boolean") definition.visible = item.visible; + return [definition]; + }); + } + function getAggregateOperations(entity) { + if (entity.entity_id.startsWith("event.")) return ["event_count"]; + if (entity.entity_id.startsWith("binary_sensor.") || entity.state !== void 0 && !["unknown", "unavailable"].includes(entity.state) && !Number.isFinite(Number(entity.state))) return [ + "transition_count", + "state_duration", + "state_percentage" + ]; + const operations = [ + "mean", + "min", + "max", + "median", + "first", + "last" + ]; + if (["total", "total_increasing"].includes(String(entity.attributes?.state_class))) operations.push("consumption"); + return operations; + } //#endregion //#region custom_components/hass_datapoints/src/lib/anomaly-direction.ts var DEFAULT_ANOMALY_DIRECTION = "both"; @@ -11427,6 +12765,7 @@ function normalizeHistorySeriesAnalysis(analysis) { const source = analysis && typeof analysis === "object" ? analysis : {}; return { + ...Array.isArray(source.aggregates) ? { aggregates: normalizeAggregateDefinitions(source.aggregates) } : {}, expanded: source.expanded === true, show_trend_lines: source.show_trend_lines === true, trend_method: [ @@ -12472,7 +13811,7 @@ }; } function seriesHasActiveAnalysis(analysis, hasSelectedComparisonWindow = false) { - return !!(analysis.show_trend_lines || analysis.show_summary_stats || analysis.show_rate_of_change || analysis.show_threshold_analysis || analysis.show_anomalies || analysis.show_delta_analysis && hasSelectedComparisonWindow); + return !!(analysis.show_trend_lines || analysis.show_summary_stats || analysis.show_rate_of_change || analysis.show_threshold_analysis || analysis.show_anomalies || analysis.show_delta_analysis && hasSelectedComparisonWindow || (analysis.aggregates?.length ?? 0) > 0); } function seriesShouldHideSource(analysis, hasSelectedComparisonWindow = false) { return analysis.hide_source_series === true && seriesHasActiveAnalysis(analysis, hasSelectedComparisonWindow); @@ -13006,7 +14345,7 @@ } //#endregion //#region custom_components/hass_datapoints/src/cards/history/history-chart/history-chart.styles.ts - var styles$62 = ` + var styles$63 = ` hass-datapoints-history-chart { position: relative; display: flex; @@ -13420,6 +14759,16 @@ background: color-mix(in srgb, var(--primary-color, #03a9f4) 18%, var(--card-background-color, #fff)); outline: none; } + .aggregate-note { + padding: var(--dp-spacing-xs, 4px) var(--dp-spacing-md); + padding-left: calc(var(--dp-spacing-md) + var(--dp-chart-axis-left-width, 0px)); + font-size: 0.74em; + color: var(--secondary-text-color); + border-top: 1px solid color-mix(in srgb, var(--divider-color, rgba(0, 0, 0, 0.12)) 88%, transparent); + } + .aggregate-note[hidden] { + display: none; + } .legend { display: flex; flex-wrap: nowrap; @@ -13654,6 +15003,18 @@ var HISTORY_CHART_MAX_ZOOM_MULTIPLIER = 365; var HISTORY_CHART_BINARY_LANE_HEIGHT_PX = 22; var HISTORY_CHART_BINARY_LANE_GAP_PX = 6; + /** + * Aggregate lines are drawn in the source colour; their dash pattern (per + * aggregation type) tells them apart. Non-aggregate series get no extra style. + */ + function aggregateLineStyle(series) { + if (!series.periodFlags || series.bars === true) return {}; + return { + aggregateLine: true, + dashed: true, + dashPattern: series.dashPattern + }; + } var HistoryChart$1 = class extends HTMLElement { constructor(..._args) { super(..._args); @@ -13931,7 +15292,7 @@ connectedCallback() { this.style.cssText = "position:relative;display:flex;flex-direction:column;height:100%;min-height:0;padding:var(--dp-spacing-sm,8px) var(--dp-spacing-md,12px) var(--dp-spacing-md,12px);box-sizing:border-box;overflow:visible;isolation:isolate;z-index:3;"; if (this.querySelector("#chart")) return; - this.innerHTML = ` + this.innerHTML = `
@@ -13984,6 +15345,7 @@
+
`; } disconnectedCallback() { @@ -14254,6 +15616,25 @@ _normalizeStatisticsHistory(entityId, statsData) { return normalizeStatisticsHistory(entityId, statsData); } + /** + * Plain-text explanation of the partial/incomplete markers and of the limits + * of retained history, so the indicators do not rely on colour or shape alone. + */ + _renderAggregateNote(series) { + const noteEl = this.querySelector("#aggregate-note"); + if (!noteEl) return; + const aggregates = series.filter((item) => item.definitionId && item.result); + const flagged = aggregates.some((item) => item.bars && item.periodFlags?.some((flag) => flag.partial || flag.incomplete)); + const hasCounts = aggregates.some((item) => ["transition_count", "event_count"].includes(item.result.points.length ? this._aggregateOperationOf(item) : "")); + const lines = []; + if (flagged) lines.push(msg("Dashed outlines mark partial periods cut by the selected range; hatched or dotted marks show periods with gaps in recorded history.")); + if (hasCounts) lines.push(msg("Counts only include activity in retained history; earlier activity is not shown.")); + D(b`${lines.map((line) => b`
${line}
`)}`, noteEl); + noteEl.hidden = lines.length === 0; + } + _aggregateOperationOf(item) { + return (this._seriesSettings.find((row) => row.entity_id === item.sourceEntityId)?.analysis?.aggregates?.find((d) => d.id === item.definitionId))?.operation ?? ""; + } /** Render legend items for the given series, binary backgrounds and rows. */ _renderLegend(series, binaryBackgrounds, binaryRows = []) { const legendEl = this.querySelector("#legend"); @@ -14270,7 +15651,7 @@ - ${this._supportsAnalysis && this.analysis?.expanded ? b` + ${this._supportsAnalysis && !this._isEvent && this.analysis?.expanded ? b`
${msg("Stepped series")} +
` : A} + ${this._isEvent && expanded ? b` +
+
+ +
+
+ ` : A} ${hasBinaryDisplayOption && expanded ? b`
@@ -23831,13 +25740,32 @@ @dp-change=${this._onBinaryDisplayChange} > + +
+ +
` : A}
`; } - }, _defineProperty(_TargetRow, "styles", styles$39), _TargetRow); + }, _defineProperty(_TargetRow, "styles", styles$40), _TargetRow); __decorate([n$1({ type: String })], TargetRow.prototype, "color", null); __decorate([n$1({ type: Boolean })], TargetRow.prototype, "visible", null); __decorate([n$1({ type: Object })], TargetRow.prototype, "analysis", null); diff --git a/custom_components/hass_datapoints/src/cards/history/data/__tests__/statistics-normalization.spec.ts b/custom_components/hass_datapoints/src/cards/history/data/__tests__/statistics-normalization.spec.ts index 64c71edb..255dd75a 100644 --- a/custom_components/hass_datapoints/src/cards/history/data/__tests__/statistics-normalization.spec.ts +++ b/custom_components/hass_datapoints/src/cards/history/data/__tests__/statistics-normalization.spec.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; import { mergeNumericHistoryWithStatistics, + normalizeStatisticsChanges, normalizeStatisticsHistory, } from "../statistics-normalization"; @@ -51,3 +52,34 @@ describe("data/statistics-normalization", () => { }); }); }); + +describe("normalizeStatisticsChanges", () => { + describe("GIVEN statistics with change, missing change and an ISO start", () => { + it("THEN keeps valid changes in time order with start times in ms", () => { + expect.assertions(1); + expect( + normalizeStatisticsChanges("sensor.energy", { + "sensor.energy": [ + { start: 1_700_003_600_000, change: 2 }, + { start: 1_700_000_000, change: "1.5" }, + { start: 1_700_007_200_000, change: null }, + { start: "2023-11-14T22:13:20.000Z", change: 4 }, + ], + }) + ).toStrictEqual([ + { time: 1_700_000_000_000, change: 1.5 }, + { time: 1_700_000_000_000, change: 4 }, + { time: 1_700_003_600_000, change: 2 }, + ]); + }); + }); + + describe("GIVEN an entity without cumulative statistics", () => { + it("THEN returns an empty list", () => { + expect.assertions(1); + expect( + normalizeStatisticsChanges("sensor.none", { "sensor.other": [] }) + ).toStrictEqual([]); + }); + }); +}); diff --git a/custom_components/hass_datapoints/src/cards/history/data/statistics-normalization.ts b/custom_components/hass_datapoints/src/cards/history/data/statistics-normalization.ts index e28fe0d0..78e47fb6 100644 --- a/custom_components/hass_datapoints/src/cards/history/data/statistics-normalization.ts +++ b/custom_components/hass_datapoints/src/cards/history/data/statistics-normalization.ts @@ -71,3 +71,41 @@ export function mergeNumericHistoryWithStatistics( merged.sort((a, b) => a.lu - b.lu); return merged; } + +export interface StatisticsChangeEntry { + /** Start of the statistics period, in ms. */ + time: number; + /** Consumption during the period (HA `change`). */ + change: number; +} + +/** + * Per-period consumption from HA cumulative statistics (`change`). Entities + * without cumulative statistics yield an empty list. + */ +export function normalizeStatisticsChanges( + entityId: string, + statsData: unknown +): StatisticsChangeEntry[] { + const statEntries = + statsData && typeof statsData === "object" + ? ((statsData as RecordWithUnknownValues)[entityId] ?? []) + : []; + return (Array.isArray(statEntries) ? (statEntries as HaStatEntry[]) : []) + .flatMap((entry) => { + const change = Number(entry?.change); + const raw = entry?.start; + let time: number; + if (typeof raw === "number") { + time = raw > 1e11 ? raw : raw * 1000; + } else { + time = new Date(raw as string).getTime(); + } + return entry?.change == null || + !Number.isFinite(change) || + !Number.isFinite(time) + ? [] + : [{ time: Math.round(time), change }]; + }) + .sort((a, b) => a.time - b.time); +} diff --git a/custom_components/hass_datapoints/src/cards/history/data/types.ts b/custom_components/hass_datapoints/src/cards/history/data/types.ts index 126028c9..0c1e757a 100644 --- a/custom_components/hass_datapoints/src/cards/history/data/types.ts +++ b/custom_components/hass_datapoints/src/cards/history/data/types.ts @@ -10,12 +10,17 @@ export interface HaStateEntry { last_changed?: string; last_updated?: string; entity_id?: string; + /** State attributes; only present when requested (e.g. event entities). */ + a?: Record; + attributes?: Record; } /** Normalised statistics entry returned by the HA statistics API. */ export interface HaStatEntry { start?: number | string; mean?: Nullable; + sum?: Nullable; + change?: Nullable; } /** Internal intermediate state record used during normalisation. */ diff --git a/custom_components/hass_datapoints/src/cards/history/history-chart/history-chart.styles.ts b/custom_components/hass_datapoints/src/cards/history/history-chart/history-chart.styles.ts index ed96ba57..e18ff7a8 100644 --- a/custom_components/hass_datapoints/src/cards/history/history-chart/history-chart.styles.ts +++ b/custom_components/hass_datapoints/src/cards/history/history-chart/history-chart.styles.ts @@ -412,6 +412,16 @@ export const styles = ` background: color-mix(in srgb, var(--primary-color, #03a9f4) 18%, var(--card-background-color, #fff)); outline: none; } + .aggregate-note { + padding: var(--dp-spacing-xs, 4px) var(--dp-spacing-md); + padding-left: calc(var(--dp-spacing-md) + var(--dp-chart-axis-left-width, 0px)); + font-size: 0.74em; + color: var(--secondary-text-color); + border-top: 1px solid color-mix(in srgb, var(--divider-color, rgba(0, 0, 0, 0.12)) 88%, transparent); + } + .aggregate-note[hidden] { + display: none; + } .legend { display: flex; flex-wrap: nowrap; diff --git a/custom_components/hass_datapoints/src/cards/history/history-chart/history-chart.ts b/custom_components/hass_datapoints/src/cards/history/history-chart/history-chart.ts index f28a2593..b2156aaf 100644 --- a/custom_components/hass_datapoints/src/cards/history/history-chart/history-chart.ts +++ b/custom_components/hass_datapoints/src/cards/history/history-chart/history-chart.ts @@ -10,11 +10,22 @@ */ import { html, render } from "lit"; +import { + buildBinaryAggregateSeries, + buildConsumptionAggregateSeries, + buildEventAggregateSeries, + buildMeasurementAggregateSeries, + type AggregateChartSeries, +} from "@/lib/chart/chart-aggregates"; +import type { AggregateDefinition } from "@/lib/domain/aggregation/types"; import { msg } from "@/lib/i18n/localize"; import { binaryOffLabel, binaryOnLabel, getAxisValueExtent, + getHistoryStatesForEntity, + normalizeNumericHistory, + normalizeStatisticsChanges, normalizeStatisticsHistory, SAMPLE_INTERVAL_MS, } from "../history-data"; @@ -230,6 +241,25 @@ export interface HistoryChartViewModel { // ── Component ───────────────────────────────────────────────────────────────── +/** + * Aggregate lines are drawn in the source colour; their dash pattern (per + * aggregation type) tells them apart. Non-aggregate series get no extra style. + */ +function aggregateLineStyle(series: { + periodFlags?: unknown; + dashPattern?: number[]; + bars?: boolean; +}): RecordWithUnknownValues { + if (!series.periodFlags || series.bars === true) { + return {}; + } + return { + aggregateLine: true, + dashed: true, + dashPattern: series.dashPattern, + }; +} + export class HistoryChart extends HTMLElement { // ── No shadow DOM ─────────────────────────────────────────────────────────── // Renders synchronously into its own children so the canvas and legend are @@ -300,6 +330,7 @@ export class HistoryChart extends HTMLElement {
+
`; } @@ -862,6 +893,62 @@ export class HistoryChart extends HTMLElement { return normalizeStatisticsHistory(entityId, statsData); } + /** + * Plain-text explanation of the partial/incomplete markers and of the limits + * of retained history, so the indicators do not rely on colour or shape alone. + */ + _renderAggregateNote(series: unknown[]): void { + const noteEl = this.querySelector( + "#aggregate-note" + ) as Nullable; + if (!noteEl) { + return; + } + const aggregates = (series as AggregateChartSeries[]).filter( + (item) => item.definitionId && item.result + ); + // Only bars carry the dashed/hatched markers; lines report partial and + // incomplete periods in their tooltips. + const flagged = aggregates.some( + (item) => + item.bars && + item.periodFlags?.some((flag) => flag.partial || flag.incomplete) + ); + const hasCounts = aggregates.some((item) => + ["transition_count", "event_count"].includes( + item.result.points.length ? this._aggregateOperationOf(item) : "" + ) + ); + const lines: string[] = []; + if (flagged) { + lines.push( + msg( + "Dashed outlines mark partial periods cut by the selected range; hatched or dotted marks show periods with gaps in recorded history." + ) + ); + } + if (hasCounts) { + lines.push( + msg( + "Counts only include activity in retained history; earlier activity is not shown." + ) + ); + } + render(html`${lines.map((line) => html`
${line}
`)}`, noteEl); + noteEl.hidden = lines.length === 0; + } + + _aggregateOperationOf(item: AggregateChartSeries): string { + const rows = this._seriesSettings as Array<{ + entity_id: string; + analysis?: { aggregates?: AggregateDefinition[] }; + }>; + const definition = rows + .find((row) => row.entity_id === item.sourceEntityId) + ?.analysis?.aggregates?.find((d) => d.id === item.definitionId); + return definition?.operation ?? ""; + } + /** Render legend items for the given series, binary backgrounds and rows. */ _renderLegend( series: unknown[], @@ -886,7 +973,9 @@ export class HistoryChart extends HTMLElement { this._updateLegendLayout(legendEl); render( html`${allItems.map((item) => { - const hidden = this._hiddenSeries?.has(item.entityId); + const hidden = this._hiddenSeries + ? this._isSeriesHidden(item as { entityId: string }) + : false; return html`
- ${this._supportsAnalysis && this.analysis?.expanded + ${this._supportsAnalysis && !this._isEvent && this.analysis?.expanded ? html`
@@ -409,6 +421,17 @@ export class TargetRow extends LitElement { /> ${msg("Stepped series")} + ` : nothing} + ${this._isEvent && expanded + ? html` +
+
+ +
+
+ ` + : nothing} ${hasBinaryDisplayOption && expanded ? html`
@@ -506,6 +548,30 @@ export class TargetRow extends LitElement { @dp-change=${this._onBinaryDisplayChange} > + +
+ +
` diff --git a/custom_components/hass_datapoints/src/molecules/target-row/types.ts b/custom_components/hass_datapoints/src/molecules/target-row/types.ts index f67628cf..b870b91b 100644 --- a/custom_components/hass_datapoints/src/molecules/target-row/types.ts +++ b/custom_components/hass_datapoints/src/molecules/target-row/types.ts @@ -1,8 +1,10 @@ +import type { AggregateDefinition } from "@/lib/domain/aggregation/types"; // --------------------------------------------------------------------------- // Shared types for target-row and related components // --------------------------------------------------------------------------- export interface NormalizedAnalysis { + aggregates?: AggregateDefinition[]; expanded: boolean; show_trend_lines: boolean; trend_method: string; diff --git a/custom_components/hass_datapoints/src/panels/datapoints/__tests__/datapoints-url-sync.spec.ts b/custom_components/hass_datapoints/src/panels/datapoints/__tests__/datapoints-url-sync.spec.ts index 716be21a..5b2f829b 100644 --- a/custom_components/hass_datapoints/src/panels/datapoints/__tests__/datapoints-url-sync.spec.ts +++ b/custom_components/hass_datapoints/src/panels/datapoints/__tests__/datapoints-url-sync.spec.ts @@ -108,3 +108,69 @@ describe("HassDatapointsHistoryPanel URL sync", () => { }); }); }); + +describe("datapoints panel aggregate series", () => { + const agg = (id: string, operation: string) => ({ + id, + operation, + interval: "day", + mode: "interval", + states: ["on"], + resetOnZoom: false, + }); + const makePanel = (analysis: unknown) => ({ + _seriesRows: [ + { + entity_id: "binary_sensor.door", + color: "#03a9f4", + visible: true, + analysis: normalizeHistorySeriesAnalysis(analysis), + }, + ], + _saveSessionState: vi.fn(), + _updateUrl: vi.fn(), + _renderTargetRows: vi.fn(), + _renderSidebarOptions: vi.fn(), + _renderContent: vi.fn(), + }); + const setAggregates = (panel: ReturnType, value: unknown) => + HassDatapointsHistoryPanel.prototype._setSeriesAnalysisOption.call( + panel, + "binary_sensor.door", + "aggregates", + value + ); + + describe("GIVEN a binary row with no aggregates", () => { + describe("WHEN two independent aggregates are added", () => { + it("THEN both are stored, the session saved and the chart re-rendered", () => { + expect.assertions(3); + const panel = makePanel(null); + setAggregates(panel, [ + agg("a1", "transition_count"), + agg("a2", "state_duration"), + ]); + expect( + panel._seriesRows[0].analysis.aggregates?.map((d) => d.operation) + ).toStrictEqual(["transition_count", "state_duration"]); + expect(panel._saveSessionState).toHaveBeenCalledTimes(1); + expect(panel._renderContent).toHaveBeenCalledTimes(1); + }); + }); + }); + + describe("GIVEN a row hiding its source behind an aggregate", () => { + describe("WHEN the last aggregate is removed", () => { + it("THEN the stored hide preference is retained", () => { + expect.assertions(2); + const panel = makePanel({ + aggregates: [agg("a1", "transition_count")], + hide_source_series: true, + }); + setAggregates(panel, []); + expect(panel._seriesRows[0].analysis.aggregates).toStrictEqual([]); + expect(panel._seriesRows[0].analysis.hide_source_series).toBe(true); + }); + }); + }); +}); diff --git a/package.json b/package.json index 0df06627..6f80332b 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "lint": "pnpm run lint:eslint && pnpm run lint:package-json && pnpm run lint:prettier && pnpm run lint:types", "format": "pnpm run format:eslint && pnpm run format:prettier", "sb": "storybook dev -p 6006", - "sb:build": "storybook build" + "sb:build": "storybook build", + "prepare": "husky" }, "devDependencies": { "@chromatic-com/storybook": "5.1.1", @@ -61,6 +62,8 @@ "eslint-plugin-wc": "3.1.0", "globals": "17.4.0", "happy-dom": "20.8.9", + "husky": "9.1.7", + "lint-staged": "17.6.0", "mockdate": "3.0.5", "npm-package-json-lint": "10.4.0", "playwright": "1.58.2", @@ -87,5 +90,14 @@ "@lit/context": "1.1.6", "@lit/localize": "0.12.2", "lit": "3.3.2" + }, + "lint-staged": { + "custom_components/hass_datapoints/src/**/*.{js,ts}": [ + "eslint --fix --max-warnings=0", + "prettier --write" + ], + "*.{json,md,yaml,yml,css}": [ + "prettier --write" + ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf0cba91..dac564b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,7 +46,7 @@ importers: version: 10.3.3(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0)) "@storybook/addon-docs": specifier: 10.3.3 - version: 10.3.3(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + version: 10.3.3(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) "@storybook/addon-mcp": specifier: 0.5.0 version: 0.5.0(@storybook/addon-vitest@10.3.3(@vitest/browser-playwright@4.1.11)(@vitest/browser@4.1.11)(@vitest/runner@4.1.11)(react@19.3.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vitest@4.1.11))(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(typescript@5.9.3) @@ -58,13 +58,13 @@ importers: version: 8.6.15(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0)) "@storybook/web-components-vite": specifier: 10.3.3 - version: 10.3.3(esbuild@0.28.2)(lit@3.3.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + version: 10.3.3(esbuild@0.28.2)(lit@3.3.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) "@vitest/browser": specifier: 4.1.11 - version: 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))(vitest@4.1.11) + version: 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11) "@vitest/browser-playwright": specifier: 4.1.11 - version: 4.1.11(playwright@1.58.2)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))(vitest@4.1.11) + version: 4.1.11(playwright@1.58.2)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11) "@vitest/coverage-v8": specifier: 4.1.11 version: 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11) @@ -101,6 +101,12 @@ importers: happy-dom: specifier: 20.8.9 version: 20.8.9 + husky: + specifier: 9.1.7 + version: 9.1.7 + lint-staged: + specifier: 17.6.0 + version: 17.6.0 mockdate: specifier: 3.0.5 version: 3.0.5 @@ -124,10 +130,10 @@ importers: version: 8.58.1(eslint@10.4.0)(typescript@5.9.3) vite: specifier: 8.3.3 - version: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2) + version: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1) vitest: specifier: 4.1.11 - version: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + version: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) packages: "@adobe/css-tools@4.5.0": @@ -3313,6 +3319,14 @@ packages: integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, } + husky@9.1.7: + resolution: + { + integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==, + } + engines: { node: ">=18" } + hasBin: true + ignore@5.3.2: resolution: { @@ -3877,6 +3891,14 @@ packages: integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, } + lint-staged@17.6.0: + resolution: + { + integrity: sha512-nOhBfYkZEwkFtNzD5pK9s9LkcWoxJ+whLzEnhqi9nl7zTB5n7tg8+9iYgMGx2Wm3VlLu8cbNj0RACzY+nWi5iQ==, + } + engines: { node: ">=22.22.1" } + hasBin: true + lit-element@4.2.2: resolution: { @@ -4050,18 +4072,18 @@ packages: integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, } - mrmime@2.0.1: + mockdate@3.0.5: resolution: { - integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==, + integrity: sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==, } - engines: { node: ">=10" } - mockdate@3.0.5: + mrmime@2.0.1: resolution: { - integrity: sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==, + integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==, } + engines: { node: ">=10" } ms@2.1.3: resolution: @@ -4790,6 +4812,13 @@ packages: prettier: optional: true + string-argv@0.3.2: + resolution: + { + integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, + } + engines: { node: ">=0.6.19" } + string.prototype.includes@2.0.1: resolution: { @@ -5366,6 +5395,14 @@ packages: integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, } + yaml@2.9.1: + resolution: + { + integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==, + } + engines: { node: ">= 14.6" } + hasBin: true + yargs-parser@20.2.9: resolution: { @@ -5878,10 +5915,10 @@ snapshots: axe-core: 4.14.0 storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0) - "@storybook/addon-docs@10.3.3(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))": + "@storybook/addon-docs@10.3.3(@types/react@19.2.14)(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))": dependencies: "@mdx-js/react": 3.1.1(@types/react@19.2.14)(react@19.3.0) - "@storybook/csf-plugin": 10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + "@storybook/csf-plugin": 10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) "@storybook/icons": 2.1.0(react@19.3.0) "@storybook/react-dom-shim": 10.3.3(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0)) react: 19.3.0 @@ -5916,32 +5953,32 @@ snapshots: "@storybook/icons": 2.1.0(react@19.3.0) storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0) optionalDependencies: - "@vitest/browser": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))(vitest@4.1.11) - "@vitest/browser-playwright": 4.1.11(playwright@1.58.2)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))(vitest@4.1.11) + "@vitest/browser": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11) + "@vitest/browser-playwright": 4.1.11(playwright@1.58.2)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11) "@vitest/runner": 4.1.11 - vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) transitivePeerDependencies: - react - "@storybook/builder-vite@10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))": + "@storybook/builder-vite@10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))": dependencies: - "@storybook/csf-plugin": 10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + "@storybook/csf-plugin": 10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0) ts-dedent: 2.3.0 - vite: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2) + vite: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1) transitivePeerDependencies: - esbuild - rollup - webpack - "@storybook/csf-plugin@10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))": + "@storybook/csf-plugin@10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))": dependencies: storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0) unplugin: 2.3.11 optionalDependencies: esbuild: 0.28.2 rollup: 4.60.1 - vite: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2) + vite: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1) "@storybook/global@5.0.0": {} @@ -5982,9 +6019,9 @@ snapshots: "@vitest/spy": 2.0.5 storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0) - "@storybook/web-components-vite@10.3.3(esbuild@0.28.2)(lit@3.3.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))": + "@storybook/web-components-vite@10.3.3(esbuild@0.28.2)(lit@3.3.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))": dependencies: - "@storybook/builder-vite": 10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + "@storybook/builder-vite": 10.3.3(esbuild@0.28.2)(rollup@4.60.1)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0))(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) "@storybook/web-components": 10.3.3(lit@3.3.2)(storybook@10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0)) storybook: 10.3.3(@testing-library/dom@10.4.0)(prettier@3.8.1)(react@19.3.0) transitivePeerDependencies: @@ -6289,29 +6326,29 @@ snapshots: dependencies: valibot: 1.5.0(typescript@5.9.3) - "@vitest/browser-playwright@4.1.11(playwright@1.58.2)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))(vitest@4.1.11)": + "@vitest/browser-playwright@4.1.11(playwright@1.58.2)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11)": dependencies: - "@vitest/browser": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))(vitest@4.1.11) - "@vitest/mocker": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + "@vitest/browser": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11) + "@vitest/mocker": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) playwright: 1.58.2 tinyrainbow: 3.2.0 - vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - "@vitest/browser@4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))(vitest@4.1.11)": + "@vitest/browser@4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11)": dependencies: "@blazediff/core": 1.9.1 - "@vitest/mocker": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + "@vitest/mocker": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) "@vitest/utils": 4.1.11 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) ws: 8.22.0 transitivePeerDependencies: - bufferutil @@ -6331,9 +6368,9 @@ snapshots: obug: 2.2.1 std-env: 4.3.0 tinyrainbow: 3.2.0 - vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) optionalDependencies: - "@vitest/browser": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))(vitest@4.1.11) + "@vitest/browser": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11) "@vitest/expect@2.0.5": dependencies: @@ -6359,13 +6396,13 @@ snapshots: chai: 6.3.0 tinyrainbow: 3.2.0 - "@vitest/mocker@4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))": + "@vitest/mocker@4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))": dependencies: "@vitest/spy": 4.1.11 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2) + vite: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1) "@vitest/pretty-format@2.0.5": dependencies: @@ -6414,7 +6451,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.17 tinyrainbow: 3.2.0 - vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + vitest: 4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) "@vitest/utils@2.0.5": dependencies: @@ -7453,6 +7490,8 @@ snapshots: html-escaper@2.0.2: {} + husky@9.1.7: {} + ignore@5.3.2: {} ignore@7.0.12: {} @@ -7745,6 +7784,14 @@ snapshots: lines-and-columns@1.2.4: {} + lint-staged@17.6.0: + dependencies: + picomatch: 4.0.7 + string-argv: 0.3.2 + tinyexec: 1.3.1 + optionalDependencies: + yaml: 2.9.1 + lit-element@4.2.2: dependencies: "@lit-labs/ssr-dom-shim": 1.6.0 @@ -7851,10 +7898,10 @@ snapshots: minimist@1.2.8: {} - mrmime@2.0.1: {} - mockdate@3.0.5: {} + mrmime@2.0.1: {} + ms@2.1.3: {} nanoid@3.3.20: {} @@ -8360,6 +8407,8 @@ snapshots: - react - utf-8-validate + string-argv@0.3.2: {} + string.prototype.includes@2.0.1: dependencies: call-bind: 1.0.9 @@ -8623,7 +8672,7 @@ snapshots: validate-npm-package-name@6.0.0: {} - vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2): + vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -8634,11 +8683,12 @@ snapshots: "@types/node": 26.6.4 esbuild: 0.28.2 fsevents: 2.3.3 + yaml: 2.9.1 - vitest@4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)): + vitest@4.1.11(@types/node@26.6.4)(@vitest/browser-playwright@4.1.11)(@vitest/coverage-v8@4.1.11)(@vitest/ui@4.1.11)(happy-dom@20.8.9)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)): dependencies: "@vitest/expect": 4.1.11 - "@vitest/mocker": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)) + "@vitest/mocker": 4.1.11(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1)) "@vitest/pretty-format": 4.1.11 "@vitest/runner": 4.1.11 "@vitest/snapshot": 4.1.11 @@ -8655,11 +8705,11 @@ snapshots: tinyexec: 1.3.1 tinyglobby: 0.2.17 tinyrainbow: 3.2.0 - vite: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2) + vite: 8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1) why-is-node-running: 2.3.0 optionalDependencies: "@types/node": 26.6.4 - "@vitest/browser-playwright": 4.1.11(playwright@1.58.2)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2))(vitest@4.1.11) + "@vitest/browser-playwright": 4.1.11(playwright@1.58.2)(vite@8.3.3(@types/node@26.6.4)(esbuild@0.28.2)(yaml@2.9.1))(vitest@4.1.11) "@vitest/coverage-v8": 4.1.11(@vitest/browser@4.1.11)(vitest@4.1.11) "@vitest/ui": 4.1.11(vitest@4.1.11) happy-dom: 20.8.9 @@ -8732,6 +8782,9 @@ snapshots: yallist@4.0.0: {} + yaml@2.9.1: + optional: true + yargs-parser@20.2.9: {} yocto-queue@0.1.0: {}