From 12bbba1bff04f1ee140bd214eeec6171e7cf548d Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 7 May 2025 07:11:34 +0200 Subject: [PATCH 1/7] fix height of stats graph card in section (#25344) --- src/panels/lovelace/cards/hui-statistics-graph-card.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/panels/lovelace/cards/hui-statistics-graph-card.ts b/src/panels/lovelace/cards/hui-statistics-graph-card.ts index 061f8f9b64..d7be2a06d2 100644 --- a/src/panels/lovelace/cards/hui-statistics-graph-card.ts +++ b/src/panels/lovelace/cards/hui-statistics-graph-card.ts @@ -268,6 +268,7 @@ export class HuiStatisticsGraphCard extends LitElement implements LovelaceCard {
Date: Wed, 7 May 2025 04:40:38 -0400 Subject: [PATCH 2/7] Update network browser descriptions (#25345) --- src/translations/en.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/translations/en.json b/src/translations/en.json index 69b6e55f76..6d9e99d474 100644 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -6407,11 +6407,11 @@ "title": "Network discovery", "description": "Explore what data Home Assistant can see on the network.", "dhcp": "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.", + "dhcp_info": "Show devices detected using methods like DHCP, ARP+PTR lookups, and router-based device trackers.", "ssdp": "SSDP browser", - "ssdp_info": "Show devices discovered by Home Assistant using SSDP/UPnP. Devices that Home Assistant has discovered will appear here.", + "ssdp_info": "Show devices discovered using SSDP/UPnP.", "zeroconf": "Zeroconf browser", - "zeroconf_info": "Show devices discovered by Home Assistant using mDNS. Only devices that Home Assistant is actively searching for will appear here." + "zeroconf_info": "Show services discovered using mDNS. Does not include services unknown to Home Assistant." }, "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 24736e36ff7533c352cc2b8d6a188e8d8cc38cf8 Mon Sep 17 00:00:00 2001 From: Petar Petrov Date: Wed, 7 May 2025 11:43:30 +0300 Subject: [PATCH 3/7] Set <=0 chart values to null so they render as gaps on a log graph (#25347) --- src/components/chart/ha-chart-base.ts | 28 +++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/components/chart/ha-chart-base.ts b/src/components/chart/ha-chart-base.ts index 0fae4ecc53..fab103ebc2 100644 --- a/src/components/chart/ha-chart-base.ts +++ b/src/components/chart/ha-chart-base.ts @@ -600,12 +600,32 @@ export class HaChartBase extends LitElement { } private _getSeries() { - if (!Array.isArray(this.data)) { - return this.data; - } - return this.data.filter( + const series = ensureArray(this.data).filter( (d) => !this._hiddenDatasets.has(String(d.name ?? d.id)) ); + const yAxis = (this.options?.yAxis?.[0] ?? this.options?.yAxis) as + | YAXisOption + | undefined; + if (yAxis?.type === "log") { + // set <=0 values to null so they render as gaps on a log graph + return series.map((d) => + d.type === "line" + ? { + ...d, + data: d.data?.map((v) => + Array.isArray(v) + ? [ + v[0], + typeof v[1] !== "number" || v[1] > 0 ? v[1] : null, + ...v.slice(2), + ] + : v + ), + } + : d + ); + } + return series; } private _getDefaultHeight() { From 467a5bef0b26ed15191fea7e7eae2f74736df8be Mon Sep 17 00:00:00 2001 From: Wendelin <12148533+wendevlin@users.noreply.github.com> Date: Wed, 7 May 2025 10:30:36 +0200 Subject: [PATCH 4/7] Fix data-table search clear button alignment (#25348) --- src/components/search-input-outlined.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/search-input-outlined.ts b/src/components/search-input-outlined.ts index bc43b88ecc..44eca97e29 100644 --- a/src/components/search-input-outlined.ts +++ b/src/components/search-input-outlined.ts @@ -85,7 +85,6 @@ class SearchInputOutlined extends LitElement { display: inline-flex; /* For iOS */ z-index: 0; - --mdc-icon-button-size: 24px; } ha-outlined-text-field { display: block; @@ -94,6 +93,8 @@ class SearchInputOutlined extends LitElement { } ha-svg-icon, ha-icon-button { + --mdc-icon-button-size: 24px; + height: var(--mdc-icon-button-size); display: flex; color: var(--primary-text-color); } From 8494d0542ec168c2a9e118c48e2209dd04ed8e5a Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 7 May 2025 10:45:48 +0200 Subject: [PATCH 5/7] Bumped version to 20250507.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5d879a754a..5d0717ac3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "home-assistant-frontend" -version = "20250506.0" +version = "20250507.0" license = "Apache-2.0" license-files = ["LICENSE*"] description = "The Home Assistant frontend" From 80dddc9eef03f7341fe9c0c039d396291408a740 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Wed, 7 May 2025 12:30:26 +0200 Subject: [PATCH 6/7] Only enable drag scroll controller when needed (#25351) --- .../controllers/drag-scroll-controller.ts | 44 +++++++++++++++++-- src/panels/lovelace/views/hui-view-header.ts | 6 +++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/common/controllers/drag-scroll-controller.ts b/src/common/controllers/drag-scroll-controller.ts index cefb9adad5..c7f5349585 100644 --- a/src/common/controllers/drag-scroll-controller.ts +++ b/src/common/controllers/drag-scroll-controller.ts @@ -9,6 +9,7 @@ import type { LitElement } from "lit"; */ export interface DragScrollControllerConfig { selector: string; + enabled?: boolean; } export class DragScrollController implements ReactiveController { @@ -28,19 +29,47 @@ export class DragScrollController implements ReactiveController { private _scrollContainer?: HTMLElement | null; + private _enabled = true; + + public get enabled(): boolean { + return this._enabled; + } + + public set enabled(value: boolean) { + if (value === this._enabled) { + return; + } + this._enabled = value; + if (this._enabled) { + this._attach(); + } else { + this._detach(); + } + this._host.requestUpdate(); + } + constructor( host: ReactiveControllerHost & LitElement, - { selector }: DragScrollControllerConfig + { selector, enabled }: DragScrollControllerConfig ) { this._selector = selector; this._host = host; + this.enabled = enabled ?? true; host.addController(this); } hostUpdated() { - if (this._scrollContainer) { + if (!this.enabled || this._scrollContainer) { return; } + this._attach(); + } + + hostDisconnected() { + this._detach(); + } + + private _attach() { this._scrollContainer = this._host.renderRoot?.querySelector( this._selector ); @@ -49,9 +78,18 @@ export class DragScrollController implements ReactiveController { } } - hostDisconnected() { + private _detach() { window.removeEventListener("mousemove", this._mouseMove); window.removeEventListener("mouseup", this._mouseUp); + if (this._scrollContainer) { + this._scrollContainer.removeEventListener("mousedown", this._mouseDown); + this._scrollContainer = undefined; + } + this.scrolled = false; + this.scrolling = false; + this.mouseIsDown = false; + this.scrollStartX = 0; + this.scrollLeft = 0; } private _mouseDown = (event: MouseEvent) => { diff --git a/src/panels/lovelace/views/hui-view-header.ts b/src/panels/lovelace/views/hui-view-header.ts index b4ef30037a..27e08b88de 100644 --- a/src/panels/lovelace/views/hui-view-header.ts +++ b/src/panels/lovelace/views/hui-view-header.ts @@ -54,6 +54,7 @@ export class HuiViewHeader extends LitElement { private _dragScrollController = new DragScrollController(this, { selector: ".scroll", + enabled: false, }); connectedCallback(): void { @@ -81,6 +82,11 @@ export class HuiViewHeader extends LitElement { this._checkHidden(); } + if (changedProperties.has("config") || changedProperties.has("lovelace")) { + this._dragScrollController.enabled = + !this.lovelace.editMode && this.config?.badges_wrap === "scroll"; + } + if (changedProperties.has("config")) { if (this.config?.card) { this.card = this._createCardElement(this.config.card); From 603663e0ccea772c0590934b525d8fd3d6c83ae8 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Wed, 7 May 2025 12:39:25 +0200 Subject: [PATCH 7/7] Fix badge overlay in scrolling mode (#25352) Co-authored-by: Bram Kragten --- src/panels/lovelace/badges/hui-view-badges.ts | 25 ++++++++++++++++--- src/panels/lovelace/views/hui-view-header.ts | 15 ++++++----- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/panels/lovelace/badges/hui-view-badges.ts b/src/panels/lovelace/badges/hui-view-badges.ts index f04d33a59c..68d708fa2a 100644 --- a/src/panels/lovelace/badges/hui-view-badges.ts +++ b/src/panels/lovelace/badges/hui-view-badges.ts @@ -206,12 +206,29 @@ export class HuiViewBadges extends LitElement { margin: 0; } - .badges > * { - min-width: fit-content; + /* Use before and after because padding doesn't work well with scrolling */ + .badges::before, + .badges::after { + content: ""; + position: relative; + display: block; + min-width: var(--badge-padding, 0px); + height: 16px; + background-color: transparent; + } + .badges::before { + margin-left: -8px; + margin-inline-start: -8px; + margin-inline-end: 0; + } + .badges::after { + margin-right: -8px; + margin-inline-end: -8px; + margin-inline-start: 0; } - .badges > *:last-child:not(.add) { - padding-right: var(--badges-padding-right, 0); + .badges > * { + min-width: fit-content; } hui-badge-edit-mode { diff --git a/src/panels/lovelace/views/hui-view-header.ts b/src/panels/lovelace/views/hui-view-header.ts index 27e08b88de..6bf3b6445a 100644 --- a/src/panels/lovelace/views/hui-view-header.ts +++ b/src/panels/lovelace/views/hui-view-header.ts @@ -202,6 +202,9 @@ export class HuiViewHeader extends LitElement { this.config?.badges_position ?? DEFAULT_VIEW_HEADER_BADGES_POSITION; const badgesWrap = this.config?.badges_wrap ?? DEFAULT_VIEW_HEADER_BADGES_WRAP; + const badgeDragging = this._dragScrollController.scrolling + ? "dragging" + : ""; const hasHeading = card !== undefined; const hasBadges = this.badges.length > 0; @@ -264,10 +267,7 @@ export class HuiViewHeader extends LitElement { ${this.lovelace && (editMode || this.badges.length > 0) ? html`