├── .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 | Project logo 4 |

5 | 6 |

Button Text Card

7 | 8 |
9 | 10 | [![hacs_badge](https://img.shields.io/badge/HACS-Custom-orange.svg)](https://github.com/custom-components/hacs) 11 | [![Build Status](https://github.com/Savjee/button-text-card/workflows/Build/badge.svg)](https://github.com/Savjee/button-text-card/actions?query=workflow%3ABuild) 12 | [![GitHub Issues](https://img.shields.io/github/issues/Savjee/button-text-card.svg)](https://github.com/Savjee/button-text-card/issues) 13 | [![GitHub Pull Requests](https://img.shields.io/github/issues-pr/Savjee/button-text-card.svg)](https://github.com/Savjee/button-text-card/pulls) 14 | [![License](https://img.shields.io/badge/license-MIT-blue.svg)](/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 | --------------------------------------------------------------------------------