diff --git a/custom_components/browser_mod/browser_mod.js b/custom_components/browser_mod/browser_mod.js
index f4138d2..888c724 100644
--- a/custom_components/browser_mod/browser_mod.js
+++ b/custom_components/browser_mod/browser_mod.js
@@ -1,4 +1,4 @@
-!function(e){var t={};function o(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)o.d(n,s,function(t){return e[t]}.bind(null,s));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=1)}([function(e){e.exports=JSON.parse('{"name":"browser_mod","private":true,"version":"1.0.3","description":"","scripts":{"build":"webpack","watch":"webpack --watch --mode=development","update-card-tools":"npm uninstall card-tools && npm install thomasloven/lovelace-card-tools"},"keywords":[],"author":"Thomas Lovén","license":"MIT","devDependencies":{"webpack":"^4.43.0","webpack-cli":"^3.3.11"},"dependencies":{"card-tools":"github:thomasloven/lovelace-card-tools"}}')},function(e,t,o){"use strict";o.r(t);let n=function(){if(window.fully&&"function"==typeof fully.getDeviceId)return fully.getDeviceId();if(!localStorage["lovelace-player-device-id"]){const e=()=>Math.floor(1e5*(1+Math.random())).toString(16).substring(1);localStorage["lovelace-player-device-id"]=`${e()}${e()}-${e()}${e()}`}return localStorage["lovelace-player-device-id"]}();function s(){return document.querySelector("hc-main")?document.querySelector("hc-main").hass:document.querySelector("home-assistant")?document.querySelector("home-assistant").hass:void 0}function i(e){return document.querySelector("hc-main")?document.querySelector("hc-main").provideHass(e):document.querySelector("home-assistant")?document.querySelector("home-assistant").provideHass(e):void 0}function a(){var e,t=document.querySelector("hc-main");return t?((e=t._lovelaceConfig).current_view=t._lovelacePath,e):(t=(t=(t=(t=(t=(t=(t=(t=(t=document.querySelector("home-assistant"))&&t.shadowRoot)&&t.querySelector("home-assistant-main"))&&t.shadowRoot)&&t.querySelector("app-drawer-layout partial-panel-resolver"))&&t.shadowRoot||t)&&t.querySelector("ha-panel-lovelace"))&&t.shadowRoot)&&t.querySelector("hui-root"))?((e=t.lovelace).current_view=t.___curView,e):null}function r(){var e=document.querySelector("hc-main");return e=e?(e=(e=(e=e&&e.shadowRoot)&&e.querySelector("hc-lovelace"))&&e.shadowRoot)&&e.querySelector("hui-view")||e.querySelector("hui-panel-view"):(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=document.querySelector("home-assistant"))&&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"))&&e.shadowRoot)&&e.querySelector("ha-app-layout #view"))&&e.firstElementChild}function l(){if(customElements.get("hui-view"))return!0;const e=document.createElement("partial-panel-resolver");if(e.hass=s(),!e.hass||!e.hass.panels)return!1;e.route={path:"/lovelace/"},e._updateRoutes();try{document.querySelector("home-assistant").appendChild(e)}catch(e){}finally{document.querySelector("home-assistant").removeChild(e)}return!!customElements.get("hui-view")}function c(e,t,o=null){if((e=new Event(e,{bubbles:!0,cancelable:!1,composed:!0})).detail=t||{},o)o.dispatchEvent(e);else{var n=r();n&&n.dispatchEvent(e)}}let d=window.cardHelpers;const u=new Promise(async(e,t)=>{d&&e();const o=async()=>{d=await window.loadCardHelpers(),window.cardHelpers=d,e()};window.loadCardHelpers?o():window.addEventListener("load",async()=>{l(),window.loadCardHelpers&&o()})});function h(e,t){const o=document.createElement("hui-error-card");return customElements.whenDefined("hui-error-card").then(()=>{o.setConfig({type:"error",error:e,origConfig:t})}),u.then(()=>{c("ll-rebuild",{},o)}),o}function m(e,t){if(!t||"object"!=typeof t||!t.type)return h(`No ${e} type configured`,t);let o=t.type;if(o=o.startsWith("custom:")?o.substr("custom:".length):`hui-${o}-${e}`,customElements.get(o))return function(e,t){let o=document.createElement(e);try{o.setConfig(JSON.parse(JSON.stringify(t)))}catch(e){o=h(e,t)}return u.then(()=>{c("ll-rebuild",{},o)}),o}(o,t);const n=h(`Custom element doesn't exist: ${o}.`,t);n.style.display="None";const s=setTimeout(()=>{n.style.display=""},2e3);return customElements.whenDefined(o).then(()=>{clearTimeout(s),c("ll-rebuild",{},n)}),n}function p(e){return d?d.createCardElement(e):m("card",e)}function y(e,t,o=!1,n=null,s=!1){const a=document.querySelector("hc-main")||document.querySelector("home-assistant");c("hass-more-info",{entityId:null},a);const r=a._moreInfoEl;r.close(),r.open();const l=r.shadowRoot.querySelector("more-info-controls");l&&(l.style.display="none");const d=document.createElement("div");d.innerHTML=`\n \n ${s?"":`\n \n \n \n ${e}\n
\n \n `}\n
\n
\n `;const u=d.querySelector(".scrollable"),h=p(t);i(h),u.appendChild(h),h.addEventListener("ll-rebuild",e=>{e.stopPropagation();const o=p(t);i(o),u.replaceChild(o,h)},{once:!0}),r.sizingTarget=u,r.large=o,r._page="none",r.shadowRoot.appendChild(d);let m={};if(n)for(var y in r.resetFit(),n)m[y]=r.style[y],r.style.setProperty(y,n[y]);return r._dialogOpenChanged=function(e){if(!e&&(this.stateObj&&this.fire("hass-more-info",{entityId:null}),this.shadowRoot==d.parentNode)){this._page=null,this.shadowRoot.removeChild(d);const e=this.shadowRoot.querySelector("more-info-controls");if(e&&(e.style.display="inline"),n)for(var t in r.resetFit(),m)m[t]?r.style.setProperty(t,m[t]):r.style.removeProperty(t)}},r}function v(e,t=!1){const o=document.querySelector("hc-main")||document.querySelector("home-assistant");c("hass-more-info",{entityId:e},o);const n=o._moreInfoEl;return n.large=t,n}const w=[customElements.whenDefined("home-assistant-main"),customElements.whenDefined("hui-view")];Promise.race(w).then(()=>{const e=customElements.get("home-assistant-main")?Object.getPrototypeOf(customElements.get("home-assistant-main")):Object.getPrototypeOf(customElements.get("hui-view")),t=e.prototype.html;e.prototype.css;class o extends e{setConfig(e){}render(){return t`
+!function(e){var t={};function o(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,o),s.l=!0,s.exports}o.m=e,o.c=t,o.d=function(e,t,n){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(o.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)o.d(n,s,function(t){return e[t]}.bind(null,s));return n},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,"a",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p="",o(o.s=1)}([function(e){e.exports=JSON.parse('{"name":"browser_mod","private":true,"version":"1.0.4","description":"","scripts":{"build":"webpack","watch":"webpack --watch --mode=development","update-card-tools":"npm uninstall card-tools && npm install thomasloven/lovelace-card-tools"},"keywords":[],"author":"Thomas Lovén","license":"MIT","devDependencies":{"webpack":"^4.43.0","webpack-cli":"^3.3.11"},"dependencies":{"card-tools":"github:thomasloven/lovelace-card-tools"}}')},function(e,t,o){"use strict";o.r(t);let n=function(){if(window.fully&&"function"==typeof fully.getDeviceId)return fully.getDeviceId();if(!localStorage["lovelace-player-device-id"]){const e=()=>Math.floor(1e5*(1+Math.random())).toString(16).substring(1);localStorage["lovelace-player-device-id"]=`${e()}${e()}-${e()}${e()}`}return localStorage["lovelace-player-device-id"]}();function s(){return document.querySelector("hc-main")?document.querySelector("hc-main").hass:document.querySelector("home-assistant")?document.querySelector("home-assistant").hass:void 0}function i(e){return document.querySelector("hc-main")?document.querySelector("hc-main").provideHass(e):document.querySelector("home-assistant")?document.querySelector("home-assistant").provideHass(e):void 0}function a(){var e,t=document.querySelector("hc-main");return t?((e=t._lovelaceConfig).current_view=t._lovelacePath,e):(t=(t=(t=(t=(t=(t=(t=(t=(t=document.querySelector("home-assistant"))&&t.shadowRoot)&&t.querySelector("home-assistant-main"))&&t.shadowRoot)&&t.querySelector("app-drawer-layout partial-panel-resolver"))&&t.shadowRoot||t)&&t.querySelector("ha-panel-lovelace"))&&t.shadowRoot)&&t.querySelector("hui-root"))?((e=t.lovelace).current_view=t.___curView,e):null}function r(){var e=document.querySelector("hc-main");return e=e?(e=(e=(e=e&&e.shadowRoot)&&e.querySelector("hc-lovelace"))&&e.shadowRoot)&&e.querySelector("hui-view")||e.querySelector("hui-panel-view"):(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=(e=document.querySelector("home-assistant"))&&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"))&&e.shadowRoot)&&e.querySelector("ha-app-layout #view"))&&e.firstElementChild}function l(){if(customElements.get("hui-view"))return!0;const e=document.createElement("partial-panel-resolver");if(e.hass=s(),!e.hass||!e.hass.panels)return!1;e.route={path:"/lovelace/"},e._updateRoutes();try{document.querySelector("home-assistant").appendChild(e)}catch(e){}finally{document.querySelector("home-assistant").removeChild(e)}return!!customElements.get("hui-view")}function c(e,t,o=null){if((e=new Event(e,{bubbles:!0,cancelable:!1,composed:!0})).detail=t||{},o)o.dispatchEvent(e);else{var n=r();n&&n.dispatchEvent(e)}}let d=window.cardHelpers;const u=new Promise(async(e,t)=>{d&&e();const o=async()=>{d=await window.loadCardHelpers(),window.cardHelpers=d,e()};window.loadCardHelpers?o():window.addEventListener("load",async()=>{l(),window.loadCardHelpers&&o()})});function h(e,t){const o=document.createElement("hui-error-card");return customElements.whenDefined("hui-error-card").then(()=>{o.setConfig({type:"error",error:e,origConfig:t})}),u.then(()=>{c("ll-rebuild",{},o)}),o}function m(e,t){if(!t||"object"!=typeof t||!t.type)return h(`No ${e} type configured`,t);let o=t.type;if(o=o.startsWith("custom:")?o.substr("custom:".length):`hui-${o}-${e}`,customElements.get(o))return function(e,t){let o=document.createElement(e);try{o.setConfig(JSON.parse(JSON.stringify(t)))}catch(e){o=h(e,t)}return u.then(()=>{c("ll-rebuild",{},o)}),o}(o,t);const n=h(`Custom element doesn't exist: ${o}.`,t);n.style.display="None";const s=setTimeout(()=>{n.style.display=""},2e3);return customElements.whenDefined(o).then(()=>{clearTimeout(s),c("ll-rebuild",{},n)}),n}function p(e){return d?d.createCardElement(e):m("card",e)}function y(e,t,o=!1,n=null,s=!1){const a=document.querySelector("hc-main")||document.querySelector("home-assistant");c("hass-more-info",{entityId:null},a);const r=a._moreInfoEl;r.close(),r.open();const l=r.shadowRoot.querySelector("more-info-controls");l&&(l.style.display="none");const d=document.createElement("div");d.innerHTML=`\n \n ${s?"":`\n \n \n \n ${e}\n
\n \n `}\n \n
\n `;const u=d.querySelector(".scrollable"),h=p(t);i(h),u.appendChild(h),h.addEventListener("ll-rebuild",e=>{e.stopPropagation();const o=p(t);i(o),u.replaceChild(o,h)},{once:!0}),r.sizingTarget=u,r.large=o,r._page="none",r.shadowRoot.appendChild(d);let m={};if(n)for(var y in r.resetFit(),n)m[y]=r.style[y],r.style.setProperty(y,n[y]);return r._dialogOpenChanged=function(e){if(!e&&(this.stateObj&&this.fire("hass-more-info",{entityId:null}),this.shadowRoot==d.parentNode)){this._page=null,this.shadowRoot.removeChild(d);const e=this.shadowRoot.querySelector("more-info-controls");if(e&&(e.style.display="inline"),n)for(var t in r.resetFit(),m)m[t]?r.style.setProperty(t,m[t]):r.style.removeProperty(t)}},r}function v(e,t=!1){const o=document.querySelector("hc-main")||document.querySelector("home-assistant");c("hass-more-info",{entityId:e},o);const n=o._moreInfoEl;return n.large=t,n}const w=[customElements.whenDefined("home-assistant-main"),customElements.whenDefined("hui-view")];Promise.race(w).then(()=>{const e=customElements.get("home-assistant-main")?Object.getPrototypeOf(customElements.get("home-assistant-main")):Object.getPrototypeOf(customElements.get("hui-view")),t=e.prototype.html;e.prototype.css;class o extends e{setConfig(e){}render(){return t`
Nothing to configure.
diff --git a/package.json b/package.json
index 8a84b99..7ee34fa 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "browser_mod",
"private": true,
- "version": "1.0.3",
+ "version": "1.0.4",
"description": "",
"scripts": {
"build": "webpack",
diff --git a/test/configuration.yaml b/test/configuration.yaml
new file mode 100644
index 0000000..da48137
--- /dev/null
+++ b/test/configuration.yaml
@@ -0,0 +1,16 @@
+default_config:
+
+demo:
+
+browser_mod:
+
+lovelace:
+ mode: yaml
+ resources:
+ - url: /local/card-mod.js
+ type: module
+ dashboards:
+ lovelace-yaml:
+ mode: yaml
+ title: yaml
+ filename: lovelace.yaml
diff --git a/test/docker-compose.yml b/test/docker-compose.yml
new file mode 100644
index 0000000..ab87356
--- /dev/null
+++ b/test/docker-compose.yml
@@ -0,0 +1,59 @@
+#
+# Docker services for testing Home Assistant integrations and plugins
+#
+# Automaatically sets up configuration adds a user and skips the onboarding
+#
+# Username: dev
+# Password: dev
+#
+# Two services, 'prod' and 'dev' run the latest production and dev docker images respectively.
+#
+# Start with
+# $ docker-compose up prod
+# or
+# $ docker-compose up dev
+#
+# When done, clean up with
+# $ docker-compose rm -f
+#
+
+x-files: &x-files
+ - ../custom_components:/config/custom_components
+ - ./configuration.yaml:/config/configuration.yaml
+ - ./lovelace.yaml:/config/lovelace.yaml
+ - ./views:/config/views
+
+x-command: &x-command |
+ bash -c '
+ mkdir /config/www/
+ curl https://raw.githubusercontent.com/thomasloven/lovelace-card-mod/master/card-mod.js --output /config/www/card-mod.js &&
+ hass --script ensure_config -c /config &&
+ hass --script auth -c /config add dev dev &&
+ echo "
+ {
+ \"data\": {
+ \"done\": [
+ \"user\",
+ \"core_config\",
+ \"integration\"
+ ]
+ },
+ \"key\": \"onboarding\",
+ \"version\": 3
+ }
+ " > /config/.storage/onboarding &&
+ hass -v -c /config'
+
+version: '3.5'
+services:
+
+ prod: &base_service
+ image: homeassistant/home-assistant:latest
+ volumes: *x-files
+ ports:
+ - "5001:8123"
+ command: *x-command
+
+ dev:
+ <<: *base_service
+ image: homeassistant/home-assistant:dev
diff --git a/test/lovelace.yaml b/test/lovelace.yaml
new file mode 100644
index 0000000..617dbe7
--- /dev/null
+++ b/test/lovelace.yaml
@@ -0,0 +1,18 @@
+name: browser_mod
+views:
+ - title: Player
+ cards:
+ - type: custom:browser-player
+ - type: button
+ entity: sun.sun
+ name: popup
+ tap_action:
+ action: call-service
+ service: browser_mod.popup
+ service_data:
+ deviceID: this
+ title: Test
+ card:
+ type: markdown
+ content: Hello!
+