From 7d6bec01ae957060969fded53c40fec3d018b421 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 30 Apr 2025 14:51:22 +0200 Subject: [PATCH 001/247] Add DHCP Browser entry point to network (#25235) * Add DHCP Browser entry point to network * lint --- .../config/network/ha-config-network-dhcp.ts | 66 +++++++++++++++++++ .../network/ha-config-section-network.ts | 7 ++ src/translations/en.json | 3 + 3 files changed, 76 insertions(+) create mode 100644 src/panels/config/network/ha-config-network-dhcp.ts diff --git a/src/panels/config/network/ha-config-network-dhcp.ts b/src/panels/config/network/ha-config-network-dhcp.ts new file mode 100644 index 0000000000..ef70d11903 --- /dev/null +++ b/src/panels/config/network/ha-config-network-dhcp.ts @@ -0,0 +1,66 @@ +import "@material/mwc-button/mwc-button"; +import type { CSSResultGroup } from "lit"; +import { css, html, LitElement } from "lit"; +import { customElement, property } from "lit/decorators"; +import "../../../components/ha-button"; +import "../../../components/ha-card"; +import { haStyle } from "../../../resources/styles"; +import type { HomeAssistant } from "../../../types"; + +@customElement("ha-config-network-dhcp") +class ConfigNetworkDHCP extends LitElement { + @property({ attribute: false }) public hass!: HomeAssistant; + + protected render() { + return html` + +
+

+ ${this.hass.localize("ui.panel.config.network.discovery.dhcp_info")} +

+
+ +
+ `; + } + + static get styles(): CSSResultGroup { + return [ + haStyle, + css` + ha-settings-row { + padding: 0; + } + + .card-actions { + display: flex; + flex-direction: row-reverse; + justify-content: space-between; + align-items: center; + } + `, // row-reverse so we tab first to "save" + ]; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ha-config-network-dhcp": ConfigNetworkDHCP; + } +} diff --git a/src/panels/config/network/ha-config-section-network.ts b/src/panels/config/network/ha-config-section-network.ts index 4b5f6a2808..c9a3df311d 100644 --- a/src/panels/config/network/ha-config-section-network.ts +++ b/src/panels/config/network/ha-config-section-network.ts @@ -5,6 +5,7 @@ import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import "../../../layouts/hass-subpage"; import type { HomeAssistant, Route } from "../../../types"; import "./ha-config-network"; +import "./ha-config-network-dhcp"; import "./ha-config-network-ssdp"; import "./ha-config-network-zeroconf"; import "./ha-config-url-form"; @@ -37,6 +38,11 @@ class HaConfigSectionNetwork extends LitElement { : ""} + ${isComponentLoaded(this.hass, "dhcp") + ? html`` + : ""} ${isComponentLoaded(this.hass, "ssdp") ? html` Date: Wed, 30 Apr 2025 15:57:16 +0300 Subject: [PATCH 002/247] Allow pasting more automation config formats (#25239) --- .../automation/manual-automation-editor.ts | 55 ++++++++++++++++++- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/src/panels/config/automation/manual-automation-editor.ts b/src/panels/config/automation/manual-automation-editor.ts index a064b65a8d..57583f0505 100644 --- a/src/panels/config/automation/manual-automation-editor.ts +++ b/src/panels/config/automation/manual-automation-editor.ts @@ -27,7 +27,7 @@ import type { Trigger, } from "../../../data/automation"; import { normalizeAutomationConfig } from "../../../data/automation"; -import type { Action } from "../../../data/script"; +import { getActionType, type Action } from "../../../data/script"; import { haStyle } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; import { documentationUrl } from "../../../util/documentation-url"; @@ -312,10 +312,59 @@ export class HaManualAutomationEditor extends LitElement { const loaded: any = load(paste); if (loaded) { - let normalized: AutomationConfig | undefined; + let config = loaded; + + if ("automation" in config) { + config = config.automation; + if (Array.isArray(config)) { + config = config[0]; + } + } + + if (Array.isArray(config)) { + if (config.length === 1) { + config = config[0]; + } else { + const newConfig: AutomationConfig = { + triggers: [], + conditions: [], + actions: [], + }; + let found = false; + config.forEach((cfg: any) => { + if ("trigger" in cfg) { + found = true; + (newConfig.triggers as Trigger[]).push(cfg); + } + if ("condition" in cfg) { + found = true; + (newConfig.conditions as Condition[]).push(cfg); + } + if (getActionType(cfg) !== "unknown") { + found = true; + (newConfig.actions as Action[]).push(cfg); + } + }); + if (found) { + config = newConfig; + } + } + } + + if ("trigger" in config) { + config = { triggers: [config] }; + } + if ("condition" in config) { + config = { conditions: [config] }; + } + if (getActionType(config) !== "unknown") { + config = { actions: [config] }; + } + + let normalized: AutomationConfig; try { - normalized = normalizeAutomationConfig(loaded); + normalized = normalizeAutomationConfig(config); } catch (_err: any) { return; } From 55c75096d0a3b28d0ce778a61841942c83b5a025 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 30 Apr 2025 16:15:10 +0300 Subject: [PATCH 003/247] Allow pasting more script config (#25240) * Allow pasting more script config * Update manual-script-editor.ts --- .../config/script/manual-script-editor.ts | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/panels/config/script/manual-script-editor.ts b/src/panels/config/script/manual-script-editor.ts index d15c41a49f..457a6f7303 100644 --- a/src/panels/config/script/manual-script-editor.ts +++ b/src/panels/config/script/manual-script-editor.ts @@ -24,7 +24,11 @@ import "../../../components/ha-card"; import "../../../components/ha-icon-button"; import "../../../components/ha-markdown"; import type { Action, Fields, ScriptConfig } from "../../../data/script"; -import { MODES, normalizeScriptConfig } from "../../../data/script"; +import { + getActionType, + MODES, + normalizeScriptConfig, +} from "../../../data/script"; import { haStyle } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; import { documentationUrl } from "../../../util/documentation-url"; @@ -236,10 +240,31 @@ export class HaManualScriptEditor extends LitElement { const loaded: any = load(paste); if (loaded) { + let config = loaded; + + if ("script" in config) { + config = config.script; + if (Object.keys(config).length) { + config = config[Object.keys(config)[0]]; + } + } + + if (Array.isArray(config)) { + if (config.length === 1) { + config = config[0]; + } else { + config = { sequence: config }; + } + } + + if (!["sequence", "unknown"].includes(getActionType(config))) { + config = { sequence: [config] }; + } + let normalized: ScriptConfig | undefined; try { - normalized = normalizeScriptConfig(loaded); + normalized = normalizeScriptConfig(config); } catch (_err: any) { return; } From ddd51ff097230ea0de06af06726c59caf6a96c73 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 30 Apr 2025 17:02:53 +0300 Subject: [PATCH 004/247] Improve trigger condition check on paste (#25241) --- src/data/automation.ts | 19 +++++++++++++++++++ .../automation/manual-automation-editor.ts | 14 +++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/data/automation.ts b/src/data/automation.ts index 7308e51e34..1e57fde2ff 100644 --- a/src/data/automation.ts +++ b/src/data/automation.ts @@ -492,6 +492,25 @@ export const getAutomationEditorInitData = () => { return data; }; +export const isTrigger = (config: unknown): boolean => { + if (!config || typeof config !== "object") { + return false; + } + const trigger = config as Record; + return ( + ("trigger" in trigger && typeof trigger.trigger === "string") || + ("platform" in trigger && typeof trigger.platform === "string") + ); +}; + +export const isCondition = (config: unknown): boolean => { + if (!config || typeof config !== "object") { + return false; + } + const condition = config as Record; + return "condition" in condition && typeof condition.condition === "string"; +}; + export const subscribeTrigger = ( hass: HomeAssistant, onChange: (result: { diff --git a/src/panels/config/automation/manual-automation-editor.ts b/src/panels/config/automation/manual-automation-editor.ts index 57583f0505..8e0ae2209f 100644 --- a/src/panels/config/automation/manual-automation-editor.ts +++ b/src/panels/config/automation/manual-automation-editor.ts @@ -26,7 +26,11 @@ import type { ManualAutomationConfig, Trigger, } from "../../../data/automation"; -import { normalizeAutomationConfig } from "../../../data/automation"; +import { + isCondition, + isTrigger, + normalizeAutomationConfig, +} from "../../../data/automation"; import { getActionType, type Action } from "../../../data/script"; import { haStyle } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; @@ -332,11 +336,11 @@ export class HaManualAutomationEditor extends LitElement { }; let found = false; config.forEach((cfg: any) => { - if ("trigger" in cfg) { + if (isTrigger(cfg)) { found = true; (newConfig.triggers as Trigger[]).push(cfg); } - if ("condition" in cfg) { + if (isCondition(cfg)) { found = true; (newConfig.conditions as Condition[]).push(cfg); } @@ -351,10 +355,10 @@ export class HaManualAutomationEditor extends LitElement { } } - if ("trigger" in config) { + if (isTrigger(config)) { config = { triggers: [config] }; } - if ("condition" in config) { + if (isCondition(config)) { config = { conditions: [config] }; } if (getActionType(config) !== "unknown") { From 055c18463c54ec0ff32438664e9fbf67afb468bc Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Wed, 30 Apr 2025 16:17:01 +0200 Subject: [PATCH 005/247] Use code font family variable in combo-box (#25243) --- src/components/entity/ha-entity-combo-box.ts | 2 +- src/components/entity/ha-statistic-combo-box.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/entity/ha-entity-combo-box.ts b/src/components/entity/ha-entity-combo-box.ts index 2aa96604f6..9a89fe23d3 100644 --- a/src/components/entity/ha-entity-combo-box.ts +++ b/src/components/entity/ha-entity-combo-box.ts @@ -71,7 +71,7 @@ const DOMAIN_STYLE = styleMap({ }); const ENTITY_ID_STYLE = styleMap({ - fontFamily: "var(--code-font-family, monospace)", + fontFamily: "var(--ha-font-family-code)", fontSize: "var(--ha-font-size-xs)", }); diff --git a/src/components/entity/ha-statistic-combo-box.ts b/src/components/entity/ha-statistic-combo-box.ts index c6ec0621d0..313bececcb 100644 --- a/src/components/entity/ha-statistic-combo-box.ts +++ b/src/components/entity/ha-statistic-combo-box.ts @@ -48,7 +48,7 @@ interface StatisticItem { const TYPE_ORDER = ["entity", "external", "no_state"] as StatisticItemType[]; const ENTITY_ID_STYLE = styleMap({ - fontFamily: "var(--code-font-family, monospace)", + fontFamily: "var(--ha-font-family-code)", fontSize: "11px", }); From 221bc732fbfb6cfc3f3459f0e50c2e074f2e59c0 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 30 Apr 2025 18:45:35 +0300 Subject: [PATCH 006/247] Handle errrors/wrong values on paste (#25245) --- src/components/ha-toast.ts | 4 + .../automation/manual-automation-editor.ts | 195 ++++++++++-------- .../config/script/manual-script-editor.ts | 125 ++++++----- src/translations/en.json | 2 + 4 files changed, 181 insertions(+), 145 deletions(-) diff --git a/src/components/ha-toast.ts b/src/components/ha-toast.ts index f0f94cbea4..8946aee00c 100644 --- a/src/components/ha-toast.ts +++ b/src/components/ha-toast.ts @@ -24,6 +24,10 @@ export class HaToast extends Snackbar { max-width: 650px; } + .mdc-snackbar__actions { + color: rgba(255, 255, 255, 0.87); + } + /* Revert the default styles set by mwc-snackbar */ @media (max-width: 480px), (max-width: 344px) { .mdc-snackbar__surface { diff --git a/src/panels/config/automation/manual-automation-editor.ts b/src/panels/config/automation/manual-automation-editor.ts index 8e0ae2209f..ad113fbef0 100644 --- a/src/panels/config/automation/manual-automation-editor.ts +++ b/src/panels/config/automation/manual-automation-editor.ts @@ -314,104 +314,119 @@ export class HaManualAutomationEditor extends LitElement { return; } - const loaded: any = load(paste); - if (loaded) { - let config = loaded; + let loaded: any; + try { + loaded = load(paste); + } catch (_err: any) { + showToast(this, { + message: this.hass.localize( + "ui.panel.config.automation.editor.paste_invalid_yaml" + ), + duration: 4000, + dismissable: true, + }); + return; + } - if ("automation" in config) { - config = config.automation; - if (Array.isArray(config)) { - config = config[0]; - } - } + if (!loaded || typeof loaded !== "object") { + return; + } + let config = loaded; + + if ("automation" in config) { + config = config.automation; if (Array.isArray(config)) { - if (config.length === 1) { - config = config[0]; - } else { - const newConfig: AutomationConfig = { - triggers: [], - conditions: [], - actions: [], - }; - let found = false; - config.forEach((cfg: any) => { - if (isTrigger(cfg)) { - found = true; - (newConfig.triggers as Trigger[]).push(cfg); - } - if (isCondition(cfg)) { - found = true; - (newConfig.conditions as Condition[]).push(cfg); - } - if (getActionType(cfg) !== "unknown") { - found = true; - (newConfig.actions as Action[]).push(cfg); - } - }); - if (found) { - config = newConfig; + config = config[0]; + } + } + + if (Array.isArray(config)) { + if (config.length === 1) { + config = config[0]; + } else { + const newConfig: AutomationConfig = { + triggers: [], + conditions: [], + actions: [], + }; + let found = false; + config.forEach((cfg: any) => { + if (isTrigger(cfg)) { + found = true; + (newConfig.triggers as Trigger[]).push(cfg); + } + if (isCondition(cfg)) { + found = true; + (newConfig.conditions as Condition[]).push(cfg); + } + if (getActionType(cfg) !== "unknown") { + found = true; + (newConfig.actions as Action[]).push(cfg); } - } - } - - if (isTrigger(config)) { - config = { triggers: [config] }; - } - if (isCondition(config)) { - config = { conditions: [config] }; - } - if (getActionType(config) !== "unknown") { - config = { actions: [config] }; - } - - let normalized: AutomationConfig; - - try { - normalized = normalizeAutomationConfig(config); - } catch (_err: any) { - return; - } - - try { - assert(normalized, automationConfigStruct); - } catch (_err: any) { - showToast(this, { - message: this.hass.localize( - "ui.panel.config.automation.editor.paste_invalid_config" - ), - duration: 4000, - dismissable: true, }); - return; - } - - if (normalized) { - ev.preventDefault(); - - if (this.dirty) { - const result = await new Promise((resolve) => { - showPasteReplaceDialog(this, { - domain: "automation", - pastedConfig: normalized, - onClose: () => resolve(false), - onAppend: () => { - this._appendToExistingConfig(normalized); - resolve(false); - }, - onReplace: () => resolve(true), - }); - }); - - if (!result) { - return; - } + if (found) { + config = newConfig; } - - // replace the config completely - this._replaceExistingConfig(normalized); } } + + if (isTrigger(config)) { + config = { triggers: [config] }; + } + if (isCondition(config)) { + config = { conditions: [config] }; + } + if (getActionType(config) !== "unknown") { + config = { actions: [config] }; + } + + let normalized: AutomationConfig; + + try { + normalized = normalizeAutomationConfig(config); + } catch (_err: any) { + return; + } + + try { + assert(normalized, automationConfigStruct); + } catch (_err: any) { + showToast(this, { + message: this.hass.localize( + "ui.panel.config.automation.editor.paste_invalid_config" + ), + duration: 4000, + dismissable: true, + }); + return; + } + + if (normalized) { + ev.preventDefault(); + + if (this.dirty) { + const result = await new Promise((resolve) => { + showPasteReplaceDialog(this, { + domain: "automation", + pastedConfig: normalized, + onClose: () => resolve(false), + onAppend: () => { + this._appendToExistingConfig(normalized); + resolve(false); + }, + onReplace: () => resolve(true), + }); + }); + + if (!result) { + return; + } + } + + // replace the config completely + this._replaceExistingConfig(normalized); + } }; private _appendToExistingConfig(config: ManualAutomationConfig) { diff --git a/src/panels/config/script/manual-script-editor.ts b/src/panels/config/script/manual-script-editor.ts index 457a6f7303..9799855cda 100644 --- a/src/panels/config/script/manual-script-editor.ts +++ b/src/panels/config/script/manual-script-editor.ts @@ -238,75 +238,90 @@ export class HaManualScriptEditor extends LitElement { return; } - const loaded: any = load(paste); - if (loaded) { - let config = loaded; + let loaded: any; + try { + loaded = load(paste); + } catch (_err: any) { + showToast(this, { + message: this.hass.localize( + "ui.panel.config.script.editor.paste_invalid_config" + ), + duration: 4000, + dismissable: true, + }); + return; + } - if ("script" in config) { - config = config.script; - if (Object.keys(config).length) { - config = config[Object.keys(config)[0]]; - } + if (!loaded || typeof loaded !== "object") { + return; + } + + let config = loaded; + + if ("script" in config) { + config = config.script; + if (Object.keys(config).length) { + config = config[Object.keys(config)[0]]; } + } - if (Array.isArray(config)) { - if (config.length === 1) { - config = config[0]; - } else { - config = { sequence: config }; - } + if (Array.isArray(config)) { + if (config.length === 1) { + config = config[0]; + } else { + config = { sequence: config }; } + } - if (!["sequence", "unknown"].includes(getActionType(config))) { - config = { sequence: [config] }; - } + if (!["sequence", "unknown"].includes(getActionType(config))) { + config = { sequence: [config] }; + } - let normalized: ScriptConfig | undefined; + let normalized: ScriptConfig | undefined; - try { - normalized = normalizeScriptConfig(config); - } catch (_err: any) { - return; - } + try { + normalized = normalizeScriptConfig(config); + } catch (_err: any) { + return; + } - try { - assert(normalized, scriptConfigStruct); - } catch (_err: any) { - showToast(this, { - message: this.hass.localize( - "ui.panel.config.script.editor.paste_invalid_config" - ), - duration: 4000, - dismissable: true, - }); - return; - } + try { + assert(normalized, scriptConfigStruct); + } catch (_err: any) { + showToast(this, { + message: this.hass.localize( + "ui.panel.config.script.editor.paste_invalid_config" + ), + duration: 4000, + dismissable: true, + }); + return; + } - if (normalized) { - ev.preventDefault(); + if (normalized) { + ev.preventDefault(); - if (this.dirty) { - const result = await new Promise((resolve) => { - showPasteReplaceDialog(this, { - domain: "script", - pastedConfig: normalized, - onClose: () => resolve(false), - onAppend: () => { - this._appendToExistingConfig(normalized); - resolve(false); - }, - onReplace: () => resolve(true), - }); + if (this.dirty) { + const result = await new Promise((resolve) => { + showPasteReplaceDialog(this, { + domain: "script", + pastedConfig: normalized, + onClose: () => resolve(false), + onAppend: () => { + this._appendToExistingConfig(normalized); + resolve(false); + }, + onReplace: () => resolve(true), }); + }); - if (!result) { - return; - } + if (!result) { + return; } - - // replace the config completely - this._replaceExistingConfig(normalized); } + + // replace the config completely + this._replaceExistingConfig(normalized); } }; diff --git a/src/translations/en.json b/src/translations/en.json index d9d5daaf90..1fb0d53531 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -4356,6 +4356,7 @@ "text": "How do you want to paste your automation?" }, "paste_toast_message": "Pasted automation from clipboard", + "paste_invalid_yaml": "Pasted value is not valid YAML", "paste_invalid_config": "Pasted automation is not editable in the visual editor" }, "trace": { @@ -4595,6 +4596,7 @@ "text": "How do you want to paste your script?" }, "paste_toast_message": "Pasted script from clipboard", + "paste_invalid_yaml": "Pasted value is not valid YAML", "paste_invalid_config": "Pasted script is not editable in the visual editor" }, "trace": { From f8d706277d666cb1ea872aeb6c71dcddc5b21a63 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Wed, 30 Apr 2025 09:47:51 -0700 Subject: [PATCH 007/247] New energy calculation formula (#25242) * New energy calculation * more tests and stricter tests. change priority order --- src/data/energy.ts | 100 +++++++++------- test/data/energy.test.ts | 239 ++++++++++++++++++++++++++++----------- 2 files changed, 234 insertions(+), 105 deletions(-) diff --git a/src/data/energy.ts b/src/data/energy.ts index 70aece7feb..88d318e9ed 100644 --- a/src/data/energy.ts +++ b/src/data/energy.ts @@ -959,21 +959,13 @@ const computeConsumptionDataPartial = ( }; data.timestamps.forEach((t) => { - const used_total = - (data.from_grid?.[t] || 0) + - (data.solar?.[t] || 0) + - (data.from_battery?.[t] || 0) - - (data.to_grid?.[t] || 0) - - (data.to_battery?.[t] || 0); - - outData.used_total[t] = used_total; - outData.total.used_total += used_total; const { grid_to_battery, battery_to_grid, used_solar, used_grid, used_battery, + used_total, solar_to_battery, solar_to_grid, } = computeConsumptionSingle({ @@ -984,6 +976,8 @@ const computeConsumptionDataPartial = ( from_battery: data.from_battery && (data.from_battery[t] ?? 0), }); + outData.used_total[t] = used_total; + outData.total.used_total += used_total; outData.grid_to_battery[t] = grid_to_battery; outData.total.grid_to_battery += grid_to_battery; outData.battery_to_grid![t] = battery_to_grid; @@ -1017,12 +1011,20 @@ export const computeConsumptionSingle = (data: { used_solar: number; used_grid: number; used_battery: number; + used_total: number; } => { - const to_grid = data.to_grid; - const to_battery = data.to_battery; - const solar = data.solar; - const from_grid = data.from_grid; - const from_battery = data.from_battery; + let to_grid = Math.max(data.to_grid || 0, 0); + let to_battery = Math.max(data.to_battery || 0, 0); + let solar = Math.max(data.solar || 0, 0); + let from_grid = Math.max(data.from_grid || 0, 0); + let from_battery = Math.max(data.from_battery || 0, 0); + + const used_total = + (from_grid || 0) + + (solar || 0) + + (from_battery || 0) - + (to_grid || 0) - + (to_battery || 0); let used_solar = 0; let grid_to_battery = 0; @@ -1031,41 +1033,57 @@ export const computeConsumptionSingle = (data: { let solar_to_grid = 0; let used_battery = 0; let used_grid = 0; - if ((to_grid != null || to_battery != null) && solar != null) { - used_solar = (solar || 0) - (to_grid || 0) - (to_battery || 0); - if (used_solar < 0) { - if (to_battery != null) { - grid_to_battery = used_solar * -1; - if (grid_to_battery > (from_grid || 0)) { - battery_to_grid = grid_to_battery - (from_grid || 0); - grid_to_battery = from_grid || 0; - } - } - used_solar = 0; - } - } - if (from_battery != null) { - used_battery = (from_battery || 0) - battery_to_grid; - } + let used_total_remaining = Math.max(used_total, 0); + // Consumption Priority + // Battery_Out -> Grid_Out + // Solar -> Grid_Out + // Solar -> Battery_In + // Grid_In -> Battery_In + // Solar -> Consumption + // Battery_Out -> Consumption + // Grid_In -> Consumption - if (from_grid != null) { - used_grid = from_grid - grid_to_battery; - } + // Battery_Out -> Grid_Out + battery_to_grid = Math.min(from_battery, to_grid); + from_battery -= battery_to_grid; + to_grid -= battery_to_grid; - if (solar != null) { - if (to_battery != null) { - solar_to_battery = Math.max(0, (to_battery || 0) - grid_to_battery); - } - if (to_grid != null) { - solar_to_grid = Math.max(0, (to_grid || 0) - battery_to_grid); - } - } + // Solar -> Grid_Out + solar_to_grid = Math.min(solar, to_grid); + to_grid -= solar_to_grid; + solar -= solar_to_grid; + + // Solar -> Battery_In + solar_to_battery = Math.min(solar, to_battery); + to_battery -= solar_to_battery; + solar -= solar_to_battery; + + // Grid_In -> Battery_In + grid_to_battery = Math.min(from_grid, to_battery); + from_grid -= grid_to_battery; + to_battery -= to_battery; + + // Solar -> Consumption + used_solar = Math.min(used_total_remaining, solar); + used_total_remaining -= used_solar; + solar -= used_solar; + + // Battery_Out -> Consumption + used_battery = Math.min(from_battery, used_total_remaining); + from_battery -= used_battery; + used_total_remaining -= used_battery; + + // Grid_In -> Consumption + used_grid = Math.min(used_total_remaining, from_grid); + from_grid -= used_grid; + used_total_remaining -= from_grid; return { used_solar, used_grid, used_battery, + used_total, grid_to_battery, battery_to_grid, solar_to_battery, diff --git a/test/data/energy.test.ts b/test/data/energy.test.ts index e5fcbe9dc6..5609803ced 100644 --- a/test/data/energy.test.ts +++ b/test/data/energy.test.ts @@ -14,6 +14,47 @@ import { } from "../../src/data/energy"; import type { HomeAssistant } from "../../src/types"; +const checkConsumptionResult = ( + input: { + from_grid: number | undefined; + to_grid: number | undefined; + solar: number | undefined; + to_battery: number | undefined; + from_battery: number | undefined; + }, + exact = true +): { + grid_to_battery: number; + battery_to_grid: number; + solar_to_battery: number; + solar_to_grid: number; + used_solar: number; + used_grid: number; + used_battery: number; + used_total: number; +} => { + const result = computeConsumptionSingle(input); + if (exact) { + assert.equal( + result.used_total, + result.used_solar + result.used_battery + result.used_grid + ); + assert.equal( + input.to_grid || 0, + result.solar_to_grid + result.battery_to_grid + ); + assert.equal( + input.to_battery || 0, + result.grid_to_battery + result.solar_to_battery + ); + assert.equal( + input.solar || 0, + result.solar_to_battery + result.solar_to_grid + result.used_solar + ); + } + return result; +}; + describe("Energy Short Format Test", () => { // Create default to not have to specify a not relevant TimeFormat over and over again. const defaultLocale: FrontendLocaleData = { @@ -88,7 +129,7 @@ describe("Energy Usage Calculation Tests", () => { it("Consuming Energy From the Grid", () => { [0, 5, 1000].forEach((x) => { assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: x, to_grid: undefined, solar: undefined, @@ -101,6 +142,7 @@ describe("Energy Usage Calculation Tests", () => { used_solar: 0, used_grid: x, used_battery: 0, + used_total: x, solar_to_battery: 0, solar_to_grid: 0, } @@ -108,61 +150,78 @@ describe("Energy Usage Calculation Tests", () => { }); }); it("Solar production, consuming some and returning the remainder to grid.", () => { - [2.99, 3, 10, 100].forEach((s) => { + ( + [ + [2.99, false], // unsolveable : solar < to_grid + [3, true], + [10, true], + [100, true], + ] as any + ).forEach(([s, exact]) => { assert.deepEqual( - computeConsumptionSingle({ - from_grid: 0, - to_grid: 3, - solar: s, - to_battery: undefined, - from_battery: undefined, - }), + checkConsumptionResult( + { + from_grid: 0, + to_grid: 3, + solar: s, + to_battery: undefined, + from_battery: undefined, + }, + exact + ), { grid_to_battery: 0, battery_to_grid: 0, - used_solar: Math.max(0, s - 3), + used_solar: Math.min(s, Math.max(0, s - 3)), used_grid: 0, used_battery: 0, + used_total: s - 3, solar_to_battery: 0, - solar_to_grid: 3, + solar_to_grid: Math.min(3, s), } ); }); }); it("Solar production with simultaneous grid consumption. Excess solar returned to the grid.", () => { - [ - [0, 0], - [3, 0], - [0, 3], - [5, 4], - [4, 5], - [10, 3], - [3, 7], - [3, 7.1], - ].forEach(([from_grid, to_grid]) => { + ( + [ + [0, 0, true], + [3, 0, true], + [0, 3, true], + [5, 4, true], + [4, 5, true], + [10, 3, true], + [3, 7, true], + [3, 7.1, false], // unsolveable: to_grid > solar + ] as any + ).forEach(([from_grid, to_grid, exact]) => { assert.deepEqual( - computeConsumptionSingle({ - from_grid, - to_grid, - solar: 7, - to_battery: undefined, - from_battery: undefined, - }), + checkConsumptionResult( + { + from_grid, + to_grid, + solar: 7, + to_battery: undefined, + from_battery: undefined, + }, + exact + ), { grid_to_battery: 0, battery_to_grid: 0, used_solar: Math.max(0, 7 - to_grid), - used_grid: from_grid, + used_grid: from_grid - Math.max(0, to_grid - 7), + used_total: from_grid - to_grid + 7, used_battery: 0, solar_to_battery: 0, - solar_to_grid: to_grid, + solar_to_grid: Math.min(7, to_grid), } ); }); }); it("Charging the battery from the grid", () => { assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 5, to_grid: 0, solar: 0, @@ -175,6 +234,7 @@ describe("Energy Usage Calculation Tests", () => { used_solar: 0, used_grid: 2, used_battery: 0, + used_total: 2, solar_to_battery: 0, solar_to_grid: 0, } @@ -182,7 +242,7 @@ describe("Energy Usage Calculation Tests", () => { }); it("Consuming from the grid and battery simultaneously", () => { assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 5, to_grid: 0, solar: 0, @@ -195,6 +255,7 @@ describe("Energy Usage Calculation Tests", () => { used_solar: 0, used_grid: 5, used_battery: 5, + used_total: 10, solar_to_battery: 0, solar_to_grid: 0, } @@ -202,7 +263,7 @@ describe("Energy Usage Calculation Tests", () => { }); it("Consuming some battery and returning some battery to the grid", () => { assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 0, to_grid: 4, solar: 0, @@ -215,15 +276,15 @@ describe("Energy Usage Calculation Tests", () => { used_solar: 0, used_grid: 0, used_battery: 1, + used_total: 1, solar_to_battery: 0, solar_to_grid: 0, } ); }); - /* Fails it("Charging and discharging the battery to/from the grid in the same interval.", () => { assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 5, to_grid: 1, solar: 0, @@ -234,15 +295,18 @@ describe("Energy Usage Calculation Tests", () => { grid_to_battery: 3, battery_to_grid: 1, used_solar: 0, - used_grid: 1, + used_grid: 2, used_battery: 0, + used_total: 2, + solar_to_battery: 0, + solar_to_grid: 0, } ); - }); */ - /* Test does not pass, battery is not really correct when solar is not present + }); + it("Charging the battery with no solar sensor.", () => { assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 5, to_grid: 0, solar: undefined, @@ -255,13 +319,15 @@ describe("Energy Usage Calculation Tests", () => { used_solar: 0, used_grid: 2, used_battery: 0, + used_total: 2, + solar_to_battery: 0, + solar_to_grid: 0, } ); - }); */ - /* Test does not pass + }); it("Discharging battery to grid while also consuming from grid.", () => { assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 5, to_grid: 4, solar: 0, @@ -274,14 +340,16 @@ describe("Energy Usage Calculation Tests", () => { used_solar: 0, used_grid: 5, used_battery: 0, + used_total: 5, + solar_to_grid: 0, + solar_to_battery: 0, } ); }); - */ it("Grid, solar, and battery", () => { assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 5, to_grid: 3, solar: 7, @@ -294,12 +362,13 @@ describe("Energy Usage Calculation Tests", () => { used_solar: 1, used_grid: 5, used_battery: 0, + used_total: 6, solar_to_battery: 3, solar_to_grid: 3, } ); assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 5, to_grid: 3, solar: 7, @@ -308,16 +377,17 @@ describe("Energy Usage Calculation Tests", () => { }), { grid_to_battery: 0, - battery_to_grid: 0, - used_solar: 1, + battery_to_grid: 3, + used_solar: 4, used_grid: 5, - used_battery: 10, + used_battery: 7, + used_total: 16, solar_to_battery: 3, - solar_to_grid: 3, + solar_to_grid: 0, } ); assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 2, to_grid: 7, solar: 7, @@ -325,17 +395,18 @@ describe("Energy Usage Calculation Tests", () => { from_battery: 1, }), { - grid_to_battery: 1, - battery_to_grid: 0, + grid_to_battery: 0, + battery_to_grid: 1, used_solar: 0, - used_grid: 1, - used_battery: 1, - solar_to_battery: 0, - solar_to_grid: 7, + used_grid: 2, + used_battery: 0, + used_total: 2, + solar_to_battery: 1, + solar_to_grid: 6, } ); assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 2, to_grid: 7, solar: 9, @@ -344,17 +415,17 @@ describe("Energy Usage Calculation Tests", () => { }), { grid_to_battery: 0, - battery_to_grid: 0, - used_solar: 1, + battery_to_grid: 1, + used_solar: 2, used_grid: 2, - used_battery: 1, + used_battery: 0, + used_total: 4, solar_to_battery: 1, - solar_to_grid: 7, + solar_to_grid: 6, } ); - /* Test does not pass assert.deepEqual( - computeConsumptionSingle({ + checkConsumptionResult({ from_grid: 5, to_grid: 3, solar: 1, @@ -367,8 +438,48 @@ describe("Energy Usage Calculation Tests", () => { used_solar: 0, used_grid: 5, used_battery: 0, + used_total: 5, + solar_to_battery: 0, + solar_to_grid: 1, + } + ); + assert.deepEqual( + checkConsumptionResult({ + from_grid: 6, + to_grid: 0, + solar: 3, + to_battery: 6, + from_battery: 6, + }), + { + grid_to_battery: 3, + battery_to_grid: 0, + used_solar: 0, + used_grid: 3, + used_battery: 6, + solar_to_battery: 3, + solar_to_grid: 0, + used_total: 9, + } + ); + assert.deepEqual( + checkConsumptionResult({ + from_grid: 0, + to_grid: 1, + solar: 1, + to_battery: 1, + from_battery: 1, + }), + { + grid_to_battery: 0, + battery_to_grid: 1, + used_solar: 0, + used_grid: 0, + used_battery: 0, + solar_to_battery: 1, + solar_to_grid: 0, + used_total: 0, } ); - */ }); }); From a825b632bffe52edd7bac61ab38323a21909ff05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 20:34:02 +0200 Subject: [PATCH 008/247] Bump vite from 6.3.2 to 6.3.4 (#25248) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.2 to 6.3.4. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v6.3.4/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 6.3.4 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- yarn.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3b3ff024a2..e50b32c5c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8383,7 +8383,7 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.3, fdir@npm:^6.4.4": +"fdir@npm:^6.4.4": version: 6.4.4 resolution: "fdir@npm:6.4.4" peerDependencies: @@ -14896,16 +14896,16 @@ __metadata: linkType: hard "vite@npm:^5.0.0 || ^6.0.0": - version: 6.3.2 - resolution: "vite@npm:6.3.2" + version: 6.3.4 + resolution: "vite@npm:6.3.4" dependencies: esbuild: "npm:^0.25.0" - fdir: "npm:^6.4.3" + fdir: "npm:^6.4.4" fsevents: "npm:~2.3.3" picomatch: "npm:^4.0.2" postcss: "npm:^8.5.3" rollup: "npm:^4.34.9" - tinyglobby: "npm:^0.2.12" + tinyglobby: "npm:^0.2.13" peerDependencies: "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 jiti: ">=1.21.0" @@ -14946,7 +14946,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/05ea5e03d86d950e53af6b11e444b31846bccdc44e45b8d693d06eba7d3a4fe2e8003a6948cdbcf7e54779f7ca851f29e96be6369e9c9413d34de7539ad6af8c + checksum: 10/347579b6571e591c1e4f54262e631f02e952e548171af09042aeffb40adfa5c9b43cf05cf115f0961cc553f6b7173fb9c2ee997a688007c01b6e13779d9a2bd4 languageName: node linkType: hard From 2dbdbb4b64ec61bccfdbcf15afd0e0132a73affb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 20:50:34 +0200 Subject: [PATCH 009/247] Update dependency eslint-plugin-wc to v3.0.1 (#25249) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 8cabc96fab..7539a9df0c 100644 --- a/package.json +++ b/package.json @@ -193,7 +193,7 @@ "eslint-plugin-lit": "2.1.1", "eslint-plugin-lit-a11y": "4.1.4", "eslint-plugin-unused-imports": "4.1.4", - "eslint-plugin-wc": "3.0.0", + "eslint-plugin-wc": "3.0.1", "fancy-log": "2.0.0", "fs-extra": "11.3.0", "glob": "11.0.2", diff --git a/yarn.lock b/yarn.lock index e50b32c5c0..b18c7ecb8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7952,15 +7952,15 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-wc@npm:3.0.0": - version: 3.0.0 - resolution: "eslint-plugin-wc@npm:3.0.0" +"eslint-plugin-wc@npm:3.0.1": + version: 3.0.1 + resolution: "eslint-plugin-wc@npm:3.0.1" dependencies: is-valid-element-name: "npm:^1.0.0" js-levenshtein-esm: "npm:^2.0.0" peerDependencies: eslint: ">=8.40.0" - checksum: 10/fd875c58ec6de0d5c7f2fbec19ccca1eb03710bd5186b2fd99727834287ac71e4b594cc9f1072e4b42065fbb2191d17e760535571539ead6e31df01ef32c5eb8 + checksum: 10/9f0de2597c01f98de9a690adf220b9117857aaeaffd68e9b6ca8712b9cdcb9eeec9ae3da345f1d2f2e551fb3083d2c861a11cba832b5ac5581f596bda705e670 languageName: node linkType: hard @@ -9329,7 +9329,7 @@ __metadata: eslint-plugin-lit: "npm:2.1.1" eslint-plugin-lit-a11y: "npm:4.1.4" eslint-plugin-unused-imports: "npm:4.1.4" - eslint-plugin-wc: "npm:3.0.0" + eslint-plugin-wc: "npm:3.0.1" fancy-log: "npm:2.0.0" fs-extra: "npm:11.3.0" fuse.js: "npm:7.1.0" From 05b49e8c800ba5ef3ed9d596c9ac613ed54711b3 Mon Sep 17 00:00:00 2001 From: Yosi Levy <37745463+yosilevy@users.noreply.github.com> Date: Wed, 30 Apr 2025 22:07:55 +0300 Subject: [PATCH 010/247] Various RTL fixes (#25231) --- src/components/media-player/ha-media-player-browse.ts | 6 ++++++ src/dialogs/config-flow/step-flow-form.ts | 2 ++ .../voice-assistant-setup/voice-assistant-setup-dialog.ts | 1 + src/panels/config/devices/ha-config-device-page.ts | 1 + .../lovelace/dashboards/ha-config-lovelace-dashboards.ts | 2 +- 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/components/media-player/ha-media-player-browse.ts b/src/components/media-player/ha-media-player-browse.ts index d183d49b0d..78d5f1be51 100644 --- a/src/components/media-player/ha-media-player-browse.ts +++ b/src/components/media-player/ha-media-player-browse.ts @@ -890,12 +890,18 @@ export class HaMediaPlayerBrowse extends LitElement { display: flex; flex-direction: row-reverse; margin-right: 48px; + margin-inline-end: 48px; + margin-inline-start: initial; + direction: var(--direction); } .highlight-add-button ha-svg-icon { position: relative; top: -0.5em; margin-left: 8px; + margin-inline-start: 8px; + margin-inline-end: initial; + transform: scaleX(var(--scale-direction)); } .content { diff --git a/src/dialogs/config-flow/step-flow-form.ts b/src/dialogs/config-flow/step-flow-form.ts index a36f4a7152..90b301b98a 100644 --- a/src/dialogs/config-flow/step-flow-form.ts +++ b/src/dialogs/config-flow/step-flow-form.ts @@ -278,7 +278,9 @@ class StepFlowForm extends LitElement { } h2 { word-break: break-word; + padding-right: 72px; padding-inline-end: 72px; + padding-inline-start: initial; direction: var(--direction); } `, diff --git a/src/dialogs/voice-assistant-setup/voice-assistant-setup-dialog.ts b/src/dialogs/voice-assistant-setup/voice-assistant-setup-dialog.ts index 7b292fe9ed..699d9099dd 100644 --- a/src/dialogs/voice-assistant-setup/voice-assistant-setup-dialog.ts +++ b/src/dialogs/voice-assistant-setup/voice-assistant-setup-dialog.ts @@ -407,6 +407,7 @@ export class HaVoiceAssistantSetupDialog extends LitElement { align-items: center; margin-right: 12px; margin-inline-end: 12px; + margin-inline-start: initial; } `, ]; diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index 726d314042..af4033b42f 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -1559,6 +1559,7 @@ export class HaConfigDevicePage extends LitElement { align-items: center; padding-left: 8px; padding-inline-start: 8px; + padding-inline-end: initial; direction: var(--direction); } diff --git a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts index d81f74925c..56f1a398f6 100644 --- a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts +++ b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts @@ -161,7 +161,7 @@ export class HaConfigLovelaceDashboards extends LitElement { placement="right" > From 5b3b17ef6d069e7e6324cfd7af9d4e18c924b38f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 30 Apr 2025 21:10:32 +0200 Subject: [PATCH 011/247] Better explain when DHCP discovery data will be available (#25250) It was pointed out that users likely may not know what DHCP is and wonder why the data is not available yet. --- src/translations/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translations/en.json b/src/translations/en.json index 1fb0d53531..82c4d93ba9 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -6395,7 +6395,7 @@ }, "discovery": { "dhcp": "DHCP browser", - "dhcp_info": "The DHCP browser displays devices discovered by Home Assistant via DHCP, ARP+PTR lookups, and router-based device trackers. All detected devices by these methods will appear here.", + "dhcp_info": "The DHCP browser shows devices detected by Home Assistant using methods like DHCP, ARP+PTR lookups, and router-based device trackers. DHCP (Dynamic Host Configuration Protocol) data is received when devices join the network and request an IP address, allowing Home Assistant to discover them automatically. All devices found through these methods will appear here.", "dhcp_browser": "View DHCP browser", "ssdp": "SSDP browser", "ssdp_info": "The SSDP browser shows devices discovered by Home Assistant using SSDP/UPnP. Devices that Home Assistant has discovered will appear here.", From 409f6656415b73a9a3ae0359e562b0d5dc6895e4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 30 Apr 2025 21:16:25 +0200 Subject: [PATCH 012/247] Fix formatting of mac address fields in device info (#25251) Previous change lost the `:` seperator, and unexpectedly MAC became title case instead of MAC when dhcp is loaded. --- .../config/devices/device-detail/ha-device-info-card.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/config/devices/device-detail/ha-device-info-card.ts b/src/panels/config/devices/device-detail/ha-device-info-card.ts index dba2bbfa66..29a4b678b8 100644 --- a/src/panels/config/devices/device-detail/ha-device-info-card.ts +++ b/src/panels/config/devices/device-detail/ha-device-info-card.ts @@ -106,7 +106,7 @@ export class HaDeviceCard extends LitElement {
${type === "bluetooth" && isComponentLoaded(this.hass, "bluetooth") - ? html`${titleCase(type)} + ? html`${titleCase(type)}: Date: Wed, 30 Apr 2025 21:53:07 +0200 Subject: [PATCH 013/247] Improve message when no discovery data is found (#25252) * Improve message when no discovery data is found It was pointed out its a bit confusing when a device has not been discovered yet for the discovery/network browser panels as we only said there was no data. Give the user a better hint as to why there is no data. * Improve message when no discovery data is found It was pointed out its a bit confusing when a device has not been discovered yet for the discovery/network browser panels as we only said there was no data. Give the user a better hint as to why there is no data. * Improve message when no discovery data is found It was pointed out its a bit confusing when a device has not been discovered yet for the discovery/network browser panels as we only said there was no data. Give the user a better hint as to why there is no data. * Improve message when no discovery data is found It was pointed out its a bit confusing when a device has not been discovered yet for the discovery/network browser panels as we only said there was no data. Give the user a better hint as to why there is no data. --- .../bluetooth/bluetooth-advertisement-monitor.ts | 3 +++ .../integration-panels/dhcp/dhcp-config-panel.ts | 3 +++ .../integration-panels/ssdp/ssdp-config-panel.ts | 3 +++ .../zeroconf/zeroconf-config-panel.ts | 3 +++ src/translations/en.json | 10 +++++++--- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/panels/config/integrations/integration-panels/bluetooth/bluetooth-advertisement-monitor.ts b/src/panels/config/integrations/integration-panels/bluetooth/bluetooth-advertisement-monitor.ts index 5bcd7389f4..d9e53f3b05 100644 --- a/src/panels/config/integrations/integration-panels/bluetooth/bluetooth-advertisement-monitor.ts +++ b/src/panels/config/integrations/integration-panels/bluetooth/bluetooth-advertisement-monitor.ts @@ -210,6 +210,9 @@ export class BluetoothAdvertisementMonitorPanel extends LitElement { .route=${this.route} .columns=${this._columns(this.hass.localize)} .data=${this._dataWithNamedSourceAndIds(this._data)} + .noDataText=${this.hass.localize( + "ui.panel.config.bluetooth.no_advertisements_found" + )} @row-click=${this._handleRowClicked} .initialGroupColumn=${this._activeGrouping} .initialCollapsedGroups=${this._activeCollapsed} diff --git a/src/panels/config/integrations/integration-panels/dhcp/dhcp-config-panel.ts b/src/panels/config/integrations/integration-panels/dhcp/dhcp-config-panel.ts index ea4c24a2aa..683719ee43 100644 --- a/src/panels/config/integrations/integration-panels/dhcp/dhcp-config-panel.ts +++ b/src/panels/config/integrations/integration-panels/dhcp/dhcp-config-panel.ts @@ -96,6 +96,9 @@ export class DHCPConfigPanel extends SubscribeMixin(LitElement) { .route=${this.route} .columns=${this._columns(this.hass.localize)} .data=${this._dataWithIds(this._data)} + .noDataText=${this.hass.localize( + "ui.panel.config.dhcp.no_devices_found" + )} filter=${this._macAddress || ""} > `; diff --git a/src/panels/config/integrations/integration-panels/ssdp/ssdp-config-panel.ts b/src/panels/config/integrations/integration-panels/ssdp/ssdp-config-panel.ts index 215205cfe8..1433e2d582 100644 --- a/src/panels/config/integrations/integration-panels/ssdp/ssdp-config-panel.ts +++ b/src/panels/config/integrations/integration-panels/ssdp/ssdp-config-panel.ts @@ -105,6 +105,9 @@ export class SSDPConfigPanel extends SubscribeMixin(LitElement) { @grouping-changed=${this._handleGroupingChanged} @collapsed-changed=${this._handleCollapseChanged} .data=${this._dataWithIds(this._data)} + .noDataText=${this.hass.localize( + "ui.panel.config.ssdp.no_devices_found" + )} @row-click=${this._handleRowClicked} clickable > diff --git a/src/panels/config/integrations/integration-panels/zeroconf/zeroconf-config-panel.ts b/src/panels/config/integrations/integration-panels/zeroconf/zeroconf-config-panel.ts index 57ffabcdee..64a237fde1 100644 --- a/src/panels/config/integrations/integration-panels/zeroconf/zeroconf-config-panel.ts +++ b/src/panels/config/integrations/integration-panels/zeroconf/zeroconf-config-panel.ts @@ -112,6 +112,9 @@ export class ZeroconfConfigPanel extends SubscribeMixin(LitElement) { @grouping-changed=${this._handleGroupingChanged} @collapsed-changed=${this._handleCollapseChanged} .data=${this._dataWithIds(this._data)} + .noDataText=${this.hass.localize( + "ui.panel.config.zeroconf.no_devices_found" + )} @row-click=${this._handleRowClicked} clickable > diff --git a/src/translations/en.json b/src/translations/en.json index 82c4d93ba9..c47cd875ad 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -5508,6 +5508,7 @@ "connection_monitor": "Connection monitor", "used_connection_slot_allocations": "Used connection slot allocations", "no_connections": "No active connections", + "no_advertisements_found": "No matching Bluetooth advertisements found", "no_connection_slot_allocations": "No connection slot allocations information available", "no_active_connection_support": "This adapter does not support making active (GATT) connections.", "address": "Address", @@ -5528,7 +5529,8 @@ "title": "DHCP discovery", "mac_address": "MAC Address", "hostname": "Hostname", - "ip_address": "IP Address" + "ip_address": "IP Address", + "no_devices_found": "No recent DHCP requests found; no matching discoveries detected" }, "thread": { "other_networks": "Other networks", @@ -5577,7 +5579,8 @@ "ssdp_headers": "SSDP Headers", "upnp": "Universal Plug and Play (UPnP)", "discovery_information": "Discovery information", - "copy_to_clipboard": "Copy to clipboard" + "copy_to_clipboard": "Copy to clipboard", + "no_devices_found": "No matching SSDP/UPnP discoveries found" }, "zeroconf": { "name": "Name", @@ -5586,7 +5589,8 @@ "ip_addresses": "IP Addresses", "properties": "Properties", "discovery_information": "Discovery information", - "copy_to_clipboard": "Copy to clipboard" + "copy_to_clipboard": "Copy to clipboard", + "no_devices_found": "No matching Zeroconf discoveries found" }, "zha": { "common": { From 1c12aea8f6e8faa27270605b91ac8aff2955ef64 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Wed, 30 Apr 2025 22:23:45 +0200 Subject: [PATCH 014/247] Add `?` as shortcut for shortcuts dialog (#25253) Bind shortcuts dialog to `?` key --- src/state/quick-bar-mixin.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/state/quick-bar-mixin.ts b/src/state/quick-bar-mixin.ts index 598d064597..6e931a9bd7 100644 --- a/src/state/quick-bar-mixin.ts +++ b/src/state/quick-bar-mixin.ts @@ -15,6 +15,7 @@ import type { HassElement } from "./hass-element"; import { extractSearchParamsObject } from "../common/url/search-params"; import { showVoiceCommandDialog } from "../dialogs/voice-command-dialog/show-ha-voice-command-dialog"; import { canOverrideAlphanumericInput } from "../common/dom/can-override-input"; +import { showShortcutsDialog } from "../dialogs/shortcuts/show-shortcuts-dialog"; declare global { interface HASSDomEvents { @@ -51,6 +52,8 @@ export default >(superClass: T) => case "a": this._showVoiceCommandDialog(ev.detail); break; + case "?": + this._showShortcutDialog(ev.detail); } }); @@ -65,6 +68,8 @@ export default >(superClass: T) => m: (ev) => this._createMyLink(ev), a: (ev) => this._showVoiceCommandDialog(ev), d: (ev) => this._showQuickBar(ev, QuickBarMode.Device), + // Workaround see https://github.com/jamiebuilds/tinykeys/issues/130 + "Shift+?": (ev) => this._showShortcutDialog(ev), // Those are fallbacks for non-latin keyboards that don't have e, c, m keys (qwerty-based shortcuts) KeyE: (ev) => this._showQuickBar(ev), KeyC: (ev) => this._showQuickBar(ev, QuickBarMode.Command), @@ -111,6 +116,19 @@ export default >(superClass: T) => showQuickBar(this, { mode }); } + private _showShortcutDialog(e: KeyboardEvent) { + if (!this._canShowQuickBar(e)) { + return; + } + + if (e.defaultPrevented) { + return; + } + e.preventDefault(); + + showShortcutsDialog(this); + } + private async _createMyLink(e: KeyboardEvent) { if ( !this.hass?.enableShortcuts || From cd3e4f55e21c0e35edb968bb249a67ab3a4547ca Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Wed, 30 Apr 2025 21:27:11 -0700 Subject: [PATCH 015/247] Fix typo in energy calculation (#25259) * New energy calculation * more tests and stricter tests. change priority order * more test and fix error --- src/data/energy.ts | 2 +- test/data/energy.test.ts | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/data/energy.ts b/src/data/energy.ts index 88d318e9ed..06498ace9b 100644 --- a/src/data/energy.ts +++ b/src/data/energy.ts @@ -1062,7 +1062,7 @@ export const computeConsumptionSingle = (data: { // Grid_In -> Battery_In grid_to_battery = Math.min(from_grid, to_battery); from_grid -= grid_to_battery; - to_battery -= to_battery; + to_battery -= grid_to_battery; // Solar -> Consumption used_solar = Math.min(used_total_remaining, solar); diff --git a/test/data/energy.test.ts b/test/data/energy.test.ts index 5609803ced..ba8d159e08 100644 --- a/test/data/energy.test.ts +++ b/test/data/energy.test.ts @@ -462,6 +462,8 @@ describe("Energy Usage Calculation Tests", () => { used_total: 9, } ); + }); + it("Solar -> Battery -> Grid", () => { assert.deepEqual( checkConsumptionResult({ from_grid: 0, @@ -482,4 +484,25 @@ describe("Energy Usage Calculation Tests", () => { } ); }); + it("Solar -> Grid && Grid -> Battery", () => { + assert.deepEqual( + checkConsumptionResult({ + from_grid: 1, + to_grid: 1, + solar: 1, + to_battery: 1, + from_battery: 0, + }), + { + grid_to_battery: 1, + battery_to_grid: 0, + used_solar: 0, + used_grid: 0, + used_battery: 0, + solar_to_battery: 0, + solar_to_grid: 1, + used_total: 0, + } + ); + }); }); From 2b7b17625e6a1efddf86a8e001247ac6abf5bac1 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Thu, 1 May 2025 09:25:18 +0200 Subject: [PATCH 016/247] Hide the tab when view is a subview (#25256) --- src/panels/lovelace/hui-root.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/panels/lovelace/hui-root.ts b/src/panels/lovelace/hui-root.ts index 883fab5089..8083dd947c 100644 --- a/src/panels/lovelace/hui-root.ts +++ b/src/panels/lovelace/hui-root.ts @@ -300,6 +300,12 @@ class HUIRoot extends LitElement { const background = curViewConfig?.background || this.config.background; + const _isTabHiddenForUser = (view: LovelaceViewConfig) => + view.visible !== undefined && + ((Array.isArray(view.visible) && + !view.visible.some((e) => e.user === this.hass!.user?.id)) || + view.visible === false); + const tabs = html` ${views.map( (view, index) => html` @@ -311,13 +317,7 @@ class HUIRoot extends LitElement { class=${classMap({ icon: Boolean(view.icon), "hide-tab": Boolean( - !this._editMode && - view.visible !== undefined && - ((Array.isArray(view.visible) && - !view.visible.some( - (e) => e.user === this.hass!.user?.id - )) || - view.visible === false) + !this._editMode && (view.subview || _isTabHiddenForUser(view)) ), })} > From c26fb1713d7b10db28a5fd18b69453a3d8398ead Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 1 May 2025 08:57:56 -0400 Subject: [PATCH 017/247] Import missing components on init page (#25269) --- src/layouts/ha-init-page.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/layouts/ha-init-page.ts b/src/layouts/ha-init-page.ts index 84cd396569..af33535a32 100644 --- a/src/layouts/ha-init-page.ts +++ b/src/layouts/ha-init-page.ts @@ -1,6 +1,8 @@ import type { PropertyValues } from "lit"; import { css, html, LitElement } from "lit"; import { property, state } from "lit/decorators"; +import "@material/mwc-button"; +import "../components/ha-spinner"; class HaInitPage extends LitElement { @property({ type: Boolean }) public error = false; From 4ed8ecad01488338f10825bfedd7fb0cc321943a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 19:01:35 +0200 Subject: [PATCH 018/247] Update vaadinWebComponents monorepo to v24.7.5 (#25268) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 170 +++++++++++++++++++++++++-------------------------- 2 files changed, 87 insertions(+), 87 deletions(-) diff --git a/package.json b/package.json index 7539a9df0c..55bdd1bb08 100644 --- a/package.json +++ b/package.json @@ -89,8 +89,8 @@ "@thomasloven/round-slider": "0.6.0", "@tsparticles/engine": "3.8.1", "@tsparticles/preset-links": "3.2.0", - "@vaadin/combo-box": "24.7.4", - "@vaadin/vaadin-themable-mixin": "24.7.4", + "@vaadin/combo-box": "24.7.5", + "@vaadin/vaadin-themable-mixin": "24.7.5", "@vibrant/color": "4.0.0", "@vue/web-component-wrapper": "1.3.0", "@webcomponents/scoped-custom-element-registry": "0.0.10", diff --git a/yarn.lock b/yarn.lock index b18c7ecb8e..0cc5dc816e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4945,131 +4945,131 @@ __metadata: languageName: node linkType: hard -"@vaadin/a11y-base@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/a11y-base@npm:24.7.4" +"@vaadin/a11y-base@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/a11y-base@npm:24.7.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.7.4" + "@vaadin/component-base": "npm:~24.7.5" lit: "npm:^3.0.0" - checksum: 10/cee80ce69d408954fb4726ce1b10641fdc067b6a794f44272b29724a31b0cc91301906ee63e3c758aeb0adec08c1f41f408d43c78d893cfc81aa22e101760e4b + checksum: 10/0062a6b971c7146ca7a721d9d073036ec9425d8741680dc5e71724fb49a366d4dede28e32af91c833e139247e705db7969c3c29b03ed12f54dddb1074f641914 languageName: node linkType: hard -"@vaadin/combo-box@npm:24.7.4": - version: 24.7.4 - resolution: "@vaadin/combo-box@npm:24.7.4" +"@vaadin/combo-box@npm:24.7.5": + version: 24.7.5 + resolution: "@vaadin/combo-box@npm:24.7.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/a11y-base": "npm:~24.7.4" - "@vaadin/component-base": "npm:~24.7.4" - "@vaadin/field-base": "npm:~24.7.4" - "@vaadin/input-container": "npm:~24.7.4" - "@vaadin/item": "npm:~24.7.4" - "@vaadin/lit-renderer": "npm:~24.7.4" - "@vaadin/overlay": "npm:~24.7.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.7.4" - "@vaadin/vaadin-material-styles": "npm:~24.7.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.7.4" + "@vaadin/a11y-base": "npm:~24.7.5" + "@vaadin/component-base": "npm:~24.7.5" + "@vaadin/field-base": "npm:~24.7.5" + "@vaadin/input-container": "npm:~24.7.5" + "@vaadin/item": "npm:~24.7.5" + "@vaadin/lit-renderer": "npm:~24.7.5" + "@vaadin/overlay": "npm:~24.7.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.7.5" + "@vaadin/vaadin-material-styles": "npm:~24.7.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.7.5" lit: "npm:^3.0.0" - checksum: 10/567a06b6be2d0e124a50265bf10688a399c208a7b3ae0e63e1479c9b42c1ff3e1573a50824297973053a5e346a796ece26f94b5a5c82495c6eac8661b03bd5b9 + checksum: 10/f295ca5403987307645778b0e7b8e10063c4eac5c30dbfb931daf4c71346032d926b25e31c156263dc7be35363cc65f4348b6e84ce8f1de9ed790038916f6f3f languageName: node linkType: hard -"@vaadin/component-base@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/component-base@npm:24.7.4" +"@vaadin/component-base@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/component-base@npm:24.7.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" "@vaadin/vaadin-development-mode-detector": "npm:^2.0.0" "@vaadin/vaadin-usage-statistics": "npm:^2.1.0" lit: "npm:^3.0.0" - checksum: 10/39b653fa3066b8488aadf45b1a7e77a910f8b17da64e2d49134bf24951d4d90af915bef48ee9440acef23123e9bcf3065e5ace5846e299285632e0e66ed3ae2c + checksum: 10/33a8e421cd01efe85e536dcf035d6fcd438b74939fa5de4d98940c7914015749eb3bcf9d05e131fec7b4f9f04f40b7782067e633eae40f83ed7ab3bc327f6a01 languageName: node linkType: hard -"@vaadin/field-base@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/field-base@npm:24.7.4" +"@vaadin/field-base@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/field-base@npm:24.7.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/a11y-base": "npm:~24.7.4" - "@vaadin/component-base": "npm:~24.7.4" + "@vaadin/a11y-base": "npm:~24.7.5" + "@vaadin/component-base": "npm:~24.7.5" lit: "npm:^3.0.0" - checksum: 10/304f46782bd17f03bf07b00d3b0551a4f30fa6c40cb1d948c719741d44b264b2f7e8bd7d9a56dfbc5ddbc3d8beb588b81311be228fa6086beb600212e42e5831 + checksum: 10/d0d2e6659780f3ed2bd1f92c58b17e6e0a029911f0392aa199ad297ea46455e34048f2ff424d6952de544c393bca80867a5dc324a0a8d6fefa6160194eadc84c languageName: node linkType: hard -"@vaadin/icon@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/icon@npm:24.7.4" +"@vaadin/icon@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/icon@npm:24.7.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.7.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.7.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.7.4" + "@vaadin/component-base": "npm:~24.7.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.7.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.7.5" lit: "npm:^3.0.0" - checksum: 10/acfb412eef7a2f077348fdbe0567afef8ee82d962264ef7a7b1661cb3a5ae838c3cae3c9edec735ff99e9bfaeb17cd882c854dc1932663c1a252b0bbe1a61324 + checksum: 10/e97ed19cc75682dd6635451d973c34de04860a7c3e558b838dede569e7c81797d973b255b2ae4555052b2f5c6c2a86688b4864eb833e148e78f44e134130048f languageName: node linkType: hard -"@vaadin/input-container@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/input-container@npm:24.7.4" +"@vaadin/input-container@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/input-container@npm:24.7.5" dependencies: "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.7.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.7.4" - "@vaadin/vaadin-material-styles": "npm:~24.7.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.7.4" + "@vaadin/component-base": "npm:~24.7.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.7.5" + "@vaadin/vaadin-material-styles": "npm:~24.7.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.7.5" lit: "npm:^3.0.0" - checksum: 10/8ff1da4fe8d8fb9d7542e2a6c3744c104b825e3cc435d14f67c62e6c7993b5561d134c7b4026dd0c2106833a0cf12df2e9ba44e77e96c67a5a3ddb0ff66b4be1 + checksum: 10/35c85b4fc7e3dbba0354568a128d19f4cba902a4e86fc8f81cddaa2d76edc92e733bf3e1008a5e5d51cef6b87f86f8030f53e7081ab793279afe09ca705b119a languageName: node linkType: hard -"@vaadin/item@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/item@npm:24.7.4" +"@vaadin/item@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/item@npm:24.7.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/a11y-base": "npm:~24.7.4" - "@vaadin/component-base": "npm:~24.7.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.7.4" - "@vaadin/vaadin-material-styles": "npm:~24.7.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.7.4" + "@vaadin/a11y-base": "npm:~24.7.5" + "@vaadin/component-base": "npm:~24.7.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.7.5" + "@vaadin/vaadin-material-styles": "npm:~24.7.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.7.5" lit: "npm:^3.0.0" - checksum: 10/e14184258f4614b382f7795c1bf3e25bd74c717542812ea1cf2a53849a1cef6ab318dd5482ecb1dc51bd8c4a06aaff6c68dc573ba1c9d30f89dedece70fc1d50 + checksum: 10/ef5c68a3a43d968d94b7651dd2588c5b03a9bc0c56fe036b8abc4c07af87f9f995bd382ff62a64d9a8a46b12b8f06ce8bda87379d5871a816a0177380c98cc30 languageName: node linkType: hard -"@vaadin/lit-renderer@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/lit-renderer@npm:24.7.4" +"@vaadin/lit-renderer@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/lit-renderer@npm:24.7.5" dependencies: lit: "npm:^3.0.0" - checksum: 10/22ada093a3516de1f3701212b52a2b0cfd7d5230b3b73194b651015b9d9a6e9fd3418541baf8478f0b409de7596c17e3876744f1970e80e7af886b3eb2d3d89c + checksum: 10/e50899146f66b11c3e0b4a2725c92849ea6efb8663c4de2b4a773d07ce4f2b2e8cf2a28476720c0f9aeab4754280f4ba5fef9dbafefd0a45cde348f1caf7f781 languageName: node linkType: hard -"@vaadin/overlay@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/overlay@npm:24.7.4" +"@vaadin/overlay@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/overlay@npm:24.7.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" "@polymer/polymer": "npm:^3.0.0" - "@vaadin/a11y-base": "npm:~24.7.4" - "@vaadin/component-base": "npm:~24.7.4" - "@vaadin/vaadin-lumo-styles": "npm:~24.7.4" - "@vaadin/vaadin-material-styles": "npm:~24.7.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.7.4" + "@vaadin/a11y-base": "npm:~24.7.5" + "@vaadin/component-base": "npm:~24.7.5" + "@vaadin/vaadin-lumo-styles": "npm:~24.7.5" + "@vaadin/vaadin-material-styles": "npm:~24.7.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.7.5" lit: "npm:^3.0.0" - checksum: 10/f3f185f472577ccd8ac58cfc549e53e45f413c3e39b1e967f19470f391a53e71682de239722357742f67b390579e69127a06d8feccc03da1c80bb1ad37f9341e + checksum: 10/04c301e0ccadc415b316721f76c2245e3c4360a853c450ac86c81a7ba593d62d0a3137d3f576b13bbffde9a19d0cb8a0a791e4f4f84cd6e80ba9d7e5c10c7e99 languageName: node linkType: hard @@ -5080,36 +5080,36 @@ __metadata: languageName: node linkType: hard -"@vaadin/vaadin-lumo-styles@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/vaadin-lumo-styles@npm:24.7.4" +"@vaadin/vaadin-lumo-styles@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/vaadin-lumo-styles@npm:24.7.5" dependencies: "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.7.4" - "@vaadin/icon": "npm:~24.7.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.7.4" - checksum: 10/c068dea090d953c191a1ccfcbad4cbde72d1bc16544f15ff36c6e3b5a8cd4ccdb1a9052c99d599e55dcb0490b0f619f2c3772e376b984f89f619452ebf1ddad8 + "@vaadin/component-base": "npm:~24.7.5" + "@vaadin/icon": "npm:~24.7.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.7.5" + checksum: 10/e3119697782506de68fbdff15e75f0cb3e83579456a36590c95e43599fecae7ffcfabda9e830405fef4e997417a3000bd3d5142ac855c84c49bc6dcc3d8edd90 languageName: node linkType: hard -"@vaadin/vaadin-material-styles@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/vaadin-material-styles@npm:24.7.4" +"@vaadin/vaadin-material-styles@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/vaadin-material-styles@npm:24.7.5" dependencies: "@polymer/polymer": "npm:^3.0.0" - "@vaadin/component-base": "npm:~24.7.4" - "@vaadin/vaadin-themable-mixin": "npm:~24.7.4" - checksum: 10/fb5ce1a23edc491ca7baeb7c6c3e1dfbd6c0917073eb9f39fbd1c1a7dd59437df84dc9c21657f06c1df111e6d7c8ada179cb5f5851ae90c7533d1eadf956bd31 + "@vaadin/component-base": "npm:~24.7.5" + "@vaadin/vaadin-themable-mixin": "npm:~24.7.5" + checksum: 10/59233d3482536152d1b5744bcc5066327a6f468db20be2cbb72f3be2a250165fe0cb13b9d90b68ce70642f24668f72d4d50f7d96579a78db9e30eb61848cd158 languageName: node linkType: hard -"@vaadin/vaadin-themable-mixin@npm:24.7.4, @vaadin/vaadin-themable-mixin@npm:~24.7.4": - version: 24.7.4 - resolution: "@vaadin/vaadin-themable-mixin@npm:24.7.4" +"@vaadin/vaadin-themable-mixin@npm:24.7.5, @vaadin/vaadin-themable-mixin@npm:~24.7.5": + version: 24.7.5 + resolution: "@vaadin/vaadin-themable-mixin@npm:24.7.5" dependencies: "@open-wc/dedupe-mixin": "npm:^1.3.0" lit: "npm:^3.0.0" - checksum: 10/45776bd729530cd38ccd8573ea6b112c46eda2ad6615c9e1cab751609a3063600781cfecb01148c8d8ebfed6beeed10c944a05ca8d05ae4b459d170f15cf6044 + checksum: 10/da8737da379680e81360e91e7818fbbc425232bb6facd1f27ee1159eb8915af28f3245212955d778bbbdc61d36c1b5e48893600b03ec49f3036b3cc9100b0bea languageName: node linkType: hard @@ -9297,8 +9297,8 @@ __metadata: "@types/tar": "npm:6.1.13" "@types/ua-parser-js": "npm:0.7.39" "@types/webspeechapi": "npm:0.0.29" - "@vaadin/combo-box": "npm:24.7.4" - "@vaadin/vaadin-themable-mixin": "npm:24.7.4" + "@vaadin/combo-box": "npm:24.7.5" + "@vaadin/vaadin-themable-mixin": "npm:24.7.5" "@vibrant/color": "npm:4.0.0" "@vitest/coverage-v8": "npm:3.1.2" "@vue/web-component-wrapper": "npm:1.3.0" From ebc16d65204c863d13cc1af3a5d4679e24636b82 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 19:01:39 +0200 Subject: [PATCH 019/247] Update rspack monorepo to v1.3.8 (#25267) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- yarn.lock | 102 +++++++++++++++++++++++++-------------------------- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index 55bdd1bb08..888078b417 100644 --- a/package.json +++ b/package.json @@ -160,8 +160,8 @@ "@octokit/plugin-retry": "7.2.1", "@octokit/rest": "21.1.1", "@rsdoctor/rspack-plugin": "1.0.2", - "@rspack/cli": "1.3.7", - "@rspack/core": "1.3.7", + "@rspack/cli": "1.3.8", + "@rspack/core": "1.3.8", "@types/babel__plugin-transform-runtime": "7.9.5", "@types/chromecast-caf-receiver": "6.0.21", "@types/chromecast-caf-sender": "1.0.11", diff --git a/yarn.lock b/yarn.lock index 0cc5dc816e..27c961711d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3872,82 +3872,82 @@ __metadata: languageName: node linkType: hard -"@rspack/binding-darwin-arm64@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding-darwin-arm64@npm:1.3.7" +"@rspack/binding-darwin-arm64@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-darwin-arm64@npm:1.3.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-darwin-x64@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding-darwin-x64@npm:1.3.7" +"@rspack/binding-darwin-x64@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-darwin-x64@npm:1.3.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rspack/binding-linux-arm64-gnu@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding-linux-arm64-gnu@npm:1.3.7" +"@rspack/binding-linux-arm64-gnu@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.3.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-arm64-musl@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding-linux-arm64-musl@npm:1.3.7" +"@rspack/binding-linux-arm64-musl@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.3.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rspack/binding-linux-x64-gnu@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding-linux-x64-gnu@npm:1.3.7" +"@rspack/binding-linux-x64-gnu@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.3.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rspack/binding-linux-x64-musl@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding-linux-x64-musl@npm:1.3.7" +"@rspack/binding-linux-x64-musl@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-linux-x64-musl@npm:1.3.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rspack/binding-win32-arm64-msvc@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding-win32-arm64-msvc@npm:1.3.7" +"@rspack/binding-win32-arm64-msvc@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.3.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rspack/binding-win32-ia32-msvc@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding-win32-ia32-msvc@npm:1.3.7" +"@rspack/binding-win32-ia32-msvc@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.3.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rspack/binding-win32-x64-msvc@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding-win32-x64-msvc@npm:1.3.7" +"@rspack/binding-win32-x64-msvc@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.3.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rspack/binding@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/binding@npm:1.3.7" +"@rspack/binding@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/binding@npm:1.3.8" dependencies: - "@rspack/binding-darwin-arm64": "npm:1.3.7" - "@rspack/binding-darwin-x64": "npm:1.3.7" - "@rspack/binding-linux-arm64-gnu": "npm:1.3.7" - "@rspack/binding-linux-arm64-musl": "npm:1.3.7" - "@rspack/binding-linux-x64-gnu": "npm:1.3.7" - "@rspack/binding-linux-x64-musl": "npm:1.3.7" - "@rspack/binding-win32-arm64-msvc": "npm:1.3.7" - "@rspack/binding-win32-ia32-msvc": "npm:1.3.7" - "@rspack/binding-win32-x64-msvc": "npm:1.3.7" + "@rspack/binding-darwin-arm64": "npm:1.3.8" + "@rspack/binding-darwin-x64": "npm:1.3.8" + "@rspack/binding-linux-arm64-gnu": "npm:1.3.8" + "@rspack/binding-linux-arm64-musl": "npm:1.3.8" + "@rspack/binding-linux-x64-gnu": "npm:1.3.8" + "@rspack/binding-linux-x64-musl": "npm:1.3.8" + "@rspack/binding-win32-arm64-msvc": "npm:1.3.8" + "@rspack/binding-win32-ia32-msvc": "npm:1.3.8" + "@rspack/binding-win32-x64-msvc": "npm:1.3.8" dependenciesMeta: "@rspack/binding-darwin-arm64": optional: true @@ -3967,13 +3967,13 @@ __metadata: optional: true "@rspack/binding-win32-x64-msvc": optional: true - checksum: 10/be10f347dda43b04eb2b66cd17a53de89e211b14906dc6506a756037551e5a40df95cf66a91a8e12da63b5b0d0e6835a27853d38f9d0d404be211c0b6c059be3 + checksum: 10/2b4427240e97899845b08f592af4f806884b49e192fb2b5a93f450f11c97a3ecbef581bb32b9cf1b2bfca48fd65426a978011f04fc7484307e84005ffd174211 languageName: node linkType: hard -"@rspack/cli@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/cli@npm:1.3.7" +"@rspack/cli@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/cli@npm:1.3.8" dependencies: "@discoveryjs/json-ext": "npm:^0.5.7" "@rspack/dev-server": "npm:1.1.1" @@ -3987,16 +3987,16 @@ __metadata: "@rspack/core": ^1.0.0-alpha || ^1.x bin: rspack: bin/rspack.js - checksum: 10/d7ad97c49eb71dd0f8f614aa85a63eaa8071307c9af18ce287f3f146310ef937bdc1887445ec227600d578a89cc32d716baaf5dfb47fab5943b3e64f0c6ec82e + checksum: 10/0177e51c5c17d7da9126ffdbd112c424b070f443c7f2a7bc2136acb8ab663dcb5e85126b4bf1f31b06d26f3aa1471c7db26ad2dd802b5f89bb038a643f2f2404 languageName: node linkType: hard -"@rspack/core@npm:1.3.7": - version: 1.3.7 - resolution: "@rspack/core@npm:1.3.7" +"@rspack/core@npm:1.3.8": + version: 1.3.8 + resolution: "@rspack/core@npm:1.3.8" dependencies: "@module-federation/runtime-tools": "npm:0.13.0" - "@rspack/binding": "npm:1.3.7" + "@rspack/binding": "npm:1.3.8" "@rspack/lite-tapable": "npm:1.0.1" caniuse-lite: "npm:^1.0.30001715" peerDependencies: @@ -4004,7 +4004,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/0a32f9dff39f84aa5300077cef513a783d23c6995effeeafc7783edba3a1ecd1633b7682d1688606ec40ffc45046445904542b96f2cfa8d3fc120eba77a9731f + checksum: 10/e2f3fd21d512faa3865a784f219f92b78497713e0e9dd2fd03c4ec6c9bcfa33c53c301f9d5c5546dd7e86e8e46309b0aef3ab6f1661fed10c622482b8717b588 languageName: node linkType: hard @@ -9272,8 +9272,8 @@ __metadata: "@octokit/rest": "npm:21.1.1" "@replit/codemirror-indentation-markers": "npm:6.5.3" "@rsdoctor/rspack-plugin": "npm:1.0.2" - "@rspack/cli": "npm:1.3.7" - "@rspack/core": "npm:1.3.7" + "@rspack/cli": "npm:1.3.8" + "@rspack/core": "npm:1.3.8" "@shoelace-style/shoelace": "npm:2.20.1" "@swc/helpers": "npm:0.5.17" "@thomasloven/round-slider": "npm:0.6.0" From dddba58d3893338bde5727056b7713a59d6baa31 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Thu, 1 May 2025 19:02:55 +0200 Subject: [PATCH 020/247] Always show backup location retention settings (#25261) Always show backup location retention settings --- .../backup/ha-config-backup-location.ts | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/panels/config/backup/ha-config-backup-location.ts b/src/panels/config/backup/ha-config-backup-location.ts index 6e5d5b585f..323ca5097c 100644 --- a/src/panels/config/backup/ha-config-backup-location.ts +++ b/src/panels/config/backup/ha-config-backup-location.ts @@ -118,19 +118,17 @@ class HaConfigBackupDetails extends LitElement {

` - : this.config?.agents[this.agentId] - ? html`` - : nothing} + : html``}
From f608783551e3d680823f6fa6ded3c48a9765d83e Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 1 May 2025 20:06:42 +0300 Subject: [PATCH 021/247] Improve error handling in automation i18n (#25266) --- .../entity/ha-entity-attribute-picker.ts | 16 +- src/data/automation_i18n.ts | 167 ++++++++++-------- 2 files changed, 103 insertions(+), 80 deletions(-) diff --git a/src/components/entity/ha-entity-attribute-picker.ts b/src/components/entity/ha-entity-attribute-picker.ts index 2468f6fe71..7e08060e33 100644 --- a/src/components/entity/ha-entity-attribute-picker.ts +++ b/src/components/entity/ha-entity-attribute-picker.ts @@ -73,16 +73,20 @@ class HaEntityAttributePicker extends LitElement { return nothing; } + const stateObj = this.hass.states[this.entityId!] as HassEntity | undefined; + return html` @@ -988,12 +1003,14 @@ const tryDescribeCondition = ( ); const attribute = condition.attribute - ? computeAttributeNameDisplay( - hass.localize, - stateObj, - hass.entities, - condition.attribute - ) + ? stateObj + ? computeAttributeNameDisplay( + hass.localize, + stateObj, + hass.entities, + condition.attribute + ) + : condition.attribute : undefined; if (condition.above !== undefined && condition.below !== undefined) { @@ -1187,7 +1204,9 @@ const tryDescribeCondition = ( if (localized) { return localized; } - const stateObj = hass.states[config.entity_id as string]; + const stateObj = hass.states[config.entity_id as string] as + | HassEntity + | undefined; return `${stateObj ? computeStateName(stateObj) : config.entity_id} ${ config.type }`; From d1a0eaece51efa3cf24fab605ab084de8658e213 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Fri, 2 May 2025 12:16:04 +0200 Subject: [PATCH 022/247] Add save shortcut to shortcuts dialog (#25271) --- src/dialogs/shortcuts/dialog-shortcuts.ts | 9 +++++++-- src/translations/en.json | 7 ++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/dialogs/shortcuts/dialog-shortcuts.ts b/src/dialogs/shortcuts/dialog-shortcuts.ts index 99a3710ba6..dbd85839ae 100644 --- a/src/dialogs/shortcuts/dialog-shortcuts.ts +++ b/src/dialogs/shortcuts/dialog-shortcuts.ts @@ -69,12 +69,17 @@ const _SHORTCUTS: Section[] = [ ], }, { - key: "ui.dialogs.shortcuts.automations.title", + key: "ui.dialogs.shortcuts.automation_script.title", items: [ { type: "shortcut", shortcut: [{ key: "ui.dialogs.shortcuts.shortcuts.ctrl_cmd" }, "V"], - key: "ui.dialogs.shortcuts.automations.paste", + key: "ui.dialogs.shortcuts.automation_script.paste", + }, + { + type: "shortcut", + shortcut: [{ key: "ui.dialogs.shortcuts.shortcuts.ctrl_cmd" }, "S"], + key: "ui.dialogs.shortcuts.automation_script.save", }, ], }, diff --git a/src/translations/en.json b/src/translations/en.json index c47cd875ad..af02f16e77 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -1938,9 +1938,10 @@ "title": "Assist", "open_assist": "open Assist dialog" }, - "automations": { - "title": "Automations", - "paste": "to paste automation YAML from clipboard to automation editor" + "automation_script": { + "title": "Automations / Scripts", + "paste": "to paste automation/script YAML from clipboard to editor", + "save": "to save automation/script" }, "charts": { "title": "Charts", From c07bf681616d102f4ff19b01bed3ce002af32924 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 12:16:28 +0200 Subject: [PATCH 023/247] Update dependency typescript-eslint to v8.31.1 (#25272) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 116 +++++++++++++++++++++++++-------------------------- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index 888078b417..32dd194dad 100644 --- a/package.json +++ b/package.json @@ -219,7 +219,7 @@ "terser-webpack-plugin": "5.3.14", "ts-lit-plugin": "2.0.2", "typescript": "5.8.3", - "typescript-eslint": "8.31.0", + "typescript-eslint": "8.31.1", "vite-tsconfig-paths": "5.1.4", "vitest": "3.1.2", "webpack-stats-plugin": "1.1.3", diff --git a/yarn.lock b/yarn.lock index 27c961711d..c84a990811 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4833,15 +4833,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.31.0": - version: 8.31.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.31.0" +"@typescript-eslint/eslint-plugin@npm:8.31.1": + version: 8.31.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.31.1" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.31.0" - "@typescript-eslint/type-utils": "npm:8.31.0" - "@typescript-eslint/utils": "npm:8.31.0" - "@typescript-eslint/visitor-keys": "npm:8.31.0" + "@typescript-eslint/scope-manager": "npm:8.31.1" + "@typescript-eslint/type-utils": "npm:8.31.1" + "@typescript-eslint/utils": "npm:8.31.1" + "@typescript-eslint/visitor-keys": "npm:8.31.1" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -4850,64 +4850,64 @@ __metadata: "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10/183ae3bdd56b7d87822a573c3312bca1e53c17956b618c2e84bf1e83f8015248251e85500370a80f2fec221e0dccf224e30a641edf138b42fe9be9362dd6476d + checksum: 10/be72838653e1f31da11b3f6515fa3b750f0c5c130bae315079920ee6b78e9c4d131790e2473ff7930e8d50dee45d623c9c90478fd78befb976c1736d369078e9 languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.31.0": - version: 8.31.0 - resolution: "@typescript-eslint/parser@npm:8.31.0" +"@typescript-eslint/parser@npm:8.31.1": + version: 8.31.1 + resolution: "@typescript-eslint/parser@npm:8.31.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.31.0" - "@typescript-eslint/types": "npm:8.31.0" - "@typescript-eslint/typescript-estree": "npm:8.31.0" - "@typescript-eslint/visitor-keys": "npm:8.31.0" + "@typescript-eslint/scope-manager": "npm:8.31.1" + "@typescript-eslint/types": "npm:8.31.1" + "@typescript-eslint/typescript-estree": "npm:8.31.1" + "@typescript-eslint/visitor-keys": "npm:8.31.1" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10/468f9f9cc6e4685f88b8924bddd104ce940d48b63782a70682d46996c041676ba21d99b6561cac1dfbdcd9f57da9c80369283fec6c240c936b9d7948ac76d98e + checksum: 10/506c98b9c265faea4376f02e4d19b4722cd11c40f8e08e4c1b456eeb47bc59b70abaa604e633f1070eaf7c785cf7b39f30346f001d3e5257f8074f07a113eeff languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.31.0": - version: 8.31.0 - resolution: "@typescript-eslint/scope-manager@npm:8.31.0" +"@typescript-eslint/scope-manager@npm:8.31.1": + version: 8.31.1 + resolution: "@typescript-eslint/scope-manager@npm:8.31.1" dependencies: - "@typescript-eslint/types": "npm:8.31.0" - "@typescript-eslint/visitor-keys": "npm:8.31.0" - checksum: 10/4ca30db2e6186415bcfa5bba24f55f3508c383d755cc3599c08087b04587276620b5d094439cd3df3e88bce25ad0f5bd2a4a7473ae59410c8ff9e72f87d7648e + "@typescript-eslint/types": "npm:8.31.1" + "@typescript-eslint/visitor-keys": "npm:8.31.1" + checksum: 10/936aa866ba3564e9e41051e7ff811e08c9b01cbb7420ba2cd8fe8f0f466e5d59a8124b686744cfdecad211cdeefefaaf7d704aecddaa212f267d72e077dc7e44 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.31.0": - version: 8.31.0 - resolution: "@typescript-eslint/type-utils@npm:8.31.0" +"@typescript-eslint/type-utils@npm:8.31.1": + version: 8.31.1 + resolution: "@typescript-eslint/type-utils@npm:8.31.1" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.31.0" - "@typescript-eslint/utils": "npm:8.31.0" + "@typescript-eslint/typescript-estree": "npm:8.31.1" + "@typescript-eslint/utils": "npm:8.31.1" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.0.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10/b17aba3e9a7a2b4d7135345ce56a1dc4a3592335ba0ed956111abc9044bedb02a8382a2d3fc064f4a2f1ffe6023555db1930cf836bce447a1ac08c496212fabe + checksum: 10/d4c31837c1beb55f7037b0d94c2d73a855c7d921b3b07d68f6d7b476c475765f7707c7375f6190c1863e98e1bc98b8ce444806ab6a02759811eff1c710ab82a6 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.31.0": - version: 8.31.0 - resolution: "@typescript-eslint/types@npm:8.31.0" - checksum: 10/937eca69241850ad94a5c93221191f2cbc448951f1672e913d106efe2bdd30d188c54d2502cbff5d4d9b3a95becf16387a20644239b1fee7458198cbdac4f923 +"@typescript-eslint/types@npm:8.31.1": + version: 8.31.1 + resolution: "@typescript-eslint/types@npm:8.31.1" + checksum: 10/18f534beb408398b8ed7f36fb9b9b8ff7e41fe6e5e8a7d0f6b16cc5ad0e55bb5920eeb28c71367e5cc7e0b9675ec961bc6a41bf58b4338c2264c0146322d83f5 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.31.0": - version: 8.31.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.31.0" +"@typescript-eslint/typescript-estree@npm:8.31.1": + version: 8.31.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.31.1" dependencies: - "@typescript-eslint/types": "npm:8.31.0" - "@typescript-eslint/visitor-keys": "npm:8.31.0" + "@typescript-eslint/types": "npm:8.31.1" + "@typescript-eslint/visitor-keys": "npm:8.31.1" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -4916,32 +4916,32 @@ __metadata: ts-api-utils: "npm:^2.0.1" peerDependencies: typescript: ">=4.8.4 <5.9.0" - checksum: 10/e2155504e2231e69c909e0268b63979e3829d4e5b3845c4272b72de3cb855d225c26639d9dc23b2753464a9f6c5c8a31665640a90e10da20eb9462eff9115261 + checksum: 10/0314ef90f277c76485182721662cf826c31c817acad04e9502b48352eb70bb109a6b7fad02a29d516413b0b1d1fc809c91016ccd5fcd6202ec1b282c6f848ff8 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.31.0": - version: 8.31.0 - resolution: "@typescript-eslint/utils@npm:8.31.0" +"@typescript-eslint/utils@npm:8.31.1": + version: 8.31.1 + resolution: "@typescript-eslint/utils@npm:8.31.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.31.0" - "@typescript-eslint/types": "npm:8.31.0" - "@typescript-eslint/typescript-estree": "npm:8.31.0" + "@typescript-eslint/scope-manager": "npm:8.31.1" + "@typescript-eslint/types": "npm:8.31.1" + "@typescript-eslint/typescript-estree": "npm:8.31.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10/9e8fcef36bff920ba4eacc4289efc74a9aa65462849061d37d3014286948c8318b031a852555c7a7fe9cdf646458a2f82f7138171f7072ac595293979d5fd3a4 + checksum: 10/c96253140f5a456b2dc4c9664d4527a88d8f537d9694e1f165665de20aea3936624cf93075f08f5cc2f5080e76021b9b2404a536d1b7980e38e3d1776c7c888c languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.31.0": - version: 8.31.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.31.0" +"@typescript-eslint/visitor-keys@npm:8.31.1": + version: 8.31.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.31.1" dependencies: - "@typescript-eslint/types": "npm:8.31.0" + "@typescript-eslint/types": "npm:8.31.1" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10/85417c4fb44735ace29201afa446e71bbdef074bf4543701c149eda22d51bf7b01c4da3ffc574dd9ef8b33ac4b5dea35a50326e413f223d2f5e73e4dc8e3c8ee + checksum: 10/14eb7e7ccb5fc29df979427b23729878d10deaa914d4eae1991c75c8ba88f3a2148889f03eeec09d1425a3b14fe37a10c2eafda60874c7020f620fd42d31fd5a languageName: node linkType: hard @@ -9382,7 +9382,7 @@ __metadata: tinykeys: "npm:3.0.0" ts-lit-plugin: "npm:2.0.2" typescript: "npm:5.8.3" - typescript-eslint: "npm:8.31.0" + typescript-eslint: "npm:8.31.1" ua-parser-js: "npm:2.0.3" vis-data: "npm:7.1.9" vis-network: "npm:9.1.9" @@ -14453,17 +14453,17 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:8.31.0": - version: 8.31.0 - resolution: "typescript-eslint@npm:8.31.0" +"typescript-eslint@npm:8.31.1": + version: 8.31.1 + resolution: "typescript-eslint@npm:8.31.1" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.31.0" - "@typescript-eslint/parser": "npm:8.31.0" - "@typescript-eslint/utils": "npm:8.31.0" + "@typescript-eslint/eslint-plugin": "npm:8.31.1" + "@typescript-eslint/parser": "npm:8.31.1" + "@typescript-eslint/utils": "npm:8.31.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10/2984699104cacae4f553314c393b8c90bf31c9f327ebade848daa46eec93acf182ae54b87e2e319188eccf0a712d5f2e96bb82fc6aa4d2af24bc89c6919a424f + checksum: 10/becb67b353bf9e36a924f71dba7315bad1ae6c697dcbfa3510f2bacd7a95074ee5c56bb288c77f486a6b2345c92ca68201edb2145fafca6925842075224070d6 languageName: node linkType: hard From b0d4c699dbe58079546fdc36eeab9fdfcf296acc Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 2 May 2025 05:46:36 -0500 Subject: [PATCH 024/247] Add my links for the Bluetooth monitors (#25270) The plan is to link these in the Bluetooth docs for help debugging --- src/panels/my/ha-panel-my.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index 110e540fbb..cd78c52e55 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -110,6 +110,14 @@ export const getMyRedirects = (): Redirects => ({ component: "bluetooth", redirect: "/config/bluetooth", }, + bluetooth_advertisement_monitor: { + component: "bluetooth", + redirect: "/config/bluetooth/advertisement-monitor", + }, + bluetooth_connection_monitor: { + component: "bluetooth", + redirect: "/config/bluetooth/connection-monitor", + }, config_dhcp: { component: "dhcp", redirect: "/config/dhcp", From b4f1c8755d7172862101fb6856ca3524b7491a5e Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Fri, 2 May 2025 06:19:12 -0700 Subject: [PATCH 025/247] Fix disabled language picker (#25278) --- src/components/ha-language-picker.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/ha-language-picker.ts b/src/components/ha-language-picker.ts index f771871756..9940b75184 100644 --- a/src/components/ha-language-picker.ts +++ b/src/components/ha-language-picker.ts @@ -102,7 +102,7 @@ export class HaLanguagePicker extends LitElement { localeChanged ) { this._select.layoutOptions(); - if (this._select.value !== this.value) { + if (!this.disabled && this._select.value !== this.value) { fireEvent(this, "value-changed", { value: this._select.value }); } if (!this.value) { @@ -141,7 +141,10 @@ export class HaLanguagePicker extends LitElement { ); const value = - this.value ?? (this.required ? languageOptions[0]?.value : this.value); + this.value ?? + (this.required && !this.disabled + ? languageOptions[0]?.value + : this.value); return html` Date: Fri, 2 May 2025 17:47:20 +0300 Subject: [PATCH 026/247] Fix alignment of ha-labeled-slider (#25279) --- src/components/ha-labeled-slider.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/ha-labeled-slider.ts b/src/components/ha-labeled-slider.ts index 8a54a14496..483d5aefd6 100644 --- a/src/components/ha-labeled-slider.ts +++ b/src/components/ha-labeled-slider.ts @@ -30,8 +30,9 @@ class HaLabeledSlider extends LitElement { @property({ type: Number }) public value?: number; protected render() { + const title = this._getTitle(); return html` -
${this._getTitle()}
+ ${title ? html`
${title}
` : nothing}
${this.icon ? html`` : nothing} @@ -73,17 +74,20 @@ class HaLabeledSlider extends LitElement { .slider-container { display: flex; + align-items: center; } ha-icon { - margin-top: 8px; color: var(--secondary-text-color); } ha-slider { + display: flex; flex-grow: 1; + align-items: center; background-image: var(--ha-slider-background); border-radius: 4px; + height: 32px; } `; } From b4e8c56f586ae340fbc5ac0abd8315dd7158d054 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Fri, 2 May 2025 19:21:38 +0300 Subject: [PATCH 027/247] Fix decorators with properties (#25282) * Fix decorators with properties * Green build --------- Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com> --- src/common/decorators/storage.ts | 12 ++---------- src/common/decorators/transform.ts | 14 +------------- src/components/ha-sidebar.ts | 2 ++ src/components/media-player/ha-browse-media-tts.ts | 1 + .../ha-voice-command-dialog.ts | 1 + src/panels/calendar/ha-panel-calendar.ts | 1 + .../ha-config-application-credentials.ts | 1 + .../automation/action/ha-automation-action.ts | 1 + .../condition/ha-automation-condition.ts | 1 + .../config/automation/ha-automation-editor.ts | 1 + .../config/automation/ha-automation-picker.ts | 2 ++ .../automation/option/ha-automation-option.ts | 1 + .../automation/trigger/ha-automation-trigger.ts | 1 + .../config/backup/ha-config-backup-backups.ts | 1 + .../config/blueprint/ha-blueprint-overview.ts | 9 ++++++--- .../config/devices/ha-config-devices-dashboard.ts | 2 ++ src/panels/config/entities/ha-config-entities.ts | 2 ++ src/panels/config/helpers/ha-config-helpers.ts | 1 + .../integration-panels/mqtt/mqtt-config-panel.ts | 7 ++++++- .../integration-panels/mqtt/mqtt-subscribe-card.ts | 3 +++ src/panels/config/labels/ha-config-labels.ts | 1 + .../dashboards/ha-config-lovelace-dashboards.ts | 1 + .../resources/ha-config-lovelace-resources.ts | 1 + src/panels/config/scene/ha-scene-dashboard.ts | 2 ++ src/panels/config/script/ha-script-editor.ts | 1 + src/panels/config/script/ha-script-picker.ts | 2 ++ src/panels/config/tags/ha-config-tags.ts | 1 + .../ha-config-voice-assistants-expose.ts | 1 + .../action/developer-tools-action.ts | 2 ++ .../assist/developer-tools-assist.ts | 1 + .../developer-tools/state/developer-tools-state.ts | 1 + src/panels/history/ha-panel-history.ts | 1 + src/panels/logbook/ha-panel-logbook.ts | 1 + .../energy/hui-energy-devices-detail-graph-card.ts | 1 + src/panels/lovelace/cards/hui-button-card.ts | 2 ++ .../editor/badge-editor/hui-badge-picker.ts | 1 + .../lovelace/editor/card-editor/hui-card-picker.ts | 1 + src/panels/media-browser/ha-panel-media-browser.ts | 2 ++ src/panels/todo/ha-panel-todo.ts | 3 ++- 39 files changed, 62 insertions(+), 28 deletions(-) diff --git a/src/common/decorators/storage.ts b/src/common/decorators/storage.ts index 82e67cd32f..03d4176548 100644 --- a/src/common/decorators/storage.ts +++ b/src/common/decorators/storage.ts @@ -1,6 +1,5 @@ import type { UnsubscribeFunc } from "home-assistant-js-websocket"; -import { ReactiveElement } from "lit"; -import type { InternalPropertyDeclaration } from "lit/decorators"; +import type { ReactiveElement } from "lit"; type Callback = (oldValue: any, newValue: any) => void; @@ -108,7 +107,6 @@ export function storage(options: { storage?: "localStorage" | "sessionStorage"; subscribe?: boolean; state?: boolean; - stateOptions?: InternalPropertyDeclaration; serializer?: (value: any) => any; deserializer?: (value: any) => any; }) { @@ -174,7 +172,7 @@ export function storage(options: { performUpdate.call(this); }; - if (options.state && options.subscribe) { + if (options.subscribe) { const connectedCallback = proto.connectedCallback; const disconnectedCallback = proto.disconnectedCallback; @@ -192,12 +190,6 @@ export function storage(options: { el.__unbsubLocalStorage = undefined; }; } - if (options.state) { - ReactiveElement.createProperty(propertyKey, { - noAccessor: true, - ...options.stateOptions, - }); - } const descriptor = Object.getOwnPropertyDescriptor(proto, propertyKey); let newDescriptor: PropertyDescriptor; diff --git a/src/common/decorators/transform.ts b/src/common/decorators/transform.ts index ee02be719b..b6ac2717d4 100644 --- a/src/common/decorators/transform.ts +++ b/src/common/decorators/transform.ts @@ -1,10 +1,4 @@ -import { - ReactiveElement, - type PropertyDeclaration, - type PropertyValues, -} from "lit"; -import { shallowEqual } from "../util/shallow-equal"; - +import type { ReactiveElement, PropertyValues } from "lit"; /** * Transform function type. */ @@ -23,7 +17,6 @@ type ReactiveTransformElement = ReactiveElement & { export function transform(config: { transformer: Transformer; watch?: PropertyKey[]; - propertyOptions?: PropertyDeclaration; }) { return ( proto: ElemClass, @@ -84,11 +77,6 @@ export function transform(config: { curWatch.add(propertyKey); }); } - ReactiveElement.createProperty(propertyKey, { - noAccessor: true, - hasChanged: (v: any, o: any) => !shallowEqual(v, o), - ...config.propertyOptions, - }); const descriptor = Object.getOwnPropertyDescriptor(proto, propertyKey); let newDescriptor: PropertyDescriptor; diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index 9b9695a765..b59b15405e 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -210,6 +210,7 @@ class HaSidebar extends SubscribeMixin(LitElement) { private _unsubPersistentNotifications: UnsubscribeFunc | undefined; + @state() @storage({ key: "sidebarPanelOrder", state: true, @@ -217,6 +218,7 @@ class HaSidebar extends SubscribeMixin(LitElement) { }) private _panelOrder: string[] = []; + @state() @storage({ key: "sidebarHiddenPanels", state: true, diff --git a/src/components/media-player/ha-browse-media-tts.ts b/src/components/media-player/ha-browse-media-tts.ts index 2e0be9526e..e6fbdd62d7 100644 --- a/src/components/media-player/ha-browse-media-tts.ts +++ b/src/components/media-player/ha-browse-media-tts.ts @@ -42,6 +42,7 @@ class BrowseMediaTTS extends LitElement { @state() private _provider?: TTSEngine; + @state() @storage({ key: "TtsMessage", state: true, diff --git a/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts b/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts index 60aa04fb11..1b2a0e88a0 100644 --- a/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts +++ b/src/dialogs/voice-command-dialog/ha-voice-command-dialog.ts @@ -36,6 +36,7 @@ export class HaVoiceCommandDialog extends LitElement { @state() private _opened = false; + @state() @storage({ key: "AssistPipelineId", state: true, diff --git a/src/panels/calendar/ha-panel-calendar.ts b/src/panels/calendar/ha-panel-calendar.ts index b27b52874a..73cd194e4e 100644 --- a/src/panels/calendar/ha-panel-calendar.ts +++ b/src/panels/calendar/ha-panel-calendar.ts @@ -42,6 +42,7 @@ class PanelCalendar extends LitElement { @state() private _error?: string = undefined; + @state() @storage({ key: "deSelectedCalendars", state: true, diff --git a/src/panels/config/application_credentials/ha-config-application-credentials.ts b/src/panels/config/application_credentials/ha-config-application-credentials.ts index cb2fa6c5db..0ddb6f89da 100644 --- a/src/panels/config/application_credentials/ha-config-application-credentials.ts +++ b/src/panels/config/application_credentials/ha-config-application-credentials.ts @@ -69,6 +69,7 @@ export class HaConfigApplicationCredentials extends LitElement { }) private _activeHiddenColumns?: string[]; + @state() @storage({ storage: "sessionStorage", key: "application-credentials-table-search", diff --git a/src/panels/config/automation/action/ha-automation-action.ts b/src/panels/config/automation/action/ha-automation-action.ts index a70e45bac4..e41f9e500f 100644 --- a/src/panels/config/automation/action/ha-automation-action.ts +++ b/src/panels/config/automation/action/ha-automation-action.ts @@ -36,6 +36,7 @@ export default class HaAutomationAction extends LitElement { @state() private _showReorder = false; + @state() @storage({ key: "automationClipboard", state: true, diff --git a/src/panels/config/automation/condition/ha-automation-condition.ts b/src/panels/config/automation/condition/ha-automation-condition.ts index 5c3ed0f910..f1557a7956 100644 --- a/src/panels/config/automation/condition/ha-automation-condition.ts +++ b/src/panels/config/automation/condition/ha-automation-condition.ts @@ -36,6 +36,7 @@ export default class HaAutomationCondition extends LitElement { @state() private _showReorder = false; + @state() @storage({ key: "automationClipboard", state: true, diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts index ebf232fc29..b6e2da8732 100644 --- a/src/panels/config/automation/ha-automation-editor.ts +++ b/src/panels/config/automation/ha-automation-editor.ts @@ -135,6 +135,7 @@ export class HaAutomationEditor extends PreventUnsavedMixin( @state() private _blueprintConfig?: BlueprintAutomationConfig; + @state() @consume({ context: fullEntitiesContext, subscribe: true }) @transform({ transformer: function (this: HaAutomationEditor, value) { diff --git a/src/panels/config/automation/ha-automation-picker.ts b/src/panels/config/automation/ha-automation-picker.ts index 034fc12695..8f77c41275 100644 --- a/src/panels/config/automation/ha-automation-picker.ts +++ b/src/panels/config/automation/ha-automation-picker.ts @@ -138,6 +138,7 @@ class HaAutomationPicker extends SubscribeMixin(LitElement) { @state() private _filteredAutomations?: string[] | null; + @state() @storage({ storage: "sessionStorage", key: "automation-table-search", @@ -146,6 +147,7 @@ class HaAutomationPicker extends SubscribeMixin(LitElement) { }) private _filter = ""; + @state() @storage({ storage: "sessionStorage", key: "automation-table-filters-full", diff --git a/src/panels/config/automation/option/ha-automation-option.ts b/src/panels/config/automation/option/ha-automation-option.ts index 0bbe6e919d..8a3184a724 100644 --- a/src/panels/config/automation/option/ha-automation-option.ts +++ b/src/panels/config/automation/option/ha-automation-option.ts @@ -29,6 +29,7 @@ export default class HaAutomationOption extends LitElement { @state() private _showReorder = false; + @state() @storage({ key: "automationClipboard", state: true, diff --git a/src/panels/config/automation/trigger/ha-automation-trigger.ts b/src/panels/config/automation/trigger/ha-automation-trigger.ts index fabc23eef6..cc6219d0cc 100644 --- a/src/panels/config/automation/trigger/ha-automation-trigger.ts +++ b/src/panels/config/automation/trigger/ha-automation-trigger.ts @@ -38,6 +38,7 @@ export default class HaAutomationTrigger extends LitElement { @state() private _showReorder = false; + @state() @storage({ key: "automationClipboard", state: true, diff --git a/src/panels/config/backup/ha-config-backup-backups.ts b/src/panels/config/backup/ha-config-backup-backups.ts index 30af43c705..969c99b275 100644 --- a/src/panels/config/backup/ha-config-backup-backups.ts +++ b/src/panels/config/backup/ha-config-backup-backups.ts @@ -98,6 +98,7 @@ class HaConfigBackupBackups extends SubscribeMixin(LitElement) { @state() private _selected: string[] = []; + @state() @storage({ storage: "sessionStorage", key: "backups-table-filters", diff --git a/src/panels/config/blueprint/ha-blueprint-overview.ts b/src/panels/config/blueprint/ha-blueprint-overview.ts index 6b329ff8e6..6ac304a956 100644 --- a/src/panels/config/blueprint/ha-blueprint-overview.ts +++ b/src/panels/config/blueprint/ha-blueprint-overview.ts @@ -9,7 +9,7 @@ import { } from "@mdi/js"; import type { CSSResultGroup, PropertyValues, TemplateResult } from "lit"; import { LitElement, html } from "lit"; -import { customElement, property } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import type { HASSDomEvent } from "../../../common/dom/fire_event"; import { fireEvent } from "../../../common/dom/fire_event"; @@ -118,6 +118,7 @@ class HaBlueprintOverview extends LitElement { }) private _activeHiddenColumns?: string[]; + @state() @storage({ storage: "sessionStorage", key: "blueprint-table-search", @@ -499,9 +500,11 @@ class HaBlueprintOverview extends LitElement { list: html`
    ${[...(related.automation || []), ...(related.script || [])].map( (item) => { - const state = this.hass.states[item]; + const automationState = this.hass.states[item]; return html`
  • - ${state ? `${computeStateName(state)} (${item})` : item} + ${automationState + ? `${computeStateName(automationState)} (${item})` + : item}
  • `; } )} diff --git a/src/panels/config/devices/ha-config-devices-dashboard.ts b/src/panels/config/devices/ha-config-devices-dashboard.ts index cd1d4fc6b1..5d6d467cec 100644 --- a/src/panels/config/devices/ha-config-devices-dashboard.ts +++ b/src/panels/config/devices/ha-config-devices-dashboard.ts @@ -120,6 +120,7 @@ export class HaConfigDeviceDashboard extends SubscribeMixin(LitElement) { @state() private _selected: string[] = []; + @state() @storage({ storage: "sessionStorage", key: "devices-table-search", @@ -128,6 +129,7 @@ export class HaConfigDeviceDashboard extends SubscribeMixin(LitElement) { }) private _filter: string = history.state?.filter || ""; + @state() @storage({ storage: "sessionStorage", key: "devices-table-filters-full", diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index 4144c74571..807d03c380 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -159,6 +159,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { @consume({ context: fullEntitiesContext, subscribe: true }) _entities!: EntityRegistryEntry[]; + @state() @storage({ storage: "sessionStorage", key: "entities-table-search", @@ -169,6 +170,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { @state() private _searchParms = new URLSearchParams(window.location.search); + @state() @storage({ storage: "sessionStorage", key: "entities-table-filters", diff --git a/src/panels/config/helpers/ha-config-helpers.ts b/src/panels/config/helpers/ha-config-helpers.ts index 852720b1d8..b6de6abe4a 100644 --- a/src/panels/config/helpers/ha-config-helpers.ts +++ b/src/panels/config/helpers/ha-config-helpers.ts @@ -168,6 +168,7 @@ export class HaConfigHelpers extends SubscribeMixin(LitElement) { }) private _activeCollapsed?: string; + @state() @storage({ storage: "sessionStorage", key: "helpers-table-search", diff --git a/src/panels/config/integrations/integration-panels/mqtt/mqtt-config-panel.ts b/src/panels/config/integrations/integration-panels/mqtt/mqtt-config-panel.ts index c87fd42e0d..c3f9302fe4 100644 --- a/src/panels/config/integrations/integration-panels/mqtt/mqtt-config-panel.ts +++ b/src/panels/config/integrations/integration-panels/mqtt/mqtt-config-panel.ts @@ -1,7 +1,7 @@ import "@material/mwc-button"; import type { CSSResultGroup, TemplateResult } from "lit"; import { css, html, LitElement } from "lit"; -import { customElement, property } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import { storage } from "../../../../../common/decorators/storage"; import "../../../../../components/ha-card"; import "../../../../../components/ha-code-editor"; @@ -23,6 +23,7 @@ export class MQTTConfigPanel extends LitElement { @property({ type: Boolean }) public narrow = false; + @state() @storage({ key: "panel-dev-mqtt-topic-ls", state: true, @@ -30,6 +31,7 @@ export class MQTTConfigPanel extends LitElement { }) private _topic = ""; + @state() @storage({ key: "panel-dev-mqtt-payload-ls", state: true, @@ -37,6 +39,7 @@ export class MQTTConfigPanel extends LitElement { }) private _payload = ""; + @state() @storage({ key: "panel-dev-mqtt-qos-ls", state: true, @@ -44,6 +47,7 @@ export class MQTTConfigPanel extends LitElement { }) private _qos = "0"; + @state() @storage({ key: "panel-dev-mqtt-retain-ls", state: true, @@ -51,6 +55,7 @@ export class MQTTConfigPanel extends LitElement { }) private _retain = false; + @state() @storage({ key: "panel-dev-mqtt-allow-template-ls", state: true, diff --git a/src/panels/config/integrations/integration-panels/mqtt/mqtt-subscribe-card.ts b/src/panels/config/integrations/integration-panels/mqtt/mqtt-subscribe-card.ts index b9c917dea7..a0506ca54c 100644 --- a/src/panels/config/integrations/integration-panels/mqtt/mqtt-subscribe-card.ts +++ b/src/panels/config/integrations/integration-panels/mqtt/mqtt-subscribe-card.ts @@ -21,6 +21,7 @@ const qosLevel = ["0", "1", "2"]; class MqttSubscribeCard extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; + @state() @storage({ key: "panel-dev-mqtt-topic-subscribe", state: true, @@ -28,6 +29,7 @@ class MqttSubscribeCard extends LitElement { }) private _topic = ""; + @state() @storage({ key: "panel-dev-mqtt-qos-subscribe", state: true, @@ -35,6 +37,7 @@ class MqttSubscribeCard extends LitElement { }) private _qos = "0"; + @state() @storage({ key: "panel-dev-mqtt-json-format", state: true, diff --git a/src/panels/config/labels/ha-config-labels.ts b/src/panels/config/labels/ha-config-labels.ts index 77ed20ff72..0f6bfdc527 100644 --- a/src/panels/config/labels/ha-config-labels.ts +++ b/src/panels/config/labels/ha-config-labels.ts @@ -55,6 +55,7 @@ export class HaConfigLabels extends LitElement { @state() private _labels: LabelRegistryEntry[] = []; + @state() @storage({ storage: "sessionStorage", key: "labels-table-search", diff --git a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts index 56f1a398f6..1dce7fa90f 100644 --- a/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts +++ b/src/panels/config/lovelace/dashboards/ha-config-lovelace-dashboards.ts @@ -74,6 +74,7 @@ export class HaConfigLovelaceDashboards extends LitElement { @state() private _dashboards: LovelaceDashboard[] = []; + @state() @storage({ storage: "sessionStorage", key: "lovelace-dashboards-table-search", diff --git a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts index 73a7847f91..24feda1234 100644 --- a/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts +++ b/src/panels/config/lovelace/resources/ha-config-lovelace-resources.ts @@ -46,6 +46,7 @@ export class HaConfigLovelaceRescources extends LitElement { @state() private _resources: LovelaceResource[] = []; + @state() @storage({ storage: "sessionStorage", key: "lovelace-resources-table-search", diff --git a/src/panels/config/scene/ha-scene-dashboard.ts b/src/panels/config/scene/ha-scene-dashboard.ts index 01b2112f64..f01a23ce3b 100644 --- a/src/panels/config/scene/ha-scene-dashboard.ts +++ b/src/panels/config/scene/ha-scene-dashboard.ts @@ -133,6 +133,7 @@ class HaSceneDashboard extends SubscribeMixin(LitElement) { @state() private _filteredScenes?: string[] | null; + @state() @storage({ storage: "sessionStorage", key: "scene-table-search", @@ -141,6 +142,7 @@ class HaSceneDashboard extends SubscribeMixin(LitElement) { }) private _filter = ""; + @state() @storage({ storage: "sessionStorage", key: "scene-table-filters-full", diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts index b4121a0125..a0e1b0c7ea 100644 --- a/src/panels/config/script/ha-script-editor.ts +++ b/src/panels/config/script/ha-script-editor.ts @@ -105,6 +105,7 @@ export class HaScriptEditor extends SubscribeMixin( @state() private _readOnly = false; + @state() @consume({ context: fullEntitiesContext, subscribe: true }) @transform({ transformer: function (this: HaScriptEditor, value) { diff --git a/src/panels/config/script/ha-script-picker.ts b/src/panels/config/script/ha-script-picker.ts index ef32f99ad7..3265cb158c 100644 --- a/src/panels/config/script/ha-script-picker.ts +++ b/src/panels/config/script/ha-script-picker.ts @@ -138,6 +138,7 @@ class HaScriptPicker extends SubscribeMixin(LitElement) { @state() private _filteredScripts?: string[] | null; + @state() @storage({ storage: "sessionStorage", key: "script-table-search", @@ -146,6 +147,7 @@ class HaScriptPicker extends SubscribeMixin(LitElement) { }) private _filter = ""; + @state() @storage({ storage: "sessionStorage", key: "script-table-filters-full", diff --git a/src/panels/config/tags/ha-config-tags.ts b/src/panels/config/tags/ha-config-tags.ts index 6bbcc4d76a..efa5370cb3 100644 --- a/src/panels/config/tags/ha-config-tags.ts +++ b/src/panels/config/tags/ha-config-tags.ts @@ -62,6 +62,7 @@ export class HaConfigTags extends SubscribeMixin(LitElement) { return this.hass.auth.external?.config.canWriteTag; } + @state() @storage({ storage: "sessionStorage", key: "tags-table-search", diff --git a/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts b/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts index 4118de6f14..46a5cbba49 100644 --- a/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts +++ b/src/panels/config/voice-assistants/ha-config-voice-assistants-expose.ts @@ -76,6 +76,7 @@ export class VoiceAssistantsExpose extends LitElement { @state() private _extEntities?: Record; + @state() @storage({ storage: "sessionStorage", key: "voice-expose-table-search", diff --git a/src/panels/developer-tools/action/developer-tools-action.ts b/src/panels/developer-tools/action/developer-tools-action.ts index 979c653ffc..fd38101a02 100644 --- a/src/panels/developer-tools/action/developer-tools-action.ts +++ b/src/panels/developer-tools/action/developer-tools-action.ts @@ -52,6 +52,7 @@ class HaPanelDevAction extends LitElement { private _yamlValid = true; + @state() @storage({ key: "panel-dev-action-state-service-data", state: true, @@ -59,6 +60,7 @@ class HaPanelDevAction extends LitElement { }) private _serviceData?: ServiceAction = { action: "", target: {}, data: {} }; + @state() @storage({ key: "panel-dev-action-state-yaml-mode", state: true, diff --git a/src/panels/developer-tools/assist/developer-tools-assist.ts b/src/panels/developer-tools/assist/developer-tools-assist.ts index a10e169ea2..220c12300d 100644 --- a/src/panels/developer-tools/assist/developer-tools-assist.ts +++ b/src/panels/developer-tools/assist/developer-tools-assist.ts @@ -33,6 +33,7 @@ class HaPanelDevAssist extends SubscribeMixin(LitElement) { @state() supportedLanguages?: string[]; + @state() @storage({ key: "assist_debug_language", state: true, diff --git a/src/panels/developer-tools/state/developer-tools-state.ts b/src/panels/developer-tools/state/developer-tools-state.ts index 888442a12e..047b4aaaa2 100644 --- a/src/panels/developer-tools/state/developer-tools-state.ts +++ b/src/panels/developer-tools/state/developer-tools-state.ts @@ -62,6 +62,7 @@ class HaPanelDevState extends LitElement { @state() private _validJSON = true; + @state() @storage({ key: "devToolsShowAttributes", state: true, diff --git a/src/panels/history/ha-panel-history.ts b/src/panels/history/ha-panel-history.ts index cc59c9342f..b52f3eaf19 100644 --- a/src/panels/history/ha-panel-history.ts +++ b/src/panels/history/ha-panel-history.ts @@ -63,6 +63,7 @@ class HaPanelHistory extends LitElement { @state() private _endDate: Date; + @state() @storage({ key: "historyPickedValue", state: true, diff --git a/src/panels/logbook/ha-panel-logbook.ts b/src/panels/logbook/ha-panel-logbook.ts index df556370ba..037f5da57d 100644 --- a/src/panels/logbook/ha-panel-logbook.ts +++ b/src/panels/logbook/ha-panel-logbook.ts @@ -39,6 +39,7 @@ export class HaPanelLogbook extends LitElement { @state() private _showBack?: boolean; + @state() @storage({ key: "logbookPickedValue", state: true, diff --git a/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts b/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts index 47e484d21c..46d39042ab 100644 --- a/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts +++ b/src/panels/lovelace/cards/energy/hui-energy-devices-detail-graph-card.ts @@ -62,6 +62,7 @@ export class HuiEnergyDevicesDetailGraphCard @state() private _compareEnd?: Date; + @state() @storage({ key: "energy-devices-hidden-stats", state: true, diff --git a/src/panels/lovelace/cards/hui-button-card.ts b/src/panels/lovelace/cards/hui-button-card.ts index 068f8e3866..9b6dfcc812 100644 --- a/src/panels/lovelace/cards/hui-button-card.ts +++ b/src/panels/lovelace/cards/hui-button-card.ts @@ -86,6 +86,7 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { @state() private _config?: ButtonCardConfig; + @state() @consume({ context: statesContext, subscribe: true }) @transform({ transformer: function (this: HuiButtonCard, value: HassEntities) { @@ -111,6 +112,7 @@ export class HuiButtonCard extends LitElement implements LovelaceCard { @consume({ context: configContext, subscribe: true }) _hassConfig!: HassConfig; + @state() @consume({ context: entitiesContext, subscribe: true }) @transform({ transformer: function (this: HuiButtonCard, value) { diff --git a/src/panels/lovelace/editor/badge-editor/hui-badge-picker.ts b/src/panels/lovelace/editor/badge-editor/hui-badge-picker.ts index 1e720a4632..af0030c52c 100644 --- a/src/panels/lovelace/editor/badge-editor/hui-badge-picker.ts +++ b/src/panels/lovelace/editor/badge-editor/hui-badge-picker.ts @@ -43,6 +43,7 @@ export class HuiBadgePicker extends LitElement { @property({ attribute: false }) public suggestedBadges?: string[]; + @state() @storage({ key: "dashboardBadgeClipboard", state: true, diff --git a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts index edb1c704fd..f663f36021 100644 --- a/src/panels/lovelace/editor/card-editor/hui-card-picker.ts +++ b/src/panels/lovelace/editor/card-editor/hui-card-picker.ts @@ -42,6 +42,7 @@ export class HuiCardPicker extends LitElement { @property({ attribute: false }) public suggestedCards?: string[]; + @state() @storage({ key: "dashboardCardClipboard", state: true, diff --git a/src/panels/media-browser/ha-panel-media-browser.ts b/src/panels/media-browser/ha-panel-media-browser.ts index 05b2799ae5..d84f09a703 100644 --- a/src/panels/media-browser/ha-panel-media-browser.ts +++ b/src/panels/media-browser/ha-panel-media-browser.ts @@ -64,6 +64,7 @@ class PanelMediaBrowser extends LitElement { @state() _currentItem?: MediaPlayerItem; + @state() @storage({ key: "mediaBrowserPreferredLayout", state: true, @@ -78,6 +79,7 @@ class PanelMediaBrowser extends LitElement { }, ]; + @state() @storage({ key: "mediaBrowseEntityId", state: true, diff --git a/src/panels/todo/ha-panel-todo.ts b/src/panels/todo/ha-panel-todo.ts index d6c2369822..9dcb961478 100644 --- a/src/panels/todo/ha-panel-todo.ts +++ b/src/panels/todo/ha-panel-todo.ts @@ -9,7 +9,7 @@ import { } from "@mdi/js"; import type { CSSResultGroup, PropertyValues, TemplateResult } from "lit"; import { LitElement, css, html, nothing } from "lit"; -import { customElement, property } from "lit/decorators"; +import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { isComponentLoaded } from "../../common/config/is_component_loaded"; import { storage } from "../../common/decorators/storage"; @@ -55,6 +55,7 @@ class PanelTodo extends LitElement { @property({ type: Boolean, reflect: true }) public mobile = false; + @state() @storage({ key: "selectedTodoEntity", state: true, From 1fb28df1a64049ce29286b0ec8f49fb83c5a49ea Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 21:28:27 +0200 Subject: [PATCH 028/247] Update dependency core-js to v3.42.0 (#25283) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 32dd194dad..a323006107 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "barcode-detector": "3.0.1", "color-name": "2.0.0", "comlink": "4.4.2", - "core-js": "3.41.0", + "core-js": "3.42.0", "cropperjs": "1.6.2", "date-fns": "4.1.0", "date-fns-tz": "3.2.0", diff --git a/yarn.lock b/yarn.lock index c84a990811..fa88c30ad4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6817,10 +6817,10 @@ __metadata: languageName: node linkType: hard -"core-js@npm:3.41.0": - version: 3.41.0 - resolution: "core-js@npm:3.41.0" - checksum: 10/a06ebae2264dd24c8e4b331a68412f7d0730557c41901f80fa910a9398dbef4670482d9ef5a41fef7efd41307c612d3d4051df7640ac4c01ff6feda45f8b92be +"core-js@npm:3.42.0": + version: 3.42.0 + resolution: "core-js@npm:3.42.0" + checksum: 10/07e10c475cdb45608559778c4d8d1561204aa57c937a3e77ebc7359a95a350f8acfdbeab59c6a6532eb3b47262be0d05aba150a00b79659a91bedda4f59d9d5f languageName: node linkType: hard @@ -9311,7 +9311,7 @@ __metadata: browserslist-useragent-regexp: "npm:4.1.3" color-name: "npm:2.0.0" comlink: "npm:4.4.2" - core-js: "npm:3.41.0" + core-js: "npm:3.42.0" cropperjs: "npm:1.6.2" date-fns: "npm:4.1.0" date-fns-tz: "npm:3.2.0" From 99b94e799d17dfa33b3002aa02c930bb32af87f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 3 May 2025 08:53:39 +0200 Subject: [PATCH 029/247] Update dependency @bundle-stats/plugin-webpack-filter to v4.20.0 (#25285) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a323006107..3b17d81c2b 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,7 @@ "@babel/helper-define-polyfill-provider": "0.6.4", "@babel/plugin-transform-runtime": "7.26.10", "@babel/preset-env": "7.26.9", - "@bundle-stats/plugin-webpack-filter": "4.19.1", + "@bundle-stats/plugin-webpack-filter": "4.20.0", "@lokalise/node-api": "14.4.0", "@octokit/auth-oauth-device": "7.1.5", "@octokit/plugin-retry": "7.2.1", diff --git a/yarn.lock b/yarn.lock index fa88c30ad4..979010a7ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1156,14 +1156,14 @@ __metadata: languageName: node linkType: hard -"@bundle-stats/plugin-webpack-filter@npm:4.19.1": - version: 4.19.1 - resolution: "@bundle-stats/plugin-webpack-filter@npm:4.19.1" +"@bundle-stats/plugin-webpack-filter@npm:4.20.0": + version: 4.20.0 + resolution: "@bundle-stats/plugin-webpack-filter@npm:4.20.0" dependencies: tslib: "npm:2.8.1" peerDependencies: core-js: ^3.0.0 - checksum: 10/2fb3072b2d87fecf11d6ac0eb970e9b1fce16b4146b11fddb30fa3310a44d1fdc566e2236338d15003783229ef015d5a39e32b3ec2e60c413461be37e994cad2 + checksum: 10/b20479bb5f5964d8fa3b8be0b31665521681cfa7b0b5c2f3752476d36507332270e454592632a793c2579b98c036d6946eaa54caf984fcd3a649ccd1802492aa languageName: node linkType: hard @@ -9210,7 +9210,7 @@ __metadata: "@babel/preset-env": "npm:7.26.9" "@babel/runtime": "npm:7.27.0" "@braintree/sanitize-url": "npm:7.1.1" - "@bundle-stats/plugin-webpack-filter": "npm:4.19.1" + "@bundle-stats/plugin-webpack-filter": "npm:4.20.0" "@codemirror/autocomplete": "npm:6.18.6" "@codemirror/commands": "npm:6.8.1" "@codemirror/language": "npm:6.11.0" From d2822308ec8d2b770765967a14c632de847aa5a1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 4 May 2025 09:24:51 +0200 Subject: [PATCH 030/247] Update dependency @lokalise/node-api to v14.5.0 (#25290) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 3b17d81c2b..7595b3fe58 100644 --- a/package.json +++ b/package.json @@ -155,7 +155,7 @@ "@babel/plugin-transform-runtime": "7.26.10", "@babel/preset-env": "7.26.9", "@bundle-stats/plugin-webpack-filter": "4.20.0", - "@lokalise/node-api": "14.4.0", + "@lokalise/node-api": "14.5.0", "@octokit/auth-oauth-device": "7.1.5", "@octokit/plugin-retry": "7.2.1", "@octokit/rest": "21.1.1", diff --git a/yarn.lock b/yarn.lock index 979010a7ff..e21ed0eae1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2213,10 +2213,10 @@ __metadata: languageName: node linkType: hard -"@lokalise/node-api@npm:14.4.0": - version: 14.4.0 - resolution: "@lokalise/node-api@npm:14.4.0" - checksum: 10/94a7e4d00a27a5040c31a538036280bce8dfbfe79fe08256a1d1afe0f18effb8c7d97b09eacad11c6296b032d787f13475e69ba285cc8989d9edae5e7e52d536 +"@lokalise/node-api@npm:14.5.0": + version: 14.5.0 + resolution: "@lokalise/node-api@npm:14.5.0" + checksum: 10/7f3854f0bc93ade7a132859ed446c22bb774f17af0f74fdfa59ce082b4bc548bec4509783c269d2bc52b98112bb48f2be05cf53a3611d69ca88882779e70621b languageName: node linkType: hard @@ -9240,7 +9240,7 @@ __metadata: "@lit-labs/virtualizer": "npm:2.1.0" "@lit/context": "npm:1.1.5" "@lit/reactive-element": "npm:2.1.0" - "@lokalise/node-api": "npm:14.4.0" + "@lokalise/node-api": "npm:14.5.0" "@material/chips": "npm:=14.0.0-canary.53b3cad2f.0" "@material/data-table": "npm:=14.0.0-canary.53b3cad2f.0" "@material/mwc-base": "npm:0.27.0" From bdad76937e0c8cbcbadc990641666c8f4ed80846 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 4 May 2025 09:25:12 +0200 Subject: [PATCH 031/247] Update babel monorepo to v7.27.1 (#25289) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 8 +- yarn.lock | 1136 +++++++++++++++++++++++++------------------------- 2 files changed, 568 insertions(+), 576 deletions(-) diff --git a/package.json b/package.json index 7595b3fe58..fe500893b7 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "license": "Apache-2.0", "type": "module", "dependencies": { - "@babel/runtime": "7.27.0", + "@babel/runtime": "7.27.1", "@braintree/sanitize-url": "7.1.1", "@codemirror/autocomplete": "6.18.6", "@codemirror/commands": "6.8.1", @@ -150,10 +150,10 @@ "xss": "1.0.15" }, "devDependencies": { - "@babel/core": "7.26.10", + "@babel/core": "7.27.1", "@babel/helper-define-polyfill-provider": "0.6.4", - "@babel/plugin-transform-runtime": "7.26.10", - "@babel/preset-env": "7.26.9", + "@babel/plugin-transform-runtime": "7.27.1", + "@babel/preset-env": "7.27.1", "@bundle-stats/plugin-webpack-filter": "4.20.0", "@lokalise/node-api": "14.5.0", "@octokit/auth-oauth-device": "7.1.5", diff --git a/yarn.lock b/yarn.lock index e21ed0eae1..40ba4f821a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,7 +41,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:7.26.2, @babel/code-frame@npm:^7.26.2": +"@babel/code-frame@npm:7.26.2": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -52,98 +52,109 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/compat-data@npm:7.26.8" - checksum: 10/bdddf577f670e0e12996ef37e134856c8061032edb71a13418c3d4dae8135da28910b7cd6dec6e668ab3a41e42089ef7ee9c54ef52fe0860b54cb420b0d14948 +"@babel/code-frame@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/code-frame@npm:7.27.1" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.27.1" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/721b8a6e360a1fa0f1c9fe7351ae6c874828e119183688b533c477aa378f1010f37cc9afbfc4722c686d1f5cdd00da02eab4ba7278a0c504fa0d7a321dcd4fdf languageName: node linkType: hard -"@babel/core@npm:7.26.10, @babel/core@npm:^7.24.4": - version: 7.26.10 - resolution: "@babel/core@npm:7.26.10" +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/compat-data@npm:7.27.1" + checksum: 10/1b2982a8d8cd970fcb7a038c0e9451084f5ce99d3f283e00bbac3fe68ee07ab37024cc5ee273845d8b5543a86c7aa0efe1c847993c526556ff76887dc5a9ee40 + languageName: node + linkType: hard + +"@babel/core@npm:7.27.1, @babel/core@npm:^7.24.4": + version: 7.27.1 + resolution: "@babel/core@npm:7.27.1" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.10" - "@babel/helper-compilation-targets": "npm:^7.26.5" - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.10" - "@babel/parser": "npm:^7.26.10" - "@babel/template": "npm:^7.26.9" - "@babel/traverse": "npm:^7.26.10" - "@babel/types": "npm:^7.26.10" + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.27.1" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helpers": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.1" + "@babel/template": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/68f6707eebd6bb8beed7ceccf5153e35b86c323e40d11d796d75c626ac8f1cc4e1f795584c5ab5f886bc64150c22d5088123d68c069c63f29984c4fc054d1dab + checksum: 10/3dfec88f84b3ce567e6c482db0119f02f451bd3f86b0835c71c029fedb657969786507fafedd3a0732bd1be9fbc9f0635d734efafabad6dbc67d3eb7b494cdd8 languageName: node linkType: hard -"@babel/generator@npm:^7.26.10, @babel/generator@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/generator@npm:7.27.0" +"@babel/generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/generator@npm:7.27.1" dependencies: - "@babel/parser": "npm:^7.27.0" - "@babel/types": "npm:^7.27.0" + "@babel/parser": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10/5447c402b1d841132534a0a9715e89f4f28b6f2886a23e70aaa442150dba4a1e29e4e2351814f439ee1775294dccdef9ab0a4192b6e6a5ad44e24233b3611da2 + checksum: 10/6101825922a8a116e64b507d9309b38c5bc027b333d7111fcb760422741d3c72bd8f8e5aa935c2944c434ffe376353a27afa3a25a8526dc2ef90743d266770db languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" +"@babel/helper-annotate-as-pure@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.1" dependencies: - "@babel/types": "npm:^7.25.9" - checksum: 10/41edda10df1ae106a9b4fe617bf7c6df77db992992afd46192534f5cff29f9e49a303231733782dd65c5f9409714a529f215325569f14282046e9d3b7a1ffb6c + "@babel/types": "npm:^7.27.1" + checksum: 10/3f8e4d591458d6c0621a3d670f8798b8895580214287390126e3e621ddf3df0bd07cbcc9500c2671b9ec10162c2f9feb1194da5cf039d40df8cb69d181fc0cd8 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9, @babel/helper-compilation-targets@npm:^7.26.5": - version: 7.27.0 - resolution: "@babel/helper-compilation-targets@npm:7.27.0" +"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-compilation-targets@npm:7.27.1" dependencies: - "@babel/compat-data": "npm:^7.26.8" - "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/compat-data": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10/32224b512e813fc808539b4ca7fca8c224849487c365abcef8cb8b0eea635c65375b81429f82d076e9ec1f3f3b3db1d0d56aac4d482a413f58d5ad608f912155 + checksum: 10/7186b92bb9ac8f73cc40a708110b3f8ca9f6bc90369f92e76901ed68b02e421038e84ac4275d00b9d680fcb7be88921f865f94abd01619b028a3cc09edc040e8 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.25.9": - version: 7.27.0 - resolution: "@babel/helper-create-class-features-plugin@npm:7.27.0" +"@babel/helper-create-class-features-plugin@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-create-class-features-plugin@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-member-expression-to-functions": "npm:^7.25.9" - "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/traverse": "npm:^7.27.0" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/5db70126719ad12773a06a7ae50872c597a2a401ac73906ade3f5c1cf91d62ad6ed5fd5397320ec9b0d8bb2c5623aefda35352469abc8e42a5797dd7e9da0675 + checksum: 10/701579b49046cd42f6a6b1e693e6827df8623185adf0911c4d68a219a082d8fd4501672880d92b6b96263d1c92a3beb891b3464a662a55e69e7539d8db9277da languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": - version: 7.27.0 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.0" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" regexpu-core: "npm:^6.2.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/e5734deb62732264211df79f37943d83641f2f8fea72a1e8cf14b358622b88f5e8be3122f706cfa0cf5880000a8382b1fff23519bfd075c8ce17d03c11982e4b + checksum: 10/dea272628cd8874f127ab7b2ee468620aabc1383d38bb40c49a9c7667db2258cdfe6620a1d1412f5f0706583f6301b4b7ad3d5932f24df7fe72e66bf9bc0be45 languageName: node linkType: hard @@ -162,200 +173,200 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" +"@babel/helper-member-expression-to-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-member-expression-to-functions@npm:7.27.1" dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/ef8cc1c1e600b012b312315f843226545a1a89f25d2f474ce2503fd939ca3f8585180f291a3a13efc56cf13eddc1d41a3a040eae9a521838fd59a6d04cc82490 + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/533a5a2cf1c9a8770d241b86d5f124c88e953c831a359faf1ac7ba1e632749c1748281b83295d227fe6035b202d81f3d3a1ea13891f150c6538e040668d6126a languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-imports@npm:7.25.9" +"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-module-imports@npm:7.27.1" dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/e090be5dee94dda6cd769972231b21ddfae988acd76b703a480ac0c96f3334557d70a965bf41245d6ee43891e7571a8b400ccf2b2be5803351375d0f4e5bcf08 + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/58e792ea5d4ae71676e0d03d9fef33e886a09602addc3bd01388a98d87df9fcfd192968feb40ac4aedb7e287ec3d0c17b33e3ecefe002592041a91d8a1998a8d languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helper-module-transforms@npm:7.26.0" +"@babel/helper-module-transforms@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-module-transforms@npm:7.27.1" dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/9841d2a62f61ad52b66a72d08264f23052d533afc4ce07aec2a6202adac0bfe43014c312f94feacb3291f4c5aafe681955610041ece2c276271adce3f570f2f5 + checksum: 10/415509a5854203073755aab3ad293664146a55777355b5b5187902f976162c9565907d2276f7f6e778527be4829db2d926015d446100a65f2538d6397d83e248 languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" +"@babel/helper-optimise-call-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" dependencies: - "@babel/types": "npm:^7.25.9" - checksum: 10/f09d0ad60c0715b9a60c31841b3246b47d67650c512ce85bbe24a3124f1a4d66377df793af393273bc6e1015b0a9c799626c48e53747581c1582b99167cc65dc + "@babel/types": "npm:^7.27.1" + checksum: 10/0fb7ee824a384529d6b74f8a58279f9b56bfe3cce332168067dddeab2552d8eeb56dc8eaf86c04a3a09166a316cb92dfc79c4c623cd034ad4c563952c98b464f languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/helper-plugin-utils@npm:7.26.5" - checksum: 10/1cc0fd8514da3bb249bed6c27227696ab5e84289749d7258098701cffc0c599b7f61ec40dd332f8613030564b79899d9826813c96f966330bcfc7145a8377857 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-plugin-utils@npm:7.27.1" + checksum: 10/96136c2428888e620e2ec493c25888f9ceb4a21099dcf3dd4508ea64b58cdedbd5a9fb6c7b352546de84d6c24edafe482318646932a22c449ebd16d16c22d864 languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" +"@babel/helper-remap-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-wrap-function": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-wrap-function": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/ea37ad9f8f7bcc27c109963b8ebb9d22bac7a5db2a51de199cb560e251d5593fe721e46aab2ca7d3e7a24b0aa4aff0eaf9c7307af9c2fd3a1d84268579073052 + checksum: 10/0747397ba013f87dbf575454a76c18210d61c7c9af0f697546b4bcac670b54ddc156330234407b397f0c948738c304c228e0223039bc45eab4fbf46966a5e8cc languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/helper-replace-supers@npm:7.26.5" +"@babel/helper-replace-supers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-replace-supers@npm:7.27.1" dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.25.9" - "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/traverse": "npm:^7.26.5" + "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/cfb911d001a8c3d2675077dbb74ee8d7d5533b22d74f8d775cefabf19c604f6cbc22cfeb94544fe8efa626710d920f04acb22923017e68f46f5fdb1cb08b32ad + checksum: 10/72e3f8bef744c06874206bf0d80a0abbedbda269586966511c2491df4f6bf6d47a94700810c7a6737345a545dfb8295222e1e72f506bcd0b40edb3f594f739ea languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/fdbb5248932198bc26daa6abf0d2ac42cab9c2dbb75b7e9f40d425c8f28f09620b886d40e7f9e4e08ffc7aaa2cefe6fc2c44be7c20e81f7526634702fb615bdc + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/4f380c5d0e0769fa6942a468b0c2d7c8f0c438f941aaa88f785f8752c103631d0904c7b4e76207a3b0e6588b2dec376595370d92ca8f8f1b422c14a69aa146d4 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-string-parser@npm:7.25.9" - checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10/0ae29cc2005084abdae2966afdb86ed14d41c9c37db02c3693d5022fba9f5d59b011d039380b8e537c34daf117c549f52b452398f576e908fb9db3c7abbb3a00 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e +"@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-identifier@npm:7.27.1" + checksum: 10/75041904d21bdc0cd3b07a8ac90b11d64cd3c881e89cb936fa80edd734bf23c35e6bd1312611e8574c4eab1f3af0f63e8a5894f4699e9cfdf70c06fcf4252320 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-option@npm:7.25.9" - checksum: 10/9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10/db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-wrap-function@npm:7.25.9" +"@babel/helper-wrap-function@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-wrap-function@npm:7.27.1" dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/988dcf49159f1c920d6b9486762a93767a6e84b5e593a6342bc235f3e47cc1cb0c048d8fca531a48143e6b7fce1ff12ddbf735cf5f62cb2f07192cf7c27b89cf + "@babel/template": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/effa5ba1732764982db52295a0003d0d6b527edf70d8c649f5a521808decbc47fc8f3c21cd31f7b6331192289f3bf5617141bce778fec45dcaedf5708d9c3140 languageName: node linkType: hard -"@babel/helpers@npm:^7.26.10": - version: 7.27.0 - resolution: "@babel/helpers@npm:7.27.0" +"@babel/helpers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helpers@npm:7.27.1" dependencies: - "@babel/template": "npm:^7.27.0" - "@babel/types": "npm:^7.27.0" - checksum: 10/0dd40ba1e5ba4b72d1763bb381384585a56f21a61a19dc1b9a03381fe8e840207fdaa4da645d14dc028ad768087d41aad46347cc6573bd69d82f597f5a12dc6f + "@babel/template": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/b86ee2c87d52640c63ec1fdf139d4560efc173ae6379659e0df49a3c0cf1d5f24436132ebb4459a4ee72418b43b39ee001f4e01465b48c8d31911a745ec4fd74 languageName: node linkType: hard -"@babel/parser@npm:^7.23.5, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/parser@npm:7.27.0" +"@babel/parser@npm:^7.23.5, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/parser@npm:7.27.1" dependencies: - "@babel/types": "npm:^7.27.0" + "@babel/types": "npm:^7.27.1" bin: parser: ./bin/babel-parser.js - checksum: 10/0fee9f05c6db753882ca9d10958301493443da9f6986d7020ebd7a696b35886240016899bc0b47d871aea2abcafd64632343719742e87432c8145e0ec2af2a03 + checksum: 10/20d0e612a5c9903f172c8957043923fe73f8d40a130838dade27e6af0291b6c72974f11c99f112443fc5193e519c241f8cc034e28eca6e958949627f902464ef languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/3c23ef34e3fd7da3578428cb488180ab6b7b96c9c141438374b6d87fa814d87de099f28098e5fc64726c19193a1da397e4d2351d40b459bcd2489993557e2c74 + checksum: 10/fe65257d5b82558bc6bc0f3a5a7a35b4166f71bed3747714dafb6360fadb15f036d568bc1fbeedae819165008c8feb646633ab91c0e3a95284963972f4fa9751 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/d3e14ab1cb9cb50246d20cab9539f2fbd1e7ef1ded73980c8ad7c0561b4d5e0b144d362225f0976d47898e04cbd40f2000e208b0913bd788346cf7791b96af91 + checksum: 10/eb7f4146dc01f1198ce559a90b077e58b951a07521ec414e3c7d4593bf6c4ab5c2af22242a7e9fec085e20299e0ba6ea97f44a45e84ab148141bf9eb959ad25e languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/a9d1ee3fd100d3eb6799a2f2bbd785296f356c531d75c9369f71541811fa324270258a374db103ce159156d006da2f33370330558d0133e6f7584152c34997ca + checksum: 10/621cfddfcc99a81e74f8b6f9101fd260b27500cb1a568e3ceae9cc8afe9aee45ac3bca3900a2b66c612b1a2366d29ef67d4df5a1c975be727eaad6906f98c2c6 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10/5b298b28e156f64de51cdb03a2c5b80c7f978815ef1026f3ae8b9fc48d28bf0a83817d8fbecb61ef8fb94a7201f62cca5103cc6e7b9e8f28e38f766d7905b378 + checksum: 10/f07aa80272bd7a46b7ba11a4644da6c9b6a5a64e848dfaffdad6f02663adefd512e1aaebe664c4dd95f7ed4f80c872c7f8db8d8e34b47aae0930b412a28711a0 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/cb893e5deb9312a0120a399835b6614a016c036714de7123c8edabccc56a09c4455016e083c5c4dd485248546d4e5e55fc0e9132b3c3a9bd16abf534138fe3f2 + checksum: 10/dfa68da5f68c0fa9deff1739ac270a5643ea07540b26a2a05403bc536c96595f0fe98a5eac9f9b3501b79ce57caa3045a94c75d5ccbfed946a62469a370ecdc2 languageName: node linkType: hard @@ -368,25 +379,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" +"@babel/plugin-syntax-import-assertions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b58f2306df4a690ca90b763d832ec05202c50af787158ff8b50cdf3354359710bce2e1eb2b5135fcabf284756ac8eadf09ca74764aa7e76d12a5cac5f6b21e67 + checksum: 10/fb661d630808d67ecb85eabad25aac4e9696a20464bad4c4a6a0d3d40e4dc22557d47e9be3d591ec06429cf048cfe169b8891c373606344d51c4f3ac0f91d6d0 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" +"@babel/plugin-syntax-import-attributes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c122aa577166c80ee67f75aebebeef4150a132c4d3109d25d7fc058bf802946f883e330f20b78c1d3e3a5ada631c8780c263d2d01b5dbaecc69efefeedd42916 + checksum: 10/97973982fff1bbf86b3d1df13380567042887c50e2ae13a400d02a8ff2c9742a60a75e279bfb73019e1cd9710f04be5e6ab81f896e6678dcfcec8b135e8896cf languageName: node linkType: hard @@ -402,676 +413,675 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" +"@babel/plugin-transform-arrow-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c29f081224859483accf55fb4d091db2aac0dcd0d7954bac5ca889030cc498d3f771aa20eb2e9cd8310084ec394d85fa084b97faf09298b6bc9541182b3eb5bb + checksum: 10/62c2cc0ae2093336b1aa1376741c5ed245c0987d9e4b4c5313da4a38155509a7098b5acce582b6781cc0699381420010da2e3086353344abe0a6a0ec38961eb7 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.26.8" +"@babel/plugin-transform-async-generator-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/helper-remap-async-to-generator": "npm:^7.25.9" - "@babel/traverse": "npm:^7.26.8" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/8fb43823f56281b041dbd358de4f59fccb3e20aac133a439caaeb5aaa30671b3482da9a8515b169fef108148e937c1248b7d6383979c3b30f9348e3fabd29b8e + checksum: 10/92e8ba589e8b128255846375e13fee30a3b77c889578f1f30da57ee26133f397dbbc81b27e1f19c12080b096930e62bce1dcbaa7a1453d296f51eb8bda3b8d39 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" +"@babel/plugin-transform-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.27.1" dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-remap-async-to-generator": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b3ad50fb93c171644d501864620ed23952a46648c4df10dc9c62cc9ad08031b66bd272cfdd708faeee07c23b6251b16f29ce0350473e4c79f0c32178d38ce3a6 + checksum: 10/d79d7a7ae7d416f6a48200017d027a6ba94c09c7617eea8b4e9c803630f00094c1a4fc32bf20ce3282567824ce3fcbda51653aac4003c71ea4e681b331338979 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" +"@babel/plugin-transform-block-scoped-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f2046c09bf8e588bfb1a6342d0eee733189102cf663ade27adb0130f3865123af5816b40a55ec8d8fa09271b54dfdaf977cd2f8e0b3dc97f18e690188d5a2174 + checksum: 10/7fb4988ca80cf1fc8345310d5edfe38e86b3a72a302675cdd09404d5064fe1d1fe1283ebe658ad2b71445ecef857bfb29a748064306b5f6c628e0084759c2201 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.9": - version: 7.27.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.27.0" +"@babel/plugin-transform-block-scoping@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-block-scoping@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5195fc5890cb8253c4d774d742703832829caefa118a19bca7d9bb0b0c467b61459b89a2d526eb0d262969ed257226d1a77b2504deed0eeac62ffdf02c884095 + checksum: 10/1afed217e44de8d1ad30eccd9d3ba30627798718db3c58430413ebaeb3488620bf2b16c5bfb54b1bb8935635fb5583c9dd53ea8588e9674e6c9478e7b03f94ca languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" +"@babel/plugin-transform-class-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a8d69e2c285486b63f49193cbcf7a15e1d3a5f632c1c07d7a97f65306df7f554b30270b7378dde143f8b557d1f8f6336c643377943dec8ec405e4cd11e90b9ea + checksum: 10/475a6e5a9454912fe1bdc171941976ca10ea4e707675d671cdb5ce6b6761d84d1791ac61b6bca81a2e5f6430cb7b9d8e4b2392404110e69c28207a754e196294 languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" +"@babel/plugin-transform-class-static-block@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-class-static-block@npm:7.27.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10/60cba3f125a7bc4f90706af0a011697c7ffd2eddfba336ed6f84c5f358c44c3161af18b0202475241a96dee7964d96dd3a342f46dbf85b75b38bb789326e1766 + checksum: 10/2d49de0f5ffc66ae873be1d8c3bf4d22e51889cc779d534e4dbda0f91e36907479e5c650b209fcfc80f922a6c3c2d76c905fc2f5dc78cc9a836f8c31b10686c4 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-classes@npm:7.25.9" +"@babel/plugin-transform-classes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-classes@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" globals: "npm:^11.1.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1914ebe152f35c667fba7bf17ce0d9d0f33df2fb4491990ce9bb1f9ec5ae8cbd11d95b0dc371f7a4cc5e7ce4cf89467c3e34857302911fc6bfb6494a77f7b37e + checksum: 10/4ac2224fa68b933c80b4755300d795e055f6fb18c51432e9a4c048edcd6c64cae097eb9063d25f6c7e706ecd85a4c0b89b6f89b320b5798e3139c9cc4ff99f61 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" +"@babel/plugin-transform-computed-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-computed-properties@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/template": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/template": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/aa1a9064d6a9d3b569b8cae6972437315a38a8f6553ee618406da5122500a06c2f20b9fa93aeed04dd895923bf6f529c09fc79d4be987ec41785ceb7d2203122 + checksum: 10/101f6d4575447070943d5a9efaa5bea8c552ea3083d73a9612f1a16d38b0a0a7b79a5feb65c6cc4e4fcabf28e85a570b97ccd3294da966e8fbbb6dfb97220eda languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" +"@babel/plugin-transform-destructuring@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-destructuring@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/51b24fbead910ad0547463b2d214dd08076b22a66234b9f878b8bac117603dd23e05090ff86e9ffc373214de23d3e5bf1b095fe54cce2ca16b010264d90cf4f5 + checksum: 10/8a128e80135985a9a8f403f8c684f65c0eacb6d5295567c38b1b67dc8717821894c8a004977381c7bb82c647678521f063c981afd9d1141b25df838ad0e8c1b2 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" +"@babel/plugin-transform-dotall-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/8bdf1bb9e6e3a2cc8154ae88a3872faa6dc346d6901994505fb43ac85f858728781f1219f40b67f7bb0687c507450236cb7838ac68d457e65637f98500aa161b + checksum: 10/2173e5b13f403538ffc6bd57b190cedf4caf320abc13a99e5b2721864e7148dbd3bd7c82d92377136af80432818f665fdd9a1fd33bc5549a4c91e24e5ce2413c languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" +"@babel/plugin-transform-duplicate-keys@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/10dbb87bc09582416f9f97ca6c40563655abf33e3fd0fee25eeaeff28e946a06651192112a2bc2b18c314a638fa15c55b8365a677ef67aa490848cefdc57e1d8 + checksum: 10/987b718d2fab7626f61b72325c8121ead42341d6f46ad3a9b5e5f67f3ec558c903f1b8336277ffc43caac504ce00dd23a5456b5d1da23913333e1da77751f08d languageName: node linkType: hard -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/f7233cf596be8c6843d31951afaf2464a62a610cb89c72c818c044765827fab78403ab8a7d3a6386f838c8df574668e2a48f6c206b1d7da965aff9c6886cb8e6 + checksum: 10/2a109613535e6ac79240dced71429e988affd6a5b3d0cd0f563c8d6c208c51ce7bf2c300bc1150502376b26a51f279119b3358f1c0f2d2f8abca3bcd62e1ae46 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" +"@babel/plugin-transform-dynamic-import@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/aaca1ccda819be9b2b85af47ba08ddd2210ff2dbea222f26e4cd33f97ab020884bf81a66197e50872721e9daf36ceb5659502c82199884ea74d5d75ecda5c58b + checksum: 10/7a9fbc8d17148b7f11a1d1ca3990d2c2cd44bd08a45dcaf14f20a017721235b9044b20e6168b6940282bb1b48fb78e6afbdfb9dd9d82fde614e15baa7d579932 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.26.3": - version: 7.26.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" +"@babel/plugin-transform-exponentiation-operator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0d8da2e552a50a775fe8e6e3c32621d20d3c5d1af7ab40ca2f5c7603de057b57b1b5850f74040e4ecbe36c09ac86d92173ad1e223a2a3b3df3cc359ca4349738 + checksum: 10/dbbedd24724c2d590ef59d32cb1fef34e99daba41c5b621f9f4c4da23e15c2bb4b1e3d954c314645016391404cf00f1e4ddec8f1f7891438bcde9aaf16e16ee0 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" +"@babel/plugin-transform-export-namespace-from@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4dfe8df86c5b1d085d591290874bb2d78a9063090d71567ed657a418010ad333c3f48af2c974b865f53bbb718987a065f89828d43279a7751db1a56c9229078d + checksum: 10/85082923eca317094f08f4953d8ea2a6558b3117826c0b740676983902b7236df1f4213ad844cb38c2dae104753dbe8f1cc51f01567835d476d32f5f544a4385 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/plugin-transform-for-of@npm:7.26.9" +"@babel/plugin-transform-for-of@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-for-of@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/25df1ea3bcecc1bcef99f273fbd8f4a73a509ab7ef3db93629817cb02f9d24868ca3760347f864c8fa4ab79ffa86fb09b2f2de1f2ba1f73f27dbe0c3973c6868 + checksum: 10/705c591d17ef263c309bba8c38e20655e8e74ff7fd21883a9cdaf5bf1df42d724383ad3d88ac01f42926e15b1e1e66f2f7f8c4e87de955afffa290d52314b019 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-function-name@npm:7.25.9" +"@babel/plugin-transform-function-name@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-function-name@npm:7.27.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a8d7c8d019a6eb57eab5ca1be3e3236f175557d55b1f3b11f8ad7999e3fbb1cf37905fd8cb3a349bffb4163a558e9f33b63f631597fdc97c858757deac1b2fd7 + checksum: 10/26a2a183c3c52a96495967420a64afc5a09f743a230272a131668abf23001e393afa6371e6f8e6c60f4182bea210ed31d1caf866452d91009c1daac345a52f23 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" +"@babel/plugin-transform-json-strings@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-json-strings@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e2498d84761cfd05aaea53799933d55af309c9d6204e66b38778792d171e4d1311ad34f334259a3aa3407dd0446f6bd3e390a1fcb8ce2e42fe5aabed0e41bee1 + checksum: 10/2c05a02f63b49f47069271b3405a66c3c8038de5b995b0700b1bd9a5e2bb3e67abd01e4604629302a521f4d8122a4233944aefa16559fd4373d256cc5d3da57f languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-literals@npm:7.25.9" +"@babel/plugin-transform-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/3cca75823a38aab599bc151b0fa4d816b5e1b62d6e49c156aa90436deb6e13649f5505973151a10418b64f3f9d1c3da53e38a186402e0ed7ad98e482e70c0c14 + checksum: 10/0a76d12ab19f32dd139964aea7da48cecdb7de0b75e207e576f0f700121fe92367d788f328bf4fb44b8261a0f605c97b44e62ae61cddbb67b14e94c88b411f95 languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/8c6febb4ac53852314d28b5e2c23d5dbbff7bf1e57d61f9672e0d97531ef7778b3f0ad698dcf1179f5486e626c77127508916a65eb846a89e98a92f70ed3537b + checksum: 10/2757955d81d65cc4701c17b83720745f6858f7a1d1d58117e379c204f47adbeb066b778596b6168bdbf4a22c229aab595d79a9abc261d0c6bfd62d4419466e73 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" +"@babel/plugin-transform-member-expression-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/db92041ae87b8f59f98b50359e0bb172480f6ba22e5e76b13bdfe07122cbf0daa9cd8ad2e78dcb47939938fed88ad57ab5989346f64b3a16953fc73dea3a9b1f + checksum: 10/804121430a6dcd431e6ffe99c6d1fbbc44b43478113b79c677629e7f877b4f78a06b69c6bfb2747fd84ee91879fe2eb32e4620b53124603086cf5b727593ebe8 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" +"@babel/plugin-transform-modules-amd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/75d34c6e709a23bcfa0e06f722c9a72b1d9ac3e7d72a07ef54a943d32f65f97cbbf0e387d874eb9d9b4c8d33045edfa8e8441d0f8794f3c2b9f1d71b928acf2c + checksum: 10/5ca9257981f2bbddd9dccf9126f1368de1cb335e7a5ff5cca9282266825af5b18b5f06c144320dcf5d2a200d2b53b6d22d9b801a55dc0509ab5a5838af7e61b7 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.26.3": - version: 7.26.3 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" +"@babel/plugin-transform-modules-commonjs@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f817f02fa04d13f1578f3026239b57f1003bebcf9f9b8d854714bed76a0e4986c79bd6d2e0ac14282c5d309454a8dab683c179709ca753b0152a69c69f3a78e3 + checksum: 10/9059243a977bc1f13e3dccfc6feb6508890e7c7bb191f7eb56626b20672b4b12338051ca835ab55426875a473181502c8f35b4df58ba251bef63b25866d995fe languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" +"@babel/plugin-transform-modules-systemjs@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/03145aa89b7c867941a03755216cfb503df6d475a78df84849a157fa5f2fcc17ba114a968d0579ae34e7c61403f35d1ba5d188fdfb9ad05f19354eb7605792f9 + checksum: 10/06d7bf76ac4688a36ae8e8d2dde1c3b8bab4594362132b74a00d5a32e6716944d68911b9bc53df60e59f4f9c7f1796525503ce3e3eed42f842d7775ccdfd836e languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" +"@babel/plugin-transform-modules-umd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/47d03485fedac828832d9fee33b3b982a6db8197e8651ceb5d001890e276150b5a7ee3e9780749e1ba76453c471af907a159108832c24f93453dd45221788e97 + checksum: 10/7388932863b4ee01f177eb6c2e2df9e2312005e43ada99897624d5565db4b9cef1e30aa7ad2c79bbe5373f284cfcddea98d8fe212714a24c6aba223272163058 languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/434346ba05cf74e3f4704b3bdd439287b95cd2a8676afcdc607810b8c38b6f4798cd69c1419726b2e4c7204e62e4a04d31b0360e91ca57a930521c9211e07789 + checksum: 10/a711c92d9753df26cefc1792481e5cbff4fe4f32b383d76b25e36fa865d8023b1b9aa6338cf18f5c0e864c71a7fbe8115e840872ccd61a914d9953849c68de7d languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-new-target@npm:7.25.9" +"@babel/plugin-transform-new-target@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-new-target@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/07bb3a09028ee7b8e8ede6e6390e3b3aecc5cf9adb2fc5475ff58036c552b8a3f8e63d4c43211a60545f3307cdc15919f0e54cb5455d9546daed162dc54ff94e + checksum: 10/620d78ee476ae70960989e477dc86031ffa3d554b1b1999e6ec95261629f7a13e5a7b98579c63a009f9fdf14def027db57de1f0ae1f06fb6eaed8908ff65cf68 languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.26.6": - version: 7.26.6 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/3832609f043dd1cd8076ab6a00a201573ef3f95bb2144d57787e4a973b3189884c16b4e77ff8e84a6ca47bc3b65bb7df10dca2f6163dfffc316ac96c37b0b5a6 + checksum: 10/15333f4888ffedc449a2a21a0b1ca7983e089f43faa00cfb71d2466e20221a5fd979cdb1a3f57bc20fc62c67bd3ff3dde054133fb6324a58be8f64d20aefacd2 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" +"@babel/plugin-transform-numeric-separator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0528ef041ed88e8c3f51624ee87b8182a7f246fe4013f0572788e0727d20795b558f2b82e3989b5dd416cbd339500f0d88857de41b6d3b6fdacb1d5344bcc5b1 + checksum: 10/049b958911de86d32408cd78017940a207e49c054ae9534ab53a32a57122cc592c0aae3c166d6f29bd1a7d75cc779d71883582dd76cb28b2fbb493e842d8ffca languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" +"@babel/plugin-transform-object-rest-spread@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.27.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/plugin-transform-parameters": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/plugin-transform-parameters": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a157ac5af2721090150858f301d9c0a3a0efb8ef66b90fce326d6cc0ae45ab97b6219b3e441bf8d72a2287e95eb04dd6c12544da88ea2345e70b3fac2c0ac9e2 + checksum: 10/f51d6c333b0e270fec4efed30e8ad7b4a892d14fee21f7098da476dd7d353544e113d84f31c44ad77ad34a93d0fb6aae1d7490d2829905471e98d99d98f7f3e7 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-super@npm:7.25.9" +"@babel/plugin-transform-object-super@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-object-super@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1817b5d8b80e451ae1ad9080cca884f4f16df75880a158947df76a2ed8ab404d567a7dce71dd8051ef95f90fbe3513154086a32aba55cc76027f6cbabfbd7f98 + checksum: 10/46b819cb9a6cd3cfefe42d07875fee414f18d5e66040366ae856116db560ad4e16f3899a0a7fddd6773e0d1458444f94b208b67c0e3b6977a27ea17a5c13dbf6 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" +"@babel/plugin-transform-optional-catch-binding@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b46a8d1e91829f3db5c252583eb00d05a779b4660abeea5500fda0f8ffa3584fd18299443c22f7fddf0ed9dfdb73c782c43b445dc468d4f89803f2356963b406 + checksum: 10/f4356b04cf21a98480f9788ea50f1f13ee88e89bb6393ba4b84d1f39a4a84c7928c9a4328e8f4c5b6deb218da68a8fd17bf4f46faec7653ddc20ffaaa5ba49f4 languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" +"@babel/plugin-transform-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bc838a499fd9892e163b8bc9bfbc4bf0b28cc3232ee0a6406ae078257c8096518f871d09b4a32c11f4a2d6953c3bc1984619ef748f7ad45aed0b0d9689a8eb36 + checksum: 10/34b0f96400c259a2722740d17a001fe45f78d8ff052c40e29db2e79173be72c1cfe8d9681067e3f5da3989e4a557402df5c982c024c18257587a41e022f95640 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-parameters@npm:7.25.9" +"@babel/plugin-transform-parameters@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-parameters@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/014009a1763deb41fe9f0dbca2c4489ce0ac83dd87395f488492e8eb52399f6c883d5bd591bae3b8836f2460c3937fcebd07e57dce1e0bfe30cdbc63fdfc9d3a + checksum: 10/47db574f8f3adf7a5d85933c9a2a2dee956ceda9e00fb4e03e9a9d600b559f06cba2da7c5e78a12b05dcf993cf147634edf0391f3f20a6b451830f41be47fe68 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" +"@babel/plugin-transform-private-methods@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-private-methods@npm:7.27.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6e3671b352c267847c53a170a1937210fa8151764d70d25005e711ef9b21969aaf422acc14f9f7fb86bc0e4ec43e7aefcc0ad9196ae02d262ec10f509f126a58 + checksum: 10/c76f8f6056946466116e67eb9d8014a2d748ade2062636ab82045c1dac9c233aff10e597777bc5af6f26428beb845ceb41b95007abef7d0484da95789da56662 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" +"@babel/plugin-transform-private-property-in-object@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/aa45bb5669b610afa763d774a4b5583bb60ce7d38e4fd2dedfd0703e73e25aa560e6c6124e155aa90b101601743b127d9e5d3eb00989a7e4b4ab9c2eb88475ba + checksum: 10/d4466d42a02c5a318d9d7b8102969fd032b17ff044918dfd462d5cc49bd11f5773ee0794781702afdf4727ba11e9be6cbea1e396bc0a7307761bb9a56399012a languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" +"@babel/plugin-transform-property-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/436046ab07d54a9b44a384eeffec701d4e959a37a7547dda72e069e751ca7ff753d1782a8339e354b97c78a868b49ea97bf41bf5a44c6d7a3c0a05ad40eeb49c + checksum: 10/7caec27d5ed8870895c9faf4f71def72745d69da0d8e77903146a4e135fd7bed5778f5f9cebb36c5fba86338e6194dd67a08c033fc84b4299b7eceab6d9630cb languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.25.9": - version: 7.27.0 - resolution: "@babel/plugin-transform-regenerator@npm:7.27.0" +"@babel/plugin-transform-regenerator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-regenerator@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" - regenerator-transform: "npm:^0.15.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bd2f3278df31aa41cb34b051352e0d76e1feef6827a83885b6b66893a563cc9cc6bc34fc45899237e81224081ba951d8a7fed009c7de01e890646b291be7903c + checksum: 10/a6a3f818e4cc5ac5a01962a1d66515cb6791f32eb1dcd810dbb39f6e580c0c96b47fcc5c5633137e040f4e137e40e6f4dad8a3d57d49b15aed40e72e13e30d93 languageName: node linkType: hard -"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" +"@babel/plugin-transform-regexp-modifiers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/726deca486bbd4b176f8a966eb0f4aabc19d9def3b8dabb8b3a656778eca0df1fda3f3c92b213aa5a184232fdafd5b7bd73b4e24ca4345c498ef6baff2bda4e1 + checksum: 10/f6cb385fe0e798bff7e9b20cf5912bf40e180895ff3610b1ccdce260f3c20daaebb3a99dc087c8168a99151cd3e16b94f4689fd5a4b01cf1834b45c133e620b2 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" +"@babel/plugin-transform-reserved-words@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/8beda04481b25767acbd1f6b9ef7b3a9c12fbd9dcb24df45a6ad120e1dc4b247c073db60ac742f9093657d6d8c050501fc0606af042f81a3bb6a3ff862cddc47 + checksum: 10/dea0b66742d2863b369c06c053e11e15ba785892ea19cccf7aef3c1bdaa38b6ab082e19984c5ea7810d275d9445c5400fcc385ad71ce707ed9256fadb102af3b languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.26.10": - version: 7.26.10 - resolution: "@babel/plugin-transform-runtime@npm:7.26.10" +"@babel/plugin-transform-runtime@npm:7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-runtime@npm:7.27.1" dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" babel-plugin-polyfill-corejs2: "npm:^0.4.10" babel-plugin-polyfill-corejs3: "npm:^0.11.0" babel-plugin-polyfill-regenerator: "npm:^0.6.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/452c7ef0fd18518d19c3c75922650bbfb1a0e6390ca54198294bb84ad697e1380989ed9ee1727d278c8c39b0e6f97320081a84f57256edf3781741c6568721b2 + checksum: 10/a9f0f6a1b392873a7e0269560330e3fc6f3c078948e2f96d255bbda32f7040021e6cc253f7e2430c9ce8aec237063730dc8aa7f3d29ecb6e090ade321fb8b062 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" +"@babel/plugin-transform-shorthand-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f774995d58d4e3a992b732cf3a9b8823552d471040e280264dd15e0735433d51b468fef04d75853d061309389c66bda10ce1b298297ce83999220eb0ad62741d + checksum: 10/fbba6e2aef0b69681acb68202aa249c0598e470cc0853d7ff5bd0171fd6a7ec31d77cfabcce9df6360fc8349eded7e4a65218c32551bd3fc0caaa1ac899ac6d4 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-spread@npm:7.25.9" +"@babel/plugin-transform-spread@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-spread@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/fe72c6545267176cdc9b6f32f30f9ced37c1cafa1290e4436b83b8f377b4f1c175dad404228c96e3efdec75da692f15bfb9db2108fcd9ad260bc9968778ee41e + checksum: 10/3edd28b07e1951f32aa2d380d9a0e0ed408c64a5cea2921d02308541042aca18f146b3a61e82e534d4d61cb3225dbc847f4f063aedfff6230b1a41282e95e8a2 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" +"@babel/plugin-transform-sticky-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7454b00844dbe924030dd15e2b3615b36e196500c4c47e98dabc6b37a054c5b1038ecd437e910aabf0e43bf56b973cb148d3437d50f6e2332d8309568e3e979b + checksum: 10/e1414a502efba92c7974681767e365a8cda6c5e9e5f33472a9eaa0ce2e75cea0a9bef881ff8dda37c7810ad902f98d3c00ead92a3ac3b73a79d011df85b5a189 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/plugin-transform-template-literals@npm:7.26.8" +"@babel/plugin-transform-template-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/65874c8844ce906507cd5b9c78950d6173f8339b6416a2a9e763021db5a7045315a6f0e58976ec4af5e960c003ef322576c105130a644addb8f94d1a0821a972 + checksum: 10/93aad782503b691faef7c0893372d5243df3219b07f1f22cfc32c104af6a2e7acd6102c128439eab15336d048f1b214ca134b87b0630d8cd568bf447f78b25ce languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.26.7": - version: 7.27.0 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.0" +"@babel/plugin-transform-typeof-symbol@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/cd97a99c9aa62351fa258cc2de403a0cd8839461a5bdd648e18c8331998ca47573d2b122afda647da291c906952f65d96f68d0a53d287cf1bd34cf7e32d2bbb0 + checksum: 10/812d736402a6f9313b86b8adf36740394400be7a09c48e51ee45ab4a383a3f46fc618d656dd12e44934665e42ae71cf143e25b95491b699ef7c737950dbdb862 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" +"@babel/plugin-transform-unicode-escapes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f138cbee539963fb3da13f684e6f33c9f7495220369ae12a682b358f1e25ac68936825562c38eae87f01ac9992b2129208b35ec18533567fc805ce5ed0ffd775 + checksum: 10/87b9e49dee4ab6e78f4cdcdbdd837d7784f02868a96bfc206c8dbb17dd85db161b5a0ecbe95b19a42e8aea0ce57e80249e1facbf9221d7f4114d52c3b9136c9e languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" +"@babel/plugin-transform-unicode-property-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/201f6f46c1beb399e79aa208b94c5d54412047511795ce1e790edcd189cef73752e6a099fdfc01b3ad12205f139ae344143b62f21f44bbe02338a95e8506a911 + checksum: 10/5d99c89537d1ebaac3f526c04b162cf95a47d363d4829f78c6701a2c06ab78a48da66a94f853f85f44a3d72153410ba923e072bed4b7166fa097f503eb14131d languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" +"@babel/plugin-transform-unicode-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e8baae867526e179467c6ef5280d70390fa7388f8763a19a27c21302dd59b121032568be080749514b097097ceb9af716bf4b90638f1b3cf689aa837ba20150f + checksum: 10/a34d89a2b75fb78e66d97c3dc90d4877f7e31f43316b52176f95a5dee20e9bb56ecf158eafc42a001676ddf7b393d9e67650bad6b32f5405780f25fb83cd68e3 languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/4445ef20de687cb4dcc95169742a8d9013d680aa5eee9186d8e25875bbfa7ee5e2de26a91177ccf70b1db518e36886abcd44750d28db5d7a9539f0efa6839f4b + checksum: 10/295126074c7388ab05c82ef3ed0907a1ee4666bbdd763477ead9aba6eb2c74bdf65669416861ac93d337a4a27640963bb214acadc2697275ce95aab14868d57f languageName: node linkType: hard -"@babel/preset-env@npm:7.26.9, @babel/preset-env@npm:^7.11.0": - version: 7.26.9 - resolution: "@babel/preset-env@npm:7.26.9" +"@babel/preset-env@npm:7.27.1, @babel/preset-env@npm:^7.11.0": + version: 7.27.1 + resolution: "@babel/preset-env@npm:7.27.1" dependencies: - "@babel/compat-data": "npm:^7.26.8" - "@babel/helper-compilation-targets": "npm:^7.26.5" - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/helper-validator-option": "npm:^7.25.9" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.9" - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.9" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.9" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.9" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.9" + "@babel/compat-data": "npm:^7.27.1" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.27.1" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.27.1" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions": "npm:^7.26.0" - "@babel/plugin-syntax-import-attributes": "npm:^7.26.0" + "@babel/plugin-syntax-import-assertions": "npm:^7.27.1" + "@babel/plugin-syntax-import-attributes": "npm:^7.27.1" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.25.9" - "@babel/plugin-transform-async-generator-functions": "npm:^7.26.8" - "@babel/plugin-transform-async-to-generator": "npm:^7.25.9" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.26.5" - "@babel/plugin-transform-block-scoping": "npm:^7.25.9" - "@babel/plugin-transform-class-properties": "npm:^7.25.9" - "@babel/plugin-transform-class-static-block": "npm:^7.26.0" - "@babel/plugin-transform-classes": "npm:^7.25.9" - "@babel/plugin-transform-computed-properties": "npm:^7.25.9" - "@babel/plugin-transform-destructuring": "npm:^7.25.9" - "@babel/plugin-transform-dotall-regex": "npm:^7.25.9" - "@babel/plugin-transform-duplicate-keys": "npm:^7.25.9" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.9" - "@babel/plugin-transform-dynamic-import": "npm:^7.25.9" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.26.3" - "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" - "@babel/plugin-transform-for-of": "npm:^7.26.9" - "@babel/plugin-transform-function-name": "npm:^7.25.9" - "@babel/plugin-transform-json-strings": "npm:^7.25.9" - "@babel/plugin-transform-literals": "npm:^7.25.9" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.9" - "@babel/plugin-transform-member-expression-literals": "npm:^7.25.9" - "@babel/plugin-transform-modules-amd": "npm:^7.25.9" - "@babel/plugin-transform-modules-commonjs": "npm:^7.26.3" - "@babel/plugin-transform-modules-systemjs": "npm:^7.25.9" - "@babel/plugin-transform-modules-umd": "npm:^7.25.9" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.9" - "@babel/plugin-transform-new-target": "npm:^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.26.6" - "@babel/plugin-transform-numeric-separator": "npm:^7.25.9" - "@babel/plugin-transform-object-rest-spread": "npm:^7.25.9" - "@babel/plugin-transform-object-super": "npm:^7.25.9" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.9" - "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" - "@babel/plugin-transform-parameters": "npm:^7.25.9" - "@babel/plugin-transform-private-methods": "npm:^7.25.9" - "@babel/plugin-transform-private-property-in-object": "npm:^7.25.9" - "@babel/plugin-transform-property-literals": "npm:^7.25.9" - "@babel/plugin-transform-regenerator": "npm:^7.25.9" - "@babel/plugin-transform-regexp-modifiers": "npm:^7.26.0" - "@babel/plugin-transform-reserved-words": "npm:^7.25.9" - "@babel/plugin-transform-shorthand-properties": "npm:^7.25.9" - "@babel/plugin-transform-spread": "npm:^7.25.9" - "@babel/plugin-transform-sticky-regex": "npm:^7.25.9" - "@babel/plugin-transform-template-literals": "npm:^7.26.8" - "@babel/plugin-transform-typeof-symbol": "npm:^7.26.7" - "@babel/plugin-transform-unicode-escapes": "npm:^7.25.9" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.9" - "@babel/plugin-transform-unicode-regex": "npm:^7.25.9" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.9" + "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.27.1" + "@babel/plugin-transform-async-to-generator": "npm:^7.27.1" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" + "@babel/plugin-transform-block-scoping": "npm:^7.27.1" + "@babel/plugin-transform-class-properties": "npm:^7.27.1" + "@babel/plugin-transform-class-static-block": "npm:^7.27.1" + "@babel/plugin-transform-classes": "npm:^7.27.1" + "@babel/plugin-transform-computed-properties": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.27.1" + "@babel/plugin-transform-dotall-regex": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.27.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" + "@babel/plugin-transform-for-of": "npm:^7.27.1" + "@babel/plugin-transform-function-name": "npm:^7.27.1" + "@babel/plugin-transform-json-strings": "npm:^7.27.1" + "@babel/plugin-transform-literals": "npm:^7.27.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.27.1" + "@babel/plugin-transform-member-expression-literals": "npm:^7.27.1" + "@babel/plugin-transform-modules-amd": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.27.1" + "@babel/plugin-transform-modules-umd": "npm:^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-new-target": "npm:^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.27.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.27.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.27.1" + "@babel/plugin-transform-object-super": "npm:^7.27.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" + "@babel/plugin-transform-parameters": "npm:^7.27.1" + "@babel/plugin-transform-private-methods": "npm:^7.27.1" + "@babel/plugin-transform-private-property-in-object": "npm:^7.27.1" + "@babel/plugin-transform-property-literals": "npm:^7.27.1" + "@babel/plugin-transform-regenerator": "npm:^7.27.1" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.27.1" + "@babel/plugin-transform-reserved-words": "npm:^7.27.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" + "@babel/plugin-transform-spread": "npm:^7.27.1" + "@babel/plugin-transform-sticky-regex": "npm:^7.27.1" + "@babel/plugin-transform-template-literals": "npm:^7.27.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.27.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.27.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.27.1" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2: "npm:^0.4.10" babel-plugin-polyfill-corejs3: "npm:^0.11.0" @@ -1080,7 +1090,7 @@ __metadata: semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/ac6fad331760c0bc25ed428b7696b297bad7046a75f30e544b392acfb33709f12316b9a5b0c8606f933d5756e1b9d527b46fda09693db52e851325443dd6a574 + checksum: 10/647ff0fed12a2d62285619014db234d1c87ffd1816feafa46676c63663872db087bd00ce635941f5e48ea1ef3452356087877f6c186cbabc38e34a6bd1d8564c languageName: node linkType: hard @@ -1097,48 +1107,46 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:7.27.0, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.8.4": - version: 7.27.0 - resolution: "@babel/runtime@npm:7.27.0" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10/e6966e03b695feb4c0ac0856a4355231c2580bf9ebd0298f47739f85c0ea658679dd84409daf26378d42c86c1cbe7e33feab709b14e784254b6c441d91606465 +"@babel/runtime@npm:7.27.1, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.11.2": + version: 7.27.1 + resolution: "@babel/runtime@npm:7.27.1" + checksum: 10/34cefcbf781ea5a4f1b93f8563327b9ac82694bebdae91e8bd9d7f58d084cbe5b9a6e7f94d77076e15b0bcdaa0040a36cb30737584028df6c4673b4c67b2a31d languageName: node linkType: hard -"@babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9, @babel/template@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/template@npm:7.27.0" +"@babel/template@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/template@npm:7.27.1" dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/parser": "npm:^7.27.0" - "@babel/types": "npm:^7.27.0" - checksum: 10/7159ca1daea287ad34676d45a7146675444d42c7664aca3e617abc9b1d9548c8f377f35a36bb34cf956e1d3610dcb7acfcfe890aebf81880d35f91a7bd273ee5 + "@babel/code-frame": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/5ac109d696705fe303cc8d078abe12adac34855b65f579d4bb9f8470d491983db66f686c064b26e08d667d76b924ffbd8f16255a75daa994d51c426d7a22320e languageName: node linkType: hard -"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/traverse@npm:7.27.0" +"@babel/traverse@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/traverse@npm:7.27.1" dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.27.0" - "@babel/parser": "npm:^7.27.0" - "@babel/template": "npm:^7.27.0" - "@babel/types": "npm:^7.27.0" + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.1" + "@babel/template": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/b0675bc16bd87187e8b090557b0650135de56a621692ad8614b20f32621350ae0fc2e1129b73b780d64a9ed4beab46849a17f90d5267b6ae6ce09ec8412a12c7 + checksum: 10/9977271aa451293d3f184521412788d6ddaff9d6a29626d7435b5dacd059feb2d7753bc94f59f4f5b76e65bd2e2cabc8a10d7e1f93709feda28619f2e8cbf4d6 languageName: node linkType: hard -"@babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.0, @babel/types@npm:^7.4.4": - version: 7.27.0 - resolution: "@babel/types@npm:7.27.0" +"@babel/types@npm:^7.25.4, @babel/types@npm:^7.27.1, @babel/types@npm:^7.4.4": + version: 7.27.1 + resolution: "@babel/types@npm:7.27.1" dependencies: - "@babel/helper-string-parser": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10/2c322bce107c8a534dc4a23be60d570e6a4cc7ca2e44d4f0eee08c0b626104eb7e60ab8de03463bc5da1773a2f69f1e6edec1648d648d65461d6520a7f3b0770 + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + checksum: 10/81f8ada28c4b29695d7d4c4cbfaa5ec3138ccebbeb26628c7c3cc570fdc84f28967c9e68caf4977d51ff4f4d3159c88857ef278317f84f3515dd65e5b8a74995 languageName: node linkType: hard @@ -9204,11 +9212,11 @@ __metadata: version: 0.0.0-use.local resolution: "home-assistant-frontend@workspace:." dependencies: - "@babel/core": "npm:7.26.10" + "@babel/core": "npm:7.27.1" "@babel/helper-define-polyfill-provider": "npm:0.6.4" - "@babel/plugin-transform-runtime": "npm:7.26.10" - "@babel/preset-env": "npm:7.26.9" - "@babel/runtime": "npm:7.27.0" + "@babel/plugin-transform-runtime": "npm:7.27.1" + "@babel/preset-env": "npm:7.27.1" + "@babel/runtime": "npm:7.27.1" "@braintree/sanitize-url": "npm:7.1.1" "@bundle-stats/plugin-webpack-filter": "npm:4.20.0" "@codemirror/autocomplete": "npm:6.18.6" @@ -12518,22 +12526,6 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.14.0": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 10/5db3161abb311eef8c45bcf6565f4f378f785900ed3945acf740a9888c792f75b98ecb77f0775f3bf95502ff423529d23e94f41d80c8256e8fa05ed4b07cf471 - languageName: node - linkType: hard - -"regenerator-transform@npm:^0.15.2": - version: 0.15.2 - resolution: "regenerator-transform@npm:0.15.2" - dependencies: - "@babel/runtime": "npm:^7.8.4" - checksum: 10/c4fdcb46d11bbe32605b4b9ed76b21b8d3f241a45153e9dc6f5542fed4c7744fed459f42701f650d5d5956786bf7de57547329d1c05a9df2ed9e367b9d903302 - languageName: node - linkType: hard - "regexp-tree@npm:^0.1.24": version: 0.1.27 resolution: "regexp-tree@npm:0.1.27" From d7660370abe5f86acd345f3dcc8c8651ec7ed810 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sun, 4 May 2025 10:38:01 +0300 Subject: [PATCH 032/247] Fix display of disabled items in traces (#25293) --- src/components/trace/ha-timeline.ts | 6 +++--- src/components/trace/hat-graph-node.ts | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/trace/ha-timeline.ts b/src/components/trace/ha-timeline.ts index b7ab5b2757..4ee033573c 100644 --- a/src/components/trace/ha-timeline.ts +++ b/src/components/trace/ha-timeline.ts @@ -11,8 +11,8 @@ export class HaTimeline extends LitElement { @property({ type: Boolean, reflect: true }) public raised = false; - @property({ attribute: false, reflect: true, type: Boolean }) notEnabled = - false; + @property({ attribute: "not-enabled", reflect: true, type: Boolean }) + notEnabled = false; @property({ attribute: "last-item", type: Boolean }) public lastItem = false; @@ -82,7 +82,7 @@ export class HaTimeline extends LitElement { margin-inline-start: initial; width: 24px; } - :host([notEnabled]) ha-svg-icon { + :host([not-enabled]) ha-svg-icon { opacity: 0.5; } ha-svg-icon { diff --git a/src/components/trace/hat-graph-node.ts b/src/components/trace/hat-graph-node.ts index 330338b7cc..10ea69d58b 100644 --- a/src/components/trace/hat-graph-node.ts +++ b/src/components/trace/hat-graph-node.ts @@ -17,8 +17,8 @@ export class HatGraphNode extends LitElement { @property({ type: Boolean }) public error = false; - @property({ attribute: false, reflect: true, type: Boolean }) notEnabled = - false; + @property({ attribute: "not-enabled", reflect: true, type: Boolean }) + notEnabled = false; @property({ attribute: "graph-start", reflect: true, type: Boolean }) graphStart = false; @@ -127,13 +127,13 @@ export class HatGraphNode extends LitElement { --stroke-clr: var(--hover-clr); --icon-clr: var(--default-icon-clr); } - :host([notEnabled]) circle { + :host([not-enabled]) circle { --stroke-clr: var(--disabled-clr); } - :host([notEnabled][active]) circle { + :host([not-enabled][active]) circle { --stroke-clr: var(--disabled-active-clr); } - :host([notEnabled]:hover) circle { + :host([not-enabled]:hover) circle { --stroke-clr: var(--disabled-hover-clr); } svg:not(.safari) { From 40fe62c2ec50842fe75270fdb71b9ca36ed2325b Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Sun, 4 May 2025 14:41:01 +0300 Subject: [PATCH 033/247] Fix select entity row opening more info on select (#25292) --- src/panels/lovelace/entity-rows/hui-select-entity-row.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/panels/lovelace/entity-rows/hui-select-entity-row.ts b/src/panels/lovelace/entity-rows/hui-select-entity-row.ts index fa7fb03ca2..17c6dbf2d9 100644 --- a/src/panels/lovelace/entity-rows/hui-select-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-select-entity-row.ts @@ -93,6 +93,7 @@ class HuiSelectEntityRow extends LitElement implements LovelaceRow { `; private _handleAction(ev): void { + ev.stopPropagation(); const stateObj = this.hass!.states[this._config!.entity] as SelectEntity; const option = ev.target.value; From 9983129e2611a70572cfc6b498f7bb652a20d84f Mon Sep 17 00:00:00 2001 From: Volodymyr Honchar Date: Sun, 4 May 2025 04:51:01 -0700 Subject: [PATCH 034/247] Add a feature to display any attribute of an entity in the Gauge Card (#25258) * Add a feature to display any attribute of an entity in the Gauge Card * Extract list of non numeric attributes into a constant and reuse it in number card as well as in numeric condition --- src/data/entity_attributes.ts | 67 ++++++++++++++++++ .../ha-automation-condition-numeric_state.ts | 68 +------------------ src/panels/lovelace/cards/hui-gauge-card.ts | 14 ++-- src/panels/lovelace/cards/types.ts | 1 + .../config-elements/hui-gauge-card-editor.ts | 22 +++++- src/translations/en.json | 1 + 6 files changed, 101 insertions(+), 72 deletions(-) diff --git a/src/data/entity_attributes.ts b/src/data/entity_attributes.ts index e72bf4cd58..a694d1f12f 100644 --- a/src/data/entity_attributes.ts +++ b/src/data/entity_attributes.ts @@ -107,3 +107,70 @@ export const DOMAIN_ATTRIBUTES_FORMATERS: Record< }, }, }; + +export const NON_NUMERIC_ATTRIBUTES = [ + "access_token", + "auto_update", + "available_modes", + "away_mode", + "changed_by", + "code_format", + "color_modes", + "current_activity", + "device_class", + "editable", + "effect_list", + "effect", + "entity_picture", + "event_type", + "event_types", + "fan_mode", + "fan_modes", + "fan_speed_list", + "forecast", + "friendly_name", + "frontend_stream_type", + "has_date", + "has_time", + "hs_color", + "hvac_mode", + "hvac_modes", + "icon", + "media_album_name", + "media_artist", + "media_content_type", + "media_position_updated_at", + "media_title", + "next_dawn", + "next_dusk", + "next_midnight", + "next_noon", + "next_rising", + "next_setting", + "operation_list", + "operation_mode", + "options", + "preset_mode", + "preset_modes", + "release_notes", + "release_summary", + "release_url", + "restored", + "rgb_color", + "rgbw_color", + "shuffle", + "sound_mode_list", + "sound_mode", + "source_list", + "source_type", + "source", + "state_class", + "supported_features", + "swing_mode", + "swing_mode", + "swing_modes", + "title", + "token", + "unit_of_measurement", + "xy_color", +]; diff --git a/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts b/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts index 04e2de7cd2..335e92799d 100644 --- a/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts +++ b/src/panels/config/automation/condition/types/ha-automation-condition-numeric_state.ts @@ -18,6 +18,7 @@ import "../../../../../components/ha-form/ha-form"; import type { SchemaUnion } from "../../../../../components/ha-form/types"; import type { NumericStateCondition } from "../../../../../data/automation"; import type { HomeAssistant } from "../../../../../types"; +import { NON_NUMERIC_ATTRIBUTES } from "../../../../../data/entity_attributes"; const numericStateConditionStruct = object({ alias: optional(string()), @@ -85,72 +86,7 @@ export default class HaNumericStateCondition extends LitElement { name: "attribute", selector: { attribute: { - hide_attributes: [ - "access_token", - "auto_update", - "available_modes", - "away_mode", - "changed_by", - "code_format", - "color_modes", - "current_activity", - "device_class", - "editable", - "effect_list", - "effect", - "entity_picture", - "event_type", - "event_types", - "fan_mode", - "fan_modes", - "fan_speed_list", - "forecast", - "friendly_name", - "frontend_stream_type", - "has_date", - "has_time", - "hs_color", - "hvac_mode", - "hvac_modes", - "icon", - "media_album_name", - "media_artist", - "media_content_type", - "media_position_updated_at", - "media_title", - "next_dawn", - "next_dusk", - "next_midnight", - "next_noon", - "next_rising", - "next_setting", - "operation_list", - "operation_mode", - "options", - "preset_mode", - "preset_modes", - "release_notes", - "release_summary", - "release_url", - "restored", - "rgb_color", - "rgbw_color", - "shuffle", - "sound_mode_list", - "sound_mode", - "source_list", - "source_type", - "source", - "state_class", - "supported_features", - "swing_mode", - "swing_mode", - "swing_modes", - "title", - "token", - "unit_of_measurement", - "xy_color", - ], + hide_attributes: NON_NUMERIC_ATTRIBUTES, }, }, context: { diff --git a/src/panels/lovelace/cards/hui-gauge-card.ts b/src/panels/lovelace/cards/hui-gauge-card.ts index 62f7e16d2c..10ee4bdc97 100644 --- a/src/panels/lovelace/cards/hui-gauge-card.ts +++ b/src/panels/lovelace/cards/hui-gauge-card.ts @@ -109,12 +109,18 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { `; } - if (isNaN(entityState)) { + const valueToDisplay = this._config.attribute + ? stateObj.attributes[this._config.attribute] + : stateObj.state; + + if (isNaN(valueToDisplay)) { return html` ${this.hass.localize( - "ui.panel.lovelace.warning.entity_non_numeric", - { entity: this._config.entity } + this._config.attribute + ? "ui.panel.lovelace.warning.attribute_not_numeric" + : "ui.panel.lovelace.warning.entity_non_numeric", + { entity: this._config.entity, attribute: this._config.attribute } )} `; @@ -141,7 +147,7 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { + (showSeverity: boolean, entityId?: string) => [ { name: "entity", @@ -86,6 +88,15 @@ export class HuiGaugeCardEditor }, }, }, + { + name: "attribute", + selector: { + attribute: { + entity_id: entityId, + hide_attributes: NON_NUMERIC_ATTRIBUTES, + }, + }, + }, { name: "", type: "grid", @@ -182,7 +193,10 @@ export class HuiGaugeCardEditor return nothing; } - const schema = this._schema(this._config!.severity !== undefined); + const schema = this._schema( + this._config!.severity !== undefined, + this._config!.entity + ); const data = { show_severity: this._config!.severity !== undefined, ...this._config, @@ -275,6 +289,10 @@ export class HuiGaugeCardEditor )} (${this.hass!.localize( "ui.panel.lovelace.editor.card.config.optional" )})`; + case "attribute": + return this.hass!.localize( + "ui.panel.lovelace.editor.card.generic.attribute" + ); default: // "green" | "yellow" | "red" return this.hass!.localize( diff --git a/src/translations/en.json b/src/translations/en.json index af02f16e77..8b79462fee 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -7828,6 +7828,7 @@ }, "warning": { "attribute_not_found": "Attribute {attribute} not available in: {entity}", + "attribute_not_numeric": "Attribute {attribute} is non-numeric", "entity_not_found": "Entity not available: {entity}", "entity_non_numeric": "Entity is non-numeric: {entity}", "entity_unavailable": "Entity is currently unavailable: {entity}", From 08f30b714bb319bf634f48799df2cf9ba9ec9f3f Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Sun, 4 May 2025 04:58:41 -0700 Subject: [PATCH 035/247] Keyboard accessible panel sorting (#25288) --- src/components/ha-sidebar.ts | 71 +++++++++++++++++++++++--- src/resources/ha-sidebar-edit-style.ts | 2 +- src/translations/en.json | 4 +- 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index b59b15405e..e3f139b62b 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -52,6 +52,7 @@ import "./user/ha-user-badge"; import "./ha-md-list"; import "./ha-md-list-item"; import type { HaMdListItem } from "./ha-md-list-item"; +import { showPromptDialog } from "../dialogs/generic/show-dialog-box"; const SHOW_AFTER_SPACER = ["config", "developer-tools"]; @@ -424,8 +425,12 @@ class HaSidebar extends SubscribeMixin(LitElement) { `; } - private _renderPanels(panels: PanelInfo[], selectedPanel: string) { - return panels.map((panel) => + private _renderPanels( + panels: PanelInfo[], + selectedPanel: string, + orderable = false + ) { + return panels.map((panel, idx) => this._renderPanel( panel.url_path, panel.url_path === this.hass.defaultPanel @@ -437,7 +442,8 @@ class HaSidebar extends SubscribeMixin(LitElement) { : panel.url_path in PANEL_ICONS ? PANEL_ICONS[panel.url_path] : undefined, - selectedPanel + selectedPanel, + orderable ? idx : null ) ); } @@ -447,7 +453,8 @@ class HaSidebar extends SubscribeMixin(LitElement) { title: string | null, icon: string | null | undefined, iconPath: string | null | undefined, - selectedPanel: string + selectedPanel: string, + index: number | null ) { return urlPath === "config" ? this._renderConfiguration(title, selectedPanel) @@ -463,8 +470,20 @@ class HaSidebar extends SubscribeMixin(LitElement) { ? html`` : html``} ${title} - ${this.editMode + ${index != null ? html` +
    ${index + 1}
    +
    ` + : nothing} + ${this.editMode + ? html`
    ${this._renderPanels(beforeSpacer, selectedPanel)}
    + >
    ${this._renderPanels(beforeSpacer, selectedPanel, true)}
    ${this._renderSpacer()}${this._renderHiddenPanels()} `; @@ -690,6 +712,28 @@ class HaSidebar extends SubscribeMixin(LitElement) { fireEvent(this, "hass-edit-sidebar", { editMode: false }); } + private async _changePosition(ev): Promise { + ev.preventDefault(); + const oldIndex = (ev.currentTarget as any).index as number; + const name = ((ev.currentTarget as any).title as string) || ""; + + const positionString = await showPromptDialog(this, { + title: this.hass!.localize("ui.sidebar.change_position"), + text: this.hass!.localize("ui.sidebar.change_position_dialog_text", { + name, + }), + inputType: "number", + inputMin: "1", + placeholder: String(oldIndex + 1), + }); + + if (!positionString) return; + const position = parseInt(positionString); + if (isNaN(position)) return; + const newIndex = Math.max(0, position - 1); + this._panelMove(oldIndex, newIndex); + } + private async _hidePanel(ev: Event) { ev.preventDefault(); const panel = (ev.currentTarget as any).panel; @@ -940,7 +984,7 @@ class HaSidebar extends SubscribeMixin(LitElement) { ha-md-list-item .item-text { display: none; - max-width: calc(100% - 56px); + max-width: 100%; font-weight: 500; font-size: 14px; } @@ -971,6 +1015,19 @@ class HaSidebar extends SubscribeMixin(LitElement) { color: var(--text-accent-color, var(--text-primary-color)); } + .position-badge { + display: block; + width: 24px; + line-height: 24px; + box-sizing: border-box; + border-radius: 50%; + font-weight: 500; + text-align: center; + font-size: 14px; + background-color: var(--app-header-edit-background-color, #455a64); + color: var(--app-header-edit-text-color, white); + } + ha-svg-icon + .badge { position: absolute; top: 4px; diff --git a/src/resources/ha-sidebar-edit-style.ts b/src/resources/ha-sidebar-edit-style.ts index efd4ddee10..10dc29f913 100644 --- a/src/resources/ha-sidebar-edit-style.ts +++ b/src/resources/ha-sidebar-edit-style.ts @@ -58,7 +58,7 @@ export const sidebarEditStyle = css` } :host([expanded]) .hide-panel { - display: block; + display: inline-block; } :host([expanded]) .show-panel { diff --git a/src/translations/en.json b/src/translations/en.json index 8b79462fee..519b6a2968 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2016,7 +2016,9 @@ "sidebar_toggle": "Sidebar toggle", "done": "Done", "hide_panel": "Hide panel", - "show_panel": "Show panel" + "show_panel": "Show panel", + "change_position": "Change panel position", + "change_position_dialog_text": "What position do you want to move your ''{name}'' panel to?" }, "panel": { "my": { From 75608db9b8a79007b7b88d79ccb18198c7d2fcce Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 5 May 2025 01:33:52 -0400 Subject: [PATCH 036/247] Add profile security link to My Home Assistant (#25303) --- src/panels/my/ha-panel-my.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index cd78c52e55..c308cc32e4 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -255,6 +255,9 @@ export const getMyRedirects = (): Redirects => ({ profile: { redirect: "/profile", }, + profile_security: { + redirect: "/profile/security", + }, logbook: { component: "logbook", redirect: "/logbook", From a19e7002ea854609e0b5830d75d4844eaed35f24 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Mon, 5 May 2025 09:40:54 +0200 Subject: [PATCH 037/247] Fix flow-form header (#25305) --- src/dialogs/config-flow/step-flow-form.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/dialogs/config-flow/step-flow-form.ts b/src/dialogs/config-flow/step-flow-form.ts index 90b301b98a..0c6da5eda2 100644 --- a/src/dialogs/config-flow/step-flow-form.ts +++ b/src/dialogs/config-flow/step-flow-form.ts @@ -278,10 +278,6 @@ class StepFlowForm extends LitElement { } h2 { word-break: break-word; - padding-right: 72px; - padding-inline-end: 72px; - padding-inline-start: initial; - direction: var(--direction); } `, ]; From 3c9dce20e2679bb14d9dd6caecc38e47ab919209 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Mon, 5 May 2025 10:01:35 +0200 Subject: [PATCH 038/247] Use md-select for entity-row and state-card (#25307) --- .../hui-input-select-entity-row.ts | 20 +++++++------- src/state-summary/state-card-input_select.ts | 21 +++++++-------- src/state-summary/state-card-select.ts | 27 +++++++++---------- 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts index 99fa0a443d..d5bf01ae11 100644 --- a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts @@ -3,8 +3,8 @@ import { css, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; import { stopPropagation } from "../../../common/dom/stop_propagation"; import { computeStateName } from "../../../common/entity/compute_state_name"; -import "../../../components/ha-list-item"; -import "../../../components/ha-select"; +import "../../../components/ha-md-select"; +import "../../../components/ha-md-select-option"; import { UNAVAILABLE } from "../../../data/entity"; import { forwardHaptic } from "../../../data/haptics"; import type { InputSelectEntity } from "../../../data/input_select"; @@ -57,25 +57,26 @@ class HuiInputSelectEntityRow extends LitElement implements LovelaceRow { .config=${this._config} hide-name > - ${stateObj.attributes.options ? stateObj.attributes.options.map( (option) => - html`${option}` + html` +
    ${option}
    +
    ` ) - : ""} -
    + : nothing} + `; } @@ -85,9 +86,8 @@ class HuiInputSelectEntityRow extends LitElement implements LovelaceRow { display: flex; align-items: center; } - ha-select { + ha-md-select { width: 100%; - --ha-select-min-width: 0; } `; diff --git a/src/state-summary/state-card-input_select.ts b/src/state-summary/state-card-input_select.ts index d08fdccc1f..9f6cbbd112 100644 --- a/src/state-summary/state-card-input_select.ts +++ b/src/state-summary/state-card-input_select.ts @@ -1,11 +1,10 @@ import type { TemplateResult } from "lit"; import { css, html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; -import { stopPropagation } from "../common/dom/stop_propagation"; import { computeStateName } from "../common/entity/compute_state_name"; import "../components/entity/state-badge"; -import "../components/ha-list-item"; -import "../components/ha-select"; +import "../components/ha-md-select"; +import "../components/ha-md-select-option"; import { UNAVAILABLE } from "../data/entity"; import type { InputSelectEntity } from "../data/input_select"; import { setInputSelectOption } from "../data/input_select"; @@ -20,23 +19,21 @@ class StateCardInputSelect extends LitElement { protected render(): TemplateResult { return html` - ${this.stateObj.attributes.options.map( (option) => - html`${option}` + html` +
    ${option}
    +
    ` )} -
    + `; } @@ -58,7 +55,7 @@ class StateCardInputSelect extends LitElement { margin-top: 10px; } - ha-select { + ha-md-select { width: 100%; } `; diff --git a/src/state-summary/state-card-select.ts b/src/state-summary/state-card-select.ts index 9027a17100..372cfb8c5d 100644 --- a/src/state-summary/state-card-select.ts +++ b/src/state-summary/state-card-select.ts @@ -1,11 +1,10 @@ import type { TemplateResult } from "lit"; import { css, html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; -import { stopPropagation } from "../common/dom/stop_propagation"; import { computeStateName } from "../common/entity/compute_state_name"; import "../components/entity/state-badge"; -import "../components/ha-list-item"; -import "../components/ha-select"; +import "../components/ha-md-select"; +import "../components/ha-md-select-option"; import { UNAVAILABLE } from "../data/entity"; import type { SelectEntity } from "../data/select"; import { setSelectOption } from "../data/select"; @@ -20,24 +19,22 @@ class StateCardSelect extends LitElement { protected render(): TemplateResult { return html` - ${this.stateObj.attributes.options.map( (option) => html` - - ${this.hass.formatEntityState(this.stateObj, option)} - + +
    + ${this.hass.formatEntityState(this.stateObj, option)} +
    +
    ` )} -
    + `; } @@ -59,7 +56,7 @@ class StateCardSelect extends LitElement { margin-top: 10px; } - ha-select { + ha-md-select { width: 100%; } `; From 83819a9be0bdb48205bb162d5e23490f443a941e Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Mon, 5 May 2025 10:57:50 +0200 Subject: [PATCH 039/247] Revert "Use md-select for entity-row and state-card" (#25308) Revert "Use md-select for entity-row and state-card (#25307)" This reverts commit 3c9dce20e2679bb14d9dd6caecc38e47ab919209. --- .../hui-input-select-entity-row.ts | 20 +++++++------- src/state-summary/state-card-input_select.ts | 21 ++++++++------- src/state-summary/state-card-select.ts | 27 ++++++++++--------- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts index d5bf01ae11..99fa0a443d 100644 --- a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts @@ -3,8 +3,8 @@ import { css, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; import { stopPropagation } from "../../../common/dom/stop_propagation"; import { computeStateName } from "../../../common/entity/compute_state_name"; -import "../../../components/ha-md-select"; -import "../../../components/ha-md-select-option"; +import "../../../components/ha-list-item"; +import "../../../components/ha-select"; import { UNAVAILABLE } from "../../../data/entity"; import { forwardHaptic } from "../../../data/haptics"; import type { InputSelectEntity } from "../../../data/input_select"; @@ -57,26 +57,25 @@ class HuiInputSelectEntityRow extends LitElement implements LovelaceRow { .config=${this._config} hide-name > - ${stateObj.attributes.options ? stateObj.attributes.options.map( (option) => - html` -
    ${option}
    -
    ` + html`${option}` ) - : nothing} -
    + : ""} + `; } @@ -86,8 +85,9 @@ class HuiInputSelectEntityRow extends LitElement implements LovelaceRow { display: flex; align-items: center; } - ha-md-select { + ha-select { width: 100%; + --ha-select-min-width: 0; } `; diff --git a/src/state-summary/state-card-input_select.ts b/src/state-summary/state-card-input_select.ts index 9f6cbbd112..d08fdccc1f 100644 --- a/src/state-summary/state-card-input_select.ts +++ b/src/state-summary/state-card-input_select.ts @@ -1,10 +1,11 @@ import type { TemplateResult } from "lit"; import { css, html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; +import { stopPropagation } from "../common/dom/stop_propagation"; import { computeStateName } from "../common/entity/compute_state_name"; import "../components/entity/state-badge"; -import "../components/ha-md-select"; -import "../components/ha-md-select-option"; +import "../components/ha-list-item"; +import "../components/ha-select"; import { UNAVAILABLE } from "../data/entity"; import type { InputSelectEntity } from "../data/input_select"; import { setInputSelectOption } from "../data/input_select"; @@ -19,21 +20,23 @@ class StateCardInputSelect extends LitElement { protected render(): TemplateResult { return html` - ${this.stateObj.attributes.options.map( (option) => - html` -
    ${option}
    -
    ` + html`${option}` )} -
    + `; } @@ -55,7 +58,7 @@ class StateCardInputSelect extends LitElement { margin-top: 10px; } - ha-md-select { + ha-select { width: 100%; } `; diff --git a/src/state-summary/state-card-select.ts b/src/state-summary/state-card-select.ts index 372cfb8c5d..9027a17100 100644 --- a/src/state-summary/state-card-select.ts +++ b/src/state-summary/state-card-select.ts @@ -1,10 +1,11 @@ import type { TemplateResult } from "lit"; import { css, html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; +import { stopPropagation } from "../common/dom/stop_propagation"; import { computeStateName } from "../common/entity/compute_state_name"; import "../components/entity/state-badge"; -import "../components/ha-md-select"; -import "../components/ha-md-select-option"; +import "../components/ha-list-item"; +import "../components/ha-select"; import { UNAVAILABLE } from "../data/entity"; import type { SelectEntity } from "../data/select"; import { setSelectOption } from "../data/select"; @@ -19,22 +20,24 @@ class StateCardSelect extends LitElement { protected render(): TemplateResult { return html` - ${this.stateObj.attributes.options.map( (option) => html` - -
    - ${this.hass.formatEntityState(this.stateObj, option)} -
    -
    + + ${this.hass.formatEntityState(this.stateObj, option)} + ` )} -
    + `; } @@ -56,7 +59,7 @@ class StateCardSelect extends LitElement { margin-top: 10px; } - ha-md-select { + ha-select { width: 100%; } `; From 44f5f7bdb52f1823fb18c920e834976003feb619 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Mon, 5 May 2025 11:12:43 +0200 Subject: [PATCH 040/247] Use new entity picker style in quick bar (#25265) * Use new entity picker style in quick bar * Cleanup * Add missing no area * Process code review --- src/dialogs/quick-bar/ha-quick-bar.ts | 162 ++++++++++++++++++++------ 1 file changed, 124 insertions(+), 38 deletions(-) diff --git a/src/dialogs/quick-bar/ha-quick-bar.ts b/src/dialogs/quick-bar/ha-quick-bar.ts index 828397f353..cf57a14e31 100644 --- a/src/dialogs/quick-bar/ha-quick-bar.ts +++ b/src/dialogs/quick-bar/ha-quick-bar.ts @@ -15,24 +15,26 @@ import { customElement, property, query, state } from "lit/decorators"; import { ifDefined } from "lit/directives/if-defined"; import { styleMap } from "lit/directives/style-map"; import memoizeOne from "memoize-one"; +import Fuse from "fuse.js"; import { canShowPage } from "../../common/config/can_show_page"; import { componentsWithService } from "../../common/config/components_with_service"; import { isComponentLoaded } from "../../common/config/is_component_loaded"; import { fireEvent } from "../../common/dom/fire_event"; -import { computeDeviceNameDisplay } from "../../common/entity/compute_device_name"; -import { computeStateName } from "../../common/entity/compute_state_name"; +import { + computeDeviceName, + computeDeviceNameDisplay, +} from "../../common/entity/compute_device_name"; import { navigate } from "../../common/navigate"; import { caseInsensitiveStringCompare } from "../../common/string/compare"; import type { ScorableTextItem } from "../../common/string/filter/sequence-matching"; -import { fuzzyFilterSort } from "../../common/string/filter/sequence-matching"; import { debounce } from "../../common/util/debounce"; import "../../components/ha-icon-button"; import "../../components/ha-label"; import "../../components/ha-list"; -import "../../components/ha-list-item"; import "../../components/ha-spinner"; import "../../components/ha-textfield"; import "../../components/ha-tip"; +import "../../components/ha-md-list-item"; import { fetchHassioAddonsInfo } from "../../data/hassio/addon"; import { domainToName } from "../../data/integration"; import { getPanelNameTranslationKey } from "../../data/panel"; @@ -44,6 +46,13 @@ import type { HomeAssistant } from "../../types"; import { showConfirmationDialog } from "../generic/show-dialog-box"; import { showShortcutsDialog } from "../shortcuts/show-shortcuts-dialog"; import { QuickBarMode, type QuickBarParams } from "./show-dialog-quick-bar"; +import { getEntityContext } from "../../common/entity/context/get_entity_context"; +import { computeEntityName } from "../../common/entity/compute_entity_name"; +import { computeAreaName } from "../../common/entity/compute_area_name"; +import { computeRTL } from "../../common/util/compute_rtl"; +import { computeDomain } from "../../common/entity/compute_domain"; +import { computeStateName } from "../../common/entity/compute_state_name"; +import { HaFuse } from "../../resources/fuse"; interface QuickBarItem extends ScorableTextItem { primaryText: string; @@ -59,6 +68,9 @@ interface CommandItem extends QuickBarItem { interface EntityItem extends QuickBarItem { altText: string; icon?: TemplateResult; + translatedDomain: string; + entityId: string; + friendlyName: string; } interface DeviceItem extends QuickBarItem { @@ -82,6 +94,23 @@ type BaseNavigationCommand = Pick< QuickBarNavigationItem, "primaryText" | "path" >; + +const DOMAIN_STYLE = styleMap({ + fontSize: "var(--ha-font-size-s)", + fontWeight: "var(--ha-font-weight-normal)", + lineHeight: "var(--ha-line-height-normal)", + alignSelf: "flex-end", + maxWidth: "30%", + textOverflow: "ellipsis", + overflow: "hidden", + whiteSpace: "nowrap", +}); + +const ENTITY_ID_STYLE = styleMap({ + fontFamily: "var(--ha-font-family-code)", + fontSize: "var(--ha-font-size-xs)", +}); + @customElement("ha-quick-bar") export class QuickBar extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -139,6 +168,11 @@ export class QuickBar extends LitElement { } } + protected firstUpdated(changedProps) { + super.firstUpdated(changedProps); + this.hass.loadBackendTranslation("title"); + } + private _getItems = memoizeOne( ( mode: QuickBarMode, @@ -323,61 +357,65 @@ export class QuickBar extends LitElement { private _renderDeviceItem(item: DeviceItem, index?: number) { return html` - - ${item.primaryText} + ${item.primaryText} ${item.area - ? html` - ${item.area} - ` + ? html` ${item.area} ` : nothing} - + `; } private _renderEntityItem(item: EntityItem, index?: number) { + const showEntityId = this.hass.userData?.showEntityIdPicker; + return html` - ${item.iconPath ? html` ` - : html`${item.icon}`} - ${item.primaryText} + : html`${item.icon}`} + ${item.primaryText} ${item.altText - ? html` - ${item.altText} - ` + ? html` ${item.altText} ` : nothing} - + ${item.entityId && showEntityId + ? html`${item.entityId}` + : nothing} + ${item.translatedDomain && !showEntityId + ? html`
    + ${item.translatedDomain} +
    ` + : nothing} + `; } private _renderCommandItem(item: CommandItem, index?: number) { return html` - ${item.iconPath ? html` - + ` : nothing} ${item.categoryText} @@ -394,7 +435,7 @@ export class QuickBar extends LitElement { ${item.primaryText} - + `; } @@ -421,7 +462,7 @@ export class QuickBar extends LitElement { } private _getItemAtIndex(index: number): ListItem | null { - return this.renderRoot.querySelector(`ha-list-item[index="${index}"]`); + return this.renderRoot.querySelector(`ha-md-list-item[index="${index}"]`); } private _addSpinnerToCommandItem(index: number): void { @@ -519,7 +560,7 @@ export class QuickBar extends LitElement { } private _handleItemClick(ev) { - const listItem = ev.target.closest("ha-list-item"); + const listItem = ev.target.closest("ha-md-list-item"); this._processItemAndCloseDialog( listItem.item, Number(listItem.getAttribute("index")) @@ -555,18 +596,43 @@ export class QuickBar extends LitElement { } private _generateEntityItems(): EntityItem[] { + const isRTL = computeRTL(this.hass); + return Object.keys(this.hass.states) .map((entityId) => { - const entityState = this.hass.states[entityId]; + const stateObj = this.hass.states[entityId]; + + const { area, device } = getEntityContext(stateObj, this.hass); + + const friendlyName = computeStateName(stateObj); // Keep this for search + const entityName = computeEntityName(stateObj, this.hass); + const deviceName = device ? computeDeviceName(device) : undefined; + const areaName = area ? computeAreaName(area) : undefined; + + const primary = entityName || deviceName || entityId; + const secondary = [areaName, entityName ? deviceName : undefined] + .filter(Boolean) + .join(isRTL ? " ◂ " : " ▸ "); + + const translatedDomain = domainToName( + this.hass.localize, + computeDomain(entityId) + ); + const entityItem = { - primaryText: computeStateName(entityState), - altText: entityId, + primaryText: primary, + altText: + secondary || + this.hass.localize("ui.components.device-picker.no_area"), icon: html` `, + translatedDomain: translatedDomain, + entityId: entityId, + friendlyName: friendlyName, action: () => fireEvent(this, "hass-more-info", { entityId }), }; @@ -846,9 +912,30 @@ export class QuickBar extends LitElement { }); } + private _fuseIndex = memoizeOne((items: QuickBarItem[]) => + Fuse.createIndex( + [ + "primaryText", + "altText", + "friendlyName", + "translatedDomain", + "entityId", // for technical search + ], + items + ) + ); + private _filterItems = memoizeOne( - (items: QuickBarItem[], filter: string): QuickBarItem[] => - fuzzyFilterSort(filter.trimLeft(), items) + (items: QuickBarItem[], filter: string): QuickBarItem[] => { + const index = this._fuseIndex(items); + const fuse = new HaFuse(items, {}, index); + + const results = fuse.multiTermsSearch(filter.trim()); + if (!results || !results.length) { + return items; + } + return results.map((result) => result.item); + } ); static get styles() { @@ -930,9 +1017,8 @@ export class QuickBar extends LitElement { direction: var(--direction); } - ha-list-item { + ha-md-list-item { width: 100%; - --mdc-list-item-graphic-margin: 20px; } ha-tip { From 8f422357f108d5821c460f2268c3f042a20ba4f7 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Mon, 5 May 2025 11:13:50 +0200 Subject: [PATCH 041/247] Fix select entity change (#25310) --- src/panels/lovelace/components/hui-generic-entity-row.ts | 1 + src/panels/lovelace/entity-rows/hui-select-entity-row.ts | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/panels/lovelace/components/hui-generic-entity-row.ts b/src/panels/lovelace/components/hui-generic-entity-row.ts index 1ae552452f..26c51b773b 100644 --- a/src/panels/lovelace/components/hui-generic-entity-row.ts +++ b/src/panels/lovelace/components/hui-generic-entity-row.ts @@ -163,6 +163,7 @@ export class HuiGenericEntityRow extends LitElement { @touchend=${stopPropagation} @keydown=${stopPropagation} @click=${stopPropagation} + @action=${stopPropagation} >`}
`; diff --git a/src/panels/lovelace/entity-rows/hui-select-entity-row.ts b/src/panels/lovelace/entity-rows/hui-select-entity-row.ts index 17c6dbf2d9..fa7fb03ca2 100644 --- a/src/panels/lovelace/entity-rows/hui-select-entity-row.ts +++ b/src/panels/lovelace/entity-rows/hui-select-entity-row.ts @@ -93,7 +93,6 @@ class HuiSelectEntityRow extends LitElement implements LovelaceRow { `; private _handleAction(ev): void { - ev.stopPropagation(); const stateObj = this.hass!.states[this._config!.entity] as SelectEntity; const option = ev.target.value; From 22ddcca954d076a7697f74a081758cb64da9e07b Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 5 May 2025 11:42:21 +0200 Subject: [PATCH 042/247] Fix pasting yaml in automation code editor (#25309) Fix pasting yaml in code editor --- src/common/dom/can-override-input.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/common/dom/can-override-input.ts b/src/common/dom/can-override-input.ts index d0896ba0a6..06aa28a8b0 100644 --- a/src/common/dom/can-override-input.ts +++ b/src/common/dom/can-override-input.ts @@ -1,5 +1,11 @@ export const canOverrideAlphanumericInput = (composedPath: EventTarget[]) => { - if (composedPath.some((el) => "tagName" in el && el.tagName === "HA-MENU")) { + if ( + composedPath.some( + (el) => + "tagName" in el && + (el.tagName === "HA-MENU" || el.tagName === "HA-CODE-EDITOR") + ) + ) { return false; } From 9d74cd7561c264b4afde5da0d9e5bd3cd2a74a08 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Mon, 5 May 2025 13:11:42 +0200 Subject: [PATCH 043/247] Fix selected entity overflow (#25311) --- src/panels/lovelace/editor/hui-entities-card-row-editor.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/panels/lovelace/editor/hui-entities-card-row-editor.ts b/src/panels/lovelace/editor/hui-entities-card-row-editor.ts index 06d9ab0f35..ab574af88d 100644 --- a/src/panels/lovelace/editor/hui-entities-card-row-editor.ts +++ b/src/panels/lovelace/editor/hui-entities-card-row-editor.ts @@ -210,6 +210,7 @@ export class HuiEntitiesCardRowEditor extends LitElement { .entity ha-entity-picker { flex-grow: 1; + min-width: 0; } .special-row { From 9155c855093143ff8f087e9db7f75a37976ee8c4 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Mon, 5 May 2025 15:05:35 +0200 Subject: [PATCH 044/247] Fix zwave add device LR/mesh icons (#25313) Fix zwave LR/mesh icons --- .../images/z-wave-add-node/long-range.svg | 10 +++---- public/static/images/z-wave-add-node/mesh.svg | 30 +++++++++---------- .../images/z-wave-add-node/mesh_dark.svg | 29 +++++++++--------- 3 files changed, 34 insertions(+), 35 deletions(-) diff --git a/public/static/images/z-wave-add-node/long-range.svg b/public/static/images/z-wave-add-node/long-range.svg index 48deddc513..32fa115cc8 100644 --- a/public/static/images/z-wave-add-node/long-range.svg +++ b/public/static/images/z-wave-add-node/long-range.svg @@ -1,13 +1,13 @@ - + - + - - + + - + diff --git a/public/static/images/z-wave-add-node/mesh.svg b/public/static/images/z-wave-add-node/mesh.svg index 92a03c444a..48fba567f4 100644 --- a/public/static/images/z-wave-add-node/mesh.svg +++ b/public/static/images/z-wave-add-node/mesh.svg @@ -1,19 +1,19 @@ - - - - - - - - + + + + + + + + - - + + - - - - - + + + + + diff --git a/public/static/images/z-wave-add-node/mesh_dark.svg b/public/static/images/z-wave-add-node/mesh_dark.svg index 1824489e47..22cda5e4f1 100644 --- a/public/static/images/z-wave-add-node/mesh_dark.svg +++ b/public/static/images/z-wave-add-node/mesh_dark.svg @@ -1,19 +1,18 @@ - - - - - - - - + + + + + + + - - + + - - - - - + + + + + From fb3a59272ddd550f34b22081c4051f5e1bba12f0 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 5 May 2025 12:54:33 -0400 Subject: [PATCH 045/247] Reorder my links (#25319) --- src/panels/my/ha-panel-my.ts | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/panels/my/ha-panel-my.ts b/src/panels/my/ha-panel-my.ts index c308cc32e4..d41ef36863 100644 --- a/src/panels/my/ha-panel-my.ts +++ b/src/panels/my/ha-panel-my.ts @@ -16,6 +16,11 @@ import "../../layouts/hass-error-screen"; import type { HomeAssistant, Route } from "../../types"; import { documentationUrl } from "../../util/documentation-url"; +// When a user presses "m", the user is redirected to the first redirect +// for which holds true currentPath.startsWith(redirect.redirect) +// That's why redirects should be sorted with more specific ones first +// Or else pressing "M" will link to the higher level page. + export const getMyRedirects = (): Redirects => ({ application_credentials: { redirect: "/config/application_credentials", @@ -73,15 +78,15 @@ export const getMyRedirects = (): Redirects => ({ brand: "string", }, }, - integrations: { - redirect: "/config/integrations", - }, integration: { redirect: "/config/integrations/integration", params: { domain: "string", }, }, + integrations: { + redirect: "/config/integrations", + }, config_mqtt: { component: "mqtt", redirect: "/config/mqtt", @@ -106,10 +111,6 @@ export const getMyRedirects = (): Redirects => ({ component: "matter", redirect: "/config/matter/add", }, - config_bluetooth: { - component: "bluetooth", - redirect: "/config/bluetooth", - }, bluetooth_advertisement_monitor: { component: "bluetooth", redirect: "/config/bluetooth/advertisement-monitor", @@ -118,6 +119,10 @@ export const getMyRedirects = (): Redirects => ({ component: "bluetooth", redirect: "/config/bluetooth/connection-monitor", }, + config_bluetooth: { + component: "bluetooth", + redirect: "/config/bluetooth", + }, config_dhcp: { component: "dhcp", redirect: "/config/dhcp", @@ -252,12 +257,12 @@ export const getMyRedirects = (): Redirects => ({ // customize was removed in 2021.12, fallback to dashboard redirect: "/config/dashboard", }, - profile: { - redirect: "/profile", - }, profile_security: { redirect: "/profile/security", }, + profile: { + redirect: "/profile", + }, logbook: { component: "logbook", redirect: "/logbook", @@ -270,10 +275,6 @@ export const getMyRedirects = (): Redirects => ({ component: "media_source", redirect: "/media-browser", }, - backup: { - component: "backup", - redirect: "/config/backup", - }, backup_list: { component: "backup", redirect: "/config/backup/backups", @@ -282,6 +283,10 @@ export const getMyRedirects = (): Redirects => ({ component: "backup", redirect: "/config/backup/settings", }, + backup: { + component: "backup", + redirect: "/config/backup", + }, supervisor_snapshots: { component: "backup", redirect: "/config/backup", From 4ec5fbc9a4620aa61a45689602b4d146e38a04cd Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 5 May 2025 18:56:16 +0200 Subject: [PATCH 046/247] Do not display no areas in entity pickers (#25317) --- src/components/entity/ha-entity-combo-box.ts | 4 +--- src/components/entity/ha-entity-picker.ts | 5 +---- src/dialogs/quick-bar/ha-quick-bar.ts | 23 +++++++++++++++++--- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/components/entity/ha-entity-combo-box.ts b/src/components/entity/ha-entity-combo-box.ts index 9a89fe23d3..f0f3ede62b 100644 --- a/src/components/entity/ha-entity-combo-box.ts +++ b/src/components/entity/ha-entity-combo-box.ts @@ -314,9 +314,7 @@ export class HaEntityComboBox extends LitElement { ...hass!.states[entityId], label: "", primary: primary, - secondary: - secondary || - this.hass.localize("ui.components.device-picker.no_area"), + secondary: secondary, translated_domain: translatedDomain, sorting_label: [deviceName, entityName].filter(Boolean).join("-"), entity_name: entityName || deviceName, diff --git a/src/components/entity/ha-entity-picker.ts b/src/components/entity/ha-entity-picker.ts index 0cba69c515..515a5a58b4 100644 --- a/src/components/entity/ha-entity-picker.ts +++ b/src/components/entity/ha-entity-picker.ts @@ -162,10 +162,7 @@ export class HaEntityPicker extends LitElement { slot="start" > ${primary} - - ${secondary || - this.hass.localize("ui.components.device-picker.no_area")} - + ${secondary} ${showClearIcon ? html` Date: Mon, 5 May 2025 17:06:05 +0000 Subject: [PATCH 047/247] Update dependency @codemirror/view to v6.36.7 (#25320) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index fe500893b7..b6cd23a971 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@codemirror/legacy-modes": "6.5.1", "@codemirror/search": "6.5.10", "@codemirror/state": "6.5.2", - "@codemirror/view": "6.36.6", + "@codemirror/view": "6.36.7", "@egjs/hammerjs": "2.0.17", "@formatjs/intl-datetimeformat": "6.18.0", "@formatjs/intl-displaynames": "6.8.11", diff --git a/yarn.lock b/yarn.lock index 40ba4f821a..5331f5b96d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1242,14 +1242,14 @@ __metadata: languageName: node linkType: hard -"@codemirror/view@npm:6.36.6, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0": - version: 6.36.6 - resolution: "@codemirror/view@npm:6.36.6" +"@codemirror/view@npm:6.36.7, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0": + version: 6.36.7 + resolution: "@codemirror/view@npm:6.36.7" dependencies: "@codemirror/state": "npm:^6.5.0" style-mod: "npm:^4.1.0" w3c-keyname: "npm:^2.2.4" - checksum: 10/a98d19fe8a76557ac442cd173bac83e0a471a00db98c4a8da35c7e80e78a23f4460e57eb46a66cc60f58ae854e5e35f1f0b9c8a3919cd8ef765f37a912c2b093 + checksum: 10/0ba49a3025fbb381a8a35022135ea40363a3a3c298d41e3083bb5e263dfa4f11ff9419a46f2b78ef8e853376384ad6c7e48d2a7887e10d366e878d10b53e3b54 languageName: node linkType: hard @@ -9225,7 +9225,7 @@ __metadata: "@codemirror/legacy-modes": "npm:6.5.1" "@codemirror/search": "npm:6.5.10" "@codemirror/state": "npm:6.5.2" - "@codemirror/view": "npm:6.36.6" + "@codemirror/view": "npm:6.36.7" "@egjs/hammerjs": "npm:2.0.17" "@formatjs/intl-datetimeformat": "npm:6.18.0" "@formatjs/intl-displaynames": "npm:6.8.11" From e069875432119e6aa0c2a70d8d23f17b297a7525 Mon Sep 17 00:00:00 2001 From: karwosts <32912880+karwosts@users.noreply.github.com> Date: Mon, 5 May 2025 10:09:16 -0700 Subject: [PATCH 048/247] Add energy hourly calculations to CSV report (#25315) --- src/panels/energy/ha-panel-energy.ts | 120 +++++++++++++++++++++++++-- 1 file changed, 113 insertions(+), 7 deletions(-) diff --git a/src/panels/energy/ha-panel-energy.ts b/src/panels/energy/ha-panel-energy.ts index 7bf69dbc23..cb63510b66 100644 --- a/src/panels/energy/ha-panel-energy.ts +++ b/src/panels/energy/ha-panel-energy.ts @@ -22,11 +22,14 @@ import type { DeviceConsumptionEnergyPreference, } from "../../data/energy"; import { + computeConsumptionData, getEnergyDataCollection, getEnergyGasUnit, getEnergyWaterUnit, + getSummedData, } from "../../data/energy"; import { fileDownload } from "../../util/file_download"; +import type { StatisticValue } from "../../data/recorder"; const ENERGY_LOVELACE_CONFIG: LovelaceConfig = { views: [ @@ -177,18 +180,20 @@ class PanelEnergy extends LitElement { const csv: string[] = []; csv[0] = headers; - const processStat = function (stat: string, type: string, unit: string) { + const processCsvRow = function ( + id: string, + type: string, + unit: string, + data: StatisticValue[] + ) { let n = 0; const row: string[] = []; - if (!stats[stat]) { - return; - } - row.push(stat); + row.push(id); row.push(type); row.push(unit.normalize("NFKD")); times.forEach((t) => { - if (n < stats[stat].length && stats[stat][n].start === t) { - row.push((stats[stat][n].change ?? "").toString()); + if (n < data.length && data[n].start === t) { + row.push((data[n].change ?? "").toString()); n++; } else { row.push(""); @@ -197,6 +202,14 @@ class PanelEnergy extends LitElement { csv.push(row.join(",") + "\n"); }; + const processStat = function (stat: string, type: string, unit: string) { + if (!stats[stat]) { + return; + } + + processCsvRow(stat, type, unit, stats[stat]); + }; + const currency = this.hass.config.currency; const printCategory = function ( @@ -335,6 +348,99 @@ class PanelEnergy extends LitElement { printCategory("device_consumption", devices, electricUnit); + const { summedData, compareSummedData: _ } = getSummedData( + energyData.state + ); + const { consumption, compareConsumption: __ } = computeConsumptionData( + summedData, + undefined + ); + + const processConsumptionData = function ( + type: string, + unit: string, + data: Record + ) { + const data2: StatisticValue[] = []; + + Object.entries(data).forEach(([t, value]) => { + data2.push({ + start: Number(t), + end: NaN, + change: value, + }); + }); + + processCsvRow("", type, unit, data2); + }; + + const hasSolar = !!solar_productions.length; + const hasBattery = !!battery_ins.length; + const hasGridReturn = !!grid_productions.length; + const hasGridSource = !!grid_consumptions.length; + + if (hasGridSource) { + processConsumptionData( + "calculated_consumed_grid", + electricUnit, + consumption.used_grid + ); + if (hasBattery) { + processConsumptionData( + "calculated_grid_to_battery", + electricUnit, + consumption.grid_to_battery + ); + } + } + if (hasGridReturn && hasBattery) { + processConsumptionData( + "calculated_battery_to_grid", + electricUnit, + consumption.battery_to_grid + ); + } + if (hasBattery) { + processConsumptionData( + "calculated_consumed_battery", + electricUnit, + consumption.used_battery + ); + } + + if (hasSolar) { + processConsumptionData( + "calculated_consumed_solar", + electricUnit, + consumption.used_solar + ); + if (hasBattery) { + processConsumptionData( + "calculated_solar_to_battery", + electricUnit, + consumption.solar_to_battery + ); + } + if (hasGridReturn) { + processConsumptionData( + "calculated_solar_to_grid", + electricUnit, + consumption.solar_to_grid + ); + } + } + + if ( + (hasGridSource ? 1 : 0) + (hasSolar ? 1 : 0) + (hasBattery ? 1 : 0) > + 1 + ) { + processConsumptionData( + "calculated_total_consumption", + electricUnit, + consumption.used_total + ); + } + const blob = new Blob(csv, { type: "text/csv", }); From d63f610023ee9d64d21ef1e7c862e5f35cc43247 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Mon, 5 May 2025 19:20:22 +0200 Subject: [PATCH 049/247] Fix options and repair flow success (#25312) --- .../config-flow/step-flow-create-entry.ts | 129 +++++++++--------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/src/dialogs/config-flow/step-flow-create-entry.ts b/src/dialogs/config-flow/step-flow-create-entry.ts index da5ab1d183..6f59bf593d 100644 --- a/src/dialogs/config-flow/step-flow-create-entry.ts +++ b/src/dialogs/config-flow/step-flow-create-entry.ts @@ -129,70 +129,73 @@ class StepFlowCreateEntry extends LitElement { )}` : nothing} - ${devices.length === 0 - ? html`

- ${localize( - "ui.panel.config.integrations.config_flow.created_config", - { name: this.step.title } - )} -

` - : html` -
- ${devices.map( - (device) => html` -
-
- ${this.step.result?.domain - ? html`${domainToName(` - : nothing} -
- ${device.model || device.manufacturer} - ${device.model - ? html` - ${device.manufacturer} - ` - : nothing} -
-
- - -
- ` + ${devices.length === 0 && + ["options_flow", "repair_flow"].includes(this.flowConfig.flowType) + ? nothing + : devices.length === 0 + ? html`

+ ${localize( + "ui.panel.config.integrations.config_flow.created_config", + { name: this.step.title } )} -

- `} +

` + : html` +
+ ${devices.map( + (device) => html` +
+
+ ${this.step.result?.domain + ? html`${domainToName(` + : nothing} +
+ ${device.model || device.manufacturer} + ${device.model + ? html` + ${device.manufacturer} + ` + : nothing} +
+
+ + +
+ ` + )} +
+ `}
Date: Mon, 5 May 2025 13:29:24 -0400 Subject: [PATCH 050/247] Clean up network browser nav (#25321) * Clean up network browser nav * Add ha-md-list --- .../config/network/ha-config-network-dhcp.ts | 66 ----------------- .../config/network/ha-config-network-ssdp.ts | 66 ----------------- .../network/ha-config-network-zeroconf.ts | 70 ------------------- .../network/ha-config-section-network.ts | 62 ++++++++++------ src/translations/en.json | 11 ++- 5 files changed, 47 insertions(+), 228 deletions(-) delete mode 100644 src/panels/config/network/ha-config-network-dhcp.ts delete mode 100644 src/panels/config/network/ha-config-network-ssdp.ts delete mode 100644 src/panels/config/network/ha-config-network-zeroconf.ts diff --git a/src/panels/config/network/ha-config-network-dhcp.ts b/src/panels/config/network/ha-config-network-dhcp.ts deleted file mode 100644 index ef70d11903..0000000000 --- a/src/panels/config/network/ha-config-network-dhcp.ts +++ /dev/null @@ -1,66 +0,0 @@ -import "@material/mwc-button/mwc-button"; -import type { CSSResultGroup } from "lit"; -import { css, html, LitElement } from "lit"; -import { customElement, property } from "lit/decorators"; -import "../../../components/ha-button"; -import "../../../components/ha-card"; -import { haStyle } from "../../../resources/styles"; -import type { HomeAssistant } from "../../../types"; - -@customElement("ha-config-network-dhcp") -class ConfigNetworkDHCP extends LitElement { - @property({ attribute: false }) public hass!: HomeAssistant; - - protected render() { - return html` - -
-

- ${this.hass.localize("ui.panel.config.network.discovery.dhcp_info")} -

-
-
- - `; - } - - static get styles(): CSSResultGroup { - return [ - haStyle, - css` - ha-settings-row { - padding: 0; - } - - .card-actions { - display: flex; - flex-direction: row-reverse; - justify-content: space-between; - align-items: center; - } - `, // row-reverse so we tab first to "save" - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "ha-config-network-dhcp": ConfigNetworkDHCP; - } -} diff --git a/src/panels/config/network/ha-config-network-ssdp.ts b/src/panels/config/network/ha-config-network-ssdp.ts deleted file mode 100644 index bd7bf83568..0000000000 --- a/src/panels/config/network/ha-config-network-ssdp.ts +++ /dev/null @@ -1,66 +0,0 @@ -import "@material/mwc-button/mwc-button"; -import type { CSSResultGroup } from "lit"; -import { css, html, LitElement } from "lit"; -import { customElement, property } from "lit/decorators"; -import "../../../components/ha-button"; -import "../../../components/ha-card"; -import { haStyle } from "../../../resources/styles"; -import type { HomeAssistant } from "../../../types"; - -@customElement("ha-config-network-ssdp") -class ConfigNetworkSSDP extends LitElement { - @property({ attribute: false }) public hass!: HomeAssistant; - - protected render() { - return html` - -
-

- ${this.hass.localize("ui.panel.config.network.discovery.ssdp_info")} -

-
- -
- `; - } - - static get styles(): CSSResultGroup { - return [ - haStyle, - css` - ha-settings-row { - padding: 0; - } - - .card-actions { - display: flex; - flex-direction: row-reverse; - justify-content: space-between; - align-items: center; - } - `, // row-reverse so we tab first to "save" - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "ha-config-network-ssdp": ConfigNetworkSSDP; - } -} diff --git a/src/panels/config/network/ha-config-network-zeroconf.ts b/src/panels/config/network/ha-config-network-zeroconf.ts deleted file mode 100644 index db97f0d019..0000000000 --- a/src/panels/config/network/ha-config-network-zeroconf.ts +++ /dev/null @@ -1,70 +0,0 @@ -import "@material/mwc-button/mwc-button"; -import type { CSSResultGroup } from "lit"; -import { css, html, LitElement } from "lit"; -import { customElement, property } from "lit/decorators"; -import "../../../components/ha-button"; -import "../../../components/ha-card"; -import { haStyle } from "../../../resources/styles"; -import type { HomeAssistant } from "../../../types"; - -@customElement("ha-config-network-zeroconf") -class ConfigNetworkZeroconf extends LitElement { - @property({ attribute: false }) public hass!: HomeAssistant; - - protected render() { - return html` - -
-

- ${this.hass.localize( - "ui.panel.config.network.discovery.zeroconf_info" - )} -

-
- -
- `; - } - - static get styles(): CSSResultGroup { - return [ - haStyle, - css` - ha-settings-row { - padding: 0; - } - - .card-actions { - display: flex; - flex-direction: row-reverse; - justify-content: space-between; - align-items: center; - } - `, // row-reverse so we tab first to "save" - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - "ha-config-network-zeroconf": ConfigNetworkZeroconf; - } -} diff --git a/src/panels/config/network/ha-config-section-network.ts b/src/panels/config/network/ha-config-section-network.ts index c9a3df311d..567c18eb0f 100644 --- a/src/panels/config/network/ha-config-section-network.ts +++ b/src/panels/config/network/ha-config-section-network.ts @@ -3,15 +3,18 @@ import { css, html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import "../../../layouts/hass-subpage"; +import "../../../components/ha-card"; +import "../../../components/ha-md-list"; +import "../../../components/ha-md-list-item"; +import "../../../components/ha-icon-next"; import type { HomeAssistant, Route } from "../../../types"; import "./ha-config-network"; -import "./ha-config-network-dhcp"; -import "./ha-config-network-ssdp"; -import "./ha-config-network-zeroconf"; import "./ha-config-url-form"; import "./supervisor-hostname"; import "./supervisor-network"; +const NETWORK_BROWSERS = ["dhcp", "ssdp", "zeroconf"] as const; + @customElement("ha-config-section-network") class HaConfigSectionNetwork extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -38,20 +41,38 @@ class HaConfigSectionNetwork extends LitElement { : ""} - ${isComponentLoaded(this.hass, "dhcp") - ? html`` - : ""} - ${isComponentLoaded(this.hass, "ssdp") - ? html`` - : ""} - ${isComponentLoaded(this.hass, "zeroconf") - ? html`` + ${NETWORK_BROWSERS.some((component) => + isComponentLoaded(this.hass, component) + ) + ? html` + + + ${NETWORK_BROWSERS.map( + (domain) => html` + +
+ ${this.hass.localize( + `ui.panel.config.network.discovery.${domain}` + )} +
+
+ ${this.hass.localize( + `ui.panel.config.network.discovery.${domain}_info` + )} +
+ +
+ ` + )} +
+
+ ` : ""}
@@ -68,14 +89,15 @@ class HaConfigSectionNetwork extends LitElement { supervisor-network, ha-config-url-form, ha-config-network, - ha-config-network-dhcp, - ha-config-network-ssdp, - ha-config-network-zeroconf { + .discovery-card { display: block; margin: 0 auto; margin-bottom: 24px; max-width: 600px; } + .discovery-card ha-md-list { + padding-top: 0; + } `; } diff --git a/src/translations/en.json b/src/translations/en.json index 519b6a2968..374d86b6a9 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -6401,15 +6401,14 @@ } }, "discovery": { + "title": "Network discovery", + "description": "Explore what data Home Assistant can see on the network.", "dhcp": "DHCP browser", - "dhcp_info": "The DHCP browser shows devices detected by Home Assistant using methods like DHCP, ARP+PTR lookups, and router-based device trackers. DHCP (Dynamic Host Configuration Protocol) data is received when devices join the network and request an IP address, allowing Home Assistant to discover them automatically. All devices found through these methods will appear here.", - "dhcp_browser": "View DHCP browser", + "dhcp_info": "Show devices detected by Home Assistant using methods like DHCP, ARP+PTR lookups, and router-based device trackers. DHCP (Dynamic Host Configuration Protocol) data is received when devices join the network and request an IP address.", "ssdp": "SSDP browser", - "ssdp_info": "The SSDP browser shows devices discovered by Home Assistant using SSDP/UPnP. Devices that Home Assistant has discovered will appear here.", - "ssdp_browser": "View SSDP browser", + "ssdp_info": "Show devices discovered by Home Assistant using SSDP/UPnP. Devices that Home Assistant has discovered will appear here.", "zeroconf": "Zeroconf browser", - "zeroconf_info": "The Zeroconf browser shows devices discovered by Home Assistant using mDNS. Only devices that Home Assistant is actively searching for will appear here.", - "zeroconf_browser": "View Zeroconf browser" + "zeroconf_info": "Show devices discovered by Home Assistant using mDNS. Only devices that Home Assistant is actively searching for will appear here." }, "network_adapter": "Network adapter", "network_adapter_info": "Configure which network adapters integrations will use. Currently this setting only affects multicast traffic. A restart is required for these settings to apply.", From 7434b12d9f40546cc8fffd660a2cb78be8d8ffca Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Mon, 5 May 2025 19:37:47 +0200 Subject: [PATCH 051/247] Use new entity naming in card entity picker (#25316) --- .../badge-editor/hui-dialog-create-badge.ts | 19 -- .../card-editor/hui-dialog-create-card.ts | 19 -- .../card-editor/hui-entity-picker-table.ts | 255 +++++++++++++----- .../unused-entities/hui-unused-entities.ts | 25 +- 4 files changed, 195 insertions(+), 123 deletions(-) diff --git a/src/panels/lovelace/editor/badge-editor/hui-dialog-create-badge.ts b/src/panels/lovelace/editor/badge-editor/hui-dialog-create-badge.ts index d14959e4fb..9388295802 100644 --- a/src/panels/lovelace/editor/badge-editor/hui-dialog-create-badge.ts +++ b/src/panels/lovelace/editor/badge-editor/hui-dialog-create-badge.ts @@ -4,11 +4,7 @@ import { css, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; import { cache } from "lit/directives/cache"; import { classMap } from "lit/directives/class-map"; -import memoize from "memoize-one"; import { fireEvent } from "../../../../common/dom/fire_event"; -import { computeDomain } from "../../../../common/entity/compute_domain"; -import { computeStateName } from "../../../../common/entity/compute_state_name"; -import type { DataTableRowData } from "../../../../components/data-table/ha-data-table"; import "../../../../components/ha-dialog"; import "../../../../components/ha-dialog-header"; import "../../../../components/sl-tab-group"; @@ -137,7 +133,6 @@ export class HuiCreateDialogBadge no-label-float .hass=${this.hass} .narrow=${true} - .entities=${this._allEntities(this.hass.states)} @selected-changed=${this._handleSelectedChanged} > ` @@ -276,20 +271,6 @@ export class HuiCreateDialogBadge this.closeDialog(); } - - private _allEntities = memoize((entities) => - Object.keys(entities).map((entity) => { - const stateObj = this.hass.states[entity]; - return { - icon: "", - entity_id: entity, - stateObj, - name: computeStateName(stateObj), - domain: computeDomain(entity), - last_changed: stateObj!.last_changed, - } as DataTableRowData; - }) - ); } declare global { diff --git a/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts b/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts index 314029fa0d..46927da9c8 100644 --- a/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts +++ b/src/panels/lovelace/editor/card-editor/hui-dialog-create-card.ts @@ -5,11 +5,7 @@ import { customElement, property, state } from "lit/decorators"; import { cache } from "lit/directives/cache"; import { classMap } from "lit/directives/class-map"; import { ifDefined } from "lit/directives/if-defined"; -import memoize from "memoize-one"; import { fireEvent } from "../../../../common/dom/fire_event"; -import { computeDomain } from "../../../../common/entity/compute_domain"; -import { computeStateName } from "../../../../common/entity/compute_state_name"; -import type { DataTableRowData } from "../../../../components/data-table/ha-data-table"; import "../../../../components/ha-dialog"; import "../../../../components/ha-dialog-header"; import "../../../../components/sl-tab-group"; @@ -157,7 +153,6 @@ export class HuiCreateDialogCard no-label-float .hass=${this.hass} narrow - .entities=${this._allEntities(this.hass.states)} @selected-changed=${this._handleSelectedChanged} > ` @@ -340,20 +335,6 @@ export class HuiCreateDialogCard this.closeDialog(); } - - private _allEntities = memoize((entities) => - Object.keys(entities).map((entity) => { - const stateObj = this.hass.states[entity]; - return { - icon: "", - entity_id: entity, - stateObj, - name: computeStateName(stateObj), - domain: computeDomain(entity), - last_changed: stateObj!.last_changed, - } as DataTableRowData; - }) - ); } declare global { diff --git a/src/panels/lovelace/editor/card-editor/hui-entity-picker-table.ts b/src/panels/lovelace/editor/card-editor/hui-entity-picker-table.ts index 5918aafef6..dd0c3a549c 100644 --- a/src/panels/lovelace/editor/card-editor/hui-entity-picker-table.ts +++ b/src/panels/lovelace/editor/card-editor/hui-entity-picker-table.ts @@ -1,9 +1,17 @@ -import type { TemplateResult } from "lit"; -import { css, html, LitElement } from "lit"; +import type { PropertyValues, TemplateResult } from "lit"; +import { css, html, LitElement, nothing } from "lit"; import { customElement, property } from "lit/decorators"; +import { styleMap } from "lit/directives/style-map"; import memoizeOne from "memoize-one"; import type { HASSDomEvent } from "../../../../common/dom/fire_event"; import { fireEvent } from "../../../../common/dom/fire_event"; +import { computeAreaName } from "../../../../common/entity/compute_area_name"; +import { computeDeviceName } from "../../../../common/entity/compute_device_name"; +import { computeDomain } from "../../../../common/entity/compute_domain"; +import { computeEntityName } from "../../../../common/entity/compute_entity_name"; +import { getEntityContext } from "../../../../common/entity/context/get_entity_context"; +import type { LocalizeFunc } from "../../../../common/translations/localize"; +import { computeRTL } from "../../../../common/util/compute_rtl"; import "../../../../components/data-table/ha-data-table"; import type { DataTableColumnContainer, @@ -12,8 +20,26 @@ import type { } from "../../../../components/data-table/ha-data-table"; import "../../../../components/entity/state-badge"; import "../../../../components/ha-relative-time"; +import { domainToName } from "../../../../data/integration"; import type { HomeAssistant } from "../../../../types"; +const ENTITY_ID_STYLE = styleMap({ + fontFamily: "var(--ha-font-family-code)", + fontSize: "var(--ha-font-size-xs)", +}); + +interface EntityPickerTableRowData extends DataTableRowData { + icon: string; + entity_id: string; + stateObj: any; + name: string; + entity_name?: string; + device_name?: string; + area_name?: string; + domain_name: string; + last_changed: string; +} + @customElement("hui-entity-picker-table") export class HuiEntityPickerTable extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -23,16 +49,69 @@ export class HuiEntityPickerTable extends LitElement { @property({ type: Boolean, attribute: "no-label-float" }) public noLabelFloat? = false; - @property({ type: Array }) public entities!: DataTableRowData[]; + @property({ type: Array }) public entities?: string[]; + + protected firstUpdated(_changedProperties: PropertyValues): void { + super.firstUpdated(_changedProperties); + this.hass.loadBackendTranslation("title"); + } + + private _data = memoizeOne( + ( + states: HomeAssistant["states"], + localize: LocalizeFunc, + entities?: string[] + ): EntityPickerTableRowData[] => + (entities || Object.keys(states)).map( + (entity) => { + const stateObj = this.hass.states[entity]; + + const { area, device } = getEntityContext(stateObj, this.hass); + + const entityName = computeEntityName(stateObj, this.hass); + const deviceName = device ? computeDeviceName(device) : undefined; + const areaName = area ? computeAreaName(area) : undefined; + const name = [deviceName, entityName].filter(Boolean).join(" "); + const domain = computeDomain(entity); + + return { + icon: "", + entity_id: entity, + stateObj, + name: name, + entity_name: entityName, + device_name: deviceName, + area_name: areaName, + domain_name: domainToName(localize, domain), + last_changed: stateObj!.last_changed, + } satisfies EntityPickerTableRowData; + } + ) + ); protected render(): TemplateResult { + const data = this._data( + this.hass.states, + this.hass.localize, + this.entities + ); + + const showEntityId = Boolean(this.hass.userData?.showEntityIdPicker); + + const columns = this._columns( + this.narrow, + computeRTL(this.hass), + showEntityId + ); + return html` { - const columns: DataTableColumnContainer = { - icon: { - title: "", - label: this.hass!.localize( - "ui.panel.lovelace.unused_entities.state_icon" + private _columns = memoizeOne( + (narrow: boolean, isRTL: boolean, showEntityId: boolean) => { + const columns: DataTableColumnContainer = { + icon: { + title: "", + label: this.hass!.localize( + "ui.panel.lovelace.unused_entities.state_icon" + ), + type: "icon", + template: (entity) => html` + + `, + }, + name: { + title: this.hass!.localize( + "ui.panel.lovelace.unused_entities.entity" + ), + sortable: true, + filterable: true, + flex: 2, + main: true, + direction: "asc", + template: (entity: any) => { + const primary = + entity.entity_name || entity.device_name || entity.entity_id; + const secondary = [ + entity.area_name, + entity.entity_name ? entity.device_name : undefined, + ] + .filter(Boolean) + .join(isRTL ? " ◂ " : " ▸ "); + return html` +
+ ${primary} + ${secondary + ? html`
${secondary}
` + : nothing} + ${narrow && showEntityId + ? html` +
+ ${entity.entity_id} +
+ ` + : nothing} +
+ `; + }, + }, + }; + + columns.entity_name = { + title: "entity_name", + filterable: true, + hidden: true, + }; + + columns.device_name = { + title: "device_name", + filterable: true, + hidden: true, + }; + + columns.area_name = { + title: "area_name", + filterable: true, + hidden: true, + }; + + columns.entity_id = { + title: this.hass!.localize( + "ui.panel.lovelace.unused_entities.entity_id" ), - type: "icon", - template: (entity) => html` - - `, - }, - name: { - title: this.hass!.localize("ui.panel.lovelace.unused_entities.entity"), sortable: true, filterable: true, - flex: 2, - main: true, - direction: "asc", - template: (entity: any) => html` -
- ${entity.name} - ${narrow - ? html`
${entity.entity_id}
` - : ""} -
+ hidden: narrow || !showEntityId, + }; + + columns.domain_name = { + title: this.hass!.localize("ui.panel.lovelace.unused_entities.domain"), + sortable: true, + filterable: true, + hidden: narrow || showEntityId, + }; + + columns.last_changed = { + title: this.hass!.localize( + "ui.panel.lovelace.unused_entities.last_changed" + ), + type: "numeric", + sortable: true, + hidden: narrow, + template: (entity) => html` + `, - }, - }; + }; - columns.entity_id = { - title: this.hass!.localize("ui.panel.lovelace.unused_entities.entity_id"), - sortable: true, - filterable: true, - hidden: narrow, - }; - - columns.domain = { - title: this.hass!.localize("ui.panel.lovelace.unused_entities.domain"), - sortable: true, - filterable: true, - hidden: narrow, - }; - - columns.last_changed = { - title: this.hass!.localize( - "ui.panel.lovelace.unused_entities.last_changed" - ), - type: "numeric", - sortable: true, - hidden: narrow, - template: (entity) => html` - - `, - }; - - return columns; - }); + return columns; + } + ); private _handleSelectionChanged( ev: HASSDomEvent @@ -134,6 +254,9 @@ export class HuiEntityPickerTable extends LitElement { --data-table-border-width: 0; height: 100%; } + ha-data-table.show-entity-id { + --data-table-row-height: 64px; + } `; } diff --git a/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts b/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts index a63d3e3a50..392f439f73 100644 --- a/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts +++ b/src/panels/lovelace/editor/unused-entities/hui-unused-entities.ts @@ -3,22 +3,19 @@ import type { PropertyValues } from "lit"; import { css, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; -import { computeDomain } from "../../../../common/entity/compute_domain"; -import { computeStateName } from "../../../../common/entity/compute_state_name"; -import type { DataTableRowData } from "../../../../components/data-table/ha-data-table"; import "../../../../components/ha-fab"; import "../../../../components/ha-svg-icon"; +import type { LovelaceConfig } from "../../../../data/lovelace/config/types"; import type { HomeAssistant } from "../../../../types"; import { computeUnusedEntities } from "../../common/compute-unused-entities"; -import type { Lovelace } from "../../types"; -import "../card-editor/hui-entity-picker-table"; -import { showSuggestCardDialog } from "../card-editor/show-suggest-card-dialog"; -import { showSelectViewDialog } from "../select-view/show-select-view-dialog"; -import type { LovelaceConfig } from "../../../../data/lovelace/config/types"; import { computeCards, computeSection, } from "../../common/generate-lovelace-config"; +import type { Lovelace } from "../../types"; +import "../card-editor/hui-entity-picker-table"; +import { showSuggestCardDialog } from "../card-editor/show-suggest-card-dialog"; +import { showSelectViewDialog } from "../select-view/show-select-view-dialog"; @customElement("hui-unused-entities") export class HuiUnusedEntities extends LitElement { @@ -80,17 +77,7 @@ export class HuiUnusedEntities extends LitElement { { - const stateObj = this.hass!.states[entity]; - return { - icon: "", - entity_id: entity, - stateObj, - name: stateObj ? computeStateName(stateObj) : "Unavailable", - domain: computeDomain(entity), - last_changed: stateObj?.last_changed, - }; - }) as DataTableRowData[]} + .entities=${this._unusedEntities} @selected-changed=${this._handleSelectedChanged} > From c7882f392681fddf86da8dc4ba638cea3e5ab055 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 5 May 2025 13:48:29 -0400 Subject: [PATCH 052/247] Populate integration domain My link (#25322) * Populate integration domain My link * break out of loop * Actually just return from function * Consolidate code --- src/state/quick-bar-mixin.ts | 60 +++++++++++++++++------------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/src/state/quick-bar-mixin.ts b/src/state/quick-bar-mixin.ts index 6e931a9bd7..f0effc7f03 100644 --- a/src/state/quick-bar-mixin.ts +++ b/src/state/quick-bar-mixin.ts @@ -16,6 +16,7 @@ import { extractSearchParamsObject } from "../common/url/search-params"; import { showVoiceCommandDialog } from "../dialogs/voice-command-dialog/show-ha-voice-command-dialog"; import { canOverrideAlphanumericInput } from "../common/dom/can-override-input"; import { showShortcutsDialog } from "../dialogs/shortcuts/show-shortcuts-dialog"; +import type { Redirects } from "../panels/my/ha-panel-my"; declare global { interface HASSDomEvents { @@ -143,49 +144,44 @@ export default >(superClass: T) => e.preventDefault(); const targetPath = mainWindow.location.pathname; - const isHassio = isComponentLoaded(this.hass, "hassio"); const myParams = new URLSearchParams(); - if (isHassio && targetPath.startsWith("/hassio")) { + let redirects: Redirects; + + if (targetPath.startsWith("/hassio")) { const myPanelSupervisor = await import( "../../hassio/src/hassio-my-redirect" ); - for (const [slug, redirect] of Object.entries( - myPanelSupervisor.REDIRECTS - )) { - if (targetPath.startsWith(redirect.redirect)) { - myParams.append("redirect", slug); - if (redirect.redirect === "/hassio/addon") { - myParams.append("addon", targetPath.split("/")[3]); - } - window.open( - `https://my.home-assistant.io/create-link/?${myParams.toString()}`, - "_blank" - ); - return; - } - } + redirects = myPanelSupervisor.REDIRECTS; + } else { + const myPanel = await import("../panels/my/ha-panel-my"); + redirects = myPanel.getMyRedirects(); } - const myPanel = await import("../panels/my/ha-panel-my"); + for (const [slug, redirect] of Object.entries(redirects)) { + if (!targetPath.startsWith(redirect.redirect)) { + continue; + } + myParams.append("redirect", slug); - for (const [slug, redirect] of Object.entries(myPanel.getMyRedirects())) { - if (targetPath.startsWith(redirect.redirect)) { - myParams.append("redirect", slug); - if (redirect.params) { - const params = extractSearchParamsObject(); - for (const key of Object.keys(redirect.params)) { - if (key in params) { - myParams.append(key, params[key]); - } + if (redirect.params) { + const params = extractSearchParamsObject(); + for (const key of Object.keys(redirect.params)) { + if (key in params) { + myParams.append(key, params[key]); } } - window.open( - `https://my.home-assistant.io/create-link/?${myParams.toString()}`, - "_blank" - ); - return; } + if (redirect.redirect === "/config/integrations/integration") { + myParams.append("domain", targetPath.split("/")[4]); + } else if (redirect.redirect === "/hassio/addon") { + myParams.append("addon", targetPath.split("/")[3]); + } + window.open( + `https://my.home-assistant.io/create-link/?${myParams.toString()}`, + "_blank" + ); + return; } showToast(this, { message: this.hass.localize( From 83289bdd41d8cee70fdba97d81065555d345e9d9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 09:43:21 +0200 Subject: [PATCH 053/247] Update dependency eslint to v9.26.0 (#25327) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 340 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 311 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index b6cd23a971..eb286c2e34 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ "babel-plugin-template-html-minifier": "4.1.0", "browserslist-useragent-regexp": "4.1.3", "del": "8.0.0", - "eslint": "9.25.1", + "eslint": "9.26.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-prettier": "10.1.2", "eslint-import-resolver-webpack": "0.13.10", diff --git a/yarn.lock b/yarn.lock index 5331f5b96d..eaa5ac2a2e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1559,10 +1559,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.25.1": - version: 9.25.1 - resolution: "@eslint/js@npm:9.25.1" - checksum: 10/ad5812889598de32d674ef60c0e61468ac5c7f3b6ecf98b0e29d1e88d7af8ba3aab255b8c0a46bbaf654047bbd2ee5aa033db9b53e330f97615093fcccde4cbb +"@eslint/js@npm:9.26.0": + version: 9.26.0 + resolution: "@eslint/js@npm:9.26.0" + checksum: 10/863d35df8f6675250bb5a917037e0f6833965437eba4c4649633fd0b55a93e8d727bcd36e9b5cc82047898ee9348cb40363e196f333914ae3a6bb36159495212 languageName: node linkType: hard @@ -3168,6 +3168,24 @@ __metadata: languageName: node linkType: hard +"@modelcontextprotocol/sdk@npm:^1.8.0": + version: 1.11.0 + resolution: "@modelcontextprotocol/sdk@npm:1.11.0" + dependencies: + content-type: "npm:^1.0.5" + cors: "npm:^2.8.5" + cross-spawn: "npm:^7.0.3" + eventsource: "npm:^3.0.2" + express: "npm:^5.0.1" + express-rate-limit: "npm:^7.5.0" + pkce-challenge: "npm:^5.0.0" + raw-body: "npm:^3.0.0" + zod: "npm:^3.23.8" + zod-to-json-schema: "npm:^3.24.1" + checksum: 10/527413fd2b18f75e031cda7f73a662098f3c5f1224b9c6b0b903d5a1f79e23e23a4f4b8e6971bac7eb46a74ed65ae05e8e548f7b7a3f7f6d179c3f6d10825fbc + languageName: node + linkType: hard + "@module-federation/error-codes@npm:0.13.0": version: 0.13.0 resolution: "@module-federation/error-codes@npm:0.13.0" @@ -5418,6 +5436,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: "npm:^3.0.0" + negotiator: "npm:^1.0.0" + checksum: 10/ea1343992b40b2bfb3a3113fa9c3c2f918ba0f9197ae565c48d3f84d44b174f6b1d5cd9989decd7655963eb03a272abc36968cc439c2907f999bd5ef8653d5a7 + languageName: node + linkType: hard + "accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -6083,6 +6111,23 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "body-parser@npm:2.2.0" + dependencies: + bytes: "npm:^3.1.2" + content-type: "npm:^1.0.5" + debug: "npm:^4.4.0" + http-errors: "npm:^2.0.0" + iconv-lite: "npm:^0.6.3" + on-finished: "npm:^2.4.1" + qs: "npm:^6.14.0" + raw-body: "npm:^3.0.0" + type-is: "npm:^2.0.0" + checksum: 10/e9d844b036bd15970df00a16f373c7ed28e1ef870974a0a1d4d6ef60d70e01087cc20a0dbb2081c49a88e3c08ce1d87caf1e2898c615dffa193f63e8faa8a84e + languageName: node + linkType: hard + "bonjour-service@npm:^1.2.1": version: 1.3.0 resolution: "bonjour-service@npm:1.3.0" @@ -6771,7 +6816,16 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": +"content-disposition@npm:^1.0.0": + version: 1.0.0 + resolution: "content-disposition@npm:1.0.0" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10/0dcc1a2d7874526b0072df3011b134857b49d97a3bc135bb464a299525d4972de6f5f464fd64da6c4d8406d26a1ffb976f62afaffef7723b1021a44498d10e08 + languageName: node + linkType: hard + +"content-type@npm:^1.0.5, content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 10/585847d98dc7fb8035c02ae2cb76c7a9bd7b25f84c447e5ed55c45c2175e83617c8813871b4ee22f368126af6b2b167df655829007b21aa10302873ea9c62662 @@ -6792,6 +6846,13 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:^1.2.1": + version: 1.2.2 + resolution: "cookie-signature@npm:1.2.2" + checksum: 10/be44a3c9a56f3771aea3a8bd8ad8f0a8e2679bcb967478267f41a510b4eb5ec55085386ba79c706c4ac21605ca76f4251973444b90283e0eb3eeafe8a92c7708 + languageName: node + linkType: hard + "cookie@npm:0.7.1": version: 0.7.1 resolution: "cookie@npm:0.7.1" @@ -6799,7 +6860,7 @@ __metadata: languageName: node linkType: hard -"cookie@npm:~0.7.2": +"cookie@npm:^0.7.1, cookie@npm:~0.7.2": version: 0.7.2 resolution: "cookie@npm:0.7.2" checksum: 10/24b286c556420d4ba4e9bc09120c9d3db7d28ace2bd0f8ccee82422ce42322f73c8312441271e5eefafbead725980e5996cc02766dbb89a90ac7f5636ede608f @@ -6839,7 +6900,7 @@ __metadata: languageName: node linkType: hard -"cors@npm:2.8.5, cors@npm:~2.8.5": +"cors@npm:2.8.5, cors@npm:^2.8.5, cors@npm:~2.8.5": version: 2.8.5 resolution: "cors@npm:2.8.5" dependencies: @@ -6987,7 +7048,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0": version: 4.4.0 resolution: "debug@npm:4.4.0" dependencies: @@ -7168,7 +7229,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"depd@npm:2.0.0, depd@npm:^2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 10/c0c8ff36079ce5ada64f46cc9d6fd47ebcf38241105b6e0c98f412e8ad91f084bcf906ff644cc3a4bd876ca27a62accb8b0fff72ea6ed1a414b89d8506f4a5ca @@ -7437,6 +7498,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:^2.0.0, encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10/abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -7444,13 +7512,6 @@ __metadata: languageName: node linkType: hard -"encodeurl@npm:~2.0.0": - version: 2.0.0 - resolution: "encodeurl@npm:2.0.0" - checksum: 10/abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe - languageName: node - linkType: hard - "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -7781,7 +7842,7 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:~1.0.3": +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 10/6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 @@ -8003,9 +8064,9 @@ __metadata: languageName: node linkType: hard -"eslint@npm:9.25.1": - version: 9.25.1 - resolution: "eslint@npm:9.25.1" +"eslint@npm:9.26.0": + version: 9.26.0 + resolution: "eslint@npm:9.26.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.12.1" @@ -8013,11 +8074,12 @@ __metadata: "@eslint/config-helpers": "npm:^0.2.1" "@eslint/core": "npm:^0.13.0" "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.25.1" + "@eslint/js": "npm:9.26.0" "@eslint/plugin-kit": "npm:^0.2.8" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.4.2" + "@modelcontextprotocol/sdk": "npm:^1.8.0" "@types/estree": "npm:^1.0.6" "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" @@ -8042,6 +8104,7 @@ __metadata: minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" + zod: "npm:^3.24.2" peerDependencies: jiti: "*" peerDependenciesMeta: @@ -8049,7 +8112,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10/037bbdc5cba6f72199976dcdce115b1b479b9425ee1116c08bcaf25e0de4a74a0ffe696d48610ade79c91b04ef3e707a7215a42dfba9c7d3a0b85747d5902e67 + checksum: 10/b87092cb7e87f1d0963475c1a1e15e551842ea122925cf13231e742fae565bf3582029a5b0b4aecf793f25c26ee0be3ee1f32190bc361e0c3f3633b9cbace948 languageName: node linkType: hard @@ -8119,7 +8182,7 @@ __metadata: languageName: node linkType: hard -"etag@npm:~1.8.1": +"etag@npm:^1.8.1, etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" checksum: 10/571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff @@ -8154,6 +8217,22 @@ __metadata: languageName: node linkType: hard +"eventsource-parser@npm:^3.0.1": + version: 3.0.1 + resolution: "eventsource-parser@npm:3.0.1" + checksum: 10/2730c54c3cb47d55d2967f2ece843f9fc95d8a11c2fef6fece8d17d9080193cbe3cd9ac7b04a325977f63cbf8c1664fdd0512dec1aec601666a5c5bd8564b61f + languageName: node + linkType: hard + +"eventsource@npm:^3.0.2": + version: 3.0.6 + resolution: "eventsource@npm:3.0.6" + dependencies: + eventsource-parser: "npm:^3.0.1" + checksum: 10/ac08c7d1b21e454c7685693fe4ace53fc0b84f3cf752699a556876f2a7f33b7a12972ae33d1c407fb920d6d4aed10de52fdf0dd01902ccdf45cd5da8d55e7f88 + languageName: node + linkType: hard + "execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -8225,6 +8304,15 @@ __metadata: languageName: node linkType: hard +"express-rate-limit@npm:^7.5.0": + version: 7.5.0 + resolution: "express-rate-limit@npm:7.5.0" + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + checksum: 10/eff34c83bf586789933a332a339b66649e2cca95c8e977d193aa8bead577d3182ac9f0e9c26f39389287539b8038890ff023f910b54ebb506a26a2ce135b92ca + languageName: node + linkType: hard + "express@npm:^4.21.2": version: 4.21.2 resolution: "express@npm:4.21.2" @@ -8264,6 +8352,41 @@ __metadata: languageName: node linkType: hard +"express@npm:^5.0.1": + version: 5.1.0 + resolution: "express@npm:5.1.0" + dependencies: + accepts: "npm:^2.0.0" + body-parser: "npm:^2.2.0" + content-disposition: "npm:^1.0.0" + content-type: "npm:^1.0.5" + cookie: "npm:^0.7.1" + cookie-signature: "npm:^1.2.1" + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + finalhandler: "npm:^2.1.0" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + merge-descriptors: "npm:^2.0.0" + mime-types: "npm:^3.0.0" + on-finished: "npm:^2.4.1" + once: "npm:^1.4.0" + parseurl: "npm:^1.3.3" + proxy-addr: "npm:^2.0.7" + qs: "npm:^6.14.0" + range-parser: "npm:^1.2.1" + router: "npm:^2.2.0" + send: "npm:^1.1.0" + serve-static: "npm:^2.2.0" + statuses: "npm:^2.0.1" + type-is: "npm:^2.0.1" + vary: "npm:^1.1.2" + checksum: 10/6dba00bbdf308f43a84ed3f07a7e9870d5208f2a0b8f60f39459dda089750379747819863fad250849d3c9163833f33f94ce69d73938df31e0c5a430800d7e56 + languageName: node + linkType: hard + "extend-shallow@npm:^3.0.2": version: 3.0.2 resolution: "extend-shallow@npm:3.0.2" @@ -8478,6 +8601,20 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:^2.1.0": + version: 2.1.0 + resolution: "finalhandler@npm:2.1.0" + dependencies: + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + on-finished: "npm:^2.4.1" + parseurl: "npm:^1.3.3" + statuses: "npm:^2.0.1" + checksum: 10/b2bd68c310e2c463df0ab747ab05f8defbc540b8c3f2442f86e7d084ac8acbc31f8cae079931b7f5a406521501941e3395e963de848a0aaf45dd414adeb5ff4e + languageName: node + linkType: hard + "find-root@npm:^1.1.0": version: 1.1.0 resolution: "find-root@npm:1.1.0" @@ -8625,6 +8762,13 @@ __metadata: languageName: node linkType: hard +"fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "fresh@npm:2.0.0" + checksum: 10/44e1468488363074641991c1340d2a10c5a6f6d7c353d89fd161c49d120c58ebf9890720f7584f509058385836e3ce50ddb60e9f017315a4ba8c6c3461813bfc + languageName: node + linkType: hard + "fs-extra@npm:11.3.0, fs-extra@npm:^11.1.1": version: 11.3.0 resolution: "fs-extra@npm:11.3.0" @@ -9329,7 +9473,7 @@ __metadata: dialog-polyfill: "npm:0.5.6" echarts: "npm:5.6.0" element-internals-polyfill: "npm:3.0.2" - eslint: "npm:9.25.1" + eslint: "npm:9.26.0" eslint-config-airbnb-base: "npm:15.0.0" eslint-config-prettier: "npm:10.1.2" eslint-import-resolver-webpack: "npm:0.13.10" @@ -9516,7 +9660,7 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:2.0.0": +"http-errors@npm:2.0.0, http-errors@npm:^2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" dependencies: @@ -10114,6 +10258,13 @@ __metadata: languageName: node linkType: hard +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10/0b46517ad47b00b6358fd6553c83ec1f6ba9acd7ffb3d30a0bf519c5c69e7147c132430452351b8a9fc198f8dd6c4f76f8e6f5a7f100f8c77d57d9e0f4261a8a + languageName: node + linkType: hard + "is-regex@npm:^1.2.0, is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -11073,6 +11224,13 @@ __metadata: languageName: node linkType: hard +"media-typer@npm:^1.1.0": + version: 1.1.0 + resolution: "media-typer@npm:1.1.0" + checksum: 10/a58dd60804df73c672942a7253ccc06815612326dc1c0827984b1a21704466d7cde351394f47649e56cf7415e6ee2e26e000e81b51b3eebb5a93540e8bf93cbd + languageName: node + linkType: hard + "memfs@npm:^4.6.0": version: 4.17.0 resolution: "memfs@npm:4.17.0" @@ -11106,6 +11264,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-descriptors@npm:2.0.0" + checksum: 10/e383332e700a94682d0125a36c8be761142a1320fc9feeb18e6e36647c9edf064271645f5669b2c21cf352116e561914fd8aa831b651f34db15ef4038c86696a + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -11144,7 +11309,7 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.54.0": version: 1.54.0 resolution: "mime-db@npm:1.54.0" checksum: 10/9e7834be3d66ae7f10eaa69215732c6d389692b194f876198dca79b2b90cbf96688d9d5d05ef7987b20f749b769b11c01766564264ea5f919c88b32a29011311 @@ -11176,6 +11341,15 @@ __metadata: languageName: node linkType: hard +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": + version: 3.0.1 + resolution: "mime-types@npm:3.0.1" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10/fa1d3a928363723a8046c346d87bf85d35014dae4285ad70a3ff92bd35957992b3094f8417973cfe677330916c6ef30885109624f1fb3b1e61a78af509dba120 + languageName: node + linkType: hard + "mime@npm:1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" @@ -11972,7 +12146,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": +"parseurl@npm:^1.3.3, parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 10/407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -12088,6 +12262,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^8.0.0": + version: 8.2.0 + resolution: "path-to-regexp@npm:8.2.0" + checksum: 10/23378276a172b8ba5f5fb824475d1818ca5ccee7bbdb4674701616470f23a14e536c1db11da9c9e6d82b82c556a817bbf4eee6e41b9ed20090ef9427cbb38e13 + languageName: node + linkType: hard + "path-type@npm:^6.0.0": version: 6.0.0 resolution: "path-type@npm:6.0.0" @@ -12166,6 +12347,13 @@ __metadata: languageName: node linkType: hard +"pkce-challenge@npm:^5.0.0": + version: 5.0.0 + resolution: "pkce-challenge@npm:5.0.0" + checksum: 10/e60c06a0e0481cb82f80072053d5c479a7490758541c4226460450285dd5d72a995c44b3c553731ca7c2f64cc34b35f1d2e5f9de08d276b59899298f9efe1ddf + languageName: node + linkType: hard + "plugin-error@npm:^1.0.1": version: 1.0.1 resolution: "plugin-error@npm:1.0.1" @@ -12303,7 +12491,7 @@ __metadata: languageName: node linkType: hard -"proxy-addr@npm:~2.0.7": +"proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" dependencies: @@ -12365,6 +12553,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:^6.14.0": + version: 6.14.0 + resolution: "qs@npm:6.14.0" + dependencies: + side-channel: "npm:^1.1.0" + checksum: 10/a60e49bbd51c935a8a4759e7505677b122e23bf392d6535b8fc31c1e447acba2c901235ecb192764013cd2781723dc1f61978b5fdd93cc31d7043d31cdc01974 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -12407,6 +12604,18 @@ __metadata: languageName: node linkType: hard +"raw-body@npm:^3.0.0": + version: 3.0.0 + resolution: "raw-body@npm:3.0.0" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.6.3" + unpipe: "npm:1.0.0" + checksum: 10/2443429bbb2f9ae5c50d3d2a6c342533dfbde6b3173740b70fa0302b30914ff400c6d31a46b3ceacbe7d0925dc07d4413928278b494b04a65736fc17ca33e30c + languageName: node + linkType: hard + "rc@npm:^1.0.1, rc@npm:^1.1.6": version: 1.2.8 resolution: "rc@npm:1.2.8" @@ -12882,6 +13091,19 @@ __metadata: languageName: node linkType: hard +"router@npm:^2.2.0": + version: 2.2.0 + resolution: "router@npm:2.2.0" + dependencies: + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + is-promise: "npm:^4.0.0" + parseurl: "npm:^1.3.3" + path-to-regexp: "npm:^8.0.0" + checksum: 10/8949bd1d3da5403cc024e2989fee58d7fda0f3ffe9f2dc5b8a192f295f400b3cde307b0b554f7d44851077640f36962ca469a766b3d57410d7d96245a7ba6c91 + languageName: node + linkType: hard + "rrule@npm:2.8.1": version: 2.8.1 resolution: "rrule@npm:2.8.1" @@ -13085,6 +13307,25 @@ __metadata: languageName: node linkType: hard +"send@npm:^1.1.0, send@npm:^1.2.0": + version: 1.2.0 + resolution: "send@npm:1.2.0" + dependencies: + debug: "npm:^4.3.5" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + mime-types: "npm:^3.0.1" + ms: "npm:^2.1.3" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + statuses: "npm:^2.0.1" + checksum: 10/9fa3b1a3b9a06b7b4ab00c25e8228326d9665a9745753a34d1ffab8ac63c7c206727331d1dc5be73647f1b658d259a1aa8e275b0e0eee51349370af02e9da506 + languageName: node + linkType: hard + "serialize-javascript@npm:^6.0.1, serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" @@ -13136,6 +13377,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:^2.2.0": + version: 2.2.0 + resolution: "serve-static@npm:2.2.0" + dependencies: + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + parseurl: "npm:^1.3.3" + send: "npm:^1.2.0" + checksum: 10/9f1a900738c5bb02258275ce3bd1273379c4c3072b622e15d44e8f47d89a1ba2d639ec2d63b11c263ca936096b40758acb7a0d989cd6989018a65a12f9433ada + languageName: node + linkType: hard + "serve@npm:14.2.4": version: 14.2.4 resolution: "serve@npm:14.2.4" @@ -13608,7 +13861,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:2.0.1": +"statuses@npm:2.0.1, statuses@npm:^2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" checksum: 10/18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb @@ -14382,6 +14635,17 @@ __metadata: languageName: node linkType: hard +"type-is@npm:^2.0.0, type-is@npm:^2.0.1": + version: 2.0.1 + resolution: "type-is@npm:2.0.1" + dependencies: + content-type: "npm:^1.0.5" + media-typer: "npm:^1.1.0" + mime-types: "npm:^3.0.0" + checksum: 10/bacdb23c872dacb7bd40fbd9095e6b2fca2895eedbb689160c05534d7d4810a7f4b3fd1ae87e96133c505958f6d602967a68db5ff577b85dd6be76eaa75d58af + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -14752,7 +15016,7 @@ __metadata: languageName: node linkType: hard -"vary@npm:^1, vary@npm:~1.1.2": +"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: 10/31389debef15a480849b8331b220782230b9815a8e0dbb7b9a8369559aed2e9a7800cd904d4371ea74f4c3527db456dc8e7ac5befce5f0d289014dbdf47b2242 @@ -16007,6 +16271,22 @@ __metadata: languageName: node linkType: hard +"zod-to-json-schema@npm:^3.24.1": + version: 3.24.5 + resolution: "zod-to-json-schema@npm:3.24.5" + peerDependencies: + zod: ^3.24.1 + checksum: 10/1af291b4c429945c9568c2e924bdb7c66ab8d139cbeb9a99b6e9fc9e1b02863f85d07759b9303714f07ceda3993dcaf0ebcb80d2c18bb2aaf5502b2c1016affd + languageName: node + linkType: hard + +"zod@npm:^3.23.8, zod@npm:^3.24.2": + version: 3.24.4 + resolution: "zod@npm:3.24.4" + checksum: 10/3d545792fa54bb27ee5dbc34a5709e81f603185fcc94c8204b5d95c20dc4c81d870ff9c51f3884a30ef05cdc601449f4c4df254ac4783f0827b1faed7c1cdb48 + languageName: node + linkType: hard + "zrender@npm:5.6.1": version: 5.6.1 resolution: "zrender@npm:5.6.1" From d618c25095f35a9522d974a3b861194d66370739 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 6 May 2025 03:49:35 -0400 Subject: [PATCH 054/247] Show voice ID in TTS media browser (#25324) * Show voice ID in TTS media browser * Apply suggestions from code review Co-authored-by: Paul Bottein * Add copy button * Now copy correct clipboard icon * Improve styling * GAP --------- Co-authored-by: Paul Bottein --- .../media-player/ha-browse-media-tts.ts | 135 ++++++++++++------ src/translations/en.json | 4 +- 2 files changed, 94 insertions(+), 45 deletions(-) diff --git a/src/components/media-player/ha-browse-media-tts.ts b/src/components/media-player/ha-browse-media-tts.ts index e6fbdd62d7..1924af09a4 100644 --- a/src/components/media-player/ha-browse-media-tts.ts +++ b/src/components/media-player/ha-browse-media-tts.ts @@ -2,6 +2,7 @@ import "@material/mwc-button/mwc-button"; import type { PropertyValues } from "lit"; import { css, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators"; +import { mdiContentCopy } from "@mdi/js"; import { storage } from "../../common/decorators/storage"; import { fireEvent } from "../../common/dom/fire_event"; import type { @@ -17,6 +18,8 @@ import "../ha-language-picker"; import "../ha-tts-voice-picker"; import "../ha-card"; import { fetchCloudStatus } from "../../data/cloud"; +import { copyToClipboard } from "../../common/util/copy-clipboard"; +import { showToast } from "../../util/toast"; export interface TtsMediaPickedEvent { item: MediaPlayerItem; @@ -51,50 +54,69 @@ class BrowseMediaTTS extends LitElement { private _message?: string; protected render() { - return html` -
- - - ${this._provider?.supported_languages?.length - ? html`
- - -
` - : nothing} -
-
- - ${this.hass.localize( - `ui.components.media-browser.tts.action_${this.action}` - )} - -
-
`; + return html` + +
+ + + ${this._provider?.supported_languages?.length + ? html`
+ + +
` + : nothing} +
+
+ + ${this.hass.localize( + `ui.components.media-browser.tts.action_${this.action}` + )} + +
+
+ ${this._voice + ? html` + + ` + : nothing} + `; } protected override willUpdate(changedProps: PropertyValues): void { @@ -197,6 +219,14 @@ class BrowseMediaTTS extends LitElement { fireEvent(this, "tts-picked", { item }); } + private async _copyVoiceId(ev) { + ev.preventDefault(); + await copyToClipboard(this._voice); + showToast(this, { + message: this.hass.localize("ui.common.copied_clipboard"), + }); + } + static override styles = [ buttonLinkStyle, css` @@ -218,6 +248,23 @@ class BrowseMediaTTS extends LitElement { button.link { color: var(--primary-color); } + .footer { + font-size: var(--ha-font-size-s); + color: var(--secondary-text-color); + margin: 16px 0; + text-align: center; + } + .footer code { + font-weight: var(--ha-font-weight-bold); + } + .footer { + --mdc-icon-size: 14px; + --mdc-icon-button-size: 24px; + display: flex; + justify-content: center; + align-items: center; + gap: 6px; + } `, ]; } diff --git a/src/translations/en.json b/src/translations/en.json index 374d86b6a9..d3da5cbb65 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -920,7 +920,9 @@ "action_play": "Say", "action_pick": "Select", "set_as_default": "Set as default options", - "faild_to_store_defaults": "Failed to store defaults: {error}" + "faild_to_store_defaults": "Failed to store defaults: {error}", + "selected_voice_id": "Selected voice ID", + "copy_voice_id": "Copy voice ID" }, "pick": "Pick", "play": "Play", From ad8d3dd5985590ba368c3abdadfe753b2fcc9789 Mon Sep 17 00:00:00 2001 From: Simon Lamon <32477463+silamon@users.noreply.github.com> Date: Tue, 6 May 2025 09:52:04 +0200 Subject: [PATCH 055/247] Bump the sortable patch (#25262) --- ... => sortablejs-npm-1.15.6-3235a8f83b.patch} | 0 package.json | 2 +- yarn.lock | 18 +++++++++--------- 3 files changed, 10 insertions(+), 10 deletions(-) rename .yarn/patches/{sortablejs-npm-1.15.3-3235a8f83b.patch => sortablejs-npm-1.15.6-3235a8f83b.patch} (100%) diff --git a/.yarn/patches/sortablejs-npm-1.15.3-3235a8f83b.patch b/.yarn/patches/sortablejs-npm-1.15.6-3235a8f83b.patch similarity index 100% rename from .yarn/patches/sortablejs-npm-1.15.3-3235a8f83b.patch rename to .yarn/patches/sortablejs-npm-1.15.6-3235a8f83b.patch diff --git a/package.json b/package.json index eb286c2e34..3040aec248 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,7 @@ "qrcode": "1.5.4", "roboto-fontface": "0.10.0", "rrule": "2.8.1", - "sortablejs": "patch:sortablejs@npm%3A1.15.3#~/.yarn/patches/sortablejs-npm-1.15.3-3235a8f83b.patch", + "sortablejs": "patch:sortablejs@npm%3A1.15.6#~/.yarn/patches/sortablejs-npm-1.15.6-3235a8f83b.patch", "stacktrace-js": "2.0.2", "superstruct": "2.0.2", "tinykeys": "3.0.0", diff --git a/yarn.lock b/yarn.lock index eaa5ac2a2e..a593fb7e20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9526,7 +9526,7 @@ __metadata: rspack-manifest-plugin: "npm:5.0.3" serve: "npm:14.2.4" sinon: "npm:20.0.0" - sortablejs: "patch:sortablejs@npm%3A1.15.3#~/.yarn/patches/sortablejs-npm-1.15.3-3235a8f83b.patch" + sortablejs: "patch:sortablejs@npm%3A1.15.6#~/.yarn/patches/sortablejs-npm-1.15.6-3235a8f83b.patch" stacktrace-js: "npm:2.0.2" superstruct: "npm:2.0.2" tar: "npm:7.4.3" @@ -13699,17 +13699,17 @@ __metadata: languageName: node linkType: hard -"sortablejs@npm:1.15.3": - version: 1.15.3 - resolution: "sortablejs@npm:1.15.3" - checksum: 10/85d39a172ef47adedf273afa65daa8aefcbaafd43a5b5c480d8637add93033f5784da697d0d3545d9bb6e11fd71f1847f307ee26be452942f3785a683fd44bb5 +"sortablejs@npm:1.15.6": + version: 1.15.6 + resolution: "sortablejs@npm:1.15.6" + checksum: 10/3179071352662e6cff20d7d10792a934fc892a83a01ae09c7e604d2dd51daaf07283b00a8f2b13025f27959ff68a1469959bc94ef2a7049723d4c381a368a5ac languageName: node linkType: hard -"sortablejs@patch:sortablejs@npm%3A1.15.3#~/.yarn/patches/sortablejs-npm-1.15.3-3235a8f83b.patch": - version: 1.15.3 - resolution: "sortablejs@patch:sortablejs@npm%3A1.15.3#~/.yarn/patches/sortablejs-npm-1.15.3-3235a8f83b.patch::version=1.15.3&hash=fba0ad" - checksum: 10/249f4cfd2b4a811f4e1505b25d4d67a97521afabdabd2f5482f985da20785d995c2899d442ad79075c7ba547e477aef81f09b0028f12d1de468cbca4f2b8c043 +"sortablejs@patch:sortablejs@npm%3A1.15.6#~/.yarn/patches/sortablejs-npm-1.15.6-3235a8f83b.patch": + version: 1.15.6 + resolution: "sortablejs@patch:sortablejs@npm%3A1.15.6#~/.yarn/patches/sortablejs-npm-1.15.6-3235a8f83b.patch::version=1.15.6&hash=fba0ad" + checksum: 10/4d7515c6490fd9d7184a758775634b72c971f1ac739f8bf19683ad973374d6afb3adeb5dcb5c604d15faac55867b401cdb0631c0baee9f73d4c1ef82ee4318f8 languageName: node linkType: hard From 92b8cd8f459f1d78fc3d5ec7b45b9f24156a6e13 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 6 May 2025 10:57:47 +0200 Subject: [PATCH 056/247] Align side bar title with items (#25330) --- src/components/ha-sidebar.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index e3f139b62b..3f48666754 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -896,8 +896,8 @@ class HaSidebar extends SubscribeMixin(LitElement) { color: var(--sidebar-icon-color); } .title { - margin-left: 19px; - margin-inline-start: 19px; + margin-left: 3px; + margin-inline-start: 3px; margin-inline-end: initial; width: 100%; display: none; From 0729aaacb8f9acfe0519fe410e1c537a39574549 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Tue, 6 May 2025 11:00:37 +0200 Subject: [PATCH 057/247] Revert "Keyboard accessible panel sorting" (#25331) --- src/components/ha-sidebar.ts | 71 +++----------------------- src/resources/ha-sidebar-edit-style.ts | 2 +- src/translations/en.json | 4 +- 3 files changed, 9 insertions(+), 68 deletions(-) diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index 3f48666754..19c4a8d633 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -52,7 +52,6 @@ import "./user/ha-user-badge"; import "./ha-md-list"; import "./ha-md-list-item"; import type { HaMdListItem } from "./ha-md-list-item"; -import { showPromptDialog } from "../dialogs/generic/show-dialog-box"; const SHOW_AFTER_SPACER = ["config", "developer-tools"]; @@ -425,12 +424,8 @@ class HaSidebar extends SubscribeMixin(LitElement) { `; } - private _renderPanels( - panels: PanelInfo[], - selectedPanel: string, - orderable = false - ) { - return panels.map((panel, idx) => + private _renderPanels(panels: PanelInfo[], selectedPanel: string) { + return panels.map((panel) => this._renderPanel( panel.url_path, panel.url_path === this.hass.defaultPanel @@ -442,8 +437,7 @@ class HaSidebar extends SubscribeMixin(LitElement) { : panel.url_path in PANEL_ICONS ? PANEL_ICONS[panel.url_path] : undefined, - selectedPanel, - orderable ? idx : null + selectedPanel ) ); } @@ -453,8 +447,7 @@ class HaSidebar extends SubscribeMixin(LitElement) { title: string | null, icon: string | null | undefined, iconPath: string | null | undefined, - selectedPanel: string, - index: number | null + selectedPanel: string ) { return urlPath === "config" ? this._renderConfiguration(title, selectedPanel) @@ -470,20 +463,8 @@ class HaSidebar extends SubscribeMixin(LitElement) { ? html`` : html``} ${title} - ${index != null - ? html` -
${index + 1}
-
` - : nothing} ${this.editMode - ? html`
${this._renderPanels(beforeSpacer, selectedPanel, true)}
+ >
${this._renderPanels(beforeSpacer, selectedPanel)}
${this._renderSpacer()}${this._renderHiddenPanels()} `; @@ -712,28 +690,6 @@ class HaSidebar extends SubscribeMixin(LitElement) { fireEvent(this, "hass-edit-sidebar", { editMode: false }); } - private async _changePosition(ev): Promise { - ev.preventDefault(); - const oldIndex = (ev.currentTarget as any).index as number; - const name = ((ev.currentTarget as any).title as string) || ""; - - const positionString = await showPromptDialog(this, { - title: this.hass!.localize("ui.sidebar.change_position"), - text: this.hass!.localize("ui.sidebar.change_position_dialog_text", { - name, - }), - inputType: "number", - inputMin: "1", - placeholder: String(oldIndex + 1), - }); - - if (!positionString) return; - const position = parseInt(positionString); - if (isNaN(position)) return; - const newIndex = Math.max(0, position - 1); - this._panelMove(oldIndex, newIndex); - } - private async _hidePanel(ev: Event) { ev.preventDefault(); const panel = (ev.currentTarget as any).panel; @@ -984,7 +940,7 @@ class HaSidebar extends SubscribeMixin(LitElement) { ha-md-list-item .item-text { display: none; - max-width: 100%; + max-width: calc(100% - 56px); font-weight: 500; font-size: 14px; } @@ -1015,19 +971,6 @@ class HaSidebar extends SubscribeMixin(LitElement) { color: var(--text-accent-color, var(--text-primary-color)); } - .position-badge { - display: block; - width: 24px; - line-height: 24px; - box-sizing: border-box; - border-radius: 50%; - font-weight: 500; - text-align: center; - font-size: 14px; - background-color: var(--app-header-edit-background-color, #455a64); - color: var(--app-header-edit-text-color, white); - } - ha-svg-icon + .badge { position: absolute; top: 4px; diff --git a/src/resources/ha-sidebar-edit-style.ts b/src/resources/ha-sidebar-edit-style.ts index 10dc29f913..efd4ddee10 100644 --- a/src/resources/ha-sidebar-edit-style.ts +++ b/src/resources/ha-sidebar-edit-style.ts @@ -58,7 +58,7 @@ export const sidebarEditStyle = css` } :host([expanded]) .hide-panel { - display: inline-block; + display: block; } :host([expanded]) .show-panel { diff --git a/src/translations/en.json b/src/translations/en.json index d3da5cbb65..6e4810e682 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2018,9 +2018,7 @@ "sidebar_toggle": "Sidebar toggle", "done": "Done", "hide_panel": "Hide panel", - "show_panel": "Show panel", - "change_position": "Change panel position", - "change_position_dialog_text": "What position do you want to move your ''{name}'' panel to?" + "show_panel": "Show panel" }, "panel": { "my": { From 15dcdffe55298bf9eae37c91649569645c400b7a Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 6 May 2025 13:38:38 +0200 Subject: [PATCH 058/247] Add covers to overview view for area strategy (#25334) --- .../lovelace/strategies/areas/areas-overview-view-strategy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/panels/lovelace/strategies/areas/areas-overview-view-strategy.ts b/src/panels/lovelace/strategies/areas/areas-overview-view-strategy.ts index 40a034140b..fde3545216 100644 --- a/src/panels/lovelace/strategies/areas/areas-overview-view-strategy.ts +++ b/src/panels/lovelace/strategies/areas/areas-overview-view-strategy.ts @@ -50,6 +50,7 @@ export class AreasOverviewViewStrategy extends ReactiveElement { const entities = [ ...groups.lights, + ...groups.covers, ...groups.climate, ...groups.media_players, ...groups.security, From 852278e8aa95588269a160666ee898782b53f564 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Tue, 6 May 2025 13:50:23 +0200 Subject: [PATCH 059/247] Add custom retention info to backup locations (#25318) * Add retention messages to backup locations * Fix mobile * Use join --- .../config/ha-backup-config-agents.ts | 74 +++++++++++++++---- src/translations/en.json | 5 +- 2 files changed, 62 insertions(+), 17 deletions(-) diff --git a/src/panels/config/backup/components/config/ha-backup-config-agents.ts b/src/panels/config/backup/components/config/ha-backup-config-agents.ts index 687321f7c5..a9817dba96 100644 --- a/src/panels/config/backup/components/config/ha-backup-config-agents.ts +++ b/src/panels/config/backup/components/config/ha-backup-config-agents.ts @@ -1,5 +1,6 @@ import { mdiCog, mdiDelete, mdiHarddisk, mdiNas } from "@mdi/js"; -import { css, html, LitElement, nothing } from "lit"; +import { css, html, LitElement, nothing, type TemplateResult } from "lit"; +import { join } from "lit/directives/join"; import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { fireEvent } from "../../../../../common/dom/fire_event"; @@ -57,26 +58,51 @@ class HaBackupConfigAgents extends LitElement { ); } + const texts: (TemplateResult | string)[] = []; + + if (isNetworkMountAgent(agentId)) { + texts.push( + this.hass.localize( + "ui.panel.config.backup.agents.network_mount_agent_description" + ) + ); + } + const encryptionTurnedOff = this.agentsConfig?.[agentId]?.protected === false; if (encryptionTurnedOff) { - return html` - - - ${this.hass.localize( - "ui.panel.config.backup.agents.encryption_turned_off" - )} - - `; - } - - if (isNetworkMountAgent(agentId)) { - return this.hass.localize( - "ui.panel.config.backup.agents.network_mount_agent_description" + texts.push( + html`
+ + + ${this.hass.localize( + "ui.panel.config.backup.agents.encryption_turned_off" + )} + +
` ); } - return ""; + + const retention = this.agentsConfig?.[agentId]?.retention; + + if (retention) { + if (retention.copies === null && retention.days === null) { + texts.push( + this.hass.localize("ui.panel.config.backup.agents.retention_all") + ); + } else { + texts.push( + this.hass.localize( + `ui.panel.config.backup.agents.retention_${retention.copies ? "backups" : "days"}`, + { + count: retention.copies || retention.days, + } + ) + ); + } + } + return join(texts, html``); } private _availableAgents = memoizeOne( @@ -287,6 +313,11 @@ class HaBackupConfigAgents extends LitElement { gap: 8px; line-height: normal; } + .unencrypted-warning { + display: flex; + align-items: center; + gap: 4px; + } .dot { display: block; position: relative; @@ -294,11 +325,22 @@ class HaBackupConfigAgents extends LitElement { height: 8px; background-color: var(--disabled-color); border-radius: 50%; - flex: none; } .dot.warning { background-color: var(--warning-color); } + @media all and (max-width: 500px) { + .separator { + display: none; + } + ha-md-list-item [slot="supporting-text"] { + display: flex; + align-items: flex-start; + flex-direction: column; + justify-content: flex-start; + gap: 4px; + } + } `; } diff --git a/src/translations/en.json b/src/translations/en.json index 6e4810e682..aaa9a327be 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2491,7 +2491,10 @@ "unavailable_agents": "Unavailable locations", "no_agents": "No locations configured", "encryption_turned_off": "Encryption turned off", - "local_agent": "This system" + "local_agent": "This system", + "retention_all": "Keep all backups", + "retention_backups": "Keep {count} {count, plural,\n one {backup}\n other {backups}\n}", + "retention_days": "Keep {count} {count, plural,\n one {day}\n other {days}\n}" }, "data": { "ha_settings": "Home Assistant settings", From 00d708fbd4b249852f3404dbf35e8942b5a9a5ae Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Tue, 6 May 2025 13:52:00 +0200 Subject: [PATCH 060/247] Fix flow form padding end (#25328) * Fix flow form padding end * Use more end padding if docs are present --- .../config-flow/dialog-data-entry-flow.ts | 42 +++++++++++-------- src/dialogs/config-flow/step-flow-abort.ts | 5 ++- .../config-flow/step-flow-create-entry.ts | 5 ++- src/dialogs/config-flow/step-flow-external.ts | 10 ++++- src/dialogs/config-flow/step-flow-form.ts | 7 +++- src/dialogs/config-flow/step-flow-menu.ts | 7 +++- src/dialogs/config-flow/step-flow-progress.ts | 5 ++- src/dialogs/config-flow/styles.ts | 3 ++ 8 files changed, 61 insertions(+), 23 deletions(-) diff --git a/src/dialogs/config-flow/dialog-data-entry-flow.ts b/src/dialogs/config-flow/dialog-data-entry-flow.ts index 94959185ec..726143bdb1 100644 --- a/src/dialogs/config-flow/dialog-data-entry-flow.ts +++ b/src/dialogs/config-flow/dialog-data-entry-flow.ts @@ -1,4 +1,3 @@ -import "@material/mwc-button"; import { mdiClose, mdiHelpCircle } from "@mdi/js"; import type { UnsubscribeFunc } from "home-assistant-js-websocket"; import type { CSSResultGroup, PropertyValues } from "lit"; @@ -177,6 +176,17 @@ class DataEntryFlowDialog extends LitElement { return nothing; } + const showDocumentationLink = + ([ + "form", + "menu", + "external", + "progress", + "data_entry_flow_progressed", + ].includes(this._step?.type as any) && + this._params.manifest?.is_built_in) || + !!this._params.manifest?.documentation; + return html` @@ -199,26 +209,18 @@ class DataEntryFlowDialog extends LitElement { : this._step === undefined ? // When we are going to next step, we render 1 round of empty // to reset the element. - "" + nothing : html`
- ${([ - "form", - "menu", - "external", - "progress", - "data_entry_flow_progressed", - ].includes(this._step?.type as any) && - this._params.manifest?.is_built_in) || - this._params.manifest?.documentation + ${showDocumentationLink ? html` @@ -229,7 +231,7 @@ class DataEntryFlowDialog extends LitElement { ` - : ""} + : nothing} ` : this._step.type === "external" @@ -250,6 +253,7 @@ class DataEntryFlowDialog extends LitElement { .flowConfig=${this._params.flowConfig} .step=${this._step} .hass=${this.hass} + .increasePaddingEnd=${showDocumentationLink} > ` : this._step.type === "abort" @@ -261,6 +265,7 @@ class DataEntryFlowDialog extends LitElement { .handler=${this._step.handler} .domain=${this._params.domain ?? this._step.handler} + .increasePaddingEnd=${showDocumentationLink} > ` : this._step.type === "progress" @@ -270,6 +275,7 @@ class DataEntryFlowDialog extends LitElement { .step=${this._step} .hass=${this.hass} .progress=${this._progress} + .increasePaddingEnd=${showDocumentationLink} > ` : this._step.type === "menu" @@ -278,6 +284,7 @@ class DataEntryFlowDialog extends LitElement { .flowConfig=${this._params.flowConfig} .step=${this._step} .hass=${this.hass} + .increasePaddingEnd=${showDocumentationLink} > ` : html` @@ -286,7 +293,8 @@ class DataEntryFlowDialog extends LitElement { .step=${this._step} .hass=${this.hass} .navigateToResult=${this._params - .navigateToResult} + .navigateToResult ?? false} + .increasePaddingEnd=${showDocumentationLink} > `} `} diff --git a/src/dialogs/config-flow/step-flow-abort.ts b/src/dialogs/config-flow/step-flow-abort.ts index fa54d4ca57..9f0ad9abb0 100644 --- a/src/dialogs/config-flow/step-flow-abort.ts +++ b/src/dialogs/config-flow/step-flow-abort.ts @@ -22,6 +22,9 @@ class StepFlowAbort extends LitElement { @property({ attribute: false }) public handler!: string; + @property({ type: Boolean, attribute: "increase-padding-end" }) + public increasePaddingEnd = false; + protected firstUpdated(changed: PropertyValues) { super.firstUpdated(changed); if (this.step.reason === "missing_credentials") { @@ -34,7 +37,7 @@ class StepFlowAbort extends LitElement { return nothing; } return html` -

+

${this.params.flowConfig.renderAbortHeader ? this.params.flowConfig.renderAbortHeader(this.hass, this.step) : this.hass.localize(`component.${this.domain}.title`)} diff --git a/src/dialogs/config-flow/step-flow-create-entry.ts b/src/dialogs/config-flow/step-flow-create-entry.ts index 6f59bf593d..327b5b783a 100644 --- a/src/dialogs/config-flow/step-flow-create-entry.ts +++ b/src/dialogs/config-flow/step-flow-create-entry.ts @@ -36,6 +36,9 @@ class StepFlowCreateEntry extends LitElement { @property({ attribute: false }) public step!: DataEntryFlowStepCreateEntry; + @property({ type: Boolean, attribute: "increase-padding-end" }) + public increasePaddingEnd = false; + public navigateToResult = false; @state() private _deviceUpdate: Record< @@ -113,7 +116,7 @@ class StepFlowCreateEntry extends LitElement { this.step.result?.entry_id ); return html` -

+

${devices.length ? localize("ui.panel.config.integrations.config_flow.assign_area", { number: devices.length, diff --git a/src/dialogs/config-flow/step-flow-external.ts b/src/dialogs/config-flow/step-flow-external.ts index 4e3b10512c..98d98c61ef 100644 --- a/src/dialogs/config-flow/step-flow-external.ts +++ b/src/dialogs/config-flow/step-flow-external.ts @@ -15,11 +15,16 @@ class StepFlowExternal extends LitElement { @property({ attribute: false }) public step!: DataEntryFlowStepExternal; + @property({ type: Boolean, attribute: "increase-padding-end" }) + public increasePaddingEnd = false; + protected render(): TemplateResult { const localize = this.hass.localize; return html` -

${this.flowConfig.renderExternalStepHeader(this.hass, this.step)}

+

+ ${this.flowConfig.renderExternalStepHeader(this.hass, this.step)} +

${this.flowConfig.renderExternalStepDescription(this.hass, this.step)}
@@ -51,6 +56,9 @@ class StepFlowExternal extends LitElement { .open-button a { text-decoration: none; } + h2.end-space { + padding-inline-end: 72px; + } `, ]; } diff --git a/src/dialogs/config-flow/step-flow-form.ts b/src/dialogs/config-flow/step-flow-form.ts index 0c6da5eda2..06ec17dc0d 100644 --- a/src/dialogs/config-flow/step-flow-form.ts +++ b/src/dialogs/config-flow/step-flow-form.ts @@ -27,6 +27,9 @@ class StepFlowForm extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; + @property({ type: Boolean, attribute: "increase-padding-end" }) + public increasePaddingEnd = false; + @state() private _loading = false; @state() private _stepData?: Record; @@ -43,7 +46,9 @@ class StepFlowForm extends LitElement { const stepData = this._stepDataProcessed; return html` -

${this.flowConfig.renderShowFormStepHeader(this.hass, this.step)}

+

+ ${this.flowConfig.renderShowFormStepHeader(this.hass, this.step)} +

${this.flowConfig.renderShowFormStepDescription(this.hass, this.step)} ${this._errorMsg diff --git a/src/dialogs/config-flow/step-flow-menu.ts b/src/dialogs/config-flow/step-flow-menu.ts index 7c1f1e35f6..b0fcd3ba64 100644 --- a/src/dialogs/config-flow/step-flow-menu.ts +++ b/src/dialogs/config-flow/step-flow-menu.ts @@ -17,6 +17,9 @@ class StepFlowMenu extends LitElement { @property({ attribute: false }) public step!: DataEntryFlowStepMenu; + @property({ type: Boolean, attribute: "increase-padding-end" }) + public increasePaddingEnd = false; + protected render(): TemplateResult { let options: string[]; let translations: Record; @@ -42,7 +45,9 @@ class StepFlowMenu extends LitElement { ); return html` -

${this.flowConfig.renderMenuHeader(this.hass, this.step)}

+

+ ${this.flowConfig.renderMenuHeader(this.hass, this.step)} +

${description ? html`
${description}
` : ""}
${options.map( diff --git a/src/dialogs/config-flow/step-flow-progress.ts b/src/dialogs/config-flow/step-flow-progress.ts index ef56fa271d..c71efcb98c 100644 --- a/src/dialogs/config-flow/step-flow-progress.ts +++ b/src/dialogs/config-flow/step-flow-progress.ts @@ -24,9 +24,12 @@ class StepFlowProgress extends LitElement { @property({ type: Number }) public progress?: number; + @property({ type: Boolean, attribute: "increase-padding-end" }) + public increasePaddingEnd = false; + protected render(): TemplateResult { return html` -

+

${this.flowConfig.renderShowFormProgressHeader(this.hass, this.step)}

diff --git a/src/dialogs/config-flow/styles.ts b/src/dialogs/config-flow/styles.ts index daaa9342af..0e2aca3e7b 100644 --- a/src/dialogs/config-flow/styles.ts +++ b/src/dialogs/config-flow/styles.ts @@ -22,6 +22,9 @@ export const configFlowContentStyles = css` text-transform: var(--mdc-typography-headline6-text-transform, inherit); box-sizing: border-box; } + h2.end-space { + padding-inline-end: 72px; + } .content, .preview { From 042cd0d3a3423ca6fe5963aab8b65fdadabcdb25 Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Tue, 6 May 2025 13:52:28 +0200 Subject: [PATCH 061/247] Fix sidebar item text width (#25332) * Fix sidebar item text width to utilize full available space * Update src/components/ha-sidebar.ts Co-authored-by: Bram Kragten --------- Co-authored-by: Bram Kragten --- src/components/ha-sidebar.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/ha-sidebar.ts b/src/components/ha-sidebar.ts index 19c4a8d633..a286613cb0 100644 --- a/src/components/ha-sidebar.ts +++ b/src/components/ha-sidebar.ts @@ -940,7 +940,6 @@ class HaSidebar extends SubscribeMixin(LitElement) { ha-md-list-item .item-text { display: none; - max-width: calc(100% - 56px); font-weight: 500; font-size: 14px; } From 38a5035d6848b62f57f33b1b1efdf9799c5e04fc Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 6 May 2025 15:30:04 +0200 Subject: [PATCH 062/247] Fix outlined icon button style (#25340) --- src/components/ha-outlined-icon-button.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/ha-outlined-icon-button.ts b/src/components/ha-outlined-icon-button.ts index 7e0835bc5a..2615e1fc45 100644 --- a/src/components/ha-outlined-icon-button.ts +++ b/src/components/ha-outlined-icon-button.ts @@ -6,6 +6,13 @@ import { customElement } from "lit/decorators"; @customElement("ha-outlined-icon-button") export class HaOutlinedIconButton extends IconButton { + protected override getRenderClasses() { + return { + ...super.getRenderClasses(), + outlined: true, + }; + } + static override styles = [ css` .icon-button { From 1aa1bfda2c96f4445485a378a95e867e4ea508ff Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Tue, 6 May 2025 15:56:20 +0200 Subject: [PATCH 063/247] Use middle dot 00B7 as separator (#25336) --- src/components/data-table/ha-data-table.ts | 2 +- src/dialogs/more-info/controls/more-info-cover.ts | 2 +- src/dialogs/more-info/controls/more-info-valve.ts | 2 +- .../backup/components/config/ha-backup-config-agents.ts | 2 +- src/panels/config/info/ha-config-info.ts | 2 +- src/panels/config/logs/dialog-download-logs.ts | 2 +- src/panels/config/repairs/dialog-repairs-issue-subtitle.ts | 2 +- src/panels/config/repairs/ha-config-repairs.ts | 4 ++-- .../climate/ha-state-control-climate-temperature.ts | 2 +- src/state-display/state-display.ts | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/components/data-table/ha-data-table.ts b/src/components/data-table/ha-data-table.ts index 39447ca320..66d7a3ba60 100644 --- a/src/components/data-table/ha-data-table.ts +++ b/src/components/data-table/ha-data-table.ts @@ -603,7 +603,7 @@ export class HaDataTable extends LitElement { .map( ([key2, column2], i) => html`${i !== 0 - ? " ⸱ " + ? " · " : nothing}${column2.template ? column2.template(row) : row[key2]}` diff --git a/src/dialogs/more-info/controls/more-info-cover.ts b/src/dialogs/more-info/controls/more-info-cover.ts index 166d5367a6..b041b44b5e 100644 --- a/src/dialogs/more-info/controls/more-info-cover.ts +++ b/src/dialogs/more-info/controls/more-info-cover.ts @@ -57,7 +57,7 @@ class MoreInfoCover extends LitElement { ); if (positionStateDisplay) { - return `${stateDisplay} ⸱ ${positionStateDisplay}`; + return `${stateDisplay} · ${positionStateDisplay}`; } return stateDisplay; } diff --git a/src/dialogs/more-info/controls/more-info-valve.ts b/src/dialogs/more-info/controls/more-info-valve.ts index 66158025c8..84a0e43eaf 100644 --- a/src/dialogs/more-info/controls/more-info-valve.ts +++ b/src/dialogs/more-info/controls/more-info-valve.ts @@ -57,7 +57,7 @@ class MoreInfoValve extends LitElement { ); if (positionStateDisplay) { - return `${stateDisplay} ⸱ ${positionStateDisplay}`; + return `${stateDisplay} · ${positionStateDisplay}`; } return stateDisplay; } diff --git a/src/panels/config/backup/components/config/ha-backup-config-agents.ts b/src/panels/config/backup/components/config/ha-backup-config-agents.ts index a9817dba96..f808d3fe99 100644 --- a/src/panels/config/backup/components/config/ha-backup-config-agents.ts +++ b/src/panels/config/backup/components/config/ha-backup-config-agents.ts @@ -102,7 +102,7 @@ class HaBackupConfigAgents extends LitElement { ); } } - return join(texts, html``); + return join(texts, html` · `); } private _availableAgents = memoizeOne( diff --git a/src/panels/config/info/ha-config-info.ts b/src/panels/config/info/ha-config-info.ts index 26acffcabd..d58f4a858e 100644 --- a/src/panels/config/info/ha-config-info.ts +++ b/src/panels/config/info/ha-config-info.ts @@ -156,7 +156,7 @@ class HaConfigInfo extends LitElement { )} - ${JS_VERSION}${JS_TYPE !== "modern" ? ` ⸱ ${JS_TYPE}` : ""} + ${JS_VERSION}${JS_TYPE !== "modern" ? ` · ${JS_TYPE}` : ""} diff --git a/src/panels/config/logs/dialog-download-logs.ts b/src/panels/config/logs/dialog-download-logs.ts index 801ef1db22..528235c4e5 100644 --- a/src/panels/config/logs/dialog-download-logs.ts +++ b/src/panels/config/logs/dialog-download-logs.ts @@ -70,7 +70,7 @@ class DownloadLogsDialog extends LitElement { ${this._dialogParams.header}${this._dialogParams.boot === 0 ? "" - : ` ⸱ ${this._dialogParams.boot === -1 ? this.hass.localize("ui.panel.config.logs.previous") : this.hass.localize("ui.panel.config.logs.startups_ago", { boot: this._dialogParams.boot * -1 })}`} + : ` · ${this._dialogParams.boot === -1 ? this.hass.localize("ui.panel.config.logs.previous") : this.hass.localize("ui.panel.config.logs.startups_ago", { boot: this._dialogParams.boot * -1 })}`}
diff --git a/src/panels/config/repairs/dialog-repairs-issue-subtitle.ts b/src/panels/config/repairs/dialog-repairs-issue-subtitle.ts index 6ea15ed6e4..d0c39bc951 100644 --- a/src/panels/config/repairs/dialog-repairs-issue-subtitle.ts +++ b/src/panels/config/repairs/dialog-repairs-issue-subtitle.ts @@ -20,7 +20,7 @@ class DialogRepairsIssueSubtitle extends LitElement { protected render() { const domainName = domainToName(this.hass.localize, this.issue.domain); const reportedBy = domainName - ? ` ⸱ ${this.hass.localize("ui.panel.config.repairs.reported_by", { + ? ` · ${this.hass.localize("ui.panel.config.repairs.reported_by", { integration: domainName, })}` : ""; diff --git a/src/panels/config/repairs/ha-config-repairs.ts b/src/panels/config/repairs/ha-config-repairs.ts index 77345f3e86..f4729b0287 100644 --- a/src/panels/config/repairs/ha-config-repairs.ts +++ b/src/panels/config/repairs/ha-config-repairs.ts @@ -100,13 +100,13 @@ class HaConfigRepairs extends LitElement { ${(issue.severity === "critical" || issue.severity === "error") && issue.created - ? " ⸱ " + ? " · " : ""} ${createdBy ? html`${createdBy}` : nothing} ${issue.ignored - ? ` ⸱ ${this.hass.localize( + ? ` · ${this.hass.localize( "ui.panel.config.repairs.dialog.ignored_in_version_short", { version: issue.dismissed_version } )}` diff --git a/src/state-control/climate/ha-state-control-climate-temperature.ts b/src/state-control/climate/ha-state-control-climate-temperature.ts index 6b2000222b..a3317dfde3 100644 --- a/src/state-control/climate/ha-state-control-climate-temperature.ts +++ b/src/state-control/climate/ha-state-control-climate-temperature.ts @@ -366,7 +366,7 @@ export class HaStateControlClimateTemperature extends LitElement { > ${this._renderTarget(this._targetTemperature.low!, "normal", true)} - + ·