├── .devcontainer
├── configuration.yaml
├── devcontainer.json
└── ui-lovelace.yaml
├── .eslintrc.js
├── .github
└── workflows
│ ├── build.yml
│ └── release.yml
├── .gitignore
├── .prettierrc.js
├── .vscode
└── extensions.json
├── LICENSE
├── README.md
├── dist
├── button-text-card.js
└── button-text-card.js.map
├── docs
├── example-1.png
├── example-2.png
├── example-3.png
├── example-4.png
├── example-5.png
├── example-6.png
├── example-6a.png
├── example-7.png
└── logo.png
├── hacs.json
├── package-lock.json
├── package.json
├── rollup.config.js
├── src
├── action-handler-directive.ts
├── button-text-card.ts
├── const.ts
└── types.ts
└── tsconfig.json
/.devcontainer/configuration.yaml:
--------------------------------------------------------------------------------
1 | default_config:
2 | lovelace:
3 | mode: yaml
4 | demo:
--------------------------------------------------------------------------------
/.devcontainer/devcontainer.json:
--------------------------------------------------------------------------------
1 | // See https://aka.ms/vscode-remote/devcontainer.json for format details.
2 | {
3 | "name": "Boilerplate Card Development",
4 | "image": "ludeeus/devcontainer:monster-stable",
5 | "context": "..",
6 | "appPort": ["5000:5000", "9123:8123"],
7 | "postCreateCommand": "npm install",
8 | "runArgs": [
9 | "-v",
10 | "${env:HOME}${env:USERPROFILE}/.ssh:/tmp/.ssh" // This is added so you can push from inside the container
11 | ],
12 | "extensions": [
13 | "github.vscode-pull-request-github",
14 | "eamodio.gitlens",
15 | "dbaeumer.vscode-eslint",
16 | "esbenp.prettier-vscode",
17 | "bierner.lit-html",
18 | "runem.lit-plugin",
19 | "auchenberg.vscode-browser-preview",
20 | "davidanson.vscode-markdownlint",
21 | "redhat.vscode-yaml"
22 | ],
23 | "settings": {
24 | "files.eol": "\n",
25 | "editor.tabSize": 4,
26 | "terminal.integrated.shell.linux": "/bin/bash",
27 | "editor.formatOnPaste": false,
28 | "editor.formatOnSave": true,
29 | "editor.formatOnType": true,
30 | "files.trimTrailingWhitespace": true
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/.devcontainer/ui-lovelace.yaml:
--------------------------------------------------------------------------------
1 | resources:
2 | - url: http://127.0.0.1:5000/boilerplate-card.js
3 | type: module
4 | views:
5 | - cards:
6 | - type: custom:boilerplate-card
7 | name: Boilerplate Card Development
8 | entity: sun.sun
9 | test_gui: true
10 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | parser: '@typescript-eslint/parser', // Specifies the ESLint parser
3 | extends: [
4 | "plugin:@typescript-eslint/recommended"
5 | ],
6 | parserOptions: {
7 | ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features
8 | sourceType: 'module' // Allows for the use of imports
9 | },
10 | rules: {
11 | "@typescript-eslint/camelcase": 0
12 | }
13 | };
14 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: "Build"
2 |
3 | on:
4 | push:
5 | pull_request:
6 |
7 | jobs:
8 | build:
9 | name: Test build
10 | runs-on: ubuntu-latest
11 | steps:
12 | - uses: actions/checkout@v1
13 | - name: Build
14 | run: |
15 | npm install
16 | npm run build
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 |
3 | on:
4 | release:
5 | types: [published]
6 |
7 | jobs:
8 | release:
9 | name: Prepare release
10 | runs-on: ubuntu-latest
11 | steps:
12 | - uses: actions/checkout@v1
13 |
14 | # Build
15 | - name: Build the file
16 | run: |
17 | cd /home/runner/work/boilerplate-card/boilerplate-card
18 | npm install
19 | npm run build
20 |
21 | # Upload build file to the releas as an asset.
22 | - name: Upload zip to release
23 | uses: svenstaro/upload-release-action@v1-release
24 |
25 | with:
26 | repo_token: ${{ secrets.GITHUB_TOKEN }}
27 | file: /home/runner/work/boilerplate-card/boilerplate-card/dist/boilerplate-card.js
28 | asset_name: boilerplate-card.js
29 | tag: ${{ github.ref }}
30 | overwrite: true
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 | /.rpt2_cache/
3 |
4 | # For those using Visual Studio Code Editor
5 | .vscode/*
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | semi: true,
3 | trailingComma: 'all',
4 | singleQuote: true,
5 | printWidth: 120,
6 | tabWidth: 2,
7 | };
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "github.vscode-pull-request-github",
4 | "eamodio.gitlens",
5 | "dbaeumer.vscode-eslint",
6 | "esbenp.prettier-vscode",
7 | "bierner.lit-html",
8 | "runem.lit-plugin",
9 | "auchenberg.vscode-browser-preview",
10 | "davidanson.vscode-markdownlint",
11 | "redhat.vscode-yaml"
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Custom cards for Home Assistant
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Button Text Card
7 |
8 |
9 |
10 | [](https://github.com/custom-components/hacs)
11 | [](https://github.com/Savjee/button-text-card/actions?query=workflow%3ABuild)
12 | [](https://github.com/Savjee/button-text-card/issues)
13 | [](https://github.com/Savjee/button-text-card/pulls)
14 | [](/LICENSE)
15 |
16 |
17 |
18 | ---
19 |
20 | Custom, "neumorphism" card for Home Assistant with support for templating.
21 |
22 | # Table of contents
23 | * [Installation instructions](#installation-instructions)
24 | * [Configuration options](#configuration-options)
25 | * [Examples](#examples)
26 | * [Templating](#templating)
27 | * [Conditional hiding](#conditional-hiding)
28 | * [License & Contributions](#license--contributions)
29 |
30 | ---
31 |
32 | # Installation instructions
33 |
34 | 1. Open [HACS](https://hacs.xyz/)
35 | 2. Go to Plugins > Search for "Button Text Card"
36 | 4. Install it
37 | 5. Add to your Lovelace config:
38 |
39 | ```yaml
40 | - url: /hacsfiles/button-text-card/button-text-card.js
41 | type: module
42 | ```
43 |
44 | # Configuration options
45 | | Name | Type | Requirement | Description | Default | Template support? |
46 | |------------------|---------|-------------|-----------------------------------------------------------------------------|----------------------|-------------------|
47 | | type | string | required | `custom:button-text-card` | n/a | No |
48 | | entity | string | optional | Which entity state you want to use in your card (templating) | | No |
49 | | icon | string | optional | Custom icon for the card | `mdi:alert-circle` | Yes |
50 | | title | string | optional | | | Yes |
51 | | subtitle | string | optional | | | Yes |
52 | | large | boolean | optional | Large cards have a full-width container | `false` | Yes |
53 | | font_color | string | optional | CSS colorcode for the text | Defined by theme | Yes |
54 | | icon_color | string | optional | CSS colorcode or "auto" if you want it to change based on your entity state | Defined by theme | Yes |
55 | | icon_size | number | optional | Height of the icon (in pixels) | Defined by HA (24px) | Yes |
56 | | background_color | string | optional | CSS color for the background of the badge | Defined by theme | Yes |
57 | | hide_condition | string | optional | Javascript template that defines if card should be hidden | `false` | Yes |
58 | | icon_animation | string | optional | Possible values: 'spin' | | Yes |
59 |
60 |
61 | # Examples
62 |
63 | **Basic card with static title, subtitle and custom icon**
64 |
65 |
66 |
67 |
68 | ```yaml
69 | type: 'custom:button-text-card'
70 | title: Title
71 | subtitle: Subtitle
72 | icon: 'mdi:lightbulb-outline'
73 | ```
74 |
75 | **Only title**
76 |
77 |
78 |
79 |
80 | ```yaml
81 | type: 'custom:button-text-card'
82 | title: Only title
83 | icon: 'mdi:format-title'
84 | ```
85 |
86 | **Large card**
87 |
88 |
89 |
90 |
91 | ```yaml
92 | type: 'custom:button-text-card'
93 | title: Large version
94 | subtitle: Ideal for important messages
95 | icon: 'mdi:battery-high'
96 | large: true
97 | ```
98 |
99 | **Custom background & font colors**
100 |
101 |
102 |
103 |
104 | ```yaml
105 | type: 'custom:button-text-card'
106 | title: Warning!
107 | subtitle: Draw attention with custom colors
108 | icon: 'mdi:comment-alert'
109 | large: true
110 | font_color: '#fff'
111 | background_color: '#A81419'
112 | ```
113 |
114 | # Templating
115 |
116 | For templating, we do **NOT** support Jinja2. Instead we opted to use Javascript as templating language (like [button-card](https://github.com/custom-cards/button-card)).
117 |
118 | Templating is supported in most fields (see [options](#options) for more details). Since these templates are executed in the front-end, there is no impact on the performance of your Home Assistant installation. It does, however, mean that you have to learn some Javascript.
119 |
120 | Templates are enclosed by tripple brackets and can contain any valid Javascript: `[[[ return "Hello from Javascript!" ]]]`
121 |
122 | **Example: counting people home**
123 |
124 |
125 |
126 |
127 | ```yaml
128 | type: 'custom:button-text-card'
129 | icon: >
130 | [[[
131 | const count = Object.entries(states).filter(e => e[0].indexOf('person.') === 0 && e[1].state === "home").length;
132 |
133 | if(count === 0){
134 | return "mdi:home-export-outline";
135 | }else{
136 | return "mdi:home-import-outline";
137 | }
138 | ]]]
139 | title: |
140 | [[[
141 | const count = Object.entries(states).filter(e => e[0].indexOf('person.') === 0 && e[1].state === "home").length;
142 | return "People home: " + count;
143 | ]]]
144 | subtitle: Support for templating!
145 | ```
146 |
147 | # Conditional hiding
148 | You can use a Javascript template to dynamically hide a card. This can be useful to create contextual cards (eg: only show when the front door is open, when there are lights on, ...).
149 |
150 | To do so, write a Javascript template in the `hide_condition` attribute and return `true` if the card should be hidden.
151 |
152 |
153 | **Example: Only show card when music is playing**
154 |
155 |
156 |
157 |
158 | ```yaml
159 | type: 'custom:button-text-card'
160 | title: There is music playing
161 | icon: 'mdi:music-circle'
162 | hide_condition: |
163 | [[[
164 | const active_players = Object.entries(states).filter(e => e[0].indexOf('media_player.')===0 && e[1].state === 'playing');
165 | return active_players.length === 0;
166 | ]]]
167 | ```
168 |
169 | Cool feature: when you go into edit mode, all hidden cards will appear with an opacity of 50%. That way you can easily manage all your cards.
170 |
171 |
172 |
173 |
174 |
175 | **Example: Only show card when the front door is open**
176 |
177 |
178 |
179 |
180 | ```
181 | type: 'custom:button-text-card'
182 | large: true
183 | entity: binary_sensor.voordeur
184 | title: Front door open!
185 | background_color: '#A81419'
186 | font_color: '#fff'
187 | icon: 'mdi:door-open'
188 | hide_condition: |
189 | [[[ return entity.state === "off" ]]]
190 | ```
191 |
192 | # TODO
193 | * Document tap_action support
194 |
195 | # License & contributions
196 | See [LICENSE](/LICENSE)
197 |
198 | Feel free to suggest improvements, flag issues, open pull requests, ...
199 |
--------------------------------------------------------------------------------
/dist/button-text-card.js:
--------------------------------------------------------------------------------
1 | function t(t,e,i,n){var o,s=arguments.length,r=s<3?e:null===n?n=Object.getOwnPropertyDescriptor(e,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(t,e,i,n);else for(var a=t.length-1;a>=0;a--)(o=t[a])&&(r=(s<3?o(r):s>3?o(e,i,r):o(e,i))||r);return s>3&&r&&Object.defineProperty(e,i,r),r
2 | /**
3 | * @license
4 | * Copyright 2019 Google LLC
5 | * SPDX-License-Identifier: BSD-3-Clause
6 | */}const e=window,i=e.ShadowRoot&&(void 0===e.ShadyCSS||e.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,n=Symbol(),o=new WeakMap;class s{constructor(t,e,i){if(this._$cssResult$=!0,i!==n)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const e=this.t;if(i&&void 0===t){const i=void 0!==e&&1===e.length;i&&(t=o.get(e)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),i&&o.set(e,t))}return t}toString(){return this.cssText}}const r=(t,...e)=>{const i=1===t.length?t[0]:e.reduce(((e,i,n)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if("number"==typeof t)return t;throw Error("Value passed to 'css' function must be a 'css' function result: "+t+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+t[n+1]),t[0]);return new s(i,t,n)},a=i?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new s("string"==typeof t?t:t+"",void 0,n))(e)})(t):t
7 | /**
8 | * @license
9 | * Copyright 2017 Google LLC
10 | * SPDX-License-Identifier: BSD-3-Clause
11 | */;var l;const c=window,h=c.trustedTypes,d=h?h.emptyScript:"",u=c.reactiveElementPolyfillSupport,p={toAttribute(t,e){switch(e){case Boolean:t=t?d:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},v=(t,e)=>e!==t&&(e==e||t==t),f={attribute:!0,type:String,converter:p,reflect:!1,hasChanged:v};class _ extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u()}static addInitializer(t){var e;null!==(e=this.h)&&void 0!==e||(this.h=[]),this.h.push(t)}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((e,i)=>{const n=this._$Ep(i,e);void 0!==n&&(this._$Ev.set(n,i),t.push(n))})),t}static createProperty(t,e=f){if(e.state&&(e.attribute=!1),this.finalize(),this.elementProperties.set(t,e),!e.noAccessor&&!this.prototype.hasOwnProperty(t)){const i="symbol"==typeof t?Symbol():"__"+t,n=this.getPropertyDescriptor(t,i,e);void 0!==n&&Object.defineProperty(this.prototype,t,n)}}static getPropertyDescriptor(t,e,i){return{get(){return this[e]},set(n){const o=this[t];this[e]=n,this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||f}static finalize(){if(this.hasOwnProperty("finalized"))return!1;this.finalized=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),this.elementProperties=new Map(t.elementProperties),this._$Ev=new Map,this.hasOwnProperty("properties")){const t=this.properties,e=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const i of e)this.createProperty(i,t[i])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(a(t))}else void 0!==t&&e.push(a(t));return e}static _$Ep(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}u(){var t;this._$E_=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(t=this.constructor.h)||void 0===t||t.forEach((t=>t(this)))}addController(t){var e,i;(null!==(e=this._$ES)&&void 0!==e?e:this._$ES=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(i=t.hostConnected)||void 0===i||i.call(t))}removeController(t){var e;null===(e=this._$ES)||void 0===e||e.splice(this._$ES.indexOf(t)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach(((t,e)=>{this.hasOwnProperty(e)&&(this._$Ei.set(e,this[e]),delete this[e])}))}createRenderRoot(){var t;const n=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return((t,n)=>{i?t.adoptedStyleSheets=n.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):n.forEach((i=>{const n=document.createElement("style"),o=e.litNonce;void 0!==o&&n.setAttribute("nonce",o),n.textContent=i.cssText,t.appendChild(n)}))})(n,this.constructor.elementStyles),n}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostConnected)||void 0===e?void 0:e.call(t)}))}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostDisconnected)||void 0===e?void 0:e.call(t)}))}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$EO(t,e,i=f){var n;const o=this.constructor._$Ep(t,i);if(void 0!==o&&!0===i.reflect){const s=(void 0!==(null===(n=i.converter)||void 0===n?void 0:n.toAttribute)?i.converter:p).toAttribute(e,i.type);this._$El=t,null==s?this.removeAttribute(o):this.setAttribute(o,s),this._$El=null}}_$AK(t,e){var i;const n=this.constructor,o=n._$Ev.get(t);if(void 0!==o&&this._$El!==o){const t=n.getPropertyOptions(o),s="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==(null===(i=t.converter)||void 0===i?void 0:i.fromAttribute)?t.converter:p;this._$El=o,this[o]=s.fromAttribute(e,t.type),this._$El=null}}requestUpdate(t,e,i){let n=!0;void 0!==t&&(((i=i||this.constructor.getPropertyOptions(t)).hasChanged||v)(this[t],e)?(this._$AL.has(t)||this._$AL.set(t,e),!0===i.reflect&&this._$El!==t&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(t,i))):n=!1),!this.isUpdatePending&&n&&(this._$E_=this._$Ej())}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var t;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach(((t,e)=>this[e]=t)),this._$Ei=void 0);let e=!1;const i=this._$AL;try{e=this.shouldUpdate(i),e?(this.willUpdate(i),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var e;return null===(e=t.hostUpdate)||void 0===e?void 0:e.call(t)})),this.update(i)):this._$Ek()}catch(t){throw e=!1,this._$Ek(),t}e&&this._$AE(i)}willUpdate(t){}_$AE(t){var e;null===(e=this._$ES)||void 0===e||e.forEach((t=>{var e;return null===(e=t.hostUpdated)||void 0===e?void 0:e.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(t){return!0}update(t){void 0!==this._$EC&&(this._$EC.forEach(((t,e)=>this._$EO(e,this[e],t))),this._$EC=void 0),this._$Ek()}updated(t){}firstUpdated(t){}}
12 | /**
13 | * @license
14 | * Copyright 2017 Google LLC
15 | * SPDX-License-Identifier: BSD-3-Clause
16 | */
17 | var m;_.finalized=!0,_.elementProperties=new Map,_.elementStyles=[],_.shadowRootOptions={mode:"open"},null==u||u({ReactiveElement:_}),(null!==(l=c.reactiveElementVersions)&&void 0!==l?l:c.reactiveElementVersions=[]).push("1.4.1");const g=window,$=g.trustedTypes,y=$?$.createPolicy("lit-html",{createHTML:t=>t}):void 0,b=`lit$${(Math.random()+"").slice(9)}$`,A="?"+b,w=`<${A}>`,E=document,x=(t="")=>E.createComment(t),C=t=>null===t||"object"!=typeof t&&"function"!=typeof t,S=Array.isArray,k=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,P=/-->/g,T=/>/g,O=RegExp(">|[ \t\n\f\r](?:([^\\s\"'>=/]+)([ \t\n\f\r]*=[ \t\n\f\r]*(?:[^ \t\n\f\r\"'`<>=]|(\"|')|))|$)","g"),U=/'/g,H=/"/g,R=/^(?:script|style|textarea|title)$/i,M=(t=>(e,...i)=>({_$litType$:t,strings:e,values:i}))(1),N=Symbol.for("lit-noChange"),z=Symbol.for("lit-nothing"),L=new WeakMap,j=E.createTreeWalker(E,129,null,!1),B=(t,e)=>{const i=t.length-1,n=[];let o,s=2===e?"":"",r=k;for(let e=0;e"===l[0]?(r=null!=o?o:k,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?O:'"'===l[3]?H:U):r===H||r===U?r=O:r===P||r===T?r=k:(r=O,o=void 0);const d=r===O&&t[e+1].startsWith("/>")?" ":"";s+=r===k?i+w:c>=0?(n.push(a),i.slice(0,c)+"$lit$"+i.slice(c)+b+d):i+b+(-2===c?(n.push(void 0),e):d)}const a=s+(t[i]||">")+(2===e?" ":"");if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return[void 0!==y?y.createHTML(a):a,n]};class I{constructor({strings:t,_$litType$:e},i){let n;this.parts=[];let o=0,s=0;const r=t.length-1,a=this.parts,[l,c]=B(t,e);if(this.el=I.createElement(l,i),j.currentNode=this.el.content,2===e){const t=this.el.content,e=t.firstChild;e.remove(),t.append(...e.childNodes)}for(;null!==(n=j.nextNode())&&a.length0){n.textContent=$?$.emptyScript:"";for(let i=0;iS(t)||"function"==typeof(null==t?void 0:t[Symbol.iterator]))(t)?this.O(t):this.$(t)}S(t,e=this._$AB){return this._$AA.parentNode.insertBefore(t,e)}k(t){this._$AH!==t&&(this._$AR(),this._$AH=this.S(t))}$(t){this._$AH!==z&&C(this._$AH)?this._$AA.nextSibling.data=t:this.k(E.createTextNode(t)),this._$AH=t}T(t){var e;const{values:i,_$litType$:n}=t,o="number"==typeof n?this._$AC(t):(void 0===n.el&&(n.el=I.createElement(n.h,this.options)),n);if((null===(e=this._$AH)||void 0===e?void 0:e._$AD)===o)this._$AH.m(i);else{const t=new q(o,this),e=t.p(this.options);t.m(i),this.k(e),this._$AH=t}}_$AC(t){let e=L.get(t.strings);return void 0===e&&L.set(t.strings,e=new I(t)),e}O(t){S(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,n=0;for(const o of t)n===e.length?e.push(i=new V(this.S(x()),this.S(x()),this,this.options)):i=e[n],i._$AI(o),n++;n2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=z}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,e=this,i,n){const o=this.strings;let s=!1;if(void 0===o)t=D(this,t,e,0),s=!C(t)||t!==this._$AH&&t!==N,s&&(this._$AH=t);else{const n=t;let r,a;for(t=o[0],r=0;r{var n,o;const s=null!==(n=null==i?void 0:i.renderBefore)&&void 0!==n?n:e;let r=s._$litPart$;if(void 0===r){const t=null!==(o=null==i?void 0:i.renderBefore)&&void 0!==o?o:null;s._$litPart$=r=new V(e.insertBefore(x(),t),t,void 0,null!=i?i:{})}return r._$AI(t),r})(e,this.renderRoot,this.renderOptions)}connectedCallback(){var t;super.connectedCallback(),null===(t=this._$Do)||void 0===t||t.setConnected(!0)}disconnectedCallback(){var t;super.disconnectedCallback(),null===(t=this._$Do)||void 0===t||t.setConnected(!1)}render(){return N}}tt.finalized=!0,tt._$litElement$=!0,null===(G=globalThis.litElementHydrateSupport)||void 0===G||G.call(globalThis,{LitElement:tt});const et=globalThis.litElementPolyfillSupport;null==et||et({LitElement:tt}),(null!==(Q=globalThis.litElementVersions)&&void 0!==Q?Q:globalThis.litElementVersions=[]).push("3.2.2");
24 | /**
25 | * @license
26 | * Copyright 2017 Google LLC
27 | * SPDX-License-Identifier: BSD-3-Clause
28 | */
29 | const it=(t,e)=>"method"===e.kind&&e.descriptor&&!("value"in e.descriptor)?{...e,finisher(i){i.createProperty(e.key,t)}}:{kind:"field",key:Symbol(),placement:"own",descriptor:{},originalKey:e.key,initializer(){"function"==typeof e.initializer&&(this[e.key]=e.initializer.call(this))},finisher(i){i.createProperty(e.key,t)}};
30 | /**
31 | * @license
32 | * Copyright 2017 Google LLC
33 | * SPDX-License-Identifier: BSD-3-Clause
34 | */function nt(t){return(e,i)=>void 0!==i?((t,e,i)=>{e.constructor.createProperty(i,t)})(t,e,i):it(t,e)
35 | /**
36 | * @license
37 | * Copyright 2017 Google LLC
38 | * SPDX-License-Identifier: BSD-3-Clause
39 | */}
40 | /**
41 | * @license
42 | * Copyright 2021 Google LLC
43 | * SPDX-License-Identifier: BSD-3-Clause
44 | */
45 | var ot,st,rt;null===(ot=window.HTMLSlotElement)||void 0===ot||ot.prototype.assignedElements,function(t){t.language="language",t.system="system",t.comma_decimal="comma_decimal",t.decimal_comma="decimal_comma",t.space_comma="space_comma",t.none="none"}(st||(st={})),function(t){t.language="language",t.system="system",t.am_pm="12",t.twenty_four="24"}(rt||(rt={}));var at=["closed","locked","off"],lt=function(t,e,i,n){n=n||{},i=null==i?{}:i;var o=new Event(e,{bubbles:void 0===n.bubbles||n.bubbles,cancelable:Boolean(n.cancelable),composed:void 0===n.composed||n.composed});return o.detail=i,t.dispatchEvent(o),o},ct=function(t){lt(window,"haptic",t)},ht=function(t,e,i,n){if(n||(n={action:"more-info"}),!n.confirmation||n.confirmation.exemptions&&n.confirmation.exemptions.some((function(t){return t.user===e.user.id}))||(ct("warning"),confirm(n.confirmation.text||"Are you sure you want to "+n.action+"?")))switch(n.action){case"more-info":(i.entity||i.camera_image)&<(t,"hass-more-info",{entityId:i.entity?i.entity:i.camera_image});break;case"navigate":n.navigation_path&&function(t,e,i){void 0===i&&(i=!1),i?history.replaceState(null,"",e):history.pushState(null,"",e),lt(window,"location-changed",{replace:i})}(0,n.navigation_path);break;case"url":n.url_path&&window.open(n.url_path);break;case"toggle":i.entity&&(function(t,e){(function(t,e,i){void 0===i&&(i=!0);var n,o=function(t){return t.substr(0,t.indexOf("."))}(e),s="group"===o?"homeassistant":o;switch(o){case"lock":n=i?"unlock":"lock";break;case"cover":n=i?"open_cover":"close_cover";break;default:n=i?"turn_on":"turn_off"}t.callService(s,n,{entity_id:e})})(t,e,at.includes(t.states[e].state))}(e,i.entity),ct("success"));break;case"call-service":if(!n.service)return void ct("failure");var o=n.service.split(".",2);e.callService(o[0],o[1],n.service_data,n.target),ct("success");break;case"fire-dom-event":lt(t,"ll-custom",n)}};function dt(t){return void 0!==t&&"none"!==t.action}const ut="button-text-card",pt="ontouchstart"in window||navigator.maxTouchPoints>0||navigator.maxTouchPoints>0;class vt extends HTMLElement{constructor(){super(),this.holdTime=500,this.held=!1,this.ripple=document.createElement("mwc-ripple")}connectedCallback(){Object.assign(this.style,{position:"absolute",width:pt?"100px":"50px",height:pt?"100px":"50px",transform:"translate(-50%, -50%)",pointerEvents:"none",zIndex:"999"}),this.appendChild(this.ripple),this.ripple.primary=!0,["touchcancel","mouseout","mouseup","touchmove","mousewheel","wheel","scroll"].forEach((t=>{document.addEventListener(t,(()=>{clearTimeout(this.timer),this.stopAnimation(),this.timer=void 0}),{passive:!0})}))}bind(t,e){if(t.actionHandler)return;t.actionHandler=!0,t.addEventListener("contextmenu",(t=>{const e=t||window.event;return e.preventDefault&&e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0,e.returnValue=!1,!1}));const i=t=>{let e,i;this.held=!1,t.touches?(e=t.touches[0].pageX,i=t.touches[0].pageY):(e=t.pageX,i=t.pageY),this.timer=window.setTimeout((()=>{this.startAnimation(e,i),this.held=!0}),this.holdTime)},n=i=>{i.preventDefault(),["touchend","touchcancel"].includes(i.type)&&void 0===this.timer||(clearTimeout(this.timer),this.stopAnimation(),this.timer=void 0,this.held?lt(t,"action",{action:"hold"}):e.hasDoubleClick?"click"===i.type&&i.detail<2||!this.dblClickTimeout?this.dblClickTimeout=window.setTimeout((()=>{this.dblClickTimeout=void 0,lt(t,"action",{action:"tap"})}),250):(clearTimeout(this.dblClickTimeout),this.dblClickTimeout=void 0,lt(t,"action",{action:"double_tap"})):lt(t,"action",{action:"tap"}))};t.addEventListener("touchstart",i,{passive:!0}),t.addEventListener("touchend",n),t.addEventListener("touchcancel",n),t.addEventListener("mousedown",i,{passive:!0}),t.addEventListener("click",n),t.addEventListener("keyup",(t=>{13===t.keyCode&&n(t)}))}startAnimation(t,e){Object.assign(this.style,{left:`${t}px`,top:`${e}px`,display:null}),this.ripple.disabled=!1,this.ripple.active=!0,this.ripple.unbounded=!0}stopAnimation(){this.ripple.active=!1,this.ripple.disabled=!0,this.style.display="none"}}const ft="action-handler-"+ut;customElements.define(ft,vt);const _t=(t,e)=>{const i=(()=>{const t=document.body;if(t.querySelector(ft))return t.querySelector(ft);const e=document.createElement(ft);return t.appendChild(e),e})();i&&i.bind(t,e)},mt=(t=>(...e)=>({_$litDirective$:t,values:e}))(class extends class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}{update(t,[e]){return _t(t.element,e),N}render(t){}});var gt;console.info(`%c ${ut.toUpperCase()} \n%c v0.6.6 `,"color: orange; font-weight: bold; background: black","color: white; font-weight: bold; background: dimgray"),window.customCards=window.customCards||[],window.customCards.push({type:ut,name:"Button Text Card",description:'Beautiful "neumorphism" card.',preview:!0});let $t=gt=class extends tt{constructor(){super(...arguments),this._hasTemplate=!1}static getStubConfig(){return{title:"Button Text Card",subtitle:"Beautiful neumorphism card",icon:"mdi:cards-heart"}}setConfig(t){if(!t||t.show_error)throw new Error("Invalid configuration.");this.config=Object.assign({name:"Button Text Card",title:"",subtitle:"",large:!1},t),this._renderedConfig=Object.assign({},this.config);for(const t of gt.templateFields){const e=gt.templateRegex.exec(this.config[t]);if(gt.templateRegex.lastIndex=0,null!==e){this._hasTemplate=!0;break}}}shouldUpdate(t){return!this.config||!this.config.entity||function(t,e,i){if(e.has("config")||i)return!0;if(t.config.entity){var n=e.get("hass");return!n||n.states[t.config.entity]!==t.hass.states[t.config.entity]}return!1}
46 | /**
47 | * @license
48 | * Copyright 2017 Google LLC
49 | * SPDX-License-Identifier: BSD-3-Clause
50 | */(this,t,this._hasTemplate)}evaluateJsTemplates(){if(this._renderedConfig&&this.config)for(const t of gt.templateFields){const e=gt.templateRegex.exec(this.config[t]);gt.templateRegex.lastIndex=0;let i=this.config[t];e&&e.length>1&&(i=this._evalTemplate(this._stateObj,e[1])),this._renderedConfig[t]=i}}render(){if(!this.config||!this.hass||!this._renderedConfig)return this._showError("Invalid configuration");this._stateObj=this.config.entity?this.hass.states[this.config.entity]:void 0,this.evaluateJsTemplates();const t=!this._inEditMode()&&!0===this._renderedConfig.hide_condition;if(this.style.setProperty("display",t?"none":""),t)return M``;if(!this.config.icon||""===this.config.icon){let t="mdi:alert-circle";if(this.config.entity){const e=this.hass.states[this.config.entity].attributes.icon;e&&(t=e)}this.setConfig(Object.assign(Object.assign({},this.config),{icon:t}))}return this._renderedConfig.background_color&&this.style.setProperty("--ha-card-background",this._renderedConfig.background_color),this._renderedConfig.font_color&&this.style.setProperty("--primary-text-color",this._renderedConfig.font_color),this._renderedConfig.icon_size&&this.style.setProperty("--mdc-icon-size",this._renderedConfig.icon_size+"px"),this._configureIconColor(),M`
51 |
57 |
58 |
59 |
63 |
64 |
65 | ${""===this._renderedConfig.title&&""===this._renderedConfig.subtitle?M``:M`
66 |
67 |
${this._renderedConfig.title}
68 |
69 | ${this._renderedConfig.subtitle}
70 |
71 |
72 | `}
73 |
74 |
75 | `}_handleAction(t){this.hass&&this.config&&t.detail.action&&function(t,e,i,n){var o;"double_tap"===n&&i.double_tap_action?o=i.double_tap_action:"hold"===n&&i.hold_action?o=i.hold_action:"tap"===n&&i.tap_action&&(o=i.tap_action),ht(t,e,i,o)}(this,this.hass,this.config,t.detail.action)}_showError(t){const e=document.createElement("hui-error-card");return e.setConfig({type:"error",error:t,origConfig:this.config}),M`
76 | ${e}
77 | `}_configureIconColor(){var t;if(!this._renderedConfig)return;const e=this._renderedConfig;e.icon_color&&"auto"!==e.icon_color?this.style.setProperty("--icon-color",e.icon_color):"auto"!==e.icon_color||"on"!==(null===(t=this._stateObj)||void 0===t?void 0:t.state)?e.icon_color||!e.font_color?this.style.setProperty("--icon-color","var(--primary-text-color)"):this.style.setProperty("--icon-color",e.font_color):this.style.setProperty("--icon-color","var(--paper-item-icon-active-color)")}_inEditMode(){var t,e,i,n,o,s,r,a,l,c;return(null===(c=null===(l=null===(a=null===(r=null===(s=null===(o=null===(n=null===(i=null===(e=null===(t=null===document||void 0===document?void 0:document.querySelector("home-assistant"))||void 0===t?void 0:t.shadowRoot)||void 0===e?void 0:e.querySelector("home-assistant-main"))||void 0===i?void 0:i.shadowRoot)||void 0===n?void 0:n.querySelector("ha-drawer partial-panel-resolver ha-panel-lovelace"))||void 0===o?void 0:o.shadowRoot)||void 0===s?void 0:s.querySelector("hui-root"))||void 0===r?void 0:r.shadowRoot)||void 0===a?void 0:a.firstElementChild)||void 0===l?void 0:l.classList)||void 0===c?void 0:c.contains("edit-mode"))||!1}_evalTemplate(t,e){return this.hass?new Function("states","entity","user","hass","variables",`'use strict'; ${e}`).call(this,this.hass.states,t,this.hass.user,this.hass,[]):""}static get styles(){return r`
78 | @-moz-keyframes spin {
79 | 100% {
80 | -moz-transform: rotate(360deg);
81 | }
82 | }
83 | @-webkit-keyframes spin {
84 | 100% {
85 | -webkit-transform: rotate(360deg);
86 | }
87 | }
88 | @keyframes spin {
89 | 100% {
90 | -webkit-transform: rotate(360deg);
91 | transform: rotate(360deg);
92 | }
93 | }
94 |
95 | ha-card {
96 | background-color: rgba(255, 255, 255, 0);
97 | box-shadow: 2px 2px rgba(0, 0, 0, 0);
98 | padding: 16px;
99 | outline: none;
100 | border: none;
101 | }
102 |
103 | ha-card.edit-preview {
104 | opacity: 0.5;
105 | }
106 |
107 | .warning {
108 | display: block;
109 | color: black;
110 | background-color: #fce588;
111 | padding: 8px;
112 | }
113 |
114 | .flex-container {
115 | width: 100%;
116 | display: flex;
117 | align-items: center;
118 | color: rgb(99, 107, 116);
119 | }
120 |
121 | .card-look {
122 | border-radius: 16px;
123 | background: var(--ha-card-background,
124 | var(--card-background-color, white));
125 | box-shadow: var(--ha-card-box-shadow,
126 | 9px 9px 17px rgba(0, 0, 0, 0.14),
127 | -9px -9px 17px rgba(0, 0, 0, 0.12));
128 | }
129 |
130 | .icon-container {
131 | width: 85px;
132 | height: 85px;
133 | display: flex;
134 | align-items: center;
135 | justify-content: center;
136 | text-align: center;
137 | }
138 |
139 | .text-container {
140 | color: var(--primary-text-color);
141 | margin-left: 24px;
142 | }
143 |
144 | .icon-container ha-icon {
145 | color: var(--icon-color);
146 | }
147 |
148 | .icon-container ha-icon.spin {
149 | -webkit-animation: spin 4s linear infinite;
150 | -moz-animation: spin 4s linear infinite;
151 | animation: spin 4s linear infinite;
152 | }
153 |
154 | .text-container {
155 | flex: 1;
156 | }
157 | .text-container h1 {
158 | font-size: 21px;
159 | font-weight: 500;
160 | margin: 0;
161 | }
162 | .text-container h1 + p {
163 | margin-top: 10px;
164 | }
165 | .text-container p {
166 | font-size: 15px;
167 | font-weight: 400;
168 | margin: 0;
169 | }
170 |
171 | .text-container p.hidden {
172 | display: none;
173 | }
174 | `}};$t.templateFields=["title","subtitle","icon","icon_size","icon_animation","hide_condition","font_color","background_color","shadow_color","large","spin","icon_color"],$t.templateRegex=new RegExp("\\[\\[\\[([^]*)\\]\\]\\]","gm"),t([function(t){return nt({...t,state:!0})}()],$t.prototype,"config",void 0),t([nt({attribute:!1})],$t.prototype,"hass",void 0),t([nt()],$t.prototype,"_hasTemplate",void 0),t([nt()],$t.prototype,"_stateObj",void 0),$t=gt=t([(t=>e=>"function"==typeof e?((t,e)=>(customElements.define(t,e),e))(t,e):((t,e)=>{const{kind:i,elements:n}=e;return{kind:i,elements:n,finisher(e){customElements.define(t,e)}}})(t,e))(ut)],$t);export{$t as BoilerplateCard};
175 | //# sourceMappingURL=button-text-card.js.map
176 |
--------------------------------------------------------------------------------
/dist/button-text-card.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"button-text-card.js","sources":["../node_modules/tslib/tslib.es6.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/lit-html/lit-html.js","../node_modules/lit-element/lit-element.js","../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../node_modules/@lit/reactive-element/decorators/query-assigned-elements.js","../node_modules/custom-card-helpers/dist/index.m.js","../node_modules/lit-html/directive.js","../node_modules/@lit/reactive-element/decorators/state.js"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=window,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),n=new WeakMap;class o{constructor(t,e,n){if(this._$cssResult$=!0,n!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=n.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&n.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new o(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const n=1===t.length?t[0]:e.reduce(((e,s,n)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[n+1]),t[0]);return new o(n,t,s)},S=(s,n)=>{e?s.adoptedStyleSheets=n.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):n.forEach((e=>{const n=document.createElement(\"style\"),o=t.litNonce;void 0!==o&&n.setAttribute(\"nonce\",o),n.textContent=e.cssText,s.appendChild(n)}))},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{o as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as i}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */var s;const e=window,r=e.trustedTypes,h=r?r.emptyScript:\"\",o=e.reactiveElementPolyfillSupport,n={toAttribute(t,i){switch(i){case Boolean:t=t?h:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,i){let s=t;switch(i){case Boolean:s=null!==t;break;case Number:s=null===t?null:Number(t);break;case Object:case Array:try{s=JSON.parse(t)}catch(t){s=null}}return s}},a=(t,i)=>i!==t&&(i==i||t==t),l={attribute:!0,type:String,converter:n,reflect:!1,hasChanged:a};class d extends HTMLElement{constructor(){super(),this._$Ei=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$El=null,this.u()}static addInitializer(t){var i;null!==(i=this.h)&&void 0!==i||(this.h=[]),this.h.push(t)}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((i,s)=>{const e=this._$Ep(s,i);void 0!==e&&(this._$Ev.set(e,s),t.push(e))})),t}static createProperty(t,i=l){if(i.state&&(i.attribute=!1),this.finalize(),this.elementProperties.set(t,i),!i.noAccessor&&!this.prototype.hasOwnProperty(t)){const s=\"symbol\"==typeof t?Symbol():\"__\"+t,e=this.getPropertyDescriptor(t,s,i);void 0!==e&&Object.defineProperty(this.prototype,t,e)}}static getPropertyDescriptor(t,i,s){return{get(){return this[i]},set(e){const r=this[t];this[i]=e,this.requestUpdate(t,r,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)||l}static finalize(){if(this.hasOwnProperty(\"finalized\"))return!1;this.finalized=!0;const t=Object.getPrototypeOf(this);if(t.finalize(),this.elementProperties=new Map(t.elementProperties),this._$Ev=new Map,this.hasOwnProperty(\"properties\")){const t=this.properties,i=[...Object.getOwnPropertyNames(t),...Object.getOwnPropertySymbols(t)];for(const s of i)this.createProperty(s,t[s])}return this.elementStyles=this.finalizeStyles(this.styles),!0}static finalizeStyles(i){const s=[];if(Array.isArray(i)){const e=new Set(i.flat(1/0).reverse());for(const i of e)s.unshift(t(i))}else void 0!==i&&s.push(t(i));return s}static _$Ep(t,i){const s=i.attribute;return!1===s?void 0:\"string\"==typeof s?s:\"string\"==typeof t?t.toLowerCase():void 0}u(){var t;this._$E_=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$Eg(),this.requestUpdate(),null===(t=this.constructor.h)||void 0===t||t.forEach((t=>t(this)))}addController(t){var i,s;(null!==(i=this._$ES)&&void 0!==i?i:this._$ES=[]).push(t),void 0!==this.renderRoot&&this.isConnected&&(null===(s=t.hostConnected)||void 0===s||s.call(t))}removeController(t){var i;null===(i=this._$ES)||void 0===i||i.splice(this._$ES.indexOf(t)>>>0,1)}_$Eg(){this.constructor.elementProperties.forEach(((t,i)=>{this.hasOwnProperty(i)&&(this._$Ei.set(i,this[i]),delete this[i])}))}createRenderRoot(){var t;const s=null!==(t=this.shadowRoot)&&void 0!==t?t:this.attachShadow(this.constructor.shadowRootOptions);return i(s,this.constructor.elementStyles),s}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostConnected)||void 0===i?void 0:i.call(t)}))}enableUpdating(t){}disconnectedCallback(){var t;null===(t=this._$ES)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostDisconnected)||void 0===i?void 0:i.call(t)}))}attributeChangedCallback(t,i,s){this._$AK(t,s)}_$EO(t,i,s=l){var e;const r=this.constructor._$Ep(t,s);if(void 0!==r&&!0===s.reflect){const h=(void 0!==(null===(e=s.converter)||void 0===e?void 0:e.toAttribute)?s.converter:n).toAttribute(i,s.type);this._$El=t,null==h?this.removeAttribute(r):this.setAttribute(r,h),this._$El=null}}_$AK(t,i){var s;const e=this.constructor,r=e._$Ev.get(t);if(void 0!==r&&this._$El!==r){const t=e.getPropertyOptions(r),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==(null===(s=t.converter)||void 0===s?void 0:s.fromAttribute)?t.converter:n;this._$El=r,this[r]=h.fromAttribute(i,t.type),this._$El=null}}requestUpdate(t,i,s){let e=!0;void 0!==t&&(((s=s||this.constructor.getPropertyOptions(t)).hasChanged||a)(this[t],i)?(this._$AL.has(t)||this._$AL.set(t,i),!0===s.reflect&&this._$El!==t&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(t,s))):e=!1),!this.isUpdatePending&&e&&(this._$E_=this._$Ej())}async _$Ej(){this.isUpdatePending=!0;try{await this._$E_}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){var t;if(!this.isUpdatePending)return;this.hasUpdated,this._$Ei&&(this._$Ei.forEach(((t,i)=>this[i]=t)),this._$Ei=void 0);let i=!1;const s=this._$AL;try{i=this.shouldUpdate(s),i?(this.willUpdate(s),null===(t=this._$ES)||void 0===t||t.forEach((t=>{var i;return null===(i=t.hostUpdate)||void 0===i?void 0:i.call(t)})),this.update(s)):this._$Ek()}catch(t){throw i=!1,this._$Ek(),t}i&&this._$AE(s)}willUpdate(t){}_$AE(t){var i;null===(i=this._$ES)||void 0===i||i.forEach((t=>{var i;return null===(i=t.hostUpdated)||void 0===i?void 0:i.call(t)})),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$Ek(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$E_}shouldUpdate(t){return!0}update(t){void 0!==this._$EC&&(this._$EC.forEach(((t,i)=>this._$EO(i,this[i],t))),this._$EC=void 0),this._$Ek()}updated(t){}firstUpdated(t){}}d.finalized=!0,d.elementProperties=new Map,d.elementStyles=[],d.shadowRootOptions={mode:\"open\"},null==o||o({ReactiveElement:d}),(null!==(s=e.reactiveElementVersions)&&void 0!==s?s:e.reactiveElementVersions=[]).push(\"1.4.1\");export{d as ReactiveElement,n as defaultConverter,a as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nvar t;const i=window,s=i.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,o=`lit$${(Math.random()+\"\").slice(9)}$`,n=\"?\"+o,l=`<${n}>`,h=document,r=(t=\"\")=>h.createComment(t),d=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,c=t=>u(t)||\"function\"==typeof(null==t?void 0:t[Symbol.iterator]),v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,a=/-->/g,f=/>/g,_=RegExp(\">|[ \\t\\n\\f\\r](?:([^\\\\s\\\"'>=/]+)([ \\t\\n\\f\\r]*=[ \\t\\n\\f\\r]*(?:[^ \\t\\n\\f\\r\\\"'`<>=]|(\\\"|')|))|$)\",\"g\"),m=/'/g,p=/\"/g,$=/^(?:script|style|textarea|title)$/i,g=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),y=g(1),w=g(2),x=Symbol.for(\"lit-noChange\"),b=Symbol.for(\"lit-nothing\"),T=new WeakMap,A=(t,i,s)=>{var e,o;const n=null!==(e=null==s?void 0:s.renderBefore)&&void 0!==e?e:i;let l=n._$litPart$;if(void 0===l){const t=null!==(o=null==s?void 0:s.renderBefore)&&void 0!==o?o:null;n._$litPart$=l=new S(i.insertBefore(r(),t),t,void 0,null!=s?s:{})}return l._$AI(t),l},E=h.createTreeWalker(h,129,null,!1),C=(t,i)=>{const s=t.length-1,n=[];let h,r=2===i?\"\":\"\",d=v;for(let i=0;i\"===u[0]?(d=null!=h?h:v,c=-1):void 0===u[1]?c=-2:(c=d.lastIndex-u[2].length,e=u[1],d=void 0===u[3]?_:'\"'===u[3]?p:m):d===p||d===m?d=_:d===a||d===f?d=v:(d=_,h=void 0);const y=d===_&&t[i+1].startsWith(\"/>\")?\" \":\"\";r+=d===v?s+l:c>=0?(n.push(e),s.slice(0,c)+\"$lit$\"+s.slice(c)+o+y):s+o+(-2===c?(n.push(void 0),i):y)}const u=r+(t[s]||\">\")+(2===i?\" \":\"\");if(!Array.isArray(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return[void 0!==e?e.createHTML(u):u,n]};class P{constructor({strings:t,_$litType$:i},e){let l;this.parts=[];let h=0,d=0;const u=t.length-1,c=this.parts,[v,a]=C(t,i);if(this.el=P.createElement(v,e),E.currentNode=this.el.content,2===i){const t=this.el.content,i=t.firstChild;i.remove(),t.append(...i.childNodes)}for(;null!==(l=E.nextNode())&&c.length0){l.textContent=s?s.emptyScript:\"\";for(let s=0;s2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=b}get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}_$AI(t,i=this,s,e){const o=this.strings;let n=!1;if(void 0===o)t=V(this,t,i,0),n=!d(t)||t!==this._$AH&&t!==x,n&&(this._$AH=t);else{const e=t;let l,h;for(t=o[0],l=0;l{t._$AK(e,i)},_$AL:t=>t._$AL};(null!==(o=globalThis.litElementVersions)&&void 0!==o?o:globalThis.litElementVersions=[]).push(\"3.2.2\");export{s as LitElement,r as UpdatingElement,h as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst e=e=>n=>\"function\"==typeof n?((e,n)=>(customElements.define(e,n),n))(e,n):((e,n)=>{const{kind:t,elements:s}=n;return{kind:t,elements:s,finisher(n){customElements.define(e,n)}}})(e,n);export{e as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst i=(i,e)=>\"method\"===e.kind&&e.descriptor&&!(\"value\"in e.descriptor)?{...e,finisher(n){n.createProperty(e.key,i)}}:{kind:\"field\",key:Symbol(),placement:\"own\",descriptor:{},originalKey:e.key,initializer(){\"function\"==typeof e.initializer&&(this[e.key]=e.initializer.call(this))},finisher(n){n.createProperty(e.key,i)}};function e(e){return(n,t)=>void 0!==t?((i,e,n)=>{e.constructor.createProperty(n,i)})(e,n,t):i(e,n)}export{e as property};\n//# sourceMappingURL=property.js.map\n","import{decorateProperty as o}from\"./base.js\";\n/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */var n;const e=null!=(null===(n=window.HTMLSlotElement)||void 0===n?void 0:n.prototype.assignedElements)?(o,n)=>o.assignedElements(n):(o,n)=>o.assignedNodes(n).filter((o=>o.nodeType===Node.ELEMENT_NODE));function l(n){const{slot:l,selector:t}=null!=n?n:{};return o({descriptor:o=>({get(){var o;const r=\"slot\"+(l?`[name=${l}]`:\":not([name])\"),i=null===(o=this.renderRoot)||void 0===o?void 0:o.querySelector(r),s=null!=i?e(i,n):[];return t?s.filter((o=>o.matches(t))):s},enumerable:!0,configurable:!0})})}export{l as queryAssignedElements};\n//# sourceMappingURL=query-assigned-elements.js.map\n","import{selectUnit as e}from\"@formatjs/intl-utils\";var t,r,n=function(e,t){return i(t).format(e)},i=function(e){return new Intl.DateTimeFormat(e.language,{weekday:\"long\",month:\"long\",day:\"numeric\"})},a=function(e,t){return o(t).format(e)},o=function(e){return new Intl.DateTimeFormat(e.language,{year:\"numeric\",month:\"long\",day:\"numeric\"})},u=function(e,t){return c(t).format(e)},c=function(e){return new Intl.DateTimeFormat(e.language,{year:\"numeric\",month:\"numeric\",day:\"numeric\"})},m=function(e,t){return s(t).format(e)},s=function(e){return new Intl.DateTimeFormat(e.language,{day:\"numeric\",month:\"short\"})},l=function(e,t){return d(t).format(e)},d=function(e){return new Intl.DateTimeFormat(e.language,{month:\"long\",year:\"numeric\"})},f=function(e,t){return g(t).format(e)},g=function(e){return new Intl.DateTimeFormat(e.language,{month:\"long\"})},p=function(e,t){return h(t).format(e)},h=function(e){return new Intl.DateTimeFormat(e.language,{year:\"numeric\"})};!function(e){e.language=\"language\",e.system=\"system\",e.comma_decimal=\"comma_decimal\",e.decimal_comma=\"decimal_comma\",e.space_comma=\"space_comma\",e.none=\"none\"}(t||(t={})),function(e){e.language=\"language\",e.system=\"system\",e.am_pm=\"12\",e.twenty_four=\"24\"}(r||(r={}));var b=function(e){if(e.time_format===r.language||e.time_format===r.system){var t=e.time_format===r.language?e.language:void 0,n=(new Date).toLocaleString(t);return n.includes(\"AM\")||n.includes(\"PM\")}return e.time_format===r.am_pm},v=function(e,t){return _(t).format(e)},_=function(e){return new Intl.DateTimeFormat(e.language,{year:\"numeric\",month:\"long\",day:\"numeric\",hour:b(e)?\"numeric\":\"2-digit\",minute:\"2-digit\",hour12:b(e)})},y=function(e,t){return w(t).format(e)},w=function(e){return new Intl.DateTimeFormat(e.language,{year:\"numeric\",month:\"long\",day:\"numeric\",hour:b(e)?\"numeric\":\"2-digit\",minute:\"2-digit\",second:\"2-digit\",hour12:b(e)})},k=function(e,t){return x(t).format(e)},x=function(e){return new Intl.DateTimeFormat(e.language,{year:\"numeric\",month:\"numeric\",day:\"numeric\",hour:\"numeric\",minute:\"2-digit\",hour12:b(e)})},D=function(e,t){return S(t).format(e)},S=function(e){return new Intl.DateTimeFormat(e.language,{hour:\"numeric\",minute:\"2-digit\",hour12:b(e)})},F=function(e,t){return T(t).format(e)},T=function(e){return new Intl.DateTimeFormat(e.language,{hour:b(e)?\"numeric\":\"2-digit\",minute:\"2-digit\",second:\"2-digit\",hour12:b(e)})},I=function(e,t){return N(t).format(e)},N=function(e){return new Intl.DateTimeFormat(e.language,{hour:b(e)?\"numeric\":\"2-digit\",minute:\"2-digit\",second:\"2-digit\",hour12:b(e)})},M=function(t,r,n,i){void 0===i&&(i=!0);var a=e(t,n);return i?function(e){return new Intl.RelativeTimeFormat(e.language,{numeric:\"auto\"})}(r).format(a.value,a.unit):Intl.NumberFormat(r.language,{style:\"unit\",unit:a.unit,unitDisplay:\"long\"}).format(Math.abs(a.value))};function C(e){var t,r=3600*(t=e.attributes.remaining.split(\":\").map(Number))[0]+60*t[1]+t[2];if(\"active\"===e.state){var n=(new Date).getTime(),i=new Date(e.last_changed).getTime();r=Math.max(r-(n-i)/1e3,0)}return r}function O(){return(O=Object.assign||function(e){for(var t=1;t-1?e.split(\".\")[1].length:0;r.minimumFractionDigits=n,r.maximumFractionDigits=n}return r},W=function(e,t,r,n){var i=void 0!==n?n:t.state;if(\"unknown\"===i||\"unavailable\"===i)return e(\"state.default.\"+i);if(P(t)){if(\"monetary\"===t.attributes.device_class)try{return H(i,r,{style:\"currency\",currency:t.attributes.unit_of_measurement})}catch(e){}return H(i,r)+(t.attributes.unit_of_measurement?\" \"+t.attributes.unit_of_measurement:\"\")}var o=L(t);if(\"input_datetime\"===o){var u;if(void 0===n)return t.attributes.has_date&&t.attributes.has_time?(u=new Date(t.attributes.year,t.attributes.month-1,t.attributes.day,t.attributes.hour,t.attributes.minute),v(u,r)):t.attributes.has_date?(u=new Date(t.attributes.year,t.attributes.month-1,t.attributes.day),a(u,r)):t.attributes.has_time?((u=new Date).setHours(t.attributes.hour,t.attributes.minute),D(u,r)):t.state;try{var c=n.split(\" \");if(2===c.length)return v(new Date(c.join(\"T\")),r);if(1===c.length){if(n.includes(\"-\"))return a(new Date(n+\"T00:00\"),r);if(n.includes(\":\")){var m=new Date;return D(new Date(m.toISOString().split(\"T\")[0]+\"T\"+n),r)}}return n}catch(e){return n}}return\"humidifier\"===o&&\"on\"===i&&t.attributes.humidity?t.attributes.humidity+\" %\":\"counter\"===o||\"number\"===o||\"input_number\"===o?H(i,r):t.attributes.device_class&&e(\"component.\"+o+\".state.\"+t.attributes.device_class+\".\"+i)||e(\"component.\"+o+\".state._.\"+i)||i},G=\"mdi:bookmark\",J=\"lovelace\",K=[\"climate\",\"cover\",\"configurator\",\"input_select\",\"input_number\",\"input_text\",\"lock\",\"media_player\",\"scene\",\"script\",\"timer\",\"vacuum\",\"water_heater\",\"weblink\"],Q=[\"alarm_control_panel\",\"automation\",\"camera\",\"climate\",\"configurator\",\"cover\",\"fan\",\"group\",\"history_graph\",\"input_datetime\",\"light\",\"lock\",\"media_player\",\"script\",\"sun\",\"updater\",\"vacuum\",\"water_heater\",\"weather\"],X=[\"input_number\",\"input_select\",\"input_text\",\"scene\",\"weblink\"],Y=[\"camera\",\"configurator\",\"history_graph\",\"scene\"],Z=[\"closed\",\"locked\",\"off\"],$=new Set([\"fan\",\"input_boolean\",\"light\",\"switch\",\"group\",\"automation\"]),ee=\"°C\",te=\"°F\",re=\"group.default_view\",ne=function(e,t,r,n){n=n||{},r=null==r?{}:r;var i=new Event(t,{bubbles:void 0===n.bubbles||n.bubbles,cancelable:Boolean(n.cancelable),composed:void 0===n.composed||n.composed});return i.detail=r,e.dispatchEvent(i),i},ie=new Set([\"call-service\",\"divider\",\"section\",\"weblink\",\"cast\",\"select\"]),ae={alert:\"toggle\",automation:\"toggle\",climate:\"climate\",cover:\"cover\",fan:\"toggle\",group:\"group\",input_boolean:\"toggle\",input_number:\"input-number\",input_select:\"input-select\",input_text:\"input-text\",light:\"toggle\",lock:\"lock\",media_player:\"media-player\",remote:\"toggle\",scene:\"scene\",script:\"script\",sensor:\"sensor\",timer:\"timer\",switch:\"toggle\",vacuum:\"toggle\",water_heater:\"climate\",input_datetime:\"input-datetime\"},oe=function(e,t){void 0===t&&(t=!1);var r=function(e,t){return n(\"hui-error-card\",{type:\"error\",error:e,config:t})},n=function(e,t){var n=window.document.createElement(e);try{if(!n.setConfig)return;n.setConfig(t)}catch(n){return console.error(e,n),r(n.message,t)}return n};if(!e||\"object\"!=typeof e||!t&&!e.type)return r(\"No type defined\",e);var i=e.type;if(i&&i.startsWith(\"custom:\"))i=i.substr(\"custom:\".length);else if(t)if(ie.has(i))i=\"hui-\"+i+\"-row\";else{if(!e.entity)return r(\"Invalid config given.\",e);var a=e.entity.split(\".\",1)[0];i=\"hui-\"+(ae[a]||\"text\")+\"-entity-row\"}else i=\"hui-\"+i+\"-card\";if(customElements.get(i))return n(i,e);var o=r(\"Custom element doesn't exist: \"+e.type+\".\",e);o.style.display=\"None\";var u=setTimeout(function(){o.style.display=\"\"},2e3);return customElements.whenDefined(e.type).then(function(){clearTimeout(u),ne(o,\"ll-rebuild\",{},o)}),o},ue=function(e,t,r){var n;return void 0===r&&(r=!1),function(){var i=[].slice.call(arguments),a=this,o=function(){n=null,r||e.apply(a,i)},u=r&&!n;clearTimeout(n),n=setTimeout(o,t),u&&e.apply(a,i)}},ce={alert:\"mdi:alert\",automation:\"mdi:playlist-play\",calendar:\"mdi:calendar\",camera:\"mdi:video\",climate:\"mdi:thermostat\",configurator:\"mdi:settings\",conversation:\"mdi:text-to-speech\",device_tracker:\"mdi:account\",fan:\"mdi:fan\",group:\"mdi:google-circles-communities\",history_graph:\"mdi:chart-line\",homeassistant:\"mdi:home-assistant\",homekit:\"mdi:home-automation\",image_processing:\"mdi:image-filter-frames\",input_boolean:\"mdi:drawing\",input_datetime:\"mdi:calendar-clock\",input_number:\"mdi:ray-vertex\",input_select:\"mdi:format-list-bulleted\",input_text:\"mdi:textbox\",light:\"mdi:lightbulb\",mailbox:\"mdi:mailbox\",notify:\"mdi:comment-alert\",person:\"mdi:account\",plant:\"mdi:flower\",proximity:\"mdi:apple-safari\",remote:\"mdi:remote\",scene:\"mdi:google-pages\",script:\"mdi:file-document\",sensor:\"mdi:eye\",simple_alarm:\"mdi:bell\",sun:\"mdi:white-balance-sunny\",switch:\"mdi:flash\",timer:\"mdi:timer\",updater:\"mdi:cloud-upload\",vacuum:\"mdi:robot-vacuum\",water_heater:\"mdi:thermometer\",weblink:\"mdi:open-in-new\"};function me(e,t){if(e in ce)return ce[e];switch(e){case\"alarm_control_panel\":switch(t){case\"armed_home\":return\"mdi:bell-plus\";case\"armed_night\":return\"mdi:bell-sleep\";case\"disarmed\":return\"mdi:bell-outline\";case\"triggered\":return\"mdi:bell-ring\";default:return\"mdi:bell\"}case\"binary_sensor\":return t&&\"off\"===t?\"mdi:radiobox-blank\":\"mdi:checkbox-marked-circle\";case\"cover\":return\"closed\"===t?\"mdi:window-closed\":\"mdi:window-open\";case\"lock\":return t&&\"unlocked\"===t?\"mdi:lock-open\":\"mdi:lock\";case\"media_player\":return t&&\"off\"!==t&&\"idle\"!==t?\"mdi:cast-connected\":\"mdi:cast\";case\"zwave\":switch(t){case\"dead\":return\"mdi:emoticon-dead\";case\"sleeping\":return\"mdi:sleep\";case\"initializing\":return\"mdi:timer-sand\";default:return\"mdi:z-wave\"}default:return console.warn(\"Unable to find icon for domain \"+e+\" (\"+t+\")\"),\"mdi:bookmark\"}}var se=function(e,t){var r=t.value||t,n=t.attribute?e.attributes[t.attribute]:e.state;switch(t.operator||\"==\"){case\"==\":return n===r;case\"<=\":return n<=r;case\"<\":return n=\":return n>=r;case\">\":return n>r;case\"!=\":return n!==r;case\"regex\":return n.match(r);default:return!1}},le=function(e){ne(window,\"haptic\",e)},de=function(e,t,r){void 0===r&&(r=!1),r?history.replaceState(null,\"\",t):history.pushState(null,\"\",t),ne(window,\"location-changed\",{replace:r})},fe=function(e,t,r){void 0===r&&(r=!0);var n,i=E(t),a=\"group\"===i?\"homeassistant\":i;switch(i){case\"lock\":n=r?\"unlock\":\"lock\";break;case\"cover\":n=r?\"open_cover\":\"close_cover\";break;default:n=r?\"turn_on\":\"turn_off\"}return e.callService(a,n,{entity_id:t})},ge=function(e,t){var r=Z.includes(e.states[t].state);return fe(e,t,r)},pe=function(e,t,r,n){if(n||(n={action:\"more-info\"}),!n.confirmation||n.confirmation.exemptions&&n.confirmation.exemptions.some(function(e){return e.user===t.user.id})||(le(\"warning\"),confirm(n.confirmation.text||\"Are you sure you want to \"+n.action+\"?\")))switch(n.action){case\"more-info\":(r.entity||r.camera_image)&&ne(e,\"hass-more-info\",{entityId:r.entity?r.entity:r.camera_image});break;case\"navigate\":n.navigation_path&&de(0,n.navigation_path);break;case\"url\":n.url_path&&window.open(n.url_path);break;case\"toggle\":r.entity&&(ge(t,r.entity),le(\"success\"));break;case\"call-service\":if(!n.service)return void le(\"failure\");var i=n.service.split(\".\",2);t.callService(i[0],i[1],n.service_data,n.target),le(\"success\");break;case\"fire-dom-event\":ne(e,\"ll-custom\",n)}},he=function(e,t,r,n){var i;\"double_tap\"===n&&r.double_tap_action?i=r.double_tap_action:\"hold\"===n&&r.hold_action?i=r.hold_action:\"tap\"===n&&r.tap_action&&(i=r.tap_action),pe(e,t,r,i)},be=function(e,t,r,n,i){var a;if(i&&r.double_tap_action?a=r.double_tap_action:n&&r.hold_action?a=r.hold_action:!n&&r.tap_action&&(a=r.tap_action),a||(a={action:\"more-info\"}),!a.confirmation||a.confirmation.exemptions&&a.confirmation.exemptions.some(function(e){return e.user===t.user.id})||confirm(a.confirmation.text||\"Are you sure you want to \"+a.action+\"?\"))switch(a.action){case\"more-info\":(a.entity||r.entity||r.camera_image)&&(ne(e,\"hass-more-info\",{entityId:a.entity?a.entity:r.entity?r.entity:r.camera_image}),a.haptic&&le(a.haptic));break;case\"navigate\":a.navigation_path&&(de(0,a.navigation_path),a.haptic&&le(a.haptic));break;case\"url\":a.url_path&&window.open(a.url_path),a.haptic&&le(a.haptic);break;case\"toggle\":r.entity&&(ge(t,r.entity),a.haptic&&le(a.haptic));break;case\"call-service\":if(!a.service)return;var o=a.service.split(\".\",2),u=o[0],c=o[1],m=O({},a.service_data);\"entity\"===m.entity_id&&(m.entity_id=r.entity),t.callService(u,c,m,a.target),a.haptic&&le(a.haptic);break;case\"fire-dom-event\":ne(e,\"ll-custom\",a),a.haptic&&le(a.haptic)}};function ve(e){return void 0!==e&&\"none\"!==e.action}function _e(e,t,r){if(t.has(\"config\")||r)return!0;if(e.config.entity){var n=t.get(\"hass\");return!n||n.states[e.config.entity]!==e.hass.states[e.config.entity]}return!1}function ye(e){return void 0!==e&&\"none\"!==e.action}var we=function(e,t,r){void 0===r&&(r=!0);var n={};t.forEach(function(t){if(Z.includes(e.states[t].state)===r){var i=E(t),a=[\"cover\",\"lock\"].includes(i)?i:\"homeassistant\";a in n||(n[a]=[]),n[a].push(t)}}),Object.keys(n).forEach(function(t){var i;switch(t){case\"lock\":i=r?\"unlock\":\"lock\";break;case\"cover\":i=r?\"open_cover\":\"close_cover\";break;default:i=r?\"turn_on\":\"turn_off\"}e.callService(t,i,{entity_id:n[t]})})},ke=function(){var e=document.querySelector(\"home-assistant\");if(e=(e=(e=(e=(e=(e=(e=(e=e&&e.shadowRoot)&&e.querySelector(\"home-assistant-main\"))&&e.shadowRoot)&&e.querySelector(\"app-drawer-layout partial-panel-resolver\"))&&e.shadowRoot||e)&&e.querySelector(\"ha-panel-lovelace\"))&&e.shadowRoot)&&e.querySelector(\"hui-root\")){var t=e.lovelace;return t.current_view=e.___curView,t}return null},xe={humidity:\"mdi:water-percent\",illuminance:\"mdi:brightness-5\",temperature:\"mdi:thermometer\",pressure:\"mdi:gauge\",power:\"mdi:flash\",signal_strength:\"mdi:wifi\"},De={binary_sensor:function(e,t){var r=\"off\"===e;switch(null==t?void 0:t.attributes.device_class){case\"battery\":return r?\"mdi:battery\":\"mdi:battery-outline\";case\"battery_charging\":return r?\"mdi:battery\":\"mdi:battery-charging\";case\"cold\":return r?\"mdi:thermometer\":\"mdi:snowflake\";case\"connectivity\":return r?\"mdi:server-network-off\":\"mdi:server-network\";case\"door\":return r?\"mdi:door-closed\":\"mdi:door-open\";case\"garage_door\":return r?\"mdi:garage\":\"mdi:garage-open\";case\"power\":return r?\"mdi:power-plug-off\":\"mdi:power-plug\";case\"gas\":case\"problem\":case\"safety\":case\"tamper\":return r?\"mdi:check-circle\":\"mdi:alert-circle\";case\"smoke\":return r?\"mdi:check-circle\":\"mdi:smoke\";case\"heat\":return r?\"mdi:thermometer\":\"mdi:fire\";case\"light\":return r?\"mdi:brightness-5\":\"mdi:brightness-7\";case\"lock\":return r?\"mdi:lock\":\"mdi:lock-open\";case\"moisture\":return r?\"mdi:water-off\":\"mdi:water\";case\"motion\":return r?\"mdi:walk\":\"mdi:run\";case\"occupancy\":return r?\"mdi:home-outline\":\"mdi:home\";case\"opening\":return r?\"mdi:square\":\"mdi:square-outline\";case\"plug\":return r?\"mdi:power-plug-off\":\"mdi:power-plug\";case\"presence\":return r?\"mdi:home-outline\":\"mdi:home\";case\"running\":return r?\"mdi:stop\":\"mdi:play\";case\"sound\":return r?\"mdi:music-note-off\":\"mdi:music-note\";case\"update\":return r?\"mdi:package\":\"mdi:package-up\";case\"vibration\":return r?\"mdi:crop-portrait\":\"mdi:vibrate\";case\"window\":return r?\"mdi:window-closed\":\"mdi:window-open\";default:return r?\"mdi:radiobox-blank\":\"mdi:checkbox-marked-circle\"}},cover:function(e){var t=\"closed\"!==e.state;switch(e.attributes.device_class){case\"garage\":return t?\"mdi:garage-open\":\"mdi:garage\";case\"door\":return t?\"mdi:door-open\":\"mdi:door-closed\";case\"shutter\":return t?\"mdi:window-shutter-open\":\"mdi:window-shutter\";case\"blind\":return t?\"mdi:blinds-open\":\"mdi:blinds\";case\"window\":return t?\"mdi:window-open\":\"mdi:window-closed\";default:return me(\"cover\",e.state)}},sensor:function(e){var t=e.attributes.device_class;if(t&&t in xe)return xe[t];if(\"battery\"===t){var r=Number(e.state);if(isNaN(r))return\"mdi:battery-unknown\";var n=10*Math.round(r/10);return n>=100?\"mdi:battery\":n<=0?\"mdi:battery-alert\":\"hass:battery-\"+n}var i=e.attributes.unit_of_measurement;return\"°C\"===i||\"°F\"===i?\"mdi:thermometer\":me(\"sensor\")},input_datetime:function(e){return e.attributes.has_date?e.attributes.has_time?me(\"input_datetime\"):\"mdi:calendar\":\"mdi:clock\"}},Se=function(e){if(!e)return\"mdi:bookmark\";if(e.attributes.icon)return e.attributes.icon;var t=E(e.entity_id);return t in De?De[t](e):me(t,e.state)};export{G as DEFAULT_DOMAIN_ICON,J as DEFAULT_PANEL,re as DEFAULT_VIEW_ENTITY_ID,X as DOMAINS_HIDE_MORE_INFO,Y as DOMAINS_MORE_INFO_NO_HISTORY,$ as DOMAINS_TOGGLE,K as DOMAINS_WITH_CARD,Q as DOMAINS_WITH_MORE_INFO,t as NumberFormat,Z as STATES_OFF,r as TimeFormat,ee as UNIT_C,te as UNIT_F,q as applyThemesOnElement,A as computeCardSize,E as computeDomain,j as computeEntity,R as computeRTL,z as computeRTLDirection,W as computeStateDisplay,L as computeStateDomain,oe as createThing,ue as debounce,me as domainIcon,se as evaluateFilter,ne as fireEvent,ce as fixedIcons,a as formatDate,f as formatDateMonth,l as formatDateMonthYear,u as formatDateNumeric,m as formatDateShort,v as formatDateTime,k as formatDateTimeNumeric,y as formatDateTimeWithSeconds,n as formatDateWeekday,p as formatDateYear,H as formatNumber,D as formatTime,I as formatTimeWeekday,F as formatTimeWithSeconds,le as forwardHaptic,ke as getLovelace,he as handleAction,pe as handleActionConfig,be as handleClick,ve as hasAction,_e as hasConfigOrEntityChanged,ye as hasDoubleClick,P as isNumericState,de as navigate,U as numberFormatToLocale,M as relativeTime,B as round,Se as stateIcon,C as timerTimeRemaining,ge as toggleEntity,we as turnOnOffEntities,fe as turnOnOffEntity};\n//# sourceMappingURL=index.m.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{property as r}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function t(t){return r({...t,state:!0})}export{t as state};\n//# sourceMappingURL=state.js.map\n"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","t","window","e","ShadowRoot","ShadyCSS","nativeShadow","Document","prototype","CSSStyleSheet","s","Symbol","n","WeakMap","o","constructor","this","_$cssResult$","Error","cssText","styleSheet","get","replaceSync","set","toString","reduce","cssRules","trustedTypes","h","emptyScript","reactiveElementPolyfillSupport","toAttribute","Boolean","Array","JSON","stringify","fromAttribute","Number","parse","a","l","attribute","type","String","converter","reflect","hasChanged","HTMLElement","super","_$Ei","Map","isUpdatePending","hasUpdated","_$El","u","static","push","observedAttributes","finalize","elementProperties","forEach","_$Ep","_$Ev","state","noAccessor","hasOwnProperty","getPropertyDescriptor","requestUpdate","configurable","enumerable","finalized","getPrototypeOf","properties","getOwnPropertyNames","getOwnPropertySymbols","createProperty","elementStyles","finalizeStyles","styles","isArray","Set","flat","reverse","unshift","toLowerCase","_$E_","Promise","enableUpdating","_$AL","_$Eg","addController","_$ES","renderRoot","isConnected","hostConnected","call","removeController","splice","indexOf","createRenderRoot","shadowRoot","attachShadow","shadowRootOptions","adoptedStyleSheets","map","document","createElement","litNonce","setAttribute","textContent","appendChild","connectedCallback","disconnectedCallback","hostDisconnected","attributeChangedCallback","_$AK","_$EO","removeAttribute","getPropertyOptions","has","_$EC","_$Ej","async","reject","scheduleUpdate","performUpdate","shouldUpdate","willUpdate","hostUpdate","update","_$Ek","_$AE","hostUpdated","firstUpdated","updated","updateComplete","getUpdateComplete","mode","ReactiveElement","reactiveElementVersions","createPolicy","createHTML","Math","random","slice","createComment","v","f","_","RegExp","m","p","$","y","_$litType$","strings","values","g","x","for","b","T","E","createTreeWalker","C","lastIndex","exec","test","startsWith","P","parts","el","currentNode","content","firstChild","remove","append","childNodes","nextNode","nodeType","hasAttributes","getAttributeNames","endsWith","getAttribute","split","index","name","ctor","R","H","I","M","tagName","data","innerHTML","V","_$Cl","_$Cu","_$litDirective$","_$AO","_$AT","_$AS","N","_$AN","_$AD","_$AM","parentNode","_$AU","creationScope","importNode","S","nextSibling","L","_$AI","_$AH","_$AA","_$AB","options","_$C_","startNode","endNode","_$AR","k","iterator","O","insertBefore","createTextNode","_$AC","_$AP","setConnected","element","fill","capture","once","passive","removeEventListener","addEventListener","handleEvent","host","Z","litHtmlPolyfillSupport","litHtmlVersions","renderOptions","_$Do","renderBefore","render","_$litPart$","_$litElement$","globalThis","litElementHydrateSupport","LitElement","litElementPolyfillSupport","litElementVersions","kind","descriptor","finisher","placement","originalKey","initializer","HTMLSlotElement","assignedElements","language","system","comma_decimal","decimal_comma","space_comma","none","am_pm","twenty_four","ne","Event","bubbles","cancelable","composed","detail","dispatchEvent","le","pe","action","confirmation","exemptions","some","user","id","confirm","text","entity","camera_image","entityId","navigation_path","history","replaceState","pushState","replace","de","url_path","open","substr","callService","entity_id","fe","includes","states","ge","service","service_data","ve","_$Ct","_$Ci","config","hass","double_tap_action","hold_action","tap_action","customElements","define","elements"],"mappings":"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"}
--------------------------------------------------------------------------------
/docs/example-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Savjee/button-text-card/4001ee40f1fe9dff0ebcd1441d8b8726f054688e/docs/example-1.png
--------------------------------------------------------------------------------
/docs/example-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Savjee/button-text-card/4001ee40f1fe9dff0ebcd1441d8b8726f054688e/docs/example-2.png
--------------------------------------------------------------------------------
/docs/example-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Savjee/button-text-card/4001ee40f1fe9dff0ebcd1441d8b8726f054688e/docs/example-3.png
--------------------------------------------------------------------------------
/docs/example-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Savjee/button-text-card/4001ee40f1fe9dff0ebcd1441d8b8726f054688e/docs/example-4.png
--------------------------------------------------------------------------------
/docs/example-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Savjee/button-text-card/4001ee40f1fe9dff0ebcd1441d8b8726f054688e/docs/example-5.png
--------------------------------------------------------------------------------
/docs/example-6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Savjee/button-text-card/4001ee40f1fe9dff0ebcd1441d8b8726f054688e/docs/example-6.png
--------------------------------------------------------------------------------
/docs/example-6a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Savjee/button-text-card/4001ee40f1fe9dff0ebcd1441d8b8726f054688e/docs/example-6a.png
--------------------------------------------------------------------------------
/docs/example-7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Savjee/button-text-card/4001ee40f1fe9dff0ebcd1441d8b8726f054688e/docs/example-7.png
--------------------------------------------------------------------------------
/docs/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Savjee/button-text-card/4001ee40f1fe9dff0ebcd1441d8b8726f054688e/docs/logo.png
--------------------------------------------------------------------------------
/hacs.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Button Text Card",
3 | "render_readme": true,
4 | "filename": "button-text-card.js"
5 | }
6 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "button-text-card",
3 | "version": "0.6.6",
4 | "description": "Button Text Card",
5 | "keywords": [
6 | "home-assistant",
7 | "homeassistant",
8 | "hass",
9 | "automation",
10 | "lovelace",
11 | "custom-cards"
12 | ],
13 | "module": "button-text-card.js",
14 | "repository": "git@github.com:Savjee/button-text-card.git",
15 | "author": "Xavier Decuyper ",
16 | "license": "MIT",
17 | "dependencies": {
18 | "custom-card-helpers": "^1.7.2",
19 | "home-assistant-js-websocket": "^8.0.0"
20 | },
21 | "devDependencies": {
22 | "@babel/core": "^7.15.0",
23 | "@babel/plugin-proposal-class-properties": "^7.14.5",
24 | "@babel/plugin-proposal-decorators": "^7.14.5",
25 | "@rollup/plugin-json": "^4.1.0",
26 | "@typescript-eslint/eslint-plugin": "^5.38.0",
27 | "@typescript-eslint/parser": "^5.38.0",
28 | "eslint": "^8.23.1",
29 | "eslint-config-airbnb-base": "^15.0.0",
30 | "eslint-config-prettier": "^8.3.0",
31 | "eslint-plugin-import": "^2.24.0",
32 | "eslint-plugin-prettier": "^4.0.0",
33 | "lit": "^2.3.1",
34 | "prettier": "^2.4.1",
35 | "rollup": "^2.58.0",
36 | "rollup-plugin-babel": "^4.4.0",
37 | "rollup-plugin-commonjs": "^10.1.0",
38 | "rollup-plugin-node-resolve": "^5.2.0",
39 | "rollup-plugin-serve": "^2.0.1",
40 | "rollup-plugin-terser": "^7.0.2",
41 | "rollup-plugin-typescript2": "^0.34.0",
42 | "typescript": "^4.4.3"
43 | },
44 | "scripts": {
45 | "start": "rollup -c --watch",
46 | "build": "npm run lint && npm run rollup",
47 | "lint": "eslint src/*.ts",
48 | "rollup": "rollup -c"
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import typescript from 'rollup-plugin-typescript2';
2 | import commonjs from 'rollup-plugin-commonjs';
3 | import nodeResolve from 'rollup-plugin-node-resolve';
4 | import babel from 'rollup-plugin-babel';
5 | import { terser } from 'rollup-plugin-terser';
6 | import serve from 'rollup-plugin-serve';
7 | import json from '@rollup/plugin-json';
8 |
9 | const dev = process.env.ROLLUP_WATCH;
10 |
11 | const serveopts = {
12 | contentBase: ['./dist'],
13 | host: '0.0.0.0',
14 | port: 8000,
15 | allowCrossOrigin: true,
16 | headers: {
17 | 'Access-Control-Allow-Origin': '*',
18 | },
19 | };
20 |
21 | const plugins = [
22 | nodeResolve({}),
23 | commonjs(),
24 | typescript(),
25 | json(),
26 | babel({
27 | exclude: 'node_modules/**',
28 | }),
29 | dev && serve(serveopts),
30 | !dev && terser(),
31 | ];
32 |
33 | export default [
34 | {
35 | input: 'src/button-text-card.ts',
36 | output: {
37 | dir: 'dist',
38 | format: 'es',
39 | sourcemap: true,
40 | },
41 | plugins: [...plugins],
42 | },
43 | ];
44 |
--------------------------------------------------------------------------------
/src/action-handler-directive.ts:
--------------------------------------------------------------------------------
1 | import { noChange } from 'lit';
2 | import { AttributePart, directive, Directive, DirectiveParameters } from 'lit/directive';
3 |
4 | import { ActionHandlerDetail, ActionHandlerOptions } from 'custom-card-helpers/dist/types';
5 | import { fireEvent } from 'custom-card-helpers';
6 | import { CARD_ID } from './const';
7 |
8 | const isTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.maxTouchPoints > 0;
9 |
10 | interface ActionHandler extends HTMLElement {
11 | holdTime: number;
12 | bind(element: Element, options): void;
13 | }
14 | interface ActionHandlerElement extends HTMLElement {
15 | actionHandler?: boolean;
16 | }
17 |
18 | declare global {
19 | interface HASSDomEvents {
20 | action: ActionHandlerDetail;
21 | }
22 | }
23 |
24 | class ActionHandler extends HTMLElement implements ActionHandler {
25 | public holdTime = 500;
26 |
27 | // eslint-disable-next-line @typescript-eslint/no-explicit-any
28 | public ripple: any;
29 |
30 | protected timer?: number;
31 |
32 | protected held = false;
33 |
34 | private dblClickTimeout?: number;
35 |
36 | constructor() {
37 | super();
38 | this.ripple = document.createElement('mwc-ripple');
39 | }
40 |
41 | public connectedCallback(): void {
42 | Object.assign(this.style, {
43 | position: 'absolute',
44 | width: isTouch ? '100px' : '50px',
45 | height: isTouch ? '100px' : '50px',
46 | transform: 'translate(-50%, -50%)',
47 | pointerEvents: 'none',
48 | zIndex: '999',
49 | });
50 |
51 | this.appendChild(this.ripple);
52 | this.ripple.primary = true;
53 |
54 | ['touchcancel', 'mouseout', 'mouseup', 'touchmove', 'mousewheel', 'wheel', 'scroll'].forEach(ev => {
55 | document.addEventListener(
56 | ev,
57 | () => {
58 | clearTimeout(this.timer);
59 | this.stopAnimation();
60 | this.timer = undefined;
61 | },
62 | { passive: true },
63 | );
64 | });
65 | }
66 |
67 | public bind(element: ActionHandlerElement, options): void {
68 | if (element.actionHandler) {
69 | return;
70 | }
71 | element.actionHandler = true;
72 |
73 | element.addEventListener('contextmenu', (ev: Event) => {
74 | const e = ev || window.event;
75 | if (e.preventDefault) {
76 | e.preventDefault();
77 | }
78 | if (e.stopPropagation) {
79 | e.stopPropagation();
80 | }
81 | e.cancelBubble = true;
82 | e.returnValue = false;
83 | return false;
84 | });
85 |
86 | const start = (ev: Event): void => {
87 | this.held = false;
88 | let x;
89 | let y;
90 | if ((ev as TouchEvent).touches) {
91 | x = (ev as TouchEvent).touches[0].pageX;
92 | y = (ev as TouchEvent).touches[0].pageY;
93 | } else {
94 | x = (ev as MouseEvent).pageX;
95 | y = (ev as MouseEvent).pageY;
96 | }
97 |
98 | this.timer = window.setTimeout(() => {
99 | this.startAnimation(x, y);
100 | this.held = true;
101 | }, this.holdTime);
102 | };
103 |
104 | const end = (ev: Event): void => {
105 | // Prevent mouse event if touch event
106 | ev.preventDefault();
107 | if (['touchend', 'touchcancel'].includes(ev.type) && this.timer === undefined) {
108 | return;
109 | }
110 | clearTimeout(this.timer);
111 | this.stopAnimation();
112 | this.timer = undefined;
113 | if (this.held) {
114 | fireEvent(element, 'action', { action: 'hold' });
115 | } else if (options.hasDoubleClick) {
116 | if ((ev.type === 'click' && (ev as MouseEvent).detail < 2) || !this.dblClickTimeout) {
117 | this.dblClickTimeout = window.setTimeout(() => {
118 | this.dblClickTimeout = undefined;
119 | fireEvent(element, 'action', { action: 'tap' });
120 | }, 250);
121 | } else {
122 | clearTimeout(this.dblClickTimeout);
123 | this.dblClickTimeout = undefined;
124 | fireEvent(element, 'action', { action: 'double_tap' });
125 | }
126 | } else {
127 | fireEvent(element, 'action', { action: 'tap' });
128 | }
129 | };
130 |
131 | const handleEnter = (ev: KeyboardEvent): void => {
132 | if (ev.keyCode !== 13) {
133 | return;
134 | }
135 | end(ev);
136 | };
137 |
138 | element.addEventListener('touchstart', start, { passive: true });
139 | element.addEventListener('touchend', end);
140 | element.addEventListener('touchcancel', end);
141 |
142 | element.addEventListener('mousedown', start, { passive: true });
143 | element.addEventListener('click', end);
144 |
145 | element.addEventListener('keyup', handleEnter);
146 | }
147 |
148 | private startAnimation(x: number, y: number): void {
149 | Object.assign(this.style, {
150 | left: `${x}px`,
151 | top: `${y}px`,
152 | display: null,
153 | });
154 | this.ripple.disabled = false;
155 | this.ripple.active = true;
156 | this.ripple.unbounded = true;
157 | }
158 |
159 | private stopAnimation(): void {
160 | this.ripple.active = false;
161 | this.ripple.disabled = true;
162 | this.style.display = 'none';
163 | }
164 | }
165 |
166 | // TODO You need to replace all instances of "action-handler-boilerplate" with "action-handler-"
167 | const handlerId = 'action-handler-' + CARD_ID;
168 | customElements.define(handlerId, ActionHandler);
169 |
170 | const getActionHandler = (): ActionHandler => {
171 | const body = document.body;
172 | if (body.querySelector(handlerId)) {
173 | return body.querySelector(handlerId) as ActionHandler;
174 | }
175 |
176 | const actionhandler = document.createElement(handlerId);
177 | body.appendChild(actionhandler);
178 |
179 | return actionhandler as ActionHandler;
180 | };
181 |
182 | export const actionHandlerBind = (element: ActionHandlerElement, options?: ActionHandlerOptions): void => {
183 | const actionhandler: ActionHandler = getActionHandler();
184 | if (!actionhandler) {
185 | return;
186 | }
187 | actionhandler.bind(element, options);
188 | };
189 |
190 | export const actionHandler = directive(
191 | class extends Directive {
192 | update(part: AttributePart, [options]: DirectiveParameters) {
193 | actionHandlerBind(part.element as ActionHandlerElement, options);
194 | return noChange;
195 | }
196 |
197 | // eslint-disable-next-line @typescript-eslint/no-empty-function
198 | render(_options?: ActionHandlerOptions) {}
199 | },
200 | );
--------------------------------------------------------------------------------
/src/button-text-card.ts:
--------------------------------------------------------------------------------
1 | import {
2 | LitElement,
3 | html,
4 | CSSResultGroup,
5 | TemplateResult,
6 | css,
7 | PropertyValues
8 | } from 'lit';
9 | import { customElement, property, state } from "lit/decorators";
10 | import {
11 | HomeAssistant,
12 | hasConfigOrEntityChanged,
13 | hasAction,
14 | ActionHandlerEvent,
15 | handleAction,
16 | } from 'custom-card-helpers';
17 |
18 | import {
19 | HassEntity,
20 | } from "home-assistant-js-websocket";
21 |
22 | import { BoilerplateCardConfig } from './types';
23 | import { actionHandler } from './action-handler-directive';
24 | import { CARD_ID, CARD_VERSION } from './const';
25 |
26 |
27 | /* eslint no-console: 0 */
28 | console.info(
29 | `%c ${CARD_ID.toUpperCase()} \n%c v${CARD_VERSION} `,
30 | 'color: orange; font-weight: bold; background: black',
31 | 'color: white; font-weight: bold; background: dimgray',
32 | );
33 |
34 | // Put the card into the UI card picker dialog
35 | (window as any).customCards = (window as any).customCards || [];
36 | (window as any).customCards.push({
37 | type: CARD_ID,
38 | name: 'Button Text Card',
39 | description: 'Beautiful "neumorphism" card.',
40 | preview: true,
41 | });
42 |
43 | @customElement(CARD_ID)
44 | export class BoilerplateCard extends LitElement {
45 |
46 | @state() private config!: BoilerplateCardConfig;
47 | private _renderedConfig?: BoilerplateCardConfig;
48 |
49 | @property({ attribute: false }) public hass?: HomeAssistant;
50 | @property() private _hasTemplate = false;
51 | @property() private _stateObj: HassEntity | undefined;
52 |
53 | public static getStubConfig(): Record {
54 | return {
55 | title: "Button Text Card",
56 | subtitle: "Beautiful neumorphism card",
57 | icon: "mdi:cards-heart"
58 | };
59 | }
60 |
61 | private static templateFields = [
62 | 'title',
63 | 'subtitle',
64 | 'icon',
65 | 'icon_size',
66 | 'icon_animation',
67 | 'hide_condition',
68 | 'font_color',
69 | 'background_color',
70 | 'shadow_color',
71 | 'large',
72 | 'spin',
73 | 'icon_color',
74 | ];
75 |
76 | private static templateRegex = new RegExp('\\[\\[\\[([^]*)\\]\\]\\]', 'gm');
77 |
78 | public setConfig(config: BoilerplateCardConfig): void {
79 | // TODO Check for required fields and that they are of the proper format
80 | if (!config || config.show_error) {
81 | throw new Error('Invalid configuration.');
82 | }
83 |
84 | this.config = {
85 | name: 'Button Text Card',
86 | title: '',
87 | subtitle: '',
88 | large: false,
89 | ...config,
90 | };
91 |
92 | // Make a copy of the config so we can render any templates
93 | this._renderedConfig = Object.assign({}, this.config);
94 |
95 | // Check if there is a template in a field
96 | for (const field of BoilerplateCard.templateFields) {
97 | const regResult = BoilerplateCard.templateRegex.exec(this.config[field]);
98 | BoilerplateCard.templateRegex.lastIndex = 0;
99 | if (regResult !== null) {
100 | this._hasTemplate = true;
101 | break;
102 | }
103 | }
104 | }
105 |
106 | protected shouldUpdate(changedProps: PropertyValues): boolean {
107 | // Always render the card when there is no entity
108 | if (!this.config || !this.config.entity) {
109 | return true;
110 | }
111 |
112 | // // If there is an entity, update the card only when it changed state
113 | return hasConfigOrEntityChanged(this, changedProps, this._hasTemplate);
114 | }
115 |
116 | protected evaluateJsTemplates(): void {
117 | if (!this._renderedConfig || !this.config) {
118 | return;
119 | }
120 |
121 | for (const field of BoilerplateCard.templateFields) {
122 | const regMatches = BoilerplateCard.templateRegex.exec(this.config[field]);
123 | BoilerplateCard.templateRegex.lastIndex = 0;
124 |
125 | let content = this.config[field];
126 | if (regMatches && regMatches.length > 1) {
127 | content = this._evalTemplate(this._stateObj, regMatches[1]);
128 | }
129 |
130 | this._renderedConfig[field] = content;
131 | }
132 | }
133 |
134 | protected render(): TemplateResult | void {
135 | if (!this.config || !this.hass || !this._renderedConfig) {
136 | return this._showError("Invalid configuration");
137 | }
138 |
139 | this._stateObj = this.config.entity ? this.hass.states[this.config.entity] : undefined;
140 |
141 | // Render JS templates
142 | this.evaluateJsTemplates();
143 |
144 |
145 | // When card should not be visible, explicitly hide the card by setting
146 | // the display type to none. This avoids padding issues with cards below it.
147 | const invisible = !this._inEditMode() && this._renderedConfig.hide_condition === true;
148 | this.style.setProperty("display", invisible ? "none" : "");
149 |
150 | if (invisible) {
151 | return html``;
152 | }
153 |
154 | // If no icon was set by the user, try fetching one from HA
155 | if (!this.config.icon || this.config.icon === '') {
156 | let icon = 'mdi:alert-circle';
157 |
158 | if (this.config.entity) {
159 | const hassIcon = this.hass.states[this.config.entity].attributes.icon;
160 | if (hassIcon) {
161 | icon = hassIcon;
162 | }
163 | }
164 |
165 | this.setConfig({
166 | ...this.config,
167 | icon: icon,
168 | });
169 | }
170 |
171 | if (this._renderedConfig.background_color) {
172 | this.style.setProperty('--ha-card-background',
173 | this._renderedConfig.background_color);
174 | }
175 |
176 | if (this._renderedConfig.font_color) {
177 | this.style.setProperty('--primary-text-color',
178 | this._renderedConfig.font_color);
179 | }
180 |
181 | if (this._renderedConfig.icon_size) {
182 | this.style.setProperty('--mdc-icon-size',
183 | this._renderedConfig.icon_size + 'px');
184 | }
185 |
186 | this._configureIconColor();
187 |
188 | return html`
189 |
198 |
199 |
200 |
204 |
205 |
206 | ${this._renderedConfig.title === '' && this._renderedConfig.subtitle === ''
207 | ? html``
208 | : html`
209 |
210 |
${this._renderedConfig.title}
211 |
212 | ${this._renderedConfig.subtitle}
213 |
214 |
215 | `}
216 |
217 |
218 | `;
219 | }
220 |
221 | private _handleAction(ev: ActionHandlerEvent): void {
222 | if (this.hass && this.config && ev.detail.action) {
223 | handleAction(this, this.hass, this.config, ev.detail.action);
224 | }
225 | }
226 |
227 | private _showError(error: string): TemplateResult {
228 | const errorCard = document.createElement('hui-error-card');
229 | errorCard.setConfig({
230 | type: 'error',
231 | error,
232 | origConfig: this.config,
233 | });
234 |
235 | return html`
236 | ${errorCard}
237 | `;
238 | }
239 |
240 | /**
241 | * Handles the icon color. Three possible situations:
242 | *
243 | * 1) User didn't set icon_color -> we use the theme's text
244 | * color as icon color.
245 | *
246 | * 2) User set icon_color to "auto" -> We color the icon if the
247 | * attached entity has the "on" state. Color is defined by
248 | * --paper-item-icon-active-color
249 | *
250 | * 3) icon_color is not defined but user did specify font_color
251 | * -> We use the font-color as icon_color as well
252 | *
253 | * 4) icon_color is set to anything but "auto" -> we use that value
254 | * as CSS color code.
255 | */
256 | private _configureIconColor(): void {
257 | if(!this._renderedConfig){
258 | return;
259 | }
260 | const conf = this._renderedConfig;
261 |
262 | if (conf.icon_color && conf.icon_color !== 'auto') {
263 | this.style.setProperty('--icon-color', conf.icon_color);
264 | return;
265 | }
266 |
267 | if (conf.icon_color === 'auto' && this._stateObj?.state === 'on') {
268 | this.style.setProperty('--icon-color',
269 | 'var(--paper-item-icon-active-color)');
270 | return;
271 | }
272 |
273 | if (!conf.icon_color && conf.font_color) {
274 | this.style.setProperty('--icon-color', conf.font_color);
275 | return;
276 | }
277 |
278 | // If we get here, use the default text color
279 | this.style.setProperty('--icon-color', 'var(--primary-text-color)');
280 | }
281 |
282 | /**
283 | * Returns true if Lovelace is in edit mode. Primarily used to show hidden
284 | * cards while editing a dashboard to easily find the correct card.
285 | */
286 | private _inEditMode(): boolean {
287 | return document?.querySelector('home-assistant')
288 | ?.shadowRoot?.querySelector('home-assistant-main')
289 | ?.shadowRoot?.querySelector('ha-drawer partial-panel-resolver ha-panel-lovelace')
290 | ?.shadowRoot?.querySelector('hui-root')
291 | ?.shadowRoot?.firstElementChild?.classList?.contains('edit-mode') || false;
292 | }
293 |
294 | /**
295 | * Renders a Javascript template
296 | * Credit: https://github.com/custom-cards/button-card
297 | */
298 | private _evalTemplate(state: HassEntity | undefined, func: string): any {
299 | if (!this.hass) {
300 | return '';
301 | }
302 |
303 | /* eslint no-new-func: 0 */
304 | return new Function('states', 'entity', 'user', 'hass', 'variables',
305 | `'use strict'; ${func}`).call(
306 | this,
307 | this.hass.states,
308 | state,
309 | this.hass.user,
310 | this.hass,
311 | [],
312 | );
313 | }
314 |
315 | static get styles(): CSSResultGroup {
316 | return css`
317 | @-moz-keyframes spin {
318 | 100% {
319 | -moz-transform: rotate(360deg);
320 | }
321 | }
322 | @-webkit-keyframes spin {
323 | 100% {
324 | -webkit-transform: rotate(360deg);
325 | }
326 | }
327 | @keyframes spin {
328 | 100% {
329 | -webkit-transform: rotate(360deg);
330 | transform: rotate(360deg);
331 | }
332 | }
333 |
334 | ha-card {
335 | background-color: rgba(255, 255, 255, 0);
336 | box-shadow: 2px 2px rgba(0, 0, 0, 0);
337 | padding: 16px;
338 | outline: none;
339 | border: none;
340 | }
341 |
342 | ha-card.edit-preview {
343 | opacity: 0.5;
344 | }
345 |
346 | .warning {
347 | display: block;
348 | color: black;
349 | background-color: #fce588;
350 | padding: 8px;
351 | }
352 |
353 | .flex-container {
354 | width: 100%;
355 | display: flex;
356 | align-items: center;
357 | color: rgb(99, 107, 116);
358 | }
359 |
360 | .card-look {
361 | border-radius: 16px;
362 | background: var(--ha-card-background,
363 | var(--card-background-color, white));
364 | box-shadow: var(--ha-card-box-shadow,
365 | 9px 9px 17px rgba(0, 0, 0, 0.14),
366 | -9px -9px 17px rgba(0, 0, 0, 0.12));
367 | }
368 |
369 | .icon-container {
370 | width: 85px;
371 | height: 85px;
372 | display: flex;
373 | align-items: center;
374 | justify-content: center;
375 | text-align: center;
376 | }
377 |
378 | .text-container {
379 | color: var(--primary-text-color);
380 | margin-left: 24px;
381 | }
382 |
383 | .icon-container ha-icon {
384 | color: var(--icon-color);
385 | }
386 |
387 | .icon-container ha-icon.spin {
388 | -webkit-animation: spin 4s linear infinite;
389 | -moz-animation: spin 4s linear infinite;
390 | animation: spin 4s linear infinite;
391 | }
392 |
393 | .text-container {
394 | flex: 1;
395 | }
396 | .text-container h1 {
397 | font-size: 21px;
398 | font-weight: 500;
399 | margin: 0;
400 | }
401 | .text-container h1 + p {
402 | margin-top: 10px;
403 | }
404 | .text-container p {
405 | font-size: 15px;
406 | font-weight: 400;
407 | margin: 0;
408 | }
409 |
410 | .text-container p.hidden {
411 | display: none;
412 | }
413 | `;
414 | }
415 | }
416 |
--------------------------------------------------------------------------------
/src/const.ts:
--------------------------------------------------------------------------------
1 | export const CARD_VERSION = '0.6.6';
2 | export const CARD_ID = 'button-text-card';
--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------
1 | import { ActionConfig, LovelaceCard, LovelaceCardConfig, LovelaceCardEditor } from 'custom-card-helpers';
2 |
3 | declare global {
4 | interface HTMLElementTagNameMap {
5 | 'boilerplate-card-editor': LovelaceCardEditor;
6 | 'hui-error-card': LovelaceCard;
7 | }
8 | }
9 |
10 |
11 | // TODO Add your configuration elements here for type-checking
12 | export interface BoilerplateCardConfig extends LovelaceCardConfig {
13 | type: string;
14 | name?: string;
15 | show_warning?: boolean;
16 | show_error?: boolean;
17 | test_gui?: boolean;
18 | entity?: string;
19 | tap_action?: ActionConfig;
20 | hold_action?: ActionConfig;
21 | double_tap_action?: ActionConfig;
22 |
23 | // Specific for button-text-card
24 | title?: string;
25 | icon?: string;
26 | icon_color?: string;
27 | icon_size?: number;
28 | subtitle?: string;
29 | hide_condition?: boolean;
30 | background_color?: string;
31 | large?: boolean;
32 | font_color?: string;
33 | icon_animation?: 'spin';
34 | }
35 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es2017",
4 | "module": "esnext",
5 | "moduleResolution": "node",
6 | "lib": ["es2017", "dom", "dom.iterable"],
7 | "noEmit": true,
8 | "noUnusedParameters": true,
9 | "noImplicitReturns": true,
10 | "noFallthroughCasesInSwitch": true,
11 | "strict": true,
12 | "noImplicitAny": false,
13 | "skipLibCheck": true,
14 | "resolveJsonModule": true,
15 | "experimentalDecorators": true
16 | }
17 | }
18 |
--------------------------------------------------------------------------------