import { css, CSSResultGroup, html, LitElement } from "lit"; import { customElement, property } from "lit/decorators"; import { classMap } from "lit/directives/class-map"; import { fireEvent } from "../../common/dom/fire_event"; import { NumberSelector } from "../../data/selector"; import { HomeAssistant } from "../../types"; import "../ha-input-helper-text"; import "../ha-slider"; import "../ha-textfield"; @customElement("ha-selector-number") export class HaNumberSelector extends LitElement { @property() public hass!: HomeAssistant; @property() public selector!: NumberSelector; @property() public value?: number; @property() public placeholder?: number; @property() public label?: string; @property() public helper?: string; @property({ type: Boolean }) public required = true; @property({ type: Boolean }) public disabled = false; protected render() { const isBox = this.selector.number?.mode === "box"; return html`
${!isBox ? html` ${this.label ? html`${this.label}${this.required ? " *" : ""}` : ""} ` : ""}
${!isBox && this.helper ? html`${this.helper}` : ""} `; } private _handleInputChange(ev) { ev.stopPropagation(); const value = ev.target.value === "" || isNaN(ev.target.value) ? undefined : Number(ev.target.value); if (this.value === value) { return; } fireEvent(this, "value-changed", { value }); } private _handleSliderChange(ev) { ev.stopPropagation(); const value = Number(ev.target.value); if (this.value === value) { return; } fireEvent(this, "value-changed", { value }); } static get styles(): CSSResultGroup { return css` .input { display: flex; justify-content: space-between; align-items: center; direction: ltr; } ha-slider { flex: 1; } ha-textfield { --ha-textfield-input-width: 40px; } .single { --ha-textfield-input-width: unset; flex: 1; } `; } } declare global { interface HTMLElementTagNameMap { "ha-selector-number": HaNumberSelector; } }