diff --git a/custom_components/browser_mod/browser_mod.js b/custom_components/browser_mod/browser_mod.js index 929455b..16da670 100644 --- a/custom_components/browser_mod/browser_mod.js +++ b/custom_components/browser_mod/browser_mod.js @@ -1,284 +1,142 @@ -/* - * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ +(()=>{var e={625:()=>{const e=[customElements.whenDefined("home-assistant-main"),customElements.whenDefined("hui-view")];Promise.race(e).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;customElements.get("browser-player-editor")||(customElements.define("browser-player-editor",class extends e{setConfig(e){}render(){return t`
Nothing to configure.
`}}),window.customCards=window.customCards||[],window.customCards.push({type:"browser-player",name:"Browser Player",preview:!0}))}))},306:e=>{"use strict";e.exports=JSON.parse('{"name":"browser_mod","private":true,"version":"1.3.1","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":"^5.36.2","webpack-cli":"^4.7.0"},"dependencies":{"card-tools":"github:thomasloven/lovelace-card-tools"}}')}},t={};function o(s){var i=t[s];if(void 0!==i)return i.exports;var a=t[s]={exports:{}};return e[s](a,a.exports,o),a.exports}(()=>{"use strict";const e="lovelace-player-device-id";function t(){if(!localStorage[e]){const t=()=>Math.floor(1e5*(1+Math.random())).toString(16).substring(1);window.fully&&"function"==typeof fully.getDeviceId?localStorage[e]=fully.getDeviceId():localStorage[e]=`${t()}${t()}-${t()}${t()}`}return localStorage[e]}let s=t();const i=o=>{null!==o&&("clear"===o?localStorage.removeItem(e):localStorage[e]=o,s=t())},a=new URLSearchParams(window.location.search);function n(){return document.querySelector("hc-main")?document.querySelector("hc-main").hass:document.querySelector("home-assistant")?document.querySelector("home-assistant").hass:void 0}function r(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 l(){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 c(){var e=document.querySelector("hc-main");return 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=(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"))&&e.querySelector("#view"))&&e.firstElementChild}async function d(){if(customElements.get("hui-view"))return!0;await customElements.whenDefined("partial-panel-resolver");const e=document.createElement("partial-panel-resolver");if(e.hass={panels:[{url_path:"tmp",component_name:"lovelace"}]},e._updateRoutes(),await e.routerOptions.routes.tmp.load(),!customElements.get("ha-panel-lovelace"))return!1;const t=document.createElement("ha-panel-lovelace");return t.hass=n(),void 0===t.hass&&(await new Promise((e=>{window.addEventListener("connection-status",(t=>{console.log(t),e()}),{once:!0})})),t.hass=n()),t.panel={config:{mode:null}},t._fetchConfig(),!0}async function h(e,t,o=!1){let s=e;"string"==typeof t&&(t=t.split(/(\$| )/)),""===t[t.length-1]&&t.pop();for(const[e,i]of t.entries())if(i.trim().length){if(!s)return null;s.localName&&s.localName.includes("-")&&await customElements.whenDefined(s.localName),s.updateComplete&&await s.updateComplete,s="$"===i?o&&e==t.length-1?[s.shadowRoot]:s.shadowRoot:o&&e==t.length-1?s.querySelectorAll(i):s.querySelector(i)}return s}async function u(e,t,o=!1,s=1e4){return Promise.race([h(e,t,o),new Promise(((e,t)=>setTimeout((()=>t(new Error("timeout"))),s)))]).catch((e=>{if(!e.message||"timeout"!==e.message)throw e;return null}))}function p(e,t,o=null){if((e=new Event(e,{bubbles:!0,cancelable:!1,composed:!0})).detail=t||{},o)o.dispatchEvent(e);else{var s=c();s&&s.dispatchEvent(e)}}a.get("deviceID")&&i(a.get("deviceID"));let m=window.cardHelpers;async function w(){const e=document.querySelector("home-assistant")||document.querySelector("hc-root");p("hass-more-info",{entityId:"."},e);const t=await u(e,"$ card-tools-popup");t&&t.closeDialog()}async function y(e,t,o=!1,s={},i=!1){if(!customElements.get("card-tools-popup")){const e=customElements.get("home-assistant-main")?Object.getPrototypeOf(customElements.get("home-assistant-main")):Object.getPrototypeOf(customElements.get("hui-view")),t=e.prototype.html,o=e.prototype.css;class s extends e{static get properties(){return{open:{},large:{reflect:!0,type:Boolean},hass:{}}}updated(e){e.has("hass")&&this.card&&(this.card.hass=this.hass)}closeDialog(){this.open=!1}async _makeCard(){const e=await window.loadCardHelpers();this.card=await e.createCardElement(this._card),this.card.hass=this.hass,this.requestUpdate()}async _applyStyles(){let e=await u(this,"$ ha-dialog");customElements.whenDefined("card-mod").then((async()=>{e&&customElements.get("card-mod").applyToElement(e,"more-info",this._style,{config:this._card},[],!1)}))}async showDialog(e,t,o=!1,s={},i=!1){this.title=e,this._card=t,this.large=o,this._style=s,this.fullscreen=!!i,this._makeCard(),await this.updateComplete,this.open=!0,await this._applyStyles()}_enlarge(){this.large=!this.large}render(){return this.open?t` + + ${this.fullscreen?t`
`:t` + + + + +
+ ${this.title} +
+
+ `} +
+ ${this.card} +
+
+ `:t``}static get styles(){return o` + ha-dialog { + --mdc-dialog-min-width: 400px; + --mdc-dialog-max-width: 600px; + --mdc-dialog-heading-ink-color: var(--primary-text-color); + --mdc-dialog-content-ink-color: var(--primary-text-color); + --justify-action-buttons: space-between; + } + @media all and (max-width: 450px), all and (max-height: 500px) { + ha-dialog { + --mdc-dialog-min-width: 100vw; + --mdc-dialog-max-width: 100vw; + --mdc-dialog-min-height: 100%; + --mdc-dialog-max-height: 100%; + --mdc-shape-medium: 0px; + --vertial-align-dialog: flex-end; + } + } -/***/ "./js/browser-player-editor.js": -/*!*************************************!*\ - !*** ./js/browser-player-editor.js ***! - \*************************************/ -/***/ (() => { + app-toolbar { + flex-shrink: 0; + color: var(--primary-text-color); + background-color: var(--secondary-background-color); + } -eval("const bases = [\n customElements.whenDefined(\"home-assistant-main\"),\n customElements.whenDefined(\"hui-view\"),\n];\nPromise.race(bases).then(() => {\n const LitElement = customElements.get(\"home-assistant-main\")\n ? Object.getPrototypeOf(customElements.get(\"home-assistant-main\"))\n : Object.getPrototypeOf(customElements.get(\"hui-view\"));\n const html = LitElement.prototype.html;\n const css = LitElement.prototype.css;\n\n class BrowserPlayerEditor extends LitElement {\n setConfig(config) {}\n render() {\n return html`
Nothing to configure.
`;\n }\n }\n\n if (!customElements.get(\"browser-player-editor\")) {\n customElements.define(\"browser-player-editor\", BrowserPlayerEditor);\n window.customCards = window.customCards || [];\n window.customCards.push({\n type: \"browser-player\",\n name: \"Browser Player\",\n preview: true,\n });\n }\n});\n\n\n//# sourceURL=webpack://browser_mod/./js/browser-player-editor.js?"); + .main-title { + margin-left: 16px; + line-height: 1.3em; + max-height: 2.6em; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + text-overflow: ellipsis; + } + .content { + margin: -20px -24px; + } -/***/ }), + @media all and (max-width: 450px), all and (max-height: 500px) { + app-toolbar { + background-color: var(--app-header-background-color); + color: var(--app-header-text-color, white); + } + } -/***/ "./js/browser-player.js": -/*!******************************!*\ - !*** ./js/browser-player.js ***! - \******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + @media all and (min-width: 451px) and (min-height: 501px) { + ha-dialog { + --mdc-dialog-max-width: 90vw; + } -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! card-tools/src/deviceID */ \"./node_modules/card-tools/src/deviceID.js\");\n/* harmony import */ var card_tools_src_more_info__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! card-tools/src/more-info */ \"./node_modules/card-tools/src/more-info.js\");\n/* harmony import */ var _browser_player_editor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./browser-player-editor.js */ \"./js/browser-player-editor.js\");\n/* harmony import */ var _browser_player_editor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_browser_player_editor_js__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\n\nconst bases = [\n customElements.whenDefined(\"home-assistant-main\"),\n customElements.whenDefined(\"hui-view\"),\n];\nPromise.race(bases).then(() => {\n const LitElement = customElements.get(\"home-assistant-main\")\n ? Object.getPrototypeOf(customElements.get(\"home-assistant-main\"))\n : Object.getPrototypeOf(customElements.get(\"hui-view\"));\n const html = LitElement.prototype.html;\n const css = LitElement.prototype.css;\n\n class BrowserPlayer extends LitElement {\n static get properties() {\n return {\n hass: {},\n };\n }\n\n static getConfigElement() {\n return document.createElement(\"browser-player-editor\");\n }\n static getStubConfig() {\n return {};\n }\n\n setConfig(config) {\n this._config = config;\n for (const event of [\n \"play\",\n \"pause\",\n \"ended\",\n \"volumechange\",\n \"canplay\",\n \"loadeddata\",\n ])\n window.browser_mod.player.addEventListener(event, () =>\n this.requestUpdate()\n );\n }\n handleMute(ev) {\n window.browser_mod.player_mute();\n }\n handleVolumeChange(ev) {\n const vol = parseFloat(ev.target.value);\n window.browser_mod.player_set_volume(vol);\n }\n handleMoreInfo(ev) {\n (0,card_tools_src_more_info__WEBPACK_IMPORTED_MODULE_1__.moreInfo)(\"media_player.\" + window.browser_mod.entity_id);\n }\n handlePlayPause(ev) {\n if (window.browser_mod.player.paused) window.browser_mod.player_play();\n else window.browser_mod.player_pause();\n }\n setDeviceID() {\n const newID = prompt(\"Set deviceID\", card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID);\n if (newID !== card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID) {\n (0,card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.setDeviceID)(newID);\n this.requestUpdate();\n }\n }\n\n render() {\n if (!window.browser_mod) {\n window.setTimeout(() => this.requestUpdate(), 100);\n return html``;\n }\n const player = window.browser_mod.player;\n return html`\n \n
\n \n \n\n ${window.browser_mod.player_state === \"stopped\"\n ? html`
`\n : html`\n \n `}\n \n
\n\n
${card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID}
\n
\n `;\n }\n\n static get styles() {\n return css`\n paper-icon-button[highlight] {\n color: var(--accent-color);\n }\n .card-content {\n display: flex;\n justify-content: center;\n }\n .placeholder {\n width: 24px;\n padding: 8px;\n }\n .device-id {\n opacity: 0.7;\n font-size: xx-small;\n margin-top: -10px;\n user-select: all;\n -webkit-user-select: all;\n -moz-user-select: all;\n -ms-user-select: all;\n }\n `;\n }\n }\n\n if (!customElements.get(\"browser-player\"))\n customElements.define(\"browser-player\", BrowserPlayer);\n});\n\n\n//# sourceURL=webpack://browser_mod/./js/browser-player.js?"); + .content { + width: 400px; + } + :host([large]) .content { + width: calc(90vw - 48px); + } -/***/ }), + :host([large]) app-toolbar { + max-width: calc(90vw - 32px); + } + } + `}}customElements.define("card-tools-popup",s)}const a=document.querySelector("home-assistant")||document.querySelector("hc-root");if(!a)return;let n=await u(a,"$ card-tools-popup");if(!n){n=document.createElement("card-tools-popup");const e=a.shadowRoot.querySelector("ha-more-info-dialog");e?a.shadowRoot.insertBefore(n,e):a.shadowRoot.appendChild(n),r(n)}if(!window._moreInfoDialogListener){const e=async e=>{if(e.state&&"cardToolsPopup"in e.state)if(e.state.cardToolsPopup){const{title:t,card:o,large:s,style:i,fullscreen:a}=e.state.params;y(t,o,s,i,a)}else n.closeDialog()};window.addEventListener("popstate",e),window._moreInfoDialogListener=!0}history.replaceState({cardToolsPopup:!1},""),history.pushState({cardToolsPopup:!0,params:{title:e,card:t,large:o,style:s,fullscreen:i}},""),n.showDialog(e,t,o,s,i)}async function _(e,t=!1){const o=document.querySelector("hc-main")||document.querySelector("home-assistant");p("hass-more-info",{entityId:e},o);const s=await u(o,"$ ha-more-info-dialog");return s&&(s.large=t),s}new Promise((async(e,t)=>{m&&e();const o=async()=>{m=await window.loadCardHelpers(),window.cardHelpers=m,e()};window.loadCardHelpers?o():window.addEventListener("load",(async()=>{d(),window.loadCardHelpers&&o()}))})),o(625);const v=[customElements.whenDefined("home-assistant-main"),customElements.whenDefined("hui-view")];Promise.race(v).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,o=e.prototype.css;customElements.get("browser-player")||customElements.define("browser-player",class extends e{static get properties(){return{hass:{}}}static getConfigElement(){return document.createElement("browser-player-editor")}static getStubConfig(){return{}}setConfig(e){this._config=e;for(const e of["play","pause","ended","volumechange","canplay","loadeddata"])window.browser_mod.player.addEventListener(e,(()=>this.requestUpdate()))}handleMute(e){window.browser_mod.player_mute()}handleVolumeChange(e){const t=parseFloat(e.target.value);window.browser_mod.player_set_volume(t)}handleMoreInfo(e){_("media_player."+window.browser_mod.entity_id)}handlePlayPause(e){window.browser_mod.player.paused?window.browser_mod.player_play():window.browser_mod.player_pause()}setDeviceID(){const e=prompt("Set deviceID",s);e!==s&&(i(e),this.requestUpdate())}render(){if(!window.browser_mod)return window.setTimeout((()=>this.requestUpdate()),100),t``;const e=window.browser_mod.player;return t` + +
+ + -/***/ "./js/browser.js": -/*!***********************!*\ - !*** ./js/browser.js ***! - \***********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + ${"stopped"===window.browser_mod.player_state?t`
`:t` + + `} + +
-"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BrowserModBrowserMixin\": () => (/* binding */ BrowserModBrowserMixin)\n/* harmony export */ });\n/* harmony import */ var card_tools_src_event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! card-tools/src/event */ \"./node_modules/card-tools/src/event.js\");\n\n\nconst BrowserModBrowserMixin = (C) =>\n class extends C {\n constructor() {\n super();\n document.addEventListener(\"visibilitychange\", () => this.sensor_update());\n window.addEventListener(\"location-changed\", () => this.sensor_update());\n\n window.setInterval(() => this.sensor_update(), 10000);\n }\n\n sensor_update() {\n const update = async () => {\n const battery = navigator.getBattery\n ? await navigator.getBattery()\n : undefined;\n this.sendUpdate({\n browser: {\n path: window.location.pathname,\n visibility: document.visibilityState,\n userAgent: navigator.userAgent,\n currentUser: this._hass && this._hass.user && this._hass.user.name,\n fullyKiosk: this.isFully,\n width: window.innerWidth,\n height: window.innerHeight,\n battery_level: this.isFully\n ? window.fully.getBatteryLevel()\n : battery\n ? battery.level * 100\n : undefined,\n charging: this.isFully\n ? window.fully.isPlugged()\n : battery\n ? battery.charging\n : undefined,\n darkMode:\n this._hass && this._hass.themes && this._hass.themes.darkMode,\n userData: this._hass && this._hass.user,\n },\n });\n };\n update();\n }\n\n do_navigate(path) {\n if (!path) return;\n history.pushState(null, \"\", path);\n (0,card_tools_src_event__WEBPACK_IMPORTED_MODULE_0__.fireEvent)(\n \"location-changed\",\n {},\n document.querySelector(\"home-assistant\")\n );\n }\n };\n\n\n//# sourceURL=webpack://browser_mod/./js/browser.js?"); - -/***/ }), - -/***/ "./js/camera.js": -/*!**********************!*\ - !*** ./js/camera.js ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BrowserModCameraMixin\": () => (/* binding */ BrowserModCameraMixin)\n/* harmony export */ });\nconst BrowserModCameraMixin = (C) =>\n class extends C {\n setup_camera() {\n console.log(\"Starting camera\");\n\n if (this._video) return;\n this._video = document.createElement(\"video\");\n this._video.autoplay = true;\n this._video.playsInline = true;\n this._video.style.display = \"none\";\n\n this._canvas = document.createElement(\"canvas\");\n this._canvas.style.display = \"none\";\n\n document.body.appendChild(this._video);\n document.body.appendChild(this._canvas);\n\n if (!navigator.mediaDevices) return;\n\n console.log(\"Starting devices\");\n navigator.mediaDevices\n .getUserMedia({ video: true, audio: false })\n .then((stream) => {\n this._video.srcObject = stream;\n this._video.play();\n this.update_camera();\n });\n\n this._camera_framerate = 2;\n\n window.addEventListener(\"click\", () => this._video.play(), {\n once: true,\n });\n }\n\n update_camera() {\n this._canvas.width = this._video.videoWidth;\n this._canvas.height = this._video.videoHeight;\n\n const context = this._canvas.getContext(\"2d\");\n context.drawImage(\n this._video,\n 0,\n 0,\n this._video.videoWidth,\n this._video.videoHeight\n );\n\n this.sendUpdate({\n camera: this._canvas.toDataURL(\"image/jpeg\"),\n });\n setTimeout(\n () => this.update_camera(),\n Math.round(1000 / this._camera_framerate)\n );\n }\n };\n\n\n//# sourceURL=webpack://browser_mod/./js/camera.js?"); - -/***/ }), - -/***/ "./js/connection.js": -/*!**************************!*\ - !*** ./js/connection.js ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BrowserModConnection\": () => (/* binding */ BrowserModConnection)\n/* harmony export */ });\n/* harmony import */ var card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! card-tools/src/deviceID */ \"./node_modules/card-tools/src/deviceID.js\");\n/* harmony import */ var card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! card-tools/src/hass */ \"./node_modules/card-tools/src/hass.js\");\n\n\n\nclass BrowserModConnection {\n async connect() {\n const isCast = document.querySelector(\"hc-main\") !== null;\n if (!isCast) {\n if (!window.hassConnection) {\n window.setTimeout(() => this.connect(), 100);\n return;\n } else {\n this._connection = (await window.hassConnection).conn;\n }\n } else {\n this._connection = (0,card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__.hass)().connection;\n }\n\n this._connection.subscribeMessage((msg) => this.msg_callback(msg), {\n type: \"browser_mod/connect\",\n deviceID: card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID,\n });\n\n this._hass_patched = false;\n (0,card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__.provideHass)(this);\n }\n\n set hass(hass) {\n this._hass = hass;\n }\n\n get connected() {\n return this._connection !== undefined;\n }\n\n msg_callback(message) {\n console.log(message);\n }\n\n sendUpdate(data) {\n if (!this.connected) return;\n this._connection.sendMessage({\n type: \"browser_mod/update\",\n deviceID: card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID,\n data,\n });\n }\n}\n\n\n//# sourceURL=webpack://browser_mod/./js/connection.js?"); - -/***/ }), - -/***/ "./js/fullyKiosk.js": -/*!**************************!*\ - !*** ./js/fullyKiosk.js ***! - \**************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"FullyKioskMixin\": () => (/* binding */ FullyKioskMixin)\n/* harmony export */ });\nconst FullyKioskMixin = (C) =>\n class extends C {\n get isFully() {\n return window.fully !== undefined;\n }\n\n constructor() {\n super();\n\n if (!this.isFully) return;\n\n this._fullyMotion = false;\n this._motionTimeout = undefined;\n\n for (const ev of [\n \"screenOn\",\n \"screenOff\",\n \"pluggedAC\",\n \"pluggedUSB\",\n \"onBatteryLevelChanged\",\n \"unplugged\",\n \"networkReconnect\",\n \"onMotion\",\n ]) {\n window.fully.bind(ev, `window.browser_mod.fully_update(\"${ev}\");`);\n }\n\n this._keepingAlive = false;\n }\n\n fully_update(event) {\n if (!this.isFully) return;\n if (event === \"screenOn\") {\n window.clearTimeout(this._keepAliveTimer);\n if (!this._keepingAlive) this.screen_update();\n } else if (event === \"screenOff\") {\n this.screen_update();\n this._keepingAlive = false;\n if (this.config.force_stay_awake) {\n this._keepAliveTimer = window.setTimeout(() => {\n this._keepingAlive = true;\n window.fully.turnScreenOn();\n window.fully.turnScreenOff();\n }, 270000);\n }\n } else if (event === \"onMotion\") {\n this.fullyMotionTriggered();\n }\n\n this.sendUpdate({\n fully: {\n battery: window.fully.getBatteryLevel(),\n charging: window.fully.isPlugged(),\n motion: this._fullyMotion,\n ip: window.fully.getIp4Address(),\n },\n });\n }\n\n fullyMotionTriggered() {\n if (this._keepingAlive) return;\n this._fullyMotion = true;\n clearTimeout(this._motionTimeout);\n this._motionTimeout = setTimeout(() => {\n this._fullyMotion = false;\n this.fully_update();\n }, 5000);\n this.fully_update();\n }\n };\n\n\n//# sourceURL=webpack://browser_mod/./js/fullyKiosk.js?"); - -/***/ }), - -/***/ "./js/main.js": -/*!********************!*\ - !*** ./js/main.js ***! - \********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! card-tools/src/deviceID */ \"./node_modules/card-tools/src/deviceID.js\");\n/* harmony import */ var card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! card-tools/src/hass */ \"./node_modules/card-tools/src/hass.js\");\n/* harmony import */ var card_tools_src_popup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! card-tools/src/popup */ \"./node_modules/card-tools/src/popup.js\");\n/* harmony import */ var card_tools_src_event__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! card-tools/src/event */ \"./node_modules/card-tools/src/event.js\");\n/* harmony import */ var _browser_player__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./browser-player */ \"./js/browser-player.js\");\n/* harmony import */ var _connection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./connection */ \"./js/connection.js\");\n/* harmony import */ var _mediaPlayer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./mediaPlayer */ \"./js/mediaPlayer.js\");\n/* harmony import */ var _fullyKiosk__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./fullyKiosk */ \"./js/fullyKiosk.js\");\n/* harmony import */ var _camera__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./camera */ \"./js/camera.js\");\n/* harmony import */ var _screensaver__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./screensaver */ \"./js/screensaver.js\");\n/* harmony import */ var _popups__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./popups */ \"./js/popups.js\");\n/* harmony import */ var _browser__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./browser */ \"./js/browser.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst ext = (baseClass, mixins) =>\n mixins.reduceRight((base, mixin) => mixin(base), baseClass);\n\nclass BrowserMod extends ext(_connection__WEBPACK_IMPORTED_MODULE_5__.BrowserModConnection, [\n _browser__WEBPACK_IMPORTED_MODULE_11__.BrowserModBrowserMixin,\n _popups__WEBPACK_IMPORTED_MODULE_10__.BrowserModPopupsMixin,\n _screensaver__WEBPACK_IMPORTED_MODULE_9__.BrowserModScreensaverMixin,\n _camera__WEBPACK_IMPORTED_MODULE_8__.BrowserModCameraMixin,\n _fullyKiosk__WEBPACK_IMPORTED_MODULE_7__.FullyKioskMixin,\n _mediaPlayer__WEBPACK_IMPORTED_MODULE_6__.BrowserModMediaPlayerMixin,\n]) {\n constructor() {\n super();\n this.entity_id = card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID.replace(\"-\", \"_\");\n this.cast = document.querySelector(\"hc-main\") !== null;\n this.connect();\n\n document.body.addEventListener(\"ll-custom\", (ev) => {\n if (ev.detail.browser_mod) {\n this.msg_callback(ev.detail.browser_mod);\n }\n });\n\n const pjson = __webpack_require__(/*! ../package.json */ \"./package.json\");\n console.info(\n `%cBROWSER_MOD ${pjson.version} IS INSTALLED\n %cDeviceID: ${card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID}`,\n \"color: green; font-weight: bold\",\n \"\"\n );\n }\n\n async msg_callback(msg) {\n const handlers = {\n update: (msg) => this.update(msg),\n debug: (msg) => this.debug(msg),\n\n play: (msg) => this.player_play(msg.media_content_id),\n pause: (msg) => this.player_pause(),\n stop: (msg) => this.player_stop(),\n \"set-volume\": (msg) => this.player_set_volume(msg.volume_level),\n mute: (msg) => this.player_mute(msg.mute),\n\n toast: (msg) => this.do_toast(msg.message, msg.duration),\n popup: (msg) => this.do_popup(msg),\n \"close-popup\": (msg) => this.do_close_popup(),\n \"more-info\": (msg) => this.do_more_info(msg.entity_id, msg.large),\n\n navigate: (msg) => this.do_navigate(msg.navigation_path),\n \"set-theme\": (msg) => this.set_theme(msg),\n \"lovelace-reload\": (msg) => this.lovelace_reload(msg),\n \"window-reload\": () => window.location.reload(),\n\n blackout: (msg) =>\n this.do_blackout(msg.time ? parseInt(msg.time) : undefined),\n \"no-blackout\": (msg) => {\n if (msg.brightness && this.isFully) {\n window.fully.setScreenBrightness(msg.brightness);\n }\n this.no_blackout();\n },\n\n \"call-service\": (msg) => this.call_service(msg),\n commands: async (msg) => {\n for (const m of msg.commands) {\n await this.msg_callback(m);\n }\n },\n delay: async (msg) =>\n await new Promise((resolve) => {\n window.setTimeout(resolve, msg.seconds * 1000);\n }),\n };\n\n await handlers[msg.command.replace(\"_\", \"-\")](msg);\n }\n\n debug(msg) {\n (0,card_tools_src_popup__WEBPACK_IMPORTED_MODULE_2__.popUp)(`deviceID`, { type: \"markdown\", content: `# ${card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID}` });\n alert(card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID);\n }\n\n set_theme(msg) {\n if (!msg.theme) msg.theme = \"default\";\n (0,card_tools_src_event__WEBPACK_IMPORTED_MODULE_3__.fireEvent)(\n \"settheme\",\n { theme: msg.theme },\n document.querySelector(\"home-assistant\")\n );\n }\n\n lovelace_reload(msg) {\n const ll = (0,card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__.lovelace_view)();\n if (ll) (0,card_tools_src_event__WEBPACK_IMPORTED_MODULE_3__.fireEvent)(\"config-refresh\", {}, ll);\n }\n\n call_service(msg) {\n const _replaceThis = (data) => {\n if (typeof data === \"string\" && data === \"this\") return card_tools_src_deviceID__WEBPACK_IMPORTED_MODULE_0__.deviceID;\n if (Array.isArray(data)) return data.map(_replaceThis);\n if (data.constructor == Object) {\n for (const key in data) data[key] = _replaceThis(data[key]);\n }\n return data;\n };\n const [domain, service] = msg.service.split(\".\", 2);\n let service_data = _replaceThis(\n JSON.parse(JSON.stringify(msg.service_data))\n );\n this._hass.callService(domain, service, service_data);\n }\n\n update(msg = null) {\n if (msg) {\n if (msg.name) {\n this.entity_id = msg.name.toLowerCase();\n }\n if (msg.camera) {\n this.setup_camera();\n }\n this.config = { ...this.config, ...msg };\n }\n this.player_update();\n this.fully_update();\n this.screen_update();\n this.sensor_update();\n }\n}\n\nconst bases = [\n customElements.whenDefined(\"home-assistant\"),\n customElements.whenDefined(\"hc-main\"),\n];\nPromise.race(bases).then(() => {\n window.setTimeout(() => {\n window.browser_mod = window.browser_mod || new BrowserMod();\n }, 1000);\n});\n\n\n//# sourceURL=webpack://browser_mod/./js/main.js?"); - -/***/ }), - -/***/ "./js/mediaPlayer.js": -/*!***************************!*\ - !*** ./js/mediaPlayer.js ***! - \***************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BrowserModMediaPlayerMixin\": () => (/* binding */ BrowserModMediaPlayerMixin)\n/* harmony export */ });\nconst BrowserModMediaPlayerMixin = (C) =>\n class extends C {\n constructor() {\n super();\n this.player = new Audio();\n\n for (const event of [\"play\", \"pause\", \"ended\", \"volumechange\"]) {\n this.player.addEventListener(event, () => this.player_update());\n }\n\n window.addEventListener(\"click\", () => this.player.play(), {\n once: true,\n });\n }\n\n player_update(ev) {\n this.sendUpdate({\n player: {\n volume: this.player.volume,\n muted: this.player.muted,\n src: this.player.src,\n state: this.player_state,\n },\n });\n }\n\n get player_state() {\n if (!this.player.src) return \"stopped\";\n if (this.player.ended) return \"stopped\";\n if (this.player.paused) return \"paused\";\n return \"playing\";\n }\n\n player_play(src) {\n if (src) this.player.src = src;\n this.player.play();\n }\n player_pause() {\n this.player.pause();\n }\n player_stop() {\n this.player.pause();\n this.player.src = null;\n }\n player_set_volume(level) {\n if (level === undefined) return;\n this.player.volume = level;\n }\n player_mute(mute) {\n if (mute === undefined) mute = !this.player.muted;\n this.player.muted = Boolean(mute);\n }\n };\n\n\n//# sourceURL=webpack://browser_mod/./js/mediaPlayer.js?"); - -/***/ }), - -/***/ "./js/popups.js": -/*!**********************!*\ - !*** ./js/popups.js ***! - \**********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BrowserModPopupsMixin\": () => (/* binding */ BrowserModPopupsMixin)\n/* harmony export */ });\n/* harmony import */ var card_tools_src_event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! card-tools/src/event */ \"./node_modules/card-tools/src/event.js\");\n/* harmony import */ var card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! card-tools/src/hass */ \"./node_modules/card-tools/src/hass.js\");\n/* harmony import */ var card_tools_src_more_info__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! card-tools/src/more-info */ \"./node_modules/card-tools/src/more-info.js\");\n/* harmony import */ var card_tools_src_popup__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! card-tools/src/popup */ \"./node_modules/card-tools/src/popup.js\");\n\n\n\n\n\nconst BrowserModPopupsMixin = (C) =>\n class extends C {\n constructor() {\n super();\n if (document.querySelector(\"home-assistant\"))\n document\n .querySelector(\"home-assistant\")\n .addEventListener(\"hass-more-info\", (ev) => this._popup_card(ev));\n\n const isCast = document.querySelector(\"hc-main\") !== null;\n if (!isCast) (0,card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__.load_lovelace)();\n }\n\n _popup_card(ev) {\n if (!(0,card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__.lovelace)()) return;\n if (!ev.detail || !ev.detail.entityId) return;\n const data = {\n ...(0,card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__.lovelace)().config.popup_cards,\n ...(0,card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__.lovelace)().config.views[(0,card_tools_src_hass__WEBPACK_IMPORTED_MODULE_1__.lovelace)().current_view].popup_cards,\n };\n const d = data[ev.detail.entityId];\n if (!d) return;\n\n this.do_popup(d);\n window.setTimeout(() => {\n (0,card_tools_src_event__WEBPACK_IMPORTED_MODULE_0__.fireEvent)(\n \"hass-more-info\",\n { entityID: \".\" },\n document.querySelector(\"home-assistant\")\n );\n }, 50);\n }\n\n do_popup(cfg) {\n if (!(cfg.title || cfg.auto_close || cfg.hide_header)) {\n console.error(\n \"browser_mod: popup: Must specify title, auto_close or hide_header.\"\n );\n return;\n }\n if (!cfg.card) {\n console.error(\"browser_mod: popup: No card specified\");\n return;\n }\n\n const open = () => {\n (0,card_tools_src_popup__WEBPACK_IMPORTED_MODULE_3__.popUp)(\n cfg.title,\n cfg.card,\n cfg.large,\n cfg.style,\n cfg.auto_close || cfg.hide_header\n );\n };\n\n if (cfg.auto_close) {\n this.screensaver_set(open, card_tools_src_popup__WEBPACK_IMPORTED_MODULE_3__.closePopUp, cfg.time);\n } else {\n open();\n }\n }\n\n do_close_popup() {\n this.screensaver_stop();\n (0,card_tools_src_popup__WEBPACK_IMPORTED_MODULE_3__.closePopUp)();\n }\n\n do_more_info(entity_id, large) {\n if (!entity_id) return;\n (0,card_tools_src_more_info__WEBPACK_IMPORTED_MODULE_2__.moreInfo)(entity_id, large);\n }\n\n do_toast(message, duration) {\n if (!message) return;\n (0,card_tools_src_event__WEBPACK_IMPORTED_MODULE_0__.fireEvent)(\n \"hass-notification\",\n {\n message,\n duration: parseInt(duration),\n },\n document.querySelector(\"home-assistant\")\n );\n }\n };\n\n\n//# sourceURL=webpack://browser_mod/./js/popups.js?"); - -/***/ }), - -/***/ "./js/screensaver.js": -/*!***************************!*\ - !*** ./js/screensaver.js ***! - \***************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BrowserModScreensaverMixin\": () => (/* binding */ BrowserModScreensaverMixin)\n/* harmony export */ });\nconst BrowserModScreensaverMixin = (C) =>\n class extends C {\n constructor() {\n super();\n this._blackout_panel = document.createElement(\"div\");\n\n this._screenSaver = undefined;\n this._screenSaverTimer = undefined;\n this._screenSaverTimeOut = 0;\n\n this._screenSaver = {\n fn: undefined,\n clearfn: undefined,\n timer: undefined,\n timeout: undefined,\n listeners: {},\n active: false,\n };\n\n this._blackout_panel.style.cssText = `\n position: fixed;\n left: 0;\n top: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n height: 100%;\n background: black;\n display: none;\n `;\n document.body.appendChild(this._blackout_panel);\n }\n\n screensaver_set(fn, clearfn, time) {\n this._ss_clear();\n this._screenSaver = {\n fn,\n clearfn,\n timer: undefined,\n timeout: time,\n listeners: {},\n active: false,\n };\n const l = () => this.screensaver_update();\n for (const event of [\"mousemove\", \"mousedown\", \"keydown\", \"touchstart\"]) {\n window.addEventListener(event, l);\n this._screenSaver.listeners[event] = l;\n }\n this._screenSaver.timer = window.setTimeout(\n () => this._ss_run(),\n time * 1000\n );\n }\n\n screensaver_update() {\n if (this._screenSaver.active) {\n this.screensaver_stop();\n } else {\n window.clearTimeout(this._screenSaver.timer);\n this._screenSaver.timer = window.setTimeout(\n () => this._ss_run(),\n this._screenSaver.timeout * 1000\n );\n }\n }\n\n screensaver_stop() {\n this._ss_clear();\n this._screenSaver.active = false;\n if (this._screenSaver.clearfn) this._screenSaver.clearfn();\n if (this._screenSaver.timeout) {\n this.screensaver_set(\n this._screenSaver.fn,\n this._screenSaver.clearfn,\n this._screenSaver.timeout\n );\n }\n }\n\n _ss_clear() {\n window.clearTimeout(this._screenSaverTimer);\n for (const [k, v] of Object.entries(this._screenSaver.listeners)) {\n window.removeEventListener(k, v);\n }\n }\n\n _ss_run() {\n this._screenSaver.active = true;\n this._screenSaver.fn();\n }\n\n do_blackout(timeout) {\n this.screensaver_set(\n () => {\n if (this.isFully) window.fully.turnScreenOff(true);\n else this._blackout_panel.style.display = \"block\";\n this.screen_update();\n },\n () => {\n if ((this._blackout_panel.style.display = \"block\"))\n this._blackout_panel.style.display = \"none\";\n if (this.isFully && !window.fully.getScreenOn())\n window.fully.turnScreenOn();\n this.screen_update();\n },\n timeout || 0\n );\n }\n\n no_blackout() {\n if (this.isFully) window.fully.turnScreenOn();\n this.screensaver_stop();\n }\n\n screen_update() {\n this.sendUpdate({\n screen: {\n blackout: this.isFully\n ? !window.fully.getScreenOn()\n : Boolean(this._blackout_panel.style.display === \"block\"),\n brightness: this.isFully\n ? window.fully.getScreenBrightness()\n : undefined,\n },\n });\n }\n };\n\n\n//# sourceURL=webpack://browser_mod/./js/screensaver.js?"); - -/***/ }), - -/***/ "./node_modules/card-tools/src/deviceID.js": -/*!*************************************************!*\ - !*** ./node_modules/card-tools/src/deviceID.js ***! - \*************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"deviceID\": () => (/* binding */ deviceID),\n/* harmony export */ \"setDeviceID\": () => (/* binding */ setDeviceID)\n/* harmony export */ });\nconst ID_STORAGE_KEY = 'lovelace-player-device-id';\nfunction _deviceID() {\n if(!localStorage[ID_STORAGE_KEY])\n {\n const s4 = () => {\n return Math.floor((1+Math.random())*100000).toString(16).substring(1);\n };\n if(window['fully'] && typeof fully.getDeviceId === \"function\")\n localStorage[ID_STORAGE_KEY] = fully.getDeviceId();\n else\n localStorage[ID_STORAGE_KEY] = `${s4()}${s4()}-${s4()}${s4()}`;\n }\n return localStorage[ID_STORAGE_KEY];\n};\n\nlet deviceID = _deviceID();\n\nconst setDeviceID = (id) => {\n if(id === null) return;\n if(id === \"clear\") {\n localStorage.removeItem(ID_STORAGE_KEY)\n } else {\n localStorage[ID_STORAGE_KEY] = id;\n }\n deviceID = _deviceID();\n}\n\nconst params = new URLSearchParams(window.location.search);\nif(params.get('deviceID')) {\n setDeviceID(params.get('deviceID'));\n}\n\n\n\n//# sourceURL=webpack://browser_mod/./node_modules/card-tools/src/deviceID.js?"); - -/***/ }), - -/***/ "./node_modules/card-tools/src/event.js": -/*!**********************************************!*\ - !*** ./node_modules/card-tools/src/event.js ***! - \**********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"fireEvent\": () => (/* binding */ fireEvent)\n/* harmony export */ });\n/* harmony import */ var _hass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hass */ \"./node_modules/card-tools/src/hass.js\");\n\n\nfunction fireEvent(ev, detail, entity=null) {\n ev = new Event(ev, {\n bubbles: true,\n cancelable: false,\n composed: true,\n });\n ev.detail = detail || {};\n if(entity) {\n entity.dispatchEvent(ev);\n } else {\n var root = (0,_hass__WEBPACK_IMPORTED_MODULE_0__.lovelace_view)();\n if (root) root.dispatchEvent(ev);\n }\n}\n\n\n//# sourceURL=webpack://browser_mod/./node_modules/card-tools/src/event.js?"); - -/***/ }), - -/***/ "./node_modules/card-tools/src/hass.js": -/*!*********************************************!*\ - !*** ./node_modules/card-tools/src/hass.js ***! - \*********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"hass\": () => (/* binding */ hass),\n/* harmony export */ \"provideHass\": () => (/* binding */ provideHass),\n/* harmony export */ \"lovelace\": () => (/* binding */ lovelace),\n/* harmony export */ \"async_lovelace_view\": () => (/* binding */ async_lovelace_view),\n/* harmony export */ \"lovelace_view\": () => (/* binding */ lovelace_view),\n/* harmony export */ \"load_lovelace\": () => (/* binding */ load_lovelace)\n/* harmony export */ });\nfunction hass() {\n if(document.querySelector('hc-main'))\n return document.querySelector('hc-main').hass;\n\n if(document.querySelector('home-assistant'))\n return document.querySelector('home-assistant').hass;\n\n return undefined;\n};\n\nfunction provideHass(element) {\n if(document.querySelector('hc-main'))\n return document.querySelector('hc-main').provideHass(element);\n\n if(document.querySelector('home-assistant'))\n return document.querySelector(\"home-assistant\").provideHass(element);\n\n return undefined;\n}\n\nfunction lovelace() {\n var root = document.querySelector(\"hc-main\");\n if(root) {\n var ll = root._lovelaceConfig;\n ll.current_view = root._lovelacePath;\n return ll;\n }\n\n root = document.querySelector(\"home-assistant\");\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"home-assistant-main\");\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"app-drawer-layout partial-panel-resolver\");\n root = root && root.shadowRoot || root;\n root = root && root.querySelector(\"ha-panel-lovelace\")\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"hui-root\")\n if (root) {\n var ll = root.lovelace\n ll.current_view = root.___curView;\n return ll;\n }\n\n return null;\n}\n\nasync function await_el(el) {\n if(!el) return;\n await customElements.whenDefined(el.localName);\n if(el.updateComplete)\n await el.updateComplete;\n}\n\nasync function async_lovelace_view() {\n var root = document.querySelector(\"hc-main\");\n if(root) {\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"hc-lovelace\");\n await_el(root);\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"hui-view\") || root.querySelector(\"hui-panel-view\");\n await_el(root);\n return root;\n }\n\n root = document.querySelector(\"home-assistant\");\n await_el(root);\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"home-assistant-main\");\n await_el(root);\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"app-drawer-layout partial-panel-resolver\");\n await_el(root);\n root = root && root.shadowRoot || root;\n root = root && root.querySelector(\"ha-panel-lovelace\");\n await_el(root);\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"hui-root\");\n await_el(root);\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"ha-app-layout\")\n await_el(root);\n root = root && root.querySelector(\"#view\");\n root = root && root.firstElementChild;\n await_el(root);\n return root;\n}\nfunction lovelace_view() {\n var root = document.querySelector(\"hc-main\");\n if(root) {\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"hc-lovelace\");\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"hui-view\") || root.querySelector(\"hui-panel-view\");\n return root;\n }\n\n root = document.querySelector(\"home-assistant\");\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"home-assistant-main\");\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"app-drawer-layout partial-panel-resolver\");\n root = root && root.shadowRoot || root;\n root = root && root.querySelector(\"ha-panel-lovelace\");\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"hui-root\");\n root = root && root.shadowRoot;\n root = root && root.querySelector(\"ha-app-layout\")\n root = root && root.querySelector(\"#view\");\n root = root && root.firstElementChild;\n return root;\n}\n\nasync function load_lovelace() {\n if(customElements.get(\"hui-view\")) return true;\n\n await customElements.whenDefined(\"partial-panel-resolver\");\n const ppr = document.createElement(\"partial-panel-resolver\");\n ppr.hass = {panels: [{\n url_path: \"tmp\",\n \"component_name\": \"lovelace\",\n }]};\n ppr._updateRoutes();\n await ppr.routerOptions.routes.tmp.load();\n if(!customElements.get(\"ha-panel-lovelace\")) return false;\n const p = document.createElement(\"ha-panel-lovelace\");\n p.hass = hass();\n if(p.hass === undefined) {\n await new Promise(resolve => {\n window.addEventListener('connection-status', (ev) => {\n console.log(ev);\n resolve();\n }, {once: true});\n });\n p.hass = hass();\n }\n p.panel = {config: {mode: null}};\n p._fetchConfig();\n return true;\n}\n\n\n//# sourceURL=webpack://browser_mod/./node_modules/card-tools/src/hass.js?"); - -/***/ }), - -/***/ "./node_modules/card-tools/src/helpers.js": -/*!************************************************!*\ - !*** ./node_modules/card-tools/src/helpers.js ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"selectTree\": () => (/* binding */ selectTree)\n/* harmony export */ });\nasync function _selectTree(root, path, all=false) {\n let el = root;\n if(typeof(path) === \"string\") {\n path = path.split(/(\\$| )/);\n }\n if(path[path.length-1] === \"\")\n path.pop();\n for(const [i, p] of path.entries()) {\n if(!p.trim().length) continue;\n if(!el) return null;\n if(el.localName && el.localName.includes(\"-\"))\n await customElements.whenDefined(el.localName);\n if(el.updateComplete)\n await el.updateComplete;\n if(p === \"$\")\n if(all && i == path.length-1)\n el = [el.shadowRoot];\n else\n el = el.shadowRoot;\n else\n if(all && i == path.length-1)\n el = el.querySelectorAll(p);\n else\n el = el.querySelector(p);\n }\n return el;\n}\n\nasync function selectTree(root, path, all=false, timeout=10000) {\n return Promise.race([\n _selectTree(root, path, all),\n new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout))\n ]).catch((err) => {\n if(!err.message || err.message !== \"timeout\")\n throw(err);\n return null;\n });\n}\n\n\n//# sourceURL=webpack://browser_mod/./node_modules/card-tools/src/helpers.js?"); - -/***/ }), - -/***/ "./node_modules/card-tools/src/lovelace-element.js": -/*!*********************************************************!*\ - !*** ./node_modules/card-tools/src/lovelace-element.js ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"CUSTOM_TYPE_PREFIX\": () => (/* binding */ CUSTOM_TYPE_PREFIX),\n/* harmony export */ \"DOMAINS_HIDE_MORE_INFO\": () => (/* binding */ DOMAINS_HIDE_MORE_INFO),\n/* harmony export */ \"createCard\": () => (/* binding */ createCard),\n/* harmony export */ \"createElement\": () => (/* binding */ createElement),\n/* harmony export */ \"createEntityRow\": () => (/* binding */ createEntityRow)\n/* harmony export */ });\n/* harmony import */ var _event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./event */ \"./node_modules/card-tools/src/event.js\");\n/* harmony import */ var _hass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hass */ \"./node_modules/card-tools/src/hass.js\");\n\n\n\nconst CUSTOM_TYPE_PREFIX = \"custom:\";\n\nconst DOMAINS_HIDE_MORE_INFO = [\n \"input_number\",\n \"input_select\",\n \"input_text\",\n \"scene\",\n \"weblink\",\n];\n\nlet helpers = window.cardHelpers;\nconst helperPromise = new Promise(async (resolve, reject) => {\n if(helpers) resolve();\n\n const updateHelpers = async () => {\n helpers = await window.loadCardHelpers();\n window.cardHelpers = helpers;\n resolve();\n }\n\n if(window.loadCardHelpers) {\n updateHelpers();\n } else {\n // If loadCardHelpers didn't exist, force load lovelace and try once more.\n window.addEventListener(\"load\", async () => {\n (0,_hass__WEBPACK_IMPORTED_MODULE_1__.load_lovelace)();\n if(window.loadCardHelpers) {\n updateHelpers();\n }\n });\n }\n});\n\nfunction errorElement(error, origConfig) {\n const cfg = {\n type: \"error\",\n error,\n origConfig,\n };\n const el = document.createElement(\"hui-error-card\");\n customElements.whenDefined(\"hui-error-card\").then(() => {\n const newel = document.createElement(\"hui-error-card\");\n newel.setConfig(cfg);\n if(el.parentElement)\n el.parentElement.replaceChild(newel, el);\n });\n helperPromise.then(() => {\n (0,_event__WEBPACK_IMPORTED_MODULE_0__.fireEvent)(\"ll-rebuild\", {}, el);\n });\n return el;\n}\n\nfunction _createElement(tag, config) {\n let el = document.createElement(tag);\n try {\n el.setConfig(JSON.parse(JSON.stringify(config)));\n } catch (err) {\n el = errorElement(err, config);\n }\n helperPromise.then(() => {\n (0,_event__WEBPACK_IMPORTED_MODULE_0__.fireEvent)(\"ll-rebuild\", {}, el);\n });\n return el;\n}\n\nfunction createLovelaceElement(thing, config) {\n if(!config || typeof config !== \"object\" || !config.type)\n return errorElement(`No ${thing} type configured`, config);\n\n let tag = config.type;\n if(tag.startsWith(CUSTOM_TYPE_PREFIX))\n tag = tag.substr(CUSTOM_TYPE_PREFIX.length);\n else\n tag = `hui-${tag}-${thing}`;\n\n if(customElements.get(tag))\n return _createElement(tag, config);\n\n const el = errorElement(`Custom element doesn't exist: ${tag}.`, config);\n el.style.display = \"None\";\n\n const timer = setTimeout(() => {\n el.style.display = \"\";\n }, 2000);\n\n customElements.whenDefined(tag).then(() => {\n clearTimeout(timer);\n (0,_event__WEBPACK_IMPORTED_MODULE_0__.fireEvent)(\"ll-rebuild\", {}, el);\n });\n\n return el;\n}\n\nfunction createCard(config) {\n if(helpers) return helpers.createCardElement(config);\n return createLovelaceElement('card', config);\n}\nfunction createElement(config) {\n if(helpers) return helpers.createHuiElement(config);\n return createLovelaceElement('element', config);\n}\nfunction createEntityRow(config) {\n if(helpers) return helpers.createRowElement(config);\n const SPECIAL_TYPES = new Set([\n \"call-service\",\n \"cast\",\n \"conditional\",\n \"divider\",\n \"section\",\n \"select\",\n \"weblink\",\n ]);\n const DEFAULT_ROWS = {\n alert: \"toggle\",\n automation: \"toggle\",\n climate: \"climate\",\n cover: \"cover\",\n fan: \"toggle\",\n group: \"group\",\n input_boolean: \"toggle\",\n input_number: \"input-number\",\n input_select: \"input-select\",\n input_text: \"input-text\",\n light: \"toggle\",\n lock: \"lock\",\n media_player: \"media-player\",\n remote: \"toggle\",\n scene: \"scene\",\n script: \"script\",\n sensor: \"sensor\",\n timer: \"timer\",\n switch: \"toggle\",\n vacuum: \"toggle\",\n water_heater: \"climate\",\n input_datetime: \"input-datetime\",\n none: undefined,\n };\n\n if(!config)\n return errorElement(\"Invalid configuration given.\", config);\n if(typeof config === \"string\")\n config = {entity: config};\n if(typeof config !== \"object\" || (!config.entity && !config.type))\n return errorElement(\"Invalid configuration given.\", config);\n\n const type = config.type || \"default\";\n if(SPECIAL_TYPES.has(type) || type.startsWith(CUSTOM_TYPE_PREFIX))\n return createLovelaceElement('row', config);\n\n const domain = config.entity ? config.entity.split(\".\", 1)[0]: \"none\";\n return createLovelaceElement('entity-row', {\n type: DEFAULT_ROWS[domain] || \"text\",\n ...config\n });\n}\n\n\n//# sourceURL=webpack://browser_mod/./node_modules/card-tools/src/lovelace-element.js?"); - -/***/ }), - -/***/ "./node_modules/card-tools/src/more-info.js": -/*!**************************************************!*\ - !*** ./node_modules/card-tools/src/more-info.js ***! - \**************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"moreInfo\": () => (/* binding */ moreInfo)\n/* harmony export */ });\n/* harmony import */ var _event__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./event */ \"./node_modules/card-tools/src/event.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./node_modules/card-tools/src/helpers.js\");\n\n\n\nasync function moreInfo(entity, large=false) {\n const root = document.querySelector(\"hc-main\") || document.querySelector(\"home-assistant\");\n (0,_event__WEBPACK_IMPORTED_MODULE_0__.fireEvent)(\"hass-more-info\", {entityId: entity}, root);\n const el = await (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.selectTree)(root, \"$ ha-more-info-dialog\");\n if(el)\n el.large = large;\n return el;\n}\n\n\n//# sourceURL=webpack://browser_mod/./node_modules/card-tools/src/more-info.js?"); - -/***/ }), - -/***/ "./node_modules/card-tools/src/popup.js": -/*!**********************************************!*\ - !*** ./node_modules/card-tools/src/popup.js ***! - \**********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"closePopUp\": () => (/* binding */ closePopUp),\n/* harmony export */ \"popUp\": () => (/* binding */ popUp)\n/* harmony export */ });\n/* harmony import */ var _hass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hass */ \"./node_modules/card-tools/src/hass.js\");\n/* harmony import */ var _helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers */ \"./node_modules/card-tools/src/helpers.js\");\n/* harmony import */ var _event__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./event */ \"./node_modules/card-tools/src/event.js\");\n/* harmony import */ var _lovelace_element__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lovelace-element */ \"./node_modules/card-tools/src/lovelace-element.js\");\n\n\n\n\n\nasync function closePopUp() {\n const root = document.querySelector(\"home-assistant\") || document.querySelector(\"hc-root\");\n (0,_event__WEBPACK_IMPORTED_MODULE_2__.fireEvent)(\"hass-more-info\", {entityId: \".\"}, root);\n const el = await (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.selectTree)(root, \"$ card-tools-popup\");\n\n if(el)\n el.closeDialog();\n}\n\nasync function popUp(title, card, large=false, style={}, fullscreen=false) {\n if(!customElements.get(\"card-tools-popup\"))\n {\n const LitElement = customElements.get('home-assistant-main')\n ? Object.getPrototypeOf(customElements.get('home-assistant-main'))\n : Object.getPrototypeOf(customElements.get('hui-view'));\n const html = LitElement.prototype.html;\n const css = LitElement.prototype.css;\n\n class CardToolsPopup extends LitElement {\n\n static get properties() {\n return {\n open: {},\n large: {reflect: true, type: Boolean},\n hass: {},\n };\n }\n\n updated(changedProperties) {\n if(changedProperties.has(\"hass\")) {\n if(this.card)\n this.card.hass = this.hass;\n }\n }\n\n closeDialog() {\n this.open = false;\n }\n\n async _makeCard() {\n const helpers = await window.loadCardHelpers();\n this.card = await helpers.createCardElement(this._card);\n this.card.hass = this.hass;\n this.requestUpdate();\n }\n\n async _applyStyles() {\n let el = await (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.selectTree)(this, \"$ ha-dialog\");\n customElements.whenDefined(\"card-mod\").then(async () => {\n if(!el) return;\n const cm = customElements.get(\"card-mod\");\n cm.applyToElement(el, \"more-info\", this._style, {config: this._card}, [], false);\n });\n\n }\n\n async showDialog(title, card, large=false, style={}, fullscreen=false) {\n this.title = title;\n this._card = card;\n this.large = large;\n this._style = style;\n this.fullscreen = !!fullscreen;\n this._makeCard();\n await this.updateComplete;\n this.open = true;\n await this._applyStyles();\n }\n\n _enlarge() {\n this.large = !this.large;\n }\n\n render() {\n if(!this.open) {\n return html``;\n }\n\n return html`\n \n ${this.fullscreen\n ? html`
`\n : html`\n \n \n \n \n
\n ${this.title}\n
\n
\n `}\n
\n ${this.card}\n
\n \n `\n }\n\n static get styles() {\n return css`\n ha-dialog {\n --mdc-dialog-min-width: 400px;\n --mdc-dialog-max-width: 600px;\n --mdc-dialog-heading-ink-color: var(--primary-text-color);\n --mdc-dialog-content-ink-color: var(--primary-text-color);\n --justify-action-buttons: space-between;\n }\n @media all and (max-width: 450px), all and (max-height: 500px) {\n ha-dialog {\n --mdc-dialog-min-width: 100vw;\n --mdc-dialog-max-width: 100vw;\n --mdc-dialog-min-height: 100%;\n --mdc-dialog-max-height: 100%;\n --mdc-shape-medium: 0px;\n --vertial-align-dialog: flex-end;\n }\n }\n\n app-toolbar {\n flex-shrink: 0;\n color: var(--primary-text-color);\n background-color: var(--secondary-background-color);\n }\n\n .main-title {\n margin-left: 16px;\n line-height: 1.3em;\n max-height: 2.6em;\n overflow: hidden;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n }\n .content {\n margin: -20px -24px;\n }\n\n @media all and (max-width: 450px), all and (max-height: 500px) {\n app-toolbar {\n background-color: var(--app-header-background-color);\n color: var(--app-header-text-color, white);\n }\n }\n\n @media all and (min-width: 451px) and (min-height: 501px) {\n ha-dialog {\n --mdc-dialog-max-width: 90vw;\n }\n\n .content {\n width: 400px;\n }\n :host([large]) .content {\n width: calc(90vw - 48px);\n }\n\n :host([large]) app-toolbar {\n max-width: calc(90vw - 32px);\n }\n }\n `;\n }\n\n }\n customElements.define(\"card-tools-popup\", CardToolsPopup);\n }\n\n const root = document.querySelector(\"home-assistant\") || document.querySelector(\"hc-root\");\n\n if(!root) return;\n let el = await (0,_helpers__WEBPACK_IMPORTED_MODULE_1__.selectTree)(root, \"$ card-tools-popup\");\n if(!el) {\n el = document.createElement(\"card-tools-popup\");\n const mi = root.shadowRoot.querySelector(\"ha-more-info-dialog\");\n if(mi)\n root.shadowRoot.insertBefore(el,mi);\n else\n root.shadowRoot.appendChild(el);\n (0,_hass__WEBPACK_IMPORTED_MODULE_0__.provideHass)(el);\n }\n\n if(!window._moreInfoDialogListener) {\n const listener = async (ev) => {\n if(ev.state && \"cardToolsPopup\" in ev.state) {\n if(ev.state.cardToolsPopup) {\n const {title, card, large, style, fullscreen} = ev.state.params;\n popUp(title, card, large, style, fullscreen)\n } else {\n el.closeDialog();\n }\n }\n }\n\n window.addEventListener(\"popstate\", listener);\n window._moreInfoDialogListener = true;\n }\n\n history.replaceState( {\n cardToolsPopup: false,\n },\n \"\"\n );\n\n history.pushState( {\n cardToolsPopup: true,\n params: {title, card, large, style, fullscreen},\n },\n \"\"\n );\n\n el.showDialog(title, card, large, style, fullscreen);\n\n}\n\n\n//# sourceURL=webpack://browser_mod/./node_modules/card-tools/src/popup.js?"); - -/***/ }), - -/***/ "./package.json": -/*!**********************!*\ - !*** ./package.json ***! - \**********************/ -/***/ ((module) => { - -"use strict"; -eval("module.exports = JSON.parse('{\"name\":\"browser_mod\",\"private\":true,\"version\":\"1.3.1\",\"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\":\"^5.36.2\",\"webpack-cli\":\"^4.7.0\"},\"dependencies\":{\"card-tools\":\"github:thomasloven/lovelace-card-tools\"}}');\n\n//# sourceURL=webpack://browser_mod/./package.json?"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./js/main.js"); -/******/ -/******/ })() -; \ No newline at end of file +
${s}
+
+ `}static get styles(){return o` + paper-icon-button[highlight] { + color: var(--accent-color); + } + .card-content { + display: flex; + justify-content: center; + } + .placeholder { + width: 24px; + padding: 8px; + } + .device-id { + opacity: 0.7; + font-size: xx-small; + margin-top: -10px; + user-select: all; + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + } + `}})}));class g{async connect(){if(null!==document.querySelector("hc-main"))this._connection=n().connection;else{if(!window.hassConnection)return void window.setTimeout((()=>this.connect()),100);this._connection=(await window.hassConnection).conn}this._connection.subscribeMessage((e=>this.msg_callback(e)),{type:"browser_mod/connect",deviceID:s}),this._hass_patched=!1,r(this)}set hass(e){this._hass=e}get connected(){return void 0!==this._connection}msg_callback(e){console.log(e)}sendUpdate(e){this.connected&&this._connection.sendMessage({type:"browser_mod/update",deviceID:s,data:e})}}const f=e=>class extends e{constructor(){super(),this.player=new Audio;for(const e of["play","pause","ended","volumechange"])this.player.addEventListener(e,(()=>this.player_update()));window.addEventListener("click",(()=>this.player.play()),{once:!0})}player_update(e){this.sendUpdate({player:{volume:this.player.volume,muted:this.player.muted,src:this.player.src,state:this.player_state}})}get player_state(){return this.player.src?this.player.ended?"stopped":this.player.paused?"paused":"playing":"stopped"}player_play(e){e&&(this.player.src=e),this.player.play()}player_pause(){this.player.pause()}player_stop(){this.player.pause(),this.player.src=null}player_set_volume(e){void 0!==e&&(this.player.volume=e)}player_mute(e){void 0===e&&(e=!this.player.muted),this.player.muted=Boolean(e)}},b=e=>class extends e{get isFully(){return void 0!==window.fully}constructor(){if(super(),this.isFully){this._fullyMotion=!1,this._motionTimeout=void 0;for(const e of["screenOn","screenOff","pluggedAC","pluggedUSB","onBatteryLevelChanged","unplugged","networkReconnect","onMotion"])window.fully.bind(e,`window.browser_mod.fully_update("${e}");`);this._keepingAlive=!1}}fully_update(e){this.isFully&&("screenOn"===e?(window.clearTimeout(this._keepAliveTimer),this._keepingAlive||this.screen_update()):"screenOff"===e?(this.screen_update(),this._keepingAlive=!1,this.config.force_stay_awake&&(this._keepAliveTimer=window.setTimeout((()=>{this._keepingAlive=!0,window.fully.turnScreenOn(),window.fully.turnScreenOff()}),27e4))):"onMotion"===e&&this.fullyMotionTriggered(),this.sendUpdate({fully:{battery:window.fully.getBatteryLevel(),charging:window.fully.isPlugged(),motion:this._fullyMotion,ip:window.fully.getIp4Address()}}))}fullyMotionTriggered(){this._keepingAlive||(this._fullyMotion=!0,clearTimeout(this._motionTimeout),this._motionTimeout=setTimeout((()=>{this._fullyMotion=!1,this.fully_update()}),5e3),this.fully_update())}},S=e=>class extends e{setup_camera(){console.log("Starting camera"),this._video||(this._video=document.createElement("video"),this._video.autoplay=!0,this._video.playsInline=!0,this._video.style.display="none",this._canvas=document.createElement("canvas"),this._canvas.style.display="none",document.body.appendChild(this._video),document.body.appendChild(this._canvas),navigator.mediaDevices&&(console.log("Starting devices"),navigator.mediaDevices.getUserMedia({video:!0,audio:!1}).then((e=>{this._video.srcObject=e,this._video.play(),this.update_camera()})),this._camera_framerate=2,window.addEventListener("click",(()=>this._video.play()),{once:!0})))}update_camera(){this._canvas.width=this._video.videoWidth,this._canvas.height=this._video.videoHeight,this._canvas.getContext("2d").drawImage(this._video,0,0,this._video.videoWidth,this._video.videoHeight),this.sendUpdate({camera:this._canvas.toDataURL("image/jpeg")}),setTimeout((()=>this.update_camera()),Math.round(1e3/this._camera_framerate))}},k=e=>class extends e{constructor(){super(),this._blackout_panel=document.createElement("div"),this._screenSaver=void 0,this._screenSaverTimer=void 0,this._screenSaverTimeOut=0,this._screenSaver={fn:void 0,clearfn:void 0,timer:void 0,timeout:void 0,listeners:{},active:!1},this._blackout_panel.style.cssText="\n position: fixed;\n left: 0;\n top: 0;\n padding: 0;\n margin: 0;\n width: 100%;\n height: 100%;\n background: black;\n display: none;\n ",document.body.appendChild(this._blackout_panel)}screensaver_set(e,t,o){this._ss_clear(),this._screenSaver={fn:e,clearfn:t,timer:void 0,timeout:o,listeners:{},active:!1};const s=()=>this.screensaver_update();for(const e of["mousemove","mousedown","keydown","touchstart"])window.addEventListener(e,s),this._screenSaver.listeners[e]=s;this._screenSaver.timer=window.setTimeout((()=>this._ss_run()),1e3*o)}screensaver_update(){this._screenSaver.active?this.screensaver_stop():(window.clearTimeout(this._screenSaver.timer),this._screenSaver.timer=window.setTimeout((()=>this._ss_run()),1e3*this._screenSaver.timeout))}screensaver_stop(){this._ss_clear(),this._screenSaver.active=!1,this._screenSaver.clearfn&&this._screenSaver.clearfn(),this._screenSaver.timeout&&this.screensaver_set(this._screenSaver.fn,this._screenSaver.clearfn,this._screenSaver.timeout)}_ss_clear(){window.clearTimeout(this._screenSaverTimer);for(const[e,t]of Object.entries(this._screenSaver.listeners))window.removeEventListener(e,t)}_ss_run(){this._screenSaver.active=!0,this._screenSaver.fn()}do_blackout(e){this.screensaver_set((()=>{this.isFully?window.fully.turnScreenOff(!0):this._blackout_panel.style.display="block",this.screen_update()}),(()=>{(this._blackout_panel.style.display="block")&&(this._blackout_panel.style.display="none"),this.isFully&&!window.fully.getScreenOn()&&window.fully.turnScreenOn(),this.screen_update()}),e||0)}no_blackout(){this.isFully&&window.fully.turnScreenOn(),this.screensaver_stop()}screen_update(){this.sendUpdate({screen:{blackout:this.isFully?!window.fully.getScreenOn():Boolean("block"===this._blackout_panel.style.display),brightness:this.isFully?window.fully.getScreenBrightness():void 0}})}},x=e=>class extends e{constructor(){super(),document.querySelector("home-assistant")&&document.querySelector("home-assistant").addEventListener("hass-more-info",(e=>this._popup_card(e))),null!==document.querySelector("hc-main")||d()}_popup_card(e){if(!l())return;if(!e.detail||!e.detail.entityId)return;const t={...l().config.popup_cards,...l().config.views[l().current_view].popup_cards}[e.detail.entityId];t&&(this.do_popup(t),window.setTimeout((()=>{p("hass-more-info",{entityID:"."},document.querySelector("home-assistant"))}),50))}do_popup(e){if(!(e.title||e.auto_close||e.hide_header))return void console.error("browser_mod: popup: Must specify title, auto_close or hide_header.");if(!e.card)return void console.error("browser_mod: popup: No card specified");const t=()=>{y(e.title,e.card,e.large,e.style,e.auto_close||e.hide_header)};e.auto_close?this.screensaver_set(t,w,e.time):t()}do_close_popup(){this.screensaver_stop(),w()}do_more_info(e,t){e&&_(e,t)}do_toast(e,t){e&&p("hass-notification",{message:e,duration:parseInt(t)},document.querySelector("home-assistant"))}},E=e=>class extends e{constructor(){super(),document.addEventListener("visibilitychange",(()=>this.sensor_update())),window.addEventListener("location-changed",(()=>this.sensor_update())),window.setInterval((()=>this.sensor_update()),1e4)}sensor_update(){(async()=>{const e=navigator.getBattery?await navigator.getBattery():void 0;this.sendUpdate({browser:{path:window.location.pathname,visibility:document.visibilityState,userAgent:navigator.userAgent,currentUser:this._hass&&this._hass.user&&this._hass.user.name,fullyKiosk:this.isFully,width:window.innerWidth,height:window.innerHeight,battery_level:this.isFully?window.fully.getBatteryLevel():e?100*e.level:void 0,charging:this.isFully?window.fully.isPlugged():e?e.charging:void 0,darkMode:this._hass&&this._hass.themes&&this._hass.themes.darkMode,userData:this._hass&&this._hass.user}})})()}do_navigate(e){e&&(history.pushState(null,"",e),p("location-changed",{},document.querySelector("home-assistant")))}};class q extends(((e,t)=>t.reduceRight(((e,t)=>t(e)),e))(g,[E,x,k,S,b,f])){constructor(){super(),this.entity_id=s.replace("-","_"),this.cast=null!==document.querySelector("hc-main"),this.connect(),document.body.addEventListener("ll-custom",(e=>{e.detail.browser_mod&&this.msg_callback(e.detail.browser_mod)}));const e=o(306);console.info(`%cBROWSER_MOD ${e.version} IS INSTALLED\n %cDeviceID: ${s}`,"color: green; font-weight: bold","")}async msg_callback(e){const t={update:e=>this.update(e),debug:e=>this.debug(e),play:e=>this.player_play(e.media_content_id),pause:e=>this.player_pause(),stop:e=>this.player_stop(),"set-volume":e=>this.player_set_volume(e.volume_level),mute:e=>this.player_mute(e.mute),toast:e=>this.do_toast(e.message,e.duration),popup:e=>this.do_popup(e),"close-popup":e=>this.do_close_popup(),"more-info":e=>this.do_more_info(e.entity_id,e.large),navigate:e=>this.do_navigate(e.navigation_path),"set-theme":e=>this.set_theme(e),"lovelace-reload":e=>this.lovelace_reload(e),"window-reload":()=>window.location.reload(),blackout:e=>this.do_blackout(e.time?parseInt(e.time):void 0),"no-blackout":e=>{e.brightness&&this.isFully&&window.fully.setScreenBrightness(e.brightness),this.no_blackout()},"call-service":e=>this.call_service(e),commands:async e=>{for(const t of e.commands)await this.msg_callback(t)},delay:async e=>await new Promise((t=>{window.setTimeout(t,1e3*e.seconds)}))};await t[e.command.replace("_","-")](e)}debug(e){y("deviceID",{type:"markdown",content:`# ${s}`}),alert(s)}set_theme(e){e.theme||(e.theme="default"),p("settheme",{theme:e.theme},document.querySelector("home-assistant"))}lovelace_reload(e){const t=c();t&&p("config-refresh",{},t)}call_service(e){const t=e=>{if("string"==typeof e&&"this"===e)return s;if(Array.isArray(e))return e.map(t);if(e.constructor==Object)for(const o in e)e[o]=t(e[o]);return e},[o,i]=e.service.split(".",2);let a=t(JSON.parse(JSON.stringify(e.service_data)));this._hass.callService(o,i,a)}update(e=null){e&&(e.name&&(this.entity_id=e.name.toLowerCase()),e.camera&&this.setup_camera(),this.config={...this.config,...e}),this.player_update(),this.fully_update(),this.screen_update(),this.sensor_update()}}const D=[customElements.whenDefined("home-assistant"),customElements.whenDefined("hc-main")];Promise.race(D).then((()=>{window.setTimeout((()=>{window.browser_mod=window.browser_mod||new q}),1e3)}))})()})(); \ No newline at end of file