diff --git a/custom_components/houseplan/frontend/houseplan-card.js b/custom_components/houseplan/frontend/houseplan-card.js index abbbe61d..e015f983 100755 --- a/custom_components/houseplan/frontend/houseplan-card.js +++ b/custom_components/houseplan/frontend/houseplan-card.js @@ -1,4 +1,4 @@ -globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="8f44f3a00bc48a1f93365a849e5ac0d3330808f0272a287bd0af7be018918dbd";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,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.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?m:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,g?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,$=t=>t,x=k.trustedTypes,S=x?x.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,E=Array.isArray,I="[ \t\n\f\r]",z=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,F=/-->/g,N=/>/g,O=RegExp(`>|${I}(?:([^\\s"'>=/]+)(${I}*=${I}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),L=/'/g,H=/"/g,q=/^(?:script|style|textarea|title)$/i,B=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),U=B(1),W=B(2),j=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!E(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=z;for(let e=0;e"===l[0]?(r=n??z,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?O:'"'===l[3]?H:L):r===H||r===L?r=O:r===F||r===N?r=z:(r=O,n=void 0);const d=r===O&&t[e+1].startsWith("/>")?" ":"";o+=r===z?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||">")+(2===e?"":3===e?"":"")),s]};class Z{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iE(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new Z(t)),e}k(t){E(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=J(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==j,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return j}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2;let pt=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const{I:_t}=rt,mt=t=>t,gt=()=>document.createComment(""),ft=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(gt(),n),o=s.insertBefore(gt(),n);i=new _t(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=mt(t).nextSibling;mt(s).insertBefore(t,n),t=e}}}return i},vt=(t,e,i=t)=>(t._$AI(e,i),t),yt={},bt=(t,e=yt)=>t._$AH=e,wt=t=>{t._$AR(),t._$AA.remove()},kt=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},$t=(t=>(...e)=>({_$litDirective$:t,values:e}))(class extends pt{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=vt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=vt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=vt(n[d],o[_]),ft(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=vt(n[u],o[p]),ft(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=kt(r,p,_),h=kt(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=ft(t,n[d]);vt(e,o[p]),l[p]=e}else l[p]=vt(i,o[p]),ft(t,n[d],i),n[e]=null;p++}else wt(n[u]),u--;else wt(n[d]),d++;for(;p<=_;){const e=ft(t,l[_+1]);vt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&wt(t)}return this.ut=r,bt(t,l),j}}),xt=new WeakMap;let St=0;class Mt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++St,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=xt.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),xt.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?xt.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=xt.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void xt.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=s=>{if(s instanceof HTMLElement&&(s.matches(t)&&e.push(s),s.shadowRoot))for(const t of s.shadowRoot.childNodes)i(t);else for(const t of s.childNodes)i(t)};for(const t of this.childNodes)i(t);const s=this.overlayPortal();return s&&i(s),e.filter(t=>{const e=getComputedStyle(t);return!t.hidden&&"none"!==e.display&&"hidden"!==e.visibility})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=U` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="117e675d4314f3ef3d16b7d94885f953bbc856da645e488f37045ef5a04716eb";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,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.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?m:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,g?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,$=t=>t,x=k.trustedTypes,S=x?x.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,E=Array.isArray,I="[ \t\n\f\r]",z=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,F=/-->/g,N=/>/g,O=RegExp(`>|${I}(?:([^\\s"'>=/]+)(${I}*=${I}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),L=/'/g,H=/"/g,q=/^(?:script|style|textarea|title)$/i,B=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),U=B(1),W=B(2),j=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!E(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=z;for(let e=0;e"===l[0]?(r=n??z,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?O:'"'===l[3]?H:L):r===H||r===L?r=O:r===F||r===N?r=z:(r=O,n=void 0);const d=r===O&&t[e+1].startsWith("/>")?" ":"";o+=r===z?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||">")+(2===e?"":3===e?"":"")),s]};class Z{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iE(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new Z(t)),e}k(t){E(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=J(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==j,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return j}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2;let pt=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const{I:_t}=rt,mt=t=>t,gt=()=>document.createComment(""),ft=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(gt(),n),o=s.insertBefore(gt(),n);i=new _t(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=mt(t).nextSibling;mt(s).insertBefore(t,n),t=e}}}return i},vt=(t,e,i=t)=>(t._$AI(e,i),t),yt={},bt=(t,e=yt)=>t._$AH=e,wt=t=>{t._$AR(),t._$AA.remove()},kt=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},$t=(t=>(...e)=>({_$litDirective$:t,values:e}))(class extends pt{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=vt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=vt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=vt(n[d],o[_]),ft(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=vt(n[u],o[p]),ft(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=kt(r,p,_),h=kt(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=ft(t,n[d]);vt(e,o[p]),l[p]=e}else l[p]=vt(i,o[p]),ft(t,n[d],i),n[e]=null;p++}else wt(n[u]),u--;else wt(n[d]),d++;for(;p<=_;){const e=ft(t,l[_+1]);vt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&wt(t)}return this.ut=r,bt(t,l),j}}),xt=new WeakMap;let St=0;class Mt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++St,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=xt.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),xt.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?xt.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=xt.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void xt.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=s=>{if(s instanceof HTMLElement&&(s.matches(t)&&e.push(s),s.shadowRoot))for(const t of s.shadowRoot.childNodes)i(t);else for(const t of s.childNodes)i(t)};for(const t of this.childNodes)i(t);const s=this.overlayPortal();return s&&i(s),e.filter(t=>{const e=getComputedStyle(t);return!t.hidden&&"none"!==e.display&&"hidden"!==e.visibility})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=U` ${this.icon?U``:G} ${this.title} `;return this._useHaDialog?U`0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Nc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Oc(t){return t.replaceAll("_"," ")}function Lc(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function Hc(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function qc(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Nc(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(Uc(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Ui(t,i.entity_id);n=s?Wi(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Oc(i.attribute)} · ${Nc(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?Uc(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Ui(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Lc(o,100/255);if("volume_level"===i)return Lc(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Lc(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=jl(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:Hc(i)}}function Bc(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));if(i)return{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>Dl(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&Kl(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function Uc(t,e){const i=t?.entities?.[e];if(i&&!bl(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||bl(s)}function Wc(t,e){return Uc(t,e)&&!!t?.states?.[e]}function jc(t,e,i=[e]){const s=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||s.add(t);const n=[],o=Bl(t,i),r=o.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),a=i=>{const s=zc(i);if(n.some(t=>t.key===s))return;const o=qc(t,e,i,r),a="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";n.push({key:s,source:i,label:o.sourceLabel,technical:a,value:o.text,available:"available"===o.availability})};for(const e of[...s].sort()){if(!Wc(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;a({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Ic[i]||[])t in(n?.attributes||{})&&a({kind:"entity_attribute",entity_id:e,attribute:t})}const l=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&l.add(`marker:${e.marker.id}`);const c=new Set(o.map(t=>t.key));for(const t of[...l].sort())c.has(t)&&a({kind:"derived_marker_state",ref:t});return e.virtual||null==jl(t,e.entities)||a({kind:"derived_lqi"}),n}function Gc(t,e,i){const s=Bc(t,e);if(s&&i.some(t=>t.key===zc(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}const Vc={sourceKind:"none",visualSources:[],criticalSources:[],samples:[]};function Kc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Yc(t,e){const i=t?.states?.[e];if(!i)return"";if("function"==typeof t?.formatEntityState)try{const e=t.formatEntityState(i);if("string"==typeof e&&e)return e}catch{}return String(i.state??"")}function Xc(t,e,i,s){return{eid:e,role:i,name:Kc(t,e),state:String(t?.states?.[e]?.state??""),stateText:Yc(t,e),integrationDomain:t?.entities?.[e]?.platform||null,sample:s||sl(t,e)}}function Zc(t,e,i=[e],s){const n=e.hidden&&e.userHidden?{...e,hidden:!1}:e;let o="none",r=[];const a=(l=Sc({hass:t,devices:i,device:n,lightSources:s}),"cover"!==l?.semantics?null:l.targets[0]?.entityId||l.skippedTargets[0]?.entityId||null);var l;const c=Bl(t,[n]),h=Il(n.marker?.binding,n.marker?.controls??n.controls,n.entities),d=new Set(h.filter(t=>t.startsWith("marker:"))),u=!0===n.marker?.is_light||d.size>0?s||Bl(t,i):c,p=u.filter(t=>t.device.id===n.id&&"controls"!==t.via),_=c.filter(t=>"controls"!==t.via),m=[...c.filter(t=>"controls"===t.via),...p.length?p:_];if(d.size)for(const t of u){if(!d.has(t.key))continue;t.stateEids.length>0&&m.some(e=>e.stateEids.some(e=>t.stateEids.includes(e)))||m.some(e=>e.key===t.key)||m.push({...t,via:"controls",castsGlow:!1})}if(a)o="cover",r=[Xc(t,a,"cover")];else if(m.length)o=m.some(t=>"controls"===t.via)?"controls":"light",r=m.map(i=>{const s="controls"===i.via?"control":"forced"===i.via?"forced_light":"light";if(!i.passive)return Xc(t,i.eid,s);const n=i.on?"on":"off";return{eid:i.key,role:s,name:e.name,state:n,stateText:n,integrationDomain:null,sample:{eid:i.key,state:n,availability:"available",status:i.on?"working":"neutral",activity:"none",edge:"none"}}});else{const e=Rl(t,n.entities),i=e.length?e:n.entities.filter(e=>!!t?.states?.[e]);if(i.length){o="device_role";const e=function(t,e,i){const s=e.map(e=>sl(t,e)),n=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category);return 1===e.length&&n.length>1&&el(t,e[0])?s.map(t=>"unavailable"===t.availability?t:"off"===t.state?{...t,availability:"unavailable",status:"neutral",activity:"none",edge:"none"}:{...t,status:"neutral",activity:"none",edge:"none"}):s}(t,i,n.entities);r=i.map((i,s)=>Xc(t,i,"device_role",e[s]))}else n.primary&&(o="primary",r=[Xc(t,n.primary,"primary")])}const g=[];for(const e of n.entities||[]){const i=sl(t,e);"alarm"!==i.status||r.some(t=>t.eid===e)||g.push(Xc(t,e,"critical",i))}return{sourceKind:o,visualSources:r,criticalSources:g,samples:[...r,...g].map(t=>t.sample)}}function Jc(t,e,i,s){if(e.virtual)return{source:null,text:null,fallback:"value_virtual"};if(s){const i=function(t,e){if(!0!==e.marker?.use_climate_temp)return null;for(const i of e.entities){if(!i.startsWith("climate."))continue;const e=Number(t?.states?.[i]?.attributes?.current_temperature);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(i)return{source:{kind:"temperature",eid:i.eid,attribute:"current_temperature",text:i.text},text:i.text,fallback:null};const s=function(t,e){if("mdi:thermometer"!==e.icon&&"mdi:air-filter"!==e.icon)return null;for(const i of e.entities){if(!Dl(t,i))continue;const e=Number(t?.states?.[i]?.state);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(s)return{source:{kind:"temperature",eid:s.eid,text:s.text},text:s.text,fallback:null};const n=function(t,e){if(!e.primary||!Kl(t,e.primary))return null;const i=Number(t?.states?.[e.primary]?.state);return Number.isFinite(i)?{eid:e.primary,text:`${Math.round(i)}%`}:null}(t,e);if(n)return{source:{kind:"humidity",eid:n.eid,text:n.text},text:n.text,fallback:null}}if(1!==i.visualSources.length)return{source:null,text:null,fallback:i.visualSources.length?"value_ambiguous_sources":"value_no_state"};const n=i.visualSources[0].eid,o=function(t,e){const i=t?.states?.[e];if(!i||null==i.state||""===String(i.state).trim())return{text:"",fallback:"value_no_state"};const s=i.state;if(!["string","number","boolean"].includes(typeof s))return{text:"",fallback:"value_non_scalar"};const n=String(s).trim().toLowerCase();if("unknown"===n||"unavailable"===n)return{text:"",fallback:"value_no_state"};const o=Ui(t,e);return o?{text:Wi(o,String(i.attributes?.unit_of_measurement||"")),fallback:null}:{text:"",fallback:"value_no_state"}}(t,n);return o.fallback?{source:null,text:null,fallback:o.fallback}:{source:{kind:"entity",eid:n,text:o.text},text:o.text,fallback:null}}function Qc(t,e,i){const s=t.marker?.binding||(t.bindingKind&&t.bindingRef?`${t.bindingKind}:${t.bindingRef}`:t.virtual?"virtual":""),n=[...e.visualSources.map(t=>`${t.role}:${t.eid}`),...e.criticalSources.map(t=>`critical:${t.eid}`)].sort(),o=i?`${i.kind}:${i.eid}:${i.attribute||""}`:"none";return[s,e.sourceKind,...n,`value:${o}`].join("\n")}function th(t,e,i){return Qc(e,i||Zc(t,e),null).replace(/\nvalue:none$/,"")}function eh(t){if(t.effectiveHidden)return[];if("static_icon"===t.display)return["static-icon"];const e=[],{visual:i}=t;return"alarm"===t.pulse.kind?e.push("alarm"):"unavailable"===i.availability?e.push("unavail"):"working"===i.status?e.push("on"):"open"===i.status&&e.push("open"),"none"!==t.pulse.reason&&"alarm"!==t.pulse.reason&&e.push("activity-"+t.pulse.reason),t.pulse.generation%2==0&&(e.push("pulse-gen2"),"short"===t.pulse.kind&&e.push("activity-gen2")),e}function ih(t,e,i){const s=Ei(e.marker?.display),n="static_icon"===s,o=n&&!1===i.sourceDetails?Vc:Zc(t,e,i.lightDevices||[e],i.lightSources),r=e.bindingStatus,a="ha_disabled"===r?.kind,l="orphaned"===r?.kind,c=!0===e.userHidden||!0===e.marker?.hidden,h=a||c&&!i.designPreview,d=nl(o.samples);let u=d;h||n?u={availability:"available",status:"neutral",activity:"none"}:"alarm"===d.status||i.liveStates||(u={availability:"available",status:"neutral",activity:"none"});const p=n&&!1===i.sourceDetails?{source:null,text:null,fallback:null}:Jc(t,e,o,i.showTemperature),_=Qc(e,o,p.source),m=th(t,e,o),g=i.activityRuntime,f=i.now??Date.now(),v=g?.expiresAt||(g?.flashTs?g.flashTs+3300:0);!n&&!h&&i.liveStates&&"alarm"!==d.status&&g?.sources===m&&g.flashTs&&g.flashKind&&v>f&&(u={...u,activity:g.flashKind});const y="icon_ripple"===s&&!h&&i.liveStates&&"alarm"!==u.status?u.activity:"none",b=n||h||!i.showTemperature?null:!0===e.marker?.use_climate_temp?Vl(t,e.entities):"mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon?Gl(t,e.entities):null,w=!n&&!h&&i.showTemperature&&e.primary&&Kl(t,e.primary)?Yl(t,e.entities):null,k=n||h||!i.showSignal||e.virtual?null:jl(t,e.entities),$=function(t,e,i){const s=null!=e.marker?.value_badge;if(i.effectiveHidden||"static_icon"===i.display)return null;const n=e.marker?.value_badge;if(s)return n?.enabled&&n.source?{configured:!0,enabled:!0,position:n.position||"right",...qc(t,e,n.source,i.markerStates)}:null;if(!i.showTemperature||"value"===i.display)return null;const o=Bc(t,e);if(!o)return null;let r=null,a="default";if("entity_attribute"===o.kind&&"current_temperature"===o.attribute){const i=Vl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=Gl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else{const i=Yl(t,e.entities);null!=i&&(r=`${i}%`),a="humidity"}return null==r?null:{configured:!1,enabled:!0,source:o,position:"right",sourceLabel:"entity_attribute"===o.kind?`${Oc(o.attribute)} · ${Nc(t,o.entity_id)}`:"entity_state"===o.kind?Nc(t,o.entity_id):"",text:r,fullText:r,availability:"available",isLqi:!1,tone:a}}(t,e,{showTemperature:i.showTemperature,showSignal:i.showSignal,display:s,effectiveHidden:h,markerStates:o.visualSources.filter(t=>t.eid.startsWith("marker:")).map(t=>({ref:t.eid,on:"on"===t.state,name:t.name}))}),x="cover"===o.sourceKind?o.visualSources[0]?.eid:e.primary||o.visualSources[0]?.eid,S=x?t?.states?.[x]:null,M=!i.liveStates||n||h?e.icon:hs(e.icon,x?.split(".")[0],S?.attributes?.device_class,S?.state,!!e.marker?.icon),C=!i.liveStates||n||h?null:o.visualSources.filter(t=>!t.eid.startsWith("marker:")).map(e=>function(t){return t&&"on"===t.state?Rt(t.attributes?.rgb_color):null}(t?.states?.[e.eid])).find(t=>!!t)||null,D=Number(e.marker?.size)>0?Number(e.marker.size):1,T=Number(e.marker?.angle)||0,P=Number(e.marker?.ripple_size)>0?Number(e.marker.ripple_size):3,R=Dt(e.marker?.ripple_color,null),A=n?null:R||C||null,E=function(t){const{display:e,visual:i,semanticActivity:s,liveStates:n,effectiveHidden:o,bindingUnavailable:r=!1,reducedMotion:a=!1}=t,l=Math.max(1,Math.trunc(t.shortGeneration||1)),c=Number.isFinite(t.diameterScale)?Math.max(1,Number(t.diameterScale)):3,h=t.color||null;if(o||r||"static_icon"===e)return qt(l,h,c);if("alarm"===i.status)return{kind:"alarm",reason:"alarm",generation:l,expiresAt:null,color:"#f25a4a",diameterScale:3,animated:!a,reducedMotionIndicator:"none"};if(!n||"icon_ripple"!==e)return qt(l,h,c);const d=t.now??Date.now(),u=t.shortExpiresAt||null;return t.shortReason&&null!=u&&u>d?{kind:"short",reason:t.shortReason,generation:l,expiresAt:u,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:"presence"===s||"transition"===s||"running"===s?{kind:"continuous",reason:s,generation:l,expiresAt:null,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:qt(l,h,c)}({display:s,visual:u,semanticActivity:d.activity,shortReason:g?.sources===m?g?.flashKind:null,shortGeneration:g?.gen,shortExpiresAt:g?.sources===m?v:null,now:f,liveStates:i.liveStates,effectiveHidden:h,bindingUnavailable:a||l,reducedMotion:i.reducedMotion,color:A,diameterScale:P}),I="value"!==s||h?null:p.text,z="ha_disabled"===r?.kind?r.reason:null,F=function(t,e,i,s,n,o,r,a){return o?"ha_disabled":r?"orphaned":"static_icon"===a?"static_icon":"alarm"===e.status?"alarm":n?"unavailable"===e.availability?"unavailable":"cover"===s?"cover_icon_state":"presence"===i?"presence":"event"===i?"event":"transition"===i?"transition":"working"===e.status?"icon_ripple"===a&&"none"!==i?"working_activity":"working":"open"===e.status?"open":(t.primary||"").startsWith("media_player.")?"media_neutral":"neutral":"live_states_disabled"}(e,u,y,o.sourceKind,i.liveStates,a,l,s),N=[];i.designPreview&&c&&N.push("hidden_design_preview"),n||!0!==e.marker?.vacuum?.live||N.push("vacuum_live_plan_only");const O=1===o.visualSources.length&&el(t,o.visualSources[0].eid),L=e.entities.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category).length;O&&L>1&&N.push("composite_power_source"),"icon_ripple"!==s&&"static_icon"!==s&&"alarm"!==d.status&&"none"!==d.activity&&N.push("activity_display_disabled");const H={binding:e.marker?.binding||(e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:e.virtual?"virtual":""),sourceKind:o.sourceKind,visualSources:o.visualSources,criticalSources:o.criticalSources,valueSource:p.source,sourceSignature:_,visual:u,display:s,icon:M,valueText:I,valueFullText:I,fallbackReason:"value"!==s||I?null:p.fallback,activity:y,activityGeneration:g?.gen||1,pulse:E,classes:[],tempText:null==b?null:String(b),humText:null==w?null:String(w),valueBadge:$,lqiText:null==k||$?.isLqi?null:String(k),lqiColor:null==k?null:ti(k),lightColor:C,scale:D,angle:T,rippleScale:P,rippleColor:A,userHidden:c,effectiveHidden:h,haDisabled:a,disabledReason:z,orphaned:l,vacuumLive:!n&&!0===e.marker?.vacuum?.live,explanation:{reason:F,notices:N}};return{...H,classes:eh(H)}}function sh(t,e=new WeakMap){if(null===t||"object"!=typeof t)return t;const i=t,s=e.get(i);if(s)return s;if(Array.isArray(t)){const s=[];e.set(i,s);for(const i of t)s.push(sh(i,e));return Object.freeze(s)}const n={};e.set(i,n);for(const[i,s]of Object.entries(t))"function"!=typeof s&&(n[i]=sh(s,e));return Object.freeze(n)}function nh(t){const e=new Map(t);let i;return i=Object.freeze({get size(){return e.size},get:t=>e.get(t),has:t=>e.has(t),entries:()=>e.entries(),keys:()=>e.keys(),values:()=>e.values(),forEach:(t,s)=>e.forEach((e,n)=>t.call(s,e,n,i)),[Symbol.iterator]:()=>e[Symbol.iterator]()}),i}function oh(t){const e=new Set(t.entityIds||[]),i=new Set(t.deviceIds||[]),s=new Set(t.areaIds||[]);for(const s of t.devices){for(const t of s.entities||[])e.add(t);s.primary&&e.add(s.primary);for(const t of s.controls||[])e.add(t);s.marker?.vacuum?.source&&e.add(s.marker.vacuum.source),"device"===s.bindingKind&&s.bindingRef&&i.add(s.bindingRef),"entity"===s.bindingKind&&s.bindingRef&&e.add(s.bindingRef)}const n={},o={};for(const[o,r]of Object.entries(t.hass?.entities||{})){const a=r?.device_id?t.hass?.devices?.[r.device_id]:null;(e.has(o)||r?.device_id&&i.has(r.device_id)||s.has(r?.area_id)||s.has(a?.area_id))&&(e.add(o),n[o]=r,r?.device_id&&i.add(r.device_id))}for(const e of i){const i=t.hass?.devices?.[e];i&&(o[e]=i)}const r={};for(const i of e){const e=t.hass?.states?.[i];e&&(r[i]=e)}const a=Object.freeze({states:sh(r),entities:sh(n),devices:sh(o),config:sh(t.hass?.config),locale:sh(t.hass?.locale),themes:sh(t.hass?.themes)});return Object.freeze({sourceSequence:t.sourceSequence,capturedAt:t.capturedAt??Date.now(),hass:a,devices:sh([...t.devices]),positions:nh([...t.positions||[]].map(([t,e])=>[t,Object.freeze({x:e.x,y:e.y})])),presentations:nh([...t.presentations].map(([t,e])=>[t,sh(e)])),facts:nh([...t.facts||[]].map(([t,e])=>[t,sh(e)]))})}const rh=(t,e)=>`${t}:${e?1:0}`;function ah(t){const e=dr(t.cfg),i={};for(const e of t.cfg.spaces||[])for(const t of e.rooms||[])t.area&&(i[t.area]=e.id);const s=t.cfg.settings?.exclude_integrations?new Set(t.cfg.settings.exclude_integrations):qs,n=Us(t.cfg.settings?.icon_rules?.length?t.cfg.settings.icon_rules:Bs);return ec({hass:t.hass,registry:t.registry,areaToSpace:i,markers:t.cfg.markers||[],settings:t.cfg.settings||{},excluded:s,showAll:!!t.cfg.settings?.show_all,firstSpaceId:e[0]?.id||"",loc:e=>Os(t.lang,e),iconRules:n})}function lh(t){const e=dr(t.cfg).find(e=>e.id===t.spaceId);if(!e)return null;const i=es(t.cfg.spaces.find(e=>e.id===t.spaceId)),s=ns(t.cfg.settings),n=t.iconSize??2.5,o=n>8?2.5:n,r=t.registry?wl(t.hass,t.registry):t.hass,a=(t.devices||ah(t)).filter(e=>e.space===t.spaceId),l=a.filter(t=>!t.hidden),c=function(t,e,i){const s={},n=i/100*Ar(e)*1.3;for(const i of e.rooms){if(!i.area)continue;const e=t.filter(t=>t.area===i.area);if(!e.length)continue;const o=zr(i),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(e.length*a/Math.max(l,1)))),h=a/c,d=l/Math.max(Math.ceil(e.length/c),1),u=e.map((t,e)=>({x:o.x+r+h*(e%c+.5),y:o.y+r+d*(Math.floor(e/c)+.5)}));Pi(u,o,n,.5*r),e.forEach((t,e)=>s[t.id]=vr(u[e]))}return s}(a,e,o),h=[];for(const e of l){const i=t.layout[e.id];if(i&&i.s===t.spaceId){const t=i.x*or,e=i.y*or;h.push({minX:t,minY:e,maxX:t,maxY:e})}}const d=t.cfg.spaces.find(e=>e.id===t.spaceId)||{},u=Array.isArray(d.walls)?d.walls:[],p=Number(d.cell_cm)>0?Number(d.cell_cm):5,_=function(t,e,i){const s=[];for(const n of t.partitions||[]){const t=Vo(n.a,n.b,n.cm,e,i);t&&s.push(t)}for(const n of t.room_drafts||[])s.push(...Yo(n,e,i));for(const n of t.wall_columns||[])s.push(Ko(n,e,i));return s}(e,p,mr);for(const t of _){const e=t.map(t=>t[0]),i=t.map(t=>t[1]);e.length&&h.push({minX:Math.min(...e),minY:Math.min(...i),maxX:Math.max(...e),maxY:Math.max(...i)})}const m=Pr(e,h),g=[m.x,m.y,m.w,m.h],f=new Map(e.rooms.map(t=>{const e=Ms(i.fill,t);return[t,rs(e,"lqi"===e&&t.area?nc(r,a,t.area):null,"light"===e?Wl(Bl(r,a,t)):"none","temp"===e&&t.area?oc(r,a,t.area):null,i.tempMin,i.tempMax,s,ts(i.customFill,t))]})),v=e.rooms.filter(t=>t.area||i.showBorders||"none"!==Ms(i.fill,t)).map(t=>{let s="room "+(e.bg?"overlay":"yard"),n="";const o=Ms(i.fill,t);if(i.showBorders||"none"!==o){s+=" styled";const e=[`--room-stroke:${i.color}`,`--room-stroke-op:${i.showBorders?i.opacity:0}`],o=f.get(t)||null;o?(s+=" filled",e.push(`--room-fill:${o.color}`,`--room-fill-op:${o.opacity.toFixed(3)}`)):e.push("--room-fill:transparent","--room-fill-op:0"),n=e.join(";")}const r=t.id||G,a=t.area||G,l=t.poly?W``}_valueChanged(t){const e={...this._config,...t.detail.value},i=new Event("config-changed",{bubbles:!0,composed:!0});i.detail={config:e},this.dispatchEvent(i)}}Ec.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",Ec);const Ic={climate:["current_temperature","temperature","current_humidity","humidity"],water_heater:["current_temperature","temperature"],cover:["current_position"],valve:["current_position"],fan:["percentage"],humidifier:["current_humidity","humidity"],light:["brightness"],media_player:["volume_level"],vacuum:["battery_level","fan_speed"],lawn_mower:["battery_level","fan_speed"]};function zc(t){return t?"entity_state"===t.kind?`state:${t.entity_id}`:"entity_attribute"===t.kind?`attr:${t.entity_id}:${t.attribute}`:"derived_marker_state"===t.kind?`marker:${t.ref}`:"derived:lqi":""}function Fc(t){if("derived:lqi"===t)return{kind:"derived_lqi"};if(t.startsWith("state:"))return{kind:"entity_state",entity_id:t.slice(6)};if(t.startsWith("attr:")){const e=t.slice(5),i=e.lastIndexOf(":");if(i>0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Nc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Oc(t){return t.replaceAll("_"," ")}function Lc(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function Hc(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function qc(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Nc(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(Uc(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Ui(t,i.entity_id);n=s?Wi(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Oc(i.attribute)} · ${Nc(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?Uc(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Ui(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Lc(o,100/255);if("volume_level"===i)return Lc(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Lc(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=jl(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:Hc(i)}}function Bc(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));if(i)return{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>Dl(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&Kl(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function Uc(t,e){const i=t?.entities?.[e];if(i&&!bl(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||bl(s)}function Wc(t,e){return Uc(t,e)&&!!t?.states?.[e]}function jc(t,e,i=[e]){const s=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||s.add(t);const n=[],o=Bl(t,i),r=o.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),a=i=>{const s=zc(i);if(n.some(t=>t.key===s))return;const o=qc(t,e,i,r),a="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";n.push({key:s,source:i,label:o.sourceLabel,technical:a,value:o.text,available:"available"===o.availability})};for(const e of[...s].sort()){if(!Wc(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;a({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Ic[i]||[])t in(n?.attributes||{})&&a({kind:"entity_attribute",entity_id:e,attribute:t})}const l=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&l.add(`marker:${e.marker.id}`);const c=new Set(o.map(t=>t.key));for(const t of[...l].sort())c.has(t)&&a({kind:"derived_marker_state",ref:t});return e.virtual||null==jl(t,e.entities)||a({kind:"derived_lqi"}),n}function Gc(t,e,i){const s=Bc(t,e);if(s&&i.some(t=>t.key===zc(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}const Vc={sourceKind:"none",visualSources:[],criticalSources:[],samples:[]};function Kc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Yc(t,e){const i=t?.states?.[e];if(!i)return"";if("function"==typeof t?.formatEntityState)try{const e=t.formatEntityState(i);if("string"==typeof e&&e)return e}catch{}return String(i.state??"")}function Xc(t,e,i,s){return{eid:e,role:i,name:Kc(t,e),state:String(t?.states?.[e]?.state??""),stateText:Yc(t,e),integrationDomain:t?.entities?.[e]?.platform||null,sample:s||sl(t,e)}}function Zc(t,e,i=[e],s){const n=e.hidden&&e.userHidden?{...e,hidden:!1}:e;let o="none",r=[];const a=(l=Sc({hass:t,devices:i,device:n,lightSources:s}),"cover"!==l?.semantics?null:l.targets[0]?.entityId||l.skippedTargets[0]?.entityId||null);var l;const c=Bl(t,[n]),h=Il(n.marker?.binding,n.marker?.controls??n.controls,n.entities),d=new Set(h.filter(t=>t.startsWith("marker:"))),u=!0===n.marker?.is_light||d.size>0?s||Bl(t,i):c,p=u.filter(t=>t.device.id===n.id&&"controls"!==t.via),_=c.filter(t=>"controls"!==t.via),m=[...c.filter(t=>"controls"===t.via),...p.length?p:_];if(d.size)for(const t of u){if(!d.has(t.key))continue;t.stateEids.length>0&&m.some(e=>e.stateEids.some(e=>t.stateEids.includes(e)))||m.some(e=>e.key===t.key)||m.push({...t,via:"controls",castsGlow:!1})}if(a)o="cover",r=[Xc(t,a,"cover")];else if(m.length)o=m.some(t=>"controls"===t.via)?"controls":"light",r=m.map(i=>{const s="controls"===i.via?"control":"forced"===i.via?"forced_light":"light";if(!i.passive)return Xc(t,i.eid,s);const n=i.on?"on":"off";return{eid:i.key,role:s,name:e.name,state:n,stateText:n,integrationDomain:null,sample:{eid:i.key,state:n,availability:"available",status:i.on?"working":"neutral",activity:"none",edge:"none"}}});else{const e=Rl(t,n.entities),i=e.length?e:n.entities.filter(e=>!!t?.states?.[e]);if(i.length){o="device_role";const e=function(t,e,i){const s=e.map(e=>sl(t,e)),n=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category);return 1===e.length&&n.length>1&&el(t,e[0])?s.map(t=>"unavailable"===t.availability?t:"off"===t.state?{...t,availability:"unavailable",status:"neutral",activity:"none",edge:"none"}:{...t,status:"neutral",activity:"none",edge:"none"}):s}(t,i,n.entities);r=i.map((i,s)=>Xc(t,i,"device_role",e[s]))}else n.primary&&(o="primary",r=[Xc(t,n.primary,"primary")])}const g=[];for(const e of n.entities||[]){const i=sl(t,e);"alarm"!==i.status||r.some(t=>t.eid===e)||g.push(Xc(t,e,"critical",i))}return{sourceKind:o,visualSources:r,criticalSources:g,samples:[...r,...g].map(t=>t.sample)}}function Jc(t,e,i,s){if(e.virtual)return{source:null,text:null,fallback:"value_virtual"};if(s){const i=function(t,e){if(!0!==e.marker?.use_climate_temp)return null;for(const i of e.entities){if(!i.startsWith("climate."))continue;const e=Number(t?.states?.[i]?.attributes?.current_temperature);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(i)return{source:{kind:"temperature",eid:i.eid,attribute:"current_temperature",text:i.text},text:i.text,fallback:null};const s=function(t,e){if("mdi:thermometer"!==e.icon&&"mdi:air-filter"!==e.icon)return null;for(const i of e.entities){if(!Dl(t,i))continue;const e=Number(t?.states?.[i]?.state);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(s)return{source:{kind:"temperature",eid:s.eid,text:s.text},text:s.text,fallback:null};const n=function(t,e){if(!e.primary||!Kl(t,e.primary))return null;const i=Number(t?.states?.[e.primary]?.state);return Number.isFinite(i)?{eid:e.primary,text:`${Math.round(i)}%`}:null}(t,e);if(n)return{source:{kind:"humidity",eid:n.eid,text:n.text},text:n.text,fallback:null}}if(1!==i.visualSources.length)return{source:null,text:null,fallback:i.visualSources.length?"value_ambiguous_sources":"value_no_state"};const n=i.visualSources[0].eid,o=function(t,e){const i=t?.states?.[e];if(!i||null==i.state||""===String(i.state).trim())return{text:"",fallback:"value_no_state"};const s=i.state;if(!["string","number","boolean"].includes(typeof s))return{text:"",fallback:"value_non_scalar"};const n=String(s).trim().toLowerCase();if("unknown"===n||"unavailable"===n)return{text:"",fallback:"value_no_state"};const o=Ui(t,e);return o?{text:Wi(o,String(i.attributes?.unit_of_measurement||"")),fallback:null}:{text:"",fallback:"value_no_state"}}(t,n);return o.fallback?{source:null,text:null,fallback:o.fallback}:{source:{kind:"entity",eid:n,text:o.text},text:o.text,fallback:null}}function Qc(t,e,i){const s=t.marker?.binding||(t.bindingKind&&t.bindingRef?`${t.bindingKind}:${t.bindingRef}`:t.virtual?"virtual":""),n=[...e.visualSources.map(t=>`${t.role}:${t.eid}`),...e.criticalSources.map(t=>`critical:${t.eid}`)].sort(),o=i?`${i.kind}:${i.eid}:${i.attribute||""}`:"none";return[s,e.sourceKind,...n,`value:${o}`].join("\n")}function th(t,e,i){return Qc(e,i||Zc(t,e),null).replace(/\nvalue:none$/,"")}function eh(t){if(t.effectiveHidden)return[];if("static_icon"===t.display)return["static-icon"];const e=[],{visual:i}=t;return"alarm"===t.pulse.kind?e.push("alarm"):"unavailable"===i.availability?e.push("unavail"):"working"===i.status?e.push("on"):"open"===i.status&&e.push("open"),"none"!==t.pulse.reason&&"alarm"!==t.pulse.reason&&e.push("activity-"+t.pulse.reason),t.pulse.generation%2==0&&(e.push("pulse-gen2"),"short"===t.pulse.kind&&e.push("activity-gen2")),e}function ih(t,e,i){const s=Ei(e.marker?.display),n="static_icon"===s,o=n&&!1===i.sourceDetails?Vc:Zc(t,e,i.lightDevices||[e],i.lightSources),r=e.bindingStatus,a="ha_disabled"===r?.kind,l="orphaned"===r?.kind,c=!0===e.userHidden||!0===e.marker?.hidden,h=a||c&&!i.designPreview,d=nl(o.samples);let u=d;h||n?u={availability:"available",status:"neutral",activity:"none"}:"alarm"===d.status||i.liveStates||(u={availability:"available",status:"neutral",activity:"none"});const p=n&&!1===i.sourceDetails?{source:null,text:null,fallback:null}:Jc(t,e,o,i.showTemperature),_=Qc(e,o,p.source),m=th(t,e,o),g=i.activityRuntime,f=i.now??Date.now(),v=g?.expiresAt||(g?.flashTs?g.flashTs+3300:0);!n&&!h&&i.liveStates&&"alarm"!==d.status&&g?.sources===m&&g.flashTs&&g.flashKind&&v>f&&(u={...u,activity:g.flashKind});const y="icon_ripple"===s&&!h&&i.liveStates&&"alarm"!==u.status?u.activity:"none",b=n||h||!i.showTemperature?null:!0===e.marker?.use_climate_temp?Vl(t,e.entities):"mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon?Gl(t,e.entities):null,w=!n&&!h&&i.showTemperature&&e.primary&&Kl(t,e.primary)?Yl(t,e.entities):null,k=n||h||!i.showSignal||e.virtual?null:jl(t,e.entities),$=function(t,e,i){const s=null!=e.marker?.value_badge;if(i.effectiveHidden||"static_icon"===i.display)return null;const n=e.marker?.value_badge;if(s)return n?.enabled&&n.source?{configured:!0,enabled:!0,position:n.position||"right",...qc(t,e,n.source,i.markerStates)}:null;if(!i.showTemperature||"value"===i.display)return null;const o=Bc(t,e);if(!o)return null;let r=null,a="default";if("entity_attribute"===o.kind&&"current_temperature"===o.attribute){const i=Vl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=Gl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else{const i=Yl(t,e.entities);null!=i&&(r=`${i}%`),a="humidity"}return null==r?null:{configured:!1,enabled:!0,source:o,position:"right",sourceLabel:"entity_attribute"===o.kind?`${Oc(o.attribute)} · ${Nc(t,o.entity_id)}`:"entity_state"===o.kind?Nc(t,o.entity_id):"",text:r,fullText:r,availability:"available",isLqi:!1,tone:a}}(t,e,{showTemperature:i.showTemperature,showSignal:i.showSignal,display:s,effectiveHidden:h,markerStates:o.visualSources.filter(t=>t.eid.startsWith("marker:")).map(t=>({ref:t.eid,on:"on"===t.state,name:t.name}))}),x="cover"===o.sourceKind?o.visualSources[0]?.eid:e.primary||o.visualSources[0]?.eid,S=x?t?.states?.[x]:null,M=!i.liveStates||n||h?e.icon:hs(e.icon,x?.split(".")[0],S?.attributes?.device_class,S?.state,!!e.marker?.icon),C=!i.liveStates||n||h?null:o.visualSources.filter(t=>!t.eid.startsWith("marker:")).map(e=>function(t){return t&&"on"===t.state?Rt(t.attributes?.rgb_color):null}(t?.states?.[e.eid])).find(t=>!!t)||null,D=Number(e.marker?.size)>0?Number(e.marker.size):1,T=Number(e.marker?.angle)||0,P=Number(e.marker?.ripple_size)>0?Number(e.marker.ripple_size):3,R=Dt(e.marker?.ripple_color,null),A=n?null:R||C||null,E=function(t){const{display:e,visual:i,semanticActivity:s,liveStates:n,effectiveHidden:o,bindingUnavailable:r=!1,reducedMotion:a=!1}=t,l=Math.max(1,Math.trunc(t.shortGeneration||1)),c=Number.isFinite(t.diameterScale)?Math.max(1,Number(t.diameterScale)):3,h=t.color||null;if(o||r||"unavailable"===i.availability||"static_icon"===e)return qt(l,h,c);if("alarm"===i.status)return{kind:"alarm",reason:"alarm",generation:l,expiresAt:null,color:"#f25a4a",diameterScale:3,animated:!a,reducedMotionIndicator:"none"};if(!n||"icon_ripple"!==e)return qt(l,h,c);const d=t.now??Date.now(),u=t.shortExpiresAt||null;return t.shortReason&&null!=u&&u>d?{kind:"short",reason:t.shortReason,generation:l,expiresAt:u,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:"presence"===s||"transition"===s||"running"===s?{kind:"continuous",reason:s,generation:l,expiresAt:null,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:qt(l,h,c)}({display:s,visual:u,semanticActivity:d.activity,shortReason:g?.sources===m?g?.flashKind:null,shortGeneration:g?.gen,shortExpiresAt:g?.sources===m?v:null,now:f,liveStates:i.liveStates,effectiveHidden:h,bindingUnavailable:a||l,reducedMotion:i.reducedMotion,color:A,diameterScale:P}),I="value"!==s||h?null:p.text,z="ha_disabled"===r?.kind?r.reason:null,F=function(t,e,i,s,n,o,r,a){return o?"ha_disabled":r?"orphaned":"static_icon"===a?"static_icon":"alarm"===e.status?"alarm":n?"unavailable"===e.availability?"unavailable":"cover"===s?"cover_icon_state":"presence"===i?"presence":"event"===i?"event":"transition"===i?"transition":"working"===e.status?"icon_ripple"===a&&"none"!==i?"working_activity":"working":"open"===e.status?"open":(t.primary||"").startsWith("media_player.")?"media_neutral":"neutral":"live_states_disabled"}(e,u,y,o.sourceKind,i.liveStates,a,l,s),N=[];i.designPreview&&c&&N.push("hidden_design_preview"),n||!0!==e.marker?.vacuum?.live||N.push("vacuum_live_plan_only");const O=1===o.visualSources.length&&el(t,o.visualSources[0].eid),L=e.entities.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category).length;O&&L>1&&N.push("composite_power_source"),"icon_ripple"!==s&&"static_icon"!==s&&"alarm"!==d.status&&"none"!==d.activity&&N.push("activity_display_disabled");const H={binding:e.marker?.binding||(e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:e.virtual?"virtual":""),sourceKind:o.sourceKind,visualSources:o.visualSources,criticalSources:o.criticalSources,valueSource:p.source,sourceSignature:_,visual:u,display:s,icon:M,valueText:I,valueFullText:I,fallbackReason:"value"!==s||I?null:p.fallback,activity:y,activityGeneration:g?.gen||1,pulse:E,classes:[],tempText:null==b?null:String(b),humText:null==w?null:String(w),valueBadge:$,lqiText:null==k||$?.isLqi?null:String(k),lqiColor:null==k?null:ti(k),lightColor:C,scale:D,angle:T,rippleScale:P,rippleColor:A,userHidden:c,effectiveHidden:h,haDisabled:a,disabledReason:z,orphaned:l,vacuumLive:!n&&!0===e.marker?.vacuum?.live,explanation:{reason:F,notices:N}};return{...H,classes:eh(H)}}function sh(t,e=new WeakMap){if(null===t||"object"!=typeof t)return t;const i=t,s=e.get(i);if(s)return s;if(Array.isArray(t)){const s=[];e.set(i,s);for(const i of t)s.push(sh(i,e));return Object.freeze(s)}const n={};e.set(i,n);for(const[i,s]of Object.entries(t))"function"!=typeof s&&(n[i]=sh(s,e));return Object.freeze(n)}function nh(t){const e=new Map(t);let i;return i=Object.freeze({get size(){return e.size},get:t=>e.get(t),has:t=>e.has(t),entries:()=>e.entries(),keys:()=>e.keys(),values:()=>e.values(),forEach:(t,s)=>e.forEach((e,n)=>t.call(s,e,n,i)),[Symbol.iterator]:()=>e[Symbol.iterator]()}),i}function oh(t){const e=new Set(t.entityIds||[]),i=new Set(t.deviceIds||[]),s=new Set(t.areaIds||[]);for(const s of t.devices){for(const t of s.entities||[])e.add(t);s.primary&&e.add(s.primary);for(const t of s.controls||[])e.add(t);s.marker?.vacuum?.source&&e.add(s.marker.vacuum.source),"device"===s.bindingKind&&s.bindingRef&&i.add(s.bindingRef),"entity"===s.bindingKind&&s.bindingRef&&e.add(s.bindingRef)}const n={},o={};for(const[o,r]of Object.entries(t.hass?.entities||{})){const a=r?.device_id?t.hass?.devices?.[r.device_id]:null;(e.has(o)||r?.device_id&&i.has(r.device_id)||s.has(r?.area_id)||s.has(a?.area_id))&&(e.add(o),n[o]=r,r?.device_id&&i.add(r.device_id))}for(const e of i){const i=t.hass?.devices?.[e];i&&(o[e]=i)}const r={};for(const i of e){const e=t.hass?.states?.[i];e&&(r[i]=e)}const a=Object.freeze({states:sh(r),entities:sh(n),devices:sh(o),config:sh(t.hass?.config),locale:sh(t.hass?.locale),themes:sh(t.hass?.themes)});return Object.freeze({sourceSequence:t.sourceSequence,capturedAt:t.capturedAt??Date.now(),hass:a,devices:sh([...t.devices]),positions:nh([...t.positions||[]].map(([t,e])=>[t,Object.freeze({x:e.x,y:e.y})])),presentations:nh([...t.presentations].map(([t,e])=>[t,sh(e)])),facts:nh([...t.facts||[]].map(([t,e])=>[t,sh(e)]))})}const rh=(t,e)=>`${t}:${e?1:0}`;function ah(t){const e=dr(t.cfg),i={};for(const e of t.cfg.spaces||[])for(const t of e.rooms||[])t.area&&(i[t.area]=e.id);const s=t.cfg.settings?.exclude_integrations?new Set(t.cfg.settings.exclude_integrations):qs,n=Us(t.cfg.settings?.icon_rules?.length?t.cfg.settings.icon_rules:Bs);return ec({hass:t.hass,registry:t.registry,areaToSpace:i,markers:t.cfg.markers||[],settings:t.cfg.settings||{},excluded:s,showAll:!!t.cfg.settings?.show_all,firstSpaceId:e[0]?.id||"",loc:e=>Os(t.lang,e),iconRules:n})}function lh(t){const e=dr(t.cfg).find(e=>e.id===t.spaceId);if(!e)return null;const i=es(t.cfg.spaces.find(e=>e.id===t.spaceId)),s=ns(t.cfg.settings),n=t.iconSize??2.5,o=n>8?2.5:n,r=t.registry?wl(t.hass,t.registry):t.hass,a=(t.devices||ah(t)).filter(e=>e.space===t.spaceId),l=a.filter(t=>!t.hidden),c=function(t,e,i){const s={},n=i/100*Ar(e)*1.3;for(const i of e.rooms){if(!i.area)continue;const e=t.filter(t=>t.area===i.area);if(!e.length)continue;const o=zr(i),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(e.length*a/Math.max(l,1)))),h=a/c,d=l/Math.max(Math.ceil(e.length/c),1),u=e.map((t,e)=>({x:o.x+r+h*(e%c+.5),y:o.y+r+d*(Math.floor(e/c)+.5)}));Pi(u,o,n,.5*r),e.forEach((t,e)=>s[t.id]=vr(u[e]))}return s}(a,e,o),h=[];for(const e of l){const i=t.layout[e.id];if(i&&i.s===t.spaceId){const t=i.x*or,e=i.y*or;h.push({minX:t,minY:e,maxX:t,maxY:e})}}const d=t.cfg.spaces.find(e=>e.id===t.spaceId)||{},u=Array.isArray(d.walls)?d.walls:[],p=Number(d.cell_cm)>0?Number(d.cell_cm):5,_=function(t,e,i){const s=[];for(const n of t.partitions||[]){const t=Vo(n.a,n.b,n.cm,e,i);t&&s.push(t)}for(const n of t.room_drafts||[])s.push(...Yo(n,e,i));for(const n of t.wall_columns||[])s.push(Ko(n,e,i));return s}(e,p,mr);for(const t of _){const e=t.map(t=>t[0]),i=t.map(t=>t[1]);e.length&&h.push({minX:Math.min(...e),minY:Math.min(...i),maxX:Math.max(...e),maxY:Math.max(...i)})}const m=Pr(e,h),g=[m.x,m.y,m.w,m.h],f=new Map(e.rooms.map(t=>{const e=Ms(i.fill,t);return[t,rs(e,"lqi"===e&&t.area?nc(r,a,t.area):null,"light"===e?Wl(Bl(r,a,t)):"none","temp"===e&&t.area?oc(r,a,t.area):null,i.tempMin,i.tempMax,s,ts(i.customFill,t))]})),v=e.rooms.filter(t=>t.area||i.showBorders||"none"!==Ms(i.fill,t)).map(t=>{let s="room "+(e.bg?"overlay":"yard"),n="";const o=Ms(i.fill,t);if(i.showBorders||"none"!==o){s+=" styled";const e=[`--room-stroke:${i.color}`,`--room-stroke-op:${i.showBorders?i.opacity:0}`],o=f.get(t)||null;o?(s+=" filled",e.push(`--room-fill:${o.color}`,`--room-fill-op:${o.opacity.toFixed(3)}`)):e.push("--room-fill:transparent","--room-fill-op:0"),n=e.join(";")}const r=t.id||G,a=t.area||G,l=t.poly?W``:W``;return l}),y=e.rooms.filter(t=>{const e=f.get(t);return Cs(i.glow,t)&&(!e||e.opacity<=0)}).map(t=>t.poly?W`${this._toast}`:G} - `;const i=this._spaceModel(),s=i.vb,n="devices"===this._mode&&this._showAll,o=this._renderDevices.filter(t=>t.space===i.id&&(!t.hidden||n)),r=this._renderDeviceSnapshot,a=this._spaceDisplayForRender(),l=this._resolvedRoomFills(i,a),c=this._resolvedGlowBase(i,a,l),h=a.showLqi??this._config.show_signal??!0,d=this._config.icon_size??2.5,u=d>8?2.5:d,p=this._viewOr(s),_=this._editing?"":this._stageBg(a),m=this._editing||"daynight"!==this._effBgMode()?null:this._sunNow(),g=m?bn(Mn(m.elevation)).planDim:0,f=this._opMeasureView,v=this._decorMeasure,y=this._bdLive,b=this._furnLive,w="view"===this._mode?this._editorChromeMode:this._mode,k=this._roomHoverPaths(i),$=i.bg?this._display(i.bg.href):"",x=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,S=this._modeTransitionVisual,M=S?.stageColor||_,C=S?.sceneBrightness??(m?1-g:1);return U` + `;const i=this._spaceModel(),s=i.vb,n="devices"===this._mode&&this._showAll,o=this._renderDevices.filter(t=>t.space===i.id&&(!t.hidden||n)),r=this._renderDeviceSnapshot,a=this._spaceDisplayForRender(),l=this._resolvedRoomFills(i,a),c=this._resolvedGlowBase(i,a,l),h=a.showLqi??this._config.show_signal??!0,d=this._config.icon_size??2.5,u=d>8?2.5:d,p=this._viewOr(s),_=this._editing?"":this._stageBg(a),m=this._editing||"daynight"!==this._effBgMode()?null:this._sunNow(),g=m?bn(Mn(m.elevation)).planDim:0,f=this._opMeasureView,v=this._decorMeasure,y=this._bdLive,b=this._furnLive,w="view"===this._mode?this._editorChromeMode:this._mode,k=this._roomHoverPaths(i),$=i.bg?this._display(i.bg.href):"",x=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,S=this._modeTransitionVisual,M=this._modeTransition.state?.from.presentedMode,C=!this._markup||!!S&&("view"===S.presentedMode||"devices"===S.presentedMode||"view"===M||"devices"===M),D=S?.stageColor||_,T=S?.sceneBrightness??(m?1-g:1);return U` this._markupClick(t)} @wheel=${t=>this._onWheel(t)} @pointerdown=${t=>{this._notePointer(t),this._stagePointerDown(t)}} @@ -4933,7 +4933,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="8f44f3a00bc48a1f93365a849e5ac0d33308 ${this._renderEditorSecondary()} + style="${1!==T?`filter:brightness(${T.toFixed(3)})`:""}"> ${""} ${this._wallHatchDefs(a.color)}${W`${this._paperShapes(i.rooms).map(t=>"poly"in t?W``:W``)}`} @@ -4979,7 +4979,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="8f44f3a00bc48a1f93365a849e5ac0d33308 ${this._renderGlowBaseRooms(i,c)} ${this._renderOpeningTunnelFills(i,c,"glow-base")} ${this._renderSvgRoomLabels(i,a)} - ${this._renderGlowLayer(i,a)} + ${C?this._renderGlowLayer(i,a):G} ${this._renderSunRays(i)} ${this._editing?this._renderAlignGuides():G} ${f?.guide?this._renderOpeningCenterTick(f.guide):G} diff --git a/demo/golden/harness.mjs b/demo/golden/harness.mjs index d99c38ce..09235e39 100644 --- a/demo/golden/harness.mjs +++ b/demo/golden/harness.mjs @@ -174,6 +174,11 @@ export async function prepareGoldenScenario(page, scenario) { await wait(15); } }; + const settleMode = async (card) => { + await until(() => !card._modeTransitionBusy); + await card.updateComplete; + await frame(); + }; window.__goldenCard?.remove?.(); window.__card?.remove?.(); localStorage.clear(); @@ -239,6 +244,7 @@ export async function prepareGoldenScenario(page, scenario) { if (scenario.mode) { card._setMode(scenario.mode); await card.updateComplete; + await settleMode(card); } if (Number.isFinite(scenario.zoom)) { card._applyView(scenario.zoom, 500, 500); @@ -304,6 +310,7 @@ export async function prepareGoldenScenario(page, scenario) { if (scenario.dialog === 'device') { card._setMode('devices'); await card.updateComplete; + await settleMode(card); const device = card._devices.find((item) => item.id === scenario.deviceId); if (!device) throw new Error(`golden device missing: ${scenario.deviceId}`); card._openMarkerDialog(device); @@ -380,6 +387,7 @@ export async function prepareGoldenScenario(page, scenario) { card._setMode('decor'); card._decorTool = 'select'; await card.updateComplete; + await settleMode(card); const shape = card._decorList.find((item) => item.kind === 'line'); if (!shape) throw new Error('golden decor line missing'); card._decorShapeDbl(new MouseEvent('dblclick'), shape); diff --git a/demo/smoke_bg_color.mjs b/demo/smoke_bg_color.mjs index e830e27b..327f79f4 100644 --- a/demo/smoke_bg_color.mjs +++ b/demo/smoke_bg_color.mjs @@ -8,6 +8,12 @@ const res = await page.evaluate(async () => { const out = {}; const c = window.__card; const sr = () => c.shadowRoot || c.renderRoot; + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; const stageBg = async () => { c.requestUpdate(); await c.updateComplete; @@ -90,9 +96,11 @@ const res = await page.evaluate(async () => { // 8) editors keep their own canvas (inline bg only in view/kiosk) c._setMode('decor'); + await settleMode(); const editorBg = await waitStageBg((value) => value !== rgb('#0a2a4a')); out.editorUnpainted = editorBg !== rgb('#0a2a4a'); c._setMode('view'); + await settleMode(); out.viewPaintedAgain = (await waitStageBg((value) => value === rgb('#0a2a4a'))) === rgb('#0a2a4a'); // 9) kiosk instance respects the setting @@ -165,6 +173,12 @@ const paper = await page.evaluate(async () => { const c = window.__card; const sr = () => c.shadowRoot || c.renderRoot; const upd = async () => { c.requestUpdate(); await c.updateComplete; }; + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; c._serverCfg.settings = { ...(c._serverCfg.settings || {}), bg_color: '#ff00ff' }; c._cfgRev = (c._cfgRev || 0) + 1; await upd(); @@ -189,12 +203,10 @@ const paper = await page.evaluate(async () => { out.imageBelowRooms = idxOf('image') < idxOf('.room, .room-outline'); // editors keep the paper too (their canvas ignores bg_color anyway) c._setMode('decor'); - await upd(); - await new Promise((resolve) => setTimeout(resolve, 220)); + await upd(); await settleMode(); out.editorKeepsPaper = !!sr().querySelector('.stage svg .hp-paper'); c._setMode('view'); - await upd(); - await new Promise((resolve) => setTimeout(resolve, 220)); + await upd(); await settleMode(); // daynight night: the paper dims via the brightness filter ONLY, never alpha c._serverCfg.settings.bg_mode = 'daynight'; c._serverCfg.settings.north_deg = 0; diff --git a/demo/smoke_decor.mjs b/demo/smoke_decor.mjs index 2e446cc0..691c19f3 100644 --- a/demo/smoke_decor.mjs +++ b/demo/smoke_decor.mjs @@ -4,11 +4,17 @@ const res = await page.evaluate(async () => { const out = {}; const c = window.__card; const sr = () => c.shadowRoot || c.renderRoot; + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; const esc = async () => { window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' })); await c.updateComplete; }; // 1) третья вкладка есть const tabs = [...sr().querySelectorAll('.modetab')]; out.threeTabs = tabs.length === 3; - tabs[2].click(); await c.updateComplete; + tabs[2].click(); await settleMode(); out.decorMode = c._mode === 'decor'; out.decorBar = !!sr().querySelector('.editbar.decorbar'); // The compact colour/opacity control must escape the clipped editor/dialog @@ -253,7 +259,10 @@ const res = await page.evaluate(async () => { c._redoGeometry(); await c.updateComplete; out.lineStyleUndoRedo = undoSolid && c._decorList.find((x) => x.id === 'dcprobe')?.line_style === 'dashed'; - const selectHit = sr().querySelector('.decorlayer line.dselecthit'); + // Selection handles intentionally sit above the hit proxy. Clear the frame + // so this assertion measures the dashed line's gap, not an endpoint handle. + c._decorSel = null; c.requestUpdate(); await c.updateComplete; + const selectHit = sr().querySelector('.decorlayer line.dselecthit[data-id="dcprobe"]'); const dashedPaint = probe(); let gapPicked = null; if (selectHit && dashedPaint) { diff --git a/demo/smoke_decor_text.mjs b/demo/smoke_decor_text.mjs index 8c681dcb..1bff1065 100644 --- a/demo/smoke_decor_text.mjs +++ b/demo/smoke_decor_text.mjs @@ -21,6 +21,12 @@ const res = await page.evaluate(async () => { const c = window.__card; const sr = () => c.shadowRoot || c.renderRoot; const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; // null-safe: на сборке ДО этих правок у надписи нет ни data-id, ни tspan — // смок должен показать список провалов, а не упасть с исключением const el = (id) => sr().querySelector(`.decorlayer text.dtext[data-id="${id}"]`); @@ -41,7 +47,7 @@ const res = await page.evaluate(async () => { cancelable: true, pointerId: 7, clientX, clientY, button: 0, isPrimary: true, ...extra })); }; - sr().querySelectorAll('.modetab')[2].click(); await c.updateComplete; + sr().querySelectorAll('.modetab')[2].click(); await settleMode(); c._curSpaceCfg.decor = []; c._decorTool = 'select'; c._decorSel = null; await c.updateComplete; diff --git a/demo/smoke_editor_tabs.mjs b/demo/smoke_editor_tabs.mjs index 7838fab6..6a49c126 100644 --- a/demo/smoke_editor_tabs.mjs +++ b/demo/smoke_editor_tabs.mjs @@ -5,6 +5,12 @@ const res = await page.evaluate(async () => { const c = window.__card; const sr = () => c.shadowRoot || c.renderRoot; const tabs = () => [...sr().querySelectorAll('.modetab')]; + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; // 1) две вкладки, Просмотра нет, крестиков в неактивных нет out.twoTabs = tabs().length === 3; // третья — Редактор подложки (v1.33.0) out.labels = tabs().map((t) => t.textContent.trim()); @@ -28,10 +34,7 @@ const res = await page.evaluate(async () => { // 3) повторный клик по активной вкладке — ничего tabs()[0].click(); await c.updateComplete; out.reclickNoop = c._mode === 'plan'; - // Let the View -> editor grid transition finish first. A real user cannot - // switch editors in the same zero-layout frame, and competing WAAPI/CSS - // height animations in that frame are intentionally suppressed. - await new Promise((resolve) => setTimeout(resolve, 220)); + await settleMode(); // HP-UX-11: transient tool controls live in a stage overlay. Opening the // thickness controls must not resize/refit the stage or move pinned Close. const stageBeforeContext = sr().querySelector('.stage').getBoundingClientRect(); @@ -117,30 +120,31 @@ const res = await page.evaluate(async () => { out.devBarBtns = sr().querySelectorAll('.editbar.devbar .btn:not(.barclose)').length === 3; // add/show-all/rules (v1.33.2: Reset removed) const swapChrome = sr().querySelector('.editorchrome'); const swapInner = swapChrome.querySelector('.editorchrome-inner'); - out.editorSwapAnimatesHeight = swapChrome.getAnimations() - .some((animation) => animation.id === 'hp-editor-height-swap'); - out.editorSwapAnimatesContent = swapInner.getAnimations() - .some((animation) => animation.id === 'hp-editor-content-swap'); + out.editorSwapAnimatesHeight = c._modeTransitionBusy + && sr().querySelector('.stage').classList.contains('mode-transition'); + out.editorSwapAnimatesContent = c._modeTransitionBusy && !!swapInner + && (c._modeTransitionVisual?.toolbarContentOpacity ?? 1) < 1; + await settleMode(); // 5) инструменты устройств из шапки исчезли (в .bar их больше нет) out.headerCleanInDev = !sr().querySelector('.bar > .btn[title*="' + (c._t('title.add_device')) + '"]'); // 6) крестик на панели → Просмотр sr().querySelector('.editbar .barclose').click(); await c.updateComplete; const chrome = sr().querySelector('.editorchrome'); - out.barCloseStarts = c._mode === 'view' && !chrome.classList.contains('open') - && chrome.getAttribute('aria-hidden') === 'true'; - // The last bar deliberately remains mounted while its grid row collapses. - await new Promise((resolve) => setTimeout(resolve, 220)); + out.barCloseStarts = c._mode === 'view' && c._modeTransitionBusy + && sr().querySelector('.stage').inert + && sr().querySelector('.stage').classList.contains('mode-transition'); + await settleMode(); out.barCloseWorks = c._mode === 'view' && getComputedStyle(chrome).visibility === 'hidden' && chrome.getBoundingClientRect().height < 1; // 7) крестик в самой вкладке → Просмотр (и не переключает режим) - tabs()[1].click(); await c.updateComplete; - tabs()[1].querySelector('.closex').click(); await c.updateComplete; + tabs()[1].click(); await settleMode(); + tabs()[1].querySelector('.closex').click(); await settleMode(); out.tabCrossWorks = c._mode === 'view'; // Layout-independent editor history: physical KeyZ works when `key` is the // Russian «я», while an input keeps its native browser history. - tabs()[0].click(); await c.updateComplete; + tabs()[0].click(); await settleMode(); c._tool = 'draw'; c.requestUpdate(); await c.updateComplete; const realUndo = c._undoGeometry; const realRedo = c._redoGeometry; diff --git a/demo/smoke_light_badges.mjs b/demo/smoke_light_badges.mjs index 0900a9e3..b98a0eb6 100644 --- a/demo/smoke_light_badges.mjs +++ b/demo/smoke_light_badges.mjs @@ -7,6 +7,12 @@ const out = await page.evaluate(async () => { const o = {}; const c = window.__card; const sr = () => c.shadowRoot || c.renderRoot; + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; const setFill = async (mode) => { const cfg = JSON.parse(JSON.stringify(c._serverCfg)); const f1 = cfg.spaces.find((s) => s.id === 'f1'); @@ -47,18 +53,18 @@ const out = await page.evaluate(async () => { o.morphInGlow = le?.querySelector('ha-icon')?.getAttribute('icon')?.includes('lightbulb') ?? false; // --- редакторы используют ту же жёлтую подложку независимо от слоя glow -- - c._setMode('devices'); c.requestUpdate(); await c.updateComplete; + c._setMode('devices'); await settleMode(); le = devEl('d_lamp'); o.devicesEditorLampYellow = !!le && le.classList.contains('on'); o.devicesEditorHasGlow = !!sr().querySelector('.stage svg radialGradient, .stage svg [id*=glow]'); - c._setMode('plan'); c.requestUpdate(); await c.updateComplete; + c._setMode('plan'); await settleMode(); // ИМЕННО лампа (mutation-проверка аудита HP-1521-01: розетка тоже on и // удовлетворяла бы поиску «любой .dev.on», пряча регресс самой лампы) le = devEl('d_lamp'); o.planEditorLampYellow = !!le && le.classList.contains('on'); // слой скрыт — жёлтый вернулся o.planEditorKettleStillOn = !!devEl('d_kettle')?.classList.contains('on'); o.planEditorNoGlow = !sr().querySelector('.stage svg radialGradient, .stage svg [id*=glow]'); - c._setMode('view'); c.requestUpdate(); await c.updateComplete; + c._setMode('view'); await settleMode(); // --- выключенная лампа тёмная в обоих режимах --------------------------- c.hass = { ...c.hass, states: { ...c.hass.states, diff --git a/demo/smoke_modes.mjs b/demo/smoke_modes.mjs index 22835194..3828e8c0 100644 --- a/demo/smoke_modes.mjs +++ b/demo/smoke_modes.mjs @@ -44,7 +44,7 @@ await page.evaluate(async () => { out.viewHoldInfo = await page.evaluate(() => { const r = !!window.__card._infoCard; window.__card._infoCard = null; window.__card._holdFired = false; return r; }); // 3) режим План await page.evaluate(() => window.__card._setMode('plan')); -await page.waitForTimeout(200); +await page.waitForFunction(() => window.__card._modeTransitionBusy === false); out.plan = await st(); out.planIconsHidden = await page.evaluate(() => { const sr = window.__card.shadowRoot || window.__card.renderRoot; @@ -53,7 +53,7 @@ out.planIconsHidden = await page.evaluate(() => { }); // 4) режим Устройства: drag работает, клик открывает редактор await page.evaluate(() => window.__card._setMode('devices')); -await page.waitForTimeout(200); +await page.waitForFunction(() => window.__card._modeTransitionBusy === false); out.devices = await st(); out.devDragWorks = await page.evaluate(async () => { const c = window.__card; @@ -78,6 +78,7 @@ out.devClickOpensEditor = await page.evaluate(async () => { }); // 5) назад в view await page.evaluate(() => window.__card._setMode('view')); +await page.waitForFunction(() => window.__card._modeTransitionBusy === false); out.backToView = (await st()).mode; // значения зафиксированы прогоном на v1.43.1 и сверены с кодом (audit T1) checkAll(out, { diff --git a/demo/smoke_opening_tunnel_fill.mjs b/demo/smoke_opening_tunnel_fill.mjs index 9dbc88ef..04cbc038 100644 --- a/demo/smoke_opening_tunnel_fill.mjs +++ b/demo/smoke_opening_tunnel_fill.mjs @@ -15,6 +15,12 @@ const result = await page.evaluate(async () => { c.requestUpdate(); await c.updateComplete; }; + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; const pitch = 1 / 240; const wallKey = (a, b) => { const q = (v) => Math.round(v / pitch) * pitch; @@ -57,7 +63,7 @@ const result = await page.evaluate(async () => { }, }; c._setMode('view'); - await update(); + await update(); await settleMode(); const tunnels = (layer) => [...root().querySelectorAll( `.opening-tunnels[data-layer="${layer}"] [data-hp="opening-tunnel"]`, @@ -109,7 +115,7 @@ const result = await page.evaluate(async () => { && tunnels('data').length === 2 && tunnels('glow-base').length === 2; c._setMode('decor'); - await update(); + await update(); await settleMode(); out.backdropUsesSingleGroupOpacity = tunnels('data').length === 2 && tunnels('glow-base').length === 2 && [...root().querySelectorAll('.opening-tunnels')] @@ -120,7 +126,7 @@ const result = await page.evaluate(async () => { && byId('tunnel-gate', 'glow-base')?.getAttribute('fill-opacity') === '0.42'; c._setMode('plan'); - await update(); + await update(); await settleMode(); out.planGestureCannotLeaveStalePatch = tunnels('data').length === 0 && tunnels('glow-base').length === 0; @@ -136,7 +142,7 @@ const result = await page.evaluate(async () => { sp.openings = [{ id: 'atomic-door', type: 'door', x: 0.5, y: 0.2, angle: 0, length: 0.6 }]; sp.settings.hide_openings = true; sp.settings.show_borders = true; - await update(); + await update(); await settleMode(); const sameDepth = byId('atomic-door', 'data'); out.equalAtomicPiecesAreOneSurface = sameDepth?.tagName.toLowerCase() === 'path' && ((sameDepth.getAttribute('d') || '').match(/\bM /g) || []).length === 2; diff --git a/demo/smoke_resize_virtual_thick.mjs b/demo/smoke_resize_virtual_thick.mjs index 090c7a0f..e3632b59 100644 --- a/demo/smoke_resize_virtual_thick.mjs +++ b/demo/smoke_resize_virtual_thick.mjs @@ -13,6 +13,12 @@ const res = await page.evaluate(async () => { const sr = () => c.shadowRoot || c.renderRoot; const sp = () => c._serverCfg.spaces.find((s) => s.id === c._space); const upd = async () => { c._cfgEpoch++; c.requestUpdate(); await c.updateComplete; }; + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; sp().settings = { ...(sp().settings || {}), show_borders: true }; delete sp().walls; @@ -22,7 +28,7 @@ const res = await page.evaluate(async () => { c._setMode('plan'); c._tool = 'wallthick'; - await upd(); + await upd(); await settleMode(); c._wallThickClick([550, 250]); await upd(); if (c._wallDialog) { @@ -53,13 +59,13 @@ const res = await page.evaluate(async () => { out.savedVirtualAboveRealInEditor = !!editorBody && !!editorVirtual && !!(editorBody.compareDocumentPosition(editorVirtual) & Node.DOCUMENT_POSITION_FOLLOWING); c._setMode('view'); - await upd(); + await upd(); await settleMode(); const viewBody = sr().querySelector('.wallbodies'); const viewVirtual = sr().querySelector('.openwalls'); out.savedVirtualBelowRealInView = !!viewBody && !!viewVirtual && !!(viewVirtual.compareDocumentPosition(viewBody) & Node.DOCUMENT_POSITION_FOLLOWING); c._setMode('decor'); - await upd(); + await upd(); await settleMode(); const decorBody = sr().querySelector('.wallbodies'); const decorVirtual = sr().querySelector('.openwalls'); out.realWallsFadeBehindDecor = !!decorBody @@ -67,7 +73,7 @@ const res = await page.evaluate(async () => { out.virtualWallsFadeBehindDecor = !!decorVirtual && getComputedStyle(decorVirtual).opacity === '0.35'; c._setMode('plan'); - await upd(); + await upd(); await settleMode(); out.atomicThicknessBefore = c._intervalCm([550, 145, 550, 195]) === 20 && c._intervalCm([550, 205, 550, 295]) === 0 && c._intervalCm([550, 305, 550, 455]) === 20; diff --git a/demo/smoke_sun_live_bg.mjs b/demo/smoke_sun_live_bg.mjs index fdc11f51..08a96be4 100644 --- a/demo/smoke_sun_live_bg.mjs +++ b/demo/smoke_sun_live_bg.mjs @@ -34,7 +34,7 @@ const res = await page.evaluate(async () => { await setSun(180, 40); out.dayComputedWhite = comp() === 'rgb(255, 255, 255)'; - out.dayNoDim = dim().includes('brightness(1.000)'); + out.dayNoDim = !dim().includes('brightness(') || dim().includes('brightness(1.000)'); out.dayRays = polys() > 0; // the whole point: a NEW hass, nothing else. No reload, no requestUpdate. diff --git a/demo/smoke_warm_owners.mjs b/demo/smoke_warm_owners.mjs index b6804087..6dfdb30e 100644 --- a/demo/smoke_warm_owners.mjs +++ b/demo/smoke_warm_owners.mjs @@ -37,7 +37,7 @@ const res = await page.evaluate(async () => { }; const settle = async (c) => { const t0 = performance.now(); - while (c._booting && performance.now() - t0 < 2500) await sleep(30); + while ((c._booting || c._modeTransitionBusy) && performance.now() - t0 < 2500) await sleep(30); await sleep(250); }; const near = (a, b) => Math.abs(a - b) < 1e-6; @@ -54,7 +54,7 @@ const res = await page.evaluate(async () => { const B = mk(); // вторая карточка, тот же конфиг await settle(B); - B._setMode('devices'); await B.updateComplete; await sleep(120); + B._setMode('devices'); await B.updateComplete; await settle(B); B._applyView(3.35, 200, 200); B.requestUpdate(); await B.updateComplete; await sleep(60); const zoomB = B._zoom; diff --git a/demo/smoke_zoom_out.mjs b/demo/smoke_zoom_out.mjs index 6f4dc5c2..4e4733f4 100644 --- a/demo/smoke_zoom_out.mjs +++ b/demo/smoke_zoom_out.mjs @@ -16,13 +16,13 @@ const stageBox = () => page.evaluate(() => { const vh = await page.evaluate(() => window.innerHeight); const inView = await stageBox(); await page.evaluate(() => window.__card._setMode('plan')); -await page.waitForTimeout(400); +await page.waitForFunction(() => window.__card._modeTransitionBusy === false); const inPlan = await stageBox(); out.viewFitsViewport = inView.bottom <= vh + 2; out.editorFitsViewport = inPlan.bottom <= vh + 2; // used to overflow by ~90px out.editorStageShrinks = inPlan.top > inView.top && inPlan.bottom <= inView.bottom + 2; await page.evaluate(() => window.__card._setMode('view')); -await page.waitForTimeout(300); +await page.waitForFunction(() => window.__card._modeTransitionBusy === false); // -- zoom out below the base fit ----------------------------------------- out.zoomOut = await page.evaluate(() => { @@ -56,16 +56,21 @@ await page.evaluate(() => window.__card._resetZoom()); // (zoom AND center) comes back; the editor keeps its own zoom while open. out.editorZoomNotSaved = await page.evaluate(async () => { const c = window.__card; - const raf2 = () => new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r))); + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; const center = () => { const v = c._view; return [v.x + v.w / 2, v.y + v.h / 2]; }; c._setMode('view'); c._resetZoom(); c._zoomAt(10, 10, 1.6); c._saveZoom(); // off-center on purpose const want = { zoom: c._zoom, c: center() }; - c._setMode('devices'); await raf2(); + c._setMode('devices'); await settleMode(); c._zoomAt(10, 10, 2.5); c._saveZoom(); // off-center too: the center must not leak either const editorZoomFree = Math.abs(c._zoom - 2.5) < 0.01; // zooming inside stays - c._setMode('view'); await raf2(); + c._setMode('view'); await settleMode(); const got = { zoom: c._zoom, c: center() }; const ls = JSON.parse(localStorage.getItem('houseplan_card_zoom_v1') || '{}'); return { @@ -84,21 +89,19 @@ delete out.editorZoomNotSaved; // -- editor entered and left without touching zoom: no jump --------------- out.untouchedEditorNoJump = await page.evaluate(async () => { const c = window.__card; - const raf2 = () => new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r))); + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; c._setMode('view'); - // The previous case has only waited two frames after leaving an editor. - // Let its 180 ms chrome collapse and ResizeObservers settle before taking a - // new baseline; otherwise this case measures the previous transition, not - // the untouched editor round-trip it is meant to verify. - await new Promise((resolve) => setTimeout(resolve, 240)); + await settleMode(); c._resetZoom(); c._zoomAt(30, 30, 1.6); c._saveZoom(); const before = { ...c._view }; - c._setMode('plan'); await raf2(); - c._setMode('view'); await raf2(); - // Header ResizeObserver publishes its final measured height one frame after - // the 180 ms chrome collapse, then the stage observer performs the last fit. - await new Promise((resolve) => setTimeout(resolve, 320)); + c._setMode('plan'); await settleMode(); + c._setMode('view'); await settleMode(); const v = c._view; const beforeCenter = [before.x + before.w / 2, before.y + before.h / 2]; const afterCenter = [v.x + v.w / 2, v.y + v.h / 2]; @@ -130,12 +133,17 @@ await page.evaluate(() => window.__card._resetZoom()); out.editorZoomNeverInSpaceStore = await page.evaluate(async () => { const c = window.__card; const wait = (ms) => new Promise((r) => setTimeout(r, ms)); - const raf2 = () => new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r))); + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; c._setMode('view'); c._resetZoom(); c._zoomAt(10, 10, 1.6); c._saveZoom(); // floor 1 view zoom c._slideTo('garden', 'left'); await wait(350); c._resetZoom(); c._zoomAt(10, 10, 1.4); c._saveZoom(); // floor 2 view zoom - c._setMode('devices'); await raf2(); + c._setMode('devices'); await settleMode(); c._zoomAt(10, 10, 5.0); c._saveZoom(); // 500% — a working tool const lsInEditor = JSON.parse(localStorage.getItem('houseplan_card_zoom_v1') || '{}'); c._setMode('view'); @@ -167,20 +175,25 @@ delete out.editorZoomNeverInSpaceStore; out.crossFloorEditorExit = await page.evaluate(async () => { const c = window.__card; const wait = (ms) => new Promise((r) => setTimeout(r, ms)); - const raf2 = () => new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r))); + const settleMode = async () => { + const started = performance.now(); + do { await new Promise((resolve) => requestAnimationFrame(resolve)); } + while (c._modeTransitionBusy && performance.now() - started < 1500); + await c.updateComplete; + }; const sr = c.shadowRoot || c.renderRoot; c._setMode('view'); c._resetZoom(); c._zoomAt(10, 10, 1.6); c._saveZoom(); // f1 view zoom c._slideTo('garden', 'left'); await wait(350); c._resetZoom(); c._zoomAt(10, 10, 1.4); c._saveZoom(); // garden view zoom c._slideTo('f1', 'right'); await wait(350); - c._setMode('devices'); await raf2(); + c._setMode('devices'); await settleMode(); // этаж меняется НАСТОЯЩЕЙ вкладкой — именно этот путь под подозрением const idx = c._model.findIndex((s) => s.id === 'garden'); sr.querySelectorAll('.tabs .tab')[idx].click(); - await c.updateComplete; await raf2(); + await c.updateComplete; await settleMode(); c._zoomAt(10, 10, 5.0); c._saveZoom(); // 500% — рабочий инструмент - c._setMode('view'); await raf2(); await wait(60); + c._setMode('view'); await settleMode(); const stillGarden = c._space === 'garden'; const gotZoom = c._zoom; const v = c._view; const vb = c._baseVb(); diff --git a/demo/srv/assets/houseplan-card.js b/demo/srv/assets/houseplan-card.js index abbbe61d..e015f983 100755 --- a/demo/srv/assets/houseplan-card.js +++ b/demo/srv/assets/houseplan-card.js @@ -1,4 +1,4 @@ -globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="8f44f3a00bc48a1f93365a849e5ac0d3330808f0272a287bd0af7be018918dbd";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,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.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?m:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,g?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,$=t=>t,x=k.trustedTypes,S=x?x.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,E=Array.isArray,I="[ \t\n\f\r]",z=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,F=/-->/g,N=/>/g,O=RegExp(`>|${I}(?:([^\\s"'>=/]+)(${I}*=${I}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),L=/'/g,H=/"/g,q=/^(?:script|style|textarea|title)$/i,B=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),U=B(1),W=B(2),j=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!E(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=z;for(let e=0;e"===l[0]?(r=n??z,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?O:'"'===l[3]?H:L):r===H||r===L?r=O:r===F||r===N?r=z:(r=O,n=void 0);const d=r===O&&t[e+1].startsWith("/>")?" ":"";o+=r===z?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||">")+(2===e?"":3===e?"":"")),s]};class Z{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iE(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new Z(t)),e}k(t){E(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=J(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==j,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return j}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2;let pt=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const{I:_t}=rt,mt=t=>t,gt=()=>document.createComment(""),ft=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(gt(),n),o=s.insertBefore(gt(),n);i=new _t(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=mt(t).nextSibling;mt(s).insertBefore(t,n),t=e}}}return i},vt=(t,e,i=t)=>(t._$AI(e,i),t),yt={},bt=(t,e=yt)=>t._$AH=e,wt=t=>{t._$AR(),t._$AA.remove()},kt=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},$t=(t=>(...e)=>({_$litDirective$:t,values:e}))(class extends pt{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=vt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=vt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=vt(n[d],o[_]),ft(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=vt(n[u],o[p]),ft(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=kt(r,p,_),h=kt(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=ft(t,n[d]);vt(e,o[p]),l[p]=e}else l[p]=vt(i,o[p]),ft(t,n[d],i),n[e]=null;p++}else wt(n[u]),u--;else wt(n[d]),d++;for(;p<=_;){const e=ft(t,l[_+1]);vt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&wt(t)}return this.ut=r,bt(t,l),j}}),xt=new WeakMap;let St=0;class Mt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++St,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=xt.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),xt.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?xt.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=xt.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void xt.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=s=>{if(s instanceof HTMLElement&&(s.matches(t)&&e.push(s),s.shadowRoot))for(const t of s.shadowRoot.childNodes)i(t);else for(const t of s.childNodes)i(t)};for(const t of this.childNodes)i(t);const s=this.overlayPortal();return s&&i(s),e.filter(t=>{const e=getComputedStyle(t);return!t.hidden&&"none"!==e.display&&"hidden"!==e.visibility})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=U` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="117e675d4314f3ef3d16b7d94885f953bbc856da645e488f37045ef5a04716eb";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,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.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?m:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,g?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,$=t=>t,x=k.trustedTypes,S=x?x.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,E=Array.isArray,I="[ \t\n\f\r]",z=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,F=/-->/g,N=/>/g,O=RegExp(`>|${I}(?:([^\\s"'>=/]+)(${I}*=${I}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),L=/'/g,H=/"/g,q=/^(?:script|style|textarea|title)$/i,B=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),U=B(1),W=B(2),j=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!E(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=z;for(let e=0;e"===l[0]?(r=n??z,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?O:'"'===l[3]?H:L):r===H||r===L?r=O:r===F||r===N?r=z:(r=O,n=void 0);const d=r===O&&t[e+1].startsWith("/>")?" ":"";o+=r===z?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||">")+(2===e?"":3===e?"":"")),s]};class Z{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iE(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new Z(t)),e}k(t){E(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=J(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==j,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return j}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2;let pt=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const{I:_t}=rt,mt=t=>t,gt=()=>document.createComment(""),ft=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(gt(),n),o=s.insertBefore(gt(),n);i=new _t(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=mt(t).nextSibling;mt(s).insertBefore(t,n),t=e}}}return i},vt=(t,e,i=t)=>(t._$AI(e,i),t),yt={},bt=(t,e=yt)=>t._$AH=e,wt=t=>{t._$AR(),t._$AA.remove()},kt=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},$t=(t=>(...e)=>({_$litDirective$:t,values:e}))(class extends pt{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=vt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=vt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=vt(n[d],o[_]),ft(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=vt(n[u],o[p]),ft(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=kt(r,p,_),h=kt(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=ft(t,n[d]);vt(e,o[p]),l[p]=e}else l[p]=vt(i,o[p]),ft(t,n[d],i),n[e]=null;p++}else wt(n[u]),u--;else wt(n[d]),d++;for(;p<=_;){const e=ft(t,l[_+1]);vt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&wt(t)}return this.ut=r,bt(t,l),j}}),xt=new WeakMap;let St=0;class Mt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++St,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=xt.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),xt.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?xt.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=xt.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void xt.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=s=>{if(s instanceof HTMLElement&&(s.matches(t)&&e.push(s),s.shadowRoot))for(const t of s.shadowRoot.childNodes)i(t);else for(const t of s.childNodes)i(t)};for(const t of this.childNodes)i(t);const s=this.overlayPortal();return s&&i(s),e.filter(t=>{const e=getComputedStyle(t);return!t.hidden&&"none"!==e.display&&"hidden"!==e.visibility})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=U` ${this.icon?U``:G} ${this.title} `;return this._useHaDialog?U`0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Nc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Oc(t){return t.replaceAll("_"," ")}function Lc(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function Hc(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function qc(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Nc(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(Uc(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Ui(t,i.entity_id);n=s?Wi(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Oc(i.attribute)} · ${Nc(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?Uc(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Ui(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Lc(o,100/255);if("volume_level"===i)return Lc(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Lc(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=jl(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:Hc(i)}}function Bc(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));if(i)return{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>Dl(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&Kl(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function Uc(t,e){const i=t?.entities?.[e];if(i&&!bl(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||bl(s)}function Wc(t,e){return Uc(t,e)&&!!t?.states?.[e]}function jc(t,e,i=[e]){const s=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||s.add(t);const n=[],o=Bl(t,i),r=o.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),a=i=>{const s=zc(i);if(n.some(t=>t.key===s))return;const o=qc(t,e,i,r),a="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";n.push({key:s,source:i,label:o.sourceLabel,technical:a,value:o.text,available:"available"===o.availability})};for(const e of[...s].sort()){if(!Wc(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;a({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Ic[i]||[])t in(n?.attributes||{})&&a({kind:"entity_attribute",entity_id:e,attribute:t})}const l=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&l.add(`marker:${e.marker.id}`);const c=new Set(o.map(t=>t.key));for(const t of[...l].sort())c.has(t)&&a({kind:"derived_marker_state",ref:t});return e.virtual||null==jl(t,e.entities)||a({kind:"derived_lqi"}),n}function Gc(t,e,i){const s=Bc(t,e);if(s&&i.some(t=>t.key===zc(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}const Vc={sourceKind:"none",visualSources:[],criticalSources:[],samples:[]};function Kc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Yc(t,e){const i=t?.states?.[e];if(!i)return"";if("function"==typeof t?.formatEntityState)try{const e=t.formatEntityState(i);if("string"==typeof e&&e)return e}catch{}return String(i.state??"")}function Xc(t,e,i,s){return{eid:e,role:i,name:Kc(t,e),state:String(t?.states?.[e]?.state??""),stateText:Yc(t,e),integrationDomain:t?.entities?.[e]?.platform||null,sample:s||sl(t,e)}}function Zc(t,e,i=[e],s){const n=e.hidden&&e.userHidden?{...e,hidden:!1}:e;let o="none",r=[];const a=(l=Sc({hass:t,devices:i,device:n,lightSources:s}),"cover"!==l?.semantics?null:l.targets[0]?.entityId||l.skippedTargets[0]?.entityId||null);var l;const c=Bl(t,[n]),h=Il(n.marker?.binding,n.marker?.controls??n.controls,n.entities),d=new Set(h.filter(t=>t.startsWith("marker:"))),u=!0===n.marker?.is_light||d.size>0?s||Bl(t,i):c,p=u.filter(t=>t.device.id===n.id&&"controls"!==t.via),_=c.filter(t=>"controls"!==t.via),m=[...c.filter(t=>"controls"===t.via),...p.length?p:_];if(d.size)for(const t of u){if(!d.has(t.key))continue;t.stateEids.length>0&&m.some(e=>e.stateEids.some(e=>t.stateEids.includes(e)))||m.some(e=>e.key===t.key)||m.push({...t,via:"controls",castsGlow:!1})}if(a)o="cover",r=[Xc(t,a,"cover")];else if(m.length)o=m.some(t=>"controls"===t.via)?"controls":"light",r=m.map(i=>{const s="controls"===i.via?"control":"forced"===i.via?"forced_light":"light";if(!i.passive)return Xc(t,i.eid,s);const n=i.on?"on":"off";return{eid:i.key,role:s,name:e.name,state:n,stateText:n,integrationDomain:null,sample:{eid:i.key,state:n,availability:"available",status:i.on?"working":"neutral",activity:"none",edge:"none"}}});else{const e=Rl(t,n.entities),i=e.length?e:n.entities.filter(e=>!!t?.states?.[e]);if(i.length){o="device_role";const e=function(t,e,i){const s=e.map(e=>sl(t,e)),n=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category);return 1===e.length&&n.length>1&&el(t,e[0])?s.map(t=>"unavailable"===t.availability?t:"off"===t.state?{...t,availability:"unavailable",status:"neutral",activity:"none",edge:"none"}:{...t,status:"neutral",activity:"none",edge:"none"}):s}(t,i,n.entities);r=i.map((i,s)=>Xc(t,i,"device_role",e[s]))}else n.primary&&(o="primary",r=[Xc(t,n.primary,"primary")])}const g=[];for(const e of n.entities||[]){const i=sl(t,e);"alarm"!==i.status||r.some(t=>t.eid===e)||g.push(Xc(t,e,"critical",i))}return{sourceKind:o,visualSources:r,criticalSources:g,samples:[...r,...g].map(t=>t.sample)}}function Jc(t,e,i,s){if(e.virtual)return{source:null,text:null,fallback:"value_virtual"};if(s){const i=function(t,e){if(!0!==e.marker?.use_climate_temp)return null;for(const i of e.entities){if(!i.startsWith("climate."))continue;const e=Number(t?.states?.[i]?.attributes?.current_temperature);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(i)return{source:{kind:"temperature",eid:i.eid,attribute:"current_temperature",text:i.text},text:i.text,fallback:null};const s=function(t,e){if("mdi:thermometer"!==e.icon&&"mdi:air-filter"!==e.icon)return null;for(const i of e.entities){if(!Dl(t,i))continue;const e=Number(t?.states?.[i]?.state);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(s)return{source:{kind:"temperature",eid:s.eid,text:s.text},text:s.text,fallback:null};const n=function(t,e){if(!e.primary||!Kl(t,e.primary))return null;const i=Number(t?.states?.[e.primary]?.state);return Number.isFinite(i)?{eid:e.primary,text:`${Math.round(i)}%`}:null}(t,e);if(n)return{source:{kind:"humidity",eid:n.eid,text:n.text},text:n.text,fallback:null}}if(1!==i.visualSources.length)return{source:null,text:null,fallback:i.visualSources.length?"value_ambiguous_sources":"value_no_state"};const n=i.visualSources[0].eid,o=function(t,e){const i=t?.states?.[e];if(!i||null==i.state||""===String(i.state).trim())return{text:"",fallback:"value_no_state"};const s=i.state;if(!["string","number","boolean"].includes(typeof s))return{text:"",fallback:"value_non_scalar"};const n=String(s).trim().toLowerCase();if("unknown"===n||"unavailable"===n)return{text:"",fallback:"value_no_state"};const o=Ui(t,e);return o?{text:Wi(o,String(i.attributes?.unit_of_measurement||"")),fallback:null}:{text:"",fallback:"value_no_state"}}(t,n);return o.fallback?{source:null,text:null,fallback:o.fallback}:{source:{kind:"entity",eid:n,text:o.text},text:o.text,fallback:null}}function Qc(t,e,i){const s=t.marker?.binding||(t.bindingKind&&t.bindingRef?`${t.bindingKind}:${t.bindingRef}`:t.virtual?"virtual":""),n=[...e.visualSources.map(t=>`${t.role}:${t.eid}`),...e.criticalSources.map(t=>`critical:${t.eid}`)].sort(),o=i?`${i.kind}:${i.eid}:${i.attribute||""}`:"none";return[s,e.sourceKind,...n,`value:${o}`].join("\n")}function th(t,e,i){return Qc(e,i||Zc(t,e),null).replace(/\nvalue:none$/,"")}function eh(t){if(t.effectiveHidden)return[];if("static_icon"===t.display)return["static-icon"];const e=[],{visual:i}=t;return"alarm"===t.pulse.kind?e.push("alarm"):"unavailable"===i.availability?e.push("unavail"):"working"===i.status?e.push("on"):"open"===i.status&&e.push("open"),"none"!==t.pulse.reason&&"alarm"!==t.pulse.reason&&e.push("activity-"+t.pulse.reason),t.pulse.generation%2==0&&(e.push("pulse-gen2"),"short"===t.pulse.kind&&e.push("activity-gen2")),e}function ih(t,e,i){const s=Ei(e.marker?.display),n="static_icon"===s,o=n&&!1===i.sourceDetails?Vc:Zc(t,e,i.lightDevices||[e],i.lightSources),r=e.bindingStatus,a="ha_disabled"===r?.kind,l="orphaned"===r?.kind,c=!0===e.userHidden||!0===e.marker?.hidden,h=a||c&&!i.designPreview,d=nl(o.samples);let u=d;h||n?u={availability:"available",status:"neutral",activity:"none"}:"alarm"===d.status||i.liveStates||(u={availability:"available",status:"neutral",activity:"none"});const p=n&&!1===i.sourceDetails?{source:null,text:null,fallback:null}:Jc(t,e,o,i.showTemperature),_=Qc(e,o,p.source),m=th(t,e,o),g=i.activityRuntime,f=i.now??Date.now(),v=g?.expiresAt||(g?.flashTs?g.flashTs+3300:0);!n&&!h&&i.liveStates&&"alarm"!==d.status&&g?.sources===m&&g.flashTs&&g.flashKind&&v>f&&(u={...u,activity:g.flashKind});const y="icon_ripple"===s&&!h&&i.liveStates&&"alarm"!==u.status?u.activity:"none",b=n||h||!i.showTemperature?null:!0===e.marker?.use_climate_temp?Vl(t,e.entities):"mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon?Gl(t,e.entities):null,w=!n&&!h&&i.showTemperature&&e.primary&&Kl(t,e.primary)?Yl(t,e.entities):null,k=n||h||!i.showSignal||e.virtual?null:jl(t,e.entities),$=function(t,e,i){const s=null!=e.marker?.value_badge;if(i.effectiveHidden||"static_icon"===i.display)return null;const n=e.marker?.value_badge;if(s)return n?.enabled&&n.source?{configured:!0,enabled:!0,position:n.position||"right",...qc(t,e,n.source,i.markerStates)}:null;if(!i.showTemperature||"value"===i.display)return null;const o=Bc(t,e);if(!o)return null;let r=null,a="default";if("entity_attribute"===o.kind&&"current_temperature"===o.attribute){const i=Vl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=Gl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else{const i=Yl(t,e.entities);null!=i&&(r=`${i}%`),a="humidity"}return null==r?null:{configured:!1,enabled:!0,source:o,position:"right",sourceLabel:"entity_attribute"===o.kind?`${Oc(o.attribute)} · ${Nc(t,o.entity_id)}`:"entity_state"===o.kind?Nc(t,o.entity_id):"",text:r,fullText:r,availability:"available",isLqi:!1,tone:a}}(t,e,{showTemperature:i.showTemperature,showSignal:i.showSignal,display:s,effectiveHidden:h,markerStates:o.visualSources.filter(t=>t.eid.startsWith("marker:")).map(t=>({ref:t.eid,on:"on"===t.state,name:t.name}))}),x="cover"===o.sourceKind?o.visualSources[0]?.eid:e.primary||o.visualSources[0]?.eid,S=x?t?.states?.[x]:null,M=!i.liveStates||n||h?e.icon:hs(e.icon,x?.split(".")[0],S?.attributes?.device_class,S?.state,!!e.marker?.icon),C=!i.liveStates||n||h?null:o.visualSources.filter(t=>!t.eid.startsWith("marker:")).map(e=>function(t){return t&&"on"===t.state?Rt(t.attributes?.rgb_color):null}(t?.states?.[e.eid])).find(t=>!!t)||null,D=Number(e.marker?.size)>0?Number(e.marker.size):1,T=Number(e.marker?.angle)||0,P=Number(e.marker?.ripple_size)>0?Number(e.marker.ripple_size):3,R=Dt(e.marker?.ripple_color,null),A=n?null:R||C||null,E=function(t){const{display:e,visual:i,semanticActivity:s,liveStates:n,effectiveHidden:o,bindingUnavailable:r=!1,reducedMotion:a=!1}=t,l=Math.max(1,Math.trunc(t.shortGeneration||1)),c=Number.isFinite(t.diameterScale)?Math.max(1,Number(t.diameterScale)):3,h=t.color||null;if(o||r||"static_icon"===e)return qt(l,h,c);if("alarm"===i.status)return{kind:"alarm",reason:"alarm",generation:l,expiresAt:null,color:"#f25a4a",diameterScale:3,animated:!a,reducedMotionIndicator:"none"};if(!n||"icon_ripple"!==e)return qt(l,h,c);const d=t.now??Date.now(),u=t.shortExpiresAt||null;return t.shortReason&&null!=u&&u>d?{kind:"short",reason:t.shortReason,generation:l,expiresAt:u,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:"presence"===s||"transition"===s||"running"===s?{kind:"continuous",reason:s,generation:l,expiresAt:null,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:qt(l,h,c)}({display:s,visual:u,semanticActivity:d.activity,shortReason:g?.sources===m?g?.flashKind:null,shortGeneration:g?.gen,shortExpiresAt:g?.sources===m?v:null,now:f,liveStates:i.liveStates,effectiveHidden:h,bindingUnavailable:a||l,reducedMotion:i.reducedMotion,color:A,diameterScale:P}),I="value"!==s||h?null:p.text,z="ha_disabled"===r?.kind?r.reason:null,F=function(t,e,i,s,n,o,r,a){return o?"ha_disabled":r?"orphaned":"static_icon"===a?"static_icon":"alarm"===e.status?"alarm":n?"unavailable"===e.availability?"unavailable":"cover"===s?"cover_icon_state":"presence"===i?"presence":"event"===i?"event":"transition"===i?"transition":"working"===e.status?"icon_ripple"===a&&"none"!==i?"working_activity":"working":"open"===e.status?"open":(t.primary||"").startsWith("media_player.")?"media_neutral":"neutral":"live_states_disabled"}(e,u,y,o.sourceKind,i.liveStates,a,l,s),N=[];i.designPreview&&c&&N.push("hidden_design_preview"),n||!0!==e.marker?.vacuum?.live||N.push("vacuum_live_plan_only");const O=1===o.visualSources.length&&el(t,o.visualSources[0].eid),L=e.entities.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category).length;O&&L>1&&N.push("composite_power_source"),"icon_ripple"!==s&&"static_icon"!==s&&"alarm"!==d.status&&"none"!==d.activity&&N.push("activity_display_disabled");const H={binding:e.marker?.binding||(e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:e.virtual?"virtual":""),sourceKind:o.sourceKind,visualSources:o.visualSources,criticalSources:o.criticalSources,valueSource:p.source,sourceSignature:_,visual:u,display:s,icon:M,valueText:I,valueFullText:I,fallbackReason:"value"!==s||I?null:p.fallback,activity:y,activityGeneration:g?.gen||1,pulse:E,classes:[],tempText:null==b?null:String(b),humText:null==w?null:String(w),valueBadge:$,lqiText:null==k||$?.isLqi?null:String(k),lqiColor:null==k?null:ti(k),lightColor:C,scale:D,angle:T,rippleScale:P,rippleColor:A,userHidden:c,effectiveHidden:h,haDisabled:a,disabledReason:z,orphaned:l,vacuumLive:!n&&!0===e.marker?.vacuum?.live,explanation:{reason:F,notices:N}};return{...H,classes:eh(H)}}function sh(t,e=new WeakMap){if(null===t||"object"!=typeof t)return t;const i=t,s=e.get(i);if(s)return s;if(Array.isArray(t)){const s=[];e.set(i,s);for(const i of t)s.push(sh(i,e));return Object.freeze(s)}const n={};e.set(i,n);for(const[i,s]of Object.entries(t))"function"!=typeof s&&(n[i]=sh(s,e));return Object.freeze(n)}function nh(t){const e=new Map(t);let i;return i=Object.freeze({get size(){return e.size},get:t=>e.get(t),has:t=>e.has(t),entries:()=>e.entries(),keys:()=>e.keys(),values:()=>e.values(),forEach:(t,s)=>e.forEach((e,n)=>t.call(s,e,n,i)),[Symbol.iterator]:()=>e[Symbol.iterator]()}),i}function oh(t){const e=new Set(t.entityIds||[]),i=new Set(t.deviceIds||[]),s=new Set(t.areaIds||[]);for(const s of t.devices){for(const t of s.entities||[])e.add(t);s.primary&&e.add(s.primary);for(const t of s.controls||[])e.add(t);s.marker?.vacuum?.source&&e.add(s.marker.vacuum.source),"device"===s.bindingKind&&s.bindingRef&&i.add(s.bindingRef),"entity"===s.bindingKind&&s.bindingRef&&e.add(s.bindingRef)}const n={},o={};for(const[o,r]of Object.entries(t.hass?.entities||{})){const a=r?.device_id?t.hass?.devices?.[r.device_id]:null;(e.has(o)||r?.device_id&&i.has(r.device_id)||s.has(r?.area_id)||s.has(a?.area_id))&&(e.add(o),n[o]=r,r?.device_id&&i.add(r.device_id))}for(const e of i){const i=t.hass?.devices?.[e];i&&(o[e]=i)}const r={};for(const i of e){const e=t.hass?.states?.[i];e&&(r[i]=e)}const a=Object.freeze({states:sh(r),entities:sh(n),devices:sh(o),config:sh(t.hass?.config),locale:sh(t.hass?.locale),themes:sh(t.hass?.themes)});return Object.freeze({sourceSequence:t.sourceSequence,capturedAt:t.capturedAt??Date.now(),hass:a,devices:sh([...t.devices]),positions:nh([...t.positions||[]].map(([t,e])=>[t,Object.freeze({x:e.x,y:e.y})])),presentations:nh([...t.presentations].map(([t,e])=>[t,sh(e)])),facts:nh([...t.facts||[]].map(([t,e])=>[t,sh(e)]))})}const rh=(t,e)=>`${t}:${e?1:0}`;function ah(t){const e=dr(t.cfg),i={};for(const e of t.cfg.spaces||[])for(const t of e.rooms||[])t.area&&(i[t.area]=e.id);const s=t.cfg.settings?.exclude_integrations?new Set(t.cfg.settings.exclude_integrations):qs,n=Us(t.cfg.settings?.icon_rules?.length?t.cfg.settings.icon_rules:Bs);return ec({hass:t.hass,registry:t.registry,areaToSpace:i,markers:t.cfg.markers||[],settings:t.cfg.settings||{},excluded:s,showAll:!!t.cfg.settings?.show_all,firstSpaceId:e[0]?.id||"",loc:e=>Os(t.lang,e),iconRules:n})}function lh(t){const e=dr(t.cfg).find(e=>e.id===t.spaceId);if(!e)return null;const i=es(t.cfg.spaces.find(e=>e.id===t.spaceId)),s=ns(t.cfg.settings),n=t.iconSize??2.5,o=n>8?2.5:n,r=t.registry?wl(t.hass,t.registry):t.hass,a=(t.devices||ah(t)).filter(e=>e.space===t.spaceId),l=a.filter(t=>!t.hidden),c=function(t,e,i){const s={},n=i/100*Ar(e)*1.3;for(const i of e.rooms){if(!i.area)continue;const e=t.filter(t=>t.area===i.area);if(!e.length)continue;const o=zr(i),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(e.length*a/Math.max(l,1)))),h=a/c,d=l/Math.max(Math.ceil(e.length/c),1),u=e.map((t,e)=>({x:o.x+r+h*(e%c+.5),y:o.y+r+d*(Math.floor(e/c)+.5)}));Pi(u,o,n,.5*r),e.forEach((t,e)=>s[t.id]=vr(u[e]))}return s}(a,e,o),h=[];for(const e of l){const i=t.layout[e.id];if(i&&i.s===t.spaceId){const t=i.x*or,e=i.y*or;h.push({minX:t,minY:e,maxX:t,maxY:e})}}const d=t.cfg.spaces.find(e=>e.id===t.spaceId)||{},u=Array.isArray(d.walls)?d.walls:[],p=Number(d.cell_cm)>0?Number(d.cell_cm):5,_=function(t,e,i){const s=[];for(const n of t.partitions||[]){const t=Vo(n.a,n.b,n.cm,e,i);t&&s.push(t)}for(const n of t.room_drafts||[])s.push(...Yo(n,e,i));for(const n of t.wall_columns||[])s.push(Ko(n,e,i));return s}(e,p,mr);for(const t of _){const e=t.map(t=>t[0]),i=t.map(t=>t[1]);e.length&&h.push({minX:Math.min(...e),minY:Math.min(...i),maxX:Math.max(...e),maxY:Math.max(...i)})}const m=Pr(e,h),g=[m.x,m.y,m.w,m.h],f=new Map(e.rooms.map(t=>{const e=Ms(i.fill,t);return[t,rs(e,"lqi"===e&&t.area?nc(r,a,t.area):null,"light"===e?Wl(Bl(r,a,t)):"none","temp"===e&&t.area?oc(r,a,t.area):null,i.tempMin,i.tempMax,s,ts(i.customFill,t))]})),v=e.rooms.filter(t=>t.area||i.showBorders||"none"!==Ms(i.fill,t)).map(t=>{let s="room "+(e.bg?"overlay":"yard"),n="";const o=Ms(i.fill,t);if(i.showBorders||"none"!==o){s+=" styled";const e=[`--room-stroke:${i.color}`,`--room-stroke-op:${i.showBorders?i.opacity:0}`],o=f.get(t)||null;o?(s+=" filled",e.push(`--room-fill:${o.color}`,`--room-fill-op:${o.opacity.toFixed(3)}`)):e.push("--room-fill:transparent","--room-fill-op:0"),n=e.join(";")}const r=t.id||G,a=t.area||G,l=t.poly?W``}_valueChanged(t){const e={...this._config,...t.detail.value},i=new Event("config-changed",{bubbles:!0,composed:!0});i.detail={config:e},this.dispatchEvent(i)}}Ec.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",Ec);const Ic={climate:["current_temperature","temperature","current_humidity","humidity"],water_heater:["current_temperature","temperature"],cover:["current_position"],valve:["current_position"],fan:["percentage"],humidifier:["current_humidity","humidity"],light:["brightness"],media_player:["volume_level"],vacuum:["battery_level","fan_speed"],lawn_mower:["battery_level","fan_speed"]};function zc(t){return t?"entity_state"===t.kind?`state:${t.entity_id}`:"entity_attribute"===t.kind?`attr:${t.entity_id}:${t.attribute}`:"derived_marker_state"===t.kind?`marker:${t.ref}`:"derived:lqi":""}function Fc(t){if("derived:lqi"===t)return{kind:"derived_lqi"};if(t.startsWith("state:"))return{kind:"entity_state",entity_id:t.slice(6)};if(t.startsWith("attr:")){const e=t.slice(5),i=e.lastIndexOf(":");if(i>0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Nc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Oc(t){return t.replaceAll("_"," ")}function Lc(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function Hc(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function qc(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Nc(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(Uc(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Ui(t,i.entity_id);n=s?Wi(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Oc(i.attribute)} · ${Nc(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?Uc(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Ui(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Lc(o,100/255);if("volume_level"===i)return Lc(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Lc(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=jl(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:Hc(i)}}function Bc(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));if(i)return{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>Dl(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&Kl(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function Uc(t,e){const i=t?.entities?.[e];if(i&&!bl(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||bl(s)}function Wc(t,e){return Uc(t,e)&&!!t?.states?.[e]}function jc(t,e,i=[e]){const s=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||s.add(t);const n=[],o=Bl(t,i),r=o.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),a=i=>{const s=zc(i);if(n.some(t=>t.key===s))return;const o=qc(t,e,i,r),a="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";n.push({key:s,source:i,label:o.sourceLabel,technical:a,value:o.text,available:"available"===o.availability})};for(const e of[...s].sort()){if(!Wc(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;a({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Ic[i]||[])t in(n?.attributes||{})&&a({kind:"entity_attribute",entity_id:e,attribute:t})}const l=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&l.add(`marker:${e.marker.id}`);const c=new Set(o.map(t=>t.key));for(const t of[...l].sort())c.has(t)&&a({kind:"derived_marker_state",ref:t});return e.virtual||null==jl(t,e.entities)||a({kind:"derived_lqi"}),n}function Gc(t,e,i){const s=Bc(t,e);if(s&&i.some(t=>t.key===zc(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}const Vc={sourceKind:"none",visualSources:[],criticalSources:[],samples:[]};function Kc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Yc(t,e){const i=t?.states?.[e];if(!i)return"";if("function"==typeof t?.formatEntityState)try{const e=t.formatEntityState(i);if("string"==typeof e&&e)return e}catch{}return String(i.state??"")}function Xc(t,e,i,s){return{eid:e,role:i,name:Kc(t,e),state:String(t?.states?.[e]?.state??""),stateText:Yc(t,e),integrationDomain:t?.entities?.[e]?.platform||null,sample:s||sl(t,e)}}function Zc(t,e,i=[e],s){const n=e.hidden&&e.userHidden?{...e,hidden:!1}:e;let o="none",r=[];const a=(l=Sc({hass:t,devices:i,device:n,lightSources:s}),"cover"!==l?.semantics?null:l.targets[0]?.entityId||l.skippedTargets[0]?.entityId||null);var l;const c=Bl(t,[n]),h=Il(n.marker?.binding,n.marker?.controls??n.controls,n.entities),d=new Set(h.filter(t=>t.startsWith("marker:"))),u=!0===n.marker?.is_light||d.size>0?s||Bl(t,i):c,p=u.filter(t=>t.device.id===n.id&&"controls"!==t.via),_=c.filter(t=>"controls"!==t.via),m=[...c.filter(t=>"controls"===t.via),...p.length?p:_];if(d.size)for(const t of u){if(!d.has(t.key))continue;t.stateEids.length>0&&m.some(e=>e.stateEids.some(e=>t.stateEids.includes(e)))||m.some(e=>e.key===t.key)||m.push({...t,via:"controls",castsGlow:!1})}if(a)o="cover",r=[Xc(t,a,"cover")];else if(m.length)o=m.some(t=>"controls"===t.via)?"controls":"light",r=m.map(i=>{const s="controls"===i.via?"control":"forced"===i.via?"forced_light":"light";if(!i.passive)return Xc(t,i.eid,s);const n=i.on?"on":"off";return{eid:i.key,role:s,name:e.name,state:n,stateText:n,integrationDomain:null,sample:{eid:i.key,state:n,availability:"available",status:i.on?"working":"neutral",activity:"none",edge:"none"}}});else{const e=Rl(t,n.entities),i=e.length?e:n.entities.filter(e=>!!t?.states?.[e]);if(i.length){o="device_role";const e=function(t,e,i){const s=e.map(e=>sl(t,e)),n=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category);return 1===e.length&&n.length>1&&el(t,e[0])?s.map(t=>"unavailable"===t.availability?t:"off"===t.state?{...t,availability:"unavailable",status:"neutral",activity:"none",edge:"none"}:{...t,status:"neutral",activity:"none",edge:"none"}):s}(t,i,n.entities);r=i.map((i,s)=>Xc(t,i,"device_role",e[s]))}else n.primary&&(o="primary",r=[Xc(t,n.primary,"primary")])}const g=[];for(const e of n.entities||[]){const i=sl(t,e);"alarm"!==i.status||r.some(t=>t.eid===e)||g.push(Xc(t,e,"critical",i))}return{sourceKind:o,visualSources:r,criticalSources:g,samples:[...r,...g].map(t=>t.sample)}}function Jc(t,e,i,s){if(e.virtual)return{source:null,text:null,fallback:"value_virtual"};if(s){const i=function(t,e){if(!0!==e.marker?.use_climate_temp)return null;for(const i of e.entities){if(!i.startsWith("climate."))continue;const e=Number(t?.states?.[i]?.attributes?.current_temperature);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(i)return{source:{kind:"temperature",eid:i.eid,attribute:"current_temperature",text:i.text},text:i.text,fallback:null};const s=function(t,e){if("mdi:thermometer"!==e.icon&&"mdi:air-filter"!==e.icon)return null;for(const i of e.entities){if(!Dl(t,i))continue;const e=Number(t?.states?.[i]?.state);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(s)return{source:{kind:"temperature",eid:s.eid,text:s.text},text:s.text,fallback:null};const n=function(t,e){if(!e.primary||!Kl(t,e.primary))return null;const i=Number(t?.states?.[e.primary]?.state);return Number.isFinite(i)?{eid:e.primary,text:`${Math.round(i)}%`}:null}(t,e);if(n)return{source:{kind:"humidity",eid:n.eid,text:n.text},text:n.text,fallback:null}}if(1!==i.visualSources.length)return{source:null,text:null,fallback:i.visualSources.length?"value_ambiguous_sources":"value_no_state"};const n=i.visualSources[0].eid,o=function(t,e){const i=t?.states?.[e];if(!i||null==i.state||""===String(i.state).trim())return{text:"",fallback:"value_no_state"};const s=i.state;if(!["string","number","boolean"].includes(typeof s))return{text:"",fallback:"value_non_scalar"};const n=String(s).trim().toLowerCase();if("unknown"===n||"unavailable"===n)return{text:"",fallback:"value_no_state"};const o=Ui(t,e);return o?{text:Wi(o,String(i.attributes?.unit_of_measurement||"")),fallback:null}:{text:"",fallback:"value_no_state"}}(t,n);return o.fallback?{source:null,text:null,fallback:o.fallback}:{source:{kind:"entity",eid:n,text:o.text},text:o.text,fallback:null}}function Qc(t,e,i){const s=t.marker?.binding||(t.bindingKind&&t.bindingRef?`${t.bindingKind}:${t.bindingRef}`:t.virtual?"virtual":""),n=[...e.visualSources.map(t=>`${t.role}:${t.eid}`),...e.criticalSources.map(t=>`critical:${t.eid}`)].sort(),o=i?`${i.kind}:${i.eid}:${i.attribute||""}`:"none";return[s,e.sourceKind,...n,`value:${o}`].join("\n")}function th(t,e,i){return Qc(e,i||Zc(t,e),null).replace(/\nvalue:none$/,"")}function eh(t){if(t.effectiveHidden)return[];if("static_icon"===t.display)return["static-icon"];const e=[],{visual:i}=t;return"alarm"===t.pulse.kind?e.push("alarm"):"unavailable"===i.availability?e.push("unavail"):"working"===i.status?e.push("on"):"open"===i.status&&e.push("open"),"none"!==t.pulse.reason&&"alarm"!==t.pulse.reason&&e.push("activity-"+t.pulse.reason),t.pulse.generation%2==0&&(e.push("pulse-gen2"),"short"===t.pulse.kind&&e.push("activity-gen2")),e}function ih(t,e,i){const s=Ei(e.marker?.display),n="static_icon"===s,o=n&&!1===i.sourceDetails?Vc:Zc(t,e,i.lightDevices||[e],i.lightSources),r=e.bindingStatus,a="ha_disabled"===r?.kind,l="orphaned"===r?.kind,c=!0===e.userHidden||!0===e.marker?.hidden,h=a||c&&!i.designPreview,d=nl(o.samples);let u=d;h||n?u={availability:"available",status:"neutral",activity:"none"}:"alarm"===d.status||i.liveStates||(u={availability:"available",status:"neutral",activity:"none"});const p=n&&!1===i.sourceDetails?{source:null,text:null,fallback:null}:Jc(t,e,o,i.showTemperature),_=Qc(e,o,p.source),m=th(t,e,o),g=i.activityRuntime,f=i.now??Date.now(),v=g?.expiresAt||(g?.flashTs?g.flashTs+3300:0);!n&&!h&&i.liveStates&&"alarm"!==d.status&&g?.sources===m&&g.flashTs&&g.flashKind&&v>f&&(u={...u,activity:g.flashKind});const y="icon_ripple"===s&&!h&&i.liveStates&&"alarm"!==u.status?u.activity:"none",b=n||h||!i.showTemperature?null:!0===e.marker?.use_climate_temp?Vl(t,e.entities):"mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon?Gl(t,e.entities):null,w=!n&&!h&&i.showTemperature&&e.primary&&Kl(t,e.primary)?Yl(t,e.entities):null,k=n||h||!i.showSignal||e.virtual?null:jl(t,e.entities),$=function(t,e,i){const s=null!=e.marker?.value_badge;if(i.effectiveHidden||"static_icon"===i.display)return null;const n=e.marker?.value_badge;if(s)return n?.enabled&&n.source?{configured:!0,enabled:!0,position:n.position||"right",...qc(t,e,n.source,i.markerStates)}:null;if(!i.showTemperature||"value"===i.display)return null;const o=Bc(t,e);if(!o)return null;let r=null,a="default";if("entity_attribute"===o.kind&&"current_temperature"===o.attribute){const i=Vl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=Gl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else{const i=Yl(t,e.entities);null!=i&&(r=`${i}%`),a="humidity"}return null==r?null:{configured:!1,enabled:!0,source:o,position:"right",sourceLabel:"entity_attribute"===o.kind?`${Oc(o.attribute)} · ${Nc(t,o.entity_id)}`:"entity_state"===o.kind?Nc(t,o.entity_id):"",text:r,fullText:r,availability:"available",isLqi:!1,tone:a}}(t,e,{showTemperature:i.showTemperature,showSignal:i.showSignal,display:s,effectiveHidden:h,markerStates:o.visualSources.filter(t=>t.eid.startsWith("marker:")).map(t=>({ref:t.eid,on:"on"===t.state,name:t.name}))}),x="cover"===o.sourceKind?o.visualSources[0]?.eid:e.primary||o.visualSources[0]?.eid,S=x?t?.states?.[x]:null,M=!i.liveStates||n||h?e.icon:hs(e.icon,x?.split(".")[0],S?.attributes?.device_class,S?.state,!!e.marker?.icon),C=!i.liveStates||n||h?null:o.visualSources.filter(t=>!t.eid.startsWith("marker:")).map(e=>function(t){return t&&"on"===t.state?Rt(t.attributes?.rgb_color):null}(t?.states?.[e.eid])).find(t=>!!t)||null,D=Number(e.marker?.size)>0?Number(e.marker.size):1,T=Number(e.marker?.angle)||0,P=Number(e.marker?.ripple_size)>0?Number(e.marker.ripple_size):3,R=Dt(e.marker?.ripple_color,null),A=n?null:R||C||null,E=function(t){const{display:e,visual:i,semanticActivity:s,liveStates:n,effectiveHidden:o,bindingUnavailable:r=!1,reducedMotion:a=!1}=t,l=Math.max(1,Math.trunc(t.shortGeneration||1)),c=Number.isFinite(t.diameterScale)?Math.max(1,Number(t.diameterScale)):3,h=t.color||null;if(o||r||"unavailable"===i.availability||"static_icon"===e)return qt(l,h,c);if("alarm"===i.status)return{kind:"alarm",reason:"alarm",generation:l,expiresAt:null,color:"#f25a4a",diameterScale:3,animated:!a,reducedMotionIndicator:"none"};if(!n||"icon_ripple"!==e)return qt(l,h,c);const d=t.now??Date.now(),u=t.shortExpiresAt||null;return t.shortReason&&null!=u&&u>d?{kind:"short",reason:t.shortReason,generation:l,expiresAt:u,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:"presence"===s||"transition"===s||"running"===s?{kind:"continuous",reason:s,generation:l,expiresAt:null,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:qt(l,h,c)}({display:s,visual:u,semanticActivity:d.activity,shortReason:g?.sources===m?g?.flashKind:null,shortGeneration:g?.gen,shortExpiresAt:g?.sources===m?v:null,now:f,liveStates:i.liveStates,effectiveHidden:h,bindingUnavailable:a||l,reducedMotion:i.reducedMotion,color:A,diameterScale:P}),I="value"!==s||h?null:p.text,z="ha_disabled"===r?.kind?r.reason:null,F=function(t,e,i,s,n,o,r,a){return o?"ha_disabled":r?"orphaned":"static_icon"===a?"static_icon":"alarm"===e.status?"alarm":n?"unavailable"===e.availability?"unavailable":"cover"===s?"cover_icon_state":"presence"===i?"presence":"event"===i?"event":"transition"===i?"transition":"working"===e.status?"icon_ripple"===a&&"none"!==i?"working_activity":"working":"open"===e.status?"open":(t.primary||"").startsWith("media_player.")?"media_neutral":"neutral":"live_states_disabled"}(e,u,y,o.sourceKind,i.liveStates,a,l,s),N=[];i.designPreview&&c&&N.push("hidden_design_preview"),n||!0!==e.marker?.vacuum?.live||N.push("vacuum_live_plan_only");const O=1===o.visualSources.length&&el(t,o.visualSources[0].eid),L=e.entities.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category).length;O&&L>1&&N.push("composite_power_source"),"icon_ripple"!==s&&"static_icon"!==s&&"alarm"!==d.status&&"none"!==d.activity&&N.push("activity_display_disabled");const H={binding:e.marker?.binding||(e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:e.virtual?"virtual":""),sourceKind:o.sourceKind,visualSources:o.visualSources,criticalSources:o.criticalSources,valueSource:p.source,sourceSignature:_,visual:u,display:s,icon:M,valueText:I,valueFullText:I,fallbackReason:"value"!==s||I?null:p.fallback,activity:y,activityGeneration:g?.gen||1,pulse:E,classes:[],tempText:null==b?null:String(b),humText:null==w?null:String(w),valueBadge:$,lqiText:null==k||$?.isLqi?null:String(k),lqiColor:null==k?null:ti(k),lightColor:C,scale:D,angle:T,rippleScale:P,rippleColor:A,userHidden:c,effectiveHidden:h,haDisabled:a,disabledReason:z,orphaned:l,vacuumLive:!n&&!0===e.marker?.vacuum?.live,explanation:{reason:F,notices:N}};return{...H,classes:eh(H)}}function sh(t,e=new WeakMap){if(null===t||"object"!=typeof t)return t;const i=t,s=e.get(i);if(s)return s;if(Array.isArray(t)){const s=[];e.set(i,s);for(const i of t)s.push(sh(i,e));return Object.freeze(s)}const n={};e.set(i,n);for(const[i,s]of Object.entries(t))"function"!=typeof s&&(n[i]=sh(s,e));return Object.freeze(n)}function nh(t){const e=new Map(t);let i;return i=Object.freeze({get size(){return e.size},get:t=>e.get(t),has:t=>e.has(t),entries:()=>e.entries(),keys:()=>e.keys(),values:()=>e.values(),forEach:(t,s)=>e.forEach((e,n)=>t.call(s,e,n,i)),[Symbol.iterator]:()=>e[Symbol.iterator]()}),i}function oh(t){const e=new Set(t.entityIds||[]),i=new Set(t.deviceIds||[]),s=new Set(t.areaIds||[]);for(const s of t.devices){for(const t of s.entities||[])e.add(t);s.primary&&e.add(s.primary);for(const t of s.controls||[])e.add(t);s.marker?.vacuum?.source&&e.add(s.marker.vacuum.source),"device"===s.bindingKind&&s.bindingRef&&i.add(s.bindingRef),"entity"===s.bindingKind&&s.bindingRef&&e.add(s.bindingRef)}const n={},o={};for(const[o,r]of Object.entries(t.hass?.entities||{})){const a=r?.device_id?t.hass?.devices?.[r.device_id]:null;(e.has(o)||r?.device_id&&i.has(r.device_id)||s.has(r?.area_id)||s.has(a?.area_id))&&(e.add(o),n[o]=r,r?.device_id&&i.add(r.device_id))}for(const e of i){const i=t.hass?.devices?.[e];i&&(o[e]=i)}const r={};for(const i of e){const e=t.hass?.states?.[i];e&&(r[i]=e)}const a=Object.freeze({states:sh(r),entities:sh(n),devices:sh(o),config:sh(t.hass?.config),locale:sh(t.hass?.locale),themes:sh(t.hass?.themes)});return Object.freeze({sourceSequence:t.sourceSequence,capturedAt:t.capturedAt??Date.now(),hass:a,devices:sh([...t.devices]),positions:nh([...t.positions||[]].map(([t,e])=>[t,Object.freeze({x:e.x,y:e.y})])),presentations:nh([...t.presentations].map(([t,e])=>[t,sh(e)])),facts:nh([...t.facts||[]].map(([t,e])=>[t,sh(e)]))})}const rh=(t,e)=>`${t}:${e?1:0}`;function ah(t){const e=dr(t.cfg),i={};for(const e of t.cfg.spaces||[])for(const t of e.rooms||[])t.area&&(i[t.area]=e.id);const s=t.cfg.settings?.exclude_integrations?new Set(t.cfg.settings.exclude_integrations):qs,n=Us(t.cfg.settings?.icon_rules?.length?t.cfg.settings.icon_rules:Bs);return ec({hass:t.hass,registry:t.registry,areaToSpace:i,markers:t.cfg.markers||[],settings:t.cfg.settings||{},excluded:s,showAll:!!t.cfg.settings?.show_all,firstSpaceId:e[0]?.id||"",loc:e=>Os(t.lang,e),iconRules:n})}function lh(t){const e=dr(t.cfg).find(e=>e.id===t.spaceId);if(!e)return null;const i=es(t.cfg.spaces.find(e=>e.id===t.spaceId)),s=ns(t.cfg.settings),n=t.iconSize??2.5,o=n>8?2.5:n,r=t.registry?wl(t.hass,t.registry):t.hass,a=(t.devices||ah(t)).filter(e=>e.space===t.spaceId),l=a.filter(t=>!t.hidden),c=function(t,e,i){const s={},n=i/100*Ar(e)*1.3;for(const i of e.rooms){if(!i.area)continue;const e=t.filter(t=>t.area===i.area);if(!e.length)continue;const o=zr(i),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(e.length*a/Math.max(l,1)))),h=a/c,d=l/Math.max(Math.ceil(e.length/c),1),u=e.map((t,e)=>({x:o.x+r+h*(e%c+.5),y:o.y+r+d*(Math.floor(e/c)+.5)}));Pi(u,o,n,.5*r),e.forEach((t,e)=>s[t.id]=vr(u[e]))}return s}(a,e,o),h=[];for(const e of l){const i=t.layout[e.id];if(i&&i.s===t.spaceId){const t=i.x*or,e=i.y*or;h.push({minX:t,minY:e,maxX:t,maxY:e})}}const d=t.cfg.spaces.find(e=>e.id===t.spaceId)||{},u=Array.isArray(d.walls)?d.walls:[],p=Number(d.cell_cm)>0?Number(d.cell_cm):5,_=function(t,e,i){const s=[];for(const n of t.partitions||[]){const t=Vo(n.a,n.b,n.cm,e,i);t&&s.push(t)}for(const n of t.room_drafts||[])s.push(...Yo(n,e,i));for(const n of t.wall_columns||[])s.push(Ko(n,e,i));return s}(e,p,mr);for(const t of _){const e=t.map(t=>t[0]),i=t.map(t=>t[1]);e.length&&h.push({minX:Math.min(...e),minY:Math.min(...i),maxX:Math.max(...e),maxY:Math.max(...i)})}const m=Pr(e,h),g=[m.x,m.y,m.w,m.h],f=new Map(e.rooms.map(t=>{const e=Ms(i.fill,t);return[t,rs(e,"lqi"===e&&t.area?nc(r,a,t.area):null,"light"===e?Wl(Bl(r,a,t)):"none","temp"===e&&t.area?oc(r,a,t.area):null,i.tempMin,i.tempMax,s,ts(i.customFill,t))]})),v=e.rooms.filter(t=>t.area||i.showBorders||"none"!==Ms(i.fill,t)).map(t=>{let s="room "+(e.bg?"overlay":"yard"),n="";const o=Ms(i.fill,t);if(i.showBorders||"none"!==o){s+=" styled";const e=[`--room-stroke:${i.color}`,`--room-stroke-op:${i.showBorders?i.opacity:0}`],o=f.get(t)||null;o?(s+=" filled",e.push(`--room-fill:${o.color}`,`--room-fill-op:${o.opacity.toFixed(3)}`)):e.push("--room-fill:transparent","--room-fill-op:0"),n=e.join(";")}const r=t.id||G,a=t.area||G,l=t.poly?W``:W``;return l}),y=e.rooms.filter(t=>{const e=f.get(t);return Cs(i.glow,t)&&(!e||e.opacity<=0)}).map(t=>t.poly?W`${this._toast}`:G} - `;const i=this._spaceModel(),s=i.vb,n="devices"===this._mode&&this._showAll,o=this._renderDevices.filter(t=>t.space===i.id&&(!t.hidden||n)),r=this._renderDeviceSnapshot,a=this._spaceDisplayForRender(),l=this._resolvedRoomFills(i,a),c=this._resolvedGlowBase(i,a,l),h=a.showLqi??this._config.show_signal??!0,d=this._config.icon_size??2.5,u=d>8?2.5:d,p=this._viewOr(s),_=this._editing?"":this._stageBg(a),m=this._editing||"daynight"!==this._effBgMode()?null:this._sunNow(),g=m?bn(Mn(m.elevation)).planDim:0,f=this._opMeasureView,v=this._decorMeasure,y=this._bdLive,b=this._furnLive,w="view"===this._mode?this._editorChromeMode:this._mode,k=this._roomHoverPaths(i),$=i.bg?this._display(i.bg.href):"",x=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,S=this._modeTransitionVisual,M=S?.stageColor||_,C=S?.sceneBrightness??(m?1-g:1);return U` + `;const i=this._spaceModel(),s=i.vb,n="devices"===this._mode&&this._showAll,o=this._renderDevices.filter(t=>t.space===i.id&&(!t.hidden||n)),r=this._renderDeviceSnapshot,a=this._spaceDisplayForRender(),l=this._resolvedRoomFills(i,a),c=this._resolvedGlowBase(i,a,l),h=a.showLqi??this._config.show_signal??!0,d=this._config.icon_size??2.5,u=d>8?2.5:d,p=this._viewOr(s),_=this._editing?"":this._stageBg(a),m=this._editing||"daynight"!==this._effBgMode()?null:this._sunNow(),g=m?bn(Mn(m.elevation)).planDim:0,f=this._opMeasureView,v=this._decorMeasure,y=this._bdLive,b=this._furnLive,w="view"===this._mode?this._editorChromeMode:this._mode,k=this._roomHoverPaths(i),$=i.bg?this._display(i.bg.href):"",x=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,S=this._modeTransitionVisual,M=this._modeTransition.state?.from.presentedMode,C=!this._markup||!!S&&("view"===S.presentedMode||"devices"===S.presentedMode||"view"===M||"devices"===M),D=S?.stageColor||_,T=S?.sceneBrightness??(m?1-g:1);return U` this._markupClick(t)} @wheel=${t=>this._onWheel(t)} @pointerdown=${t=>{this._notePointer(t),this._stagePointerDown(t)}} @@ -4933,7 +4933,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="8f44f3a00bc48a1f93365a849e5ac0d33308 ${this._renderEditorSecondary()} + style="${1!==T?`filter:brightness(${T.toFixed(3)})`:""}"> ${""} ${this._wallHatchDefs(a.color)}${W`${this._paperShapes(i.rooms).map(t=>"poly"in t?W``:W``)}`} @@ -4979,7 +4979,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="8f44f3a00bc48a1f93365a849e5ac0d33308 ${this._renderGlowBaseRooms(i,c)} ${this._renderOpeningTunnelFills(i,c,"glow-base")} ${this._renderSvgRoomLabels(i,a)} - ${this._renderGlowLayer(i,a)} + ${C?this._renderGlowLayer(i,a):G} ${this._renderSunRays(i)} ${this._editing?this._renderAlignGuides():G} ${f?.guide?this._renderOpeningCenterTick(f.guide):G} diff --git a/dist/houseplan-card.js b/dist/houseplan-card.js index abbbe61d..e015f983 100755 --- a/dist/houseplan-card.js +++ b/dist/houseplan-card.js @@ -1,4 +1,4 @@ -globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="8f44f3a00bc48a1f93365a849e5ac0d3330808f0272a287bd0af7be018918dbd";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,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.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?m:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,g?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,$=t=>t,x=k.trustedTypes,S=x?x.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,E=Array.isArray,I="[ \t\n\f\r]",z=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,F=/-->/g,N=/>/g,O=RegExp(`>|${I}(?:([^\\s"'>=/]+)(${I}*=${I}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),L=/'/g,H=/"/g,q=/^(?:script|style|textarea|title)$/i,B=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),U=B(1),W=B(2),j=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!E(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=z;for(let e=0;e"===l[0]?(r=n??z,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?O:'"'===l[3]?H:L):r===H||r===L?r=O:r===F||r===N?r=z:(r=O,n=void 0);const d=r===O&&t[e+1].startsWith("/>")?" ":"";o+=r===z?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||">")+(2===e?"":3===e?"":"")),s]};class Z{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iE(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new Z(t)),e}k(t){E(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=J(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==j,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return j}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2;let pt=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const{I:_t}=rt,mt=t=>t,gt=()=>document.createComment(""),ft=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(gt(),n),o=s.insertBefore(gt(),n);i=new _t(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=mt(t).nextSibling;mt(s).insertBefore(t,n),t=e}}}return i},vt=(t,e,i=t)=>(t._$AI(e,i),t),yt={},bt=(t,e=yt)=>t._$AH=e,wt=t=>{t._$AR(),t._$AA.remove()},kt=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},$t=(t=>(...e)=>({_$litDirective$:t,values:e}))(class extends pt{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=vt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=vt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=vt(n[d],o[_]),ft(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=vt(n[u],o[p]),ft(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=kt(r,p,_),h=kt(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=ft(t,n[d]);vt(e,o[p]),l[p]=e}else l[p]=vt(i,o[p]),ft(t,n[d],i),n[e]=null;p++}else wt(n[u]),u--;else wt(n[d]),d++;for(;p<=_;){const e=ft(t,l[_+1]);vt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&wt(t)}return this.ut=r,bt(t,l),j}}),xt=new WeakMap;let St=0;class Mt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++St,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=xt.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),xt.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?xt.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=xt.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void xt.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=s=>{if(s instanceof HTMLElement&&(s.matches(t)&&e.push(s),s.shadowRoot))for(const t of s.shadowRoot.childNodes)i(t);else for(const t of s.childNodes)i(t)};for(const t of this.childNodes)i(t);const s=this.overlayPortal();return s&&i(s),e.filter(t=>{const e=getComputedStyle(t);return!t.hidden&&"none"!==e.display&&"hidden"!==e.visibility})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=U` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="117e675d4314f3ef3d16b7d94885f953bbc856da645e488f37045ef5a04716eb";const t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,i=Symbol(),s=new WeakMap;let n=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==i)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const i=this.t;if(e&&void 0===t){const e=void 0!==i&&1===i.length;e&&(t=s.get(i)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&s.set(i,t))}return t}toString(){return this.cssText}};const o=(t,...e)=>{const s=1===t.length?t[0]:e.reduce((e,i,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.")})(i)+t[s+1],t[0]);return new n(s,t,i)},r=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e="";for(const i of t.cssRules)e+=i.cssText;return(t=>new n("string"==typeof t?t:t+"",void 0,i))(e)})(t):t,{is:a,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,m=_?_.emptyScript:"",g=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?m:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){let i=t;switch(e){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},y=(t,e)=>!a(t,e),b={attribute:!0,type:String,converter:v,reflect:!1,useDefault:!1,hasChanged:y};Symbol.metadata??=Symbol("metadata"),p.litPropertyMetadata??=new WeakMap;let w=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=b){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){const i=Symbol(),s=this.getPropertyDescriptor(t,i,e);void 0!==s&&l(this.prototype,t,s)}}static getPropertyDescriptor(t,e,i){const{get:s,set:n}=c(this.prototype,t)??{get(){return this[e]},set(t){this[e]=t}};return{get:s,set(e){const o=s?.call(this);n?.call(this,e),this.requestUpdate(t,o,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(f("elementProperties")))return;const t=u(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(f("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(f("properties"))){const t=this.properties,e=[...h(t),...d(t)];for(const i of e)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const e=litPropertyMetadata.get(t);if(void 0!==e)for(const[t,i]of e)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,e]of this.elementProperties){const i=this._$Eu(t,e);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const e=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const t of i)e.unshift(r(t))}else void 0!==t&&e.push(r(t));return e}static _$Eu(t,e){const i=e.attribute;return!1===i?void 0:"string"==typeof i?i:"string"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,e=this.constructor.elementProperties;for(const i of e.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const i=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((i,s)=>{if(e)i.adoptedStyleSheets=s.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of s){const s=document.createElement("style"),n=t.litNonce;void 0!==n&&s.setAttribute("nonce",n),s.textContent=e.cssText,i.appendChild(s)}})(i,this.constructor.elementStyles),i}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,e,i){this._$AK(t,i)}_$ET(t,e){const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(void 0!==s&&!0===i.reflect){const n=(void 0!==i.converter?.toAttribute?i.converter:v).toAttribute(e,i.type);this._$Em=t,null==n?this.removeAttribute(s):this.setAttribute(s,n),this._$Em=null}}_$AK(t,e){const i=this.constructor,s=i._$Eh.get(t);if(void 0!==s&&this._$Em!==s){const t=i.getPropertyOptions(s),n="function"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:v;this._$Em=s;const o=n.fromAttribute(e,t.type);this[s]=o??this._$Ej?.get(s)??o,this._$Em=null}}requestUpdate(t,e,i,s=!1,n){if(void 0!==t){const o=this.constructor;if(!1===s&&(n=this[t]),i??=o.getPropertyOptions(t),!((i.hasChanged??y)(n,e)||i.useDefault&&i.reflect&&n===this._$Ej?.get(t)&&!this.hasAttribute(o._$Eu(t,i))))return;this.C(t,e,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,e,{useDefault:i,reflect:s,wrapped:n},o){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,o??e??this[t]),!0!==n||void 0!==o)||(this._$AL.has(t)||(this.hasUpdated||i||(e=void 0),this._$AL.set(t,e)),!0===s&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,e]of this._$Ep)this[t]=e;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[e,i]of t){const{wrapped:t}=i,s=this[e];!0!==t||this._$AL.has(e)||void 0===s||this.C(e,void 0,i,s)}}let t=!1;const e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(e)):this._$EM()}catch(e){throw t=!1,this._$EM(),e}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}};w.elementStyles=[],w.shadowRootOptions={mode:"open"},w[f("elementProperties")]=new Map,w[f("finalized")]=new Map,g?.({ReactiveElement:w}),(p.reactiveElementVersions??=[]).push("2.1.2");const k=globalThis,$=t=>t,x=k.trustedTypes,S=x?x.createPolicy("lit-html",{createHTML:t=>t}):void 0,M="$lit$",C=`lit$${Math.random().toFixed(9).slice(2)}$`,D="?"+C,T=`<${D}>`,P=document,R=()=>P.createComment(""),A=t=>null===t||"object"!=typeof t&&"function"!=typeof t,E=Array.isArray,I="[ \t\n\f\r]",z=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,F=/-->/g,N=/>/g,O=RegExp(`>|${I}(?:([^\\s"'>=/]+)(${I}*=${I}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),L=/'/g,H=/"/g,q=/^(?:script|style|textarea|title)$/i,B=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),U=B(1),W=B(2),j=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!E(t)||!t.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==S?S.createHTML(e):e}const X=(t,e)=>{const i=t.length-1,s=[];let n,o=2===e?"":3===e?"":"",r=z;for(let e=0;e"===l[0]?(r=n??z,c=-1):void 0===l[1]?c=-2:(c=r.lastIndex-l[2].length,a=l[1],r=void 0===l[3]?O:'"'===l[3]?H:L):r===H||r===L?r=O:r===F||r===N?r=z:(r=O,n=void 0);const d=r===O&&t[e+1].startsWith("/>")?" ":"";o+=r===z?i+T:c>=0?(s.push(a),i.slice(0,c)+M+i.slice(c)+C+d):i+C+(-2===c?e:d)}return[Y(t,o+(t[i]||">")+(2===e?"":3===e?"":"")),s]};class Z{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const r=t.length-1,a=this.parts,[l,c]=X(t,e);if(this.el=Z.createElement(l,i),K.currentNode=this.el.content,2===e||3===e){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(s=K.nextNode())&&a.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iE(t)||"function"==typeof t?.[Symbol.iterator])(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==G&&A(this._$AH)?this._$AA.nextSibling.data=t:this.T(P.createTextNode(t)),this._$AH=t}$(t){const{values:e,_$litType$:i}=t,s="number"==typeof i?this._$AC(t):(void 0===i.el&&(i.el=Z.createElement(Y(i.h,i.h[0]),this.options)),i);if(this._$AH?._$AD===s)this._$AH.p(e);else{const t=new Q(s,this),i=t.u(this.options);t.p(e),this.T(i),this._$AH=t}}_$AC(t){let e=V.get(t.strings);return void 0===e&&V.set(t.strings,e=new Z(t)),e}k(t){E(this._$AH)||(this._$AH=[],this._$AR());const e=this._$AH;let i,s=0;for(const n of t)s===e.length?e.push(i=new tt(this.O(R()),this.O(R()),this,this.options)):i=e[s],i._$AI(n),s++;s2||""!==i[0]||""!==i[1]?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=G}_$AI(t,e=this,i,s){const n=this.strings;let o=!1;if(void 0===n)t=J(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==j,o&&(this._$AH=t);else{const s=t;let r,a;for(t=n[0],r=0;r{const s=i?.renderBefore??e;let n=s._$litPart$;if(void 0===n){const t=i?.renderBefore??null;s._$litPart$=n=new tt(e.insertBefore(R(),t),t,void 0,i??{})}return n._$AI(t),n},ct=globalThis;let ht=class extends w{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=lt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return j}};ht._$litElement$=!0,ht.finalized=!0,ct.litElementHydrateSupport?.({LitElement:ht});const dt=ct.litElementPolyfillSupport;dt?.({LitElement:ht}),(ct.litElementVersions??=[]).push("4.2.2");const ut=2;let pt=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}};const{I:_t}=rt,mt=t=>t,gt=()=>document.createComment(""),ft=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(gt(),n),o=s.insertBefore(gt(),n);i=new _t(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,r=o!==t;if(r){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||r){let t=i._$AA;for(;t!==e;){const e=mt(t).nextSibling;mt(s).insertBefore(t,n),t=e}}}return i},vt=(t,e,i=t)=>(t._$AI(e,i),t),yt={},bt=(t,e=yt)=>t._$AH=e,wt=t=>{t._$AR(),t._$AA.remove()},kt=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},$t=(t=>(...e)=>({_$litDirective$:t,values:e}))(class extends pt{constructor(t){if(super(t),t.type!==ut)throw Error("repeat() can only be used in text expressions")}dt(t,e,i){let s;void 0===i?i=e:void 0!==e&&(s=e);const n=[],o=[];let r=0;for(const e of t)n[r]=s?s(e,r):r,o[r]=i(e,r),r++;return{values:o,keys:n}}render(t,e,i){return this.dt(t,e,i).values}update(t,[e,i,s]){const n=(t=>t._$AH)(t),{values:o,keys:r}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=r,o;const a=this.ut??=[],l=[];let c,h,d=0,u=n.length-1,p=0,_=o.length-1;for(;d<=u&&p<=_;)if(null===n[d])d++;else if(null===n[u])u--;else if(a[d]===r[p])l[p]=vt(n[d],o[p]),d++,p++;else if(a[u]===r[_])l[_]=vt(n[u],o[_]),u--,_--;else if(a[d]===r[_])l[_]=vt(n[d],o[_]),ft(t,l[_+1],n[d]),d++,_--;else if(a[u]===r[p])l[p]=vt(n[u],o[p]),ft(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=kt(r,p,_),h=kt(a,d,u)),c.has(a[d]))if(c.has(a[u])){const e=h.get(r[p]),i=void 0!==e?n[e]:null;if(null===i){const e=ft(t,n[d]);vt(e,o[p]),l[p]=e}else l[p]=vt(i,o[p]),ft(t,n[d],i),n[e]=null;p++}else wt(n[u]),u--;else wt(n[d]),d++;for(;p<=_;){const e=ft(t,l[_+1]);vt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&wt(t)}return this.ut=r,bt(t,l),j}}),xt=new WeakMap;let St=0;class Mt extends ht{constructor(){super(...arguments),this.title="",this.icon="",this.wide=!1,this.dismissOnScrim=!1,this.hass=null,this._opener=null,this._focusRoot=null,this._useHaDialog=!1,this._closing=!1,this._overlays=[],this._titleId="hp-dialog-title-"+ ++St,this._focusInitial=()=>{const t=this._focusableElements(),e=t.find(t=>t.hasAttribute("autofocus"))||t[0]||(this._useHaDialog?null:this.renderRoot.querySelector(".close"))||this.renderRoot.querySelector(".surface")||this.renderRoot.querySelector("ha-dialog");e?.focus({preventScroll:!0})},this._requestClose=()=>{this._closing||(this._closing=!0,this.dispatchEvent(new CustomEvent("hp-close",{bubbles:!0,composed:!0})))},this._onKeyDown=t=>{if("Escape"===t.key){t.preventDefault(),t.stopImmediatePropagation(),this._pruneOverlays();const e=this._overlays[this._overlays.length-1];return e?void this._closeOverlay(e,"escape"):void this._requestClose()}if("Tab"!==t.key||this._useHaDialog)return;const e=this.renderRoot.querySelector(".close"),i=e?[e,...this._focusableElements()]:this._focusableElements();if(!i.length)return t.preventDefault(),void this.renderRoot.querySelector(".surface")?.focus({preventScroll:!0});const s=this._deepActiveElement(),n=i[0],o=i[i.length-1];!t.shiftKey||s!==n&&i.includes(s)?t.shiftKey||s!==o||(t.preventDefault(),n.focus()):(t.preventDefault(),o.focus())},this._onFallbackCancel=t=>{t.preventDefault(),this._requestClose()},this._onFallbackClick=t=>{this.dismissOnScrim&&t.target===t.currentTarget&&this._requestClose()}}connectedCallback(){super.connectedCallback(),this._opener=this._deepActiveElement();const t=this.getRootNode();this._focusRoot=t;const e=xt.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),xt.set(t,e),this._useHaDialog=!!customElements.get("ha-dialog"),this.addEventListener("keydown",this._onKeyDown,!0)}disconnectedCallback(){this.removeEventListener("keydown",this._onKeyDown,!0);const t=[...this._overlays];this._overlays=[];for(const e of t.reverse())e.close("disconnect");const e=this._focusRoot,i=this._opener;this._opener=null,this._focusRoot=null;const s=e?xt.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=xt.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void xt.delete(e);const s=i?.closest("hp-dialog");i?.isConnected&&s&&t.dialogs.has(s)&&i.focus({preventScroll:!0})})}firstUpdated(t){if(super.firstUpdated(t),!this._useHaDialog){const t=this.renderRoot.querySelector("dialog");t&&!t.open&&t.showModal()}queueMicrotask(()=>this._focusInitial())}_deepActiveElement(){let t=document.activeElement;for(;t?.shadowRoot?.activeElement;)t=t.shadowRoot.activeElement;return t&&t!==document.body?t:null}_focusableElements(){const t=["[autofocus]","a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[contenteditable="true"]','[tabindex]:not([tabindex="-1"])'].join(","),e=[],i=s=>{if(s instanceof HTMLElement&&(s.matches(t)&&e.push(s),s.shadowRoot))for(const t of s.shadowRoot.childNodes)i(t);else for(const t of s.childNodes)i(t)};for(const t of this.childNodes)i(t);const s=this.overlayPortal();return s&&i(s),e.filter(t=>{const e=getComputedStyle(t);return!t.hidden&&"none"!==e.display&&"hidden"!==e.visibility})}_pruneOverlays(){this._overlays=this._overlays.filter(t=>t.owner.isConnected)}_closeOverlay(t,e){const i=this._overlays.findIndex(e=>e.token===t.token);i>=0&&this._overlays.splice(i,1),t.close(e)}registerOverlay(t){this._pruneOverlays();const e=this._overlays.find(e=>e.owner===t.owner);e&&this._overlays.splice(this._overlays.indexOf(e),1);const i=t.group||"transient";for(const t of[...this._overlays].reverse())t.group===i&&this._closeOverlay(t,"exclusive");const s={...t,group:i,token:Symbol("hp-overlay")};this._overlays.push(s);let n=!1;return()=>{if(n)return;n=!0;const t=this._overlays.findIndex(t=>t.token===s.token);t>=0&&this._overlays.splice(t,1)}}closeTransientOverlays(t="outside"){this._pruneOverlays();const e=[...this._overlays].filter(t=>"transient"===(t.group||"transient"));for(const i of e.reverse())this._closeOverlay(i,t);return e.length>0}overlayPortal(){return this.renderRoot.querySelector(".overlay-portal")}render(){const t=U` ${this.icon?U``:G} ${this.title} `;return this._useHaDialog?U`0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Nc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Oc(t){return t.replaceAll("_"," ")}function Lc(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function Hc(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function qc(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Nc(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(Uc(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Ui(t,i.entity_id);n=s?Wi(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Oc(i.attribute)} · ${Nc(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?Uc(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Ui(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Lc(o,100/255);if("volume_level"===i)return Lc(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Lc(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=jl(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:Hc(i)}}function Bc(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));if(i)return{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>Dl(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&Kl(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function Uc(t,e){const i=t?.entities?.[e];if(i&&!bl(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||bl(s)}function Wc(t,e){return Uc(t,e)&&!!t?.states?.[e]}function jc(t,e,i=[e]){const s=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||s.add(t);const n=[],o=Bl(t,i),r=o.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),a=i=>{const s=zc(i);if(n.some(t=>t.key===s))return;const o=qc(t,e,i,r),a="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";n.push({key:s,source:i,label:o.sourceLabel,technical:a,value:o.text,available:"available"===o.availability})};for(const e of[...s].sort()){if(!Wc(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;a({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Ic[i]||[])t in(n?.attributes||{})&&a({kind:"entity_attribute",entity_id:e,attribute:t})}const l=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&l.add(`marker:${e.marker.id}`);const c=new Set(o.map(t=>t.key));for(const t of[...l].sort())c.has(t)&&a({kind:"derived_marker_state",ref:t});return e.virtual||null==jl(t,e.entities)||a({kind:"derived_lqi"}),n}function Gc(t,e,i){const s=Bc(t,e);if(s&&i.some(t=>t.key===zc(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}const Vc={sourceKind:"none",visualSources:[],criticalSources:[],samples:[]};function Kc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Yc(t,e){const i=t?.states?.[e];if(!i)return"";if("function"==typeof t?.formatEntityState)try{const e=t.formatEntityState(i);if("string"==typeof e&&e)return e}catch{}return String(i.state??"")}function Xc(t,e,i,s){return{eid:e,role:i,name:Kc(t,e),state:String(t?.states?.[e]?.state??""),stateText:Yc(t,e),integrationDomain:t?.entities?.[e]?.platform||null,sample:s||sl(t,e)}}function Zc(t,e,i=[e],s){const n=e.hidden&&e.userHidden?{...e,hidden:!1}:e;let o="none",r=[];const a=(l=Sc({hass:t,devices:i,device:n,lightSources:s}),"cover"!==l?.semantics?null:l.targets[0]?.entityId||l.skippedTargets[0]?.entityId||null);var l;const c=Bl(t,[n]),h=Il(n.marker?.binding,n.marker?.controls??n.controls,n.entities),d=new Set(h.filter(t=>t.startsWith("marker:"))),u=!0===n.marker?.is_light||d.size>0?s||Bl(t,i):c,p=u.filter(t=>t.device.id===n.id&&"controls"!==t.via),_=c.filter(t=>"controls"!==t.via),m=[...c.filter(t=>"controls"===t.via),...p.length?p:_];if(d.size)for(const t of u){if(!d.has(t.key))continue;t.stateEids.length>0&&m.some(e=>e.stateEids.some(e=>t.stateEids.includes(e)))||m.some(e=>e.key===t.key)||m.push({...t,via:"controls",castsGlow:!1})}if(a)o="cover",r=[Xc(t,a,"cover")];else if(m.length)o=m.some(t=>"controls"===t.via)?"controls":"light",r=m.map(i=>{const s="controls"===i.via?"control":"forced"===i.via?"forced_light":"light";if(!i.passive)return Xc(t,i.eid,s);const n=i.on?"on":"off";return{eid:i.key,role:s,name:e.name,state:n,stateText:n,integrationDomain:null,sample:{eid:i.key,state:n,availability:"available",status:i.on?"working":"neutral",activity:"none",edge:"none"}}});else{const e=Rl(t,n.entities),i=e.length?e:n.entities.filter(e=>!!t?.states?.[e]);if(i.length){o="device_role";const e=function(t,e,i){const s=e.map(e=>sl(t,e)),n=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category);return 1===e.length&&n.length>1&&el(t,e[0])?s.map(t=>"unavailable"===t.availability?t:"off"===t.state?{...t,availability:"unavailable",status:"neutral",activity:"none",edge:"none"}:{...t,status:"neutral",activity:"none",edge:"none"}):s}(t,i,n.entities);r=i.map((i,s)=>Xc(t,i,"device_role",e[s]))}else n.primary&&(o="primary",r=[Xc(t,n.primary,"primary")])}const g=[];for(const e of n.entities||[]){const i=sl(t,e);"alarm"!==i.status||r.some(t=>t.eid===e)||g.push(Xc(t,e,"critical",i))}return{sourceKind:o,visualSources:r,criticalSources:g,samples:[...r,...g].map(t=>t.sample)}}function Jc(t,e,i,s){if(e.virtual)return{source:null,text:null,fallback:"value_virtual"};if(s){const i=function(t,e){if(!0!==e.marker?.use_climate_temp)return null;for(const i of e.entities){if(!i.startsWith("climate."))continue;const e=Number(t?.states?.[i]?.attributes?.current_temperature);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(i)return{source:{kind:"temperature",eid:i.eid,attribute:"current_temperature",text:i.text},text:i.text,fallback:null};const s=function(t,e){if("mdi:thermometer"!==e.icon&&"mdi:air-filter"!==e.icon)return null;for(const i of e.entities){if(!Dl(t,i))continue;const e=Number(t?.states?.[i]?.state);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(s)return{source:{kind:"temperature",eid:s.eid,text:s.text},text:s.text,fallback:null};const n=function(t,e){if(!e.primary||!Kl(t,e.primary))return null;const i=Number(t?.states?.[e.primary]?.state);return Number.isFinite(i)?{eid:e.primary,text:`${Math.round(i)}%`}:null}(t,e);if(n)return{source:{kind:"humidity",eid:n.eid,text:n.text},text:n.text,fallback:null}}if(1!==i.visualSources.length)return{source:null,text:null,fallback:i.visualSources.length?"value_ambiguous_sources":"value_no_state"};const n=i.visualSources[0].eid,o=function(t,e){const i=t?.states?.[e];if(!i||null==i.state||""===String(i.state).trim())return{text:"",fallback:"value_no_state"};const s=i.state;if(!["string","number","boolean"].includes(typeof s))return{text:"",fallback:"value_non_scalar"};const n=String(s).trim().toLowerCase();if("unknown"===n||"unavailable"===n)return{text:"",fallback:"value_no_state"};const o=Ui(t,e);return o?{text:Wi(o,String(i.attributes?.unit_of_measurement||"")),fallback:null}:{text:"",fallback:"value_no_state"}}(t,n);return o.fallback?{source:null,text:null,fallback:o.fallback}:{source:{kind:"entity",eid:n,text:o.text},text:o.text,fallback:null}}function Qc(t,e,i){const s=t.marker?.binding||(t.bindingKind&&t.bindingRef?`${t.bindingKind}:${t.bindingRef}`:t.virtual?"virtual":""),n=[...e.visualSources.map(t=>`${t.role}:${t.eid}`),...e.criticalSources.map(t=>`critical:${t.eid}`)].sort(),o=i?`${i.kind}:${i.eid}:${i.attribute||""}`:"none";return[s,e.sourceKind,...n,`value:${o}`].join("\n")}function th(t,e,i){return Qc(e,i||Zc(t,e),null).replace(/\nvalue:none$/,"")}function eh(t){if(t.effectiveHidden)return[];if("static_icon"===t.display)return["static-icon"];const e=[],{visual:i}=t;return"alarm"===t.pulse.kind?e.push("alarm"):"unavailable"===i.availability?e.push("unavail"):"working"===i.status?e.push("on"):"open"===i.status&&e.push("open"),"none"!==t.pulse.reason&&"alarm"!==t.pulse.reason&&e.push("activity-"+t.pulse.reason),t.pulse.generation%2==0&&(e.push("pulse-gen2"),"short"===t.pulse.kind&&e.push("activity-gen2")),e}function ih(t,e,i){const s=Ei(e.marker?.display),n="static_icon"===s,o=n&&!1===i.sourceDetails?Vc:Zc(t,e,i.lightDevices||[e],i.lightSources),r=e.bindingStatus,a="ha_disabled"===r?.kind,l="orphaned"===r?.kind,c=!0===e.userHidden||!0===e.marker?.hidden,h=a||c&&!i.designPreview,d=nl(o.samples);let u=d;h||n?u={availability:"available",status:"neutral",activity:"none"}:"alarm"===d.status||i.liveStates||(u={availability:"available",status:"neutral",activity:"none"});const p=n&&!1===i.sourceDetails?{source:null,text:null,fallback:null}:Jc(t,e,o,i.showTemperature),_=Qc(e,o,p.source),m=th(t,e,o),g=i.activityRuntime,f=i.now??Date.now(),v=g?.expiresAt||(g?.flashTs?g.flashTs+3300:0);!n&&!h&&i.liveStates&&"alarm"!==d.status&&g?.sources===m&&g.flashTs&&g.flashKind&&v>f&&(u={...u,activity:g.flashKind});const y="icon_ripple"===s&&!h&&i.liveStates&&"alarm"!==u.status?u.activity:"none",b=n||h||!i.showTemperature?null:!0===e.marker?.use_climate_temp?Vl(t,e.entities):"mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon?Gl(t,e.entities):null,w=!n&&!h&&i.showTemperature&&e.primary&&Kl(t,e.primary)?Yl(t,e.entities):null,k=n||h||!i.showSignal||e.virtual?null:jl(t,e.entities),$=function(t,e,i){const s=null!=e.marker?.value_badge;if(i.effectiveHidden||"static_icon"===i.display)return null;const n=e.marker?.value_badge;if(s)return n?.enabled&&n.source?{configured:!0,enabled:!0,position:n.position||"right",...qc(t,e,n.source,i.markerStates)}:null;if(!i.showTemperature||"value"===i.display)return null;const o=Bc(t,e);if(!o)return null;let r=null,a="default";if("entity_attribute"===o.kind&&"current_temperature"===o.attribute){const i=Vl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=Gl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else{const i=Yl(t,e.entities);null!=i&&(r=`${i}%`),a="humidity"}return null==r?null:{configured:!1,enabled:!0,source:o,position:"right",sourceLabel:"entity_attribute"===o.kind?`${Oc(o.attribute)} · ${Nc(t,o.entity_id)}`:"entity_state"===o.kind?Nc(t,o.entity_id):"",text:r,fullText:r,availability:"available",isLqi:!1,tone:a}}(t,e,{showTemperature:i.showTemperature,showSignal:i.showSignal,display:s,effectiveHidden:h,markerStates:o.visualSources.filter(t=>t.eid.startsWith("marker:")).map(t=>({ref:t.eid,on:"on"===t.state,name:t.name}))}),x="cover"===o.sourceKind?o.visualSources[0]?.eid:e.primary||o.visualSources[0]?.eid,S=x?t?.states?.[x]:null,M=!i.liveStates||n||h?e.icon:hs(e.icon,x?.split(".")[0],S?.attributes?.device_class,S?.state,!!e.marker?.icon),C=!i.liveStates||n||h?null:o.visualSources.filter(t=>!t.eid.startsWith("marker:")).map(e=>function(t){return t&&"on"===t.state?Rt(t.attributes?.rgb_color):null}(t?.states?.[e.eid])).find(t=>!!t)||null,D=Number(e.marker?.size)>0?Number(e.marker.size):1,T=Number(e.marker?.angle)||0,P=Number(e.marker?.ripple_size)>0?Number(e.marker.ripple_size):3,R=Dt(e.marker?.ripple_color,null),A=n?null:R||C||null,E=function(t){const{display:e,visual:i,semanticActivity:s,liveStates:n,effectiveHidden:o,bindingUnavailable:r=!1,reducedMotion:a=!1}=t,l=Math.max(1,Math.trunc(t.shortGeneration||1)),c=Number.isFinite(t.diameterScale)?Math.max(1,Number(t.diameterScale)):3,h=t.color||null;if(o||r||"static_icon"===e)return qt(l,h,c);if("alarm"===i.status)return{kind:"alarm",reason:"alarm",generation:l,expiresAt:null,color:"#f25a4a",diameterScale:3,animated:!a,reducedMotionIndicator:"none"};if(!n||"icon_ripple"!==e)return qt(l,h,c);const d=t.now??Date.now(),u=t.shortExpiresAt||null;return t.shortReason&&null!=u&&u>d?{kind:"short",reason:t.shortReason,generation:l,expiresAt:u,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:"presence"===s||"transition"===s||"running"===s?{kind:"continuous",reason:s,generation:l,expiresAt:null,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:qt(l,h,c)}({display:s,visual:u,semanticActivity:d.activity,shortReason:g?.sources===m?g?.flashKind:null,shortGeneration:g?.gen,shortExpiresAt:g?.sources===m?v:null,now:f,liveStates:i.liveStates,effectiveHidden:h,bindingUnavailable:a||l,reducedMotion:i.reducedMotion,color:A,diameterScale:P}),I="value"!==s||h?null:p.text,z="ha_disabled"===r?.kind?r.reason:null,F=function(t,e,i,s,n,o,r,a){return o?"ha_disabled":r?"orphaned":"static_icon"===a?"static_icon":"alarm"===e.status?"alarm":n?"unavailable"===e.availability?"unavailable":"cover"===s?"cover_icon_state":"presence"===i?"presence":"event"===i?"event":"transition"===i?"transition":"working"===e.status?"icon_ripple"===a&&"none"!==i?"working_activity":"working":"open"===e.status?"open":(t.primary||"").startsWith("media_player.")?"media_neutral":"neutral":"live_states_disabled"}(e,u,y,o.sourceKind,i.liveStates,a,l,s),N=[];i.designPreview&&c&&N.push("hidden_design_preview"),n||!0!==e.marker?.vacuum?.live||N.push("vacuum_live_plan_only");const O=1===o.visualSources.length&&el(t,o.visualSources[0].eid),L=e.entities.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category).length;O&&L>1&&N.push("composite_power_source"),"icon_ripple"!==s&&"static_icon"!==s&&"alarm"!==d.status&&"none"!==d.activity&&N.push("activity_display_disabled");const H={binding:e.marker?.binding||(e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:e.virtual?"virtual":""),sourceKind:o.sourceKind,visualSources:o.visualSources,criticalSources:o.criticalSources,valueSource:p.source,sourceSignature:_,visual:u,display:s,icon:M,valueText:I,valueFullText:I,fallbackReason:"value"!==s||I?null:p.fallback,activity:y,activityGeneration:g?.gen||1,pulse:E,classes:[],tempText:null==b?null:String(b),humText:null==w?null:String(w),valueBadge:$,lqiText:null==k||$?.isLqi?null:String(k),lqiColor:null==k?null:ti(k),lightColor:C,scale:D,angle:T,rippleScale:P,rippleColor:A,userHidden:c,effectiveHidden:h,haDisabled:a,disabledReason:z,orphaned:l,vacuumLive:!n&&!0===e.marker?.vacuum?.live,explanation:{reason:F,notices:N}};return{...H,classes:eh(H)}}function sh(t,e=new WeakMap){if(null===t||"object"!=typeof t)return t;const i=t,s=e.get(i);if(s)return s;if(Array.isArray(t)){const s=[];e.set(i,s);for(const i of t)s.push(sh(i,e));return Object.freeze(s)}const n={};e.set(i,n);for(const[i,s]of Object.entries(t))"function"!=typeof s&&(n[i]=sh(s,e));return Object.freeze(n)}function nh(t){const e=new Map(t);let i;return i=Object.freeze({get size(){return e.size},get:t=>e.get(t),has:t=>e.has(t),entries:()=>e.entries(),keys:()=>e.keys(),values:()=>e.values(),forEach:(t,s)=>e.forEach((e,n)=>t.call(s,e,n,i)),[Symbol.iterator]:()=>e[Symbol.iterator]()}),i}function oh(t){const e=new Set(t.entityIds||[]),i=new Set(t.deviceIds||[]),s=new Set(t.areaIds||[]);for(const s of t.devices){for(const t of s.entities||[])e.add(t);s.primary&&e.add(s.primary);for(const t of s.controls||[])e.add(t);s.marker?.vacuum?.source&&e.add(s.marker.vacuum.source),"device"===s.bindingKind&&s.bindingRef&&i.add(s.bindingRef),"entity"===s.bindingKind&&s.bindingRef&&e.add(s.bindingRef)}const n={},o={};for(const[o,r]of Object.entries(t.hass?.entities||{})){const a=r?.device_id?t.hass?.devices?.[r.device_id]:null;(e.has(o)||r?.device_id&&i.has(r.device_id)||s.has(r?.area_id)||s.has(a?.area_id))&&(e.add(o),n[o]=r,r?.device_id&&i.add(r.device_id))}for(const e of i){const i=t.hass?.devices?.[e];i&&(o[e]=i)}const r={};for(const i of e){const e=t.hass?.states?.[i];e&&(r[i]=e)}const a=Object.freeze({states:sh(r),entities:sh(n),devices:sh(o),config:sh(t.hass?.config),locale:sh(t.hass?.locale),themes:sh(t.hass?.themes)});return Object.freeze({sourceSequence:t.sourceSequence,capturedAt:t.capturedAt??Date.now(),hass:a,devices:sh([...t.devices]),positions:nh([...t.positions||[]].map(([t,e])=>[t,Object.freeze({x:e.x,y:e.y})])),presentations:nh([...t.presentations].map(([t,e])=>[t,sh(e)])),facts:nh([...t.facts||[]].map(([t,e])=>[t,sh(e)]))})}const rh=(t,e)=>`${t}:${e?1:0}`;function ah(t){const e=dr(t.cfg),i={};for(const e of t.cfg.spaces||[])for(const t of e.rooms||[])t.area&&(i[t.area]=e.id);const s=t.cfg.settings?.exclude_integrations?new Set(t.cfg.settings.exclude_integrations):qs,n=Us(t.cfg.settings?.icon_rules?.length?t.cfg.settings.icon_rules:Bs);return ec({hass:t.hass,registry:t.registry,areaToSpace:i,markers:t.cfg.markers||[],settings:t.cfg.settings||{},excluded:s,showAll:!!t.cfg.settings?.show_all,firstSpaceId:e[0]?.id||"",loc:e=>Os(t.lang,e),iconRules:n})}function lh(t){const e=dr(t.cfg).find(e=>e.id===t.spaceId);if(!e)return null;const i=es(t.cfg.spaces.find(e=>e.id===t.spaceId)),s=ns(t.cfg.settings),n=t.iconSize??2.5,o=n>8?2.5:n,r=t.registry?wl(t.hass,t.registry):t.hass,a=(t.devices||ah(t)).filter(e=>e.space===t.spaceId),l=a.filter(t=>!t.hidden),c=function(t,e,i){const s={},n=i/100*Ar(e)*1.3;for(const i of e.rooms){if(!i.area)continue;const e=t.filter(t=>t.area===i.area);if(!e.length)continue;const o=zr(i),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(e.length*a/Math.max(l,1)))),h=a/c,d=l/Math.max(Math.ceil(e.length/c),1),u=e.map((t,e)=>({x:o.x+r+h*(e%c+.5),y:o.y+r+d*(Math.floor(e/c)+.5)}));Pi(u,o,n,.5*r),e.forEach((t,e)=>s[t.id]=vr(u[e]))}return s}(a,e,o),h=[];for(const e of l){const i=t.layout[e.id];if(i&&i.s===t.spaceId){const t=i.x*or,e=i.y*or;h.push({minX:t,minY:e,maxX:t,maxY:e})}}const d=t.cfg.spaces.find(e=>e.id===t.spaceId)||{},u=Array.isArray(d.walls)?d.walls:[],p=Number(d.cell_cm)>0?Number(d.cell_cm):5,_=function(t,e,i){const s=[];for(const n of t.partitions||[]){const t=Vo(n.a,n.b,n.cm,e,i);t&&s.push(t)}for(const n of t.room_drafts||[])s.push(...Yo(n,e,i));for(const n of t.wall_columns||[])s.push(Ko(n,e,i));return s}(e,p,mr);for(const t of _){const e=t.map(t=>t[0]),i=t.map(t=>t[1]);e.length&&h.push({minX:Math.min(...e),minY:Math.min(...i),maxX:Math.max(...e),maxY:Math.max(...i)})}const m=Pr(e,h),g=[m.x,m.y,m.w,m.h],f=new Map(e.rooms.map(t=>{const e=Ms(i.fill,t);return[t,rs(e,"lqi"===e&&t.area?nc(r,a,t.area):null,"light"===e?Wl(Bl(r,a,t)):"none","temp"===e&&t.area?oc(r,a,t.area):null,i.tempMin,i.tempMax,s,ts(i.customFill,t))]})),v=e.rooms.filter(t=>t.area||i.showBorders||"none"!==Ms(i.fill,t)).map(t=>{let s="room "+(e.bg?"overlay":"yard"),n="";const o=Ms(i.fill,t);if(i.showBorders||"none"!==o){s+=" styled";const e=[`--room-stroke:${i.color}`,`--room-stroke-op:${i.showBorders?i.opacity:0}`],o=f.get(t)||null;o?(s+=" filled",e.push(`--room-fill:${o.color}`,`--room-fill-op:${o.opacity.toFixed(3)}`)):e.push("--room-fill:transparent","--room-fill-op:0"),n=e.join(";")}const r=t.id||G,a=t.area||G,l=t.poly?W``}_valueChanged(t){const e={...this._config,...t.detail.value},i=new Event("config-changed",{bubbles:!0,composed:!0});i.detail={config:e},this.dispatchEvent(i)}}Ec.properties={hass:{attribute:!1},_config:{state:!0},_spaces:{state:!0}},customElements.get("houseplan-card-editor")||customElements.define("houseplan-card-editor",Ec);const Ic={climate:["current_temperature","temperature","current_humidity","humidity"],water_heater:["current_temperature","temperature"],cover:["current_position"],valve:["current_position"],fan:["percentage"],humidifier:["current_humidity","humidity"],light:["brightness"],media_player:["volume_level"],vacuum:["battery_level","fan_speed"],lawn_mower:["battery_level","fan_speed"]};function zc(t){return t?"entity_state"===t.kind?`state:${t.entity_id}`:"entity_attribute"===t.kind?`attr:${t.entity_id}:${t.attribute}`:"derived_marker_state"===t.kind?`marker:${t.ref}`:"derived:lqi":""}function Fc(t){if("derived:lqi"===t)return{kind:"derived_lqi"};if(t.startsWith("state:"))return{kind:"entity_state",entity_id:t.slice(6)};if(t.startsWith("attr:")){const e=t.slice(5),i=e.lastIndexOf(":");if(i>0)return{kind:"entity_attribute",entity_id:e.slice(0,i),attribute:e.slice(i+1)}}return t.startsWith("marker:marker:")?{kind:"derived_marker_state",ref:t.slice(7)}:null}function Nc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Oc(t){return t.replaceAll("_"," ")}function Lc(t,e=1){const i=Number(t);return Number.isFinite(i)?`${Math.round(i*e)} %`:null}function Hc(t){if("derived_lqi"===t.kind)return"lqi";if("entity_attribute"===t.kind){if(t.attribute.includes("temperature"))return"temperature";if(t.attribute.includes("humidity"))return"humidity"}return"default"}function qc(t,e,i,s=[]){let n=null,o="",r="available";if("entity_state"===i.kind){o=Nc(t,i.entity_id);const e=t?.states?.[i.entity_id];if(e)if(Uc(t,i.entity_id))if(["unknown","unavailable"].includes(String(e.state).toLowerCase()))r="unavailable";else{const s=Ui(t,i.entity_id);n=s?Wi(s,String(e.attributes?.unit_of_measurement||"")):null,n||(r="unavailable")}else r="unavailable";else r="missing"}else if("entity_attribute"===i.kind){o=`${Oc(i.attribute)} · ${Nc(t,i.entity_id)}`;const e=t?.states?.[i.entity_id];e?Uc(t,i.entity_id)?(n=function(t,e,i){const s=t?.states?.[e];if(!s||!(i in(s.attributes||{})))return null;const n=Ui(t,e,i);if(n?.formatted)return n.text;const o=s.attributes?.[i];if("brightness"===i)return Lc(o,100/255);if("volume_level"===i)return Lc(o,100);if(["current_position","percentage","current_humidity","humidity","battery_level"].includes(i))return Lc(o);if("current_temperature"===i||"temperature"===i){const e=Number(o);if(!Number.isFinite(e))return null;const i=String(t?.config?.unit_system?.temperature||"°C");return`${Math.round(10*e)/10} ${i}`}return n?.text||(["string","number","boolean"].includes(typeof o)?String(o):null)}(t,i.entity_id,i.attribute),null==n&&(r="unavailable")):r="unavailable":r="missing"}else if("derived_lqi"===i.kind){o="LQI";const i=jl(t,e.entities);null==i?r="unavailable":n=String(i)}else{o="Light state";const e=s.find(t=>t.ref===i.ref);if(e){const i=e.on?"on":"off",s=t?.localize?.(`state.default.${i}`);n="string"==typeof s&&s?s:i,o=e.name||o}else r="missing"}const a=t?.localize?.("state.default.unavailable")||"Unavailable";return{source:i,sourceLabel:o,text:n??"—",fullText:n??a,availability:r,isLqi:"derived_lqi"===i.kind,tone:Hc(i)}}function Bc(t,e){if(!0===e.marker?.use_climate_temp){const i=e.entities.find(e=>e.startsWith("climate.")&&Number.isFinite(Number(t?.states?.[e]?.attributes?.current_temperature)));if(i)return{kind:"entity_attribute",entity_id:i,attribute:"current_temperature"}}if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=e.entities.find(e=>Dl(t,e)&&Number.isFinite(Number(t?.states?.[e]?.state)));if(i)return{kind:"entity_state",entity_id:i}}return e.primary&&Kl(t,e.primary)&&Number.isFinite(Number(t?.states?.[e.primary]?.state))?{kind:"entity_state",entity_id:e.primary}:null}function Uc(t,e){const i=t?.entities?.[e];if(i&&!bl(i))return!1;const s=i?.device_id?t?.devices?.[i.device_id]:null;return!s||bl(s)}function Wc(t,e){return Uc(t,e)&&!!t?.states?.[e]}function jc(t,e,i=[e]){const s=new Set(e.entities);for(const t of e.controls||[])t.startsWith("marker:")||s.add(t);const n=[],o=Bl(t,i),r=o.filter(t=>t.key.startsWith("marker:")).map(t=>({ref:t.key,on:t.on,name:t.device?.name||t.key})),a=i=>{const s=zc(i);if(n.some(t=>t.key===s))return;const o=qc(t,e,i,r),a="entity_attribute"===i.kind?`${i.entity_id} · ${i.attribute}`:"entity_state"===i.kind?i.entity_id:"derived_marker_state"===i.kind?i.ref:"LQI";n.push({key:s,source:i,label:o.sourceLabel,technical:a,value:o.text,available:"available"===o.availability})};for(const e of[...s].sort()){if(!Wc(t,e))continue;const i=e.split(".")[0],s=t?.entities?.[e];if("button"===i||"event"===i||"config"===s?.entity_category)continue;a({kind:"entity_state",entity_id:e});const n=t?.states?.[e];for(const t of Ic[i]||[])t in(n?.attributes||{})&&a({kind:"entity_attribute",entity_id:e,attribute:t})}const l=new Set((e.marker?.controls||e.controls||[]).filter(t=>t.startsWith("marker:")));!0===e.marker?.is_light&&e.marker.id&&l.add(`marker:${e.marker.id}`);const c=new Set(o.map(t=>t.key));for(const t of[...l].sort())c.has(t)&&a({kind:"derived_marker_state",ref:t});return e.virtual||null==jl(t,e.entities)||a({kind:"derived_lqi"}),n}function Gc(t,e,i){const s=Bc(t,e);if(s&&i.some(t=>t.key===zc(s)))return s;const n=e.primary&&i.find(t=>t.key===`state:${e.primary}`);if(n)return n.source;const o=[t=>t.technical.includes("temperature"),t=>t.technical.includes("humidity"),t=>t.technical.includes("battery")];for(const t of o){const e=i.find(t);if(e)return e.source}return i.find(t=>"derived_lqi"!==t.source.kind)?.source||i[0]?.source||null}const Vc={sourceKind:"none",visualSources:[],criticalSources:[],samples:[]};function Kc(t,e){const i=t?.entities?.[e],s=t?.states?.[e];return String(i?.name||i?.original_name||s?.attributes?.friendly_name||e)}function Yc(t,e){const i=t?.states?.[e];if(!i)return"";if("function"==typeof t?.formatEntityState)try{const e=t.formatEntityState(i);if("string"==typeof e&&e)return e}catch{}return String(i.state??"")}function Xc(t,e,i,s){return{eid:e,role:i,name:Kc(t,e),state:String(t?.states?.[e]?.state??""),stateText:Yc(t,e),integrationDomain:t?.entities?.[e]?.platform||null,sample:s||sl(t,e)}}function Zc(t,e,i=[e],s){const n=e.hidden&&e.userHidden?{...e,hidden:!1}:e;let o="none",r=[];const a=(l=Sc({hass:t,devices:i,device:n,lightSources:s}),"cover"!==l?.semantics?null:l.targets[0]?.entityId||l.skippedTargets[0]?.entityId||null);var l;const c=Bl(t,[n]),h=Il(n.marker?.binding,n.marker?.controls??n.controls,n.entities),d=new Set(h.filter(t=>t.startsWith("marker:"))),u=!0===n.marker?.is_light||d.size>0?s||Bl(t,i):c,p=u.filter(t=>t.device.id===n.id&&"controls"!==t.via),_=c.filter(t=>"controls"!==t.via),m=[...c.filter(t=>"controls"===t.via),...p.length?p:_];if(d.size)for(const t of u){if(!d.has(t.key))continue;t.stateEids.length>0&&m.some(e=>e.stateEids.some(e=>t.stateEids.includes(e)))||m.some(e=>e.key===t.key)||m.push({...t,via:"controls",castsGlow:!1})}if(a)o="cover",r=[Xc(t,a,"cover")];else if(m.length)o=m.some(t=>"controls"===t.via)?"controls":"light",r=m.map(i=>{const s="controls"===i.via?"control":"forced"===i.via?"forced_light":"light";if(!i.passive)return Xc(t,i.eid,s);const n=i.on?"on":"off";return{eid:i.key,role:s,name:e.name,state:n,stateText:n,integrationDomain:null,sample:{eid:i.key,state:n,availability:"available",status:i.on?"working":"neutral",activity:"none",edge:"none"}}});else{const e=Rl(t,n.entities),i=e.length?e:n.entities.filter(e=>!!t?.states?.[e]);if(i.length){o="device_role";const e=function(t,e,i){const s=e.map(e=>sl(t,e)),n=i.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category);return 1===e.length&&n.length>1&&el(t,e[0])?s.map(t=>"unavailable"===t.availability?t:"off"===t.state?{...t,availability:"unavailable",status:"neutral",activity:"none",edge:"none"}:{...t,status:"neutral",activity:"none",edge:"none"}):s}(t,i,n.entities);r=i.map((i,s)=>Xc(t,i,"device_role",e[s]))}else n.primary&&(o="primary",r=[Xc(t,n.primary,"primary")])}const g=[];for(const e of n.entities||[]){const i=sl(t,e);"alarm"!==i.status||r.some(t=>t.eid===e)||g.push(Xc(t,e,"critical",i))}return{sourceKind:o,visualSources:r,criticalSources:g,samples:[...r,...g].map(t=>t.sample)}}function Jc(t,e,i,s){if(e.virtual)return{source:null,text:null,fallback:"value_virtual"};if(s){const i=function(t,e){if(!0!==e.marker?.use_climate_temp)return null;for(const i of e.entities){if(!i.startsWith("climate."))continue;const e=Number(t?.states?.[i]?.attributes?.current_temperature);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(i)return{source:{kind:"temperature",eid:i.eid,attribute:"current_temperature",text:i.text},text:i.text,fallback:null};const s=function(t,e){if("mdi:thermometer"!==e.icon&&"mdi:air-filter"!==e.icon)return null;for(const i of e.entities){if(!Dl(t,i))continue;const e=Number(t?.states?.[i]?.state);if(Number.isFinite(e))return{eid:i,text:Math.round(10*e)/10+"°"}}return null}(t,e);if(s)return{source:{kind:"temperature",eid:s.eid,text:s.text},text:s.text,fallback:null};const n=function(t,e){if(!e.primary||!Kl(t,e.primary))return null;const i=Number(t?.states?.[e.primary]?.state);return Number.isFinite(i)?{eid:e.primary,text:`${Math.round(i)}%`}:null}(t,e);if(n)return{source:{kind:"humidity",eid:n.eid,text:n.text},text:n.text,fallback:null}}if(1!==i.visualSources.length)return{source:null,text:null,fallback:i.visualSources.length?"value_ambiguous_sources":"value_no_state"};const n=i.visualSources[0].eid,o=function(t,e){const i=t?.states?.[e];if(!i||null==i.state||""===String(i.state).trim())return{text:"",fallback:"value_no_state"};const s=i.state;if(!["string","number","boolean"].includes(typeof s))return{text:"",fallback:"value_non_scalar"};const n=String(s).trim().toLowerCase();if("unknown"===n||"unavailable"===n)return{text:"",fallback:"value_no_state"};const o=Ui(t,e);return o?{text:Wi(o,String(i.attributes?.unit_of_measurement||"")),fallback:null}:{text:"",fallback:"value_no_state"}}(t,n);return o.fallback?{source:null,text:null,fallback:o.fallback}:{source:{kind:"entity",eid:n,text:o.text},text:o.text,fallback:null}}function Qc(t,e,i){const s=t.marker?.binding||(t.bindingKind&&t.bindingRef?`${t.bindingKind}:${t.bindingRef}`:t.virtual?"virtual":""),n=[...e.visualSources.map(t=>`${t.role}:${t.eid}`),...e.criticalSources.map(t=>`critical:${t.eid}`)].sort(),o=i?`${i.kind}:${i.eid}:${i.attribute||""}`:"none";return[s,e.sourceKind,...n,`value:${o}`].join("\n")}function th(t,e,i){return Qc(e,i||Zc(t,e),null).replace(/\nvalue:none$/,"")}function eh(t){if(t.effectiveHidden)return[];if("static_icon"===t.display)return["static-icon"];const e=[],{visual:i}=t;return"alarm"===t.pulse.kind?e.push("alarm"):"unavailable"===i.availability?e.push("unavail"):"working"===i.status?e.push("on"):"open"===i.status&&e.push("open"),"none"!==t.pulse.reason&&"alarm"!==t.pulse.reason&&e.push("activity-"+t.pulse.reason),t.pulse.generation%2==0&&(e.push("pulse-gen2"),"short"===t.pulse.kind&&e.push("activity-gen2")),e}function ih(t,e,i){const s=Ei(e.marker?.display),n="static_icon"===s,o=n&&!1===i.sourceDetails?Vc:Zc(t,e,i.lightDevices||[e],i.lightSources),r=e.bindingStatus,a="ha_disabled"===r?.kind,l="orphaned"===r?.kind,c=!0===e.userHidden||!0===e.marker?.hidden,h=a||c&&!i.designPreview,d=nl(o.samples);let u=d;h||n?u={availability:"available",status:"neutral",activity:"none"}:"alarm"===d.status||i.liveStates||(u={availability:"available",status:"neutral",activity:"none"});const p=n&&!1===i.sourceDetails?{source:null,text:null,fallback:null}:Jc(t,e,o,i.showTemperature),_=Qc(e,o,p.source),m=th(t,e,o),g=i.activityRuntime,f=i.now??Date.now(),v=g?.expiresAt||(g?.flashTs?g.flashTs+3300:0);!n&&!h&&i.liveStates&&"alarm"!==d.status&&g?.sources===m&&g.flashTs&&g.flashKind&&v>f&&(u={...u,activity:g.flashKind});const y="icon_ripple"===s&&!h&&i.liveStates&&"alarm"!==u.status?u.activity:"none",b=n||h||!i.showTemperature?null:!0===e.marker?.use_climate_temp?Vl(t,e.entities):"mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon?Gl(t,e.entities):null,w=!n&&!h&&i.showTemperature&&e.primary&&Kl(t,e.primary)?Yl(t,e.entities):null,k=n||h||!i.showSignal||e.virtual?null:jl(t,e.entities),$=function(t,e,i){const s=null!=e.marker?.value_badge;if(i.effectiveHidden||"static_icon"===i.display)return null;const n=e.marker?.value_badge;if(s)return n?.enabled&&n.source?{configured:!0,enabled:!0,position:n.position||"right",...qc(t,e,n.source,i.markerStates)}:null;if(!i.showTemperature||"value"===i.display)return null;const o=Bc(t,e);if(!o)return null;let r=null,a="default";if("entity_attribute"===o.kind&&"current_temperature"===o.attribute){const i=Vl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else if("mdi:thermometer"===e.icon||"mdi:air-filter"===e.icon){const i=Gl(t,e.entities);null!=i&&(r=`${i}°`),a="temperature"}else{const i=Yl(t,e.entities);null!=i&&(r=`${i}%`),a="humidity"}return null==r?null:{configured:!1,enabled:!0,source:o,position:"right",sourceLabel:"entity_attribute"===o.kind?`${Oc(o.attribute)} · ${Nc(t,o.entity_id)}`:"entity_state"===o.kind?Nc(t,o.entity_id):"",text:r,fullText:r,availability:"available",isLqi:!1,tone:a}}(t,e,{showTemperature:i.showTemperature,showSignal:i.showSignal,display:s,effectiveHidden:h,markerStates:o.visualSources.filter(t=>t.eid.startsWith("marker:")).map(t=>({ref:t.eid,on:"on"===t.state,name:t.name}))}),x="cover"===o.sourceKind?o.visualSources[0]?.eid:e.primary||o.visualSources[0]?.eid,S=x?t?.states?.[x]:null,M=!i.liveStates||n||h?e.icon:hs(e.icon,x?.split(".")[0],S?.attributes?.device_class,S?.state,!!e.marker?.icon),C=!i.liveStates||n||h?null:o.visualSources.filter(t=>!t.eid.startsWith("marker:")).map(e=>function(t){return t&&"on"===t.state?Rt(t.attributes?.rgb_color):null}(t?.states?.[e.eid])).find(t=>!!t)||null,D=Number(e.marker?.size)>0?Number(e.marker.size):1,T=Number(e.marker?.angle)||0,P=Number(e.marker?.ripple_size)>0?Number(e.marker.ripple_size):3,R=Dt(e.marker?.ripple_color,null),A=n?null:R||C||null,E=function(t){const{display:e,visual:i,semanticActivity:s,liveStates:n,effectiveHidden:o,bindingUnavailable:r=!1,reducedMotion:a=!1}=t,l=Math.max(1,Math.trunc(t.shortGeneration||1)),c=Number.isFinite(t.diameterScale)?Math.max(1,Number(t.diameterScale)):3,h=t.color||null;if(o||r||"unavailable"===i.availability||"static_icon"===e)return qt(l,h,c);if("alarm"===i.status)return{kind:"alarm",reason:"alarm",generation:l,expiresAt:null,color:"#f25a4a",diameterScale:3,animated:!a,reducedMotionIndicator:"none"};if(!n||"icon_ripple"!==e)return qt(l,h,c);const d=t.now??Date.now(),u=t.shortExpiresAt||null;return t.shortReason&&null!=u&&u>d?{kind:"short",reason:t.shortReason,generation:l,expiresAt:u,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:"presence"===s||"transition"===s||"running"===s?{kind:"continuous",reason:s,generation:l,expiresAt:null,color:a?null:h,diameterScale:a?1:c,animated:!a,reducedMotionIndicator:a?"dot":"none"}:qt(l,h,c)}({display:s,visual:u,semanticActivity:d.activity,shortReason:g?.sources===m?g?.flashKind:null,shortGeneration:g?.gen,shortExpiresAt:g?.sources===m?v:null,now:f,liveStates:i.liveStates,effectiveHidden:h,bindingUnavailable:a||l,reducedMotion:i.reducedMotion,color:A,diameterScale:P}),I="value"!==s||h?null:p.text,z="ha_disabled"===r?.kind?r.reason:null,F=function(t,e,i,s,n,o,r,a){return o?"ha_disabled":r?"orphaned":"static_icon"===a?"static_icon":"alarm"===e.status?"alarm":n?"unavailable"===e.availability?"unavailable":"cover"===s?"cover_icon_state":"presence"===i?"presence":"event"===i?"event":"transition"===i?"transition":"working"===e.status?"icon_ripple"===a&&"none"!==i?"working_activity":"working":"open"===e.status?"open":(t.primary||"").startsWith("media_player.")?"media_neutral":"neutral":"live_states_disabled"}(e,u,y,o.sourceKind,i.liveStates,a,l,s),N=[];i.designPreview&&c&&N.push("hidden_design_preview"),n||!0!==e.marker?.vacuum?.live||N.push("vacuum_live_plan_only");const O=1===o.visualSources.length&&el(t,o.visualSources[0].eid),L=e.entities.filter(e=>e.startsWith("switch.")&&!t?.entities?.[e]?.entity_category).length;O&&L>1&&N.push("composite_power_source"),"icon_ripple"!==s&&"static_icon"!==s&&"alarm"!==d.status&&"none"!==d.activity&&N.push("activity_display_disabled");const H={binding:e.marker?.binding||(e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:e.virtual?"virtual":""),sourceKind:o.sourceKind,visualSources:o.visualSources,criticalSources:o.criticalSources,valueSource:p.source,sourceSignature:_,visual:u,display:s,icon:M,valueText:I,valueFullText:I,fallbackReason:"value"!==s||I?null:p.fallback,activity:y,activityGeneration:g?.gen||1,pulse:E,classes:[],tempText:null==b?null:String(b),humText:null==w?null:String(w),valueBadge:$,lqiText:null==k||$?.isLqi?null:String(k),lqiColor:null==k?null:ti(k),lightColor:C,scale:D,angle:T,rippleScale:P,rippleColor:A,userHidden:c,effectiveHidden:h,haDisabled:a,disabledReason:z,orphaned:l,vacuumLive:!n&&!0===e.marker?.vacuum?.live,explanation:{reason:F,notices:N}};return{...H,classes:eh(H)}}function sh(t,e=new WeakMap){if(null===t||"object"!=typeof t)return t;const i=t,s=e.get(i);if(s)return s;if(Array.isArray(t)){const s=[];e.set(i,s);for(const i of t)s.push(sh(i,e));return Object.freeze(s)}const n={};e.set(i,n);for(const[i,s]of Object.entries(t))"function"!=typeof s&&(n[i]=sh(s,e));return Object.freeze(n)}function nh(t){const e=new Map(t);let i;return i=Object.freeze({get size(){return e.size},get:t=>e.get(t),has:t=>e.has(t),entries:()=>e.entries(),keys:()=>e.keys(),values:()=>e.values(),forEach:(t,s)=>e.forEach((e,n)=>t.call(s,e,n,i)),[Symbol.iterator]:()=>e[Symbol.iterator]()}),i}function oh(t){const e=new Set(t.entityIds||[]),i=new Set(t.deviceIds||[]),s=new Set(t.areaIds||[]);for(const s of t.devices){for(const t of s.entities||[])e.add(t);s.primary&&e.add(s.primary);for(const t of s.controls||[])e.add(t);s.marker?.vacuum?.source&&e.add(s.marker.vacuum.source),"device"===s.bindingKind&&s.bindingRef&&i.add(s.bindingRef),"entity"===s.bindingKind&&s.bindingRef&&e.add(s.bindingRef)}const n={},o={};for(const[o,r]of Object.entries(t.hass?.entities||{})){const a=r?.device_id?t.hass?.devices?.[r.device_id]:null;(e.has(o)||r?.device_id&&i.has(r.device_id)||s.has(r?.area_id)||s.has(a?.area_id))&&(e.add(o),n[o]=r,r?.device_id&&i.add(r.device_id))}for(const e of i){const i=t.hass?.devices?.[e];i&&(o[e]=i)}const r={};for(const i of e){const e=t.hass?.states?.[i];e&&(r[i]=e)}const a=Object.freeze({states:sh(r),entities:sh(n),devices:sh(o),config:sh(t.hass?.config),locale:sh(t.hass?.locale),themes:sh(t.hass?.themes)});return Object.freeze({sourceSequence:t.sourceSequence,capturedAt:t.capturedAt??Date.now(),hass:a,devices:sh([...t.devices]),positions:nh([...t.positions||[]].map(([t,e])=>[t,Object.freeze({x:e.x,y:e.y})])),presentations:nh([...t.presentations].map(([t,e])=>[t,sh(e)])),facts:nh([...t.facts||[]].map(([t,e])=>[t,sh(e)]))})}const rh=(t,e)=>`${t}:${e?1:0}`;function ah(t){const e=dr(t.cfg),i={};for(const e of t.cfg.spaces||[])for(const t of e.rooms||[])t.area&&(i[t.area]=e.id);const s=t.cfg.settings?.exclude_integrations?new Set(t.cfg.settings.exclude_integrations):qs,n=Us(t.cfg.settings?.icon_rules?.length?t.cfg.settings.icon_rules:Bs);return ec({hass:t.hass,registry:t.registry,areaToSpace:i,markers:t.cfg.markers||[],settings:t.cfg.settings||{},excluded:s,showAll:!!t.cfg.settings?.show_all,firstSpaceId:e[0]?.id||"",loc:e=>Os(t.lang,e),iconRules:n})}function lh(t){const e=dr(t.cfg).find(e=>e.id===t.spaceId);if(!e)return null;const i=es(t.cfg.spaces.find(e=>e.id===t.spaceId)),s=ns(t.cfg.settings),n=t.iconSize??2.5,o=n>8?2.5:n,r=t.registry?wl(t.hass,t.registry):t.hass,a=(t.devices||ah(t)).filter(e=>e.space===t.spaceId),l=a.filter(t=>!t.hidden),c=function(t,e,i){const s={},n=i/100*Ar(e)*1.3;for(const i of e.rooms){if(!i.area)continue;const e=t.filter(t=>t.area===i.area);if(!e.length)continue;const o=zr(i),r=.1*Math.min(o.w,o.h),a=o.w-2*r,l=o.h-2*r,c=Math.max(1,Math.round(Math.sqrt(e.length*a/Math.max(l,1)))),h=a/c,d=l/Math.max(Math.ceil(e.length/c),1),u=e.map((t,e)=>({x:o.x+r+h*(e%c+.5),y:o.y+r+d*(Math.floor(e/c)+.5)}));Pi(u,o,n,.5*r),e.forEach((t,e)=>s[t.id]=vr(u[e]))}return s}(a,e,o),h=[];for(const e of l){const i=t.layout[e.id];if(i&&i.s===t.spaceId){const t=i.x*or,e=i.y*or;h.push({minX:t,minY:e,maxX:t,maxY:e})}}const d=t.cfg.spaces.find(e=>e.id===t.spaceId)||{},u=Array.isArray(d.walls)?d.walls:[],p=Number(d.cell_cm)>0?Number(d.cell_cm):5,_=function(t,e,i){const s=[];for(const n of t.partitions||[]){const t=Vo(n.a,n.b,n.cm,e,i);t&&s.push(t)}for(const n of t.room_drafts||[])s.push(...Yo(n,e,i));for(const n of t.wall_columns||[])s.push(Ko(n,e,i));return s}(e,p,mr);for(const t of _){const e=t.map(t=>t[0]),i=t.map(t=>t[1]);e.length&&h.push({minX:Math.min(...e),minY:Math.min(...i),maxX:Math.max(...e),maxY:Math.max(...i)})}const m=Pr(e,h),g=[m.x,m.y,m.w,m.h],f=new Map(e.rooms.map(t=>{const e=Ms(i.fill,t);return[t,rs(e,"lqi"===e&&t.area?nc(r,a,t.area):null,"light"===e?Wl(Bl(r,a,t)):"none","temp"===e&&t.area?oc(r,a,t.area):null,i.tempMin,i.tempMax,s,ts(i.customFill,t))]})),v=e.rooms.filter(t=>t.area||i.showBorders||"none"!==Ms(i.fill,t)).map(t=>{let s="room "+(e.bg?"overlay":"yard"),n="";const o=Ms(i.fill,t);if(i.showBorders||"none"!==o){s+=" styled";const e=[`--room-stroke:${i.color}`,`--room-stroke-op:${i.showBorders?i.opacity:0}`],o=f.get(t)||null;o?(s+=" filled",e.push(`--room-fill:${o.color}`,`--room-fill-op:${o.opacity.toFixed(3)}`)):e.push("--room-fill:transparent","--room-fill-op:0"),n=e.join(";")}const r=t.id||G,a=t.area||G,l=t.poly?W``:W``;return l}),y=e.rooms.filter(t=>{const e=f.get(t);return Cs(i.glow,t)&&(!e||e.opacity<=0)}).map(t=>t.poly?W`${this._toast}`:G} - `;const i=this._spaceModel(),s=i.vb,n="devices"===this._mode&&this._showAll,o=this._renderDevices.filter(t=>t.space===i.id&&(!t.hidden||n)),r=this._renderDeviceSnapshot,a=this._spaceDisplayForRender(),l=this._resolvedRoomFills(i,a),c=this._resolvedGlowBase(i,a,l),h=a.showLqi??this._config.show_signal??!0,d=this._config.icon_size??2.5,u=d>8?2.5:d,p=this._viewOr(s),_=this._editing?"":this._stageBg(a),m=this._editing||"daynight"!==this._effBgMode()?null:this._sunNow(),g=m?bn(Mn(m.elevation)).planDim:0,f=this._opMeasureView,v=this._decorMeasure,y=this._bdLive,b=this._furnLive,w="view"===this._mode?this._editorChromeMode:this._mode,k=this._roomHoverPaths(i),$=i.bg?this._display(i.bg.href):"",x=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,S=this._modeTransitionVisual,M=S?.stageColor||_,C=S?.sceneBrightness??(m?1-g:1);return U` + `;const i=this._spaceModel(),s=i.vb,n="devices"===this._mode&&this._showAll,o=this._renderDevices.filter(t=>t.space===i.id&&(!t.hidden||n)),r=this._renderDeviceSnapshot,a=this._spaceDisplayForRender(),l=this._resolvedRoomFills(i,a),c=this._resolvedGlowBase(i,a,l),h=a.showLqi??this._config.show_signal??!0,d=this._config.icon_size??2.5,u=d>8?2.5:d,p=this._viewOr(s),_=this._editing?"":this._stageBg(a),m=this._editing||"daynight"!==this._effBgMode()?null:this._sunNow(),g=m?bn(Mn(m.elevation)).planDim:0,f=this._opMeasureView,v=this._decorMeasure,y=this._bdLive,b=this._furnLive,w="view"===this._mode?this._editorChromeMode:this._mode,k=this._roomHoverPaths(i),$=i.bg?this._display(i.bg.href):"",x=this._continuity.overlayVisible||"recovery-error"===this._continuity.state?this._continuity.recoveryReason:null,S=this._modeTransitionVisual,M=this._modeTransition.state?.from.presentedMode,C=!this._markup||!!S&&("view"===S.presentedMode||"devices"===S.presentedMode||"view"===M||"devices"===M),D=S?.stageColor||_,T=S?.sceneBrightness??(m?1-g:1);return U` this._markupClick(t)} @wheel=${t=>this._onWheel(t)} @pointerdown=${t=>{this._notePointer(t),this._stagePointerDown(t)}} @@ -4933,7 +4933,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="8f44f3a00bc48a1f93365a849e5ac0d33308 ${this._renderEditorSecondary()} + style="${1!==T?`filter:brightness(${T.toFixed(3)})`:""}"> ${""} ${this._wallHatchDefs(a.color)}${W`${this._paperShapes(i.rooms).map(t=>"poly"in t?W``:W``)}`} @@ -4979,7 +4979,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="8f44f3a00bc48a1f93365a849e5ac0d33308 ${this._renderGlowBaseRooms(i,c)} ${this._renderOpeningTunnelFills(i,c,"glow-base")} ${this._renderSvgRoomLabels(i,a)} - ${this._renderGlowLayer(i,a)} + ${C?this._renderGlowLayer(i,a):G} ${this._renderSunRays(i)} ${this._editing?this._renderAlignGuides():G} ${f?.guide?this._renderOpeningCenterTick(f.guide):G} diff --git a/src/device-pulse.ts b/src/device-pulse.ts index 7393e82b..295a3ea8 100644 --- a/src/device-pulse.ts +++ b/src/device-pulse.ts @@ -62,7 +62,8 @@ export function resolveDevicePulse(options: ResolveDevicePulseOptions): Resolved const diameterScale = Number.isFinite(options.diameterScale) ? Math.max(1, Number(options.diameterScale)) : 3; const color = options.color || null; - if (effectiveHidden || bindingUnavailable || display === 'static_icon') { + if (effectiveHidden || bindingUnavailable || visual.availability === 'unavailable' + || display === 'static_icon') { return noPulse(generation, color, diameterScale); } diff --git a/src/houseplan-card.ts b/src/houseplan-card.ts index 8314ced1..22c4e44a 100755 --- a/src/houseplan-card.ts +++ b/src/houseplan-card.ts @@ -13375,6 +13375,11 @@ class HouseplanCard extends LitElement { const recoveryReason = (this._continuity.overlayVisible || this._continuity.state === 'recovery-error') ? this._continuity.recoveryReason : null; const modeVisual = this._modeTransitionVisual; + const transitionFromMode = this._modeTransition.state?.from.presentedMode; + const glowLayerVisible = !this._markup || !!modeVisual && ( + modeVisual.presentedMode === 'view' || modeVisual.presentedMode === 'devices' + || transitionFromMode === 'view' || transitionFromMode === 'devices' + ); const transitionStageBg = modeVisual?.stageColor || stageBg; const transitionBrightness = modeVisual?.sceneBrightness ?? (dayNight ? 1 - planDim : 1); @@ -13654,7 +13659,7 @@ class HouseplanCard extends LitElement { ${this._renderGlowBaseRooms(space, glowBase)} ${this._renderOpeningTunnelFills(space, glowBase, 'glow-base')} ${this._renderSvgRoomLabels(space, disp)} - ${this._renderGlowLayer(space, disp)} + ${glowLayerVisible ? this._renderGlowLayer(space, disp) : nothing} ${this._renderSunRays(space)} ${this._editing ? this._renderAlignGuides() : nothing} ${opMeasure?.guide ? this._renderOpeningCenterTick(opMeasure.guide) : nothing} diff --git a/test/device-pulse.test.mjs b/test/device-pulse.test.mjs index 5ff7a9e9..b9676a9f 100644 --- a/test/device-pulse.test.mjs +++ b/test/device-pulse.test.mjs @@ -63,3 +63,18 @@ test('inactive projection retains configured preview colour and diameter', () => assert.equal(pulse.color, '#123456'); assert.equal(pulse.diameterScale, 4.25); }); + +test('unknown and unavailable device state cannot retain an activity pulse', () => { + for (const kind of ['short', 'continuous']) { + const pulse = resolveDevicePulse({ + display: 'icon_ripple', + visual: { availability: 'unavailable', status: 'neutral', activity: 'transition' }, + semanticActivity: 'transition', + shortReason: kind === 'short' ? 'transition' : null, + shortExpiresAt: kind === 'short' ? Date.now() + 1_000 : null, + liveStates: true, + effectiveHidden: false, + }); + assert.equal(pulse.kind, 'none'); + } +});