Compare commits

..

1 Commits

Author SHA1 Message Date
Erik
e1dff6ad30 Add preview for time_date integration 2024-01-02 22:04:25 +01:00
1039 changed files with 23689 additions and 39619 deletions

View File

@@ -1,5 +1,5 @@
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.148.1/containers/python-3/.devcontainer/base.Dockerfile # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.148.1/containers/python-3/.devcontainer/base.Dockerfile
FROM mcr.microsoft.com/devcontainers/python:3.12 FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.11
ENV \ ENV \
DEBIAN_FRONTEND=noninteractive \ DEBIAN_FRONTEND=noninteractive \

View File

@@ -5,7 +5,6 @@
"context": ".." "context": ".."
}, },
"appPort": "8124:8123", "appPort": "8124:8123",
"postCreateCommand": "sudo apt update && sudo apt upgrade -y && sudo apt install -y libpcap-dev",
"postStartCommand": "script/bootstrap", "postStartCommand": "script/bootstrap",
"containerEnv": { "containerEnv": {
"WORKSPACE_DIRECTORY": "${containerWorkspaceFolder}" "WORKSPACE_DIRECTORY": "${containerWorkspaceFolder}"

22
.github/labeler.yml vendored
View File

@@ -24,20 +24,14 @@ Design:
- src/fake_data/** - src/fake_data/**
Dependencies: Dependencies:
- any: - changed-files:
- changed-files: - any-glob-to-any-file:
# Match when only these files are changed (i.e. don't match PRs that happen to add or remove packages) - package.json
- any-glob-to-all-files: - renovate.json
- package.json - yarn.lock
- renovate.json - .yarn/**
- yarn.lock - .yarnrc.yml
- .yarn/** - .nvmrc
- .yarnrc.yml
- .nvmrc
# Dependabot and Renovate branches always match (i.e. compatibility tweaks by members considered minor)
- head-branch:
- "^renovate/"
- "^dependabot/"
GitHub Actions: GitHub Actions:
- changed-files: - changed-files:

View File

@@ -21,12 +21,12 @@ jobs:
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
with: with:
ref: dev ref: dev
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn
@@ -57,12 +57,12 @@ jobs:
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
with: with:
ref: master ref: master
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn

View File

@@ -24,9 +24,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn
@@ -37,20 +37,17 @@ jobs:
- name: Build resources - name: Build resources
run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data gather-gallery-pages run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data gather-gallery-pages
- name: Setup lint cache - name: Setup lint cache
uses: actions/cache@v4.0.2 uses: actions/cache@v3.3.2
with: with:
path: | path: |
node_modules/.cache/prettier node_modules/.cache/prettier
node_modules/.cache/eslint node_modules/.cache/eslint
node_modules/.cache/typescript
key: lint-${{ github.sha }} key: lint-${{ github.sha }}
restore-keys: lint- restore-keys: lint-
- name: Run eslint - name: Run eslint
run: yarn run lint:eslint --quiet run: yarn run lint:eslint --quiet
- name: Run tsc - name: Run tsc
run: yarn run lint:types run: yarn run lint:types
- name: Run lit-analyzer
run: yarn run lint:lit --quiet
- name: Run prettier - name: Run prettier
run: yarn run lint:prettier run: yarn run lint:prettier
test: test:
@@ -58,9 +55,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn
@@ -76,9 +73,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn
@@ -89,7 +86,7 @@ jobs:
env: env:
IS_TEST: "true" IS_TEST: "true"
- name: Upload bundle stats - name: Upload bundle stats
uses: actions/upload-artifact@v4.3.1 uses: actions/upload-artifact@v3.1.3
with: with:
name: frontend-bundle-stats name: frontend-bundle-stats
path: build/stats/*.json path: build/stats/*.json
@@ -100,9 +97,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn
@@ -113,7 +110,7 @@ jobs:
env: env:
IS_TEST: "true" IS_TEST: "true"
- name: Upload bundle stats - name: Upload bundle stats
uses: actions/upload-artifact@v4.3.1 uses: actions/upload-artifact@v3.1.3
with: with:
name: supervisor-bundle-stats name: supervisor-bundle-stats
path: build/stats/*.json path: build/stats/*.json

View File

@@ -23,7 +23,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
with: with:
# We must fetch at least the immediate parents so that if this is # We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head. # a pull request then we can checkout the head.

View File

@@ -22,12 +22,12 @@ jobs:
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
with: with:
ref: dev ref: dev
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn
@@ -58,12 +58,12 @@ jobs:
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
with: with:
ref: master ref: master
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn

View File

@@ -16,10 +16,10 @@ jobs:
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }} url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn

View File

@@ -21,10 +21,10 @@ jobs:
if: github.repository == 'home-assistant/frontend' && contains(github.event.pull_request.labels.*.name, 'needs design preview') if: github.repository == 'home-assistant/frontend' && contains(github.event.pull_request.labels.*.name, 'needs design preview')
steps: steps:
- name: Check out files from GitHub - name: Check out files from GitHub
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn

View File

@@ -6,7 +6,7 @@ on:
- cron: "0 1 * * *" - cron: "0 1 * * *"
env: env:
PYTHON_VERSION: "3.12" PYTHON_VERSION: "3.11"
NODE_OPTIONS: --max_old_space_size=6144 NODE_OPTIONS: --max_old_space_size=6144
permissions: permissions:
@@ -20,7 +20,7 @@ jobs:
contents: write contents: write
steps: steps:
- name: Checkout the repository - name: Checkout the repository
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
- name: Set up Python ${{ env.PYTHON_VERSION }} - name: Set up Python ${{ env.PYTHON_VERSION }}
uses: actions/setup-python@v5 uses: actions/setup-python@v5
@@ -28,7 +28,7 @@ jobs:
python-version: ${{ env.PYTHON_VERSION }} python-version: ${{ env.PYTHON_VERSION }}
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn
@@ -42,7 +42,7 @@ jobs:
LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }} LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }}
- name: Bump version - name: Bump version
run: script/version_bump.js nightly run: script/version_bump.cjs nightly
- name: Build nightly Python wheels - name: Build nightly Python wheels
run: | run: |
@@ -57,14 +57,14 @@ jobs:
run: tar -czvf translations.tar.gz translations run: tar -czvf translations.tar.gz translations
- name: Upload build artifacts - name: Upload build artifacts
uses: actions/upload-artifact@v4.3.1 uses: actions/upload-artifact@v3.1.3
with: with:
name: wheels name: wheels
path: dist/home_assistant_frontend*.whl path: dist/home_assistant_frontend*.whl
if-no-files-found: error if-no-files-found: error
- name: Upload translations - name: Upload translations
uses: actions/upload-artifact@v4.3.1 uses: actions/upload-artifact@v3.1.3
with: with:
name: translations name: translations
path: translations.tar.gz path: translations.tar.gz

View File

@@ -18,6 +18,6 @@ jobs:
pull-requests: read pull-requests: read
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: release-drafter/release-drafter@v6.0.0 - uses: release-drafter/release-drafter@v5
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -6,7 +6,7 @@ on:
- published - published
env: env:
PYTHON_VERSION: "3.12" PYTHON_VERSION: "3.11"
NODE_OPTIONS: --max_old_space_size=6144 NODE_OPTIONS: --max_old_space_size=6144
# Set default workflow permissions # Set default workflow permissions
@@ -23,7 +23,7 @@ jobs:
contents: write # Required to upload release assets contents: write # Required to upload release assets
steps: steps:
- name: Checkout the repository - name: Checkout the repository
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
- name: Verify version - name: Verify version
uses: home-assistant/actions/helpers/verify-version@master uses: home-assistant/actions/helpers/verify-version@master
@@ -34,7 +34,7 @@ jobs:
python-version: ${{ env.PYTHON_VERSION }} python-version: ${{ env.PYTHON_VERSION }}
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v4.0.2 uses: actions/setup-node@v4.0.1
with: with:
node-version-file: ".nvmrc" node-version-file: ".nvmrc"
cache: yarn cache: yarn
@@ -55,7 +55,7 @@ jobs:
script/release script/release
- name: Upload release assets - name: Upload release assets
uses: softprops/action-gh-release@v2.0.4 uses: softprops/action-gh-release@v0.1.15
with: with:
files: | files: |
dist/*.whl dist/*.whl
@@ -74,7 +74,7 @@ jobs:
echo "home-assistant-frontend==$version" > ./requirements.txt echo "home-assistant-frontend==$version" > ./requirements.txt
- name: Build wheels - name: Build wheels
uses: home-assistant/wheels@2024.01.0 uses: home-assistant/wheels@2023.10.5
with: with:
abi: cp311 abi: cp311
tag: musllinux_1_2 tag: musllinux_1_2

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout the repository - name: Checkout the repository
uses: actions/checkout@v4.1.2 uses: actions/checkout@v4.1.1
- name: Upload Translations - name: Upload Translations
run: | run: |

View File

@@ -1,18 +0,0 @@
diff --git a/dist/hls.light.mjs b/dist/hls.light.mjs
index eed9d788fafdb159975e1a2eb08ac88ba9c9ac33..ace881935e6665946f1c8110ebd2f739cde4427e 100644
--- a/dist/hls.light.mjs
+++ b/dist/hls.light.mjs
@@ -20523,9 +20523,9 @@ class Hls {
}
Hls.defaultConfig = void 0;
-var KeySystemFormats = empty.KeySystemFormats;
-var KeySystems = empty.KeySystems;
-var SubtitleStreamController = empty.SubtitleStreamController;
-var TimelineController = empty.TimelineController;
+var KeySystemFormats = empty;
+var KeySystems = empty;
+var SubtitleStreamController = empty;
+var TimelineController = empty;
export { AbrController, AttrList, Cues as AudioStreamController, Cues as AudioTrackController, BasePlaylistController, BaseSegment, BaseStreamController, BufferController, Cues as CMCDController, CapLevelController, ChunkMetadata, ContentSteeringController, DateRange, Cues as EMEController, ErrorActionFlags, ErrorController, ErrorDetails, ErrorTypes, Events, FPSController, Fragment, Hls, HlsSkip, HlsUrlParameters, KeySystemFormats, KeySystems, Level, LevelDetails, LevelKey, LoadStats, MetadataSchema, NetworkErrorAction, Part, PlaylistLevelType, SubtitleStreamController, Cues as SubtitleTrackController, TimelineController, Hls as default, getMediaSource, isMSESupported, isSupported };
//# sourceMappingURL=hls.light.mjs.map

View File

@@ -0,0 +1,39 @@
diff --git a/modular/sortable.complete.esm.js b/modular/sortable.complete.esm.js
index 02e9f2d6bebeb430fe6e7c1cc3f9c3c9df051f14..bb8268b0844a1faa4108cc92c0be2a3dbaf23f83 100644
--- a/modular/sortable.complete.esm.js
+++ b/modular/sortable.complete.esm.js
@@ -1657,7 +1657,7 @@ Sortable.prototype =
target = parent; // store last element
}
/* jshint boss:true */
- while (parent = parent.parentNode);
+ while (parent = parent.parentNode || parent.getRootNode().host);
}
_unhideGhostForTarget();
diff --git a/modular/sortable.core.esm.js b/modular/sortable.core.esm.js
index b04c8b4634f7c6b4ef1aadbb48afe6564306dea9..39a107163c8c336ebd669b5ea8a936af87e1c1e7 100644
--- a/modular/sortable.core.esm.js
+++ b/modular/sortable.core.esm.js
@@ -1657,7 +1657,7 @@ Sortable.prototype =
target = parent; // store last element
}
/* jshint boss:true */
- while (parent = parent.parentNode);
+ while (parent = parent.parentNode || parent.getRootNode().host);
}
_unhideGhostForTarget();
diff --git a/modular/sortable.esm.js b/modular/sortable.esm.js
index 6ec7ed1bb557e21c2578200161e989c65d23150b..0a05475a22904472fac6c13f524c674da76584b0 100644
--- a/modular/sortable.esm.js
+++ b/modular/sortable.esm.js
@@ -1657,7 +1657,7 @@ Sortable.prototype =
target = parent; // store last element
}
/* jshint boss:true */
- while (parent = parent.parentNode);
+ while (parent = parent.parentNode || parent.getRootNode().host);
}
_unhideGhostForTarget();

View File

@@ -1,73 +0,0 @@
diff --git a/modular/sortable.core.esm.js b/modular/sortable.core.esm.js
index 93ba17509e2e8583ab241fea6845fbe714c584a2..de0651ddb5dced30d36f7d764da0dd0b441f523f 100644
--- a/modular/sortable.core.esm.js
+++ b/modular/sortable.core.esm.js
@@ -1461,7 +1461,7 @@ Sortable.prototype = /** @lends Sortable.prototype */{
}
target = parent; // store last element
}
- /* jshint boss:true */ while (parent = parent.parentNode);
+ /* jshint boss:true */ while (parent = parent.parentNode || parent.getRootNode().host);
}
_unhideGhostForTarget();
}
@@ -1781,11 +1781,16 @@ Sortable.prototype = /** @lends Sortable.prototype */{
}
if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {
capture();
- if (elLastChild && elLastChild.nextSibling) {
- // the last draggable element is not the last node
- el.insertBefore(dragEl, elLastChild.nextSibling);
- } else {
- el.appendChild(dragEl);
+ try {
+ if (elLastChild && elLastChild.nextSibling) {
+ // the last draggable element is not the last node
+ el.insertBefore(dragEl, elLastChild.nextSibling);
+ } else {
+ el.appendChild(dragEl);
+ }
+ }
+ catch(err) {
+ return completed(false);
}
parentEl = el; // actualization
@@ -1802,7 +1807,13 @@ Sortable.prototype = /** @lends Sortable.prototype */{
targetRect = getRect(target);
if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {
capture();
- el.insertBefore(dragEl, firstChild);
+ try {
+ el.insertBefore(dragEl, firstChild);
+ }
+ catch(err) {
+ return completed(false);
+ }
+
parentEl = el; // actualization
changed();
@@ -1849,12 +1860,17 @@ Sortable.prototype = /** @lends Sortable.prototype */{
_silent = true;
setTimeout(_unsilent, 30);
capture();
- if (after && !nextSibling) {
- el.appendChild(dragEl);
- } else {
- target.parentNode.insertBefore(dragEl, after ? nextSibling : target);
- }
+ try {
+ if (after && !nextSibling) {
+ el.appendChild(dragEl);
+ } else {
+ target.parentNode.insertBefore(dragEl, after ? nextSibling : target);
+ }
+ }
+ catch(err) {
+ return completed(false);
+ }
// Undo chrome's scroll adjustment (has no effect on other browsers)
if (scrolledPastTop) {
scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);

File diff suppressed because one or more lines are too long

View File

@@ -6,4 +6,4 @@ enableGlobalCache: false
nodeLinker: node-modules nodeLinker: node-modules
yarnPath: .yarn/releases/yarn-4.1.1.cjs yarnPath: .yarn/releases/yarn-4.0.2.cjs

View File

@@ -8,10 +8,7 @@ const zopfliOptions = { threshold: 150 };
const compressDist = (rootDir) => const compressDist = (rootDir) =>
gulp gulp
.src([ .src([`${rootDir}/**/*.{js,json,css,svg}`])
`${rootDir}/**/*.{js,json,css,svg,xml}`,
`${rootDir}/{authorize,onboarding}.html`,
])
.pipe(zopfli(zopfliOptions)) .pipe(zopfli(zopfliOptions))
.pipe(gulp.dest(rootDir)); .pipe(gulp.dest(rootDir));

View File

@@ -426,7 +426,6 @@ gulp.task(
"fetch-nightly-translations", "fetch-nightly-translations",
gulp.series("clean-translations", "ensure-translations-build-dir") gulp.series("clean-translations", "ensure-translations-build-dir")
), ),
gulp.parallel("create-test-metadata", "create-test-translation"),
"build-master-translation", "build-master-translation",
"build-merged-translations", "build-merged-translations",
"build-translation-fragment-supervisor", "build-translation-fragment-supervisor",

View File

@@ -115,9 +115,7 @@ gulp.task("webpack-prod-app", () =>
gulp.task("webpack-dev-server-demo", () => gulp.task("webpack-dev-server-demo", () =>
runDevServer({ runDevServer({
compiler: webpack( compiler: webpack(bothBuilds(createDemoConfig, { isProdBuild: false })),
createDemoConfig({ isProdBuild: false, latestBuild: true })
),
contentBase: paths.demo_output_root, contentBase: paths.demo_output_root,
port: 8090, port: 8090,
}) })
@@ -133,9 +131,7 @@ gulp.task("webpack-prod-demo", () =>
gulp.task("webpack-dev-server-cast", () => gulp.task("webpack-dev-server-cast", () =>
runDevServer({ runDevServer({
compiler: webpack( compiler: webpack(bothBuilds(createCastConfig, { isProdBuild: false })),
createCastConfig({ isProdBuild: false, latestBuild: true })
),
contentBase: paths.cast_output_root, contentBase: paths.cast_output_root,
port: 8080, port: 8080,
// Accessible from the network, because that's how Cast hits it. // Accessible from the network, because that's how Cast hits it.
@@ -178,9 +174,8 @@ gulp.task("webpack-prod-hassio", () =>
gulp.task("webpack-dev-server-gallery", () => gulp.task("webpack-dev-server-gallery", () =>
runDevServer({ runDevServer({
compiler: webpack( // We don't use the es5 build, but the dev server will fuck up the publicPath if we don't
createGalleryConfig({ isProdBuild: false, latestBuild: true }) compiler: webpack(bothBuilds(createGalleryConfig, { isProdBuild: false })),
),
contentBase: paths.gallery_output_root, contentBase: paths.gallery_output_root,
port: 8100, port: 8100,
listenHost: "0.0.0.0", listenHost: "0.0.0.0",

View File

@@ -7,9 +7,6 @@ const TerserPlugin = require("terser-webpack-plugin");
const { WebpackManifestPlugin } = require("webpack-manifest-plugin"); const { WebpackManifestPlugin } = require("webpack-manifest-plugin");
const log = require("fancy-log"); const log = require("fancy-log");
const WebpackBar = require("webpackbar"); const WebpackBar = require("webpackbar");
const {
TransformAsyncModulesPlugin,
} = require("transform-async-modules-webpack-plugin");
const paths = require("./paths.cjs"); const paths = require("./paths.cjs");
const bundle = require("./bundle.cjs"); const bundle = require("./bundle.cjs");
@@ -145,6 +142,17 @@ const createWebpackConfig = ({
), ),
path.resolve(paths.polymer_dir, "src/util/empty.js") path.resolve(paths.polymer_dir, "src/util/empty.js")
), ),
// See `src/resources/intl-polyfill-legacy.ts` for explanation
!latestBuild &&
new webpack.NormalModuleReplacementPlugin(
new RegExp(
path.resolve(paths.polymer_dir, "src/resources/intl-polyfill.ts")
),
path.resolve(
paths.polymer_dir,
"src/resources/intl-polyfill-legacy.ts"
)
),
!isProdBuild && new LogStartCompilePlugin(), !isProdBuild && new LogStartCompilePlugin(),
isProdBuild && isProdBuild &&
new StatsWriterPlugin({ new StatsWriterPlugin({
@@ -155,8 +163,6 @@ const createWebpackConfig = ({
stats: { assets: true, chunks: true, modules: true }, stats: { assets: true, chunks: true, modules: true },
transform: (stats) => JSON.stringify(filterStats(stats)), transform: (stats) => JSON.stringify(filterStats(stats)),
}), }),
!latestBuild &&
new TransformAsyncModulesPlugin({ browserslistEnv: "legacy" }),
].filter(Boolean), ].filter(Boolean),
resolve: { resolve: {
extensions: [".ts", ".js", ".json"], extensions: [".ts", ".js", ".json"],

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

View File

@@ -31,11 +31,11 @@ import "./hc-layout";
@customElement("hc-cast") @customElement("hc-cast")
class HcCast extends LitElement { class HcCast extends LitElement {
@property({ attribute: false }) public auth!: Auth; @property() public auth!: Auth;
@property({ attribute: false }) public connection!: Connection; @property() public connection!: Connection;
@property({ attribute: false }) public castManager!: CastManager; @property() public castManager!: CastManager;
@state() private askWrite = false; @state() private askWrite = false;
@@ -241,8 +241,6 @@ class HcCast extends LitElement {
mwc-button ha-svg-icon { mwc-button ha-svg-icon {
margin-right: 8px; margin-right: 8px;
margin-inline-end: 8px;
margin-inline-start: initial;
height: 18px; height: 18px;
} }

View File

@@ -10,13 +10,13 @@ import "../../../../src/components/ha-card";
@customElement("hc-layout") @customElement("hc-layout")
class HcLayout extends LitElement { class HcLayout extends LitElement {
@property() public subtitle?: string; @property() public subtitle?: string | undefined;
@property({ attribute: false }) public auth?: Auth; @property() public auth?: Auth;
@property({ attribute: false }) public connection?: Connection; @property() public connection?: Connection;
@property({ attribute: false }) public user?: HassUser; @property() public user?: HassUser;
protected render(): TemplateResult { protected render(): TemplateResult {
return html` return html`

View File

@@ -12,8 +12,8 @@ class HcLaunchScreen extends LitElement {
return html` return html`
<div class="container"> <div class="container">
<img <img
alt="Nabu Casa logo on left, Home Assistant logo on right, and red heart in center" alt="Home Assistant logo on left, Nabu Casa logo on right, and red heart in center"
src="https://cast.home-assistant.io/images/nabu-loves-hass.png" src="https://www.home-assistant.io/images/blog/2018-09-thinking-big/social.png"
/> />
<div class="status"> <div class="status">
${this.hass ? "Connected" : "Not Connected"} ${this.hass ? "Connected" : "Not Connected"}
@@ -28,23 +28,23 @@ class HcLaunchScreen extends LitElement {
:host { :host {
display: block; display: block;
height: 100vh; height: 100vh;
background-color: #f2f4f9; padding-top: 64px;
background-color: white;
font-size: 24px; font-size: 24px;
} }
.container { .container {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
text-align: center; text-align: center;
align-items: center;
height: 100%;
justify-content: space-evenly;
} }
img { img {
max-width: 80%; width: 717px;
object-fit: cover; height: 376px;
display: block;
margin: 0 auto;
} }
.status { .status {
color: #1d2126; padding-right: 54px;
} }
`; `;
} }

View File

@@ -17,7 +17,7 @@ class HcLovelace extends LitElement {
@property({ attribute: false }) @property({ attribute: false })
public lovelaceConfig!: LovelaceConfig; public lovelaceConfig!: LovelaceConfig;
@property() public viewPath?: string | number | null; @property() public viewPath?: string | number;
@property() public urlPath: string | null = null; @property() public urlPath: string | null = null;
@@ -93,9 +93,6 @@ class HcLovelace extends LitElement {
} }
private get _viewIndex() { private get _viewIndex() {
if (this.viewPath === null) {
return 0;
}
const selectedView = this.viewPath; const selectedView = this.viewPath;
const selectedViewInt = parseInt(selectedView as string, 10); const selectedViewInt = parseInt(selectedView as string, 10);
for (let i = 0; i < this.lovelaceConfig.views.length; i++) { for (let i = 0; i < this.lovelaceConfig.views.length; i++) {

View File

@@ -51,10 +51,10 @@ export class HcMain extends HassElement {
@state() private _lovelacePath: string | number | null = null; @state() private _lovelacePath: string | number | null = null;
@state() private _urlPath?: string | null;
@state() private _error?: string; @state() private _error?: string;
@state() private _urlPath?: string | null;
private _hassUUID?: string; private _hassUUID?: string;
private _unsubLovelace?: UnsubscribeFunc; private _unsubLovelace?: UnsubscribeFunc;
@@ -81,7 +81,7 @@ export class HcMain extends HassElement {
if ( if (
!this._lovelaceConfig || !this._lovelaceConfig ||
this._urlPath === undefined || this._lovelacePath === null ||
// Guard against part of HA not being loaded yet. // Guard against part of HA not being loaded yet.
!this.hass || !this.hass ||
!this.hass.states || !this.hass.states ||
@@ -99,8 +99,8 @@ export class HcMain extends HassElement {
<hc-lovelace <hc-lovelace
.hass=${this.hass} .hass=${this.hass}
.lovelaceConfig=${this._lovelaceConfig} .lovelaceConfig=${this._lovelaceConfig}
.urlPath=${this._urlPath}
.viewPath=${this._lovelacePath} .viewPath=${this._lovelacePath}
.urlPath=${this._urlPath}
@config-refresh=${this._generateDefaultLovelaceConfig} @config-refresh=${this._generateDefaultLovelaceConfig}
></hc-lovelace> ></hc-lovelace>
`; `;
@@ -205,6 +205,7 @@ export class HcMain extends HassElement {
expires_in: 0, expires_in: 0,
}), }),
}); });
this._hassUUID = msg.hassUUID;
} catch (err: any) { } catch (err: any) {
const errorMessage = this._getErrorMessage(err); const errorMessage = this._getErrorMessage(err);
this._error = errorMessage; this._error = errorMessage;
@@ -224,17 +225,6 @@ export class HcMain extends HassElement {
this.hass.connection.close(); this.hass.connection.close();
} }
this.initializeHass(auth, connection); this.initializeHass(auth, connection);
if (this._hassUUID !== msg.hassUUID) {
this._hassUUID = msg.hassUUID;
this._lovelaceConfig = undefined;
this._urlPath = undefined;
this._lovelacePath = null;
if (this._unsubLovelace) {
this._unsubLovelace();
this._unsubLovelace = undefined;
}
resourcesLoaded = false;
}
this._error = undefined; this._error = undefined;
this._sendStatus(); this._sendStatus();
} }
@@ -243,7 +233,7 @@ export class HcMain extends HassElement {
this._showDemo = false; this._showDemo = false;
// We should not get this command before we are connected. // We should not get this command before we are connected.
// Means a client got out of sync. Let's send status to them. // Means a client got out of sync. Let's send status to them.
if (!this.hass?.connected) { if (!this.hass) {
this._sendStatus(msg.senderId!); this._sendStatus(msg.senderId!);
this._error = "Cannot show Lovelace because we're not connected."; this._error = "Cannot show Lovelace because we're not connected.";
this._sendError( this._sendError(
@@ -270,7 +260,7 @@ export class HcMain extends HassElement {
} }
this._error = undefined; this._error = undefined;
if (msg.urlPath === "lovelace" || msg.urlPath === undefined) { if (msg.urlPath === "lovelace") {
msg.urlPath = null; msg.urlPath = null;
} }
this._lovelacePath = msg.viewPath; this._lovelacePath = msg.viewPath;
@@ -285,7 +275,7 @@ export class HcMain extends HassElement {
], ],
}; };
this._urlPath = "energy"; this._urlPath = "energy";
this._lovelacePath = null; this._lovelacePath = 0;
this._sendStatus(); this._sendStatus();
return; return;
} }
@@ -294,7 +284,6 @@ export class HcMain extends HassElement {
this._lovelaceConfig = undefined; this._lovelaceConfig = undefined;
if (this._unsubLovelace) { if (this._unsubLovelace) {
this._unsubLovelace(); this._unsubLovelace();
this._unsubLovelace = undefined;
} }
const llColl = atLeastVersion(this.hass.connection.haVersion, 0, 107) const llColl = atLeastVersion(this.hass.connection.haVersion, 0, 107)
? getLovelaceCollection(this.hass.connection, msg.urlPath) ? getLovelaceCollection(this.hass.connection, msg.urlPath)

View File

@@ -4,7 +4,6 @@ import { energyEntities } from "../stubs/entities";
import { DemoConfig } from "./types"; import { DemoConfig } from "./types";
export const demoConfigs: Array<() => Promise<DemoConfig>> = [ export const demoConfigs: Array<() => Promise<DemoConfig>> = [
() => import("./sections").then((mod) => mod.demoSections),
() => import("./arsaboo").then((mod) => mod.demoArsaboo), () => import("./arsaboo").then((mod) => mod.demoArsaboo),
() => import("./teachingbirds").then((mod) => mod.demoTeachingbirds), () => import("./teachingbirds").then((mod) => mod.demoTeachingbirds),
() => import("./kernehed").then((mod) => mod.demoKernehed), () => import("./kernehed").then((mod) => mod.demoKernehed),

View File

@@ -1,16 +0,0 @@
import { html } from "lit";
import { DemoConfig } from "../types";
export const demoLovelaceDescription: DemoConfig["description"] = (
localize
) => html`
<p>
${localize("ui.panel.page-demo.config.sections.description", {
blog_post: html`<a
href="https://www.home-assistant.io/blog/2024/03/04/dashboard-chapter-1/"
target="_blank"
>${localize("ui.panel.page-demo.config.sections.description_blog_post")}
</a>`,
})}
</p>
`;

View File

@@ -1,474 +0,0 @@
import { convertEntities } from "../../../../src/fake_data/entity";
import { DemoConfig } from "../types";
export const demoEntitiesSections: DemoConfig["entities"] = () =>
convertEntities({
"cover.living_room_garden_shutter": {
entity_id: "cover.living_room_garden_shutter",
state: "open",
attributes: {
current_position: 100,
device_class: "shutter",
friendly_name: "Living room garden shutter",
supported_features: 15,
},
},
"cover.living_room_graveyard_shutter": {
entity_id: "cover.living_room_graveyard_shutter",
state: "open",
attributes: {
current_position: 100,
device_class: "shutter",
friendly_name: "Living room graveyard shutter",
supported_features: 15,
},
},
"cover.living_room_left_shutter": {
entity_id: "cover.living_room_left_shutter",
state: "open",
attributes: {
current_position: 100,
device_class: "shutter",
friendly_name: "Living room left shutter",
supported_features: 15,
},
},
"cover.living_room_right_shutter": {
entity_id: "cover.living_room_right_shutter",
state: "open",
attributes: {
current_position: 100,
device_class: "shutter",
friendly_name: "Living room right shutter",
supported_features: 15,
},
},
"light.floor_lamp": {
entity_id: "light.floor_lamp",
state: "on",
attributes: {
min_color_temp_kelvin: 2000,
max_color_temp_kelvin: 6535,
min_mireds: 153,
max_mireds: 500,
supported_color_modes: ["color_temp", "xy"],
color_mode: "color_temp",
brightness: 178,
color_temp_kelvin: 2583,
color_temp: 387,
hs_color: [28.664, 69.597],
rgb_color: [255, 162, 77],
xy_color: [0.538, 0.389],
icon: "mdi:floor-lamp",
friendly_name: "Floor lamp",
supported_features: 44,
},
},
"light.living_room_spotlights": {
entity_id: "light.living_room_spotlights",
state: "on",
attributes: {
supported_color_modes: ["brightness"],
color_mode: "brightness",
brightness: 126,
icon: "mdi:ceiling-light-multiple",
friendly_name: "Living room spotlights",
supported_features: 32,
},
},
"light.bar_lamp": {
entity_id: "light.bar_lamp",
state: "on",
attributes: {
min_color_temp_kelvin: 2202,
max_color_temp_kelvin: 4504,
min_mireds: 222,
max_mireds: 454,
effect_list: ["None", "candle"],
supported_color_modes: ["color_temp"],
effect: null,
color_mode: null,
brightness: null,
color_temp_kelvin: null,
color_temp: null,
hs_color: null,
rgb_color: null,
xy_color: null,
mode: "normal",
dynamics: "none",
icon: "mdi:lightbulb-variant",
friendly_name: "Bar lamp",
supported_features: 44,
},
},
"sensor.living_room_temperature": {
entity_id: "sensor.living_room_temperature",
state: "22.8",
attributes: {
state_class: "measurement",
unit_of_measurement: "°C",
device_class: "temperature",
friendly_name: "Living room Temperature",
},
},
"media_player.living_room_nest_mini": {
entity_id: "media_player.living_room_nest_mini",
state: "off",
attributes: {
device_class: "speaker",
friendly_name: "Living room Nest Mini",
supported_features: 152461,
},
},
"cover.kitchen_shutter": {
entity_id: "cover.kitchen_shutter",
state: "open",
attributes: {
current_position: 100,
device_class: "shutter",
friendly_name: "Kitchen shutter ",
supported_features: 15,
},
},
"light.kitchen_spotlights": {
entity_id: "light.kitchen_spotlights",
state: "off",
attributes: {
supported_color_modes: ["brightness"],
color_mode: null,
brightness: null,
icon: "mdi:ceiling-light-multiple",
friendly_name: "Kitchen spotlights ",
supported_features: 32,
},
},
"light.worktop_spotlights": {
entity_id: "light.worktop_spotlights",
state: "off",
attributes: {
supported_color_modes: ["brightness"],
color_mode: null,
brightness: null,
icon: "mdi:ceiling-light-multiple",
friendly_name: "Worktop spotlights ",
supported_features: 32,
},
},
"binary_sensor.fridge_door": {
entity_id: "binary_sensor.fridge_door",
state: "off",
attributes: {
device_class: "door",
icon: "mdi:fridge",
friendly_name: "Fridge door",
},
},
"media_player.kitchen_nest_audio": {
entity_id: "media_player.kitchen_nest_audio",
state: "on",
attributes: {
device_class: "speaker",
friendly_name: "Kitchen Nest Audio",
supported_features: 152461,
},
},
"binary_sensor.tesla_wall_connector_vehicle_connected": {
entity_id: "binary_sensor.tesla_wall_connector_vehicle_connected",
state: "off",
attributes: {
device_class: "plug",
friendly_name: "Wall Connector Vehicle connected",
},
},
"sensor.tesla_wall_connector_session_energy": {
entity_id: "sensor.tesla_wall_connector_session_energy",
state: "16.3",
attributes: {
state_class: "total_increasing",
unit_of_measurement: "kWh",
device_class: "energy",
friendly_name: "Tesla Wall Connector Session energy",
},
},
"sensor.electric_meter_power": {
entity_id: "sensor.electric_meter_power",
state: "797.86",
attributes: {
state_class: "measurement",
unit_of_measurement: "W",
device_class: "power",
icon: "mdi:meter-electric",
friendly_name: "Electric meter Power",
},
},
"sensor.eletric_meter_voltage": {
entity_id: "sensor.eletric_meter_voltage",
state: "232.19",
attributes: {
state_class: "measurement",
unit_of_measurement: "V",
device_class: "voltage",
friendly_name: "Electric meter voltage",
},
},
"sensor.electricity_maps_grid_fossil_fuel_percentage": {
entity_id: "sensor.electricity_maps_grid_fossil_fuel_percentage",
state: "9.84",
attributes: {
state_class: "measurement",
country_code: "FR",
unit_of_measurement: "%",
attribution: "Data provided by Electricity Maps",
icon: "mdi:barrel",
friendly_name: "Electricity Maps Grid fossil fuel percentage",
},
},
"sensor.electricity_maps_co2_intensity": {
entity_id: "sensor.electricity_maps_co2_intensity",
state: "62.0",
attributes: {
state_class: "measurement",
country_code: "FR",
unit_of_measurement: "gCO2eq/kWh",
attribution: "Data provided by Electricity Maps",
friendly_name: "Electricity Maps CO2 intensity",
icon: "mdi:molecule-co2",
},
},
"sun.sun": {
entity_id: "sun.sun",
state: "above_horizon",
attributes: {
next_dawn: "2024-03-05T05:50:21.964405+00:00",
next_dusk: "2024-03-04T18:08:54.311334+00:00",
next_midnight: "2024-03-05T00:00:00+00:00",
next_noon: "2024-03-05T12:00:05+00:00",
next_rising: "2024-03-05T06:23:42.739159+00:00",
next_setting: "2024-03-04T17:35:26.271171+00:00",
elevation: 30.38,
azimuth: 204.42,
rising: false,
friendly_name: "Sun",
},
},
"sensor.rain": {
entity_id: "sensor.moon_phase",
state: "7.2",
attributes: {
state_class: "total_increasing",
unit_of_measurement: "mm",
device_class: "precipitation",
friendly_name: "Rain",
},
},
"climate.ground_floor": {
entity_id: "climate.ground_floor",
state: "heat",
attributes: {
hvac_modes: ["auto", "heat", "off"],
min_temp: 7,
max_temp: 35,
preset_modes: [
"comfort",
"away",
"eco",
"frost_protection",
"external",
"home",
],
current_temperature: 20.8,
temperature: 21,
preset_mode: "comfort",
icon: "mdi:home-floor-0",
friendly_name: "Ground floor Thermostat",
supported_features: 401,
},
},
"climate.first_floor": {
entity_id: "climate.first_floor",
state: "heat",
attributes: {
hvac_modes: ["auto", "heat", "off"],
min_temp: 7,
max_temp: 35,
preset_modes: [
"comfort",
"away",
"eco",
"frost_protection",
"external",
"home",
],
current_temperature: 21.7,
temperature: 21,
preset_mode: "comfort",
icon: "mdi:home-floor-1",
friendly_name: "First floor Thermostat",
supported_features: 401,
},
},
"cover.study_shutter": {
entity_id: "cover.study_shutter",
state: "open",
attributes: {
current_position: 100,
device_class: "shutter",
friendly_name: "Study shutter",
supported_features: 15,
},
},
"light.study_spotlights": {
entity_id: "light.study_spotlights",
state: "off",
attributes: {
supported_color_modes: ["brightness"],
color_mode: null,
brightness: null,
icon: "mdi:ceiling-light-multiple",
friendly_name: "Study spotlights",
supported_features: 32,
},
},
"media_player.study_nest_hub": {
entity_id: "media_player.study_nest_hub",
state: "off",
attributes: {
friendly_name: "Study Nest Hub",
supported_features: 152461,
},
},
"sensor.standing_desk_height": {
entity_id: "sensor.standing_desk_height",
state: "72",
attributes: {
unit_of_measurement: "cm",
icon: "mdi:tape-measure",
friendly_name: "Standing desk Height",
},
},
"light.outdoor_light": {
entity_id: "light.outdoor_light",
state: "on",
attributes: {
supported_color_modes: ["brightness"],
color_mode: null,
brightness: 255,
icon: "mdi:outdoor-lamp",
friendly_name: "Outdoor light",
supported_features: 32,
},
},
"light.flood_light": {
entity_id: "light.flood_light",
state: "off",
attributes: {
effect_list: ["None", "candle"],
supported_color_modes: ["brightness"],
effect: null,
color_mode: null,
brightness: null,
mode: "normal",
dynamics: "none",
icon: "mdi:light-flood-down",
friendly_name: "Flood light",
supported_features: 44,
},
},
"sensor.outdoor_motion_sensor_temperature": {
entity_id: "sensor.outdoor_motion_sensor_temperature",
state: "10.2",
attributes: {
state_class: "measurement",
unit_of_measurement: "°C",
device_class: "temperature",
friendly_name: "Outdoor motion sensor Temperature",
},
},
"binary_sensor.outdoor_motion_sensor_motion": {
entity_id: "binary_sensor.outdoor_motion_sensor_motion",
state: "off",
attributes: {
device_class: "motion",
friendly_name: "Outdoor motion sensor Motion",
},
},
"sensor.outdoor_motion_sensor_illuminance": {
entity_id: "sensor.outdoor_motion_sensor_illuminance",
state: "555",
attributes: {
state_class: "measurement",
light_level: 27444,
unit_of_measurement: "lx",
device_class: "illuminance",
friendly_name: "Outdoor motion sensor Illuminance",
},
},
"automation.home_assistant_auto_update": {
entity_id: "automation.home_assistant_auto_update",
state: "off",
attributes: {
id: "1700669321947",
last_triggered: "2024-02-29T18:02:05.343139+00:00",
mode: "queued",
current: 0,
max: 50,
icon: "mdi:auto-mode",
friendly_name: "Home Assistant Auto-update",
},
},
"update.home_assistant_operating_system_update": {
entity_id: "update.home_assistant_operating_system_update",
state: "off",
attributes: {
auto_update: false,
installed_version: "12.1",
in_progress: false,
latest_version: "12.1",
release_summary: null,
release_url:
"https://github.com/home-assistant/operating-system/commits/dev",
skipped_version: null,
title: "Home Assistant Operating System",
entity_picture:
"https://brands.home-assistant.io/homeassistant/icon.png",
friendly_name: "Home Assistant Operating System Update",
supported_features: 3,
},
},
"update.home_assistant_supervisor_update": {
entity_id: "update.home_assistant_supervisor_update",
state: "off",
attributes: {
auto_update: true,
installed_version: "2024.02.2",
in_progress: false,
latest_version: "2024.02.2",
release_summary: null,
release_url:
"https://github.com/home-assistant/supervisor/commits/main",
skipped_version: null,
title: "Home Assistant Supervisor",
entity_picture: "https://brands.home-assistant.io/hassio/icon.png",
friendly_name: "Home Assistant Supervisor Update",
supported_features: 1,
},
},
"update.home_assistant_core_update": {
entity_id: "update.home_assistant_supervisor_update",
state: "off",
attributes: {
auto_update: false,
installed_version: "2024.4.0",
in_progress: false,
latest_version: "2024.4.0",
release_summary: null,
release_url: "https://github.com/home-assistant/core/commits/dev",
skipped_version: null,
title: "Home Assistant Core",
entity_picture:
"https://brands.home-assistant.io/homeassistant/icon.png",
friendly_name: "Home Assistant Core Update",
supported_features: 11,
},
},
});

View File

@@ -1,14 +0,0 @@
import { DemoConfig } from "../types";
import { demoLovelaceDescription } from "./description";
import { demoEntitiesSections } from "./entities";
import { demoLovelaceSections } from "./lovelace";
export const demoSections: DemoConfig = {
authorName: "Home Assistant",
authorUrl: "https://github.com/home-assistant/frontend/",
name: "Home Demo",
description: demoLovelaceDescription,
lovelace: demoLovelaceSections,
entities: demoEntitiesSections,
theme: () => ({}),
};

View File

@@ -1,281 +0,0 @@
import { DemoConfig } from "../types";
export const demoLovelaceSections: DemoConfig["lovelace"] = () => ({
title: "Home Assistant Demo",
views: [
{
type: "sections",
title: "Demo",
path: "home",
icon: "mdi:home-assistant",
sections: [
{
title: "Welcome 👋",
cards: [{ type: "custom:ha-demo-card" }],
},
{
cards: [
{
type: "tile",
entity: "cover.living_room_garden_shutter",
name: "Garden",
},
{
type: "tile",
entity: "cover.living_room_graveyard_shutter",
name: "Rear",
},
{
type: "tile",
entity: "cover.living_room_left_shutter",
name: "Left",
},
{
type: "tile",
entity: "cover.living_room_right_shutter",
name: "Right",
},
{
type: "tile",
entity: "light.floor_lamp",
},
{
type: "tile",
entity: "light.living_room_spotlights",
name: "Spotlights",
features: [
{
type: "light-brightness",
},
],
},
{
type: "tile",
entity: "light.bar_lamp",
},
{
graph: "line",
type: "sensor",
entity: "sensor.living_room_temperature",
detail: 1,
name: "Temperature",
},
{
type: "tile",
entity: "media_player.living_room_nest_mini",
name: "Nest Mini",
},
],
title: "🛋️ Living room ",
},
{
type: "grid",
cards: [
{
type: "tile",
entity: "cover.kitchen_shutter",
name: "Shutter",
},
{
type: "tile",
entity: "light.kitchen_spotlights",
name: "Spotlights",
features: [
{
type: "light-brightness",
},
],
},
{
type: "tile",
entity: "light.worktop_spotlights",
name: "Worktop",
},
{
type: "tile",
entity: "binary_sensor.fridge_door",
name: "Fridge",
},
{
type: "tile",
entity: "media_player.kitchen_nest_audio",
name: "Nest Audio",
},
],
title: "👩‍🍳 Kitchen",
},
{
type: "grid",
cards: [
{
type: "tile",
entity: "binary_sensor.tesla_wall_connector_vehicle_connected",
name: "EV",
icon: "mdi:car",
},
{
type: "tile",
entity: "sensor.tesla_wall_connector_session_energy",
name: "Last charge",
color: "green",
},
{
type: "tile",
entity: "sensor.electric_meter_power",
color: "deep-orange",
name: "Home power",
},
{
type: "tile",
entity: "sensor.eletric_meter_voltage",
name: "Voltage",
color: "deep-orange",
},
{
type: "tile",
entity: "sensor.electricity_maps_grid_fossil_fuel_percentage",
name: "Fossil fuel",
color: "brown",
},
{
type: "tile",
entity: "sensor.electricity_maps_co2_intensity",
name: "CO2 Intensity",
color: "dark-grey",
},
],
title: "⚡️ Energy",
},
{
type: "grid",
cards: [
{
type: "tile",
entity: "sun.sun",
},
{
type: "tile",
entity: "sensor.rain",
color: "blue",
},
{
features: [
{
type: "target-temperature",
},
],
type: "tile",
name: "Downstairs",
entity: "climate.ground_floor",
state_content: ["preset_mode", "current_temperature"],
},
{
features: [
{
type: "target-temperature",
},
],
type: "tile",
name: "Upstairs",
entity: "climate.first_floor",
state_content: ["preset_mode", "current_temperature"],
},
],
title: "🌤️ Climate",
},
{
type: "grid",
cards: [
{
type: "tile",
entity: "cover.study_shutter",
name: "Shutter",
},
{
type: "tile",
entity: "light.study_spotlights",
name: "Spotlights",
},
{
type: "tile",
entity: "media_player.study_nest_hub",
name: "Nest Hub",
},
{
type: "tile",
entity: "sensor.standing_desk_height",
name: "Desk",
color: "brown",
icon: "mdi:desk",
},
],
title: "🧑‍💻 Study",
},
{
type: "grid",
cards: [
{
type: "tile",
entity: "light.outdoor_light",
name: "Door light",
},
{
type: "tile",
entity: "light.flood_light",
},
{
graph: "line",
type: "sensor",
entity: "sensor.outdoor_motion_sensor_temperature",
detail: 1,
name: "Temperature",
},
{
type: "tile",
entity: "binary_sensor.outdoor_motion_sensor_motion",
name: "Motion",
color: "blue",
},
{
type: "tile",
entity: "sensor.outdoor_motion_sensor_illuminance",
color: "amber",
name: "Illuminance",
},
],
title: "🌳 Outdoor",
},
{
type: "grid",
cards: [
{
type: "tile",
entity: "automation.home_assistant_auto_update",
name: "Auto-update",
color: "green",
},
{
type: "tile",
entity: "update.home_assistant_operating_system_update",
name: "OS",
icon: "mdi:home-assistant",
},
{
type: "tile",
entity: "update.home_assistant_supervisor_update",
icon: "mdi:home-assistant",
name: "Supervisor",
},
{
type: "tile",
entity: "update.home_assistant_core_update",
name: "Core",
icon: "mdi:home-assistant",
},
],
title: "🎉 Updates",
},
],
},
],
});

View File

@@ -1,4 +1,3 @@
import { TemplateResult } from "lit";
import { LocalizeFunc } from "../../../src/common/translations/localize"; import { LocalizeFunc } from "../../../src/common/translations/localize";
import { LovelaceConfig } from "../../../src/data/lovelace/config/types"; import { LovelaceConfig } from "../../../src/data/lovelace/config/types";
import { Entity } from "../../../src/fake_data/entity"; import { Entity } from "../../../src/fake_data/entity";
@@ -8,9 +7,6 @@ export interface DemoConfig {
name: string; name: string;
authorName: string; authorName: string;
authorUrl: string; authorUrl: string;
description?:
| string
| ((localize: LocalizeFunc) => string | TemplateResult<1>);
lovelace: (localize: LocalizeFunc) => LovelaceConfig; lovelace: (localize: LocalizeFunc) => LovelaceConfig;
entities: (localize: LocalizeFunc) => Entity[]; entities: (localize: LocalizeFunc) => Entity[];
theme: () => Record<string, string> | null; theme: () => Record<string, string> | null;

View File

@@ -39,51 +39,32 @@ export class HADemoCard extends LitElement implements LovelaceCard {
<div class="picker"> <div class="picker">
<div class="label"> <div class="label">
${this._switching ${this._switching
? html` ? html`<ha-circular-progress
<ha-circular-progress indeterminate></ha-circular-progress> indeterminate
` ></ha-circular-progress>`
: until( : until(
selectedDemoConfig.then( selectedDemoConfig.then(
(conf) => html` (conf) => html`
${conf.name} ${conf.name}
<small> <small>
${this.hass.localize( <a target="_blank" href=${conf.authorUrl}>
"ui.panel.page-demo.cards.demo.demo_by", ${this.hass.localize(
{ "ui.panel.page-demo.cards.demo.demo_by",
name: html` { name: conf.authorName }
<a target="_blank" href=${conf.authorUrl}> )}
${conf.authorName} </a>
</a>
`,
}
)}
</small> </small>
` `
), ),
"" ""
)} )}
</div> </div>
<mwc-button @click=${this._nextConfig} .disabled=${this._switching}> <mwc-button @click=${this._nextConfig} .disabled=${this._switching}>
${this.hass.localize("ui.panel.page-demo.cards.demo.next_demo")} ${this.hass.localize("ui.panel.page-demo.cards.demo.next_demo")}
</mwc-button> </mwc-button>
</div> </div>
<div class="content"> <div class="content small-hidden">
<p class="small-hidden"> ${this.hass.localize("ui.panel.page-demo.cards.demo.introduction")}
${this.hass.localize("ui.panel.page-demo.cards.demo.introduction")}
</p>
${until(
selectedDemoConfig.then((conf) => {
if (typeof conf.description === "function") {
return conf.description(this.hass.localize);
}
if (conf.description) {
return html`<p>${conf.description}</p>`;
}
return nothing;
}),
nothing
)}
</div> </div>
<div class="actions small-hidden"> <div class="actions small-hidden">
<a href="https://www.home-assistant.io" target="_blank"> <a href="https://www.home-assistant.io" target="_blank">
@@ -127,7 +108,6 @@ export class HADemoCard extends LitElement implements LovelaceCard {
css` css`
a { a {
color: var(--primary-color); color: var(--primary-color);
display: inline-block;
} }
.actions a { .actions a {
@@ -135,11 +115,7 @@ export class HADemoCard extends LitElement implements LovelaceCard {
} }
.content { .content {
padding: 0 16px; padding: 16px;
}
.content p {
margin: 16px 0;
} }
.picker { .picker {
@@ -162,8 +138,9 @@ export class HADemoCard extends LitElement implements LovelaceCard {
} }
.actions { .actions {
padding: 0px 8px 4px 8px; padding-left: 8px;
} }
@media only screen and (max-width: 500px) { @media only screen and (max-width: 500px) {
.small-hidden { .small-hidden {
display: none; display: none;

View File

@@ -17,14 +17,12 @@ import { energyEntities } from "./stubs/entities";
import { mockEntityRegistry } from "./stubs/entity_registry"; import { mockEntityRegistry } from "./stubs/entity_registry";
import { mockEvents } from "./stubs/events"; import { mockEvents } from "./stubs/events";
import { mockFrontend } from "./stubs/frontend"; import { mockFrontend } from "./stubs/frontend";
import { mockIcons } from "./stubs/icons";
import { mockHistory } from "./stubs/history"; import { mockHistory } from "./stubs/history";
import { mockLovelace } from "./stubs/lovelace"; import { mockLovelace } from "./stubs/lovelace";
import { mockMediaPlayer } from "./stubs/media_player"; import { mockMediaPlayer } from "./stubs/media_player";
import { mockPersistentNotification } from "./stubs/persistent_notification"; import { mockPersistentNotification } from "./stubs/persistent_notification";
import { mockRecorder } from "./stubs/recorder"; import { mockRecorder } from "./stubs/recorder";
import { mockTodo } from "./stubs/todo"; import { mockTodo } from "./stubs/todo";
import { mockSensor } from "./stubs/sensor";
import { mockSystemLog } from "./stubs/system_log"; import { mockSystemLog } from "./stubs/system_log";
import { mockTemplate } from "./stubs/template"; import { mockTemplate } from "./stubs/template";
import { mockTranslations } from "./stubs/translations"; import { mockTranslations } from "./stubs/translations";
@@ -52,13 +50,11 @@ export class HaDemo extends HomeAssistantAppEl {
mockHistory(hass); mockHistory(hass);
mockRecorder(hass); mockRecorder(hass);
mockTodo(hass); mockTodo(hass);
mockSensor(hass);
mockSystemLog(hass); mockSystemLog(hass);
mockTemplate(hass); mockTemplate(hass);
mockEvents(hass); mockEvents(hass);
mockMediaPlayer(hass); mockMediaPlayer(hass);
mockFrontend(hass); mockFrontend(hass);
mockIcons(hass);
mockEnergy(hass); mockEnergy(hass);
mockPersistentNotification(hass); mockPersistentNotification(hass);
mockConfigEntries(hass); mockConfigEntries(hass);
@@ -72,8 +68,6 @@ export class HaDemo extends HomeAssistantAppEl {
id: "sensor.co2_intensity", id: "sensor.co2_intensity",
name: null, name: null,
icon: null, icon: null,
labels: [],
categories: {},
platform: "co2signal", platform: "co2signal",
hidden_by: null, hidden_by: null,
entity_category: null, entity_category: null,
@@ -90,8 +84,6 @@ export class HaDemo extends HomeAssistantAppEl {
id: "sensor.co2_intensity", id: "sensor.co2_intensity",
name: null, name: null,
icon: null, icon: null,
labels: [],
categories: {},
platform: "co2signal", platform: "co2signal",
hidden_by: null, hidden_by: null,
entity_category: null, entity_category: null,

View File

@@ -4,11 +4,4 @@ import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
export const mockAreaRegistry = ( export const mockAreaRegistry = (
hass: MockHomeAssistant, hass: MockHomeAssistant,
data: AreaRegistryEntry[] = [] data: AreaRegistryEntry[] = []
) => { ) => hass.mockWS("config/area_registry/list", () => data);
hass.mockWS("config/area_registry/list", () => data);
const areas = {};
data.forEach((area) => {
areas[area.area_id] = area;
});
hass.updateHass({ areas });
};

View File

@@ -10,7 +10,6 @@ export const mockConfigEntries = (hass: MockHomeAssistant) => {
supports_options: false, supports_options: false,
supports_remove_device: false, supports_remove_device: false,
supports_unload: true, supports_unload: true,
supports_reconfigure: true,
pref_disable_new_entities: false, pref_disable_new_entities: false,
pref_disable_polling: false, pref_disable_polling: false,
disabled_by: null, disabled_by: null,

View File

@@ -4,11 +4,4 @@ import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
export const mockDeviceRegistry = ( export const mockDeviceRegistry = (
hass: MockHomeAssistant, hass: MockHomeAssistant,
data: DeviceRegistryEntry[] = [] data: DeviceRegistryEntry[] = []
) => { ) => hass.mockWS("config/device_registry/list", () => data);
hass.mockWS("config/device_registry/list", () => data);
const devices = {};
data.forEach((device) => {
devices[device.id] = device;
});
hass.updateHass({ devices });
};

View File

@@ -1,7 +0,0 @@
import { FloorRegistryEntry } from "../../../src/data/floor_registry";
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
export const mockFloorRegistry = (
hass: MockHomeAssistant,
data: FloorRegistryEntry[] = []
) => hass.mockWS("config/floor_registry/list", () => data);

View File

@@ -1,33 +0,0 @@
import { IconCategory } from "../../../src/data/icons";
import { ENTITY_COMPONENT_ICONS } from "../../../src/fake_data/entity_component_icons";
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
export const mockIcons = (hass: MockHomeAssistant) => {
hass.mockWS(
"frontend/get_icons",
async ({
category,
integration,
}: {
category: IconCategory;
integration?: string;
}) => {
if (integration) {
try {
const response = await fetch(
`https://raw.githubusercontent.com/home-assistant/core/dev/homeassistant/components/${integration}/icons.json`
).then((resp) => resp.json());
return { resources: { [integration]: response[category] || {} } };
} catch {
return { resources: {} };
}
}
if (category === "entity_component") {
return {
resources: ENTITY_COMPONENT_ICONS,
};
}
return { resources: {} };
}
);
};

View File

@@ -1,7 +0,0 @@
import { LabelRegistryEntry } from "../../../src/data/label_registry";
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
export const mockLabelRegistry = (
hass: MockHomeAssistant,
data: LabelRegistryEntry[] = []
) => hass.mockWS("config/label_registry/list", () => data);

View File

@@ -1,58 +0,0 @@
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
export const mockSensor = (hass: MockHomeAssistant) => {
hass.mockWS("sensor/numeric_device_classes", () => [
{
numeric_device_classes: [
"volume_storage",
"gas",
"data_size",
"irradiance",
"wind_speed",
"volatile_organic_compounds",
"volatile_organic_compounds_parts",
"voltage",
"frequency",
"precipitation_intensity",
"volume",
"precipitation",
"battery",
"nitrogen_dioxide",
"speed",
"signal_strength",
"pm1",
"nitrous_oxide",
"atmospheric_pressure",
"data_rate",
"temperature",
"power_factor",
"aqi",
"current",
"volume_flow_rate",
"humidity",
"duration",
"ozone",
"distance",
"pressure",
"pm25",
"weight",
"energy",
"carbon_monoxide",
"apparent_power",
"illuminance",
"energy_storage",
"moisture",
"power",
"water",
"carbon_dioxide",
"ph",
"reactive_power",
"monetary",
"nitrogen_monoxide",
"pm10",
"sound_pressure",
"sulphur_dioxide",
],
},
]);
};

View File

@@ -21,5 +21,4 @@ export const mockTodo = (hass: MockHomeAssistant) => {
}, },
] as TodoItem[], ] as TodoItem[],
})); }));
hass.mockWS("todo/item/subscribe", (_msg, _hass) => () => {});
}; };

View File

@@ -1,5 +1,5 @@
import { Button } from "@material/mwc-button"; import { Button } from "@material/mwc-button";
import { html, LitElement, css, TemplateResult, nothing } from "lit"; import { html, LitElement, css, TemplateResult } from "lit";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element"; import { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element";
import { fireEvent } from "../../../src/common/dom/fire_event"; import { fireEvent } from "../../../src/common/dom/fire_event";
@@ -9,9 +9,9 @@ import "../../../src/components/ha-card";
class DemoBlackWhiteRow extends LitElement { class DemoBlackWhiteRow extends LitElement {
@property() title!: string; @property() title!: string;
@property() value?: any; @property() value!: any;
@property({ type: Boolean }) public disabled = false; @property() disabled = false;
protected render(): TemplateResult { protected render(): TemplateResult {
return html` return html`
@@ -45,9 +45,7 @@ class DemoBlackWhiteRow extends LitElement {
</mwc-button> </mwc-button>
</div> </div>
</ha-card> </ha-card>
${this.value <pre>${JSON.stringify(this.value, undefined, 2)}</pre>
? html`<pre>${JSON.stringify(this.value, undefined, 2)}</pre>`
: nothing}
</div> </div>
</div> </div>
`; `;

View File

@@ -11,11 +11,11 @@ export interface DemoCardConfig {
@customElement("demo-card") @customElement("demo-card")
class DemoCard extends LitElement { class DemoCard extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property() public hass!: HomeAssistant;
@property({ attribute: false }) public config!: DemoCardConfig; @property() public config!: DemoCardConfig;
@property({ type: Boolean }) public showConfig = false; @property() public showConfig = false;
@state() private _size?: number; @state() private _size?: number;

View File

@@ -10,9 +10,9 @@ import "../ha-demo-options";
@customElement("demo-cards") @customElement("demo-cards")
class DemoCards extends LitElement { class DemoCards extends LitElement {
@property({ attribute: false }) public configs!: DemoCardConfig[]; @property() public configs!: DemoCardConfig[];
@property({ attribute: false }) public hass!: HomeAssistant; @property() public hass!: HomeAssistant;
@state() private _showConfig = false; @state() private _showConfig = false;

View File

@@ -8,11 +8,11 @@ import { HomeAssistant } from "../../../src/types";
@customElement("demo-more-info") @customElement("demo-more-info")
class DemoMoreInfo extends LitElement { class DemoMoreInfo extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property() public hass!: HomeAssistant;
@property() public entityId!: string; @property() public entityId!: string;
@property({ type: Boolean }) public showConfig = false; @property() public showConfig!: boolean;
render() { render() {
const state = this._getState(this.entityId, this.hass.states); const state = this._getState(this.entityId, this.hass.states);

View File

@@ -1,19 +1,19 @@
import { LitElement, css, html } from "lit"; import { LitElement, css, html } from "lit";
import { customElement, property, state } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element"; import { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element";
import "../../../src/components/ha-formfield"; import "../../../src/components/ha-formfield";
import "../../../src/components/ha-switch"; import "../../../src/components/ha-switch";
import { HomeAssistant } from "../../../src/types";
import "../ha-demo-options";
import "./demo-more-info"; import "./demo-more-info";
import "../ha-demo-options";
import { HomeAssistant } from "../../../src/types";
@customElement("demo-more-infos") @customElement("demo-more-infos")
class DemoMoreInfos extends LitElement { class DemoMoreInfos extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant; @property() public hass!: HomeAssistant;
@property({ type: Array }) public entities!: string[]; @property() public entities!: [];
@state() private _showConfig = false; @property({ attribute: false }) _showConfig: boolean = false;
render() { render() {
return html` return html`

View File

@@ -17,7 +17,6 @@ export const basicTrace: DemoTrace = {
{ {
path: "trigger/0", path: "trigger/0",
timestamp: "2021-03-25T04:36:51.223693+00:00", timestamp: "2021-03-25T04:36:51.223693+00:00",
changed_variables: {},
}, },
], ],
"condition/0": [ "condition/0": [

View File

@@ -17,7 +17,6 @@ export const motionLightTrace: DemoTrace = {
{ {
path: "trigger/0", path: "trigger/0",
timestamp: "2021-03-25T04:36:51.223693+00:00", timestamp: "2021-03-25T04:36:51.223693+00:00",
changed_variables: {},
}, },
], ],
"action/0": [ "action/0": [

View File

@@ -1,14 +1,14 @@
import { mdiMenu } from "@mdi/js";
import "@material/mwc-drawer"; import "@material/mwc-drawer";
import "@material/mwc-top-app-bar-fixed"; import "@material/mwc-top-app-bar-fixed";
import { mdiMenu } from "@mdi/js"; import { html, css, LitElement, PropertyValues } from "lit";
import { LitElement, PropertyValues, css, html } from "lit"; import { customElement, property, query } from "lit/decorators";
import { customElement, query, state } from "lit/decorators";
import { dynamicElement } from "../../src/common/dom/dynamic-element-directive";
import { HaExpansionPanel } from "../../src/components/ha-expansion-panel";
import "../../src/components/ha-icon-button"; import "../../src/components/ha-icon-button";
import "../../src/managers/notification-manager"; import "../../src/managers/notification-manager";
import { HaExpansionPanel } from "../../src/components/ha-expansion-panel";
import { haStyle } from "../../src/resources/styles"; import { haStyle } from "../../src/resources/styles";
import { PAGES, SIDEBAR } from "../build/import-pages"; import { PAGES, SIDEBAR } from "../build/import-pages";
import { dynamicElement } from "../../src/common/dom/dynamic-element-directive";
import "./components/page-description"; import "./components/page-description";
const GITHUB_DEMO_URL = const GITHUB_DEMO_URL =
@@ -24,7 +24,7 @@ const FAKE_HASS = {
@customElement("ha-gallery") @customElement("ha-gallery")
class HaGallery extends LitElement { class HaGallery extends LitElement {
@state() private _page = @property() private _page =
document.location.hash.substring(1) || document.location.hash.substring(1) ||
`${SIDEBAR[0].category}/${SIDEBAR[0].pages![0]}`; `${SIDEBAR[0].category}/${SIDEBAR[0].pages![0]}`;

View File

@@ -21,10 +21,10 @@ const ENTITIES = [
}), }),
]; ];
const conditions: Condition[] = [ const conditions = [
{ condition: "and", conditions: [] }, { condition: "and" },
{ condition: "not", conditions: [] }, { condition: "not" },
{ condition: "or", conditions: [] }, { condition: "or" },
{ condition: "state", entity_id: "light.kitchen", state: "on" }, { condition: "state", entity_id: "light.kitchen", state: "on" },
{ {
condition: "numeric_state", condition: "numeric_state",
@@ -34,11 +34,11 @@ const conditions: Condition[] = [
above: 20, above: 20,
}, },
{ condition: "sun", after: "sunset" }, { condition: "sun", after: "sunset" },
{ condition: "sun", after: "sunrise", before_offset: 3600 }, { condition: "sun", after: "sunrise", offset: "-01:00" },
{ condition: "zone", entity_id: "device_tracker.person", zone: "zone.home" }, { condition: "zone", entity_id: "device_tracker.person", zone: "zone.home" },
{ condition: "trigger", id: "motion" }, { condition: "trigger", id: "motion" },
{ condition: "time" }, { condition: "time" },
{ condition: "template", value_template: "" }, { condition: "template" },
]; ];
const initialCondition: Condition = { const initialCondition: Condition = {

View File

@@ -80,7 +80,7 @@ const SCHEMAS: { name: string; conditions: ConditionWithShorthand[] }[] = [
]; ];
@customElement("demo-automation-editor-condition") @customElement("demo-automation-editor-condition")
export class DemoAutomationEditorCondition extends LitElement { class DemoHaAutomationEditorCondition extends LitElement {
@state() private hass!: HomeAssistant; @state() private hass!: HomeAssistant;
@state() private _disabled = false; @state() private _disabled = false;
@@ -155,6 +155,6 @@ export class DemoAutomationEditorCondition extends LitElement {
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
"demo-automation-editor-condition": DemoAutomationEditorCondition; "demo-ha-automation-editor-condition": DemoHaAutomationEditorCondition;
} }
} }

View File

@@ -126,7 +126,7 @@ const SCHEMAS: { name: string; triggers: Trigger[] }[] = [
]; ];
@customElement("demo-automation-editor-trigger") @customElement("demo-automation-editor-trigger")
export class DemoAutomationEditorTrigger extends LitElement { class DemoHaAutomationEditorTrigger extends LitElement {
@state() private hass!: HomeAssistant; @state() private hass!: HomeAssistant;
@state() private _disabled = false; @state() private _disabled = false;
@@ -201,6 +201,6 @@ export class DemoAutomationEditorTrigger extends LitElement {
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
"demo-automation-editor-trigger": DemoAutomationEditorTrigger; "demo-ha-automation-editor-trigger": DemoHaAutomationEditorTrigger;
} }
} }

View File

@@ -3,6 +3,7 @@
import { css, html, LitElement, nothing } from "lit"; import { css, html, LitElement, nothing } from "lit";
import { customElement, property } from "lit/decorators"; import { customElement, property } from "lit/decorators";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/trace/hat-script-graph";
import "../../../../src/components/trace/hat-trace-timeline"; import "../../../../src/components/trace/hat-trace-timeline";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import { HomeAssistant } from "../../../../src/types"; import { HomeAssistant } from "../../../../src/types";
@@ -55,7 +56,6 @@ export class DemoAutomationTraceTimeline extends LitElement {
super.firstUpdated(changedProps); super.firstUpdated(changedProps);
const hass = provideHass(this); const hass = provideHass(this);
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("config", "en");
} }
static get styles() { static get styles() {

View File

@@ -60,7 +60,6 @@ export class DemoAutomationTrace extends LitElement {
super.firstUpdated(changedProps); super.firstUpdated(changedProps);
const hass = provideHass(this); const hass = provideHass(this);
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("config", "en");
} }
static get styles() { static get styles() {

View File

@@ -59,7 +59,7 @@ export class DemoHaBarButton extends LitElement {
<ha-control-button <ha-control-button
class=${ifDefined(btn.class)} class=${ifDefined(btn.class)}
label=${ifDefined(btn.label)} label=${ifDefined(btn.label)}
?disabled=${btn.disabled} disabled=${ifDefined(btn.disabled)}
> >
<ha-svg-icon .path=${btn.icon || mdiLightbulb}></ha-svg-icon> <ha-svg-icon .path=${btn.icon || mdiLightbulb}></ha-svg-icon>
</ha-control-button> </ha-control-button>
@@ -162,7 +162,7 @@ export class DemoHaBarButton extends LitElement {
} }
.custom-group { .custom-group {
--control-button-group-thickness: 100px; --control-button-group-thickness: 100px;
--control-button-group-border-radius: 36px; --control-button-group-border-radius: 18px;
--control-button-group-spacing: 20px; --control-button-group-spacing: 20px;
} }
.custom-group ha-control-button { .custom-group ha-control-button {

View File

@@ -94,7 +94,7 @@ export class DemoHarControlNumberButtons extends LitElement {
--control-number-buttons-background-color: #2196f3; --control-number-buttons-background-color: #2196f3;
--control-number-buttons-background-opacity: 0.1; --control-number-buttons-background-opacity: 0.1;
--control-number-buttons-thickness: 100px; --control-number-buttons-thickness: 100px;
--control-number-buttons-border-radius: 36px; --control-number-buttons-border-radius: 24px;
} }
`; `;
} }

View File

@@ -135,7 +135,7 @@ export class DemoHaControlSelect extends LitElement {
class=${ifDefined(config.class)} class=${ifDefined(config.class)}
@value-changed=${this.handleValueChanged} @value-changed=${this.handleValueChanged}
aria-labelledby=${id} aria-labelledby=${id}
?disabled=${config.disabled} disabled=${ifDefined(config.disabled)}
> >
</ha-control-select> </ha-control-select>
</div> </div>
@@ -156,7 +156,7 @@ export class DemoHaControlSelect extends LitElement {
class=${ifDefined(config.class)} class=${ifDefined(config.class)}
@value-changed=${this.handleValueChanged} @value-changed=${this.handleValueChanged}
aria-labelledby=${id} aria-labelledby=${id}
?disabled=${config.disabled} disabled=${ifDefined(config.disabled)}
> >
</ha-control-select> </ha-control-select>
`; `;
@@ -186,8 +186,8 @@ export class DemoHaControlSelect extends LitElement {
.custom { .custom {
--mdc-icon-size: 24px; --mdc-icon-size: 24px;
--control-select-color: var(--state-fan-active-color); --control-select-color: var(--state-fan-active-color);
--control-select-thickness: 130px; --control-select-thickness: 100px;
--control-select-border-radius: 36px; --control-select-border-radius: 24px;
} }
.vertical-selects { .vertical-selects {
height: 300px; height: 300px;

View File

@@ -150,8 +150,8 @@ export class DemoHaBarSlider extends LitElement {
--control-slider-color: #ffcf4c; --control-slider-color: #ffcf4c;
--control-slider-background: #ffcf4c; --control-slider-background: #ffcf4c;
--control-slider-background-opacity: 0.2; --control-slider-background-opacity: 0.2;
--control-slider-thickness: 130px; --control-slider-thickness: 100px;
--control-slider-border-radius: 36px; --control-slider-border-radius: 24px;
} }
.vertical-sliders { .vertical-sliders {
height: 300px; height: 300px;

View File

@@ -63,8 +63,8 @@ export class DemoHaControlSwitch extends LitElement {
.pathOn=${mdiLightbulb} .pathOn=${mdiLightbulb}
.pathOff=${mdiLightbulbOff} .pathOff=${mdiLightbulbOff}
aria-labelledby=${id} aria-labelledby=${id}
?disabled=${config.disabled} disabled=${ifDefined(config.disabled)}
?reversed=${config.reversed} reversed=${ifDefined(config.reversed)}
> >
</ha-control-switch> </ha-control-switch>
</div> </div>
@@ -86,8 +86,8 @@ export class DemoHaControlSwitch extends LitElement {
aria-label=${label} aria-label=${label}
.pathOn=${mdiGarageOpen} .pathOn=${mdiGarageOpen}
.pathOff=${mdiGarage} .pathOff=${mdiGarage}
?disabled=${config.disabled} disabled=${ifDefined(config.disabled)}
?reversed=${config.reversed} reversed=${ifDefined(config.reversed)}
> >
</ha-control-switch> </ha-control-switch>
`; `;
@@ -117,8 +117,8 @@ export class DemoHaControlSwitch extends LitElement {
.custom { .custom {
--control-switch-on-color: var(--green-color); --control-switch-on-color: var(--green-color);
--control-switch-off-color: var(--red-color); --control-switch-off-color: var(--red-color);
--control-switch-thickness: 130px; --control-switch-thickness: 100px;
--control-switch-border-radius: 36px; --control-switch-border-radius: 24px;
--control-switch-padding: 6px; --control-switch-padding: 6px;
--mdc-icon-size: 24px; --mdc-icon-size: 24px;
} }

View File

@@ -3,7 +3,6 @@ import { css, html, LitElement, TemplateResult } from "lit";
import { customElement } from "lit/decorators"; import { customElement } from "lit/decorators";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/ha-expansion-panel"; import "../../../../src/components/ha-expansion-panel";
import "../../../../src/components/ha-icon-button";
import "../../../../src/components/ha-markdown"; import "../../../../src/components/ha-markdown";
import "../../components/demo-black-white-row"; import "../../components/demo-black-white-row";
import { LONG_TEXT } from "../../data/text"; import { LONG_TEXT } from "../../data/text";

View File

@@ -10,7 +10,6 @@ import { mockHassioSupervisor } from "../../../../demo/src/stubs/hassio_supervis
import { computeInitialHaFormData } from "../../../../src/components/ha-form/compute-initial-ha-form-data"; import { computeInitialHaFormData } from "../../../../src/components/ha-form/compute-initial-ha-form-data";
import "../../../../src/components/ha-form/ha-form"; import "../../../../src/components/ha-form/ha-form";
import type { HaFormSchema } from "../../../../src/components/ha-form/types"; import type { HaFormSchema } from "../../../../src/components/ha-form/types";
import type { AreaRegistryEntry } from "../../../../src/data/area_registry";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import { HomeAssistant } from "../../../../src/types"; import { HomeAssistant } from "../../../../src/types";
@@ -59,7 +58,6 @@ const DEVICES = [
hw_version: null, hw_version: null,
via_device_id: null, via_device_id: null,
serial_number: null, serial_number: null,
labels: [],
}, },
{ {
area_id: "backyard", area_id: "backyard",
@@ -78,7 +76,6 @@ const DEVICES = [
hw_version: null, hw_version: null,
via_device_id: null, via_device_id: null,
serial_number: null, serial_number: null,
labels: [],
}, },
{ {
area_id: null, area_id: null,
@@ -97,37 +94,27 @@ const DEVICES = [
hw_version: null, hw_version: null,
via_device_id: null, via_device_id: null,
serial_number: null, serial_number: null,
labels: [],
}, },
]; ];
const AREAS: AreaRegistryEntry[] = [ const AREAS = [
{ {
area_id: "backyard", area_id: "backyard",
floor_id: null,
name: "Backyard", name: "Backyard",
icon: null,
picture: null, picture: null,
aliases: [], aliases: [],
labels: [],
}, },
{ {
area_id: "bedroom", area_id: "bedroom",
floor_id: null,
name: "Bedroom", name: "Bedroom",
icon: "mdi:bed",
picture: null, picture: null,
aliases: [], aliases: [],
labels: [],
}, },
{ {
area_id: "livingroom", area_id: "livingroom",
floor_id: null,
name: "Livingroom", name: "Livingroom",
icon: "mdi:sofa",
picture: null, picture: null,
aliases: [], aliases: [],
labels: [],
}, },
]; ];

View File

@@ -9,7 +9,6 @@ import { mockEntityRegistry } from "../../../../demo/src/stubs/entity_registry";
import { mockHassioSupervisor } from "../../../../demo/src/stubs/hassio_supervisor"; import { mockHassioSupervisor } from "../../../../demo/src/stubs/hassio_supervisor";
import "../../../../src/components/ha-selector/ha-selector"; import "../../../../src/components/ha-selector/ha-selector";
import "../../../../src/components/ha-settings-row"; import "../../../../src/components/ha-settings-row";
import type { AreaRegistryEntry } from "../../../../src/data/area_registry";
import { BlueprintInput } from "../../../../src/data/blueprint"; import { BlueprintInput } from "../../../../src/data/blueprint";
import { showDialog } from "../../../../src/dialogs/make-dialog-manager"; import { showDialog } from "../../../../src/dialogs/make-dialog-manager";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
@@ -17,10 +16,6 @@ import { provideHass } from "../../../../src/fake_data/provide_hass";
import { ProvideHassElement } from "../../../../src/mixins/provide-hass-lit-mixin"; import { ProvideHassElement } from "../../../../src/mixins/provide-hass-lit-mixin";
import type { HomeAssistant } from "../../../../src/types"; import type { HomeAssistant } from "../../../../src/types";
import "../../components/demo-black-white-row"; import "../../components/demo-black-white-row";
import { FloorRegistryEntry } from "../../../../src/data/floor_registry";
import { LabelRegistryEntry } from "../../../../src/data/label_registry";
import { mockFloorRegistry } from "../../../../demo/src/stubs/floor_registry";
import { mockLabelRegistry } from "../../../../demo/src/stubs/label_registry";
const ENTITIES = [ const ENTITIES = [
getEntity("alarm_control_panel", "alarm", "disarmed", { getEntity("alarm_control_panel", "alarm", "disarmed", {
@@ -59,7 +54,6 @@ const DEVICES = [
hw_version: null, hw_version: null,
via_device_id: null, via_device_id: null,
serial_number: null, serial_number: null,
labels: [],
}, },
{ {
area_id: "backyard", area_id: "backyard",
@@ -78,7 +72,6 @@ const DEVICES = [
hw_version: null, hw_version: null,
via_device_id: null, via_device_id: null,
serial_number: null, serial_number: null,
labels: [],
}, },
{ {
area_id: null, area_id: null,
@@ -97,76 +90,27 @@ const DEVICES = [
hw_version: null, hw_version: null,
via_device_id: null, via_device_id: null,
serial_number: null, serial_number: null,
labels: [],
}, },
]; ];
const AREAS: AreaRegistryEntry[] = [ const AREAS = [
{ {
area_id: "backyard", area_id: "backyard",
floor_id: "ground",
name: "Backyard", name: "Backyard",
icon: null,
picture: null, picture: null,
aliases: [], aliases: [],
labels: [],
}, },
{ {
area_id: "bedroom", area_id: "bedroom",
floor_id: "first",
name: "Bedroom", name: "Bedroom",
icon: "mdi:bed",
picture: null, picture: null,
aliases: [], aliases: [],
labels: [],
}, },
{ {
area_id: "livingroom", area_id: "livingroom",
floor_id: "ground",
name: "Livingroom", name: "Livingroom",
icon: "mdi:sofa",
picture: null, picture: null,
aliases: [], aliases: [],
labels: [],
},
];
const FLOORS: FloorRegistryEntry[] = [
{
floor_id: "ground",
name: "Ground floor",
level: 0,
icon: null,
aliases: [],
},
{
floor_id: "first",
name: "First floor",
level: 1,
icon: "mdi:numeric-1",
aliases: [],
},
{
floor_id: "second",
name: "Second floor",
level: 2,
icon: "mdi:numeric-2",
aliases: [],
},
];
const LABELS: LabelRegistryEntry[] = [
{
label_id: "energy",
name: "Energy",
icon: null,
color: "yellow",
},
{
label_id: "entertainment",
name: "Entertainment",
icon: "mdi:popcorn",
color: "blue",
}, },
]; ];
@@ -177,12 +121,7 @@ const SCHEMAS: {
{ {
name: "One of each", name: "One of each",
input: { input: {
label: { name: "Label", selector: { label: {} } },
floor: { name: "Floor", selector: { floor: {} } },
area: { name: "Area", selector: { area: {} } },
device: { name: "Device", selector: { device: {} } },
entity: { name: "Entity", selector: { entity: {} } }, entity: { name: "Entity", selector: { entity: {} } },
target: { name: "Target", selector: { target: {} } },
state: { state: {
name: "State", name: "State",
selector: { state: { entity_id: "alarm_control_panel.alarm" } }, selector: { state: { entity_id: "alarm_control_panel.alarm" } },
@@ -191,12 +130,15 @@ const SCHEMAS: {
name: "Attribute", name: "Attribute",
selector: { attribute: { entity_id: "" } }, selector: { attribute: { entity_id: "" } },
}, },
device: { name: "Device", selector: { device: {} } },
config_entry: { config_entry: {
name: "Integration", name: "Integration",
selector: { config_entry: {} }, selector: { config_entry: {} },
}, },
duration: { name: "Duration", selector: { duration: {} } }, duration: { name: "Duration", selector: { duration: {} } },
addon: { name: "Addon", selector: { addon: {} } }, addon: { name: "Addon", selector: { addon: {} } },
area: { name: "Area", selector: { area: {} } },
target: { name: "Target", selector: { target: {} } },
number_box: { number_box: {
name: "Number Box", name: "Number Box",
selector: { selector: {
@@ -329,14 +271,6 @@ const SCHEMAS: {
selector: { color_temp: {} }, selector: { color_temp: {} },
}, },
color_rgb: { name: "Color", selector: { color_rgb: {} } }, color_rgb: { name: "Color", selector: { color_rgb: {} } },
qr_code: {
name: "QR Code",
selector: { qr_code: { data: "https://home-assistant.io" } },
},
constant: {
name: "Constant",
selector: { constant: { value: true, label: "Yes!" } },
},
}, },
}, },
{ {
@@ -345,8 +279,6 @@ const SCHEMAS: {
entity: { name: "Entity", selector: { entity: { multiple: true } } }, entity: { name: "Entity", selector: { entity: { multiple: true } } },
device: { name: "Device", selector: { device: { multiple: true } } }, device: { name: "Device", selector: { device: { multiple: true } } },
area: { name: "Area", selector: { area: { multiple: true } } }, area: { name: "Area", selector: { area: { multiple: true } } },
floor: { name: "Floor", selector: { floor: { multiple: true } } },
label: { name: "Label", selector: { label: { multiple: true } } },
select: { select: {
name: "Select Multiple", name: "Select Multiple",
selector: { selector: {
@@ -403,8 +335,6 @@ class DemoHaSelector extends LitElement implements ProvideHassElement {
mockDeviceRegistry(hass, DEVICES); mockDeviceRegistry(hass, DEVICES);
mockConfigEntries(hass); mockConfigEntries(hass);
mockAreaRegistry(hass, AREAS); mockAreaRegistry(hass, AREAS);
mockFloorRegistry(hass, FLOORS);
mockLabelRegistry(hass, LABELS);
mockHassioSupervisor(hass); mockHassioSupervisor(hass);
hass.mockWS("auth/sign_path", (params) => params); hass.mockWS("auth/sign_path", (params) => params);
hass.mockWS("media_player/browse_media", this._browseMedia); hass.mockWS("media_player/browse_media", this._browseMedia);
@@ -567,7 +497,7 @@ class DemoHaSelector extends LitElement implements ProvideHassElement {
this.requestUpdate(); this.requestUpdate();
}; };
return html` return html`
<demo-black-white-row .title=${info.name}> <demo-black-white-row .title=${info.name} .value=${this.data[idx]}>
${["light", "dark"].map((slot) => ${["light", "dark"].map((slot) =>
Object.entries(info.input).map( Object.entries(info.input).map(
([key, value]) => html` ([key, value]) => html`
@@ -600,8 +530,8 @@ class DemoHaSelector extends LitElement implements ProvideHassElement {
} }
static styles = css` static styles = css`
ha-settings-row { ha-selector {
--paper-item-body-two-line-min-height: 0; width: 60;
} }
.options { .options {
max-width: 800px; max-width: 800px;

View File

@@ -1,20 +1,19 @@
import "@material/mwc-list/mwc-list"; import { html, css, LitElement } from "lit";
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators"; import { customElement, state } from "lit/decorators";
import { formatDateTimeNumeric } from "../../../../src/common/datetime/format_date_time";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/ha-control-select"; import "../../../../src/components/ha-control-select";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { formatDateTimeNumeric } from "../../../../src/common/datetime/format_date_time";
import { timeOptions } from "../../data/date-options";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { import {
DateFormat,
FirstWeekday,
FrontendLocaleData, FrontendLocaleData,
NumberFormat, NumberFormat,
TimeFormat, TimeFormat,
DateFormat,
FirstWeekday,
TimeZone, TimeZone,
} from "../../../../src/data/translation"; } from "../../../../src/data/translation";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { timeOptions } from "../../data/date-options";
@customElement("demo-date-time-date-time-numeric") @customElement("demo-date-time-date-time-numeric")
export class DemoDateTimeDateTimeNumeric extends LitElement { export class DemoDateTimeDateTimeNumeric extends LitElement {

View File

@@ -1,20 +1,19 @@
import "@material/mwc-list/mwc-list"; import { html, css, LitElement } from "lit";
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators"; import { customElement, state } from "lit/decorators";
import { formatDateTimeWithSeconds } from "../../../../src/common/datetime/format_date_time";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/ha-control-select"; import "../../../../src/components/ha-control-select";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { formatDateTimeWithSeconds } from "../../../../src/common/datetime/format_date_time";
import { timeOptions } from "../../data/date-options";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { import {
DateFormat,
FirstWeekday,
FrontendLocaleData, FrontendLocaleData,
NumberFormat, NumberFormat,
TimeFormat, TimeFormat,
DateFormat,
FirstWeekday,
TimeZone, TimeZone,
} from "../../../../src/data/translation"; } from "../../../../src/data/translation";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { timeOptions } from "../../data/date-options";
@customElement("demo-date-time-date-time-seconds") @customElement("demo-date-time-date-time-seconds")
export class DemoDateTimeDateTimeSeconds extends LitElement { export class DemoDateTimeDateTimeSeconds extends LitElement {

View File

@@ -1,20 +1,19 @@
import "@material/mwc-list/mwc-list"; import { html, css, LitElement } from "lit";
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators"; import { customElement, state } from "lit/decorators";
import { formatShortDateTimeWithYear } from "../../../../src/common/datetime/format_date_time";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/ha-control-select"; import "../../../../src/components/ha-control-select";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { formatShortDateTimeWithYear } from "../../../../src/common/datetime/format_date_time";
import { timeOptions } from "../../data/date-options";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { import {
DateFormat,
FirstWeekday,
FrontendLocaleData, FrontendLocaleData,
NumberFormat, NumberFormat,
TimeFormat, TimeFormat,
DateFormat,
FirstWeekday,
TimeZone, TimeZone,
} from "../../../../src/data/translation"; } from "../../../../src/data/translation";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { timeOptions } from "../../data/date-options";
@customElement("demo-date-time-date-time-short-year") @customElement("demo-date-time-date-time-short-year")
export class DemoDateTimeDateTimeShortYear extends LitElement { export class DemoDateTimeDateTimeShortYear extends LitElement {

View File

@@ -1,20 +1,19 @@
import "@material/mwc-list/mwc-list"; import { html, css, LitElement } from "lit";
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators"; import { customElement, state } from "lit/decorators";
import { formatShortDateTime } from "../../../../src/common/datetime/format_date_time";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/ha-control-select"; import "../../../../src/components/ha-control-select";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { formatShortDateTime } from "../../../../src/common/datetime/format_date_time";
import { timeOptions } from "../../data/date-options";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { import {
DateFormat,
FirstWeekday,
FrontendLocaleData, FrontendLocaleData,
NumberFormat, NumberFormat,
TimeFormat, TimeFormat,
DateFormat,
FirstWeekday,
TimeZone, TimeZone,
} from "../../../../src/data/translation"; } from "../../../../src/data/translation";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { timeOptions } from "../../data/date-options";
@customElement("demo-date-time-date-time-short") @customElement("demo-date-time-date-time-short")
export class DemoDateTimeDateTimeShort extends LitElement { export class DemoDateTimeDateTimeShort extends LitElement {

View File

@@ -1,20 +1,19 @@
import "@material/mwc-list/mwc-list"; import { html, css, LitElement } from "lit";
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators"; import { customElement, state } from "lit/decorators";
import { formatDateTime } from "../../../../src/common/datetime/format_date_time";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/ha-control-select"; import "../../../../src/components/ha-control-select";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { formatDateTime } from "../../../../src/common/datetime/format_date_time";
import { timeOptions } from "../../data/date-options";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { import {
DateFormat,
FirstWeekday,
FrontendLocaleData, FrontendLocaleData,
NumberFormat, NumberFormat,
TimeFormat, TimeFormat,
DateFormat,
FirstWeekday,
TimeZone, TimeZone,
} from "../../../../src/data/translation"; } from "../../../../src/data/translation";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { timeOptions } from "../../data/date-options";
@customElement("demo-date-time-date-time") @customElement("demo-date-time-date-time")
export class DemoDateTimeDateTime extends LitElement { export class DemoDateTimeDateTime extends LitElement {

View File

@@ -1,20 +1,18 @@
import "@material/mwc-list/mwc-list"; import { html, css, LitElement } from "lit";
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators"; import { customElement, state } from "lit/decorators";
import { formatTimeWithSeconds } from "../../../../src/common/datetime/format_time";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/ha-control-select"; import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { formatTimeWithSeconds } from "../../../../src/common/datetime/format_time";
import { timeOptions } from "../../data/date-options";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { import {
DateFormat,
FirstWeekday,
FrontendLocaleData, FrontendLocaleData,
NumberFormat, NumberFormat,
TimeFormat, TimeFormat,
DateFormat,
FirstWeekday,
TimeZone, TimeZone,
} from "../../../../src/data/translation"; } from "../../../../src/data/translation";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { timeOptions } from "../../data/date-options";
@customElement("demo-date-time-time-seconds") @customElement("demo-date-time-time-seconds")
export class DemoDateTimeTimeSeconds extends LitElement { export class DemoDateTimeTimeSeconds extends LitElement {

View File

@@ -1,20 +1,18 @@
import "@material/mwc-list/mwc-list"; import { html, css, LitElement } from "lit";
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators"; import { customElement, state } from "lit/decorators";
import { formatTimeWeekday } from "../../../../src/common/datetime/format_time";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/ha-control-select"; import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { formatTimeWeekday } from "../../../../src/common/datetime/format_time";
import { timeOptions } from "../../data/date-options";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { import {
DateFormat,
FirstWeekday,
FrontendLocaleData, FrontendLocaleData,
NumberFormat, NumberFormat,
TimeFormat, TimeFormat,
DateFormat,
FirstWeekday,
TimeZone, TimeZone,
} from "../../../../src/data/translation"; } from "../../../../src/data/translation";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { timeOptions } from "../../data/date-options";
@customElement("demo-date-time-time-weekday") @customElement("demo-date-time-time-weekday")
export class DemoDateTimeTimeWeekday extends LitElement { export class DemoDateTimeTimeWeekday extends LitElement {

View File

@@ -1,20 +1,19 @@
import "@material/mwc-list/mwc-list"; import { html, css, LitElement } from "lit";
import { LitElement, css, html } from "lit";
import { customElement, state } from "lit/decorators"; import { customElement, state } from "lit/decorators";
import { formatTime } from "../../../../src/common/datetime/format_time";
import "../../../../src/components/ha-card"; import "../../../../src/components/ha-card";
import "../../../../src/components/ha-control-select"; import "../../../../src/components/ha-control-select";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { formatTime } from "../../../../src/common/datetime/format_time";
import { timeOptions } from "../../data/date-options";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { import {
DateFormat,
FirstWeekday,
FrontendLocaleData, FrontendLocaleData,
NumberFormat, NumberFormat,
TimeFormat, TimeFormat,
DateFormat,
FirstWeekday,
TimeZone, TimeZone,
} from "../../../../src/data/translation"; } from "../../../../src/data/translation";
import { demoConfig } from "../../../../src/fake_data/demo_config";
import { translationMetadata } from "../../../../src/resources/translations-metadata";
import { timeOptions } from "../../data/date-options";
@customElement("demo-date-time-time") @customElement("demo-date-time-time")
export class DemoDateTimeTime extends LitElement { export class DemoDateTimeTime extends LitElement {

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("alarm_control_panel", "alarm", "disarmed", { getEntity("alarm_control_panel", "alarm", "disarmed", {
@@ -85,7 +84,6 @@ class DemoAlarmPanelEntity extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("light", "bed_light", "on", { getEntity("light", "bed_light", "on", {
@@ -147,7 +146,6 @@ class DemoArea extends LitElement {
entity_id: "binary_sensor.kitchen_door", entity_id: "binary_sensor.kitchen_door",
}, },
]); ]);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("light", "controller_1", "on", { getEntity("light", "controller_1", "on", {
@@ -67,7 +66,6 @@ class DemoConditional extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("light", "bed_light", "on", { getEntity("light", "bed_light", "on", {
@@ -324,7 +323,6 @@ class DemoEntities extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("light", "bed_light", "on", { getEntity("light", "bed_light", "on", {
@@ -83,7 +82,6 @@ class DemoButtonEntity extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("device_tracker", "demo_paulus", "work", { getEntity("device_tracker", "demo_paulus", "work", {
@@ -11,7 +10,7 @@ const ENTITIES = [
latitude: 32.877105, latitude: 32.877105,
longitude: 117.232185, longitude: 117.232185,
gps_accuracy: 91, gps_accuracy: 91,
battery: 25, battery: 71,
friendly_name: "Paulus", friendly_name: "Paulus",
}), }),
getEntity("device_tracker", "demo_anne_therese", "school", { getEntity("device_tracker", "demo_anne_therese", "school", {
@@ -19,7 +18,7 @@ const ENTITIES = [
latitude: 32.877105, latitude: 32.877105,
longitude: 117.232185, longitude: 117.232185,
gps_accuracy: 91, gps_accuracy: 91,
battery: 50, battery: 71,
friendly_name: "Anne Therese", friendly_name: "Anne Therese",
}), }),
getEntity("device_tracker", "demo_home_boy", "home", { getEntity("device_tracker", "demo_home_boy", "home", {
@@ -27,7 +26,7 @@ const ENTITIES = [
latitude: 32.877105, latitude: 32.877105,
longitude: 117.232185, longitude: 117.232185,
gps_accuracy: 91, gps_accuracy: 91,
battery: 75, battery: 71,
friendly_name: "Home Boy", friendly_name: "Home Boy",
}), }),
getEntity("light", "bed_light", "on", { getEntity("light", "bed_light", "on", {
@@ -39,53 +38,21 @@ const ENTITIES = [
getEntity("light", "ceiling_lights", "off", { getEntity("light", "ceiling_lights", "off", {
friendly_name: "Ceiling Lights", friendly_name: "Ceiling Lights",
}), }),
getEntity("sensor", "battery_1", 20, {
device_class: "battery",
friendly_name: "Battery 1",
unit_of_measurement: "%",
}),
getEntity("sensor", "battery_2", 35, {
device_class: "battery",
friendly_name: "Battery 2",
unit_of_measurement: "%",
}),
getEntity("sensor", "battery_3", 40, {
device_class: "battery",
friendly_name: "Battery 3",
unit_of_measurement: "%",
}),
getEntity("sensor", "battery_4", 80, {
device_class: "battery",
friendly_name: "Battery 4",
unit_of_measurement: "%",
}),
getEntity("input_number", "min_battery_level", 30, {
mode: "slider",
step: 10,
min: 0,
max: 100,
icon: "mdi:battery-alert-variant",
friendly_name: "Minimum Battery Level",
unit_of_measurement: "%",
}),
]; ];
const CONFIGS = [ const CONFIGS = [
{ {
heading: "Unfiltered entities", heading: "Unfiltered controller",
config: ` config: `
- type: entities - type: entities
entities: entities:
- device_tracker.demo_anne_therese - light.bed_light
- device_tracker.demo_home_boy - light.ceiling_lights
- device_tracker.demo_paulus - light.kitchen_lights
- light.bed_light
- light.ceiling_lights
- light.kitchen_lights
`, `,
}, },
{ {
heading: "On and home entities", heading: "Filtered entities card",
config: ` config: `
- type: entity-filter - type: entity-filter
entities: entities:
@@ -95,28 +62,9 @@ const CONFIGS = [
- light.bed_light - light.bed_light
- light.ceiling_lights - light.ceiling_lights
- light.kitchen_lights - light.kitchen_lights
conditions: state_filter:
- condition: state - "on"
state: - home
- "on"
- home
`,
},
{
heading: "Same state as Bed Light",
config: `
- type: entity-filter
entities:
- device_tracker.demo_anne_therese
- device_tracker.demo_home_boy
- device_tracker.demo_paulus
- light.bed_light
- light.ceiling_lights
- light.kitchen_lights
conditions:
- condition: state
state:
- light.bed_light
`, `,
}, },
{ {
@@ -130,11 +78,9 @@ const CONFIGS = [
- light.bed_light - light.bed_light
- light.ceiling_lights - light.ceiling_lights
- light.kitchen_lights - light.kitchen_lights
conditions: state_filter:
- condition: state - "on"
state: - not_home
- "on"
- home
card: card:
type: entities type: entities
title: Custom Title title: Custom Title
@@ -152,101 +98,15 @@ const CONFIGS = [
- light.bed_light - light.bed_light
- light.ceiling_lights - light.ceiling_lights
- light.kitchen_lights - light.kitchen_lights
conditions: state_filter:
- condition: state - "on"
state: - not_home
- "on"
- home
card: card:
type: glance type: glance
show_state: true show_state: true
title: Custom Title title: Custom Title
`, `,
}, },
{
heading:
"Filtered entities by battery attribute (< '30') using state filter",
config: `
- type: entity-filter
entities:
- device_tracker.demo_anne_therese
- device_tracker.demo_home_boy
- device_tracker.demo_paulus
state_filter:
- operator: <
attribute: battery
value: "30"
`,
},
{
heading: "Unfiltered number entities",
config: `
- type: entities
entities:
- input_number.min_battery_level
- sensor.battery_1
- sensor.battery_3
- sensor.battery_2
- sensor.battery_4
`,
},
{
heading: "Battery lower than 50%",
config: `
- type: entity-filter
entities:
- sensor.battery_1
- sensor.battery_3
- sensor.battery_2
- sensor.battery_4
conditions:
- condition: numeric_state
below: 50
`,
},
{
heading: "Battery lower than min battery level",
config: `
- type: entity-filter
entities:
- sensor.battery_1
- sensor.battery_3
- sensor.battery_2
- sensor.battery_4
conditions:
- condition: numeric_state
below: input_number.min_battery_level
`,
},
{
heading: "Battery between min battery level and 70%",
config: `
- type: entity-filter
entities:
- sensor.battery_1
- sensor.battery_3
- sensor.battery_2
- sensor.battery_4
conditions:
- condition: numeric_state
above: input_number.min_battery_level
below: 70
`,
},
{
heading: "Error: Entities must be specified",
config: `
- type: entity-filter
`,
},
{
heading: "Error: Incorrect filter config",
config: `
- type: entity-filter
entities:
- sensor.gas_station_lowest_price
`,
},
]; ];
@customElement("demo-lovelace-entity-filter-card") @customElement("demo-lovelace-entity-filter-card")
@@ -263,7 +123,6 @@ class DemoEntityFilter extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("sensor", "brightness", "12", {}), getEntity("sensor", "brightness", "12", {}),
@@ -129,7 +128,6 @@ class DemoGaugeEntity extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("device_tracker", "demo_paulus", "home", { getEntity("device_tracker", "demo_paulus", "home", {
@@ -239,7 +238,6 @@ class DemoGlanceEntity extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -4,7 +4,6 @@ import { mockHistory } from "../../../../demo/src/stubs/history";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("light", "kitchen_lights", "on", { getEntity("light", "kitchen_lights", "on", {
@@ -215,7 +214,6 @@ class DemoStack extends LitElement {
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockHistory(hass); mockHistory(hass);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("light", "bed_light", "on", { getEntity("light", "bed_light", "on", {
@@ -77,7 +76,6 @@ class DemoLightEntity extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -65,23 +65,15 @@ const CONFIGS = [
>> ...by using additional greater-than signs right next to each other... >> ...by using additional greater-than signs right next to each other...
> > > ...or with spaces between arrows. > > > ...or with spaces between arrows.
> [!NOTE] > **Warning** Hey there
> This is a GitHub note alert > This is a warning with a title
> [!TIP] > **Note**
> This is a GitHub tip alert > This is a note
> [!IMPORTANT] > **Note**
> This is a GitHub important alert > This is a multiline note
> Lorem ipsum...
> [!WARNING]
> This is a GitHub warning alert
> [!CAUTION]
> This is a GitHub caution alert
> [!TIP]
> - This is a list entry in GitHub tip alert
## Lists ## Lists

View File

@@ -55,7 +55,7 @@ const CONFIGS = [
]; ];
@customElement("demo-lovelace-media-player-row") @customElement("demo-lovelace-media-player-row")
export class DemoLovelaceMediaPlayerRow extends LitElement { class DemoHuiMediaPlayerRow extends LitElement {
@query("#demos") private _demoRoot!: HTMLElement; @query("#demos") private _demoRoot!: HTMLElement;
protected render(): TemplateResult { protected render(): TemplateResult {
@@ -73,6 +73,6 @@ export class DemoLovelaceMediaPlayerRow extends LitElement {
declare global { declare global {
interface HTMLElementTagNameMap { interface HTMLElementTagNameMap {
"demo-lovelace-media-player-row": DemoLovelaceMediaPlayerRow; "demo-lovelace-media-player-rows": DemoHuiMediaPlayerRow;
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("light", "bed_light", "on", { getEntity("light", "bed_light", "on", {
@@ -139,7 +138,6 @@ class DemoPictureElements extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("light", "kitchen_lights", "on", { getEntity("light", "kitchen_lights", "on", {
@@ -94,7 +93,6 @@ class DemoPictureEntity extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("switch", "decorative_lights", "on", { getEntity("switch", "decorative_lights", "on", {
@@ -135,7 +134,6 @@ class DemoPictureGlance extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { createPlantEntities } from "../../data/plants"; import { createPlantEntities } from "../../data/plants";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const CONFIGS = [ const CONFIGS = [
{ {
@@ -44,7 +43,6 @@ export class DemoPlantEntity extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(createPlantEntities()); hass.addEntities(createPlantEntities());
mockIcons(hass);
} }
} }

View File

@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("climate", "ecobee", "auto", { getEntity("climate", "ecobee", "auto", {
@@ -36,45 +35,6 @@ const ENTITIES = [
friendly_name: "Nest", friendly_name: "Nest",
supported_features: 43, supported_features: 43,
}), }),
getEntity("climate", "overkiz_radiator", "heat", {
current_temperature: 18,
min_temp: 7,
max_temp: 35,
temperature: 20,
hvac_modes: ["heat", "auto", "off"],
friendly_name: "Overkiz radiator",
supported_features: 17,
preset_mode: "comfort",
preset_modes: [
"none",
"frost_protection",
"eco",
"comfort",
"comfort-1",
"comfort-2",
"auto",
"boost",
"external",
"prog",
],
}),
getEntity("climate", "overkiz_towel_dryer", "heat", {
current_temperature: null,
min_temp: 7,
max_temp: 35,
hvac_modes: ["heat", "off"],
friendly_name: "Overkiz towel dryer",
supported_features: 16,
preset_mode: "eco",
preset_modes: [
"none",
"frost_protection",
"eco",
"comfort",
"comfort-1",
"comfort-2",
],
}),
getEntity("climate", "sensibo", "fan_only", { getEntity("climate", "sensibo", "fan_only", {
current_temperature: null, current_temperature: null,
temperature: null, temperature: null,
@@ -85,9 +45,7 @@ const ENTITIES = [
friendly_name: "Sensibo purifier", friendly_name: "Sensibo purifier",
fan_modes: ["low", "high"], fan_modes: ["low", "high"],
fan_mode: "low", fan_mode: "low",
swing_modes: ["on", "off", "both", "vertical", "horizontal"], supported_features: 9,
swing_mode: "vertical",
supported_features: 41,
}), }),
getEntity("climate", "unavailable", "unavailable", { getEntity("climate", "unavailable", "unavailable", {
supported_features: 43, supported_features: 43,
@@ -100,6 +58,8 @@ const CONFIGS = [
config: ` config: `
- type: thermostat - type: thermostat
entity: climate.ecobee entity: climate.ecobee
- type: thermostat
entity: climate.nest
`, `,
}, },
{ {
@@ -109,66 +69,6 @@ const CONFIGS = [
entity: climate.nest entity: climate.nest
`, `,
}, },
{
heading: "Feature example",
config: `
- type: thermostat
entity: climate.overkiz_radiator
features:
- type: climate-hvac-modes
hvac_modes:
- heat
- 'off'
- auto
- type: climate-preset-modes
style: icons
preset_modes:
- none
- frost_protection
- eco
- comfort
- comfort-1
- comfort-2
- auto
- boost
- external
- prog
- type: climate-preset-modes
style: dropdown
preset_modes:
- none
- frost_protection
- eco
- comfort
- comfort-1
- comfort-2
- auto
- boost
- external
- prog
`,
},
{
heading: "Preset only example",
config: `
- type: thermostat
entity: climate.overkiz_towel_dryer
features:
- type: climate-hvac-modes
hvac_modes:
- heat
- 'off'
- type: climate-preset-modes
style: icons
preset_modes:
- none
- frost_protection
- eco
- comfort
- comfort-1
- comfort-2
`,
},
{ {
heading: "Fan only example", heading: "Fan only example",
config: ` config: `
@@ -184,14 +84,6 @@ const CONFIGS = [
fan_modes: fan_modes:
- low - low
- high - high
- type: climate-swing-modes
style: icons
swing_modes:
- 'on'
- 'off'
- 'both'
- 'vertical'
- 'horizontal'
`, `,
}, },
{ {
@@ -224,7 +116,6 @@ class DemoThermostatEntity extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -6,7 +6,6 @@ import { VacuumEntityFeature } from "../../../../src/data/vacuum";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("switch", "tv_outlet", "on", { getEntity("switch", "tv_outlet", "on", {
@@ -80,18 +79,6 @@ const CONFIGS = [
color: pink color: pink
`, `,
}, },
{
heading: "Whole tile tap action",
config: `
- type: tile
entity: switch.tv_outlet
color: pink
tap_action:
action: toggle
icon_tap_action:
action: none
`,
},
{ {
heading: "Unknown entity", heading: "Unknown entity",
config: ` config: `
@@ -185,7 +172,6 @@ class DemoTile extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
} }
} }

View File

@@ -4,7 +4,6 @@ import { provideHass } from "../../../../src/fake_data/provide_hass";
import "../../components/demo-cards"; import "../../components/demo-cards";
import { getEntity } from "../../../../src/fake_data/entity"; import { getEntity } from "../../../../src/fake_data/entity";
import { mockTodo } from "../../../../demo/src/stubs/todo"; import { mockTodo } from "../../../../demo/src/stubs/todo";
import { mockIcons } from "../../../../demo/src/stubs/icons";
const ENTITIES = [ const ENTITIES = [
getEntity("todo", "shopping_list", "2", { getEntity("todo", "shopping_list", "2", {
@@ -48,7 +47,6 @@ class DemoTodoListEntity extends LitElement {
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("lovelace", "en"); hass.updateTranslations("lovelace", "en");
hass.addEntities(ENTITIES); hass.addEntities(ENTITIES);
mockIcons(hass);
mockTodo(hass); mockTodo(hass);
} }

View File

@@ -11,7 +11,6 @@ import "../../../../src/components/data-table/ha-data-table";
import type { DataTableColumnContainer } from "../../../../src/components/data-table/ha-data-table"; import type { DataTableColumnContainer } from "../../../../src/components/data-table/ha-data-table";
import "../../../../src/components/entity/state-badge"; import "../../../../src/components/entity/state-badge";
import { provideHass } from "../../../../src/fake_data/provide_hass"; import { provideHass } from "../../../../src/fake_data/provide_hass";
import { mockIcons } from "../../../../demo/src/stubs/icons";
import { HomeAssistant } from "../../../../src/types"; import { HomeAssistant } from "../../../../src/types";
const SENSOR_DEVICE_CLASSES = [ const SENSOR_DEVICE_CLASSES = [
@@ -54,7 +53,6 @@ const SENSOR_DEVICE_CLASSES = [
"volatile_organic_compounds_parts", "volatile_organic_compounds_parts",
"voltage", "voltage",
"volume", "volume",
"volume_flow_rate",
"water", "water",
"weight", "weight",
"wind_speed", "wind_speed",
@@ -292,7 +290,6 @@ const ENTITIES: HassEntity[] = [
createEntity("water_heater.high_demand", "high_demand"), createEntity("water_heater.high_demand", "high_demand"),
createEntity("water_heater.heat_pump", "heat_pump"), createEntity("water_heater.heat_pump", "heat_pump"),
createEntity("water_heater.gas", "gas"), createEntity("water_heater.gas", "gas"),
createEntity("select.speed", "ridiculous_speed"),
]; ];
function createEntity( function createEntity(
@@ -347,7 +344,6 @@ export class DemoEntityState extends LitElement {
title: "Icon", title: "Icon",
template: (entry) => html` template: (entry) => html`
<state-badge <state-badge
.hass=${hass}
.stateObj=${entry.stateObj} .stateObj=${entry.stateObj}
.stateColor=${true} .stateColor=${true}
></state-badge> ></state-badge>
@@ -399,17 +395,6 @@ export class DemoEntityState extends LitElement {
protected firstUpdated(changedProps) { protected firstUpdated(changedProps) {
super.firstUpdated(changedProps); super.firstUpdated(changedProps);
const hass = provideHass(this); const hass = provideHass(this);
mockIcons(hass);
hass.updateHass({
entities: {
"select.speed": {
entity_id: "select.speed",
translation_key: "speed",
platform: "demo",
labels: [],
},
},
});
hass.updateTranslations(null, "en"); hass.updateTranslations(null, "en");
hass.updateTranslations("config", "en"); hass.updateTranslations("config", "en");
} }

View File

@@ -31,7 +31,6 @@ const createConfigEntry = (
supports_options: false, supports_options: false,
supports_remove_device: false, supports_remove_device: false,
supports_unload: true, supports_unload: true,
supports_reconfigure: true,
disabled_by: null, disabled_by: null,
pref_disable_new_entities: false, pref_disable_new_entities: false,
pref_disable_polling: false, pref_disable_polling: false,
@@ -199,8 +198,6 @@ const createEntityRegistryEntries = (
has_entity_name: false, has_entity_name: false,
unique_id: "updater", unique_id: "updater",
options: null, options: null,
labels: [],
categories: {},
}, },
]; ];
@@ -224,7 +221,6 @@ const createDeviceRegistryEntries = (
name_by_user: null, name_by_user: null,
disabled_by: null, disabled_by: null,
configuration_url: null, configuration_url: null,
labels: [],
}, },
]; ];

View File

@@ -59,9 +59,3 @@ export class DemoUtilLongPress extends LitElement {
} }
`; `;
} }
declare global {
interface HTMLElementTagNameMap {
"demo-misc-util-long-press": DemoUtilLongPress;
}
}

View File

@@ -11,7 +11,7 @@ import "../../components/demo-more-infos";
import { ClimateEntityFeature } from "../../../../src/data/climate"; import { ClimateEntityFeature } from "../../../../src/data/climate";
const ENTITIES = [ const ENTITIES = [
getEntity("climate", "radiator", "heat", { getEntity("climate", "thermostat", "heat", {
friendly_name: "Basic heater", friendly_name: "Basic heater",
hvac_modes: ["heat", "off"], hvac_modes: ["heat", "off"],
hvac_mode: "heat", hvac_mode: "heat",
@@ -80,24 +80,6 @@ const ENTITIES = [
max_humidity: 100, max_humidity: 100,
humidity: 50, humidity: 50,
}), }),
getEntity("climate", "towel_dryer", "heat", {
friendly_name: "Preset only heater",
hvac_modes: ["heat", "off"],
hvac_mode: "heat",
preset_modes: [
"none",
"frost_protection",
"eco",
"comfort",
"comfort-1",
"comfort-2",
],
preset_mode: "eco",
current_temperature: null,
min_temp: 7,
max_temp: 35,
supported_features: ClimateEntityFeature.PRESET_MODE,
}),
getEntity("climate", "unavailable", "unavailable", { getEntity("climate", "unavailable", "unavailable", {
friendly_name: "Unavailable heater", friendly_name: "Unavailable heater",
hvac_modes: ["heat", "off"], hvac_modes: ["heat", "off"],
@@ -110,7 +92,7 @@ const ENTITIES = [
@customElement("demo-more-info-climate") @customElement("demo-more-info-climate")
class DemoMoreInfoClimate extends LitElement { class DemoMoreInfoClimate extends LitElement {
@property({ attribute: false }) public hass!: MockHomeAssistant; @property() public hass!: MockHomeAssistant;
@query("demo-more-infos") private _demoRoot!: HTMLElement; @query("demo-more-infos") private _demoRoot!: HTMLElement;

View File

@@ -141,7 +141,7 @@ const ENTITIES = [
@customElement("demo-more-info-cover") @customElement("demo-more-info-cover")
class DemoMoreInfoCover extends LitElement { class DemoMoreInfoCover extends LitElement {
@property({ attribute: false }) public hass!: MockHomeAssistant; @property() public hass!: MockHomeAssistant;
@query("demo-more-infos") private _demoRoot!: HTMLElement; @query("demo-more-infos") private _demoRoot!: HTMLElement;

View File

@@ -29,7 +29,7 @@ const ENTITIES = [
@customElement("demo-more-info-humidifier") @customElement("demo-more-info-humidifier")
class DemoMoreInfoHumidifier extends LitElement { class DemoMoreInfoHumidifier extends LitElement {
@property({ attribute: false }) public hass!: MockHomeAssistant; @property() public hass!: MockHomeAssistant;
@query("demo-more-infos") private _demoRoot!: HTMLElement; @query("demo-more-infos") private _demoRoot!: HTMLElement;

View File

@@ -32,7 +32,7 @@ const ENTITIES = [
@customElement("demo-more-info-input-number") @customElement("demo-more-info-input-number")
class DemoMoreInfoInputNumber extends LitElement { class DemoMoreInfoInputNumber extends LitElement {
@property({ attribute: false }) public hass!: MockHomeAssistant; @property() public hass!: MockHomeAssistant;
@query("demo-more-infos") private _demoRoot!: HTMLElement; @query("demo-more-infos") private _demoRoot!: HTMLElement;

View File

@@ -18,7 +18,7 @@ const ENTITIES = [
@customElement("demo-more-info-input-text") @customElement("demo-more-info-input-text")
class DemoMoreInfoInputText extends LitElement { class DemoMoreInfoInputText extends LitElement {
@property({ attribute: false }) public hass!: MockHomeAssistant; @property() public hass!: MockHomeAssistant;
@query("demo-more-infos") private _demoRoot!: HTMLElement; @query("demo-more-infos") private _demoRoot!: HTMLElement;

Some files were not shown because too many files have changed in this diff Show More