diff --git a/build-scripts/bundle.js b/build-scripts/bundle.js
index c15e1ab1dc..2325d80bca 100644
--- a/build-scripts/bundle.js
+++ b/build-scripts/bundle.js
@@ -165,6 +165,7 @@ module.exports.config = {
cast({ isProdBuild, latestBuild }) {
const entry = {
launcher: path.resolve(paths.cast_dir, "src/launcher/entrypoint.ts"),
+ media: path.resolve(paths.cast_dir, "src/media/entrypoint.ts"),
};
if (latestBuild) {
diff --git a/build-scripts/gulp/entry-html.js b/build-scripts/gulp/entry-html.js
index 8627d61713..156d100cf9 100644
--- a/build-scripts/gulp/entry-html.js
+++ b/build-scripts/gulp/entry-html.js
@@ -154,6 +154,15 @@ gulp.task("gen-index-cast-dev", (done) => {
contentReceiver
);
+ const contentMedia = renderCastTemplate("media", {
+ latestMediaJS: "/frontend_latest/media.js",
+ es5MediaJS: "/frontend_es5/media.js",
+ });
+ fs.outputFileSync(
+ path.resolve(paths.cast_output_root, "media.html"),
+ contentMedia
+ );
+
const contentFAQ = renderCastTemplate("launcher-faq", {
latestLauncherJS: "/frontend_latest/launcher.js",
es5LauncherJS: "/frontend_es5/launcher.js",
@@ -192,6 +201,15 @@ gulp.task("gen-index-cast-prod", (done) => {
contentReceiver
);
+ const contentMedia = renderCastTemplate("media", {
+ latestMediaJS: latestManifest["media.js"],
+ es5MediaJS: es5Manifest["media.js"],
+ });
+ fs.outputFileSync(
+ path.resolve(paths.cast_output_root, "media.html"),
+ contentMedia
+ );
+
const contentFAQ = renderCastTemplate("launcher-faq", {
latestLauncherJS: latestManifest["launcher.js"],
es5LauncherJS: es5Manifest["launcher.js"],
diff --git a/cast/src/html/media.html.template b/cast/src/html/media.html.template
new file mode 100644
index 0000000000..e8ad478488
--- /dev/null
+++ b/cast/src/html/media.html.template
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+ <%= renderTemplate('_js_base') %>
+
+
+
+
+
+
+
+
diff --git a/cast/src/media/entrypoint.ts b/cast/src/media/entrypoint.ts
new file mode 100644
index 0000000000..3648e8b318
--- /dev/null
+++ b/cast/src/media/entrypoint.ts
@@ -0,0 +1,25 @@
+import { CastReceiverContext } from "chromecast-caf-receiver/cast.framework";
+
+const castContext =
+ cast.framework.CastContext.getInstance() as unknown as CastReceiverContext;
+
+const playerManager = castContext.getPlayerManager();
+
+playerManager.setMessageInterceptor(
+ cast.framework.messages.MessageType.LOAD,
+ (loadRequestData) => {
+ const media = loadRequestData.media;
+ // Special handling if it came from Google Assistant
+ if (media.entity) {
+ media.contentId = media.entity;
+ media.streamType = cast.framework.messages.StreamType.LIVE;
+ media.contentType = "application/vnd.apple.mpegurl";
+ // @ts-ignore
+ media.hlsVideoSegmentFormat =
+ cast.framework.messages.HlsVideoSegmentFormat.FMP4;
+ }
+ return loadRequestData;
+ }
+);
+
+castContext.start();
diff --git a/hassio/src/components/hassio-upload-backup.ts b/hassio/src/components/hassio-upload-backup.ts
index 70b326bff9..ae19a12c81 100644
--- a/hassio/src/components/hassio-upload-backup.ts
+++ b/hassio/src/components/hassio-upload-backup.ts
@@ -16,11 +16,9 @@ declare global {
}
}
-const MAX_FILE_SIZE = 1 * 1024 * 1024 * 1024; // 1GB
-
@customElement("hassio-upload-backup")
export class HassioUploadBackup extends LitElement {
- public hass!: HomeAssistant;
+ public hass?: HomeAssistant;
@state() public value: string | null = null;
@@ -43,20 +41,6 @@ export class HassioUploadBackup extends LitElement {
private async _uploadFile(ev) {
const file = ev.detail.files[0];
- if (file.size > MAX_FILE_SIZE) {
- showAlertDialog(this, {
- title: "Backup file is too big",
- text: html`The maximum allowed filesize is 1GB.
- Have a look here on how to restore it.`,
- confirmText: "ok",
- });
- return;
- }
-
if (!["application/x-tar"].includes(file.type)) {
showAlertDialog(this, {
title: "Unsupported file format",
diff --git a/hassio/src/dialogs/backup/dialog-hassio-backup-upload.ts b/hassio/src/dialogs/backup/dialog-hassio-backup-upload.ts
index 2b835f0ad9..4fd6751d36 100644
--- a/hassio/src/dialogs/backup/dialog-hassio-backup-upload.ts
+++ b/hassio/src/dialogs/backup/dialog-hassio-backup-upload.ts
@@ -15,7 +15,7 @@ export class DialogHassioBackupUpload
extends LitElement
implements HassDialog
{
- @property({ attribute: false }) public hass!: HomeAssistant;
+ @property({ attribute: false }) public hass?: HomeAssistant;
@state() private _params?: HassioBackupUploadDialogParams;
@@ -54,7 +54,7 @@ export class DialogHassioBackupUpload
Upload backup
{
- @property({ attribute: false }) public hass!: HomeAssistant;
+ @property({ attribute: false }) public hass?: HomeAssistant;
@state() private _error?: string;
@@ -77,7 +77,7 @@ class HassioBackupDialog
${this._backup.name}
@@ -192,25 +192,23 @@ class HassioBackupDialog
}
if (!this._dialogParams?.onboarding) {
- this.hass
- .callApi(
- "POST",
+ this.hass!.callApi(
+ "POST",
- `hassio/${
- atLeastVersion(this.hass.config.version, 2021, 9)
- ? "backups"
- : "snapshots"
- }/${this._backup!.slug}/restore/partial`,
- backupDetails
- )
- .then(
- () => {
- this.closeDialog();
- },
- (error) => {
- this._error = error.body.message;
- }
- );
+ `hassio/${
+ atLeastVersion(this.hass!.config.version, 2021, 9)
+ ? "backups"
+ : "snapshots"
+ }/${this._backup!.slug}/restore/partial`,
+ backupDetails
+ ).then(
+ () => {
+ this.closeDialog();
+ },
+ (error) => {
+ this._error = error.body.message;
+ }
+ );
} else {
fireEvent(this, "restoring");
fetch(`/api/hassio/backups/${this._backup!.slug}/restore/partial`, {
@@ -244,24 +242,22 @@ class HassioBackupDialog
}
if (!this._dialogParams?.onboarding) {
- this.hass
- .callApi(
- "POST",
- `hassio/${
- atLeastVersion(this.hass.config.version, 2021, 9)
- ? "backups"
- : "snapshots"
- }/${this._backup!.slug}/restore/full`,
- backupDetails
- )
- .then(
- () => {
- this.closeDialog();
- },
- (error) => {
- this._error = error.body.message;
- }
- );
+ this.hass!.callApi(
+ "POST",
+ `hassio/${
+ atLeastVersion(this.hass!.config.version, 2021, 9)
+ ? "backups"
+ : "snapshots"
+ }/${this._backup!.slug}/restore/full`,
+ backupDetails
+ ).then(
+ () => {
+ this.closeDialog();
+ },
+ (error) => {
+ this._error = error.body.message;
+ }
+ );
} else {
fireEvent(this, "restoring");
fetch(`/api/hassio/backups/${this._backup!.slug}/restore/full`, {
@@ -283,36 +279,33 @@ class HassioBackupDialog
return;
}
- this.hass
-
- .callApi(
- atLeastVersion(this.hass.config.version, 2021, 9) ? "DELETE" : "POST",
- `hassio/${
- atLeastVersion(this.hass.config.version, 2021, 9)
- ? `backups/${this._backup!.slug}`
- : `snapshots/${this._backup!.slug}/remove`
- }`
- )
- .then(
- () => {
- if (this._dialogParams!.onDelete) {
- this._dialogParams!.onDelete();
- }
- this.closeDialog();
- },
- (error) => {
- this._error = error.body.message;
+ this.hass!.callApi(
+ atLeastVersion(this.hass!.config.version, 2021, 9) ? "DELETE" : "POST",
+ `hassio/${
+ atLeastVersion(this.hass!.config.version, 2021, 9)
+ ? `backups/${this._backup!.slug}`
+ : `snapshots/${this._backup!.slug}/remove`
+ }`
+ ).then(
+ () => {
+ if (this._dialogParams!.onDelete) {
+ this._dialogParams!.onDelete();
}
- );
+ this.closeDialog();
+ },
+ (error) => {
+ this._error = error.body.message;
+ }
+ );
}
private async _downloadClicked() {
let signedPath: { path: string };
try {
signedPath = await getSignedPath(
- this.hass,
+ this.hass!,
`/api/hassio/${
- atLeastVersion(this.hass.config.version, 2021, 9)
+ atLeastVersion(this.hass!.config.version, 2021, 9)
? "backups"
: "snapshots"
}/${this._backup!.slug}/download`
diff --git a/hassio/src/dialogs/registries/dialog-hassio-registries.ts b/hassio/src/dialogs/registries/dialog-hassio-registries.ts
index 28803a3298..1eb0072a3f 100644
--- a/hassio/src/dialogs/registries/dialog-hassio-registries.ts
+++ b/hassio/src/dialogs/registries/dialog-hassio-registries.ts
@@ -1,12 +1,12 @@
import "@material/mwc-button/mwc-button";
-import "@material/mwc-list/mwc-list-item";
import { mdiDelete } from "@mdi/js";
-import { PaperInputElement } from "@polymer/paper-input/paper-input";
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
import { customElement, property, state } from "lit/decorators";
-import "../../../../src/components/ha-circular-progress";
import { createCloseHeading } from "../../../../src/components/ha-dialog";
+import "../../../../src/components/ha-form/ha-form";
+import { HaFormSchema } from "../../../../src/components/ha-form/types";
import "../../../../src/components/ha-icon-button";
+import "../../../../src/components/ha-settings-row";
import { extractApiErrorMessage } from "../../../../src/data/hassio/common";
import {
addHassioDockerRegistry,
@@ -19,22 +19,41 @@ import { haStyle, haStyleDialog } from "../../../../src/resources/styles";
import type { HomeAssistant } from "../../../../src/types";
import { RegistriesDialogParams } from "./show-dialog-registries";
+const SCHEMA = [
+ {
+ type: "string",
+ name: "registry",
+ required: true,
+ },
+ {
+ type: "string",
+ name: "username",
+ required: true,
+ },
+ {
+ type: "string",
+ name: "password",
+ required: true,
+ format: "password",
+ },
+];
+
@customElement("dialog-hassio-registries")
class HassioRegistriesDialog extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) public supervisor!: Supervisor;
- @property({ attribute: false }) private _registries?: {
+ @state() private _registries?: {
registry: string;
username: string;
}[];
- @state() private _registry?: string;
-
- @state() private _username?: string;
-
- @state() private _password?: string;
+ @state() private _input: {
+ registry?: string;
+ username?: string;
+ password?: string;
+ } = {};
@state() private _opened = false;
@@ -47,6 +66,7 @@ class HassioRegistriesDialog extends LitElement {
@closed=${this.closeDialog}
scrimClickAction
escapeKeyAction
+ hideActions
.heading=${createCloseHeading(
this.hass,
this._addingRegistry
@@ -54,99 +74,77 @@ class HassioRegistriesDialog extends LitElement {
: this.supervisor.localize("dialog.registries.title_manage")
)}
>
- `}
`;
}
- private _inputChanged(ev: Event) {
- const target = ev.currentTarget as PaperInputElement;
- this[`_${target.name}`] = target.value;
+ private _computeLabel = (schema: HaFormSchema) =>
+ this.supervisor.localize(`dialog.registries.${schema.name}`) || schema.name;
+
+ private _valueChanged(ev: CustomEvent) {
+ this._input = ev.detail.value;
}
public async showDialog(dialogParams: RegistriesDialogParams): Promise {
this._opened = true;
+ this._input = {};
this.supervisor = dialogParams.supervisor;
await this._loadRegistries();
await this.updateComplete;
@@ -155,6 +153,7 @@ class HassioRegistriesDialog extends LitElement {
public closeDialog(): void {
this._addingRegistry = false;
this._opened = false;
+ this._input = {};
}
public focus(): void {
@@ -179,15 +178,16 @@ class HassioRegistriesDialog extends LitElement {
private async _addNewRegistry(): Promise {
const data = {};
- data[this._registry!] = {
- username: this._username,
- password: this._password,
+ data[this._input.registry!] = {
+ username: this._input.username,
+ password: this._input.password,
};
try {
await addHassioDockerRegistry(this.hass, data);
await this._loadRegistries();
this._addingRegistry = false;
+ this._input = {};
} catch (err: any) {
showAlertDialog(this, {
title: this.supervisor.localize("dialog.registries.failed_to_add"),
@@ -215,32 +215,20 @@ class HassioRegistriesDialog extends LitElement {
haStyle,
haStyleDialog,
css`
- ha-dialog.button-left {
- --justify-action-buttons: flex-start;
- }
- paper-icon-item {
- cursor: pointer;
- }
- .form {
- color: var(--primary-text-color);
- }
- .option {
+ .registry {
border: 1px solid var(--divider-color);
border-radius: 4px;
margin-top: 4px;
}
- mwc-button {
- margin-left: 8px;
+ .action {
+ margin-top: 24px;
+ width: 100%;
+ display: flex;
+ justify-content: flex-end;
}
ha-icon-button {
color: var(--error-color);
- margin: -10px;
- }
- mwc-list-item {
- cursor: default;
- }
- mwc-list-item span[slot="secondary"] {
- color: var(--secondary-text-color);
+ margin-right: -10px;
}
`,
];
diff --git a/setup.py b/setup.py
index a6fa1bada9..aeece81649 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
- version="20211103.0",
+ version="20211108.0",
description="The Home Assistant frontend",
url="https://github.com/home-assistant/frontend",
author="The Home Assistant Authors",
diff --git a/src/auth/ha-pick-auth-provider.ts b/src/auth/ha-pick-auth-provider.ts
index ecaff2ebd8..3ee7638b10 100644
--- a/src/auth/ha-pick-auth-provider.ts
+++ b/src/auth/ha-pick-auth-provider.ts
@@ -21,7 +21,11 @@ class HaPickAuthProvider extends litLocalizeLiteMixin(LitElement) {
${this.localize("ui.panel.page-authorize.pick_auth_provider")}:
${this.authProviders.map(
(provider) => html`
-
+
${provider.name}
diff --git a/src/common/const.ts b/src/common/const.ts
index 6559ece953..d75aa3f3dc 100644
--- a/src/common/const.ts
+++ b/src/common/const.ts
@@ -76,7 +76,6 @@ export const FIXED_DOMAIN_ICONS = {
configurator: mdiCog,
conversation: mdiTextToSpeech,
counter: mdiCounter,
- device_tracker: mdiAccount,
fan: mdiFan,
google_assistant: mdiGoogleAssistant,
group: mdiGoogleCirclesCommunities,
@@ -104,7 +103,6 @@ export const FIXED_DOMAIN_ICONS = {
siren: mdiBullhorn,
simple_alarm: mdiBell,
sun: mdiWhiteBalanceSunny,
- switch: mdiFlash,
timer: mdiTimerOutline,
updater: mdiCloudUpload,
vacuum: mdiRobotVacuum,
@@ -145,6 +143,7 @@ export const FIXED_DEVICE_CLASS_ICONS = {
/** Domains that have a state card. */
export const DOMAINS_WITH_CARD = [
+ "button",
"climate",
"cover",
"configurator",
diff --git a/src/common/entity/binary_sensor_icon.ts b/src/common/entity/binary_sensor_icon.ts
index 0f1dfaeaf2..0d104e87e9 100644
--- a/src/common/entity/binary_sensor_icon.ts
+++ b/src/common/entity/binary_sensor_icon.ts
@@ -6,6 +6,8 @@ import {
mdiBrightness5,
mdiBrightness7,
mdiCheckboxMarkedCircle,
+ mdiCheckNetworkOutline,
+ mdiCloseNetworkOutline,
mdiCheckCircle,
mdiCropPortrait,
mdiDoorClosed,
@@ -26,8 +28,6 @@ import {
mdiPowerPlugOff,
mdiRadioboxBlank,
mdiRun,
- mdiServerNetwork,
- mdiServerNetworkOff,
mdiSmoke,
mdiSnowflake,
mdiSquare,
@@ -55,7 +55,7 @@ export const binarySensorIcon = (state?: string, stateObj?: HassEntity) => {
case "cold":
return is_off ? mdiThermometer : mdiSnowflake;
case "connectivity":
- return is_off ? mdiServerNetworkOff : mdiServerNetwork;
+ return is_off ? mdiCloseNetworkOutline : mdiCheckNetworkOutline;
case "door":
return is_off ? mdiDoorClosed : mdiDoorOpen;
case "garage_door":
diff --git a/src/common/entity/compute_state_display.ts b/src/common/entity/compute_state_display.ts
index 1836d5d6a5..c07be7594d 100644
--- a/src/common/entity/compute_state_display.ts
+++ b/src/common/entity/compute_state_display.ts
@@ -116,6 +116,14 @@ export const computeStateDisplay = (
return formatNumber(compareState, locale);
}
+ // state of button is a timestamp
+ if (
+ domain === "button" ||
+ (domain === "sensor" && stateObj.attributes.device_class === "timestamp")
+ ) {
+ return formatDateTime(new Date(compareState), locale);
+ }
+
return (
// Return device class translation
(stateObj.attributes.device_class &&
diff --git a/src/common/entity/domain_icon.ts b/src/common/entity/domain_icon.ts
index 3816c925de..2a0c3031b3 100644
--- a/src/common/entity/domain_icon.ts
+++ b/src/common/entity/domain_icon.ts
@@ -1,6 +1,13 @@
import {
+ mdiAccount,
+ mdiAccountArrowRight,
mdiAirHumidifierOff,
mdiAirHumidifier,
+ mdiFlash,
+ mdiBluetooth,
+ mdiBluetoothConnect,
+ mdiLanConnect,
+ mdiLanDisconnect,
mdiLockOpen,
mdiLockAlert,
mdiLockClock,
@@ -8,8 +15,12 @@ import {
mdiCastConnected,
mdiCast,
mdiEmoticonDead,
+ mdiPowerPlug,
+ mdiPowerPlugOff,
mdiSleep,
mdiTimerSand,
+ mdiToggleSwitch,
+ mdiToggleSwitchOff,
mdiZWave,
mdiClock,
mdiCalendar,
@@ -44,6 +55,17 @@ export const domainIcon = (
case "cover":
return coverIcon(compareState, stateObj);
+ case "device_tracker":
+ if (stateObj?.attributes.source_type === "router") {
+ return compareState === "home" ? mdiLanConnect : mdiLanDisconnect;
+ }
+ if (
+ ["bluetooth", "bluetooth_le"].includes(stateObj?.attributes.source_type)
+ ) {
+ return compareState === "home" ? mdiBluetoothConnect : mdiBluetooth;
+ }
+ return compareState === "not_home" ? mdiAccountArrowRight : mdiAccount;
+
case "humidifier":
return state && state === "off" ? mdiAirHumidifierOff : mdiAirHumidifier;
@@ -63,6 +85,16 @@ export const domainIcon = (
case "media_player":
return compareState === "playing" ? mdiCastConnected : mdiCast;
+ case "switch":
+ switch (stateObj?.attributes.device_class) {
+ case "outlet":
+ return state === "on" ? mdiPowerPlug : mdiPowerPlugOff;
+ case "switch":
+ return state === "on" ? mdiToggleSwitch : mdiToggleSwitchOff;
+ default:
+ return mdiFlash;
+ }
+
case "zwave":
switch (compareState) {
case "dead":
diff --git a/src/common/translations/localize.ts b/src/common/translations/localize.ts
index a094d48b3e..6ff6e24b90 100644
--- a/src/common/translations/localize.ts
+++ b/src/common/translations/localize.ts
@@ -32,6 +32,7 @@ if (__BUILD__ === "latest") {
}
if (shouldPolyfillDateTime()) {
polyfills.push(import("@formatjs/intl-datetimeformat/polyfill"));
+ polyfills.push(import("@formatjs/intl-datetimeformat/add-all-tz"));
}
}
diff --git a/src/components/ha-file-upload.ts b/src/components/ha-file-upload.ts
index 611ff357d5..31dd853e06 100644
--- a/src/components/ha-file-upload.ts
+++ b/src/components/ha-file-upload.ts
@@ -17,7 +17,7 @@ declare global {
@customElement("ha-file-upload")
export class HaFileUpload extends LitElement {
- @property({ attribute: false }) public hass!: HomeAssistant;
+ @property({ attribute: false }) public hass?: HomeAssistant;
@property() public accept!: string;
@@ -88,7 +88,8 @@ export class HaFileUpload extends LitElement {
`
diff --git a/src/components/ha-form/ha-form-float.ts b/src/components/ha-form/ha-form-float.ts
index f27c669247..7cae936ef7 100644
--- a/src/components/ha-form/ha-form-float.ts
+++ b/src/components/ha-form/ha-form-float.ts
@@ -47,12 +47,19 @@ export class HaFormFloat extends LitElement implements HaFormElement {
private _valueChanged(ev: Event) {
const source = ev.target as TextField;
- const rawValue = source.value;
+ const rawValue = source.value.replace(",", ".");
let value: number | undefined;
+ if (rawValue.endsWith(".")) {
+ return;
+ }
+
if (rawValue !== "") {
value = parseFloat(rawValue);
+ if (isNaN(value)) {
+ value = undefined;
+ }
}
// Detect anything changed
@@ -61,7 +68,6 @@ export class HaFormFloat extends LitElement implements HaFormElement {
const newRawValue = value === undefined ? "" : String(value);
if (source.value !== newRawValue) {
source.value = newRawValue;
- return;
}
return;
}
diff --git a/src/components/ha-icon-picker.ts b/src/components/ha-icon-picker.ts
index 9197d5bb7b..93da7a5d87 100644
--- a/src/components/ha-icon-picker.ts
+++ b/src/components/ha-icon-picker.ts
@@ -60,6 +60,8 @@ export class HaIconPicker extends LitElement {
@property({ type: Boolean }) public disabled = false;
+ @property({ type: Boolean }) public invalid = false;
+
@state() private _opened = false;
@query("vaadin-combo-box-light", true) private comboBox!: HTMLElement;
@@ -86,6 +88,8 @@ export class HaIconPicker extends LitElement {
autocomplete="off"
autocorrect="off"
spellcheck="false"
+ .errorMessage=${this.errorMessage}
+ .invalid=${this.invalid}
>
${this._value || this.placeholder
? html`
diff --git a/src/components/ha-target-picker.ts b/src/components/ha-target-picker.ts
index 4edf45230d..85fb984a59 100644
--- a/src/components/ha-target-picker.ts
+++ b/src/components/ha-target-picker.ts
@@ -502,6 +502,9 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) {
}
private _entityRegMeetsFilter(entity: EntityRegistryEntry): boolean {
+ if (entity.entity_category) {
+ return false;
+ }
if (
this.includeDomains &&
!this.includeDomains.includes(computeDomain(entity.entity_id))
diff --git a/src/data/hassio/backup.ts b/src/data/hassio/backup.ts
index b19d4c1c66..c5af101857 100644
--- a/src/data/hassio/backup.ts
+++ b/src/data/hassio/backup.ts
@@ -79,7 +79,7 @@ export const fetchHassioBackups = async (
};
export const fetchHassioBackupInfo = async (
- hass: HomeAssistant,
+ hass: HomeAssistant | undefined,
backup: string
): Promise => {
if (hass) {
@@ -202,7 +202,7 @@ export const createHassioPartialBackup = async (
};
export const uploadBackup = async (
- hass: HomeAssistant,
+ hass: HomeAssistant | undefined,
file: File
): Promise> => {
const fd = new FormData();
diff --git a/src/data/zone.ts b/src/data/zone.ts
index e1c630f020..a4e091c30e 100644
--- a/src/data/zone.ts
+++ b/src/data/zone.ts
@@ -12,7 +12,7 @@ export interface Zone {
}
export interface ZoneMutableParams {
- icon: string;
+ icon?: string;
latitude: number;
longitude: number;
name: string;
diff --git a/src/dialogs/config-flow/step-flow-pick-flow.ts b/src/dialogs/config-flow/step-flow-pick-flow.ts
index 82578354d3..2296d465a0 100644
--- a/src/dialogs/config-flow/step-flow-pick-flow.ts
+++ b/src/dialogs/config-flow/step-flow-pick-flow.ts
@@ -45,7 +45,7 @@ class StepFlowPickFlow extends LitElement {
domain: flow.handler,
type: "icon",
useFallback: true,
- darkOptimized: this.hass.selectedTheme?.dark,
+ darkOptimized: this.hass.themes?.darkMode,
})}
referrerpolicy="no-referrer"
/>
diff --git a/src/dialogs/config-flow/step-flow-pick-handler.ts b/src/dialogs/config-flow/step-flow-pick-handler.ts
index e15a2d1316..d3b0028b3e 100644
--- a/src/dialogs/config-flow/step-flow-pick-handler.ts
+++ b/src/dialogs/config-flow/step-flow-pick-handler.ts
@@ -102,7 +102,7 @@ class StepFlowPickHandler extends LitElement {
domain: handler.slug,
type: "icon",
useFallback: true,
- darkOptimized: this.hass.selectedTheme?.dark,
+ darkOptimized: this.hass.themes?.darkMode,
})}
referrerpolicy="no-referrer"
/>
diff --git a/src/html/authorize.html.template b/src/html/authorize.html.template
index 4b7fbc9c53..988170769f 100644
--- a/src/html/authorize.html.template
+++ b/src/html/authorize.html.template
@@ -33,7 +33,7 @@
Initializing
@@ -70,4 +70,4 @@
})();
-