From a580904c5276412fe0cc71d75f28607e0b47d9d4 Mon Sep 17 00:00:00 2001 From: Bram Kragten Date: Thu, 2 Dec 2021 23:29:52 +0100 Subject: [PATCH] Use chips for button rows (#10770) --- src/components/ha-chip.ts | 12 +- .../lovelace/cards/hui-entities-card.ts | 10 +- .../lovelace/components/hui-buttons-base.ts | 116 +++++++++++------- .../hui-buttons-header-footer.ts | 36 +++++- .../header-footer/hui-graph-header-footer.ts | 2 + .../hui-picture-header-footer.ts | 2 + src/panels/lovelace/types.ts | 1 + 7 files changed, 129 insertions(+), 50 deletions(-) diff --git a/src/components/ha-chip.ts b/src/components/ha-chip.ts index 9f58e3c53c..ce6363e512 100644 --- a/src/components/ha-chip.ts +++ b/src/components/ha-chip.ts @@ -14,11 +14,17 @@ import { customElement, property } from "lit/decorators"; export class HaChip extends LitElement { @property({ type: Boolean }) public hasIcon = false; + @property({ type: Boolean }) public noText = false; + protected render(): TemplateResult { return html`
${this.hasIcon - ? html`
+ ? html`
` : null} @@ -51,6 +57,10 @@ export class HaChip extends LitElement { --mdc-icon-size: 20px; color: var(--ha-chip-icon-color, var(--ha-chip-text-color)); } + .mdc-chip + .mdc-chip__icon--leading:not(.mdc-chip__icon--leading-hidden).no-text { + margin-right: -4px; + } `; } } diff --git a/src/panels/lovelace/cards/hui-entities-card.ts b/src/panels/lovelace/cards/hui-entities-card.ts index b1a1e7d5c7..2e9cca12a4 100644 --- a/src/panels/lovelace/cards/hui-entities-card.ts +++ b/src/panels/lovelace/cards/hui-entities-card.ts @@ -134,7 +134,10 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { } if (this._config.header) { - this._headerElement = createHeaderFooterElement(this._config.header); + this._headerElement = createHeaderFooterElement( + this._config.header + ) as LovelaceHeaderFooter; + this._headerElement.type = "header"; if (this._hass) { this._headerElement.hass = this._hass; } @@ -143,7 +146,10 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard { } if (this._config.footer) { - this._footerElement = createHeaderFooterElement(this._config.footer); + this._footerElement = createHeaderFooterElement( + this._config.footer + ) as LovelaceHeaderFooter; + this._footerElement.type = "footer"; if (this._hass) { this._footerElement.hass = this._hass; } diff --git a/src/panels/lovelace/components/hui-buttons-base.ts b/src/panels/lovelace/components/hui-buttons-base.ts index ac59da37f6..7c5a0c60d4 100644 --- a/src/panels/lovelace/components/hui-buttons-base.ts +++ b/src/panels/lovelace/components/hui-buttons-base.ts @@ -9,6 +9,8 @@ import { computeTooltip } from "../common/compute-tooltip"; import { actionHandler } from "../common/directives/action-handler-directive"; import { handleAction } from "../common/handle-action"; import { hasAction } from "../common/has-action"; +import "../../../components/ha-chip"; +import { haStyleScrollbar } from "../../../resources/styles"; @customElement("hui-buttons-base") export class HuiButtonsBase extends LitElement { @@ -18,40 +20,46 @@ export class HuiButtonsBase extends LitElement { protected render(): TemplateResult { return html` - ${(this.configEntities || []).map((entityConf) => { - const stateObj = this.hass.states[entityConf.entity]; +
+ ${(this.configEntities || []).map((entityConf) => { + const stateObj = this.hass.states[entityConf.entity]; - return html` -
- ${entityConf.show_icon !== false - ? html` - - ` - : ""} - - ${(entityConf.show_name && stateObj) || - (entityConf.name && entityConf.show_name !== false) - ? entityConf.name || computeStateName(stateObj) + const name = + (entityConf.show_name && stateObj) || + (entityConf.name && entityConf.show_name !== false) + ? entityConf.name || computeStateName(stateObj) + : ""; + + return html` + + ${entityConf.show_icon !== false + ? html` + + ` : ""} - -
- `; - })} + ${name} + + `; + })} +
`; } @@ -61,20 +69,36 @@ export class HuiButtonsBase extends LitElement { } static get styles(): CSSResultGroup { - return css` - :host { - display: flex; - justify-content: space-evenly; - flex-wrap: wrap; - padding: 0 8px; - } - div { - cursor: pointer; - align-items: center; - display: inline-flex; - outline: none; - } - `; + return [ + haStyleScrollbar, + css` + .ha-scrollbar { + padding: 8px; + padding-top: var(--padding-top, 8px); + padding-bottom: var(--padding-bottom, 8px); + width: 100%; + overflow-x: auto; + overflow-y: hidden; + white-space: nowrap; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + } + state-badge { + line-height: inherit; + text-align: start; + color: var(--secondary-text-color); + } + ha-chip { + padding: 4px; + } + @media all and (max-width: 450px), all and (max-height: 500px) { + .ha-scrollbar { + flex-wrap: nowrap; + } + } + `, + ]; } } diff --git a/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts b/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts index 01bf77ca05..2a8816347f 100644 --- a/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-buttons-header-footer.ts @@ -1,4 +1,5 @@ -import { html, LitElement, TemplateResult } from "lit"; +import { css, html, LitElement, TemplateResult } from "lit"; +import { classMap } from "lit/directives/class-map"; import { customElement, property, state } from "lit/decorators"; import { computeDomain } from "../../../common/entity/compute_domain"; import { HomeAssistant } from "../../../types"; @@ -19,6 +20,8 @@ export class HuiButtonsHeaderFooter @property({ attribute: false }) public hass?: HomeAssistant; + @property() public type!: "header" | "footer"; + @state() private _configEntities?: EntityConfig[]; public getCardSize(): number { @@ -47,12 +50,43 @@ export class HuiButtonsHeaderFooter protected render(): TemplateResult | void { return html` + ${this.type === "footer" + ? html`` + : ""} + ${this.type === "header" + ? html`` + : ""} `; } + + static styles = css` + .divider { + height: 0; + margin: 16px 0; + list-style-type: none; + border: none; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: var(--divider-color); + } + .divider.header { + margin-top: 0; + } + hui-buttons-base.footer { + --padding-bottom: 16px; + } + hui-buttons-base.header { + --padding-top: 16px; + } + `; } declare global { diff --git a/src/panels/lovelace/header-footer/hui-graph-header-footer.ts b/src/panels/lovelace/header-footer/hui-graph-header-footer.ts index ec03889ba4..e3aa2ced83 100644 --- a/src/panels/lovelace/header-footer/hui-graph-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-graph-header-footer.ts @@ -60,6 +60,8 @@ export class HuiGraphHeaderFooter @property({ attribute: false }) public hass?: HomeAssistant; + @property() public type!: "header" | "footer"; + @property() protected _config?: GraphHeaderFooterConfig; @state() private _coordinates?: number[][]; diff --git a/src/panels/lovelace/header-footer/hui-picture-header-footer.ts b/src/panels/lovelace/header-footer/hui-picture-header-footer.ts index 22e5d904f8..200744f85c 100644 --- a/src/panels/lovelace/header-footer/hui-picture-header-footer.ts +++ b/src/panels/lovelace/header-footer/hui-picture-header-footer.ts @@ -34,6 +34,8 @@ export class HuiPictureHeaderFooter @property({ attribute: false }) public hass?: HomeAssistant; + @property() public type!: "header" | "footer"; + @property() protected _config?: PictureHeaderFooterConfig; public getCardSize(): number { diff --git a/src/panels/lovelace/types.ts b/src/panels/lovelace/types.ts index 070c5ef761..b2db755a67 100644 --- a/src/panels/lovelace/types.ts +++ b/src/panels/lovelace/types.ts @@ -68,6 +68,7 @@ export interface LovelaceRowConstructor extends Constructor { export interface LovelaceHeaderFooter extends HTMLElement { hass?: HomeAssistant; + type: "header" | "footer"; getCardSize(): number | Promise; setConfig(config: LovelaceHeaderFooterConfig): void; }