mirror of
				https://github.com/home-assistant/frontend.git
				synced 2025-11-04 08:29:52 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			fix-menu-o
			...
			fix-turn-o
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4740e60d07 | ||
| 
						 | 
					2ac4899a86 | 
@@ -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
 | 
			
		||||
FROM mcr.microsoft.com/devcontainers/python:3.12
 | 
			
		||||
FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.11
 | 
			
		||||
 | 
			
		||||
ENV \
 | 
			
		||||
  DEBIAN_FRONTEND=noninteractive \
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@
 | 
			
		||||
    "context": ".."
 | 
			
		||||
  },
 | 
			
		||||
  "appPort": "8124:8123",
 | 
			
		||||
  "postCreateCommand": "sudo apt update && sudo apt upgrade -y && sudo apt install -y libpcap-dev",
 | 
			
		||||
  "postStartCommand": "script/bootstrap",
 | 
			
		||||
  "containerEnv": {
 | 
			
		||||
    "WORKSPACE_DIRECTORY": "${containerWorkspaceFolder}"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.github/labeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/labeler.yml
									
									
									
									
										vendored
									
									
								
							@@ -24,20 +24,14 @@ Design:
 | 
			
		||||
          - src/fake_data/**
 | 
			
		||||
 | 
			
		||||
Dependencies:
 | 
			
		||||
  - any:
 | 
			
		||||
  - changed-files:
 | 
			
		||||
          # Match when only these files are changed (i.e. don't match PRs that happen to add or remove packages)
 | 
			
		||||
          - any-glob-to-all-files:
 | 
			
		||||
      - any-glob-to-any-file:
 | 
			
		||||
          - package.json
 | 
			
		||||
          - renovate.json
 | 
			
		||||
          - yarn.lock
 | 
			
		||||
          - .yarn/**
 | 
			
		||||
          - .yarnrc.yml
 | 
			
		||||
          - .nvmrc
 | 
			
		||||
      # Dependabot and Renovate branches always match (i.e. compatibility tweaks by members considered minor)
 | 
			
		||||
      - head-branch:
 | 
			
		||||
          - "^renovate/"
 | 
			
		||||
          - "^dependabot/"
 | 
			
		||||
 | 
			
		||||
GitHub Actions:
 | 
			
		||||
  - changed-files:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.github/workflows/cast_deployment.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/cast_deployment.yaml
									
									
									
									
										vendored
									
									
								
							@@ -21,12 +21,12 @@ jobs:
 | 
			
		||||
      url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
        with:
 | 
			
		||||
          ref: dev
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
@@ -57,12 +57,12 @@ jobs:
 | 
			
		||||
      url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
        with:
 | 
			
		||||
          ref: master
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							@@ -24,9 +24,9 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
@@ -37,20 +37,17 @@ jobs:
 | 
			
		||||
      - name: Build resources
 | 
			
		||||
        run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data gather-gallery-pages
 | 
			
		||||
      - name: Setup lint cache
 | 
			
		||||
        uses: actions/cache@v4.0.2
 | 
			
		||||
        uses: actions/cache@v3.3.2
 | 
			
		||||
        with:
 | 
			
		||||
          path: |
 | 
			
		||||
            node_modules/.cache/prettier
 | 
			
		||||
            node_modules/.cache/eslint
 | 
			
		||||
            node_modules/.cache/typescript
 | 
			
		||||
          key: lint-${{ github.sha }}
 | 
			
		||||
          restore-keys: lint-
 | 
			
		||||
      - name: Run eslint
 | 
			
		||||
        run: yarn run lint:eslint --quiet
 | 
			
		||||
      - name: Run tsc
 | 
			
		||||
        run: yarn run lint:types
 | 
			
		||||
      - name: Run lit-analyzer
 | 
			
		||||
        run: yarn run lint:lit --quiet
 | 
			
		||||
      - name: Run prettier
 | 
			
		||||
        run: yarn run lint:prettier
 | 
			
		||||
  test:
 | 
			
		||||
@@ -58,9 +55,9 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
@@ -76,9 +73,9 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
@@ -89,7 +86,7 @@ jobs:
 | 
			
		||||
        env:
 | 
			
		||||
          IS_TEST: "true"
 | 
			
		||||
      - name: Upload bundle stats
 | 
			
		||||
        uses: actions/upload-artifact@v4.3.1
 | 
			
		||||
        uses: actions/upload-artifact@v3.1.3
 | 
			
		||||
        with:
 | 
			
		||||
          name: frontend-bundle-stats
 | 
			
		||||
          path: build/stats/*.json
 | 
			
		||||
@@ -100,9 +97,9 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
@@ -113,7 +110,7 @@ jobs:
 | 
			
		||||
        env:
 | 
			
		||||
          IS_TEST: "true"
 | 
			
		||||
      - name: Upload bundle stats
 | 
			
		||||
        uses: actions/upload-artifact@v4.3.1
 | 
			
		||||
        uses: actions/upload-artifact@v3.1.3
 | 
			
		||||
        with:
 | 
			
		||||
          name: supervisor-bundle-stats
 | 
			
		||||
          path: build/stats/*.json
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							@@ -23,7 +23,7 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout repository
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
        with:
 | 
			
		||||
          # We must fetch at least the immediate parents so that if this is
 | 
			
		||||
          # a pull request then we can checkout the head.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.github/workflows/demo_deployment.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/demo_deployment.yaml
									
									
									
									
										vendored
									
									
								
							@@ -22,12 +22,12 @@ jobs:
 | 
			
		||||
      url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
        with:
 | 
			
		||||
          ref: dev
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
@@ -58,12 +58,12 @@ jobs:
 | 
			
		||||
      url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
        with:
 | 
			
		||||
          ref: master
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								.github/workflows/design_deployment.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/design_deployment.yaml
									
									
									
									
										vendored
									
									
								
							@@ -16,10 +16,10 @@ jobs:
 | 
			
		||||
      url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								.github/workflows/design_preview.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/design_preview.yaml
									
									
									
									
										vendored
									
									
								
							@@ -21,10 +21,10 @@ jobs:
 | 
			
		||||
    if: github.repository == 'home-assistant/frontend' && contains(github.event.pull_request.labels.*.name, 'needs design preview')
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Check out files from GitHub
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								.github/workflows/nightly.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/nightly.yaml
									
									
									
									
										vendored
									
									
								
							@@ -6,7 +6,7 @@ on:
 | 
			
		||||
    - cron: "0 1 * * *"
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  PYTHON_VERSION: "3.12"
 | 
			
		||||
  PYTHON_VERSION: "3.11"
 | 
			
		||||
  NODE_OPTIONS: --max_old_space_size=6144
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
@@ -20,7 +20,7 @@ jobs:
 | 
			
		||||
      contents: write
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout the repository
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
 | 
			
		||||
      - name: Set up Python ${{ env.PYTHON_VERSION }}
 | 
			
		||||
        uses: actions/setup-python@v5
 | 
			
		||||
@@ -28,7 +28,7 @@ jobs:
 | 
			
		||||
          python-version: ${{ env.PYTHON_VERSION }}
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
@@ -42,7 +42,7 @@ jobs:
 | 
			
		||||
          LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }}
 | 
			
		||||
 | 
			
		||||
      - name: Bump version
 | 
			
		||||
        run: script/version_bump.js nightly
 | 
			
		||||
        run: script/version_bump.cjs nightly
 | 
			
		||||
 | 
			
		||||
      - name: Build nightly Python wheels
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -57,14 +57,14 @@ jobs:
 | 
			
		||||
        run: tar -czvf translations.tar.gz translations
 | 
			
		||||
 | 
			
		||||
      - name: Upload build artifacts
 | 
			
		||||
        uses: actions/upload-artifact@v4.3.1
 | 
			
		||||
        uses: actions/upload-artifact@v3.1.3
 | 
			
		||||
        with:
 | 
			
		||||
          name: wheels
 | 
			
		||||
          path: dist/home_assistant_frontend*.whl
 | 
			
		||||
          if-no-files-found: error
 | 
			
		||||
 | 
			
		||||
      - name: Upload translations
 | 
			
		||||
        uses: actions/upload-artifact@v4.3.1
 | 
			
		||||
        uses: actions/upload-artifact@v3.1.3
 | 
			
		||||
        with:
 | 
			
		||||
          name: translations
 | 
			
		||||
          path: translations.tar.gz
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/release-drafter.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release-drafter.yaml
									
									
									
									
										vendored
									
									
								
							@@ -18,6 +18,6 @@ jobs:
 | 
			
		||||
      pull-requests: read
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: release-drafter/release-drafter@v6.0.0
 | 
			
		||||
      - uses: release-drafter/release-drafter@v5
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								.github/workflows/release.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/release.yaml
									
									
									
									
										vendored
									
									
								
							@@ -6,7 +6,7 @@ on:
 | 
			
		||||
      - published
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  PYTHON_VERSION: "3.12"
 | 
			
		||||
  PYTHON_VERSION: "3.11"
 | 
			
		||||
  NODE_OPTIONS: --max_old_space_size=6144
 | 
			
		||||
 | 
			
		||||
# Set default workflow permissions
 | 
			
		||||
@@ -23,7 +23,7 @@ jobs:
 | 
			
		||||
      contents: write # Required to upload release assets
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout the repository
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
 | 
			
		||||
      - name: Verify version
 | 
			
		||||
        uses: home-assistant/actions/helpers/verify-version@master
 | 
			
		||||
@@ -34,7 +34,7 @@ jobs:
 | 
			
		||||
          python-version: ${{ env.PYTHON_VERSION }}
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node
 | 
			
		||||
        uses: actions/setup-node@v4.0.2
 | 
			
		||||
        uses: actions/setup-node@v4.0.1
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: ".nvmrc"
 | 
			
		||||
          cache: yarn
 | 
			
		||||
@@ -55,7 +55,7 @@ jobs:
 | 
			
		||||
          script/release
 | 
			
		||||
 | 
			
		||||
      - name: Upload release assets
 | 
			
		||||
        uses: softprops/action-gh-release@v2.0.4
 | 
			
		||||
        uses: softprops/action-gh-release@v0.1.15
 | 
			
		||||
        with:
 | 
			
		||||
          files: |
 | 
			
		||||
            dist/*.whl
 | 
			
		||||
@@ -74,7 +74,7 @@ jobs:
 | 
			
		||||
          echo "home-assistant-frontend==$version" > ./requirements.txt
 | 
			
		||||
 | 
			
		||||
      - name: Build wheels
 | 
			
		||||
        uses: home-assistant/wheels@2024.01.0
 | 
			
		||||
        uses: home-assistant/wheels@2023.10.5
 | 
			
		||||
        with:
 | 
			
		||||
          abi: cp311
 | 
			
		||||
          tag: musllinux_1_2
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/translations.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/translations.yaml
									
									
									
									
										vendored
									
									
								
							@@ -13,7 +13,7 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout the repository
 | 
			
		||||
        uses: actions/checkout@v4.1.2
 | 
			
		||||
        uses: actions/checkout@v4.1.1
 | 
			
		||||
 | 
			
		||||
      - name: Upload Translations
 | 
			
		||||
        run: |
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
							
								
								
									
										39
									
								
								.yarn/patches/sortablejs-npm-1.15.0-f3a393abcc.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								.yarn/patches/sortablejs-npm-1.15.0-f3a393abcc.patch
									
									
									
									
									
										Normal 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();
 | 
			
		||||
@@ -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
											
										
									
								
							@@ -6,4 +6,4 @@ enableGlobalCache: false
 | 
			
		||||
 | 
			
		||||
nodeLinker: node-modules
 | 
			
		||||
 | 
			
		||||
yarnPath: .yarn/releases/yarn-4.1.1.cjs
 | 
			
		||||
yarnPath: .yarn/releases/yarn-4.0.2.cjs
 | 
			
		||||
 
 | 
			
		||||
@@ -8,10 +8,7 @@ const zopfliOptions = { threshold: 150 };
 | 
			
		||||
 | 
			
		||||
const compressDist = (rootDir) =>
 | 
			
		||||
  gulp
 | 
			
		||||
    .src([
 | 
			
		||||
      `${rootDir}/**/*.{js,json,css,svg,xml}`,
 | 
			
		||||
      `${rootDir}/{authorize,onboarding}.html`,
 | 
			
		||||
    ])
 | 
			
		||||
    .src([`${rootDir}/**/*.{js,json,css,svg}`])
 | 
			
		||||
    .pipe(zopfli(zopfliOptions))
 | 
			
		||||
    .pipe(gulp.dest(rootDir));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -115,9 +115,7 @@ gulp.task("webpack-prod-app", () =>
 | 
			
		||||
 | 
			
		||||
gulp.task("webpack-dev-server-demo", () =>
 | 
			
		||||
  runDevServer({
 | 
			
		||||
    compiler: webpack(
 | 
			
		||||
      createDemoConfig({ isProdBuild: false, latestBuild: true })
 | 
			
		||||
    ),
 | 
			
		||||
    compiler: webpack(bothBuilds(createDemoConfig, { isProdBuild: false })),
 | 
			
		||||
    contentBase: paths.demo_output_root,
 | 
			
		||||
    port: 8090,
 | 
			
		||||
  })
 | 
			
		||||
@@ -133,9 +131,7 @@ gulp.task("webpack-prod-demo", () =>
 | 
			
		||||
 | 
			
		||||
gulp.task("webpack-dev-server-cast", () =>
 | 
			
		||||
  runDevServer({
 | 
			
		||||
    compiler: webpack(
 | 
			
		||||
      createCastConfig({ isProdBuild: false, latestBuild: true })
 | 
			
		||||
    ),
 | 
			
		||||
    compiler: webpack(bothBuilds(createCastConfig, { isProdBuild: false })),
 | 
			
		||||
    contentBase: paths.cast_output_root,
 | 
			
		||||
    port: 8080,
 | 
			
		||||
    // 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", () =>
 | 
			
		||||
  runDevServer({
 | 
			
		||||
    compiler: webpack(
 | 
			
		||||
      createGalleryConfig({ isProdBuild: false, latestBuild: true })
 | 
			
		||||
    ),
 | 
			
		||||
    // We don't use the es5 build, but the dev server will fuck up the publicPath if we don't
 | 
			
		||||
    compiler: webpack(bothBuilds(createGalleryConfig, { isProdBuild: false })),
 | 
			
		||||
    contentBase: paths.gallery_output_root,
 | 
			
		||||
    port: 8100,
 | 
			
		||||
    listenHost: "0.0.0.0",
 | 
			
		||||
 
 | 
			
		||||
@@ -7,9 +7,6 @@ const TerserPlugin = require("terser-webpack-plugin");
 | 
			
		||||
const { WebpackManifestPlugin } = require("webpack-manifest-plugin");
 | 
			
		||||
const log = require("fancy-log");
 | 
			
		||||
const WebpackBar = require("webpackbar");
 | 
			
		||||
const {
 | 
			
		||||
  TransformAsyncModulesPlugin,
 | 
			
		||||
} = require("transform-async-modules-webpack-plugin");
 | 
			
		||||
const paths = require("./paths.cjs");
 | 
			
		||||
const bundle = require("./bundle.cjs");
 | 
			
		||||
 | 
			
		||||
@@ -145,6 +142,17 @@ const createWebpackConfig = ({
 | 
			
		||||
        ),
 | 
			
		||||
        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 StatsWriterPlugin({
 | 
			
		||||
@@ -155,8 +163,6 @@ const createWebpackConfig = ({
 | 
			
		||||
          stats: { assets: true, chunks: true, modules: true },
 | 
			
		||||
          transform: (stats) => JSON.stringify(filterStats(stats)),
 | 
			
		||||
        }),
 | 
			
		||||
      !latestBuild &&
 | 
			
		||||
        new TransformAsyncModulesPlugin({ browserslistEnv: "legacy" }),
 | 
			
		||||
    ].filter(Boolean),
 | 
			
		||||
    resolve: {
 | 
			
		||||
      extensions: [".ts", ".js", ".json"],
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 9.8 KiB  | 
@@ -31,11 +31,11 @@ import "./hc-layout";
 | 
			
		||||
 | 
			
		||||
@customElement("hc-cast")
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
@@ -241,8 +241,6 @@ class HcCast extends LitElement {
 | 
			
		||||
 | 
			
		||||
      mwc-button ha-svg-icon {
 | 
			
		||||
        margin-right: 8px;
 | 
			
		||||
        margin-inline-end: 8px;
 | 
			
		||||
        margin-inline-start: initial;
 | 
			
		||||
        height: 18px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,13 +10,13 @@ import "../../../../src/components/ha-card";
 | 
			
		||||
 | 
			
		||||
@customElement("hc-layout")
 | 
			
		||||
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 {
 | 
			
		||||
    return html`
 | 
			
		||||
 
 | 
			
		||||
@@ -12,8 +12,8 @@ class HcLaunchScreen extends LitElement {
 | 
			
		||||
    return html`
 | 
			
		||||
      <div class="container">
 | 
			
		||||
        <img
 | 
			
		||||
          alt="Nabu Casa logo on left, Home Assistant logo on right, and red heart in center"
 | 
			
		||||
          src="https://cast.home-assistant.io/images/nabu-loves-hass.png"
 | 
			
		||||
          alt="Home Assistant logo on left, Nabu Casa logo on right, and red heart in center"
 | 
			
		||||
          src="https://www.home-assistant.io/images/blog/2018-09-thinking-big/social.png"
 | 
			
		||||
        />
 | 
			
		||||
        <div class="status">
 | 
			
		||||
          ${this.hass ? "Connected" : "Not Connected"}
 | 
			
		||||
@@ -28,23 +28,23 @@ class HcLaunchScreen extends LitElement {
 | 
			
		||||
      :host {
 | 
			
		||||
        display: block;
 | 
			
		||||
        height: 100vh;
 | 
			
		||||
        background-color: #f2f4f9;
 | 
			
		||||
        padding-top: 64px;
 | 
			
		||||
        background-color: white;
 | 
			
		||||
        font-size: 24px;
 | 
			
		||||
      }
 | 
			
		||||
      .container {
 | 
			
		||||
        display: flex;
 | 
			
		||||
        flex-direction: column;
 | 
			
		||||
        text-align: center;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        height: 100%;
 | 
			
		||||
        justify-content: space-evenly;
 | 
			
		||||
      }
 | 
			
		||||
      img {
 | 
			
		||||
        max-width: 80%;
 | 
			
		||||
        object-fit: cover;
 | 
			
		||||
        width: 717px;
 | 
			
		||||
        height: 376px;
 | 
			
		||||
        display: block;
 | 
			
		||||
        margin: 0 auto;
 | 
			
		||||
      }
 | 
			
		||||
      .status {
 | 
			
		||||
        color: #1d2126;
 | 
			
		||||
        padding-right: 54px;
 | 
			
		||||
      }
 | 
			
		||||
    `;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,7 @@ class HcLovelace extends LitElement {
 | 
			
		||||
  @property({ attribute: false })
 | 
			
		||||
  public lovelaceConfig!: LovelaceConfig;
 | 
			
		||||
 | 
			
		||||
  @property() public viewPath?: string | number | null;
 | 
			
		||||
  @property() public viewPath?: string | number;
 | 
			
		||||
 | 
			
		||||
  @property() public urlPath: string | null = null;
 | 
			
		||||
 | 
			
		||||
@@ -93,9 +93,6 @@ class HcLovelace extends LitElement {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private get _viewIndex() {
 | 
			
		||||
    if (this.viewPath === null) {
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
    const selectedView = this.viewPath;
 | 
			
		||||
    const selectedViewInt = parseInt(selectedView as string, 10);
 | 
			
		||||
    for (let i = 0; i < this.lovelaceConfig.views.length; i++) {
 | 
			
		||||
 
 | 
			
		||||
@@ -51,10 +51,10 @@ export class HcMain extends HassElement {
 | 
			
		||||
 | 
			
		||||
  @state() private _lovelacePath: string | number | null = null;
 | 
			
		||||
 | 
			
		||||
  @state() private _urlPath?: string | null;
 | 
			
		||||
 | 
			
		||||
  @state() private _error?: string;
 | 
			
		||||
 | 
			
		||||
  @state() private _urlPath?: string | null;
 | 
			
		||||
 | 
			
		||||
  private _hassUUID?: string;
 | 
			
		||||
 | 
			
		||||
  private _unsubLovelace?: UnsubscribeFunc;
 | 
			
		||||
@@ -81,7 +81,7 @@ export class HcMain extends HassElement {
 | 
			
		||||
 | 
			
		||||
    if (
 | 
			
		||||
      !this._lovelaceConfig ||
 | 
			
		||||
      this._urlPath === undefined ||
 | 
			
		||||
      this._lovelacePath === null ||
 | 
			
		||||
      // Guard against part of HA not being loaded yet.
 | 
			
		||||
      !this.hass ||
 | 
			
		||||
      !this.hass.states ||
 | 
			
		||||
@@ -99,8 +99,8 @@ export class HcMain extends HassElement {
 | 
			
		||||
      <hc-lovelace
 | 
			
		||||
        .hass=${this.hass}
 | 
			
		||||
        .lovelaceConfig=${this._lovelaceConfig}
 | 
			
		||||
        .urlPath=${this._urlPath}
 | 
			
		||||
        .viewPath=${this._lovelacePath}
 | 
			
		||||
        .urlPath=${this._urlPath}
 | 
			
		||||
        @config-refresh=${this._generateDefaultLovelaceConfig}
 | 
			
		||||
      ></hc-lovelace>
 | 
			
		||||
    `;
 | 
			
		||||
@@ -205,6 +205,7 @@ export class HcMain extends HassElement {
 | 
			
		||||
          expires_in: 0,
 | 
			
		||||
        }),
 | 
			
		||||
      });
 | 
			
		||||
      this._hassUUID = msg.hassUUID;
 | 
			
		||||
    } catch (err: any) {
 | 
			
		||||
      const errorMessage = this._getErrorMessage(err);
 | 
			
		||||
      this._error = errorMessage;
 | 
			
		||||
@@ -224,17 +225,6 @@ export class HcMain extends HassElement {
 | 
			
		||||
      this.hass.connection.close();
 | 
			
		||||
    }
 | 
			
		||||
    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._sendStatus();
 | 
			
		||||
  }
 | 
			
		||||
@@ -243,7 +233,7 @@ export class HcMain extends HassElement {
 | 
			
		||||
    this._showDemo = false;
 | 
			
		||||
    // We should not get this command before we are connected.
 | 
			
		||||
    // 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._error = "Cannot show Lovelace because we're not connected.";
 | 
			
		||||
      this._sendError(
 | 
			
		||||
@@ -270,7 +260,7 @@ export class HcMain extends HassElement {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this._error = undefined;
 | 
			
		||||
    if (msg.urlPath === "lovelace" || msg.urlPath === undefined) {
 | 
			
		||||
    if (msg.urlPath === "lovelace") {
 | 
			
		||||
      msg.urlPath = null;
 | 
			
		||||
    }
 | 
			
		||||
    this._lovelacePath = msg.viewPath;
 | 
			
		||||
@@ -285,7 +275,7 @@ export class HcMain extends HassElement {
 | 
			
		||||
        ],
 | 
			
		||||
      };
 | 
			
		||||
      this._urlPath = "energy";
 | 
			
		||||
      this._lovelacePath = null;
 | 
			
		||||
      this._lovelacePath = 0;
 | 
			
		||||
      this._sendStatus();
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
@@ -294,7 +284,6 @@ export class HcMain extends HassElement {
 | 
			
		||||
      this._lovelaceConfig = undefined;
 | 
			
		||||
      if (this._unsubLovelace) {
 | 
			
		||||
        this._unsubLovelace();
 | 
			
		||||
        this._unsubLovelace = undefined;
 | 
			
		||||
      }
 | 
			
		||||
      const llColl = atLeastVersion(this.hass.connection.haVersion, 0, 107)
 | 
			
		||||
        ? getLovelaceCollection(this.hass.connection, msg.urlPath)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import { energyEntities } from "../stubs/entities";
 | 
			
		||||
import { DemoConfig } from "./types";
 | 
			
		||||
 | 
			
		||||
export const demoConfigs: Array<() => Promise<DemoConfig>> = [
 | 
			
		||||
  () => import("./sections").then((mod) => mod.demoSections),
 | 
			
		||||
  () => import("./arsaboo").then((mod) => mod.demoArsaboo),
 | 
			
		||||
  () => import("./teachingbirds").then((mod) => mod.demoTeachingbirds),
 | 
			
		||||
  () => import("./kernehed").then((mod) => mod.demoKernehed),
 | 
			
		||||
 
 | 
			
		||||
@@ -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>
 | 
			
		||||
`;
 | 
			
		||||
@@ -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,
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  });
 | 
			
		||||
@@ -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: () => ({}),
 | 
			
		||||
};
 | 
			
		||||
@@ -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",
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
});
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
import { TemplateResult } from "lit";
 | 
			
		||||
import { LocalizeFunc } from "../../../src/common/translations/localize";
 | 
			
		||||
import { LovelaceConfig } from "../../../src/data/lovelace/config/types";
 | 
			
		||||
import { Entity } from "../../../src/fake_data/entity";
 | 
			
		||||
@@ -8,9 +7,6 @@ export interface DemoConfig {
 | 
			
		||||
  name: string;
 | 
			
		||||
  authorName: string;
 | 
			
		||||
  authorUrl: string;
 | 
			
		||||
  description?:
 | 
			
		||||
    | string
 | 
			
		||||
    | ((localize: LocalizeFunc) => string | TemplateResult<1>);
 | 
			
		||||
  lovelace: (localize: LocalizeFunc) => LovelaceConfig;
 | 
			
		||||
  entities: (localize: LocalizeFunc) => Entity[];
 | 
			
		||||
  theme: () => Record<string, string> | null;
 | 
			
		||||
 
 | 
			
		||||
@@ -39,51 +39,32 @@ export class HADemoCard extends LitElement implements LovelaceCard {
 | 
			
		||||
        <div class="picker">
 | 
			
		||||
          <div class="label">
 | 
			
		||||
            ${this._switching
 | 
			
		||||
              ? html`
 | 
			
		||||
                  <ha-circular-progress indeterminate></ha-circular-progress>
 | 
			
		||||
                `
 | 
			
		||||
              ? html`<ha-circular-progress
 | 
			
		||||
                  indeterminate
 | 
			
		||||
                ></ha-circular-progress>`
 | 
			
		||||
              : until(
 | 
			
		||||
                  selectedDemoConfig.then(
 | 
			
		||||
                    (conf) => html`
 | 
			
		||||
                      ${conf.name}
 | 
			
		||||
                      <small>
 | 
			
		||||
                        <a target="_blank" href=${conf.authorUrl}>
 | 
			
		||||
                          ${this.hass.localize(
 | 
			
		||||
                            "ui.panel.page-demo.cards.demo.demo_by",
 | 
			
		||||
                          {
 | 
			
		||||
                            name: html`
 | 
			
		||||
                              <a target="_blank" href=${conf.authorUrl}>
 | 
			
		||||
                                ${conf.authorName}
 | 
			
		||||
                              </a>
 | 
			
		||||
                            `,
 | 
			
		||||
                          }
 | 
			
		||||
                            { name: conf.authorName }
 | 
			
		||||
                          )}
 | 
			
		||||
                        </a>
 | 
			
		||||
                      </small>
 | 
			
		||||
                    `
 | 
			
		||||
                  ),
 | 
			
		||||
                  ""
 | 
			
		||||
                )}
 | 
			
		||||
          </div>
 | 
			
		||||
 | 
			
		||||
          <mwc-button @click=${this._nextConfig} .disabled=${this._switching}>
 | 
			
		||||
            ${this.hass.localize("ui.panel.page-demo.cards.demo.next_demo")}
 | 
			
		||||
          </mwc-button>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="content">
 | 
			
		||||
          <p class="small-hidden">
 | 
			
		||||
        <div class="content small-hidden">
 | 
			
		||||
          ${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 class="actions small-hidden">
 | 
			
		||||
          <a href="https://www.home-assistant.io" target="_blank">
 | 
			
		||||
@@ -127,7 +108,6 @@ export class HADemoCard extends LitElement implements LovelaceCard {
 | 
			
		||||
      css`
 | 
			
		||||
        a {
 | 
			
		||||
          color: var(--primary-color);
 | 
			
		||||
          display: inline-block;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .actions a {
 | 
			
		||||
@@ -135,11 +115,7 @@ export class HADemoCard extends LitElement implements LovelaceCard {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .content {
 | 
			
		||||
          padding: 0 16px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .content p {
 | 
			
		||||
          margin: 16px 0;
 | 
			
		||||
          padding: 16px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .picker {
 | 
			
		||||
@@ -162,8 +138,9 @@ export class HADemoCard extends LitElement implements LovelaceCard {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .actions {
 | 
			
		||||
          padding: 0px 8px 4px 8px;
 | 
			
		||||
          padding-left: 8px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @media only screen and (max-width: 500px) {
 | 
			
		||||
          .small-hidden {
 | 
			
		||||
            display: none;
 | 
			
		||||
 
 | 
			
		||||
@@ -17,14 +17,12 @@ import { energyEntities } from "./stubs/entities";
 | 
			
		||||
import { mockEntityRegistry } from "./stubs/entity_registry";
 | 
			
		||||
import { mockEvents } from "./stubs/events";
 | 
			
		||||
import { mockFrontend } from "./stubs/frontend";
 | 
			
		||||
import { mockIcons } from "./stubs/icons";
 | 
			
		||||
import { mockHistory } from "./stubs/history";
 | 
			
		||||
import { mockLovelace } from "./stubs/lovelace";
 | 
			
		||||
import { mockMediaPlayer } from "./stubs/media_player";
 | 
			
		||||
import { mockPersistentNotification } from "./stubs/persistent_notification";
 | 
			
		||||
import { mockRecorder } from "./stubs/recorder";
 | 
			
		||||
import { mockTodo } from "./stubs/todo";
 | 
			
		||||
import { mockSensor } from "./stubs/sensor";
 | 
			
		||||
import { mockSystemLog } from "./stubs/system_log";
 | 
			
		||||
import { mockTemplate } from "./stubs/template";
 | 
			
		||||
import { mockTranslations } from "./stubs/translations";
 | 
			
		||||
@@ -52,13 +50,11 @@ export class HaDemo extends HomeAssistantAppEl {
 | 
			
		||||
    mockHistory(hass);
 | 
			
		||||
    mockRecorder(hass);
 | 
			
		||||
    mockTodo(hass);
 | 
			
		||||
    mockSensor(hass);
 | 
			
		||||
    mockSystemLog(hass);
 | 
			
		||||
    mockTemplate(hass);
 | 
			
		||||
    mockEvents(hass);
 | 
			
		||||
    mockMediaPlayer(hass);
 | 
			
		||||
    mockFrontend(hass);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
    mockEnergy(hass);
 | 
			
		||||
    mockPersistentNotification(hass);
 | 
			
		||||
    mockConfigEntries(hass);
 | 
			
		||||
@@ -72,8 +68,6 @@ export class HaDemo extends HomeAssistantAppEl {
 | 
			
		||||
        id: "sensor.co2_intensity",
 | 
			
		||||
        name: null,
 | 
			
		||||
        icon: null,
 | 
			
		||||
        labels: [],
 | 
			
		||||
        categories: {},
 | 
			
		||||
        platform: "co2signal",
 | 
			
		||||
        hidden_by: null,
 | 
			
		||||
        entity_category: null,
 | 
			
		||||
@@ -90,8 +84,6 @@ export class HaDemo extends HomeAssistantAppEl {
 | 
			
		||||
        id: "sensor.co2_intensity",
 | 
			
		||||
        name: null,
 | 
			
		||||
        icon: null,
 | 
			
		||||
        labels: [],
 | 
			
		||||
        categories: {},
 | 
			
		||||
        platform: "co2signal",
 | 
			
		||||
        hidden_by: null,
 | 
			
		||||
        entity_category: null,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,11 +4,4 @@ import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
 | 
			
		||||
export const mockAreaRegistry = (
 | 
			
		||||
  hass: MockHomeAssistant,
 | 
			
		||||
  data: AreaRegistryEntry[] = []
 | 
			
		||||
) => {
 | 
			
		||||
  hass.mockWS("config/area_registry/list", () => data);
 | 
			
		||||
  const areas = {};
 | 
			
		||||
  data.forEach((area) => {
 | 
			
		||||
    areas[area.area_id] = area;
 | 
			
		||||
  });
 | 
			
		||||
  hass.updateHass({ areas });
 | 
			
		||||
};
 | 
			
		||||
) => hass.mockWS("config/area_registry/list", () => data);
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ export const mockConfigEntries = (hass: MockHomeAssistant) => {
 | 
			
		||||
    supports_options: false,
 | 
			
		||||
    supports_remove_device: false,
 | 
			
		||||
    supports_unload: true,
 | 
			
		||||
    supports_reconfigure: true,
 | 
			
		||||
    pref_disable_new_entities: false,
 | 
			
		||||
    pref_disable_polling: false,
 | 
			
		||||
    disabled_by: null,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,11 +4,4 @@ import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
 | 
			
		||||
export const mockDeviceRegistry = (
 | 
			
		||||
  hass: MockHomeAssistant,
 | 
			
		||||
  data: DeviceRegistryEntry[] = []
 | 
			
		||||
) => {
 | 
			
		||||
  hass.mockWS("config/device_registry/list", () => data);
 | 
			
		||||
  const devices = {};
 | 
			
		||||
  data.forEach((device) => {
 | 
			
		||||
    devices[device.id] = device;
 | 
			
		||||
  });
 | 
			
		||||
  hass.updateHass({ devices });
 | 
			
		||||
};
 | 
			
		||||
) => hass.mockWS("config/device_registry/list", () => data);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
@@ -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: {} };
 | 
			
		||||
    }
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
@@ -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);
 | 
			
		||||
@@ -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",
 | 
			
		||||
      ],
 | 
			
		||||
    },
 | 
			
		||||
  ]);
 | 
			
		||||
};
 | 
			
		||||
@@ -21,5 +21,4 @@ export const mockTodo = (hass: MockHomeAssistant) => {
 | 
			
		||||
      },
 | 
			
		||||
    ] as TodoItem[],
 | 
			
		||||
  }));
 | 
			
		||||
  hass.mockWS("todo/item/subscribe", (_msg, _hass) => () => {});
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
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 { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element";
 | 
			
		||||
import { fireEvent } from "../../../src/common/dom/fire_event";
 | 
			
		||||
@@ -9,9 +9,9 @@ import "../../../src/components/ha-card";
 | 
			
		||||
class DemoBlackWhiteRow extends LitElement {
 | 
			
		||||
  @property() title!: string;
 | 
			
		||||
 | 
			
		||||
  @property() value?: any;
 | 
			
		||||
  @property() value!: any;
 | 
			
		||||
 | 
			
		||||
  @property({ type: Boolean }) public disabled = false;
 | 
			
		||||
  @property() disabled = false;
 | 
			
		||||
 | 
			
		||||
  protected render(): TemplateResult {
 | 
			
		||||
    return html`
 | 
			
		||||
@@ -45,9 +45,7 @@ class DemoBlackWhiteRow extends LitElement {
 | 
			
		||||
              </mwc-button>
 | 
			
		||||
            </div>
 | 
			
		||||
          </ha-card>
 | 
			
		||||
          ${this.value
 | 
			
		||||
            ? html`<pre>${JSON.stringify(this.value, undefined, 2)}</pre>`
 | 
			
		||||
            : nothing}
 | 
			
		||||
          <pre>${JSON.stringify(this.value, undefined, 2)}</pre>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    `;
 | 
			
		||||
 
 | 
			
		||||
@@ -11,11 +11,11 @@ export interface DemoCardConfig {
 | 
			
		||||
 | 
			
		||||
@customElement("demo-card")
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -10,9 +10,9 @@ import "../ha-demo-options";
 | 
			
		||||
 | 
			
		||||
@customElement("demo-cards")
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,11 +8,11 @@ import { HomeAssistant } from "../../../src/types";
 | 
			
		||||
 | 
			
		||||
@customElement("demo-more-info")
 | 
			
		||||
class DemoMoreInfo extends LitElement {
 | 
			
		||||
  @property({ attribute: false }) public hass!: HomeAssistant;
 | 
			
		||||
  @property() public hass!: HomeAssistant;
 | 
			
		||||
 | 
			
		||||
  @property() public entityId!: string;
 | 
			
		||||
 | 
			
		||||
  @property({ type: Boolean }) public showConfig = false;
 | 
			
		||||
  @property() public showConfig!: boolean;
 | 
			
		||||
 | 
			
		||||
  render() {
 | 
			
		||||
    const state = this._getState(this.entityId, this.hass.states);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,19 @@
 | 
			
		||||
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 "../../../src/components/ha-formfield";
 | 
			
		||||
import "../../../src/components/ha-switch";
 | 
			
		||||
import { HomeAssistant } from "../../../src/types";
 | 
			
		||||
import "../ha-demo-options";
 | 
			
		||||
import "./demo-more-info";
 | 
			
		||||
import "../ha-demo-options";
 | 
			
		||||
import { HomeAssistant } from "../../../src/types";
 | 
			
		||||
 | 
			
		||||
@customElement("demo-more-infos")
 | 
			
		||||
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() {
 | 
			
		||||
    return html`
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,6 @@ export const basicTrace: DemoTrace = {
 | 
			
		||||
        {
 | 
			
		||||
          path: "trigger/0",
 | 
			
		||||
          timestamp: "2021-03-25T04:36:51.223693+00:00",
 | 
			
		||||
          changed_variables: {},
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
      "condition/0": [
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,6 @@ export const motionLightTrace: DemoTrace = {
 | 
			
		||||
        {
 | 
			
		||||
          path: "trigger/0",
 | 
			
		||||
          timestamp: "2021-03-25T04:36:51.223693+00:00",
 | 
			
		||||
          changed_variables: {},
 | 
			
		||||
        },
 | 
			
		||||
      ],
 | 
			
		||||
      "action/0": [
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,14 @@
 | 
			
		||||
import { mdiMenu } from "@mdi/js";
 | 
			
		||||
import "@material/mwc-drawer";
 | 
			
		||||
import "@material/mwc-top-app-bar-fixed";
 | 
			
		||||
import { mdiMenu } from "@mdi/js";
 | 
			
		||||
import { LitElement, PropertyValues, css, html } from "lit";
 | 
			
		||||
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 { html, css, LitElement, PropertyValues } from "lit";
 | 
			
		||||
import { customElement, property, query } from "lit/decorators";
 | 
			
		||||
import "../../src/components/ha-icon-button";
 | 
			
		||||
import "../../src/managers/notification-manager";
 | 
			
		||||
import { HaExpansionPanel } from "../../src/components/ha-expansion-panel";
 | 
			
		||||
import { haStyle } from "../../src/resources/styles";
 | 
			
		||||
import { PAGES, SIDEBAR } from "../build/import-pages";
 | 
			
		||||
import { dynamicElement } from "../../src/common/dom/dynamic-element-directive";
 | 
			
		||||
import "./components/page-description";
 | 
			
		||||
 | 
			
		||||
const GITHUB_DEMO_URL =
 | 
			
		||||
@@ -24,7 +24,7 @@ const FAKE_HASS = {
 | 
			
		||||
 | 
			
		||||
@customElement("ha-gallery")
 | 
			
		||||
class HaGallery extends LitElement {
 | 
			
		||||
  @state() private _page =
 | 
			
		||||
  @property() private _page =
 | 
			
		||||
    document.location.hash.substring(1) ||
 | 
			
		||||
    `${SIDEBAR[0].category}/${SIDEBAR[0].pages![0]}`;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,10 +21,10 @@ const ENTITIES = [
 | 
			
		||||
  }),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const conditions: Condition[] = [
 | 
			
		||||
  { condition: "and", conditions: [] },
 | 
			
		||||
  { condition: "not", conditions: [] },
 | 
			
		||||
  { condition: "or", conditions: [] },
 | 
			
		||||
const conditions = [
 | 
			
		||||
  { condition: "and" },
 | 
			
		||||
  { condition: "not" },
 | 
			
		||||
  { condition: "or" },
 | 
			
		||||
  { condition: "state", entity_id: "light.kitchen", state: "on" },
 | 
			
		||||
  {
 | 
			
		||||
    condition: "numeric_state",
 | 
			
		||||
@@ -34,11 +34,11 @@ const conditions: Condition[] = [
 | 
			
		||||
    above: 20,
 | 
			
		||||
  },
 | 
			
		||||
  { 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: "trigger", id: "motion" },
 | 
			
		||||
  { condition: "time" },
 | 
			
		||||
  { condition: "template", value_template: "" },
 | 
			
		||||
  { condition: "template" },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const initialCondition: Condition = {
 | 
			
		||||
 
 | 
			
		||||
@@ -80,7 +80,7 @@ const SCHEMAS: { name: string; conditions: ConditionWithShorthand[] }[] = [
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
@customElement("demo-automation-editor-condition")
 | 
			
		||||
export class DemoAutomationEditorCondition extends LitElement {
 | 
			
		||||
class DemoHaAutomationEditorCondition extends LitElement {
 | 
			
		||||
  @state() private hass!: HomeAssistant;
 | 
			
		||||
 | 
			
		||||
  @state() private _disabled = false;
 | 
			
		||||
@@ -155,6 +155,6 @@ export class DemoAutomationEditorCondition extends LitElement {
 | 
			
		||||
 | 
			
		||||
declare global {
 | 
			
		||||
  interface HTMLElementTagNameMap {
 | 
			
		||||
    "demo-automation-editor-condition": DemoAutomationEditorCondition;
 | 
			
		||||
    "demo-ha-automation-editor-condition": DemoHaAutomationEditorCondition;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -126,7 +126,7 @@ const SCHEMAS: { name: string; triggers: Trigger[] }[] = [
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
@customElement("demo-automation-editor-trigger")
 | 
			
		||||
export class DemoAutomationEditorTrigger extends LitElement {
 | 
			
		||||
class DemoHaAutomationEditorTrigger extends LitElement {
 | 
			
		||||
  @state() private hass!: HomeAssistant;
 | 
			
		||||
 | 
			
		||||
  @state() private _disabled = false;
 | 
			
		||||
@@ -201,6 +201,6 @@ export class DemoAutomationEditorTrigger extends LitElement {
 | 
			
		||||
 | 
			
		||||
declare global {
 | 
			
		||||
  interface HTMLElementTagNameMap {
 | 
			
		||||
    "demo-automation-editor-trigger": DemoAutomationEditorTrigger;
 | 
			
		||||
    "demo-ha-automation-editor-trigger": DemoHaAutomationEditorTrigger;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@
 | 
			
		||||
import { css, html, LitElement, nothing } from "lit";
 | 
			
		||||
import { customElement, property } from "lit/decorators";
 | 
			
		||||
import "../../../../src/components/ha-card";
 | 
			
		||||
import "../../../../src/components/trace/hat-script-graph";
 | 
			
		||||
import "../../../../src/components/trace/hat-trace-timeline";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import { HomeAssistant } from "../../../../src/types";
 | 
			
		||||
@@ -55,7 +56,6 @@ export class DemoAutomationTraceTimeline extends LitElement {
 | 
			
		||||
    super.firstUpdated(changedProps);
 | 
			
		||||
    const hass = provideHass(this);
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("config", "en");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static get styles() {
 | 
			
		||||
 
 | 
			
		||||
@@ -60,7 +60,6 @@ export class DemoAutomationTrace extends LitElement {
 | 
			
		||||
    super.firstUpdated(changedProps);
 | 
			
		||||
    const hass = provideHass(this);
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("config", "en");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static get styles() {
 | 
			
		||||
 
 | 
			
		||||
@@ -59,7 +59,7 @@ export class DemoHaBarButton extends LitElement {
 | 
			
		||||
              <ha-control-button
 | 
			
		||||
                class=${ifDefined(btn.class)}
 | 
			
		||||
                label=${ifDefined(btn.label)}
 | 
			
		||||
                ?disabled=${btn.disabled}
 | 
			
		||||
                disabled=${ifDefined(btn.disabled)}
 | 
			
		||||
              >
 | 
			
		||||
                <ha-svg-icon .path=${btn.icon || mdiLightbulb}></ha-svg-icon>
 | 
			
		||||
              </ha-control-button>
 | 
			
		||||
@@ -162,7 +162,7 @@ export class DemoHaBarButton extends LitElement {
 | 
			
		||||
      }
 | 
			
		||||
      .custom-group {
 | 
			
		||||
        --control-button-group-thickness: 100px;
 | 
			
		||||
        --control-button-group-border-radius: 36px;
 | 
			
		||||
        --control-button-group-border-radius: 18px;
 | 
			
		||||
        --control-button-group-spacing: 20px;
 | 
			
		||||
      }
 | 
			
		||||
      .custom-group ha-control-button {
 | 
			
		||||
 
 | 
			
		||||
@@ -94,7 +94,7 @@ export class DemoHarControlNumberButtons extends LitElement {
 | 
			
		||||
        --control-number-buttons-background-color: #2196f3;
 | 
			
		||||
        --control-number-buttons-background-opacity: 0.1;
 | 
			
		||||
        --control-number-buttons-thickness: 100px;
 | 
			
		||||
        --control-number-buttons-border-radius: 36px;
 | 
			
		||||
        --control-number-buttons-border-radius: 24px;
 | 
			
		||||
      }
 | 
			
		||||
    `;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -135,7 +135,7 @@ export class DemoHaControlSelect extends LitElement {
 | 
			
		||||
                class=${ifDefined(config.class)}
 | 
			
		||||
                @value-changed=${this.handleValueChanged}
 | 
			
		||||
                aria-labelledby=${id}
 | 
			
		||||
                ?disabled=${config.disabled}
 | 
			
		||||
                disabled=${ifDefined(config.disabled)}
 | 
			
		||||
              >
 | 
			
		||||
              </ha-control-select>
 | 
			
		||||
            </div>
 | 
			
		||||
@@ -156,7 +156,7 @@ export class DemoHaControlSelect extends LitElement {
 | 
			
		||||
                  class=${ifDefined(config.class)}
 | 
			
		||||
                  @value-changed=${this.handleValueChanged}
 | 
			
		||||
                  aria-labelledby=${id}
 | 
			
		||||
                  ?disabled=${config.disabled}
 | 
			
		||||
                  disabled=${ifDefined(config.disabled)}
 | 
			
		||||
                >
 | 
			
		||||
                </ha-control-select>
 | 
			
		||||
              `;
 | 
			
		||||
@@ -186,8 +186,8 @@ export class DemoHaControlSelect extends LitElement {
 | 
			
		||||
      .custom {
 | 
			
		||||
        --mdc-icon-size: 24px;
 | 
			
		||||
        --control-select-color: var(--state-fan-active-color);
 | 
			
		||||
        --control-select-thickness: 130px;
 | 
			
		||||
        --control-select-border-radius: 48px;
 | 
			
		||||
        --control-select-thickness: 100px;
 | 
			
		||||
        --control-select-border-radius: 24px;
 | 
			
		||||
      }
 | 
			
		||||
      .vertical-selects {
 | 
			
		||||
        height: 300px;
 | 
			
		||||
 
 | 
			
		||||
@@ -150,8 +150,8 @@ export class DemoHaBarSlider extends LitElement {
 | 
			
		||||
        --control-slider-color: #ffcf4c;
 | 
			
		||||
        --control-slider-background: #ffcf4c;
 | 
			
		||||
        --control-slider-background-opacity: 0.2;
 | 
			
		||||
        --control-slider-thickness: 130px;
 | 
			
		||||
        --control-slider-border-radius: 48px;
 | 
			
		||||
        --control-slider-thickness: 100px;
 | 
			
		||||
        --control-slider-border-radius: 24px;
 | 
			
		||||
      }
 | 
			
		||||
      .vertical-sliders {
 | 
			
		||||
        height: 300px;
 | 
			
		||||
 
 | 
			
		||||
@@ -63,8 +63,8 @@ export class DemoHaControlSwitch extends LitElement {
 | 
			
		||||
                .pathOn=${mdiLightbulb}
 | 
			
		||||
                .pathOff=${mdiLightbulbOff}
 | 
			
		||||
                aria-labelledby=${id}
 | 
			
		||||
                ?disabled=${config.disabled}
 | 
			
		||||
                ?reversed=${config.reversed}
 | 
			
		||||
                disabled=${ifDefined(config.disabled)}
 | 
			
		||||
                reversed=${ifDefined(config.reversed)}
 | 
			
		||||
              >
 | 
			
		||||
              </ha-control-switch>
 | 
			
		||||
            </div>
 | 
			
		||||
@@ -86,8 +86,8 @@ export class DemoHaControlSwitch extends LitElement {
 | 
			
		||||
                  aria-label=${label}
 | 
			
		||||
                  .pathOn=${mdiGarageOpen}
 | 
			
		||||
                  .pathOff=${mdiGarage}
 | 
			
		||||
                  ?disabled=${config.disabled}
 | 
			
		||||
                  ?reversed=${config.reversed}
 | 
			
		||||
                  disabled=${ifDefined(config.disabled)}
 | 
			
		||||
                  reversed=${ifDefined(config.reversed)}
 | 
			
		||||
                >
 | 
			
		||||
                </ha-control-switch>
 | 
			
		||||
              `;
 | 
			
		||||
@@ -117,8 +117,8 @@ export class DemoHaControlSwitch extends LitElement {
 | 
			
		||||
      .custom {
 | 
			
		||||
        --control-switch-on-color: var(--green-color);
 | 
			
		||||
        --control-switch-off-color: var(--red-color);
 | 
			
		||||
        --control-switch-thickness: 130px;
 | 
			
		||||
        --control-switch-border-radius: 48px;
 | 
			
		||||
        --control-switch-thickness: 100px;
 | 
			
		||||
        --control-switch-border-radius: 24px;
 | 
			
		||||
        --control-switch-padding: 6px;
 | 
			
		||||
        --mdc-icon-size: 24px;
 | 
			
		||||
      }
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { css, html, LitElement, TemplateResult } from "lit";
 | 
			
		||||
import { customElement } from "lit/decorators";
 | 
			
		||||
import "../../../../src/components/ha-card";
 | 
			
		||||
import "../../../../src/components/ha-expansion-panel";
 | 
			
		||||
import "../../../../src/components/ha-icon-button";
 | 
			
		||||
import "../../../../src/components/ha-markdown";
 | 
			
		||||
import "../../components/demo-black-white-row";
 | 
			
		||||
import { LONG_TEXT } from "../../data/text";
 | 
			
		||||
 
 | 
			
		||||
@@ -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 "../../../../src/components/ha-form/ha-form";
 | 
			
		||||
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 { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import { HomeAssistant } from "../../../../src/types";
 | 
			
		||||
@@ -59,7 +58,6 @@ const DEVICES = [
 | 
			
		||||
    hw_version: null,
 | 
			
		||||
    via_device_id: null,
 | 
			
		||||
    serial_number: null,
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    area_id: "backyard",
 | 
			
		||||
@@ -78,7 +76,6 @@ const DEVICES = [
 | 
			
		||||
    hw_version: null,
 | 
			
		||||
    via_device_id: null,
 | 
			
		||||
    serial_number: null,
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    area_id: null,
 | 
			
		||||
@@ -97,37 +94,27 @@ const DEVICES = [
 | 
			
		||||
    hw_version: null,
 | 
			
		||||
    via_device_id: null,
 | 
			
		||||
    serial_number: null,
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const AREAS: AreaRegistryEntry[] = [
 | 
			
		||||
const AREAS = [
 | 
			
		||||
  {
 | 
			
		||||
    area_id: "backyard",
 | 
			
		||||
    floor_id: null,
 | 
			
		||||
    name: "Backyard",
 | 
			
		||||
    icon: null,
 | 
			
		||||
    picture: null,
 | 
			
		||||
    aliases: [],
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    area_id: "bedroom",
 | 
			
		||||
    floor_id: null,
 | 
			
		||||
    name: "Bedroom",
 | 
			
		||||
    icon: "mdi:bed",
 | 
			
		||||
    picture: null,
 | 
			
		||||
    aliases: [],
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    area_id: "livingroom",
 | 
			
		||||
    floor_id: null,
 | 
			
		||||
    name: "Livingroom",
 | 
			
		||||
    icon: "mdi:sofa",
 | 
			
		||||
    picture: null,
 | 
			
		||||
    aliases: [],
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@ import { mockEntityRegistry } from "../../../../demo/src/stubs/entity_registry";
 | 
			
		||||
import { mockHassioSupervisor } from "../../../../demo/src/stubs/hassio_supervisor";
 | 
			
		||||
import "../../../../src/components/ha-selector/ha-selector";
 | 
			
		||||
import "../../../../src/components/ha-settings-row";
 | 
			
		||||
import type { AreaRegistryEntry } from "../../../../src/data/area_registry";
 | 
			
		||||
import { BlueprintInput } from "../../../../src/data/blueprint";
 | 
			
		||||
import { showDialog } from "../../../../src/dialogs/make-dialog-manager";
 | 
			
		||||
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 type { HomeAssistant } from "../../../../src/types";
 | 
			
		||||
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 = [
 | 
			
		||||
  getEntity("alarm_control_panel", "alarm", "disarmed", {
 | 
			
		||||
@@ -59,7 +54,6 @@ const DEVICES = [
 | 
			
		||||
    hw_version: null,
 | 
			
		||||
    via_device_id: null,
 | 
			
		||||
    serial_number: null,
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    area_id: "backyard",
 | 
			
		||||
@@ -78,7 +72,6 @@ const DEVICES = [
 | 
			
		||||
    hw_version: null,
 | 
			
		||||
    via_device_id: null,
 | 
			
		||||
    serial_number: null,
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    area_id: null,
 | 
			
		||||
@@ -97,76 +90,27 @@ const DEVICES = [
 | 
			
		||||
    hw_version: null,
 | 
			
		||||
    via_device_id: null,
 | 
			
		||||
    serial_number: null,
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
const AREAS: AreaRegistryEntry[] = [
 | 
			
		||||
const AREAS = [
 | 
			
		||||
  {
 | 
			
		||||
    area_id: "backyard",
 | 
			
		||||
    floor_id: "ground",
 | 
			
		||||
    name: "Backyard",
 | 
			
		||||
    icon: null,
 | 
			
		||||
    picture: null,
 | 
			
		||||
    aliases: [],
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    area_id: "bedroom",
 | 
			
		||||
    floor_id: "first",
 | 
			
		||||
    name: "Bedroom",
 | 
			
		||||
    icon: "mdi:bed",
 | 
			
		||||
    picture: null,
 | 
			
		||||
    aliases: [],
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    area_id: "livingroom",
 | 
			
		||||
    floor_id: "ground",
 | 
			
		||||
    name: "Livingroom",
 | 
			
		||||
    icon: "mdi:sofa",
 | 
			
		||||
    picture: null,
 | 
			
		||||
    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",
 | 
			
		||||
    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: {} } },
 | 
			
		||||
      target: { name: "Target", selector: { target: {} } },
 | 
			
		||||
      state: {
 | 
			
		||||
        name: "State",
 | 
			
		||||
        selector: { state: { entity_id: "alarm_control_panel.alarm" } },
 | 
			
		||||
@@ -191,12 +130,15 @@ const SCHEMAS: {
 | 
			
		||||
        name: "Attribute",
 | 
			
		||||
        selector: { attribute: { entity_id: "" } },
 | 
			
		||||
      },
 | 
			
		||||
      device: { name: "Device", selector: { device: {} } },
 | 
			
		||||
      config_entry: {
 | 
			
		||||
        name: "Integration",
 | 
			
		||||
        selector: { config_entry: {} },
 | 
			
		||||
      },
 | 
			
		||||
      duration: { name: "Duration", selector: { duration: {} } },
 | 
			
		||||
      addon: { name: "Addon", selector: { addon: {} } },
 | 
			
		||||
      area: { name: "Area", selector: { area: {} } },
 | 
			
		||||
      target: { name: "Target", selector: { target: {} } },
 | 
			
		||||
      number_box: {
 | 
			
		||||
        name: "Number Box",
 | 
			
		||||
        selector: {
 | 
			
		||||
@@ -329,14 +271,6 @@ const SCHEMAS: {
 | 
			
		||||
        selector: { color_temp: {} },
 | 
			
		||||
      },
 | 
			
		||||
      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 } } },
 | 
			
		||||
      device: { name: "Device", selector: { device: { multiple: true } } },
 | 
			
		||||
      area: { name: "Area", selector: { area: { multiple: true } } },
 | 
			
		||||
      floor: { name: "Floor", selector: { floor: { multiple: true } } },
 | 
			
		||||
      label: { name: "Label", selector: { label: { multiple: true } } },
 | 
			
		||||
      select: {
 | 
			
		||||
        name: "Select Multiple",
 | 
			
		||||
        selector: {
 | 
			
		||||
@@ -403,8 +335,6 @@ class DemoHaSelector extends LitElement implements ProvideHassElement {
 | 
			
		||||
    mockDeviceRegistry(hass, DEVICES);
 | 
			
		||||
    mockConfigEntries(hass);
 | 
			
		||||
    mockAreaRegistry(hass, AREAS);
 | 
			
		||||
    mockFloorRegistry(hass, FLOORS);
 | 
			
		||||
    mockLabelRegistry(hass, LABELS);
 | 
			
		||||
    mockHassioSupervisor(hass);
 | 
			
		||||
    hass.mockWS("auth/sign_path", (params) => params);
 | 
			
		||||
    hass.mockWS("media_player/browse_media", this._browseMedia);
 | 
			
		||||
@@ -567,7 +497,7 @@ class DemoHaSelector extends LitElement implements ProvideHassElement {
 | 
			
		||||
          this.requestUpdate();
 | 
			
		||||
        };
 | 
			
		||||
        return html`
 | 
			
		||||
          <demo-black-white-row .title=${info.name}>
 | 
			
		||||
          <demo-black-white-row .title=${info.name} .value=${this.data[idx]}>
 | 
			
		||||
            ${["light", "dark"].map((slot) =>
 | 
			
		||||
              Object.entries(info.input).map(
 | 
			
		||||
                ([key, value]) => html`
 | 
			
		||||
@@ -600,8 +530,8 @@ class DemoHaSelector extends LitElement implements ProvideHassElement {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static styles = css`
 | 
			
		||||
    ha-settings-row {
 | 
			
		||||
      --paper-item-body-two-line-min-height: 0;
 | 
			
		||||
    ha-selector {
 | 
			
		||||
      width: 60;
 | 
			
		||||
    }
 | 
			
		||||
    .options {
 | 
			
		||||
      max-width: 800px;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,19 @@
 | 
			
		||||
import "@material/mwc-list/mwc-list";
 | 
			
		||||
import { LitElement, css, html } from "lit";
 | 
			
		||||
import { html, css, LitElement } from "lit";
 | 
			
		||||
import { customElement, state } from "lit/decorators";
 | 
			
		||||
import { formatDateTimeNumeric } from "../../../../src/common/datetime/format_date_time";
 | 
			
		||||
import "../../../../src/components/ha-card";
 | 
			
		||||
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 {
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  FrontendLocaleData,
 | 
			
		||||
  NumberFormat,
 | 
			
		||||
  TimeFormat,
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  TimeZone,
 | 
			
		||||
} 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")
 | 
			
		||||
export class DemoDateTimeDateTimeNumeric extends LitElement {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,19 @@
 | 
			
		||||
import "@material/mwc-list/mwc-list";
 | 
			
		||||
import { LitElement, css, html } from "lit";
 | 
			
		||||
import { html, css, LitElement } from "lit";
 | 
			
		||||
import { customElement, state } from "lit/decorators";
 | 
			
		||||
import { formatDateTimeWithSeconds } from "../../../../src/common/datetime/format_date_time";
 | 
			
		||||
import "../../../../src/components/ha-card";
 | 
			
		||||
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 {
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  FrontendLocaleData,
 | 
			
		||||
  NumberFormat,
 | 
			
		||||
  TimeFormat,
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  TimeZone,
 | 
			
		||||
} 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")
 | 
			
		||||
export class DemoDateTimeDateTimeSeconds extends LitElement {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,19 @@
 | 
			
		||||
import "@material/mwc-list/mwc-list";
 | 
			
		||||
import { LitElement, css, html } from "lit";
 | 
			
		||||
import { html, css, LitElement } from "lit";
 | 
			
		||||
import { customElement, state } from "lit/decorators";
 | 
			
		||||
import { formatShortDateTimeWithYear } from "../../../../src/common/datetime/format_date_time";
 | 
			
		||||
import "../../../../src/components/ha-card";
 | 
			
		||||
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 {
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  FrontendLocaleData,
 | 
			
		||||
  NumberFormat,
 | 
			
		||||
  TimeFormat,
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  TimeZone,
 | 
			
		||||
} 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")
 | 
			
		||||
export class DemoDateTimeDateTimeShortYear extends LitElement {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,19 @@
 | 
			
		||||
import "@material/mwc-list/mwc-list";
 | 
			
		||||
import { LitElement, css, html } from "lit";
 | 
			
		||||
import { html, css, LitElement } from "lit";
 | 
			
		||||
import { customElement, state } from "lit/decorators";
 | 
			
		||||
import { formatShortDateTime } from "../../../../src/common/datetime/format_date_time";
 | 
			
		||||
import "../../../../src/components/ha-card";
 | 
			
		||||
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 {
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  FrontendLocaleData,
 | 
			
		||||
  NumberFormat,
 | 
			
		||||
  TimeFormat,
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  TimeZone,
 | 
			
		||||
} 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")
 | 
			
		||||
export class DemoDateTimeDateTimeShort extends LitElement {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,19 @@
 | 
			
		||||
import "@material/mwc-list/mwc-list";
 | 
			
		||||
import { LitElement, css, html } from "lit";
 | 
			
		||||
import { html, css, LitElement } from "lit";
 | 
			
		||||
import { customElement, state } from "lit/decorators";
 | 
			
		||||
import { formatDateTime } from "../../../../src/common/datetime/format_date_time";
 | 
			
		||||
import "../../../../src/components/ha-card";
 | 
			
		||||
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 {
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  FrontendLocaleData,
 | 
			
		||||
  NumberFormat,
 | 
			
		||||
  TimeFormat,
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  TimeZone,
 | 
			
		||||
} 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")
 | 
			
		||||
export class DemoDateTimeDateTime extends LitElement {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,18 @@
 | 
			
		||||
import "@material/mwc-list/mwc-list";
 | 
			
		||||
import { LitElement, css, html } from "lit";
 | 
			
		||||
import { html, css, LitElement } from "lit";
 | 
			
		||||
import { customElement, state } from "lit/decorators";
 | 
			
		||||
import { formatTimeWithSeconds } from "../../../../src/common/datetime/format_time";
 | 
			
		||||
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 {
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  FrontendLocaleData,
 | 
			
		||||
  NumberFormat,
 | 
			
		||||
  TimeFormat,
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  TimeZone,
 | 
			
		||||
} 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")
 | 
			
		||||
export class DemoDateTimeTimeSeconds extends LitElement {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,18 @@
 | 
			
		||||
import "@material/mwc-list/mwc-list";
 | 
			
		||||
import { LitElement, css, html } from "lit";
 | 
			
		||||
import { html, css, LitElement } from "lit";
 | 
			
		||||
import { customElement, state } from "lit/decorators";
 | 
			
		||||
import { formatTimeWeekday } from "../../../../src/common/datetime/format_time";
 | 
			
		||||
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 {
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  FrontendLocaleData,
 | 
			
		||||
  NumberFormat,
 | 
			
		||||
  TimeFormat,
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  TimeZone,
 | 
			
		||||
} 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")
 | 
			
		||||
export class DemoDateTimeTimeWeekday extends LitElement {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,19 @@
 | 
			
		||||
import "@material/mwc-list/mwc-list";
 | 
			
		||||
import { LitElement, css, html } from "lit";
 | 
			
		||||
import { html, css, LitElement } from "lit";
 | 
			
		||||
import { customElement, state } from "lit/decorators";
 | 
			
		||||
import { formatTime } from "../../../../src/common/datetime/format_time";
 | 
			
		||||
import "../../../../src/components/ha-card";
 | 
			
		||||
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 {
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  FrontendLocaleData,
 | 
			
		||||
  NumberFormat,
 | 
			
		||||
  TimeFormat,
 | 
			
		||||
  DateFormat,
 | 
			
		||||
  FirstWeekday,
 | 
			
		||||
  TimeZone,
 | 
			
		||||
} 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")
 | 
			
		||||
export class DemoDateTimeTime extends LitElement {
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("alarm_control_panel", "alarm", "disarmed", {
 | 
			
		||||
@@ -85,7 +84,6 @@ class DemoAlarmPanelEntity extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("light", "bed_light", "on", {
 | 
			
		||||
@@ -147,7 +146,6 @@ class DemoArea extends LitElement {
 | 
			
		||||
        entity_id: "binary_sensor.kitchen_door",
 | 
			
		||||
      },
 | 
			
		||||
    ]);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("light", "controller_1", "on", {
 | 
			
		||||
@@ -67,7 +66,6 @@ class DemoConditional extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("light", "bed_light", "on", {
 | 
			
		||||
@@ -324,7 +323,6 @@ class DemoEntities extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("light", "bed_light", "on", {
 | 
			
		||||
@@ -83,7 +82,6 @@ class DemoButtonEntity extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("device_tracker", "demo_paulus", "work", {
 | 
			
		||||
@@ -11,7 +10,7 @@ const ENTITIES = [
 | 
			
		||||
    latitude: 32.877105,
 | 
			
		||||
    longitude: 117.232185,
 | 
			
		||||
    gps_accuracy: 91,
 | 
			
		||||
    battery: 25,
 | 
			
		||||
    battery: 71,
 | 
			
		||||
    friendly_name: "Paulus",
 | 
			
		||||
  }),
 | 
			
		||||
  getEntity("device_tracker", "demo_anne_therese", "school", {
 | 
			
		||||
@@ -19,7 +18,7 @@ const ENTITIES = [
 | 
			
		||||
    latitude: 32.877105,
 | 
			
		||||
    longitude: 117.232185,
 | 
			
		||||
    gps_accuracy: 91,
 | 
			
		||||
    battery: 50,
 | 
			
		||||
    battery: 71,
 | 
			
		||||
    friendly_name: "Anne Therese",
 | 
			
		||||
  }),
 | 
			
		||||
  getEntity("device_tracker", "demo_home_boy", "home", {
 | 
			
		||||
@@ -27,7 +26,7 @@ const ENTITIES = [
 | 
			
		||||
    latitude: 32.877105,
 | 
			
		||||
    longitude: 117.232185,
 | 
			
		||||
    gps_accuracy: 91,
 | 
			
		||||
    battery: 75,
 | 
			
		||||
    battery: 71,
 | 
			
		||||
    friendly_name: "Home Boy",
 | 
			
		||||
  }),
 | 
			
		||||
  getEntity("light", "bed_light", "on", {
 | 
			
		||||
@@ -39,53 +38,21 @@ const ENTITIES = [
 | 
			
		||||
  getEntity("light", "ceiling_lights", "off", {
 | 
			
		||||
    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 = [
 | 
			
		||||
  {
 | 
			
		||||
    heading: "Unfiltered entities",
 | 
			
		||||
    heading: "Unfiltered controller",
 | 
			
		||||
    config: `
 | 
			
		||||
- type: entities
 | 
			
		||||
  entities:
 | 
			
		||||
    - device_tracker.demo_anne_therese
 | 
			
		||||
    - device_tracker.demo_home_boy
 | 
			
		||||
    - device_tracker.demo_paulus
 | 
			
		||||
  - light.bed_light
 | 
			
		||||
  - light.ceiling_lights
 | 
			
		||||
  - light.kitchen_lights
 | 
			
		||||
    `,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    heading: "On and home entities",
 | 
			
		||||
    heading: "Filtered entities card",
 | 
			
		||||
    config: `
 | 
			
		||||
- type: entity-filter
 | 
			
		||||
  entities:
 | 
			
		||||
@@ -95,30 +62,11 @@ const CONFIGS = [
 | 
			
		||||
    - light.bed_light
 | 
			
		||||
    - light.ceiling_lights
 | 
			
		||||
    - light.kitchen_lights
 | 
			
		||||
  conditions:
 | 
			
		||||
    - condition: state
 | 
			
		||||
      state:
 | 
			
		||||
  state_filter:
 | 
			
		||||
    - "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
 | 
			
		||||
    `,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    heading: 'With "entities" card config',
 | 
			
		||||
    config: `
 | 
			
		||||
@@ -130,11 +78,9 @@ const CONFIGS = [
 | 
			
		||||
    - light.bed_light
 | 
			
		||||
    - light.ceiling_lights
 | 
			
		||||
    - light.kitchen_lights
 | 
			
		||||
  conditions:
 | 
			
		||||
    - condition: state
 | 
			
		||||
      state:
 | 
			
		||||
  state_filter:
 | 
			
		||||
    - "on"
 | 
			
		||||
        - home
 | 
			
		||||
    - not_home
 | 
			
		||||
  card:
 | 
			
		||||
    type: entities
 | 
			
		||||
    title: Custom Title
 | 
			
		||||
@@ -152,101 +98,15 @@ const CONFIGS = [
 | 
			
		||||
    - light.bed_light
 | 
			
		||||
    - light.ceiling_lights
 | 
			
		||||
    - light.kitchen_lights
 | 
			
		||||
  conditions:
 | 
			
		||||
    - condition: state
 | 
			
		||||
      state:
 | 
			
		||||
  state_filter:
 | 
			
		||||
    - "on"
 | 
			
		||||
        - home
 | 
			
		||||
    - not_home
 | 
			
		||||
  card:
 | 
			
		||||
    type: glance
 | 
			
		||||
    show_state: true
 | 
			
		||||
    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")
 | 
			
		||||
@@ -263,7 +123,6 @@ class DemoEntityFilter extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("sensor", "brightness", "12", {}),
 | 
			
		||||
@@ -129,7 +128,6 @@ class DemoGaugeEntity extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("device_tracker", "demo_paulus", "home", {
 | 
			
		||||
@@ -239,7 +238,6 @@ class DemoGlanceEntity extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import { mockHistory } from "../../../../demo/src/stubs/history";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("light", "kitchen_lights", "on", {
 | 
			
		||||
@@ -215,7 +214,6 @@ class DemoStack extends LitElement {
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockHistory(hass);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("light", "bed_light", "on", {
 | 
			
		||||
@@ -77,7 +76,6 @@ class DemoLightEntity extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -65,23 +65,15 @@ const CONFIGS = [
 | 
			
		||||
    >> ...by using additional greater-than signs right next to each other...
 | 
			
		||||
    > > > ...or with spaces between arrows.
 | 
			
		||||
 | 
			
		||||
    > [!NOTE]
 | 
			
		||||
    > This is a GitHub note alert
 | 
			
		||||
    > **Warning** Hey there
 | 
			
		||||
    > This is a warning with a title
 | 
			
		||||
 | 
			
		||||
    > [!TIP]
 | 
			
		||||
    > This is a GitHub tip alert
 | 
			
		||||
    > **Note**
 | 
			
		||||
    > This is a note
 | 
			
		||||
 | 
			
		||||
    > [!IMPORTANT]
 | 
			
		||||
    > This is a GitHub important alert
 | 
			
		||||
 | 
			
		||||
    > [!WARNING]
 | 
			
		||||
    > This is a GitHub warning alert
 | 
			
		||||
 | 
			
		||||
    > [!CAUTION]
 | 
			
		||||
    > This is a GitHub caution alert
 | 
			
		||||
 | 
			
		||||
    > [!TIP]
 | 
			
		||||
    > - This is a list entry in GitHub tip alert
 | 
			
		||||
    > **Note**
 | 
			
		||||
    > This is a multiline note
 | 
			
		||||
    > Lorem ipsum...
 | 
			
		||||
 | 
			
		||||
    ## Lists
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@ const CONFIGS = [
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
@customElement("demo-lovelace-media-player-row")
 | 
			
		||||
export class DemoLovelaceMediaPlayerRow extends LitElement {
 | 
			
		||||
class DemoHuiMediaPlayerRow extends LitElement {
 | 
			
		||||
  @query("#demos") private _demoRoot!: HTMLElement;
 | 
			
		||||
 | 
			
		||||
  protected render(): TemplateResult {
 | 
			
		||||
@@ -73,6 +73,6 @@ export class DemoLovelaceMediaPlayerRow extends LitElement {
 | 
			
		||||
 | 
			
		||||
declare global {
 | 
			
		||||
  interface HTMLElementTagNameMap {
 | 
			
		||||
    "demo-lovelace-media-player-row": DemoLovelaceMediaPlayerRow;
 | 
			
		||||
    "demo-lovelace-media-player-rows": DemoHuiMediaPlayerRow;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("light", "bed_light", "on", {
 | 
			
		||||
@@ -139,7 +138,6 @@ class DemoPictureElements extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("light", "kitchen_lights", "on", {
 | 
			
		||||
@@ -94,7 +93,6 @@ class DemoPictureEntity extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("switch", "decorative_lights", "on", {
 | 
			
		||||
@@ -135,7 +134,6 @@ class DemoPictureGlance extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { createPlantEntities } from "../../data/plants";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const CONFIGS = [
 | 
			
		||||
  {
 | 
			
		||||
@@ -44,7 +43,6 @@ export class DemoPlantEntity extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(createPlantEntities());
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ import { customElement, query } from "lit/decorators";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("climate", "ecobee", "auto", {
 | 
			
		||||
@@ -36,45 +35,6 @@ const ENTITIES = [
 | 
			
		||||
    friendly_name: "Nest",
 | 
			
		||||
    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", {
 | 
			
		||||
    current_temperature: null,
 | 
			
		||||
    temperature: null,
 | 
			
		||||
@@ -85,9 +45,7 @@ const ENTITIES = [
 | 
			
		||||
    friendly_name: "Sensibo purifier",
 | 
			
		||||
    fan_modes: ["low", "high"],
 | 
			
		||||
    fan_mode: "low",
 | 
			
		||||
    swing_modes: ["on", "off", "both", "vertical", "horizontal"],
 | 
			
		||||
    swing_mode: "vertical",
 | 
			
		||||
    supported_features: 41,
 | 
			
		||||
    supported_features: 9,
 | 
			
		||||
  }),
 | 
			
		||||
  getEntity("climate", "unavailable", "unavailable", {
 | 
			
		||||
    supported_features: 43,
 | 
			
		||||
@@ -100,6 +58,8 @@ const CONFIGS = [
 | 
			
		||||
    config: `
 | 
			
		||||
- type: thermostat
 | 
			
		||||
  entity: climate.ecobee
 | 
			
		||||
- type: thermostat
 | 
			
		||||
  entity: climate.nest
 | 
			
		||||
    `,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
@@ -109,66 +69,6 @@ const CONFIGS = [
 | 
			
		||||
  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",
 | 
			
		||||
    config: `
 | 
			
		||||
@@ -184,14 +84,6 @@ const CONFIGS = [
 | 
			
		||||
      fan_modes:
 | 
			
		||||
        - low
 | 
			
		||||
        - 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("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ import { VacuumEntityFeature } from "../../../../src/data/vacuum";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("switch", "tv_outlet", "on", {
 | 
			
		||||
@@ -80,18 +79,6 @@ const CONFIGS = [
 | 
			
		||||
  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",
 | 
			
		||||
    config: `
 | 
			
		||||
@@ -185,7 +172,6 @@ class DemoTile extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import "../../components/demo-cards";
 | 
			
		||||
import { getEntity } from "../../../../src/fake_data/entity";
 | 
			
		||||
import { mockTodo } from "../../../../demo/src/stubs/todo";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("todo", "shopping_list", "2", {
 | 
			
		||||
@@ -48,7 +47,6 @@ class DemoTodoListEntity extends LitElement {
 | 
			
		||||
    hass.updateTranslations(null, "en");
 | 
			
		||||
    hass.updateTranslations("lovelace", "en");
 | 
			
		||||
    hass.addEntities(ENTITIES);
 | 
			
		||||
    mockIcons(hass);
 | 
			
		||||
 | 
			
		||||
    mockTodo(hass);
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,6 @@ import "../../../../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 { provideHass } from "../../../../src/fake_data/provide_hass";
 | 
			
		||||
import { mockIcons } from "../../../../demo/src/stubs/icons";
 | 
			
		||||
import { HomeAssistant } from "../../../../src/types";
 | 
			
		||||
 | 
			
		||||
const SENSOR_DEVICE_CLASSES = [
 | 
			
		||||
@@ -54,7 +53,6 @@ const SENSOR_DEVICE_CLASSES = [
 | 
			
		||||
  "volatile_organic_compounds_parts",
 | 
			
		||||
  "voltage",
 | 
			
		||||
  "volume",
 | 
			
		||||
  "volume_flow_rate",
 | 
			
		||||
  "water",
 | 
			
		||||
  "weight",
 | 
			
		||||
  "wind_speed",
 | 
			
		||||
@@ -292,7 +290,6 @@ const ENTITIES: HassEntity[] = [
 | 
			
		||||
  createEntity("water_heater.high_demand", "high_demand"),
 | 
			
		||||
  createEntity("water_heater.heat_pump", "heat_pump"),
 | 
			
		||||
  createEntity("water_heater.gas", "gas"),
 | 
			
		||||
  createEntity("select.speed", "ridiculous_speed"),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
function createEntity(
 | 
			
		||||
@@ -347,7 +344,6 @@ export class DemoEntityState extends LitElement {
 | 
			
		||||
          title: "Icon",
 | 
			
		||||
          template: (entry) => html`
 | 
			
		||||
            <state-badge
 | 
			
		||||
              .hass=${hass}
 | 
			
		||||
              .stateObj=${entry.stateObj}
 | 
			
		||||
              .stateColor=${true}
 | 
			
		||||
            ></state-badge>
 | 
			
		||||
@@ -399,17 +395,6 @@ export class DemoEntityState extends LitElement {
 | 
			
		||||
  protected firstUpdated(changedProps) {
 | 
			
		||||
    super.firstUpdated(changedProps);
 | 
			
		||||
    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("config", "en");
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,6 @@ const createConfigEntry = (
 | 
			
		||||
  supports_options: false,
 | 
			
		||||
  supports_remove_device: false,
 | 
			
		||||
  supports_unload: true,
 | 
			
		||||
  supports_reconfigure: true,
 | 
			
		||||
  disabled_by: null,
 | 
			
		||||
  pref_disable_new_entities: false,
 | 
			
		||||
  pref_disable_polling: false,
 | 
			
		||||
@@ -199,8 +198,6 @@ const createEntityRegistryEntries = (
 | 
			
		||||
    has_entity_name: false,
 | 
			
		||||
    unique_id: "updater",
 | 
			
		||||
    options: null,
 | 
			
		||||
    labels: [],
 | 
			
		||||
    categories: {},
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
@@ -224,7 +221,6 @@ const createDeviceRegistryEntries = (
 | 
			
		||||
    name_by_user: null,
 | 
			
		||||
    disabled_by: null,
 | 
			
		||||
    configuration_url: null,
 | 
			
		||||
    labels: [],
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -59,9 +59,3 @@ export class DemoUtilLongPress extends LitElement {
 | 
			
		||||
    }
 | 
			
		||||
  `;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
declare global {
 | 
			
		||||
  interface HTMLElementTagNameMap {
 | 
			
		||||
    "demo-misc-util-long-press": DemoUtilLongPress;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,7 @@ import "../../components/demo-more-infos";
 | 
			
		||||
import { ClimateEntityFeature } from "../../../../src/data/climate";
 | 
			
		||||
 | 
			
		||||
const ENTITIES = [
 | 
			
		||||
  getEntity("climate", "radiator", "heat", {
 | 
			
		||||
  getEntity("climate", "thermostat", "heat", {
 | 
			
		||||
    friendly_name: "Basic heater",
 | 
			
		||||
    hvac_modes: ["heat", "off"],
 | 
			
		||||
    hvac_mode: "heat",
 | 
			
		||||
@@ -80,24 +80,6 @@ const ENTITIES = [
 | 
			
		||||
    max_humidity: 100,
 | 
			
		||||
    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", {
 | 
			
		||||
    friendly_name: "Unavailable heater",
 | 
			
		||||
    hvac_modes: ["heat", "off"],
 | 
			
		||||
@@ -110,7 +92,7 @@ const ENTITIES = [
 | 
			
		||||
 | 
			
		||||
@customElement("demo-more-info-climate")
 | 
			
		||||
class DemoMoreInfoClimate extends LitElement {
 | 
			
		||||
  @property({ attribute: false }) public hass!: MockHomeAssistant;
 | 
			
		||||
  @property() public hass!: MockHomeAssistant;
 | 
			
		||||
 | 
			
		||||
  @query("demo-more-infos") private _demoRoot!: HTMLElement;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -141,7 +141,7 @@ const ENTITIES = [
 | 
			
		||||
 | 
			
		||||
@customElement("demo-more-info-cover")
 | 
			
		||||
class DemoMoreInfoCover extends LitElement {
 | 
			
		||||
  @property({ attribute: false }) public hass!: MockHomeAssistant;
 | 
			
		||||
  @property() public hass!: MockHomeAssistant;
 | 
			
		||||
 | 
			
		||||
  @query("demo-more-infos") private _demoRoot!: HTMLElement;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ const ENTITIES = [
 | 
			
		||||
 | 
			
		||||
@customElement("demo-more-info-humidifier")
 | 
			
		||||
class DemoMoreInfoHumidifier extends LitElement {
 | 
			
		||||
  @property({ attribute: false }) public hass!: MockHomeAssistant;
 | 
			
		||||
  @property() public hass!: MockHomeAssistant;
 | 
			
		||||
 | 
			
		||||
  @query("demo-more-infos") private _demoRoot!: HTMLElement;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ const ENTITIES = [
 | 
			
		||||
 | 
			
		||||
@customElement("demo-more-info-input-number")
 | 
			
		||||
class DemoMoreInfoInputNumber extends LitElement {
 | 
			
		||||
  @property({ attribute: false }) public hass!: MockHomeAssistant;
 | 
			
		||||
  @property() public hass!: MockHomeAssistant;
 | 
			
		||||
 | 
			
		||||
  @query("demo-more-infos") private _demoRoot!: HTMLElement;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ const ENTITIES = [
 | 
			
		||||
 | 
			
		||||
@customElement("demo-more-info-input-text")
 | 
			
		||||
class DemoMoreInfoInputText extends LitElement {
 | 
			
		||||
  @property({ attribute: false }) public hass!: MockHomeAssistant;
 | 
			
		||||
  @property() public hass!: MockHomeAssistant;
 | 
			
		||||
 | 
			
		||||
  @query("demo-more-infos") private _demoRoot!: HTMLElement;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -140,7 +140,7 @@ const ENTITIES = [
 | 
			
		||||
 | 
			
		||||
@customElement("demo-more-info-light")
 | 
			
		||||
class DemoMoreInfoLight extends LitElement {
 | 
			
		||||
  @property({ attribute: false }) public hass!: MockHomeAssistant;
 | 
			
		||||
  @property() public hass!: MockHomeAssistant;
 | 
			
		||||
 | 
			
		||||
  @query("demo-more-infos") private _demoRoot!: HTMLElement;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user