diff --git a/pyproject.toml b/pyproject.toml
index 360873cc72..7a89b5f566 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "home-assistant-frontend"
-version = "20250701.0"
+version = "20250702.0"
license = "Apache-2.0"
license-files = ["LICENSE*"]
description = "The Home Assistant frontend"
diff --git a/src/components/ha-area-picker.ts b/src/components/ha-area-picker.ts
index 1f14568261..9b18057808 100644
--- a/src/components/ha-area-picker.ts
+++ b/src/components/ha-area-picker.ts
@@ -366,6 +366,7 @@ export class HaAreaPicker extends LitElement {
.hass=${this.hass}
.autofocus=${this.autofocus}
.label=${this.label}
+ .helper=${this.helper}
.notFoundLabel=${this.hass.localize(
"ui.components.area-picker.no_match"
)}
diff --git a/src/components/ha-areas-floors-display-editor.ts b/src/components/ha-areas-floors-display-editor.ts
index 5b372f932f..539df7ab09 100644
--- a/src/components/ha-areas-floors-display-editor.ts
+++ b/src/components/ha-areas-floors-display-editor.ts
@@ -78,6 +78,7 @@ export class HaAreasFloorsDisplayEditor extends LitElement {
handle-selector=".handle"
@item-moved=${this._floorMoved}
.disabled=${this.disabled || !canReorderFloors}
+ invert-swap
>
${repeat(
diff --git a/src/components/ha-code-editor.ts b/src/components/ha-code-editor.ts
index 5cb78c7193..69387c89a3 100644
--- a/src/components/ha-code-editor.ts
+++ b/src/components/ha-code-editor.ts
@@ -584,11 +584,14 @@ export class HaCodeEditor extends ReactiveElement {
:host(.fullscreen) {
position: fixed !important;
- top: var(--header-height, 56px) !important;
- left: 0 !important;
- right: 0 !important;
- bottom: 0 !important;
+ top: calc(var(--header-height, 56px) + 8px) !important;
+ left: 8px !important;
+ right: 8px !important;
+ bottom: 8px !important;
z-index: 9999 !important;
+ border-radius: 12px !important;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3) !important;
+ overflow: hidden !important;
background-color: var(
--code-editor-background-color,
var(--card-background-color)
diff --git a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts
index f9f4c28ec2..5cabb41266 100644
--- a/src/panels/config/automation/trigger/ha-automation-trigger-row.ts
+++ b/src/panels/config/automation/trigger/ha-automation-trigger-row.ts
@@ -566,6 +566,7 @@ export default class HaAutomationTriggerRow extends LitElement {
text: html`
diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts
index 34f511b9c0..c062dc699f 100644
--- a/src/panels/config/devices/ha-config-device-page.ts
+++ b/src/panels/config/devices/ha-config-device-page.ts
@@ -10,7 +10,7 @@ import {
mdiPlusCircle,
mdiRestore,
} from "@mdi/js";
-import type { CSSResultGroup, TemplateResult } from "lit";
+import type { CSSResultGroup, PropertyValues, TemplateResult } from "lit";
import { LitElement, css, html, nothing } from "lit";
import { customElement, property, state } from "lit/decorators";
import { ifDefined } from "lit/directives/if-defined";
@@ -273,22 +273,24 @@ export class HaConfigDevicePage extends LitElement {
findBatteryChargingEntity(this.hass, entities)
);
- public willUpdate(changedProps) {
+ public willUpdate(changedProps: PropertyValues) {
super.willUpdate(changedProps);
- if (changedProps.has("deviceId") || changedProps.has("entries")) {
+ if (changedProps.has("deviceId")) {
this._deviceActions = [];
this._deviceAlerts = [];
this._deleteButtons = [];
this._diagnosticDownloadLinks = [];
+ }
+
+ if (changedProps.has("deviceId") || changedProps.has("entries")) {
this._fetchData();
}
}
- protected firstUpdated(changedProps) {
+ protected firstUpdated(changedProps: PropertyValues) {
super.firstUpdated(changedProps);
loadDeviceRegistryDetailDialog();
- this._fetchData();
}
protected updated(changedProps) {
@@ -989,6 +991,7 @@ export class HaConfigDevicePage extends LitElement {
}
private _getDeleteActions() {
+ const deviceId = this.deviceId;
const device = this.hass.devices[this.deviceId];
if (!device) {
@@ -1058,12 +1061,18 @@ export class HaConfigDevicePage extends LitElement {
}
);
+ if (this.deviceId !== deviceId) {
+ // abort if the device has changed
+ return;
+ }
+
if (buttons.length > 0) {
this._deleteButtons = buttons;
}
}
private async _getDeviceActions() {
+ const deviceId = this.deviceId;
const device = this.hass.devices[this.deviceId];
if (!device) {
@@ -1157,14 +1166,25 @@ export class HaConfigDevicePage extends LitElement {
// load matter device actions async to avoid an UI with 0 actions when the matter integration needs very long to get node diagnostics
matter.getMatterDeviceActions(this, this.hass, device).then((actions) => {
+ if (this.deviceId !== deviceId) {
+ // abort if the device has changed
+ return;
+ }
this._deviceActions = [...actions, ...(this._deviceActions || [])];
});
}
+ if (this.deviceId !== deviceId) {
+ // abort if the device has changed
+ return;
+ }
+
this._deviceActions = deviceActions;
}
private async _getDeviceAlerts() {
+ const deviceId = this.deviceId;
+
const device = this.hass.devices[this.deviceId];
if (!device) {
@@ -1188,6 +1208,11 @@ export class HaConfigDevicePage extends LitElement {
deviceAlerts.push(...alerts);
}
+ if (this.deviceId !== deviceId) {
+ // abort if the device has changed
+ return;
+ }
+
this._deviceAlerts = deviceAlerts;
if (deviceAlerts.length) {
this._deviceAlertsActionsTimeout = window.setTimeout(() => {
diff --git a/src/panels/config/integrations/ha-config-integrations-dashboard.ts b/src/panels/config/integrations/ha-config-integrations-dashboard.ts
index 3cb99481cd..f3a8e1eb4a 100644
--- a/src/panels/config/integrations/ha-config-integrations-dashboard.ts
+++ b/src/panels/config/integrations/ha-config-integrations-dashboard.ts
@@ -406,11 +406,7 @@ class HaConfigIntegrationsDashboard extends KeyboardShortcutMixin(
${!this._showDisabled && this.narrow && disabledConfigEntries.length
? html`${disabledConfigEntries.length}`
: ""}
-
+