diff --git a/package-lock.json b/package-lock.json index 7b422758..253878a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,9 @@ "@material/mwc-dialog": "^0.27.0", "@material/mwc-fab": "^0.27.0", "@material/mwc-formfield": "^0.27.0", + "@material/mwc-icon": "^0.27.0", "@material/mwc-icon-button": "^0.27.0", + "@material/mwc-linear-progress": "^0.27.0", "@material/mwc-list": "^0.27.0", "@material/mwc-menu": "^0.27.0", "@material/mwc-radio": "^0.27.0", @@ -283,6 +285,21 @@ "tslib": "^2.1.0" } }, + "node_modules/@material/linear-progress": { + "version": "14.0.0-canary.53b3cad2f.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-14.0.0-canary.53b3cad2f.0.tgz", + "integrity": "sha512-QqkDBcqX7TMt3zQn51LgS7K0y13rJ4ppMQL1f2uYBhDOov8nqndlaXw456KYE9RhU39JrLzVQlaAbU3eecVb/Q==", + "dependencies": { + "@material/animation": "14.0.0-canary.53b3cad2f.0", + "@material/base": "14.0.0-canary.53b3cad2f.0", + "@material/dom": "14.0.0-canary.53b3cad2f.0", + "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0", + "@material/progress-indicator": "14.0.0-canary.53b3cad2f.0", + "@material/rtl": "14.0.0-canary.53b3cad2f.0", + "@material/theme": "14.0.0-canary.53b3cad2f.0", + "tslib": "^2.1.0" + } + }, "node_modules/@material/list": { "version": "14.0.0-canary.53b3cad2f.0", "license": "MIT", @@ -438,6 +455,18 @@ "tslib": "^2.0.1" } }, + "node_modules/@material/mwc-linear-progress": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@material/mwc-linear-progress/-/mwc-linear-progress-0.27.0.tgz", + "integrity": "sha512-kpWVLHPb7RzHU70Dq9bl1lBv05S49rQkyfFoL3PU5tEZHozT8IPQjdBLqAqd7H10cfLVjO7oIB+mVmvnFV+UsQ==", + "dependencies": { + "@material/linear-progress": "=14.0.0-canary.53b3cad2f.0", + "@material/mwc-base": "^0.27.0", + "@material/theme": "=14.0.0-canary.53b3cad2f.0", + "lit": "^2.0.0", + "tslib": "^2.0.1" + } + }, "node_modules/@material/mwc-list": { "version": "0.27.0", "license": "Apache-2.0", @@ -3476,6 +3505,21 @@ "tslib": "^2.1.0" } }, + "@material/linear-progress": { + "version": "14.0.0-canary.53b3cad2f.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-14.0.0-canary.53b3cad2f.0.tgz", + "integrity": "sha512-QqkDBcqX7TMt3zQn51LgS7K0y13rJ4ppMQL1f2uYBhDOov8nqndlaXw456KYE9RhU39JrLzVQlaAbU3eecVb/Q==", + "requires": { + "@material/animation": "14.0.0-canary.53b3cad2f.0", + "@material/base": "14.0.0-canary.53b3cad2f.0", + "@material/dom": "14.0.0-canary.53b3cad2f.0", + "@material/feature-targeting": "14.0.0-canary.53b3cad2f.0", + "@material/progress-indicator": "14.0.0-canary.53b3cad2f.0", + "@material/rtl": "14.0.0-canary.53b3cad2f.0", + "@material/theme": "14.0.0-canary.53b3cad2f.0", + "tslib": "^2.1.0" + } + }, "@material/list": { "version": "14.0.0-canary.53b3cad2f.0", "requires": { @@ -3617,6 +3661,18 @@ "tslib": "^2.0.1" } }, + "@material/mwc-linear-progress": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@material/mwc-linear-progress/-/mwc-linear-progress-0.27.0.tgz", + "integrity": "sha512-kpWVLHPb7RzHU70Dq9bl1lBv05S49rQkyfFoL3PU5tEZHozT8IPQjdBLqAqd7H10cfLVjO7oIB+mVmvnFV+UsQ==", + "requires": { + "@material/linear-progress": "=14.0.0-canary.53b3cad2f.0", + "@material/mwc-base": "^0.27.0", + "@material/theme": "=14.0.0-canary.53b3cad2f.0", + "lit": "^2.0.0", + "tslib": "^2.0.1" + } + }, "@material/mwc-list": { "version": "0.27.0", "requires": { diff --git a/package.json b/package.json index 5f367c0c..04d8383e 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,9 @@ "@material/mwc-dialog": "^0.27.0", "@material/mwc-fab": "^0.27.0", "@material/mwc-formfield": "^0.27.0", + "@material/mwc-icon": "^0.27.0", "@material/mwc-icon-button": "^0.27.0", + "@material/mwc-linear-progress": "^0.27.0", "@material/mwc-list": "^0.27.0", "@material/mwc-menu": "^0.27.0", "@material/mwc-radio": "^0.27.0", diff --git a/raw_package/static/css/esphome-2.css b/raw_package/static/css/esphome-2.css index 308e7150..80f7db94 100644 --- a/raw_package/static/css/esphome-2.css +++ b/raw_package/static/css/esphome-2.css @@ -4,7 +4,8 @@ /* Colors */ --primary-bg-color: #fafafa; --primary-footer-bg-color: #212121; - --card-background-color: #fafafa; + --disabled-text-color: #bdbdbd; + --card-background-color: #ffffff; --alert-standard-color: #666666; --alert-standard-color-bg: #e6e6e6; --alert-info-color: #00539f; @@ -17,6 +18,7 @@ --alert-error-color-bg: #faefeb; --mdc-theme-primary: #03a9f4; --primary-text-color: #212121; + --secondary-text-color: #727272; --mdc-dialog-z-index: 998; --mdc-theme-primary-no-attention: #444444; --mdc-theme-on-primary-no-attention: white; @@ -28,16 +30,25 @@ --status-connected: #444444; --status-new: #ffa500; --status-imported: #4caf50; + --divider-color: #e8e8e8; + --invert-logo: 0; + --divider-color: #e8e8e8; + --invert-logo: 0; + --mdc-shape-medium: 12px; + --mdc-shape-small: 6px; + --mdc-theme-primary: #03a9f4; } /* dark theme */ @media (prefers-color-scheme: dark) { :root { - --primary-bg-color: #000000; + --primary-bg-color: #282828; --primary-text-color: #e1e1e1; + --secondary-text-color: #727272; + --disabled-text-color: #bdbdbd; --primary-footer-bg-color: #101e24; - --esphome-background-header: #282828; - --card-background-color: #282828; + --esphome-background-header: #e0e0e0; + --card-background-color: #000000; --card-text-color: #e1e1e1; --primary-text-color: #e1e1e1; --mdc-theme-surface: #282828; @@ -55,10 +66,12 @@ --update-available-color: #5f7eeb; --status-connected: #cecece; --mdc-ripple-color: #bebebe; + --divider-color: #3d3d3d; + --invert-logo: 1; } .esphome-header img { - filter: invert(1); + filter: invert(var(--invert-logo)); } } @@ -67,8 +80,8 @@ html { line-height: 1.5; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, - Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", + sans-serif; } body { @@ -97,12 +110,22 @@ esphome-main { top: 0; right: 0; left: 0; + height: 55px; + background: var(--card-background-color); + border: rgba(0, 0, 0, 0.12) 1px solid; + /* padding: 0 96px; */ display: flex; align-items: center; - height: 56px; - background-color: var(--esphome-background-header); +} + +.header-container { color: var(--primary-text-color); - padding: 0 24px; + display: flex; + align-items: center; + margin: auto; + width: 90%; + max-width: 1920px; + justify-content: stretch; z-index: 1; } @@ -112,7 +135,7 @@ esphome-main { .esphome-header img { width: auto; - height: 48px; + height: 32px; } #js-loading-indicator { @@ -136,8 +159,7 @@ esphome-main { font-size: 85%; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px; - font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, - monospace; + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; } ul.browser-default { @@ -168,19 +190,21 @@ ul.browser-default li { .page-footer { display: flex; align-items: center; - min-height: 50px; - color: grey; - background-color: var(--primary-footer-bg-color); + margin: auto; + width: 90%; + max-width: 1920px; + justify-content: stretch; + height: 100px; + color: var(--disabled-text-color); } .page-footer a { - color: #afafaf; + color: var(--mdc-theme-primary); + transition: color 0.2s ease-in-out; } -@media only screen and (min-width: 993px) { - .page-footer { - padding-left: 10%; - } +.page-footer a:hover { + color: var(--mdc-theme-primary); } @media only screen and (max-width: 992px) { @@ -195,7 +219,7 @@ ul.browser-default li { margin-top: 52px; } .page-footer { - padding-bottom: 72px; /* allow reading footer while fab hovers */ + padding-bottom: 168px; /* allow reading footer while fab hovers */ box-sizing: border-box; justify-content: center; } diff --git a/src/components/esphome-card.ts b/src/components/esphome-card.ts index fd434164..c8ca38f4 100644 --- a/src/components/esphome-card.ts +++ b/src/components/esphome-card.ts @@ -10,10 +10,9 @@ export class ESPHomeCard extends LitElement { static styles = css` :host { - background: var(--card-background-color, white); - border-radius: 2px; - box-shadow: 0 2px 2px 0 rgb(0 0 0 / 14%), 0 3px 1px -2px rgb(0 0 0 / 12%), - 0 1px 5px 0 rgb(0 0 0 / 20%); + background: var(--card-background-color); + border-radius: 12px; + border: var(--status-color) /* rgba(0, 0, 0, 0.12) */ 1px solid; color: var(--primary-text-color); display: block; position: relative; @@ -45,37 +44,19 @@ export class ESPHomeCard extends LitElement { padding: 5px 16px; } - .status-bar { - display: block; - background-color: var(--status-color); - color: var(--status-color); - position: absolute; - height: 4px; - left: 0; - right: 0; - top: 0; - border-top-left-radius: 2px; - border-top-right-radius: 2px; - transition: all 0.2s ease-in-out; + :host(.highlight) { + animation: highlight 0.5s alternate infinite ease-in; } - .status-bar::after { - display: block; + + .card-status-text { position: absolute; - right: 2px; - top: 3px; - font-weight: bold; + top: 16px; + right: 16px; font-size: 12px; - content: attr(data-status); - } - :host([no-status-bar]) .status-bar { - height: 0px; - } - :host([no-status-bar]) .status-bar::after { - top: -1px; - } - - :host(.highlight) { - animation: highlight 0.5s alternate infinite ease-in; + line-height: 16px; + color: var(--status-color); + font-weight: bold; + text-transform: uppercase; } @keyframes highlight { @@ -96,8 +77,14 @@ export class ESPHomeCard extends LitElement { protected render(): TemplateResult { return html` - ${this.status - ? html`
` + ${this?.status !== undefined + ? html` +
+ ${this.status !== "ONLINE" && this.status !== undefined + ? this.status + : ""} +
+ ` : ""} `; diff --git a/src/components/esphome-fab.ts b/src/components/esphome-fab.ts index c23b2adf..449209c6 100644 --- a/src/components/esphome-fab.ts +++ b/src/components/esphome-fab.ts @@ -6,14 +6,14 @@ import { openWizardDialog } from "../wizard"; @customElement("esphome-fab") export class ESPHomeFab extends LitElement { protected override render(): TemplateResult { - return html` + return html`
- `; +
`; } private _handleClick() { @@ -21,12 +21,27 @@ export class ESPHomeFab extends LitElement { } static styles = css` + .fab-container { + position: absolute; + bottom: 50px; + right: 0; + left: 0; + display: flex; + align-items: center; + margin: auto; + width: 90%; + height: 100px; + max-width: 1920px; + justify-content: stretch; + pointer-events: none; + } + mwc-fab { - position: fixed; - right: 23px; - bottom: 23px; + position: absolute; + right: 0; + bottom: 0; z-index: 997; - --mdc-theme-secondary: var(--alert-success-color); + --mdc-theme-secondary: #03a9f4; } `; } diff --git a/src/components/esphome-header-menu.ts b/src/components/esphome-header-menu.ts index ce0a1044..373057c1 100644 --- a/src/components/esphome-header-menu.ts +++ b/src/components/esphome-header-menu.ts @@ -5,6 +5,7 @@ import "@material/mwc-list/mwc-list-item"; import "@material/mwc-icon-button"; import "@material/mwc-button"; import "@material/mwc-icon"; +import "@polymer/paper-tooltip/paper-tooltip.js"; import type { ActionDetail } from "@material/mwc-list/mwc-list-foundation"; import { openEditDialog, toggleSearch } from "../editor"; import { SECRETS_FILE } from "../api/secrets"; @@ -21,55 +22,107 @@ export class ESPHomeHeaderMenu extends LitElement { protected render(): TemplateResult { if (this._isWide) { + const logoutIcon = this.logoutUrl + ? html` + + + + + ` + : html``; + + const customIconButton = ( + icon: string | TemplateResult<1>, + label: string, + clickHandler: () => void + ): TemplateResult => { + if (typeof icon !== "string") { + return html` +
+ + ${icon} + + ${label} +
+ `; + } + return html` +
+ + ${label} +
+ `; + }; + return html` - - - ${this.logoutUrl - ? html` - - ` - : ""} - - search - +
+ ${customIconButton( + "system_update", + "Update All", + this._handleUpdateAll + )} + ${customIconButton( + "lock_outlined", + "Secrets", + this._handleEditSecrets + )} + ${customIconButton("search", "Search", this._handleSearch)} + ${this.logoutUrl + ? html` + + ${customIconButton(logoutIcon, "Log Out", () => {})} + + ` + : ""} +
`; } return html` - - - searchSearch + - system_updateUpdate - All - lockSecrets Editor - ${this.logoutUrl - ? html` - Log Out - ` - : ""} - - + + searchSearch + system_updateUpdate + All + lock_outlinedSecrets + Editor + ${this.logoutUrl + ? html` + Log Out + ` + : ""} + + + `; } @@ -124,6 +177,13 @@ export class ESPHomeHeaderMenu extends LitElement { } static styles = css` + .esphome-header-menu { + display: flex; + align-items: center; + flex-direction: row; + gap: 8px; + } + esphome-button-menu { z-index: 1; } @@ -132,17 +192,16 @@ export class ESPHomeHeaderMenu extends LitElement { margin-left: 16px; line-height: 1em; } - mwc-button.search { - margin: 0; - padding: 0; - width: 30px; - } mwc-icon { --mdc-theme-text-icon-on-background: var(--primary-text-color); } a { text-decoration: none; } + + .custom-icon { + color: var(--primary-text-color); + } `; } diff --git a/src/components/esphome-search.ts b/src/components/esphome-search.ts index 7cb5ae3e..abc21093 100644 --- a/src/components/esphome-search.ts +++ b/src/components/esphome-search.ts @@ -10,9 +10,9 @@ export class ESPHomeSearch extends LitElement { @query("esphome-text-input") private _textField!: ESPHomeTextInput; protected override render(): TemplateResult { - if (!this.show) { + /* if (!this.show) { return html``; - } + } */ return html`
@@ -139,6 +142,7 @@ class ESPHomeConfiguredDeviceCard extends LitElement { @@ -226,7 +230,7 @@ class ESPHomeConfiguredDeviceCard extends LitElement { padding: 0.2em 0.4em; margin: 0; font-size: 85%; - background-color: var(--card-background-color) + background-color: var(--card-background-color); border-radius: 3px; font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; @@ -235,8 +239,9 @@ class ESPHomeConfiguredDeviceCard extends LitElement { --mdc-theme-primary: var(--update-available-color); } esphome-button-menu { - --mdc-theme-text-icon-on-background: var(--primary-text-color); + --mdc-theme-text-icon-on-background: var(--mdc-theme-primary); } + .tooltip-container { display: inline-block; } @@ -244,7 +249,7 @@ class ESPHomeConfiguredDeviceCard extends LitElement { color: var(--alert-error-color); } .mdc-icon-button { - color: var(--primary-text-color); + color: var(--mdc-theme-primary); } `, ]; diff --git a/src/devices/devices-list.ts b/src/devices/devices-list.ts index 905d8ec7..0e856201 100644 --- a/src/devices/devices-list.ts +++ b/src/devices/devices-list.ts @@ -9,7 +9,9 @@ import { } from "../api/devices"; import { openWizardDialog } from "../wizard"; import "@material/mwc-button"; +import "@material/mwc-icon"; import "@material/mwc-textfield"; +import "@material/mwc-linear-progress"; import { subscribeOnlineStatus } from "../api/online-status"; import "./configured-device-card"; import "./importable-device-card"; @@ -34,69 +36,94 @@ class ESPHomeDevicesList extends LitElement { }; protected render() { + const emptySvg = html` + + + + `; if (this._devices?.length === 0) { return html` -
+
+ ${emptySvg}
Welcome to ESPHome
-

It looks like you don't yet have any devices.

-

- +

+ It looks like you don't have any devices yet.

-
+ + `; } // catch when 1st load there is no data yet, and we don't want to show no devices message if (!this._devices) { - return html``; + return html`
+
+ +
+
`; } const filtered: Array = this._devices!.filter((item) => this._filter(item)); - - let htmlClass = "no-result-container"; - let htmlDevices = html` -
No devices found
-

Adjust your search criteria.

- `; - if ((filtered?.length ? filtered?.length : 0) > 0) { - htmlClass = "grid"; - htmlDevices = html`${repeat( - filtered!, - (device) => device.name, - (device) => html` - ${this._isImportable(device) - ? html`` - : html``} - ` - )}`; + if (filtered?.length === 0) { + return html` +
+ ${emptySvg} +
No devices found
+

+ Please try entering a different search term or + add a new device. +

+
+ `; } + const htmlDevices = html`${repeat( + filtered!, + (device) => device.name, + (device) => html` + ${this._isImportable(device) + ? html`` + : html``} + ` + )}`; + return html` - this.requestUpdate()}> -
${htmlDevices}
+
+ this.requestUpdate()}> +
${htmlDevices}
+
`; } @@ -137,14 +164,22 @@ class ESPHomeDevicesList extends LitElement { } static styles = css` + .page-container { + display: flex; + flex-direction: column; + width: 90%; + margin: 20px auto; + align-items: stretch; + max-width: 1920px; + gap: 20px; + } + .grid { + width: 100%; display: grid; grid-template-columns: 1fr; grid-template-columns: 1fr 1fr 1fr; grid-column-gap: 1.5rem; - margin: 20px auto; - width: 90%; - max-width: 1920px; justify-content: stretch; } @media only screen and (max-width: 1100px) { @@ -166,17 +201,31 @@ class ESPHomeDevicesList extends LitElement { esphome-importable-device-card { margin: 0.5rem 0 1rem 0; } + .no-result-container { text-align: center; margin-top: 40px; color: var(--primary-text-color); } - h5 { + + .no-result-container h5 { font-size: 1.64rem; line-height: 110%; font-weight: 400; margin: 1rem 0 0.65rem 0; } + .no-result-container .helper-text { + color: var(--secondary-text-color); + } + .no-result-container .empty-icon { + width: 100px; + color: var(--disabled-text-color); + } + + .no-result-container a { + color: var(--mdc-theme-primary); + } + hr { margin-top: 16px; margin-bottom: 16px; diff --git a/src/devices/importable-device-card.ts b/src/devices/importable-device-card.ts index 5a33dfe5..81324a37 100644 --- a/src/devices/importable-device-card.ts +++ b/src/devices/importable-device-card.ts @@ -9,10 +9,40 @@ import { esphomeCardStyles } from "../styles"; @customElement("esphome-importable-device-card") class ESPHomeImportableDeviceCard extends LitElement { - @property() public device!: ImportableDevice; - @property() public highlightOnAdd = false; + @property({ attribute: false }) public device!: ImportableDevice; + @property({ type: Boolean }) public highlightOnAdd = false; + @property({ type: Boolean }) public skeleton = false; protected render() { + if (this.skeleton || !this.device) { + return html` + +
+
+ ${" "} +
+
+
+
+ ${" "} ${" "} +
+
+
+ + + +
+ + + +
+
+ `; + } return html`
@@ -56,6 +86,28 @@ class ESPHomeImportableDeviceCard extends LitElement { esphome-card { --status-color: var(--status-imported); } + + esphome-card.skeleton { + min-height: 145px; + /* skeleton animation on background */ + background: #eee; + background: linear-gradient( + 110deg, + #ececec 8%, + #f5f5f5 18%, + #ececec 33% + ); + + background-size: 200% 100%; + animation: 1.5s shine linear infinite; + } + + @keyframes shine { + to { + background-position-x: -200%; + } + } + .inlinecode { box-sizing: border-box; padding: 0.2em 0.4em; diff --git a/src/dialogs/confirmation-dialog.ts b/src/dialogs/confirmation-dialog.ts index 96181a88..fea242cd 100644 --- a/src/dialogs/confirmation-dialog.ts +++ b/src/dialogs/confirmation-dialog.ts @@ -41,6 +41,7 @@ class ESPHomeConfirmationDialog extends LitElement { class=${classMap({ destructive: this._params.destructive || false, })} + raised dialogAction="confirm" > @@ -54,10 +55,10 @@ class ESPHomeConfirmationDialog extends LitElement { static get styles(): CSSResultGroup { return css` - mwc-button { - --mdc-theme-primary: var(--primary-text-color); + mwc-button button { + display: flex; + align-items: center; } - .destructive { --mdc-theme-primary: var(--alert-error-color); } diff --git a/src/editor/esphome-editor.ts b/src/editor/esphome-editor.ts index 97baa164..d91787ce 100644 --- a/src/editor/esphome-editor.ts +++ b/src/editor/esphome-editor.ts @@ -54,6 +54,7 @@ class ESPHomeEditor extends LitElement { overflow: hidden; } .esphome-header { + padding: 0 2rem; display: flex; justify-content: space-between; align-items: center; @@ -73,9 +74,6 @@ class ESPHomeEditor extends LitElement { mwc-icon-button { --mdc-icon-button-size: 32px; } - mwc-button { - --mdc-theme-primary: var(--primary-text-color); - } diff --git a/src/esphome-main.ts b/src/esphome-main.ts index 6974e30f..b27633ab 100644 --- a/src/esphome-main.ts +++ b/src/esphome-main.ts @@ -32,11 +32,14 @@ class ESPHomeMainView extends LitElement { } return html`
- ESPHome Logo -
- +
+ ESPHome Logo +
+ +
-
diff --git a/src/styles.ts b/src/styles.ts index 4b9a0085..b0ce105b 100644 --- a/src/styles.ts +++ b/src/styles.ts @@ -14,7 +14,6 @@ export const esphomeCardStyles = css` } mwc-button { line-height: 1em; - --mdc-theme-primary: var(--primary-text-color); } .card-actions { display: flex; @@ -76,8 +75,7 @@ export const esphomeDialogStyles = css` } mwc-button[no-attention] { - --mdc-theme-primary: var(--mdc-theme-primary-no-attention); - --mdc-theme-on-primary: var(--mdc-theme-on-primary-no-attention); + --mdc-theme-primary: var(--mdc-theme-primary); } @media only screen and (max-width: 450px) { @@ -99,9 +97,9 @@ export const esphomeDialogStyles = css` padding: 0 24px; } - mwc-button { - --mdc-theme-primary: var(--primary-text-color); - } + /* mwc-button { + --mdc-theme-primary: var(--primary-theme-color); + } */ `; export const esphomeSvgStyles = css` diff --git a/src/wizard/wizard-dialog.ts b/src/wizard/wizard-dialog.ts index 3ff11949..9fe409e0 100644 --- a/src/wizard/wizard-dialog.ts +++ b/src/wizard/wizard-dialog.ts @@ -233,6 +233,7 @@ export class ESPHomeWizardDialog extends LitElement { { this._state = "basic_config"; }} @@ -244,11 +245,7 @@ export class ESPHomeWizardDialog extends LitElement { target="_blank" rel="noopener" > - + `; @@ -302,6 +299,7 @@ export class ESPHomeWizardDialog extends LitElement {