Remove padding from scroll badges

This commit is contained in:
Bram Kragten 2025-05-07 13:02:07 +02:00
parent b823a3b139
commit 3804a4c7cb
3 changed files with 52 additions and 27 deletions

View File

@ -23,6 +23,10 @@ export class DragScrollController implements ReactiveController {
public scrollLeft = 0; public scrollLeft = 0;
public scrolledStart = false;
public scrolledEnd = false;
private _host: ReactiveControllerHost & LitElement; private _host: ReactiveControllerHost & LitElement;
private _selector: string; private _selector: string;
@ -75,6 +79,11 @@ export class DragScrollController implements ReactiveController {
); );
if (this._scrollContainer) { if (this._scrollContainer) {
this._scrollContainer.addEventListener("mousedown", this._mouseDown); this._scrollContainer.addEventListener("mousedown", this._mouseDown);
this._scrollContainer.addEventListener("scroll", this._onScroll);
this.scrolledStart = this._scrollContainer.scrollLeft > 0;
this.scrolledEnd =
this._scrollContainer.scrollLeft + this._scrollContainer.offsetWidth <
this._scrollContainer.scrollWidth;
} }
} }
@ -83,6 +92,7 @@ export class DragScrollController implements ReactiveController {
window.removeEventListener("mouseup", this._mouseUp); window.removeEventListener("mouseup", this._mouseUp);
if (this._scrollContainer) { if (this._scrollContainer) {
this._scrollContainer.removeEventListener("mousedown", this._mouseDown); this._scrollContainer.removeEventListener("mousedown", this._mouseDown);
this._scrollContainer.removeEventListener("scroll", this._onScroll);
this._scrollContainer = undefined; this._scrollContainer = undefined;
} }
this.scrolled = false; this.scrolled = false;
@ -92,6 +102,22 @@ export class DragScrollController implements ReactiveController {
this.scrollLeft = 0; this.scrollLeft = 0;
} }
private _onScroll = (event: Event) => {
const oldScrolledStart = this.scrolledStart;
const oldScrolledEnd = this.scrolledEnd;
const container = event.currentTarget as HTMLElement;
this.scrolledStart = container.scrollLeft > 0;
this.scrolledEnd =
container.scrollLeft + container.offsetWidth < container.scrollWidth;
if (
this.scrolledStart !== oldScrolledStart ||
this.scrolledEnd !== oldScrolledEnd
) {
this._host.requestUpdate();
}
};
private _mouseDown = (event: MouseEvent) => { private _mouseDown = (event: MouseEvent) => {
const scrollContainer = this._scrollContainer; const scrollContainer = this._scrollContainer;

View File

@ -206,27 +206,6 @@ export class HuiViewBadges extends LitElement {
margin: 0; margin: 0;
} }
/* 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 > * { .badges > * {
min-width: fit-content; min-width: fit-content;
} }

View File

@ -202,9 +202,10 @@ export class HuiViewHeader extends LitElement {
this.config?.badges_position ?? DEFAULT_VIEW_HEADER_BADGES_POSITION; this.config?.badges_position ?? DEFAULT_VIEW_HEADER_BADGES_POSITION;
const badgesWrap = const badgesWrap =
this.config?.badges_wrap ?? DEFAULT_VIEW_HEADER_BADGES_WRAP; this.config?.badges_wrap ?? DEFAULT_VIEW_HEADER_BADGES_WRAP;
const badgeDragging = this._dragScrollController.scrolling
? "dragging" const badgeDragging = this._dragScrollController.scrolling;
: ""; const startScrolled = this._dragScrollController.scrolledStart;
const endScrolled = this._dragScrollController.scrolledEnd;
const hasHeading = card !== undefined; const hasHeading = card !== undefined;
const hasBadges = this.badges.length > 0; const hasBadges = this.badges.length > 0;
@ -267,7 +268,13 @@ export class HuiViewHeader extends LitElement {
${this.lovelace && (editMode || this.badges.length > 0) ${this.lovelace && (editMode || this.badges.length > 0)
? html` ? html`
<div <div
class="badges ${badgesPosition} ${badgesWrap} ${badgeDragging}" class="badges ${classMap({
[badgesPosition]: true,
[badgesWrap]: true,
dragging: badgeDragging,
"start-scrolled": startScrolled,
"end-scrolled": endScrolled,
})}"
> >
<hui-view-badges <hui-view-badges
.badges=${this.badges} .badges=${this.badges}
@ -359,6 +366,21 @@ export class HuiViewHeader extends LitElement {
max-width: 100%; max-width: 100%;
scrollbar-color: var(--scrollbar-thumb-color) transparent; scrollbar-color: var(--scrollbar-thumb-color) transparent;
scrollbar-width: none; scrollbar-width: none;
}
.container:not(.edit-mode) .badges.scroll.start-scrolled {
mask-image: linear-gradient(90deg, transparent 0%, black 16px);
}
.container:not(.edit-mode) .badges.scroll.end-scrolled {
mask-image: linear-gradient(
90deg,
black calc(100% - 16px),
transparent 100%
);
}
.container:not(.edit-mode) .badges.scroll.start-scrolled.end-scrolled {
mask-image: linear-gradient( mask-image: linear-gradient(
90deg, 90deg,
transparent 0%, transparent 0%,
@ -403,7 +425,6 @@ export class HuiViewHeader extends LitElement {
.container:not(.edit-mode) .layout.badges-scroll hui-view-badges { .container:not(.edit-mode) .layout.badges-scroll hui-view-badges {
--badges-wrap: nowrap; --badges-wrap: nowrap;
--badges-aligmnent: flex-start; --badges-aligmnent: flex-start;
--badge-padding: 16px;
} }
.container:not(.edit-mode) .layout.center.badges-scroll hui-view-badges { .container:not(.edit-mode) .layout.center.badges-scroll hui-view-badges {
@ -424,7 +445,6 @@ export class HuiViewHeader extends LitElement {
hui-view-badges { hui-view-badges {
--badges-wrap: wrap; --badges-wrap: wrap;
--badges-aligmnent: flex-end; --badges-aligmnent: flex-end;
--badge-padding: 0;
} }
.layout.responsive.has-heading hui-view-badges { .layout.responsive.has-heading hui-view-badges {
--badges-aligmnent: flex-end; --badges-aligmnent: flex-end;