import { css, CSSResultGroup, html, LitElement, TemplateResult, unsafeCSS, } from "lit"; import { customElement, property, state } from "lit/decorators"; import { styleMap } from "lit/directives/style-map"; import { computeAttributeNameDisplay } from "../../common/entity/compute_attribute_display"; import { stateColorCss } from "../../common/entity/state_color"; import "../../components/ha-control-slider"; import { CoverEntity } from "../../data/cover"; import { UNAVAILABLE } from "../../data/entity"; import { DOMAIN_ATTRIBUTES_UNITS } from "../../data/entity_attributes"; import { HomeAssistant } from "../../types"; export function generateTiltSliderTrackBackgroundGradient() { const count = 24; const minStrokeWidth = 0.2; const gradient: [number, string][] = []; for (let i = 0; i < count; i++) { const stopOffset1 = i / count; const stopOffset2 = stopOffset1 + (i / count ** 2) * (1 - minStrokeWidth) + minStrokeWidth / count; if (i !== 0) { gradient.push([stopOffset1, "transparent"]); } gradient.push([stopOffset1, "var(--control-slider-color)"]); gradient.push([stopOffset2, "var(--control-slider-color)"]); gradient.push([stopOffset2, "transparent"]); } return unsafeCSS( gradient .map(([stop, color]) => `${color} ${(stop as number) * 100}%`) .join(", ") ); } const GRADIENT = generateTiltSliderTrackBackgroundGradient(); @customElement("ha-state-control-cover-tilt-position") export class HaStateControlInfoCoverTiltPosition extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @property({ attribute: false }) public stateObj!: CoverEntity; @state() value?: number; protected updated(changedProp: Map): void { if (changedProp.has("stateObj")) { this.value = this.stateObj.attributes.current_tilt_position != null ? Math.round(this.stateObj.attributes.current_tilt_position) : undefined; } } private _valueChanged(ev: CustomEvent) { const value = (ev.detail as any).value; if (isNaN(value)) return; this.hass.callService("cover", "set_cover_tilt_position", { entity_id: this.stateObj!.entity_id, tilt_position: value, }); } protected render(): TemplateResult { const openColor = stateColorCss(this.stateObj, "open"); const color = stateColorCss(this.stateObj); return html`
`; } static get styles(): CSSResultGroup { return css` ha-control-slider { height: 45vh; max-height: 320px; min-height: 200px; --control-slider-thickness: 130px; --control-slider-border-radius: 48px; --control-slider-color: var(--primary-color); --control-slider-background: var(--disabled-color); --control-slider-background-opacity: 0.2; --control-slider-tooltip-font-size: 20px; } .gradient { background: -webkit-linear-gradient(top, ${GRADIENT}); opacity: 0.6; } `; } } declare global { interface HTMLElementTagNameMap { "ha-state-control-cover-tilt-position": HaStateControlInfoCoverTiltPosition; } }