/*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __decorate(decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 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; return c > 3 && r && Object.defineProperty(target, key, r), r; } /** * @license * Copyright 2019 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ const t$2=window.ShadowRoot&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,e$3=Symbol(),n$4=new Map;class s$3{constructor(t,n){if(this._$cssResult$=!0,n!==e$3)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t;}get styleSheet(){let e=n$4.get(this.cssText);return t$2&&void 0===e&&(n$4.set(this.cssText,e=new CSSStyleSheet),e.replaceSync(this.cssText)),e}toString(){return this.cssText}}const o$3=t=>new s$3("string"==typeof t?t:t+"",e$3),r$2=(t,...n)=>{const o=1===t.length?t[0]:n.reduce(((e,n,s)=>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.")})(n)+t[s+1]),t[0]);return new s$3(o,e$3)},i$2=(e,n)=>{t$2?e.adoptedStyleSheets=n.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet)):n.forEach((t=>{const n=document.createElement("style"),s=window.litNonce;void 0!==s&&n.setAttribute("nonce",s),n.textContent=t.cssText,e.appendChild(n);}));},S$1=t$2?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const n of t.cssRules)e+=n.cssText;return o$3(e)})(t):t; /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */var s$2;const e$2=window.trustedTypes,r$1=e$2?e$2.emptyScript:"",h$1=window.reactiveElementPolyfillSupport,o$2={toAttribute(t,i){switch(i){case Boolean:t=t?r$1: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}},n$3=(t,i)=>i!==t&&(i==i||t==t),l$2={attribute:!0,type:String,converter:o$2,reflect:!1,hasChanged:n$3};class a$1 extends HTMLElement{constructor(){super(),this._$Et=new Map,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Ei=null,this.o();}static addInitializer(t){var i;null!==(i=this.l)&&void 0!==i||(this.l=[]),this.l.push(t);}static get observedAttributes(){this.finalize();const t=[];return this.elementProperties.forEach(((i,s)=>{const e=this._$Eh(s,i);void 0!==e&&(this._$Eu.set(e,s),t.push(e));})),t}static createProperty(t,i=l$2){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$2}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._$Eu=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(S$1(i));}else void 0!==i&&s.push(S$1(i));return s}static _$Eh(t,i){const s=i.attribute;return !1===s?void 0:"string"==typeof s?s:"string"==typeof t?t.toLowerCase():void 0}o(){var t;this._$Ep=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$Em(),this.requestUpdate(),null===(t=this.constructor.l)||void 0===t||t.forEach((t=>t(this)));}addController(t){var i,s;(null!==(i=this._$Eg)&&void 0!==i?i:this._$Eg=[]).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._$Eg)||void 0===i||i.splice(this._$Eg.indexOf(t)>>>0,1);}_$Em(){this.constructor.elementProperties.forEach(((t,i)=>{this.hasOwnProperty(i)&&(this._$Et.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$2(s,this.constructor.elementStyles),s}connectedCallback(){var t;void 0===this.renderRoot&&(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),null===(t=this._$Eg)||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._$Eg)||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);}_$ES(t,i,s=l$2){var e,r;const h=this.constructor._$Eh(t,s);if(void 0!==h&&!0===s.reflect){const n=(null!==(r=null===(e=s.converter)||void 0===e?void 0:e.toAttribute)&&void 0!==r?r:o$2.toAttribute)(i,s.type);this._$Ei=t,null==n?this.removeAttribute(h):this.setAttribute(h,n),this._$Ei=null;}}_$AK(t,i){var s,e,r;const h=this.constructor,n=h._$Eu.get(t);if(void 0!==n&&this._$Ei!==n){const t=h.getPropertyOptions(n),l=t.converter,a=null!==(r=null!==(e=null===(s=l)||void 0===s?void 0:s.fromAttribute)&&void 0!==e?e:"function"==typeof l?l:null)&&void 0!==r?r:o$2.fromAttribute;this._$Ei=n,this[n]=a(i,t.type),this._$Ei=null;}}requestUpdate(t,i,s){let e=!0;void 0!==t&&(((s=s||this.constructor.getPropertyOptions(t)).hasChanged||n$3)(this[t],i)?(this._$AL.has(t)||this._$AL.set(t,i),!0===s.reflect&&this._$Ei!==t&&(void 0===this._$EC&&(this._$EC=new Map),this._$EC.set(t,s))):e=!1),!this.isUpdatePending&&e&&(this._$Ep=this._$E_());}async _$E_(){this.isUpdatePending=!0;try{await this._$Ep;}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._$Et&&(this._$Et.forEach(((t,i)=>this[i]=t)),this._$Et=void 0);let i=!1;const s=this._$AL;try{i=this.shouldUpdate(s),i?(this.willUpdate(s),null===(t=this._$Eg)||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._$EU();}catch(t){throw i=!1,this._$EU(),t}i&&this._$AE(s);}willUpdate(t){}_$AE(t){var i;null===(i=this._$Eg)||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);}_$EU(){this._$AL=new Map,this.isUpdatePending=!1;}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$Ep}shouldUpdate(t){return !0}update(t){void 0!==this._$EC&&(this._$EC.forEach(((t,i)=>this._$ES(i,this[i],t))),this._$EC=void 0),this._$EU();}updated(t){}firstUpdated(t){}}a$1.finalized=!0,a$1.elementProperties=new Map,a$1.elementStyles=[],a$1.shadowRootOptions={mode:"open"},null==h$1||h$1({ReactiveElement:a$1}),(null!==(s$2=globalThis.reactiveElementVersions)&&void 0!==s$2?s$2:globalThis.reactiveElementVersions=[]).push("1.3.1"); /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ var t$1;const i$1=globalThis.trustedTypes,s$1=i$1?i$1.createPolicy("lit-html",{createHTML:t=>t}):void 0,e$1=`lit$${(Math.random()+"").slice(9)}$`,o$1="?"+e$1,n$2=`<${o$1}>`,l$1=document,h=(t="")=>l$1.createComment(t),r=t=>null===t||"object"!=typeof t&&"function"!=typeof t,d=Array.isArray,u=t=>{var i;return d(t)||"function"==typeof(null===(i=t)||void 0===i?void 0:i[Symbol.iterator])},c=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,v=/-->/g,a=/>/g,f=/>|[ \n \r](?:([^\s"'>=/]+)([ \n \r]*=[ \n \r]*(?:[^ \n \r"'`<>=]|("|')|))|$)/g,_=/'/g,m=/"/g,g=/^(?:script|style|textarea|title)$/i,p=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),$=p(1),b=Symbol.for("lit-noChange"),w=Symbol.for("lit-nothing"),T=new WeakMap,x=(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 N(i.insertBefore(h(),t),t,void 0,null!=s?s:{});}return l._$AI(t),l},A=l$1.createTreeWalker(l$1,129,null,!1),C=(t,i)=>{const o=t.length-1,l=[];let h,r=2===i?"":"",d=c;for(let i=0;i"===u[0]?(d=null!=h?h:c,p=-1):void 0===u[1]?p=-2:(p=d.lastIndex-u[2].length,o=u[1],d=void 0===u[3]?f:'"'===u[3]?m:_):d===m||d===_?d=f:d===v||d===a?d=c:(d=f,h=void 0);const y=d===f&&t[i+1].startsWith("/>")?" ":"";r+=d===c?s+n$2:p>=0?(l.push(o),s.slice(0,p)+"$lit$"+s.slice(p)+e$1+y):s+e$1+(-2===p?(l.push(void 0),i):y);}const u=r+(t[o]||"")+(2===i?"":"");if(!Array.isArray(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return [void 0!==s$1?s$1.createHTML(u):u,l]};class E{constructor({strings:t,_$litType$:s},n){let l;this.parts=[];let r=0,d=0;const u=t.length-1,c=this.parts,[v,a]=C(t,s);if(this.el=E.createElement(v,n),A.currentNode=this.el.content,2===s){const t=this.el.content,i=t.firstChild;i.remove(),t.append(...i.childNodes);}for(;null!==(l=A.nextNode())&&c.length0){l.textContent=i$1?i$1.emptyScript:"";for(let i=0;i2||""!==s[0]||""!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=w;}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=P(this,t,i,0),n=!r(t)||t!==this._$AH&&t!==b,n&&(this._$AH=t);else {const e=t;let l,h;for(t=o[0],l=0;l"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)} /** * @license * Copyright 2017 Google LLC * SPDX-License-Identifier: BSD-3-Clause */function t(t){return e({...t,state:!0})} /** * @license * Copyright 2021 Google LLC * SPDX-License-Identifier: BSD-3-Clause */var n;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)); // Loads in ha-config-dashboard which is used to copy styling // Also provides ha-settings-row const loadConfigDashboard = async () => { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; await customElements.whenDefined("partial-panel-resolver"); const ppResolver = document.createElement("partial-panel-resolver"); const routes = ppResolver.getRoutes([ { component_name: "config", url_path: "a", }, ]); await ((_c = (_b = (_a = routes === null || routes === void 0 ? void 0 : routes.routes) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.load) === null || _c === void 0 ? void 0 : _c.call(_b)); await customElements.whenDefined("ha-panel-config"); const configRouter = document.createElement("ha-panel-config"); await ((_g = (_f = (_e = (_d = configRouter === null || configRouter === void 0 ? void 0 : configRouter.routerOptions) === null || _d === void 0 ? void 0 : _d.routes) === null || _e === void 0 ? void 0 : _e.dashboard) === null || _f === void 0 ? void 0 : _f.load) === null || _g === void 0 ? void 0 : _g.call(_f)); // Load ha-config-dashboard await ((_l = (_k = (_j = (_h = configRouter === null || configRouter === void 0 ? void 0 : configRouter.routerOptions) === null || _h === void 0 ? void 0 : _h.routes) === null || _j === void 0 ? void 0 : _j.cloud) === null || _k === void 0 ? void 0 : _k.load) === null || _l === void 0 ? void 0 : _l.call(_k)); // Load ha-settings-row await customElements.whenDefined("ha-config-dashboard"); }; const loadDeveloperToolsTemplate = async () => { var _a, _b, _c, _d, _e, _f, _g; await customElements.whenDefined("partial-panel-resolver"); await customElements.whenDefined("partial-panel-resolver"); const ppResolver = document.createElement("partial-panel-resolver"); const routes = ppResolver.getRoutes([ { component_name: "developer-tools", url_path: "a", }, ]); await ((_c = (_b = (_a = routes === null || routes === void 0 ? void 0 : routes.routes) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.load) === null || _c === void 0 ? void 0 : _c.call(_b)); const dtRouter = document.createElement("developer-tools-router"); await ((_g = (_f = (_e = (_d = dtRouter === null || dtRouter === void 0 ? void 0 : dtRouter.routerOptions) === null || _d === void 0 ? void 0 : _d.routes) === null || _e === void 0 ? void 0 : _e.template) === null || _f === void 0 ? void 0 : _f.load) === null || _g === void 0 ? void 0 : _g.call(_f)); await customElements.whenDefined("developer-tools-template"); }; class BrowserModRegisteredBrowsersCard$1 extends s { constructor() { super(...arguments); this.dirty = false; } toggleRegister() { var _a; if (!((_a = window.browser_mod) === null || _a === void 0 ? void 0 : _a.connected)) return; window.browser_mod.registered = !window.browser_mod.registered; this.dirty = true; } changeBrowserID(ev) { window.browser_mod.browserID = ev.target.value; this.dirty = true; } toggleCameraEnabled() { window.browser_mod.cameraEnabled = !window.browser_mod.cameraEnabled; this.dirty = true; } firstUpdated() { window.browser_mod.addEventListener("browser-mod-config-update", () => this.requestUpdate()); } render() { var _a, _b, _c, _d, _e; return $ `

This Browser
${((_a = window.browser_mod) === null || _a === void 0 ? void 0 : _a.connected) ? $ ` ` : $ ` `}

${this.dirty ? $ ` It is strongly recommended to refresh your browser window after changing any of the settings in this box. ` : ""}
Register Enable this browser as a Device in Home Assistant BrowserID A unique identifier for this browser-device combination. ${((_d = window.browser_mod) === null || _d === void 0 ? void 0 : _d.registered) ? $ ` ${this._renderSuspensionAlert()} Enable camera Get camera input from this browser (hardware dependent) ${this._renderInteractionAlert()} ${this._renderFKBSettingsInfo()} ` : ""}
`; } _renderSuspensionAlert() { if (!this.hass.suspendWhenHidden) return $ ``; return $ ` Home Assistant will close the websocket connection to the server automatically after 5 minutes of inactivity.

While decreasing network trafic and memory usage, this may cause problems for browser_mod operation.

If you find that some things stop working for this Browser after a time, try going to your Profile Settings and disabling the option "${this.hass.localize("ui.panel.profile.suspend.header") || "Automatically close connection"}".
`; } _renderInteractionAlert() { return $ ` For security reasons many browsers require the user to interact with a webpage before allowing audio playback or video capture. This may affect the media_player and camera components of Browser Mod.

If you ever see a symbol at the bottom right corner of the screen, please tap or click anywhere on the page. This should allow Browser Mod to work again.
`; } _renderFKBSettingsInfo() { var _a, _b; if (!((_a = window.browser_mod) === null || _a === void 0 ? void 0 : _a.fully) || !this.getFullySettings()) return $ ``; return $ ` ${((_b = window.browser_mod) === null || _b === void 0 ? void 0 : _b.fully) && this.getFullySettings() ? $ ` You are using FullyKiosk Browser. It is recommended to enable the following settings:
    ${this.getFullySettings()}
` : ""} `; } getFullySettings() { if (!window.browser_mod.fully) return null; const retval = []; const wcs = []; // Web Content Settings // Autoplay Videos if (window.fully.getBooleanSetting("autoplayVideos") !== "true") wcs.push($ `
  • Autoplay Videos
  • `); // Autoplay Audio if (window.fully.getBooleanSetting("autoplayAudio") !== "true") wcs.push($ `
  • Autoplay Audio
  • `); // Enable Webcam Access (PLUS) if (window.fully.getBooleanSetting("webcamAccess") !== "true") wcs.push($ `
  • Enable Webcam Access (PLUS)
  • `); if (wcs.length !== 0) { retval.push($ `
  • Web Content Settings
    • ${wcs}
    `); } // Advanced Web Settings // Enable JavaScript Interface (PLUS) if (window.fully.getBooleanSetting("websiteIntegration") !== "true") retval.push($ `
  • Advanced Web Settings
    • Enable JavaScript Interface (PLUS)
    `); // Device Management // Keep Screen On if (window.fully.getBooleanSetting("keepScreenOn") !== "true") retval.push($ `
  • Device Management
    • Keep Screen On
    `); // Power Settings // Prevent from Sleep while Screen Off if (window.fully.getBooleanSetting("preventSleepWhileScreenOff") !== "true") retval.push($ `
  • Power Settings
    • Prevent from Sleep while Screen Off
    `); const md = []; // Motion Detection (PLUS) // Enable Visual Motion Detection if (window.fully.getBooleanSetting("motionDetection") !== "true") md.push($ `
  • Enable Visual Motion Detection
  • `); // Turn Screen On on Motion if (window.fully.getBooleanSetting("screenOnOnMotion") !== "true") md.push($ `
  • Turn Screen On on Motion
  • `); // Exit Screensaver on Motion if (window.fully.getBooleanSetting("stopScreensaverOnMotion") !== "true") md.push($ `
  • Exit Screensaver on Motion
  • `); if (md.length !== 0) { retval.push($ `
  • Motion Detection (PLUS)
    • ${md}
    `); } // Remote Administration (PLUS) // Enable Remote Administration if (window.fully.getBooleanSetting("remoteAdmin") !== "true") retval.push($ `
  • Remote Administration (PLUS)
    • Enable Remote Administration
    `); return retval.length ? retval : null; } static get styles() { return r$2 ` .card-header { display: flex; justify-content: space-between; } ha-textfield { width: 250px; display: block; margin-top: 8px; } `; } } __decorate([ e() ], BrowserModRegisteredBrowsersCard$1.prototype, "hass", void 0); __decorate([ e() ], BrowserModRegisteredBrowsersCard$1.prototype, "dirty", void 0); customElements.define("browser-mod-browser-settings-card", BrowserModRegisteredBrowsersCard$1); class BrowserModRegisteredBrowsersCard extends s { firstUpdated() { window.browser_mod.addEventListener("browser-mod-config-update", () => this.requestUpdate()); } unregister_browser(ev) { const browserID = ev.currentTarget.browserID; const unregisterCallback = () => { console.log(browserID, window.browser_mod.browserID); if (browserID === window.browser_mod.browserID) { console.log("Unregister self"); window.browser_mod.registered = false; } else { window.browser_mod.connection.sendMessage({ type: "browser_mod/unregister", browserID, }); } }; window.browser_mod.showPopup("Unregister browser", `Are you sure you want to unregister browser ${browserID}?`, { right_button: "Yes", right_button_action: unregisterCallback, left_button: "No", }); } render() { return $ `
    ${Object.keys(window.browser_mod.browsers).map((d) => $ ` ${d} Last connected: `)}
    `; } static get styles() { return r$2 ` ha-icon-button > * { display: flex; } `; } } __decorate([ e() ], BrowserModRegisteredBrowsersCard.prototype, "hass", void 0); customElements.define("browser-mod-registered-browsers-card", BrowserModRegisteredBrowsersCard); loadDeveloperToolsTemplate(); class BrowserModFrontendSettingsCard extends s { constructor() { super(...arguments); this._selectedTab = 0; } firstUpdated() { window.browser_mod.addEventListener("browser-mod-config-update", () => this.requestUpdate()); window.browser_mod.addEventListener("browser-mod-favicon-update", () => this.requestUpdate()); } _handleSwitchTab(ev) { this._selectedTab = parseInt(ev.detail.index, 10); } render() { const level = ["user", "browser", "global"][this._selectedTab]; return $ `

    Please note: The settings in this section severely change the way the Home Assistant frontend works and looks. It is very easy to forget that you made a setting here when you switch devices or user.

    Do not report any issues to Home Assistant before clearing EVERY setting here and thouroghly clearing all your browser caches. Failure to do so means you risk wasting a lot of peoples time, and you will be severly and rightfully ridiculed.

    Global settings are applied for all users and browsers.
    User settings are applied to the current user and overrides any Global settings.
    Browser settings are applied for the current browser and overrides any User or Global settings.

    ${this._render_settings(level)}
    `; } _render_settings(level) { const global = window.browser_mod.global_settings; const browser = window.browser_mod.browser_settings; const user = window.browser_mod.user_settings; const current = { global, browser, user }[level]; const DESC_BOOLEAN = (val) => ({ true: "Enabled", false: "Disabled", undefined: "Unset" }[String(val)]); const DESC_SET_UNSET = (val) => (val === undefined ? "Unset" : "Set"); const OVERRIDDEN = (key) => { if (level !== "browser" && browser[key] !== undefined) return $ `
    Overridden by browser setting`; if (level === "global" && user[key] !== undefined) return $ `
    Overridden by user setting`; }; return $ `
    Favicon template ${OVERRIDDEN("faviconTemplate")} { const tpl = ev.detail.value || undefined; window.browser_mod.set_setting("faviconTemplate", tpl, level); }} > window.browser_mod.set_setting("faviconTemplate", undefined, level)} > Clear
    Title template ${OVERRIDDEN("titleTemplate")} { const tpl = ev.detail.value || undefined; window.browser_mod.set_setting("titleTemplate", tpl, level); }} > window.browser_mod.set_setting("titleTemplate", undefined, level)} > Clear
    Hide Sidebar Hide the sidebar and hamburger menu Currently: ${DESC_BOOLEAN(current.hideSidebar)} ${OVERRIDDEN("hideSidebar")} window.browser_mod.set_setting("hideSidebar", true, level)} > Enable window.browser_mod.set_setting("hideSidebar", false, level)} > Disable window.browser_mod.set_setting("hideSidebar", undefined, level)} > Clear
    Hide Header Hide the header on all pages Currently: ${DESC_BOOLEAN(current.hideHeader)} ${OVERRIDDEN("hideHeader")} window.browser_mod.set_setting("hideHeader", true, level)} > Enable window.browser_mod.set_setting("hideHeader", false, level)} > Disable window.browser_mod.set_setting("hideHeader", undefined, level)} > Clear
    Sidebar order Order and visibility of sidebar buttons Currently: ${DESC_SET_UNSET(current.sidebarPanelOrder)} ${OVERRIDDEN("sidebarPanelOrder")} Clearing this does NOT restore the original default order. { window.browser_mod.set_setting("sidebarPanelOrder", localStorage.getItem("sidebarPanelOrder"), level); window.browser_mod.set_setting("sidebarHiddenPanels", localStorage.getItem("sidebarHiddenPanels"), level); }} > Set { window.browser_mod.set_setting("sidebarPanelOrder", undefined, level); window.browser_mod.set_setting("sidebarHiddenPanels", undefined, level); }} > Clear
    Default dashboard The dashboard that's displayed by default Currently: ${DESC_SET_UNSET(current.defaultPanel)} ${OVERRIDDEN("defaultPanel")} Clearing this does NOT restore the original default dashboard. { window.browser_mod.set_setting("defaultPanel", localStorage.getItem("defaultPanel"), level); }} > Set { window.browser_mod.set_setting("defaultPanel", undefined, level); }} > Clear
    `; } static get styles() { return r$2 ` .box { border: 1px solid var(--divider-color); padding: 8px; } .separator { border-bottom: 1px solid var(--divider-color); margin: 0 -8px; } img.favicon { width: 64px; height: 64px; margin-left: 16px; } mwc-tab-bar ha-icon { display: flex; align-items: center; } `; } } __decorate([ e() ], BrowserModFrontendSettingsCard.prototype, "hass", void 0); __decorate([ t() ], BrowserModFrontendSettingsCard.prototype, "_selectedTab", void 0); customElements.define("browser-mod-frontend-settings-card", BrowserModFrontendSettingsCard); loadConfigDashboard().then(() => { class BrowserModPanel extends s { firstUpdated() { window.browser_mod.addEventListener("browser-mod-config-update", () => this.requestUpdate()); } render() { return $ `
    Browser Mod Settings
    `; } static get styles() { var _a, _b; return [ ...((_b = (_a = customElements.get("ha-config-dashboard")) === null || _a === void 0 ? void 0 : _a.styles) !== null && _b !== void 0 ? _b : []), r$2 ` :host { --app-header-background-color: var(--sidebar-background-color); --app-header-text-color: var(--sidebar-text-color); --app-header-border-bottom: 1px solid var(--divider-color); --ha-card-border-radius: var(--ha-config-card-border-radius, 8px); } ha-config-section { padding: 16px 0; } `, ]; } } __decorate([ e() ], BrowserModPanel.prototype, "hass", void 0); __decorate([ e() ], BrowserModPanel.prototype, "narrow", void 0); __decorate([ e() ], BrowserModPanel.prototype, "connection", void 0); customElements.define("browser-mod-panel", BrowserModPanel); });