import { css, html, LitElement, nothing } from "lit"; import { customElement, property } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import { ifDefined } from "lit/directives/if-defined"; import "./ha-ripple"; type BadgeType = "badge" | "button"; @customElement("ha-badge") export class HaBadge extends LitElement { @property() public type: BadgeType = "badge"; @property() public label?: string; @property({ type: Boolean, attribute: "icon-only" }) iconOnly = false; protected render() { const label = this.label; return html`
${this.iconOnly ? nothing : html` ${label ? html`${label}` : nothing} `}
`; } static styles = css` :host { --badge-color: var(--secondary-text-color); -webkit-tap-highlight-color: transparent; } .badge { position: relative; --ha-ripple-color: var(--badge-color); --ha-ripple-hover-opacity: 0.04; --ha-ripple-pressed-opacity: 0.12; transition: box-shadow 180ms ease-in-out, border-color 180ms ease-in-out; display: flex; flex-direction: row; align-items: center; justify-content: center; gap: var(--ha-space-2); height: var(--ha-badge-size, 36px); min-width: var(--ha-badge-size, 36px); padding: 0px 12px; box-sizing: border-box; width: auto; border-radius: var( --ha-badge-border-radius, calc(var(--ha-badge-size, 36px) / 2) ); background: var( --ha-card-background, var(--card-background-color, white) ); -webkit-backdrop-filter: var(--ha-card-backdrop-filter, none); backdrop-filter: var(--ha-card-backdrop-filter, none); border-width: var(--ha-card-border-width, 1px); box-shadow: var(--ha-card-box-shadow, none); border-style: solid; border-color: var(--ha-card-border-color, var(--divider-color, #e0e0e0)); } .badge:focus-visible { --shadow-default: var(--ha-card-box-shadow, 0 0 0 0 transparent); --shadow-focus: 0 0 0 1px var(--badge-color); border-color: var(--badge-color); box-shadow: var(--shadow-default), var(--shadow-focus); } [role="button"] { cursor: pointer; } [role="button"]:focus { outline: none; } .info { display: flex; flex-direction: column; align-items: flex-start; padding-inline-start: initial; text-align: center; } .label { font-size: var(--ha-font-size-xs); font-style: normal; font-weight: var(--ha-font-weight-medium); line-height: 10px; letter-spacing: 0.1px; color: var(--secondary-text-color); } .content { font-size: var(--ha-badge-font-size, var(--ha-font-size-s)); font-style: normal; font-weight: var(--ha-font-weight-medium); line-height: var(--ha-line-height-condensed); letter-spacing: 0.1px; color: var(--primary-text-color); } ::slotted([slot="icon"]) { --mdc-icon-size: var(--ha-badge-icon-size, 18px); color: var(--badge-color); line-height: 0; margin-left: -4px; margin-right: 0; margin-inline-start: -4px; margin-inline-end: 0; } ::slotted(img[slot="icon"]) { width: 30px; height: 30px; border-radius: var(--ha-border-radius-circle); object-fit: cover; overflow: hidden; margin-left: -10px; margin-right: 0; margin-inline-start: -10px; margin-inline-end: 0; } .badge.icon-only { padding: 0; } .badge.icon-only ::slotted([slot="icon"]) { margin-left: 0; margin-right: 0; margin-inline-start: 0; margin-inline-end: 0; } `; } declare global { interface HTMLElementTagNameMap { "ha-badge": HaBadge; } }