20231130.0 (#18843)

This commit is contained in:
Bram Kragten 2023-11-30 17:19:47 +01:00 committed by GitHub
commit b854d23431
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 346 additions and 293 deletions

View File

@ -27,13 +27,13 @@
"dependencies": { "dependencies": {
"@babel/runtime": "7.23.4", "@babel/runtime": "7.23.4",
"@braintree/sanitize-url": "6.0.4", "@braintree/sanitize-url": "6.0.4",
"@codemirror/autocomplete": "6.11.0", "@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.0", "@codemirror/commands": "6.3.1",
"@codemirror/language": "6.9.2", "@codemirror/language": "6.9.3",
"@codemirror/legacy-modes": "6.3.3", "@codemirror/legacy-modes": "6.3.3",
"@codemirror/search": "6.5.4", "@codemirror/search": "6.5.5",
"@codemirror/state": "6.3.1", "@codemirror/state": "6.3.2",
"@codemirror/view": "6.22.0", "@codemirror/view": "6.22.1",
"@egjs/hammerjs": "2.0.17", "@egjs/hammerjs": "2.0.17",
"@formatjs/intl-datetimeformat": "6.12.0", "@formatjs/intl-datetimeformat": "6.12.0",
"@formatjs/intl-displaynames": "6.6.4", "@formatjs/intl-displaynames": "6.6.4",
@ -91,8 +91,8 @@
"@polymer/paper-toast": "3.0.1", "@polymer/paper-toast": "3.0.1",
"@polymer/polymer": "3.5.1", "@polymer/polymer": "3.5.1",
"@thomasloven/round-slider": "0.6.0", "@thomasloven/round-slider": "0.6.0",
"@vaadin/combo-box": "24.2.3", "@vaadin/combo-box": "24.2.4",
"@vaadin/vaadin-themable-mixin": "24.2.3", "@vaadin/vaadin-themable-mixin": "24.2.4",
"@vibrant/color": "3.2.1-alpha.1", "@vibrant/color": "3.2.1-alpha.1",
"@vibrant/core": "3.2.1-alpha.1", "@vibrant/core": "3.2.1-alpha.1",
"@vibrant/quantizer-mmcq": "3.2.1-alpha.1", "@vibrant/quantizer-mmcq": "3.2.1-alpha.1",

View File

@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "home-assistant-frontend" name = "home-assistant-frontend"
version = "20231129.1" version = "20231130.0"
license = {text = "Apache-2.0"} license = {text = "Apache-2.0"}
description = "The Home Assistant frontend" description = "The Home Assistant frontend"
readme = "README.md" readme = "README.md"

View File

@ -21,6 +21,7 @@ import {
DataEntryFlowStepForm, DataEntryFlowStepForm,
} from "../data/data_entry_flow"; } from "../data/data_entry_flow";
import "./ha-auth-form"; import "./ha-auth-form";
import { fireEvent } from "../common/dom/fire_event";
type State = "loading" | "error" | "step"; type State = "loading" | "error" | "step";
@ -85,10 +86,6 @@ export class HaAuthFlow extends LitElement {
protected render() { protected render() {
return html` return html`
<style> <style>
ha-auth-flow .action {
margin: 24px 0 8px;
text-align: center;
}
ha-auth-flow .store-token { ha-auth-flow .store-token {
margin-left: -16px; margin-left: -16px;
} }
@ -158,14 +155,25 @@ export class HaAuthFlow extends LitElement {
} }
private _renderForm() { private _renderForm() {
const showBack =
this.step?.type === "form" &&
this.authProvider?.users &&
!["select_mfa_module", "mfa"].includes(this.step.step_id);
switch (this._state) { switch (this._state) {
case "step": case "step":
if (this.step == null) { if (this.step == null) {
return nothing; return nothing;
} }
return html` return html`
${this._renderStep(this.step)} ${this._renderStep(this.step)}
<div class="action"> <div class="action ${showBack ? "space-between" : ""}">
${showBack
? html`<mwc-button @click=${this._localFlow}>
${this.localize("ui.panel.page-authorize.form.previous")}
</mwc-button>`
: nothing}
<mwc-button <mwc-button
raised raised
@click=${this._handleSubmit} @click=${this._handleSubmit}
@ -294,7 +302,8 @@ export class HaAuthFlow extends LitElement {
redirectWithAuthCode( redirectWithAuthCode(
this.redirectUri!, this.redirectUri!,
data.result, data.result,
this.oauth2State this.oauth2State,
this.storeToken
); );
return; return;
} }
@ -375,7 +384,8 @@ export class HaAuthFlow extends LitElement {
redirectWithAuthCode( redirectWithAuthCode(
this.redirectUri!, this.redirectUri!,
newStep.result, newStep.result,
this.oauth2State this.oauth2State,
this.storeToken
); );
return; return;
} }
@ -390,6 +400,10 @@ export class HaAuthFlow extends LitElement {
this._submitting = false; this._submitting = false;
} }
} }
private _localFlow() {
fireEvent(this, "default-login-flow", { value: false });
}
} }
declare global { declare global {

View File

@ -116,6 +116,16 @@ export class HaAuthorize extends litLocalizeLiteMixin(LitElement) {
position: relative; position: relative;
padding: 16px; padding: 16px;
} }
.action {
margin: 16px 0 8px;
display: flex;
width: 100%;
max-width: 336px;
justify-content: center;
}
.space-between {
justify-content: space-between;
}
.footer { .footer {
padding-top: 8px; padding-top: 8px;
display: flex; display: flex;
@ -164,7 +174,10 @@ export class HaAuthorize extends litLocalizeLiteMixin(LitElement) {
</ha-alert>` </ha-alert>`
: nothing} : nothing}
<div class="card-content"> <div
class="card-content"
@default-login-flow=${this._handleDefaultLoginFlow}
>
${!this._authProvider ${!this._authProvider
? html`<p> ? html`<p>
${this.localize("ui.panel.page-authorize.initializing")} ${this.localize("ui.panel.page-authorize.initializing")}
@ -181,7 +194,6 @@ export class HaAuthorize extends litLocalizeLiteMixin(LitElement) {
.authProviders=${this._authProviders} .authProviders=${this._authProviders}
.localize=${this.localize} .localize=${this.localize}
.ownInstance=${this._ownInstance} .ownInstance=${this._ownInstance}
@default-login-flow=${this._handleDefaultLoginFlow}
></ha-local-auth-flow>` ></ha-local-auth-flow>`
: html`<ha-auth-flow : html`<ha-auth-flow
.clientId=${this.clientId} .clientId=${this.clientId}
@ -315,8 +327,8 @@ export class HaAuthorize extends litLocalizeLiteMixin(LitElement) {
} }
} }
private _handleDefaultLoginFlow() { private _handleDefaultLoginFlow(ev) {
this._forceDefaultLogin = true; this._forceDefaultLogin = ev.detail.value;
} }
private async _handleAuthProviderPick(ev) { private async _handleAuthProviderPick(ev) {

View File

@ -17,7 +17,7 @@ import {
submitLoginFlow, submitLoginFlow,
} from "../data/auth"; } from "../data/auth";
import { DataEntryFlowStep } from "../data/data_entry_flow"; import { DataEntryFlowStep } from "../data/data_entry_flow";
import { listPersons } from "../data/person"; import { BasePerson, listUserPersons } from "../data/person";
import "./ha-auth-textfield"; import "./ha-auth-textfield";
import type { HaAuthTextField } from "./ha-auth-textfield"; import type { HaAuthTextField } from "./ha-auth-textfield";
@ -43,7 +43,7 @@ export class HaLocalAuthFlow extends LitElement {
@state() private _submitting = false; @state() private _submitting = false;
@state() private _persons?: Promise<Record<string, string>>; @state() private _persons?: Record<string, BasePerson>;
@state() private _selectedUser?: string; @state() private _selectedUser?: string;
@ -65,7 +65,9 @@ export class HaLocalAuthFlow extends LitElement {
if (!this.authProvider?.users || !this._persons) { if (!this.authProvider?.users || !this._persons) {
return nothing; return nothing;
} }
const userIds = Object.keys(this.authProvider.users); const userIds = Object.keys(this.authProvider.users).filter(
(userId) => userId in this._persons!
);
return html` return html`
<style> <style>
.content { .content {
@ -146,16 +148,6 @@ export class HaLocalAuthFlow extends LitElement {
height: 120px; height: 120px;
--person-badge-font-size: 3em; --person-badge-font-size: 3em;
} }
.action {
margin: 16px 0 8px;
display: flex;
width: 100%;
max-width: 336px;
justify-content: center;
}
.space-between {
justify-content: space-between;
}
ha-list-item { ha-list-item {
margin-top: 16px; margin-top: 16px;
} }
@ -198,9 +190,9 @@ export class HaLocalAuthFlow extends LitElement {
: this._selectedUser : this._selectedUser
? html`<div class="login-form"><div class="person"> ? html`<div class="login-form"><div class="person">
<ha-person-badge <ha-person-badge
.person=${this._persons![this._selectedUser]} .person=${this._persons[this._selectedUser]}
></ha-person-badge> ></ha-person-badge>
<p>${this._persons![this._selectedUser].name}</p> <p>${this._persons[this._selectedUser].name}</p>
</div> </div>
<form> <form>
<input <input
@ -273,6 +265,7 @@ export class HaLocalAuthFlow extends LitElement {
> >
${userIds.map((userId) => { ${userIds.map((userId) => {
const person = this._persons![userId]; const person = this._persons![userId];
return html`<div return html`<div
class="person" class="person"
.userId=${userId} .userId=${userId}
@ -316,7 +309,12 @@ export class HaLocalAuthFlow extends LitElement {
} }
private async _load() { private async _load() {
this._persons = await (await listPersons()).json(); try {
this._persons = await listUserPersons();
} catch {
this._persons = {};
this._error = "Failed to fetch persons";
}
} }
private _restart() { private _restart() {
@ -353,7 +351,8 @@ export class HaLocalAuthFlow extends LitElement {
redirectWithAuthCode( redirectWithAuthCode(
this.redirectUri!, this.redirectUri!,
data.result, data.result,
this.oauth2State this.oauth2State,
true
); );
return; return;
} }
@ -374,7 +373,8 @@ export class HaLocalAuthFlow extends LitElement {
redirectWithAuthCode( redirectWithAuthCode(
this.redirectUri!, this.redirectUri!,
result.result, result.result,
this.oauth2State this.oauth2State,
true
); );
return; return;
} }
@ -433,7 +433,8 @@ export class HaLocalAuthFlow extends LitElement {
redirectWithAuthCode( redirectWithAuthCode(
this.redirectUri!, this.redirectUri!,
newStep.result, newStep.result,
this.oauth2State this.oauth2State,
true
); );
return; return;
} }
@ -462,7 +463,7 @@ export class HaLocalAuthFlow extends LitElement {
} }
private _otherLogin() { private _otherLogin() {
fireEvent(this, "default-login-flow"); fireEvent(this, "default-login-flow", { value: true });
} }
} }
@ -471,6 +472,6 @@ declare global {
"ha-local-auth-flow": HaLocalAuthFlow; "ha-local-auth-flow": HaLocalAuthFlow;
} }
interface HASSDomEvents { interface HASSDomEvents {
"default-login-flow": undefined; "default-login-flow": { value: boolean };
} }
} }

View File

@ -303,6 +303,11 @@ export class StateHistoryCharts extends LitElement {
padding-right: 1px; padding-right: 1px;
} }
.entry-container:not(:first-child) {
border-top: 2px solid var(--divider-color);
margin-top: 16px;
}
.container, .container,
lit-virtualizer { lit-virtualizer {
height: 100%; height: 100%;

View File

@ -17,7 +17,7 @@ class HaFaded extends LitElement {
@click=${this._showContent} @click=${this._showContent}
> >
<slot <slot
@iron-resize=${ @content-resize=${
// ha-markdown-element fire this when render is complete // ha-markdown-element fire this when render is complete
this._setShowContent this._setShowContent
} }
@ -79,4 +79,7 @@ declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
"ha-faded": HaFaded; "ha-faded": HaFaded;
} }
interface HASSDomEvents {
"content-resize": undefined;
}
} }

View File

@ -99,7 +99,7 @@ class HaMarkdownElement extends ReactiveElement {
} }
} }
private _resize = () => fireEvent(this, "iron-resize"); private _resize = () => fireEvent(this, "content-resize");
} }
declare global { declare global {

View File

@ -136,7 +136,7 @@ export class HaMap extends ReactiveElement {
autoFitRequired = true; autoFitRequired = true;
} }
if (this.autoFit && autoFitRequired) { if (changedProps.has("_loaded") || (this.autoFit && autoFitRequired)) {
this.fitMap(); this.fitMap();
} }
@ -155,10 +155,11 @@ export class HaMap extends ReactiveElement {
} }
private _updateMapStyle(): void { private _updateMapStyle(): void {
const darkMode = this.darkMode ?? this.hass.themes.darkMode; const darkMode = this.darkMode ?? this.hass.themes.darkMode ?? false;
const forcedDark = this.darkMode ?? false;
const map = this.shadowRoot!.getElementById("map"); const map = this.shadowRoot!.getElementById("map");
map!.classList.toggle("dark", darkMode); map!.classList.toggle("dark", darkMode);
map!.classList.toggle("forced-dark", this.darkMode); map!.classList.toggle("forced-dark", forcedDark);
} }
private async _loadMap(): Promise<void> { private async _loadMap(): Promise<void> {

View File

@ -2,12 +2,12 @@ import { css, CSSResultGroup, html, LitElement, nothing } from "lit";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import { classMap } from "lit/directives/class-map"; import { classMap } from "lit/directives/class-map";
import { styleMap } from "lit/directives/style-map"; import { styleMap } from "lit/directives/style-map";
import { Person } from "../../data/person"; import { BasePerson } from "../../data/person";
import { computeUserInitials } from "../../data/user"; import { computeUserInitials } from "../../data/user";
@customElement("ha-person-badge") @customElement("ha-person-badge")
class PersonBadge extends LitElement { class PersonBadge extends LitElement {
@property({ attribute: false }) public person?: Person; @property({ attribute: false }) public person?: BasePerson;
protected render() { protected render() {
if (!this.person) { if (!this.person) {

View File

@ -130,8 +130,8 @@ export const areaCompare =
const indexA = order ? order.indexOf(a) : -1; const indexA = order ? order.indexOf(a) : -1;
const indexB = order ? order.indexOf(b) : 1; const indexB = order ? order.indexOf(b) : 1;
if (indexA === -1 && indexB === -1) { if (indexA === -1 && indexB === -1) {
const nameA = entries?.[a].name ?? a; const nameA = entries?.[a]?.name ?? a;
const nameB = entries?.[b].name ?? b; const nameB = entries?.[b]?.name ?? b;
return stringCompare(nameA, nameB); return stringCompare(nameA, nameB);
} }
if (indexA === -1) { if (indexA === -1) {

View File

@ -80,7 +80,8 @@ export const deleteLoginFlow = (flow_id) =>
export const redirectWithAuthCode = ( export const redirectWithAuthCode = (
url: string, url: string,
authCode: string, authCode: string,
oauth2State: string | undefined oauth2State: string | undefined,
storeToken: boolean
) => { ) => {
// OAuth 2: 3.1.2 we need to retain query component of a redirect URI // OAuth 2: 3.1.2 we need to retain query component of a redirect URI
if (!url.includes("?")) { if (!url.includes("?")) {
@ -94,7 +95,9 @@ export const redirectWithAuthCode = (
if (oauth2State) { if (oauth2State) {
url += `&state=${encodeURIComponent(oauth2State)}`; url += `&state=${encodeURIComponent(oauth2State)}`;
} }
url += `&storeToken=true`; if (storeToken) {
url += `&storeToken=true`;
}
document.location.assign(url); document.location.assign(url);
}; };

View File

@ -49,6 +49,7 @@ export interface LineChartEntity {
export interface LineChartUnit { export interface LineChartUnit {
unit: string; unit: string;
device_class?: string;
identifier: string; identifier: string;
data: LineChartEntity[]; data: LineChartEntity[];
} }
@ -323,7 +324,8 @@ const processTimelineEntity = (
}; };
const processLineChartEntities = ( const processLineChartEntities = (
unit, unit: string,
device_class: string | undefined,
entities: HistoryStates, entities: HistoryStates,
hassEntities: HassEntities hassEntities: HassEntities
): LineChartUnit => { ): LineChartUnit => {
@ -391,6 +393,7 @@ const processLineChartEntities = (
return { return {
unit, unit,
device_class,
identifier: Object.keys(entities).join(""), identifier: Object.keys(entities).join(""),
data, data,
}; };
@ -466,6 +469,12 @@ export const computeHistory = (
}[domain]; }[domain];
} }
const deviceClass: string | undefined = (
currentState?.attributes || numericStateFromHistory?.a
)?.device_class;
const key = computeGroupKey(unit, deviceClass);
if (!unit) { if (!unit) {
timelineDevices.push( timelineDevices.push(
processTimelineEntity( processTimelineEntity(
@ -478,19 +487,32 @@ export const computeHistory = (
currentState currentState
) )
); );
} else if (unit in lineChartDevices && entityId in lineChartDevices[unit]) { } else if (key in lineChartDevices && entityId in lineChartDevices[key]) {
lineChartDevices[unit][entityId].push(...stateInfo); lineChartDevices[key][entityId].push(...stateInfo);
} else { } else {
if (!(unit in lineChartDevices)) { if (!(key in lineChartDevices)) {
lineChartDevices[unit] = {}; lineChartDevices[key] = {};
} }
lineChartDevices[unit][entityId] = stateInfo; lineChartDevices[key][entityId] = stateInfo;
} }
}); });
const unitStates = Object.keys(lineChartDevices).map((unit) => const unitStates = Object.keys(lineChartDevices).map((key) => {
processLineChartEntities(unit, lineChartDevices[unit], hass.states) const splitKey = key.split("_");
); const unit = splitKey[0];
const deviceClass = splitKey[1] || undefined;
return processLineChartEntities(
unit,
deviceClass,
lineChartDevices[key],
hass.states
);
});
return { line: unitStates, timeline: timelineDevices }; return { line: unitStates, timeline: timelineDevices };
}; };
export const computeGroupKey = (
unit: string | undefined,
device_class: string | undefined
) => `${unit}_${device_class || ""}`;

View File

@ -1,11 +1,14 @@
import { HomeAssistant } from "../types"; import { HomeAssistant } from "../types";
export interface Person { export interface BasePerson {
id: string;
name: string; name: string;
picture?: string;
}
export interface Person extends BasePerson {
id: string;
user_id?: string; user_id?: string;
device_trackers?: string[]; device_trackers?: string[];
picture?: string;
} }
export interface PersonMutableParams { export interface PersonMutableParams {
@ -21,9 +24,14 @@ export const fetchPersons = (hass: HomeAssistant) =>
config: Person[]; config: Person[];
}>({ type: "person/list" }); }>({ type: "person/list" });
export const listPersons = () => export const listUserPersons = (): Promise<Record<string, BasePerson>> =>
fetch("/api/person/list", { fetch("/api/person/list", {
credentials: "same-origin", credentials: "same-origin",
}).then((resp) => {
if (resp.ok) {
return resp.json();
}
throw new Error(resp.statusText);
}); });
export const createPerson = ( export const createPerson = (

View File

@ -73,6 +73,7 @@ export class DialogAreaFilter
animation: 150, animation: 150,
fallbackClass: "sortable-fallback", fallbackClass: "sortable-fallback",
handle: ".handle", handle: ".handle",
draggable: ".draggable",
onChoose: (evt: SortableEvent) => { onChoose: (evt: SortableEvent) => {
(evt.item as any).placeholder = (evt.item as any).placeholder =
document.createComment("sort-placeholder"); document.createComment("sort-placeholder");
@ -128,16 +129,21 @@ export class DialogAreaFilter
const name = this.hass!.areas[area]?.name || area; const name = this.hass!.areas[area]?.name || area;
return html` return html`
<ha-list-item <ha-list-item
class=${classMap({ hidden: !isVisible })} class=${classMap({
hidden: !isVisible,
draggable: isVisible,
})}
hasMeta hasMeta
graphic="icon" graphic="icon"
noninteractive noninteractive
> >
<ha-svg-icon ${isVisible
class="handle" ? html`<ha-svg-icon
.path=${mdiDrag} class="handle"
slot="graphic" .path=${mdiDrag}
></ha-svg-icon> slot="graphic"
></ha-svg-icon>`
: nothing}
${name} ${name}
<ha-icon-button <ha-icon-button
tabindex="0" tabindex="0"
@ -177,6 +183,11 @@ export class DialogAreaFilter
hidden.push(area); hidden.push(area);
} }
this._hidden = hidden; this._hidden = hidden;
const nonHiddenAreas = this._areas.filter(
(ar) => !this._hidden.includes(ar)
);
const hiddenAreas = this._areas.filter((ar) => this._hidden.includes(ar));
this._areas = [...nonHiddenAreas, ...hiddenAreas];
} }
static get styles(): CSSResultGroup { static get styles(): CSSResultGroup {
@ -193,7 +204,7 @@ export class DialogAreaFilter
overflow: visible; overflow: visible;
} }
.hidden { .hidden {
opacity: 0.3; color: var(--disabled-text-color);
} }
.handle { .handle {
cursor: grab; cursor: grab;

View File

@ -6,16 +6,8 @@ import {
mdiTuneVariant, mdiTuneVariant,
mdiWaterPercent, mdiWaterPercent,
} from "@mdi/js"; } from "@mdi/js";
import { import { CSSResultGroup, LitElement, css, html, nothing } from "lit";
CSSResultGroup,
LitElement,
PropertyValues,
css,
html,
nothing,
} from "lit";
import { property, state } from "lit/decorators"; import { property, state } from "lit/decorators";
import { fireEvent } from "../../../common/dom/fire_event";
import { stopPropagation } from "../../../common/dom/stop_propagation"; import { stopPropagation } from "../../../common/dom/stop_propagation";
import { supportsFeature } from "../../../common/entity/supports-feature"; import { supportsFeature } from "../../../common/entity/supports-feature";
import "../../../components/ha-control-select-menu"; import "../../../components/ha-control-select-menu";
@ -50,8 +42,6 @@ class MoreInfoClimate extends LitElement {
@state() private _mainControl: MainControl = "temperature"; @state() private _mainControl: MainControl = "temperature";
private _resizeDebounce?: number;
protected render() { protected render() {
if (!this.stateObj) { if (!this.stateObj) {
return nothing; return nothing;
@ -293,21 +283,6 @@ class MoreInfoClimate extends LitElement {
`; `;
} }
protected updated(changedProps: PropertyValues) {
super.updated(changedProps);
if (!changedProps.has("stateObj") || !this.stateObj) {
return;
}
if (this._resizeDebounce) {
clearTimeout(this._resizeDebounce);
}
this._resizeDebounce = window.setTimeout(() => {
fireEvent(this, "iron-resize");
this._resizeDebounce = undefined;
}, 500);
}
private _setMainControl(ev: any) { private _setMainControl(ev: any) {
ev.stopPropagation(); ev.stopPropagation();
this._mainControl = ev.currentTarget.control; this._mainControl = ev.currentTarget.control;

View File

@ -8,7 +8,6 @@ import {
nothing, nothing,
} from "lit"; } from "lit";
import { property, state } from "lit/decorators"; import { property, state } from "lit/decorators";
import { fireEvent } from "../../../common/dom/fire_event";
import { stopPropagation } from "../../../common/dom/stop_propagation"; import { stopPropagation } from "../../../common/dom/stop_propagation";
import { supportsFeature } from "../../../common/entity/supports-feature"; import { supportsFeature } from "../../../common/entity/supports-feature";
import "../../../components/ha-control-select-menu"; import "../../../components/ha-control-select-menu";
@ -38,8 +37,6 @@ class MoreInfoHumidifier extends LitElement {
} }
} }
private _resizeDebounce?: number;
protected render() { protected render() {
if (!this.stateObj) { if (!this.stateObj) {
return nothing; return nothing;
@ -135,21 +132,6 @@ class MoreInfoHumidifier extends LitElement {
`; `;
} }
protected updated(changedProps: PropertyValues) {
super.updated(changedProps);
if (!changedProps.has("stateObj") || !this.stateObj) {
return;
}
if (this._resizeDebounce) {
clearTimeout(this._resizeDebounce);
}
this._resizeDebounce = window.setTimeout(() => {
fireEvent(this, "iron-resize");
this._resizeDebounce = undefined;
}, 500);
}
private _handleStateChanged(ev) { private _handleStateChanged(ev) {
const newVal = ev.target.value || null; const newVal = ev.target.value || null;
this._callServiceHelper( this._callServiceHelper(

View File

@ -39,7 +39,7 @@
align-items: center; align-items: center;
} }
#ha-launch-screen svg { #ha-launch-screen svg {
width: 170px; width: 112px;
flex-shrink: 0; flex-shrink: 0;
} }
#ha-launch-screen .ha-launch-screen-spacer { #ha-launch-screen .ha-launch-screen-spacer {

View File

@ -226,10 +226,6 @@ export class HaConfigHelpers extends SubscribeMixin(LitElement) {
}; };
}); });
if (!Object.keys(configEntriesCopy).length) {
return states;
}
const entries = Object.values(configEntriesCopy).map((configEntry) => ({ const entries = Object.values(configEntriesCopy).map((configEntry) => ({
id: configEntry.entry_id, id: configEntry.entry_id,
entity_id: "", entity_id: "",

View File

@ -360,17 +360,16 @@ class HaPanelDevState extends LitElement {
} }
private _updateEntity() { private _updateEntity() {
if (!this._entityId) { const entityState = this._entityId
? this.hass.states[this._entityId]
: undefined;
if (!entityState) {
this._entity = undefined; this._entity = undefined;
this._state = ""; this._state = "";
this._stateAttributes = {}; this._stateAttributes = {};
this._updateEditor(); this._updateEditor();
return; return;
} }
const entityState = this.hass.states[this._entityId];
if (!entityState) {
return;
}
this._entity = entityState; this._entity = entityState;
this._state = entityState.state; this._state = entityState.state;
this._stateAttributes = entityState.attributes; this._stateAttributes = entityState.attributes;

View File

@ -46,6 +46,7 @@ import {
EntityHistoryState, EntityHistoryState,
LineChartUnit, LineChartUnit,
LineChartEntity, LineChartEntity,
computeGroupKey,
} from "../../data/history"; } from "../../data/history";
import { fetchStatistics, Statistics } from "../../data/recorder"; import { fetchStatistics, Statistics } from "../../data/recorder";
import { getSensorNumericDeviceClasses } from "../../data/sensor"; import { getSensorNumericDeviceClasses } from "../../data/sensor";
@ -221,14 +222,20 @@ class HaPanelHistory extends SubscribeMixin(LitElement) {
): HistoryResult { ): HistoryResult {
const result: HistoryResult = { ...historyResult, line: [] }; const result: HistoryResult = { ...historyResult, line: [] };
const units = new Set( const keys = new Set(
historyResult.line historyResult.line
.map((i) => i.unit) .map((i) => computeGroupKey(i.unit, i.device_class))
.concat(ltsResult.line.map((i) => i.unit)) .concat(
ltsResult.line.map((i) => computeGroupKey(i.unit, i.device_class))
)
); );
units.forEach((unit) => { keys.forEach((key) => {
const historyItem = historyResult.line.find((i) => i.unit === unit); const historyItem = historyResult.line.find(
const ltsItem = ltsResult.line.find((i) => i.unit === unit); (i) => computeGroupKey(i.unit, i.device_class) === key
);
const ltsItem = ltsResult.line.find(
(i) => computeGroupKey(i.unit, i.device_class) === key
);
if (historyItem && ltsItem) { if (historyItem && ltsItem) {
const newLineItem: LineChartUnit = { ...historyItem, data: [] }; const newLineItem: LineChartUnit = { ...historyItem, data: [] };
const entities = new Set( const entities = new Set(

View File

@ -5,41 +5,46 @@ import { computeDomain } from "../../../common/entity/compute_domain";
import { isUnavailableState } from "../../../data/entity"; import { isUnavailableState } from "../../../data/entity";
import { HomeAssistant } from "../../../types"; import { HomeAssistant } from "../../../types";
import { LovelaceCardFeature, LovelaceCardFeatureEditor } from "../types"; import { LovelaceCardFeature, LovelaceCardFeatureEditor } from "../types";
import { NumberCardFeatureConfig } from "./types"; import { NumericInputCardFeatureConfig } from "./types";
import "../../../components/ha-control-button"; import "../../../components/ha-control-button";
import "../../../components/ha-control-button-group"; import "../../../components/ha-control-button-group";
import "../../../components/ha-control-number-buttons"; import "../../../components/ha-control-number-buttons";
import "../../../components/ha-control-slider"; import "../../../components/ha-control-slider";
import "../../../components/ha-icon"; import "../../../components/ha-icon";
export const supportsNumberCardFeature = (stateObj: HassEntity) => { export const supportsNumericInputCardFeature = (stateObj: HassEntity) => {
const domain = computeDomain(stateObj.entity_id); const domain = computeDomain(stateObj.entity_id);
return domain === "input_number" || domain === "number"; return domain === "input_number" || domain === "number";
}; };
@customElement("hui-number-card-feature") @customElement("hui-numeric-input-card-feature")
class HuiNumberCardFeature extends LitElement implements LovelaceCardFeature { class HuiNumericInputCardFeature
extends LitElement
implements LovelaceCardFeature
{
@property({ attribute: false }) public hass?: HomeAssistant; @property({ attribute: false }) public hass?: HomeAssistant;
@property({ attribute: false }) public stateObj?: HassEntity; @property({ attribute: false }) public stateObj?: HassEntity;
@state() private _config?: NumberCardFeatureConfig; @state() private _config?: NumericInputCardFeatureConfig;
@state() _currentState?: string; @state() _currentState?: string;
static getStubConfig(): NumberCardFeatureConfig { static getStubConfig(): NumericInputCardFeatureConfig {
return { return {
type: "number", type: "numeric-input",
style: "buttons", style: "buttons",
}; };
} }
public static async getConfigElement(): Promise<LovelaceCardFeatureEditor> { public static async getConfigElement(): Promise<LovelaceCardFeatureEditor> {
await import("../editor/config-elements/hui-number-card-feature-editor"); await import(
return document.createElement("hui-number-card-feature-editor"); "../editor/config-elements/hui-numeric-input-card-feature-editor"
);
return document.createElement("hui-numeric-input-card-feature-editor");
} }
public setConfig(config: NumberCardFeatureConfig): void { public setConfig(config: NumericInputCardFeatureConfig): void {
if (!config) { if (!config) {
throw new Error("Invalid configuration"); throw new Error("Invalid configuration");
} }
@ -69,7 +74,7 @@ class HuiNumberCardFeature extends LitElement implements LovelaceCardFeature {
!this._config || !this._config ||
!this.hass || !this.hass ||
!this.stateObj || !this.stateObj ||
!supportsNumberCardFeature(this.stateObj) !supportsNumericInputCardFeature(this.stateObj)
) { ) {
return nothing; return nothing;
} }
@ -110,6 +115,10 @@ class HuiNumberCardFeature extends LitElement implements LovelaceCardFeature {
} }
ha-control-slider { ha-control-slider {
--control-slider-color: var(--feature-color); --control-slider-color: var(--feature-color);
--control-slider-background: var(--feature-color);
--control-slider-background-opacity: 0.2;
--control-slider-thickness: 40px;
--control-slider-border-radius: 10px;
} }
.container { .container {
padding: 0 12px 12px 12px; padding: 0 12px 12px 12px;
@ -121,6 +130,6 @@ class HuiNumberCardFeature extends LitElement implements LovelaceCardFeature {
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
"hui-number-card-feature": HuiNumberCardFeature; "hui-numeric-input-card-feature": HuiNumericInputCardFeature;
} }
} }

View File

@ -50,8 +50,8 @@ export interface SelectOptionsCardFeatureConfig {
type: "select-options"; type: "select-options";
} }
export interface NumberCardFeatureConfig { export interface NumericInputCardFeatureConfig {
type: "number"; type: "numeric-input";
style?: "buttons" | "slider"; style?: "buttons" | "slider";
} }
@ -109,7 +109,7 @@ export type LovelaceCardFeatureConfig =
| TargetTemperatureCardFeatureConfig | TargetTemperatureCardFeatureConfig
| WaterHeaterOperationModesCardFeatureConfig | WaterHeaterOperationModesCardFeatureConfig
| SelectOptionsCardFeatureConfig | SelectOptionsCardFeatureConfig
| NumberCardFeatureConfig; | NumericInputCardFeatureConfig;
export type LovelaceCardFeatureContext = { export type LovelaceCardFeatureContext = {
entity_id?: string; entity_id?: string;

View File

@ -42,6 +42,7 @@ import { HomeAssistant } from "../../../types";
import { actionHandler } from "../common/directives/action-handler-directive"; import { actionHandler } from "../common/directives/action-handler-directive";
import { findEntities } from "../common/find-entities"; import { findEntities } from "../common/find-entities";
import { handleAction } from "../common/handle-action"; import { handleAction } from "../common/handle-action";
import { hasAction } from "../common/has-action";
import "../components/hui-timestamp-display"; import "../components/hui-timestamp-display";
import "../card-features/hui-card-features"; import "../card-features/hui-card-features";
import type { LovelaceCard, LovelaceCardEditor } from "../types"; import type { LovelaceCard, LovelaceCardEditor } from "../types";
@ -362,7 +363,10 @@ export class HuiTileCard extends LitElement implements LovelaceCard {
<div <div
class="background" class="background"
@action=${this._handleAction} @action=${this._handleAction}
.actionHandler=${actionHandler()} .actionHandler=${actionHandler({
hasHold: hasAction(this._config!.hold_action),
hasDoubleClick: hasAction(this._config!.double_tap_action),
})}
role="button" role="button"
tabindex="0" tabindex="0"
aria-labelledby="info" aria-labelledby="info"

View File

@ -535,6 +535,8 @@ export interface TileCardConfig extends LovelaceCardConfig {
show_entity_picture?: string; show_entity_picture?: string;
vertical?: boolean; vertical?: boolean;
tap_action?: ActionConfig; tap_action?: ActionConfig;
hold_action?: ActionConfig;
double_tap_action?: ActionConfig;
icon_tap_action?: ActionConfig; icon_tap_action?: ActionConfig;
features?: LovelaceCardFeatureConfig[]; features?: LovelaceCardFeatureConfig[];
} }

View File

@ -476,7 +476,7 @@ export const generateDefaultViewConfig = (
if (areasPrefs?.hidden) { if (areasPrefs?.hidden) {
for (const area of areasPrefs.hidden) { for (const area of areasPrefs.hidden) {
splittedByAreaDevice.areasWithEntities[area] = []; delete splittedByAreaDevice.areasWithEntities[area];
} }
} }

View File

@ -3,14 +3,14 @@ import "../card-features/hui-climate-hvac-modes-card-feature";
import "../card-features/hui-climate-preset-modes-card-feature"; import "../card-features/hui-climate-preset-modes-card-feature";
import "../card-features/hui-cover-open-close-card-feature"; import "../card-features/hui-cover-open-close-card-feature";
import "../card-features/hui-cover-position-card-feature"; import "../card-features/hui-cover-position-card-feature";
import "../card-features/hui-cover-tilt-position-card-feature";
import "../card-features/hui-cover-tilt-card-feature"; import "../card-features/hui-cover-tilt-card-feature";
import "../card-features/hui-cover-tilt-position-card-feature";
import "../card-features/hui-fan-speed-card-feature"; import "../card-features/hui-fan-speed-card-feature";
import "../card-features/hui-humidifier-modes-card-feature"; import "../card-features/hui-humidifier-modes-card-feature";
import "../card-features/hui-lawn-mower-commands-card-feature"; import "../card-features/hui-lawn-mower-commands-card-feature";
import "../card-features/hui-light-brightness-card-feature"; import "../card-features/hui-light-brightness-card-feature";
import "../card-features/hui-light-color-temp-card-feature"; import "../card-features/hui-light-color-temp-card-feature";
import "../card-features/hui-number-card-feature"; import "../card-features/hui-numeric-input-card-feature";
import "../card-features/hui-select-options-card-feature"; import "../card-features/hui-select-options-card-feature";
import "../card-features/hui-target-temperature-card-feature"; import "../card-features/hui-target-temperature-card-feature";
import "../card-features/hui-vacuum-commands-card-feature"; import "../card-features/hui-vacuum-commands-card-feature";
@ -34,11 +34,11 @@ const TYPES: Set<LovelaceCardFeatureConfig["type"]> = new Set([
"lawn-mower-commands", "lawn-mower-commands",
"light-brightness", "light-brightness",
"light-color-temp", "light-color-temp",
"numeric-input",
"select-options", "select-options",
"target-temperature", "target-temperature",
"vacuum-commands", "vacuum-commands",
"water-heater-operation-modes", "water-heater-operation-modes",
"number",
]); ]);
export const createCardFeatureElement = (config: LovelaceCardFeatureConfig) => export const createCardFeatureElement = (config: LovelaceCardFeatureConfig) =>

View File

@ -33,7 +33,7 @@ import { supportsHumidifierModesCardFeature } from "../../card-features/hui-humi
import { supportsLawnMowerCommandCardFeature } from "../../card-features/hui-lawn-mower-commands-card-feature"; import { supportsLawnMowerCommandCardFeature } from "../../card-features/hui-lawn-mower-commands-card-feature";
import { supportsLightBrightnessCardFeature } from "../../card-features/hui-light-brightness-card-feature"; import { supportsLightBrightnessCardFeature } from "../../card-features/hui-light-brightness-card-feature";
import { supportsLightColorTempCardFeature } from "../../card-features/hui-light-color-temp-card-feature"; import { supportsLightColorTempCardFeature } from "../../card-features/hui-light-color-temp-card-feature";
import { supportsNumberCardFeature } from "../../card-features/hui-number-card-feature"; import { supportsNumericInputCardFeature } from "../../card-features/hui-numeric-input-card-feature";
import { supportsSelectOptionsCardFeature } from "../../card-features/hui-select-options-card-feature"; import { supportsSelectOptionsCardFeature } from "../../card-features/hui-select-options-card-feature";
import { supportsTargetTemperatureCardFeature } from "../../card-features/hui-target-temperature-card-feature"; import { supportsTargetTemperatureCardFeature } from "../../card-features/hui-target-temperature-card-feature";
import { supportsVacuumCommandsCardFeature } from "../../card-features/hui-vacuum-commands-card-feature"; import { supportsVacuumCommandsCardFeature } from "../../card-features/hui-vacuum-commands-card-feature";
@ -61,7 +61,7 @@ const UI_FEATURE_TYPES = [
"target-temperature", "target-temperature",
"vacuum-commands", "vacuum-commands",
"water-heater-operation-modes", "water-heater-operation-modes",
"number", "numeric-input",
] as const satisfies readonly FeatureType[]; ] as const satisfies readonly FeatureType[];
type UiFeatureTypes = (typeof UI_FEATURE_TYPES)[number]; type UiFeatureTypes = (typeof UI_FEATURE_TYPES)[number];
@ -73,7 +73,7 @@ const EDITABLES_FEATURE_TYPES = new Set<UiFeatureTypes>([
"water-heater-operation-modes", "water-heater-operation-modes",
"lawn-mower-commands", "lawn-mower-commands",
"climate-preset-modes", "climate-preset-modes",
"number", "numeric-input",
]); ]);
const SUPPORTS_FEATURE_TYPES: Record< const SUPPORTS_FEATURE_TYPES: Record<
@ -92,7 +92,7 @@ const SUPPORTS_FEATURE_TYPES: Record<
"lawn-mower-commands": supportsLawnMowerCommandCardFeature, "lawn-mower-commands": supportsLawnMowerCommandCardFeature,
"light-brightness": supportsLightBrightnessCardFeature, "light-brightness": supportsLightBrightnessCardFeature,
"light-color-temp": supportsLightColorTempCardFeature, "light-color-temp": supportsLightColorTempCardFeature,
number: supportsNumberCardFeature, "numeric-input": supportsNumericInputCardFeature,
"target-temperature": supportsTargetTemperatureCardFeature, "target-temperature": supportsTargetTemperatureCardFeature,
"vacuum-commands": supportsVacuumCommandsCardFeature, "vacuum-commands": supportsVacuumCommandsCardFeature,
"water-heater-operation-modes": supportsWaterHeaterOperationModesCardFeature, "water-heater-operation-modes": supportsWaterHeaterOperationModesCardFeature,

View File

@ -6,14 +6,14 @@ import "../../../../components/ha-form/ha-form";
import type { SchemaUnion } from "../../../../components/ha-form/types"; import type { SchemaUnion } from "../../../../components/ha-form/types";
import type { HomeAssistant } from "../../../../types"; import type { HomeAssistant } from "../../../../types";
import { import {
NumberCardFeatureConfig, NumericInputCardFeatureConfig,
LovelaceCardFeatureContext, LovelaceCardFeatureContext,
} from "../../card-features/types"; } from "../../card-features/types";
import type { LovelaceCardFeatureEditor } from "../../types"; import type { LovelaceCardFeatureEditor } from "../../types";
import { LocalizeFunc } from "../../../../common/translations/localize"; import { LocalizeFunc } from "../../../../common/translations/localize";
@customElement("hui-number-card-feature-editor") @customElement("hui-numeric-input-card-feature-editor")
export class HuiNumberCardFeatureEditor export class HuiNumericInputCardFeatureEditor
extends LitElement extends LitElement
implements LovelaceCardFeatureEditor implements LovelaceCardFeatureEditor
{ {
@ -21,9 +21,9 @@ export class HuiNumberCardFeatureEditor
@property({ attribute: false }) public context?: LovelaceCardFeatureContext; @property({ attribute: false }) public context?: LovelaceCardFeatureContext;
@state() private _config?: NumberCardFeatureConfig; @state() private _config?: NumericInputCardFeatureConfig;
public setConfig(config: NumberCardFeatureConfig): void { public setConfig(config: NumericInputCardFeatureConfig): void {
this._config = config; this._config = config;
} }
@ -39,7 +39,7 @@ export class HuiNumberCardFeatureEditor
options: ["slider", "buttons"].map((mode) => ({ options: ["slider", "buttons"].map((mode) => ({
value: mode, value: mode,
label: localize( label: localize(
`ui.panel.lovelace.editor.features.types.number.style_list.${mode}` `ui.panel.lovelace.editor.features.types.numeric-input.style_list.${mode}`
), ),
})), })),
}, },
@ -53,7 +53,7 @@ export class HuiNumberCardFeatureEditor
return nothing; return nothing;
} }
const data: NumberCardFeatureConfig = { const data: NumericInputCardFeatureConfig = {
style: "buttons", style: "buttons",
...this._config, ...this._config,
}; };
@ -79,12 +79,12 @@ export class HuiNumberCardFeatureEditor
schema: SchemaUnion<ReturnType<typeof this._schema>> schema: SchemaUnion<ReturnType<typeof this._schema>>
) => ) =>
this.hass!.localize( this.hass!.localize(
`ui.panel.lovelace.editor.features.types.number.${schema.name}` `ui.panel.lovelace.editor.features.types.numeric-input.${schema.name}`
); );
} }
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
"hui-number-card-feature-editor": HuiNumberCardFeatureEditor; "hui-numeric-input-card-feature-editor": HuiNumericInputCardFeatureEditor;
} }
} }

View File

@ -55,7 +55,6 @@ export class HuiViewVisibilityEditor extends LitElement {
fetchUsers(this.hass).then((users) => { fetchUsers(this.hass).then((users) => {
this._users = users.filter((user) => !user.system_generated); this._users = users.filter((user) => !user.system_generated);
fireEvent(this, "iron-resize");
}); });
} }

View File

@ -655,8 +655,6 @@ class HUIRoot extends LitElement {
if (!oldLovelace || oldLovelace.editMode !== this.lovelace!.editMode) { if (!oldLovelace || oldLovelace.editMode !== this.lovelace!.editMode) {
const views = this.config && this.config.views; const views = this.config && this.config.views;
fireEvent(this, "iron-resize");
// Leave unused entities when leaving edit mode // Leave unused entities when leaving edit mode
if ( if (
this.lovelace!.mode === "storage" && this.lovelace!.mode === "storage" &&
@ -980,8 +978,6 @@ class HUIRoot extends LitElement {
} }
root.appendChild(view); root.appendChild(view);
// Recalculate to see if we need to adjust content area for tab bar
fireEvent(this, "iron-resize");
} }
static get styles(): CSSResultGroup { static get styles(): CSSResultGroup {

View File

@ -64,11 +64,6 @@ export class MasonryView extends LitElement implements LovelaceViewElement {
private _mqlListenerRef?: () => void; private _mqlListenerRef?: () => void;
public constructor() {
super();
this.addEventListener("iron-resize", (ev: Event) => ev.stopPropagation());
}
public connectedCallback() { public connectedCallback() {
super.connectedCallback(); super.connectedCallback();
this._initMqls(); this._initMqls();

View File

@ -64,6 +64,11 @@ export default <T extends Constructor<HassElement>>(superClass: T) =>
return; return;
} }
if (e.defaultPrevented) {
return;
}
e.preventDefault();
showQuickBar(this, { commandMode }); showQuickBar(this, { commandMode });
} }
@ -75,6 +80,11 @@ export default <T extends Constructor<HassElement>>(superClass: T) =>
return; return;
} }
if (e.defaultPrevented) {
return;
}
e.preventDefault();
const targetPath = mainWindow.location.pathname; const targetPath = mainWindow.location.pathname;
const isHassio = isComponentLoaded(this.hass, "hassio"); const isHassio = isComponentLoaded(this.hass, "hassio");
const myParams = new URLSearchParams(); const myParams = new URLSearchParams();

View File

@ -5292,8 +5292,8 @@
"select-options": { "select-options": {
"label": "Select options" "label": "Select options"
}, },
"number": { "numeric-input": {
"label": "Number", "label": "Numeric input",
"style": "Style", "style": "Style",
"style_list": { "style_list": {
"buttons": "Buttons", "buttons": "Buttons",

View File

@ -49,7 +49,6 @@ declare global {
}; };
change: undefined; change: undefined;
"hass-logout": undefined; "hass-logout": undefined;
"iron-resize": undefined;
"config-refresh": undefined; "config-refresh": undefined;
"hass-api-called": { "hass-api-called": {
success: boolean; success: boolean;

230
yarn.lock
View File

@ -1458,9 +1458,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@codemirror/autocomplete@npm:6.11.0": "@codemirror/autocomplete@npm:6.11.1":
version: 6.11.0 version: 6.11.1
resolution: "@codemirror/autocomplete@npm:6.11.0" resolution: "@codemirror/autocomplete@npm:6.11.1"
dependencies: dependencies:
"@codemirror/language": "npm:^6.0.0" "@codemirror/language": "npm:^6.0.0"
"@codemirror/state": "npm:^6.0.0" "@codemirror/state": "npm:^6.0.0"
@ -1471,25 +1471,25 @@ __metadata:
"@codemirror/state": ^6.0.0 "@codemirror/state": ^6.0.0
"@codemirror/view": ^6.0.0 "@codemirror/view": ^6.0.0
"@lezer/common": ^1.0.0 "@lezer/common": ^1.0.0
checksum: 09678373b04de5770802fe0d0be0f7a0858994b344d9de104fb53751a8e6bf57536d8c8be9a28466efd581414420b87584a41e24e31317fa66f4a2451c30a2f7 checksum: 5281bec2b77d2cf916f8774e324afb862646050eab929f33780a2a67b9957d02d9abceec5f47b1b5163fedc4d07a62f1ec13fa0e2ad4b022fb75f010362e8f0e
languageName: node languageName: node
linkType: hard linkType: hard
"@codemirror/commands@npm:6.3.0": "@codemirror/commands@npm:6.3.1":
version: 6.3.0 version: 6.3.1
resolution: "@codemirror/commands@npm:6.3.0" resolution: "@codemirror/commands@npm:6.3.1"
dependencies: dependencies:
"@codemirror/language": "npm:^6.0.0" "@codemirror/language": "npm:^6.0.0"
"@codemirror/state": "npm:^6.2.0" "@codemirror/state": "npm:^6.2.0"
"@codemirror/view": "npm:^6.0.0" "@codemirror/view": "npm:^6.0.0"
"@lezer/common": "npm:^1.1.0" "@lezer/common": "npm:^1.1.0"
checksum: 4e35a1bb345fba1338a8cd1a607f44bce72cfec8fffc82c6dac039e5dc3a48ff9d111ca499cd0ea3291a6249124be5a8ca484c8194aea1c69ec47d1bb0b773a2 checksum: c4b5637062c86a1c96c8de0edc32148a59058471799ef209b18f6ed57b31ab47300d3db185ab6e375188acb05294d6e6dac6ba4540ee20e8101b77d4739f778c
languageName: node languageName: node
linkType: hard linkType: hard
"@codemirror/language@npm:6.9.2, @codemirror/language@npm:^6.0.0": "@codemirror/language@npm:6.9.3, @codemirror/language@npm:^6.0.0":
version: 6.9.2 version: 6.9.3
resolution: "@codemirror/language@npm:6.9.2" resolution: "@codemirror/language@npm:6.9.3"
dependencies: dependencies:
"@codemirror/state": "npm:^6.0.0" "@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.0.0" "@codemirror/view": "npm:^6.0.0"
@ -1497,7 +1497,7 @@ __metadata:
"@lezer/highlight": "npm:^1.0.0" "@lezer/highlight": "npm:^1.0.0"
"@lezer/lr": "npm:^1.0.0" "@lezer/lr": "npm:^1.0.0"
style-mod: "npm:^4.0.0" style-mod: "npm:^4.0.0"
checksum: ab7ea88cf8bcd5a7ba6f3fed2a0396dfb8506691a3f8484a8a27f9814397b1642468e9629fe27213190efa57fc5a1fdb0d294043d81413d7e7f2063017b53dbf checksum: 331230a3876ed469cbf18dc2733040aa42a175b1a038080e4c317cf7f1fd8e929dc6838ba4749ea52992805f20be85878214cab6e0e7c7ab5fda872844611b7a
languageName: node languageName: node
linkType: hard linkType: hard
@ -1510,32 +1510,32 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@codemirror/search@npm:6.5.4": "@codemirror/search@npm:6.5.5":
version: 6.5.4 version: 6.5.5
resolution: "@codemirror/search@npm:6.5.4" resolution: "@codemirror/search@npm:6.5.5"
dependencies: dependencies:
"@codemirror/state": "npm:^6.0.0" "@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.0.0" "@codemirror/view": "npm:^6.0.0"
crelt: "npm:^1.0.5" crelt: "npm:^1.0.5"
checksum: c852ab7754a98b2470ea79f6f857d3cd85b93cc5eb4505ba3cdbbf00a2b6cba117a81f305817afb2eb565d947c9a7181aa012b4eaad468e194cd82320d08d81d checksum: 61707efa563edaea1d83f0680db63a953f3f1c125e50bd912d84d07129aa5ba1f3a775f62339f7931c01f5afd69db777c0571215bd0aaef51964c37ee932f6df
languageName: node languageName: node
linkType: hard linkType: hard
"@codemirror/state@npm:6.3.1, @codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.4, @codemirror/state@npm:^6.2.0": "@codemirror/state@npm:6.3.2, @codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.1.4, @codemirror/state@npm:^6.2.0":
version: 6.3.1 version: 6.3.2
resolution: "@codemirror/state@npm:6.3.1" resolution: "@codemirror/state@npm:6.3.2"
checksum: 3760a6ad4a0a73202c7493065fe71be5fc10f018c232763a637de1eb9b5918ef84083aa89a411487f1707ea570f2f8dd6add451abe047a67a552acc5cd914d69 checksum: 6f46d7b3bf85d86383b8bc693d424734be247e2a6c22eb8979a1bdcb807895a6c39e81c9da361e10b210716b1a143517fdc6154261e4981118b31ed7ac328d51
languageName: node languageName: node
linkType: hard linkType: hard
"@codemirror/view@npm:6.22.0, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0": "@codemirror/view@npm:6.22.1, @codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0":
version: 6.22.0 version: 6.22.1
resolution: "@codemirror/view@npm:6.22.0" resolution: "@codemirror/view@npm:6.22.1"
dependencies: dependencies:
"@codemirror/state": "npm:^6.1.4" "@codemirror/state": "npm:^6.1.4"
style-mod: "npm:^4.1.0" style-mod: "npm:^4.1.0"
w3c-keyname: "npm:^2.2.4" w3c-keyname: "npm:^2.2.4"
checksum: df9a41c13724d55b540d6c84ac81788f0bc03fcbdae6206c7ee80056906a6734413b7a8c500c6c793d9ef527f2ff5f2c7f1eec481de22e6e6139335deb627783 checksum: 01688ece35683aaa6999bb0deae31e9f7825336906a1658150fdb6d1b8d060b672845bead9a0416a692c2e60926cdc88f525ed106d9c0284397c47f936cab26e
languageName: node languageName: node
linkType: hard linkType: hard
@ -4723,126 +4723,126 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/a11y-base@npm:~24.2.3": "@vaadin/a11y-base@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/a11y-base@npm:24.2.3" resolution: "@vaadin/a11y-base@npm:24.2.4"
dependencies: dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0" "@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.2.3" "@vaadin/component-base": "npm:~24.2.4"
lit: "npm:^2.0.0" lit: "npm:^2.0.0"
checksum: 1611f94bbbe3ff359e1270b873cdb593ba62b945d373f9a98411d721a3d030ee2a54e077fb4a347ef5b0b1cde894c93a8287b481d2c9357b5d8a05263f3b0dbb checksum: 916f719f547b4eaad38c27849ea0b369e27c15e3d91a3f2aa310b804c89099911b325d333c150bfc8ac3307e759254cb1bbf120210fa420b8db697cfd4ff5091
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/combo-box@npm:24.2.3": "@vaadin/combo-box@npm:24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/combo-box@npm:24.2.3" resolution: "@vaadin/combo-box@npm:24.2.4"
dependencies: dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0" "@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/a11y-base": "npm:~24.2.3" "@vaadin/a11y-base": "npm:~24.2.4"
"@vaadin/component-base": "npm:~24.2.3" "@vaadin/component-base": "npm:~24.2.4"
"@vaadin/field-base": "npm:~24.2.3" "@vaadin/field-base": "npm:~24.2.4"
"@vaadin/input-container": "npm:~24.2.3" "@vaadin/input-container": "npm:~24.2.4"
"@vaadin/item": "npm:~24.2.3" "@vaadin/item": "npm:~24.2.4"
"@vaadin/lit-renderer": "npm:~24.2.3" "@vaadin/lit-renderer": "npm:~24.2.4"
"@vaadin/overlay": "npm:~24.2.3" "@vaadin/overlay": "npm:~24.2.4"
"@vaadin/vaadin-lumo-styles": "npm:~24.2.3" "@vaadin/vaadin-lumo-styles": "npm:~24.2.4"
"@vaadin/vaadin-material-styles": "npm:~24.2.3" "@vaadin/vaadin-material-styles": "npm:~24.2.4"
"@vaadin/vaadin-themable-mixin": "npm:~24.2.3" "@vaadin/vaadin-themable-mixin": "npm:~24.2.4"
checksum: aeec6d5450ab626a39c5be1d7117d76f5446601b15731dcb37d53007e033d0966eba17a77e79da13825b1ba4c85345cd2f6c3a7a255fc99a5ffa2e950e3c6d45 checksum: a8327d4c774bce0f48ff7bd625ecff13f7d050f6b0e283a811c742e9ca232616b9d356f560c9408bd216c8b13032e0a4dd230c9ee23981c42f4b0aad9321843c
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/component-base@npm:~24.2.3": "@vaadin/component-base@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/component-base@npm:24.2.3" resolution: "@vaadin/component-base@npm:24.2.4"
dependencies: dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0" "@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/vaadin-development-mode-detector": "npm:^2.0.0" "@vaadin/vaadin-development-mode-detector": "npm:^2.0.0"
"@vaadin/vaadin-usage-statistics": "npm:^2.1.0" "@vaadin/vaadin-usage-statistics": "npm:^2.1.0"
lit: "npm:^2.0.0" lit: "npm:^2.0.0"
checksum: 31fc786bacc203ad73c41d42ed751e2ee94603b4b75c5015a80925aa0cdd6a6d6484306f5573985ff9e93d8c454b3dd36f4cb8cea2ee19e604ff662885757318 checksum: a7b0d70add9290190efdbd4cf0c114d88061848d5ea2aeb3767481d40f38d53c9af9ac831f2c7cb78ec187faefeaa67acf6c420ad87c0ce993f8e68031dcff61
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/field-base@npm:~24.2.3": "@vaadin/field-base@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/field-base@npm:24.2.3" resolution: "@vaadin/field-base@npm:24.2.4"
dependencies: dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0" "@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/a11y-base": "npm:~24.2.3" "@vaadin/a11y-base": "npm:~24.2.4"
"@vaadin/component-base": "npm:~24.2.3" "@vaadin/component-base": "npm:~24.2.4"
lit: "npm:^2.0.0" lit: "npm:^2.0.0"
checksum: 965202e508099fc7a0cd90f4c7cf0e759d1082f1bf289c36712414096ad2c402e903c24eaa31c14b5f48b1c6173bd1f4ee38c1d87e1a6c42787493631f4be34a checksum: f23258b1d9de2dbf2bfb4bef62d5504b45a87b854a917525f3f241734ef754e7f15bfc0c0076406434d68a7a53b344c79c78b914b7c3958f682c99c1ede0ed59
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/icon@npm:~24.2.3": "@vaadin/icon@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/icon@npm:24.2.3" resolution: "@vaadin/icon@npm:24.2.4"
dependencies: dependencies:
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.2.3" "@vaadin/component-base": "npm:~24.2.4"
"@vaadin/vaadin-lumo-styles": "npm:~24.2.3" "@vaadin/vaadin-lumo-styles": "npm:~24.2.4"
"@vaadin/vaadin-themable-mixin": "npm:~24.2.3" "@vaadin/vaadin-themable-mixin": "npm:~24.2.4"
lit: "npm:^2.0.0" lit: "npm:^2.0.0"
checksum: 21ad0a359fc50a07a330733a4417bbc13029da54da082dd7cef5154a46cca0e9066b1cbbc807346453bf1c6e4099374bca6eb524e205a23fdff1873468a3d895 checksum: 3cd963450c3516457f44ba77166aa7f94d35fdb3803671bfad02799485ec09dce15820bf1b48c20e7860f61d61fc1355c5bc4e7a35a2856cf5d13a6f2426e20b
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/input-container@npm:~24.2.3": "@vaadin/input-container@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/input-container@npm:24.2.3" resolution: "@vaadin/input-container@npm:24.2.4"
dependencies: dependencies:
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.2.3" "@vaadin/component-base": "npm:~24.2.4"
"@vaadin/vaadin-lumo-styles": "npm:~24.2.3" "@vaadin/vaadin-lumo-styles": "npm:~24.2.4"
"@vaadin/vaadin-material-styles": "npm:~24.2.3" "@vaadin/vaadin-material-styles": "npm:~24.2.4"
"@vaadin/vaadin-themable-mixin": "npm:~24.2.3" "@vaadin/vaadin-themable-mixin": "npm:~24.2.4"
checksum: 6ea71beca5d1d90d9401573b7b5da76664573a24e0b3be9d3fb655be4a7ba6bab46a4ac0df44c33ae67723008cf413643f2f591693bfde9373ef1c2b8058adeb checksum: 5d9fb325157fb694bd519865c4ff297139fcc68973f78ca40755ea471ff26641372cbabf92c7884d16c486fec2f5e2dc5f15ed8f065d214e115c4aeff6fb6627
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/item@npm:~24.2.3": "@vaadin/item@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/item@npm:24.2.3" resolution: "@vaadin/item@npm:24.2.4"
dependencies: dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0" "@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/a11y-base": "npm:~24.2.3" "@vaadin/a11y-base": "npm:~24.2.4"
"@vaadin/component-base": "npm:~24.2.3" "@vaadin/component-base": "npm:~24.2.4"
"@vaadin/vaadin-lumo-styles": "npm:~24.2.3" "@vaadin/vaadin-lumo-styles": "npm:~24.2.4"
"@vaadin/vaadin-material-styles": "npm:~24.2.3" "@vaadin/vaadin-material-styles": "npm:~24.2.4"
"@vaadin/vaadin-themable-mixin": "npm:~24.2.3" "@vaadin/vaadin-themable-mixin": "npm:~24.2.4"
checksum: 985805df2ab6177f646f453ee226575977dad407aa9bdb11c74fdacb439fa62b6851f52676b3eead5048d44d417aaa39e379e80deacbc19c0b3e831199383a3b checksum: 4ec5f78083f7811b26345bb760c2c6835e7ec18c33a78e9532f4aae7b913f319f984b91500c23365d611a146559b70ffcb72a94b504aef079583bebe05ae6558
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/lit-renderer@npm:~24.2.3": "@vaadin/lit-renderer@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/lit-renderer@npm:24.2.3" resolution: "@vaadin/lit-renderer@npm:24.2.4"
dependencies: dependencies:
lit: "npm:^2.0.0" lit: "npm:^2.0.0"
checksum: f8700d2986e2a9f818f6bd89789cad47f7a32a53bf4fb185996f072891a8777dab59319e17c0cac55d63dbe235be618a9fcd852679c48049220f65059df67ab8 checksum: 85173b8b0e35cfa4665fe9d772fe88a11d3f87a6985a3c8bfb208e64da841d93868e718ac68ab47780a2d53670b1ed72e38c83890dc2039a663a975767031e45
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/overlay@npm:~24.2.3": "@vaadin/overlay@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/overlay@npm:24.2.3" resolution: "@vaadin/overlay@npm:24.2.4"
dependencies: dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0" "@open-wc/dedupe-mixin": "npm:^1.3.0"
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/a11y-base": "npm:~24.2.3" "@vaadin/a11y-base": "npm:~24.2.4"
"@vaadin/component-base": "npm:~24.2.3" "@vaadin/component-base": "npm:~24.2.4"
"@vaadin/vaadin-lumo-styles": "npm:~24.2.3" "@vaadin/vaadin-lumo-styles": "npm:~24.2.4"
"@vaadin/vaadin-material-styles": "npm:~24.2.3" "@vaadin/vaadin-material-styles": "npm:~24.2.4"
"@vaadin/vaadin-themable-mixin": "npm:~24.2.3" "@vaadin/vaadin-themable-mixin": "npm:~24.2.4"
checksum: 514af25a6f83aa314831fd9c1661eade7487ec601bc070900e74bf9dcafcfbe103740dcb4fa870227004d44e50264d926d560f82f4af11d648798a7a17b1e001 checksum: b89b4594eea00bbfa58feaea71f03e700c16fd293767450bcccec8259bb206987190c8e36611a437a1f0b131043ff419d57791a6fd60b485352fe5d721c0444d
languageName: node languageName: node
linkType: hard linkType: hard
@ -4853,36 +4853,36 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/vaadin-lumo-styles@npm:~24.2.3": "@vaadin/vaadin-lumo-styles@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/vaadin-lumo-styles@npm:24.2.3" resolution: "@vaadin/vaadin-lumo-styles@npm:24.2.4"
dependencies: dependencies:
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.2.3" "@vaadin/component-base": "npm:~24.2.4"
"@vaadin/icon": "npm:~24.2.3" "@vaadin/icon": "npm:~24.2.4"
"@vaadin/vaadin-themable-mixin": "npm:~24.2.3" "@vaadin/vaadin-themable-mixin": "npm:~24.2.4"
checksum: 9c7137aa754a1903a9f430c67eef5988aa15372067ab0e37d0e06f21d3e7e1c49bfc805e47031692218de6e231134b1495a5ce9fd878d63a82716a8463b5f247 checksum: b8cae5be9744ab69cbc11d98e17c20d3af6ceb28b5347bb1b68dd9d82c1aa492b924da602ade88a7d86d3c701fe034b2d952c0836ff94bada30d9e4b61b6e104
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/vaadin-material-styles@npm:~24.2.3": "@vaadin/vaadin-material-styles@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/vaadin-material-styles@npm:24.2.3" resolution: "@vaadin/vaadin-material-styles@npm:24.2.4"
dependencies: dependencies:
"@polymer/polymer": "npm:^3.0.0" "@polymer/polymer": "npm:^3.0.0"
"@vaadin/component-base": "npm:~24.2.3" "@vaadin/component-base": "npm:~24.2.4"
"@vaadin/vaadin-themable-mixin": "npm:~24.2.3" "@vaadin/vaadin-themable-mixin": "npm:~24.2.4"
checksum: d66c58c2d48ea1beec77ff07354fc133138a595ef4d047940d94f4cdefed24fc42eb08616546518df0467f499f2e84fdcfbc4f181a13f32da4e5dc78c334bfb3 checksum: b0cbbd1706961756a92da68caf28f1b05c3a85e5bf66672a442b047c13e7342b101ed06fb9bdae30a22c31bc081b3b0d787c557f400781d6c18c8f4b2ea7bf8e
languageName: node languageName: node
linkType: hard linkType: hard
"@vaadin/vaadin-themable-mixin@npm:24.2.3, @vaadin/vaadin-themable-mixin@npm:~24.2.3": "@vaadin/vaadin-themable-mixin@npm:24.2.4, @vaadin/vaadin-themable-mixin@npm:~24.2.4":
version: 24.2.3 version: 24.2.4
resolution: "@vaadin/vaadin-themable-mixin@npm:24.2.3" resolution: "@vaadin/vaadin-themable-mixin@npm:24.2.4"
dependencies: dependencies:
"@open-wc/dedupe-mixin": "npm:^1.3.0" "@open-wc/dedupe-mixin": "npm:^1.3.0"
lit: "npm:^2.0.0" lit: "npm:^2.0.0"
checksum: 56d2528e8b39705fa059bbb2b8ed4b127acfae5bd1dd017393e990883f45b5e6e1aeb16f4260c26c88d1350ff218221a07479816ac1790dea0d5ddcd427c1fbe checksum: b7737be6bd1b08ed534209eae5899c723642284e0fe34147b77c409a53294b70df9ebd96a1b850cd91934ee19c9300b36eb80b4b99aeb0dda27e7b93f355faa5
languageName: node languageName: node
linkType: hard linkType: hard
@ -9564,13 +9564,13 @@ __metadata:
"@babel/runtime": "npm:7.23.4" "@babel/runtime": "npm:7.23.4"
"@braintree/sanitize-url": "npm:6.0.4" "@braintree/sanitize-url": "npm:6.0.4"
"@bundle-stats/plugin-webpack-filter": "npm:4.8.3" "@bundle-stats/plugin-webpack-filter": "npm:4.8.3"
"@codemirror/autocomplete": "npm:6.11.0" "@codemirror/autocomplete": "npm:6.11.1"
"@codemirror/commands": "npm:6.3.0" "@codemirror/commands": "npm:6.3.1"
"@codemirror/language": "npm:6.9.2" "@codemirror/language": "npm:6.9.3"
"@codemirror/legacy-modes": "npm:6.3.3" "@codemirror/legacy-modes": "npm:6.3.3"
"@codemirror/search": "npm:6.5.4" "@codemirror/search": "npm:6.5.5"
"@codemirror/state": "npm:6.3.1" "@codemirror/state": "npm:6.3.2"
"@codemirror/view": "npm:6.22.0" "@codemirror/view": "npm:6.22.1"
"@egjs/hammerjs": "npm:2.0.17" "@egjs/hammerjs": "npm:2.0.17"
"@formatjs/intl-datetimeformat": "npm:6.12.0" "@formatjs/intl-datetimeformat": "npm:6.12.0"
"@formatjs/intl-displaynames": "npm:6.6.4" "@formatjs/intl-displaynames": "npm:6.6.4"
@ -9657,8 +9657,8 @@ __metadata:
"@types/webspeechapi": "npm:0.0.29" "@types/webspeechapi": "npm:0.0.29"
"@typescript-eslint/eslint-plugin": "npm:6.12.0" "@typescript-eslint/eslint-plugin": "npm:6.12.0"
"@typescript-eslint/parser": "npm:6.12.0" "@typescript-eslint/parser": "npm:6.12.0"
"@vaadin/combo-box": "npm:24.2.3" "@vaadin/combo-box": "npm:24.2.4"
"@vaadin/vaadin-themable-mixin": "npm:24.2.3" "@vaadin/vaadin-themable-mixin": "npm:24.2.4"
"@vibrant/color": "npm:3.2.1-alpha.1" "@vibrant/color": "npm:3.2.1-alpha.1"
"@vibrant/core": "npm:3.2.1-alpha.1" "@vibrant/core": "npm:3.2.1-alpha.1"
"@vibrant/quantizer-mmcq": "npm:3.2.1-alpha.1" "@vibrant/quantizer-mmcq": "npm:3.2.1-alpha.1"