From f66e671b892c8115a8ac7ca6454fd36918f07f9e Mon Sep 17 00:00:00 2001 From: Sergey Matyunin Date: Wed, 19 Aug 2026 16:17:09 +0300 Subject: [PATCH] refactor: remove dead partition tool state Issue: #176 User-Visible: no --- .../houseplan/frontend/houseplan-card.js | 24 +++--- demo/golden/harness.mjs | 2 +- demo/smoke_free_walls.mjs | 29 +++++-- demo/smoke_plan_snap_overlay.mjs | 14 +++- demo/srv/assets/houseplan-card.js | 24 +++--- dist/houseplan-card.js | 24 +++--- docs/STATUS.md | 2 +- docs/TESTING.md | 9 ++- docs/images/06-device-display-preview.png | Bin 288221 -> 288220 bytes docs/images/06-device-editor.png | Bin 292594 -> 292595 bytes docs/images/screenshots.json | 26 +++---- src/houseplan-card.ts | 73 +++++------------- src/i18n/en.json | 3 - src/i18n/ru.json | 3 - test/golden-matrix.test.mjs | 2 +- test/unified-wall-tool-source.test.mjs | 34 ++++++++ 16 files changed, 142 insertions(+), 127 deletions(-) create mode 100644 test/unified-wall-tool-source.test.mjs diff --git a/custom_components/houseplan/frontend/houseplan-card.js b/custom_components/houseplan/frontend/houseplan-card.js index b4cd39ec..bcf6aff8 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__="ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c";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)},a=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:r,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g: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)=>!r(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(a(t))}else void 0!==t&&e.push(a(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,m?.({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,I=Array.isArray,E="[ \t\n\f\r]",F=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${E}(?:([^\\s"'>=/]+)(${E}*=${E}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(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?"":"",a=F;for(let e=0;e"===l[0]?(a=n??F,c=-1):void 0===l[1]?c=-2:(c=a.lastIndex-l[2].length,r=l[1],a=void 0===l[3]?H:'"'===l[3]?L:N):a===L||a===N?a=H:a===z||a===O?a=F:(a=H,n=void 0);const d=a===H&&t[e+1].startsWith("/>")?" ":"";o+=a===F?i+T:c>=0?(s.push(r),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 J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const a=t.length-1,r=this.parts,[l,c]=X(t,e);if(this.el=J.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())&&r.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iI(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=J.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 J(t)),e}k(t){I(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=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let a,r;for(t=n[0],a=0;a{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 U}};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,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=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 gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=at,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,a=o!==t;if(a){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||a){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},$t=(t,e=kt)=>t._$AH=e,xt=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{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 a=0;for(const e of t)n[a]=s?s(e,a):a,o[a]=i(e,a),a++;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:a}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=a,o;const r=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(r[d]===a[p])l[p]=wt(n[d],o[p]),d++,p++;else if(r[u]===a[_])l[_]=wt(n[u],o[_]),u--,_--;else if(r[d]===a[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(r[u]===a[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(a,p,_),h=St(r,d,u)),c.has(r[d]))if(c.has(r[u])){const e=h.get(a[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else xt(n[u]),u--;else xt(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&xt(t)}return this.ut=a,$t(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt 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-"+ ++Dt,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=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.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?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.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=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_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=j` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc";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)},a=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:r,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g: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)=>!r(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(a(t))}else void 0!==t&&e.push(a(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,m?.({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,I=Array.isArray,E="[ \t\n\f\r]",F=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${E}(?:([^\\s"'>=/]+)(${E}*=${E}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(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?"":"",a=F;for(let e=0;e"===l[0]?(a=n??F,c=-1):void 0===l[1]?c=-2:(c=a.lastIndex-l[2].length,r=l[1],a=void 0===l[3]?H:'"'===l[3]?L:N):a===L||a===N?a=H:a===z||a===O?a=F:(a=H,n=void 0);const d=a===H&&t[e+1].startsWith("/>")?" ":"";o+=a===F?i+T:c>=0?(s.push(r),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 J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const a=t.length-1,r=this.parts,[l,c]=X(t,e);if(this.el=J.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())&&r.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iI(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=J.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 J(t)),e}k(t){I(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=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let a,r;for(t=n[0],a=0;a{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 U}};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,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=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 gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=at,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,a=o!==t;if(a){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||a){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},$t=(t,e=kt)=>t._$AH=e,xt=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{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 a=0;for(const e of t)n[a]=s?s(e,a):a,o[a]=i(e,a),a++;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:a}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=a,o;const r=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(r[d]===a[p])l[p]=wt(n[d],o[p]),d++,p++;else if(r[u]===a[_])l[_]=wt(n[u],o[_]),u--,_--;else if(r[d]===a[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(r[u]===a[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(a,p,_),h=St(r,d,u)),c.has(r[d]))if(c.has(r[u])){const e=h.get(a[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else xt(n[u]),u--;else xt(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&xt(t)}return this.ut=a,$t(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt 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-"+ ++Dt,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=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.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?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.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=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_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=j` ${this.icon?j``:G} ${this.title} `;return this._useHaDialog?j`${t.lqiText}`:G} - `;var o}function Uo(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Go=new WeakMap;function Vo(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Go.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Go.set(e,i)),i}function Ko(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Yo(t,e){const i=Vo(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Ko(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Xo(t){const e=Vo(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Jo(t,e,i=Xo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function Zo(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const a=n?s.configEntries[n]:null;return{domain:o,label:Jo(t,o,s,a?.title),configEntryId:n,configEntryTitle:a?.title,confidence:i}}function Qo(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function ta(t,e,i,s=Xo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,a=o?s.configEntries[o]?.domain:"";return Zo(t,n.platform||a,"entity-platform",s,o)}var ea={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_partition":"Partition: draw one independent physical wall","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_partition":"two clicks draw one partition · Shift locks to 45°","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.partition_size_title":"Thickness of the partition created by the second click (1–100 cm).","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The black plate and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Default space","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const ia={en:ea,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_partition":"Перегородка: нарисуйте одну независимую физическую стену","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_partition":"два клика рисуют одну перегородку · Shift фиксирует шаг 45°","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.partition_size_title":"Толщина перегородки, создаваемой вторым кликом (1–100 см).","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Всегда одинаковые чёрная подложка и значок. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Пространство по умолчанию","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function sa(t,e){if(e&&e in ia)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function na(t,e,i){return ss(ia[t][e]??ea[e]??e,i)}function oa(t,e){const i=ia[t][e]??ia.en[e];return"string"==typeof i&&i.trim().length>0}class aa extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Yo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return sa(this.hass)}_t(t,e){return na(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Xo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),a=e.slice(n+1);if("entity"===o){const e=ta(t,a,i,s);return e?[e]:[]}if("device"!==o)return[];const r=i.devices?.[a]||t?.devices?.[a];if(!r)return[];const l=[r.config_entry_id,...Array.isArray(r.config_entries)?r.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return Zo(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return Qo(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===a&&null==n?.disabled_by&&c.push(ta(t,e,i,s));return c.some(Boolean)?Qo(c):Qo((Array.isArray(r.identifiers)?r.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return Zo(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Xo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=ta(this.hass,t,this.registry,Xo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:s?null:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let a=-o/2,r=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(r=Math.max(r,s+t)),"left"===i.valueBadge.position&&(a=Math.min(a,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,r-a),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((a+r)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=jo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",To(t.valueBadge)].filter(Boolean).join(". ");return j`
+ `;var o}function Uo(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Go=new WeakMap;function Vo(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Go.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Go.set(e,i)),i}function Ko(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Yo(t,e){const i=Vo(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Ko(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Xo(t){const e=Vo(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Jo(t,e,i=Xo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function Zo(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const a=n?s.configEntries[n]:null;return{domain:o,label:Jo(t,o,s,a?.title),configEntryId:n,configEntryTitle:a?.title,confidence:i}}function Qo(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function ta(t,e,i,s=Xo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,a=o?s.configEntries[o]?.domain:"";return Zo(t,n.platform||a,"entity-platform",s,o)}var ea={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The black plate and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Default space","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const ia={en:ea,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Всегда одинаковые чёрная подложка и значок. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Пространство по умолчанию","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function sa(t,e){if(e&&e in ia)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function na(t,e,i){return ss(ia[t][e]??ea[e]??e,i)}function oa(t,e){const i=ia[t][e]??ia.en[e];return"string"==typeof i&&i.trim().length>0}class aa extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Yo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return sa(this.hass)}_t(t,e){return na(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Xo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),a=e.slice(n+1);if("entity"===o){const e=ta(t,a,i,s);return e?[e]:[]}if("device"!==o)return[];const r=i.devices?.[a]||t?.devices?.[a];if(!r)return[];const l=[r.config_entry_id,...Array.isArray(r.config_entries)?r.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return Zo(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return Qo(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===a&&null==n?.disabled_by&&c.push(ta(t,e,i,s));return c.some(Boolean)?Qo(c):Qo((Array.isArray(r.identifiers)?r.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return Zo(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Xo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=ta(this.hass,t,this.registry,Xo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:s?null:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let a=-o/2,r=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(r=Math.max(r,s+t)),"left"===i.valueBadge.position&&(a=Math.min(a,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,r-a),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((a+r)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=jo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",To(t.valueBadge)].filter(Boolean).join(". ");return j`
${this._t("marker.preview.title")} @@ -4543,7 +4543,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 ${t?.visibleLabel?j`${t.visibleLabel}`:G}
${t?.content||G}
- `}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Fu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Fu(t,t=>t.classList.contains("editor-secondary")),s=Fu(t,t=>!!t.dataset.editorGroup),n=Fu(t,t=>!!t.dataset.editorPalette),o=Fu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Ou=t=>t.stopPropagation(),Hu=4.166666666666667e-9;function Nu(t){if(!Number.isFinite(t))return t;const e=Math.round(t/Zl)*Zl;return Math.abs(e-t)<=Hu?t:e}const Lu=(t,e,i,s)=>Math.hypot(i-t,s-e),Bu=(t,e,i,s,n,o,a,r)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+a-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+r-(e+s)))),qu=(t,e,i,s,n,o,a)=>{const r=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*r,h=Math.sin(i*l)*r,d=Math.cos(a*l)*r,u=Math.sin(a*l)*r,p=Math.max(Lu(t+c,e+h,n+d,o+u),Lu(t-c,e-h,n-d,o-u)),_=Math.max(Lu(t+c,e+h,n-d,o-u),Lu(t-c,e-h,n+d,o+u));return Math.min(p,_)},ju=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const Wu=t=>JSON.parse(JSON.stringify(t)),Uu=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Gu=(t,e,i)=>Math.min(i,Math.max(e,t)),Vu=t=>Vl({spaces:[t]})[0],Ku=t=>{const e=[];for(const i of t||[]){const t=hi(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&Uu(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(Uu(n,"segments")&&(delete n.segments,e++),Uu(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=jl&&t<=Wl&&(Uu(n,"plan_scale_x")||(n.plan_scale_x=t),Uu(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);Uu(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?Gu(o,.1,1e3):5,e++);const a=Number(n.cell_cm),r=Number.isFinite(a)&&a>0?a:5;for(const t of n.wall_columns||[])if("circle"===t.shape)Uu(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&Uu(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(Uu(t,"width")){const i=Number(t.width);(Uu(t,"width_cm")||Number.isFinite(i))&&(Uu(t,"width_cm")||(t.width_cm=Number(Gu(i/Jl*r,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(Uu(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),Uu(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(Gu(es*is(t)/Jl*r,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(Uu(t,"scale")||Uu(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1]));if(!(Uu(t,"entity")||Uu(t,"attr")||Uu(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,a=s||n?"":Xi(t.entity,o);if(s||a){if(a){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+a+i.slice(e+2):`${i}${i?" ":""}${a}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let r=a.total;for(const t of i.spaces||[]){const e=Vu(t);if(!e)continue;if(!Fc(t.open_spans).length){const i=Lc(e.rooms,null,Bl,.02*Jl,!0);i.length&&(t.open_spans=Bc(i,Bl),r++)}}const l=Wu(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,a=0,r=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=ju(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Hu||s))return;n++,t>a&&(a=t);const o=t*Xl*e;o>r&&(r=o,l=i)};for(const t of i){const e=ju(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,a=Nu(e+n),r=Nu(i+o),l=Nu(e),c=Nu(i),h=Math.max(Zl,a-l),d=Math.max(Zl,r-c);t=Bu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i}),a=n.length?[n[0]]:[],r=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Nu(s.a[0]),Nu(s.a[1])],a=[Nu(s.b[0]),Nu(s.b[1])];let r=Math.max(Lu(s.a[0],s.a[1],n[0],n[1]),Lu(s.b[0],s.b[1],a[0],a[1]));const l=Lu(n[0],n[1],a[0],a[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Hu&&s+e/2<=l+Hu});l>Hu&&c?(s.a=n,s.b=a):r=0,p(r,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Nu(s.center[0]),Nu(s.center[1])],n=Lu(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Nu(s.x1),Nu(s.y1)],i=[Nu(s.x2),Nu(s.y2)];t=Math.max(Lu(s.x1,s.y1,e[0],e[1]),Lu(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Nu(s.x),i=Nu(s.y);if(null!=s.w&&null!=s.h){const n=Nu(s.x+s.w),o=Nu(s.y+s.h),a=Math.max(Zl,n-e),r=Math.max(Zl,o-i);t=Bu(s.x,s.y,s.w,s.h,e,i,a,r),s.w=a,s.h=r}else t=Lu(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const a=n.b[0]-n.a[0],r=n.b[1]-n.a[1];if(Math.hypot(a,r)<=Hu)continue;const l=n.a[0]+a*o,h=n.a[1]+r*o;let d=180*Math.atan2(r,a)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=qu(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=pi([s.x,s.y],t.rooms||[],.025,{step:Zl,length:Number(s.length)||0});if(!n)continue;const a=Number(s.angle),r=!(Number.isFinite(a)&&a===n.angle),l=qu(s.x,s.y,Number.isFinite(a)?a:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,r&&c++,p(l,e,i,r)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Nu(i.x),a=Nu(i.y),r=Lu(i.x,i.y,n,a);s[t]={...i,x:n,y:a};const l="string"==typeof i.s?i.s:"";p(r,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:a,maxShiftCm:r,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=Vu(e),a=Vu(s);if(!o||!a)continue;const r=Ku(o.rooms),c=Ku(a.rooms),_=.02*Jl;let g=Yc(Fc(e.open_spans),r,c,Bl);const m=g.length;g=Kc(g,a.rooms,Bl,_),g=g.map(t=>{const e=Ic(t,Bl),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],a=e[2]-e[0],r=e[3]-e[1],l=Math.hypot(a,r)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(a*s-r*e)/(l*c)<=1e-6&&zc(o,t).d<=4*_&&zc(i,t).d<=4*_&&zc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Hc(i,d,u,Jl,2*_),g=Hc(n,d,u,Jl,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Jl)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Jl){h.moved++;const t=m/Bl;t>h.maxShift&&(h.maxShift=t);const e=m/Jl*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Ac(p,g,Bl)}),g=Kc(g,a.rooms,Bl,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Ic(t,Bl));g.length?s.open_spans=g:delete s.open_spans,qc(s.rooms||[],a.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Rr(e.walls,r,c,Zl,Bl);y=el(a.rooms,y,f,Zl,Number(s.cell_cm)>0?Number(s.cell_cm):5,Jl,Bl),y=Tr(y,s.rooms||[],Zl,1,f.map(t=>[t[0]/Bl,t[1]/Bl,t[2]/Bl,t[3]/Bl])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:r,glowSpacesMigrated:a.glowSpaces,glowRoomsMigrated:a.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class Xu{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const Ju=new WeakMap;const Zu=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function Qu(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,a=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=a}),r=t.createElement("canvas");r.width=4,r.height=1;const l=r.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return Zu(c,i,0)&&Zu(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&Zu(c,s,8)&&Zu(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(a)}}const tp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},ep=t=>Math.max(0,Math.min(1,t)),ip=(t,e,i)=>t+(e-t)*i,sp=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function np(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function op(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function ap(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function rp(t,e,i){const s=ap(t),n=ap(e);if(!s||!n)return i<.5?t:e;const o=ep(i);return`rgba(${Math.round(ip(s[0],n[0],o))}, ${Math.round(ip(s[1],n[1],o))}, ${Math.round(ip(s[2],n[2],o))}, ${ip(s[3],n[3],o).toFixed(3)})`}function lp(t,e,i){const s=(t=>{const e=ep(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,sp(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=ep((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:lp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(a):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(a),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const hp="houseplan_card_labs_v1",dp=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function up(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function pp(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function yp(t,e,i,s=dp){const n=function(t,e=dp){const i=up(t),s=new Map;if(!i||!gp(e))return s;for(const t of e){const e=up(t.since),n=up(t.expires);pp(i,e)>=0&&pp(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(gp(s)?s.map(t=>t.id):[]),a=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let r=!1;const l=t=>{if("off"===t)return a.clear(),void(r=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(r=!0,e||!n.has(i)?a.delete(i):a.add(i))};for(const e of vp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of vp(mp(t.hash)))l(e);const c=Object.freeze([...a].sort());return{active:c,space:fp(t.hash),persist:r?JSON.stringify(c):void 0,knownUrlOperation:r}}let bp={active:Object.freeze([]),space:""},wp="",kp=!1,$p="";const xp=new Set;function Sp(){if("undefined"==typeof window)return bp;const t=yp(window.location,function(){try{return window.localStorage.getItem(hp)}catch{return null}}(),wp);void 0!==t.persist&&function(t){try{window.localStorage.setItem(hp,t)}catch{}}(t.persist),bp={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of xp)t(bp);return bp}function Mp(){Sp()}function Cp(t){return wp=t,"undefined"==typeof window?bp:(kp||(kp=!0,window.addEventListener("hashchange",Mp),window.addEventListener("popstate",Mp)),Sp())}const Dp=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),Tp=64;function Pp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function Rp(t,e,i=Dp){if(!(Pp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],a=t[1]-i.origin[1],r=(o*Math.cos(s)-a*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+a*Math.cos(s))*i.xyScale;return[i.origin[0]+r,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function Ap(t,e=Dp){if(!Pp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Ip(t=Dp){return`matrix(${function(t=Dp){if(!Pp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),a=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,a,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-a*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Ep(t,e=Dp){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const a=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],r=Math.max(s,n),l=a.flatMap(t=>[Rp(t,-o,e),Rp(t,r,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Fp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function zp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return zp(i)>0===s?i:[...i].reverse()}function Hp(t,e,i){return t.length?`M ${t.map(t=>Fp(Rp(t,i,e))).join(" L ")} Z`:""}function Np(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Lp(t,e,i=Dp){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Op(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(zp(t))>=1e-9)).filter(t=>t.length&&zp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(zp(e[0]))-Math.abs(zp(t[0]))});const n=[],o=[];let a=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:a}}function Bp(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const qp=t=>t.every(Number.isFinite);function jp(t,e,i,s){const n=t[0]*i,o=t[1]*s,a=e*Math.PI/180;return[n*Math.cos(a)-o*Math.sin(a),n*Math.sin(a)+o*Math.cos(a)]}function Wp(t,e,i,s,n,o,a){const r=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],jp(i,t.angle,r,l));return{leaf:e,hinge:c,closedVector:jp(s,t.angle,r,l),quarterVector:jp([-s[1],s[0]],t.angle,r,l),turnDeg:n,bottom:o,top:a}}const Up=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Gp(t,e,i=Dp){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=Rp(e.hinge,e.bottom,i),a=Rp(n,e.bottom,i),r=Rp(n,e.top,i),l=Rp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${Up(o)} L ${Up(a)} L ${Up(r)} L ${Up(l)} Z`,shadowD:`M ${Up(Rp(e.hinge,0,i))} L ${Up(Rp(n,0,i))}`,depth:Math.max(o[1],a[1])}})}const Vp={window:120,door:90,passage:90,gate:300};function Kp(t){return Vp[t]}function Yp(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function Xp(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=Yp(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function Jp(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function Zp(t){const e=Xp(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,r=(t[0]-e.a[0])*o+(t[1]-e.a[1])*a,l=Math.max(0,Math.min(n,r)),c=e.a[0]+l*o,h=e.a[1]+l*a;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*a-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],a=e.b[1]-e.a[1],r=Math.hypot(o,a);if(!(r>1e-9))return!1;const l=o/r,c=a/r;for(const o of i){if(!o.open&&o.kind)continue;const i=Yp(o.a,o.b),a=i.b[0]-i.a[0],r=i.b[1]-i.a[1],h=Math.hypot(a,r);if(!(h>1e-9))continue;const d=a/h,u=r/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(Jp),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(Jp);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),a=o.filter(t=>t.target.partitionHost);if(a.length){if(1!==new Set(a.map(t=>t.target.partitionHost.id)).size||a.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=a[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),r=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,c=Math.abs(r*a-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*r);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:r,length:l}=n,c=r.b[0]-r.a[0],h=r.b[1]-r.a[1],d=c/l,u=h/l,p=r.partitionHost?r.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=r.a[0]+d*g,y=r.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,$=Math.max(0,w),x=Math.max(0,l-k),S=[r.a[0]+d*(w-$/2),r.a[1]+u*(w-$/2)],M=[r.a[0]+d*(k+x/2),r.a[1]+u*(k+x/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:r,...r.partitionHost?{host:{...r.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:$,midpoint:S},{distance:x,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function Qp(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const t_="1.65.0-beta.4",e_={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},i_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},s_=2e3,n_=1e3,o_=1500,a_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},r_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},l_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},c_=new Map;let h_=0;const d_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let u_=1e4;const p_="houseplan_card_layout_v1",__="houseplan_card_cfg_v1",g_="houseplan_card_zoom_v1",m_="houseplan_card_nav_v1",f_="houseplan_card_kiosk_v1",v_="houseplan_card_view_v1",y_=1e3,b_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],w_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},k_=new Set(["select","draw","partition","column","merge","split","resize","opening","boundary","wallthick","delroom"]),$_=2e3,x_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},S_=t=>{history.pushState(null,"",t),x_(window,"location-changed",{replace:!1})},M_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},C_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class D_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=gn(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...er},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new cp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new zu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new Xu(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++h_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"!==t.kind){if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+Mu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()}else this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0)},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=In(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Cn(t);e&&(Pn(t,e),Rn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new oh(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=M_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem(p_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=M_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=a_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?$l:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?$l:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=a_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&Ll(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const a=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=xl(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=a_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),a),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],a=s.points.slice(0,n+1),r=s.points.slice(n+1);if(a.length>=2&&o.push({id:s.id,points:a,segments:s.segments.slice(0,n)}),r.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:r,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>$_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Na(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:hs(this._settings,{bgColor:null})||null,northDeg:Ka(this._settings,{}),bgMode:Ya(this._settings,{}),sunRays:Xa(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=Yu(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),a=this.renderRoot.querySelector(".hp-backdrop"),r=this.renderRoot.querySelector(".zoomwrap"),l=r?getComputedStyle(r).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:np(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:a&&Number(getComputedStyle(a).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=Oi(this._baseVb(),s/Math.max(1,n)),a=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),r=o.w/a,l=o.h/a,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-r/2,y:h-l/2,w:r,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const a=this.renderRoot.querySelector(".editorchrome"),r=a?.querySelector(".editorchrome-inner"),l="view"===i?0:r?.scrollHeight||r?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:np(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}_slideTo(t,e){if(t===this._space)return;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate())}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new eh(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(v_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?Ap(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?Rp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return fp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,Ju.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=Qc(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=Ju.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=Qu(t).catch(()=>!1).then(t=>(i.resolved=t,t)),Ju.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>As(this._serverCfg)),this._config?.kiosk&&Number(this._config?.cycle)>0&&(clearInterval(this._cycleTimer),this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle))),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){xp.add(e);const i=Cp(t);return"undefined"==typeof window&&e(i),()=>{xp.delete(e)}}(t_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),a=/^[a-z]$/.test(o),r="z"===o||!a&&"KeyZ"===t.code,l="y"===o||!a&&"KeyY"===t.code,c=n&&(r&&t.shiftKey||l),h=n&&r&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"!==this._tool&&"partition"!==this._tool||!this._path.length?"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry():void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint());if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length||"partition"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"partition"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of c_.values())for(const e of t)clearTimeout(e.evict);c_.clear(),u_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of c_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:c_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t},this._config.kiosk&&(this._booting=!1,this._bootFading=!1),t.default_floor&&(this._space=t.default_floor);try{this._zoomBySpace=JSON.parse(localStorage.getItem(g_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(v_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Cp(t_);try{const t=JSON.parse(localStorage.getItem(f_)||"null");this._kioskScale={icon:zs(t?.icon),font:zs(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(__)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||ih(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||ih(this._layout),this._virtualLights=gn(t.virtual_lights,this._cfgRev),this._serverStorage=!0,this._adoptInitialSpace(this._model))}catch{}"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=d_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=c_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Xc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:a}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,a=0,r=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>a?(o=i,a=t,r=1):t===a&&r++)}return!o||r>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Xc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),this._warmKey=t,a?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=c_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},u_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);if(this._hashApplied||!this._model.find(t=>t.id===e.space))return void(this._warmVp=null);this._space=e.space,this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const i=this._effectiveProjection(),s=i===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=s&&e.view?{...e.view}:null,this._viewModeSnap=s&&e.snap?{...e.snap}:null,!s&&e.logicalCenter){const t="iso"===i?Rp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var n;this._tool="openwall"===(n=e.tool)||"closewall"===n?"boundary":"opening"===(n=function(t){return"partition"===t?"draw":t}(n))?"draw":"string"==typeof n&&k_.has(n)?n:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=d_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=c_.get(i)||[];for(s.push(this._warmSlot),c_.set(i,s),this._warmTrim(s);c_.size>8;){const t=c_.keys().next().value;if(void 0===t||t===i)break;for(const e of c_.get(t)||[])clearTimeout(e.evict);c_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>u_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=ih(this._serverCfg),this._layoutContentFingerprint=ih(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(yn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(__,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:fn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t){return function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t){const e=this._initialSpaceSelection(t);return e.id?(this._space=e.id,"hash"===e.source&&(this._hashApplied=!0),"saved"===e.source&&(this._navApplied=!0),e):e}_candidateBackdrop(t,e=this._space){const i=Vl(t),s=this._initialSpaceSelection(i).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===s)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return sh([this._cfgRev,this._cfgContentFingerprint||ih(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||ih(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
`}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Fu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Fu(t,t=>t.classList.contains("editor-secondary")),s=Fu(t,t=>!!t.dataset.editorGroup),n=Fu(t,t=>!!t.dataset.editorPalette),o=Fu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Ou=t=>t.stopPropagation(),Hu=4.166666666666667e-9;function Nu(t){if(!Number.isFinite(t))return t;const e=Math.round(t/Zl)*Zl;return Math.abs(e-t)<=Hu?t:e}const Lu=(t,e,i,s)=>Math.hypot(i-t,s-e),Bu=(t,e,i,s,n,o,a,r)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+a-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+r-(e+s)))),qu=(t,e,i,s,n,o,a)=>{const r=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*r,h=Math.sin(i*l)*r,d=Math.cos(a*l)*r,u=Math.sin(a*l)*r,p=Math.max(Lu(t+c,e+h,n+d,o+u),Lu(t-c,e-h,n-d,o-u)),_=Math.max(Lu(t+c,e+h,n-d,o-u),Lu(t-c,e-h,n+d,o+u));return Math.min(p,_)},ju=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const Wu=t=>JSON.parse(JSON.stringify(t)),Uu=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Gu=(t,e,i)=>Math.min(i,Math.max(e,t)),Vu=t=>Vl({spaces:[t]})[0],Ku=t=>{const e=[];for(const i of t||[]){const t=hi(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&Uu(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(Uu(n,"segments")&&(delete n.segments,e++),Uu(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=jl&&t<=Wl&&(Uu(n,"plan_scale_x")||(n.plan_scale_x=t),Uu(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);Uu(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?Gu(o,.1,1e3):5,e++);const a=Number(n.cell_cm),r=Number.isFinite(a)&&a>0?a:5;for(const t of n.wall_columns||[])if("circle"===t.shape)Uu(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&Uu(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(Uu(t,"width")){const i=Number(t.width);(Uu(t,"width_cm")||Number.isFinite(i))&&(Uu(t,"width_cm")||(t.width_cm=Number(Gu(i/Jl*r,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(Uu(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),Uu(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(Gu(es*is(t)/Jl*r,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(Uu(t,"scale")||Uu(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1]));if(!(Uu(t,"entity")||Uu(t,"attr")||Uu(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,a=s||n?"":Xi(t.entity,o);if(s||a){if(a){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+a+i.slice(e+2):`${i}${i?" ":""}${a}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let r=a.total;for(const t of i.spaces||[]){const e=Vu(t);if(!e)continue;if(!Fc(t.open_spans).length){const i=Lc(e.rooms,null,Bl,.02*Jl,!0);i.length&&(t.open_spans=Bc(i,Bl),r++)}}const l=Wu(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,a=0,r=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=ju(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Hu||s))return;n++,t>a&&(a=t);const o=t*Xl*e;o>r&&(r=o,l=i)};for(const t of i){const e=ju(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,a=Nu(e+n),r=Nu(i+o),l=Nu(e),c=Nu(i),h=Math.max(Zl,a-l),d=Math.max(Zl,r-c);t=Bu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i}),a=n.length?[n[0]]:[],r=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Nu(s.a[0]),Nu(s.a[1])],a=[Nu(s.b[0]),Nu(s.b[1])];let r=Math.max(Lu(s.a[0],s.a[1],n[0],n[1]),Lu(s.b[0],s.b[1],a[0],a[1]));const l=Lu(n[0],n[1],a[0],a[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Hu&&s+e/2<=l+Hu});l>Hu&&c?(s.a=n,s.b=a):r=0,p(r,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Nu(s.center[0]),Nu(s.center[1])],n=Lu(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Nu(s.x1),Nu(s.y1)],i=[Nu(s.x2),Nu(s.y2)];t=Math.max(Lu(s.x1,s.y1,e[0],e[1]),Lu(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Nu(s.x),i=Nu(s.y);if(null!=s.w&&null!=s.h){const n=Nu(s.x+s.w),o=Nu(s.y+s.h),a=Math.max(Zl,n-e),r=Math.max(Zl,o-i);t=Bu(s.x,s.y,s.w,s.h,e,i,a,r),s.w=a,s.h=r}else t=Lu(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const a=n.b[0]-n.a[0],r=n.b[1]-n.a[1];if(Math.hypot(a,r)<=Hu)continue;const l=n.a[0]+a*o,h=n.a[1]+r*o;let d=180*Math.atan2(r,a)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=qu(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=pi([s.x,s.y],t.rooms||[],.025,{step:Zl,length:Number(s.length)||0});if(!n)continue;const a=Number(s.angle),r=!(Number.isFinite(a)&&a===n.angle),l=qu(s.x,s.y,Number.isFinite(a)?a:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,r&&c++,p(l,e,i,r)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Nu(i.x),a=Nu(i.y),r=Lu(i.x,i.y,n,a);s[t]={...i,x:n,y:a};const l="string"==typeof i.s?i.s:"";p(r,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:a,maxShiftCm:r,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=Vu(e),a=Vu(s);if(!o||!a)continue;const r=Ku(o.rooms),c=Ku(a.rooms),_=.02*Jl;let g=Yc(Fc(e.open_spans),r,c,Bl);const m=g.length;g=Kc(g,a.rooms,Bl,_),g=g.map(t=>{const e=Ic(t,Bl),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],a=e[2]-e[0],r=e[3]-e[1],l=Math.hypot(a,r)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(a*s-r*e)/(l*c)<=1e-6&&zc(o,t).d<=4*_&&zc(i,t).d<=4*_&&zc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Hc(i,d,u,Jl,2*_),g=Hc(n,d,u,Jl,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Jl)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Jl){h.moved++;const t=m/Bl;t>h.maxShift&&(h.maxShift=t);const e=m/Jl*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Ac(p,g,Bl)}),g=Kc(g,a.rooms,Bl,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Ic(t,Bl));g.length?s.open_spans=g:delete s.open_spans,qc(s.rooms||[],a.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Rr(e.walls,r,c,Zl,Bl);y=el(a.rooms,y,f,Zl,Number(s.cell_cm)>0?Number(s.cell_cm):5,Jl,Bl),y=Tr(y,s.rooms||[],Zl,1,f.map(t=>[t[0]/Bl,t[1]/Bl,t[2]/Bl,t[3]/Bl])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:r,glowSpacesMigrated:a.glowSpaces,glowRoomsMigrated:a.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class Xu{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const Ju=new WeakMap;const Zu=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function Qu(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,a=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=a}),r=t.createElement("canvas");r.width=4,r.height=1;const l=r.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return Zu(c,i,0)&&Zu(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&Zu(c,s,8)&&Zu(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(a)}}const tp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},ep=t=>Math.max(0,Math.min(1,t)),ip=(t,e,i)=>t+(e-t)*i,sp=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function np(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function op(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function ap(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function rp(t,e,i){const s=ap(t),n=ap(e);if(!s||!n)return i<.5?t:e;const o=ep(i);return`rgba(${Math.round(ip(s[0],n[0],o))}, ${Math.round(ip(s[1],n[1],o))}, ${Math.round(ip(s[2],n[2],o))}, ${ip(s[3],n[3],o).toFixed(3)})`}function lp(t,e,i){const s=(t=>{const e=ep(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,sp(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=ep((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:lp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(a):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(a),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const hp="houseplan_card_labs_v1",dp=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function up(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function pp(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function yp(t,e,i,s=dp){const n=function(t,e=dp){const i=up(t),s=new Map;if(!i||!gp(e))return s;for(const t of e){const e=up(t.since),n=up(t.expires);pp(i,e)>=0&&pp(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(gp(s)?s.map(t=>t.id):[]),a=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let r=!1;const l=t=>{if("off"===t)return a.clear(),void(r=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(r=!0,e||!n.has(i)?a.delete(i):a.add(i))};for(const e of vp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of vp(mp(t.hash)))l(e);const c=Object.freeze([...a].sort());return{active:c,space:fp(t.hash),persist:r?JSON.stringify(c):void 0,knownUrlOperation:r}}let bp={active:Object.freeze([]),space:""},wp="",kp=!1,$p="";const xp=new Set;function Sp(){if("undefined"==typeof window)return bp;const t=yp(window.location,function(){try{return window.localStorage.getItem(hp)}catch{return null}}(),wp);void 0!==t.persist&&function(t){try{window.localStorage.setItem(hp,t)}catch{}}(t.persist),bp={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of xp)t(bp);return bp}function Mp(){Sp()}function Cp(t){return wp=t,"undefined"==typeof window?bp:(kp||(kp=!0,window.addEventListener("hashchange",Mp),window.addEventListener("popstate",Mp)),Sp())}const Dp=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),Tp=64;function Pp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function Rp(t,e,i=Dp){if(!(Pp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],a=t[1]-i.origin[1],r=(o*Math.cos(s)-a*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+a*Math.cos(s))*i.xyScale;return[i.origin[0]+r,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function Ap(t,e=Dp){if(!Pp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Ip(t=Dp){return`matrix(${function(t=Dp){if(!Pp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),a=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,a,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-a*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Ep(t,e=Dp){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const a=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],r=Math.max(s,n),l=a.flatMap(t=>[Rp(t,-o,e),Rp(t,r,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Fp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function zp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return zp(i)>0===s?i:[...i].reverse()}function Hp(t,e,i){return t.length?`M ${t.map(t=>Fp(Rp(t,i,e))).join(" L ")} Z`:""}function Np(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Lp(t,e,i=Dp){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Op(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(zp(t))>=1e-9)).filter(t=>t.length&&zp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(zp(e[0]))-Math.abs(zp(t[0]))});const n=[],o=[];let a=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:a}}function Bp(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const qp=t=>t.every(Number.isFinite);function jp(t,e,i,s){const n=t[0]*i,o=t[1]*s,a=e*Math.PI/180;return[n*Math.cos(a)-o*Math.sin(a),n*Math.sin(a)+o*Math.cos(a)]}function Wp(t,e,i,s,n,o,a){const r=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],jp(i,t.angle,r,l));return{leaf:e,hinge:c,closedVector:jp(s,t.angle,r,l),quarterVector:jp([-s[1],s[0]],t.angle,r,l),turnDeg:n,bottom:o,top:a}}const Up=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Gp(t,e,i=Dp){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=Rp(e.hinge,e.bottom,i),a=Rp(n,e.bottom,i),r=Rp(n,e.top,i),l=Rp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${Up(o)} L ${Up(a)} L ${Up(r)} L ${Up(l)} Z`,shadowD:`M ${Up(Rp(e.hinge,0,i))} L ${Up(Rp(n,0,i))}`,depth:Math.max(o[1],a[1])}})}const Vp={window:120,door:90,passage:90,gate:300};function Kp(t){return Vp[t]}function Yp(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function Xp(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=Yp(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function Jp(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function Zp(t){const e=Xp(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,r=(t[0]-e.a[0])*o+(t[1]-e.a[1])*a,l=Math.max(0,Math.min(n,r)),c=e.a[0]+l*o,h=e.a[1]+l*a;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*a-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],a=e.b[1]-e.a[1],r=Math.hypot(o,a);if(!(r>1e-9))return!1;const l=o/r,c=a/r;for(const o of i){if(!o.open&&o.kind)continue;const i=Yp(o.a,o.b),a=i.b[0]-i.a[0],r=i.b[1]-i.a[1],h=Math.hypot(a,r);if(!(h>1e-9))continue;const d=a/h,u=r/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(Jp),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(Jp);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),a=o.filter(t=>t.target.partitionHost);if(a.length){if(1!==new Set(a.map(t=>t.target.partitionHost.id)).size||a.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=a[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),r=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,c=Math.abs(r*a-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*r);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:r,length:l}=n,c=r.b[0]-r.a[0],h=r.b[1]-r.a[1],d=c/l,u=h/l,p=r.partitionHost?r.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=r.a[0]+d*g,y=r.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,$=Math.max(0,w),x=Math.max(0,l-k),S=[r.a[0]+d*(w-$/2),r.a[1]+u*(w-$/2)],M=[r.a[0]+d*(k+x/2),r.a[1]+u*(k+x/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:r,...r.partitionHost?{host:{...r.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:$,midpoint:S},{distance:x,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function Qp(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const t_="1.65.0-beta.4",e_={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},i_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},s_=2e3,n_=1e3,o_=1500,a_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},r_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},l_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},c_=new Map;let h_=0;const d_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let u_=1e4;const p_="houseplan_card_layout_v1",__="houseplan_card_cfg_v1",g_="houseplan_card_zoom_v1",m_="houseplan_card_nav_v1",f_="houseplan_card_kiosk_v1",v_="houseplan_card_view_v1",y_=1e3,b_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],w_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},k_=new Set(["select","draw","column","merge","split","resize","opening","boundary","wallthick","delroom"]),$_=2e3,x_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},S_=t=>{history.pushState(null,"",t),x_(window,"location-changed",{replace:!1})},M_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},C_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class D_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=gn(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...er},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new cp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new zu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new Xu(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++h_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"!==t.kind){if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+Mu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()}else this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0)},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=In(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Cn(t);e&&(Pn(t,e),Rn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new oh(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=M_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem(p_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=M_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=a_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?$l:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?$l:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=a_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&Ll(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const a=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=xl(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=a_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),a),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],a=s.points.slice(0,n+1),r=s.points.slice(n+1);if(a.length>=2&&o.push({id:s.id,points:a,segments:s.segments.slice(0,n)}),r.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:r,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>$_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Na(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:hs(this._settings,{bgColor:null})||null,northDeg:Ka(this._settings,{}),bgMode:Ya(this._settings,{}),sunRays:Xa(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=Yu(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),a=this.renderRoot.querySelector(".hp-backdrop"),r=this.renderRoot.querySelector(".zoomwrap"),l=r?getComputedStyle(r).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:np(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:a&&Number(getComputedStyle(a).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=Oi(this._baseVb(),s/Math.max(1,n)),a=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),r=o.w/a,l=o.h/a,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-r/2,y:h-l/2,w:r,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const a=this.renderRoot.querySelector(".editorchrome"),r=a?.querySelector(".editorchrome-inner"),l="view"===i?0:r?.scrollHeight||r?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:np(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}_slideTo(t,e){if(t===this._space)return;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate())}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new eh(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(v_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?Ap(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?Rp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return fp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,Ju.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=Qc(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=Ju.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=Qu(t).catch(()=>!1).then(t=>(i.resolved=t,t)),Ju.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>As(this._serverCfg)),this._config?.kiosk&&Number(this._config?.cycle)>0&&(clearInterval(this._cycleTimer),this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle))),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){xp.add(e);const i=Cp(t);return"undefined"==typeof window&&e(i),()=>{xp.delete(e)}}(t_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),a=/^[a-z]$/.test(o),r="z"===o||!a&&"KeyZ"===t.code,l="y"===o||!a&&"KeyY"===t.code,c=n&&(r&&t.shiftKey||l),h=n&&r&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"===this._tool&&this._path.length?void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint()):"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry();if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of c_.values())for(const e of t)clearTimeout(e.evict);c_.clear(),u_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of c_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:c_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t},this._config.kiosk&&(this._booting=!1,this._bootFading=!1),t.default_floor&&(this._space=t.default_floor);try{this._zoomBySpace=JSON.parse(localStorage.getItem(g_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(v_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Cp(t_);try{const t=JSON.parse(localStorage.getItem(f_)||"null");this._kioskScale={icon:zs(t?.icon),font:zs(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(__)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||ih(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||ih(this._layout),this._virtualLights=gn(t.virtual_lights,this._cfgRev),this._serverStorage=!0,this._adoptInitialSpace(this._model))}catch{}"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=d_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=c_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Xc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:a}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,a=0,r=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>a?(o=i,a=t,r=1):t===a&&r++)}return!o||r>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Xc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),this._warmKey=t,a?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=c_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},u_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);if(this._hashApplied||!this._model.find(t=>t.id===e.space))return void(this._warmVp=null);this._space=e.space,this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const i=this._effectiveProjection(),s=i===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=s&&e.view?{...e.view}:null,this._viewModeSnap=s&&e.snap?{...e.snap}:null,!s&&e.logicalCenter){const t="iso"===i?Rp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var n;this._tool="openwall"===(n=e.tool)||"closewall"===n?"boundary":"opening"===(n=function(t){return"partition"===t?"draw":t}(n))?"draw":"string"==typeof n&&k_.has(n)?n:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=d_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=c_.get(i)||[];for(s.push(this._warmSlot),c_.set(i,s),this._warmTrim(s);c_.size>8;){const t=c_.keys().next().value;if(void 0===t||t===i)break;for(const e of c_.get(t)||[])clearTimeout(e.evict);c_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>u_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=ih(this._serverCfg),this._layoutContentFingerprint=ih(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(yn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(__,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:fn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t){return function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t){const e=this._initialSpaceSelection(t);return e.id?(this._space=e.id,"hash"===e.source&&(this._hashApplied=!0),"saved"===e.source&&(this._navApplied=!0),e):e}_candidateBackdrop(t,e=this._space){const i=Vl(t),s=this._initialSpaceSelection(i).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===s)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return sh([this._cfgRev,this._cfgContentFingerprint||ih(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||ih(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
t.stopPropagation()} @click=${t=>t.stopPropagation()} @@ -4560,7 +4560,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 style="left:${r.toFixed(1)}%;top:${l.toFixed(1)}%" @click=${t=>{t.stopPropagation(),this._fitAll()}}> - `}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:Oi(t,this._stageAspect())}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,a=i+s-e+n;return Math.max(Math.min(o,a),Math.min(Math.max(o,a),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=Oi(s,this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),a=n.w/o,r=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-a/2,y:h-r/2,w:a,h:r},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Xc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=Oi(this._baseVb(),this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const a=s.clientWidth,r=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/a*c,y:l[1]-e/r*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=Oi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(g_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=Oi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&(this._slideTo(n,i<0?"left":"right"),this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&S_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},C_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),a=(t.clientX-this._drag.sx)/n.width*o.w,r=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=ec(this._drag.ox+a),c=ec(this._drag.oy+r);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}get _noHover(){return D_._noHoverMq||D_._touchSeen}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse","touch"!==t.pointerType&&"pen"!==t.pointerType||(D_._touchSeen=!0,this._tip&&(this._tip=null))}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if("touch"===e.pointerType)if(this._notePointer(e),"pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type){if(this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._noHover||this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o})}get _gridPitch(){return Jl}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return li(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,y_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return ui(t?.rooms||[]).map(t=>[t[0]*y_,t[1]*e,t[2]*y_,t[3]*e])}_savedNav(){try{return JSON.parse(localStorage.getItem(m_)||"null")}catch{return null}}_saveNav(){try{localStorage.setItem(m_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),a=this._modeTransitionBusy,r=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=a&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(a?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:a?this._modeTransitionTargetCenterX:r?.viewport.centerX,u=c?c.centerY:a?this._modeTransitionTargetCenterY:r?.viewport.centerY;if("view"===s&&"view"!==t&&!a){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||a||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:r?.viewport.centerX,centerY:r?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?Rp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?r?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=r,this._prepareModeTransition(p,r,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(r,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=mr(pr,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?mr(pr,this._imperial):this._drawWallField}get _drawWallCm(){const t=a_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?$l:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?$l:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:mr(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=bd(this._path,this._draftSegmentCms,pr),i=e.length;if((t.partitions||[]).length+i>$_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=$_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[ec(ri(t[0],e)),ec(ri(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const a=Math.PI/4;let r=Math.atan2(o,n);r<0&&(r+=2*Math.PI);const l=Math.floor(r/a+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Yl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=vl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,a=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-a,e.x+o,e.y+a])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(ld(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const a=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>ld(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of a){if(md(t.point,n,s))continue;const a=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);a>i.tolerance||!fd(a,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:a})}if(o)return o;let r=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],a=Ns([e[0],e[1]],t);if(a>i.tolerance)continue;const l=vd(o,e,i.gridStep);!md(l,n,s)&&fd(a,o.key,r)&&(r={kind:"line",point:l,key:o.key,distance:a,segment:o})}return r}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool&&"partition"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return fi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Kl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:xl(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Sl(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=Fc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Tr(t.walls,t.rooms||[],Zl,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._space=t.spaceId,this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&wi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&Di(t,i)})}_pointInRoom(t,e){return e.poly?vi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!va(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>$_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("partition"===this._tool)return void this._partitionClick(s,t.shiftKey);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const a=this._draftEndAt(n,this._activeDraftId||void 0);if(a)return void this._mergeDraftEndpoint(a);if(!this._canAppendRoomDraftPoint())return;const r=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(r)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,a=n.find(e=>e.id===t.draft.id);if(!a)return;const r=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(a.segments||[]).map(t=>({...t})):[...a.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,r[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?r.slice(1):r],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(a.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Pi(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||a,id:b,points:m.map(t=>[t[0]/y_,t[1]/y_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:yd,s=Bd(t,i),n=new Map,o=new Map,a=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Sd(t.a,i),s=Sd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const r=new Map;for(const[t,e]of o){const i=n.get(t);r.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Sd(t.a,i),Sd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Md(u,p));const s=r.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=$d(g);if(!(m>i*i))continue;const f=Cd(Dd(e,n,i)),v=new Set;for(const t of d)for(const e of a.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let a;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);a=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!a.length)return;for(const t of s.rooms){const e=hi(t);if(!t.id||!e)continue;const i=Ei(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Pi(s)>=Pi(n)?s:n,r=o===s?n:s,l=[...a].sort((t,e)=>Math.abs(t.area-Pi(r))-Math.abs(e.area-Pi(r))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:r.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:r},consumeAllActive:!0}])}const r=a.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));r.length&&this._beginWallFaceBatch(r)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_partitionClick(t,e){const i=this._resolvePlanDrawPoint(t,e).point;if(!this._path.length)return void(this._path=[i]);const s=this._path[0];if(this._samePt(s,i))return;const n=this._drawWallCm;if(null==n)return void this._showPhysicalRange(100);if(!this._curSpaceCfg||this._limitReached("partition"))return;const o=this._geometrySnapshot(),a=this._curSpaceCfg;a.partitions||=[];const r="partition-"+Date.now().toString(36);a.partitions.push({id:r,a:[s[0]/y_,s[1]/y_],b:[i[0]/y_,i[1]/y_],cm:n}),this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),this._recordGeometry(this._t("history.partition_add"),o),this._saveConfig()}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange($l);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:xl(i),angle:0},o=(s.wall_columns||[]).find(t=>Ll(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const a=this._geometrySnapshot(),r=this._curSpaceCfg;r.wall_columns||=[],r.wall_columns.push({...n,center:[e[0]/y_,e[1]/y_]}),this._recordGeometry(this._t("history.column_add"),a),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Sl(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:mr(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),C_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Hl(n,Tl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Dl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Hl(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const a=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),r=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===a&&r-l.at>380&&r-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:a,index:c,x:t.clientX,y:t.clientY,at:r},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Kl*y_-Math.min(...n),Math.min(Kl*y_-Math.max(...n),i[0])),Math.max(-Kl*y_-Math.min(...o),Math.min(Kl*y_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/y_,n.a[1]/y_],t.b=[n.b[0]/y_,n.b[1]/y_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=ed(t,[n],y_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,rd(t,i,y_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/y_,(n.center[1]+e.delta[1])/y_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),C_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Sl(e.angle),angle:Sl(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Sl(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?hi(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const a=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/y_,t[1]/a]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/y_,e.y=i[1]/a)}const r=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*y_,t[1]*a]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:pa(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),C_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const a=Math.sign(s);let r=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&r>1e-9;s++,r-=l){const s=a*r;if(xa(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const a=wa(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(a.polys),this._rszApplyPreview(a.polys,a.openings),this._rszLive=this._rszEdgeLabels(a,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Ma(t,e,i,s,n,o))return n;let a=1,r=n;for(let n=0;n<28;n++){const n=(a+r)/2;Ma(t,e,i,s,n,o)?a=n:r=n}return a}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),a=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),r=Sa(o,e.openings,a,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:r.poly},r.openings),this._rszLive=this._rszScaleLabels(r.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=fa(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Tr(n.walls,n.rooms||[],Zl,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,a=e.edge,r=(a+1)%o;for(const[t,e]of[[n[(a-1+o)%o],n[a]],[n[a],n[r]],[n[r],n[(r+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&nl(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||n,a=xi(o),r=u.length?zl(Fl(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(o,this._gridPitch,this._cellCm);s.push({x:a[0],y:a[1],text:Da(r,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),a=this._spaceWalls,r=a.length&&this._rszSel&&nl([{id:this._rszSel,poly:t}],this._rszSel,a,[],this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||t,l=xi(r),c=this._physicalBodiesR(),h=c.length?zl(Fl(r,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(r,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Da(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],a=this._rszRooms();for(const t of a)for(let i=0;i`}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:Oi(t,this._stageAspect())}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,a=i+s-e+n;return Math.max(Math.min(o,a),Math.min(Math.max(o,a),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=Oi(s,this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),a=n.w/o,r=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-a/2,y:h-r/2,w:a,h:r},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Xc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=Oi(this._baseVb(),this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const a=s.clientWidth,r=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/a*c,y:l[1]-e/r*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=Oi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(g_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=Oi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&(this._slideTo(n,i<0?"left":"right"),this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&S_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},C_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),a=(t.clientX-this._drag.sx)/n.width*o.w,r=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=ec(this._drag.ox+a),c=ec(this._drag.oy+r);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}get _noHover(){return D_._noHoverMq||D_._touchSeen}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse","touch"!==t.pointerType&&"pen"!==t.pointerType||(D_._touchSeen=!0,this._tip&&(this._tip=null))}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if("touch"===e.pointerType)if(this._notePointer(e),"pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type){if(this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._noHover||this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o})}get _gridPitch(){return Jl}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return li(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,y_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return ui(t?.rooms||[]).map(t=>[t[0]*y_,t[1]*e,t[2]*y_,t[3]*e])}_savedNav(){try{return JSON.parse(localStorage.getItem(m_)||"null")}catch{return null}}_saveNav(){try{localStorage.setItem(m_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),a=this._modeTransitionBusy,r=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=a&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(a?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:a?this._modeTransitionTargetCenterX:r?.viewport.centerX,u=c?c.centerY:a?this._modeTransitionTargetCenterY:r?.viewport.centerY;if("view"===s&&"view"!==t&&!a){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||a||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:r?.viewport.centerX,centerY:r?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?Rp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?r?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=r,this._prepareModeTransition(p,r,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(r,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=mr(pr,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?mr(pr,this._imperial):this._drawWallField}get _drawWallCm(){const t=a_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?$l:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?$l:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:mr(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=bd(this._path,this._draftSegmentCms,pr),i=e.length;if((t.partitions||[]).length+i>$_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=$_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[ec(ri(t[0],e)),ec(ri(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const a=Math.PI/4;let r=Math.atan2(o,n);r<0&&(r+=2*Math.PI);const l=Math.floor(r/a+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Yl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=vl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,a=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-a,e.x+o,e.y+a])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(ld(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const a=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>ld(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of a){if(md(t.point,n,s))continue;const a=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);a>i.tolerance||!fd(a,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:a})}if(o)return o;let r=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],a=Ns([e[0],e[1]],t);if(a>i.tolerance)continue;const l=vd(o,e,i.gridStep);!md(l,n,s)&&fd(a,o.key,r)&&(r={kind:"line",point:l,key:o.key,distance:a,segment:o})}return r}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return fi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Kl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:xl(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Sl(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=Fc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Tr(t.walls,t.rooms||[],Zl,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._space=t.spaceId,this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&wi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&Di(t,i)})}_pointInRoom(t,e){return e.poly?vi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!va(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>$_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const a=this._draftEndAt(n,this._activeDraftId||void 0);if(a)return void this._mergeDraftEndpoint(a);if(!this._canAppendRoomDraftPoint())return;const r=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(r)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,a=n.find(e=>e.id===t.draft.id);if(!a)return;const r=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(a.segments||[]).map(t=>({...t})):[...a.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,r[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?r.slice(1):r],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(a.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Pi(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||a,id:b,points:m.map(t=>[t[0]/y_,t[1]/y_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:yd,s=Bd(t,i),n=new Map,o=new Map,a=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Sd(t.a,i),s=Sd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const r=new Map;for(const[t,e]of o){const i=n.get(t);r.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Sd(t.a,i),Sd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Md(u,p));const s=r.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=$d(g);if(!(m>i*i))continue;const f=Cd(Dd(e,n,i)),v=new Set;for(const t of d)for(const e of a.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let a;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);a=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!a.length)return;for(const t of s.rooms){const e=hi(t);if(!t.id||!e)continue;const i=Ei(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Pi(s)>=Pi(n)?s:n,r=o===s?n:s,l=[...a].sort((t,e)=>Math.abs(t.area-Pi(r))-Math.abs(e.area-Pi(r))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:r.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:r},consumeAllActive:!0}])}const r=a.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));r.length&&this._beginWallFaceBatch(r)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange($l);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:xl(i),angle:0},o=(s.wall_columns||[]).find(t=>Ll(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const a=this._geometrySnapshot(),r=this._curSpaceCfg;r.wall_columns||=[],r.wall_columns.push({...n,center:[e[0]/y_,e[1]/y_]}),this._recordGeometry(this._t("history.column_add"),a),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Sl(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:mr(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),C_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Hl(n,Tl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Dl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Hl(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const a=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),r=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===a&&r-l.at>380&&r-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:a,index:c,x:t.clientX,y:t.clientY,at:r},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Kl*y_-Math.min(...n),Math.min(Kl*y_-Math.max(...n),i[0])),Math.max(-Kl*y_-Math.min(...o),Math.min(Kl*y_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/y_,n.a[1]/y_],t.b=[n.b[0]/y_,n.b[1]/y_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=ed(t,[n],y_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,rd(t,i,y_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/y_,(n.center[1]+e.delta[1])/y_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),C_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Sl(e.angle),angle:Sl(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Sl(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?hi(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const a=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/y_,t[1]/a]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/y_,e.y=i[1]/a)}const r=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*y_,t[1]*a]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:pa(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),C_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const a=Math.sign(s);let r=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&r>1e-9;s++,r-=l){const s=a*r;if(xa(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const a=wa(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(a.polys),this._rszApplyPreview(a.polys,a.openings),this._rszLive=this._rszEdgeLabels(a,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Ma(t,e,i,s,n,o))return n;let a=1,r=n;for(let n=0;n<28;n++){const n=(a+r)/2;Ma(t,e,i,s,n,o)?a=n:r=n}return a}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),a=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),r=Sa(o,e.openings,a,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:r.poly},r.openings),this._rszLive=this._rszScaleLabels(r.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=fa(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Tr(n.walls,n.rooms||[],Zl,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,a=e.edge,r=(a+1)%o;for(const[t,e]of[[n[(a-1+o)%o],n[a]],[n[a],n[r]],[n[r],n[(r+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&nl(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||n,a=xi(o),r=u.length?zl(Fl(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(o,this._gridPitch,this._cellCm);s.push({x:a[0],y:a[1],text:Da(r,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),a=this._spaceWalls,r=a.length&&this._rszSel&&nl([{id:this._rszSel,poly:t}],this._rszSel,a,[],this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||t,l=xi(r),c=this._physicalBodiesR(),h=c.length?zl(Fl(r,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(r,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Da(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],a=this._rszRooms();for(const t of a)for(let i=0;ithis._rszEdgeDown(e,t.id,i)} @pointermove=${t=>this._rszMove(t)} @pointerup=${t=>this._rszUp(t)} @@ -4676,14 +4676,14 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 max=${mr(150,this._imperial)} step="any" .value=${this._drawWallFieldValue} @input=${t=>{this._drawWallField=t.target.value}} - title=${this._t("draw"===this._tool?"markup.draw_wall_title":"partition"===this._tool?"physical.partition_size_title":"physical.column_size_title")} /> + title=${this._t("draw"===this._tool?"markup.draw_wall_title":"physical.column_size_title")} /> ${this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")} ${this._t("physical.allowed_range",{max:mr(this._drawWallMaxCm,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")})} `}_renderPlanSecondary(){const t=this._editorSecondaryContextId,e=this._physicalSel;if(e){if(!("partition"===e.kind?!!this._curSpaceCfg.partitions?.some(t=>t.id===e.id):"column"===e.kind?!!this._curSpaceCfg.wall_columns?.some(t=>t.id===e.id):!!this._curSpaceCfg.room_drafts?.some(t=>t.id===e.id)))return null;const i="partition"===e.kind?this._t("markup.partition"):"column"===e.kind?this._t("markup.column"):this._t("markup.add");return{contextId:t,kind:"selection",ariaLabel:this._t("editor.context_actions",{object:i}),visibleLabel:i,content:j` `}}const i="draw"===this._tool||"partition"===this._tool||"column"===this._tool,s="partition"===this._tool?"markup.hint_partition":"column"===this._tool?"markup.hint_column":"resize"===this._tool?"markup.hint_resize":"wallthick"===this._tool?"markup.hint_wallthick":"boundary"===this._tool?this._boundaryHintKey:null,n="draw"===this._tool?this._t(this._path.length?"markup.hint_points":"markup.hint_start",this._path.length?{n:this._path.length}:void 0):"";if(!i&&!s&&!n)return null;const o="draw"===this._tool&&this._path.length>0||"boundary"===this._tool&&!!this._openWallAnchor;return{contextId:t,kind:o?"operation":"tool",ariaLabel:this._t("editor.tool_options",{tool:this._t("draw"===this._tool?"markup.add":"partition"===this._tool?"markup.partition":"column"===this._tool?"markup.column":"resize"===this._tool?"markup.resize":"wallthick"===this._tool?"markup.wallthick":"markup.boundary")}),content:j` + `}}const i="draw"===this._tool||"column"===this._tool,s="column"===this._tool?"markup.hint_column":"resize"===this._tool?"markup.hint_resize":"wallthick"===this._tool?"markup.hint_wallthick":"boundary"===this._tool?this._boundaryHintKey:null,n="draw"===this._tool?this._t(this._path.length?"markup.hint_points":"markup.hint_start",this._path.length?{n:this._path.length}:void 0):"";if(!i&&!s&&!n)return null;const o="draw"===this._tool&&this._path.length>0||"boundary"===this._tool&&!!this._openWallAnchor;return{contextId:t,kind:o?"operation":"tool",ariaLabel:this._t("editor.tool_options",{tool:this._t("draw"===this._tool?"markup.add":"column"===this._tool?"markup.column":"resize"===this._tool?"markup.resize":"wallthick"===this._tool?"markup.wallthick":"markup.boundary")}),content:j` ${i?this._renderDrawWallControl():G} ${n?j`${n}`:G} ${s?j`
-
`:j``}_openingAt(t){if(!this._openingsR.length)return null;const e=this._openingsR.flatMap(e=>{const i=e.angle*Math.PI/180,s=t[0]-e.rx,n=t[1]-e.ry,o=s*Math.cos(i)+n*Math.sin(i);return Math.abs(o)>e.rlen/2+12?[]:[{o:e,localY:-s*Math.sin(i)+n*Math.cos(i)}]});if(!e.length)return null;const i=this._spaceModel();if(!i)return null;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return e.find(({o:t,localY:e})=>{const i="gate"===t.type?!t.flip_v:t.flip_v,s=t.partitionHost||this._spaceWalls.length||"gate"===t.type?this._openingFace(t,n,!!i):{ox:0,oy:0,cm:0,side:-1},o=Yd({type:t.type,length:t.rlen,angle:t.angle,amount:this._openingAmt(t),flipH:!!t.flip_h,flipV:!!t.flip_v,cellCm:this._cellCm,gridPitch:this._gridPitch,face:s});return Math.abs(e)<=o.hitHalf})?.o||null}_resolveOpeningPlacement(t){const e=this._openingPreset;if("opening"!==this._tool||!e)return null;const i=this._spaceModel();if(!i)return null;const s=this._openCuts(),n=this._openingWallIndexFor(i,s),o=`${n.key}|partitions:${this._cfgEpoch}`;var a,r,l;this._openingPlacementIntervalsCache&&this._openingPlacementIntervalsCache.key===o||(this._openingPlacementIntervalsCache={key:o,value:[...Qr(i.rooms,this._spaceWalls,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_),...(a=i.partitions,r=this._cellCm,l=this._gridPitch,a.flatMap(t=>!Zh(t.a)||!Zh(t.b)||Math.hypot(t.b[0]-t.a[0],t.b[1]-t.a[1])<=1e-9?[]:[{roomId:"",a:[t.a[0],t.a[1]],b:[t.b[0],t.b[1]],key:`partition:${t.id}`,kind:"outer",cm:t.cm,open:!1,half:fr(t.cm,r,l)/2,partitionHost:{kind:"partition",id:t.id}}]))]});const c=Zp({pointer:[t[0],t[1]],preset:e,geometryRevision:this._cfgEpoch,renderedLength:this._cmToUnits(e.lengthCm),intervals:this._openingPlacementIntervalsCache.value,baseTolerance:1.5*this._gridPitch,bodyPointerPadding:this._cssPxToRender(this._boundaryCoarse?10:6),gridStep:this._gridPitch});this._openingJambBlockCm=c.jambBlockedTarget?c.jambBlockedTarget.physicalHalfWidth/this._gridPitch*this._cellCm:null;const h=c.candidate;if(!h)return null;const d="gate"===h.type?!h.flipV:h.flipV;let u;if(h.host){const t=ed({id:"preview",type:h.type,x:h.x/y_,y:h.y/y_,angle:h.angle,length:h.renderedLength/y_,host:h.host},i.partitions,y_,this._cellCm,this._gridPitch).resolved;u=t?od(t,d):{ox:0,oy:0,cm:0,side:-1}}else u=yl(n.value,{x:h.x,y:h.y,angle:h.angle,length:h.renderedLength,flip_v:d});const p="mi"===this.hass?.config?.unit_system?.length,_=_i([h.x,h.y],h.angle,h.renderedLength,i.rooms,this._gridPitch/2),g=(_?[{distance:_.sideA,midpoint:_.midA},{distance:_.sideB,midpoint:_.midB}]:h.measure.labels).map(t=>({x:t.midpoint[0],y:t.midpoint[1],text:li(t.distance/this._gridPitch*this._cellCm,p)}));return{...h,face:u,measure:{labels:g,guide:h.measure.guide}}}_activateOpeningPlacement(t){this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingPreset=function(t,e){return{type:t,lengthCm:Kp(t),flipH:!1,flipV:!1,revision:e}}(t,++this._openingPresetRevision),this._openingHoverCandidate=null,this._cursorPt=null)}_clearOpeningPlacement(t){this._openingHoverCandidate=null,this._openingJambBlockCm=null,t&&(this._openingPreset=null,this._openingRebindId=null)}_openingClick(t){const e=this._spaceModel();if(!e)return;const i=this._openingRebindId?null:this._openingAt(t);if(i)return void this._editOpening(i);const s=this._openingPreset;if(!s)return;const n=this._openingHoverCandidate,o=n&&Qp(n,[t[0],t[1]],s.revision,this._cfgEpoch)?n:this._resolveOpeningPlacement(t);if(!o){if(null!=this._openingJambBlockCm)return void this._showToast(this._t("opening.partition_jamb_margin",{distance:li(this._openingJambBlockCm,this._imperial)}));const i=1.5*this._gridPitch,s=pi(t,e.rooms,i);return s&&function(t,e,i,s,n){for(const o of s)if(!(Ns([t,e],o)>n)&&Pr([o[0],o[1]],[o[2],o[3]],i))return!0;return!1}(s.x,s.y,s.angle,this._openCuts(),i)?void this._showToast(this._t("toast.opening_on_virtual")):void this._showToast(this._t("toast.opening_no_wall"))}const a=this._openingRebindId?this._curSpaceCfg?.openings?.find(t=>t.id===this._openingRebindId):null;this._openingDialog={...a?{id:a.id,type:a.type,lengthCm:Math.round(a.length*y_/this._gridPitch*this._cellCm),lengthTouched:!1,contact:a.contact||"",lock:a.lock||"",invert:!!a.invert,flipH:!!a.flip_h,flipV:!!a.flip_v}:{type:o.type,lengthCm:o.lengthCm,contact:"",lock:"",invert:!1,flipH:o.flipH,flipV:o.flipV},...o.host?{host:o.host}:{},x:o.x,y:o.y,angle:o.angle},this._openingRebindId=null,this._openingHoverCandidate=null,this._cursorPt=null}_editOpening(t){this._openingDialog={id:t.id,type:t.type,lengthCm:Math.round(t.rlen/this._gridPitch*this._cellCm),lengthTouched:!1,contact:t.contact||"",lock:t.lock||"",invert:!!t.invert,flipH:!!t.flip_h,flipV:!!t.flip_v,...t.host?{host:{...t.host}}:{},x:t.rx,y:t.ry,angle:t.angle}}_opPointerDown(t,e){if("plan"===this._mode&&this._spaceModel()&&"resize"!==this._tool){t.preventDefault(),t.stopPropagation();try{C_(t)}catch{}this._opDrag={id:e.id,moved:!1,sx:t.clientX,sy:t.clientY,dirty:!1,before:this._geometrySnapshot()}}}_opPointerMove(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;if(Math.abs(t.clientX-this._opDrag.sx)+Math.abs(t.clientY-this._opDrag.sy)<=3)return;const i=this._spaceModel();if(!i)return;const s=this._svgPoint(t),n=this._curSpaceCfg,o=n?.openings?.find(t=>t.id===e.id);if(!o)return;if("partition"===o.host?.kind){const t=i.partitions.find(t=>t.id===o.host.id);if(!t)return;const e=t.b[0]-t.a[0],n=t.b[1]-t.a[1],a=Math.hypot(e,n);if(!(a>1e-9))return;const r=e/a,l=n/a;if(Math.abs((s[0]-t.a[0])*l-(s[1]-t.a[1])*r)>4*this._gridPitch)return;const c=o.length*y_/2+Qh(t,this._cellCm,this._gridPitch);let h=(s[0]-t.a[0])*r+(s[1]-t.a[1])*l;if(h=Math.round(h/this._gridPitch)*this._gridPitch,h=Math.max(c,Math.min(a-c,h)),a<2*c-1e-9)return;const d=h/a,u=(t.a[0]+r*h)/y_,p=(t.a[1]+l*h)/this._spaceH;let _=180*Math.atan2(n,e)/Math.PI;_>=90?_-=180:_<-90&&(_+=180);const g=o.host.t!==d||o.x!==u||o.y!==p||o.angle!==_;return this._opDrag.moved=!0,g&&(this._opDrag.dirty=!0),o.host={...o.host,t:d},o.x=u,o.y=p,o.angle=_,this._opMeasure=null,g&&this._cfgEpoch++,void this.requestUpdate()}const a=pi(s,i.rooms,4*this._gridPitch);if(!a)return;this._opDrag.moved=!0;const r=this._opRuler(a,o.length*y_);this._opMeasure=r.measure;const l=r.x/y_,c=r.y/this._spaceH,h=o.x!==l||o.y!==c||o.angle!==a.angle;h&&(this._opDrag.dirty=!0),o.x=l,o.y=c,o.angle=a.angle,h&&this._cfgEpoch++,this.requestUpdate()}_opRuler(t,e){const i=this._spaceModel()?.rooms||[],s=this._gridPitch/2;let n=t.x,o=t.y,a=_i([n,o],t.angle,e,i,s);if(a&&a.centered&&(n!==a.wallCenter[0]||o!==a.wallCenter[1]))[n,o]=a.wallCenter,a=_i([n,o],t.angle,e,i,s);else if(a){const[r,l]=a.wallA,[c,h]=a.wallB,d=c-r,u=h-l,p=Math.hypot(d,u);if(p>0){const c=this._gridPitch,h=Math.min(e/2,p/2);let _=Math.round(((n-r)*d+(o-l)*u)/p/c)*c;_=Math.max(h,Math.min(p-h,_)),n=r+_/p*d,o=l+_/p*u,a=_i([n,o],t.angle,e,i,s)||a}}if(!a)return{x:n,y:o,angle:t.angle,measure:null};const r="mi"===this.hass?.config?.unit_system?.length,l=(t,e)=>({x:e[0],y:e[1],text:li(t/this._gridPitch*this._cellCm,r)});return{x:n,y:o,angle:t.angle,measure:{labels:[l(a.sideA,a.midA),l(a.sideB,a.midB)],guide:a.centered?{x:a.wallCenter[0],y:a.wallCenter[1],angle:t.angle}:null}}}_opPointerUp(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;const i=this._opDrag,s=i.moved;this._opMeasure=null,s&&i.dirty&&(this._recordGeometry(this._t("history.move_opening"),i.before),this._saveConfig()),s?window.setTimeout(()=>this._opDrag=null,0):this._opDrag=null}_opClick(t,e){"plan"===this._mode&&"resize"===this._tool||(t.stopPropagation(),this._opDrag?.moved||"plan"===this._mode&&this._editOpening(e))}_saveOpening(){const t=this._openingDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=this._geometrySnapshot(),n=this._spaceH,o=(e.openings||[]).find(e=>e.id===t.id),a={...o||{},id:t.id||"o"+Date.now().toString(36),type:t.type,x:t.x/y_,y:t.y/n,angle:t.angle,length:o&&!t.lengthTouched?o.length:this._cmToUnits(Math.max(20,t.lengthCm))/y_,...t.host?{host:{...t.host}}:{}};if(a.host){const t=sd(o,a)?id(a,i.partitions,y_,this._cellCm,this._gridPitch):ed(a,i.partitions,y_,this._cellCm,this._gridPitch);if(!t.resolved){const e=i.partitions.find(t=>t.id===a.host.id);if("does-not-fit-jamb"===t.reason&&e){const t=Qh(e,this._cellCm,this._gridPitch);this._showToast(this._t("opening.partition_jamb_margin",{distance:li(t/this._gridPitch*this._cellCm,this._imperial)}))}else this._showToast(this._t("opening.partition_orphan"));return}const s=(e.openings||[]).flatMap(t=>{if(!t.host||t.id===a.id)return[];const e=ed(t,i.partitions,y_,this._cellCm,this._gridPitch).resolved;return e?[e]:[]});if(function(t,e,i=1e-9){const s=t.length/(2*t.axis.length),n=t.t-s,o=t.t+s;return e.some(e=>{if(e.host.id!==t.host.id||e.opening.id===t.opening.id)return!1;const s=e.length/(2*e.axis.length);return Math.max(n,e.t-s)t.id===a.id);r>=0?e.openings[r]=a:e.openings.push(a),this._recordGeometry(this._t(t.id?"history.edit_opening":"history.add_opening"),s),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_deleteOpening(){const t=this._openingDialog,e=this._curSpaceCfg;if(!t?.id||!e?.openings)return;const i=this._geometrySnapshot();e.openings=e.openings.filter(e=>e.id!==t.id),this._recordGeometry(this._t("history.delete_opening"),i),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_contactCandidates(){const t=[];for(const e of Object.keys(this.hass.states)){if(!this._openingEntityAvailable(e))continue;const i=e.split(".")[0];if("binary_sensor"!==i&&"cover"!==i)continue;const s=this.hass.states[e],n=["door","window","opening","garage_door","garage"].includes(s?.attributes?.device_class||"");("cover"!==i||n)&&t.push([e,s?.attributes?.friendly_name||e,n?0:1])}return t.sort((t,e)=>t[2]-e[2]||t[1].localeCompare(e[1])).map(([t,e])=>({value:t,label:e}))}_lockCandidates(){return Object.keys(this.hass.states).filter(t=>t.startsWith("lock.")&&this._openingEntityAvailable(t)).map(t=>({value:t,label:this.hass.states[t]?.attributes?.friendly_name||t})).sort((t,e)=>t.label.localeCompare(e.label))}_mergeClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms,s=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!s?.id)return;const n=s.id;if(!this._mergeSel||this._mergeSel===n)return void(this._mergeSel=this._mergeSel===n?null:n);const o=i.find(t=>t.id===this._mergeSel),a=o?hi(o):null,r=hi(s),l=a&&r?function(t,e){if(!t||!e||t.length<3||e.length<3)return null;const i=si(Ri(t),Ri(e));if(1!==i.length)return null;if(1!==i[0].length)return null;const s=i[0][0].slice(0,-1).map(t=>[t[0],t[1]]);return s.length>=3?s:null}(a,r):null;if(!l)return this._showToast(this._t("toast.merge_not_adjacent")),void(this._mergeSel=null);this._mergeDialog={aId:this._mergeSel,bId:n,poly:l,pick:"a"},this._mergeSel=null}_commitMerge(){const t=this._mergeDialog,e=this._curSpaceCfg;if(!t||!e||!this._spaceModel())return;const i=this._geometrySnapshot(),s=this._spaceH,n="a"===t.pick?t.aId:t.bId,o="a"===t.pick?t.bId:t.aId,a=e.rooms.find(t=>t.id===n);a?(a.poly=t.poly.map(t=>[t[0]/y_,t[1]/s]),delete a.x,delete a.y,delete a.w,delete a.h,e.rooms=e.rooms.filter(t=>t.id!==o),this._commitOpenSpans(),this._recordGeometry(this._t("history.merge_rooms"),i),this._saveConfig(),this._mergeDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.rooms_merged",{name:a.name||""}))):this._mergeDialog=null}_splitClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms;if(!this._splitSel){const e=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!e?.id)return;return void(this._splitSel={roomId:e.id,pts:[]})}const s=i.find(t=>t.id===this._splitSel.roomId),n=s?hi(s):null;if(!s||!n)return void(this._splitSel=null);const o=.02*this._gridPitch,a=6*this._gridPitch,r=function(t,e){if(!e||e.length<2)return null;let i=null,s=1/0;for(let n=0;n=n)continue;n=_;const g=Math.sqrt(u),m=(i>0?Math.max(0,Math.min(g,Math.round(p*g/i)*i)):p*g)/g;s=[a+m*h,r+m*d]}return s}(r,n,this._gridPitch)||r,c=r&&l&&Math.hypot(r[0]-t[0],r[1]-t[1])<=a?l:null,h=!!c&&bi(c,n,o),d=this._splitSel.pts;if(!d.length)return h?void(this._splitSel={...this._splitSel,pts:[c]}):void this._showToast(this._t("toast.split_pick_wall"));if(!h){const e=this._snap(t);return wi(e,n,o)?void(this._splitSel={...this._splitSel,pts:[...d,e]}):void this._showToast(this._t("toast.split_pick_inside"))}const u=Ei(n,[...d,c],o);if(!u)return void this._showToast(this._t("toast.split_bad_cut"));this._resetRoomDialogFields();const[p,_]=u,g=Pi(p)>=Pi(_)?p:_,m=g===p?_:p;this._pendingSplit={roomId:s.id,mainPoly:g,newPoly:m},this._cursorPt=null,this._nameSel="",this._areaSel="",this._roomDialog=!0}get _contourClosed(){return this._path.length>=4&&this._samePt(this._path[0],this._path[this._path.length-1])&&(null!=this._closingWallCm||!this._activeDraftId)}_markupMove(t){if(!this._markup)return;const e=t.pointerType;if(e&&(this._boundaryPointerType=e),"column"===this._tool)return void(this._cursorPt=this._snap(this._svgPoint(t)));if("opening"===this._tool||"boundary"===this._tool||"wallthick"===this._tool)return void(this._cursorPt=this._svgPoint(t));const i=("draw"===this._tool||"partition"===this._tool)&&!this._contourClosed,s="split"===this._tool&&!!this._splitSel?.pts?.length;if(!i&&!s)return;const n=this._svgPoint(t);if(i){const e=this._resolvePlanDrawPoint(n,t.shiftKey);return this._planSnapHover={contextKey:e.contextKey,candidate:e.candidate},this._path.length?void(this._cursorPt=e.point):void this._syncPlanSnapActiveMarker(e.candidate)}this._cursorPt=this._snap(n)}get _openingPreview(){const t=this._openingPreset;if("opening"!==this._tool||!t||!this._cursorPt)return null;const e=this._cursorPt,i=this._openingHoverCandidate;if(i&&Qp(i,[e[0],e[1]],t.revision,this._cfgEpoch))return i;if(this._openingAt(e))return this._openingHoverCandidate=null,null;const s=this._resolveOpeningPlacement(e);return this._openingHoverCandidate=s,s}get _opMeasureView(){return this._opMeasure||this._openingPreview?.measure||null}_saveRoom(){(this._areaSel||this._nameSel.trim())&&(this._wallFaceBatch?this._decideWallFace(!0):this._commitRoom())}_decideWallFace(t){const e=this._wallFaceBatch;if(!e)return;const i=e.candidates[e.index];if(!i)return;const s=t?{candidate:i,create:!0,name:this._nameSel.trim(),area:this._areaSel||null,settings:this._roomSettingsFromDialog()?JSON.parse(JSON.stringify(this._roomSettingsFromDialog())):null}:{candidate:i,create:!1},n=[...e.decisions,s],o=e.index+1;if(o"number"==typeof t&&Number.isFinite(t)&&t>=0?t:null,n=.02*this._gridPitch,o=this._spaceModel();if(!o)return pr;for(const e of this._planSnapGeometrySnapshot().value.segments){if("room"===e.sourceKind||Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])>n)continue;if("partition"===e.sourceKind)return s(o.partitions.find(t=>t.id===e.sourceId)?.cm)??pr;const i=e.sourceId.lastIndexOf(":"),a=i>=0?e.sourceId.slice(0,i):e.sourceId,r=i>=0?Number(e.sourceId.slice(i+1)):-1;return s(o.room_drafts.find(t=>t.id===a)?.segments[r]?.cm)??pr}for(let o=0;o+1{this._showToast(this._t(t,e)),this._roomDialogCancel()},n=t.decisions.filter(t=>t.create),o=n.map(t=>t.candidate.ring),a=i.rooms;for(let t=0;ti.id!==e&&!!hi(i)&&Di(o[t],hi(i)));if(i)return void s("toast.room_overlap",{name:i.name||""})}if((e.rooms||[]).length+n.length>400)return void s("toast.physical_limit");if(n.some(t=>t.candidate.split&&!e.rooms.some(e=>e.id===t.candidate.split.roomId)))return void s("toast.contour_cannot_close");const r=2e-4*this._gridPitch,l=new Map;for(let e=0;et.candidate.atomKeys)),i=n.some(t=>t.candidate.consumeAllActive);for(const s of Bd(this._wallGraphSources(t.activePath),r)){const t=s.sourceKeys.find(t=>l.has(t));!t||i||e.has(s.key)||c.push({a:s.a,b:s.b,cm:l.get(t)})}}else c.push(...bd(t.activePath,t.activeCms,pr));if((e.partitions||[]).length+c.length>$_)return void s("toast.physical_limit");const h=this._geometrySnapshot(),d=n.some(t=>!!t.candidate.split),u=d?tl(i.rooms,e.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,p=d&&Array.isArray(e.walls)?e.walls:null;for(const t of n){const i=t.candidate.split;if(!i)continue;const n=e.rooms.find(t=>t.id===i.roomId);if(!n)return void s("toast.contour_cannot_close");n.poly=i.mainPoly.map(t=>[t[0]/y_,t[1]/this._spaceH]),delete n.x,delete n.y,delete n.w,delete n.h}const _=Date.now().toString(36),g=[];if(n.forEach((t,i)=>{const s=t.area?this.hass.areas[t.area]?.name:"",n={id:`r${_}-${i}`,name:t.name||s||this._t("room.default_name"),area:t.area||null,poly:t.candidate.ring.map(t=>[t[0]/y_,t[1]/this._spaceH]),...t.settings?{settings:JSON.parse(JSON.stringify(t.settings))}:{}};e.rooms.push(n),g.push({room:n,decision:t})}),t.activeDraftId&&Array.isArray(e.room_drafts)&&(e.room_drafts=e.room_drafts.filter(e=>e.id!==t.activeDraftId),e.room_drafts.length||delete e.room_drafts),c.length&&(e.partitions||=[],c.forEach((t,i)=>e.partitions.push({id:`partition-${_}-${i}`,a:[t.a[0]/y_,t.a[1]/y_],b:[t.b[0]/y_,t.b[1]/y_],cm:t.cm}))),d){this._commitOpenSpans();const t=this._normalizeWalls(u,this._openCuts());t.length?e.walls=t:p?.length?e.walls=p:delete e.walls}if(g.length){this._cfgEpoch++;const i=this._openCuts(),s=this._spaceModel();if(!s)return;let n=e.walls;for(const{room:e,decision:o}of g){const a=o.candidate.ring,r=this._wallSourceCmAt(a[0],t.activePath,t.activeCms);n=Er(n,s.rooms,e.id,r,this._wallKeyPitch,i,y_);for(const o of Qr(s.rooms,n,i,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(o.roomId!==e.id||"outer"!==o.kind)continue;const i=[(o.a[0]+o.b[0])/2,(o.a[1]+o.b[1])/2];n=Ar(n,o.a,o.b,this._wallSourceCmAt(i,t.activePath,t.activeCms),this._wallKeyPitch,y_)}}const o=this._normalizeWalls(n,i);o.length?e.walls=o:delete e.walls}this._recordGeometry(this._t("history.wall_face_batch"),h),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._wallFaceBatch=null,this._roomDialog=!1,this._nameSel="",this._areaSel="",this._regSignature="",this._maybeRebuildDevices();const m=new Set(n.map(t=>t.area).filter(t=>!!t));if(m.size){const t={...this._layout};for(const e of this._devices){if(!m.has(e.area||"")||e.space!==this._space)continue;if(this._layout[e.id])continue;const i=this._defPos[e.id];i&&(t[e.id]={s:this._space,x:i.x/y_,y:i.y/y_},this._dirtyPos.add(e.id))}this._layout=t,this._persistLayout()}this._showToast(this._t(n.length?"toast.wall_rooms_saved":"toast.wall_chain_saved",{n:n.length}))}_commitRoom(){const t=this._curSpaceCfg,e=this._spaceModel();if(!t||!e)return;const i=this._geometrySnapshot(),s=this._spaceH,n=!!this._pendingSplit,o=n?tl(e.rooms,t.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,a=n&&Array.isArray(t.walls)?t.walls:null;let r;if(this._pendingSplit){const e=t.rooms.find(t=>t.id===this._pendingSplit.roomId);if(!e)return this._pendingSplit=null,this._splitSel=null,void(this._roomDialog=!1);e.poly=this._pendingSplit.mainPoly.map(t=>[t[0]/y_,t[1]/s]),delete e.x,delete e.y,delete e.w,delete e.h,r=this._pendingSplit.newPoly}else{if(!this._contourClosed)return;r=this._path.slice(0,-1)}const l=this._areaSel?this.hass.areas[this._areaSel]?.name:"",c={id:"r"+Date.now().toString(36),name:this._nameSel||l||this._t("room.default_name"),area:this._areaSel||null,poly:r.map(t=>[t[0]/y_,t[1]/s]),...this._roomSettingsFromDialog()?{settings:this._roomSettingsFromDialog()}:{}};if(t.rooms.push(c),!n&&this._activeDraftId&&Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),n){this._commitOpenSpans();const e=this._normalizeWalls(o,this._openCuts());e.length?t.walls=e:a?.length?t.walls=a:delete t.walls}if(!n){const e=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr],i=e[0]||this._drawWallCm;if(null!=i){this._cfgEpoch++;const s=this._openCuts(),n=this._spaceModel();if(!n)return;let o=Er(t.walls,n.rooms,c.id,i,this._wallKeyPitch,s,y_);for(const t of Qr(n.rooms,o,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(t.roomId!==c.id||"outer"!==t.kind)continue;const s=[(t.a[0]+t.b[0])/2,(t.a[1]+t.b[1])/2],n=r.findIndex((t,e)=>{const i=r[(e+1)%r.length];return Ns(s,[t[0],t[1],i[0],i[1]])<=.02*this._gridPitch});n>=0&&(o=Ar(o,t.a,t.b,e[n]||i,this._wallKeyPitch,y_))}o=this._normalizeWalls(o,s),o.length?t.walls=o:delete t.walls}}this._recordGeometry(this._t(n?"history.split_room":"history.add_room"),i),this._saveConfig(),this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._pendingSplit=null,this._splitSel=null;const h=this._areaSel;this._areaSel="",this._nameSel="",this._roomDialog=!1,this._regSignature="",this._maybeRebuildDevices();let d=0;if(h){const t=y_,e={...this._layout};for(const i of this._devices){if(i.area!==h||i.space!==this._space)continue;if(d++,this._layout[i.id])continue;const s=this._defPos[i.id];s&&(e[i.id]={s:this._space,x:s.x/y_,y:s.y/t},this._dirtyPos.add(i.id))}this._layout=e,this._persistLayout()}const u=this._model.find(t=>t.id===this._space)?.rooms.length||0;this._showToast(h?this._t("toast.room_saved",{n:u,added:d}):this._t("toast.room_saved_no_area",{n:u}))}_cancelPath(){this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),this._roomDialog=!1,this._pendingSplit=null,this._wallFaceBatch=null,this._splitSel=null,this._mergeSel=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._clearOpeningPlacement(!0)}_resumeLastDraft(){const t=this._resumeDraftBySpace[this._space];if(!t)return;const e=this._spaceModel()?.room_drafts.find(e=>e.id===t);e?(this._activeDraftId=t,this._path=e.points.map(t=>[...t]),this._draftSegmentCms=e.segments.map(t=>t.cm),this._clearPlanSnapHover()):delete this._resumeDraftBySpace[this._space]}_roomDialogCancel(){if(this._roomDialog=!1,this._roomEditId)return this._roomEditId=null,this._nameSel="",void(this._areaSel="");if(this._wallFaceBatch){const t=this._wallFaceBatch;return this._wallFaceBatch=null,this._path=t.activePath.map(t=>[...t]),this._draftSegmentCms=[...t.activeCms],this._activeDraftId=t.activeDraftId,this._nameSel="",this._areaSel="",void this.requestUpdate()}if(this._pendingSplit)return this._pendingSplit=null,void(this._splitSel=null);this._undoPoint()}get _freeAreas(){const t=new Set;for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area&&t.add(i.area);for(const e of this._wallFaceBatch?.decisions||[])e.create&&e.area&&t.add(e.area);return Object.values(this.hass?.areas||{}).filter(e=>!t.has(e.area_id)).sort((t,e)=>(t.name||"").localeCompare(e.name||""))}_openMarkerDialog(t){if(this._vacAllCamerasFor=null,this._vacAllCameraCache=null,t&&this._ackNewDevice(t.id),this._norm)if(t){const e=t.marker,i=Object.prototype.hasOwnProperty.call(e||{},"is_light"),s=Object.prototype.hasOwnProperty.call(e||{},"light_entity"),n=Object.prototype.hasOwnProperty.call(e||{},"glow_color"),o=Object.prototype.hasOwnProperty.call(e||{},"value_badge"),a=Object.prototype.hasOwnProperty.call(e||{},"tap_action"),r=Object.prototype.hasOwnProperty.call(e||{},"toggle_entity"),l=ks(e?.glow_color),c=this._devicePresentation(t,!0).valueBadge,h=Bo(this._planHass,t,this._devices),d=qo(this._planHass,t,h);this._markerDialog={devId:t.id,name:t.name,binding:"virtual"===t.bindingKind?"virtual":t.bindingKind+":"+t.bindingRef,bindingMode:"virtual"===t.bindingKind?"virtual":"ha",bindingOpen:!1,showEntities:"entity"===t.bindingKind&&!!this._fullRegistryHass.entities[t.bindingRef||""]?.device_id,bindingFilter:"",icon:t.marker?.icon||"",autoIcon:t.icon||"",display:Bi(t.marker?.display),rippleColor:Rt(t.marker?.ripple_color,""),rippleSize:Number(t.marker?.ripple_size)>0?Number(t.marker.ripple_size):3,size:Number(t.marker?.size)>0?Number(t.marker.size):1,angle:Number(t.marker?.angle)||0,tapAction:Wh(t.marker?.tap_action,t.primary?.split(".")[0]),tapActionTouched:!1,originalHasTapAction:a,originalTapAction:t.marker?.tap_action,tapHintAnnouncement:"",toggleEntity:e?.toggle_entity||"",toggleEntityTouched:!1,originalHasToggleEntity:r,originalToggleEntity:e?.toggle_entity,tapTarget:t.marker?.tap_target||"",tapConfirm:!0===t.marker?.tap_confirm,runFilter:"",controls:Xn(t.marker?.binding,t.marker?.controls,t.entities),controlsFilter:"",lightRole:!0===e?.is_light?"always":!1===e?.is_light?"never":"auto",lightRoleTouched:!1,originalHasIsLight:i,originalIsLight:e?.is_light,lightEntity:e?.light_entity||"",lightEntityTouched:!1,originalHasLightEntity:s,originalLightEntity:e?.light_entity,glowMode:null!=l?.bri?"fixed":l?"color":"auto",glowColor:l?.c||this._fillColors.glow_light.c,glowBrightness:Math.max(1,Math.round(100*(l?.bri??1))),glowColorDrafted:!!l,glowBrightnessDrafted:null!=l?.bri,glowTouched:!1,originalHasGlowColor:n&&(!!l||null===e?.glow_color),originalGlowColor:l||(null===e?.glow_color?null:void 0),valueBadgeEnabled:o?!0===e?.value_badge?.enabled:!!c,valueBadgeSource:e?.value_badge?.source||c?.source||d,valueBadgePosition:e?.value_badge?.position||c?.position||"right",valueBadgeTouched:!1,originalHasValueBadge:o,originalValueBadge:e?.value_badge,useClimateTemp:!0===t.marker?.use_climate_temp,glowRadius:Number(t.marker?.glow_radius_cm)>0?String(this._imperial?Math.round(Number(t.marker.glow_radius_cm)/30.48*10)/10:Math.round(Number(t.marker.glow_radius_cm))/100):"",model:t.model||"",link:t.link||"",description:t.description||"",pdfs:[...t.pdfs||[]],room:t.marker?.room_id?t.space+"#@"+t.marker.room_id:t.space&&t.area?t.space+"#"+t.area:"",hideFromPlan:!0===t.marker?.hidden,busy:!1}}else this._markerDialog={name:"",binding:"virtual",bindingMode:"virtual",bindingOpen:!1,showEntities:!1,bindingFilter:"",icon:"",autoIcon:"",display:"badge",rippleColor:"",rippleSize:3,size:1,angle:0,tapAction:"info",tapActionTouched:!1,originalHasTapAction:!1,originalTapAction:void 0,tapHintAnnouncement:"",toggleEntity:"",toggleEntityTouched:!1,originalHasToggleEntity:!1,originalToggleEntity:void 0,tapTarget:"",tapConfirm:!1,runFilter:"",controls:[],controlsFilter:"",lightRole:"auto",lightRoleTouched:!1,originalHasIsLight:!1,originalIsLight:void 0,lightEntity:"",lightEntityTouched:!1,originalHasLightEntity:!1,originalLightEntity:void 0,glowMode:"auto",glowColor:this._fillColors.glow_light.c,glowBrightness:100,glowColorDrafted:!1,glowBrightnessDrafted:!1,glowTouched:!1,originalHasGlowColor:!1,originalGlowColor:void 0,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgePosition:"right",valueBadgeTouched:!1,originalHasValueBadge:!1,originalValueBadge:void 0,useClimateTemp:!1,glowRadius:"",model:"",link:"",description:"",pdfs:[],room:"",hideFromPlan:!1,busy:!1,uploadId:"up_"+Date.now().toString(36)+Math.random().toString(36).slice(2,6)};else this._showToast(this._t("toast.marker_needs_server"))}_runCandidates(){const t=[];for(const e of Gi)for(const[i,s]of Object.entries(this.hass.states))i.startsWith(e+".")&&this._planEntityAvailable(i)&&t.push({value:i,label:s?.attributes?.friendly_name||i,sub:this._t("run."+e)});return t.sort((t,e)=>t.sub.localeCompare(e.sub)||t.label.localeCompare(e.label))}_bindingCandidates(){const t=this._planHass,e=yo(this._markers),i=new Set(this._markers.filter(t=>t.removed).map(t=>t.binding)),s=new Set;for(const t of this._devices)t.id!==this._markerDialog?.devId&&("device"===t.bindingKind&&t.bindingRef&&s.add("device:"+t.bindingRef),"entity"===t.bindingKind&&t.bindingRef&&s.add("entity:"+t.bindingRef));const n=new Set;for(const t of this._devices)"device"===t.bindingKind&&t.name&&n.add(t.name.trim()+"|"+(t.area||""));const o=[];for(const e of Object.values(t.devices)){if("service"===e.entry_type)continue;const t="device:"+e.id;if(s.has(t))continue;const a=(e.name_by_user||e.name||e.id).trim();t!==this._markerDialog?.binding&&!i.has(t)&&n.has(a+"|"+(e.area_id||""))||o.push({value:t,label:a,sub:(e.model||this._t("marker.sub_device"))+("Group"===e.model?this._t("marker.sub_z2m_group"):"")})}const a=new Set(["group","template","derivative","min_max","threshold","integration","statistics","trend","utility_meter","tod","switch_as_x","schedule"]);for(const[n,r]of Object.entries(t.entities)){const l="entity:"+n;if(s.has(l))continue;if(bo(t,n,e)&&!i.has(l))continue;const c=a.has(r.platform),h="group"===r.platform;if(!c&&!h)continue;if(r.hidden&&!i.has(l))continue;const d=t.states[n];o.push({value:l,label:r.name||d?.attributes?.friendly_name||n,sub:n.split(".")[0]+" · "+("group"===r.platform?this._t("marker.sub_group"):this._t("marker.sub_helper"))})}if(this._markerDialog?.showEntities){const n=new Set(o.map(t=>t.value));for(const[a,r]of Object.entries(t.entities)){const l="entity:"+a;if(s.has(l)||n.has(l)||r.hidden&&!i.has(l))continue;if(bo(t,a,e)&&!i.has(l))continue;const c=t.states[a],h=r.name||c?.attributes?.friendly_name||a,d=r.device_id?t.devices[r.device_id]:null,u=d&&(d.name_by_user||d.name)||"";o.push({value:l,label:h,sub:a.split(".")[0]+" · "+this._t("marker.sub_entity")+(u?" · "+u:"")})}}const r=(this._markerDialog?.bindingFilter||"").toLowerCase().trim(),l=r?o.filter(t=>(t.label+" "+t.sub+" "+t.value).toLowerCase().includes(r)):o;return l.sort((t,e)=>t.label.localeCompare(e.label)),l.slice(0,200)}_physicalBodiesR(t=this._spaceModel()){if(!t)return[];const e=`${t.id}|${this._cfgEpoch}|${this._cellCm}|${this._gridPitch}`;if(this._physicalBodiesCache?.key===e)return this._physicalBodiesCache.all;const i=Rl(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t));return this._physicalBodiesCache={key:e,...i},i.all}_rawPhysicalBodiesR(t=this._spaceModel()){if(!t)return[];this._physicalBodiesR(t);const e=this._physicalBodiesCache;return e?[...e.drafts,...e.partitions,...e.columns]:[]}_cleanFloor(t,e,i=this._spaceModel()){if(!i)return{floor:e,geom:null,path:"",area:zl([[[...e,e[0]]]])};const s=t.id||`#${i.rooms.indexOf(t)}`,n=`${i.id}|${this._cfgEpoch}|${s}`;if(!this._rszPreview){const t=r_(this._cleanFloorCache,n);if(t.hit)return t.value}const o=e.map(t=>t[0]),a=e.map(t=>t[1]),r=[Math.min(...o),Math.min(...a),Math.max(...o),Math.max(...a)],l=this._physicalBodiesR(i).filter(t=>{const e=t.map(t=>t[0]),i=t.map(t=>t[1]);return Math.max(...e)>=r[0]&&Math.min(...e)<=r[2]&&Math.max(...i)>=r[1]&&Math.min(...i)<=r[3]}),c=l.length?Fl(e,l):null,h={floor:e,geom:c,path:c?Cl(c):"",area:zl(c||[[[...e,e[0]]]])};return this._rszPreview||l_(this._cleanFloorCache,n,h,600),h}_autoIconForBinding(t){if("virtual"===t)return"mdi:map-marker";const[e,i]=t.split(":");if(!i)return"";const s=this._fullRegistryHass,n=this._bindingStatus(t),o="active"===n.kind?n.enabledEntityIds:n.allEntityIds;if("device"===e){const t=s.devices?.[i];if(!t)return"mdi:help-circle";const e=o;return e.some(t=>t.startsWith("lock."))?"mdi:lock":vo(s,t.name_by_user||t.name||"",t.model,e,this._iconRules)}if("entity"===e){const t=s.entities?.[i],e=this.hass.states?.[i],n=t?.name||e?.attributes?.friendly_name||i;return i.startsWith("lock.")?"mdi:lock":vo(s,n,"",[i],this._iconRules)}return""}_allRoomsFlat(){const t=[];for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area?t.push({value:e.id+"#"+i.area,label:(e.title||e.id)+" · "+i.name}):i.id&&t.push({value:e.id+"#@"+i.id,label:(e.title||e.id)+" · "+i.name+" · "+this._t("marker.subarea")});return t}_errText(t){if(!t)return this._t("err.unknown");if("string"==typeof t)return t;if("invalid_passage_fields"===t.code){const e=String(t.message||t.error||"").match(/space=([^;]*);\s*opening=([^;]*);\s*fields=([^;]*)/);if(e){const t=this._serverCfg?.spaces?.find(t=>String(t.id)===e[1]),i={contact:"opening.contact_label",lock:"opening.lock_label",invert:"opening.invert",flip_h:"opening.flip_h",flip_v:"opening.flip_v"},s=e[3].split(",").filter(Boolean).map(t=>i[t]?this._t(i[t]):t).join(", ");return this._t("opening.invalid_passage_fields",{room:t?.title||e[1],fields:s})}}if("invalid_partition_opening_jamb_margin"===t.code){const e=String(t.message||t.error||"").match(/margin_cm=([^;]*)/),i=e?Number(e[1]):NaN;if(Number.isFinite(i))return this._t("opening.partition_jamb_margin",{distance:li(i,this._imperial)})}if(t.message)return t.message;if(t.error)return t.error;if(null!=t.code)return this._t("err.code",{code:t.code});try{return JSON.stringify(t)}catch{return String(t)}}_backupErrorText(t){const e=t?.code??t?.error;if("string"==typeof e){const t=`backup.error.${e}`,i=this._t(t);if(i!==t)return i}return this._errText(t)}async _pickMarkerFiles(t){const e=t.target,i=e.files?[...e.files]:[];if(e.value="",!i.length||!this._markerDialog)return;const s=this._markerDialog.uploadId||this._markerDialog.devId||"new",n=[];for(const t of i)try{const e=new FormData;e.append("marker_id",s),e.append("file",t,t.name);const i=this.hass?.fetchWithAuth?await this.hass.fetchWithAuth("/api/houseplan/upload",{method:"POST",body:e}):await fetch("/api/houseplan/upload",{method:"POST",body:e,headers:this.hass?.auth?.data?.access_token?{authorization:`Bearer ${this.hass.auth.data.access_token}`}:{}}),o=await i.json().catch(()=>({}));if(!i.ok||o.error){const t={too_large:this._t("err.too_large",{mb:o.max_mb||50}),bad_ext:this._t("err.bad_ext"),unauthorized:this._t("err.unauthorized")};throw new Error(t[o.error]||o.error||"HTTP "+i.status)}n.push({name:o.name||t.name,url:o.url})}catch(e){this._showToast(this._t("toast.file_failed",{name:t.name,err:this._errText(e)}))}n.length&&this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:[...this._markerDialog.pdfs,...n]},this._showToast(this._t("toast.files_attached",{n:n.length})))}_removeMarkerPdf(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:this._markerDialog.pdfs.filter(e=>e.url!==t)})}_markerLightFields(t){const e={};if(t.lightRoleTouched?"always"===t.lightRole?e.is_light=!0:"never"===t.lightRole&&(e.is_light=!1):t.originalHasIsLight&&(e.is_light=t.originalIsLight??null),t.lightEntityTouched?t.lightEntity&&(e.light_entity=t.lightEntity):t.originalHasLightEntity&&(e.light_entity=t.originalLightEntity??null),t.glowTouched){if("auto"!==t.glowMode){const i={c:Rt(t.glowColor,this._fillColors.glow_light.c)};"fixed"===t.glowMode&&(i.bri=Math.max(.01,Math.min(1,Math.round(t.glowBrightness)/100))),e.glow_color=i}}else t.originalHasGlowColor&&(e.glow_color=t.originalGlowColor??null);return e}_markerTapActionFields(t){return t.tapActionTouched?{tap_action:t.tapAction||null}:t.originalHasTapAction?{tap_action:t.originalTapAction??null}:{}}_markerToggleEntityFields(t){return(e={touched:t.toggleEntityTouched,originalHas:t.originalHasToggleEntity,original:t.originalToggleEntity,value:t.toggleEntity}).touched?e.value?{toggle_entity:e.value}:{}:e.originalHas?{toggle_entity:e.original??null}:{};var e}async _saveMarker(){const t=this._markerDialog;if(!t||t.busy)return;const e=this._effectiveMarkerTapAction(t);if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return;if("virtual"===t.binding&&!t.name.trim())return void this._showToast(this._t("toast.virtual_name_required"));if("run"===e&&!t.tapTarget)return void this._showToast(this._t("toast.run_target_required"));if(t.valueBadgeTouched&&t.valueBadgeEnabled&&!t.valueBadgeSource)return void this._showToast(this._t("toast.value_badge_source_required"));if("ha"===t.bindingMode){const e=this._bindingStatus(t.binding),i=t.devId?this._markers.find(e=>e.id===t.devId):null,s=!i||i.binding!==t.binding;if("active"!==e.kind&&s)return void this._showToast(this._t("ha_disabled"===e.kind?"toast.ha_disabled_add":"toast.ha_binding_unverified"));if("ha_disabled"===e.kind&&!0===i?.hidden&&!t.hideFromPlan)return this._markerDialog={...t,hideFromPlan:!0},void this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device"))}const i=this._serverCfg;if(!i)return;const s=i.markers||[],n=qs(t.room);let o=n?.space||null;const a=n?.area||null,r=n?.roomId||null,l=Fi(t.binding,t.devId,()=>"v_"+Date.now().toString(36)),c=t.devId,h=c?this._devices.find(t=>t.id===c):null,d=n?.space||h?.space||null,u=d?this._spaceModelById(d):this._spaceModel();if(!u)return;const p=u.id;"virtual"!==t.binding||o||(o=p),this._markerDialog={...t,busy:!0};try{const n="virtual"===t.binding?[]:s.filter(e=>e.removed&&e.binding===t.binding).map(t=>t.id),d=n.length>0,_=Xn(t.binding,t.controls,this._bindingEntities(t.binding)),g=s.find(t=>t.id===l||t.id===c)?.vacuum||null,m={id:l,vacuum:g,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&3!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle?t.angle:null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===e&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:_.length?_:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=a_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:!!t.hideFromPlan};("virtual"===t.binding||t.room)&&(m.space=o,m.area=a,m.room_id=r);const f=h?.marker?.room_id??null,v=!!t.room&&null!=h&&(h.space!==o||h.area!==a||f!==r);let y=!1;const b=t.uploadId||c;if(b&&b!==l&&m.pdfs?.length)try{const t=await this.hass.callWS({type:"houseplan/files/migrate",from_id:b,to_id:l}),e=t?.mapping||{};m.pdfs=function(t,e,i,s){if(!e||!i||e===i)return t;const n="/files/"+e+"/",o="/files/"+i+"/";return t.map(t=>{if(!t.url.includes(n))return t;const e=t.url.split(n)[1]||"",[i,a]=[e.split("?")[0],e.includes("?")?"?"+e.split("?")[1]:""];if(s){const e=s[decodeURIComponent(i)]??s[i];return e?{...t,url:t.url.split(n+i)[0]+o+encodeURIComponent(e)+a}:t}return{...t,url:t.url.split(n).join(o)}})}(m.pdfs,b,l,e),y=Object.keys(e).length>0}catch(t){this._showToast(this._t("toast.files_migrate_failed",{err:this._errText(t)}))}i.markers=s,c&&c!==l&&(i.markers=function(t,e,i){if(!e||!i||e===i)return[...t];const s=`marker:${e}`,n=`marker:${i}`;return t.map(t=>{const e=Array.isArray(t.controls)?t.controls.map(t=>t===s?n:t):t.controls,i="derived_marker_state"===t.value_badge?.source?.kind&&t.value_badge.source.ref===s?{...t.value_badge,source:{...t.value_badge.source,ref:n}}:t.value_badge;return e===t.controls&&i===t.value_badge?t:{...t,controls:e,value_badge:i}})}(i.markers,c,l)),c&&c!==l&&"derived_marker_state"===m.value_badge?.source?.kind&&m.value_badge.source.ref===`marker:${c}`&&(m.value_badge.source={kind:"derived_marker_state",ref:`marker:${l}`}),i.markers=i.markers.filter(t=>t.id!==l&&t.id!==c&&("virtual"===m.binding||t.binding!==m.binding)),i.markers.push(m);let w=null;const k=c?this._layout[c]:null,$=k?{s:k.s||h?.space||this._space,x:k.x,y:k.y}:c&&h&&this._defPos[c]?this._normPos(h.space,this._defPos[c].x,this._defPos[c].y):null;if(!d&&$&&$.s===p)l===c&&this._layout[l]&&!v||(w={s:$.s,x:$.x,y:$.y},this._layout={...this._layout,[l]:w});else if(d||!this._layout[l]||v){let t=u.vb[0]+u.vb[2]/2,e=u.vb[1]+u.vb[3]/2;const i=r?u.rooms.find(t=>t.id===r):a?u.rooms.find(t=>t.area===a):void 0;i&&([t,e]=this._roomCenter(i)),w=this._normPos(p,t,e),this._layout={...this._layout,[l]:w}}await this._saveConfigNow(),w&&this._noteLayoutRev(await this.hass.callWS({type:"houseplan/layout/update",device_id:l,pos:w}));const x=new Set(n);c&&c!==l&&x.add(c),x.delete(l);for(const t of x)delete this._layout[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{});y&&b&&await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:b}).catch(()=>{}),this._markerDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_saved"))}catch(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}async _deleteMarker(){const t=this._markerDialog;if(!t||t.busy||!t.devId)return;const e=t.devId?this._devices.find(e=>e.id===t.devId):null;if(!e)return;const i=t.name||this._t("device.fallback");if(!confirm(this._t("confirm.remove_marker",{name:i})))return;const s=this._serverCfg;s.markers=s.markers||[];const n=s.markers,o="virtual"===e.bindingKind?"virtual":e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:"";if(!o)return;const a=function(t,e,i,s){const n=new Set([e]),o=t.filter(t=>{const o=t.id===e||!s&&t.binding===i;return o&&n.add(t.id),!o});return{markers:s?o:[...o,{id:e,binding:i,removed:!0,hidden:!0}],cleanupIds:n}}(s.markers,e.id,o,"virtual"===e.bindingKind);var r,l;s.markers=(r=a.markers,l=a.cleanupIds,r.map(t=>{if(!Array.isArray(t.controls))return t;const e=t.controls.filter(t=>!("string"==typeof t&&t.startsWith("marker:")&&l.has(t.slice(7))));return e.length===t.controls.length?t:{...t,controls:e.length?e:null}}));const c=a.cleanupIds;this._markerDialog={...t,busy:!0};try{await this._saveConfigNow();for(const t of c){delete this._layout[t],delete this._defPos[t],this._dirtyPos.delete(t),this._sentPos.delete(t);const e=this._activityRt.get(t);e&&clearTimeout(e.timer),this._activityRt.delete(t),this._vacRt.delete(t),delete this._vacSrvTrails[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{}),await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:t}).catch(()=>{}),await this.hass.callWS({type:"houseplan/trail/delete",marker_id:t}).catch(()=>{})}this._markerDialog=null,this._infoCard?.id===e.id&&this._closeInfoCard(),this._selId===e.id&&(this._selId=null),this._drag?.id===e.id&&(this._drag=null),this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_removed"))}catch(t){this._serverCfg===s&&(s.markers=n),this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}_normPos(t,e,i){return{s:t,x:e/y_,y:i/y_}}_openSpaceDialog(t,e){if(this._serverStorage&&this._serverCfg)if("edit"===t){const i=this._serverCfg.spaces.find(t=>t.id===e);if(!i)return;const s=cs(i),n=i.settings?.custom_fill&&"object"==typeof i.settings.custom_fill?rs(i.settings.custom_fill):null,o="none"===s.fill?{...n||as,a:0}:n;this._spaceDialog={mode:t,spaceId:e,title:i.title,planUrl:i.plan_url||null,planFile:null,source:i.plan_url?"file":"draw",showBorders:s.showBorders,showNames:s.showNames,hideDecor:s.hideDecor,hideOpenings:s.hideOpenings,roomColor:s.color,roomOpacity:s.opacity,fillMode:"none"===s.fill?"custom":s.fill,customFill:o,glowEnabled:s.glow,bgColor:s.bgColor,bgMode:"static"===i.settings?.bg_mode||"daynight"===i.settings?.bg_mode?i.settings.bg_mode:null,northDeg:Ka({},i.settings),sunRays:"boolean"==typeof i.settings?.sun_rays?i.settings.sun_rays:null,tempMin:s.tempMin,tempMax:s.tempMax,showLqi:s.showLqi??this._config?.show_signal??!0,cardFontScale:s.cardFontScale,labelTemp:s.labelTemp,labelHum:s.labelHum,labelLqi:s.labelLqi,labelLight:s.labelLight,cellCm:Number(i.cell_cm)>0?Number(i.cell_cm):5,busy:!1}}else this._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,source:"file",showBorders:!1,showNames:!1,hideDecor:!1,hideOpenings:!1,roomColor:ns,roomOpacity:os,fillMode:"custom",customFill:{...as,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:20,tempMax:25,showLqi:this._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:5,busy:!1};else this._showToast(this._t("toast.integration_missing"))}async _pickPlanFile(t){const e=t.target,i=e.files?.[0];if(!i||!this._spaceDialog)return;const s={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/webp":"webp"}[i.type]||(i.name.toLowerCase().endsWith(".svg")?"svg":"");if(!s)return void this._showToast(this._t("toast.plan_formats"));const n=new Uint8Array(await i.arrayBuffer());let o="";for(let t=0;t{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:1.414),e.onerror=()=>t(1.414),e.src=r});URL.revokeObjectURL(r),this._spaceDialog={...this._spaceDialog,planFile:{ext:s,b64:a,aspect:l,name:i.name}}}_useServerPlan(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let e=0;e<40;e++){const e=this._display(t);if(e){const i=await new Promise(t=>{const i=new Image;i.onload=()=>t(i.naturalWidth&&i.naturalHeight?i.naturalWidth/i.naturalHeight:0),i.onerror=()=>t(0),i.src=e}),s=this._spaceDialog;return s&&s.planUrl===t&&Number.isFinite(i)&&i>0?(this._spaceDialog={...s,savedAspect:i},i):0}if(await new Promise(t=>setTimeout(t,150)),this._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){if(confirm(this._t("confirm.delete_plan",{name:t})))try{await this.hass.callWS({type:"houseplan/plans/delete",name:t});const e=this._spaceDialog;e?.saved&&(this._spaceDialog={...e,saved:e.saved.filter(e=>e.name!==t)})}catch(t){this._showToast(this._t("toast.plan_delete_failed",{err:this._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return j`
${this._t("space.loading")}
`;const e=t.saved||[];if(!e.length)return j`
${this._t("space.no_saved")}
`;return j`
+
`:j``}_openingAt(t){if(!this._openingsR.length)return null;const e=this._openingsR.flatMap(e=>{const i=e.angle*Math.PI/180,s=t[0]-e.rx,n=t[1]-e.ry,o=s*Math.cos(i)+n*Math.sin(i);return Math.abs(o)>e.rlen/2+12?[]:[{o:e,localY:-s*Math.sin(i)+n*Math.cos(i)}]});if(!e.length)return null;const i=this._spaceModel();if(!i)return null;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return e.find(({o:t,localY:e})=>{const i="gate"===t.type?!t.flip_v:t.flip_v,s=t.partitionHost||this._spaceWalls.length||"gate"===t.type?this._openingFace(t,n,!!i):{ox:0,oy:0,cm:0,side:-1},o=Yd({type:t.type,length:t.rlen,angle:t.angle,amount:this._openingAmt(t),flipH:!!t.flip_h,flipV:!!t.flip_v,cellCm:this._cellCm,gridPitch:this._gridPitch,face:s});return Math.abs(e)<=o.hitHalf})?.o||null}_resolveOpeningPlacement(t){const e=this._openingPreset;if("opening"!==this._tool||!e)return null;const i=this._spaceModel();if(!i)return null;const s=this._openCuts(),n=this._openingWallIndexFor(i,s),o=`${n.key}|partitions:${this._cfgEpoch}`;var a,r,l;this._openingPlacementIntervalsCache&&this._openingPlacementIntervalsCache.key===o||(this._openingPlacementIntervalsCache={key:o,value:[...Qr(i.rooms,this._spaceWalls,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_),...(a=i.partitions,r=this._cellCm,l=this._gridPitch,a.flatMap(t=>!Zh(t.a)||!Zh(t.b)||Math.hypot(t.b[0]-t.a[0],t.b[1]-t.a[1])<=1e-9?[]:[{roomId:"",a:[t.a[0],t.a[1]],b:[t.b[0],t.b[1]],key:`partition:${t.id}`,kind:"outer",cm:t.cm,open:!1,half:fr(t.cm,r,l)/2,partitionHost:{kind:"partition",id:t.id}}]))]});const c=Zp({pointer:[t[0],t[1]],preset:e,geometryRevision:this._cfgEpoch,renderedLength:this._cmToUnits(e.lengthCm),intervals:this._openingPlacementIntervalsCache.value,baseTolerance:1.5*this._gridPitch,bodyPointerPadding:this._cssPxToRender(this._boundaryCoarse?10:6),gridStep:this._gridPitch});this._openingJambBlockCm=c.jambBlockedTarget?c.jambBlockedTarget.physicalHalfWidth/this._gridPitch*this._cellCm:null;const h=c.candidate;if(!h)return null;const d="gate"===h.type?!h.flipV:h.flipV;let u;if(h.host){const t=ed({id:"preview",type:h.type,x:h.x/y_,y:h.y/y_,angle:h.angle,length:h.renderedLength/y_,host:h.host},i.partitions,y_,this._cellCm,this._gridPitch).resolved;u=t?od(t,d):{ox:0,oy:0,cm:0,side:-1}}else u=yl(n.value,{x:h.x,y:h.y,angle:h.angle,length:h.renderedLength,flip_v:d});const p="mi"===this.hass?.config?.unit_system?.length,_=_i([h.x,h.y],h.angle,h.renderedLength,i.rooms,this._gridPitch/2),g=(_?[{distance:_.sideA,midpoint:_.midA},{distance:_.sideB,midpoint:_.midB}]:h.measure.labels).map(t=>({x:t.midpoint[0],y:t.midpoint[1],text:li(t.distance/this._gridPitch*this._cellCm,p)}));return{...h,face:u,measure:{labels:g,guide:h.measure.guide}}}_activateOpeningPlacement(t){this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingPreset=function(t,e){return{type:t,lengthCm:Kp(t),flipH:!1,flipV:!1,revision:e}}(t,++this._openingPresetRevision),this._openingHoverCandidate=null,this._cursorPt=null)}_clearOpeningPlacement(t){this._openingHoverCandidate=null,this._openingJambBlockCm=null,t&&(this._openingPreset=null,this._openingRebindId=null)}_openingClick(t){const e=this._spaceModel();if(!e)return;const i=this._openingRebindId?null:this._openingAt(t);if(i)return void this._editOpening(i);const s=this._openingPreset;if(!s)return;const n=this._openingHoverCandidate,o=n&&Qp(n,[t[0],t[1]],s.revision,this._cfgEpoch)?n:this._resolveOpeningPlacement(t);if(!o){if(null!=this._openingJambBlockCm)return void this._showToast(this._t("opening.partition_jamb_margin",{distance:li(this._openingJambBlockCm,this._imperial)}));const i=1.5*this._gridPitch,s=pi(t,e.rooms,i);return s&&function(t,e,i,s,n){for(const o of s)if(!(Ns([t,e],o)>n)&&Pr([o[0],o[1]],[o[2],o[3]],i))return!0;return!1}(s.x,s.y,s.angle,this._openCuts(),i)?void this._showToast(this._t("toast.opening_on_virtual")):void this._showToast(this._t("toast.opening_no_wall"))}const a=this._openingRebindId?this._curSpaceCfg?.openings?.find(t=>t.id===this._openingRebindId):null;this._openingDialog={...a?{id:a.id,type:a.type,lengthCm:Math.round(a.length*y_/this._gridPitch*this._cellCm),lengthTouched:!1,contact:a.contact||"",lock:a.lock||"",invert:!!a.invert,flipH:!!a.flip_h,flipV:!!a.flip_v}:{type:o.type,lengthCm:o.lengthCm,contact:"",lock:"",invert:!1,flipH:o.flipH,flipV:o.flipV},...o.host?{host:o.host}:{},x:o.x,y:o.y,angle:o.angle},this._openingRebindId=null,this._openingHoverCandidate=null,this._cursorPt=null}_editOpening(t){this._openingDialog={id:t.id,type:t.type,lengthCm:Math.round(t.rlen/this._gridPitch*this._cellCm),lengthTouched:!1,contact:t.contact||"",lock:t.lock||"",invert:!!t.invert,flipH:!!t.flip_h,flipV:!!t.flip_v,...t.host?{host:{...t.host}}:{},x:t.rx,y:t.ry,angle:t.angle}}_opPointerDown(t,e){if("plan"===this._mode&&this._spaceModel()&&"resize"!==this._tool){t.preventDefault(),t.stopPropagation();try{C_(t)}catch{}this._opDrag={id:e.id,moved:!1,sx:t.clientX,sy:t.clientY,dirty:!1,before:this._geometrySnapshot()}}}_opPointerMove(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;if(Math.abs(t.clientX-this._opDrag.sx)+Math.abs(t.clientY-this._opDrag.sy)<=3)return;const i=this._spaceModel();if(!i)return;const s=this._svgPoint(t),n=this._curSpaceCfg,o=n?.openings?.find(t=>t.id===e.id);if(!o)return;if("partition"===o.host?.kind){const t=i.partitions.find(t=>t.id===o.host.id);if(!t)return;const e=t.b[0]-t.a[0],n=t.b[1]-t.a[1],a=Math.hypot(e,n);if(!(a>1e-9))return;const r=e/a,l=n/a;if(Math.abs((s[0]-t.a[0])*l-(s[1]-t.a[1])*r)>4*this._gridPitch)return;const c=o.length*y_/2+Qh(t,this._cellCm,this._gridPitch);let h=(s[0]-t.a[0])*r+(s[1]-t.a[1])*l;if(h=Math.round(h/this._gridPitch)*this._gridPitch,h=Math.max(c,Math.min(a-c,h)),a<2*c-1e-9)return;const d=h/a,u=(t.a[0]+r*h)/y_,p=(t.a[1]+l*h)/this._spaceH;let _=180*Math.atan2(n,e)/Math.PI;_>=90?_-=180:_<-90&&(_+=180);const g=o.host.t!==d||o.x!==u||o.y!==p||o.angle!==_;return this._opDrag.moved=!0,g&&(this._opDrag.dirty=!0),o.host={...o.host,t:d},o.x=u,o.y=p,o.angle=_,this._opMeasure=null,g&&this._cfgEpoch++,void this.requestUpdate()}const a=pi(s,i.rooms,4*this._gridPitch);if(!a)return;this._opDrag.moved=!0;const r=this._opRuler(a,o.length*y_);this._opMeasure=r.measure;const l=r.x/y_,c=r.y/this._spaceH,h=o.x!==l||o.y!==c||o.angle!==a.angle;h&&(this._opDrag.dirty=!0),o.x=l,o.y=c,o.angle=a.angle,h&&this._cfgEpoch++,this.requestUpdate()}_opRuler(t,e){const i=this._spaceModel()?.rooms||[],s=this._gridPitch/2;let n=t.x,o=t.y,a=_i([n,o],t.angle,e,i,s);if(a&&a.centered&&(n!==a.wallCenter[0]||o!==a.wallCenter[1]))[n,o]=a.wallCenter,a=_i([n,o],t.angle,e,i,s);else if(a){const[r,l]=a.wallA,[c,h]=a.wallB,d=c-r,u=h-l,p=Math.hypot(d,u);if(p>0){const c=this._gridPitch,h=Math.min(e/2,p/2);let _=Math.round(((n-r)*d+(o-l)*u)/p/c)*c;_=Math.max(h,Math.min(p-h,_)),n=r+_/p*d,o=l+_/p*u,a=_i([n,o],t.angle,e,i,s)||a}}if(!a)return{x:n,y:o,angle:t.angle,measure:null};const r="mi"===this.hass?.config?.unit_system?.length,l=(t,e)=>({x:e[0],y:e[1],text:li(t/this._gridPitch*this._cellCm,r)});return{x:n,y:o,angle:t.angle,measure:{labels:[l(a.sideA,a.midA),l(a.sideB,a.midB)],guide:a.centered?{x:a.wallCenter[0],y:a.wallCenter[1],angle:t.angle}:null}}}_opPointerUp(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;const i=this._opDrag,s=i.moved;this._opMeasure=null,s&&i.dirty&&(this._recordGeometry(this._t("history.move_opening"),i.before),this._saveConfig()),s?window.setTimeout(()=>this._opDrag=null,0):this._opDrag=null}_opClick(t,e){"plan"===this._mode&&"resize"===this._tool||(t.stopPropagation(),this._opDrag?.moved||"plan"===this._mode&&this._editOpening(e))}_saveOpening(){const t=this._openingDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=this._geometrySnapshot(),n=this._spaceH,o=(e.openings||[]).find(e=>e.id===t.id),a={...o||{},id:t.id||"o"+Date.now().toString(36),type:t.type,x:t.x/y_,y:t.y/n,angle:t.angle,length:o&&!t.lengthTouched?o.length:this._cmToUnits(Math.max(20,t.lengthCm))/y_,...t.host?{host:{...t.host}}:{}};if(a.host){const t=sd(o,a)?id(a,i.partitions,y_,this._cellCm,this._gridPitch):ed(a,i.partitions,y_,this._cellCm,this._gridPitch);if(!t.resolved){const e=i.partitions.find(t=>t.id===a.host.id);if("does-not-fit-jamb"===t.reason&&e){const t=Qh(e,this._cellCm,this._gridPitch);this._showToast(this._t("opening.partition_jamb_margin",{distance:li(t/this._gridPitch*this._cellCm,this._imperial)}))}else this._showToast(this._t("opening.partition_orphan"));return}const s=(e.openings||[]).flatMap(t=>{if(!t.host||t.id===a.id)return[];const e=ed(t,i.partitions,y_,this._cellCm,this._gridPitch).resolved;return e?[e]:[]});if(function(t,e,i=1e-9){const s=t.length/(2*t.axis.length),n=t.t-s,o=t.t+s;return e.some(e=>{if(e.host.id!==t.host.id||e.opening.id===t.opening.id)return!1;const s=e.length/(2*e.axis.length);return Math.max(n,e.t-s)t.id===a.id);r>=0?e.openings[r]=a:e.openings.push(a),this._recordGeometry(this._t(t.id?"history.edit_opening":"history.add_opening"),s),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_deleteOpening(){const t=this._openingDialog,e=this._curSpaceCfg;if(!t?.id||!e?.openings)return;const i=this._geometrySnapshot();e.openings=e.openings.filter(e=>e.id!==t.id),this._recordGeometry(this._t("history.delete_opening"),i),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_contactCandidates(){const t=[];for(const e of Object.keys(this.hass.states)){if(!this._openingEntityAvailable(e))continue;const i=e.split(".")[0];if("binary_sensor"!==i&&"cover"!==i)continue;const s=this.hass.states[e],n=["door","window","opening","garage_door","garage"].includes(s?.attributes?.device_class||"");("cover"!==i||n)&&t.push([e,s?.attributes?.friendly_name||e,n?0:1])}return t.sort((t,e)=>t[2]-e[2]||t[1].localeCompare(e[1])).map(([t,e])=>({value:t,label:e}))}_lockCandidates(){return Object.keys(this.hass.states).filter(t=>t.startsWith("lock.")&&this._openingEntityAvailable(t)).map(t=>({value:t,label:this.hass.states[t]?.attributes?.friendly_name||t})).sort((t,e)=>t.label.localeCompare(e.label))}_mergeClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms,s=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!s?.id)return;const n=s.id;if(!this._mergeSel||this._mergeSel===n)return void(this._mergeSel=this._mergeSel===n?null:n);const o=i.find(t=>t.id===this._mergeSel),a=o?hi(o):null,r=hi(s),l=a&&r?function(t,e){if(!t||!e||t.length<3||e.length<3)return null;const i=si(Ri(t),Ri(e));if(1!==i.length)return null;if(1!==i[0].length)return null;const s=i[0][0].slice(0,-1).map(t=>[t[0],t[1]]);return s.length>=3?s:null}(a,r):null;if(!l)return this._showToast(this._t("toast.merge_not_adjacent")),void(this._mergeSel=null);this._mergeDialog={aId:this._mergeSel,bId:n,poly:l,pick:"a"},this._mergeSel=null}_commitMerge(){const t=this._mergeDialog,e=this._curSpaceCfg;if(!t||!e||!this._spaceModel())return;const i=this._geometrySnapshot(),s=this._spaceH,n="a"===t.pick?t.aId:t.bId,o="a"===t.pick?t.bId:t.aId,a=e.rooms.find(t=>t.id===n);a?(a.poly=t.poly.map(t=>[t[0]/y_,t[1]/s]),delete a.x,delete a.y,delete a.w,delete a.h,e.rooms=e.rooms.filter(t=>t.id!==o),this._commitOpenSpans(),this._recordGeometry(this._t("history.merge_rooms"),i),this._saveConfig(),this._mergeDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.rooms_merged",{name:a.name||""}))):this._mergeDialog=null}_splitClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms;if(!this._splitSel){const e=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!e?.id)return;return void(this._splitSel={roomId:e.id,pts:[]})}const s=i.find(t=>t.id===this._splitSel.roomId),n=s?hi(s):null;if(!s||!n)return void(this._splitSel=null);const o=.02*this._gridPitch,a=6*this._gridPitch,r=function(t,e){if(!e||e.length<2)return null;let i=null,s=1/0;for(let n=0;n=n)continue;n=_;const g=Math.sqrt(u),m=(i>0?Math.max(0,Math.min(g,Math.round(p*g/i)*i)):p*g)/g;s=[a+m*h,r+m*d]}return s}(r,n,this._gridPitch)||r,c=r&&l&&Math.hypot(r[0]-t[0],r[1]-t[1])<=a?l:null,h=!!c&&bi(c,n,o),d=this._splitSel.pts;if(!d.length)return h?void(this._splitSel={...this._splitSel,pts:[c]}):void this._showToast(this._t("toast.split_pick_wall"));if(!h){const e=this._snap(t);return wi(e,n,o)?void(this._splitSel={...this._splitSel,pts:[...d,e]}):void this._showToast(this._t("toast.split_pick_inside"))}const u=Ei(n,[...d,c],o);if(!u)return void this._showToast(this._t("toast.split_bad_cut"));this._resetRoomDialogFields();const[p,_]=u,g=Pi(p)>=Pi(_)?p:_,m=g===p?_:p;this._pendingSplit={roomId:s.id,mainPoly:g,newPoly:m},this._cursorPt=null,this._nameSel="",this._areaSel="",this._roomDialog=!0}get _contourClosed(){return this._path.length>=4&&this._samePt(this._path[0],this._path[this._path.length-1])&&(null!=this._closingWallCm||!this._activeDraftId)}_markupMove(t){if(!this._markup)return;const e=t.pointerType;if(e&&(this._boundaryPointerType=e),"column"===this._tool)return void(this._cursorPt=this._snap(this._svgPoint(t)));if("opening"===this._tool||"boundary"===this._tool||"wallthick"===this._tool)return void(this._cursorPt=this._svgPoint(t));const i="draw"===this._tool&&!this._contourClosed,s="split"===this._tool&&!!this._splitSel?.pts?.length;if(!i&&!s)return;const n=this._svgPoint(t);if(i){const e=this._resolvePlanDrawPoint(n,t.shiftKey);return this._planSnapHover={contextKey:e.contextKey,candidate:e.candidate},this._path.length?void(this._cursorPt=e.point):void this._syncPlanSnapActiveMarker(e.candidate)}this._cursorPt=this._snap(n)}get _openingPreview(){const t=this._openingPreset;if("opening"!==this._tool||!t||!this._cursorPt)return null;const e=this._cursorPt,i=this._openingHoverCandidate;if(i&&Qp(i,[e[0],e[1]],t.revision,this._cfgEpoch))return i;if(this._openingAt(e))return this._openingHoverCandidate=null,null;const s=this._resolveOpeningPlacement(e);return this._openingHoverCandidate=s,s}get _opMeasureView(){return this._opMeasure||this._openingPreview?.measure||null}_saveRoom(){(this._areaSel||this._nameSel.trim())&&(this._wallFaceBatch?this._decideWallFace(!0):this._commitRoom())}_decideWallFace(t){const e=this._wallFaceBatch;if(!e)return;const i=e.candidates[e.index];if(!i)return;const s=t?{candidate:i,create:!0,name:this._nameSel.trim(),area:this._areaSel||null,settings:this._roomSettingsFromDialog()?JSON.parse(JSON.stringify(this._roomSettingsFromDialog())):null}:{candidate:i,create:!1},n=[...e.decisions,s],o=e.index+1;if(o"number"==typeof t&&Number.isFinite(t)&&t>=0?t:null,n=.02*this._gridPitch,o=this._spaceModel();if(!o)return pr;for(const e of this._planSnapGeometrySnapshot().value.segments){if("room"===e.sourceKind||Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])>n)continue;if("partition"===e.sourceKind)return s(o.partitions.find(t=>t.id===e.sourceId)?.cm)??pr;const i=e.sourceId.lastIndexOf(":"),a=i>=0?e.sourceId.slice(0,i):e.sourceId,r=i>=0?Number(e.sourceId.slice(i+1)):-1;return s(o.room_drafts.find(t=>t.id===a)?.segments[r]?.cm)??pr}for(let o=0;o+1{this._showToast(this._t(t,e)),this._roomDialogCancel()},n=t.decisions.filter(t=>t.create),o=n.map(t=>t.candidate.ring),a=i.rooms;for(let t=0;ti.id!==e&&!!hi(i)&&Di(o[t],hi(i)));if(i)return void s("toast.room_overlap",{name:i.name||""})}if((e.rooms||[]).length+n.length>400)return void s("toast.physical_limit");if(n.some(t=>t.candidate.split&&!e.rooms.some(e=>e.id===t.candidate.split.roomId)))return void s("toast.contour_cannot_close");const r=2e-4*this._gridPitch,l=new Map;for(let e=0;et.candidate.atomKeys)),i=n.some(t=>t.candidate.consumeAllActive);for(const s of Bd(this._wallGraphSources(t.activePath),r)){const t=s.sourceKeys.find(t=>l.has(t));!t||i||e.has(s.key)||c.push({a:s.a,b:s.b,cm:l.get(t)})}}else c.push(...bd(t.activePath,t.activeCms,pr));if((e.partitions||[]).length+c.length>$_)return void s("toast.physical_limit");const h=this._geometrySnapshot(),d=n.some(t=>!!t.candidate.split),u=d?tl(i.rooms,e.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,p=d&&Array.isArray(e.walls)?e.walls:null;for(const t of n){const i=t.candidate.split;if(!i)continue;const n=e.rooms.find(t=>t.id===i.roomId);if(!n)return void s("toast.contour_cannot_close");n.poly=i.mainPoly.map(t=>[t[0]/y_,t[1]/this._spaceH]),delete n.x,delete n.y,delete n.w,delete n.h}const _=Date.now().toString(36),g=[];if(n.forEach((t,i)=>{const s=t.area?this.hass.areas[t.area]?.name:"",n={id:`r${_}-${i}`,name:t.name||s||this._t("room.default_name"),area:t.area||null,poly:t.candidate.ring.map(t=>[t[0]/y_,t[1]/this._spaceH]),...t.settings?{settings:JSON.parse(JSON.stringify(t.settings))}:{}};e.rooms.push(n),g.push({room:n,decision:t})}),t.activeDraftId&&Array.isArray(e.room_drafts)&&(e.room_drafts=e.room_drafts.filter(e=>e.id!==t.activeDraftId),e.room_drafts.length||delete e.room_drafts),c.length&&(e.partitions||=[],c.forEach((t,i)=>e.partitions.push({id:`partition-${_}-${i}`,a:[t.a[0]/y_,t.a[1]/y_],b:[t.b[0]/y_,t.b[1]/y_],cm:t.cm}))),d){this._commitOpenSpans();const t=this._normalizeWalls(u,this._openCuts());t.length?e.walls=t:p?.length?e.walls=p:delete e.walls}if(g.length){this._cfgEpoch++;const i=this._openCuts(),s=this._spaceModel();if(!s)return;let n=e.walls;for(const{room:e,decision:o}of g){const a=o.candidate.ring,r=this._wallSourceCmAt(a[0],t.activePath,t.activeCms);n=Er(n,s.rooms,e.id,r,this._wallKeyPitch,i,y_);for(const o of Qr(s.rooms,n,i,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(o.roomId!==e.id||"outer"!==o.kind)continue;const i=[(o.a[0]+o.b[0])/2,(o.a[1]+o.b[1])/2];n=Ar(n,o.a,o.b,this._wallSourceCmAt(i,t.activePath,t.activeCms),this._wallKeyPitch,y_)}}const o=this._normalizeWalls(n,i);o.length?e.walls=o:delete e.walls}this._recordGeometry(this._t("history.wall_face_batch"),h),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._wallFaceBatch=null,this._roomDialog=!1,this._nameSel="",this._areaSel="",this._regSignature="",this._maybeRebuildDevices();const m=new Set(n.map(t=>t.area).filter(t=>!!t));if(m.size){const t={...this._layout};for(const e of this._devices){if(!m.has(e.area||"")||e.space!==this._space)continue;if(this._layout[e.id])continue;const i=this._defPos[e.id];i&&(t[e.id]={s:this._space,x:i.x/y_,y:i.y/y_},this._dirtyPos.add(e.id))}this._layout=t,this._persistLayout()}this._showToast(this._t(n.length?"toast.wall_rooms_saved":"toast.wall_chain_saved",{n:n.length}))}_commitRoom(){const t=this._curSpaceCfg,e=this._spaceModel();if(!t||!e)return;const i=this._geometrySnapshot(),s=this._spaceH,n=!!this._pendingSplit,o=n?tl(e.rooms,t.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,a=n&&Array.isArray(t.walls)?t.walls:null;let r;if(this._pendingSplit){const e=t.rooms.find(t=>t.id===this._pendingSplit.roomId);if(!e)return this._pendingSplit=null,this._splitSel=null,void(this._roomDialog=!1);e.poly=this._pendingSplit.mainPoly.map(t=>[t[0]/y_,t[1]/s]),delete e.x,delete e.y,delete e.w,delete e.h,r=this._pendingSplit.newPoly}else{if(!this._contourClosed)return;r=this._path.slice(0,-1)}const l=this._areaSel?this.hass.areas[this._areaSel]?.name:"",c={id:"r"+Date.now().toString(36),name:this._nameSel||l||this._t("room.default_name"),area:this._areaSel||null,poly:r.map(t=>[t[0]/y_,t[1]/s]),...this._roomSettingsFromDialog()?{settings:this._roomSettingsFromDialog()}:{}};if(t.rooms.push(c),!n&&this._activeDraftId&&Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),n){this._commitOpenSpans();const e=this._normalizeWalls(o,this._openCuts());e.length?t.walls=e:a?.length?t.walls=a:delete t.walls}if(!n){const e=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr],i=e[0]||this._drawWallCm;if(null!=i){this._cfgEpoch++;const s=this._openCuts(),n=this._spaceModel();if(!n)return;let o=Er(t.walls,n.rooms,c.id,i,this._wallKeyPitch,s,y_);for(const t of Qr(n.rooms,o,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(t.roomId!==c.id||"outer"!==t.kind)continue;const s=[(t.a[0]+t.b[0])/2,(t.a[1]+t.b[1])/2],n=r.findIndex((t,e)=>{const i=r[(e+1)%r.length];return Ns(s,[t[0],t[1],i[0],i[1]])<=.02*this._gridPitch});n>=0&&(o=Ar(o,t.a,t.b,e[n]||i,this._wallKeyPitch,y_))}o=this._normalizeWalls(o,s),o.length?t.walls=o:delete t.walls}}this._recordGeometry(this._t(n?"history.split_room":"history.add_room"),i),this._saveConfig(),this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._pendingSplit=null,this._splitSel=null;const h=this._areaSel;this._areaSel="",this._nameSel="",this._roomDialog=!1,this._regSignature="",this._maybeRebuildDevices();let d=0;if(h){const t=y_,e={...this._layout};for(const i of this._devices){if(i.area!==h||i.space!==this._space)continue;if(d++,this._layout[i.id])continue;const s=this._defPos[i.id];s&&(e[i.id]={s:this._space,x:s.x/y_,y:s.y/t},this._dirtyPos.add(i.id))}this._layout=e,this._persistLayout()}const u=this._model.find(t=>t.id===this._space)?.rooms.length||0;this._showToast(h?this._t("toast.room_saved",{n:u,added:d}):this._t("toast.room_saved_no_area",{n:u}))}_cancelPath(){this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),this._roomDialog=!1,this._pendingSplit=null,this._wallFaceBatch=null,this._splitSel=null,this._mergeSel=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._clearOpeningPlacement(!0)}_resumeLastDraft(){const t=this._resumeDraftBySpace[this._space];if(!t)return;const e=this._spaceModel()?.room_drafts.find(e=>e.id===t);e?(this._activeDraftId=t,this._path=e.points.map(t=>[...t]),this._draftSegmentCms=e.segments.map(t=>t.cm),this._clearPlanSnapHover()):delete this._resumeDraftBySpace[this._space]}_roomDialogCancel(){if(this._roomDialog=!1,this._roomEditId)return this._roomEditId=null,this._nameSel="",void(this._areaSel="");if(this._wallFaceBatch){const t=this._wallFaceBatch;return this._wallFaceBatch=null,this._path=t.activePath.map(t=>[...t]),this._draftSegmentCms=[...t.activeCms],this._activeDraftId=t.activeDraftId,this._nameSel="",this._areaSel="",void this.requestUpdate()}if(this._pendingSplit)return this._pendingSplit=null,void(this._splitSel=null);this._undoPoint()}get _freeAreas(){const t=new Set;for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area&&t.add(i.area);for(const e of this._wallFaceBatch?.decisions||[])e.create&&e.area&&t.add(e.area);return Object.values(this.hass?.areas||{}).filter(e=>!t.has(e.area_id)).sort((t,e)=>(t.name||"").localeCompare(e.name||""))}_openMarkerDialog(t){if(this._vacAllCamerasFor=null,this._vacAllCameraCache=null,t&&this._ackNewDevice(t.id),this._norm)if(t){const e=t.marker,i=Object.prototype.hasOwnProperty.call(e||{},"is_light"),s=Object.prototype.hasOwnProperty.call(e||{},"light_entity"),n=Object.prototype.hasOwnProperty.call(e||{},"glow_color"),o=Object.prototype.hasOwnProperty.call(e||{},"value_badge"),a=Object.prototype.hasOwnProperty.call(e||{},"tap_action"),r=Object.prototype.hasOwnProperty.call(e||{},"toggle_entity"),l=ks(e?.glow_color),c=this._devicePresentation(t,!0).valueBadge,h=Bo(this._planHass,t,this._devices),d=qo(this._planHass,t,h);this._markerDialog={devId:t.id,name:t.name,binding:"virtual"===t.bindingKind?"virtual":t.bindingKind+":"+t.bindingRef,bindingMode:"virtual"===t.bindingKind?"virtual":"ha",bindingOpen:!1,showEntities:"entity"===t.bindingKind&&!!this._fullRegistryHass.entities[t.bindingRef||""]?.device_id,bindingFilter:"",icon:t.marker?.icon||"",autoIcon:t.icon||"",display:Bi(t.marker?.display),rippleColor:Rt(t.marker?.ripple_color,""),rippleSize:Number(t.marker?.ripple_size)>0?Number(t.marker.ripple_size):3,size:Number(t.marker?.size)>0?Number(t.marker.size):1,angle:Number(t.marker?.angle)||0,tapAction:Wh(t.marker?.tap_action,t.primary?.split(".")[0]),tapActionTouched:!1,originalHasTapAction:a,originalTapAction:t.marker?.tap_action,tapHintAnnouncement:"",toggleEntity:e?.toggle_entity||"",toggleEntityTouched:!1,originalHasToggleEntity:r,originalToggleEntity:e?.toggle_entity,tapTarget:t.marker?.tap_target||"",tapConfirm:!0===t.marker?.tap_confirm,runFilter:"",controls:Xn(t.marker?.binding,t.marker?.controls,t.entities),controlsFilter:"",lightRole:!0===e?.is_light?"always":!1===e?.is_light?"never":"auto",lightRoleTouched:!1,originalHasIsLight:i,originalIsLight:e?.is_light,lightEntity:e?.light_entity||"",lightEntityTouched:!1,originalHasLightEntity:s,originalLightEntity:e?.light_entity,glowMode:null!=l?.bri?"fixed":l?"color":"auto",glowColor:l?.c||this._fillColors.glow_light.c,glowBrightness:Math.max(1,Math.round(100*(l?.bri??1))),glowColorDrafted:!!l,glowBrightnessDrafted:null!=l?.bri,glowTouched:!1,originalHasGlowColor:n&&(!!l||null===e?.glow_color),originalGlowColor:l||(null===e?.glow_color?null:void 0),valueBadgeEnabled:o?!0===e?.value_badge?.enabled:!!c,valueBadgeSource:e?.value_badge?.source||c?.source||d,valueBadgePosition:e?.value_badge?.position||c?.position||"right",valueBadgeTouched:!1,originalHasValueBadge:o,originalValueBadge:e?.value_badge,useClimateTemp:!0===t.marker?.use_climate_temp,glowRadius:Number(t.marker?.glow_radius_cm)>0?String(this._imperial?Math.round(Number(t.marker.glow_radius_cm)/30.48*10)/10:Math.round(Number(t.marker.glow_radius_cm))/100):"",model:t.model||"",link:t.link||"",description:t.description||"",pdfs:[...t.pdfs||[]],room:t.marker?.room_id?t.space+"#@"+t.marker.room_id:t.space&&t.area?t.space+"#"+t.area:"",hideFromPlan:!0===t.marker?.hidden,busy:!1}}else this._markerDialog={name:"",binding:"virtual",bindingMode:"virtual",bindingOpen:!1,showEntities:!1,bindingFilter:"",icon:"",autoIcon:"",display:"badge",rippleColor:"",rippleSize:3,size:1,angle:0,tapAction:"info",tapActionTouched:!1,originalHasTapAction:!1,originalTapAction:void 0,tapHintAnnouncement:"",toggleEntity:"",toggleEntityTouched:!1,originalHasToggleEntity:!1,originalToggleEntity:void 0,tapTarget:"",tapConfirm:!1,runFilter:"",controls:[],controlsFilter:"",lightRole:"auto",lightRoleTouched:!1,originalHasIsLight:!1,originalIsLight:void 0,lightEntity:"",lightEntityTouched:!1,originalHasLightEntity:!1,originalLightEntity:void 0,glowMode:"auto",glowColor:this._fillColors.glow_light.c,glowBrightness:100,glowColorDrafted:!1,glowBrightnessDrafted:!1,glowTouched:!1,originalHasGlowColor:!1,originalGlowColor:void 0,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgePosition:"right",valueBadgeTouched:!1,originalHasValueBadge:!1,originalValueBadge:void 0,useClimateTemp:!1,glowRadius:"",model:"",link:"",description:"",pdfs:[],room:"",hideFromPlan:!1,busy:!1,uploadId:"up_"+Date.now().toString(36)+Math.random().toString(36).slice(2,6)};else this._showToast(this._t("toast.marker_needs_server"))}_runCandidates(){const t=[];for(const e of Gi)for(const[i,s]of Object.entries(this.hass.states))i.startsWith(e+".")&&this._planEntityAvailable(i)&&t.push({value:i,label:s?.attributes?.friendly_name||i,sub:this._t("run."+e)});return t.sort((t,e)=>t.sub.localeCompare(e.sub)||t.label.localeCompare(e.label))}_bindingCandidates(){const t=this._planHass,e=yo(this._markers),i=new Set(this._markers.filter(t=>t.removed).map(t=>t.binding)),s=new Set;for(const t of this._devices)t.id!==this._markerDialog?.devId&&("device"===t.bindingKind&&t.bindingRef&&s.add("device:"+t.bindingRef),"entity"===t.bindingKind&&t.bindingRef&&s.add("entity:"+t.bindingRef));const n=new Set;for(const t of this._devices)"device"===t.bindingKind&&t.name&&n.add(t.name.trim()+"|"+(t.area||""));const o=[];for(const e of Object.values(t.devices)){if("service"===e.entry_type)continue;const t="device:"+e.id;if(s.has(t))continue;const a=(e.name_by_user||e.name||e.id).trim();t!==this._markerDialog?.binding&&!i.has(t)&&n.has(a+"|"+(e.area_id||""))||o.push({value:t,label:a,sub:(e.model||this._t("marker.sub_device"))+("Group"===e.model?this._t("marker.sub_z2m_group"):"")})}const a=new Set(["group","template","derivative","min_max","threshold","integration","statistics","trend","utility_meter","tod","switch_as_x","schedule"]);for(const[n,r]of Object.entries(t.entities)){const l="entity:"+n;if(s.has(l))continue;if(bo(t,n,e)&&!i.has(l))continue;const c=a.has(r.platform),h="group"===r.platform;if(!c&&!h)continue;if(r.hidden&&!i.has(l))continue;const d=t.states[n];o.push({value:l,label:r.name||d?.attributes?.friendly_name||n,sub:n.split(".")[0]+" · "+("group"===r.platform?this._t("marker.sub_group"):this._t("marker.sub_helper"))})}if(this._markerDialog?.showEntities){const n=new Set(o.map(t=>t.value));for(const[a,r]of Object.entries(t.entities)){const l="entity:"+a;if(s.has(l)||n.has(l)||r.hidden&&!i.has(l))continue;if(bo(t,a,e)&&!i.has(l))continue;const c=t.states[a],h=r.name||c?.attributes?.friendly_name||a,d=r.device_id?t.devices[r.device_id]:null,u=d&&(d.name_by_user||d.name)||"";o.push({value:l,label:h,sub:a.split(".")[0]+" · "+this._t("marker.sub_entity")+(u?" · "+u:"")})}}const r=(this._markerDialog?.bindingFilter||"").toLowerCase().trim(),l=r?o.filter(t=>(t.label+" "+t.sub+" "+t.value).toLowerCase().includes(r)):o;return l.sort((t,e)=>t.label.localeCompare(e.label)),l.slice(0,200)}_physicalBodiesR(t=this._spaceModel()){if(!t)return[];const e=`${t.id}|${this._cfgEpoch}|${this._cellCm}|${this._gridPitch}`;if(this._physicalBodiesCache?.key===e)return this._physicalBodiesCache.all;const i=Rl(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t));return this._physicalBodiesCache={key:e,...i},i.all}_rawPhysicalBodiesR(t=this._spaceModel()){if(!t)return[];this._physicalBodiesR(t);const e=this._physicalBodiesCache;return e?[...e.drafts,...e.partitions,...e.columns]:[]}_cleanFloor(t,e,i=this._spaceModel()){if(!i)return{floor:e,geom:null,path:"",area:zl([[[...e,e[0]]]])};const s=t.id||`#${i.rooms.indexOf(t)}`,n=`${i.id}|${this._cfgEpoch}|${s}`;if(!this._rszPreview){const t=r_(this._cleanFloorCache,n);if(t.hit)return t.value}const o=e.map(t=>t[0]),a=e.map(t=>t[1]),r=[Math.min(...o),Math.min(...a),Math.max(...o),Math.max(...a)],l=this._physicalBodiesR(i).filter(t=>{const e=t.map(t=>t[0]),i=t.map(t=>t[1]);return Math.max(...e)>=r[0]&&Math.min(...e)<=r[2]&&Math.max(...i)>=r[1]&&Math.min(...i)<=r[3]}),c=l.length?Fl(e,l):null,h={floor:e,geom:c,path:c?Cl(c):"",area:zl(c||[[[...e,e[0]]]])};return this._rszPreview||l_(this._cleanFloorCache,n,h,600),h}_autoIconForBinding(t){if("virtual"===t)return"mdi:map-marker";const[e,i]=t.split(":");if(!i)return"";const s=this._fullRegistryHass,n=this._bindingStatus(t),o="active"===n.kind?n.enabledEntityIds:n.allEntityIds;if("device"===e){const t=s.devices?.[i];if(!t)return"mdi:help-circle";const e=o;return e.some(t=>t.startsWith("lock."))?"mdi:lock":vo(s,t.name_by_user||t.name||"",t.model,e,this._iconRules)}if("entity"===e){const t=s.entities?.[i],e=this.hass.states?.[i],n=t?.name||e?.attributes?.friendly_name||i;return i.startsWith("lock.")?"mdi:lock":vo(s,n,"",[i],this._iconRules)}return""}_allRoomsFlat(){const t=[];for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area?t.push({value:e.id+"#"+i.area,label:(e.title||e.id)+" · "+i.name}):i.id&&t.push({value:e.id+"#@"+i.id,label:(e.title||e.id)+" · "+i.name+" · "+this._t("marker.subarea")});return t}_errText(t){if(!t)return this._t("err.unknown");if("string"==typeof t)return t;if("invalid_passage_fields"===t.code){const e=String(t.message||t.error||"").match(/space=([^;]*);\s*opening=([^;]*);\s*fields=([^;]*)/);if(e){const t=this._serverCfg?.spaces?.find(t=>String(t.id)===e[1]),i={contact:"opening.contact_label",lock:"opening.lock_label",invert:"opening.invert",flip_h:"opening.flip_h",flip_v:"opening.flip_v"},s=e[3].split(",").filter(Boolean).map(t=>i[t]?this._t(i[t]):t).join(", ");return this._t("opening.invalid_passage_fields",{room:t?.title||e[1],fields:s})}}if("invalid_partition_opening_jamb_margin"===t.code){const e=String(t.message||t.error||"").match(/margin_cm=([^;]*)/),i=e?Number(e[1]):NaN;if(Number.isFinite(i))return this._t("opening.partition_jamb_margin",{distance:li(i,this._imperial)})}if(t.message)return t.message;if(t.error)return t.error;if(null!=t.code)return this._t("err.code",{code:t.code});try{return JSON.stringify(t)}catch{return String(t)}}_backupErrorText(t){const e=t?.code??t?.error;if("string"==typeof e){const t=`backup.error.${e}`,i=this._t(t);if(i!==t)return i}return this._errText(t)}async _pickMarkerFiles(t){const e=t.target,i=e.files?[...e.files]:[];if(e.value="",!i.length||!this._markerDialog)return;const s=this._markerDialog.uploadId||this._markerDialog.devId||"new",n=[];for(const t of i)try{const e=new FormData;e.append("marker_id",s),e.append("file",t,t.name);const i=this.hass?.fetchWithAuth?await this.hass.fetchWithAuth("/api/houseplan/upload",{method:"POST",body:e}):await fetch("/api/houseplan/upload",{method:"POST",body:e,headers:this.hass?.auth?.data?.access_token?{authorization:`Bearer ${this.hass.auth.data.access_token}`}:{}}),o=await i.json().catch(()=>({}));if(!i.ok||o.error){const t={too_large:this._t("err.too_large",{mb:o.max_mb||50}),bad_ext:this._t("err.bad_ext"),unauthorized:this._t("err.unauthorized")};throw new Error(t[o.error]||o.error||"HTTP "+i.status)}n.push({name:o.name||t.name,url:o.url})}catch(e){this._showToast(this._t("toast.file_failed",{name:t.name,err:this._errText(e)}))}n.length&&this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:[...this._markerDialog.pdfs,...n]},this._showToast(this._t("toast.files_attached",{n:n.length})))}_removeMarkerPdf(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:this._markerDialog.pdfs.filter(e=>e.url!==t)})}_markerLightFields(t){const e={};if(t.lightRoleTouched?"always"===t.lightRole?e.is_light=!0:"never"===t.lightRole&&(e.is_light=!1):t.originalHasIsLight&&(e.is_light=t.originalIsLight??null),t.lightEntityTouched?t.lightEntity&&(e.light_entity=t.lightEntity):t.originalHasLightEntity&&(e.light_entity=t.originalLightEntity??null),t.glowTouched){if("auto"!==t.glowMode){const i={c:Rt(t.glowColor,this._fillColors.glow_light.c)};"fixed"===t.glowMode&&(i.bri=Math.max(.01,Math.min(1,Math.round(t.glowBrightness)/100))),e.glow_color=i}}else t.originalHasGlowColor&&(e.glow_color=t.originalGlowColor??null);return e}_markerTapActionFields(t){return t.tapActionTouched?{tap_action:t.tapAction||null}:t.originalHasTapAction?{tap_action:t.originalTapAction??null}:{}}_markerToggleEntityFields(t){return(e={touched:t.toggleEntityTouched,originalHas:t.originalHasToggleEntity,original:t.originalToggleEntity,value:t.toggleEntity}).touched?e.value?{toggle_entity:e.value}:{}:e.originalHas?{toggle_entity:e.original??null}:{};var e}async _saveMarker(){const t=this._markerDialog;if(!t||t.busy)return;const e=this._effectiveMarkerTapAction(t);if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return;if("virtual"===t.binding&&!t.name.trim())return void this._showToast(this._t("toast.virtual_name_required"));if("run"===e&&!t.tapTarget)return void this._showToast(this._t("toast.run_target_required"));if(t.valueBadgeTouched&&t.valueBadgeEnabled&&!t.valueBadgeSource)return void this._showToast(this._t("toast.value_badge_source_required"));if("ha"===t.bindingMode){const e=this._bindingStatus(t.binding),i=t.devId?this._markers.find(e=>e.id===t.devId):null,s=!i||i.binding!==t.binding;if("active"!==e.kind&&s)return void this._showToast(this._t("ha_disabled"===e.kind?"toast.ha_disabled_add":"toast.ha_binding_unverified"));if("ha_disabled"===e.kind&&!0===i?.hidden&&!t.hideFromPlan)return this._markerDialog={...t,hideFromPlan:!0},void this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device"))}const i=this._serverCfg;if(!i)return;const s=i.markers||[],n=qs(t.room);let o=n?.space||null;const a=n?.area||null,r=n?.roomId||null,l=Fi(t.binding,t.devId,()=>"v_"+Date.now().toString(36)),c=t.devId,h=c?this._devices.find(t=>t.id===c):null,d=n?.space||h?.space||null,u=d?this._spaceModelById(d):this._spaceModel();if(!u)return;const p=u.id;"virtual"!==t.binding||o||(o=p),this._markerDialog={...t,busy:!0};try{const n="virtual"===t.binding?[]:s.filter(e=>e.removed&&e.binding===t.binding).map(t=>t.id),d=n.length>0,_=Xn(t.binding,t.controls,this._bindingEntities(t.binding)),g=s.find(t=>t.id===l||t.id===c)?.vacuum||null,m={id:l,vacuum:g,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&3!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle?t.angle:null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===e&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:_.length?_:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=a_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:!!t.hideFromPlan};("virtual"===t.binding||t.room)&&(m.space=o,m.area=a,m.room_id=r);const f=h?.marker?.room_id??null,v=!!t.room&&null!=h&&(h.space!==o||h.area!==a||f!==r);let y=!1;const b=t.uploadId||c;if(b&&b!==l&&m.pdfs?.length)try{const t=await this.hass.callWS({type:"houseplan/files/migrate",from_id:b,to_id:l}),e=t?.mapping||{};m.pdfs=function(t,e,i,s){if(!e||!i||e===i)return t;const n="/files/"+e+"/",o="/files/"+i+"/";return t.map(t=>{if(!t.url.includes(n))return t;const e=t.url.split(n)[1]||"",[i,a]=[e.split("?")[0],e.includes("?")?"?"+e.split("?")[1]:""];if(s){const e=s[decodeURIComponent(i)]??s[i];return e?{...t,url:t.url.split(n+i)[0]+o+encodeURIComponent(e)+a}:t}return{...t,url:t.url.split(n).join(o)}})}(m.pdfs,b,l,e),y=Object.keys(e).length>0}catch(t){this._showToast(this._t("toast.files_migrate_failed",{err:this._errText(t)}))}i.markers=s,c&&c!==l&&(i.markers=function(t,e,i){if(!e||!i||e===i)return[...t];const s=`marker:${e}`,n=`marker:${i}`;return t.map(t=>{const e=Array.isArray(t.controls)?t.controls.map(t=>t===s?n:t):t.controls,i="derived_marker_state"===t.value_badge?.source?.kind&&t.value_badge.source.ref===s?{...t.value_badge,source:{...t.value_badge.source,ref:n}}:t.value_badge;return e===t.controls&&i===t.value_badge?t:{...t,controls:e,value_badge:i}})}(i.markers,c,l)),c&&c!==l&&"derived_marker_state"===m.value_badge?.source?.kind&&m.value_badge.source.ref===`marker:${c}`&&(m.value_badge.source={kind:"derived_marker_state",ref:`marker:${l}`}),i.markers=i.markers.filter(t=>t.id!==l&&t.id!==c&&("virtual"===m.binding||t.binding!==m.binding)),i.markers.push(m);let w=null;const k=c?this._layout[c]:null,$=k?{s:k.s||h?.space||this._space,x:k.x,y:k.y}:c&&h&&this._defPos[c]?this._normPos(h.space,this._defPos[c].x,this._defPos[c].y):null;if(!d&&$&&$.s===p)l===c&&this._layout[l]&&!v||(w={s:$.s,x:$.x,y:$.y},this._layout={...this._layout,[l]:w});else if(d||!this._layout[l]||v){let t=u.vb[0]+u.vb[2]/2,e=u.vb[1]+u.vb[3]/2;const i=r?u.rooms.find(t=>t.id===r):a?u.rooms.find(t=>t.area===a):void 0;i&&([t,e]=this._roomCenter(i)),w=this._normPos(p,t,e),this._layout={...this._layout,[l]:w}}await this._saveConfigNow(),w&&this._noteLayoutRev(await this.hass.callWS({type:"houseplan/layout/update",device_id:l,pos:w}));const x=new Set(n);c&&c!==l&&x.add(c),x.delete(l);for(const t of x)delete this._layout[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{});y&&b&&await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:b}).catch(()=>{}),this._markerDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_saved"))}catch(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}async _deleteMarker(){const t=this._markerDialog;if(!t||t.busy||!t.devId)return;const e=t.devId?this._devices.find(e=>e.id===t.devId):null;if(!e)return;const i=t.name||this._t("device.fallback");if(!confirm(this._t("confirm.remove_marker",{name:i})))return;const s=this._serverCfg;s.markers=s.markers||[];const n=s.markers,o="virtual"===e.bindingKind?"virtual":e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:"";if(!o)return;const a=function(t,e,i,s){const n=new Set([e]),o=t.filter(t=>{const o=t.id===e||!s&&t.binding===i;return o&&n.add(t.id),!o});return{markers:s?o:[...o,{id:e,binding:i,removed:!0,hidden:!0}],cleanupIds:n}}(s.markers,e.id,o,"virtual"===e.bindingKind);var r,l;s.markers=(r=a.markers,l=a.cleanupIds,r.map(t=>{if(!Array.isArray(t.controls))return t;const e=t.controls.filter(t=>!("string"==typeof t&&t.startsWith("marker:")&&l.has(t.slice(7))));return e.length===t.controls.length?t:{...t,controls:e.length?e:null}}));const c=a.cleanupIds;this._markerDialog={...t,busy:!0};try{await this._saveConfigNow();for(const t of c){delete this._layout[t],delete this._defPos[t],this._dirtyPos.delete(t),this._sentPos.delete(t);const e=this._activityRt.get(t);e&&clearTimeout(e.timer),this._activityRt.delete(t),this._vacRt.delete(t),delete this._vacSrvTrails[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{}),await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:t}).catch(()=>{}),await this.hass.callWS({type:"houseplan/trail/delete",marker_id:t}).catch(()=>{})}this._markerDialog=null,this._infoCard?.id===e.id&&this._closeInfoCard(),this._selId===e.id&&(this._selId=null),this._drag?.id===e.id&&(this._drag=null),this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_removed"))}catch(t){this._serverCfg===s&&(s.markers=n),this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}_normPos(t,e,i){return{s:t,x:e/y_,y:i/y_}}_openSpaceDialog(t,e){if(this._serverStorage&&this._serverCfg)if("edit"===t){const i=this._serverCfg.spaces.find(t=>t.id===e);if(!i)return;const s=cs(i),n=i.settings?.custom_fill&&"object"==typeof i.settings.custom_fill?rs(i.settings.custom_fill):null,o="none"===s.fill?{...n||as,a:0}:n;this._spaceDialog={mode:t,spaceId:e,title:i.title,planUrl:i.plan_url||null,planFile:null,source:i.plan_url?"file":"draw",showBorders:s.showBorders,showNames:s.showNames,hideDecor:s.hideDecor,hideOpenings:s.hideOpenings,roomColor:s.color,roomOpacity:s.opacity,fillMode:"none"===s.fill?"custom":s.fill,customFill:o,glowEnabled:s.glow,bgColor:s.bgColor,bgMode:"static"===i.settings?.bg_mode||"daynight"===i.settings?.bg_mode?i.settings.bg_mode:null,northDeg:Ka({},i.settings),sunRays:"boolean"==typeof i.settings?.sun_rays?i.settings.sun_rays:null,tempMin:s.tempMin,tempMax:s.tempMax,showLqi:s.showLqi??this._config?.show_signal??!0,cardFontScale:s.cardFontScale,labelTemp:s.labelTemp,labelHum:s.labelHum,labelLqi:s.labelLqi,labelLight:s.labelLight,cellCm:Number(i.cell_cm)>0?Number(i.cell_cm):5,busy:!1}}else this._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,source:"file",showBorders:!1,showNames:!1,hideDecor:!1,hideOpenings:!1,roomColor:ns,roomOpacity:os,fillMode:"custom",customFill:{...as,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:20,tempMax:25,showLqi:this._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:5,busy:!1};else this._showToast(this._t("toast.integration_missing"))}async _pickPlanFile(t){const e=t.target,i=e.files?.[0];if(!i||!this._spaceDialog)return;const s={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/webp":"webp"}[i.type]||(i.name.toLowerCase().endsWith(".svg")?"svg":"");if(!s)return void this._showToast(this._t("toast.plan_formats"));const n=new Uint8Array(await i.arrayBuffer());let o="";for(let t=0;t{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:1.414),e.onerror=()=>t(1.414),e.src=r});URL.revokeObjectURL(r),this._spaceDialog={...this._spaceDialog,planFile:{ext:s,b64:a,aspect:l,name:i.name}}}_useServerPlan(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let e=0;e<40;e++){const e=this._display(t);if(e){const i=await new Promise(t=>{const i=new Image;i.onload=()=>t(i.naturalWidth&&i.naturalHeight?i.naturalWidth/i.naturalHeight:0),i.onerror=()=>t(0),i.src=e}),s=this._spaceDialog;return s&&s.planUrl===t&&Number.isFinite(i)&&i>0?(this._spaceDialog={...s,savedAspect:i},i):0}if(await new Promise(t=>setTimeout(t,150)),this._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){if(confirm(this._t("confirm.delete_plan",{name:t})))try{await this.hass.callWS({type:"houseplan/plans/delete",name:t});const e=this._spaceDialog;e?.saved&&(this._spaceDialog={...e,saved:e.saved.filter(e=>e.name!==t)})}catch(t){this._showToast(this._t("toast.plan_delete_failed",{err:this._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return j`
${this._t("space.loading")}
`;const e=t.saved||[];if(!e.length)return j`
${this._t("space.no_saved")}
`;return j`
${e.map(e=>j`
@@ -5818,7 +5818,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 @pointermove=${t=>this._rlResizeMove(t)} @pointerup=${()=>this._rlResizeUp()} @pointercancel=${()=>this._rlResizeUp()}>`):G} -
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"!==this._tool&&"partition"!==this._tool||!this._path.length||this._contourClosed?"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:this._path[this._path.length-1]:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=Os(e,i),a=Math.round(10*o)/10,r=Hs(o);return j`
+
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"===this._tool&&this._path.length&&!this._contourClosed?this._path[this._path.length-1]:"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=Os(e,i),a=Math.round(10*o)/10,r=Hs(o);return j`
${this._fmtLen(e,i)} · ${a}°
`}get _decorMeasure(){const t=this._decorDraft;if(!t||"decor"!==this._mode)return null;const[e,i]=t.a,[s,n]=t.b;if(Math.abs(e-s)<1e-6&&Math.abs(i-n)<1e-6)return null;const o=(e+s)/2,a=(i+n)/2;if("line"===t.kind){const e=Os(t.a,t.b);return{x:o,y:a,on45:Hs(e),text:`${this._fmtLen(t.a,t.b)} · ${Math.round(10*e)/10}°`}}const r=this._fmtLen([e,i],[s,i]),l=this._fmtLen([s,i],[s,n]);if("ellipse"===t.kind){const t=this._fmtLen([0,0],[Math.abs(s-e)/2,0]),r=this._fmtLen([0,0],[0,Math.abs(n-i)/2]);return{x:o,y:a,on45:!1,text:Math.abs(Math.abs(s-e)-Math.abs(n-i))<1e-6?`R ${t}`:`Rx ${t} × Ry ${r}`}}return{x:o,y:a,on45:!1,text:`${r} × ${l} · ${Da(ar(Math.abs(s-e),this._cellCm,this._gridPitch)*ar(Math.abs(n-i),this._cellCm,this._gridPitch)/1e4,this._imperial)}`}}get _alignPoint(){if(this._markup){if("draw"===this._tool&&this._path.length&&!this._contourClosed&&this._cursorPt)return this._cursorPt;if("split"===this._tool&&this._splitSel?.pts?.length&&this._cursorPt)return this._cursorPt;if(this._drag?.id.startsWith("rl_")&&this._drag.moved){const t=this._drag.id.slice(3),e=this._spaceModel()?.rooms.find(e=>e.id===t);return e?(()=>{const t=this._labelPos(e,this._space);return[t.x,t.y]})():null}return null}if("devices"===this._mode&&this._drag?.moved){const t=this._devices.find(t=>t.id===this._drag.id);return t?(()=>{const e=this._pos(t);return[e.x,e.y]})():null}if("decor"===this._mode){if(this._decorDraft)return this._decorDraft.b;if(this._decorMove){const t=this._decorList.find(t=>t.id===this._decorMove.id);if(!t)return null;const e=y_,i=this._decorH;return"line"===t.kind?[t.x1*e,t.y1*i]:[t.x*e,t.y*i]}return null}return null}_alignCandidates(){const t=[],e=this._spaceModel();if(this._markup){if(!e)return t;if(this._drag?.id.startsWith("rl_")){const i=this._drag.id.slice(3);for(const s of e.rooms){if(!s.name||s.id===i)continue;const e=this._labelPos(s,this._space);t.push([e.x,e.y])}return t}for(const i of e.rooms){const e=hi(i);if(e)for(const i of e)t.push(i)}if("draw"===this._tool)for(const e of this._path)t.push(e);if("split"===this._tool&&this._splitSel?.pts)for(const e of this._splitSel.pts)t.push(e);return t}if("devices"===this._mode){for(const e of this._devices){if(e.space!==this._space||e.id===this._drag?.id||"ha_disabled"===e.bindingStatus?.kind)continue;const i=this._pos(e);t.push([i.x,i.y])}return t}if("decor"===this._mode){const e=this._decorMove?.id;return t.push(...this._decorSnapGeometry(e).points),this._decorDraft&&t.push(this._decorDraft.a),t}return t}_renderAlignGuides(){const t=this._alignPoint;if(!t)return W``;const e=this._drag?.id.startsWith("rl_")?.5*this._gridPitch:.05*this._gridPitch,i=function(t,e,i){let s=null,n=null;for(const o of e)if(!(Math.abs(o[0]-t[0])<1e-6&&Math.abs(o[1]-t[1])<1e-6)){if(Math.abs(o[0]-t[0])<=i){const e=Math.abs(o[1]-t[1]);e>1e-6&&(!s||e1e-6&&(!n||e ${i.map(e=>{const[i,o,a,r]="x"===e.axis?[e.at,e.from[1],e.at,t[1]+Math.sign(t[1]-e.from[1])*n]:[e.from[0],e.at,t[0]+Math.sign(t[0]-e.from[0])*n,e.at];return W` `})} @@ -5993,7 +5993,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 data-kind="rotate" @pointerdown=${t=>this._physicalRotateDown(t,s)} @pointermove=${t=>this._physicalRotateMove(t)} @pointerup=${t=>this._physicalRotateUp(t)}> - `})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool&&"partition"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=fr(5,this._cellCm,this._gridPitch),s=fr(10,this._cellCm,this._gridPitch);return W``})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=fr(5,this._cellCm,this._gridPitch),s=fr(10,this._cellCm,this._gridPitch);return W``}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(fr(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=il(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,y_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:fr(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return Nr([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Ds(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,a=this._gridPitch,r=this._viewOr(this._baseVb()),l="draw"===this._tool||"partition"===this._tool?this._drawWallCm:null,c=(()=>"draw"!==this._tool&&"partition"!==this._tool||!o.length||!(null!=l&&l>0)?null:this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null)(),h=c?c.slice(0,-1).map((t,e)=>fr(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||pr:l||pr,this._cellCm,this._gridPitch)/2):[],d=c?Lr(c,fr(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` + `}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(fr(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=il(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,y_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:fr(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return Nr([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Ds(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,a=this._gridPitch,r=this._viewOr(this._baseVb()),l="draw"===this._tool?this._drawWallCm:null,c=(()=>"draw"===this._tool&&o.length&&null!=l&&l>0?this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null:null)(),h=c?c.slice(0,-1).map((t,e)=>fr(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||pr:l||pr,this._cellCm,this._gridPitch)/2):[],d=c?Lr(c,fr(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` ${this._gridLevels()?W``:G} ${n.map(t=>W``)} ${this._renderPhysicalEditorLayer()} @@ -6023,8 +6023,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 ${u?W` `:G} ${o.length>1?W``:G} - ${!o.length||!this._cursorPt||"draw"!==this._tool&&"partition"!==this._tool||this._contourClosed?G:W``} + ${o.length&&this._cursorPt&&"draw"===this._tool&&!this._contourClosed?W``:G} ${o.map((t,e)=>W``)} ${"split"===this._tool&&this._splitSel?.pts?.length?W`${this._splitSel.pts.length>1?W``:G} ${this._splitSel.pts.map((t,e)=>W``)} diff --git a/demo/golden/harness.mjs b/demo/golden/harness.mjs index 209c096f..3e4afa3c 100644 --- a/demo/golden/harness.mjs +++ b/demo/golden/harness.mjs @@ -435,7 +435,7 @@ export async function prepareGoldenScenario(page, scenario) { const { tool, anchor, pointer, expectedKind } = scenario.planSnap; const validPoint = (point) => Array.isArray(point) && point.length === 2 && point.every(Number.isFinite); - if (!['draw', 'partition'].includes(tool) || !validPoint(pointer) + if (tool !== 'draw' || !validPoint(pointer) || (anchor != null && !validPoint(anchor)) || !['endpoint', 'line'].includes(expectedKind)) { throw new Error(`invalid golden planSnap contract: ${scenario.id}`); diff --git a/demo/smoke_free_walls.mjs b/demo/smoke_free_walls.mjs index 13a68ae4..b1e6f9ab 100644 --- a/demo/smoke_free_walls.mjs +++ b/demo/smoke_free_walls.mjs @@ -52,12 +52,28 @@ const out = await page.evaluate(async () => { // Keep the smoke local: editor transactions still mutate the real config, // invalidate derived models and history, but do not need a websocket write. c._saveConfig = () => { c._cfgEpoch++; c._modelCache = null; c.requestUpdate(); }; + c.requestUpdate(); await c.updateComplete; - c._tool = 'partition'; - c._drawWallField = '15'; - c._partitionClick([100, 100], false); - c._partitionClick([300, 100], false); + const stage = (c.shadowRoot || c.renderRoot).querySelector('.stage'); + const clickAt = (x, y) => { + const rect = stage.getBoundingClientRect(); + const view = c._viewOr(c._baseVb()); + return new MouseEvent('click', { + clientX: rect.left + ((x - view.x) / view.w) * rect.width, + clientY: rect.top + ((y - view.y) / view.h) * rect.height, + bubbles: true, + }); + }; + const drawAndFinish = (a, b, cm) => { + c._activateMarkupTool('draw'); + c._drawWallField = String(cm); + c._markupClick(clickAt(...a)); + c._markupClick(clickAt(...b)); + c._activateMarkupTool('select'); + }; + + drawAndFinish([100, 100], [300, 100], 15); let sp = c._serverCfg.spaces[0]; o.partitionCreated = sp.partitions?.length === 1 && sp.partitions[0].cm === 15; @@ -174,10 +190,7 @@ const out = await page.evaluate(async () => { c._deletePhysicalSelection(); o.deleteOnDraftRemovesWholeOutline = !c._serverCfg.spaces[0].room_drafts; - c._tool = 'partition'; - c._drawWallField = '120'; - c._partitionClick([400, 100], false); - c._partitionClick([500, 100], false); + drawAndFinish([400, 100], [500, 100], 120); o.invalidThicknessCreatesNothing = !c._serverCfg.spaces[0].partitions; return o; diff --git a/demo/smoke_plan_snap_overlay.mjs b/demo/smoke_plan_snap_overlay.mjs index 4a103c74..713b676a 100644 --- a/demo/smoke_plan_snap_overlay.mjs +++ b/demo/smoke_plan_snap_overlay.mjs @@ -182,9 +182,11 @@ const out = await page.evaluate(async () => { await card.updateComplete; result.currentAnchorDoesNotCreateZeroSegment = !active(); card._cancelPath(); - card._tool = 'partition'; + card._activateMarkupTool('draw'); await update(); - card._markupClick(eventAt(735, 606, 'click')); + // Use a fresh point on the same physical line: the earlier assertion left + // 735,600 as a saved-draft endpoint, and public Walls correctly resumes it. + card._markupClick(eventAt(775, 606, 'click')); await card.updateComplete; result.tapWithoutHoverSnapsFirstPoint = card._path.length === 1 && close(card._path[0][1], 600) @@ -192,7 +194,9 @@ const out = await page.evaluate(async () => { Math.round((card._path[0][0] - 600) / card._gridPitch)); card._markupClick(eventAt(896, 496, 'click')); await card.updateComplete; - result.secondPartitionClickSnapsEndpoint = card._path.length === 0 + card._activateMarkupTool('select'); + await update(); + result.secondWallsClickFinishesSnappedPartition = card._path.length === 0 && card._curSpaceCfg.partitions.length === 2 && close(card._curSpaceCfg.partitions[1].b[0] * 1000, 900) && close(card._curSpaceCfg.partitions[1].b[1] * 1000, 500); @@ -202,6 +206,8 @@ const out = await page.evaluate(async () => { drafts: card._curSpaceCfg.room_drafts, partitions: card._curSpaceCfg.partitions, }); + card._activateMarkupTool('draw'); + await update(); card._suppressClick = true; card._markupClick(eventAt(700, 600, 'click')); result.suppressedClickDoesNotCommit = card._path.length === 0; @@ -222,7 +228,7 @@ const out = await page.evaluate(async () => { partitions: card._curSpaceCfg.partitions, }) === gestureGeometry; - card._tool = 'select'; + card._activateMarkupTool('select'); await update(); result.otherPlanToolsHaveNoOverlay = !overlay(); card._setMode('view'); diff --git a/demo/srv/assets/houseplan-card.js b/demo/srv/assets/houseplan-card.js index b4cd39ec..bcf6aff8 100755 --- a/demo/srv/assets/houseplan-card.js +++ b/demo/srv/assets/houseplan-card.js @@ -1,4 +1,4 @@ -globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c";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)},a=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:r,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g: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)=>!r(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(a(t))}else void 0!==t&&e.push(a(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,m?.({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,I=Array.isArray,E="[ \t\n\f\r]",F=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${E}(?:([^\\s"'>=/]+)(${E}*=${E}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(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?"":"",a=F;for(let e=0;e"===l[0]?(a=n??F,c=-1):void 0===l[1]?c=-2:(c=a.lastIndex-l[2].length,r=l[1],a=void 0===l[3]?H:'"'===l[3]?L:N):a===L||a===N?a=H:a===z||a===O?a=F:(a=H,n=void 0);const d=a===H&&t[e+1].startsWith("/>")?" ":"";o+=a===F?i+T:c>=0?(s.push(r),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 J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const a=t.length-1,r=this.parts,[l,c]=X(t,e);if(this.el=J.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())&&r.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iI(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=J.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 J(t)),e}k(t){I(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=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let a,r;for(t=n[0],a=0;a{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 U}};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,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=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 gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=at,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,a=o!==t;if(a){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||a){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},$t=(t,e=kt)=>t._$AH=e,xt=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{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 a=0;for(const e of t)n[a]=s?s(e,a):a,o[a]=i(e,a),a++;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:a}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=a,o;const r=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(r[d]===a[p])l[p]=wt(n[d],o[p]),d++,p++;else if(r[u]===a[_])l[_]=wt(n[u],o[_]),u--,_--;else if(r[d]===a[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(r[u]===a[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(a,p,_),h=St(r,d,u)),c.has(r[d]))if(c.has(r[u])){const e=h.get(a[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else xt(n[u]),u--;else xt(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&xt(t)}return this.ut=a,$t(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt 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-"+ ++Dt,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=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.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?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.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=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_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=j` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc";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)},a=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:r,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g: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)=>!r(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(a(t))}else void 0!==t&&e.push(a(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,m?.({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,I=Array.isArray,E="[ \t\n\f\r]",F=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${E}(?:([^\\s"'>=/]+)(${E}*=${E}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(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?"":"",a=F;for(let e=0;e"===l[0]?(a=n??F,c=-1):void 0===l[1]?c=-2:(c=a.lastIndex-l[2].length,r=l[1],a=void 0===l[3]?H:'"'===l[3]?L:N):a===L||a===N?a=H:a===z||a===O?a=F:(a=H,n=void 0);const d=a===H&&t[e+1].startsWith("/>")?" ":"";o+=a===F?i+T:c>=0?(s.push(r),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 J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const a=t.length-1,r=this.parts,[l,c]=X(t,e);if(this.el=J.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())&&r.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iI(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=J.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 J(t)),e}k(t){I(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=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let a,r;for(t=n[0],a=0;a{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 U}};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,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=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 gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=at,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,a=o!==t;if(a){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||a){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},$t=(t,e=kt)=>t._$AH=e,xt=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{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 a=0;for(const e of t)n[a]=s?s(e,a):a,o[a]=i(e,a),a++;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:a}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=a,o;const r=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(r[d]===a[p])l[p]=wt(n[d],o[p]),d++,p++;else if(r[u]===a[_])l[_]=wt(n[u],o[_]),u--,_--;else if(r[d]===a[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(r[u]===a[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(a,p,_),h=St(r,d,u)),c.has(r[d]))if(c.has(r[u])){const e=h.get(a[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else xt(n[u]),u--;else xt(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&xt(t)}return this.ut=a,$t(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt 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-"+ ++Dt,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=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.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?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.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=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_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=j` ${this.icon?j``:G} ${this.title} `;return this._useHaDialog?j`${t.lqiText}`:G} - `;var o}function Uo(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Go=new WeakMap;function Vo(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Go.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Go.set(e,i)),i}function Ko(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Yo(t,e){const i=Vo(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Ko(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Xo(t){const e=Vo(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Jo(t,e,i=Xo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function Zo(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const a=n?s.configEntries[n]:null;return{domain:o,label:Jo(t,o,s,a?.title),configEntryId:n,configEntryTitle:a?.title,confidence:i}}function Qo(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function ta(t,e,i,s=Xo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,a=o?s.configEntries[o]?.domain:"";return Zo(t,n.platform||a,"entity-platform",s,o)}var ea={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_partition":"Partition: draw one independent physical wall","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_partition":"two clicks draw one partition · Shift locks to 45°","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.partition_size_title":"Thickness of the partition created by the second click (1–100 cm).","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The black plate and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Default space","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const ia={en:ea,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_partition":"Перегородка: нарисуйте одну независимую физическую стену","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_partition":"два клика рисуют одну перегородку · Shift фиксирует шаг 45°","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.partition_size_title":"Толщина перегородки, создаваемой вторым кликом (1–100 см).","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Всегда одинаковые чёрная подложка и значок. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Пространство по умолчанию","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function sa(t,e){if(e&&e in ia)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function na(t,e,i){return ss(ia[t][e]??ea[e]??e,i)}function oa(t,e){const i=ia[t][e]??ia.en[e];return"string"==typeof i&&i.trim().length>0}class aa extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Yo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return sa(this.hass)}_t(t,e){return na(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Xo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),a=e.slice(n+1);if("entity"===o){const e=ta(t,a,i,s);return e?[e]:[]}if("device"!==o)return[];const r=i.devices?.[a]||t?.devices?.[a];if(!r)return[];const l=[r.config_entry_id,...Array.isArray(r.config_entries)?r.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return Zo(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return Qo(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===a&&null==n?.disabled_by&&c.push(ta(t,e,i,s));return c.some(Boolean)?Qo(c):Qo((Array.isArray(r.identifiers)?r.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return Zo(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Xo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=ta(this.hass,t,this.registry,Xo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:s?null:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let a=-o/2,r=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(r=Math.max(r,s+t)),"left"===i.valueBadge.position&&(a=Math.min(a,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,r-a),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((a+r)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=jo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",To(t.valueBadge)].filter(Boolean).join(". ");return j`
+ `;var o}function Uo(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Go=new WeakMap;function Vo(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Go.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Go.set(e,i)),i}function Ko(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Yo(t,e){const i=Vo(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Ko(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Xo(t){const e=Vo(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Jo(t,e,i=Xo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function Zo(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const a=n?s.configEntries[n]:null;return{domain:o,label:Jo(t,o,s,a?.title),configEntryId:n,configEntryTitle:a?.title,confidence:i}}function Qo(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function ta(t,e,i,s=Xo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,a=o?s.configEntries[o]?.domain:"";return Zo(t,n.platform||a,"entity-platform",s,o)}var ea={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The black plate and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Default space","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const ia={en:ea,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Всегда одинаковые чёрная подложка и значок. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Пространство по умолчанию","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function sa(t,e){if(e&&e in ia)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function na(t,e,i){return ss(ia[t][e]??ea[e]??e,i)}function oa(t,e){const i=ia[t][e]??ia.en[e];return"string"==typeof i&&i.trim().length>0}class aa extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Yo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return sa(this.hass)}_t(t,e){return na(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Xo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),a=e.slice(n+1);if("entity"===o){const e=ta(t,a,i,s);return e?[e]:[]}if("device"!==o)return[];const r=i.devices?.[a]||t?.devices?.[a];if(!r)return[];const l=[r.config_entry_id,...Array.isArray(r.config_entries)?r.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return Zo(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return Qo(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===a&&null==n?.disabled_by&&c.push(ta(t,e,i,s));return c.some(Boolean)?Qo(c):Qo((Array.isArray(r.identifiers)?r.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return Zo(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Xo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=ta(this.hass,t,this.registry,Xo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:s?null:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let a=-o/2,r=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(r=Math.max(r,s+t)),"left"===i.valueBadge.position&&(a=Math.min(a,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,r-a),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((a+r)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=jo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",To(t.valueBadge)].filter(Boolean).join(". ");return j`
${this._t("marker.preview.title")} @@ -4543,7 +4543,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 ${t?.visibleLabel?j`${t.visibleLabel}`:G}
${t?.content||G}
-
`}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Fu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Fu(t,t=>t.classList.contains("editor-secondary")),s=Fu(t,t=>!!t.dataset.editorGroup),n=Fu(t,t=>!!t.dataset.editorPalette),o=Fu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Ou=t=>t.stopPropagation(),Hu=4.166666666666667e-9;function Nu(t){if(!Number.isFinite(t))return t;const e=Math.round(t/Zl)*Zl;return Math.abs(e-t)<=Hu?t:e}const Lu=(t,e,i,s)=>Math.hypot(i-t,s-e),Bu=(t,e,i,s,n,o,a,r)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+a-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+r-(e+s)))),qu=(t,e,i,s,n,o,a)=>{const r=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*r,h=Math.sin(i*l)*r,d=Math.cos(a*l)*r,u=Math.sin(a*l)*r,p=Math.max(Lu(t+c,e+h,n+d,o+u),Lu(t-c,e-h,n-d,o-u)),_=Math.max(Lu(t+c,e+h,n-d,o-u),Lu(t-c,e-h,n+d,o+u));return Math.min(p,_)},ju=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const Wu=t=>JSON.parse(JSON.stringify(t)),Uu=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Gu=(t,e,i)=>Math.min(i,Math.max(e,t)),Vu=t=>Vl({spaces:[t]})[0],Ku=t=>{const e=[];for(const i of t||[]){const t=hi(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&Uu(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(Uu(n,"segments")&&(delete n.segments,e++),Uu(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=jl&&t<=Wl&&(Uu(n,"plan_scale_x")||(n.plan_scale_x=t),Uu(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);Uu(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?Gu(o,.1,1e3):5,e++);const a=Number(n.cell_cm),r=Number.isFinite(a)&&a>0?a:5;for(const t of n.wall_columns||[])if("circle"===t.shape)Uu(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&Uu(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(Uu(t,"width")){const i=Number(t.width);(Uu(t,"width_cm")||Number.isFinite(i))&&(Uu(t,"width_cm")||(t.width_cm=Number(Gu(i/Jl*r,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(Uu(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),Uu(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(Gu(es*is(t)/Jl*r,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(Uu(t,"scale")||Uu(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1]));if(!(Uu(t,"entity")||Uu(t,"attr")||Uu(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,a=s||n?"":Xi(t.entity,o);if(s||a){if(a){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+a+i.slice(e+2):`${i}${i?" ":""}${a}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let r=a.total;for(const t of i.spaces||[]){const e=Vu(t);if(!e)continue;if(!Fc(t.open_spans).length){const i=Lc(e.rooms,null,Bl,.02*Jl,!0);i.length&&(t.open_spans=Bc(i,Bl),r++)}}const l=Wu(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,a=0,r=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=ju(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Hu||s))return;n++,t>a&&(a=t);const o=t*Xl*e;o>r&&(r=o,l=i)};for(const t of i){const e=ju(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,a=Nu(e+n),r=Nu(i+o),l=Nu(e),c=Nu(i),h=Math.max(Zl,a-l),d=Math.max(Zl,r-c);t=Bu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i}),a=n.length?[n[0]]:[],r=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Nu(s.a[0]),Nu(s.a[1])],a=[Nu(s.b[0]),Nu(s.b[1])];let r=Math.max(Lu(s.a[0],s.a[1],n[0],n[1]),Lu(s.b[0],s.b[1],a[0],a[1]));const l=Lu(n[0],n[1],a[0],a[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Hu&&s+e/2<=l+Hu});l>Hu&&c?(s.a=n,s.b=a):r=0,p(r,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Nu(s.center[0]),Nu(s.center[1])],n=Lu(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Nu(s.x1),Nu(s.y1)],i=[Nu(s.x2),Nu(s.y2)];t=Math.max(Lu(s.x1,s.y1,e[0],e[1]),Lu(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Nu(s.x),i=Nu(s.y);if(null!=s.w&&null!=s.h){const n=Nu(s.x+s.w),o=Nu(s.y+s.h),a=Math.max(Zl,n-e),r=Math.max(Zl,o-i);t=Bu(s.x,s.y,s.w,s.h,e,i,a,r),s.w=a,s.h=r}else t=Lu(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const a=n.b[0]-n.a[0],r=n.b[1]-n.a[1];if(Math.hypot(a,r)<=Hu)continue;const l=n.a[0]+a*o,h=n.a[1]+r*o;let d=180*Math.atan2(r,a)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=qu(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=pi([s.x,s.y],t.rooms||[],.025,{step:Zl,length:Number(s.length)||0});if(!n)continue;const a=Number(s.angle),r=!(Number.isFinite(a)&&a===n.angle),l=qu(s.x,s.y,Number.isFinite(a)?a:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,r&&c++,p(l,e,i,r)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Nu(i.x),a=Nu(i.y),r=Lu(i.x,i.y,n,a);s[t]={...i,x:n,y:a};const l="string"==typeof i.s?i.s:"";p(r,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:a,maxShiftCm:r,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=Vu(e),a=Vu(s);if(!o||!a)continue;const r=Ku(o.rooms),c=Ku(a.rooms),_=.02*Jl;let g=Yc(Fc(e.open_spans),r,c,Bl);const m=g.length;g=Kc(g,a.rooms,Bl,_),g=g.map(t=>{const e=Ic(t,Bl),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],a=e[2]-e[0],r=e[3]-e[1],l=Math.hypot(a,r)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(a*s-r*e)/(l*c)<=1e-6&&zc(o,t).d<=4*_&&zc(i,t).d<=4*_&&zc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Hc(i,d,u,Jl,2*_),g=Hc(n,d,u,Jl,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Jl)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Jl){h.moved++;const t=m/Bl;t>h.maxShift&&(h.maxShift=t);const e=m/Jl*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Ac(p,g,Bl)}),g=Kc(g,a.rooms,Bl,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Ic(t,Bl));g.length?s.open_spans=g:delete s.open_spans,qc(s.rooms||[],a.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Rr(e.walls,r,c,Zl,Bl);y=el(a.rooms,y,f,Zl,Number(s.cell_cm)>0?Number(s.cell_cm):5,Jl,Bl),y=Tr(y,s.rooms||[],Zl,1,f.map(t=>[t[0]/Bl,t[1]/Bl,t[2]/Bl,t[3]/Bl])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:r,glowSpacesMigrated:a.glowSpaces,glowRoomsMigrated:a.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class Xu{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const Ju=new WeakMap;const Zu=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function Qu(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,a=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=a}),r=t.createElement("canvas");r.width=4,r.height=1;const l=r.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return Zu(c,i,0)&&Zu(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&Zu(c,s,8)&&Zu(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(a)}}const tp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},ep=t=>Math.max(0,Math.min(1,t)),ip=(t,e,i)=>t+(e-t)*i,sp=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function np(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function op(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function ap(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function rp(t,e,i){const s=ap(t),n=ap(e);if(!s||!n)return i<.5?t:e;const o=ep(i);return`rgba(${Math.round(ip(s[0],n[0],o))}, ${Math.round(ip(s[1],n[1],o))}, ${Math.round(ip(s[2],n[2],o))}, ${ip(s[3],n[3],o).toFixed(3)})`}function lp(t,e,i){const s=(t=>{const e=ep(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,sp(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=ep((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:lp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(a):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(a),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const hp="houseplan_card_labs_v1",dp=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function up(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function pp(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function yp(t,e,i,s=dp){const n=function(t,e=dp){const i=up(t),s=new Map;if(!i||!gp(e))return s;for(const t of e){const e=up(t.since),n=up(t.expires);pp(i,e)>=0&&pp(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(gp(s)?s.map(t=>t.id):[]),a=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let r=!1;const l=t=>{if("off"===t)return a.clear(),void(r=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(r=!0,e||!n.has(i)?a.delete(i):a.add(i))};for(const e of vp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of vp(mp(t.hash)))l(e);const c=Object.freeze([...a].sort());return{active:c,space:fp(t.hash),persist:r?JSON.stringify(c):void 0,knownUrlOperation:r}}let bp={active:Object.freeze([]),space:""},wp="",kp=!1,$p="";const xp=new Set;function Sp(){if("undefined"==typeof window)return bp;const t=yp(window.location,function(){try{return window.localStorage.getItem(hp)}catch{return null}}(),wp);void 0!==t.persist&&function(t){try{window.localStorage.setItem(hp,t)}catch{}}(t.persist),bp={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of xp)t(bp);return bp}function Mp(){Sp()}function Cp(t){return wp=t,"undefined"==typeof window?bp:(kp||(kp=!0,window.addEventListener("hashchange",Mp),window.addEventListener("popstate",Mp)),Sp())}const Dp=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),Tp=64;function Pp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function Rp(t,e,i=Dp){if(!(Pp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],a=t[1]-i.origin[1],r=(o*Math.cos(s)-a*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+a*Math.cos(s))*i.xyScale;return[i.origin[0]+r,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function Ap(t,e=Dp){if(!Pp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Ip(t=Dp){return`matrix(${function(t=Dp){if(!Pp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),a=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,a,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-a*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Ep(t,e=Dp){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const a=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],r=Math.max(s,n),l=a.flatMap(t=>[Rp(t,-o,e),Rp(t,r,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Fp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function zp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return zp(i)>0===s?i:[...i].reverse()}function Hp(t,e,i){return t.length?`M ${t.map(t=>Fp(Rp(t,i,e))).join(" L ")} Z`:""}function Np(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Lp(t,e,i=Dp){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Op(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(zp(t))>=1e-9)).filter(t=>t.length&&zp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(zp(e[0]))-Math.abs(zp(t[0]))});const n=[],o=[];let a=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:a}}function Bp(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const qp=t=>t.every(Number.isFinite);function jp(t,e,i,s){const n=t[0]*i,o=t[1]*s,a=e*Math.PI/180;return[n*Math.cos(a)-o*Math.sin(a),n*Math.sin(a)+o*Math.cos(a)]}function Wp(t,e,i,s,n,o,a){const r=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],jp(i,t.angle,r,l));return{leaf:e,hinge:c,closedVector:jp(s,t.angle,r,l),quarterVector:jp([-s[1],s[0]],t.angle,r,l),turnDeg:n,bottom:o,top:a}}const Up=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Gp(t,e,i=Dp){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=Rp(e.hinge,e.bottom,i),a=Rp(n,e.bottom,i),r=Rp(n,e.top,i),l=Rp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${Up(o)} L ${Up(a)} L ${Up(r)} L ${Up(l)} Z`,shadowD:`M ${Up(Rp(e.hinge,0,i))} L ${Up(Rp(n,0,i))}`,depth:Math.max(o[1],a[1])}})}const Vp={window:120,door:90,passage:90,gate:300};function Kp(t){return Vp[t]}function Yp(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function Xp(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=Yp(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function Jp(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function Zp(t){const e=Xp(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,r=(t[0]-e.a[0])*o+(t[1]-e.a[1])*a,l=Math.max(0,Math.min(n,r)),c=e.a[0]+l*o,h=e.a[1]+l*a;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*a-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],a=e.b[1]-e.a[1],r=Math.hypot(o,a);if(!(r>1e-9))return!1;const l=o/r,c=a/r;for(const o of i){if(!o.open&&o.kind)continue;const i=Yp(o.a,o.b),a=i.b[0]-i.a[0],r=i.b[1]-i.a[1],h=Math.hypot(a,r);if(!(h>1e-9))continue;const d=a/h,u=r/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(Jp),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(Jp);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),a=o.filter(t=>t.target.partitionHost);if(a.length){if(1!==new Set(a.map(t=>t.target.partitionHost.id)).size||a.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=a[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),r=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,c=Math.abs(r*a-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*r);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:r,length:l}=n,c=r.b[0]-r.a[0],h=r.b[1]-r.a[1],d=c/l,u=h/l,p=r.partitionHost?r.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=r.a[0]+d*g,y=r.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,$=Math.max(0,w),x=Math.max(0,l-k),S=[r.a[0]+d*(w-$/2),r.a[1]+u*(w-$/2)],M=[r.a[0]+d*(k+x/2),r.a[1]+u*(k+x/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:r,...r.partitionHost?{host:{...r.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:$,midpoint:S},{distance:x,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function Qp(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const t_="1.65.0-beta.4",e_={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},i_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},s_=2e3,n_=1e3,o_=1500,a_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},r_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},l_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},c_=new Map;let h_=0;const d_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let u_=1e4;const p_="houseplan_card_layout_v1",__="houseplan_card_cfg_v1",g_="houseplan_card_zoom_v1",m_="houseplan_card_nav_v1",f_="houseplan_card_kiosk_v1",v_="houseplan_card_view_v1",y_=1e3,b_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],w_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},k_=new Set(["select","draw","partition","column","merge","split","resize","opening","boundary","wallthick","delroom"]),$_=2e3,x_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},S_=t=>{history.pushState(null,"",t),x_(window,"location-changed",{replace:!1})},M_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},C_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class D_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=gn(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...er},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new cp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new zu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new Xu(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++h_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"!==t.kind){if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+Mu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()}else this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0)},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=In(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Cn(t);e&&(Pn(t,e),Rn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new oh(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=M_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem(p_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=M_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=a_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?$l:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?$l:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=a_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&Ll(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const a=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=xl(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=a_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),a),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],a=s.points.slice(0,n+1),r=s.points.slice(n+1);if(a.length>=2&&o.push({id:s.id,points:a,segments:s.segments.slice(0,n)}),r.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:r,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>$_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Na(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:hs(this._settings,{bgColor:null})||null,northDeg:Ka(this._settings,{}),bgMode:Ya(this._settings,{}),sunRays:Xa(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=Yu(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),a=this.renderRoot.querySelector(".hp-backdrop"),r=this.renderRoot.querySelector(".zoomwrap"),l=r?getComputedStyle(r).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:np(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:a&&Number(getComputedStyle(a).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=Oi(this._baseVb(),s/Math.max(1,n)),a=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),r=o.w/a,l=o.h/a,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-r/2,y:h-l/2,w:r,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const a=this.renderRoot.querySelector(".editorchrome"),r=a?.querySelector(".editorchrome-inner"),l="view"===i?0:r?.scrollHeight||r?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:np(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}_slideTo(t,e){if(t===this._space)return;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate())}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new eh(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(v_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?Ap(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?Rp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return fp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,Ju.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=Qc(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=Ju.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=Qu(t).catch(()=>!1).then(t=>(i.resolved=t,t)),Ju.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>As(this._serverCfg)),this._config?.kiosk&&Number(this._config?.cycle)>0&&(clearInterval(this._cycleTimer),this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle))),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){xp.add(e);const i=Cp(t);return"undefined"==typeof window&&e(i),()=>{xp.delete(e)}}(t_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),a=/^[a-z]$/.test(o),r="z"===o||!a&&"KeyZ"===t.code,l="y"===o||!a&&"KeyY"===t.code,c=n&&(r&&t.shiftKey||l),h=n&&r&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"!==this._tool&&"partition"!==this._tool||!this._path.length?"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry():void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint());if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length||"partition"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"partition"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of c_.values())for(const e of t)clearTimeout(e.evict);c_.clear(),u_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of c_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:c_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t},this._config.kiosk&&(this._booting=!1,this._bootFading=!1),t.default_floor&&(this._space=t.default_floor);try{this._zoomBySpace=JSON.parse(localStorage.getItem(g_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(v_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Cp(t_);try{const t=JSON.parse(localStorage.getItem(f_)||"null");this._kioskScale={icon:zs(t?.icon),font:zs(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(__)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||ih(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||ih(this._layout),this._virtualLights=gn(t.virtual_lights,this._cfgRev),this._serverStorage=!0,this._adoptInitialSpace(this._model))}catch{}"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=d_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=c_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Xc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:a}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,a=0,r=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>a?(o=i,a=t,r=1):t===a&&r++)}return!o||r>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Xc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),this._warmKey=t,a?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=c_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},u_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);if(this._hashApplied||!this._model.find(t=>t.id===e.space))return void(this._warmVp=null);this._space=e.space,this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const i=this._effectiveProjection(),s=i===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=s&&e.view?{...e.view}:null,this._viewModeSnap=s&&e.snap?{...e.snap}:null,!s&&e.logicalCenter){const t="iso"===i?Rp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var n;this._tool="openwall"===(n=e.tool)||"closewall"===n?"boundary":"opening"===(n=function(t){return"partition"===t?"draw":t}(n))?"draw":"string"==typeof n&&k_.has(n)?n:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=d_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=c_.get(i)||[];for(s.push(this._warmSlot),c_.set(i,s),this._warmTrim(s);c_.size>8;){const t=c_.keys().next().value;if(void 0===t||t===i)break;for(const e of c_.get(t)||[])clearTimeout(e.evict);c_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>u_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=ih(this._serverCfg),this._layoutContentFingerprint=ih(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(yn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(__,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:fn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t){return function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t){const e=this._initialSpaceSelection(t);return e.id?(this._space=e.id,"hash"===e.source&&(this._hashApplied=!0),"saved"===e.source&&(this._navApplied=!0),e):e}_candidateBackdrop(t,e=this._space){const i=Vl(t),s=this._initialSpaceSelection(i).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===s)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return sh([this._cfgRev,this._cfgContentFingerprint||ih(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||ih(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
`}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Fu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Fu(t,t=>t.classList.contains("editor-secondary")),s=Fu(t,t=>!!t.dataset.editorGroup),n=Fu(t,t=>!!t.dataset.editorPalette),o=Fu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Ou=t=>t.stopPropagation(),Hu=4.166666666666667e-9;function Nu(t){if(!Number.isFinite(t))return t;const e=Math.round(t/Zl)*Zl;return Math.abs(e-t)<=Hu?t:e}const Lu=(t,e,i,s)=>Math.hypot(i-t,s-e),Bu=(t,e,i,s,n,o,a,r)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+a-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+r-(e+s)))),qu=(t,e,i,s,n,o,a)=>{const r=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*r,h=Math.sin(i*l)*r,d=Math.cos(a*l)*r,u=Math.sin(a*l)*r,p=Math.max(Lu(t+c,e+h,n+d,o+u),Lu(t-c,e-h,n-d,o-u)),_=Math.max(Lu(t+c,e+h,n-d,o-u),Lu(t-c,e-h,n+d,o+u));return Math.min(p,_)},ju=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const Wu=t=>JSON.parse(JSON.stringify(t)),Uu=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Gu=(t,e,i)=>Math.min(i,Math.max(e,t)),Vu=t=>Vl({spaces:[t]})[0],Ku=t=>{const e=[];for(const i of t||[]){const t=hi(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&Uu(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(Uu(n,"segments")&&(delete n.segments,e++),Uu(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=jl&&t<=Wl&&(Uu(n,"plan_scale_x")||(n.plan_scale_x=t),Uu(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);Uu(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?Gu(o,.1,1e3):5,e++);const a=Number(n.cell_cm),r=Number.isFinite(a)&&a>0?a:5;for(const t of n.wall_columns||[])if("circle"===t.shape)Uu(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&Uu(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(Uu(t,"width")){const i=Number(t.width);(Uu(t,"width_cm")||Number.isFinite(i))&&(Uu(t,"width_cm")||(t.width_cm=Number(Gu(i/Jl*r,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(Uu(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),Uu(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(Gu(es*is(t)/Jl*r,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(Uu(t,"scale")||Uu(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1]));if(!(Uu(t,"entity")||Uu(t,"attr")||Uu(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,a=s||n?"":Xi(t.entity,o);if(s||a){if(a){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+a+i.slice(e+2):`${i}${i?" ":""}${a}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let r=a.total;for(const t of i.spaces||[]){const e=Vu(t);if(!e)continue;if(!Fc(t.open_spans).length){const i=Lc(e.rooms,null,Bl,.02*Jl,!0);i.length&&(t.open_spans=Bc(i,Bl),r++)}}const l=Wu(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,a=0,r=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=ju(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Hu||s))return;n++,t>a&&(a=t);const o=t*Xl*e;o>r&&(r=o,l=i)};for(const t of i){const e=ju(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,a=Nu(e+n),r=Nu(i+o),l=Nu(e),c=Nu(i),h=Math.max(Zl,a-l),d=Math.max(Zl,r-c);t=Bu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i}),a=n.length?[n[0]]:[],r=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Nu(s.a[0]),Nu(s.a[1])],a=[Nu(s.b[0]),Nu(s.b[1])];let r=Math.max(Lu(s.a[0],s.a[1],n[0],n[1]),Lu(s.b[0],s.b[1],a[0],a[1]));const l=Lu(n[0],n[1],a[0],a[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Hu&&s+e/2<=l+Hu});l>Hu&&c?(s.a=n,s.b=a):r=0,p(r,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Nu(s.center[0]),Nu(s.center[1])],n=Lu(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Nu(s.x1),Nu(s.y1)],i=[Nu(s.x2),Nu(s.y2)];t=Math.max(Lu(s.x1,s.y1,e[0],e[1]),Lu(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Nu(s.x),i=Nu(s.y);if(null!=s.w&&null!=s.h){const n=Nu(s.x+s.w),o=Nu(s.y+s.h),a=Math.max(Zl,n-e),r=Math.max(Zl,o-i);t=Bu(s.x,s.y,s.w,s.h,e,i,a,r),s.w=a,s.h=r}else t=Lu(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const a=n.b[0]-n.a[0],r=n.b[1]-n.a[1];if(Math.hypot(a,r)<=Hu)continue;const l=n.a[0]+a*o,h=n.a[1]+r*o;let d=180*Math.atan2(r,a)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=qu(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=pi([s.x,s.y],t.rooms||[],.025,{step:Zl,length:Number(s.length)||0});if(!n)continue;const a=Number(s.angle),r=!(Number.isFinite(a)&&a===n.angle),l=qu(s.x,s.y,Number.isFinite(a)?a:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,r&&c++,p(l,e,i,r)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Nu(i.x),a=Nu(i.y),r=Lu(i.x,i.y,n,a);s[t]={...i,x:n,y:a};const l="string"==typeof i.s?i.s:"";p(r,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:a,maxShiftCm:r,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=Vu(e),a=Vu(s);if(!o||!a)continue;const r=Ku(o.rooms),c=Ku(a.rooms),_=.02*Jl;let g=Yc(Fc(e.open_spans),r,c,Bl);const m=g.length;g=Kc(g,a.rooms,Bl,_),g=g.map(t=>{const e=Ic(t,Bl),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],a=e[2]-e[0],r=e[3]-e[1],l=Math.hypot(a,r)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(a*s-r*e)/(l*c)<=1e-6&&zc(o,t).d<=4*_&&zc(i,t).d<=4*_&&zc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Hc(i,d,u,Jl,2*_),g=Hc(n,d,u,Jl,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Jl)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Jl){h.moved++;const t=m/Bl;t>h.maxShift&&(h.maxShift=t);const e=m/Jl*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Ac(p,g,Bl)}),g=Kc(g,a.rooms,Bl,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Ic(t,Bl));g.length?s.open_spans=g:delete s.open_spans,qc(s.rooms||[],a.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Rr(e.walls,r,c,Zl,Bl);y=el(a.rooms,y,f,Zl,Number(s.cell_cm)>0?Number(s.cell_cm):5,Jl,Bl),y=Tr(y,s.rooms||[],Zl,1,f.map(t=>[t[0]/Bl,t[1]/Bl,t[2]/Bl,t[3]/Bl])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:r,glowSpacesMigrated:a.glowSpaces,glowRoomsMigrated:a.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class Xu{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const Ju=new WeakMap;const Zu=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function Qu(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,a=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=a}),r=t.createElement("canvas");r.width=4,r.height=1;const l=r.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return Zu(c,i,0)&&Zu(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&Zu(c,s,8)&&Zu(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(a)}}const tp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},ep=t=>Math.max(0,Math.min(1,t)),ip=(t,e,i)=>t+(e-t)*i,sp=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function np(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function op(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function ap(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function rp(t,e,i){const s=ap(t),n=ap(e);if(!s||!n)return i<.5?t:e;const o=ep(i);return`rgba(${Math.round(ip(s[0],n[0],o))}, ${Math.round(ip(s[1],n[1],o))}, ${Math.round(ip(s[2],n[2],o))}, ${ip(s[3],n[3],o).toFixed(3)})`}function lp(t,e,i){const s=(t=>{const e=ep(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,sp(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=ep((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:lp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(a):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(a),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const hp="houseplan_card_labs_v1",dp=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function up(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function pp(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function yp(t,e,i,s=dp){const n=function(t,e=dp){const i=up(t),s=new Map;if(!i||!gp(e))return s;for(const t of e){const e=up(t.since),n=up(t.expires);pp(i,e)>=0&&pp(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(gp(s)?s.map(t=>t.id):[]),a=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let r=!1;const l=t=>{if("off"===t)return a.clear(),void(r=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(r=!0,e||!n.has(i)?a.delete(i):a.add(i))};for(const e of vp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of vp(mp(t.hash)))l(e);const c=Object.freeze([...a].sort());return{active:c,space:fp(t.hash),persist:r?JSON.stringify(c):void 0,knownUrlOperation:r}}let bp={active:Object.freeze([]),space:""},wp="",kp=!1,$p="";const xp=new Set;function Sp(){if("undefined"==typeof window)return bp;const t=yp(window.location,function(){try{return window.localStorage.getItem(hp)}catch{return null}}(),wp);void 0!==t.persist&&function(t){try{window.localStorage.setItem(hp,t)}catch{}}(t.persist),bp={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of xp)t(bp);return bp}function Mp(){Sp()}function Cp(t){return wp=t,"undefined"==typeof window?bp:(kp||(kp=!0,window.addEventListener("hashchange",Mp),window.addEventListener("popstate",Mp)),Sp())}const Dp=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),Tp=64;function Pp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function Rp(t,e,i=Dp){if(!(Pp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],a=t[1]-i.origin[1],r=(o*Math.cos(s)-a*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+a*Math.cos(s))*i.xyScale;return[i.origin[0]+r,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function Ap(t,e=Dp){if(!Pp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Ip(t=Dp){return`matrix(${function(t=Dp){if(!Pp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),a=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,a,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-a*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Ep(t,e=Dp){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const a=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],r=Math.max(s,n),l=a.flatMap(t=>[Rp(t,-o,e),Rp(t,r,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Fp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function zp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return zp(i)>0===s?i:[...i].reverse()}function Hp(t,e,i){return t.length?`M ${t.map(t=>Fp(Rp(t,i,e))).join(" L ")} Z`:""}function Np(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Lp(t,e,i=Dp){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Op(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(zp(t))>=1e-9)).filter(t=>t.length&&zp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(zp(e[0]))-Math.abs(zp(t[0]))});const n=[],o=[];let a=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:a}}function Bp(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const qp=t=>t.every(Number.isFinite);function jp(t,e,i,s){const n=t[0]*i,o=t[1]*s,a=e*Math.PI/180;return[n*Math.cos(a)-o*Math.sin(a),n*Math.sin(a)+o*Math.cos(a)]}function Wp(t,e,i,s,n,o,a){const r=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],jp(i,t.angle,r,l));return{leaf:e,hinge:c,closedVector:jp(s,t.angle,r,l),quarterVector:jp([-s[1],s[0]],t.angle,r,l),turnDeg:n,bottom:o,top:a}}const Up=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Gp(t,e,i=Dp){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=Rp(e.hinge,e.bottom,i),a=Rp(n,e.bottom,i),r=Rp(n,e.top,i),l=Rp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${Up(o)} L ${Up(a)} L ${Up(r)} L ${Up(l)} Z`,shadowD:`M ${Up(Rp(e.hinge,0,i))} L ${Up(Rp(n,0,i))}`,depth:Math.max(o[1],a[1])}})}const Vp={window:120,door:90,passage:90,gate:300};function Kp(t){return Vp[t]}function Yp(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function Xp(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=Yp(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function Jp(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function Zp(t){const e=Xp(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,r=(t[0]-e.a[0])*o+(t[1]-e.a[1])*a,l=Math.max(0,Math.min(n,r)),c=e.a[0]+l*o,h=e.a[1]+l*a;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*a-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],a=e.b[1]-e.a[1],r=Math.hypot(o,a);if(!(r>1e-9))return!1;const l=o/r,c=a/r;for(const o of i){if(!o.open&&o.kind)continue;const i=Yp(o.a,o.b),a=i.b[0]-i.a[0],r=i.b[1]-i.a[1],h=Math.hypot(a,r);if(!(h>1e-9))continue;const d=a/h,u=r/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(Jp),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(Jp);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),a=o.filter(t=>t.target.partitionHost);if(a.length){if(1!==new Set(a.map(t=>t.target.partitionHost.id)).size||a.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=a[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),r=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,c=Math.abs(r*a-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*r);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:r,length:l}=n,c=r.b[0]-r.a[0],h=r.b[1]-r.a[1],d=c/l,u=h/l,p=r.partitionHost?r.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=r.a[0]+d*g,y=r.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,$=Math.max(0,w),x=Math.max(0,l-k),S=[r.a[0]+d*(w-$/2),r.a[1]+u*(w-$/2)],M=[r.a[0]+d*(k+x/2),r.a[1]+u*(k+x/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:r,...r.partitionHost?{host:{...r.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:$,midpoint:S},{distance:x,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function Qp(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const t_="1.65.0-beta.4",e_={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},i_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},s_=2e3,n_=1e3,o_=1500,a_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},r_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},l_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},c_=new Map;let h_=0;const d_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let u_=1e4;const p_="houseplan_card_layout_v1",__="houseplan_card_cfg_v1",g_="houseplan_card_zoom_v1",m_="houseplan_card_nav_v1",f_="houseplan_card_kiosk_v1",v_="houseplan_card_view_v1",y_=1e3,b_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],w_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},k_=new Set(["select","draw","column","merge","split","resize","opening","boundary","wallthick","delroom"]),$_=2e3,x_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},S_=t=>{history.pushState(null,"",t),x_(window,"location-changed",{replace:!1})},M_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},C_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class D_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=gn(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...er},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new cp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new zu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new Xu(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++h_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"!==t.kind){if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+Mu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()}else this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0)},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=In(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Cn(t);e&&(Pn(t,e),Rn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new oh(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=M_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem(p_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=M_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=a_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?$l:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?$l:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=a_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&Ll(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const a=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=xl(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=a_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),a),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],a=s.points.slice(0,n+1),r=s.points.slice(n+1);if(a.length>=2&&o.push({id:s.id,points:a,segments:s.segments.slice(0,n)}),r.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:r,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>$_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Na(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:hs(this._settings,{bgColor:null})||null,northDeg:Ka(this._settings,{}),bgMode:Ya(this._settings,{}),sunRays:Xa(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=Yu(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),a=this.renderRoot.querySelector(".hp-backdrop"),r=this.renderRoot.querySelector(".zoomwrap"),l=r?getComputedStyle(r).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:np(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:a&&Number(getComputedStyle(a).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=Oi(this._baseVb(),s/Math.max(1,n)),a=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),r=o.w/a,l=o.h/a,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-r/2,y:h-l/2,w:r,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const a=this.renderRoot.querySelector(".editorchrome"),r=a?.querySelector(".editorchrome-inner"),l="view"===i?0:r?.scrollHeight||r?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:np(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}_slideTo(t,e){if(t===this._space)return;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate())}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new eh(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(v_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?Ap(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?Rp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return fp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,Ju.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=Qc(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=Ju.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=Qu(t).catch(()=>!1).then(t=>(i.resolved=t,t)),Ju.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>As(this._serverCfg)),this._config?.kiosk&&Number(this._config?.cycle)>0&&(clearInterval(this._cycleTimer),this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle))),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){xp.add(e);const i=Cp(t);return"undefined"==typeof window&&e(i),()=>{xp.delete(e)}}(t_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),a=/^[a-z]$/.test(o),r="z"===o||!a&&"KeyZ"===t.code,l="y"===o||!a&&"KeyY"===t.code,c=n&&(r&&t.shiftKey||l),h=n&&r&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"===this._tool&&this._path.length?void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint()):"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry();if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of c_.values())for(const e of t)clearTimeout(e.evict);c_.clear(),u_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of c_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:c_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t},this._config.kiosk&&(this._booting=!1,this._bootFading=!1),t.default_floor&&(this._space=t.default_floor);try{this._zoomBySpace=JSON.parse(localStorage.getItem(g_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(v_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Cp(t_);try{const t=JSON.parse(localStorage.getItem(f_)||"null");this._kioskScale={icon:zs(t?.icon),font:zs(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(__)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||ih(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||ih(this._layout),this._virtualLights=gn(t.virtual_lights,this._cfgRev),this._serverStorage=!0,this._adoptInitialSpace(this._model))}catch{}"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=d_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=c_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Xc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:a}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,a=0,r=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>a?(o=i,a=t,r=1):t===a&&r++)}return!o||r>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Xc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),this._warmKey=t,a?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=c_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},u_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);if(this._hashApplied||!this._model.find(t=>t.id===e.space))return void(this._warmVp=null);this._space=e.space,this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const i=this._effectiveProjection(),s=i===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=s&&e.view?{...e.view}:null,this._viewModeSnap=s&&e.snap?{...e.snap}:null,!s&&e.logicalCenter){const t="iso"===i?Rp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var n;this._tool="openwall"===(n=e.tool)||"closewall"===n?"boundary":"opening"===(n=function(t){return"partition"===t?"draw":t}(n))?"draw":"string"==typeof n&&k_.has(n)?n:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=d_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=c_.get(i)||[];for(s.push(this._warmSlot),c_.set(i,s),this._warmTrim(s);c_.size>8;){const t=c_.keys().next().value;if(void 0===t||t===i)break;for(const e of c_.get(t)||[])clearTimeout(e.evict);c_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>u_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=ih(this._serverCfg),this._layoutContentFingerprint=ih(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(yn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(__,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:fn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t){return function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t){const e=this._initialSpaceSelection(t);return e.id?(this._space=e.id,"hash"===e.source&&(this._hashApplied=!0),"saved"===e.source&&(this._navApplied=!0),e):e}_candidateBackdrop(t,e=this._space){const i=Vl(t),s=this._initialSpaceSelection(i).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===s)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return sh([this._cfgRev,this._cfgContentFingerprint||ih(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||ih(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
t.stopPropagation()} @click=${t=>t.stopPropagation()} @@ -4560,7 +4560,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 style="left:${r.toFixed(1)}%;top:${l.toFixed(1)}%" @click=${t=>{t.stopPropagation(),this._fitAll()}}> - `}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:Oi(t,this._stageAspect())}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,a=i+s-e+n;return Math.max(Math.min(o,a),Math.min(Math.max(o,a),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=Oi(s,this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),a=n.w/o,r=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-a/2,y:h-r/2,w:a,h:r},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Xc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=Oi(this._baseVb(),this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const a=s.clientWidth,r=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/a*c,y:l[1]-e/r*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=Oi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(g_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=Oi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&(this._slideTo(n,i<0?"left":"right"),this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&S_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},C_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),a=(t.clientX-this._drag.sx)/n.width*o.w,r=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=ec(this._drag.ox+a),c=ec(this._drag.oy+r);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}get _noHover(){return D_._noHoverMq||D_._touchSeen}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse","touch"!==t.pointerType&&"pen"!==t.pointerType||(D_._touchSeen=!0,this._tip&&(this._tip=null))}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if("touch"===e.pointerType)if(this._notePointer(e),"pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type){if(this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._noHover||this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o})}get _gridPitch(){return Jl}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return li(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,y_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return ui(t?.rooms||[]).map(t=>[t[0]*y_,t[1]*e,t[2]*y_,t[3]*e])}_savedNav(){try{return JSON.parse(localStorage.getItem(m_)||"null")}catch{return null}}_saveNav(){try{localStorage.setItem(m_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),a=this._modeTransitionBusy,r=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=a&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(a?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:a?this._modeTransitionTargetCenterX:r?.viewport.centerX,u=c?c.centerY:a?this._modeTransitionTargetCenterY:r?.viewport.centerY;if("view"===s&&"view"!==t&&!a){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||a||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:r?.viewport.centerX,centerY:r?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?Rp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?r?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=r,this._prepareModeTransition(p,r,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(r,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=mr(pr,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?mr(pr,this._imperial):this._drawWallField}get _drawWallCm(){const t=a_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?$l:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?$l:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:mr(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=bd(this._path,this._draftSegmentCms,pr),i=e.length;if((t.partitions||[]).length+i>$_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=$_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[ec(ri(t[0],e)),ec(ri(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const a=Math.PI/4;let r=Math.atan2(o,n);r<0&&(r+=2*Math.PI);const l=Math.floor(r/a+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Yl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=vl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,a=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-a,e.x+o,e.y+a])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(ld(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const a=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>ld(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of a){if(md(t.point,n,s))continue;const a=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);a>i.tolerance||!fd(a,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:a})}if(o)return o;let r=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],a=Ns([e[0],e[1]],t);if(a>i.tolerance)continue;const l=vd(o,e,i.gridStep);!md(l,n,s)&&fd(a,o.key,r)&&(r={kind:"line",point:l,key:o.key,distance:a,segment:o})}return r}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool&&"partition"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return fi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Kl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:xl(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Sl(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=Fc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Tr(t.walls,t.rooms||[],Zl,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._space=t.spaceId,this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&wi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&Di(t,i)})}_pointInRoom(t,e){return e.poly?vi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!va(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>$_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("partition"===this._tool)return void this._partitionClick(s,t.shiftKey);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const a=this._draftEndAt(n,this._activeDraftId||void 0);if(a)return void this._mergeDraftEndpoint(a);if(!this._canAppendRoomDraftPoint())return;const r=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(r)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,a=n.find(e=>e.id===t.draft.id);if(!a)return;const r=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(a.segments||[]).map(t=>({...t})):[...a.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,r[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?r.slice(1):r],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(a.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Pi(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||a,id:b,points:m.map(t=>[t[0]/y_,t[1]/y_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:yd,s=Bd(t,i),n=new Map,o=new Map,a=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Sd(t.a,i),s=Sd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const r=new Map;for(const[t,e]of o){const i=n.get(t);r.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Sd(t.a,i),Sd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Md(u,p));const s=r.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=$d(g);if(!(m>i*i))continue;const f=Cd(Dd(e,n,i)),v=new Set;for(const t of d)for(const e of a.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let a;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);a=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!a.length)return;for(const t of s.rooms){const e=hi(t);if(!t.id||!e)continue;const i=Ei(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Pi(s)>=Pi(n)?s:n,r=o===s?n:s,l=[...a].sort((t,e)=>Math.abs(t.area-Pi(r))-Math.abs(e.area-Pi(r))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:r.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:r},consumeAllActive:!0}])}const r=a.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));r.length&&this._beginWallFaceBatch(r)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_partitionClick(t,e){const i=this._resolvePlanDrawPoint(t,e).point;if(!this._path.length)return void(this._path=[i]);const s=this._path[0];if(this._samePt(s,i))return;const n=this._drawWallCm;if(null==n)return void this._showPhysicalRange(100);if(!this._curSpaceCfg||this._limitReached("partition"))return;const o=this._geometrySnapshot(),a=this._curSpaceCfg;a.partitions||=[];const r="partition-"+Date.now().toString(36);a.partitions.push({id:r,a:[s[0]/y_,s[1]/y_],b:[i[0]/y_,i[1]/y_],cm:n}),this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),this._recordGeometry(this._t("history.partition_add"),o),this._saveConfig()}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange($l);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:xl(i),angle:0},o=(s.wall_columns||[]).find(t=>Ll(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const a=this._geometrySnapshot(),r=this._curSpaceCfg;r.wall_columns||=[],r.wall_columns.push({...n,center:[e[0]/y_,e[1]/y_]}),this._recordGeometry(this._t("history.column_add"),a),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Sl(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:mr(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),C_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Hl(n,Tl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Dl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Hl(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const a=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),r=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===a&&r-l.at>380&&r-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:a,index:c,x:t.clientX,y:t.clientY,at:r},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Kl*y_-Math.min(...n),Math.min(Kl*y_-Math.max(...n),i[0])),Math.max(-Kl*y_-Math.min(...o),Math.min(Kl*y_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/y_,n.a[1]/y_],t.b=[n.b[0]/y_,n.b[1]/y_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=ed(t,[n],y_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,rd(t,i,y_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/y_,(n.center[1]+e.delta[1])/y_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),C_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Sl(e.angle),angle:Sl(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Sl(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?hi(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const a=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/y_,t[1]/a]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/y_,e.y=i[1]/a)}const r=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*y_,t[1]*a]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:pa(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),C_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const a=Math.sign(s);let r=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&r>1e-9;s++,r-=l){const s=a*r;if(xa(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const a=wa(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(a.polys),this._rszApplyPreview(a.polys,a.openings),this._rszLive=this._rszEdgeLabels(a,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Ma(t,e,i,s,n,o))return n;let a=1,r=n;for(let n=0;n<28;n++){const n=(a+r)/2;Ma(t,e,i,s,n,o)?a=n:r=n}return a}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),a=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),r=Sa(o,e.openings,a,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:r.poly},r.openings),this._rszLive=this._rszScaleLabels(r.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=fa(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Tr(n.walls,n.rooms||[],Zl,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,a=e.edge,r=(a+1)%o;for(const[t,e]of[[n[(a-1+o)%o],n[a]],[n[a],n[r]],[n[r],n[(r+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&nl(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||n,a=xi(o),r=u.length?zl(Fl(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(o,this._gridPitch,this._cellCm);s.push({x:a[0],y:a[1],text:Da(r,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),a=this._spaceWalls,r=a.length&&this._rszSel&&nl([{id:this._rszSel,poly:t}],this._rszSel,a,[],this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||t,l=xi(r),c=this._physicalBodiesR(),h=c.length?zl(Fl(r,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(r,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Da(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],a=this._rszRooms();for(const t of a)for(let i=0;i`}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:Oi(t,this._stageAspect())}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,a=i+s-e+n;return Math.max(Math.min(o,a),Math.min(Math.max(o,a),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=Oi(s,this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),a=n.w/o,r=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-a/2,y:h-r/2,w:a,h:r},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Xc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=Oi(this._baseVb(),this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const a=s.clientWidth,r=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/a*c,y:l[1]-e/r*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=Oi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(g_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=Oi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&(this._slideTo(n,i<0?"left":"right"),this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&S_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},C_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),a=(t.clientX-this._drag.sx)/n.width*o.w,r=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=ec(this._drag.ox+a),c=ec(this._drag.oy+r);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}get _noHover(){return D_._noHoverMq||D_._touchSeen}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse","touch"!==t.pointerType&&"pen"!==t.pointerType||(D_._touchSeen=!0,this._tip&&(this._tip=null))}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if("touch"===e.pointerType)if(this._notePointer(e),"pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type){if(this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._noHover||this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o})}get _gridPitch(){return Jl}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return li(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,y_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return ui(t?.rooms||[]).map(t=>[t[0]*y_,t[1]*e,t[2]*y_,t[3]*e])}_savedNav(){try{return JSON.parse(localStorage.getItem(m_)||"null")}catch{return null}}_saveNav(){try{localStorage.setItem(m_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),a=this._modeTransitionBusy,r=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=a&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(a?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:a?this._modeTransitionTargetCenterX:r?.viewport.centerX,u=c?c.centerY:a?this._modeTransitionTargetCenterY:r?.viewport.centerY;if("view"===s&&"view"!==t&&!a){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||a||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:r?.viewport.centerX,centerY:r?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?Rp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?r?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=r,this._prepareModeTransition(p,r,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(r,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=mr(pr,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?mr(pr,this._imperial):this._drawWallField}get _drawWallCm(){const t=a_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?$l:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?$l:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:mr(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=bd(this._path,this._draftSegmentCms,pr),i=e.length;if((t.partitions||[]).length+i>$_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=$_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[ec(ri(t[0],e)),ec(ri(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const a=Math.PI/4;let r=Math.atan2(o,n);r<0&&(r+=2*Math.PI);const l=Math.floor(r/a+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Yl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=vl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,a=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-a,e.x+o,e.y+a])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(ld(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const a=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>ld(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of a){if(md(t.point,n,s))continue;const a=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);a>i.tolerance||!fd(a,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:a})}if(o)return o;let r=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],a=Ns([e[0],e[1]],t);if(a>i.tolerance)continue;const l=vd(o,e,i.gridStep);!md(l,n,s)&&fd(a,o.key,r)&&(r={kind:"line",point:l,key:o.key,distance:a,segment:o})}return r}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return fi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Kl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:xl(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Sl(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=Fc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Tr(t.walls,t.rooms||[],Zl,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._space=t.spaceId,this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&wi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&Di(t,i)})}_pointInRoom(t,e){return e.poly?vi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!va(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>$_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const a=this._draftEndAt(n,this._activeDraftId||void 0);if(a)return void this._mergeDraftEndpoint(a);if(!this._canAppendRoomDraftPoint())return;const r=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(r)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,a=n.find(e=>e.id===t.draft.id);if(!a)return;const r=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(a.segments||[]).map(t=>({...t})):[...a.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,r[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?r.slice(1):r],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(a.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Pi(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||a,id:b,points:m.map(t=>[t[0]/y_,t[1]/y_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:yd,s=Bd(t,i),n=new Map,o=new Map,a=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Sd(t.a,i),s=Sd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const r=new Map;for(const[t,e]of o){const i=n.get(t);r.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Sd(t.a,i),Sd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Md(u,p));const s=r.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=$d(g);if(!(m>i*i))continue;const f=Cd(Dd(e,n,i)),v=new Set;for(const t of d)for(const e of a.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let a;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);a=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!a.length)return;for(const t of s.rooms){const e=hi(t);if(!t.id||!e)continue;const i=Ei(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Pi(s)>=Pi(n)?s:n,r=o===s?n:s,l=[...a].sort((t,e)=>Math.abs(t.area-Pi(r))-Math.abs(e.area-Pi(r))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:r.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:r},consumeAllActive:!0}])}const r=a.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));r.length&&this._beginWallFaceBatch(r)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange($l);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:xl(i),angle:0},o=(s.wall_columns||[]).find(t=>Ll(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const a=this._geometrySnapshot(),r=this._curSpaceCfg;r.wall_columns||=[],r.wall_columns.push({...n,center:[e[0]/y_,e[1]/y_]}),this._recordGeometry(this._t("history.column_add"),a),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Sl(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:mr(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),C_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Hl(n,Tl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Dl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Hl(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const a=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),r=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===a&&r-l.at>380&&r-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:a,index:c,x:t.clientX,y:t.clientY,at:r},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Kl*y_-Math.min(...n),Math.min(Kl*y_-Math.max(...n),i[0])),Math.max(-Kl*y_-Math.min(...o),Math.min(Kl*y_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/y_,n.a[1]/y_],t.b=[n.b[0]/y_,n.b[1]/y_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=ed(t,[n],y_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,rd(t,i,y_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/y_,(n.center[1]+e.delta[1])/y_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),C_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Sl(e.angle),angle:Sl(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Sl(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?hi(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const a=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/y_,t[1]/a]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/y_,e.y=i[1]/a)}const r=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*y_,t[1]*a]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:pa(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),C_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const a=Math.sign(s);let r=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&r>1e-9;s++,r-=l){const s=a*r;if(xa(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const a=wa(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(a.polys),this._rszApplyPreview(a.polys,a.openings),this._rszLive=this._rszEdgeLabels(a,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Ma(t,e,i,s,n,o))return n;let a=1,r=n;for(let n=0;n<28;n++){const n=(a+r)/2;Ma(t,e,i,s,n,o)?a=n:r=n}return a}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),a=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),r=Sa(o,e.openings,a,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:r.poly},r.openings),this._rszLive=this._rszScaleLabels(r.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=fa(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Tr(n.walls,n.rooms||[],Zl,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,a=e.edge,r=(a+1)%o;for(const[t,e]of[[n[(a-1+o)%o],n[a]],[n[a],n[r]],[n[r],n[(r+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&nl(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||n,a=xi(o),r=u.length?zl(Fl(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(o,this._gridPitch,this._cellCm);s.push({x:a[0],y:a[1],text:Da(r,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),a=this._spaceWalls,r=a.length&&this._rszSel&&nl([{id:this._rszSel,poly:t}],this._rszSel,a,[],this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||t,l=xi(r),c=this._physicalBodiesR(),h=c.length?zl(Fl(r,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(r,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Da(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],a=this._rszRooms();for(const t of a)for(let i=0;ithis._rszEdgeDown(e,t.id,i)} @pointermove=${t=>this._rszMove(t)} @pointerup=${t=>this._rszUp(t)} @@ -4676,14 +4676,14 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 max=${mr(150,this._imperial)} step="any" .value=${this._drawWallFieldValue} @input=${t=>{this._drawWallField=t.target.value}} - title=${this._t("draw"===this._tool?"markup.draw_wall_title":"partition"===this._tool?"physical.partition_size_title":"physical.column_size_title")} /> + title=${this._t("draw"===this._tool?"markup.draw_wall_title":"physical.column_size_title")} /> ${this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")} ${this._t("physical.allowed_range",{max:mr(this._drawWallMaxCm,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")})} `}_renderPlanSecondary(){const t=this._editorSecondaryContextId,e=this._physicalSel;if(e){if(!("partition"===e.kind?!!this._curSpaceCfg.partitions?.some(t=>t.id===e.id):"column"===e.kind?!!this._curSpaceCfg.wall_columns?.some(t=>t.id===e.id):!!this._curSpaceCfg.room_drafts?.some(t=>t.id===e.id)))return null;const i="partition"===e.kind?this._t("markup.partition"):"column"===e.kind?this._t("markup.column"):this._t("markup.add");return{contextId:t,kind:"selection",ariaLabel:this._t("editor.context_actions",{object:i}),visibleLabel:i,content:j` `}}const i="draw"===this._tool||"partition"===this._tool||"column"===this._tool,s="partition"===this._tool?"markup.hint_partition":"column"===this._tool?"markup.hint_column":"resize"===this._tool?"markup.hint_resize":"wallthick"===this._tool?"markup.hint_wallthick":"boundary"===this._tool?this._boundaryHintKey:null,n="draw"===this._tool?this._t(this._path.length?"markup.hint_points":"markup.hint_start",this._path.length?{n:this._path.length}:void 0):"";if(!i&&!s&&!n)return null;const o="draw"===this._tool&&this._path.length>0||"boundary"===this._tool&&!!this._openWallAnchor;return{contextId:t,kind:o?"operation":"tool",ariaLabel:this._t("editor.tool_options",{tool:this._t("draw"===this._tool?"markup.add":"partition"===this._tool?"markup.partition":"column"===this._tool?"markup.column":"resize"===this._tool?"markup.resize":"wallthick"===this._tool?"markup.wallthick":"markup.boundary")}),content:j` + `}}const i="draw"===this._tool||"column"===this._tool,s="column"===this._tool?"markup.hint_column":"resize"===this._tool?"markup.hint_resize":"wallthick"===this._tool?"markup.hint_wallthick":"boundary"===this._tool?this._boundaryHintKey:null,n="draw"===this._tool?this._t(this._path.length?"markup.hint_points":"markup.hint_start",this._path.length?{n:this._path.length}:void 0):"";if(!i&&!s&&!n)return null;const o="draw"===this._tool&&this._path.length>0||"boundary"===this._tool&&!!this._openWallAnchor;return{contextId:t,kind:o?"operation":"tool",ariaLabel:this._t("editor.tool_options",{tool:this._t("draw"===this._tool?"markup.add":"column"===this._tool?"markup.column":"resize"===this._tool?"markup.resize":"wallthick"===this._tool?"markup.wallthick":"markup.boundary")}),content:j` ${i?this._renderDrawWallControl():G} ${n?j`${n}`:G} ${s?j`
-
`:j``}_openingAt(t){if(!this._openingsR.length)return null;const e=this._openingsR.flatMap(e=>{const i=e.angle*Math.PI/180,s=t[0]-e.rx,n=t[1]-e.ry,o=s*Math.cos(i)+n*Math.sin(i);return Math.abs(o)>e.rlen/2+12?[]:[{o:e,localY:-s*Math.sin(i)+n*Math.cos(i)}]});if(!e.length)return null;const i=this._spaceModel();if(!i)return null;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return e.find(({o:t,localY:e})=>{const i="gate"===t.type?!t.flip_v:t.flip_v,s=t.partitionHost||this._spaceWalls.length||"gate"===t.type?this._openingFace(t,n,!!i):{ox:0,oy:0,cm:0,side:-1},o=Yd({type:t.type,length:t.rlen,angle:t.angle,amount:this._openingAmt(t),flipH:!!t.flip_h,flipV:!!t.flip_v,cellCm:this._cellCm,gridPitch:this._gridPitch,face:s});return Math.abs(e)<=o.hitHalf})?.o||null}_resolveOpeningPlacement(t){const e=this._openingPreset;if("opening"!==this._tool||!e)return null;const i=this._spaceModel();if(!i)return null;const s=this._openCuts(),n=this._openingWallIndexFor(i,s),o=`${n.key}|partitions:${this._cfgEpoch}`;var a,r,l;this._openingPlacementIntervalsCache&&this._openingPlacementIntervalsCache.key===o||(this._openingPlacementIntervalsCache={key:o,value:[...Qr(i.rooms,this._spaceWalls,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_),...(a=i.partitions,r=this._cellCm,l=this._gridPitch,a.flatMap(t=>!Zh(t.a)||!Zh(t.b)||Math.hypot(t.b[0]-t.a[0],t.b[1]-t.a[1])<=1e-9?[]:[{roomId:"",a:[t.a[0],t.a[1]],b:[t.b[0],t.b[1]],key:`partition:${t.id}`,kind:"outer",cm:t.cm,open:!1,half:fr(t.cm,r,l)/2,partitionHost:{kind:"partition",id:t.id}}]))]});const c=Zp({pointer:[t[0],t[1]],preset:e,geometryRevision:this._cfgEpoch,renderedLength:this._cmToUnits(e.lengthCm),intervals:this._openingPlacementIntervalsCache.value,baseTolerance:1.5*this._gridPitch,bodyPointerPadding:this._cssPxToRender(this._boundaryCoarse?10:6),gridStep:this._gridPitch});this._openingJambBlockCm=c.jambBlockedTarget?c.jambBlockedTarget.physicalHalfWidth/this._gridPitch*this._cellCm:null;const h=c.candidate;if(!h)return null;const d="gate"===h.type?!h.flipV:h.flipV;let u;if(h.host){const t=ed({id:"preview",type:h.type,x:h.x/y_,y:h.y/y_,angle:h.angle,length:h.renderedLength/y_,host:h.host},i.partitions,y_,this._cellCm,this._gridPitch).resolved;u=t?od(t,d):{ox:0,oy:0,cm:0,side:-1}}else u=yl(n.value,{x:h.x,y:h.y,angle:h.angle,length:h.renderedLength,flip_v:d});const p="mi"===this.hass?.config?.unit_system?.length,_=_i([h.x,h.y],h.angle,h.renderedLength,i.rooms,this._gridPitch/2),g=(_?[{distance:_.sideA,midpoint:_.midA},{distance:_.sideB,midpoint:_.midB}]:h.measure.labels).map(t=>({x:t.midpoint[0],y:t.midpoint[1],text:li(t.distance/this._gridPitch*this._cellCm,p)}));return{...h,face:u,measure:{labels:g,guide:h.measure.guide}}}_activateOpeningPlacement(t){this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingPreset=function(t,e){return{type:t,lengthCm:Kp(t),flipH:!1,flipV:!1,revision:e}}(t,++this._openingPresetRevision),this._openingHoverCandidate=null,this._cursorPt=null)}_clearOpeningPlacement(t){this._openingHoverCandidate=null,this._openingJambBlockCm=null,t&&(this._openingPreset=null,this._openingRebindId=null)}_openingClick(t){const e=this._spaceModel();if(!e)return;const i=this._openingRebindId?null:this._openingAt(t);if(i)return void this._editOpening(i);const s=this._openingPreset;if(!s)return;const n=this._openingHoverCandidate,o=n&&Qp(n,[t[0],t[1]],s.revision,this._cfgEpoch)?n:this._resolveOpeningPlacement(t);if(!o){if(null!=this._openingJambBlockCm)return void this._showToast(this._t("opening.partition_jamb_margin",{distance:li(this._openingJambBlockCm,this._imperial)}));const i=1.5*this._gridPitch,s=pi(t,e.rooms,i);return s&&function(t,e,i,s,n){for(const o of s)if(!(Ns([t,e],o)>n)&&Pr([o[0],o[1]],[o[2],o[3]],i))return!0;return!1}(s.x,s.y,s.angle,this._openCuts(),i)?void this._showToast(this._t("toast.opening_on_virtual")):void this._showToast(this._t("toast.opening_no_wall"))}const a=this._openingRebindId?this._curSpaceCfg?.openings?.find(t=>t.id===this._openingRebindId):null;this._openingDialog={...a?{id:a.id,type:a.type,lengthCm:Math.round(a.length*y_/this._gridPitch*this._cellCm),lengthTouched:!1,contact:a.contact||"",lock:a.lock||"",invert:!!a.invert,flipH:!!a.flip_h,flipV:!!a.flip_v}:{type:o.type,lengthCm:o.lengthCm,contact:"",lock:"",invert:!1,flipH:o.flipH,flipV:o.flipV},...o.host?{host:o.host}:{},x:o.x,y:o.y,angle:o.angle},this._openingRebindId=null,this._openingHoverCandidate=null,this._cursorPt=null}_editOpening(t){this._openingDialog={id:t.id,type:t.type,lengthCm:Math.round(t.rlen/this._gridPitch*this._cellCm),lengthTouched:!1,contact:t.contact||"",lock:t.lock||"",invert:!!t.invert,flipH:!!t.flip_h,flipV:!!t.flip_v,...t.host?{host:{...t.host}}:{},x:t.rx,y:t.ry,angle:t.angle}}_opPointerDown(t,e){if("plan"===this._mode&&this._spaceModel()&&"resize"!==this._tool){t.preventDefault(),t.stopPropagation();try{C_(t)}catch{}this._opDrag={id:e.id,moved:!1,sx:t.clientX,sy:t.clientY,dirty:!1,before:this._geometrySnapshot()}}}_opPointerMove(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;if(Math.abs(t.clientX-this._opDrag.sx)+Math.abs(t.clientY-this._opDrag.sy)<=3)return;const i=this._spaceModel();if(!i)return;const s=this._svgPoint(t),n=this._curSpaceCfg,o=n?.openings?.find(t=>t.id===e.id);if(!o)return;if("partition"===o.host?.kind){const t=i.partitions.find(t=>t.id===o.host.id);if(!t)return;const e=t.b[0]-t.a[0],n=t.b[1]-t.a[1],a=Math.hypot(e,n);if(!(a>1e-9))return;const r=e/a,l=n/a;if(Math.abs((s[0]-t.a[0])*l-(s[1]-t.a[1])*r)>4*this._gridPitch)return;const c=o.length*y_/2+Qh(t,this._cellCm,this._gridPitch);let h=(s[0]-t.a[0])*r+(s[1]-t.a[1])*l;if(h=Math.round(h/this._gridPitch)*this._gridPitch,h=Math.max(c,Math.min(a-c,h)),a<2*c-1e-9)return;const d=h/a,u=(t.a[0]+r*h)/y_,p=(t.a[1]+l*h)/this._spaceH;let _=180*Math.atan2(n,e)/Math.PI;_>=90?_-=180:_<-90&&(_+=180);const g=o.host.t!==d||o.x!==u||o.y!==p||o.angle!==_;return this._opDrag.moved=!0,g&&(this._opDrag.dirty=!0),o.host={...o.host,t:d},o.x=u,o.y=p,o.angle=_,this._opMeasure=null,g&&this._cfgEpoch++,void this.requestUpdate()}const a=pi(s,i.rooms,4*this._gridPitch);if(!a)return;this._opDrag.moved=!0;const r=this._opRuler(a,o.length*y_);this._opMeasure=r.measure;const l=r.x/y_,c=r.y/this._spaceH,h=o.x!==l||o.y!==c||o.angle!==a.angle;h&&(this._opDrag.dirty=!0),o.x=l,o.y=c,o.angle=a.angle,h&&this._cfgEpoch++,this.requestUpdate()}_opRuler(t,e){const i=this._spaceModel()?.rooms||[],s=this._gridPitch/2;let n=t.x,o=t.y,a=_i([n,o],t.angle,e,i,s);if(a&&a.centered&&(n!==a.wallCenter[0]||o!==a.wallCenter[1]))[n,o]=a.wallCenter,a=_i([n,o],t.angle,e,i,s);else if(a){const[r,l]=a.wallA,[c,h]=a.wallB,d=c-r,u=h-l,p=Math.hypot(d,u);if(p>0){const c=this._gridPitch,h=Math.min(e/2,p/2);let _=Math.round(((n-r)*d+(o-l)*u)/p/c)*c;_=Math.max(h,Math.min(p-h,_)),n=r+_/p*d,o=l+_/p*u,a=_i([n,o],t.angle,e,i,s)||a}}if(!a)return{x:n,y:o,angle:t.angle,measure:null};const r="mi"===this.hass?.config?.unit_system?.length,l=(t,e)=>({x:e[0],y:e[1],text:li(t/this._gridPitch*this._cellCm,r)});return{x:n,y:o,angle:t.angle,measure:{labels:[l(a.sideA,a.midA),l(a.sideB,a.midB)],guide:a.centered?{x:a.wallCenter[0],y:a.wallCenter[1],angle:t.angle}:null}}}_opPointerUp(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;const i=this._opDrag,s=i.moved;this._opMeasure=null,s&&i.dirty&&(this._recordGeometry(this._t("history.move_opening"),i.before),this._saveConfig()),s?window.setTimeout(()=>this._opDrag=null,0):this._opDrag=null}_opClick(t,e){"plan"===this._mode&&"resize"===this._tool||(t.stopPropagation(),this._opDrag?.moved||"plan"===this._mode&&this._editOpening(e))}_saveOpening(){const t=this._openingDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=this._geometrySnapshot(),n=this._spaceH,o=(e.openings||[]).find(e=>e.id===t.id),a={...o||{},id:t.id||"o"+Date.now().toString(36),type:t.type,x:t.x/y_,y:t.y/n,angle:t.angle,length:o&&!t.lengthTouched?o.length:this._cmToUnits(Math.max(20,t.lengthCm))/y_,...t.host?{host:{...t.host}}:{}};if(a.host){const t=sd(o,a)?id(a,i.partitions,y_,this._cellCm,this._gridPitch):ed(a,i.partitions,y_,this._cellCm,this._gridPitch);if(!t.resolved){const e=i.partitions.find(t=>t.id===a.host.id);if("does-not-fit-jamb"===t.reason&&e){const t=Qh(e,this._cellCm,this._gridPitch);this._showToast(this._t("opening.partition_jamb_margin",{distance:li(t/this._gridPitch*this._cellCm,this._imperial)}))}else this._showToast(this._t("opening.partition_orphan"));return}const s=(e.openings||[]).flatMap(t=>{if(!t.host||t.id===a.id)return[];const e=ed(t,i.partitions,y_,this._cellCm,this._gridPitch).resolved;return e?[e]:[]});if(function(t,e,i=1e-9){const s=t.length/(2*t.axis.length),n=t.t-s,o=t.t+s;return e.some(e=>{if(e.host.id!==t.host.id||e.opening.id===t.opening.id)return!1;const s=e.length/(2*e.axis.length);return Math.max(n,e.t-s)t.id===a.id);r>=0?e.openings[r]=a:e.openings.push(a),this._recordGeometry(this._t(t.id?"history.edit_opening":"history.add_opening"),s),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_deleteOpening(){const t=this._openingDialog,e=this._curSpaceCfg;if(!t?.id||!e?.openings)return;const i=this._geometrySnapshot();e.openings=e.openings.filter(e=>e.id!==t.id),this._recordGeometry(this._t("history.delete_opening"),i),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_contactCandidates(){const t=[];for(const e of Object.keys(this.hass.states)){if(!this._openingEntityAvailable(e))continue;const i=e.split(".")[0];if("binary_sensor"!==i&&"cover"!==i)continue;const s=this.hass.states[e],n=["door","window","opening","garage_door","garage"].includes(s?.attributes?.device_class||"");("cover"!==i||n)&&t.push([e,s?.attributes?.friendly_name||e,n?0:1])}return t.sort((t,e)=>t[2]-e[2]||t[1].localeCompare(e[1])).map(([t,e])=>({value:t,label:e}))}_lockCandidates(){return Object.keys(this.hass.states).filter(t=>t.startsWith("lock.")&&this._openingEntityAvailable(t)).map(t=>({value:t,label:this.hass.states[t]?.attributes?.friendly_name||t})).sort((t,e)=>t.label.localeCompare(e.label))}_mergeClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms,s=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!s?.id)return;const n=s.id;if(!this._mergeSel||this._mergeSel===n)return void(this._mergeSel=this._mergeSel===n?null:n);const o=i.find(t=>t.id===this._mergeSel),a=o?hi(o):null,r=hi(s),l=a&&r?function(t,e){if(!t||!e||t.length<3||e.length<3)return null;const i=si(Ri(t),Ri(e));if(1!==i.length)return null;if(1!==i[0].length)return null;const s=i[0][0].slice(0,-1).map(t=>[t[0],t[1]]);return s.length>=3?s:null}(a,r):null;if(!l)return this._showToast(this._t("toast.merge_not_adjacent")),void(this._mergeSel=null);this._mergeDialog={aId:this._mergeSel,bId:n,poly:l,pick:"a"},this._mergeSel=null}_commitMerge(){const t=this._mergeDialog,e=this._curSpaceCfg;if(!t||!e||!this._spaceModel())return;const i=this._geometrySnapshot(),s=this._spaceH,n="a"===t.pick?t.aId:t.bId,o="a"===t.pick?t.bId:t.aId,a=e.rooms.find(t=>t.id===n);a?(a.poly=t.poly.map(t=>[t[0]/y_,t[1]/s]),delete a.x,delete a.y,delete a.w,delete a.h,e.rooms=e.rooms.filter(t=>t.id!==o),this._commitOpenSpans(),this._recordGeometry(this._t("history.merge_rooms"),i),this._saveConfig(),this._mergeDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.rooms_merged",{name:a.name||""}))):this._mergeDialog=null}_splitClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms;if(!this._splitSel){const e=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!e?.id)return;return void(this._splitSel={roomId:e.id,pts:[]})}const s=i.find(t=>t.id===this._splitSel.roomId),n=s?hi(s):null;if(!s||!n)return void(this._splitSel=null);const o=.02*this._gridPitch,a=6*this._gridPitch,r=function(t,e){if(!e||e.length<2)return null;let i=null,s=1/0;for(let n=0;n=n)continue;n=_;const g=Math.sqrt(u),m=(i>0?Math.max(0,Math.min(g,Math.round(p*g/i)*i)):p*g)/g;s=[a+m*h,r+m*d]}return s}(r,n,this._gridPitch)||r,c=r&&l&&Math.hypot(r[0]-t[0],r[1]-t[1])<=a?l:null,h=!!c&&bi(c,n,o),d=this._splitSel.pts;if(!d.length)return h?void(this._splitSel={...this._splitSel,pts:[c]}):void this._showToast(this._t("toast.split_pick_wall"));if(!h){const e=this._snap(t);return wi(e,n,o)?void(this._splitSel={...this._splitSel,pts:[...d,e]}):void this._showToast(this._t("toast.split_pick_inside"))}const u=Ei(n,[...d,c],o);if(!u)return void this._showToast(this._t("toast.split_bad_cut"));this._resetRoomDialogFields();const[p,_]=u,g=Pi(p)>=Pi(_)?p:_,m=g===p?_:p;this._pendingSplit={roomId:s.id,mainPoly:g,newPoly:m},this._cursorPt=null,this._nameSel="",this._areaSel="",this._roomDialog=!0}get _contourClosed(){return this._path.length>=4&&this._samePt(this._path[0],this._path[this._path.length-1])&&(null!=this._closingWallCm||!this._activeDraftId)}_markupMove(t){if(!this._markup)return;const e=t.pointerType;if(e&&(this._boundaryPointerType=e),"column"===this._tool)return void(this._cursorPt=this._snap(this._svgPoint(t)));if("opening"===this._tool||"boundary"===this._tool||"wallthick"===this._tool)return void(this._cursorPt=this._svgPoint(t));const i=("draw"===this._tool||"partition"===this._tool)&&!this._contourClosed,s="split"===this._tool&&!!this._splitSel?.pts?.length;if(!i&&!s)return;const n=this._svgPoint(t);if(i){const e=this._resolvePlanDrawPoint(n,t.shiftKey);return this._planSnapHover={contextKey:e.contextKey,candidate:e.candidate},this._path.length?void(this._cursorPt=e.point):void this._syncPlanSnapActiveMarker(e.candidate)}this._cursorPt=this._snap(n)}get _openingPreview(){const t=this._openingPreset;if("opening"!==this._tool||!t||!this._cursorPt)return null;const e=this._cursorPt,i=this._openingHoverCandidate;if(i&&Qp(i,[e[0],e[1]],t.revision,this._cfgEpoch))return i;if(this._openingAt(e))return this._openingHoverCandidate=null,null;const s=this._resolveOpeningPlacement(e);return this._openingHoverCandidate=s,s}get _opMeasureView(){return this._opMeasure||this._openingPreview?.measure||null}_saveRoom(){(this._areaSel||this._nameSel.trim())&&(this._wallFaceBatch?this._decideWallFace(!0):this._commitRoom())}_decideWallFace(t){const e=this._wallFaceBatch;if(!e)return;const i=e.candidates[e.index];if(!i)return;const s=t?{candidate:i,create:!0,name:this._nameSel.trim(),area:this._areaSel||null,settings:this._roomSettingsFromDialog()?JSON.parse(JSON.stringify(this._roomSettingsFromDialog())):null}:{candidate:i,create:!1},n=[...e.decisions,s],o=e.index+1;if(o"number"==typeof t&&Number.isFinite(t)&&t>=0?t:null,n=.02*this._gridPitch,o=this._spaceModel();if(!o)return pr;for(const e of this._planSnapGeometrySnapshot().value.segments){if("room"===e.sourceKind||Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])>n)continue;if("partition"===e.sourceKind)return s(o.partitions.find(t=>t.id===e.sourceId)?.cm)??pr;const i=e.sourceId.lastIndexOf(":"),a=i>=0?e.sourceId.slice(0,i):e.sourceId,r=i>=0?Number(e.sourceId.slice(i+1)):-1;return s(o.room_drafts.find(t=>t.id===a)?.segments[r]?.cm)??pr}for(let o=0;o+1{this._showToast(this._t(t,e)),this._roomDialogCancel()},n=t.decisions.filter(t=>t.create),o=n.map(t=>t.candidate.ring),a=i.rooms;for(let t=0;ti.id!==e&&!!hi(i)&&Di(o[t],hi(i)));if(i)return void s("toast.room_overlap",{name:i.name||""})}if((e.rooms||[]).length+n.length>400)return void s("toast.physical_limit");if(n.some(t=>t.candidate.split&&!e.rooms.some(e=>e.id===t.candidate.split.roomId)))return void s("toast.contour_cannot_close");const r=2e-4*this._gridPitch,l=new Map;for(let e=0;et.candidate.atomKeys)),i=n.some(t=>t.candidate.consumeAllActive);for(const s of Bd(this._wallGraphSources(t.activePath),r)){const t=s.sourceKeys.find(t=>l.has(t));!t||i||e.has(s.key)||c.push({a:s.a,b:s.b,cm:l.get(t)})}}else c.push(...bd(t.activePath,t.activeCms,pr));if((e.partitions||[]).length+c.length>$_)return void s("toast.physical_limit");const h=this._geometrySnapshot(),d=n.some(t=>!!t.candidate.split),u=d?tl(i.rooms,e.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,p=d&&Array.isArray(e.walls)?e.walls:null;for(const t of n){const i=t.candidate.split;if(!i)continue;const n=e.rooms.find(t=>t.id===i.roomId);if(!n)return void s("toast.contour_cannot_close");n.poly=i.mainPoly.map(t=>[t[0]/y_,t[1]/this._spaceH]),delete n.x,delete n.y,delete n.w,delete n.h}const _=Date.now().toString(36),g=[];if(n.forEach((t,i)=>{const s=t.area?this.hass.areas[t.area]?.name:"",n={id:`r${_}-${i}`,name:t.name||s||this._t("room.default_name"),area:t.area||null,poly:t.candidate.ring.map(t=>[t[0]/y_,t[1]/this._spaceH]),...t.settings?{settings:JSON.parse(JSON.stringify(t.settings))}:{}};e.rooms.push(n),g.push({room:n,decision:t})}),t.activeDraftId&&Array.isArray(e.room_drafts)&&(e.room_drafts=e.room_drafts.filter(e=>e.id!==t.activeDraftId),e.room_drafts.length||delete e.room_drafts),c.length&&(e.partitions||=[],c.forEach((t,i)=>e.partitions.push({id:`partition-${_}-${i}`,a:[t.a[0]/y_,t.a[1]/y_],b:[t.b[0]/y_,t.b[1]/y_],cm:t.cm}))),d){this._commitOpenSpans();const t=this._normalizeWalls(u,this._openCuts());t.length?e.walls=t:p?.length?e.walls=p:delete e.walls}if(g.length){this._cfgEpoch++;const i=this._openCuts(),s=this._spaceModel();if(!s)return;let n=e.walls;for(const{room:e,decision:o}of g){const a=o.candidate.ring,r=this._wallSourceCmAt(a[0],t.activePath,t.activeCms);n=Er(n,s.rooms,e.id,r,this._wallKeyPitch,i,y_);for(const o of Qr(s.rooms,n,i,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(o.roomId!==e.id||"outer"!==o.kind)continue;const i=[(o.a[0]+o.b[0])/2,(o.a[1]+o.b[1])/2];n=Ar(n,o.a,o.b,this._wallSourceCmAt(i,t.activePath,t.activeCms),this._wallKeyPitch,y_)}}const o=this._normalizeWalls(n,i);o.length?e.walls=o:delete e.walls}this._recordGeometry(this._t("history.wall_face_batch"),h),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._wallFaceBatch=null,this._roomDialog=!1,this._nameSel="",this._areaSel="",this._regSignature="",this._maybeRebuildDevices();const m=new Set(n.map(t=>t.area).filter(t=>!!t));if(m.size){const t={...this._layout};for(const e of this._devices){if(!m.has(e.area||"")||e.space!==this._space)continue;if(this._layout[e.id])continue;const i=this._defPos[e.id];i&&(t[e.id]={s:this._space,x:i.x/y_,y:i.y/y_},this._dirtyPos.add(e.id))}this._layout=t,this._persistLayout()}this._showToast(this._t(n.length?"toast.wall_rooms_saved":"toast.wall_chain_saved",{n:n.length}))}_commitRoom(){const t=this._curSpaceCfg,e=this._spaceModel();if(!t||!e)return;const i=this._geometrySnapshot(),s=this._spaceH,n=!!this._pendingSplit,o=n?tl(e.rooms,t.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,a=n&&Array.isArray(t.walls)?t.walls:null;let r;if(this._pendingSplit){const e=t.rooms.find(t=>t.id===this._pendingSplit.roomId);if(!e)return this._pendingSplit=null,this._splitSel=null,void(this._roomDialog=!1);e.poly=this._pendingSplit.mainPoly.map(t=>[t[0]/y_,t[1]/s]),delete e.x,delete e.y,delete e.w,delete e.h,r=this._pendingSplit.newPoly}else{if(!this._contourClosed)return;r=this._path.slice(0,-1)}const l=this._areaSel?this.hass.areas[this._areaSel]?.name:"",c={id:"r"+Date.now().toString(36),name:this._nameSel||l||this._t("room.default_name"),area:this._areaSel||null,poly:r.map(t=>[t[0]/y_,t[1]/s]),...this._roomSettingsFromDialog()?{settings:this._roomSettingsFromDialog()}:{}};if(t.rooms.push(c),!n&&this._activeDraftId&&Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),n){this._commitOpenSpans();const e=this._normalizeWalls(o,this._openCuts());e.length?t.walls=e:a?.length?t.walls=a:delete t.walls}if(!n){const e=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr],i=e[0]||this._drawWallCm;if(null!=i){this._cfgEpoch++;const s=this._openCuts(),n=this._spaceModel();if(!n)return;let o=Er(t.walls,n.rooms,c.id,i,this._wallKeyPitch,s,y_);for(const t of Qr(n.rooms,o,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(t.roomId!==c.id||"outer"!==t.kind)continue;const s=[(t.a[0]+t.b[0])/2,(t.a[1]+t.b[1])/2],n=r.findIndex((t,e)=>{const i=r[(e+1)%r.length];return Ns(s,[t[0],t[1],i[0],i[1]])<=.02*this._gridPitch});n>=0&&(o=Ar(o,t.a,t.b,e[n]||i,this._wallKeyPitch,y_))}o=this._normalizeWalls(o,s),o.length?t.walls=o:delete t.walls}}this._recordGeometry(this._t(n?"history.split_room":"history.add_room"),i),this._saveConfig(),this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._pendingSplit=null,this._splitSel=null;const h=this._areaSel;this._areaSel="",this._nameSel="",this._roomDialog=!1,this._regSignature="",this._maybeRebuildDevices();let d=0;if(h){const t=y_,e={...this._layout};for(const i of this._devices){if(i.area!==h||i.space!==this._space)continue;if(d++,this._layout[i.id])continue;const s=this._defPos[i.id];s&&(e[i.id]={s:this._space,x:s.x/y_,y:s.y/t},this._dirtyPos.add(i.id))}this._layout=e,this._persistLayout()}const u=this._model.find(t=>t.id===this._space)?.rooms.length||0;this._showToast(h?this._t("toast.room_saved",{n:u,added:d}):this._t("toast.room_saved_no_area",{n:u}))}_cancelPath(){this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),this._roomDialog=!1,this._pendingSplit=null,this._wallFaceBatch=null,this._splitSel=null,this._mergeSel=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._clearOpeningPlacement(!0)}_resumeLastDraft(){const t=this._resumeDraftBySpace[this._space];if(!t)return;const e=this._spaceModel()?.room_drafts.find(e=>e.id===t);e?(this._activeDraftId=t,this._path=e.points.map(t=>[...t]),this._draftSegmentCms=e.segments.map(t=>t.cm),this._clearPlanSnapHover()):delete this._resumeDraftBySpace[this._space]}_roomDialogCancel(){if(this._roomDialog=!1,this._roomEditId)return this._roomEditId=null,this._nameSel="",void(this._areaSel="");if(this._wallFaceBatch){const t=this._wallFaceBatch;return this._wallFaceBatch=null,this._path=t.activePath.map(t=>[...t]),this._draftSegmentCms=[...t.activeCms],this._activeDraftId=t.activeDraftId,this._nameSel="",this._areaSel="",void this.requestUpdate()}if(this._pendingSplit)return this._pendingSplit=null,void(this._splitSel=null);this._undoPoint()}get _freeAreas(){const t=new Set;for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area&&t.add(i.area);for(const e of this._wallFaceBatch?.decisions||[])e.create&&e.area&&t.add(e.area);return Object.values(this.hass?.areas||{}).filter(e=>!t.has(e.area_id)).sort((t,e)=>(t.name||"").localeCompare(e.name||""))}_openMarkerDialog(t){if(this._vacAllCamerasFor=null,this._vacAllCameraCache=null,t&&this._ackNewDevice(t.id),this._norm)if(t){const e=t.marker,i=Object.prototype.hasOwnProperty.call(e||{},"is_light"),s=Object.prototype.hasOwnProperty.call(e||{},"light_entity"),n=Object.prototype.hasOwnProperty.call(e||{},"glow_color"),o=Object.prototype.hasOwnProperty.call(e||{},"value_badge"),a=Object.prototype.hasOwnProperty.call(e||{},"tap_action"),r=Object.prototype.hasOwnProperty.call(e||{},"toggle_entity"),l=ks(e?.glow_color),c=this._devicePresentation(t,!0).valueBadge,h=Bo(this._planHass,t,this._devices),d=qo(this._planHass,t,h);this._markerDialog={devId:t.id,name:t.name,binding:"virtual"===t.bindingKind?"virtual":t.bindingKind+":"+t.bindingRef,bindingMode:"virtual"===t.bindingKind?"virtual":"ha",bindingOpen:!1,showEntities:"entity"===t.bindingKind&&!!this._fullRegistryHass.entities[t.bindingRef||""]?.device_id,bindingFilter:"",icon:t.marker?.icon||"",autoIcon:t.icon||"",display:Bi(t.marker?.display),rippleColor:Rt(t.marker?.ripple_color,""),rippleSize:Number(t.marker?.ripple_size)>0?Number(t.marker.ripple_size):3,size:Number(t.marker?.size)>0?Number(t.marker.size):1,angle:Number(t.marker?.angle)||0,tapAction:Wh(t.marker?.tap_action,t.primary?.split(".")[0]),tapActionTouched:!1,originalHasTapAction:a,originalTapAction:t.marker?.tap_action,tapHintAnnouncement:"",toggleEntity:e?.toggle_entity||"",toggleEntityTouched:!1,originalHasToggleEntity:r,originalToggleEntity:e?.toggle_entity,tapTarget:t.marker?.tap_target||"",tapConfirm:!0===t.marker?.tap_confirm,runFilter:"",controls:Xn(t.marker?.binding,t.marker?.controls,t.entities),controlsFilter:"",lightRole:!0===e?.is_light?"always":!1===e?.is_light?"never":"auto",lightRoleTouched:!1,originalHasIsLight:i,originalIsLight:e?.is_light,lightEntity:e?.light_entity||"",lightEntityTouched:!1,originalHasLightEntity:s,originalLightEntity:e?.light_entity,glowMode:null!=l?.bri?"fixed":l?"color":"auto",glowColor:l?.c||this._fillColors.glow_light.c,glowBrightness:Math.max(1,Math.round(100*(l?.bri??1))),glowColorDrafted:!!l,glowBrightnessDrafted:null!=l?.bri,glowTouched:!1,originalHasGlowColor:n&&(!!l||null===e?.glow_color),originalGlowColor:l||(null===e?.glow_color?null:void 0),valueBadgeEnabled:o?!0===e?.value_badge?.enabled:!!c,valueBadgeSource:e?.value_badge?.source||c?.source||d,valueBadgePosition:e?.value_badge?.position||c?.position||"right",valueBadgeTouched:!1,originalHasValueBadge:o,originalValueBadge:e?.value_badge,useClimateTemp:!0===t.marker?.use_climate_temp,glowRadius:Number(t.marker?.glow_radius_cm)>0?String(this._imperial?Math.round(Number(t.marker.glow_radius_cm)/30.48*10)/10:Math.round(Number(t.marker.glow_radius_cm))/100):"",model:t.model||"",link:t.link||"",description:t.description||"",pdfs:[...t.pdfs||[]],room:t.marker?.room_id?t.space+"#@"+t.marker.room_id:t.space&&t.area?t.space+"#"+t.area:"",hideFromPlan:!0===t.marker?.hidden,busy:!1}}else this._markerDialog={name:"",binding:"virtual",bindingMode:"virtual",bindingOpen:!1,showEntities:!1,bindingFilter:"",icon:"",autoIcon:"",display:"badge",rippleColor:"",rippleSize:3,size:1,angle:0,tapAction:"info",tapActionTouched:!1,originalHasTapAction:!1,originalTapAction:void 0,tapHintAnnouncement:"",toggleEntity:"",toggleEntityTouched:!1,originalHasToggleEntity:!1,originalToggleEntity:void 0,tapTarget:"",tapConfirm:!1,runFilter:"",controls:[],controlsFilter:"",lightRole:"auto",lightRoleTouched:!1,originalHasIsLight:!1,originalIsLight:void 0,lightEntity:"",lightEntityTouched:!1,originalHasLightEntity:!1,originalLightEntity:void 0,glowMode:"auto",glowColor:this._fillColors.glow_light.c,glowBrightness:100,glowColorDrafted:!1,glowBrightnessDrafted:!1,glowTouched:!1,originalHasGlowColor:!1,originalGlowColor:void 0,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgePosition:"right",valueBadgeTouched:!1,originalHasValueBadge:!1,originalValueBadge:void 0,useClimateTemp:!1,glowRadius:"",model:"",link:"",description:"",pdfs:[],room:"",hideFromPlan:!1,busy:!1,uploadId:"up_"+Date.now().toString(36)+Math.random().toString(36).slice(2,6)};else this._showToast(this._t("toast.marker_needs_server"))}_runCandidates(){const t=[];for(const e of Gi)for(const[i,s]of Object.entries(this.hass.states))i.startsWith(e+".")&&this._planEntityAvailable(i)&&t.push({value:i,label:s?.attributes?.friendly_name||i,sub:this._t("run."+e)});return t.sort((t,e)=>t.sub.localeCompare(e.sub)||t.label.localeCompare(e.label))}_bindingCandidates(){const t=this._planHass,e=yo(this._markers),i=new Set(this._markers.filter(t=>t.removed).map(t=>t.binding)),s=new Set;for(const t of this._devices)t.id!==this._markerDialog?.devId&&("device"===t.bindingKind&&t.bindingRef&&s.add("device:"+t.bindingRef),"entity"===t.bindingKind&&t.bindingRef&&s.add("entity:"+t.bindingRef));const n=new Set;for(const t of this._devices)"device"===t.bindingKind&&t.name&&n.add(t.name.trim()+"|"+(t.area||""));const o=[];for(const e of Object.values(t.devices)){if("service"===e.entry_type)continue;const t="device:"+e.id;if(s.has(t))continue;const a=(e.name_by_user||e.name||e.id).trim();t!==this._markerDialog?.binding&&!i.has(t)&&n.has(a+"|"+(e.area_id||""))||o.push({value:t,label:a,sub:(e.model||this._t("marker.sub_device"))+("Group"===e.model?this._t("marker.sub_z2m_group"):"")})}const a=new Set(["group","template","derivative","min_max","threshold","integration","statistics","trend","utility_meter","tod","switch_as_x","schedule"]);for(const[n,r]of Object.entries(t.entities)){const l="entity:"+n;if(s.has(l))continue;if(bo(t,n,e)&&!i.has(l))continue;const c=a.has(r.platform),h="group"===r.platform;if(!c&&!h)continue;if(r.hidden&&!i.has(l))continue;const d=t.states[n];o.push({value:l,label:r.name||d?.attributes?.friendly_name||n,sub:n.split(".")[0]+" · "+("group"===r.platform?this._t("marker.sub_group"):this._t("marker.sub_helper"))})}if(this._markerDialog?.showEntities){const n=new Set(o.map(t=>t.value));for(const[a,r]of Object.entries(t.entities)){const l="entity:"+a;if(s.has(l)||n.has(l)||r.hidden&&!i.has(l))continue;if(bo(t,a,e)&&!i.has(l))continue;const c=t.states[a],h=r.name||c?.attributes?.friendly_name||a,d=r.device_id?t.devices[r.device_id]:null,u=d&&(d.name_by_user||d.name)||"";o.push({value:l,label:h,sub:a.split(".")[0]+" · "+this._t("marker.sub_entity")+(u?" · "+u:"")})}}const r=(this._markerDialog?.bindingFilter||"").toLowerCase().trim(),l=r?o.filter(t=>(t.label+" "+t.sub+" "+t.value).toLowerCase().includes(r)):o;return l.sort((t,e)=>t.label.localeCompare(e.label)),l.slice(0,200)}_physicalBodiesR(t=this._spaceModel()){if(!t)return[];const e=`${t.id}|${this._cfgEpoch}|${this._cellCm}|${this._gridPitch}`;if(this._physicalBodiesCache?.key===e)return this._physicalBodiesCache.all;const i=Rl(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t));return this._physicalBodiesCache={key:e,...i},i.all}_rawPhysicalBodiesR(t=this._spaceModel()){if(!t)return[];this._physicalBodiesR(t);const e=this._physicalBodiesCache;return e?[...e.drafts,...e.partitions,...e.columns]:[]}_cleanFloor(t,e,i=this._spaceModel()){if(!i)return{floor:e,geom:null,path:"",area:zl([[[...e,e[0]]]])};const s=t.id||`#${i.rooms.indexOf(t)}`,n=`${i.id}|${this._cfgEpoch}|${s}`;if(!this._rszPreview){const t=r_(this._cleanFloorCache,n);if(t.hit)return t.value}const o=e.map(t=>t[0]),a=e.map(t=>t[1]),r=[Math.min(...o),Math.min(...a),Math.max(...o),Math.max(...a)],l=this._physicalBodiesR(i).filter(t=>{const e=t.map(t=>t[0]),i=t.map(t=>t[1]);return Math.max(...e)>=r[0]&&Math.min(...e)<=r[2]&&Math.max(...i)>=r[1]&&Math.min(...i)<=r[3]}),c=l.length?Fl(e,l):null,h={floor:e,geom:c,path:c?Cl(c):"",area:zl(c||[[[...e,e[0]]]])};return this._rszPreview||l_(this._cleanFloorCache,n,h,600),h}_autoIconForBinding(t){if("virtual"===t)return"mdi:map-marker";const[e,i]=t.split(":");if(!i)return"";const s=this._fullRegistryHass,n=this._bindingStatus(t),o="active"===n.kind?n.enabledEntityIds:n.allEntityIds;if("device"===e){const t=s.devices?.[i];if(!t)return"mdi:help-circle";const e=o;return e.some(t=>t.startsWith("lock."))?"mdi:lock":vo(s,t.name_by_user||t.name||"",t.model,e,this._iconRules)}if("entity"===e){const t=s.entities?.[i],e=this.hass.states?.[i],n=t?.name||e?.attributes?.friendly_name||i;return i.startsWith("lock.")?"mdi:lock":vo(s,n,"",[i],this._iconRules)}return""}_allRoomsFlat(){const t=[];for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area?t.push({value:e.id+"#"+i.area,label:(e.title||e.id)+" · "+i.name}):i.id&&t.push({value:e.id+"#@"+i.id,label:(e.title||e.id)+" · "+i.name+" · "+this._t("marker.subarea")});return t}_errText(t){if(!t)return this._t("err.unknown");if("string"==typeof t)return t;if("invalid_passage_fields"===t.code){const e=String(t.message||t.error||"").match(/space=([^;]*);\s*opening=([^;]*);\s*fields=([^;]*)/);if(e){const t=this._serverCfg?.spaces?.find(t=>String(t.id)===e[1]),i={contact:"opening.contact_label",lock:"opening.lock_label",invert:"opening.invert",flip_h:"opening.flip_h",flip_v:"opening.flip_v"},s=e[3].split(",").filter(Boolean).map(t=>i[t]?this._t(i[t]):t).join(", ");return this._t("opening.invalid_passage_fields",{room:t?.title||e[1],fields:s})}}if("invalid_partition_opening_jamb_margin"===t.code){const e=String(t.message||t.error||"").match(/margin_cm=([^;]*)/),i=e?Number(e[1]):NaN;if(Number.isFinite(i))return this._t("opening.partition_jamb_margin",{distance:li(i,this._imperial)})}if(t.message)return t.message;if(t.error)return t.error;if(null!=t.code)return this._t("err.code",{code:t.code});try{return JSON.stringify(t)}catch{return String(t)}}_backupErrorText(t){const e=t?.code??t?.error;if("string"==typeof e){const t=`backup.error.${e}`,i=this._t(t);if(i!==t)return i}return this._errText(t)}async _pickMarkerFiles(t){const e=t.target,i=e.files?[...e.files]:[];if(e.value="",!i.length||!this._markerDialog)return;const s=this._markerDialog.uploadId||this._markerDialog.devId||"new",n=[];for(const t of i)try{const e=new FormData;e.append("marker_id",s),e.append("file",t,t.name);const i=this.hass?.fetchWithAuth?await this.hass.fetchWithAuth("/api/houseplan/upload",{method:"POST",body:e}):await fetch("/api/houseplan/upload",{method:"POST",body:e,headers:this.hass?.auth?.data?.access_token?{authorization:`Bearer ${this.hass.auth.data.access_token}`}:{}}),o=await i.json().catch(()=>({}));if(!i.ok||o.error){const t={too_large:this._t("err.too_large",{mb:o.max_mb||50}),bad_ext:this._t("err.bad_ext"),unauthorized:this._t("err.unauthorized")};throw new Error(t[o.error]||o.error||"HTTP "+i.status)}n.push({name:o.name||t.name,url:o.url})}catch(e){this._showToast(this._t("toast.file_failed",{name:t.name,err:this._errText(e)}))}n.length&&this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:[...this._markerDialog.pdfs,...n]},this._showToast(this._t("toast.files_attached",{n:n.length})))}_removeMarkerPdf(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:this._markerDialog.pdfs.filter(e=>e.url!==t)})}_markerLightFields(t){const e={};if(t.lightRoleTouched?"always"===t.lightRole?e.is_light=!0:"never"===t.lightRole&&(e.is_light=!1):t.originalHasIsLight&&(e.is_light=t.originalIsLight??null),t.lightEntityTouched?t.lightEntity&&(e.light_entity=t.lightEntity):t.originalHasLightEntity&&(e.light_entity=t.originalLightEntity??null),t.glowTouched){if("auto"!==t.glowMode){const i={c:Rt(t.glowColor,this._fillColors.glow_light.c)};"fixed"===t.glowMode&&(i.bri=Math.max(.01,Math.min(1,Math.round(t.glowBrightness)/100))),e.glow_color=i}}else t.originalHasGlowColor&&(e.glow_color=t.originalGlowColor??null);return e}_markerTapActionFields(t){return t.tapActionTouched?{tap_action:t.tapAction||null}:t.originalHasTapAction?{tap_action:t.originalTapAction??null}:{}}_markerToggleEntityFields(t){return(e={touched:t.toggleEntityTouched,originalHas:t.originalHasToggleEntity,original:t.originalToggleEntity,value:t.toggleEntity}).touched?e.value?{toggle_entity:e.value}:{}:e.originalHas?{toggle_entity:e.original??null}:{};var e}async _saveMarker(){const t=this._markerDialog;if(!t||t.busy)return;const e=this._effectiveMarkerTapAction(t);if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return;if("virtual"===t.binding&&!t.name.trim())return void this._showToast(this._t("toast.virtual_name_required"));if("run"===e&&!t.tapTarget)return void this._showToast(this._t("toast.run_target_required"));if(t.valueBadgeTouched&&t.valueBadgeEnabled&&!t.valueBadgeSource)return void this._showToast(this._t("toast.value_badge_source_required"));if("ha"===t.bindingMode){const e=this._bindingStatus(t.binding),i=t.devId?this._markers.find(e=>e.id===t.devId):null,s=!i||i.binding!==t.binding;if("active"!==e.kind&&s)return void this._showToast(this._t("ha_disabled"===e.kind?"toast.ha_disabled_add":"toast.ha_binding_unverified"));if("ha_disabled"===e.kind&&!0===i?.hidden&&!t.hideFromPlan)return this._markerDialog={...t,hideFromPlan:!0},void this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device"))}const i=this._serverCfg;if(!i)return;const s=i.markers||[],n=qs(t.room);let o=n?.space||null;const a=n?.area||null,r=n?.roomId||null,l=Fi(t.binding,t.devId,()=>"v_"+Date.now().toString(36)),c=t.devId,h=c?this._devices.find(t=>t.id===c):null,d=n?.space||h?.space||null,u=d?this._spaceModelById(d):this._spaceModel();if(!u)return;const p=u.id;"virtual"!==t.binding||o||(o=p),this._markerDialog={...t,busy:!0};try{const n="virtual"===t.binding?[]:s.filter(e=>e.removed&&e.binding===t.binding).map(t=>t.id),d=n.length>0,_=Xn(t.binding,t.controls,this._bindingEntities(t.binding)),g=s.find(t=>t.id===l||t.id===c)?.vacuum||null,m={id:l,vacuum:g,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&3!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle?t.angle:null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===e&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:_.length?_:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=a_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:!!t.hideFromPlan};("virtual"===t.binding||t.room)&&(m.space=o,m.area=a,m.room_id=r);const f=h?.marker?.room_id??null,v=!!t.room&&null!=h&&(h.space!==o||h.area!==a||f!==r);let y=!1;const b=t.uploadId||c;if(b&&b!==l&&m.pdfs?.length)try{const t=await this.hass.callWS({type:"houseplan/files/migrate",from_id:b,to_id:l}),e=t?.mapping||{};m.pdfs=function(t,e,i,s){if(!e||!i||e===i)return t;const n="/files/"+e+"/",o="/files/"+i+"/";return t.map(t=>{if(!t.url.includes(n))return t;const e=t.url.split(n)[1]||"",[i,a]=[e.split("?")[0],e.includes("?")?"?"+e.split("?")[1]:""];if(s){const e=s[decodeURIComponent(i)]??s[i];return e?{...t,url:t.url.split(n+i)[0]+o+encodeURIComponent(e)+a}:t}return{...t,url:t.url.split(n).join(o)}})}(m.pdfs,b,l,e),y=Object.keys(e).length>0}catch(t){this._showToast(this._t("toast.files_migrate_failed",{err:this._errText(t)}))}i.markers=s,c&&c!==l&&(i.markers=function(t,e,i){if(!e||!i||e===i)return[...t];const s=`marker:${e}`,n=`marker:${i}`;return t.map(t=>{const e=Array.isArray(t.controls)?t.controls.map(t=>t===s?n:t):t.controls,i="derived_marker_state"===t.value_badge?.source?.kind&&t.value_badge.source.ref===s?{...t.value_badge,source:{...t.value_badge.source,ref:n}}:t.value_badge;return e===t.controls&&i===t.value_badge?t:{...t,controls:e,value_badge:i}})}(i.markers,c,l)),c&&c!==l&&"derived_marker_state"===m.value_badge?.source?.kind&&m.value_badge.source.ref===`marker:${c}`&&(m.value_badge.source={kind:"derived_marker_state",ref:`marker:${l}`}),i.markers=i.markers.filter(t=>t.id!==l&&t.id!==c&&("virtual"===m.binding||t.binding!==m.binding)),i.markers.push(m);let w=null;const k=c?this._layout[c]:null,$=k?{s:k.s||h?.space||this._space,x:k.x,y:k.y}:c&&h&&this._defPos[c]?this._normPos(h.space,this._defPos[c].x,this._defPos[c].y):null;if(!d&&$&&$.s===p)l===c&&this._layout[l]&&!v||(w={s:$.s,x:$.x,y:$.y},this._layout={...this._layout,[l]:w});else if(d||!this._layout[l]||v){let t=u.vb[0]+u.vb[2]/2,e=u.vb[1]+u.vb[3]/2;const i=r?u.rooms.find(t=>t.id===r):a?u.rooms.find(t=>t.area===a):void 0;i&&([t,e]=this._roomCenter(i)),w=this._normPos(p,t,e),this._layout={...this._layout,[l]:w}}await this._saveConfigNow(),w&&this._noteLayoutRev(await this.hass.callWS({type:"houseplan/layout/update",device_id:l,pos:w}));const x=new Set(n);c&&c!==l&&x.add(c),x.delete(l);for(const t of x)delete this._layout[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{});y&&b&&await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:b}).catch(()=>{}),this._markerDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_saved"))}catch(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}async _deleteMarker(){const t=this._markerDialog;if(!t||t.busy||!t.devId)return;const e=t.devId?this._devices.find(e=>e.id===t.devId):null;if(!e)return;const i=t.name||this._t("device.fallback");if(!confirm(this._t("confirm.remove_marker",{name:i})))return;const s=this._serverCfg;s.markers=s.markers||[];const n=s.markers,o="virtual"===e.bindingKind?"virtual":e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:"";if(!o)return;const a=function(t,e,i,s){const n=new Set([e]),o=t.filter(t=>{const o=t.id===e||!s&&t.binding===i;return o&&n.add(t.id),!o});return{markers:s?o:[...o,{id:e,binding:i,removed:!0,hidden:!0}],cleanupIds:n}}(s.markers,e.id,o,"virtual"===e.bindingKind);var r,l;s.markers=(r=a.markers,l=a.cleanupIds,r.map(t=>{if(!Array.isArray(t.controls))return t;const e=t.controls.filter(t=>!("string"==typeof t&&t.startsWith("marker:")&&l.has(t.slice(7))));return e.length===t.controls.length?t:{...t,controls:e.length?e:null}}));const c=a.cleanupIds;this._markerDialog={...t,busy:!0};try{await this._saveConfigNow();for(const t of c){delete this._layout[t],delete this._defPos[t],this._dirtyPos.delete(t),this._sentPos.delete(t);const e=this._activityRt.get(t);e&&clearTimeout(e.timer),this._activityRt.delete(t),this._vacRt.delete(t),delete this._vacSrvTrails[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{}),await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:t}).catch(()=>{}),await this.hass.callWS({type:"houseplan/trail/delete",marker_id:t}).catch(()=>{})}this._markerDialog=null,this._infoCard?.id===e.id&&this._closeInfoCard(),this._selId===e.id&&(this._selId=null),this._drag?.id===e.id&&(this._drag=null),this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_removed"))}catch(t){this._serverCfg===s&&(s.markers=n),this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}_normPos(t,e,i){return{s:t,x:e/y_,y:i/y_}}_openSpaceDialog(t,e){if(this._serverStorage&&this._serverCfg)if("edit"===t){const i=this._serverCfg.spaces.find(t=>t.id===e);if(!i)return;const s=cs(i),n=i.settings?.custom_fill&&"object"==typeof i.settings.custom_fill?rs(i.settings.custom_fill):null,o="none"===s.fill?{...n||as,a:0}:n;this._spaceDialog={mode:t,spaceId:e,title:i.title,planUrl:i.plan_url||null,planFile:null,source:i.plan_url?"file":"draw",showBorders:s.showBorders,showNames:s.showNames,hideDecor:s.hideDecor,hideOpenings:s.hideOpenings,roomColor:s.color,roomOpacity:s.opacity,fillMode:"none"===s.fill?"custom":s.fill,customFill:o,glowEnabled:s.glow,bgColor:s.bgColor,bgMode:"static"===i.settings?.bg_mode||"daynight"===i.settings?.bg_mode?i.settings.bg_mode:null,northDeg:Ka({},i.settings),sunRays:"boolean"==typeof i.settings?.sun_rays?i.settings.sun_rays:null,tempMin:s.tempMin,tempMax:s.tempMax,showLqi:s.showLqi??this._config?.show_signal??!0,cardFontScale:s.cardFontScale,labelTemp:s.labelTemp,labelHum:s.labelHum,labelLqi:s.labelLqi,labelLight:s.labelLight,cellCm:Number(i.cell_cm)>0?Number(i.cell_cm):5,busy:!1}}else this._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,source:"file",showBorders:!1,showNames:!1,hideDecor:!1,hideOpenings:!1,roomColor:ns,roomOpacity:os,fillMode:"custom",customFill:{...as,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:20,tempMax:25,showLqi:this._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:5,busy:!1};else this._showToast(this._t("toast.integration_missing"))}async _pickPlanFile(t){const e=t.target,i=e.files?.[0];if(!i||!this._spaceDialog)return;const s={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/webp":"webp"}[i.type]||(i.name.toLowerCase().endsWith(".svg")?"svg":"");if(!s)return void this._showToast(this._t("toast.plan_formats"));const n=new Uint8Array(await i.arrayBuffer());let o="";for(let t=0;t{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:1.414),e.onerror=()=>t(1.414),e.src=r});URL.revokeObjectURL(r),this._spaceDialog={...this._spaceDialog,planFile:{ext:s,b64:a,aspect:l,name:i.name}}}_useServerPlan(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let e=0;e<40;e++){const e=this._display(t);if(e){const i=await new Promise(t=>{const i=new Image;i.onload=()=>t(i.naturalWidth&&i.naturalHeight?i.naturalWidth/i.naturalHeight:0),i.onerror=()=>t(0),i.src=e}),s=this._spaceDialog;return s&&s.planUrl===t&&Number.isFinite(i)&&i>0?(this._spaceDialog={...s,savedAspect:i},i):0}if(await new Promise(t=>setTimeout(t,150)),this._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){if(confirm(this._t("confirm.delete_plan",{name:t})))try{await this.hass.callWS({type:"houseplan/plans/delete",name:t});const e=this._spaceDialog;e?.saved&&(this._spaceDialog={...e,saved:e.saved.filter(e=>e.name!==t)})}catch(t){this._showToast(this._t("toast.plan_delete_failed",{err:this._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return j`
${this._t("space.loading")}
`;const e=t.saved||[];if(!e.length)return j`
${this._t("space.no_saved")}
`;return j`
+
`:j``}_openingAt(t){if(!this._openingsR.length)return null;const e=this._openingsR.flatMap(e=>{const i=e.angle*Math.PI/180,s=t[0]-e.rx,n=t[1]-e.ry,o=s*Math.cos(i)+n*Math.sin(i);return Math.abs(o)>e.rlen/2+12?[]:[{o:e,localY:-s*Math.sin(i)+n*Math.cos(i)}]});if(!e.length)return null;const i=this._spaceModel();if(!i)return null;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return e.find(({o:t,localY:e})=>{const i="gate"===t.type?!t.flip_v:t.flip_v,s=t.partitionHost||this._spaceWalls.length||"gate"===t.type?this._openingFace(t,n,!!i):{ox:0,oy:0,cm:0,side:-1},o=Yd({type:t.type,length:t.rlen,angle:t.angle,amount:this._openingAmt(t),flipH:!!t.flip_h,flipV:!!t.flip_v,cellCm:this._cellCm,gridPitch:this._gridPitch,face:s});return Math.abs(e)<=o.hitHalf})?.o||null}_resolveOpeningPlacement(t){const e=this._openingPreset;if("opening"!==this._tool||!e)return null;const i=this._spaceModel();if(!i)return null;const s=this._openCuts(),n=this._openingWallIndexFor(i,s),o=`${n.key}|partitions:${this._cfgEpoch}`;var a,r,l;this._openingPlacementIntervalsCache&&this._openingPlacementIntervalsCache.key===o||(this._openingPlacementIntervalsCache={key:o,value:[...Qr(i.rooms,this._spaceWalls,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_),...(a=i.partitions,r=this._cellCm,l=this._gridPitch,a.flatMap(t=>!Zh(t.a)||!Zh(t.b)||Math.hypot(t.b[0]-t.a[0],t.b[1]-t.a[1])<=1e-9?[]:[{roomId:"",a:[t.a[0],t.a[1]],b:[t.b[0],t.b[1]],key:`partition:${t.id}`,kind:"outer",cm:t.cm,open:!1,half:fr(t.cm,r,l)/2,partitionHost:{kind:"partition",id:t.id}}]))]});const c=Zp({pointer:[t[0],t[1]],preset:e,geometryRevision:this._cfgEpoch,renderedLength:this._cmToUnits(e.lengthCm),intervals:this._openingPlacementIntervalsCache.value,baseTolerance:1.5*this._gridPitch,bodyPointerPadding:this._cssPxToRender(this._boundaryCoarse?10:6),gridStep:this._gridPitch});this._openingJambBlockCm=c.jambBlockedTarget?c.jambBlockedTarget.physicalHalfWidth/this._gridPitch*this._cellCm:null;const h=c.candidate;if(!h)return null;const d="gate"===h.type?!h.flipV:h.flipV;let u;if(h.host){const t=ed({id:"preview",type:h.type,x:h.x/y_,y:h.y/y_,angle:h.angle,length:h.renderedLength/y_,host:h.host},i.partitions,y_,this._cellCm,this._gridPitch).resolved;u=t?od(t,d):{ox:0,oy:0,cm:0,side:-1}}else u=yl(n.value,{x:h.x,y:h.y,angle:h.angle,length:h.renderedLength,flip_v:d});const p="mi"===this.hass?.config?.unit_system?.length,_=_i([h.x,h.y],h.angle,h.renderedLength,i.rooms,this._gridPitch/2),g=(_?[{distance:_.sideA,midpoint:_.midA},{distance:_.sideB,midpoint:_.midB}]:h.measure.labels).map(t=>({x:t.midpoint[0],y:t.midpoint[1],text:li(t.distance/this._gridPitch*this._cellCm,p)}));return{...h,face:u,measure:{labels:g,guide:h.measure.guide}}}_activateOpeningPlacement(t){this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingPreset=function(t,e){return{type:t,lengthCm:Kp(t),flipH:!1,flipV:!1,revision:e}}(t,++this._openingPresetRevision),this._openingHoverCandidate=null,this._cursorPt=null)}_clearOpeningPlacement(t){this._openingHoverCandidate=null,this._openingJambBlockCm=null,t&&(this._openingPreset=null,this._openingRebindId=null)}_openingClick(t){const e=this._spaceModel();if(!e)return;const i=this._openingRebindId?null:this._openingAt(t);if(i)return void this._editOpening(i);const s=this._openingPreset;if(!s)return;const n=this._openingHoverCandidate,o=n&&Qp(n,[t[0],t[1]],s.revision,this._cfgEpoch)?n:this._resolveOpeningPlacement(t);if(!o){if(null!=this._openingJambBlockCm)return void this._showToast(this._t("opening.partition_jamb_margin",{distance:li(this._openingJambBlockCm,this._imperial)}));const i=1.5*this._gridPitch,s=pi(t,e.rooms,i);return s&&function(t,e,i,s,n){for(const o of s)if(!(Ns([t,e],o)>n)&&Pr([o[0],o[1]],[o[2],o[3]],i))return!0;return!1}(s.x,s.y,s.angle,this._openCuts(),i)?void this._showToast(this._t("toast.opening_on_virtual")):void this._showToast(this._t("toast.opening_no_wall"))}const a=this._openingRebindId?this._curSpaceCfg?.openings?.find(t=>t.id===this._openingRebindId):null;this._openingDialog={...a?{id:a.id,type:a.type,lengthCm:Math.round(a.length*y_/this._gridPitch*this._cellCm),lengthTouched:!1,contact:a.contact||"",lock:a.lock||"",invert:!!a.invert,flipH:!!a.flip_h,flipV:!!a.flip_v}:{type:o.type,lengthCm:o.lengthCm,contact:"",lock:"",invert:!1,flipH:o.flipH,flipV:o.flipV},...o.host?{host:o.host}:{},x:o.x,y:o.y,angle:o.angle},this._openingRebindId=null,this._openingHoverCandidate=null,this._cursorPt=null}_editOpening(t){this._openingDialog={id:t.id,type:t.type,lengthCm:Math.round(t.rlen/this._gridPitch*this._cellCm),lengthTouched:!1,contact:t.contact||"",lock:t.lock||"",invert:!!t.invert,flipH:!!t.flip_h,flipV:!!t.flip_v,...t.host?{host:{...t.host}}:{},x:t.rx,y:t.ry,angle:t.angle}}_opPointerDown(t,e){if("plan"===this._mode&&this._spaceModel()&&"resize"!==this._tool){t.preventDefault(),t.stopPropagation();try{C_(t)}catch{}this._opDrag={id:e.id,moved:!1,sx:t.clientX,sy:t.clientY,dirty:!1,before:this._geometrySnapshot()}}}_opPointerMove(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;if(Math.abs(t.clientX-this._opDrag.sx)+Math.abs(t.clientY-this._opDrag.sy)<=3)return;const i=this._spaceModel();if(!i)return;const s=this._svgPoint(t),n=this._curSpaceCfg,o=n?.openings?.find(t=>t.id===e.id);if(!o)return;if("partition"===o.host?.kind){const t=i.partitions.find(t=>t.id===o.host.id);if(!t)return;const e=t.b[0]-t.a[0],n=t.b[1]-t.a[1],a=Math.hypot(e,n);if(!(a>1e-9))return;const r=e/a,l=n/a;if(Math.abs((s[0]-t.a[0])*l-(s[1]-t.a[1])*r)>4*this._gridPitch)return;const c=o.length*y_/2+Qh(t,this._cellCm,this._gridPitch);let h=(s[0]-t.a[0])*r+(s[1]-t.a[1])*l;if(h=Math.round(h/this._gridPitch)*this._gridPitch,h=Math.max(c,Math.min(a-c,h)),a<2*c-1e-9)return;const d=h/a,u=(t.a[0]+r*h)/y_,p=(t.a[1]+l*h)/this._spaceH;let _=180*Math.atan2(n,e)/Math.PI;_>=90?_-=180:_<-90&&(_+=180);const g=o.host.t!==d||o.x!==u||o.y!==p||o.angle!==_;return this._opDrag.moved=!0,g&&(this._opDrag.dirty=!0),o.host={...o.host,t:d},o.x=u,o.y=p,o.angle=_,this._opMeasure=null,g&&this._cfgEpoch++,void this.requestUpdate()}const a=pi(s,i.rooms,4*this._gridPitch);if(!a)return;this._opDrag.moved=!0;const r=this._opRuler(a,o.length*y_);this._opMeasure=r.measure;const l=r.x/y_,c=r.y/this._spaceH,h=o.x!==l||o.y!==c||o.angle!==a.angle;h&&(this._opDrag.dirty=!0),o.x=l,o.y=c,o.angle=a.angle,h&&this._cfgEpoch++,this.requestUpdate()}_opRuler(t,e){const i=this._spaceModel()?.rooms||[],s=this._gridPitch/2;let n=t.x,o=t.y,a=_i([n,o],t.angle,e,i,s);if(a&&a.centered&&(n!==a.wallCenter[0]||o!==a.wallCenter[1]))[n,o]=a.wallCenter,a=_i([n,o],t.angle,e,i,s);else if(a){const[r,l]=a.wallA,[c,h]=a.wallB,d=c-r,u=h-l,p=Math.hypot(d,u);if(p>0){const c=this._gridPitch,h=Math.min(e/2,p/2);let _=Math.round(((n-r)*d+(o-l)*u)/p/c)*c;_=Math.max(h,Math.min(p-h,_)),n=r+_/p*d,o=l+_/p*u,a=_i([n,o],t.angle,e,i,s)||a}}if(!a)return{x:n,y:o,angle:t.angle,measure:null};const r="mi"===this.hass?.config?.unit_system?.length,l=(t,e)=>({x:e[0],y:e[1],text:li(t/this._gridPitch*this._cellCm,r)});return{x:n,y:o,angle:t.angle,measure:{labels:[l(a.sideA,a.midA),l(a.sideB,a.midB)],guide:a.centered?{x:a.wallCenter[0],y:a.wallCenter[1],angle:t.angle}:null}}}_opPointerUp(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;const i=this._opDrag,s=i.moved;this._opMeasure=null,s&&i.dirty&&(this._recordGeometry(this._t("history.move_opening"),i.before),this._saveConfig()),s?window.setTimeout(()=>this._opDrag=null,0):this._opDrag=null}_opClick(t,e){"plan"===this._mode&&"resize"===this._tool||(t.stopPropagation(),this._opDrag?.moved||"plan"===this._mode&&this._editOpening(e))}_saveOpening(){const t=this._openingDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=this._geometrySnapshot(),n=this._spaceH,o=(e.openings||[]).find(e=>e.id===t.id),a={...o||{},id:t.id||"o"+Date.now().toString(36),type:t.type,x:t.x/y_,y:t.y/n,angle:t.angle,length:o&&!t.lengthTouched?o.length:this._cmToUnits(Math.max(20,t.lengthCm))/y_,...t.host?{host:{...t.host}}:{}};if(a.host){const t=sd(o,a)?id(a,i.partitions,y_,this._cellCm,this._gridPitch):ed(a,i.partitions,y_,this._cellCm,this._gridPitch);if(!t.resolved){const e=i.partitions.find(t=>t.id===a.host.id);if("does-not-fit-jamb"===t.reason&&e){const t=Qh(e,this._cellCm,this._gridPitch);this._showToast(this._t("opening.partition_jamb_margin",{distance:li(t/this._gridPitch*this._cellCm,this._imperial)}))}else this._showToast(this._t("opening.partition_orphan"));return}const s=(e.openings||[]).flatMap(t=>{if(!t.host||t.id===a.id)return[];const e=ed(t,i.partitions,y_,this._cellCm,this._gridPitch).resolved;return e?[e]:[]});if(function(t,e,i=1e-9){const s=t.length/(2*t.axis.length),n=t.t-s,o=t.t+s;return e.some(e=>{if(e.host.id!==t.host.id||e.opening.id===t.opening.id)return!1;const s=e.length/(2*e.axis.length);return Math.max(n,e.t-s)t.id===a.id);r>=0?e.openings[r]=a:e.openings.push(a),this._recordGeometry(this._t(t.id?"history.edit_opening":"history.add_opening"),s),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_deleteOpening(){const t=this._openingDialog,e=this._curSpaceCfg;if(!t?.id||!e?.openings)return;const i=this._geometrySnapshot();e.openings=e.openings.filter(e=>e.id!==t.id),this._recordGeometry(this._t("history.delete_opening"),i),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_contactCandidates(){const t=[];for(const e of Object.keys(this.hass.states)){if(!this._openingEntityAvailable(e))continue;const i=e.split(".")[0];if("binary_sensor"!==i&&"cover"!==i)continue;const s=this.hass.states[e],n=["door","window","opening","garage_door","garage"].includes(s?.attributes?.device_class||"");("cover"!==i||n)&&t.push([e,s?.attributes?.friendly_name||e,n?0:1])}return t.sort((t,e)=>t[2]-e[2]||t[1].localeCompare(e[1])).map(([t,e])=>({value:t,label:e}))}_lockCandidates(){return Object.keys(this.hass.states).filter(t=>t.startsWith("lock.")&&this._openingEntityAvailable(t)).map(t=>({value:t,label:this.hass.states[t]?.attributes?.friendly_name||t})).sort((t,e)=>t.label.localeCompare(e.label))}_mergeClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms,s=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!s?.id)return;const n=s.id;if(!this._mergeSel||this._mergeSel===n)return void(this._mergeSel=this._mergeSel===n?null:n);const o=i.find(t=>t.id===this._mergeSel),a=o?hi(o):null,r=hi(s),l=a&&r?function(t,e){if(!t||!e||t.length<3||e.length<3)return null;const i=si(Ri(t),Ri(e));if(1!==i.length)return null;if(1!==i[0].length)return null;const s=i[0][0].slice(0,-1).map(t=>[t[0],t[1]]);return s.length>=3?s:null}(a,r):null;if(!l)return this._showToast(this._t("toast.merge_not_adjacent")),void(this._mergeSel=null);this._mergeDialog={aId:this._mergeSel,bId:n,poly:l,pick:"a"},this._mergeSel=null}_commitMerge(){const t=this._mergeDialog,e=this._curSpaceCfg;if(!t||!e||!this._spaceModel())return;const i=this._geometrySnapshot(),s=this._spaceH,n="a"===t.pick?t.aId:t.bId,o="a"===t.pick?t.bId:t.aId,a=e.rooms.find(t=>t.id===n);a?(a.poly=t.poly.map(t=>[t[0]/y_,t[1]/s]),delete a.x,delete a.y,delete a.w,delete a.h,e.rooms=e.rooms.filter(t=>t.id!==o),this._commitOpenSpans(),this._recordGeometry(this._t("history.merge_rooms"),i),this._saveConfig(),this._mergeDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.rooms_merged",{name:a.name||""}))):this._mergeDialog=null}_splitClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms;if(!this._splitSel){const e=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!e?.id)return;return void(this._splitSel={roomId:e.id,pts:[]})}const s=i.find(t=>t.id===this._splitSel.roomId),n=s?hi(s):null;if(!s||!n)return void(this._splitSel=null);const o=.02*this._gridPitch,a=6*this._gridPitch,r=function(t,e){if(!e||e.length<2)return null;let i=null,s=1/0;for(let n=0;n=n)continue;n=_;const g=Math.sqrt(u),m=(i>0?Math.max(0,Math.min(g,Math.round(p*g/i)*i)):p*g)/g;s=[a+m*h,r+m*d]}return s}(r,n,this._gridPitch)||r,c=r&&l&&Math.hypot(r[0]-t[0],r[1]-t[1])<=a?l:null,h=!!c&&bi(c,n,o),d=this._splitSel.pts;if(!d.length)return h?void(this._splitSel={...this._splitSel,pts:[c]}):void this._showToast(this._t("toast.split_pick_wall"));if(!h){const e=this._snap(t);return wi(e,n,o)?void(this._splitSel={...this._splitSel,pts:[...d,e]}):void this._showToast(this._t("toast.split_pick_inside"))}const u=Ei(n,[...d,c],o);if(!u)return void this._showToast(this._t("toast.split_bad_cut"));this._resetRoomDialogFields();const[p,_]=u,g=Pi(p)>=Pi(_)?p:_,m=g===p?_:p;this._pendingSplit={roomId:s.id,mainPoly:g,newPoly:m},this._cursorPt=null,this._nameSel="",this._areaSel="",this._roomDialog=!0}get _contourClosed(){return this._path.length>=4&&this._samePt(this._path[0],this._path[this._path.length-1])&&(null!=this._closingWallCm||!this._activeDraftId)}_markupMove(t){if(!this._markup)return;const e=t.pointerType;if(e&&(this._boundaryPointerType=e),"column"===this._tool)return void(this._cursorPt=this._snap(this._svgPoint(t)));if("opening"===this._tool||"boundary"===this._tool||"wallthick"===this._tool)return void(this._cursorPt=this._svgPoint(t));const i="draw"===this._tool&&!this._contourClosed,s="split"===this._tool&&!!this._splitSel?.pts?.length;if(!i&&!s)return;const n=this._svgPoint(t);if(i){const e=this._resolvePlanDrawPoint(n,t.shiftKey);return this._planSnapHover={contextKey:e.contextKey,candidate:e.candidate},this._path.length?void(this._cursorPt=e.point):void this._syncPlanSnapActiveMarker(e.candidate)}this._cursorPt=this._snap(n)}get _openingPreview(){const t=this._openingPreset;if("opening"!==this._tool||!t||!this._cursorPt)return null;const e=this._cursorPt,i=this._openingHoverCandidate;if(i&&Qp(i,[e[0],e[1]],t.revision,this._cfgEpoch))return i;if(this._openingAt(e))return this._openingHoverCandidate=null,null;const s=this._resolveOpeningPlacement(e);return this._openingHoverCandidate=s,s}get _opMeasureView(){return this._opMeasure||this._openingPreview?.measure||null}_saveRoom(){(this._areaSel||this._nameSel.trim())&&(this._wallFaceBatch?this._decideWallFace(!0):this._commitRoom())}_decideWallFace(t){const e=this._wallFaceBatch;if(!e)return;const i=e.candidates[e.index];if(!i)return;const s=t?{candidate:i,create:!0,name:this._nameSel.trim(),area:this._areaSel||null,settings:this._roomSettingsFromDialog()?JSON.parse(JSON.stringify(this._roomSettingsFromDialog())):null}:{candidate:i,create:!1},n=[...e.decisions,s],o=e.index+1;if(o"number"==typeof t&&Number.isFinite(t)&&t>=0?t:null,n=.02*this._gridPitch,o=this._spaceModel();if(!o)return pr;for(const e of this._planSnapGeometrySnapshot().value.segments){if("room"===e.sourceKind||Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])>n)continue;if("partition"===e.sourceKind)return s(o.partitions.find(t=>t.id===e.sourceId)?.cm)??pr;const i=e.sourceId.lastIndexOf(":"),a=i>=0?e.sourceId.slice(0,i):e.sourceId,r=i>=0?Number(e.sourceId.slice(i+1)):-1;return s(o.room_drafts.find(t=>t.id===a)?.segments[r]?.cm)??pr}for(let o=0;o+1{this._showToast(this._t(t,e)),this._roomDialogCancel()},n=t.decisions.filter(t=>t.create),o=n.map(t=>t.candidate.ring),a=i.rooms;for(let t=0;ti.id!==e&&!!hi(i)&&Di(o[t],hi(i)));if(i)return void s("toast.room_overlap",{name:i.name||""})}if((e.rooms||[]).length+n.length>400)return void s("toast.physical_limit");if(n.some(t=>t.candidate.split&&!e.rooms.some(e=>e.id===t.candidate.split.roomId)))return void s("toast.contour_cannot_close");const r=2e-4*this._gridPitch,l=new Map;for(let e=0;et.candidate.atomKeys)),i=n.some(t=>t.candidate.consumeAllActive);for(const s of Bd(this._wallGraphSources(t.activePath),r)){const t=s.sourceKeys.find(t=>l.has(t));!t||i||e.has(s.key)||c.push({a:s.a,b:s.b,cm:l.get(t)})}}else c.push(...bd(t.activePath,t.activeCms,pr));if((e.partitions||[]).length+c.length>$_)return void s("toast.physical_limit");const h=this._geometrySnapshot(),d=n.some(t=>!!t.candidate.split),u=d?tl(i.rooms,e.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,p=d&&Array.isArray(e.walls)?e.walls:null;for(const t of n){const i=t.candidate.split;if(!i)continue;const n=e.rooms.find(t=>t.id===i.roomId);if(!n)return void s("toast.contour_cannot_close");n.poly=i.mainPoly.map(t=>[t[0]/y_,t[1]/this._spaceH]),delete n.x,delete n.y,delete n.w,delete n.h}const _=Date.now().toString(36),g=[];if(n.forEach((t,i)=>{const s=t.area?this.hass.areas[t.area]?.name:"",n={id:`r${_}-${i}`,name:t.name||s||this._t("room.default_name"),area:t.area||null,poly:t.candidate.ring.map(t=>[t[0]/y_,t[1]/this._spaceH]),...t.settings?{settings:JSON.parse(JSON.stringify(t.settings))}:{}};e.rooms.push(n),g.push({room:n,decision:t})}),t.activeDraftId&&Array.isArray(e.room_drafts)&&(e.room_drafts=e.room_drafts.filter(e=>e.id!==t.activeDraftId),e.room_drafts.length||delete e.room_drafts),c.length&&(e.partitions||=[],c.forEach((t,i)=>e.partitions.push({id:`partition-${_}-${i}`,a:[t.a[0]/y_,t.a[1]/y_],b:[t.b[0]/y_,t.b[1]/y_],cm:t.cm}))),d){this._commitOpenSpans();const t=this._normalizeWalls(u,this._openCuts());t.length?e.walls=t:p?.length?e.walls=p:delete e.walls}if(g.length){this._cfgEpoch++;const i=this._openCuts(),s=this._spaceModel();if(!s)return;let n=e.walls;for(const{room:e,decision:o}of g){const a=o.candidate.ring,r=this._wallSourceCmAt(a[0],t.activePath,t.activeCms);n=Er(n,s.rooms,e.id,r,this._wallKeyPitch,i,y_);for(const o of Qr(s.rooms,n,i,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(o.roomId!==e.id||"outer"!==o.kind)continue;const i=[(o.a[0]+o.b[0])/2,(o.a[1]+o.b[1])/2];n=Ar(n,o.a,o.b,this._wallSourceCmAt(i,t.activePath,t.activeCms),this._wallKeyPitch,y_)}}const o=this._normalizeWalls(n,i);o.length?e.walls=o:delete e.walls}this._recordGeometry(this._t("history.wall_face_batch"),h),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._wallFaceBatch=null,this._roomDialog=!1,this._nameSel="",this._areaSel="",this._regSignature="",this._maybeRebuildDevices();const m=new Set(n.map(t=>t.area).filter(t=>!!t));if(m.size){const t={...this._layout};for(const e of this._devices){if(!m.has(e.area||"")||e.space!==this._space)continue;if(this._layout[e.id])continue;const i=this._defPos[e.id];i&&(t[e.id]={s:this._space,x:i.x/y_,y:i.y/y_},this._dirtyPos.add(e.id))}this._layout=t,this._persistLayout()}this._showToast(this._t(n.length?"toast.wall_rooms_saved":"toast.wall_chain_saved",{n:n.length}))}_commitRoom(){const t=this._curSpaceCfg,e=this._spaceModel();if(!t||!e)return;const i=this._geometrySnapshot(),s=this._spaceH,n=!!this._pendingSplit,o=n?tl(e.rooms,t.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,a=n&&Array.isArray(t.walls)?t.walls:null;let r;if(this._pendingSplit){const e=t.rooms.find(t=>t.id===this._pendingSplit.roomId);if(!e)return this._pendingSplit=null,this._splitSel=null,void(this._roomDialog=!1);e.poly=this._pendingSplit.mainPoly.map(t=>[t[0]/y_,t[1]/s]),delete e.x,delete e.y,delete e.w,delete e.h,r=this._pendingSplit.newPoly}else{if(!this._contourClosed)return;r=this._path.slice(0,-1)}const l=this._areaSel?this.hass.areas[this._areaSel]?.name:"",c={id:"r"+Date.now().toString(36),name:this._nameSel||l||this._t("room.default_name"),area:this._areaSel||null,poly:r.map(t=>[t[0]/y_,t[1]/s]),...this._roomSettingsFromDialog()?{settings:this._roomSettingsFromDialog()}:{}};if(t.rooms.push(c),!n&&this._activeDraftId&&Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),n){this._commitOpenSpans();const e=this._normalizeWalls(o,this._openCuts());e.length?t.walls=e:a?.length?t.walls=a:delete t.walls}if(!n){const e=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr],i=e[0]||this._drawWallCm;if(null!=i){this._cfgEpoch++;const s=this._openCuts(),n=this._spaceModel();if(!n)return;let o=Er(t.walls,n.rooms,c.id,i,this._wallKeyPitch,s,y_);for(const t of Qr(n.rooms,o,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(t.roomId!==c.id||"outer"!==t.kind)continue;const s=[(t.a[0]+t.b[0])/2,(t.a[1]+t.b[1])/2],n=r.findIndex((t,e)=>{const i=r[(e+1)%r.length];return Ns(s,[t[0],t[1],i[0],i[1]])<=.02*this._gridPitch});n>=0&&(o=Ar(o,t.a,t.b,e[n]||i,this._wallKeyPitch,y_))}o=this._normalizeWalls(o,s),o.length?t.walls=o:delete t.walls}}this._recordGeometry(this._t(n?"history.split_room":"history.add_room"),i),this._saveConfig(),this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._pendingSplit=null,this._splitSel=null;const h=this._areaSel;this._areaSel="",this._nameSel="",this._roomDialog=!1,this._regSignature="",this._maybeRebuildDevices();let d=0;if(h){const t=y_,e={...this._layout};for(const i of this._devices){if(i.area!==h||i.space!==this._space)continue;if(d++,this._layout[i.id])continue;const s=this._defPos[i.id];s&&(e[i.id]={s:this._space,x:s.x/y_,y:s.y/t},this._dirtyPos.add(i.id))}this._layout=e,this._persistLayout()}const u=this._model.find(t=>t.id===this._space)?.rooms.length||0;this._showToast(h?this._t("toast.room_saved",{n:u,added:d}):this._t("toast.room_saved_no_area",{n:u}))}_cancelPath(){this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),this._roomDialog=!1,this._pendingSplit=null,this._wallFaceBatch=null,this._splitSel=null,this._mergeSel=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._clearOpeningPlacement(!0)}_resumeLastDraft(){const t=this._resumeDraftBySpace[this._space];if(!t)return;const e=this._spaceModel()?.room_drafts.find(e=>e.id===t);e?(this._activeDraftId=t,this._path=e.points.map(t=>[...t]),this._draftSegmentCms=e.segments.map(t=>t.cm),this._clearPlanSnapHover()):delete this._resumeDraftBySpace[this._space]}_roomDialogCancel(){if(this._roomDialog=!1,this._roomEditId)return this._roomEditId=null,this._nameSel="",void(this._areaSel="");if(this._wallFaceBatch){const t=this._wallFaceBatch;return this._wallFaceBatch=null,this._path=t.activePath.map(t=>[...t]),this._draftSegmentCms=[...t.activeCms],this._activeDraftId=t.activeDraftId,this._nameSel="",this._areaSel="",void this.requestUpdate()}if(this._pendingSplit)return this._pendingSplit=null,void(this._splitSel=null);this._undoPoint()}get _freeAreas(){const t=new Set;for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area&&t.add(i.area);for(const e of this._wallFaceBatch?.decisions||[])e.create&&e.area&&t.add(e.area);return Object.values(this.hass?.areas||{}).filter(e=>!t.has(e.area_id)).sort((t,e)=>(t.name||"").localeCompare(e.name||""))}_openMarkerDialog(t){if(this._vacAllCamerasFor=null,this._vacAllCameraCache=null,t&&this._ackNewDevice(t.id),this._norm)if(t){const e=t.marker,i=Object.prototype.hasOwnProperty.call(e||{},"is_light"),s=Object.prototype.hasOwnProperty.call(e||{},"light_entity"),n=Object.prototype.hasOwnProperty.call(e||{},"glow_color"),o=Object.prototype.hasOwnProperty.call(e||{},"value_badge"),a=Object.prototype.hasOwnProperty.call(e||{},"tap_action"),r=Object.prototype.hasOwnProperty.call(e||{},"toggle_entity"),l=ks(e?.glow_color),c=this._devicePresentation(t,!0).valueBadge,h=Bo(this._planHass,t,this._devices),d=qo(this._planHass,t,h);this._markerDialog={devId:t.id,name:t.name,binding:"virtual"===t.bindingKind?"virtual":t.bindingKind+":"+t.bindingRef,bindingMode:"virtual"===t.bindingKind?"virtual":"ha",bindingOpen:!1,showEntities:"entity"===t.bindingKind&&!!this._fullRegistryHass.entities[t.bindingRef||""]?.device_id,bindingFilter:"",icon:t.marker?.icon||"",autoIcon:t.icon||"",display:Bi(t.marker?.display),rippleColor:Rt(t.marker?.ripple_color,""),rippleSize:Number(t.marker?.ripple_size)>0?Number(t.marker.ripple_size):3,size:Number(t.marker?.size)>0?Number(t.marker.size):1,angle:Number(t.marker?.angle)||0,tapAction:Wh(t.marker?.tap_action,t.primary?.split(".")[0]),tapActionTouched:!1,originalHasTapAction:a,originalTapAction:t.marker?.tap_action,tapHintAnnouncement:"",toggleEntity:e?.toggle_entity||"",toggleEntityTouched:!1,originalHasToggleEntity:r,originalToggleEntity:e?.toggle_entity,tapTarget:t.marker?.tap_target||"",tapConfirm:!0===t.marker?.tap_confirm,runFilter:"",controls:Xn(t.marker?.binding,t.marker?.controls,t.entities),controlsFilter:"",lightRole:!0===e?.is_light?"always":!1===e?.is_light?"never":"auto",lightRoleTouched:!1,originalHasIsLight:i,originalIsLight:e?.is_light,lightEntity:e?.light_entity||"",lightEntityTouched:!1,originalHasLightEntity:s,originalLightEntity:e?.light_entity,glowMode:null!=l?.bri?"fixed":l?"color":"auto",glowColor:l?.c||this._fillColors.glow_light.c,glowBrightness:Math.max(1,Math.round(100*(l?.bri??1))),glowColorDrafted:!!l,glowBrightnessDrafted:null!=l?.bri,glowTouched:!1,originalHasGlowColor:n&&(!!l||null===e?.glow_color),originalGlowColor:l||(null===e?.glow_color?null:void 0),valueBadgeEnabled:o?!0===e?.value_badge?.enabled:!!c,valueBadgeSource:e?.value_badge?.source||c?.source||d,valueBadgePosition:e?.value_badge?.position||c?.position||"right",valueBadgeTouched:!1,originalHasValueBadge:o,originalValueBadge:e?.value_badge,useClimateTemp:!0===t.marker?.use_climate_temp,glowRadius:Number(t.marker?.glow_radius_cm)>0?String(this._imperial?Math.round(Number(t.marker.glow_radius_cm)/30.48*10)/10:Math.round(Number(t.marker.glow_radius_cm))/100):"",model:t.model||"",link:t.link||"",description:t.description||"",pdfs:[...t.pdfs||[]],room:t.marker?.room_id?t.space+"#@"+t.marker.room_id:t.space&&t.area?t.space+"#"+t.area:"",hideFromPlan:!0===t.marker?.hidden,busy:!1}}else this._markerDialog={name:"",binding:"virtual",bindingMode:"virtual",bindingOpen:!1,showEntities:!1,bindingFilter:"",icon:"",autoIcon:"",display:"badge",rippleColor:"",rippleSize:3,size:1,angle:0,tapAction:"info",tapActionTouched:!1,originalHasTapAction:!1,originalTapAction:void 0,tapHintAnnouncement:"",toggleEntity:"",toggleEntityTouched:!1,originalHasToggleEntity:!1,originalToggleEntity:void 0,tapTarget:"",tapConfirm:!1,runFilter:"",controls:[],controlsFilter:"",lightRole:"auto",lightRoleTouched:!1,originalHasIsLight:!1,originalIsLight:void 0,lightEntity:"",lightEntityTouched:!1,originalHasLightEntity:!1,originalLightEntity:void 0,glowMode:"auto",glowColor:this._fillColors.glow_light.c,glowBrightness:100,glowColorDrafted:!1,glowBrightnessDrafted:!1,glowTouched:!1,originalHasGlowColor:!1,originalGlowColor:void 0,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgePosition:"right",valueBadgeTouched:!1,originalHasValueBadge:!1,originalValueBadge:void 0,useClimateTemp:!1,glowRadius:"",model:"",link:"",description:"",pdfs:[],room:"",hideFromPlan:!1,busy:!1,uploadId:"up_"+Date.now().toString(36)+Math.random().toString(36).slice(2,6)};else this._showToast(this._t("toast.marker_needs_server"))}_runCandidates(){const t=[];for(const e of Gi)for(const[i,s]of Object.entries(this.hass.states))i.startsWith(e+".")&&this._planEntityAvailable(i)&&t.push({value:i,label:s?.attributes?.friendly_name||i,sub:this._t("run."+e)});return t.sort((t,e)=>t.sub.localeCompare(e.sub)||t.label.localeCompare(e.label))}_bindingCandidates(){const t=this._planHass,e=yo(this._markers),i=new Set(this._markers.filter(t=>t.removed).map(t=>t.binding)),s=new Set;for(const t of this._devices)t.id!==this._markerDialog?.devId&&("device"===t.bindingKind&&t.bindingRef&&s.add("device:"+t.bindingRef),"entity"===t.bindingKind&&t.bindingRef&&s.add("entity:"+t.bindingRef));const n=new Set;for(const t of this._devices)"device"===t.bindingKind&&t.name&&n.add(t.name.trim()+"|"+(t.area||""));const o=[];for(const e of Object.values(t.devices)){if("service"===e.entry_type)continue;const t="device:"+e.id;if(s.has(t))continue;const a=(e.name_by_user||e.name||e.id).trim();t!==this._markerDialog?.binding&&!i.has(t)&&n.has(a+"|"+(e.area_id||""))||o.push({value:t,label:a,sub:(e.model||this._t("marker.sub_device"))+("Group"===e.model?this._t("marker.sub_z2m_group"):"")})}const a=new Set(["group","template","derivative","min_max","threshold","integration","statistics","trend","utility_meter","tod","switch_as_x","schedule"]);for(const[n,r]of Object.entries(t.entities)){const l="entity:"+n;if(s.has(l))continue;if(bo(t,n,e)&&!i.has(l))continue;const c=a.has(r.platform),h="group"===r.platform;if(!c&&!h)continue;if(r.hidden&&!i.has(l))continue;const d=t.states[n];o.push({value:l,label:r.name||d?.attributes?.friendly_name||n,sub:n.split(".")[0]+" · "+("group"===r.platform?this._t("marker.sub_group"):this._t("marker.sub_helper"))})}if(this._markerDialog?.showEntities){const n=new Set(o.map(t=>t.value));for(const[a,r]of Object.entries(t.entities)){const l="entity:"+a;if(s.has(l)||n.has(l)||r.hidden&&!i.has(l))continue;if(bo(t,a,e)&&!i.has(l))continue;const c=t.states[a],h=r.name||c?.attributes?.friendly_name||a,d=r.device_id?t.devices[r.device_id]:null,u=d&&(d.name_by_user||d.name)||"";o.push({value:l,label:h,sub:a.split(".")[0]+" · "+this._t("marker.sub_entity")+(u?" · "+u:"")})}}const r=(this._markerDialog?.bindingFilter||"").toLowerCase().trim(),l=r?o.filter(t=>(t.label+" "+t.sub+" "+t.value).toLowerCase().includes(r)):o;return l.sort((t,e)=>t.label.localeCompare(e.label)),l.slice(0,200)}_physicalBodiesR(t=this._spaceModel()){if(!t)return[];const e=`${t.id}|${this._cfgEpoch}|${this._cellCm}|${this._gridPitch}`;if(this._physicalBodiesCache?.key===e)return this._physicalBodiesCache.all;const i=Rl(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t));return this._physicalBodiesCache={key:e,...i},i.all}_rawPhysicalBodiesR(t=this._spaceModel()){if(!t)return[];this._physicalBodiesR(t);const e=this._physicalBodiesCache;return e?[...e.drafts,...e.partitions,...e.columns]:[]}_cleanFloor(t,e,i=this._spaceModel()){if(!i)return{floor:e,geom:null,path:"",area:zl([[[...e,e[0]]]])};const s=t.id||`#${i.rooms.indexOf(t)}`,n=`${i.id}|${this._cfgEpoch}|${s}`;if(!this._rszPreview){const t=r_(this._cleanFloorCache,n);if(t.hit)return t.value}const o=e.map(t=>t[0]),a=e.map(t=>t[1]),r=[Math.min(...o),Math.min(...a),Math.max(...o),Math.max(...a)],l=this._physicalBodiesR(i).filter(t=>{const e=t.map(t=>t[0]),i=t.map(t=>t[1]);return Math.max(...e)>=r[0]&&Math.min(...e)<=r[2]&&Math.max(...i)>=r[1]&&Math.min(...i)<=r[3]}),c=l.length?Fl(e,l):null,h={floor:e,geom:c,path:c?Cl(c):"",area:zl(c||[[[...e,e[0]]]])};return this._rszPreview||l_(this._cleanFloorCache,n,h,600),h}_autoIconForBinding(t){if("virtual"===t)return"mdi:map-marker";const[e,i]=t.split(":");if(!i)return"";const s=this._fullRegistryHass,n=this._bindingStatus(t),o="active"===n.kind?n.enabledEntityIds:n.allEntityIds;if("device"===e){const t=s.devices?.[i];if(!t)return"mdi:help-circle";const e=o;return e.some(t=>t.startsWith("lock."))?"mdi:lock":vo(s,t.name_by_user||t.name||"",t.model,e,this._iconRules)}if("entity"===e){const t=s.entities?.[i],e=this.hass.states?.[i],n=t?.name||e?.attributes?.friendly_name||i;return i.startsWith("lock.")?"mdi:lock":vo(s,n,"",[i],this._iconRules)}return""}_allRoomsFlat(){const t=[];for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area?t.push({value:e.id+"#"+i.area,label:(e.title||e.id)+" · "+i.name}):i.id&&t.push({value:e.id+"#@"+i.id,label:(e.title||e.id)+" · "+i.name+" · "+this._t("marker.subarea")});return t}_errText(t){if(!t)return this._t("err.unknown");if("string"==typeof t)return t;if("invalid_passage_fields"===t.code){const e=String(t.message||t.error||"").match(/space=([^;]*);\s*opening=([^;]*);\s*fields=([^;]*)/);if(e){const t=this._serverCfg?.spaces?.find(t=>String(t.id)===e[1]),i={contact:"opening.contact_label",lock:"opening.lock_label",invert:"opening.invert",flip_h:"opening.flip_h",flip_v:"opening.flip_v"},s=e[3].split(",").filter(Boolean).map(t=>i[t]?this._t(i[t]):t).join(", ");return this._t("opening.invalid_passage_fields",{room:t?.title||e[1],fields:s})}}if("invalid_partition_opening_jamb_margin"===t.code){const e=String(t.message||t.error||"").match(/margin_cm=([^;]*)/),i=e?Number(e[1]):NaN;if(Number.isFinite(i))return this._t("opening.partition_jamb_margin",{distance:li(i,this._imperial)})}if(t.message)return t.message;if(t.error)return t.error;if(null!=t.code)return this._t("err.code",{code:t.code});try{return JSON.stringify(t)}catch{return String(t)}}_backupErrorText(t){const e=t?.code??t?.error;if("string"==typeof e){const t=`backup.error.${e}`,i=this._t(t);if(i!==t)return i}return this._errText(t)}async _pickMarkerFiles(t){const e=t.target,i=e.files?[...e.files]:[];if(e.value="",!i.length||!this._markerDialog)return;const s=this._markerDialog.uploadId||this._markerDialog.devId||"new",n=[];for(const t of i)try{const e=new FormData;e.append("marker_id",s),e.append("file",t,t.name);const i=this.hass?.fetchWithAuth?await this.hass.fetchWithAuth("/api/houseplan/upload",{method:"POST",body:e}):await fetch("/api/houseplan/upload",{method:"POST",body:e,headers:this.hass?.auth?.data?.access_token?{authorization:`Bearer ${this.hass.auth.data.access_token}`}:{}}),o=await i.json().catch(()=>({}));if(!i.ok||o.error){const t={too_large:this._t("err.too_large",{mb:o.max_mb||50}),bad_ext:this._t("err.bad_ext"),unauthorized:this._t("err.unauthorized")};throw new Error(t[o.error]||o.error||"HTTP "+i.status)}n.push({name:o.name||t.name,url:o.url})}catch(e){this._showToast(this._t("toast.file_failed",{name:t.name,err:this._errText(e)}))}n.length&&this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:[...this._markerDialog.pdfs,...n]},this._showToast(this._t("toast.files_attached",{n:n.length})))}_removeMarkerPdf(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:this._markerDialog.pdfs.filter(e=>e.url!==t)})}_markerLightFields(t){const e={};if(t.lightRoleTouched?"always"===t.lightRole?e.is_light=!0:"never"===t.lightRole&&(e.is_light=!1):t.originalHasIsLight&&(e.is_light=t.originalIsLight??null),t.lightEntityTouched?t.lightEntity&&(e.light_entity=t.lightEntity):t.originalHasLightEntity&&(e.light_entity=t.originalLightEntity??null),t.glowTouched){if("auto"!==t.glowMode){const i={c:Rt(t.glowColor,this._fillColors.glow_light.c)};"fixed"===t.glowMode&&(i.bri=Math.max(.01,Math.min(1,Math.round(t.glowBrightness)/100))),e.glow_color=i}}else t.originalHasGlowColor&&(e.glow_color=t.originalGlowColor??null);return e}_markerTapActionFields(t){return t.tapActionTouched?{tap_action:t.tapAction||null}:t.originalHasTapAction?{tap_action:t.originalTapAction??null}:{}}_markerToggleEntityFields(t){return(e={touched:t.toggleEntityTouched,originalHas:t.originalHasToggleEntity,original:t.originalToggleEntity,value:t.toggleEntity}).touched?e.value?{toggle_entity:e.value}:{}:e.originalHas?{toggle_entity:e.original??null}:{};var e}async _saveMarker(){const t=this._markerDialog;if(!t||t.busy)return;const e=this._effectiveMarkerTapAction(t);if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return;if("virtual"===t.binding&&!t.name.trim())return void this._showToast(this._t("toast.virtual_name_required"));if("run"===e&&!t.tapTarget)return void this._showToast(this._t("toast.run_target_required"));if(t.valueBadgeTouched&&t.valueBadgeEnabled&&!t.valueBadgeSource)return void this._showToast(this._t("toast.value_badge_source_required"));if("ha"===t.bindingMode){const e=this._bindingStatus(t.binding),i=t.devId?this._markers.find(e=>e.id===t.devId):null,s=!i||i.binding!==t.binding;if("active"!==e.kind&&s)return void this._showToast(this._t("ha_disabled"===e.kind?"toast.ha_disabled_add":"toast.ha_binding_unverified"));if("ha_disabled"===e.kind&&!0===i?.hidden&&!t.hideFromPlan)return this._markerDialog={...t,hideFromPlan:!0},void this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device"))}const i=this._serverCfg;if(!i)return;const s=i.markers||[],n=qs(t.room);let o=n?.space||null;const a=n?.area||null,r=n?.roomId||null,l=Fi(t.binding,t.devId,()=>"v_"+Date.now().toString(36)),c=t.devId,h=c?this._devices.find(t=>t.id===c):null,d=n?.space||h?.space||null,u=d?this._spaceModelById(d):this._spaceModel();if(!u)return;const p=u.id;"virtual"!==t.binding||o||(o=p),this._markerDialog={...t,busy:!0};try{const n="virtual"===t.binding?[]:s.filter(e=>e.removed&&e.binding===t.binding).map(t=>t.id),d=n.length>0,_=Xn(t.binding,t.controls,this._bindingEntities(t.binding)),g=s.find(t=>t.id===l||t.id===c)?.vacuum||null,m={id:l,vacuum:g,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&3!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle?t.angle:null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===e&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:_.length?_:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=a_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:!!t.hideFromPlan};("virtual"===t.binding||t.room)&&(m.space=o,m.area=a,m.room_id=r);const f=h?.marker?.room_id??null,v=!!t.room&&null!=h&&(h.space!==o||h.area!==a||f!==r);let y=!1;const b=t.uploadId||c;if(b&&b!==l&&m.pdfs?.length)try{const t=await this.hass.callWS({type:"houseplan/files/migrate",from_id:b,to_id:l}),e=t?.mapping||{};m.pdfs=function(t,e,i,s){if(!e||!i||e===i)return t;const n="/files/"+e+"/",o="/files/"+i+"/";return t.map(t=>{if(!t.url.includes(n))return t;const e=t.url.split(n)[1]||"",[i,a]=[e.split("?")[0],e.includes("?")?"?"+e.split("?")[1]:""];if(s){const e=s[decodeURIComponent(i)]??s[i];return e?{...t,url:t.url.split(n+i)[0]+o+encodeURIComponent(e)+a}:t}return{...t,url:t.url.split(n).join(o)}})}(m.pdfs,b,l,e),y=Object.keys(e).length>0}catch(t){this._showToast(this._t("toast.files_migrate_failed",{err:this._errText(t)}))}i.markers=s,c&&c!==l&&(i.markers=function(t,e,i){if(!e||!i||e===i)return[...t];const s=`marker:${e}`,n=`marker:${i}`;return t.map(t=>{const e=Array.isArray(t.controls)?t.controls.map(t=>t===s?n:t):t.controls,i="derived_marker_state"===t.value_badge?.source?.kind&&t.value_badge.source.ref===s?{...t.value_badge,source:{...t.value_badge.source,ref:n}}:t.value_badge;return e===t.controls&&i===t.value_badge?t:{...t,controls:e,value_badge:i}})}(i.markers,c,l)),c&&c!==l&&"derived_marker_state"===m.value_badge?.source?.kind&&m.value_badge.source.ref===`marker:${c}`&&(m.value_badge.source={kind:"derived_marker_state",ref:`marker:${l}`}),i.markers=i.markers.filter(t=>t.id!==l&&t.id!==c&&("virtual"===m.binding||t.binding!==m.binding)),i.markers.push(m);let w=null;const k=c?this._layout[c]:null,$=k?{s:k.s||h?.space||this._space,x:k.x,y:k.y}:c&&h&&this._defPos[c]?this._normPos(h.space,this._defPos[c].x,this._defPos[c].y):null;if(!d&&$&&$.s===p)l===c&&this._layout[l]&&!v||(w={s:$.s,x:$.x,y:$.y},this._layout={...this._layout,[l]:w});else if(d||!this._layout[l]||v){let t=u.vb[0]+u.vb[2]/2,e=u.vb[1]+u.vb[3]/2;const i=r?u.rooms.find(t=>t.id===r):a?u.rooms.find(t=>t.area===a):void 0;i&&([t,e]=this._roomCenter(i)),w=this._normPos(p,t,e),this._layout={...this._layout,[l]:w}}await this._saveConfigNow(),w&&this._noteLayoutRev(await this.hass.callWS({type:"houseplan/layout/update",device_id:l,pos:w}));const x=new Set(n);c&&c!==l&&x.add(c),x.delete(l);for(const t of x)delete this._layout[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{});y&&b&&await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:b}).catch(()=>{}),this._markerDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_saved"))}catch(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}async _deleteMarker(){const t=this._markerDialog;if(!t||t.busy||!t.devId)return;const e=t.devId?this._devices.find(e=>e.id===t.devId):null;if(!e)return;const i=t.name||this._t("device.fallback");if(!confirm(this._t("confirm.remove_marker",{name:i})))return;const s=this._serverCfg;s.markers=s.markers||[];const n=s.markers,o="virtual"===e.bindingKind?"virtual":e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:"";if(!o)return;const a=function(t,e,i,s){const n=new Set([e]),o=t.filter(t=>{const o=t.id===e||!s&&t.binding===i;return o&&n.add(t.id),!o});return{markers:s?o:[...o,{id:e,binding:i,removed:!0,hidden:!0}],cleanupIds:n}}(s.markers,e.id,o,"virtual"===e.bindingKind);var r,l;s.markers=(r=a.markers,l=a.cleanupIds,r.map(t=>{if(!Array.isArray(t.controls))return t;const e=t.controls.filter(t=>!("string"==typeof t&&t.startsWith("marker:")&&l.has(t.slice(7))));return e.length===t.controls.length?t:{...t,controls:e.length?e:null}}));const c=a.cleanupIds;this._markerDialog={...t,busy:!0};try{await this._saveConfigNow();for(const t of c){delete this._layout[t],delete this._defPos[t],this._dirtyPos.delete(t),this._sentPos.delete(t);const e=this._activityRt.get(t);e&&clearTimeout(e.timer),this._activityRt.delete(t),this._vacRt.delete(t),delete this._vacSrvTrails[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{}),await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:t}).catch(()=>{}),await this.hass.callWS({type:"houseplan/trail/delete",marker_id:t}).catch(()=>{})}this._markerDialog=null,this._infoCard?.id===e.id&&this._closeInfoCard(),this._selId===e.id&&(this._selId=null),this._drag?.id===e.id&&(this._drag=null),this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_removed"))}catch(t){this._serverCfg===s&&(s.markers=n),this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}_normPos(t,e,i){return{s:t,x:e/y_,y:i/y_}}_openSpaceDialog(t,e){if(this._serverStorage&&this._serverCfg)if("edit"===t){const i=this._serverCfg.spaces.find(t=>t.id===e);if(!i)return;const s=cs(i),n=i.settings?.custom_fill&&"object"==typeof i.settings.custom_fill?rs(i.settings.custom_fill):null,o="none"===s.fill?{...n||as,a:0}:n;this._spaceDialog={mode:t,spaceId:e,title:i.title,planUrl:i.plan_url||null,planFile:null,source:i.plan_url?"file":"draw",showBorders:s.showBorders,showNames:s.showNames,hideDecor:s.hideDecor,hideOpenings:s.hideOpenings,roomColor:s.color,roomOpacity:s.opacity,fillMode:"none"===s.fill?"custom":s.fill,customFill:o,glowEnabled:s.glow,bgColor:s.bgColor,bgMode:"static"===i.settings?.bg_mode||"daynight"===i.settings?.bg_mode?i.settings.bg_mode:null,northDeg:Ka({},i.settings),sunRays:"boolean"==typeof i.settings?.sun_rays?i.settings.sun_rays:null,tempMin:s.tempMin,tempMax:s.tempMax,showLqi:s.showLqi??this._config?.show_signal??!0,cardFontScale:s.cardFontScale,labelTemp:s.labelTemp,labelHum:s.labelHum,labelLqi:s.labelLqi,labelLight:s.labelLight,cellCm:Number(i.cell_cm)>0?Number(i.cell_cm):5,busy:!1}}else this._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,source:"file",showBorders:!1,showNames:!1,hideDecor:!1,hideOpenings:!1,roomColor:ns,roomOpacity:os,fillMode:"custom",customFill:{...as,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:20,tempMax:25,showLqi:this._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:5,busy:!1};else this._showToast(this._t("toast.integration_missing"))}async _pickPlanFile(t){const e=t.target,i=e.files?.[0];if(!i||!this._spaceDialog)return;const s={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/webp":"webp"}[i.type]||(i.name.toLowerCase().endsWith(".svg")?"svg":"");if(!s)return void this._showToast(this._t("toast.plan_formats"));const n=new Uint8Array(await i.arrayBuffer());let o="";for(let t=0;t{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:1.414),e.onerror=()=>t(1.414),e.src=r});URL.revokeObjectURL(r),this._spaceDialog={...this._spaceDialog,planFile:{ext:s,b64:a,aspect:l,name:i.name}}}_useServerPlan(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let e=0;e<40;e++){const e=this._display(t);if(e){const i=await new Promise(t=>{const i=new Image;i.onload=()=>t(i.naturalWidth&&i.naturalHeight?i.naturalWidth/i.naturalHeight:0),i.onerror=()=>t(0),i.src=e}),s=this._spaceDialog;return s&&s.planUrl===t&&Number.isFinite(i)&&i>0?(this._spaceDialog={...s,savedAspect:i},i):0}if(await new Promise(t=>setTimeout(t,150)),this._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){if(confirm(this._t("confirm.delete_plan",{name:t})))try{await this.hass.callWS({type:"houseplan/plans/delete",name:t});const e=this._spaceDialog;e?.saved&&(this._spaceDialog={...e,saved:e.saved.filter(e=>e.name!==t)})}catch(t){this._showToast(this._t("toast.plan_delete_failed",{err:this._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return j`
${this._t("space.loading")}
`;const e=t.saved||[];if(!e.length)return j`
${this._t("space.no_saved")}
`;return j`
${e.map(e=>j`
@@ -5818,7 +5818,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 @pointermove=${t=>this._rlResizeMove(t)} @pointerup=${()=>this._rlResizeUp()} @pointercancel=${()=>this._rlResizeUp()}>`):G} -
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"!==this._tool&&"partition"!==this._tool||!this._path.length||this._contourClosed?"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:this._path[this._path.length-1]:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=Os(e,i),a=Math.round(10*o)/10,r=Hs(o);return j`
+
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"===this._tool&&this._path.length&&!this._contourClosed?this._path[this._path.length-1]:"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=Os(e,i),a=Math.round(10*o)/10,r=Hs(o);return j`
${this._fmtLen(e,i)} · ${a}°
`}get _decorMeasure(){const t=this._decorDraft;if(!t||"decor"!==this._mode)return null;const[e,i]=t.a,[s,n]=t.b;if(Math.abs(e-s)<1e-6&&Math.abs(i-n)<1e-6)return null;const o=(e+s)/2,a=(i+n)/2;if("line"===t.kind){const e=Os(t.a,t.b);return{x:o,y:a,on45:Hs(e),text:`${this._fmtLen(t.a,t.b)} · ${Math.round(10*e)/10}°`}}const r=this._fmtLen([e,i],[s,i]),l=this._fmtLen([s,i],[s,n]);if("ellipse"===t.kind){const t=this._fmtLen([0,0],[Math.abs(s-e)/2,0]),r=this._fmtLen([0,0],[0,Math.abs(n-i)/2]);return{x:o,y:a,on45:!1,text:Math.abs(Math.abs(s-e)-Math.abs(n-i))<1e-6?`R ${t}`:`Rx ${t} × Ry ${r}`}}return{x:o,y:a,on45:!1,text:`${r} × ${l} · ${Da(ar(Math.abs(s-e),this._cellCm,this._gridPitch)*ar(Math.abs(n-i),this._cellCm,this._gridPitch)/1e4,this._imperial)}`}}get _alignPoint(){if(this._markup){if("draw"===this._tool&&this._path.length&&!this._contourClosed&&this._cursorPt)return this._cursorPt;if("split"===this._tool&&this._splitSel?.pts?.length&&this._cursorPt)return this._cursorPt;if(this._drag?.id.startsWith("rl_")&&this._drag.moved){const t=this._drag.id.slice(3),e=this._spaceModel()?.rooms.find(e=>e.id===t);return e?(()=>{const t=this._labelPos(e,this._space);return[t.x,t.y]})():null}return null}if("devices"===this._mode&&this._drag?.moved){const t=this._devices.find(t=>t.id===this._drag.id);return t?(()=>{const e=this._pos(t);return[e.x,e.y]})():null}if("decor"===this._mode){if(this._decorDraft)return this._decorDraft.b;if(this._decorMove){const t=this._decorList.find(t=>t.id===this._decorMove.id);if(!t)return null;const e=y_,i=this._decorH;return"line"===t.kind?[t.x1*e,t.y1*i]:[t.x*e,t.y*i]}return null}return null}_alignCandidates(){const t=[],e=this._spaceModel();if(this._markup){if(!e)return t;if(this._drag?.id.startsWith("rl_")){const i=this._drag.id.slice(3);for(const s of e.rooms){if(!s.name||s.id===i)continue;const e=this._labelPos(s,this._space);t.push([e.x,e.y])}return t}for(const i of e.rooms){const e=hi(i);if(e)for(const i of e)t.push(i)}if("draw"===this._tool)for(const e of this._path)t.push(e);if("split"===this._tool&&this._splitSel?.pts)for(const e of this._splitSel.pts)t.push(e);return t}if("devices"===this._mode){for(const e of this._devices){if(e.space!==this._space||e.id===this._drag?.id||"ha_disabled"===e.bindingStatus?.kind)continue;const i=this._pos(e);t.push([i.x,i.y])}return t}if("decor"===this._mode){const e=this._decorMove?.id;return t.push(...this._decorSnapGeometry(e).points),this._decorDraft&&t.push(this._decorDraft.a),t}return t}_renderAlignGuides(){const t=this._alignPoint;if(!t)return W``;const e=this._drag?.id.startsWith("rl_")?.5*this._gridPitch:.05*this._gridPitch,i=function(t,e,i){let s=null,n=null;for(const o of e)if(!(Math.abs(o[0]-t[0])<1e-6&&Math.abs(o[1]-t[1])<1e-6)){if(Math.abs(o[0]-t[0])<=i){const e=Math.abs(o[1]-t[1]);e>1e-6&&(!s||e1e-6&&(!n||e ${i.map(e=>{const[i,o,a,r]="x"===e.axis?[e.at,e.from[1],e.at,t[1]+Math.sign(t[1]-e.from[1])*n]:[e.from[0],e.at,t[0]+Math.sign(t[0]-e.from[0])*n,e.at];return W` `})} @@ -5993,7 +5993,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 data-kind="rotate" @pointerdown=${t=>this._physicalRotateDown(t,s)} @pointermove=${t=>this._physicalRotateMove(t)} @pointerup=${t=>this._physicalRotateUp(t)}> - `})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool&&"partition"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=fr(5,this._cellCm,this._gridPitch),s=fr(10,this._cellCm,this._gridPitch);return W``})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=fr(5,this._cellCm,this._gridPitch),s=fr(10,this._cellCm,this._gridPitch);return W``}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(fr(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=il(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,y_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:fr(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return Nr([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Ds(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,a=this._gridPitch,r=this._viewOr(this._baseVb()),l="draw"===this._tool||"partition"===this._tool?this._drawWallCm:null,c=(()=>"draw"!==this._tool&&"partition"!==this._tool||!o.length||!(null!=l&&l>0)?null:this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null)(),h=c?c.slice(0,-1).map((t,e)=>fr(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||pr:l||pr,this._cellCm,this._gridPitch)/2):[],d=c?Lr(c,fr(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` + `}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(fr(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=il(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,y_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:fr(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return Nr([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Ds(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,a=this._gridPitch,r=this._viewOr(this._baseVb()),l="draw"===this._tool?this._drawWallCm:null,c=(()=>"draw"===this._tool&&o.length&&null!=l&&l>0?this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null:null)(),h=c?c.slice(0,-1).map((t,e)=>fr(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||pr:l||pr,this._cellCm,this._gridPitch)/2):[],d=c?Lr(c,fr(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` ${this._gridLevels()?W``:G} ${n.map(t=>W``)} ${this._renderPhysicalEditorLayer()} @@ -6023,8 +6023,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 ${u?W` `:G} ${o.length>1?W``:G} - ${!o.length||!this._cursorPt||"draw"!==this._tool&&"partition"!==this._tool||this._contourClosed?G:W``} + ${o.length&&this._cursorPt&&"draw"===this._tool&&!this._contourClosed?W``:G} ${o.map((t,e)=>W``)} ${"split"===this._tool&&this._splitSel?.pts?.length?W`${this._splitSel.pts.length>1?W``:G} ${this._splitSel.pts.map((t,e)=>W``)} diff --git a/dist/houseplan-card.js b/dist/houseplan-card.js index b4cd39ec..bcf6aff8 100755 --- a/dist/houseplan-card.js +++ b/dist/houseplan-card.js @@ -1,4 +1,4 @@ -globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c";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)},a=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:r,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g: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)=>!r(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(a(t))}else void 0!==t&&e.push(a(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,m?.({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,I=Array.isArray,E="[ \t\n\f\r]",F=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${E}(?:([^\\s"'>=/]+)(${E}*=${E}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(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?"":"",a=F;for(let e=0;e"===l[0]?(a=n??F,c=-1):void 0===l[1]?c=-2:(c=a.lastIndex-l[2].length,r=l[1],a=void 0===l[3]?H:'"'===l[3]?L:N):a===L||a===N?a=H:a===z||a===O?a=F:(a=H,n=void 0);const d=a===H&&t[e+1].startsWith("/>")?" ":"";o+=a===F?i+T:c>=0?(s.push(r),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 J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const a=t.length-1,r=this.parts,[l,c]=X(t,e);if(this.el=J.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())&&r.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iI(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=J.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 J(t)),e}k(t){I(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=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let a,r;for(t=n[0],a=0;a{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 U}};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,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=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 gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=at,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,a=o!==t;if(a){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||a){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},$t=(t,e=kt)=>t._$AH=e,xt=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{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 a=0;for(const e of t)n[a]=s?s(e,a):a,o[a]=i(e,a),a++;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:a}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=a,o;const r=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(r[d]===a[p])l[p]=wt(n[d],o[p]),d++,p++;else if(r[u]===a[_])l[_]=wt(n[u],o[_]),u--,_--;else if(r[d]===a[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(r[u]===a[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(a,p,_),h=St(r,d,u)),c.has(r[d]))if(c.has(r[u])){const e=h.get(a[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else xt(n[u]),u--;else xt(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&xt(t)}return this.ut=a,$t(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt 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-"+ ++Dt,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=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.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?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.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=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_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=j` +globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc";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)},a=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:r,defineProperty:l,getOwnPropertyDescriptor:c,getOwnPropertyNames:h,getOwnPropertySymbols:d,getPrototypeOf:u}=Object,p=globalThis,_=p.trustedTypes,g=_?_.emptyScript:"",m=p.reactiveElementPolyfillSupport,f=(t,e)=>t,v={toAttribute(t,e){switch(e){case Boolean:t=t?g: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)=>!r(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(a(t))}else void 0!==t&&e.push(a(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,m?.({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,I=Array.isArray,E="[ \t\n\f\r]",F=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,z=/-->/g,O=/>/g,H=RegExp(`>|${E}(?:([^\\s"'>=/]+)(${E}*=${E}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),N=/'/g,L=/"/g,B=/^(?:script|style|textarea|title)$/i,q=t=>(e,...i)=>({_$litType$:t,strings:e,values:i}),j=q(1),W=q(2),U=Symbol.for("lit-noChange"),G=Symbol.for("lit-nothing"),V=new WeakMap,K=P.createTreeWalker(P,129);function Y(t,e){if(!I(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?"":"",a=F;for(let e=0;e"===l[0]?(a=n??F,c=-1):void 0===l[1]?c=-2:(c=a.lastIndex-l[2].length,r=l[1],a=void 0===l[3]?H:'"'===l[3]?L:N):a===L||a===N?a=H:a===z||a===O?a=F:(a=H,n=void 0);const d=a===H&&t[e+1].startsWith("/>")?" ":"";o+=a===F?i+T:c>=0?(s.push(r),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 J{constructor({strings:t,_$litType$:e},i){let s;this.parts=[];let n=0,o=0;const a=t.length-1,r=this.parts,[l,c]=X(t,e);if(this.el=J.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())&&r.length0){s.textContent=x?x.emptyScript:"";for(let i=0;iI(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=J.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 J(t)),e}k(t){I(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=Z(this,t,e,0),o=!A(t)||t!==this._$AH&&t!==U,o&&(this._$AH=t);else{const s=t;let a,r;for(t=n[0],a=0;a{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 U}};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,pt=t=>(...e)=>({_$litDirective$:t,values:e});let _t=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 gt={},mt=pt(class extends _t{constructor(){super(...arguments),this.ot=gt}render(t,e){return e()}update(t,[e,i]){if(Array.isArray(e)){if(Array.isArray(this.ot)&&this.ot.length===e.length&&e.every((t,e)=>t===this.ot[e]))return U}else if(this.ot===e)return U;return this.ot=Array.isArray(e)?Array.from(e):e,this.render(e,i)}}),{I:ft}=at,vt=t=>t,yt=()=>document.createComment(""),bt=(t,e,i)=>{const s=t._$AA.parentNode,n=void 0===e?t._$AB:e._$AA;if(void 0===i){const e=s.insertBefore(yt(),n),o=s.insertBefore(yt(),n);i=new ft(e,o,t,t.options)}else{const e=i._$AB.nextSibling,o=i._$AM,a=o!==t;if(a){let e;i._$AQ?.(t),i._$AM=t,void 0!==i._$AP&&(e=t._$AU)!==o._$AU&&i._$AP(e)}if(e!==n||a){let t=i._$AA;for(;t!==e;){const e=vt(t).nextSibling;vt(s).insertBefore(t,n),t=e}}}return i},wt=(t,e,i=t)=>(t._$AI(e,i),t),kt={},$t=(t,e=kt)=>t._$AH=e,xt=t=>{t._$AR(),t._$AA.remove()},St=(t,e,i)=>{const s=new Map;for(let n=e;n<=i;n++)s.set(t[n],n);return s},Mt=pt(class extends _t{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 a=0;for(const e of t)n[a]=s?s(e,a):a,o[a]=i(e,a),a++;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:a}=this.dt(e,i,s);if(!Array.isArray(n))return this.ut=a,o;const r=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(r[d]===a[p])l[p]=wt(n[d],o[p]),d++,p++;else if(r[u]===a[_])l[_]=wt(n[u],o[_]),u--,_--;else if(r[d]===a[_])l[_]=wt(n[d],o[_]),bt(t,l[_+1],n[d]),d++,_--;else if(r[u]===a[p])l[p]=wt(n[u],o[p]),bt(t,n[d],n[u]),u--,p++;else if(void 0===c&&(c=St(a,p,_),h=St(r,d,u)),c.has(r[d]))if(c.has(r[u])){const e=h.get(a[p]),i=void 0!==e?n[e]:null;if(null===i){const e=bt(t,n[d]);wt(e,o[p]),l[p]=e}else l[p]=wt(i,o[p]),bt(t,n[d],i),n[e]=null;p++}else xt(n[u]),u--;else xt(n[d]),d++;for(;p<=_;){const e=bt(t,l[_+1]);wt(e,o[p]),l[p++]=e}for(;d<=u;){const t=n[d++];null!==t&&xt(t)}return this.ut=a,$t(t,l),U}}),Ct=new WeakMap;let Dt=0;class Tt 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-"+ ++Dt,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=Ct.get(t)||{dialogs:new Set,opener:this._opener};e.dialogs.add(this),Ct.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?Ct.get(e):void 0;s?.dialogs.delete(this),super.disconnectedCallback(),e&&s&&requestAnimationFrame(()=>{const t=Ct.get(e);if(!t)return;if(!t.dialogs.size)return t.opener?.isConnected&&t.opener.focus({preventScroll:!0}),void Ct.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=new Set,s=n=>{if(!i.has(n)){if(i.add(n),n instanceof HTMLElement){if(n.matches(t)&&e.push(n),n instanceof HTMLSlotElement){for(const t of n.assignedNodes({flatten:!0}))s(t);return}if(n.shadowRoot){for(const t of n.shadowRoot.childNodes)s(t);return}}for(const t of n.childNodes)s(t)}};for(const t of this.childNodes)s(t);const n=this.overlayPortal();return n&&s(n),e.filter(t=>{let e=t;for(;e;){const t=getComputedStyle(e);if(e.hidden||e.inert||"true"===e.getAttribute("aria-hidden")||"none"===t.display||"hidden"===t.visibility)return!1;if(e=e.assignedSlot||e.parentElement||(e.getRootNode()instanceof ShadowRoot?e.getRootNode().host:null),e===this)break}return!0})}_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=j` ${this.icon?j``:G} ${this.title} `;return this._useHaDialog?j`${t.lqiText}`:G} - `;var o}function Uo(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Go=new WeakMap;function Vo(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Go.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Go.set(e,i)),i}function Ko(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Yo(t,e){const i=Vo(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Ko(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Xo(t){const e=Vo(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Jo(t,e,i=Xo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function Zo(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const a=n?s.configEntries[n]:null;return{domain:o,label:Jo(t,o,s,a?.title),configEntryId:n,configEntryTitle:a?.title,confidence:i}}function Qo(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function ta(t,e,i,s=Xo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,a=o?s.configEntries[o]?.domain:"";return Zo(t,n.platform||a,"entity-platform",s,o)}var ea={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_partition":"Partition: draw one independent physical wall","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_partition":"two clicks draw one partition · Shift locks to 45°","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.partition_size_title":"Thickness of the partition created by the second click (1–100 cm).","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The black plate and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Default space","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const ia={en:ea,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_partition":"Перегородка: нарисуйте одну независимую физическую стену","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_partition":"два клика рисуют одну перегородку · Shift фиксирует шаг 45°","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.partition_size_title":"Толщина перегородки, создаваемой вторым кликом (1–100 см).","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Всегда одинаковые чёрная подложка и значок. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Пространство по умолчанию","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function sa(t,e){if(e&&e in ia)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function na(t,e,i){return ss(ia[t][e]??ea[e]??e,i)}function oa(t,e){const i=ia[t][e]??ia.en[e];return"string"==typeof i&&i.trim().length>0}class aa extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Yo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return sa(this.hass)}_t(t,e){return na(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Xo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),a=e.slice(n+1);if("entity"===o){const e=ta(t,a,i,s);return e?[e]:[]}if("device"!==o)return[];const r=i.devices?.[a]||t?.devices?.[a];if(!r)return[];const l=[r.config_entry_id,...Array.isArray(r.config_entries)?r.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return Zo(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return Qo(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===a&&null==n?.disabled_by&&c.push(ta(t,e,i,s));return c.some(Boolean)?Qo(c):Qo((Array.isArray(r.identifiers)?r.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return Zo(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Xo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=ta(this.hass,t,this.registry,Xo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:s?null:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let a=-o/2,r=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(r=Math.max(r,s+t)),"left"===i.valueBadge.position&&(a=Math.min(a,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,r-a),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((a+r)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=jo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",To(t.valueBadge)].filter(Boolean).join(". ");return j`
+ `;var o}function Uo(t,e,i){return{kind:"none",reason:"none",generation:t,expiresAt:null,color:e,diameterScale:i,animated:!1,reducedMotionIndicator:"none"}}const Go=new WeakMap;function Vo(t){const e=function(t){const e=t?.connection||t;return!e||"object"!=typeof e&&"function"!=typeof e?null:e}(t);if(!e)return null;let i=Go.get(e);return i||(i={revision:0,loaded:!1,configEntries:{},manifests:{},listeners:new Set,refs:0},Go.set(e,i)),i}function Ko(t){t.revision++;for(const e of[...t.listeners])try{e()}catch{}}function Yo(t,e){const i=Vo(t);if(!i)return()=>{};i.refs++,i.listeners.add(e),async function(t,e){e.loading||"function"!=typeof t?.callWS?e.loading:e.loaded&&e.loadedAt&&Date.now()-e.loadedAt<3e5||(e.loading=(async()=>{const[i,s]=await Promise.allSettled([t.callWS({type:"config_entries/get"}),t.callWS({type:"manifest/list"})]);"fulfilled"===i.status&&Array.isArray(i.value)&&(e.configEntries=Object.fromEntries(i.value.filter(t=>"string"==typeof t?.entry_id).map(t=>[t.entry_id,t]))),"fulfilled"===s.status&&Array.isArray(s.value)&&(e.manifests=Object.fromEntries(s.value.filter(t=>"string"==typeof t?.domain).map(t=>[t.domain,t]))),e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)})().catch(()=>{e.loaded=!0,e.loadedAt=Date.now(),e.loading=void 0,Ko(e)}),e.loading)}(t,i),async function(t,e){if(e.unsubscribe||e.subscribing)return e.subscribing;const i=t?.connection?.subscribeMessage;"function"==typeof i&&(e.subscribing=(async()=>{try{e.unsubscribe=await i.call(t.connection,t=>{const i=Array.isArray(t)?t:Array.isArray(t?.entries)?t.entries:t?[t]:[];let s=!1;const n={...e.configEntries};for(const t of i){const e=t?.entry||t?.data?.entry||("string"==typeof t?.entry_id?t:null),i=e?.entry_id;if("string"!=typeof i)continue;const o=t?.type||t?.action||t?.data?.action;"removed"===o||"remove"===o?delete n[i]:n[i]=e,s=!0}s&&(e.configEntries=n,Ko(e))},{type:"config_entries/subscribe"})}catch{}finally{0===e.refs&&(e.unsubscribe?.(),e.unsubscribe=void 0),e.subscribing=void 0}})(),e.subscribing)}(t,i);let s=!1;return()=>{s||(s=!0,i.listeners.delete(e),i.refs=Math.max(0,i.refs-1),i.refs||(i.unsubscribe?.(),i.unsubscribe=void 0))}}function Xo(t){const e=Vo(t);return e?{revision:e.revision,loaded:e.loaded,configEntries:e.configEntries,manifests:e.manifests}:{revision:0,loaded:!1,configEntries:{},manifests:{}}}function Jo(t,e,i=Xo(t),s){const n=i.manifests[e];return function(t,e){if("function"!=typeof t?.localize)return"";try{const i=`component.${e}.title`,s=t.localize(i);return"string"==typeof s&&s!==i?s:""}catch{return""}}(t,e)||String(n?.name||"")||String(s||"")||e.replace(/_/g," ")}function Zo(t,e,i,s,n){const o=String(e||"").trim();if(!o)return null;const a=n?s.configEntries[n]:null;return{domain:o,label:Jo(t,o,s,a?.title),configEntryId:n,configEntryTitle:a?.title,confidence:i}}function Qo(t){const e={"registry-owner":0,"entity-platform":1,"identifier-fallback":2},i=new Set;return t.filter(t=>!!t).sort((t,i)=>e[t.confidence]-e[i.confidence]||t.label.localeCompare(i.label)||t.domain.localeCompare(i.domain)).filter(t=>{const e=`${t.domain}\n${t.configEntryId||""}`;return!i.has(e)&&(i.add(e),!0)})}function ta(t,e,i,s=Xo(t)){const n=i.entities?.[e]||t?.entities?.[e];if(!n)return null;const o=n.config_entry_id||void 0,a=o?s.configEntries[o]?.domain:"";return Zo(t,n.platform||a,"entity-platform",s,o)}var ea={"editor.context_actions":"Actions: {object}","editor.tool_options":"Tool options: {tool}","editor.palette":"Palette: {tool}","editor.open_group":"Tool group: {group}","editor.group_active":"{group} — active: {item}","editor.disabled_action":"{action} is unavailable: {reason}","color_picker.title":"Color picker","color_picker.hue":"Hue","color_picker.saturation":"Saturation","color_picker.value":"Brightness","color_picker.hex":"Hex color","color_picker.invalid_hex":"Enter a 3- or 6-digit hex color","btn.properties":"Properties","btn.keep_as_walls":"Keep as walls","title.markup_select":"Select and edit walls, columns and saved outlines","title.markup_column":"Column: click a grid point to place a square column","markup.partition":"Partition","markup.column":"Column","markup.hint_column":"click a grid point to place a square column","history.draft_segment":"Add room-draft segment","history.draft_merge":"Join unfinished room outlines","history.draft_segment_delete":"Remove room-draft segment","history.partition_add":"Add partition","history.column_add":"Add column","history.physical_edit":"Change physical object","history.physical_delete":"Delete physical object","history.physical_move":"Move physical object","history.contour_to_partitions":"Convert contour to closed walls","history.wall_chain_finish":"Finish wall chain","history.wall_face_batch":"Create rooms from walls","toast.column_duplicate":"A column with the same centre and outer size already exists","confirm.delete_draft":"Delete the whole unfinished room contour?","confirm.delete_draft_segment":"Delete this draft segment? The remaining contour may split in two.","physical.partition_properties":"Partition properties","physical.column_properties":"Column properties","physical.draft_properties":"Draft segment properties","physical.shape":"Shape","physical.square":"Square","physical.circle":"Circle","physical.diameter":"Diameter","physical.side":"Side","physical.rotation":"Rotation angle","physical.length":"Length","physical.allowed_range":"Allowed: 1–{max} {unit}","physical.delete_segment":"Delete segment","physical.delete_draft":"Delete entire outline","physical.column_size_title":"Outer side of the square column placed by the click (1–150 cm).","card.title":"House plan","count.devices":"{n} dev.","empty.no_spaces":"No spaces yet.","empty.add_first":"Add the first space and upload a floor plan.","empty.install":'Install the House Plan integration and add it in "Devices & services".',"btn.add_space":"Add space","btn.cancel":"Cancel","btn.save":"Save","btn.close":"Close","btn.delete":"Delete","btn.edit":"Edit","btn.open_in_ha":"Open in HA","btn.reset":"Reset","btn.attach":"Attach…","btn.upload":"Upload…","btn.replace":"Replace…","title.zoom_in":"Zoom in","title.zoom_out":"Zoom out","title.zoom_fit":"Fit all","title.add_device":"Add a device to the plan","title.show_all":"Show hidden and disabled devices as service markers (this tab only)","title.markup":"Room markup: grid, lines, outlines","title.configure_space":"Configure space","title.add_space":"Add space","title.markup_add":"Walls: draw a continuous chain; Shift locks to 45°. Changing tool or leaving the editor finishes it as independent walls","title.markup_merge":"Merge: click one room, then the neighbour it shares a wall with","title.markup_split":"Split a room: click the room, then two points on its walls","title.markup_delroom":"Delete room: click inside a room and confirm","title.markup_boundary":"Boundary: click two points on a solid shared wall to make that stretch virtual; click a dashed stretch to restore it","title.need_plan":"Upload a floor-plan image","markup.add":"Walls","markup.merge":"Merge","markup.split":"Split","markup.resize":"Resize","title.markup_resize":"Resize rooms: drag a wall handle; click a room for a corner scale frame","markup.hint_resize":"drag a wall handle · click a room — corner frame · Esc cancels a drag · Ctrl+Z — undo a step","markup.opening":"Opening","markup.boundary":"Boundary","markup.delete_room":"Delete room","history.undo":"Undo","history.redo":"Redo","history.undo_named":"Undo: {name} (Ctrl+Z)","history.redo_named":"Redo: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Nothing to undo","history.redo_empty":"Nothing to redo","history.undone":"Undone: {name}","history.redone":"Redone: {name}","history.add_room":"Create room","history.split_room":"Split room","history.merge_rooms":"Merge rooms","history.resize_room":"Resize room","history.open_boundary":"Open boundary","history.close_boundary":"Restore wall","history.wall_thickness":"Change wall thickness","history.add_opening":"Add door or window opening","history.edit_opening":"Edit opening","history.move_opening":"Move opening","history.delete_opening":"Delete opening","history.delete_room":"Delete room","history.decor_add":"Add decor object","history.decor_edit":"Edit decor object","history.decor_move":"Move decor object","history.decor_transform":"Transform decor object","history.decor_delete":"Delete decor object","history.backdrop_transform":"Transform plan backdrop","title.markup_opening":"Openings: click a wall to place, click an opening to edit","opening.new":"New opening","opening.edit":"Opening","opening.door":"Door","opening.window":"Window","opening.gate":"Gate","opening.passage":"Open passage","opening.passage_binding_warning":"Saving will remove the open/close sensor and lock.","opening.invalid_passage_fields":"The open passage on plan “{room}” has unsupported settings: {fields}.","opening.type_label":"Type","opening.length_label":"Length, cm","opening.contact_label":"Open/close sensor","opening.lock_label":"Lock","opening.none":"— none —","opening.invert":"Invert open/closed","opening.flip_h":"Hinge on the other jamb","opening.flip_v":"Opens to the other side","opening.open":"Open","opening.closed":"Closed","opening.locked":"Locked","opening.unlocked":"Unlocked","opening.state_unknown":"unavailable","opening.no_entities":"No sensors bound — a static symbol on the plan.","toast.opening_no_wall":"Click next to a room wall or independent wall","opening.host_partition":"Independent wall","opening.partition_orphan":"The independent wall for this opening no longer exists","opening.partition_jamb_margin":"Leave at least {distance} between the opening and the end of the wall","opening.rebind_partition":"Attach to another independent wall","confirm.delete_partition_openings_title":"Delete wall and openings?","confirm.delete_partition_openings_body":"This wall contains {count} opening(s). They will be deleted together.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Delete","markup.hint_points":"points: {n} · Shift — 45° steps · Esc/Ctrl+Z — undo a dot · closing an area offers a room","markup.hint_start":"click a grid dot to start a wall chain","tip.lqi":"average zigbee signal:","tip.area":"area: {value}","info.device_header":"Device on the plan","info.model":"Model","info.state":"State","info.link":"Link","info.manuals":"Manuals","info.none":"No additional information","marker.new_device":"New device","marker.name_label":"Name (shown on the plan)","marker.name_ph":"Name","marker.binding_label":"Bind to an HA device","marker.binding_disabled":"disabled in Home Assistant","marker.virtual_option":"Virtual device (no binding)","marker.search_ph":"Search device / group…","marker.nothing_found":"nothing found","marker.room_label":"Room","marker.room_override":" (override placement)","marker.room_choose":"— select a room —","marker.room_auto":"— by device area (auto) —","marker.icon_label":"Icon","marker.icon_ph":"mdi:… (empty = auto)","marker.display_label":"Display","display.badge":"Icon + state","display.icon_ripple":"Icon + state and activity","display.static_icon":"Always static icon","marker.display_hint":"Icon + state changes the plate for work, open, alarm and unavailable states. Icon + state and activity additionally shows a short pulse for events and a continuous pulse for ongoing work, movement or presence. Value + state replaces the icon with one unambiguous HA value. A static icon never reacts to device states.","marker.display_hint_badge":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon":"The icon and dynamic plate show device state without the ordinary activity pulse. Red alarms remain visible.","marker.display_hint_icon_ripple":"The icon, dynamic plate and pulse show a short pulse for events and a continuous pulse for work, motion or presence. Red alarms have separate priority.","marker.display_hint_value":"One unambiguous Home Assistant value replaces the icon while the plate continues to show state. Red alarms remain visible.","marker.display_hint_static_icon":"The black plate and icon always stay the same. State, activity, unavailability and alarms do not change the face.","marker.static_alarm_warning":"This device can report alarms. Static display hides the marker's visual alarm indication.","marker.preview.title":"Display preview","marker.preview.actual":"Now","marker.preview.example":"Example","marker.preview.integration":"Provided by","marker.preview.source":"Display source","marker.preview.current_state":"Current state","marker.preview.result":"On the plan","marker.preview.details":"Source details","marker.preview.select_source":"Choose a Home Assistant device or entity to see its actual display.","marker.preview.unknown_provider":"Unknown integration","marker.preview.virtual_provider":"House Plan · virtual device","marker.preview.no_source":"No active source","marker.preview.no_state":"No current state","marker.preview.mixed_states":"Several different states","marker.preview.multiple_sources":"{n} sources","marker.preview.more_sources":"+{n} more","marker.preview.scaled":"The preview is scaled to {n}% to fit. The saved size is unchanged.","marker.preview.demo_activity":"Show activity example","marker.preview.demo_notice":"Temporary activity example; the actual device state is unchanged.","marker.preview.demo_short":"Show short activity","marker.preview.demo_continuous":"Show continuous activity","marker.preview.stop_continuous":"Stop continuous activity","marker.preview.demo_short_notice":"Short activity example; the actual device state is unchanged.","marker.preview.demo_continuous_notice":"Continuous activity example; the actual device state is unchanged.","marker.preview.demo_already_visible":"The current state already shows a real activity or alarm effect.","marker.preview.reduced_motion":"System reduced-motion is enabled, so ordinary activity is shown as a dot.","marker.preview.reason.neutral":"Neutral dark plate","marker.preview.reason.working":"Yellow plate: the device is working now","marker.preview.reason.working_activity":"Yellow plate and activity effect: the device is working now","marker.preview.reason.open":"Orange plate: physically open or unlocked","marker.preview.reason.cover_icon_state":"Neutral plate; the cover entity controls the displayed state and icon","marker.preview.reason.presence":"Activity effect while presence is detected","marker.preview.reason.event":"Short activity effect after a detected event","marker.preview.reason.transition":"Activity effect while the device is moving or changing state","marker.preview.reason.media_neutral":"Media devices stay on a neutral dark plate while available","marker.preview.reason.unavailable":"Subdued neutral plate: unavailable or off","marker.preview.reason.alarm":"Red alarm plate; alarm indication is always shown","marker.preview.reason.live_states_disabled":"Live-state styling is disabled for this card","marker.preview.reason.value_no_state":"No usable state value; the icon is shown instead","marker.preview.reason.value_ambiguous_sources":"Several possible value sources; the icon is shown instead","marker.preview.reason.value_non_scalar":"The source did not return a simple value; the icon is shown instead","marker.preview.reason.value_virtual":"A virtual device has no Home Assistant value; the icon is shown instead","marker.preview.reason.vacuum_live_plan_only":"Live vacuum position and trail are available only on the full plan","marker.preview.reason.hidden_design_preview":"The device is hidden on the plan; this design preview remains visible","marker.preview.reason.composite_power_source":"State comes from the device Power entity; auxiliary switches are ignored","marker.preview.reason.activity_display_disabled":"The selected display mode does not show ordinary activity effects","marker.preview.reason.ha_disabled":"The Home Assistant binding is disabled and will be hidden on the plan","marker.preview.reason.orphaned":"The saved Home Assistant binding can no longer be found","marker.preview.reason.static_icon":"Static mode: device state does not change the icon","marker.activity_color":"Activity pulse color","marker.ripple_size":"Activity pulse size","marker.activity_alarm_note":"Color and size affect ordinary activity only and do not change red alarms.","marker.pulse_a11y_alarm":"Alarm","marker.pulse_a11y_event":"Recent event","marker.pulse_a11y_presence":"Presence detected","marker.pulse_a11y_transition":"Changing state","marker.pulse_a11y_running":"Working","marker.size_label":"Icon size / rotation","marker.angle_label":"Rotate","marker.model_label":"Model","marker.model_ph":"e.g. Aqara T&H","marker.link_label":"Link","marker.desc_label":"Description","marker.desc_ph":"Notes, specs…","marker.manuals_label":"Manuals (PDF etc.)","marker.sub_device":"device","marker.sub_z2m_group":" · Z2M group","marker.sub_group":"group","marker.sub_helper":"helper","space.new":"New space","space.header":"Space","space.title_label":"Title","space.title_ph":"e.g. Garage","space.plan_label":"Floor plan (background)","space.no_plan":"no plan image","space.plan_alt":"plan","room.new":"New room","room.name_label":"Display name","room.name_ph":"e.g. Terrace","room.area_label":"Home Assistant area (unassigned)","room.no_area_option":"— no area —","room.default_name":"Room","device.unnamed":"unnamed","device.light_group":"light group","device.fallback":"device","device.virtual":"virtual device","confirm.delete_room":'Delete room "{name}"?',"confirm.merge_rooms":'Merge rooms "{a}" and "{b}"?',"confirm.remove_marker":'Delete "{name}" from the plan? The device will disappear completely and stop contributing to plan data. You can add it again later.',"confirm.erase_decor":"Erase the {kind} object? You can undo this action from the editor history.","confirm.delete_space":'Delete space "{title}" with all its rooms and markup?',"toast.pos_save_failed":"Failed to save position: {err}","toast.no_entity":"The device has no suitable entity","toast.ha_disabled_action":"A Home Assistant object that is disabled cannot be used on the plan.","toast.ha_disabled_show_device":"A device disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_show_entity":"An entity disabled in Home Assistant cannot be shown on the plan. Enable it in Home Assistant first.","toast.ha_disabled_add":"A disabled Home Assistant object cannot be added to the plan. Enable it in Home Assistant first.","toast.ha_binding_unverified":"The object status could not be verified through the Home Assistant registry. Display and actions are temporarily unavailable.","toast.markup_needs_server":"Markup is available after the config is moved to the server","toast.conflict":"Config was changed in another window — data refreshed, repeat your last action","toast.cfg_save_failed":"Failed to save config: {err}","toast.room_overlap":"The outline overlaps room “{name}” — rooms must not overlap","toast.contour_min_edges":"Draw at least two edges before closing the outline","toast.contour_cannot_close":"The outline cannot close because it is degenerate or intersects itself","toast.merge_not_adjacent":"Only rooms that share a wall can be merged","toast.rooms_merged":"Rooms merged into “{name}”","toast.split_pick_wall":"Start the cut on the room’s wall","toast.split_bad_cut":"The cut must run wall to wall inside the room, without crossing walls or itself","merge.header":"Merge rooms","merge.hint":"The merged room keeps one name and one area. The other area is released — its devices leave the plan until another room claims it.","merge.keep":"Keep","merge.no_area":"no area","room.split_header":"New room from the split","toast.room_saved":"Room saved ({n}). Devices added: {added}. Outline the next one or exit markup.","toast.room_saved_no_area":"Room saved ({n}, no area). Outline the next one or exit markup.","toast.marker_needs_server":"Device editing is available after the config is moved to the server","toast.virtual_name_required":"Enter a name for the virtual device","toast.marker_saved":"Device saved","toast.marker_removed":"Device deleted from the plan","toast.integration_missing":"The House Plan integration is not installed — management unavailable","toast.plan_formats":"Supported formats: SVG, PNG, JPG, WebP","toast.plan_required":"Upload a floor plan — it is required","toast.space_added_onboard":"Space added. Outline the rooms: click grid dots and close the contour.","toast.space_added":"Space added","toast.space_saved":"Space saved","toast.space_deleted":"Space deleted","toast.delete_failed":"Delete failed: {err}","toast.error":"Error: {err}","toast.file_failed":'File "{name}" was not uploaded: {err}',"toast.files_attached":"Files attached: {n}","err.unknown":"unknown error","err.code":"code {code}","err.too_large":"file larger than {mb} MB","err.bad_ext":"unsupported type (PDF/image expected)","err.unauthorized":"administrator rights required","editor.title":"Title","editor.default_floor":"Default space","editor.icon_size":"Icon size, % of plan width","editor.show_temperature":"Show temperature","editor.live_states":"Live states (on/off, open…)","editor.show_signal":"Show zigbee signal (LQI)","editor.language":"Interface language","editor.lang_auto":"Auto (HA profile)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Icon rules: which MDI icon devices get by name","rules.title":"Icon rules","rules.hint":"Rules are checked top-down against “device name + model” (case-insensitive regex); the first match wins. When nothing matches, the entity device class decides, then the generic chip icon.","rules.pattern_ph":"regex, e.g. plug|socket","rules.icon_ph":"mdi:power-socket-de","rules.add":"Add rule","rules.reset":"Reset to defaults","rules.test_ph":"Try a device name…","rules.invalid":"invalid regex","rules.saved":"Icon rules saved","btn.up":"Up","btn.down":"Down","tap.info":"Device card","tap.more_info":"HA more-info dialog","tap.toggle":"Toggle state","marker.tap_label":"Tap action for this device","tap.toggle_note":"The resolved state is shown below. Secure devices are never toggled from the plan.","import.title":"Create spaces from HA floors","import.hint":"Your Home Assistant already knows these floors. Pick the ones to turn into plan spaces — you will upload a floor-plan image for each one next. Rooms are then outlined by hand on the plan.","import.start":"Create {n} space(s)","import.manual":"Start from scratch","import.progress":"Floor {i} of {n}","import.done":"Spaces created. Outline the rooms: click grid dots and close the contour.","btn.skip":"Skip","space.scale_label":"Scale (grid cell size)","space.scale_unit":"cm per cell","space.display_section":"Display","space.show_borders":"Always show room borders","space.show_names":"Show room names (drag to move)","space.room_color":"Border & name color","space.opacity":"Opacity","space.fill_label":"Room fill","fill.none":"None","fill.lqi":"Zigbee signal","fill.light":"Lights","fill.custom":"Custom color","space.custom_fill":"Fill color","space.source_file":"I have a floor-plan image","space.source_draw":"No image — I'll outline rooms by hand","space.orientation":"Canvas","orient.landscape":"Landscape","orient.portrait":"Portrait","orient.square":"Square","fill.temp":"Temperature","space.temp_min":"Comfort from","space.temp_max":"to","tip.temp_avg":"average temperature:","tip.hum_avg":"average humidity:","space_card.button":"Open the space plan","space_card.not_found":"Space “{id}” not found","space_card.loading":"Loading…","continuity.restore_plan":"Restoring floor plan…","continuity.restore_connection":"Restoring device connection…","continuity.retry":"Try again","editor.space":"Space","editor.show_button":"Show button","editor.button_label":"Button label","editor.button_target":"Target dashboard path","marker.sub_entity":"entity","title.general_settings":"General settings","gs.title":"General settings","gs.hint":"Fill colors apply to every space; each color has its own opacity. Which fill mode a space uses is set in that space's dialog.","gs.light_group":"Fill: lights","gs.light_on":"Lights on","gs.light_off":"All lights off","gs.temp_group":"Fill: temperature","gs.temp_cold":"Cold","gs.temp_ok":"Comfortable","gs.temp_hot":"Hot","gs.lqi_group":"Fill: zigbee signal","gs.lqi_low":"Weak signal","gs.lqi_high":"Strong signal","gs.reset":"Reset to defaults","gs.saved":"General settings saved","space.show_lqi":"Show zigbee signal (LQI) next to devices","space.hide_decor":"Hide the decorative layer","space.hide_decor_tip":"Lines, shapes, labels and furniture stay where they are — visible in the backdrop editor, not on the plan.","space.hide_openings":"Hide openings","space.hide_openings_tip":"Door, window and gate symbols are not drawn, but the openings keep working: light passes through, the sun comes in at a window, contact sensors still open them. The plan editor always shows them.","gs.light_none":"No light sources","mode.plan":"Plan editor","mode.devices":"Device editor","display.value":"Value + state","marker.subarea":"no area, manual","device.new":"New device — open its editor to dismiss","opening.unlock_action":"Unlock","opening.lock_action":"Lock","opening.lock_pending":"Working…","title.close_editor":"Close editor (back to view)","devbar.add":"Add","devbar.show_all":"Hidden and disabled","devbar.rules":"Icon rules","space.roomcard_section":"Room card shows:","space.label_temp":"Temperature","space.label_hum":"Humidity","space.label_lqi":"Average Zigbee signal","space.label_light":"Lights on/off","roomcard.light_on":"On","roomcard.light_off":"Off","roomcard.light_partial":"{on} of {total}","toast.split_pick_inside":"Intermediate cut points must be inside the room","mode.decor":"Background editor","decor.select":"Select","decor.line":"Line","decor.rect":"Rectangle","decor.ellipse":"Oval","decor.text":"Text","decor.erase":"Erase","decor.erase_confirm_title":"Erase object?","decor.color":"Color","decor.width":"Line width","decor.line_style":"Line style","decor.line_style_solid":"Solid","decor.line_style_dashed":"Dashed","decor.fill":"Fill","decor.fill_color":"Fill color","decor.length":"Length","decor.size":"Size","decor.angle":"Rotation angle, °","decor.text_size":"Text size","decor.backdrop_properties":"Plan backdrop properties","decor.text_title":"Text label","decor.object_title":"Edit {kind}","decor.text_label":"Text","decor.live_group":"Insert HA variable","decor.live_entity":"Entity","decor.live_entity_ph":"choose an entity","decor.live_attr":"Value","decor.live_attr_ph":"choose state or attribute","decor.live_state":"State","decor.backdrop":"Backdrop image","decor.backdrop_hint":"Drag to move; pull a corner to resize; use the top handle to rotate. Shift changes proportions or frees the angle.","decor.backdrop_reset":"Reset the picture","decor.backdrop_reset_done":"The picture is back at its original place and size","marker.icon_auto":"Auto: {icon} (by icon rules; pick one to override)","marker.icon_pin_auto":"Pin","mode.plan_tip":"Plan editor — the geometry of the home: draw and split/merge rooms, bind them to HA areas, place doors, windows and gates, move room cards, set the scale","mode.devices_tip":"Device editor — everything about icons: drag to position, click to edit binding/icon/display, add virtual devices, icon rules","mode.decor_tip":"Background editor — purely visual decor under the plan: lines, rectangles, ovals and text labels that never react to clicks","space.glow_enabled":"Light-source glow","gs.glow_group":"Light-source glow","gs.glow_base":"House darkness","gs.glow_light":"Default light color / intensity","gs.wall_group":"Walls","gs.wall_fill":"Wall fill","gs.glow_radius":"Glow radius","gs.unit_m":"m","gs.unit_ft":"ft","marker.controls_label":"Controls other light sources","marker.controls_hint":"With tap action “Toggle”, a click flips every source added here. The marker’s own bound entity is controlled directly and cannot be added; use the switch below to classify it as a light.","marker.controls_filter":"Search lights and switches…","info.controls":"Controls","marker.glow_radius_label":"Glow radius","marker.glow_radius.help":"Sets the glow radius in metres or feet; an empty value uses the radius from general settings.","marker.glow_radius.help.aria":"Help: glow radius","markup.wallthick":"Thickness","markup.select":"Select","title.markup_wallthick":"Thickness — click a wall to set how thick it is. Empty or zero removes the thickness.","markup.hint_wallthick":"click a wall · Esc closes without applying","wallthick.field":"Thickness","wallthick.unit_cm":"cm","wallthick.unit_in":"in","wallthick.apply_room":"Apply to all walls of this room","markup.draw_wall_title":"Thickness of each new wall segment (1–100 cm). Shared walls keep the existing value.","room.queue_progress":"Room {current} of {total}","toast.wall_rooms_saved":"Created rooms: {n}","toast.wall_chain_saved":"Wall chain saved","toast.wallthick_pick":"Click a wall (not an open boundary)","toast.wallthick_open":"Open boundaries have no thickness","toast.wallthick_set":"Wall thickness set","toast.wallthick_cleared":"Wall thickness removed","toast.physical_range":"Enter a value from 1 to {max} {unit}","toast.physical_angle":"Enter a rotation angle from 0° up to, but not including, 90°","toast.physical_limit":"The space has reached the limit for this type of geometry","markup.boundary_hint":"Select a shared room boundary or a dashed stretch","markup.boundary_hint_open":"Click the start of the open stretch","markup.boundary_hint_second":"Choose the end on the selected boundary · Esc to cancel","markup.boundary_hint_retry":"Choose the end on the selected boundary","markup.boundary_hint_restore":"Click to restore the wall","markup.boundary_hint_outer":"Only a boundary shared by two rooms can be opened","markup.boundary_hint_blocked":"a partition, column or unfinished contour is above this boundary","markup.boundary_hint_ambiguous":"Choose a stretch farther from the junction","markup.boundary_cancel":"Cancel the unfinished Boundary action","toast.openwall_pick":"This tool works with room boundaries","toast.openwall_shared_only":"Only a shared wall between two rooms can be opened","toast.openwall_short":"Stretch too short — pick a farther point","toast.boundary_opened":"Boundary stretch opened","toast.boundary_restored":"Wall restored on this stretch","toast.boundary_same_edge":"Choose the end point on the selected wall","toast.boundary_ambiguous":"Choose a stretch slightly farther from the junction","toast.boundary_blocked":"This boundary is covered by independent masonry. Move or delete it with Select first","toast.delete_room_pick":"Click inside the room you want to delete","toast.openwall_openings_removed":"Openings on the virtual stretch were removed","toast.openwall_opened":"Boundary “{a}” ↔ “{b}” is now open","toast.openwall_closed":"Boundary “{a}” ↔ “{b}” is closed again","toast.opening_on_virtual":"Openings cannot sit on a virtual wall","marker.from_ha_option":"Pick from the HA list","marker.show_entities":"Show entities","marker.show_entities_tip":"Adds not only devices to the list, but all their entities too","marker.pick_ph":"Choose a device…","room.open_area":"Open the HA area","view.volumetric":"Volumetric view","view.flat":"Flat view","kiosk.title":"This screen's sizes","kiosk.hint":"Stored on this device only — every wall tablet or TV can have its own comfortable sizes.","kiosk.icon_scale":"Device icon size","kiosk.font_scale":"Room card text size","editor.kiosk":"Wall device (kiosk) mode","editor.cycle":"Auto-switch spaces every N seconds (kiosk, 0 = off)","room.settings_title":"Room settings","room.settings_section":"Room settings (override the space)","room.fill_label":"Fill in THIS room","fill.inherit":"As the space","room.custom_fill_space":"Space color","room.custom_fill_own":"Room color","room.temp_src_label":"Temperature source","room.hum_src_label":"Humidity source","room.src_average":"Average over the room's sensors (default)","room.src_pick":"A specific HA device or entity","room.src_ph":"Choose a source…","toast.room_updated":"Room updated","space.card_font":"Room-card font size (whole space)","room.sizes_section":"Font sizes","room.name_scale":"Room name size","room.label_scale":"Metrics size","preview.room_name":"Living room","toast.cfg_reload_failed":"Could not reload the plan from the server: {err}","room.settings_short":"Room settings","room.unnamed":"Unnamed room","marker.use_climate_temp":"Include the device temperature in the room","marker.use_climate_temp_tip":"Adds an air conditioner or thermostat current_temperature to the room average. Configure the external value badge separately below.","marker.value_badge_title":"Value badge","marker.value_badge.help":"Shows one selected value next to the icon. It does not affect room metrics, light, Glow or the tap action.","marker.value_badge.help.aria":"Help: device value badge","marker.value_badge_enabled":"Show a value badge","marker.value_badge_source":"Value","marker.value_badge_source.help":"Choose a specific state, supported attribute, or derived value of this device.","marker.value_badge_source.help.aria":"Help: value badge source","marker.value_badge_position":"Position","marker.value_badge_position.help":"The chosen side stays fixed and does not flip automatically at a plan edge.","marker.value_badge_position.help.aria":"Help: value badge position","marker.value_badge_right":"Right","marker.value_badge_bottom":"Below","marker.value_badge_left":"Left","marker.value_badge_top":"Above","marker.value_badge_empty":"This device has no available values","marker.value_badge_static":"A static icon does not show live values. The setting is preserved.","marker.value_badge_missing":"Source unavailable","marker.value_badge_missing_hint":"The saved source is currently unavailable. Keep it, disable the badge, or choose another value.","marker.value_badge_duplicate":"The same value is already shown inside the icon.","marker.value_badge_state":"State · {name}","marker.value_badge_marker_state":"Light-source state · {name}","marker.value_badge_lqi":"Average Zigbee signal quality","marker.value_badge_attr_current_temperature":"Current temperature · {name}","marker.value_badge_attr_temperature":"Target temperature · {name}","marker.value_badge_attr_current_humidity":"Current humidity · {name}","marker.value_badge_attr_humidity":"Humidity · {name}","marker.value_badge_attr_current_position":"Position · {name}","marker.value_badge_attr_percentage":"Speed · {name}","marker.value_badge_attr_brightness":"Brightness · {name}","marker.value_badge_attr_volume_level":"Volume · {name}","marker.value_badge_attr_battery_level":"Battery · {name}","marker.value_badge_attr_fan_speed":"Fan speed · {name}","marker.light_role_label":"Is this device a light source?","marker.light_role.help":"Controls whether this marker itself is a spatial light source. Linked lights above remain independent room-light controls.","marker.light_role.help.aria":"Help: whether this device is a light source","marker.light_role_auto_yes":"Auto (light source)","marker.light_role_auto_no":"Auto (not a light source)","marker.light_role_always":"Always a light source","marker.light_role_never":"Never a light source","marker.light_entity_label":"Leading light entity","marker.light_entity.help":"For a composite device, choose the entity whose state, colour and brightness represent this plan source. The automatic fallback remains compatible with older plans.","marker.light_entity.help.aria":"Help: leading light entity","marker.light_entity_auto":"Automatic ({entity})","marker.light_entity_none":"no controllable entity","marker.light_entity_missing":"The saved entity {entity} is unavailable. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.toggle_entity_label":"Entity to toggle","marker.toggle_entity.help":"For a composite device, choose the exact own light or switch operated by a tap. Automatic keeps the previous target rules and is independent from the leading light entity.","marker.toggle_entity.help.aria":"Help: entity to toggle","marker.toggle_entity_auto":"Automatic ({entity})","marker.toggle_entity_none":"no own controllable entity","marker.toggle_entity_missing":"The saved entity {entity} is no longer among this marker’s selectable channels. House Plan temporarily uses {fallback}; the saved choice will be restored if it returns.","marker.glow_color_label":"Glow colour and brightness","marker.glow_mode.help":"Use live source values, override only its colour, or fix both colour and brightness. The minimum is 1%; to disable the source, choose “Never”.","marker.glow_mode.help.aria":"Help: glow colour and brightness","marker.glow_mode_auto":"From source","marker.glow_mode_color":"Set colour","marker.glow_mode_fixed":"Set colour and brightness","marker.glow_color":"Glow colour","marker.glow_brightness":"Brightness","marker.glow_disabled_never":"Glow settings are unavailable because this marker is explicitly not a light source.","marker.glow_disabled_auto":"Auto mode found no spatial light source for this marker.","marker.glow_disabled_no_entity":"No active controllable Home Assistant entity is available for this spatial source.","marker.glow_passive_hint":"This source has no own Home Assistant data. Set its colour and brightness manually; its radius remains available.","marker.control_broken":"Saved source is missing or no longer marked as a light","marker.control_missing_label":"Missing plan light","marker.control_passive":"passive source","toast.marker_control_cycle":"This link would create a circular chain of light controls.","toast.marker_binding_required":"Choose a Home Assistant device before linking another light source.","confirm.unlock":"Unlock “{name}”?","toast.files_migrate_failed":"Attachments could not be moved to the new binding, links keep pointing at the old files: {err}","space.pick_saved":"Already uploaded","space.pick_saved_hint":"Plans stored on the server, including ones you detached earlier","space.no_saved":"No plans stored on the server yet.","space.loading":"Loading…","space.used_by":"in use: {list}","space.in_use":"A space still uses this plan — detach it first","btn.use":"Use","confirm.delete_plan":'Delete the plan file "{name}" from the server? This cannot be undone.',"toast.plans_list_failed":"Could not list the stored plans: {err}","toast.plan_delete_failed":"Could not delete the plan: {err}","marker.hide":"Hide","marker.hide_tip":'The device will disappear from the plan after saving but will still count toward the room signal. Restore it through "Hidden and disabled" in the device editor.',"marker.show":"Show","marker.show_tip":"The device will appear on the plan again after saving.","marker.hidden_ghost":"Device hidden by the user","marker.ha_disabled_device":"The device is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_entity":"The entity is disabled in Home Assistant and hidden from the plan.","marker.ha_disabled_all_entities":"The device has no active Home Assistant entities, so it is hidden from the plan.","marker.ha_registry_limited":"The full Home Assistant registry is unavailable to this user. The unverified object cannot be shown or used for now.","marker.delete_tip":"Completely delete the device from the plan and every aggregate. You can add it again later.","tap.run":"Run automation/script/scene","tap.cover":"Open/close (curtains/blinds)","marker.run_target_label":"What to run","marker.run_search_ph":"Search: automation, script or scene…","marker.run_target_gone":"Target {id} not found — pick again","marker.tap_confirm":"Ask for confirmation","marker.tap_confirm_tip":"Show a confirmation dialog before acting — a guard against accidental taps.","marker.toggle_hint_single":"Target: {name} ({id}).","marker.virtual_light_target":"Virtual light: {name}.","marker.virtual_light_current":"Manual state: {state} → {effect}.","marker.virtual_light_state_on":"on","marker.virtual_light_state_off":"off","marker.toggle_hint_group":"Will toggle {count} source(s): {names}.","marker.toggle_hint_current":"Now: {state} → {effect}.","marker.toggle_hint_group_current":"Currently on: {on} of {count} → {effect}.","marker.toggle_hint_skipped":"Will be skipped ({count}): {targets}.","marker.toggle_effect_turn_on":"will turn on","marker.toggle_effect_turn_off":"will turn off","marker.toggle_effect_open":"will open","marker.toggle_effect_close":"will close","marker.toggle_effect_stop":"will stop","marker.toggle_effect_toggle":"state will toggle","marker.toggle_skip_missing":"not found","marker.toggle_skip_ha_disabled":"disabled in HA","marker.toggle_skip_unavailable":"unavailable","marker.toggle_skip_unsupported":"toggle is unsupported","marker.toggle_skip_secure":"blocked for security","marker.toggle_none_no_binding":"This device has no binding, so there is no state to toggle. Tapping will do nothing.","marker.toggle_none_no_actionable_entity":"This device has no state that can be toggled. Tapping will do nothing.","marker.toggle_none_configured_targets_missing":"The configured targets are unavailable. The device's own entity will not be substituted for them.","marker.toggle_none_ha_disabled":"The target is disabled in Home Assistant and cannot be used on the plan.","marker.toggle_none_unavailable":"The target is currently unavailable. Tapping will do nothing.","marker.toggle_none_unsupported":"Home Assistant exposes no safe toggle operation for this entity. Tapping will do nothing.","marker.toggle_none_secure":"Toggling locks, alarms and secure gates from the plan is blocked for security.","run.automation":"automation","run.script":"script","run.scene":"scene","confirm.tap_run":'Run "{name}"?',"confirm.tap_toggle":'Toggle "{name}"?',"confirm.tap_cover":'Open/close "{name}"?',"confirm.current_state":"Current state: {state}","confirm.expected_state":"After switching: {state}","confirm.group_current":"on {on} of {total}","confirm.group_all_on":"all are on","confirm.group_all_off":"all are off","confirm.unavailable_targets":"Unavailable: {count}","confirm.expected_by_ha":"Home Assistant will determine the state","confirm.state_on":"On","confirm.state_off":"Off","confirm.state_open":"Open","confirm.state_closed":"Closed","confirm.state_opening":"Opening","confirm.state_closing":"Closing","confirm.state_stopped":"Stopped","confirm.state_unknown":"Unknown","toast.run_started":"Started: {name}","toast.run_target_missing":"Run target not found — check the device settings","toast.run_target_required":"Pick an automation, script or scene","toast.tap_target_changed":"The action target changed. Try again.","toast.virtual_light_toggle_failed":"Could not toggle the virtual light: {err}","toast.value_badge_source_required":"Choose a value for the badge","btn.run":"Run","vac.section":"Robot vacuum: live position","vac.autocal":"Set up automatically","vac.live":"Live position on the plan","vac.trail":"Show the robot's path","vac.cal_maps":"Calibrated maps: {maps}","vac.autocal_no_rooms":"The integration reports no room list — open “Fit manually”","vac.autocal_no_match":"Room names did not match (need ≥3 in common) — open “Fit manually”","vac.autocal_done":"Done: bound via {rooms} rooms. Start a cleanup and check","vac.cal_need_pos":"The robot is not reporting coordinates — start a cleanup and pause it","vac.cal_done":"Calibration saved. Start a cleanup and check","vac.cal_cancelled":"Calibration cancelled","vac.fit":"Fit manually","vac.fit_hint":"Drag the robot map into place, stretch by the corners","vac.fit_rotate":"Rotate 90°","vac.fit_mirror":"Mirror","vac.trail_never":"Never","vac.trail_cleaning":"While cleaning","vac.trail_always":"Always","gs.bg_group":"Stage background","gs.bg_color":"Background around the plan","gs.bg_default":"Theme default","gs.bg_theme":"theme default","gs.bg_mode":"Plan background","gs.bg_static":"Static color","gs.bg_daynight":"Follows the Sun","gs.bg_daynight_hint":"The background moves through dawn, day, dusk and night using sun.sun, or your local clock when sun data is unavailable. No compass is needed for the background.","gs.sun_group":"Sun","gs.sun_missing":"The sun.sun entity was not found — the background follows your local clock; window rays are unavailable.","gs.north":"North on the plan","gs.north_ph":"not set","gs.north_hint":"Set north only for window rays (1° steps, 15° with Shift); the Sun background works without it.","gs.north_clear":"Clear","gs.north_letter":"N","gs.sun_rays":"Sunlight through windows","gs.about_group":"About","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · docs & issues","gs.about_telegram":"Telegram chat","space.bg_color":"Background around the plan","space.bg_inherit":"Inherit general","space.bg_inherited":"inherits general settings","space.bg_mode":"Plan background","space.north":"North on the plan (override)","space.north_inherited":"inherited: {v}","space.sun_rays":"Sunlight through windows","space.sun_inherit":"Inherit general","space.sun_on":"On","space.sun_off":"Off","canvas.far_objects":"{n} object(s) far from the plan","canvas.show_far":"Show","canvas.home_tip":"The plan is over there — click to fit it","gs.grid_group":"Plan maintenance","gs.grid_hint":"Updates data models, aligns plan elements to the grid and merges redundant wall fragments. An exact report is shown before anything is stored.","gs.align_all":"Optimize plans","gs.align_title":"Optimize plans","gs.align_none":"All plans already use the current optimized data model.","gs.align_count":"{n} of {total} elements will move, by at most {cm} cm.","gs.align_where":"The largest shift is in “{s}”.","gs.align_turned":"Openings whose angle is corrected: {n}.","gs.align_removed_drafts":"Invalid outlines collapsed by the grid and removed: {n}.","gs.optimize_changes":"Model migrations: {m}; plans canonicalized: {c}; merged real-wall fragments: {w}; virtual fragments: {s}.","gs.optimize_glow_migration":"Legacy Glow: {spaces} spaces → no data fill + independent Glow; {rooms} rooms → inherited data fill + independent Glow.","gs.align_warn":"Elements deliberately placed between grid nodes will move. One undo is available after the operation, only until the next plan edit.","gs.align_run":"Optimize","gs.align_done":"Plans optimized: {n} elements moved, {m} records maintained","gs.optimize_undo":"Undo last optimization","gs.optimize_undone":"The last optimization was undone","decor.furniture":"Furniture","furn.title":"Furniture library","furn.symbol":"Symbol","furn.group_furniture":"Furniture","furn.group_appliance":"Appliances","furn.group_sanitary":"Plumbing","furn.group_other":"Other","furn.width":"Width","furn.depth":"Depth","furn.pick_hint":"Pick a symbol, then click on the plan.","furn.place_hint":"Click on the plan — the piece lands against the nearest wall. Shift places it free.","furn.sym_sofa":"Sofa","furn.sym_armchair":"Armchair","furn.sym_coffee_table":"Coffee table","furn.sym_table_dining":"Dining table","furn.sym_table_round":"Round table","furn.sym_chair":"Chair","furn.sym_desk":"Desk","furn.sym_bed_double":"Double bed","furn.sym_bed_single":"Single bed","furn.sym_nightstand":"Nightstand","furn.sym_wardrobe":"Wardrobe","furn.sym_bookshelf":"Bookshelf","furn.sym_fridge":"Fridge","furn.sym_stove":"Cooker","furn.sym_dishwasher":"Dishwasher","furn.sym_washer":"Washing machine","furn.sym_dryer":"Tumble dryer","furn.sym_tv":"TV","furn.sym_ac":"Air conditioner","furn.sym_water_heater":"Water heater","furn.sym_toilet":"Toilet","furn.sym_bathtub":"Bathtub","furn.sym_shower":"Shower","furn.sym_sink":"Washbasin","furn.sym_kitchen_sink":"Kitchen sink","furn.sym_bidet":"Bidet","furn.sym_stairs":"Stairs","furn.sym_fireplace":"Fireplace","furn.sym_plant":"Plant","furn.sym_rug":"Rug","common.yes":"Yes","common.no":"No","vac.diag_source":"Source","vac.diag_platform":"Integration","vac.diag_status":"Status","vac.diag_position":"Position","vac.diag_rooms":"Rooms","vac.diag_rooms_value":"{total} · {matched} names match · {readiness}","vac.autocal_ready":"auto-calibration available","vac.autocal_not_ready":"need 3 matching names","vac.diag_path":"Integration path","vac.diag_map":"Map ID","vac.source_none":"not selected","vac.source_status_ok":"Ready","vac.source_status_missing":"Missing","vac.source_status_disabled":"Disabled in Home Assistant","vac.source_status_unavailable":"Unavailable","vac.source_status_unverified":"Cannot verify with current permissions","vac.source_status_unsupported":"No position data","vac.source_status_none":"No source","vac.source_banner_missing":"The saved source no longer exists. It was not replaced automatically; choose another source or restore it in Home Assistant.","vac.source_banner_disabled":"The saved source is disabled in Home Assistant. Enable it there or choose another source.","vac.source_banner_unverified":"Current Home Assistant permissions cannot verify this saved source. It remains pinned and will not be replaced automatically.","vac.choose_source":"Choose source","vac.source_auto":"Automatic","vac.source_auto_hint":"Use a compatible entity from this device","vac.all_cameras":"All cameras","vac.all_cameras_warn":"A camera may not provide robot data. Choose one only if it is your vacuum map.","vac.all_cameras_empty":"No other camera entities found.","vac.platform_unknown":"unknown integration","vac.cap_position":"position","vac.cap_rooms_short":"rooms","vac.cap_path":"path","vac.cap_map":"map ID","vac.cap_none":"no robot data detected","vac.xcme_hint":"Enable these Xiaomi Cloud Map Extractor attributes:","vac.documentation":"Documentation","vac.residual_title":"Check automatic calibration","vac.residual_message":"The matched rooms disagree by up to {error}. Apply this approximate calibration, refine it manually, or cancel without changing the saved setup.","vac.apply_proposal":"Apply","gs.backup_group":"Backup and transfer","gs.backup_hint":"Download a portable JSON backup or preview and import a backup made by House Plan.","backup.export_open":"Export","backup.import_open":"Import","backup.export_title":"Export House Plan","backup.import_title":"Import House Plan","backup.export_hint":"Choose whether the backup should contain the whole House Plan configuration or only the current space.","backup.full":"Full backup","backup.current_space":"Current space","backup.current_space_title":"Current space: {title}","backup.no_current_space":"No current space","backup.plan_only":"Plan only","backup.plan_only_hint":"Keep rooms, walls, openings, decor and room-label positions without devices or Home Assistant bindings.","backup.plan_only_preview":"This file contains the plan only","backup.privacy_warning":"The archive keeps names, Home Assistant identifiers and exact coordinates. Internal plans and attachments are referenced, not embedded; runtime states and vacuum trails are not included.","backup.download":"Download JSON","backup.export_done":"Backup downloaded","backup.reading":"Checking the backup…","backup.revalidated":"The plan changed after this preview. The summary was refreshed; review it and confirm again.","backup.error.unauthorized":"You do not have permission to export or import this plan.","backup.error.not_ready":"House Plan is not ready yet. Try again in a moment.","backup.error.too_large":"The backup exceeds the 8 MiB limit.","backup.error.invalid_json":"The selected file is not valid JSON.","backup.error.invalid_format":"The selected file is not a House Plan backup.","backup.error.unsupported_export_version":"This backup format is not supported by the installed version.","backup.error.future_model":"The backup was created by a newer House Plan data model.","backup.error.invalid_config":"The backup contains an invalid House Plan configuration.","backup.error.invalid_layout":"The backup contains invalid object positions.","backup.error.invalid_content":"The backup contains invalid or inconsistent content references.","backup.error.space_not_found":"The selected space no longer exists.","backup.error.capacity_exceeded":"Adding this backup would exceed the plan limits.","backup.error.preview_expired":"The preview expired. Select the backup file again.","backup.error.preview_owner_mismatch":"This preview belongs to another Home Assistant user.","backup.error.conflict":"The plan changed after the preview. Review the refreshed summary.","backup.error.content_confirmation_required":"Confirm that unavailable local content may be detached.","backup.error.commit_failed":"The backup could not be applied safely. The previous plan was restored or is pending recovery.","backup.error.missing_plan":"A referenced plan file disappeared after the preview. Review the backup again.","backup.error.missing_content":"A referenced local attachment disappeared after the preview. Review the backup again.","backup.error.marker_control_missing":"A linked plan light is missing from the backup.","backup.error.marker_control_not_light":"A linked plan target is no longer marked as a light source.","backup.error.marker_control_self":"A light source cannot control itself.","backup.error.marker_control_cycle":"The backup contains a circular chain of light controls.","backup.error.duplicate_marker_control":"The backup contains a duplicate plan-light link.","backup.error.no_backup":"There is no import or optimization snapshot to restore.","backup.same_source":"Created on this Home Assistant instance","backup.foreign_source":"Created on another Home Assistant instance","backup.created":"Created: {value}","backup.versions":"Card {card}; integration {integration}; data model {model}","backup.count_spaces":"Spaces: {n}","backup.count_rooms":"Rooms: {n}","backup.count_walls":"Walls: {n}","backup.count_openings":"Openings: {n}","backup.count_decor":"Decor objects: {n}","backup.count_markers":"Devices: {n}","backup.count_layout":"Positions: {n}","backup.bindings":"Bindings — devices: {device}, entities: {entity}, virtual: {virtual}; positions without a space: {legacy}","backup.binding_status":"Target status — active: {active}, disabled: {disabled}, missing: {missing}","backup.missing_areas":"Areas missing on the target: {areas}","backup.dropped_marker_links":"Plan-light links outside this transferred space were omitted: {n}.","backup.replace_warning":"This replaces the current configuration and layout. Uploaded files are never deleted. One undo remains available until the next plan edit.","backup.foreign_bookkeeping":"Instance-specific known/new-device bookkeeping will not be imported.","backup.final_name":"New space name","backup.target_settings":"The target instance's global settings remain unchanged.","backup.duplicates":"Bindings already present: {n}","backup.skip":"Skip duplicate devices","backup.virtual_copy":"Add safe static virtual copies","backup.content":"Referenced content","backup.content_available":"available locally","backup.content_external":"external link","backup.content_detach_required":"will be detached","backup.confirm_detach":"I understand that unavailable internal plans and attachments will be detached from the imported configuration.","backup.replace":"Replace","backup.add":"Add space","backup.space_done":"Space imported: {rooms} rooms, {markers} devices","backup.full_done":"Backup restored: {spaces} spaces, {rooms} rooms, {markers} devices","backup.undo_import":"Undo last full import","backup.import_undone":"Full import undone"};const ia={en:ea,ru:{"editor.context_actions":"Действия: {object}","editor.tool_options":"Параметры инструмента: {tool}","editor.palette":"Палитра: {tool}","editor.open_group":"Группа инструментов: {group}","editor.group_active":"{group} — активно: {item}","editor.disabled_action":"{action} недоступно: {reason}","color_picker.title":"Выбор цвета","color_picker.hue":"Оттенок","color_picker.saturation":"Насыщенность","color_picker.value":"Яркость","color_picker.hex":"Цвет HEX","color_picker.invalid_hex":"Введите цвет HEX из 3 или 6 цифр","btn.properties":"Свойства","btn.keep_as_walls":"Оставить стенами","title.markup_select":"Выбор и редактирование стен, колонн и сохранённых контуров","title.markup_column":"Колонна: кликните точку сетки для квадратной колонны","markup.partition":"Перегородка","markup.column":"Колонна","markup.hint_column":"кликните точку сетки, чтобы поставить квадратную колонну","history.draft_segment":"Добавление сегмента черновика комнаты","history.draft_merge":"Соединение незавершённых контуров комнаты","history.draft_segment_delete":"Удаление сегмента черновика комнаты","history.partition_add":"Добавление перегородки","history.column_add":"Добавление колонны","history.physical_edit":"Изменение физического объекта","history.physical_delete":"Удаление физического объекта","history.physical_move":"Перемещение физического объекта","history.contour_to_partitions":"Преобразование контура в замкнутые стены","history.wall_chain_finish":"Завершение цепочки стен","history.wall_face_batch":"Создание комнат из стен","toast.column_duplicate":"Колонна с тем же центром и внешним размером уже существует","confirm.delete_draft":"Удалить весь незавершённый контур комнаты?","confirm.delete_draft_segment":"Удалить этот сегмент черновика? Оставшийся контур может разделиться на два.","physical.partition_properties":"Свойства перегородки","physical.column_properties":"Свойства колонны","physical.draft_properties":"Свойства сегмента черновика","physical.shape":"Форма","physical.square":"Квадрат","physical.circle":"Круг","physical.diameter":"Диаметр","physical.side":"Сторона","physical.rotation":"Угол поворота","physical.length":"Длина","physical.allowed_range":"Допустимо: 1–{max} {unit}","physical.delete_segment":"Удалить сегмент","physical.delete_draft":"Удалить весь контур","physical.column_size_title":"Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).","card.title":"План дома","count.devices":"{n} устр.","empty.no_spaces":"Пространств пока нет.","empty.add_first":"Добавьте первое пространство и загрузите план этажа.","empty.install":"Установите интеграцию House Plan и добавьте запись в «Устройства и службы».","btn.add_space":"Добавить пространство","btn.cancel":"Отмена","btn.save":"Сохранить","btn.close":"Закрыть","btn.delete":"Удалить","btn.edit":"Редактировать","btn.open_in_ha":"Открыть в HA","btn.reset":"Сброс","btn.attach":"Прикрепить…","btn.upload":"Загрузить…","btn.replace":"Заменить…","title.zoom_in":"Приблизить","title.zoom_out":"Отдалить","title.zoom_fit":"Вписать всё","title.add_device":"Добавить устройство на план","title.show_all":"Показать скрытые и деактивированные устройства служебными маркерами (только в этой вкладке)","title.markup":"Разметка комнат: сетка, линии, контуры","title.configure_space":"Настроить пространство","title.add_space":"Добавить пространство","title.markup_add":"Стены: рисуйте непрерывную цепочку; Shift фиксирует 45°. Смена инструмента или выход завершает её как независимые стены","title.markup_merge":"Объединить: клик по одной комнате, затем по соседней с общей стеной","title.markup_split":"Разделить комнату: клик по комнате, затем две точки на её стенах","title.markup_delroom":"Удалить комнату: кликните внутри комнаты и подтвердите удаление","title.markup_boundary":"Граница: две точки на сплошной общей стене делают участок виртуальным; клик по пунктиру восстанавливает стену","title.need_plan":"Загрузите подложку (план этажа)","markup.add":"Стены","markup.merge":"Объединить","markup.split":"Разделить","markup.resize":"Размер","title.markup_resize":"Изменение размера комнат: тяните ручку стены; клик по комнате — угловая рамка масштаба","markup.hint_resize":"тяните ручку стены · клик по комнате — угловая рамка · Esc отменяет перетаскивание · Ctrl+Z — отмена шага","markup.opening":"Проём","markup.boundary":"Граница","markup.delete_room":"Удалить комнату","history.undo":"Отменить","history.redo":"Повторить","history.undo_named":"Отменить: {name} (Ctrl+Z)","history.redo_named":"Повторить: {name} (Ctrl+Shift+Z / Ctrl+Y)","history.undo_empty":"Нет операций для отмены","history.redo_empty":"Нет операций для повтора","history.undone":"Отменено: {name}","history.redone":"Повторено: {name}","history.add_room":"Создание комнаты","history.split_room":"Разделение комнаты","history.merge_rooms":"Объединение комнат","history.resize_room":"Изменение размера комнаты","history.open_boundary":"Открытие границы","history.close_boundary":"Восстановление стены","history.wall_thickness":"Изменение толщины стены","history.add_opening":"Добавление дверного или оконного проёма","history.edit_opening":"Изменение проёма","history.move_opening":"Перемещение проёма","history.delete_opening":"Удаление проёма","history.delete_room":"Удаление комнаты","history.decor_add":"Добавление объекта декора","history.decor_edit":"Изменение объекта декора","history.decor_move":"Перемещение объекта декора","history.decor_transform":"Трансформация объекта декора","history.decor_delete":"Удаление объекта декора","history.backdrop_transform":"Трансформация подложки плана","title.markup_opening":"Проёмы: клик по стене — добавить, клик по проёму — редактировать","opening.new":"Новый проём","opening.edit":"Проём","opening.door":"Дверь","opening.window":"Окно","opening.gate":"Ворота","opening.passage":"Открытый проём","opening.passage_binding_warning":"При сохранении датчик открытия и замок будут удалены.","opening.invalid_passage_fields":"У открытого проёма на плане «{room}» есть недопустимые параметры: {fields}.","opening.type_label":"Тип","opening.length_label":"Длина, см","opening.contact_label":"Датчик открытия","opening.lock_label":"Замок","opening.none":"— нет —","opening.invert":"Инвертировать открыто/закрыто","opening.flip_h":"Петли с другой стороны","opening.flip_v":"Открывается в другую сторону","opening.open":"Открыто","opening.closed":"Закрыто","opening.locked":"Заперто","opening.unlocked":"Не заперто","opening.state_unknown":"недоступно","opening.no_entities":"Датчики не привязаны — статичный символ на плане.","toast.opening_no_wall":"Кликните рядом со стеной комнаты или независимой стеной","opening.host_partition":"Независимая стена","opening.partition_orphan":"Независимая стена этого проёма больше не существует","opening.partition_jamb_margin":"Оставьте от края проёма до торца стены минимум {distance}","opening.rebind_partition":"Привязать к другой независимой стене","confirm.delete_partition_openings_title":"Удалить стену и проёмы?","confirm.delete_partition_openings_body":"В стене есть проёмы: {count}. Они будут удалены вместе со стеной.","confirm.delete_partition_openings_item":"• {type}, {length}","markup.delete":"Удалить","markup.hint_points":"точек: {n} · Shift — шаг 45° · Esc/Ctrl+Z — убрать точку · при замыкании будет предложена комната","markup.hint_start":"кликните точку сетки, чтобы начать цепочку стен","tip.lqi":"средний сигнал zigbee:","tip.area":"площадь: {value}","info.device_header":"Устройство на плане","info.model":"Модель","info.state":"Состояние","info.link":"Ссылка","info.manuals":"Инструкции","info.none":"Нет дополнительной информации","marker.new_device":"Новое устройство","marker.name_label":"Имя (отображается на плане)","marker.name_ph":"Название","marker.binding_label":"Привязка к устройству HA","marker.binding_disabled":"деактивировано в Home Assistant","marker.virtual_option":"Виртуальное устройство (без привязки)","marker.search_ph":"Поиск устройства / группы…","marker.nothing_found":"ничего не найдено","marker.room_label":"Комната","marker.room_override":" (переопределить размещение)","marker.room_choose":"— выберите комнату —","marker.room_auto":"— по зоне устройства (авто) —","marker.icon_label":"Иконка","marker.icon_ph":"mdi:… (пусто = авто)","marker.display_label":"Отображение","display.badge":"Значок + состояние","display.icon_ripple":"Значок + состояние и активность","display.static_icon":"Всегда статичный значок","marker.display_hint":"Значок + состояние меняет подложку при работе, открытии, тревоге и недоступности. Значок + состояние и активность дополнительно показывает короткую пульсацию для событий и постоянную — для работы, движения или присутствия. Значение + состояние заменяет значок одним однозначным значением HA. Статичный значок не реагирует на состояния устройства.","marker.display_hint_badge":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon":"Значок и динамическая подложка показывают состояние устройства без обычной пульсации активности. Красная тревога сохраняется.","marker.display_hint_icon_ripple":"Значок, динамическая подложка и пульсация: короткая — для событий, постоянная — для работы, движения или присутствия. Красная тревога имеет отдельный приоритет.","marker.display_hint_value":"Значок заменяется одним однозначным значением Home Assistant; подложка продолжает показывать состояние. Красная тревога сохраняется.","marker.display_hint_static_icon":"Всегда одинаковые чёрная подложка и значок. Состояния, активность, недоступность и тревоги не меняют отображение.","marker.static_alarm_warning":"Это устройство может сообщать о тревогах. Статичный режим скрывает визуальную тревогу маркера.","marker.preview.title":"Предпросмотр отображения","marker.preview.actual":"Сейчас","marker.preview.example":"Пример","marker.preview.integration":"Интеграция","marker.preview.source":"Источник отображения","marker.preview.current_state":"Текущее состояние","marker.preview.result":"На плане","marker.preview.details":"Подробнее об источниках","marker.preview.select_source":"Выберите устройство или сущность Home Assistant, чтобы увидеть фактическое отображение.","marker.preview.unknown_provider":"Интеграция неизвестна","marker.preview.virtual_provider":"House Plan · виртуальное устройство","marker.preview.no_source":"Нет активного источника","marker.preview.no_state":"Нет текущего состояния","marker.preview.mixed_states":"Несколько разных состояний","marker.preview.multiple_sources":"Источников: {n}","marker.preview.more_sources":"ещё {n}","marker.preview.scaled":"Предпросмотр уменьшен до {n}%, чтобы поместиться. Сохранённый размер не изменится.","marker.preview.demo_activity":"Показать пример активности","marker.preview.demo_notice":"Временный пример активности; фактическое состояние устройства не меняется.","marker.preview.demo_short":"Показать краткую активность","marker.preview.demo_continuous":"Показать постоянную активность","marker.preview.stop_continuous":"Остановить постоянную активность","marker.preview.demo_short_notice":"Пример краткой активности; фактическое состояние устройства не меняется.","marker.preview.demo_continuous_notice":"Пример постоянной активности; фактическое состояние устройства не меняется.","marker.preview.demo_already_visible":"Текущее состояние уже показывает реальную активность или тревогу.","marker.preview.reduced_motion":"В системе включено уменьшение движения, поэтому обычная активность показана точкой.","marker.preview.reason.neutral":"Нейтральная тёмная подложка","marker.preview.reason.working":"Жёлтая подложка: устройство сейчас работает","marker.preview.reason.working_activity":"Жёлтая подложка и эффект активности: устройство сейчас работает","marker.preview.reason.open":"Оранжевая подложка: физически открыто или разблокировано","marker.preview.reason.cover_icon_state":"Нейтральная подложка; состояние и значок определяет сущность шторы или заслонки","marker.preview.reason.presence":"Эффект активности, пока обнаружено присутствие","marker.preview.reason.event":"Короткий эффект активности после события","marker.preview.reason.transition":"Эффект активности во время движения или смены состояния","marker.preview.reason.media_neutral":"Медиаустройство остаётся на нейтральной тёмной подложке, пока доступно","marker.preview.reason.unavailable":"Приглушённая нейтральная подложка: отключено или недоступно","marker.preview.reason.alarm":"Красная тревожная подложка; тревога отображается всегда","marker.preview.reason.live_states_disabled":"Оформление по живым состояниям отключено в настройках карточки","marker.preview.reason.value_no_state":"Нет подходящего значения состояния — вместо него показан значок","marker.preview.reason.value_ambiguous_sources":"Подходит несколько источников значения — вместо него показан значок","marker.preview.reason.value_non_scalar":"Источник вернул не простое значение — вместо него показан значок","marker.preview.reason.value_virtual":"У виртуального устройства нет значения HA — вместо него показан значок","marker.preview.reason.vacuum_live_plan_only":"Живая позиция и след пылесоса доступны только на полном плане","marker.preview.reason.hidden_design_preview":"Устройство скрыто на плане, но его оформление видно в предпросмотре","marker.preview.reason.composite_power_source":"Состояние берётся из сущности питания устройства; вспомогательные переключатели не учитываются","marker.preview.reason.activity_display_disabled":"Выбранный режим отображения не показывает обычные эффекты активности","marker.preview.reason.ha_disabled":"Привязка отключена в Home Assistant, поэтому устройство будет скрыто на плане","marker.preview.reason.orphaned":"Сохранённая привязка Home Assistant больше не найдена","marker.preview.reason.static_icon":"Статичный режим: состояние устройства не меняет значок","marker.activity_color":"Цвет пульсации активности","marker.ripple_size":"Размер пульсации активности","marker.activity_alarm_note":"Цвет и размер относятся только к обычной активности и не влияют на красную тревогу.","marker.pulse_a11y_alarm":"Тревога","marker.pulse_a11y_event":"Недавнее событие","marker.pulse_a11y_presence":"Обнаружено присутствие","marker.pulse_a11y_transition":"Изменение состояния","marker.pulse_a11y_running":"Работает","marker.size_label":"Размер / поворот значка","marker.angle_label":"Поворот","marker.model_label":"Модель","marker.model_ph":"напр. Aqara T&H","marker.link_label":"Ссылка","marker.desc_label":"Описание","marker.desc_ph":"Заметки, характеристики…","marker.manuals_label":"Инструкции (PDF и т.п.)","marker.sub_device":"устройство","marker.sub_z2m_group":" · Z2M-группа","marker.sub_group":"группа","marker.sub_helper":"хелпер","space.new":"Новое пространство","space.header":"Пространство","space.title_label":"Название","space.title_ph":"Например: Гараж","space.plan_label":"Подложка (план)","space.no_plan":"нет подложки","space.plan_alt":"план","room.new":"Новая комната","room.name_label":"Отображаемое имя","room.name_ph":"Например: Терраса","room.area_label":"Зона Home Assistant (свободные)","room.no_area_option":"— без зоны —","room.default_name":"Комната","device.unnamed":"без имени","device.light_group":"группа света","device.fallback":"устройство","device.virtual":"виртуальное устройство","confirm.delete_room":"Удалить комнату «{name}»?","confirm.merge_rooms":"Слить комнаты «{a}» и «{b}»?","confirm.remove_marker":"Удалить «{name}» с плана? Устройство исчезнет полностью и перестанет участвовать в данных плана. Позже его можно будет добавить заново.","confirm.erase_decor":"Стереть объект «{kind}»? Действие можно отменить из истории редактора.","confirm.delete_space":"Удалить пространство «{title}» со всеми комнатами и разметкой?","toast.pos_save_failed":"Не удалось сохранить позицию: {err}","toast.no_entity":"У устройства нет подходящей сущности","toast.ha_disabled_action":"Деактивированный объект Home Assistant нельзя использовать на плане.","toast.ha_disabled_show_device":"Деактивированное в Home Assistant устройство нельзя показать на плане. Сначала активируйте его в Home Assistant.","toast.ha_disabled_show_entity":"Деактивированную в Home Assistant сущность нельзя показать на плане. Сначала активируйте её в Home Assistant.","toast.ha_disabled_add":"Деактивированный объект Home Assistant нельзя добавить на план. Сначала активируйте его в Home Assistant.","toast.ha_binding_unverified":"Статус объекта не удалось подтвердить по реестру Home Assistant. Отображение и действия временно недоступны.","toast.markup_needs_server":"Разметка доступна после переноса конфига на сервер","toast.conflict":"Конфиг изменён в другом окне — данные обновлены, повторите последнее действие","toast.cfg_save_failed":"Не удалось сохранить конфиг: {err}","toast.room_overlap":"Контур накладывается на комнату «{name}» — комнаты не должны накладываться","toast.contour_min_edges":"Чтобы замкнуть контур, сначала нарисуйте минимум две грани","toast.contour_cannot_close":"Контур нельзя замкнуть: он вырожден или пересекает сам себя","toast.merge_not_adjacent":"Объединять можно только комнаты с общей стеной","toast.rooms_merged":"Комнаты объединены в «{name}»","toast.split_pick_wall":"Начните разрез на стене комнаты","toast.split_bad_cut":"Разрез — от стены до стены внутри комнаты, без пересечения стен и самого себя","merge.header":"Объединение комнат","merge.hint":"У объединённой комнаты одно имя и одна зона. Вторая зона освобождается — её устройства уйдут с плана, пока их не заберёт другая комната.","merge.keep":"Оставить","merge.no_area":"без зоны","room.split_header":"Новая комната после разделения","toast.room_saved":"Комната сохранена ({n}). Устройств добавлено: {added}. Обведите следующую или выйдите из разметки.","toast.room_saved_no_area":"Комната сохранена ({n}, без зоны). Обведите следующую или выйдите из разметки.","toast.marker_needs_server":"Редактирование устройств доступно после переноса конфига на сервер","toast.virtual_name_required":"Укажите имя виртуального устройства","toast.marker_saved":"Устройство сохранено","toast.marker_removed":"Устройство удалено с плана","toast.integration_missing":"Интеграция House Plan не установлена — управление недоступно","toast.plan_formats":"Поддерживаются SVG, PNG, JPG, WebP","toast.plan_required":"Загрузите подложку — план этажа обязателен","toast.space_added_onboard":"Пространство добавлено. Обведите комнаты: кликайте по точкам сетки и замкните контур.","toast.space_added":"Пространство добавлено","toast.space_saved":"Пространство сохранено","toast.space_deleted":"Пространство удалено","toast.delete_failed":"Ошибка удаления: {err}","toast.error":"Ошибка: {err}","toast.file_failed":"Файл «{name}» не загружен: {err}","toast.files_attached":"Прикреплено файлов: {n}","err.unknown":"неизвестная ошибка","err.code":"код {code}","err.too_large":"файл больше {mb} МБ","err.bad_ext":"недопустимый тип (нужен PDF/изображение)","err.unauthorized":"нужны права администратора","editor.title":"Заголовок","editor.default_floor":"Пространство по умолчанию","editor.icon_size":"Размер иконок, % ширины плана","editor.show_temperature":"Показывать температуру","editor.live_states":"Живые состояния (вкл/выкл, открыто…)","editor.show_signal":"Показывать сигнал zigbee (LQI)","editor.language":"Язык интерфейса","editor.lang_auto":"Авто (профиль HA)","editor.lang_en":"English","editor.lang_ru":"Русский","title.icon_rules":"Правила иконок: какая MDI-иконка достаётся устройству по имени","rules.title":"Правила иконок","rules.hint":"Правила проверяются сверху вниз по строке «имя устройства + модель» (regex без учёта регистра); срабатывает первое совпадение. Если ничего не подошло — решает device class сущности, затем — иконка-заглушка.","rules.pattern_ph":"regex, напр. розетк|plug","rules.icon_ph":"mdi:power-socket-de","rules.add":"Добавить правило","rules.reset":"Сбросить к умолчаниям","rules.test_ph":"Проверьте имя устройства…","rules.invalid":"некорректный regex","rules.saved":"Правила иконок сохранены","btn.up":"Вверх","btn.down":"Вниз","tap.info":"Карточка устройства","tap.more_info":"Диалог HA (more-info)","tap.toggle":"Переключить состояние","marker.tap_label":"Действие по нажатию для этого устройства","tap.toggle_note":"Под селектором показано, какое состояние изменится. Защищённые устройства не переключаются с плана.","import.title":"Создать пространства из этажей HA","import.hint":"Home Assistant уже знает эти этажи. Отметьте, какие превратить в пространства плана — далее для каждого попросим картинку плана. Комнаты затем обводятся вручную по плану.","import.start":"Создать: {n}","import.manual":"Начать с нуля","import.progress":"Этаж {i} из {n}","import.done":"Пространства созданы. Обведите комнаты: кликайте по точкам сетки и замкните контур.","btn.skip":"Пропустить","space.scale_label":"Масштаб (размер клетки сетки)","space.scale_unit":"см на клетку","space.display_section":"Отображение","space.show_borders":"Всегда отображать границы комнат","space.show_names":"Отображать названия комнат (перетаскиваются)","space.room_color":"Цвет границ и названий","space.opacity":"Прозрачность","space.fill_label":"Заливка комнат","fill.none":"Нет","fill.lqi":"По силе зигби-сигнала","fill.light":"По освещению","fill.custom":"Свой цвет","space.custom_fill":"Цвет заливки","space.source_file":"У меня есть картинка плана","space.source_draw":"Нет подложки — нарисую комнаты вручную","space.orientation":"Холст","orient.landscape":"Альбомный","orient.portrait":"Портретный","orient.square":"Квадрат","fill.temp":"По температуре","space.temp_min":"Комфорт от","space.temp_max":"до","tip.temp_avg":"средняя температура:","tip.hum_avg":"средняя влажность:","space_card.button":"Перейти к пространству","space_card.not_found":"Пространство «{id}» не найдено","space_card.loading":"Загрузка…","continuity.restore_plan":"Восстанавливаем план…","continuity.restore_connection":"Восстанавливаем подключение к устройствам…","continuity.retry":"Повторить","editor.space":"Пространство","editor.show_button":"Показывать кнопку","editor.button_label":"Текст кнопки","editor.button_target":"Путь дашборда (куда вести)","marker.sub_entity":"сущность","title.general_settings":"Общие настройки","gs.title":"Общие настройки","gs.hint":"Цвета заливок действуют на все пространства; у каждого цвета своя прозрачность. Какой режим заливки использует пространство — задаётся в его диалоге.","gs.light_group":"Заливка: освещение","gs.light_on":"Свет включён","gs.light_off":"Весь свет выключен","gs.temp_group":"Заливка: температура","gs.temp_cold":"Холодно","gs.temp_ok":"Комфорт","gs.temp_hot":"Жарко","gs.lqi_group":"Заливка: зигби-сигнал","gs.lqi_low":"Слабый сигнал","gs.lqi_high":"Сильный сигнал","gs.reset":"Сбросить к умолчаниям","gs.saved":"Общие настройки сохранены","space.show_lqi":"Показывать зигби-сигнал (LQI) у устройств","space.hide_decor":"Скрыть декоративный слой","space.hide_decor_tip":"Линии, фигуры, надписи и мебель остаются на месте — их видно в редакторе подложки, но не на плане.","space.hide_openings":"Скрыть проёмы","space.hide_openings_tip":"Двери, окна и ворота не рисуются, но продолжают работать: свет проходит, солнце светит в окна, датчики открытия срабатывают. В редакторе плана проёмы видно всегда.","gs.light_none":"Нет источников света","mode.plan":"Редактор плана","mode.devices":"Редактор устройств","display.value":"Значение + состояние","marker.subarea":"без зоны, вручную","device.new":"Новое устройство — откройте его редактор, чтобы снять отметку","opening.unlock_action":"Открыть замок","opening.lock_action":"Закрыть замок","opening.lock_pending":"Выполняется…","title.close_editor":"Закрыть редактор (вернуться к просмотру)","devbar.add":"Добавить","devbar.show_all":"Скрытые и деактивированные","devbar.rules":"Правила иконок","space.roomcard_section":"В карточке комнаты:","space.label_temp":"Температура","space.label_hum":"Влажность","space.label_lqi":"Средний Zigbee-сигнал","space.label_light":"Свет вкл/выкл","roomcard.light_on":"Вкл","roomcard.light_off":"Выкл","roomcard.light_partial":"{on} из {total}","toast.split_pick_inside":"Промежуточные точки разреза — внутри комнаты","mode.decor":"Редактор подложки","decor.select":"Выбрать","decor.line":"Линия","decor.rect":"Прямоугольник","decor.ellipse":"Овал","decor.text":"Надпись","decor.erase":"Стереть","decor.erase_confirm_title":"Стереть объект?","decor.color":"Цвет","decor.width":"Толщина линии","decor.line_style":"Стиль линии","decor.line_style_solid":"Сплошная","decor.line_style_dashed":"Пунктирная","decor.fill":"Заливка","decor.fill_color":"Цвет заливки","decor.length":"Длина","decor.size":"Размер","decor.angle":"Угол поворота, °","decor.text_size":"Размер текста","decor.backdrop_properties":"Свойства картинки-подложки","decor.text_title":"Надпись","decor.object_title":"Редактирование: {kind}","decor.text_label":"Текст","decor.live_group":"Вставить переменную HA","decor.live_entity":"Сущность","decor.live_entity_ph":"выберите сущность","decor.live_attr":"Значение","decor.live_attr_ph":"выберите состояние или атрибут","decor.live_state":"Состояние","decor.backdrop":"Картинка-подложка","decor.backdrop_hint":"Тяните картинку — перемещение; угол — размер; верхнюю ручку — поворот. Shift меняет пропорции или снимает шаг угла.","decor.backdrop_reset":"Вернуть картинку","decor.backdrop_reset_done":"Картинка вернулась на своё место и в свой размер","marker.icon_auto":"Авто: {icon} (по правилам иконок; выберите свою, чтобы заменить)","marker.icon_pin_auto":"Закрепить","mode.plan_tip":"Редактор плана — геометрия дома: рисование и объединение/разделение комнат, привязка к зонам HA, двери, окна и ворота, карточки комнат, масштаб","mode.devices_tip":"Редактор устройств — всё про значки: перетаскивание, клик — настройка привязки/иконки/отображения, виртуальные устройства, правила иконок","mode.decor_tip":"Редактор подложки — чисто визуальный декор под планом: линии, прямоугольники, овалы и надписи, не реагирующие на клики","space.glow_enabled":"Свечение источников света","gs.glow_group":"Свечение источников света","gs.glow_base":"Темнота дома","gs.glow_light":"Цвет света по умолчанию / интенсивность","gs.wall_group":"Стены","gs.wall_fill":"Цвет заливки стен","gs.glow_radius":"Радиус свечения","gs.unit_m":"м","gs.unit_ft":"фут","marker.controls_label":"Управляет другими источниками света","marker.controls_hint":"При действии «Переключить» клик разом переключает все добавленные здесь источники. Собственная сущность маркера управляется напрямую и сюда не добавляется; чтобы считать её светом, включите флаг ниже.","marker.controls_filter":"Поиск ламп и выключателей…","info.controls":"Управляет","marker.glow_radius_label":"Радиус свечения","marker.glow_radius.help":"Задаёт радиус свечения в метрах или футах; пустое значение использует радиус из общих настроек.","marker.glow_radius.help.aria":"Подсказка: радиус свечения","markup.wallthick":"Толщина","markup.select":"Выбрать","title.markup_wallthick":"Толщина — клик по стене задаёт толщину. Пустое поле или ноль убирает толщину.","markup.hint_wallthick":"клик по стене · Esc закрывает без применения","wallthick.field":"Толщина","wallthick.unit_cm":"см","wallthick.unit_in":"дюйм","wallthick.apply_room":"Применить ко всем стенам комнаты","markup.draw_wall_title":"Толщина каждого нового сегмента стены (1–100 см). Общие стены сохраняют существующее значение.","room.queue_progress":"Комната {current} из {total}","toast.wall_rooms_saved":"Создано комнат: {n}","toast.wall_chain_saved":"Цепочка стен сохранена","toast.wallthick_pick":"Кликните по стене (не по открытой границе)","toast.wallthick_open":"У открытой границы нет толщины","toast.wallthick_set":"Толщина стены задана","toast.wallthick_cleared":"Толщина стены убрана","toast.physical_range":"Введите значение от 1 до {max} {unit}","toast.physical_angle":"Введите угол поворота от 0° до 90°, не включая 90°","toast.physical_limit":"В пространстве достигнут лимит объектов этого типа","markup.boundary_hint":"Выберите общую границу комнат или пунктирный участок","markup.boundary_hint_open":"Кликните начало открытого участка","markup.boundary_hint_second":"Укажите конец на выбранной границе · Esc — отмена","markup.boundary_hint_retry":"Укажите конец на выбранной границе","markup.boundary_hint_restore":"Кликните, чтобы восстановить стену","markup.boundary_hint_outer":"Открыть можно только общую границу двух комнат","markup.boundary_hint_blocked":"над границей находится перегородка, колонна или незавершённый контур","markup.boundary_hint_ambiguous":"Выберите участок чуть дальше от стыка","markup.boundary_cancel":"Отменить незавершённое действие «Граница»","toast.openwall_pick":"Инструмент работает с границами комнат","toast.openwall_shared_only":"Открыть можно только общую стену двух комнат","toast.openwall_short":"Слишком короткий отрезок — кликните дальше","toast.boundary_opened":"Участок границы открыт","toast.boundary_restored":"Стена на участке восстановлена","toast.boundary_same_edge":"Выберите конечную точку на выбранной стене","toast.boundary_ambiguous":"Выберите участок чуть дальше от стыка","toast.boundary_blocked":"Граница перекрыта независимой стеной. Сначала переместите или удалите её инструментом «Выбрать»","toast.delete_room_pick":"Кликните внутри комнаты, которую нужно удалить","toast.openwall_openings_removed":"Проёмы на виртуальном отрезке удалены","toast.openwall_opened":"Граница «{a}» ↔ «{b}» теперь открыта","toast.openwall_closed":"Граница «{a}» ↔ «{b}» снова закрыта","toast.opening_on_virtual":"Проёмы на виртуальной стене запрещены","marker.from_ha_option":"Выбрать из списка HA","marker.show_entities":"Отображать сущности","marker.show_entities_tip":"Добавляет в список не только устройства, но и все их сущности","marker.pick_ph":"Выберите устройство…","room.open_area":"Открыть зону в HA","view.volumetric":"Объёмный вид","view.flat":"Плоский вид","kiosk.title":"Размеры на этом экране","kiosk.hint":"Хранится только на этом устройстве — у каждого настенного планшета или ТВ свои удобные размеры.","kiosk.icon_scale":"Размер значков устройств","kiosk.font_scale":"Размер текста карточек комнат","editor.kiosk":"Режим настенного устройства (киоск)","editor.cycle":"Автосмена пространств каждые N секунд (киоск, 0 = выкл)","room.settings_title":"Настройки комнаты","room.settings_section":"Настройки комнаты (переопределяют пространство)","room.fill_label":"Заливка в ЭТОЙ комнате","fill.inherit":"Как у пространства","room.custom_fill_space":"Цвет пространства","room.custom_fill_own":"Цвет комнаты","room.temp_src_label":"Источник температуры","room.hum_src_label":"Источник влажности","room.src_average":"Средняя по датчикам комнаты (по умолчанию)","room.src_pick":"Конкретное устройство или сущность HA","room.src_ph":"Выберите источник…","toast.room_updated":"Комната обновлена","space.card_font":"Размер шрифта карточек комнат (всё пространство)","room.sizes_section":"Размеры шрифтов","room.name_scale":"Размер названия","room.label_scale":"Размер подписей","preview.room_name":"Гостиная","toast.cfg_reload_failed":"Не удалось перечитать план с сервера: {err}","room.settings_short":"Настройки комнаты","room.unnamed":"Комната без имени","marker.use_climate_temp":"Учитывать температуру устройства в комнате","marker.use_climate_temp_tip":"Добавляет current_temperature кондиционера или термостата в среднюю температуру комнаты. Внешний бейдж со значением настраивается отдельно ниже.","marker.value_badge_title":"Бейдж со значением","marker.value_badge.help":"Показывает одно выбранное значение рядом со значком. Не влияет на комнатные показатели, свет, Glow и действие по нажатию.","marker.value_badge.help.aria":"Подсказка: бейдж со значением устройства","marker.value_badge_enabled":"Отображать бейдж со значением","marker.value_badge_source":"Значение","marker.value_badge_source.help":"Выберите конкретное состояние, поддерживаемый атрибут или производное значение этого устройства.","marker.value_badge_source.help.aria":"Подсказка: источник значения бейджа","marker.value_badge_position":"Расположение","marker.value_badge_position.help":"Выбранная сторона сохраняется постоянно и не переворачивается автоматически у края плана.","marker.value_badge_position.help.aria":"Подсказка: расположение бейджа","marker.value_badge_right":"Справа","marker.value_badge_bottom":"Снизу","marker.value_badge_left":"Слева","marker.value_badge_top":"Сверху","marker.value_badge_empty":"У этого устройства нет доступных значений","marker.value_badge_static":"Статичный значок не показывает живые значения. Настройка сохранится.","marker.value_badge_missing":"Источник недоступен","marker.value_badge_missing_hint":"Сохранённый источник сейчас недоступен. Можно сохранить его, отключить бейдж или выбрать другой.","marker.value_badge_duplicate":"То же значение уже показано внутри значка.","marker.value_badge_state":"Состояние · {name}","marker.value_badge_marker_state":"Состояние источника света · {name}","marker.value_badge_lqi":"Качество Zigbee-сигнала (среднее)","marker.value_badge_attr_current_temperature":"Текущая температура · {name}","marker.value_badge_attr_temperature":"Целевая температура · {name}","marker.value_badge_attr_current_humidity":"Текущая влажность · {name}","marker.value_badge_attr_humidity":"Влажность · {name}","marker.value_badge_attr_current_position":"Положение · {name}","marker.value_badge_attr_percentage":"Скорость · {name}","marker.value_badge_attr_brightness":"Яркость · {name}","marker.value_badge_attr_volume_level":"Громкость · {name}","marker.value_badge_attr_battery_level":"Заряд батареи · {name}","marker.value_badge_attr_fan_speed":"Скорость вентилятора · {name}","marker.light_role_label":"Является источником света","marker.light_role.help":"Определяет, является ли сам маркер пространственным источником света. Привязанные выше лампы остаются независимыми источниками для комнаты.","marker.light_role.help.aria":"Подсказка: является ли устройство источником света","marker.light_role_auto_yes":"Автоматически (источник света)","marker.light_role_auto_no":"Автоматически (не источник света)","marker.light_role_always":"Всегда источник света","marker.light_role_never":"Никогда не источник света","marker.light_entity_label":"Ведущая сущность света","marker.light_entity.help":"Для составного устройства выберите сущность, состояние, цвет и яркость которой представляют этот источник на плане. Автоматический вариант сохраняет совместимость со старыми планами.","marker.light_entity.help.aria":"Подсказка: ведущая сущность света","marker.light_entity_auto":"Автоматически ({entity})","marker.light_entity_none":"нет управляемой сущности","marker.light_entity_missing":"Сохранённая сущность {entity} недоступна. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.toggle_entity_label":"Переключаемая сущность","marker.toggle_entity.help":"Для составного устройства выберите собственную лампу или переключатель, которой управляет нажатие. Автоматический вариант сохраняет прежние правила цели и не зависит от ведущей сущности света.","marker.toggle_entity.help.aria":"Подсказка: переключаемая сущность","marker.toggle_entity_auto":"Автоматически ({entity})","marker.toggle_entity_none":"нет собственной управляемой сущности","marker.toggle_entity_missing":"Сохранённой сущности {entity} больше нет среди выбираемых каналов этого маркера. Временно используется {fallback}; выбор восстановится, если сущность вернётся.","marker.glow_color_label":"Цвет и яркость свечения","marker.glow_mode.help":"Используйте данные источника, задайте только цвет или зафиксируйте цвет и яркость. Минимум — 1%; чтобы отключить источник, выберите «Никогда».","marker.glow_mode.help.aria":"Подсказка: цвет и яркость свечения","marker.glow_mode_auto":"Из источника","marker.glow_mode_color":"Задать цвет","marker.glow_mode_fixed":"Задать цвет и яркость","marker.glow_color":"Цвет свечения","marker.glow_brightness":"Яркость","marker.glow_disabled_never":"Настройки свечения недоступны: маркер явно исключён из источников света.","marker.glow_disabled_auto":"В автоматическом режиме у этого маркера не найден пространственный источник света.","marker.glow_disabled_no_entity":"Для пространственного источника нет активной управляемой сущности Home Assistant.","marker.glow_passive_hint":"У источника нет собственных данных Home Assistant. Задайте цвет и яркость вручную; радиус остаётся доступным.","marker.control_broken":"Сохранённый источник отсутствует или больше не отмечен как источник света","marker.control_missing_label":"Отсутствующий источник на плане","marker.control_passive":"пассивный источник","toast.marker_control_cycle":"Такая связь создаст циклическую цепочку управления светом.","toast.marker_binding_required":"Сначала выберите устройство Home Assistant, затем добавьте управляемый источник света.","confirm.unlock":"Открыть замок «{name}»?","toast.files_migrate_failed":"Не удалось перенести вложения к новой привязке, ссылки остались на старые файлы: {err}","space.pick_saved":"Уже загруженные","space.pick_saved_hint":"Планы, сохранённые на сервере, включая отцеплённые ранее","space.no_saved":"На сервере пока нет сохранённых планов.","space.loading":"Загрузка…","space.used_by":"используется: {list}","space.in_use":"План используется пространством — сначала отцепите его","btn.use":"Выбрать","confirm.delete_plan":"Удалить файл плана «{name}» с сервера? Действие необратимо.","toast.plans_list_failed":"Не удалось получить список планов: {err}","toast.plan_delete_failed":"Не удалось удалить план: {err}","marker.hide":"Скрыть","marker.hide_tip":"Устройство исчезнет с плана после сохранения, но продолжит участвовать в расчёте сигнала комнаты. Вернуть его можно через кнопку «Скрытые и деактивированные» в редакторе устройств.","marker.show":"Показать","marker.show_tip":"Устройство снова появится на плане после сохранения.","marker.hidden_ghost":"Устройство скрыто пользователем","marker.ha_disabled_device":"Устройство деактивировано в Home Assistant и скрыто с плана.","marker.ha_disabled_entity":"Сущность деактивирована в Home Assistant и скрыта с плана.","marker.ha_disabled_all_entities":"У устройства нет активных сущностей Home Assistant, поэтому оно скрыто с плана.","marker.ha_registry_limited":"Полный реестр Home Assistant недоступен этому пользователю. Неподтверждённый объект временно нельзя показывать или использовать.","marker.delete_tip":"Полностью удалить устройство с плана и из всех расчётов. Позже его можно добавить заново.","tap.run":"Запустить автоматизацию/скрипт/сцену","tap.cover":"Открыть/закрыть (шторы/жалюзи)","marker.run_target_label":"Что запускать","marker.run_search_ph":"Поиск: автоматизация, скрипт или сцена…","marker.run_target_gone":"Цель {id} не найдена — выберите заново","marker.tap_confirm":"Спрашивать подтверждение","marker.tap_confirm_tip":"Перед выполнением показать диалог подтверждения — защита от случайных нажатий.","marker.toggle_hint_single":"Цель: {name} ({id}).","marker.virtual_light_target":"Виртуальный свет: {name}.","marker.virtual_light_current":"Ручное состояние: {state} → {effect}.","marker.virtual_light_state_on":"включён","marker.virtual_light_state_off":"выключен","marker.toggle_hint_group":"Переключатся источники ({count}): {names}.","marker.toggle_hint_current":"Сейчас: {state} → {effect}.","marker.toggle_hint_group_current":"Сейчас включено {on} из {count} → {effect}.","marker.toggle_hint_skipped":"Не будут затронуты ({count}): {targets}.","marker.toggle_effect_turn_on":"включится","marker.toggle_effect_turn_off":"выключится","marker.toggle_effect_open":"откроется","marker.toggle_effect_close":"закроется","marker.toggle_effect_stop":"остановится","marker.toggle_effect_toggle":"состояние переключится","marker.toggle_skip_missing":"не найдено","marker.toggle_skip_ha_disabled":"деактивировано в HA","marker.toggle_skip_unavailable":"недоступно","marker.toggle_skip_unsupported":"переключение не поддерживается","marker.toggle_skip_secure":"заблокировано из соображений безопасности","marker.toggle_none_no_binding":"У устройства нет привязки, состояние переключать нечем. По нажатию ничего не произойдёт.","marker.toggle_none_no_actionable_entity":"У устройства нет состояния, которое можно переключить. По нажатию ничего не произойдёт.","marker.toggle_none_configured_targets_missing":"Настроенные цели сейчас недоступны. Собственная сущность устройства не будет подставлена вместо них.","marker.toggle_none_ha_disabled":"Цель деактивирована в Home Assistant и не может использоваться на плане.","marker.toggle_none_unavailable":"Цель сейчас недоступна. По нажатию ничего не произойдёт.","marker.toggle_none_unsupported":"Для этой сущности Home Assistant не предоставляет безопасного переключения. По нажатию ничего не произойдёт.","marker.toggle_none_secure":"Переключение замков, сигнализации и защитных ворот с плана заблокировано из соображений безопасности.","run.automation":"автоматизация","run.script":"скрипт","run.scene":"сцена","confirm.tap_run":"Запустить «{name}»?","confirm.tap_toggle":"Переключить «{name}»?","confirm.tap_cover":"Открыть/закрыть «{name}»?","confirm.current_state":"Текущее состояние: {state}","confirm.expected_state":"После переключения: {state}","confirm.group_current":"включено {on} из {total}","confirm.group_all_on":"все включены","confirm.group_all_off":"все выключены","confirm.unavailable_targets":"Недоступно: {count}","confirm.expected_by_ha":"Состояние определит Home Assistant","confirm.state_on":"Включено","confirm.state_off":"Выключено","confirm.state_open":"Открыто","confirm.state_closed":"Закрыто","confirm.state_opening":"Открывается","confirm.state_closing":"Закрывается","confirm.state_stopped":"Остановлено","confirm.state_unknown":"Неизвестно","toast.run_started":"Запущено: {name}","toast.run_target_missing":"Цель запуска не найдена — проверьте настройки устройства","toast.run_target_required":"Выберите автоматизацию, скрипт или сцену","toast.tap_target_changed":"Цель действия изменилась. Повторите попытку.","toast.virtual_light_toggle_failed":"Не удалось переключить виртуальный свет: {err}","toast.value_badge_source_required":"Выберите значение для бейджа","btn.run":"Выполнить","vac.section":"Робот-пылесос: живая позиция","vac.autocal":"Настроить автоматически","vac.live":"Живая позиция на плане","vac.trail":"Показывать путь робота","vac.cal_maps":"Откалиброваны карты: {maps}","vac.autocal_no_rooms":"Интеграция не отдаёт список комнат — откройте «Подогнать вручную»","vac.autocal_no_match":"Не совпали имена комнат (нужно ≥3 общих) — откройте «Подогнать вручную»","vac.autocal_done":"Готово: привязка по {rooms} комнатам. Запустите уборку и проверьте","vac.cal_need_pos":"Робот сейчас не отдаёт координаты — запустите уборку и поставьте на паузу","vac.cal_done":"Калибровка сохранена. Запустите уборку и проверьте","vac.cal_cancelled":"Калибровка отменена","vac.fit":"Подогнать вручную","vac.fit_hint":"Перетащите карту робота на место, растяните за уголки","vac.fit_rotate":"Повернуть 90°","vac.fit_mirror":"Отразить","vac.trail_never":"Не показывать никогда","vac.trail_cleaning":"Во время уборки","vac.trail_always":"Показывать всегда","gs.bg_group":"Фон сцены","gs.bg_color":"Цвет фона вокруг плана","gs.bg_default":"Как в теме","gs.bg_theme":"по умолчанию — из темы","gs.bg_mode":"Фон плана","gs.bg_static":"Статичный цвет","gs.bg_daynight":"Следует за Солнцем","gs.bg_daynight_hint":"Фон проходит рассвет, день, закат и ночь по данным sun.sun, а при их недоступности — по локальным часам. Компас для фона не нужен.","gs.sun_group":"Солнце","gs.sun_missing":"Сущность sun.sun не найдена — фон следует локальным часам, а оконные лучи недоступны.","gs.north":"Север на плане","gs.north_ph":"не задан","gs.north_hint":"Север нужен только для оконных лучей (шаг 1°, с Shift 15°); солнечный фон работает без него.","gs.north_clear":"Сбросить","gs.north_letter":"С","gs.sun_rays":"Солнце в окнах","gs.about_group":"О карточке","gs.about_version":"Houseplan Card v{v}","gs.about_github":"GitHub · документация и issues","gs.about_telegram":"Чат в Telegram","space.bg_color":"Цвет фона вокруг плана","space.bg_inherit":"Наследовать общий","space.bg_inherited":"наследуется из общих настроек","space.bg_mode":"Фон плана","space.north":"Север на плане (переопределение)","space.north_inherited":"наследуется: {v}","space.sun_rays":"Солнце в окнах","space.sun_inherit":"Наследовать общий","space.sun_on":"Вкл","space.sun_off":"Выкл","canvas.far_objects":"Объектов далеко от плана: {n}","canvas.show_far":"Показать","canvas.home_tip":"План там — нажмите, чтобы вписать","gs.grid_group":"Обслуживание планов","gs.grid_hint":"Обновляет модели данных, выравнивает элементы по сетке и объединяет лишние фрагменты стен. Перед записью будет показан точный отчёт.","gs.align_all":"Оптимизировать планы","gs.align_title":"Оптимизировать планы","gs.align_none":"Все планы уже используют актуальную и оптимальную модель данных.","gs.align_count":"Сдвинется элементов: {n} из {total}, максимум на {cm} см.","gs.align_where":"Наибольший сдвиг — в пространстве «{s}».","gs.align_turned":"Проёмов с исправлением угла: {n}.","gs.align_removed_drafts":"Схлопнувшиеся на сетке некорректные контуры удалены: {n}.","gs.optimize_changes":"Миграций модели: {m}; канонизировано планов: {c}; объединено отрезков реальных стен: {w}; виртуальных: {s}.","gs.optimize_glow_migration":"Старый Glow: пространств — {spaces} → без заливки данных + независимый Glow; комнат — {rooms} → наследуемая заливка + независимый Glow.","gs.align_warn":"Элементы, намеренно поставленные между узлами, будут сдвинуты. После операции доступна одна отмена — только до следующего изменения плана.","gs.align_run":"Оптимизировать","gs.align_done":"Планы оптимизированы: сдвинуто элементов — {n}, обслужено записей — {m}","gs.optimize_undo":"Отменить последнюю оптимизацию","gs.optimize_undone":"Последняя оптимизация отменена","decor.furniture":"Мебель","furn.title":"Библиотека мебели","furn.symbol":"Символ","furn.group_furniture":"Мебель","furn.group_appliance":"Техника","furn.group_sanitary":"Сантехника","furn.group_other":"Прочее","furn.width":"Ширина","furn.depth":"Глубина","furn.pick_hint":"Выберите символ и кликните по плану.","furn.place_hint":"Кликните по плану — предмет встанет к ближайшей стене. Shift — свободно.","furn.sym_sofa":"Диван","furn.sym_armchair":"Кресло","furn.sym_coffee_table":"Журнальный столик","furn.sym_table_dining":"Обеденный стол","furn.sym_table_round":"Круглый стол","furn.sym_chair":"Стул","furn.sym_desk":"Письменный стол","furn.sym_bed_double":"Двуспальная кровать","furn.sym_bed_single":"Односпальная кровать","furn.sym_nightstand":"Тумбочка","furn.sym_wardrobe":"Шкаф","furn.sym_bookshelf":"Стеллаж","furn.sym_fridge":"Холодильник","furn.sym_stove":"Плита","furn.sym_dishwasher":"Посудомоечная машина","furn.sym_washer":"Стиральная машина","furn.sym_dryer":"Сушильная машина","furn.sym_tv":"Телевизор","furn.sym_ac":"Кондиционер","furn.sym_water_heater":"Бойлер","furn.sym_toilet":"Унитаз","furn.sym_bathtub":"Ванна","furn.sym_shower":"Душ","furn.sym_sink":"Раковина","furn.sym_kitchen_sink":"Кухонная мойка","furn.sym_bidet":"Биде","furn.sym_stairs":"Лестница","furn.sym_fireplace":"Камин","furn.sym_plant":"Растение","furn.sym_rug":"Ковёр","common.yes":"Да","common.no":"Нет","vac.diag_source":"Источник","vac.diag_platform":"Интеграция","vac.diag_status":"Статус","vac.diag_position":"Позиция","vac.diag_rooms":"Комнаты","vac.diag_rooms_value":"{total} · совпало имён: {matched} · {readiness}","vac.autocal_ready":"автокалибровка доступна","vac.autocal_not_ready":"нужно 3 совпавших имени","vac.diag_path":"Путь интеграции","vac.diag_map":"ID карты","vac.source_none":"не выбран","vac.source_status_ok":"Готов","vac.source_status_missing":"Не найден","vac.source_status_disabled":"Деактивирован в Home Assistant","vac.source_status_unavailable":"Недоступен","vac.source_status_unverified":"Нельзя проверить с текущими правами","vac.source_status_unsupported":"Нет данных позиции","vac.source_status_none":"Нет источника","vac.source_banner_missing":"Сохранённый источник больше не существует. Он не заменён автоматически: выберите другой или восстановите его в Home Assistant.","vac.source_banner_disabled":"Сохранённый источник деактивирован в Home Assistant. Активируйте его там или выберите другой.","vac.source_banner_unverified":"Текущих прав Home Assistant недостаточно для проверки источника. Привязка сохранена и не будет заменена автоматически.","vac.choose_source":"Выбрать источник","vac.source_auto":"Автоматически","vac.source_auto_hint":"Использовать совместимую сущность этого устройства","vac.all_cameras":"Все камеры","vac.all_cameras_warn":"Камера может не отдавать данные робота. Выбирайте её только если это карта вашего пылесоса.","vac.all_cameras_empty":"Других сущностей камеры не найдено.","vac.platform_unknown":"интеграция неизвестна","vac.cap_position":"позиция","vac.cap_rooms_short":"комнаты","vac.cap_path":"путь","vac.cap_map":"ID карты","vac.cap_none":"данные робота не обнаружены","vac.xcme_hint":"Включите атрибуты Xiaomi Cloud Map Extractor:","vac.documentation":"Документация","vac.residual_title":"Проверьте автокалибровку","vac.residual_message":"Совпавшие комнаты расходятся максимум на {error}. Примените приблизительную калибровку, подгоните её вручную либо отмените без изменения сохранённых настроек.","vac.apply_proposal":"Применить","gs.backup_group":"Резервная копия и перенос","gs.backup_hint":"Скачайте переносимую JSON-копию или проверьте и импортируйте копию, созданную House Plan.","backup.export_open":"Экспорт","backup.import_open":"Импорт","backup.export_title":"Экспорт House Plan","backup.import_title":"Импорт House Plan","backup.export_hint":"Выберите, должна ли копия содержать всю конфигурацию House Plan или только текущее пространство.","backup.full":"Полная копия","backup.current_space":"Текущее пространство","backup.current_space_title":"Текущее пространство: {title}","backup.no_current_space":"Нет текущего пространства","backup.plan_only":"Только планировка","backup.plan_only_hint":"Сохранить комнаты, стены, проёмы, декор и позиции подписей комнат без устройств и привязок Home Assistant.","backup.plan_only_preview":"Файл содержит только планировку","backup.privacy_warning":"Архив сохраняет названия, идентификаторы Home Assistant и точные координаты. Внутренние планы и вложения указываются ссылками, но не вкладываются; текущие состояния и маршруты пылесосов не включаются.","backup.download":"Скачать JSON","backup.export_done":"Резервная копия скачана","backup.reading":"Проверяем резервную копию…","backup.revalidated":"После предпросмотра план изменился. Сводка обновлена — проверьте её и подтвердите ещё раз.","backup.error.unauthorized":"У вас нет прав на экспорт или импорт этого плана.","backup.error.not_ready":"House Plan ещё не готов. Повторите попытку через несколько секунд.","backup.error.too_large":"Размер резервной копии превышает 8 МиБ.","backup.error.invalid_json":"Выбранный файл не является корректным JSON.","backup.error.invalid_format":"Выбранный файл не является резервной копией House Plan.","backup.error.unsupported_export_version":"Эта версия формата резервной копии не поддерживается установленной версией.","backup.error.future_model":"Резервная копия создана в более новой версии модели данных House Plan.","backup.error.invalid_config":"Резервная копия содержит некорректную конфигурацию House Plan.","backup.error.invalid_layout":"Резервная копия содержит некорректные позиции объектов.","backup.error.invalid_content":"Резервная копия содержит некорректные или несогласованные ссылки на файлы.","backup.error.space_not_found":"Выбранное пространство больше не существует.","backup.error.capacity_exceeded":"Добавление этой копии превысит ограничения размера плана.","backup.error.preview_expired":"Время предпросмотра истекло. Выберите файл резервной копии заново.","backup.error.preview_owner_mismatch":"Этот предпросмотр принадлежит другому пользователю Home Assistant.","backup.error.conflict":"После предпросмотра план изменился. Проверьте обновлённую сводку.","backup.error.content_confirmation_required":"Подтвердите отсоединение недоступных локальных файлов.","backup.error.commit_failed":"Не удалось безопасно применить копию. Предыдущий план восстановлен или ожидает восстановления.","backup.error.missing_plan":"После предпросмотра исчез связанный файл плана. Проверьте копию ещё раз.","backup.error.missing_content":"После предпросмотра исчез связанный локальный файл. Проверьте копию ещё раз.","backup.error.marker_control_missing":"В резервной копии отсутствует связанный источник света на плане.","backup.error.marker_control_not_light":"Связанная цель больше не отмечена как источник света.","backup.error.marker_control_self":"Источник света не может управлять самим собой.","backup.error.marker_control_cycle":"Резервная копия содержит циклическую цепочку управления светом.","backup.error.duplicate_marker_control":"Резервная копия содержит повторяющуюся связь с источником света.","backup.error.no_backup":"Нет снимка импорта или оптимизации, который можно восстановить.","backup.same_source":"Создано на этом экземпляре Home Assistant","backup.foreign_source":"Создано на другом экземпляре Home Assistant","backup.created":"Создано: {value}","backup.versions":"Карточка {card}; интеграция {integration}; модель данных {model}","backup.count_spaces":"Пространств: {n}","backup.count_rooms":"Комнат: {n}","backup.count_walls":"Стен: {n}","backup.count_openings":"Проёмов: {n}","backup.count_decor":"Объектов декора: {n}","backup.count_markers":"Устройств: {n}","backup.count_layout":"Позиций: {n}","backup.bindings":"Привязки — устройства: {device}, сущности: {entity}, виртуальные: {virtual}; позиций без пространства: {legacy}","backup.binding_status":"Статус на целевом экземпляре — активных: {active}, деактивированных: {disabled}, отсутствующих: {missing}","backup.missing_areas":"На целевом экземпляре отсутствуют зоны: {areas}","backup.dropped_marker_links":"Связи с источниками света вне переносимого пространства пропущены: {n}.","backup.replace_warning":"Текущая конфигурация и расположение будут заменены. Загруженные файлы не удаляются. Одну отмену можно выполнить до следующего изменения плана.","backup.foreign_bookkeeping":"Служебные списки известных и новых устройств другого экземпляра импортированы не будут.","backup.final_name":"Название нового пространства","backup.target_settings":"Глобальные настройки целевого экземпляра не изменятся.","backup.duplicates":"Уже существующих привязок: {n}","backup.skip":"Пропустить повторяющиеся устройства","backup.virtual_copy":"Добавить безопасные статичные виртуальные копии","backup.content":"Связанное содержимое","backup.content_available":"доступно локально","backup.content_external":"внешняя ссылка","backup.content_detach_required":"будет отвязано","backup.confirm_detach":"Я понимаю, что недоступные внутренние планы и вложения будут отвязаны от импортируемой конфигурации.","backup.replace":"Заменить","backup.add":"Добавить пространство","backup.space_done":"Пространство импортировано: комнат — {rooms}, устройств — {markers}","backup.full_done":"Копия восстановлена: пространств — {spaces}, комнат — {rooms}, устройств — {markers}","backup.undo_import":"Отменить последний полный импорт","backup.import_undone":"Полный импорт отменён"}};function sa(t,e){if(e&&e in ia)return e;return(t?.locale?.language||t?.language||"en").toLowerCase().startsWith("ru")?"ru":"en"}function na(t,e,i){return ss(ia[t][e]??ea[e]??e,i)}function oa(t,e){const i=ia[t][e]??ia.en[e];return"string"==typeof i&&i.trim().length>0}class aa extends ht{constructor(){super(...arguments),this.deviceName="",this._metadataConnection=null,this._demoUntil=0,this._demoTimer=0,this._demoGeneration=1,this._demoKind=null,this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,this.requestUpdate()},this._startShortDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&(this._demoGeneration++,this._demoKind="short",this._demoUntil=Date.now()+3300,window.clearTimeout(this._demoTimer),this._demoTimer=window.setTimeout(()=>{this._demoUntil=0,this._demoTimer=0,this._demoKind=null,this.requestUpdate()},3330),this.requestUpdate())},this._toggleContinuousDemo=()=>{const t=this.presentation;t&&"icon_ripple"===t.display&&"none"===t.pulse.kind&&("continuous"===this._demoKind?this._clearDemo():(this._clearDemo(),this._demoGeneration++,this._demoKind="continuous",this._demoUntil=Number.POSITIVE_INFINITY),this.requestUpdate())}}connectedCallback(){super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),this._ensureMetadata()}disconnectedCallback(){this._metadataRelease?.(),this._metadataRelease=void 0,this._metadataConnection=null,this._clearDemo(),this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,super.disconnectedCallback()}willUpdate(t){t.has("hass")&&this._ensureMetadata();const e=this.presentation,i=t.get("presentation");t.has("presentation")&&i?.binding!==e?.binding&&this._clearDemo(),e&&this._demoKind&&("icon_ripple"!==e.display||"none"!==e.pulse.kind)&&this._clearDemo()}_ensureMetadata(){const t=this.hass?.connection||null;t&&t!==this._metadataConnection&&(this._metadataRelease?.(),this._metadataConnection=t,this._metadataRelease=Yo(this.hass,()=>this.requestUpdate()))}_clearDemo(){window.clearTimeout(this._demoTimer),this._demoTimer=0,this._demoUntil=0,this._demoKind=null}get _lang(){return sa(this.hass)}_t(t,e){return na(this._lang,t,e)}_providerText(t){return"houseplan"===t.domain?this._t("marker.preview.virtual_provider"):t.label.toLowerCase()===t.domain.toLowerCase()?t.domain:`${t.label} (${t.domain})`}_providers(){return this.presentation&&this.registry?function(t,e,i,s=Xo(t)){if("virtual"===e)return[{domain:"houseplan",label:"House Plan",confidence:"registry-owner"}];const n=e.indexOf(":");if(n<1)return[];const o=e.slice(0,n),a=e.slice(n+1);if("entity"===o){const e=ta(t,a,i,s);return e?[e]:[]}if("device"!==o)return[];const r=i.devices?.[a]||t?.devices?.[a];if(!r)return[];const l=[r.config_entry_id,...Array.isArray(r.config_entries)?r.config_entries:[]].filter(t=>"string"==typeof t&&!!t).map(e=>{const i=s.configEntries[e];return Zo(t,i?.domain,"registry-owner",s,e)});if(l.some(Boolean))return Qo(l);const c=[];for(const[e,n]of Object.entries(i.entities||{}))n?.device_id===a&&null==n?.disabled_by&&c.push(ta(t,e,i,s));return c.some(Boolean)?Qo(c):Qo((Array.isArray(r.identifiers)?r.identifiers:[]).map(e=>{const i=Array.isArray(e)?e[0]:null;return Zo(t,i,"identifier-fallback",s)}))}(this.hass,this.presentation.binding,this.registry,Xo(this.hass)):[]}_providerSummary(t){if(!t.length)return this._t("marker.preview.unknown_provider");const e=t.slice(0,2).map(t=>this._providerText(t)),i=t.length-e.length;return e.join(", ")+(i>0?` · ${this._t("marker.preview.more_sources",{n:i})}`:"")}_sourceSummary(t){const e=t.visualSources;return e.length?1===e.length?`${e[0].name} · ${e[0].eid} · ${this._sourceProvider(e[0].eid)}`:2===e.length?e.map(t=>t.name).join(" · "):this._t("marker.preview.multiple_sources",{n:e.length}):this._t("marker.preview.no_source")}_stateSummary(t){if(!t.visualSources.length)return this._t("marker.preview.no_state");if(1===t.visualSources.length)return t.visualSources[0].stateText||this._t("marker.preview.no_state");const e=[...new Set(t.visualSources.map(t=>t.stateText).filter(Boolean))];return 1===e.length?e[0]:this._t("marker.preview.mixed_states")}_reason(t){return this._t(`marker.preview.reason.${t}`)}_sourceProvider(t){if(!this.registry)return this._t("marker.preview.unknown_provider");const e=ta(this.hass,t,this.registry,Xo(this.hass));return e?this._providerText(e):this._t("marker.preview.unknown_provider")}render(){const t=this.presentation;if(!t)return G;const e=!!this._demoKind&&this._demoUntil>Date.now()&&"icon_ripple"===t.display&&"none"===t.pulse.kind,i=e?(()=>{const e=function(t,e,i,s,n=null){return{kind:e,reason:"short"===e?"event":"running",generation:Math.max(1,Math.trunc(i)),expiresAt:"short"===e?n:null,color:s?null:t.color,diameterScale:s?1:t.diameterScale,animated:!s,reducedMotionIndicator:s?"dot":"none"}}(t.pulse,this._demoKind,this._demoGeneration,this._reducedMotion,"short"===this._demoKind?this._demoUntil:null);return{...t,pulse:e,classes:[...t.classes.filter(t=>!t.startsWith("pulse-")),`pulse-${e.kind}`,...e.generation%2==0?["pulse-gen2"]:[]]}})():t,s=this._providers(),n="none"!==t.pulse.kind,o=i.scale*(i.pulse.animated?i.pulse.diameterScale:1);let a=-o/2,r=o/2,l=-o/2,c=o/2;if(i.valueBadge){const t=i.scale*Math.min(4,Math.max(.9,.29*i.valueBadge.text.length+.28)),e=.7*i.scale,s=.6*i.scale;"right"===i.valueBadge.position&&(r=Math.max(r,s+t)),"left"===i.valueBadge.position&&(a=Math.min(a,-s-t)),"top"===i.valueBadge.position&&(l=Math.min(l,-s-e)),"bottom"===i.valueBadge.position&&(c=Math.max(c,s+e))}if(null!=i.lqiText){const t=i.scale*("bottom"===i.valueBadge?.position?1.55:.95);c=Math.max(c,t)}const h=Math.min(1,2.35/Math.max(1,r-a),2.35/Math.max(1,c-l)),d=Math.round(100*h),u=[`left:calc(50% - ${54*((a+r)/2)*h}px)`,`top:calc(50% - ${54*((l+c)/2)*h}px)`,h<1?`transform:scale(${h})`:""].filter(Boolean).join(";"),p=["dev",...i.classes,"virtual"===i.binding?"virtual":"",i.haDisabled?"ghost ha-disabled":"",null!=i.valueText?"valonly":""].filter(Boolean).join(" "),_=jo(i).join(";"),g=e?this._t("continuous"===this._demoKind?"marker.preview.demo_continuous_notice":"marker.preview.demo_short_notice"):this._reason(t.explanation.reason),m=[this.deviceName,this._providerSummary(s),this._stateSummary(t),g,t.valueFullText||"",To(t.valueBadge)].filter(Boolean).join(". ");return j`
${this._t("marker.preview.title")} @@ -4543,7 +4543,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 ${t?.visibleLabel?j`${t.visibleLabel}`:G}
${t?.content||G}
-
`}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Fu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Fu(t,t=>t.classList.contains("editor-secondary")),s=Fu(t,t=>!!t.dataset.editorGroup),n=Fu(t,t=>!!t.dataset.editorPalette),o=Fu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Ou=t=>t.stopPropagation(),Hu=4.166666666666667e-9;function Nu(t){if(!Number.isFinite(t))return t;const e=Math.round(t/Zl)*Zl;return Math.abs(e-t)<=Hu?t:e}const Lu=(t,e,i,s)=>Math.hypot(i-t,s-e),Bu=(t,e,i,s,n,o,a,r)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+a-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+r-(e+s)))),qu=(t,e,i,s,n,o,a)=>{const r=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*r,h=Math.sin(i*l)*r,d=Math.cos(a*l)*r,u=Math.sin(a*l)*r,p=Math.max(Lu(t+c,e+h,n+d,o+u),Lu(t-c,e-h,n-d,o-u)),_=Math.max(Lu(t+c,e+h,n-d,o-u),Lu(t-c,e-h,n+d,o+u));return Math.min(p,_)},ju=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const Wu=t=>JSON.parse(JSON.stringify(t)),Uu=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Gu=(t,e,i)=>Math.min(i,Math.max(e,t)),Vu=t=>Vl({spaces:[t]})[0],Ku=t=>{const e=[];for(const i of t||[]){const t=hi(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&Uu(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(Uu(n,"segments")&&(delete n.segments,e++),Uu(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=jl&&t<=Wl&&(Uu(n,"plan_scale_x")||(n.plan_scale_x=t),Uu(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);Uu(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?Gu(o,.1,1e3):5,e++);const a=Number(n.cell_cm),r=Number.isFinite(a)&&a>0?a:5;for(const t of n.wall_columns||[])if("circle"===t.shape)Uu(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&Uu(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(Uu(t,"width")){const i=Number(t.width);(Uu(t,"width_cm")||Number.isFinite(i))&&(Uu(t,"width_cm")||(t.width_cm=Number(Gu(i/Jl*r,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(Uu(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),Uu(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(Gu(es*is(t)/Jl*r,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(Uu(t,"scale")||Uu(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1]));if(!(Uu(t,"entity")||Uu(t,"attr")||Uu(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,a=s||n?"":Xi(t.entity,o);if(s||a){if(a){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+a+i.slice(e+2):`${i}${i?" ":""}${a}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let r=a.total;for(const t of i.spaces||[]){const e=Vu(t);if(!e)continue;if(!Fc(t.open_spans).length){const i=Lc(e.rooms,null,Bl,.02*Jl,!0);i.length&&(t.open_spans=Bc(i,Bl),r++)}}const l=Wu(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,a=0,r=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=ju(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Hu||s))return;n++,t>a&&(a=t);const o=t*Xl*e;o>r&&(r=o,l=i)};for(const t of i){const e=ju(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,a=Nu(e+n),r=Nu(i+o),l=Nu(e),c=Nu(i),h=Math.max(Zl,a-l),d=Math.max(Zl,r-c);t=Bu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i}),a=n.length?[n[0]]:[],r=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Nu(s.a[0]),Nu(s.a[1])],a=[Nu(s.b[0]),Nu(s.b[1])];let r=Math.max(Lu(s.a[0],s.a[1],n[0],n[1]),Lu(s.b[0],s.b[1],a[0],a[1]));const l=Lu(n[0],n[1],a[0],a[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Hu&&s+e/2<=l+Hu});l>Hu&&c?(s.a=n,s.b=a):r=0,p(r,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Nu(s.center[0]),Nu(s.center[1])],n=Lu(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Nu(s.x1),Nu(s.y1)],i=[Nu(s.x2),Nu(s.y2)];t=Math.max(Lu(s.x1,s.y1,e[0],e[1]),Lu(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Nu(s.x),i=Nu(s.y);if(null!=s.w&&null!=s.h){const n=Nu(s.x+s.w),o=Nu(s.y+s.h),a=Math.max(Zl,n-e),r=Math.max(Zl,o-i);t=Bu(s.x,s.y,s.w,s.h,e,i,a,r),s.w=a,s.h=r}else t=Lu(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const a=n.b[0]-n.a[0],r=n.b[1]-n.a[1];if(Math.hypot(a,r)<=Hu)continue;const l=n.a[0]+a*o,h=n.a[1]+r*o;let d=180*Math.atan2(r,a)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=qu(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=pi([s.x,s.y],t.rooms||[],.025,{step:Zl,length:Number(s.length)||0});if(!n)continue;const a=Number(s.angle),r=!(Number.isFinite(a)&&a===n.angle),l=qu(s.x,s.y,Number.isFinite(a)?a:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,r&&c++,p(l,e,i,r)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Nu(i.x),a=Nu(i.y),r=Lu(i.x,i.y,n,a);s[t]={...i,x:n,y:a};const l="string"==typeof i.s?i.s:"";p(r,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:a,maxShiftCm:r,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=Vu(e),a=Vu(s);if(!o||!a)continue;const r=Ku(o.rooms),c=Ku(a.rooms),_=.02*Jl;let g=Yc(Fc(e.open_spans),r,c,Bl);const m=g.length;g=Kc(g,a.rooms,Bl,_),g=g.map(t=>{const e=Ic(t,Bl),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],a=e[2]-e[0],r=e[3]-e[1],l=Math.hypot(a,r)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(a*s-r*e)/(l*c)<=1e-6&&zc(o,t).d<=4*_&&zc(i,t).d<=4*_&&zc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Hc(i,d,u,Jl,2*_),g=Hc(n,d,u,Jl,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Jl)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Jl){h.moved++;const t=m/Bl;t>h.maxShift&&(h.maxShift=t);const e=m/Jl*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Ac(p,g,Bl)}),g=Kc(g,a.rooms,Bl,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Ic(t,Bl));g.length?s.open_spans=g:delete s.open_spans,qc(s.rooms||[],a.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Rr(e.walls,r,c,Zl,Bl);y=el(a.rooms,y,f,Zl,Number(s.cell_cm)>0?Number(s.cell_cm):5,Jl,Bl),y=Tr(y,s.rooms||[],Zl,1,f.map(t=>[t[0]/Bl,t[1]/Bl,t[2]/Bl,t[3]/Bl])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:r,glowSpacesMigrated:a.glowSpaces,glowRoomsMigrated:a.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class Xu{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const Ju=new WeakMap;const Zu=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function Qu(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,a=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=a}),r=t.createElement("canvas");r.width=4,r.height=1;const l=r.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return Zu(c,i,0)&&Zu(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&Zu(c,s,8)&&Zu(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(a)}}const tp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},ep=t=>Math.max(0,Math.min(1,t)),ip=(t,e,i)=>t+(e-t)*i,sp=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function np(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function op(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function ap(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function rp(t,e,i){const s=ap(t),n=ap(e);if(!s||!n)return i<.5?t:e;const o=ep(i);return`rgba(${Math.round(ip(s[0],n[0],o))}, ${Math.round(ip(s[1],n[1],o))}, ${Math.round(ip(s[2],n[2],o))}, ${ip(s[3],n[3],o).toFixed(3)})`}function lp(t,e,i){const s=(t=>{const e=ep(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,sp(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=ep((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:lp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(a):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(a),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const hp="houseplan_card_labs_v1",dp=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function up(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function pp(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function yp(t,e,i,s=dp){const n=function(t,e=dp){const i=up(t),s=new Map;if(!i||!gp(e))return s;for(const t of e){const e=up(t.since),n=up(t.expires);pp(i,e)>=0&&pp(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(gp(s)?s.map(t=>t.id):[]),a=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let r=!1;const l=t=>{if("off"===t)return a.clear(),void(r=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(r=!0,e||!n.has(i)?a.delete(i):a.add(i))};for(const e of vp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of vp(mp(t.hash)))l(e);const c=Object.freeze([...a].sort());return{active:c,space:fp(t.hash),persist:r?JSON.stringify(c):void 0,knownUrlOperation:r}}let bp={active:Object.freeze([]),space:""},wp="",kp=!1,$p="";const xp=new Set;function Sp(){if("undefined"==typeof window)return bp;const t=yp(window.location,function(){try{return window.localStorage.getItem(hp)}catch{return null}}(),wp);void 0!==t.persist&&function(t){try{window.localStorage.setItem(hp,t)}catch{}}(t.persist),bp={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of xp)t(bp);return bp}function Mp(){Sp()}function Cp(t){return wp=t,"undefined"==typeof window?bp:(kp||(kp=!0,window.addEventListener("hashchange",Mp),window.addEventListener("popstate",Mp)),Sp())}const Dp=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),Tp=64;function Pp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function Rp(t,e,i=Dp){if(!(Pp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],a=t[1]-i.origin[1],r=(o*Math.cos(s)-a*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+a*Math.cos(s))*i.xyScale;return[i.origin[0]+r,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function Ap(t,e=Dp){if(!Pp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Ip(t=Dp){return`matrix(${function(t=Dp){if(!Pp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),a=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,a,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-a*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Ep(t,e=Dp){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const a=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],r=Math.max(s,n),l=a.flatMap(t=>[Rp(t,-o,e),Rp(t,r,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Fp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function zp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return zp(i)>0===s?i:[...i].reverse()}function Hp(t,e,i){return t.length?`M ${t.map(t=>Fp(Rp(t,i,e))).join(" L ")} Z`:""}function Np(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Lp(t,e,i=Dp){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Op(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(zp(t))>=1e-9)).filter(t=>t.length&&zp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(zp(e[0]))-Math.abs(zp(t[0]))});const n=[],o=[];let a=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:a}}function Bp(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const qp=t=>t.every(Number.isFinite);function jp(t,e,i,s){const n=t[0]*i,o=t[1]*s,a=e*Math.PI/180;return[n*Math.cos(a)-o*Math.sin(a),n*Math.sin(a)+o*Math.cos(a)]}function Wp(t,e,i,s,n,o,a){const r=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],jp(i,t.angle,r,l));return{leaf:e,hinge:c,closedVector:jp(s,t.angle,r,l),quarterVector:jp([-s[1],s[0]],t.angle,r,l),turnDeg:n,bottom:o,top:a}}const Up=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Gp(t,e,i=Dp){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=Rp(e.hinge,e.bottom,i),a=Rp(n,e.bottom,i),r=Rp(n,e.top,i),l=Rp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${Up(o)} L ${Up(a)} L ${Up(r)} L ${Up(l)} Z`,shadowD:`M ${Up(Rp(e.hinge,0,i))} L ${Up(Rp(n,0,i))}`,depth:Math.max(o[1],a[1])}})}const Vp={window:120,door:90,passage:90,gate:300};function Kp(t){return Vp[t]}function Yp(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function Xp(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=Yp(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function Jp(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function Zp(t){const e=Xp(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,r=(t[0]-e.a[0])*o+(t[1]-e.a[1])*a,l=Math.max(0,Math.min(n,r)),c=e.a[0]+l*o,h=e.a[1]+l*a;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*a-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],a=e.b[1]-e.a[1],r=Math.hypot(o,a);if(!(r>1e-9))return!1;const l=o/r,c=a/r;for(const o of i){if(!o.open&&o.kind)continue;const i=Yp(o.a,o.b),a=i.b[0]-i.a[0],r=i.b[1]-i.a[1],h=Math.hypot(a,r);if(!(h>1e-9))continue;const d=a/h,u=r/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(Jp),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(Jp);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),a=o.filter(t=>t.target.partitionHost);if(a.length){if(1!==new Set(a.map(t=>t.target.partitionHost.id)).size||a.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=a[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),r=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,c=Math.abs(r*a-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*r);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:r,length:l}=n,c=r.b[0]-r.a[0],h=r.b[1]-r.a[1],d=c/l,u=h/l,p=r.partitionHost?r.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=r.a[0]+d*g,y=r.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,$=Math.max(0,w),x=Math.max(0,l-k),S=[r.a[0]+d*(w-$/2),r.a[1]+u*(w-$/2)],M=[r.a[0]+d*(k+x/2),r.a[1]+u*(k+x/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:r,...r.partitionHost?{host:{...r.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:$,midpoint:S},{distance:x,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function Qp(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const t_="1.65.0-beta.4",e_={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},i_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},s_=2e3,n_=1e3,o_=1500,a_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},r_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},l_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},c_=new Map;let h_=0;const d_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let u_=1e4;const p_="houseplan_card_layout_v1",__="houseplan_card_cfg_v1",g_="houseplan_card_zoom_v1",m_="houseplan_card_nav_v1",f_="houseplan_card_kiosk_v1",v_="houseplan_card_view_v1",y_=1e3,b_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],w_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},k_=new Set(["select","draw","partition","column","merge","split","resize","opening","boundary","wallthick","delroom"]),$_=2e3,x_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},S_=t=>{history.pushState(null,"",t),x_(window,"location-changed",{replace:!1})},M_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},C_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class D_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=gn(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...er},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new cp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new zu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new Xu(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++h_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"!==t.kind){if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+Mu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()}else this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0)},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=In(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Cn(t);e&&(Pn(t,e),Rn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new oh(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=M_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem(p_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=M_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=a_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?$l:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?$l:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=a_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&Ll(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const a=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=xl(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=a_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),a),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],a=s.points.slice(0,n+1),r=s.points.slice(n+1);if(a.length>=2&&o.push({id:s.id,points:a,segments:s.segments.slice(0,n)}),r.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:r,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>$_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Na(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:hs(this._settings,{bgColor:null})||null,northDeg:Ka(this._settings,{}),bgMode:Ya(this._settings,{}),sunRays:Xa(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=Yu(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),a=this.renderRoot.querySelector(".hp-backdrop"),r=this.renderRoot.querySelector(".zoomwrap"),l=r?getComputedStyle(r).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:np(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:a&&Number(getComputedStyle(a).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=Oi(this._baseVb(),s/Math.max(1,n)),a=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),r=o.w/a,l=o.h/a,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-r/2,y:h-l/2,w:r,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const a=this.renderRoot.querySelector(".editorchrome"),r=a?.querySelector(".editorchrome-inner"),l="view"===i?0:r?.scrollHeight||r?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:np(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}_slideTo(t,e){if(t===this._space)return;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate())}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new eh(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(v_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?Ap(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?Rp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return fp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,Ju.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=Qc(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=Ju.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=Qu(t).catch(()=>!1).then(t=>(i.resolved=t,t)),Ju.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>As(this._serverCfg)),this._config?.kiosk&&Number(this._config?.cycle)>0&&(clearInterval(this._cycleTimer),this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle))),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){xp.add(e);const i=Cp(t);return"undefined"==typeof window&&e(i),()=>{xp.delete(e)}}(t_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),a=/^[a-z]$/.test(o),r="z"===o||!a&&"KeyZ"===t.code,l="y"===o||!a&&"KeyY"===t.code,c=n&&(r&&t.shiftKey||l),h=n&&r&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"!==this._tool&&"partition"!==this._tool||!this._path.length?"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry():void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint());if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length||"partition"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"partition"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of c_.values())for(const e of t)clearTimeout(e.evict);c_.clear(),u_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of c_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:c_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t},this._config.kiosk&&(this._booting=!1,this._bootFading=!1),t.default_floor&&(this._space=t.default_floor);try{this._zoomBySpace=JSON.parse(localStorage.getItem(g_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(v_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Cp(t_);try{const t=JSON.parse(localStorage.getItem(f_)||"null");this._kioskScale={icon:zs(t?.icon),font:zs(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(__)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||ih(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||ih(this._layout),this._virtualLights=gn(t.virtual_lights,this._cfgRev),this._serverStorage=!0,this._adoptInitialSpace(this._model))}catch{}"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=d_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=c_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Xc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:a}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,a=0,r=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>a?(o=i,a=t,r=1):t===a&&r++)}return!o||r>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Xc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),this._warmKey=t,a?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=c_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},u_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);if(this._hashApplied||!this._model.find(t=>t.id===e.space))return void(this._warmVp=null);this._space=e.space,this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const i=this._effectiveProjection(),s=i===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=s&&e.view?{...e.view}:null,this._viewModeSnap=s&&e.snap?{...e.snap}:null,!s&&e.logicalCenter){const t="iso"===i?Rp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var n;this._tool="openwall"===(n=e.tool)||"closewall"===n?"boundary":"opening"===(n=function(t){return"partition"===t?"draw":t}(n))?"draw":"string"==typeof n&&k_.has(n)?n:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=d_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=c_.get(i)||[];for(s.push(this._warmSlot),c_.set(i,s),this._warmTrim(s);c_.size>8;){const t=c_.keys().next().value;if(void 0===t||t===i)break;for(const e of c_.get(t)||[])clearTimeout(e.evict);c_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>u_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=ih(this._serverCfg),this._layoutContentFingerprint=ih(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(yn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(__,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:fn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t){return function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t){const e=this._initialSpaceSelection(t);return e.id?(this._space=e.id,"hash"===e.source&&(this._hashApplied=!0),"saved"===e.source&&(this._navApplied=!0),e):e}_candidateBackdrop(t,e=this._space){const i=Vl(t),s=this._initialSpaceSelection(i).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===s)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return sh([this._cfgRev,this._cfgContentFingerprint||ih(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||ih(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
`}afterRender(){const t=this.host.root();this._blocked&&(this._openGroupId?this.closeGroup(!1):"palette"===this._currentModel?.kind&&this._currentModel.dismiss?.()),this._syncGlobalDismissListener();const e=t.querySelector(".editor-secondary"),i=this._renderedContext,s=e?.dataset.contextId||"";if(s&&i&&s!==i&&!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches&&(this._contentAnimation?.cancel(),this._contentAnimation=e?.querySelector(".editor-secondary-content")?.animate([{opacity:.35,transform:"translateY(-4px)"},{opacity:1,transform:"translateY(0)"}],{duration:100,easing:"ease-out"})),this._renderedContext=s,i&&s!==i&&this._focusOwned){const i=s?e?.querySelector('[tabindex="0"], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled])'):t.querySelector(".editbar-tools");i?.focus?.(),this._focusOwned=!!s}if("palette"===this._currentModel?.kind&&this._currentModel.launcherId){const e=[...t.querySelectorAll("[data-editor-palette]")].find(t=>t.dataset.editorPalette===this._currentModel?.launcherId);e&&null!==e.offsetParent||this._currentModel.dismiss?.()}if(!this._openGroupId)return;const n=[...t.querySelectorAll("[data-editor-group]")].find(t=>t.dataset.editorGroup===this._openGroupId);n&&null!==n.offsetParent||this.closeGroup(!0)}handleOutsideDismiss(t){if(Fu(t,t=>t.hasAttribute("data-editor-navigation")))return"pointerdown"===t.type?this.closeForNavigation():"click"===t.type&&this._dismissPointerTarget&&this._clearDismissClick(),!1;if("click"===t.type&&this._dismissPointerTarget){return!!(t.composedPath?.()||[t.target]).includes(this._dismissPointerTarget)&&(this._clearDismissClick(),t.preventDefault(),t.stopImmediatePropagation(),!0)}const e=this._openGroupId||this._blocked||"palette"!==this._currentModel?.kind?null:this._currentModel;if("pointerdown"===t.type&&(this._openGroupId||e)){const i=Fu(t,t=>t.classList.contains("editor-secondary")),s=Fu(t,t=>!!t.dataset.editorGroup),n=Fu(t,t=>!!t.dataset.editorPalette),o=Fu(t,t=>t.classList.contains("stage"));if(!(i||s||n||"stay-open-on-canvas"===e?.dismissPolicy&&o))return t.preventDefault(),t.stopImmediatePropagation(),this._dismissPointerTarget=t.target,clearTimeout(this._dismissTimer),this._dismissTimer=window.setTimeout(()=>{this._clearDismissClick()},800),this._openGroupId?this.closeGroup(!1):e?.dismiss?.(),this._syncGlobalDismissListener(),!0}return!1}_activateGroupItem(t,e,i){if(t.id!==this._openGroupId)return;const s=t.items.find(t=>t.id===e);if(!s||s.disabled)return;const n="toggle"===s.role&&"stay-open"===s.closePolicy,o=0===i.detail;n||(this._openGroupId=null,this.host.requestUpdate(),this._syncGlobalDismissListener()),s.invoke(),!n&&o&&this.host.updateComplete().then(()=>{const e=[...this.host.root().querySelectorAll("[data-editor-group]")].find(e=>e.dataset.editorGroup===t.id&&null!==e.offsetParent);e?.focus()})}_groupKeydown(t){if(!["ArrowLeft","ArrowRight","Home","End"].includes(t.key))return;const e=[...t.currentTarget.querySelectorAll(".editor-group-item:not([disabled])")];if(!e.length)return;t.preventDefault();const i=e.indexOf(this.host.root().activeElement),s="Home"===t.key?0:"End"===t.key?e.length-1:"ArrowLeft"===t.key?i<=0?e.length-1:i-1:(i+1)%e.length;e[s]?.focus()}_clearDismissClick(){this._dismissPointerTarget=null,clearTimeout(this._dismissTimer),this._dismissTimer=void 0,this._syncGlobalDismissListener()}_syncGlobalDismissListener(){const t=!this._blocked&&"palette"===this._currentModel?.kind,e=!!this._openGroupId||t||!!this._dismissPointerTarget;e!==this._globalDismissListening&&(this._globalDismissListening=e,e?(window.addEventListener("pointerdown",this._globalDismissGuard,!0),window.addEventListener("click",this._globalDismissGuard,!0)):(window.removeEventListener("pointerdown",this._globalDismissGuard,!0),window.removeEventListener("click",this._globalDismissGuard,!0)))}}const Ou=t=>t.stopPropagation(),Hu=4.166666666666667e-9;function Nu(t){if(!Number.isFinite(t))return t;const e=Math.round(t/Zl)*Zl;return Math.abs(e-t)<=Hu?t:e}const Lu=(t,e,i,s)=>Math.hypot(i-t,s-e),Bu=(t,e,i,s,n,o,a,r)=>Math.hypot(Math.max(Math.abs(n-t),Math.abs(n+a-(t+i))),Math.max(Math.abs(o-e),Math.abs(o+r-(e+s)))),qu=(t,e,i,s,n,o,a)=>{const r=Math.max(Number(s)||0,0)/2,l=Math.PI/180,c=Math.cos(i*l)*r,h=Math.sin(i*l)*r,d=Math.cos(a*l)*r,u=Math.sin(a*l)*r,p=Math.max(Lu(t+c,e+h,n+d,o+u),Lu(t-c,e-h,n-d,o-u)),_=Math.max(Lu(t+c,e+h,n-d,o-u),Lu(t-c,e-h,n+d,o+u));return Math.min(p,_)},ju=t=>{const e=Number(t?.cell_cm);return e>0?e:5};const Wu=t=>JSON.parse(JSON.stringify(t)),Uu=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Gu=(t,e,i)=>Math.min(i,Math.max(e,t)),Vu=t=>Vl({spaces:[t]})[0],Ku=t=>{const e=[];for(const i of t||[]){const t=hi(i);if(t?.length)for(let i=0;i{let e=0,i=0,s=0;for(const i of t.markers||[]){if("ripple"===i.display&&(i.display="icon_ripple",e++),Array.isArray(i.controls)){const t="string"==typeof i.binding&&i.binding.startsWith("entity:")?i.binding.slice(7):"",s=t?i.controls.filter(e=>e!==t):i.controls;JSON.stringify(s)!==JSON.stringify(i.controls)&&(i.controls=s.length?s:null,e++)}const t=i.vacuum;t&&Uu(t,"trail")&&(["never","cleaning","always"].includes(t.trail_mode)||(t.trail_mode=!1===t.trail?"never":"cleaning"),delete t.trail,e++)}for(const n of t.spaces||[]){const t=n.settings;"glow"===t?.fill_mode&&("boolean"!=typeof t.glow_enabled&&(t.glow_enabled=!0),t.fill_mode="none",e++,i++);for(const t of n.rooms||[]){const i=t.settings;"glow"===i?.fill_mode&&("boolean"!=typeof i.glow&&(i.glow=!0),delete i.fill_mode,e++,s++)}if(Uu(n,"segments")&&(delete n.segments,e++),Uu(n,"plan_scale")){const t=Number(n.plan_scale);Number.isFinite(t)&&t>=jl&&t<=Wl&&(Uu(n,"plan_scale_x")||(n.plan_scale_x=t),Uu(n,"plan_scale_y")||(n.plan_scale_y=t),delete n.plan_scale,e++)}const o=Number(n.cell_cm);Uu(n,"cell_cm")&&(!Number.isFinite(o)||o<.1||o>1e3)&&(n.cell_cm=Number.isFinite(o)&&o>0?Gu(o,.1,1e3):5,e++);const a=Number(n.cell_cm),r=Number.isFinite(a)&&a>0?a:5;for(const t of n.wall_columns||[])if("circle"===t.shape)Uu(t,"angle")&&(delete t.angle,e++);else if("square"===t.shape&&Uu(t,"angle")){const i=((Number(t.angle)||0)%90+90)%90;t.angle!==i&&(t.angle=i,e++)}for(const t of n.decor||[]){if(Uu(t,"width")){const i=Number(t.width);(Uu(t,"width_cm")||Number.isFinite(i))&&(Uu(t,"width_cm")||(t.width_cm=Number(Gu(i/Jl*r,.1,100).toFixed(6))),delete t.width,e++)}if("rect"!==t?.kind&&"ellipse"!==t?.kind||!0!==t.fill||(Uu(t,"fill_color")||(t.fill_color=t.color||"#607d8b",e++),Uu(t,"fill_opacity")||(t.fill_opacity=.25,e++)),"text"!==t?.kind)continue;void 0===t.size_cm?(t.size_cm=Number(Gu(es*is(t)/Jl*r,.1,2e3).toFixed(6)),delete t.scale,delete t.size,e++):(Uu(t,"scale")||Uu(t,"size"))&&(delete t.scale,delete t.size,e++);let i=String(t.text??"");const s=[...i.matchAll(/\{([^{}\r\n]+)\}/g)].some(t=>!!Yi(t[1]));if(!(Uu(t,"entity")||Uu(t,"attr")||Uu(t,"unit")))continue;const n=String(t.unit??"").trim(),o="state"===String(t.attr??"").trim().toLowerCase()?null:t.attr,a=s||n?"":Xi(t.entity,o);if(s||a){if(a){const e=i.indexOf("{}");i=e>=0?i.slice(0,e)+a+i.slice(e+2):`${i}${i?" ":""}${a}`,t.text=i}delete t.entity,delete t.attr,delete t.unit,e++}}}return{total:e,glowSpaces:i,glowRooms:s}})(i);let r=a.total;for(const t of i.spaces||[]){const e=Vu(t);if(!e)continue;if(!Fc(t.open_spans).length){const i=Lc(e.rooms,null,Bl,.02*Jl,!0);i.length&&(t.open_spans=Bc(i,Bl),r++)}}const l=Wu(i.spaces||[]),c=function(t,e){const i=JSON.parse(JSON.stringify(t||[])),s=JSON.parse(JSON.stringify(e||{}));let n=0,o=0,a=0,r=0,l="",c=0,h=0;const d={};let u=5;for(const t of i){const e=ju(t);null!=t?.id&&(d[String(t.id)]=e),e>u&&(u=e)}const p=(t,e,i,s=!1)=>{if(!(t>Hu||s))return;n++,t>a&&(a=t);const o=t*Xl*e;o>r&&(r=o,l=i)};for(const t of i){const e=ju(t),i=null!=t?.id?String(t.id):"";for(const s of t.rooms||[]){o++;let t=0;if(s.poly?.length)s.poly=s.poly.map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i});else if(null!=s.x&&null!=s.y){const e=s.x,i=s.y,n=s.w||0,o=s.h||0,a=Nu(e+n),r=Nu(i+o),l=Nu(e),c=Nu(i),h=Math.max(Zl,a-l),d=Math.max(Zl,r-c);t=Bu(e,i,n,o,l,c,h,d),s.x=l,s.y=c,s.w=h,s.h=d}p(t,e,i)}for(const s of t.room_drafts||[]){o++;let t=0;const n=(s.points||[]).map(e=>{const i=[Nu(e[0]),Nu(e[1])];return t=Math.max(t,Lu(e[0],e[1],i[0],i[1])),i}),a=n.length?[n[0]]:[],r=[];for(let t=0;t+1t.points?.length>=2),h+=e-t.room_drafts.length,t.room_drafts.length||delete t.room_drafts}for(const s of t.partitions||[]){o++;const n=[Nu(s.a[0]),Nu(s.a[1])],a=[Nu(s.b[0]),Nu(s.b[1])];let r=Math.max(Lu(s.a[0],s.a[1],n[0],n[1]),Lu(s.b[0],s.b[1],a[0],a[1]));const l=Lu(n[0],n[1],a[0],a[1]),c=(t.openings||[]).filter(t=>"partition"===t.host?.kind&&t.host.id===s.id).every(t=>{const e=Number(t.length),i=Number(t.host.t),s=i*l;return Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>=0&&i<=1&&s-e/2>=-Hu&&s+e/2<=l+Hu});l>Hu&&c?(s.a=n,s.b=a):r=0,p(r,e,i)}for(const s of t.wall_columns||[]){o++;const t=[Nu(s.center[0]),Nu(s.center[1])],n=Lu(s.center[0],s.center[1],t[0],t[1]);s.center=t,p(n,e,i)}for(const s of t.decor||[]){o++;let t=0;if("line"===s.kind){const e=[Nu(s.x1),Nu(s.y1)],i=[Nu(s.x2),Nu(s.y2)];t=Math.max(Lu(s.x1,s.y1,e[0],e[1]),Lu(s.x2,s.y2,i[0],i[1])),s.x1=e[0],s.y1=e[1],s.x2=i[0],s.y2=i[1]}else{const e=Nu(s.x),i=Nu(s.y);if(null!=s.w&&null!=s.h){const n=Nu(s.x+s.w),o=Nu(s.y+s.h),a=Math.max(Zl,n-e),r=Math.max(Zl,o-i);t=Bu(s.x,s.y,s.w,s.h,e,i,a,r),s.w=a,s.h=r}else t=Lu(s.x,s.y,e,i);s.x=e,s.y=i}p(t,e,i)}for(const s of t.openings||[]){if(o++,"partition"===s.host?.kind){const n=(t.partitions||[]).find(t=>t.id===s.host.id),o=Number(s.host.t);if(!n||!Number.isFinite(o)||o<0||o>1)continue;const a=n.b[0]-n.a[0],r=n.b[1]-n.a[1];if(Math.hypot(a,r)<=Hu)continue;const l=n.a[0]+a*o,h=n.a[1]+r*o;let d=180*Math.atan2(r,a)/Math.PI;d>=90?d-=180:d<-90&&(d+=180);const u=Number(s.angle),_=!(Number.isFinite(u)&&u===d),g=qu(s.x,s.y,Number.isFinite(u)?u:d,Number(s.length)||0,l,h,d);s.x=l,s.y=h,s.angle=d,_&&c++,p(g,e,i,_);continue}const n=pi([s.x,s.y],t.rooms||[],.025,{step:Zl,length:Number(s.length)||0});if(!n)continue;const a=Number(s.angle),r=!(Number.isFinite(a)&&a===n.angle),l=qu(s.x,s.y,Number.isFinite(a)?a:n.angle,Number(s.length)||0,n.x,n.y,n.angle);s.x=n.x,s.y=n.y,s.angle=n.angle,r&&c++,p(l,e,i,r)}}for(const[t,e]of Object.entries(s)){if(!e||"object"!=typeof e)continue;const i=e;if("number"!=typeof i.x||"number"!=typeof i.y)continue;o++;const n=Nu(i.x),a=Nu(i.y),r=Lu(i.x,i.y,n,a);s[t]={...i,x:n,y:a};const l="string"==typeof i.s?i.s:"";p(r,d[l]??u,l)}return{spaces:i,layout:s,report:{moved:n,total:o,maxShift:a,maxShiftCm:r,maxSpace:l,rotated:c,removedDrafts:h},changed:n>0}}(i.spaces||[],e||{});i.spaces=c.spaces;const h={...c.report};let d=0,u=0,p=0;for(let t=0;t[t.id,t.open_to||[]]),walls:e.walls||[]}),o=Vu(e),a=Vu(s);if(!o||!a)continue;const r=Ku(o.rooms),c=Ku(a.rooms),_=.02*Jl;let g=Yc(Fc(e.open_spans),r,c,Bl);const m=g.length;g=Kc(g,a.rooms,Bl,_),g=g.map(t=>{const e=Ic(t,Bl),i=[e[0],e[1]],n=[e[2],e[3]],o=[(e[0]+e[2])/2,(e[1]+e[3])/2],a=e[2]-e[0],r=e[3]-e[1],l=Math.hypot(a,r)||1,d=c.map(([t,e])=>[t[0],t[1],e[0],e[1]]).filter(t=>{const e=t[2]-t[0],s=t[3]-t[1],c=Math.hypot(e,s)||1;return Math.abs(a*s-r*e)/(l*c)<=1e-6&&zc(o,t).d<=4*_&&zc(i,t).d<=4*_&&zc(n,t).d<=4*_}).sort((t,e)=>Math.hypot(e[2]-e[0],e[3]-e[1])-Math.hypot(t[2]-t[0],t[3]-t[1]))[0];if(h.total++,!d)return t;const u=[[d[0],d[1]],[d[2],d[3]]],p=Hc(i,d,u,Jl,2*_),g=Hc(n,d,u,Jl,2*_);if(Math.hypot(g[0]-p[0],g[1]-p[1])<.5*Jl)return t;const m=Math.max(Math.hypot(p[0]-i[0],p[1]-i[1]),Math.hypot(g[0]-n[0],g[1]-n[1]));if(m>1e-6*Jl){h.moved++;const t=m/Bl;t>h.maxShift&&(h.maxShift=t);const e=m/Jl*(Number(s.cell_cm)>0?Number(s.cell_cm):5);e>h.maxShiftCm&&(h.maxShiftCm=e,h.maxSpace=String(s.id||""))}return Ac(p,g,Bl)}),g=Kc(g,a.rooms,Bl,_),u+=Math.max(0,m-g.length);const f=g.map(t=>Ic(t,Bl));g.length?s.open_spans=g:delete s.open_spans,qc(s.rooms||[],a.rooms,f,_);const v=Array.isArray(e.walls)?e.walls.length:0;let y=Rr(e.walls,r,c,Zl,Bl);y=el(a.rooms,y,f,Zl,Number(s.cell_cm)>0?Number(s.cell_cm):5,Jl,Bl),y=Tr(y,s.rooms||[],Zl,1,f.map(t=>[t[0]/Bl,t[1]/Bl,t[2]/Bl,t[3]/Bl])),d+=Math.max(0,v-y.length),y.length?s.walls=y:delete s.walls;const b=JSON.stringify({spans:s.open_spans||[],links:(s.rooms||[]).map(t=>[t.id,t.open_to||[]]),walls:s.walls||[]});b!==n&&p++}const _=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n;o<6&&_&&(i.model_version=6);const g=JSON.stringify(i)!==s||JSON.stringify(c.layout)!==n,m=Number.isInteger(Number(i.model_version))?Number(i.model_version):o;return{config:i,layout:c.layout,report:{...h,modelFrom:o,modelTo:m,migrated:r,glowSpacesMigrated:a.glowSpaces,glowRoomsMigrated:a.glowRooms,canonicalized:p,wallsMerged:d,spansMerged:u},changed:g}}class Xu{constructor(t=50){this._undo=[],this._redo=[],this._limit=Math.max(30,Math.floor(t))}get canUndo(){return this._undo.length>0}get canRedo(){return this._redo.length>0}get undoName(){return this._undo[this._undo.length-1]?.name??null}get redoName(){return this._redo[this._redo.length-1]?.name??null}get size(){return this._undo.length}push(t){this._undo.push(t),this._undo.length>this._limit&&this._undo.splice(0,this._undo.length-this._limit),this._redo=[]}undo(){const t=this._undo.pop()??null;return t&&this._redo.push(t),t}redo(){const t=this._redo.pop()??null;return t&&this._undo.push(t),t}clear(){this._undo=[],this._redo=[]}}const Ju=new WeakMap;const Zu=(t,e,i)=>255===t[i+3]&&e.every((e,s)=>Math.abs(t[i+s]-e)<=2);async function Qu(t){const e=t.defaultView;if(!e||!e.CSS?.supports?.("mix-blend-mode","screen"))return!1;const i=[128,32,16],s=[16,64,128],n=[9,19,29],o=`\n \n \n \n \n \n `,a=e.URL.createObjectURL(new Blob([o],{type:"image/svg+xml"}));try{const o=await new Promise((t,i)=>{const s=new e.Image,n=e.setTimeout(()=>i(new Error("SVG blend probe timeout")),1e3);s.onload=()=>{e.clearTimeout(n),t(s)},s.onerror=()=>{e.clearTimeout(n),i(new Error("SVG blend probe failed"))},s.src=a}),r=t.createElement("canvas");r.width=4,r.height=1;const l=r.getContext("2d",{willReadFrequently:!0});if(!l)return!1;l.drawImage(o,0,0,4,1);const c=l.getImageData(0,0,4,1).data;return Zu(c,i,0)&&Zu(c,function(t,e){return[0,1,2].map(i=>Math.round(255-(255-t[i])*(255-e[i])/255))}(i,s),4)&&Zu(c,s,8)&&Zu(c,n,12)}catch{return!1}finally{e.URL.revokeObjectURL(a)}}const tp={now:()=>performance.now(),requestFrame:t=>requestAnimationFrame(t),cancelFrame:t=>cancelAnimationFrame(t)},ep=t=>Math.max(0,Math.min(1,t)),ip=(t,e,i)=>t+(e-t)*i,sp=(t,e,i)=>{const s=1-t;return 3*s*s*t*e+3*s*t*t*i+t*t*t};function np(t,e){return{centerX:t.x+t.w/2,centerY:t.y+t.h/2,pixelsPerUnit:e>0&&t.w>0?e/t.w:1,viewBox:{...t}}}function op(t,e,i){const s=Math.max(1e-9,t.pixelsPerUnit),n=Math.max(1e-9,e/s),o=Math.max(1e-9,i/s);return{x:t.centerX-n/2,y:t.centerY-o/2,w:n,h:o}}function ap(t){const e=t.trim(),i=/^rgba?\(\s*([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)(?:\s*[,/]\s*([\d.]+))?\s*\)$/i.exec(e);if(i)return[Number(i[1]),Number(i[2]),Number(i[3]),null==i[4]?1:Number(i[4])];const s=/^#([0-9a-f]{6}|[0-9a-f]{8})$/i.exec(e)?.[1];return s?[parseInt(s.slice(0,2),16),parseInt(s.slice(2,4),16),parseInt(s.slice(4,6),16),8===s.length?parseInt(s.slice(6,8),16)/255:1]:null}function rp(t,e,i){const s=ap(t),n=ap(e);if(!s||!n)return i<.5?t:e;const o=ep(i);return`rgba(${Math.round(ip(s[0],n[0],o))}, ${Math.round(ip(s[1],n[1],o))}, ${Math.round(ip(s[2],n[2],o))}, ${ip(s[3],n[3],o).toFixed(3)})`}function lp(t,e,i){const s=(t=>{const e=ep(t);if(0===e||1===e)return e;let i=0,s=1,n=e;for(let t=0;t<12;t++)n=(i+s)/2,sp(n,.2,.2){const e=this._state;if(!e||e.token!==n)return;const i=ep((t-e.startedAt)/e.duration);e.presented=i>=1?e.to:lp(e.from,e.to,i),e.phase=i>=1?"settling":"running",this._hooks.frame(e),i<1?this._raf=this._clock.requestFrame(a):(this._raf=0,this._hooks.settled(e),this._state?.token===n&&(this._state=null))};return this._raf=this._clock.requestFrame(a),n}cancel(t=!0){this._raf&&this._clock.cancelFrame(this._raf),this._raf=0;const e=this._state;this._state=null,this._token++,e&&t&&(e.phase="settling",e.presented=e.to,this._hooks.frame(e),this._hooks.settled(e))}dispose(){this.cancel(!1)}}const hp="houseplan_card_labs_v1",dp=Object.freeze([Object.freeze({id:"iso",issue:89,since:"1.62.0",expires:"1.65.0",summary:"Volumetric plan renderer"})]);function up(t){const e=/^(\d+)\.(\d+)\.(\d+)(?:-[0-9A-Za-z.-]+)?$/.exec(String(t||"").trim());if(!e)return null;const i=e.slice(1).map(Number);return i.every(t=>Number.isSafeInteger(t))?i:null}function pp(t,e){for(let i=0;i<3;i++)if(t[i]!==e[i])return t[i]t.split(",")).map(t=>t.trim()).filter(Boolean)}function yp(t,e,i,s=dp){const n=function(t,e=dp){const i=up(t),s=new Map;if(!i||!gp(e))return s;for(const t of e){const e=up(t.since),n=up(t.expires);pp(i,e)>=0&&pp(i,n)<0&&s.set(t.id,t)}return s}(i,s),o=new Set(gp(s)?s.map(t=>t.id):[]),a=new Set(function(t){if(!t)return[];try{const e=JSON.parse(t);return Array.isArray(e)?e.filter(t=>"string"==typeof t):[]}catch{return[]}}(e).filter(t=>n.has(t)));let r=!1;const l=t=>{if("off"===t)return a.clear(),void(r=!0);const e=t.startsWith("-"),i=e?t.slice(1):t;o.has(i)&&(r=!0,e||!n.has(i)?a.delete(i):a.add(i))};for(const e of vp(new URLSearchParams(String(t.search||"").replace(/^\?/,""))))l(e);for(const e of vp(mp(t.hash)))l(e);const c=Object.freeze([...a].sort());return{active:c,space:fp(t.hash),persist:r?JSON.stringify(c):void 0,knownUrlOperation:r}}let bp={active:Object.freeze([]),space:""},wp="",kp=!1,$p="";const xp=new Set;function Sp(){if("undefined"==typeof window)return bp;const t=yp(window.location,function(){try{return window.localStorage.getItem(hp)}catch{return null}}(),wp);void 0!==t.persist&&function(t){try{window.localStorage.setItem(hp,t)}catch{}}(t.persist),bp={active:t.active,space:t.space},window.__hpLabs=t.active;for(const t of xp)t(bp);return bp}function Mp(){Sp()}function Cp(t){return wp=t,"undefined"==typeof window?bp:(kp||(kp=!0,window.addEventListener("hashchange",Mp),window.addEventListener("popstate",Mp)),Sp())}const Dp=Object.freeze({rotDeg:0,tiltDeg:20,xyScale:1,zScale:1,origin:Object.freeze([500,500])}),Tp=64;function Pp(t){return[t.rotDeg,t.tiltDeg,t.xyScale,t.zScale,t.origin[0],t.origin[1]].every(Number.isFinite)&&Math.abs(t.xyScale)>1e-12&&Math.abs(Math.cos(t.tiltDeg*Math.PI/180))>1e-12}function Rp(t,e,i=Dp){if(!(Pp(i)&&Number.isFinite(t[0])&&Number.isFinite(t[1])&&Number.isFinite(e)))throw new Error("invalid isometric projection input");const s=i.rotDeg*Math.PI/180,n=i.tiltDeg*Math.PI/180,o=t[0]-i.origin[0],a=t[1]-i.origin[1],r=(o*Math.cos(s)-a*Math.sin(s))*i.xyScale,l=(o*Math.sin(s)+a*Math.cos(s))*i.xyScale;return[i.origin[0]+r,i.origin[1]+l*Math.cos(n)-e*i.zScale*Math.sin(n)]}function Ap(t,e=Dp){if(!Pp(e)||!Number.isFinite(t[0])||!Number.isFinite(t[1]))throw new Error("invalid isometric projection input");const i=e.rotDeg*Math.PI/180,s=e.tiltDeg*Math.PI/180,n=(t[0]-e.origin[0])/e.xyScale,o=(t[1]-e.origin[1])/(e.xyScale*Math.cos(s));return[e.origin[0]+n*Math.cos(i)+o*Math.sin(i),e.origin[1]-n*Math.sin(i)+o*Math.cos(i)]}function Ip(t=Dp){return`matrix(${function(t=Dp){if(!Pp(t))throw new Error("invalid isometric camera");const e=t.rotDeg*Math.PI/180,i=t.tiltDeg*Math.PI/180,s=t.xyScale*Math.cos(e),n=-t.xyScale*Math.sin(e),o=t.xyScale*Math.sin(e)*Math.cos(i),a=t.xyScale*Math.cos(e)*Math.cos(i);return[s,o,n,a,t.origin[0]-s*t.origin[0]-n*t.origin[1],t.origin[1]-o*t.origin[0]-a*t.origin[1]]}(t).map(t=>Number(t.toFixed(12))).join(" ")})`}function Ep(t,e=Dp){const{rect:i,wallHeight:s}=t,n=t.openingHeight??s,o=t.floorDepth??0;if(!(i.w>=0)||!(i.h>=0)||!Number.isFinite(s)||!Number.isFinite(n)||!Number.isFinite(o)||s<0||n<0||o<0)throw new Error("invalid isometric frame");const a=[[i.x,i.y],[i.x+i.w,i.y],[i.x+i.w,i.y+i.h],[i.x,i.y+i.h]],r=Math.max(s,n),l=a.flatMap(t=>[Rp(t,-o,e),Rp(t,r,e)]),c=l.map(t=>t[0]),h=l.map(t=>t[1]),d=Math.min(...c),u=Math.min(...h);return{x:d,y:u,w:Math.max(...c)-d,h:Math.max(...h)-u}}const Fp=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function zp(t){let e=0;for(let i=0;iArray.isArray(t)&&Number.isFinite(t[0])&&Number.isFinite(t[1])).map(t=>[Number(t[0]),Number(t[1])]),i=e[e.length-1];return e.length>1&&e[0][0]===i[0]&&e[0][1]===i[1]&&e.pop(),e}(t);if(i.length<3)return[];const s=!e;return zp(i)>0===s?i:[...i].reverse()}function Hp(t,e,i){return t.length?`M ${t.map(t=>Fp(Rp(t,i,e))).join(" L ")} Z`:""}function Np(t,e,i){const s=e[1]-t[1],n=-(e[0]-t[0]),o=i.rotDeg*Math.PI/180;return s*Math.sin(o)+n*Math.cos(o)}function Lp(t,e,i=Dp){if(!Number.isFinite(e)||e<0)throw new Error("invalid floor edge height");const s=(t||[]).map(t=>(t||[]).map((t,e)=>function(t,e){const i=Op(t,e);if(!i.length)return i;let s=0;for(let t=1;t0)).filter(t=>t.length>=3&&Math.abs(zp(t))>=1e-9)).filter(t=>t.length&&zp(t[0])>0);s.sort((t,e)=>{const i=t[0][0],s=e[0][0];return i[0]-s[0]||i[1]-s[1]||Math.abs(zp(e[0]))-Math.abs(zp(t[0]))});const n=[],o=[];let a=0;for(let t=0;tt.depth-e.depth||t.component-e.component||t.edge-e.edge),{footprintPath:n.join(" "),sides:o,componentCount:s.length,edgeCount:a}}function Bp(t,e){return t^=Math.round(64*(Number.isFinite(e)?e:0)),Math.imul(t,16777619)>>>0}const qp=t=>t.every(Number.isFinite);function jp(t,e,i,s){const n=t[0]*i,o=t[1]*s,a=e*Math.PI/180;return[n*Math.cos(a)-o*Math.sin(a),n*Math.sin(a)+o*Math.cos(a)]}function Wp(t,e,i,s,n,o,a){const r=t.flipH?-1:1,l=t.flipV?-1:1,c=function(t,e){return[t[0]+e[0],t[1]+e[1]]}([t.x+t.face.ox,t.y+t.face.oy],jp(i,t.angle,r,l));return{leaf:e,hinge:c,closedVector:jp(s,t.angle,r,l),quarterVector:jp([-s[1],s[0]],t.angle,r,l),turnDeg:n,bottom:o,top:a}}const Up=t=>`${Number(t[0].toFixed(4))} ${Number(t[1].toFixed(4))}`;function Gp(t,e,i=Dp){const s=Math.max(0,Math.min(1,Number.isFinite(e)?e:0));return t.leaves.map(e=>{const n=function(t,e){const i=t.turnDeg*e*Math.PI/180;return[t.hinge[0]+t.closedVector[0]*Math.cos(i)+t.quarterVector[0]*Math.sin(i),t.hinge[1]+t.closedVector[1]*Math.cos(i)+t.quarterVector[1]*Math.sin(i)]}(e,s),o=Rp(e.hinge,e.bottom,i),a=Rp(n,e.bottom,i),r=Rp(n,e.top,i),l=Rp(e.hinge,e.top,i);return{id:t.id,sourceIndex:t.sourceIndex,type:t.type,leaf:e.leaf,d:`M ${Up(o)} L ${Up(a)} L ${Up(r)} L ${Up(l)} Z`,shadowD:`M ${Up(Rp(e.hinge,0,i))} L ${Up(Rp(n,0,i))}`,depth:Math.max(o[1],a[1])}})}const Vp={window:120,door:90,passage:90,gate:300};function Kp(t){return Vp[t]}function Yp(t,e){const i=[t[0],t[1]],s=[e[0],e[1]];return function(t,e){return t[0]-e[0]||t[1]-e[1]}(i,s)<=0?{a:i,b:s}:{a:s,b:i}}function Xp(t){const e=new Map;return t.forEach((t,i)=>{if(!t.kind||t.open)return;const s=Yp(t.a,t.b);if(Math.hypot(s.b[0]-s.a[0],s.b[1]-s.a[1])<=1e-9)return;const n=function(t,e){const i=t=>(Math.abs(t)<=5e-10?0:Math.round(1e6*t)/1e6).toFixed(6);return`${i(t[0])},${i(t[1])}>${i(e[0])},${i(e[1])}`}(s.a,s.b),o=e.get(n);if(o)return o.physicalHalfWidth=Math.max(o.physicalHalfWidth,t.half||0),o.sourceOrder=Math.min(o.sourceOrder,i),void(t.partitionHost&&(o.partitionHost&&o.partitionHost.id!==t.partitionHost.id?o.ambiguousPartitionHost=!0:o.partitionHost=t.partitionHost));e.set(n,{segmentKey:n,a:s.a,b:s.b,physicalHalfWidth:Math.max(0,t.half||0),sourceOrder:i,...t.partitionHost?{partitionHost:t.partitionHost}:{}})}),[...e.values()]}function Jp(t,e){if(Math.abs(t.distance-e.distance)>1e-9)return t.distance-e.distance;if(Math.abs(t.perpendicular-e.perpendicular)>1e-9)return t.perpendicular-e.perpendicular;return(t.target.segmentKeye.target.segmentKey?1:0)||t.target.sourceOrder-e.target.sourceOrder}function Zp(t){const e=Xp(t.intervals).map(e=>{const i=function(t,e){const i=e.b[0]-e.a[0],s=e.b[1]-e.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,r=(t[0]-e.a[0])*o+(t[1]-e.a[1])*a,l=Math.max(0,Math.min(n,r)),c=e.a[0]+l*o,h=e.a[1]+l*a;return{along:l,length:n,x:c,y:h,distance:Math.hypot(t[0]-c,t[1]-h),perpendicular:Math.abs((t[0]-e.a[0])*a-(t[1]-e.a[1])*o)}}(t.pointer,e);return{target:e,...i,envelope:Math.max(t.baseTolerance,e.physicalHalfWidth+t.bodyPointerPadding)}}).filter(t=>t.distance<=t.envelope+1e-9).filter(e=>!function(t,e,i,s,n){const o=e.b[0]-e.a[0],a=e.b[1]-e.a[1],r=Math.hypot(o,a);if(!(r>1e-9))return!1;const l=o/r,c=a/r;for(const o of i){if(!o.open&&o.kind)continue;const i=Yp(o.a,o.b),a=i.b[0]-i.a[0],r=i.b[1]-i.a[1],h=Math.hypot(a,r);if(!(h>1e-9))continue;const d=a/h,u=r/h;if(Math.abs(l*u-c*d)>1e-6)continue;if(Math.abs((i.a[0]-e.a[0])*c-(i.a[1]-e.a[1])*l)>n)continue;const p=(t[0]-i.a[0])*d+(t[1]-i.a[1])*u,_=1e-9;if(!(p<=_||p>=h-_)&&Math.abs((t[0]-i.a[0])*u-(t[1]-i.a[1])*d)<=s+1e-9)return!0}return!1}(t.pointer,e.target,t.intervals,e.envelope,Math.max(1e-9,Math.min(t.baseTolerance,.04*t.gridStep)))),i=e.filter(e=>!!e.target.partitionHost&&t.renderedLength+2*e.target.physicalHalfWidth>e.length+1e-9).sort(Jp),s=e.filter(e=>!e.target.partitionHost||t.renderedLength+2*e.target.physicalHalfWidth<=e.length+1e-9).sort(Jp);let n=s[0];if(!n)return{candidate:null,jambBlockedTarget:i[0]?.target||null};const o=s.filter(t=>Math.abs(t.distance-n.distance)<=1e-9&&Math.abs(t.perpendicular-n.perpendicular)<=1e-9),a=o.filter(t=>t.target.partitionHost);if(a.length){if(1!==new Set(a.map(t=>t.target.partitionHost.id)).size||a.some(t=>t.target.ambiguousPartitionHost))return{candidate:null,jambBlockedTarget:null};const t=a[0],e=t.target.b[0]-t.target.a[0],i=t.target.b[1]-t.target.a[1],s=Math.hypot(e,i),r=e/s,l=i/s;if(!o.every(e=>{const i=e.target.b[0]-e.target.a[0],s=e.target.b[1]-e.target.a[1],n=Math.hypot(i,s),o=i/n,a=s/n,c=Math.abs(r*a-l*o)<=1e-6,h=Math.abs((e.target.a[0]-t.target.a[0])*l-(e.target.a[1]-t.target.a[1])*r);return c&&h<=1e-9}))return{candidate:null,jambBlockedTarget:null};n=t}if(n.target.ambiguousPartitionHost)return{candidate:null,jambBlockedTarget:null};const{target:r,length:l}=n,c=r.b[0]-r.a[0],h=r.b[1]-r.a[1],d=c/l,u=h/l,p=r.partitionHost?r.physicalHalfWidth:0,_=Math.min(Math.max(0,t.renderedLength)/2+p,l/2);let g=n.along;const m=Math.max(t.gridStep,1e-9),f=l/2;g=Math.abs(g-f)<=m/2?f:Math.round(g/m)*m,g=Math.max(_,Math.min(l-_,g));const v=r.a[0]+d*g,y=r.a[1]+u*g,b=Math.max(0,t.renderedLength)/2,w=g-b,k=g+b,$=Math.max(0,w),x=Math.max(0,l-k),S=[r.a[0]+d*(w-$/2),r.a[1]+u*(w-$/2)],M=[r.a[0]+d*(k+x/2),r.a[1]+u*(k+x/2)];let C=180*Math.atan2(h,c)/Math.PI;C>=90?C-=180:C<-90&&(C+=180);const D=Math.abs(g-f)<=1e-9;return{candidate:{presetRevision:t.preset.revision,geometryRevision:t.geometryRevision,pointer:[t.pointer[0],t.pointer[1]],type:t.preset.type,lengthCm:t.preset.lengthCm,flipH:t.preset.flipH,flipV:t.preset.flipV,x:v,y:y,angle:C,renderedLength:t.renderedLength,target:r,...r.partitionHost?{host:{...r.partitionHost,t:l>0?g/l:0}}:{},measure:{labels:[{distance:$,midpoint:S},{distance:x,midpoint:M}],guide:D?{x:v,y:y,angle:C}:null}},jambBlockedTarget:null}}function Qp(t,e,i,s,n=1e-6){return t.presetRevision===i&&t.geometryRevision===s&&Math.hypot(t.pointer[0]-e[0],t.pointer[1]-e[1])<=n}const t_="1.65.0-beta.4",e_={badge:"display.badge",icon_ripple:"display.icon_ripple",value:"display.value",static_icon:"display.static_icon"},i_={badge:"marker.display_hint_badge",icon_ripple:"marker.display_hint_icon_ripple",value:"marker.display_hint_value",static_icon:"marker.display_hint_static_icon"},s_=2e3,n_=1e3,o_=1500,a_=t=>{const e=String(t??"").trim().replace(",",".");if(!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))return null;const i=Number(e);return Number.isFinite(i)?i:null},r_=(t,e)=>{if(!t.has(e))return{hit:!1};const i=t.get(e);return t.delete(e),t.set(e,i),{hit:!0,value:i}},l_=(t,e,i,s)=>{for(t.delete(e),t.set(e,i);t.size>s;){const e=t.keys().next().value;if(void 0===e)break;t.delete(e)}},c_=new Map;let h_=0;const d_=t=>`${window.innerWidth}x${window.innerHeight}|${location.pathname}|${JSON.stringify(t??{})}`;let u_=1e4;const p_="houseplan_card_layout_v1",__="houseplan_card_cfg_v1",g_="houseplan_card_zoom_v1",m_="houseplan_card_nav_v1",f_="houseplan_card_kiosk_v1",v_="houseplan_card_view_v1",y_=1e3,b_=[[0,1],[45,.88],[70,.62],[86,.32],[100,0]],w_=(t,e)=>{const i=Math.min(t.x,e.x),s=Math.min(t.y,e.y);return{x:i,y:s,w:Math.max(t.x+t.w,e.x+e.w)-i,h:Math.max(t.y+t.h,e.y+e.h)-s}},k_=new Set(["select","draw","column","merge","split","resize","opening","boundary","wallthick","delroom"]),$_=2e3,x_=(t,e,i)=>{const s=new Event(e,{bubbles:!0,composed:!0});s.detail=i??{},t.dispatchEvent(s)},S_=t=>{history.pushState(null,"",t),x_(window,"location-changed",{replace:!1})},M_=(t,e)=>{let i,s=null;const n=(...n)=>{clearTimeout(i),s=n,i=window.setTimeout(()=>{i=void 0;const e=s;s=null,e&&t(...e)},e)};return n.flush=()=>{if(void 0===i)return;clearTimeout(i),i=void 0;const e=s;s=null,e&&t(...e)},n.cancel=()=>{clearTimeout(i),i=void 0,s=null},n.pending=()=>void 0!==i,n},C_=t=>{try{t.target?.setPointerCapture?.(t.pointerId)}catch{}};class D_ extends ht{constructor(){super(...arguments),this._space="f1",this._layout={},this._serverStorage=!1,this._loadOk=!1,this._serverCanWrite=null,this._loading=!1,this._loadTries=0,this._serverCfg=null,this._cfgRev=0,this._cfgContentFingerprint="",this._unsubCfg=null,this._unsubLayout=null,this._unsubVirtual=null,this._liveSyncAttempt=null,this._liveSyncGeneration=0,this._liveSyncConnection=null,this._layoutRev=0,this._layoutContentFingerprint="",this._virtualLights=gn(null),this._canOptimizeUndo=!1,this._undoKind=null,this._devices=[],this._regSignature="",this._defPos={},this._newSyncKey="",this._tip=null,this._hoverRoom=null,this._selId=null,this._toast="",this._mode="view",this._pendingNavMode=null,this._decorTool="select",this._decorStyle={...er},this._decorDraft=null,this._decorMove=null,this._decorSel=null,this._decorEraseConfirm=null,this._decorTextDialog=null,this._decorShapeDialog=null,this._backdropDialog=null,this._decorTextSelection={start:0,end:0},this._furnPalette=null,this._dtBox=null,this._dtDrag=null,this._bdDrag=null,this._slide="",this._reducedMotion=!1,this._onMotionChange=t=>{this._reducedMotion=t.matches,t.matches&&this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:t.matches&&this._modeTransition.active&&this._cancelModeTransition(!0),this.requestUpdate()},this._editorChromeMode="plan",this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest=0,this._modeTransitionTargetZoom=1,this._modeTransitionEditorCamera=null,this._modeTransition=new cp({frame:t=>this._applyModeTransitionFrame(t),settled:t=>this._settleModeTransition(t)}),this._editorSecondary=new zu({root:()=>this.renderRoot,requestUpdate:()=>this.requestUpdate(),updateComplete:()=>this.updateComplete,clearTip:()=>{this._tip=null}}),this._editorSecondaryCopy={groupActive:(t,e)=>this._t("editor.group_active",{group:t,item:e}),openGroup:t=>this._t("editor.open_group",{group:t}),disabledAction:(t,e)=>this._t("editor.disabled_action",{action:t,reason:e})},this._tool="draw",this._geometryHistory=new Xu(50),this._wallDialog=null,this._drawWallField=null,this._activeDraftId=null,this._resumeDraftBySpace={},this._physicalSel=null,this._physicalDialog=null,this._partitionDeleteDialog=null,this._physicalDrag=null,this._physicalRotate=null,this._physicalLastTap=null,this._physicalPickCycle=null,this._wallUnionCache=null,this._isoGeometryCache=new Map,this._isoFallback=new Set,this._openingTunnelCache=null,this._openingWallIndexCache=new Map,this._openingPlacementIntervalsCache=null,this._planSnapGeometryCache=null,this._planStructuralGeometryCache=null,this._physicalBodiesCache=null,this._lightPhysicalBodiesCache=null,this._cleanFloorCache=new Map,this._glowClipCache=new Map,this._lightBarrierCache=null,this._glowFeatherUnits=null,this._glowRenderedSources=new Map,this._glowLastAppearance=new Map,this._glowEnteringSources=new Set,this._glowEnterRafs=new Map,this._glowFadeTimers=new Map,this._glowFeatherSuspendUntil=0,this._glowFeatherResumeTimer=0,this._glowSourceSeq=0,this._glowScreenBlend=!1,this._duplicateColumnId=null,this._duplicateColumnTimer=0,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._path=[],this._cursorPt=null,this._planSnapHover=null,this._mergeSel=null,this._openingPreset=null,this._openingRebindId=null,this._openingPresetRevision=0,this._openingHoverCandidate=null,this._openingJambBlockCm=null,this._openingDialog=null,this._openingInfo=null,this._opDrag=null,this._opMeasure=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryPointerType="mouse",this._boundaryRestoreGuard=null,this._boundaryTargetMemo=null,this._boundaryPreviewMemo=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._wallFaceGraphCache=[],this._areaSel="",this._nameSel="",this._roomDialog=!1,this._roomEditId=null,this._roomFill="",this._roomCustomFill=null,this._roomTempSrc="",this._roomHumSrc="",this._roomSrcOpen=null,this._roomSrcFilter="",this._roomNameScale=1,this._roomLabelScale=1,this._zoom=1,this._view=null,this._zoomBySpace={},this._viewModeSnap=null,this._pointers=new Map,this._panStart=null,this._panLock=null,this._pinchStart=null,this._suppressClick=!1,this._touchContacts=new Map,this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._connectedPath="",this._routeDepartureHandled=!1,this._onLocationChanged=()=>{this._connectedPath&&location.pathname!==this._connectedPath?this._leaveCardRoute():location.pathname===this._connectedPath&&(this._routeDepartureHandled=!1)},this._touchGestureGuard={capture:!0,handleEvent:t=>this._guardTouchGesture(t)},this._hdrH=118,this._booting=!0,this._bootFading=!1,this._bootSettling=!1,this._bootSettleRaf=0,this._bootLastH=-1,this._bootStart=0,this._bootLastChange=0,this._bootSoft=!1,this._tapConfirm=null,this._onboardingShown=!1,this._rulesDialog=null,this._alignDialog=null,this._settingsDialog=null,this._backupExportDialog=null,this._backupImportDialog=null,this._sunRaysCache=null,this._dayCycleTimer=0,this._dayCycleClockKey="",this._compassDrag=!1,this._importDialog=null,this._importQueue=[],this._importTotal=0,this._rulesCompiledSrc="",this._infoCard=null,this._nativeMoreInfoEntity=null,this._markerDialog=null,this._spaceDialog=null,this._keyHandler=t=>this._onKey(t),this._warmVp=null,this._warmVpArmed=!1,this._warmLongReturn=!1,this._warmRevivePending=!1,this._warmGen=++h_,this._warmKey=null,this._warmSlot=null,this._hashApplied=!1,this._navApplied=!1,this._labs={active:Object.freeze([]),space:""},this._viewPreference={},this._renderProjection="flat",this._kioskScale={icon:1,font:1},this._kioskDialog=!1,this._activityRt=new Map,this._vacRt=new Map,this._vacViewKey="",this._vacLastView=null,this._vacRaf=0,this._vacSrvTrails={},this._vacJumpOnce=!1,this._continuity=this._newContinuityController(),this._continuityHistory=[],this._continuityEpoch=0,this._continuityDataReady=!0,this._continuityPaintToken=-1,this._continuityDisposed=!1,this._renderSnapshotAt=Date.now(),this._hassSequence=0,this._visibleDeviceSnapshot=null,this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._capturedSnapshotSequence=-1,this._capturedSnapshotDevices=null,this._capturedSnapshotLayout=null,this._capturedSnapshotActivity="",this._capturedSnapshotConfigEpoch=-1,this._capturedSnapshotVirtual="",this._lastValidStageSize=null,this._pendingRefitSize=null,this._refitRaf=0,this._pageVisibility=t=>{if(this._continuity.visibility(t),this._dayCycleVisibility(t),"hidden"!==t.kind){if(this._vacJumpOnce=!0,!t.long){const t=Date.now();let e=!1;for(const i of this._activityRt.values())!i.flashKind||(i.expiresAt||i.flashTs+Mu)>t||(i.flashTs=0,i.flashKind=null,i.expiresAt=0,e=!0);return void(e&&this.requestUpdate())}Date.now()-this._renderSnapshotAt>1e3&&this._continuity.note("device-snapshot-stale"),this._continuityDataReady=!1,this._continuityPaintToken=-1,this._resumeSettling=!0,this._loading?this.requestUpdate():this._loadFromServer()}else this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0)},this._resumeSettling=!1,this._viewportInvalidAt=0,this._vacFit=null,this._vacAllCamerasFor=null,this._vacAllCameraCache=null,this._vacCalConfirm=null,this._kioskDots=!1,this._cyclePausedUntil=0,this._swipeStart=null,this._lastTap=0,this._onLabsSnapshot=t=>{const e=this._effectiveProjection();this._labs=t;const i=this._effectiveProjection();this._convertProjectionView(e,i),this.requestUpdate()},this._onHashChange=()=>{const t=this._hashSpace();if(t&&this._model.find(e=>e.id===t)&&t!==this._space){if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._selId=null,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),this.requestUpdate()}},this._drag=null,this._rlResize=null,this._holdFired=!1,this._retryContinuity=()=>{this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.retry(this._continuity.recoveryReason||"plan"),this._loading||this._loadFromServer()},this._cfgEpoch=0,this._modelCache=null,this._emptySpaceStateActive=!1,this._decorSnapCache=null,this._markerPreviewMemo=null,this._markerPreviewDevicesMemo=null,this._showHidden=!1,this._connHooked=null,this._connectionWasLost=!1,this._haRegistryConnection=null,this._haRegistryRev=-1,this._haBindingCacheKey="",this._planHassMemo=null,this._onHaRegistryUpdate=()=>{const t=In(this.hass);t.revision===this._haRegistryRev&&this._devices.length||(this._haRegistryRev=t.revision,this._planHassMemo=null,this._regSignature="",this._maybeRebuildDevices(),this.requestUpdate())},this._onConnReady=()=>{if(this._loadTries=0,clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,function(t){const e=Cn(t);e&&(Pn(t,e),Rn(t,e))}(this.hass),this._saveConfigDebounced.pending()&&this._saveConfigDebounced.flush(),this._cfgWriting)return clearTimeout(this._reloadRetry),void(this._reloadRetry=window.setTimeout(this._onConnReady,400));!this._connectionWasLost&&this._continuity.hasCompleteFrame?this._beginContinuityCandidate("connection-ready",!1,"plan"):(this._continuityDataReady=!1,this._continuityPaintToken=-1),this._loading||this._loadFromServer()},this._onConnLost=()=>{this._booting&&!this._continuity.hasCompleteFrame||(this._connectionWasLost=!0,this._continuityDataReady=!1,this._continuityPaintToken=-1,this._continuity.connectionLost())},this._signer=new oh(()=>this.requestUpdate()),this._dirtyPos=new Set,this._sentPos=new Map,this._persistLayout=M_(()=>{if(this._serverStorage){const t=[...this._dirtyPos];this._dirtyPos.clear();for(const e of t){const t=this._layout[e];t&&(this._sentPos.set(e,t),this.hass.callWS({type:"houseplan/layout/update",device_id:e,pos:t}).then(t=>this._noteLayoutRev(t)).catch(t=>this._showToast(this._t("toast.pos_save_failed",{err:this._errText(t)}))).finally(()=>{this._sentPos.get(e)===t&&this._sentPos.delete(e)}))}this._cacheSnapshot()}else localStorage.setItem(p_,JSON.stringify(this._layout))},600),this._frame=null,this._showFar=!1,this._writesPending=0,this._writeChain=Promise.resolve(),this._undoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.undo();t&&(this._applyGeometryState(t.before)?this._showToast(this._t("history.undone",{name:t.name})):this._geometryHistory.clear())},this._redoGeometry=()=>{if(this._cancelBoundaryAnchor())return;if(this._physicalDrag||this._physicalRotate)return void this._cancelPhysicalGesture();if(this._decorDraft)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove||this._dtDrag||this._bdDrag)return void this._cancelDecorGesture();if(this._rszDrag)return void this._rszCancelDrag();const t=this._geometryHistory.redo();t&&(this._applyGeometryState(t.after)?this._showToast(this._t("history.redone",{name:t.name})):this._geometryHistory.clear())},this._saveConfigDebounced=M_(()=>{this._serverCfg&&this._writeConfig().catch(t=>{"conflict"===t?.code?(this._showToast(this._t("toast.conflict")),this._cancelPath(),this._reloadConfigOnly(!0)):this._showToast(this._t("toast.cfg_save_failed",{err:this._errText(t)}))})},500),this._draftSegmentCms=[],this._closingWallCm=null,this._savePhysicalDialog=()=>{const t=this._physicalDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=a_(t.cm);if(null==s)return void this._showPhysicalRange("column"===t.kind?$l:100);const n=this._imperial?2.54*s:s,o="column"===t.kind?$l:100;if(!Number.isFinite(n)||n<1||n>o)return void this._showPhysicalRange(o);if("column"===t.kind){const e=i.wall_columns.find(e=>e.id===t.id);if(!e)return;const s=a_(t.angle||"0");if("circle"!==t.shape&&(null==s||s<0||s>=90))return void this._showToast(this._t("toast.physical_angle"));const o="circle"===t.shape?{id:t.id,shape:"circle",center:e.center,cm:n}:{id:t.id,shape:"square",center:e.center,cm:n,angle:s};if(i.wall_columns.some(e=>e.id!==t.id&&Ll(e,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"))}const a=this._geometrySnapshot();if("partition"===t.kind){const i=(e.partitions||[]).find(e=>e.id===t.id);i&&(i.cm=n)}else if("column"===t.kind){const i=(e.wall_columns||[]).find(e=>e.id===t.id);i&&(i.cm=xl(n),i.shape="circle"===t.shape?"circle":"square","square"===i.shape?i.angle=a_(t.angle||"0"):delete i.angle)}else{const i=(e.room_drafts||[]).find(e=>e.id===t.id);i?.segments?.[t.segment||0]&&(i.segments[t.segment||0].cm=n)}this._recordGeometry(this._t("history.physical_edit"),a),this._physicalDialog=null,this._saveConfig()},this._deletePhysicalSelection=()=>{const t=this._physicalSel,e=this._curSpaceCfg;if(!t||!e)return;if("draft"===t.kind)return void this._deleteDraftWhole();const i=this._geometrySnapshot();if("partition"===t.kind){const i=(e.openings||[]).filter(e=>"partition"===e.host?.kind&&e.host.id===t.id).sort((t,e)=>(t.host?.t||0)-(e.host?.t||0));if(i.length)return void(this._partitionDeleteDialog={id:t.id,openings:i.map(t=>JSON.parse(JSON.stringify(t)))})}const s="partition"===t.kind?"partitions":"column"===t.kind?"wall_columns":"room_drafts";e[s]=(e[s]||[]).filter(e=>e.id!==t.id),e[s].length||delete e[s],this._activeDraftId===t.id&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._confirmPartitionDelete=()=>{const t=this._partitionDeleteDialog,e=this._curSpaceCfg;if(!t||!e)return;const i=this._geometrySnapshot();e.partitions=(e.partitions||[]).filter(e=>e.id!==t.id),e.partitions.length||delete e.partitions,e.openings=(e.openings||[]).filter(e=>"partition"!==e.host?.kind||e.host.id!==t.id),e.openings.length||delete e.openings,this._partitionDeleteDialog=null,this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftWhole=()=>{const t="draft"===this._physicalDialog?.kind?this._physicalDialog.id:"draft"===this._physicalSel?.kind?this._physicalSel.id:null,e=this._curSpaceCfg;if(!t||!e||!confirm(this._t("confirm.delete_draft")))return;const i=this._geometrySnapshot();e.room_drafts=(e.room_drafts||[]).filter(e=>e.id!==t),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===t&&this._cancelPath(),this._physicalSel=null,this._physicalDialog=null,this._recordGeometry(this._t("history.physical_delete"),i),this._saveConfig()},this._deleteDraftSegment=()=>{const t=this._physicalDialog,e=this._curSpaceCfg;if(!t||"draft"!==t.kind||!e)return;if(!confirm(this._t("confirm.delete_draft_segment")))return;const i=(e.room_drafts||[]).findIndex(e=>e.id===t.id);if(i<0)return;const s=e.room_drafts[i],n=Math.max(0,Math.min(s.segments.length-1,t.segment||0)),o=[],a=s.points.slice(0,n+1),r=s.points.slice(n+1);if(a.length>=2&&o.push({id:s.id,points:a,segments:s.segments.slice(0,n)}),r.length>=2&&o.push({id:o.length?`${s.id}-${Date.now().toString(36)}`:s.id,points:r,segments:s.segments.slice(n+1)}),2===o.length&&e.room_drafts.length>=200)return void this._showToast(this._t("toast.physical_limit"));const l=this._geometrySnapshot();e.room_drafts.splice(i,1,...o),e.room_drafts.length||delete e.room_drafts,this._activeDraftId===s.id&&this._cancelPath(),this._physicalDialog=null,this._physicalSel=o.length?{kind:"draft",id:o[0].id}:null,this._recordGeometry(this._t("history.draft_segment_delete"),l),this._saveConfig()},this._rebindPartitionOpening=()=>{const t=this._openingDialog;if(!t?.id)return;const e=t.id;this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingRebindId=e,this._openingPreset={type:t.type,lengthCm:t.lengthCm,flipH:t.flipH,flipV:t.flipV,revision:++this._openingPresetRevision},this._openingDialog=null,this._openingHoverCandidate=null)},this._keepClosedAsPartitions=()=>{if(this._wallFaceBatch)return void this._decideWallFace(!1);if(!this._contourClosed||this._pendingSplit||!this._curSpaceCfg)return;const t=this._curSpaceCfg,e=this._path.slice(0,-1);if((t.partitions||[]).length+e.length>$_)return void this._showToast(this._t("toast.physical_limit"));const i=this._geometrySnapshot(),s=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr];t.partitions||=[];const n=Date.now().toString(36);for(let i=0;it.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.contour_to_partitions"),i),this._saveConfig(),this._roomDialog=!1,this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null},this._toggleServerPlans=async()=>{const t=this._spaceDialog;if(t)if(t.pickSaved)this._spaceDialog={...t,pickSaved:!1};else{this._spaceDialog={...t,pickSaved:!0,savedBusy:!0};try{const t=await this.hass.callWS({type:"houseplan/plans/list"}),e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:t?.plans||[],savedBusy:!1})}catch(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,saved:[],savedBusy:!1}),this._showToast(this._t("toast.plans_list_failed",{err:this._errText(t)}))}}},this._aspectJob=null,this._dayCycleTick=()=>{if(!this.isConnected||"hidden"===this.ownerDocument.visibilityState)return;const t=this._dayCycleState();if(!t)return this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),void(this._dayCycleClockKey="");const e=Na(t);e!==this._dayCycleClockKey&&(this._dayCycleClockKey=e,this.requestUpdate())},this._sunShown=!1,this._sunOut=!1,this._sunOutTimer=0,this._openSettingsDialog=()=>{if(!this._norm)return;const t=this._glowRadiusCm,e=this._imperial?Math.round(t/30.48*10)/10:Math.round(t)/100;this._settingsDialog={colors:JSON.parse(JSON.stringify(this._fillColors)),glowRadius:e,bgColor:hs(this._settings,{bgColor:null})||null,northDeg:Ka(this._settings,{}),bgMode:Ya(this._settings,{}),sunRays:Xa(this._settings,{}),busy:!1}},this._openAlignDialog=()=>{if(!this._norm||!this._serverCfg)return;const t=this._serverCfg.spaces||[],e=Yu(this._serverCfg,this._layout||{}),i=Math.ceil(10*e.report.maxShiftCm)/10,s=t.find(t=>null!=t?.id&&String(t.id)===e.report.maxSpace),n=t.length>1&&s?String(s.title||s.id):"";this._alignDialog={report:e.report,config:e.config,layout:e.layout,cm:i,where:n,changed:e.changed,busy:!1}},this._optimizeUndoBusy=!1,this._openBackupExport=()=>{this._settingsDialog=null,this._backupExportDialog={kind:"full",planOnly:!1,busy:!1,error:""}},this._openRulesDialog=()=>{if(!this._norm)return;const t=this._settings.icon_rules,e=(t&&t.length?t:Xt).map(t=>({...t}));this._rulesDialog={rules:e,test:"",busy:!1}},this._climateCache=null,this._gearPtCache=new WeakMap}get _canEdit(){return!!this._norm&&(!0===this._serverCanWrite||!1!==this._serverCanWrite&&!0===this.hass?.user?.is_admin)}get _kiosk(){return!!this._config?.kiosk}_showKioskDots(){this._kioskDots=!0,clearTimeout(this._kioskDotsTimer),this._kioskDotsTimer=window.setTimeout(()=>this._kioskDots=!1,2500)}get _modeTransitionBusy(){return this._modeTransitionPreparing||this._modeTransition.active}_cssColor(t,e){const i=String(t||"").trim();if(!i)return e;const s=document.createElement("span");s.style.cssText=`position:absolute;visibility:hidden;color:${i}`,this.renderRoot.append(s);const n=getComputedStyle(s).color||e;return s.remove(),n}_currentModeVisual(t=this._mode){const e=this._modeTransition.presented||this._modeTransitionVisual;if(e)return{...e,viewport:{...e.viewport,viewBox:{...e.viewport.viewBox}}};const i=this._stageEl;if(!i||i.clientWidth<=0||i.clientHeight<=0)return null;const s=this.renderRoot.querySelector(".editorchrome"),n=this._viewOr(this._baseVb()),o=this.renderRoot.querySelector(".hp-paper"),a=this.renderRoot.querySelector(".hp-backdrop"),r=this.renderRoot.querySelector(".zoomwrap"),l=r?getComputedStyle(r).filter:"",c=Number(/brightness\(([^)]+)\)/.exec(l)?.[1]);return{presentedMode:t,editorChromeHeight:"view"===t?0:s?.getBoundingClientRect().height||0,stageWidth:i.clientWidth,stageHeight:i.clientHeight,viewport:np(n,i.clientWidth),stageColor:getComputedStyle(i).backgroundColor||"rgb(255, 255, 255)",paperColor:o?getComputedStyle(o).fill:"rgb(255, 255, 255)",sceneBrightness:Number.isFinite(c)?c:1,architectureOpacity:"decor"===t?.35:1,backdropOpacity:a&&Number(getComputedStyle(a).opacity)||1,viewWeight:"view"===t?1:0,editorWeight:"view"===t?0:1,toolbarContentOpacity:"view"===t?0:1}}_viewForModeTarget(t,e,i,s,n){const o=Oi(this._baseVb(),s/Math.max(1,n)),a=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),r=o.w/a,l=o.h/a,c=e??o.x+o.w/2,h=i??o.y+o.h/2;return this._clampView({x:c-r/2,y:h-l/2,w:r,h:l},o)}_targetStageColor(t){return"view"!==t?"rgb(255, 255, 255)":this._cssColor(this._stageBg(this._spaceDisplayForRender()),this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"))}_targetPaperColor(t){return"view"===t&&this._spaceModel()?.bg?this._cssColor("var(--ha-card-background, var(--card-background-color, #111))","rgb(17, 17, 17)"):"rgb(255, 255, 255)"}_targetBrightness(t){return 1}_applyModeTransitionFrame(t){t.targetMode===this._mode&&(this._modeTransitionVisual=t.presented,this._view={...t.presented.viewport.viewBox},this.requestUpdate())}_settleModeTransition(t){if(t.targetMode!==this._mode)return;const e=this._modeTransitionRequest;this._view={...t.to.viewport.viewBox},this._zoom=this._modeTransitionTargetZoom,this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._lastValidStageSize=[t.to.stageWidth,t.to.stageHeight],"view"===this._mode&&(this._saveZoom(),this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate(),this.updateComplete.then(()=>{if(!this.isConnected||e!==this._modeTransitionRequest||this._modeTransitionBusy||t.targetMode!==this._mode)return;const i=this._stageEl;if(i&&i.clientWidth>0&&i.clientHeight>0&&(Math.abs(i.clientWidth-t.to.stageWidth)>.5||Math.abs(i.clientHeight-t.to.stageHeight)>.5)){const t=this._view;this._lastValidStageSize=[i.clientWidth,i.clientHeight],this._applyView(this._zoom,t?t.x+t.w/2:void 0,t?t.y+t.h/2:void 0),this.requestUpdate()}const s=this.renderRoot.activeElement;(!s||!s.isConnected||!!s.closest?.(".editorchrome, .stage"))&&this.renderRoot.querySelector(".modetab.active")?.focus?.({preventScroll:!0})})}_cancelModeTransition(t=!0){const e=!!this._modeTransition.state;this._modeTransitionRequest++,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransition.cancel(t),t&&e||(this._modeTransitionVisual=null)}_adoptMode(t){this._cancelModeTransition(!1),this._mode=t,"view"!==t&&(this._editorChromeMode=t)}_commitViewModeAtomic(t,e,i,s){if(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this._zoom=e,t){const n=this._stageEl?.clientWidth||t.stageWidth,o=Math.max(1,t.stageHeight+t.editorChromeHeight);this._view=this._viewForModeTarget(e,i,s,n,o),this._lastValidStageSize=[n,o]}else this._view=null;this._viewModeSnap=null,this._modeTransitionEditorCamera=null,this._saveZoom(),this.requestUpdate()}_prepareModeTransition(t,e,i,s,n,o){this.updateComplete.then(()=>{if(!this.isConnected||t!==this._modeTransitionRequest||this._mode!==i)return void(t===this._modeTransitionRequest&&(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._modeTransitionForceAtomic=!1,this.requestUpdate()));const a=this.renderRoot.querySelector(".editorchrome"),r=a?.querySelector(".editorchrome-inner"),l="view"===i?0:r?.scrollHeight||r?.getBoundingClientRect().height||0,c=Math.max(1,e.stageHeight+e.editorChromeHeight),h=Math.max(1,c-l),d=this._stageEl?.clientWidth||e.stageWidth;if(d<=0||h<=0)return this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._applyView(s,n,o),void this.requestUpdate();const u=this._viewForModeTarget(s,n,o,d,h),p={presentedMode:i,editorChromeHeight:l,stageWidth:d,stageHeight:h,viewport:np(u,d),stageColor:this._targetStageColor(i),paperColor:this._targetPaperColor(i),sceneBrightness:this._targetBrightness(i),architectureOpacity:"decor"===i?.35:1,backdropOpacity:"decor"===i&&"backdrop"!==this._decorTool?.5:1,viewWeight:"view"===i?1:0,editorWeight:"view"===i?0:1,toolbarContentOpacity:"view"===i?0:1};this._modeTransitionPreparing=!1;const _=this._modeTransitionForceAtomic;this._modeTransitionForceAtomic=!1,this._modeTransition.start(e,p,i,this._reducedMotion||_?0:220)})}_slideTo(t,e){if(t===this._space)return;if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;this._cancelModeTransition(!0);const i=window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._space=t,this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._tool="draw",this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._selId=null,this._physicalSel=null,this._editorSecondary.closeForNavigation(),this._physicalDialog=null,this._physicalDrag=null,"plan"===this._mode&&"draw"===this._tool&&this._resumeLastDraft(),this._restoreZoom(),i||(this._slide=e,clearTimeout(this._slideTimer),this._slideTimer=window.setTimeout(()=>{this._slideTimer=void 0,this._slide="",this.requestUpdate()},190),this.requestUpdate())}_pickSpace(t){if(t===this._space)return;const e=this._model.map(t=>t.id),i=e.indexOf(this._space),s=e.indexOf(t);this._navApplied=!0,this._showFar=!1,this._frame=null,this._slideTo(t,i>=0&&s0&&Date.now()>=this._cyclePausedUntil&&this._model.length>1&&this._zoom<=1.001){const t=this._model.map(t=>t.id),e=t.indexOf(this._space);this._slideTo(t[(e+1)%t.length],"left"),this._showKioskDots()}}get _editing(){return"plan"===this._mode||"devices"===this._mode||"decor"===this._mode}get _markup(){return"plan"===this._mode}_newContinuityController(){return new eh(()=>{this._resumeSettling="steady"!==this._continuity.state,this._continuityEpoch++,this.isConnected&&this.requestUpdate()})}get _labsIso(){return this._labs.active.includes("iso")}get _desiredProjection(){return"view"===this._mode&&this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat"}_saveViewPreference(){try{localStorage.setItem(v_,JSON.stringify(this._viewPreference))}catch{}}_logicalViewCenter(t){const e=this._view;if(!e)return null;const i=[e.x+e.w/2,e.y+e.h/2],s="iso"===t?Ap(i):i;return{x:s[0],y:s[1]}}_convertProjectionView(t,e){if(t===e)return;const i=this._logicalViewCenter(t);this._view=null;const s=i?"iso"===e?Rp([i.x,i.y],0):[i.x,i.y]:null;this._applyView(this._zoom,s?.[0],s?.[1]),this._warmPatch({vp:this._warmViewportState()}),this.requestUpdate()}_setProjection(t){if(!this._labsIso||"view"!==this._mode)return;const e=this._effectiveProjection();if(this._viewPreference={...this._viewPreference,[this._space]:t},"iso"===t){const t=this._isoSceneKey();t&&this._isoFallback.delete(t)}this._saveViewPreference();const i=this._effectiveProjection();this._convertProjectionView(e,i)}_hashSpace(){return fp(window.location.hash||"")}connectedCallback(){this._connectedPath=location.pathname,this._routeDepartureHandled=!1,window.addEventListener("location-changed",this._onLocationChanged),window.addEventListener("popstate",this._onLocationChanged),this._continuityDisposed&&(this._continuity=this._newContinuityController(),this._continuityDisposed=!1,this._continuityPaintToken=-1);const t=(e=this.ownerDocument,Ju.get(e)?.resolved);var e;void 0!==t&&(this._glowScreenBlend=t),this._continuityUnsub?.(),this._continuityUnsub=Qc(this.ownerDocument,this._pageVisibility),super.connectedCallback(),this._motionMedia=window.matchMedia?.("(prefers-reduced-motion: reduce)"),this._reducedMotion=!!this._motionMedia?.matches,this._motionMedia?.addEventListener?.("change",this._onMotionChange),function(t){const e=Ju.get(t);if(e)return e.promise;const i={promise:Promise.resolve(!1)};return i.promise=Qu(t).catch(()=>!1).then(t=>(i.resolved=t,t)),Ju.set(t,i),i.promise}(this.ownerDocument).then(t=>{t!==this._glowScreenBlend&&(this._glowScreenBlend=t,this.isConnected&&this.requestUpdate())}),this.hass&&this._ensureHaRegistryAuthority(),window.addEventListener("keydown",this._keyHandler),this._signer.start(()=>this.hass,()=>As(this._serverCfg)),this._config?.kiosk&&Number(this._config?.cycle)>0&&(clearInterval(this._cycleTimer),this._cycleTimer=window.setInterval(()=>this._cycleTick(),1e3*Number(this._config.cycle))),window.addEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=function(t,e){xp.add(e);const i=Cp(t);return"undefined"==typeof window&&e(i),()=>{xp.delete(e)}}(t_,this._onLabsSnapshot),this._booting?this._bootWatch():this._bootFading&&(clearTimeout(this._bootTimer),this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220)),this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),!this._loadOk&&this._serverCfg&&this.hass&&this._scheduleLoadRetry(),!this._warmSlot&&this._config&&this._warmAdopt(),this._loadOk&&this._ensureLiveSyncSubscriptions(),this._warmVp&&!this._warmRevivePending&&void 0===this._warmReviveTimer&&(this._warmRevivePending=!0,this._warmReviveTimer=window.setTimeout(()=>this._warmReviveDialog(),0)),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1,this.requestUpdate()}disconnectedCallback(){this._connectedPath&&location.pathname!==this._connectedPath&&this._leaveCardRoute(),window.removeEventListener("location-changed",this._onLocationChanged),window.removeEventListener("popstate",this._onLocationChanged),this._continuityUnsub?.(),this._continuityUnsub=void 0,this._motionMedia?.removeEventListener?.("change",this._onMotionChange),this._motionMedia=void 0,this._vacRaf&&(cancelAnimationFrame(this._vacRaf),this._vacRaf=0),this._refitRaf&&(cancelAnimationFrame(this._refitRaf),this._refitRaf=0),this._dayCycleTimer&&(clearInterval(this._dayCycleTimer),this._dayCycleTimer=0),this._dayCycleClockKey="",this._bootSettleRaf&&(cancelAnimationFrame(this._bootSettleRaf),this._bootSettleRaf=0),this._bootSettling=!1;for(const t of this._activityRt.values())clearTimeout(t.timer);window.removeEventListener("keydown",this._keyHandler),clearInterval(this._cycleTimer),clearTimeout(this._kioskDotsTimer),clearTimeout(this._kioskHoldTimer),clearTimeout(this._reloadRetry),clearTimeout(this._loadRetryTimer),this._loadRetryTimer=void 0,this._connHooked?.removeEventListener?.("ready",this._onConnReady),this._connHooked?.removeEventListener?.("disconnected",this._onConnLost),this._connHooked?.removeEventListener?.("reconnect-error",this._onConnLost),this._connHooked=null,this._haRegistryRelease?.(),this._haRegistryRelease=void 0,this._haRegistryConnection=null,this._signer.dispose(),clearTimeout(this._toastTimer),clearTimeout(this._slideTimer),this._modeTransition.dispose(),this._modeTransitionVisual=null,this._modeTransitionPreparing=!1,this._modeTransitionForceAtomic=!1,this._modeTransitionRequest++,this._slideTimer=void 0,this._slide="",clearTimeout(this._bootTimer),this._bootTimer=void 0,clearTimeout(this._bootSoftTimer),this._saveConfigDebounced.flush(),window.removeEventListener("hashchange",this._onHashChange),this._labsUnsub?.(),this._labsUnsub=void 0,clearTimeout(this._holdTimer),this._roViewport?.disconnect(),this._roViewport=void 0,this._roHdr?.disconnect(),this._roHdr=void 0,this._onWinResize&&(window.removeEventListener("resize",this._onWinResize),this._onWinResize=void 0),this._unsubCfg&&(this._unsubCfg(),this._unsubCfg=null),this._unsubLayout&&(this._unsubLayout(),this._unsubLayout=null),this._unsubVirtual&&(this._unsubVirtual(),this._unsubVirtual=null),this._unsubTrail&&(this._unsubTrail(),this._unsubTrail=void 0),this._liveSyncGeneration++,this._liveSyncAttempt=null,this._liveSyncConnection=null,clearTimeout(this._layoutSyncTimer),clearTimeout(this._duplicateColumnTimer);for(const t of this._glowFadeTimers.values())clearTimeout(t);for(const t of this._glowEnterRafs.values())cancelAnimationFrame(t);clearTimeout(this._glowFeatherResumeTimer),this._glowFeatherResumeTimer=0,this._glowFeatherSuspendUntil=0,this._glowFadeTimers.clear(),this._glowEnterRafs.clear(),this._glowEnteringSources.clear(),this._glowRenderedSources.clear(),this._glowLastAppearance.clear(),this._glowSourceSeq=0,this._warmSnapshot(),this._warmRevivePending=!1,clearTimeout(this._warmReviveTimer),this._warmReviveTimer=void 0,this._warmRelease(),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._touchContacts.clear(),this._touchSequenceMultitouch=!1,this._touchClickBlockUntil=0,this._editorSecondary.reset(),this._resumeSettling=!1,this._continuityHistory=[...this._continuityHistory,...this._continuity.trace].slice(-80),this._continuity.dispose(),this._continuityDisposed=!0,super.disconnectedCallback()}_onKey(t){if("Escape"===t.key&&this._vacFit)return this._vacFit=null,this._showToast(this._t("vac.cal_cancelled")),void t.stopPropagation();if("Escape"===t.key){if(this._tapConfirm)return void(this._tapConfirm=null);if(this._vacCalConfirm)return void(this._vacCalConfirm=null);if(this._decorEraseConfirm)return void(this._decorEraseConfirm=null);if(this._openingInfo)return void(this._openingInfo=null);if(this._infoCard)return void this._closeInfoCard();if(this._rulesDialog)return void(this._rulesDialog=null);if(this._alignDialog)return void(this._alignDialog=null);if(this._backupImportDialog)return void(this._backupImportDialog=null);if(this._backupExportDialog)return void(this._backupExportDialog=null);if(this._settingsDialog)return void(this._settingsDialog=null);if(this._markerDialog)return void(this._markerDialog=null);if(this._openingDialog)return void(this._openingDialog=null);if(this._physicalDialog)return void(this._physicalDialog=null);if(this._backdropDialog)return void(this._backdropDialog=null);if(this._decorShapeDialog)return void(this._decorShapeDialog=null);if(this._decorTextDialog)return void(this._decorTextDialog=null);if(this._spaceDialog&&!this._roomDialog)return this._spaceDialog=null,this._importQueue=[],void(this._importTotal=0);if(this._editorSecondary.hasOpenGroup)return t.preventDefault(),void this._editorSecondary.closeGroup(!0)}const e=t.composedPath?.()||[t.target],i=e.some(t=>t?.matches?.('input, textarea, select, [contenteditable="true"]')),s=e.some(t=>t?.classList?.contains?.("editor-secondary")),n=t.ctrlKey||t.metaKey,o=t.key.toLowerCase(),a=/^[a-z]$/.test(o),r="z"===o||!a&&"KeyZ"===t.code,l="y"===o||!a&&"KeyY"===t.code,c=n&&(r&&t.shiftKey||l),h=n&&r&&!t.shiftKey;if("decor"===this._mode){if((h||c)&&i)return;return c?(t.preventDefault(),void this._redoGeometry()):h?(t.preventDefault(),this._decorDraft?void(this._decorDraft=null):this._decorMove||this._dtDrag||this._bdDrag?void this._cancelDecorGesture():void this._undoGeometry()):"Delete"!==t.key&&"Backspace"!==t.key||!this._decorSel||i||s?void("Escape"===t.key&&(t.preventDefault(),this._decorDraft?this._decorDraft=null:this._decorMove||this._dtDrag||this._bdDrag?this._cancelDecorGesture():"furniture"===this._decorTool?(this._furnPalette=null,this._decorTool="select"):this._decorSel?this._decorSel=null:"select"!==this._decorTool?this._decorTool="select":this._setMode("view"))):(t.preventDefault(),void this._decorDeleteSel())}if(this._markup&&(!h&&!c||!i)){if(("Delete"===t.key||"Backspace"===t.key)&&this._physicalSel&&!i&&!s)return t.preventDefault(),void this._deletePhysicalSelection();if(c)return t.preventDefault(),void this._redoGeometry();if(h)return t.preventDefault(),this._rszDrag?void this._rszCancelDrag():this._wallFaceBatch?(this._roomDialogCancel(),void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint())):"draw"===this._tool&&this._path.length?void(this._activeDraftId&&this._path.length>1?this._undoActiveDraftPoint():this._undoPoint()):"split"===this._tool&&this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},void(this._splitSel.pts.length||(this._cursorPt=null))):void this._undoGeometry();if("Escape"===t.key)return this._physicalDrag||this._physicalRotate?(t.preventDefault(),void this._cancelPhysicalGesture()):this._roomDialog?(t.preventDefault(),void this._roomDialogCancel()):"draw"===this._tool&&this._path.length?(t.preventDefault(),void this._undoPoint()):this._physicalSel?(t.preventDefault(),void(this._physicalSel=null)):"resize"===this._tool?(t.preventDefault(),this._rszDrag?void this._rszCancelDrag():void(this._rszSel?this._rszSel=null:this._tool="draw")):"split"===this._tool?(t.preventDefault(),void(this._splitSel?.pts?.length?(this._splitSel={...this._splitSel,pts:this._splitSel.pts.slice(0,-1)},this._splitSel.pts.length||(this._cursorPt=null)):this._splitSel?this._splitSel=null:this._tool="draw")):"merge"===this._tool?(t.preventDefault(),void(this._mergeSel?this._mergeSel=null:this._tool="draw")):this._wallDialog?(t.preventDefault(),void(this._wallDialog=null)):"boundary"===this._tool?(t.preventDefault(),void(this._openWallAnchor?this._cancelBoundaryAnchor():this._tool="draw")):void("opening"!==this._tool&&"wallthick"!==this._tool&&"delroom"!==this._tool&&"column"!==this._tool||(t.preventDefault(),"opening"===this._tool&&this._clearOpeningPlacement(!0),this._tool="draw"))}}_undoPoint(){if(this._path.length){if(this._contourClosed)return this._path=this._path.slice(0,-1),void(this._closingWallCm=null);if(this._activeDraftId&&this._path.length>1&&this._curSpaceCfg){const t=this._geometrySnapshot();this._path=this._path.slice(0,-1),this._draftSegmentCms=this._draftSegmentCms.slice(0,-1);const e=this._curSpaceCfg,i=(e.room_drafts||[]).findIndex(t=>t.id===this._activeDraftId);return void(i>=0&&(this._path.length<2?(e.room_drafts.splice(i,1),e.room_drafts.length||delete e.room_drafts,this._activeDraftId=null):e.room_drafts[i]={id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map(t=>({cm:t}))},this._recordGeometry(this._t("history.draft_segment_delete"),t),this._saveConfig()))}this._path=this._path.slice(0,-1)}}_undoActiveDraftPoint(){const t=this._activeDraftId,e=this._path[0]?[...this._path[0]]:null,i=this._geometryHistory.undo();if(!i)return void this._undoPoint();if(!this._applyGeometryState(i.before))return void this._geometryHistory.clear();const s=t?this._spaceModel()?.room_drafts.find(e=>e.id===t):null;s?(this._activeDraftId=s.id,this._path=s.points.map(t=>[...t]),this._draftSegmentCms=s.segments.map(t=>t.cm),this._resumeDraftBySpace[this._space]=s.id):(this._activeDraftId=null,this._path=e?[e]:[],this._draftSegmentCms=[],t&&this._resumeDraftBySpace[this._space]===t&&delete this._resumeDraftBySpace[this._space]),this._clearPlanSnapHover(),this._showToast(this._t("history.undone",{name:i.name}))}static getConfigElement(){return document.createElement("houseplan-card-editor")}static getStubConfig(){return{type:"custom:houseplan-card"}}static _warmBootReset(t){for(const t of c_.values())for(const e of t)clearTimeout(e.evict);c_.clear(),u_=t&&t>0?t:1e4}static _warmBootStats(){let t=0,e=0;const i=[];for(const s of c_.values())for(const n of s)t++,n.dlg&&(e++,i.push(n.dlg.kind));return{keys:c_.size,slots:t,dlgs:e,drafts:i}}setConfig(t){this._config={icon_size:2.5,show_temperature:!0,live_states:!0,show_signal:!0,...t},this._config.kiosk&&(this._booting=!1,this._bootFading=!1),t.default_floor&&(this._space=t.default_floor);try{this._zoomBySpace=JSON.parse(localStorage.getItem(g_)||"{}")||{}}catch{this._zoomBySpace={}}try{const t=JSON.parse(localStorage.getItem(v_)||"{}")||{};this._viewPreference=Object.fromEntries(Object.entries(t).filter(t=>"flat"===t[1]||"iso"===t[1]))}catch{this._viewPreference={}}this._labs=Cp(t_);try{const t=JSON.parse(localStorage.getItem(f_)||"null");this._kioskScale={icon:zs(t?.icon),font:zs(t?.font)}}catch{}try{const t=JSON.parse(localStorage.getItem(__)||"null");t&&t.config&&Array.isArray(t.config.spaces)&&(this._serverCfg=t.config,this._cfgEpoch++,this._cfgRev=t.rev||0,this._cfgContentFingerprint=t.config_fingerprint||ih(t.config),this._layout=t.layout||{},this._layoutRev=t.layout_rev||0,this._layoutContentFingerprint=t.layout_fingerprint||ih(this._layout),this._virtualLights=gn(t.virtual_lights,this._cfgRev),this._serverStorage=!0,this._adoptInitialSpace(this._model))}catch{}"view"!==this._mode||this._view||(this._zoom=this._zoomBySpace[this._space]||1),this.isConnected&&(this._warmAdopt(),this._warmLongReturn&&this._beginResumeSettle(),this._warmLongReturn=!1)}_warmAdopt(){if(this._config?.kiosk)return;const t=d_(this._config);if(this._warmKey===t&&this._warmSlot)return;this._warmSlot&&this._warmRelease();const e=this.parentNode,i=this._warmIdx(e),s=c_.get(t);if(!s||!s.length)return;const n=s.find(t=>t.owner===this._warmGen);if(n)return this._warmLongReturn=!!n.freed&&Date.now()-n.freed>=Xc,clearTimeout(n.evict),n.evict=0,n.freed=0,n.live=!0,this._warmSlot=n,this._warmKey=t,n.frameFingerprint&&this._continuity.adoptCompleteFrame(n.frameFingerprint),void(!this._devices.length&&n.devices?.length&&(this._devices=[...n.devices]));const{slot:o,sure:a}=((t,e,i,s)=>{const n=t=>{const e=!!i&&t.place?.deref()===i;return e&&t.idx===s?4:t.live?0:e?3:2};let o=null,a=0,r=0,l=null;for(const i of t){if(i.owner===e)continue;l=i;const t=n(i);t<=0||(t>a?(o=i,a=t,r=1):t===a&&r++)}return!o||r>1?{slot:o||l,sure:!1}:{slot:o,sure:!0}})(s,this._warmGen,e,i);o&&(this._warmLongReturn=!!o.freed&&Date.now()-o.freed>=Xc,this._booting=!1,this._bootFading=!1,this._hdrH=o.hdrH,this._bootSoft=!0,this.isConnected&&(clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)),this._warmKey=t,a?(clearTimeout(o.evict),o.evict=0,o.owner=this._warmGen,o.place=e?new WeakRef(e):null,o.idx=i,o.live=!0,this._warmSlot=o,this._warmVp=o.vp,o.frameFingerprint&&this._continuity.adoptCompleteFrame(o.frameFingerprint),!this._devices.length&&o.devices?.length&&(this._devices=[...o.devices]),this._warmAdoptViewport(this._config)):(this._warmSlot={owner:this._warmGen,path:location.pathname,place:e?new WeakRef(e):null,idx:i,live:!0,hdrH:o.hdrH,stageH:o.stageH,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0},s.push(this._warmSlot),this._warmTrim(s)))}_warmIdx(t){const e=t?.children;if(!e)return-1;for(let t=0;t4;){const e=t.findIndex(t=>!t.live);if(e<0)break;clearTimeout(t[e].evict),t.splice(e,1)}}_warmScheduleEvict(t,e){if(clearTimeout(t.evict),!(t.dlg||t.vp&&"view"!==t.vp.mode))return;const i=t.freed,s=t.owner;t.evict=window.setTimeout(()=>{if(t.evict=0,t.freed!==i||t.owner!==s)return;var n;t.dlg=null,t.vp=(n=t.vp)&&"view"!==n.mode?{...n,mode:"view",zoom:n.snap?.space===n.space?n.snap.zoom:n.zoom,view:null,snap:null,tool:"draw",decorTool:"select",showHidden:!1,selId:null,rszSel:null,decorSel:null}:n,t.frameFingerprint="";const o=c_.get(e);if(!t.live&&o&&o.length>1){const e=o.indexOf(t);e>=0&&o.splice(e,1)}},u_+250)}_warmAdoptViewport(t){const e=this._warmVp;if(!e||this._warmSlot?.path!==location.pathname)return void(this._warmVp=null);if(this._hashApplied||!this._model.find(t=>t.id===e.space))return void(this._warmVp=null);this._space=e.space,this._navApplied=!0,this._adoptMode("view"!==e.mode&&this._canEdit&&!t.kiosk?e.mode:"view"),this._pendingNavMode="view"===e.mode||this._canEdit||t.kiosk?null:e.mode,this._zoom=e.zoom;const i=this._effectiveProjection(),s=i===e.projection&&this._labsIso===e.activeLabsIso;if(this._view=s&&e.view?{...e.view}:null,this._viewModeSnap=s&&e.snap?{...e.snap}:null,!s&&e.logicalCenter){const t="iso"===i?Rp([e.logicalCenter.x,e.logicalCenter.y],0):[e.logicalCenter.x,e.logicalCenter.y];this._applyView(e.zoom,t[0],t[1])}var n;this._tool="openwall"===(n=e.tool)||"closewall"===n?"boundary":"opening"===(n=function(t){return"partition"===t?"draw":t}(n))?"draw":"string"==typeof n&&k_.has(n)?n:"draw",this._decorTool=e.decorTool,this._showHidden=e.showHidden,this._showFar!==e.showFar&&(this._showFar=e.showFar,this._frame=null),this._selId=e.selId,this._rszSel=e.rszSel,this._decorSel=e.decorSel,this._warmVpArmed=!0}_warmPatch(t,e=!1){if(this._config?.kiosk)return;const i=d_(this._config);if(!this._warmSlot||this._warmKey===i){if(!this._warmSlot){if(!e)return;const t=this.parentNode;this._warmKey=i,this._warmSlot={owner:this._warmGen,path:location.pathname,place:t?new WeakRef(t):null,idx:this._warmIdx(t),live:!0,hdrH:this._hdrH,stageH:0,vp:null,frameFingerprint:"",devices:null,dlg:null,freed:0,evict:0};const s=c_.get(i)||[];for(s.push(this._warmSlot),c_.set(i,s),this._warmTrim(s);c_.size>8;){const t=c_.keys().next().value;if(void 0===t||t===i)break;for(const e of c_.get(t)||[])clearTimeout(e.evict);c_.delete(t)}}Object.assign(this._warmSlot,t)}}_warmViewportState(){const t=this._effectiveProjection();return{space:this._space,mode:this._mode,projection:t,activeLabsIso:this._labsIso,logicalCenter:this._logicalViewCenter(t),zoom:this._zoom,view:this._view?{...this._view}:null,snap:this._viewModeSnap?{...this._viewModeSnap}:null,tool:this._tool,decorTool:this._decorTool,showHidden:this._showHidden,showFar:this._showFar,selId:this._selId,rszSel:this._rszSel,decorSel:this._decorSel}}_warmDialogState(){const t=(t,e)=>({kind:t,space:this._space,mode:this._mode,data:e});return this._tapConfirm||this._alignDialog||this._mergeDialog||this._importDialog||this._backupExportDialog||this._backupImportDialog?null:this._openingInfo?t("openingInfo",this._openingInfo.id):this._infoCard?t("info",this._infoCard.id):this._rulesDialog?this._rulesDialog.busy?null:t("rules",this._rulesDialog):this._settingsDialog?this._settingsDialog.busy?null:t("settings",this._settingsDialog):this._markerDialog?this._markerDialog.busy?null:t("marker",this._markerDialog):this._openingDialog?t("opening",this._openingDialog):this._backdropDialog?t("backdrop",this._backdropDialog):this._decorShapeDialog?t("decorShape",this._decorShapeDialog):this._decorTextDialog?t("decorText",this._decorTextDialog):this._roomDialog?t("room",{editId:this._roomEditId,fill:this._roomFill,customFill:this._roomCustomFill,tempSrc:this._roomTempSrc,humSrc:this._roomHumSrc,srcOpen:this._roomSrcOpen,srcFilter:this._roomSrcFilter,nameScale:this._roomNameScale,labelScale:this._roomLabelScale,areaSel:this._areaSel,nameSel:this._nameSel,pendingSplit:this._pendingSplit,wallFaceBatch:this._wallFaceBatch,path:this._path}):this._spaceDialog?this._spaceDialog.busy?null:t("space",this._spaceDialog):null}_warmSnapshot(){if(this._booting||this._config?.kiosk||"steady"!==this._continuity.state)return;const t={vp:this._warmViewportState(),frameFingerprint:this._continuity.frameFingerprint,devices:this._devices};if(this._warmRevivePending||(t.dlg=this._warmDialogState()),this.isConnected&&this._warmSlot?.owner===this._warmGen){const e=this.parentNode;t.place=e?new WeakRef(e):null,t.idx=this._warmIdx(e)}this._warmPatch(t)}_warmReviveDialog(){this._warmRevivePending=!1;const t=this._warmSlot;if(this._warmReviveTimer=void 0,!t||!t.dlg)return;const e=t.dlg,i=t.freed;if(t.dlg=null,t.freed=0,clearTimeout(t.evict),t.evict=0,i&&!(Date.now()-i>u_)&&e.space===this._space&&e.mode===this._mode){switch(e.kind){case"space":this._spaceDialog={...e.data,busy:!1,savedBusy:!1};break;case"marker":this._markerDialog={...e.data,busy:!1};break;case"settings":this._settingsDialog={...e.data,busy:!1};break;case"rules":this._rulesDialog={...e.data,busy:!1};break;case"opening":this._openingDialog={...e.data};break;case"backdrop":this._backdropDialog={...e.data};break;case"decorShape":this._decorShapeDialog={...e.data};break;case"decorText":{this._decorTextDialog={...e.data};const t=String(this._decorTextDialog?.text??"").length;this._decorTextSelection={start:t,end:t};break}case"room":{const t=e.data;this._roomEditId=t.editId,this._roomFill=t.fill,this._roomCustomFill=t.customFill||null,this._roomTempSrc=t.tempSrc,this._roomHumSrc=t.humSrc,this._roomSrcOpen=t.srcOpen,this._roomSrcFilter=t.srcFilter,this._roomNameScale=t.nameScale,this._roomLabelScale=t.labelScale,this._areaSel=t.areaSel,this._nameSel=t.nameSel,this._pendingSplit=t.pendingSplit,this._wallFaceBatch=t.wallFaceBatch||null,this._path=t.path,this._wallFaceBatch&&(this._activeDraftId=this._wallFaceBatch.activeDraftId,this._draftSegmentCms=[...this._wallFaceBatch.activeCms]),this._roomDialog=!0;break}case"info":{const t=this._devices.find(t=>t.id===e.data);t&&(this._infoCard=t);break}case"openingInfo":{const t=(this._curSpaceCfg?.openings||[]).find(t=>t.id===e.data);t&&(this._openingInfo=t);break}}this.requestUpdate()}}_cacheSnapshot(){if(this._serverCfg)try{this._cfgContentFingerprint=ih(this._serverCfg),this._layoutContentFingerprint=ih(this._layout),this._virtualLights=function(t,e,i){if(t.configRev===i)return t;const s=new Set((Array.isArray(e?.markers)?e.markers:[]).filter(yn).map(t=>t.id));return{...t,configRev:i,off:new Set([...t.off].filter(t=>s.has(t)))}}(this._virtualLights,this._serverCfg,this._cfgRev),localStorage.setItem(__,JSON.stringify({config:this._serverCfg,rev:this._cfgRev,config_fingerprint:this._cfgContentFingerprint,layout:this._layout,layout_rev:this._layoutRev,layout_fingerprint:this._layoutContentFingerprint,virtual_lights:fn(this._virtualLights)}))}catch{}}_beginContinuityCandidate(t,e,i="plan"){return this._booting&&!this._continuity.hasCompleteFrame?this._continuity.token:(this._continuityDataReady=e,this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._resumeSettling=!0,this._continuity.beginCandidate(t,i))}_continuityStageValid(){const t=this._stageEl;return!!t&&t.clientWidth>0&&t.clientHeight>0}_continuityAssetsReady(){if(!this._model.length)return!1;const t=this._model.length?this._spaceModel():null;return!t?.bg?.href||this._signer.isReady(this.hass,t.bg.href)}_initialSpaceSelection(t){return function(t){const e=new Set(t.spaceIds.filter(t=>!!t));if(!e.size)return{id:null,source:"none"};const i=[["hash",!1===t.acceptHash?null:t.hashSpace],["current",t.preserveCurrent?t.currentSpace:null],["saved",t.savedSpace],["default",t.defaultSpace],["first",t.spaceIds[0]]];for(const[t,s]of i)if(s&&e.has(s))return{id:s,source:t};return{id:null,source:"none"}}({spaceIds:t.map(t=>t.id),hashSpace:this._hashSpace(),acceptHash:!this._hashApplied,currentSpace:this._space,preserveCurrent:this._hashApplied||this._navApplied||this._warmVpArmed,savedSpace:this._savedNav()?.space,defaultSpace:this._config?.default_floor})}_adoptInitialSpace(t){const e=this._initialSpaceSelection(t);return e.id?(this._space=e.id,"hash"===e.source&&(this._hashApplied=!0),"saved"===e.source&&(this._navApplied=!0),e):e}_candidateBackdrop(t,e=this._space){const i=Vl(t),s=this._initialSpaceSelection(i).id||(i.some(t=>t.id===e)?e:i[0]?.id);return i.find(t=>t.id===s)?.bg?.href||""}_visualFrameFingerprint(){const t=this._stageEl,e=t?[t.clientWidth,t.clientHeight]:[0,0];return sh([this._cfgRev,this._cfgContentFingerprint||ih(this._serverCfg),this._layoutRev,this._layoutContentFingerprint||ih(this._layout),this._space,this._mode,this._view,e,this._glowScreenBlend?"screen":"normal",this.hass?.themes?.darkMode??this.hass?.themes?.default_theme??""])}_settleContinuityFrame(){if(this._booting||!this._continuityStageValid())return;if(!this._continuity.hasCompleteFrame&&"steady"===this._continuity.state)return void(this._continuityAssetsReady()&&(this._renderSnapshotAt=Date.now(),this._continuity.markCompleteFrame(this._visualFrameFingerprint())));if(!this._continuityDataReady)return;if(!["holding","offline-stale","overlay-pending","overlay-visible","candidate-ready"].includes(this._continuity.state))return;const t=this._continuity.token;if(this._candidateDeviceSnapshot&&this._candidateDeviceSnapshot!==this._visibleDeviceSnapshot&&this._stagedDeviceSnapshotToken!==t)return this._stagedDeviceSnapshotToken=t,void this.requestUpdate();this._continuityPaintToken!==t&&(this._continuityPaintToken=t,this._continuity.candidateReady(t)&&this._continuity.commitAfterPaint(t,{updateComplete:()=>this.updateComplete,stageValid:()=>this.isConnected&&this._continuityStageValid(),assetsReady:()=>this._continuityAssetsReady(),frameFingerprint:()=>this._visualFrameFingerprint()}).then(e=>{e&&t===this._continuity.token?(this._resumeSettling=!1,this._renderSnapshotAt=Date.now(),this._candidateDeviceSnapshot&&(this._visibleDeviceSnapshot=this._candidateDeviceSnapshot),this._candidateDeviceSnapshot=null,this._stagedDeviceSnapshotToken=-1,this._warmSnapshot()):t===this._continuity.token&&(this._continuityPaintToken=-1,this._stagedDeviceSnapshotToken=-1,this._candidateDeviceSnapshot=null,this.requestUpdate())}))}_onBackdropLoaded(t,e){this._signer.markLoaded(this.hass,t,e),this._continuity.note("asset-ready"),this._continuityPaintToken=-1,"steady"!==this._continuity.state&&this.requestUpdate()}_renderRecoveryOverlay(){if(!this._continuity.overlayVisible&&"recovery-error"!==this._continuity.state)return G;const t="connection"===this._continuity.recoveryReason;return j`
t.stopPropagation()} @click=${t=>t.stopPropagation()} @@ -4560,7 +4560,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 style="left:${r.toFixed(1)}%;top:${l.toFixed(1)}%" @click=${t=>{t.stopPropagation(),this._fitAll()}}> - `}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:Oi(t,this._stageAspect())}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,a=i+s-e+n;return Math.max(Math.min(o,a),Math.min(Math.max(o,a),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=Oi(s,this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),a=n.w/o,r=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-a/2,y:h-r/2,w:a,h:r},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Xc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=Oi(this._baseVb(),this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const a=s.clientWidth,r=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/a*c,y:l[1]-e/r*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=Oi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(g_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=Oi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&(this._slideTo(n,i<0?"left":"right"),this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&S_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},C_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),a=(t.clientX-this._drag.sx)/n.width*o.w,r=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=ec(this._drag.ox+a),c=ec(this._drag.oy+r);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}get _noHover(){return D_._noHoverMq||D_._touchSeen}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse","touch"!==t.pointerType&&"pen"!==t.pointerType||(D_._touchSeen=!0,this._tip&&(this._tip=null))}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if("touch"===e.pointerType)if(this._notePointer(e),"pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type){if(this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._noHover||this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o})}get _gridPitch(){return Jl}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return li(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,y_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return ui(t?.rooms||[]).map(t=>[t[0]*y_,t[1]*e,t[2]*y_,t[3]*e])}_savedNav(){try{return JSON.parse(localStorage.getItem(m_)||"null")}catch{return null}}_saveNav(){try{localStorage.setItem(m_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),a=this._modeTransitionBusy,r=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=a&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(a?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:a?this._modeTransitionTargetCenterX:r?.viewport.centerX,u=c?c.centerY:a?this._modeTransitionTargetCenterY:r?.viewport.centerY;if("view"===s&&"view"!==t&&!a){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||a||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:r?.viewport.centerX,centerY:r?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?Rp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?r?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=r,this._prepareModeTransition(p,r,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(r,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=mr(pr,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?mr(pr,this._imperial):this._drawWallField}get _drawWallCm(){const t=a_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?$l:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?$l:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:mr(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=bd(this._path,this._draftSegmentCms,pr),i=e.length;if((t.partitions||[]).length+i>$_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=$_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[ec(ri(t[0],e)),ec(ri(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const a=Math.PI/4;let r=Math.atan2(o,n);r<0&&(r+=2*Math.PI);const l=Math.floor(r/a+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Yl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=vl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,a=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-a,e.x+o,e.y+a])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(ld(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const a=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>ld(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of a){if(md(t.point,n,s))continue;const a=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);a>i.tolerance||!fd(a,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:a})}if(o)return o;let r=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],a=Ns([e[0],e[1]],t);if(a>i.tolerance)continue;const l=vd(o,e,i.gridStep);!md(l,n,s)&&fd(a,o.key,r)&&(r={kind:"line",point:l,key:o.key,distance:a,segment:o})}return r}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool&&"partition"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return fi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Kl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:xl(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Sl(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=Fc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Tr(t.walls,t.rooms||[],Zl,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"!==this._tool&&"partition"!==this._tool||this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._space=t.spaceId,this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&wi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&Di(t,i)})}_pointInRoom(t,e){return e.poly?vi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!va(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>$_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("partition"===this._tool)return void this._partitionClick(s,t.shiftKey);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const a=this._draftEndAt(n,this._activeDraftId||void 0);if(a)return void this._mergeDraftEndpoint(a);if(!this._canAppendRoomDraftPoint())return;const r=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(r)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,a=n.find(e=>e.id===t.draft.id);if(!a)return;const r=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(a.segments||[]).map(t=>({...t})):[...a.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,r[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?r.slice(1):r],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(a.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Pi(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||a,id:b,points:m.map(t=>[t[0]/y_,t[1]/y_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:yd,s=Bd(t,i),n=new Map,o=new Map,a=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Sd(t.a,i),s=Sd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const r=new Map;for(const[t,e]of o){const i=n.get(t);r.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Sd(t.a,i),Sd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Md(u,p));const s=r.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=$d(g);if(!(m>i*i))continue;const f=Cd(Dd(e,n,i)),v=new Set;for(const t of d)for(const e of a.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let a;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);a=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!a.length)return;for(const t of s.rooms){const e=hi(t);if(!t.id||!e)continue;const i=Ei(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Pi(s)>=Pi(n)?s:n,r=o===s?n:s,l=[...a].sort((t,e)=>Math.abs(t.area-Pi(r))-Math.abs(e.area-Pi(r))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:r.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:r},consumeAllActive:!0}])}const r=a.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));r.length&&this._beginWallFaceBatch(r)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_partitionClick(t,e){const i=this._resolvePlanDrawPoint(t,e).point;if(!this._path.length)return void(this._path=[i]);const s=this._path[0];if(this._samePt(s,i))return;const n=this._drawWallCm;if(null==n)return void this._showPhysicalRange(100);if(!this._curSpaceCfg||this._limitReached("partition"))return;const o=this._geometrySnapshot(),a=this._curSpaceCfg;a.partitions||=[];const r="partition-"+Date.now().toString(36);a.partitions.push({id:r,a:[s[0]/y_,s[1]/y_],b:[i[0]/y_,i[1]/y_],cm:n}),this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),this._recordGeometry(this._t("history.partition_add"),o),this._saveConfig()}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange($l);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:xl(i),angle:0},o=(s.wall_columns||[]).find(t=>Ll(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const a=this._geometrySnapshot(),r=this._curSpaceCfg;r.wall_columns||=[],r.wall_columns.push({...n,center:[e[0]/y_,e[1]/y_]}),this._recordGeometry(this._t("history.column_add"),a),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Sl(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:mr(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),C_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Hl(n,Tl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Dl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Hl(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const a=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),r=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===a&&r-l.at>380&&r-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:a,index:c,x:t.clientX,y:t.clientY,at:r},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Kl*y_-Math.min(...n),Math.min(Kl*y_-Math.max(...n),i[0])),Math.max(-Kl*y_-Math.min(...o),Math.min(Kl*y_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/y_,n.a[1]/y_],t.b=[n.b[0]/y_,n.b[1]/y_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=ed(t,[n],y_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,rd(t,i,y_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/y_,(n.center[1]+e.delta[1])/y_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),C_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Sl(e.angle),angle:Sl(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Sl(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?hi(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const a=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/y_,t[1]/a]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/y_,e.y=i[1]/a)}const r=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*y_,t[1]*a]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:pa(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),C_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const a=Math.sign(s);let r=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&r>1e-9;s++,r-=l){const s=a*r;if(xa(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const a=wa(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(a.polys),this._rszApplyPreview(a.polys,a.openings),this._rszLive=this._rszEdgeLabels(a,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Ma(t,e,i,s,n,o))return n;let a=1,r=n;for(let n=0;n<28;n++){const n=(a+r)/2;Ma(t,e,i,s,n,o)?a=n:r=n}return a}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),a=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),r=Sa(o,e.openings,a,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:r.poly},r.openings),this._rszLive=this._rszScaleLabels(r.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=fa(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Tr(n.walls,n.rooms||[],Zl,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,a=e.edge,r=(a+1)%o;for(const[t,e]of[[n[(a-1+o)%o],n[a]],[n[a],n[r]],[n[r],n[(r+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&nl(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||n,a=xi(o),r=u.length?zl(Fl(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(o,this._gridPitch,this._cellCm);s.push({x:a[0],y:a[1],text:Da(r,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),a=this._spaceWalls,r=a.length&&this._rszSel&&nl([{id:this._rszSel,poly:t}],this._rszSel,a,[],this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||t,l=xi(r),c=this._physicalBodiesR(),h=c.length?zl(Fl(r,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(r,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Da(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],a=this._rszRooms();for(const t of a)for(let i=0;i`}_stageAspect(){const t=this._stageEl,e=this._baseVb();return t&&t.clientHeight?t.clientWidth/t.clientHeight:e[2]/e[3]}_viewOr(t){return this._view&&this._view.w?this._view:Oi(t,this._stageAspect())}_screenToVb(t,e){const i=this._stageEl,s=this._viewOr(this._baseVb()),n=i?.clientWidth||1,o=i?.clientHeight||1;return[s.x+t/n*s.w,s.y+e/o*s.h]}_clampView(t,e){const i=(t,e,i,s)=>{const n=1*Math.max(e,s),o=i-n,a=i+s-e+n;return Math.max(Math.min(o,a),Math.min(Math.max(o,a),t))};return{w:t.w,h:t.h,x:i(t.x,t.w,e.x,e.w),y:i(t.y,t.h,e.y,e.h)}}_applyView(t,e,i){const s=this._baseVb(),n=Oi(s,this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,t)),a=n.w/o,r=n.h/o,l=this._viewOr(s),c=e??l.x+l.w/2,h=i??l.y+l.h/2,d=this._clampView({x:c-a/2,y:h-r/2,w:a,h:r},n);return!(this._view&&Math.abs(this._zoom-o)<1e-9&&Math.abs(this._view.x-d.x)<1e-6&&Math.abs(this._view.y-d.y)<1e-6&&Math.abs(this._view.w-d.w)<1e-6&&Math.abs(this._view.h-d.h)<1e-6)&&("opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=o,this._view=d,!0)}_bootWatch(){clearTimeout(this._bootTimer),this._bootStart=Date.now(),this._bootLastH=-1,this._bootLastChange=this._bootStart;const t=()=>{if(!this._booting)return;const e=Date.now(),i=this._stageEl?this._stageEl.clientHeight:0;i!==this._bootLastH&&(this._bootLastH=i,this._bootLastChange=e);const s=e-this._bootStart;s>=1200||s>=700&&i>0&&e-this._bootLastChange>=250?this._bootSettled():this._bootTimer=window.setTimeout(t,100)};this._bootTimer=window.setTimeout(t,100)}_bootSettled(){this._booting&&!this._bootSettling&&(this._bootSettling=!0,this._refitView(),this._bootSettleRaf=requestAnimationFrame(()=>{this._bootSettleRaf=0,this._finishBootSettled()}))}_finishBootSettled(){if(!this._booting)return;this._refitView(),this._booting=!1,this._bootSettling=!1;const t=this._stageEl?.clientHeight??0;!this._config?.kiosk&&t>0&&this._warmPatch({hdrH:this._hdrH,stageH:t,vp:this._warmViewportState()},!0),this._bootFading=!0,this._bootTimer=window.setTimeout(()=>{this._bootFading=!1},220),this._bootSoft=!0,clearTimeout(this._bootSoftTimer),this._bootSoftTimer=window.setTimeout(()=>{this._bootSoft=!1},o_)}_bootSoftCancel(){this._bootSoft&&(clearTimeout(this._bootSoftTimer),this._bootSoft=!1)}_beginResumeSettle(){this._booting||this._resumeSettling||(this._modeTransitionPreparing?this._modeTransitionForceAtomic=!0:this._cancelModeTransition(!0),this._viewportInvalidAt=0,this._beginContinuityCandidate("warm-resume",!1),this._loading?this.requestUpdate():this._loadFromServer())}_refitView(){if(this._modeTransitionBusy)return;const t=this._stageEl;if(!t||"visible"!==document.visibilityState||t.clientWidth<=0||t.clientHeight<=0)return void(this._viewportInvalidAt||(this._viewportInvalidAt=Date.now()));const e=[t.clientWidth,t.clientHeight],i=this._lastValidStageSize,s=!!i&&Math.abs(i[0]-e[0])<=.5&&Math.abs(i[1]-e[1])<=.5,n=this._viewportInvalidAt?Date.now()-this._viewportInvalidAt:0;if(this._viewportInvalidAt=0,!i)return this._lastValidStageSize=e,void(this._view||this._applyView(this._zoom));s?this._pendingRefitSize=null:(this._pendingRefitSize=e,this._refitRaf||(this._refitRaf=requestAnimationFrame(()=>{this._refitRaf=0;const t=this._pendingRefitSize;this._pendingRefitSize=null;const e=this._stageEl;if(!t||!e||e.clientWidth<=0||e.clientHeight<=0)return;if(Math.abs(e.clientWidth-t[0])>.5||Math.abs(e.clientHeight-t[1])>.5)return void this._refitView();const i=this._lastValidStageSize;if(i&&Math.abs(i[0]-t[0])<=.5&&Math.abs(i[1]-t[1])<=.5)return;this._lastValidStageSize=t;const s=this._view;n>=Xc?this._beginContinuityCandidate("stage-size-restored",!0,"stage-size"):this._continuity.hasCompleteFrame&&this._beginContinuityCandidate("stage-resize",!0,"stage-size"),this._applyView(this._zoom,s?s.x+s.w/2:void 0,s?s.y+s.h/2:void 0)})))}_zoomAt(t,e,i){const s=this._stageEl;if(!s)return;const n=Oi(this._baseVb(),this._stageAspect()),o=Math.min(D_.ZOOM_MAX,Math.max(D_.ZOOM_MIN,i));"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1));const a=s.clientWidth,r=s.clientHeight,l=this._screenToVb(t,e),c=n.w/o,h=n.h/o;this._zoom=o,this._view=this._clampView({x:l[0]-t/a*c,y:l[1]-e/r*h,w:c,h:h},n)}_onWheel(t){const e=this._stageEl;if(!e)return;t.preventDefault();const i=e.getBoundingClientRect(),s=t.deltaY<0?1.15:1/1.15;this._zoomAt(t.clientX-i.left,t.clientY-i.top,this._zoom*s),this._saveZoom()}_stepZoom(t){const e=this._stageEl;e&&(this._zoomAt(e.clientWidth/2,e.clientHeight/2,this._zoom*(t>0?1.4:1/1.4)),this._saveZoom())}_resetZoom(){const t=this._baseVb();"opening"===this._tool&&(this._cursorPt=null,this._clearOpeningPlacement(!1)),this._zoom=1,this._view=Oi(t,this._stageAspect()),this._saveZoom()}_saveZoom(){if("view"===this._mode){this._zoomBySpace={...this._zoomBySpace,[this._space]:this._zoom};try{localStorage.setItem(g_,JSON.stringify(this._zoomBySpace))}catch{}}}_restoreZoom(){const t=this._zoomBySpace[this._space]||1;this._zoom=t;const e=this._stageEl;if(e&&e.clientHeight){const e=this._baseVb();return this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),void this.requestUpdate()}this._view=null,requestAnimationFrame(()=>{if(!this._stageEl)return;const e=this._baseVb();this._applyView(t,e[0]+e[2]/2,e[1]+e[3]/2),this.requestUpdate()})}_stagePointerDown(t){if(this._vacFit)return;if(this._kiosk&&(this._cyclePausedUntil=Date.now()+6e4,0===this._pointers.size?(this._swipeStart={x:t.clientX,y:t.clientY,id:t.pointerId},t.target.closest?.(".dev, .roomlabel, .oplock")||(clearTimeout(this._kioskHoldTimer),this._kioskHoldTimer=window.setTimeout(()=>{this._kioskDialog=!0,this._swipeStart=null},3e3))):(this._swipeStart=null,clearTimeout(this._kioskHoldTimer))),this._drag)return;if(this._markup&&t.target.closest?.(".roomlabel, .rlhandle, .rszhandle, .dev, .oplock, .op-hit, button"))return;if("devices"===this._mode&&t.target.closest(".dev"))return;if("decor"===this._mode&&this._decorPointerDown(t))return;this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});const e=this._viewOr(this._baseVb());if(1===this._pointers.size)this._panStart={sx:t.clientX,sy:t.clientY,vx:e.x,vy:e.y},this._panLock=null,this._suppressClick=!1;else if(2===this._pointers.size){this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y);this._pinchStart={dist:e,zoom:this._zoom},this._panStart=null,this._panLock=null}}get _swipeZone(){return this._kiosk&&this._zoom<=1.001&&this._model.length>1}_stagePointerMove(t){if(this._physicalRotate?.pid!==t.pointerId)if(this._physicalDrag?.pid!==t.pointerId)if(this._dtDrag?.pid!==t.pointerId)if(this._bdDrag?.pid!==t.pointerId){if(this._decorDraft?.pid===t.pointerId){const e=this._decorDraft;let i=this._decorSnap(this._svgPoint(t),t.pointerType);if(t.shiftKey&&("rect"===e.kind||"ellipse"===e.kind)){const t=i[0]-e.a[0],s=i[1]-e.a[1],n=Math.max(Math.abs(t),Math.abs(s));i=this._snap([e.a[0]+(t<0?-n:n),e.a[1]+(s<0?-n:n)])}return void(this._decorDraft={...e,b:i})}if(this._decorMove?.pid!==t.pointerId)if(this._pointers.has(t.pointerId)){if(this._pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),this._markup&&1===this._pointers.size&&this._markupMove(t),this._pinchStart&&this._pointers.size>=2){"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const t=[...this._pointers.values()],e=Math.hypot(t[0].x-t[1].x,t[0].y-t[1].y)/(this._pinchStart.dist||1),i=this._stageEl.getBoundingClientRect(),s=(t[0].x+t[1].x)/2-i.left,n=(t[0].y+t[1].y)/2-i.top;this._zoomAt(s,n,this._pinchStart.zoom*e),this._suppressClick=!0,this._saveZoom()}else if(this._panStart){const e=t.clientX-this._panStart.sx,i=t.clientY-this._panStart.sy;Math.abs(e)+Math.abs(i)>4&&(this._suppressClick=!0,clearTimeout(this._holdTimer),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover()),null===this._panLock&&Math.abs(e)+Math.abs(i)>8&&(this._panLock=this._swipeZone&&Math.abs(e)>1.5*Math.abs(i)?"swipe":"pan");const s=this._stageEl;if("pan"===this._panLock&&s){const t=this._baseVb(),n=this._viewOr(t),o=Oi(t,this._stageAspect());this._view=this._clampView({x:this._panStart.vx-e/(s.clientWidth||1)*n.w,y:this._panStart.vy-i/(s.clientHeight||1)*n.h,w:n.w,h:n.h},o)}}}else this._markupMove(t);else this._decorMoveUpdate(t)}else this._bdMove(t);else this._dtMove(t);else this._physicalMove(t);else this._physicalRotateMove(t)}_stagePointerLeave(t){this._markup&&("opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover())}_stagePointerUp(t){if(this._kiosk){clearTimeout(this._kioskHoldTimer);const e=this._swipeStart;if(this._swipeStart=null,e&&e.id===t.pointerId){const i=t.clientX-e.x,s=t.clientY-e.y;if(Math.abs(i)+Math.abs(s)<8){const t=Date.now();t-this._lastTap<350&&this._resetZoom(),this._lastTap=t}const n="pan"===this._panLock?null:function(t,e,i,s,n,o=60){if(i>1.001||s.length<2)return null;if(Math.abs(t)t.id),this._space);n&&(this._slideTo(n,i<0?"left":"right"),this._saveNav(),this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._showKioskDots())}}if(this._physicalDrag?.pid===t.pointerId)return void this._physicalUp(t);if(this._physicalRotate?.pid===t.pointerId)return void this._physicalRotateUp(t);if(this._dtDrag?.pid===t.pointerId)return void this._dtUp();if(this._bdDrag?.pid===t.pointerId)return void this._bdUp();if(this._decorDraft?.pid===t.pointerId)return void this._decorCommitDraft();if(this._decorMove?.pid===t.pointerId)return this._decorMove.moved&&(this._recordGeometry(this._t("history.decor_move"),this._decorMove.before),this._saveConfig()),void(this._decorMove=null);const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null,setTimeout(()=>this._suppressClick=!1,0)),e&&0===this._pointers.size&&this.requestUpdate()}_clickRoom(t){!this._suppressClick&&t.area&&S_("/config/areas/area/"+t.area)}_pointerDown(t,e){if("plan"===this._mode)return;if("view"===this._mode){this._holdFired=!1,clearTimeout(this._holdTimer);const i=t.pointerId,s=t.currentTarget;return void(this._holdTimer=window.setTimeout(()=>{this._holdFired=!0,this._interruptViewGesture(i,s),this._infoCard=e},600))}if("ha_disabled"===e.bindingStatus?.kind)return;t.preventDefault();const i=this._pos(e);this._drag={id:e.id,sx:t.clientX,sy:t.clientY,ox:i.x,oy:i.y,moved:!1},C_(t),this._tip=null}_pointerMove(t,e){if(!this._drag||this._drag.id!==e.id)return;const i=this.renderRoot.querySelector(".stage");if(!i)return;const s=this._baseVb(),n=i.getBoundingClientRect(),o=this._viewOr(s),a=(t.clientX-this._drag.sx)/n.width*o.w,r=(t.clientY-this._drag.sy)/n.height*o.h;Math.abs(t.clientX-this._drag.sx)+Math.abs(t.clientY-this._drag.sy)>3&&(this._drag.moved=!0,clearTimeout(this._holdTimer));const l=ec(this._drag.ox+a),c=ec(this._drag.oy+r);this._savePos(e,l,c)}_pointerUp(t,e){if(clearTimeout(this._holdTimer),!this._drag||this._drag.id!==e.id)return;const i=this._drag.moved;this._drag=i?this._drag:null,i&&(this._selId=e.id,window.setTimeout(()=>this._drag=null,0))}_showToast(t){for(const t of this.renderRoot.querySelectorAll("hp-dialog"))t.closeTransientOverlays("toast");this._toast=t,clearTimeout(this._toastTimer),this._toastTimer=window.setTimeout(()=>{this._toast=""},3500)}get _noHover(){return D_._noHoverMq||D_._touchSeen}_notePointer(t){this._boundaryPointerType=t.pointerType||"mouse","touch"!==t.pointerType&&"pen"!==t.pointerType||(D_._touchSeen=!0,this._tip&&(this._tip=null))}_guardTouchGesture(t){if(this._editorSecondary.handleOutsideDismiss(t))return;if("click"===t.type){if(!this._suppressClick&&!this._touchSequenceMultitouch&&Date.now()>this._touchClickBlockUntil)return;return t.preventDefault(),void t.stopImmediatePropagation()}const e=t;if("touch"===e.pointerType)if(this._notePointer(e),"pointerdown"!==t.type){if("pointermove"===t.type){const t=this._touchContacts.get(e.pointerId);if(!t)return;const i={...t,x:e.clientX,y:e.clientY};if(this._touchContacts.set(e.pointerId,i),this._touchSequenceMultitouch&&"view"===this._mode&&!this._vacFit&&this._pinchStart&&[...this._touchContacts.values()].every(t=>t.inStage)){this._pointers.set(e.pointerId,{x:e.clientX,y:e.clientY});const t=[...this._touchContacts.values()];if(t.length>=2&&this._stageEl){const[e,i]=t,s=Math.hypot(e.x-i.x,e.y-i.y)/(this._pinchStart.dist||1),n=this._stageEl.getBoundingClientRect();this._zoomAt((e.x+i.x)/2-n.left,(e.y+i.y)/2-n.top,this._pinchStart.zoom*s),this._saveZoom()}}return}if("pointerup"===t.type||"pointercancel"===t.type){if(this._touchContacts.delete(e.pointerId),this._touchSequenceMultitouch){if(this._touchClickBlockUntil=Date.now()+500,this._pointers.delete(e.pointerId),!this._vacFit&&this._pointers.size>=2){const[t,e]=[...this._pointers.values()];this._pinchStart={dist:Math.hypot(t.x-e.x,t.y-e.y),zoom:this._zoom}}else this._pinchStart=null;0===this._pointers.size&&(this._panStart=null,this._panLock=null)}0===this._touchContacts.size&&(this._touchSequenceMultitouch=!1)}}else if(this._touchContacts.set(e.pointerId,{x:e.clientX,y:e.clientY,inStage:!!e.target?.closest?.(".stage")}),this._touchContacts.size>=2){this._touchSequenceMultitouch=!0,this._touchClickBlockUntil=Number.POSITIVE_INFINITY,clearTimeout(this._holdTimer),clearTimeout(this._kioskHoldTimer),this._swipeStart=null;const t=[...this._touchContacts.values()];if("view"===this._mode&&!this._vacFit&&t.every(t=>t.inStage)){this._pointers=new Map([...this._touchContacts].map(([t,e])=>[t,{x:e.x,y:e.y}]));const[e,i]=t;this._pinchStart={dist:Math.hypot(e.x-i.x,e.y-i.y),zoom:this._zoom},this._panStart=null,this._panLock=null}else this._vacFit&&(this._pointers.clear(),this._pinchStart=null,this._panStart=null,this._panLock=null)}}_showTip(t,e,i,s,n,o){this._noHover||this._drag||(this._tip={x:t.clientX,y:t.clientY,title:e,meta:i,lqi:s,temp:n,hum:o})}get _gridPitch(){return Jl}get _cellCm(){const t=Number(this._curSpaceCfg?.cell_cm);return Number.isFinite(t)&&t>0?t:5}_fmtLen(t,e){const i=function(t,e,i,s){return Math.hypot(e[0]-t[0],e[1]-t[1])/i*s}(t,e,this._gridPitch,this._cellCm);return li(i,"mi"===this.hass?.config?.unit_system?.length)}get _curSpaceCfg(){const t=this._rszPreview;return t&&t.space===this._space?t.sp:this._serverCfg?.spaces.find(t=>t.id===this._space)}get _renderCfg(){const t=this._rszPreview;return t&&this._serverCfg?{...this._serverCfg,spaces:this._serverCfg.spaces.map(e=>e.id===t.space?t.sp:e)}:this._serverCfg}get _spaceH(){return this._curSpaceCfg,y_}get _segments(){const t=this._curSpaceCfg,e=this._spaceH;return ui(t?.rooms||[]).map(t=>[t[0]*y_,t[1]*e,t[2]*y_,t[3]*e])}_savedNav(){try{return JSON.parse(localStorage.getItem(m_)||"null")}catch{return null}}_saveNav(){try{localStorage.setItem(m_,JSON.stringify({space:this._space}))}catch{}}_leaveCardRoute(){if(this._routeDepartureHandled)return;this._routeDepartureHandled=!0,"view"!==this._mode&&this._setMode("view",!1),this._pendingNavMode=null,this._geometryHistory.clear(),this._activeDraftId=null,this._resumeDraftBySpace={},this._draftSegmentCms=[],this._closingWallCm=null,this._drawWallField=null,this._showHidden=!1,this._tapConfirm=null,this._vacCalConfirm=null,this._decorEraseConfirm=null,this._openingInfo=null,this._closeInfoCard(),this._rulesDialog=null,this._alignDialog=null,this._backupImportDialog=null,this._backupExportDialog=null,this._settingsDialog=null,this._markerDialog=null,this._openingDialog=null,this._physicalDialog=null,this._wallDialog=null,this._backdropDialog=null,this._decorShapeDialog=null,this._decorTextDialog=null,this._mergeDialog=null,this._roomDialog=!1,this._spaceDialog=null,this._importDialog=null;const t=this._warmSlot;t?.owner===this._warmGen&&(t.vp=this._warmViewportState(),t.dlg=null,t.frameFingerprint="",clearTimeout(t.evict),t.evict=0),this._saveNav()}_setMode(t,e=!0){this._pendingNavMode=null;const i=this._spaceModel();if(!i)return this._cancelModeTransition(!1),void(this._mode="view");if(this._kiosk&&"view"!==t)return;if(this._mode===t){if(!e&&"view"===t&&this._modeTransitionBusy){const e=this._currentModeVisual(t),i=this._modeTransitionTargetZoom,s=this._modeTransitionTargetCenterX,n=this._modeTransitionTargetCenterY;this._cancelModeTransition(!1),this._commitViewModeAtomic(e,i,s,n)}return}if(this._bootSoftCancel(),("plan"===t||"decor"===t)&&!this._norm)return void this._showToast(this._t("toast.markup_needs_server"));if(this._wallFaceBatch&&this._roomDialogCancel(),"plan"===this._mode&&"draw"===this._tool&&!this._finishWallChain())return;const s=this._mode,n=this._effectiveProjection(),o=this._currentModeVisual(s),a=this._modeTransitionBusy,r=o&&"view"!==s&&"view"!==t?{...o,toolbarContentOpacity:this._reducedMotion?1:.35}:o;this._cancelModeTransition(!1),this._editorSecondary.closeForNavigation(),(this._decorMove||this._dtDrag||this._bdDrag)&&this._cancelDecorGesture();const l=!i.bg&&"view"===t!=("view"===s),c=a&&"view"===s&&"view"!==t?this._modeTransitionEditorCamera:null;let h=c?.zoom??(a?this._modeTransitionTargetZoom:this._zoom),d=c?c.centerX:a?this._modeTransitionTargetCenterX:r?.viewport.centerX,u=c?c.centerY:a?this._modeTransitionTargetCenterY:r?.viewport.centerY;if("view"===s&&"view"!==t&&!a){const e=this._view;if(this._viewModeSnap={space:this._space,zoom:this._zoom,cx:e?this._logicalViewCenter(n)?.x:void 0,cy:e?this._logicalViewCenter(n)?.y:void 0},"iso"===n){const e=this._logicalViewCenter("iso");d=e?.x,u=e?.y,this._view=null,this._mode=t,this._applyView(this._zoom,e?.x,e?.y)}l&&(h=1,d=void 0,u=void 0)}if("plan"===s&&this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._mode=t,this._editorChromeMode="view"===t?s:t,"view"===t){"view"===s||a||(this._modeTransitionEditorCamera={zoom:this._zoom,centerX:r?.viewport.centerX,centerY:r?.viewport.centerY});const t=this._viewModeSnap;if(t&&t.space===this._space){h=t.zoom;const e=this._labsIso&&"iso"===this._viewPreference[this._space]?"iso":"flat",i=null!=t.cx&&null!=t.cy&&"iso"===e?Rp([t.cx,t.cy],0):null;d=i?.[0]??t.cx,u=i?.[1]??t.cy}else t&&(h=this._zoomBySpace[this._space]||1,d=void 0,u=void 0)}else this._modeTransitionEditorCamera={zoom:h,centerX:d,centerY:u};this._modeTransitionTargetZoom=h,this._modeTransitionTargetCenterX=d,this._modeTransitionTargetCenterY=u,("iso"===n||"view"===t&&this._labsIso&&"iso"===this._viewPreference[this._space])&&(this._modeTransitionForceAtomic=!0);const p=++this._modeTransitionRequest;e?r?(this._modeTransitionPreparing=!0,this._modeTransitionVisual=r,this._prepareModeTransition(p,r,t,h,d,u)):(this._modeTransitionPreparing=!1,this._modeTransitionVisual=null,this._zoom=h,this._view=null,requestAnimationFrame(()=>{this.isConnected&&p===this._modeTransitionRequest&&this._mode===t&&(this._applyView(h,d,u),"view"===t&&(this._viewModeSnap=null,this._modeTransitionEditorCamera=null),this.requestUpdate())})):"view"===t&&this._commitViewModeAtomic(r,h,d,u),this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!0),this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._tool="draw",this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._selId=null,this._physicalSel=null,this._physicalDialog=null,this._physicalDrag=null,this._rszSel=null,this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._tip=null,this._hoverRoom=null,this._decorDraft=null,this._decorSel=null,this._decorMove=null,this._backdropDialog=null,this._decorTool="select",this._bdDrag=null,this._dtDrag=null,this._dtBox=null,"plan"===t&&(this._primeDrawWallField(),this._resumeLastDraft()),this._saveNav()}_primeDrawWallField(){null===this._drawWallField&&(this._drawWallField=mr(pr,this._imperial))}get _drawWallFieldValue(){return null===this._drawWallField?mr(pr,this._imperial):this._drawWallField}get _drawWallCm(){const t=a_(this._drawWallFieldValue);if(null==t||t<=0)return null;const e=this._imperial?2.54*t:t,i="column"===this._tool?$l:100;return e>=1&&e<=i?e:null}get _drawWallMaxCm(){return"column"===this._tool?$l:100}_showPhysicalRange(t=this._drawWallMaxCm){this._showToast(this._t("toast.physical_range",{max:mr(t,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")}))}_draftSegmentCount(t=this._curSpaceCfg){return(t?.room_drafts||[]).reduce((t,e)=>t+(Array.isArray(e.segments)?e.segments.length:0),0)}_finishWallChain(){if("draw"!==this._tool||this._wallFaceBatch||this._roomDialog)return!0;const t=this._curSpaceCfg;if(!t||this._path.length<2)return this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0;const e=bd(this._path,this._draftSegmentCms,pr),i=e.length;if((t.partitions||[]).length+i>$_)return this._showToast(this._t("toast.physical_limit")),!1;const s=this._geometrySnapshot();t.partitions||=[];const n=Date.now().toString(36);for(let s=0;st.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),this._recordGeometry(this._t("history.wall_chain_finish"),s),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),!0}_activateMarkupTool(t){t!==this._tool&&(this._wallFaceBatch&&this._roomDialogCancel(),("draw"!==this._tool||this._finishWallChain())&&(this._cancelPath(),this._tool=t,"draw"===t&&this._resumeLastDraft(),"resize"===t&&(this._rszSel=null),"boundary"!==t&&"wallthick"!==t||(this._wallDialog=null)))}_limitReached(t){const e=this._curSpaceCfg;if(!e)return!0;const i="draft"===t?(e.room_drafts||[]).length>=200:"partition"===t?(e.partitions||[]).length>=$_:(e.wall_columns||[]).length>=500;return i&&this._showToast(this._t("toast.physical_limit")),i}_svgPoint(t){const e=this.renderRoot.querySelector(".stage").getBoundingClientRect();return this._screenToVb(t.clientX-e.left,t.clientY-e.top)}_snap(t){const e=this._gridPitch;return[ec(ri(t[0],e)),ec(ri(t[1],e))]}_snapDrawPoint(t,e=!1){const i=this._path[this._path.length-1],s=e&&i?function(t,e,i,s=1/0){if(!(i>0&&t?.every(Number.isFinite)&&e?.every(Number.isFinite)))return[e[0],e[1]];const n=e[0]-t[0],o=e[1]-t[1];if(Math.abs(n)+Math.abs(o)<=1e-12)return[t[0],t[1]];const a=Math.PI/4;let r=Math.atan2(o,n);r<0&&(r+=2*Math.PI);const l=Math.floor(r/a+.5)%8,[c,h]=[[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]][l],d=c*c+h*h;let u=Math.max(0,Math.round((n*c+o*h)/(i*d)));if(Number.isFinite(s)&&s>=0){const e=(t,e)=>{if(!e)return 1/0;const n=e>0?s-t:t+s;return Math.max(0,Math.floor((n+1e-9*i)/i))};u=Math.min(u,e(t[0],c),e(t[1],h))}return[t[0]+c*u*i,t[1]+h*u*i]}(i,t,this._gridPitch,Yl):t;return this._snap(s)}_planSnapOpeningCuts(t,e){if(!this._openingsR.length)return[];const i=this._openingWallIndexFor(t,e).value,s=[];for(const e of this._roomWallOpeningInputs(this._openingsR,t)){const t=vl(i,e);if(!t.negative&&!t.positive)continue;const n=e.angle*Math.PI/180,o=Math.cos(n)*e.length/2,a=Math.sin(n)*e.length/2;s.push([e.x-o,e.y-a,e.x+o,e.y+a])}return s}_planSnapGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|empty`,value:{segments:[],endpoints:[]}};const e=[this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planSnapGeometryCache?.key===e)return this._planSnapGeometryCache;const i=this._openCuts(),s=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:[...i,...this._planSnapOpeningCuts(t,i)],partitionCuts:this._partitionOpeningCuts(t),epsilon:2e-4*this._gridPitch});return this._planSnapGeometryCache={key:e,value:s},this._planSnapGeometryCache}_planStructuralGeometrySnapshot(){const t=this._spaceModel();if(!t)return{key:`${this._space}|structural-empty`,value:{segments:[],endpoints:[]}};const e=["structural",this._space,this._cfgEpoch,this._activeDraftId||"",t.rooms.length,t.room_drafts.length,t.partitions.length].join("|");if(this._planStructuralGeometryCache?.key===e)return this._planStructuralGeometryCache;const i=gd({space:t,activeDraftId:this._activeDraftId,roomCuts:this._openCuts(),epsilon:2e-4*this._gridPitch});return this._planStructuralGeometryCache={key:e,value:i},this._planStructuralGeometryCache}_planSnapContextKey(t){const e=this._path[0],i=this._path[this._path.length-1];return[t,this._tool,this._path.length,e?`${e[0]},${e[1]}`:"",i?`${i[0]},${i[1]}`:""].join("|")}_resolvePlanDrawPoint(t,e){const i=this._planSnapGeometrySnapshot(),s=this._path[this._path.length-1],n="draw"===this._tool&&this._path.length>=3?[{point:this._path[0],key:"closure:first-point"}]:[],o=function(t,e,i){if(!(ld(e)&&i.tolerance>=0))return null;const s=i.epsilon??.001,n=i.excludePoints||[];let o=null;const a=[...t.endpoints,...(i.extraEndpoints||[]).filter(t=>ld(t.point)).map(t=>({point:[t.point[0],t.point[1]],key:t.key}))];for(const t of a){if(md(t.point,n,s))continue;const a=Math.hypot(e[0]-t.point[0],e[1]-t.point[1]);a>i.tolerance||!fd(a,t.key,o)||(o={kind:"endpoint",point:[...t.point],key:t.key,distance:a})}if(o)return o;let r=null;for(const o of t.segments){const t=[o.a[0],o.a[1],o.b[0],o.b[1]],a=Ns([e[0],e[1]],t);if(a>i.tolerance)continue;const l=vd(o,e,i.gridStep);!md(l,n,s)&&fd(a,o.key,r)&&(r={kind:"line",point:l,key:o.key,distance:a,segment:o})}return r}(i.value,t,{tolerance:this._cssPxToRender(12),gridStep:this._gridPitch,excludePoints:s?[s]:[],extraEndpoints:n,epsilon:2e-4*this._gridPitch});return{point:o?[...o.point]:this._snapDrawPoint(t,e),candidate:o,contextKey:this._planSnapContextKey(i.key)}}get _activePlanSnapCandidate(){if(!this._markup||"draw"!==this._tool)return null;const t=this._planSnapHover;if(!t)return null;const e=this._planSnapGeometrySnapshot();return t.contextKey===this._planSnapContextKey(e.key)?t.candidate:null}_clearPlanSnapHover(t=!0){this._planSnapHover=null,this._syncPlanSnapActiveMarker(null),t&&(this._cursorPt=null)}_samePt(t,e){return fi(t,e)}_dropLegacySegments(){for(const t of this._serverCfg?.markers||[])"ripple"===t.display&&(t.display="icon_ripple");for(const t of this._serverCfg?.spaces||[]){delete t.segments;const e=new Set,i=t=>"string"==typeof t&&t.length>=1&&t.length<=64&&!e.has(t),s=t=>(e.add(t),!0),n=t=>Array.isArray(t)&&2===t.length&&t.every(t=>Number.isFinite(Number(t))&&Math.abs(Number(t))<=Kl);if(Array.isArray(t.partitions)&&(t.partitions=t.partitions.filter(t=>t&&i(t.id)&&n(t.a)&&n(t.b)&&Math.hypot(t.a[0]-t.b[0],t.a[1]-t.b[1])>1e-9&&s(t.id)).map(t=>({...t,cm:Math.max(1,Math.min(100,Number(t.cm)||15))})),t.partitions.length||delete t.partitions),Array.isArray(t.wall_columns)&&(t.wall_columns=t.wall_columns.filter(t=>t&&i(t.id)&&n(t.center)&&s(t.id)).map(t=>({id:t.id,shape:"circle"===t.shape?"circle":"square",center:[Number(t.center[0]),Number(t.center[1])],cm:xl(Number(t.cm)||15),..."circle"===t.shape?{}:{angle:Sl(t.angle)}})),t.wall_columns.length||delete t.wall_columns),Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t&&i(t.id)&&Array.isArray(t.points)&&t.points.length>=2&&t.points.every(n)&&s(t.id)).map(t=>{const e=[[Number(t.points[0][0]),Number(t.points[0][1])]],i=[];for(let s=1;st.points.length>=2),t.room_drafts.length||delete t.room_drafts),Array.isArray(t.walls)){const e=Fc(t.open_spans).map(t=>[t.a[0],t.a[1],t.b[0],t.b[1]]);t.walls=Tr(t.walls,t.rooms||[],Zl,1,e),t.walls.length||delete t.walls}}}get _cfgWriting(){return this._writesPending>0}_writeConfig(){this._writesPending++,this._writeChain=this._writeChain.catch(()=>{}).then(async()=>{if(!this._serverCfg)return;this._dropLegacySegments();const t=await this.hass.callWS({type:"houseplan/config/set",config:this._serverCfg,expected_rev:this._cfgRev});this._cfgRev=t?.rev??this._cfgRev+1});return this._writeChain.finally(()=>{this._writesPending--})}_saveConfig(){this._cfgEpoch++,this._saveConfigDebounced()}_geometrySnapshot(t=this._space){const e=this._serverCfg?.spaces.find(e=>e.id===t);if(!e)return null;const i=t=>JSON.parse(JSON.stringify(t)),s={};for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])void 0!==e[t]&&(s[t]=e[t]);return{spaceId:t,rooms:i(e.rooms||[]),...Array.isArray(e.openings)?{openings:i(e.openings)}:{},...Array.isArray(e.walls)?{walls:i(e.walls)}:{},...Array.isArray(e.open_spans)?{open_spans:i(e.open_spans)}:{},...Array.isArray(e.room_drafts)?{room_drafts:i(e.room_drafts)}:{},...Array.isArray(e.partitions)?{partitions:i(e.partitions)}:{},...Array.isArray(e.wall_columns)?{wall_columns:i(e.wall_columns)}:{},...Array.isArray(e.decor)?{decor:i(e.decor)}:{},plan_transform:s}}_recordGeometry(t,e){if(!e)return;const i=this._geometrySnapshot(e.spaceId);i&&JSON.stringify(e)!==JSON.stringify(i)&&(this._geometryHistory.push({name:t,before:e,after:i}),this.requestUpdate())}_clearGeometryGesture(){this._path=[],this._clearPlanSnapHover(),this._clearOpeningPlacement(!1),this._mergeSel=null,this._mergeDialog=null,this._splitSel=null,this._pendingSplit=null,this._wallFaceBatch=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._wallDialog=null,this._physicalDialog=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._openingDialog=null,this._rszSel=null,this._rszDrag=null,this._rszPreview=null,this._rszLive=null,this._decorDraft=null,this._decorMove=null,this._dtDrag=null,this._bdDrag=null}_cancelBoundaryAnchor(){return!("boundary"!==this._tool||!this._openWallAnchor)&&(this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._clearPlanSnapHover(),this.requestUpdate(),!0)}_stagePointerCancel(t){if(clearTimeout(this._kioskHoldTimer),this._swipeStart?.id===t.pointerId&&(this._swipeStart=null),this._physicalDrag?.pid===t.pointerId||this._physicalRotate?.pid===t.pointerId)return void this._cancelPhysicalGesture();if(this._decorDraft?.pid===t.pointerId)return this._decorDraft=null,void this.requestUpdate();if(this._decorMove?.pid===t.pointerId||this._dtDrag?.pid===t.pointerId||this._bdDrag?.pid===t.pointerId)return void this._cancelDecorGesture();this._cancelBoundaryAnchor(),"opening"===this._tool?(this._cursorPt=null,this._clearOpeningPlacement(!1)):"draw"===this._tool&&this._clearPlanSnapHover();const e=!!this._pinchStart||!!this._panStart;this._pointers.delete(t.pointerId),this._pointers.size<2&&(this._pinchStart=null),0===this._pointers.size&&(this._panStart=null,this._panLock=null),e&&0===this._pointers.size&&this.requestUpdate()}_applyGeometryState(t){const e=this._serverCfg?.spaces.find(e=>e.id===t.spaceId);if(!e)return!1;const i=t=>JSON.parse(JSON.stringify(t));e.rooms=i(t.rooms),void 0!==t.openings?e.openings=i(t.openings):delete e.openings,void 0!==t.walls?e.walls=i(t.walls):delete e.walls,void 0!==t.open_spans?e.open_spans=i(t.open_spans):delete e.open_spans,void 0!==t.room_drafts?e.room_drafts=i(t.room_drafts):delete e.room_drafts,void 0!==t.partitions?e.partitions=i(t.partitions):delete e.partitions,void 0!==t.wall_columns?e.wall_columns=i(t.wall_columns):delete e.wall_columns,void 0!==t.decor?e.decor=i(t.decor):delete e.decor;for(const t of["plan_x","plan_y","plan_scale","plan_scale_x","plan_scale_y","plan_angle"])delete e[t];return Object.assign(e,i(t.plan_transform||{})),this._clearGeometryGesture(),this._space!==t.spaceId&&(this._space=t.spaceId,this._saveNav(),this._restoreZoom()),this._modelCache=null,this._frame=null,this._regSignature="",this._maybeRebuildDevices(),this._saveConfig(),this.requestUpdate(),!0}_roomAt(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&wi(t,i)})}_overlapRoom(t){return this._spaceModel()?.rooms.find(e=>{const i=hi(e);return!!i&&Di(t,i)})}_pointInRoom(t,e){return e.poly?vi(t,e.poly):null!=e.x&&t[0]>=e.x&&t[0]<=e.x+e.w&&t[1]>=e.y&&t[1]<=e.y+e.h}_contourSelfIntersects(t){if(!va(t))return!0;const e=t.length,i=.001;for(let s=0;s=500)return this._showToast(this._t("toast.physical_limit")),!1;const t=this._curSpaceCfg;return!(!this._activeDraftId&&(t?.room_drafts||[]).length>=200||this._draftSegmentCount(t)>=2e3||(t?.partitions||[]).length+this._path.length>$_)||(this._showToast(this._t("toast.physical_limit")),!1)}_markupClick(t){if(this._vacFit)return;if(!this._markup)return;const e=this._spaceModel();if(!e)return void this._clearGeometryGesture();if(this._suppressClick)return;if(this._drag||this._rlResize)return;const i=t.composedPath?.()||[];if(i.some(t=>t?.classList?.contains?.("roomlabel")||t?.classList?.contains?.("rlhandle")))return;if(i.some(t=>t?.classList?.contains?.("physical-hit")))return void("boundary"===this._tool&&this._showToast(this._t("toast.boundary_blocked")));const s=this._svgPoint(t);if("select"===this._tool)return void(this._physicalSel=null);if("resize"===this._tool){if(this._rszDrag||i.some(t=>t?.classList?.contains?.("rszhandle")))return;const t=[...e.rooms].reverse().find(t=>this._pointInRoom(s,t));return void(this._rszSel=t?.id||null)}if("delroom"===this._tool)return void this._deleteRoomClick(s);if("opening"===this._tool)return void this._openingClick(s);if("merge"===this._tool)return void this._mergeClick(s);if("wallthick"===this._tool)return void this._wallThickClick(s);if("boundary"===this._tool)return void this._boundaryClick(s);if("split"===this._tool)return void this._splitClick(s);if("column"===this._tool)return void this._columnClick(s);let n=this._resolvePlanDrawPoint(s,t.shiftKey).point;if(t.ctrlKey||t.metaKey){if(t.preventDefault(),this._path.length<3)return;n=[...this._path[0]]}if(!this._path.length){const t=this._draftEndAt(n);return t?(this._activeDraftId=t.draft.id,this._resumeDraftBySpace[this._space]=t.draft.id,this._path=t.reverse?[...t.draft.points].reverse().map(t=>[...t]):t.draft.points.map(t=>[...t]),void(this._draftSegmentCms=t.reverse?[...t.draft.segments].reverse().map(t=>t.cm):t.draft.segments.map(t=>t.cm))):(this._activeDraftId=null,this._draftSegmentCms=[],void(this._path=[n]))}const o=this._path[this._path.length-1];if(this._samePt(n,o))return;const a=this._draftEndAt(n,this._activeDraftId||void 0);if(a)return void this._mergeDraftEndpoint(a);if(!this._canAppendRoomDraftPoint())return;const r=this._path.map(t=>[...t]);this._path=[...this._path,n],this._persistActiveDraftSegment(),this._offerWallFaces(r)}_draftEndAt(t,e){const i=this._spaceModel();if(!i)return null;const s=this._viewOr(this._baseVb()),n=Math.max(.15*this._gridPitch,this._stageEl?.clientWidth?s.w/this._stageEl.clientWidth*12:0);for(const s of i.room_drafts||[]){if(s.id===e)continue;if(s.points.length<2)continue;const i=s.points[0],o=s.points[s.points.length-1];if(Math.hypot(t[0]-o[0],t[1]-o[1])<=n)return{draft:s,reverse:!1};if(Math.hypot(t[0]-i[0],t[1]-i[1])<=n)return{draft:s,reverse:!0}}return null}_mergeDraftEndpoint(t){const e=this._curSpaceCfg;if(!e||!this._path.length)return;const i=this._path.map(t=>[...t]),s=this._wallGraphSources(i),n=Array.isArray(e.room_drafts)?e.room_drafts:[],o=this._activeDraftId?n.find(t=>t.id===this._activeDraftId):null,a=n.find(e=>e.id===t.draft.id);if(!a)return;const r=t.reverse?t.draft.points.map(t=>[...t]):[...t.draft.points].reverse().map(t=>[...t]),l=t.reverse?(a.segments||[]).map(t=>({...t})):[...a.segments||[]].reverse().map(t=>({...t})),c=this._path[this._path.length-1],h=this._samePt(c,r[0]),d=h?null:this._drawWallCm;if(!h&&null==d)return void this._showPhysicalRange(100);const u=this._draftSegmentCms.map((t,e)=>({...o?.segments?.[e]||{},cm:t})),p=[...this._path.map(t=>[...t]),...h?r.slice(1):r],_=[...u,...null==d?[]:[{cm:d}],...l],g=p.length>=4&&this._samePt(p[0],p[p.length-1]),m=p,f=_;if(m.length>500)return void this._showToast(this._t("toast.physical_limit"));const v=(o?.segments?.length||0)+(a.segments?.length||0);if(this._draftSegmentCount(e)-v+f.length>2e3)return void this._showToast(this._t("toast.physical_limit"));if(g){const t=m.slice(0,-1);if(this._contourSelfIntersects(t)||Pi(t)<=1e-6)return void this._showToast(this._t("toast.contour_cannot_close"));const e=this._overlapRoom(t);if(e)return void this._showToast(this._t("toast.room_overlap",{name:e.name||""}))}const y=this._geometrySnapshot(),b=this._activeDraftId||t.draft.id,w={...o||a,id:b,points:m.map(t=>[t[0]/y_,t[1]/y_]),segments:f};e.room_drafts=n.filter(e=>e.id!==t.draft.id&&(!this._activeDraftId||e.id!==this._activeDraftId)),e.room_drafts.push(w),this._activeDraftId=b,this._resumeDraftBySpace[this._space]=b,this._draftSegmentCms=f.map(t=>Number(t.cm)),this._path=m,this._physicalSel=null,this._recordGeometry(this._t("history.draft_merge"),y),this._saveConfig(),null!=d&&this._offerWallFaces(i,i.length-1,s)}_persistActiveDraftSegment(){if(this._path.length<2||!this._curSpaceCfg)return;const t=this._drawWallCm;if(null==t)return;this._draftSegmentCms=[...this._draftSegmentCms,t];const e=this._geometrySnapshot(),i=this._curSpaceCfg;i.room_drafts||=[],this._activeDraftId||(this._activeDraftId="draft-"+Date.now().toString(36)),this._resumeDraftBySpace[this._space]=this._activeDraftId;const s=i.room_drafts.findIndex(t=>t.id===this._activeDraftId),n={...s>=0?i.room_drafts[s]:{},id:this._activeDraftId,points:this._path.map(t=>[t[0]/y_,t[1]/y_]),segments:this._draftSegmentCms.map((t,e)=>({...s>=0?i.room_drafts[s]?.segments?.[e]:{},cm:t}))};s>=0?i.room_drafts[s]=n:i.room_drafts.push(n),this._recordGeometry(this._t("history.draft_segment"),e),this._saveConfig()}_activeWallSourceKey(t){return`active:${this._activeDraftId||"session"}:${t}`}_wallGraphSources(t){const e=this._planStructuralGeometrySnapshot().value.segments.map(t=>({a:t.a,b:t.b,key:`static:${t.key}`}));for(let i=0;i+1t.key===i);if(s>=0){const[t]=this._wallFaceGraphCache.splice(s,1);return this._wallFaceGraphCache.push(t),t.value}const n=function(t,e=.001){const i=Number.isFinite(e)&&e>0?e:yd,s=Bd(t,i),n=new Map,o=new Map,a=new Map(s.map(t=>[t.key,t]));for(const t of s){const e=Sd(t.a,i),s=Sd(t.b,i);n.set(e,t.a),n.set(s,t.b),o.has(e)||o.set(e,new Set),o.has(s)||o.set(s,new Set),o.get(e).add(s),o.get(s).add(e)}const r=new Map;for(const[t,e]of o){const i=n.get(t);r.set(t,[...e].sort((t,e)=>{const s=n.get(t),o=n.get(e);return Math.atan2(s[1]-i[1],s[0]-i[0])-Math.atan2(o[1]-i[1],o[0]-i[0])||t.localeCompare(e)}))}const l=new Set,c=new Map,h=(t,e)=>`${t}>${e}`;for(const t of s){const e=[Sd(t.a,i),Sd(t.b,i)];for(const[t,o]of[e,[e[1],e[0]]]){if(l.has(h(t,o)))continue;const e=[],d=[];let u=t,p=o,_=!1;for(let i=0;i<=2*s.length+2;i++){const i=h(u,p);if(l.has(i)){_=u===t&&p===o;break}l.add(i),e.push(u),d.push(Md(u,p));const s=r.get(p)||[],n=s.indexOf(u);if(n<0||!s.length)break;if(u=p,p=s[(n-1+s.length)%s.length],u===t&&p===o){_=!0;break}}if(!_||new Set(e).size<3||new Set(e).size!==e.length)continue;const g=e.map(t=>n.get(t)),m=$d(g);if(!(m>i*i))continue;const f=Cd(Dd(e,n,i)),v=new Set;for(const t of d)for(const e of a.get(t)?.sourceKeys||[])v.add(e);const y={ring:g,key:f,area:m,atomKeys:[...d],sourceKeys:[...v].sort((t,e)=>t.localeCompare(e))};c.has(f)||c.set(f,y)}}return{atoms:s,faces:[...c.values()].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key))}}(t,e);return this._wallFaceGraphCache.push({key:i,value:n}),this._wallFaceGraphCache.length>4&&this._wallFaceGraphCache.shift(),n}_offerWallFaces(t,e=this._path.length-2,i){if(this._path.length<2||this._wallFaceBatch||this._roomDialog)return;const s=this._spaceModel();if(!s)return;const n=this._activeWallSourceKey(e),o=2e-4*this._gridPitch;let a;try{const e=i||this._wallGraphSources(t),s=this._wallGraphSources(this._path);a=function(t,e,i){const s=new Set(t.faces.map(t=>t.key));return e.faces.filter(t=>!s.has(t.key)&&t.sourceKeys.includes(i))}(this._wallFaceGraph(e,o),this._wallFaceGraph(s,o),n)}catch{return}if(!a.length)return;for(const t of s.rooms){const e=hi(t);if(!t.id||!e)continue;const i=Ei(e,this._path,.02*this._gridPitch);if(!i)continue;const[s,n]=i,o=Pi(s)>=Pi(n)?s:n,r=o===s?n:s,l=[...a].sort((t,e)=>Math.abs(t.area-Pi(r))-Math.abs(e.area-Pi(r))||t.key.localeCompare(e.key))[0];if(!l)return;return void this._beginWallFaceBatch([{...l,ring:r.map(t=>[t[0],t[1]]),split:{roomId:t.id,mainPoly:o,newPoly:r},consumeAllActive:!0}])}const r=a.filter(t=>!(t.ring.length<3||this._contourSelfIntersects(t.ring))&&!this._overlapRoom(t.ring));r.length&&this._beginWallFaceBatch(r)}_beginWallFaceBatch(t){this._wallFaceBatch={candidates:[...t].sort((t,e)=>t.area-e.area||t.key.localeCompare(e.key)),index:0,decisions:[],activePath:this._path.map(t=>[...t]),activeCms:[...this._draftSegmentCms],activeDraftId:this._activeDraftId},this._clearPlanSnapHover(),this._nameSel="",this._areaSel="",this._resetRoomDialogFields(),this._roomDialog=!0}_columnClick(t){const e=this._snap(t),i=this._drawWallCm;if(null==i)return void this._showPhysicalRange($l);if(!this._curSpaceCfg||this._limitReached("column"))return;const s=this._spaceModel();if(!s)return;const n={id:"column-"+Date.now().toString(36),shape:"square",center:e,cm:xl(i),angle:0},o=(s.wall_columns||[]).find(t=>Ll(t,n,.02*this._gridPitch));if(o)return clearTimeout(this._duplicateColumnTimer),this._duplicateColumnId=o.id,this._duplicateColumnTimer=window.setTimeout(()=>{this._duplicateColumnId=null},900),void this._showToast(this._t("toast.column_duplicate"));const a=this._geometrySnapshot(),r=this._curSpaceCfg;r.wall_columns||=[],r.wall_columns.push({...n,center:[e[0]/y_,e[1]/y_]}),this._recordGeometry(this._t("history.column_add"),a),this._saveConfig()}_openPhysicalDialog(t,e,i){const s=this._spaceModel();if(s)if("partition"===t){const i=s.partitions.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),length:this._fmtLen(i.a,i.b)})}else if("column"===t){const i=s.wall_columns.find(t=>t.id===e);i&&(this._physicalDialog={kind:t,id:e,cm:mr(i.cm,this._imperial),shape:i.shape,angle:this._angleField("square"===i.shape?Sl(i.angle):0)})}else{const n=s.room_drafts.find(t=>t.id===e),o=Math.max(0,Math.min(n?.segments.length?n.segments.length-1:0,i||0));n?.segments[o]&&(this._physicalDialog={kind:t,id:e,segment:o,cm:mr(n.segments[o].cm,this._imperial),length:this._fmtLen(n.points[o],n.points[o+1])})}}_physicalDown(t,e,i){const s=this._spaceModel();if(!s)return;t.stopPropagation(),C_(t);const n=this._svgPoint(t),o=[];for(const t of[...s.wall_columns].reverse())Hl(n,Tl(t,this._cellCm,this._gridPitch))&&o.push({kind:"column",id:t.id});for(const t of[...s.partitions].reverse()){const e=Dl(t.a,t.b,t.cm,this._cellCm,this._gridPitch);e&&Hl(n,e)&&o.push({kind:"partition",id:t.id})}o.some(t=>t.kind===e&&t.id===i)||o.unshift({kind:e,id:i});const a=o.map(t=>`${t.kind}:${t.id}`).sort().join("|"),r=performance.now(),l=this._physicalPickCycle,c=o.length>1&&l?.signature===a&&r-l.at>380&&r-l.at<=1200&&Math.hypot(t.clientX-l.x,t.clientY-l.y)<=10?(l.index+1)%o.length:Math.max(0,o.findIndex(t=>t.kind===e&&t.id===i));this._physicalPickCycle={signature:a,index:c,x:t.clientX,y:t.clientY,at:r},e=o[c].kind,i=o[c].id;const h="partition"===e?s.partitions.find(t=>t.id===i):s.wall_columns.find(t=>t.id===i);h&&(this._physicalSel={kind:e,id:i},this._physicalDrag={pid:t.pointerId,kind:e,id:i,start:this._svgPoint(t),startClient:[t.clientX,t.clientY],before:this._geometrySnapshot(),moved:!1,base:JSON.parse(JSON.stringify(h)),delta:[0,0]})}_clampPhysicalDelta(t,e,i){const s="partition"===t?[e.a,e.b]:[e.center],n=s.map(t=>t[0]),o=s.map(t=>t[1]);return[Math.max(-Kl*y_-Math.min(...n),Math.min(Kl*y_-Math.max(...n),i[0])),Math.max(-Kl*y_-Math.min(...o),Math.min(Kl*y_-Math.max(...o),i[1]))]}_physicalMove(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t),s="partition"===e.kind?e.base.a:e.base.center,n=this._snap([s[0]+i[0]-e.start[0],s[1]+i[1]-e.start[1]]),o=this._clampPhysicalDelta(e.kind,e.base,[n[0]-s[0],n[1]-s[1]]);this._physicalDrag={...e,delta:o,moved:e.moved||Math.hypot(t.clientX-e.startClient[0],t.clientY-e.startClient[1])>=5}}_physicalUp(t){const e=this._physicalDrag;if(!e||e.pid!==t.pointerId)return;if(t.stopPropagation(),this._physicalDrag=null,!e.moved)return void this._registerPhysicalTap(e.kind,e.id);const i=this._spaceModel();if(!this._curSpaceCfg||!i)return;const s=this._curSpaceCfg;if("partition"===e.kind){const t=(s.partitions||[]).find(t=>t.id===e.id),i=e.base;if(t){const n={...i,a:[i.a[0]+e.delta[0],i.a[1]+e.delta[1]],b:[i.b[0]+e.delta[0],i.b[1]+e.delta[1]]};t.a=[n.a[0]/y_,n.a[1]/y_],t.b=[n.b[0]/y_,n.b[1]/y_];for(const t of s.openings||[]){if("partition"!==t.host?.kind||t.host.id!==e.id)continue;const i=ed(t,[n],y_,this._cellCm,this._gridPitch).resolved;i&&Object.assign(t,rd(t,i,y_))}}}else{const t=(s.wall_columns||[]).find(t=>t.id===e.id),n=e.base,o={...n,center:[n.center[0]+e.delta[0],n.center[1]+e.delta[1]]};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,o,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));t&&(t.center=[(n.center[0]+e.delta[0])/y_,(n.center[1]+e.delta[1])/y_])}this._recordGeometry(this._t("history.physical_move"),e.before),this._saveConfig()}_registerPhysicalTap(t,e,i){const s=performance.now(),n=this._physicalLastTap?.kind===t&&this._physicalLastTap.id===e&&this._physicalLastTap.segment===i&&s-this._physicalLastTap.at<=360;this._physicalLastTap={kind:t,id:e,segment:i,at:s},n&&(this._physicalLastTap=null,this._openPhysicalDialog(t,e,i))}_cancelPhysicalGesture(){this._physicalDrag=null,this._physicalRotate=null,this.requestUpdate()}_physicalRotateDown(t,e){if("square"!==e.shape||!this._spaceModel())return;t.preventDefault(),t.stopPropagation(),C_(t);const i=this._svgPoint(t);this._physicalSel={kind:"column",id:e.id},this._physicalRotate={pid:t.pointerId,id:e.id,center:[...e.center],startAngle:180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,baseAngle:Sl(e.angle),angle:Sl(e.angle),before:this._geometrySnapshot(),moved:!1}}_physicalRotateMove(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation();const i=this._svgPoint(t),s=180*Math.atan2(i[1]-e.center[1],i[0]-e.center[0])/Math.PI,n=e.baseAngle+s-e.startAngle,o=Sl(t.shiftKey?n:5*Math.round(n/5));this._physicalRotate={...e,angle:o,moved:e.moved||Math.abs(n-e.baseAngle)>=.5}}_physicalRotateUp(t){const e=this._physicalRotate;if(!e||e.pid!==t.pointerId)return;t.preventDefault(),t.stopPropagation(),this._physicalRotate=null;const i=this._spaceModel();if(!e.moved||!this._curSpaceCfg||!i)return;const s=i.wall_columns.find(t=>t.id===e.id);if(!s||"square"!==s.shape)return;const n={...s,angle:e.angle};if(i.wall_columns.some(t=>t.id!==e.id&&Ll(t,n,.02*this._gridPitch)))return void this._showToast(this._t("toast.column_duplicate"));const o=this._curSpaceCfg.wall_columns?.find(t=>t.id===e.id);o&&(o.angle=e.angle,this._recordGeometry(this._t("history.physical_edit"),e.before),this._saveConfig())}_rszRooms(){const t=[],e=this._spaceModel();if(!e)return t;for(const i of e.rooms){const e=i.id?hi(i):null;e&&t.push({id:i.id,poly:e})}return t}_rszOpenings(){return this._openingsR.map(t=>({id:t.id,x:t.rx,y:t.ry,length:t.rlen}))}_rszOpts(){return{minDim:this._cmToUnits(30),eps:.05*this._gridPitch}}_rszSnapshot(){return JSON.stringify(this._geometrySnapshot()||{spaceId:this._space,rooms:[],openings:[],walls:[],open_spans:[]})}_rszApplyPreview(t,e){const i=this._rszDrag,s=this._serverCfg?.spaces.find(t=>t.id===this._space);if(!i||!s)return;const n=JSON.parse(i.snap),o={...s,rooms:n.rooms,openings:n.openings,walls:n.walls,open_spans:n.open_spans};Array.isArray(n.open_spans)&&n.open_spans.length||delete o.open_spans;const a=this._spaceH;for(const[e,i]of Object.entries(t)){const t=o.rooms.find(t=>t.id===e);t&&(t.poly=i.map(t=>[t[0]/y_,t[1]/a]),delete t.x,delete t.y,delete t.w,delete t.h)}for(const[t,i]of Object.entries(e)){const e=(o.openings||[]).find(e=>e.id===t);e&&(e.x=i[0]/y_,e.y=i[1]/a)}const r=[],l=[];for(const t of i.changed){const e=i.rooms.find(e=>e.id===t),s=o.rooms.find(e=>e.id===t);if(!e||!s?.poly)continue;const n=s.poly.map(t=>[t[0]*y_,t[1]*a]);if(e.poly.length===n.length)for(let t=0;tt.id===e);if(!s||!s.poly||s.poly.length<3)return null;if(i<0||i>=s.poly.length)return null;const n=[...s.poly[i]],o=[...s.poly[(i+1)%s.poly.length]];return{roomId:e,edge:i,a:n,b:o,n:pa(s.poly,i)}}(s,e,i);n&&(this._rszDrag={kind:"edge",pid:t.pointerId,roomId:e,plan:n,rooms:s,openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszCornerDown(t,e,i,s){"resize"!==this._tool||this._rszDrag||(t.stopPropagation(),t.preventDefault(),C_(t),this._rszDrag={kind:"scale",pid:t.pointerId,roomId:e,fixed:s,span0:Math.hypot(i[0]-s[0],i[1]-s[1])||1,rooms:this._rszRooms(),openings:this._rszOpenings(),snap:this._rszSnapshot(),moved:!1,d:0,k:1,changed:[]})}_rszMove(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._svgPoint(t);if("edge"===e.kind){const t=e.plan,s=(i[0]-t.a[0])*t.n[0]+(i[1]-t.a[1])*t.n[1],n=this._snap([t.a[0]+t.n[0]*s,t.a[1]+t.n[1]*s]);let o=(n[0]-t.a[0])*t.n[0]+(n[1]-t.a[1])*t.n[1];if(o=function(t,e,i,s,n,o){if(!Number.isFinite(s)||Math.abs(s)<1e-9)return 0;const a=Math.sign(s);let r=Math.abs(s);const l=Math.max(n,1e-6);for(let s=0;s<4096&&r>1e-9;s++,r-=l){const s=a*r;if(xa(t,e,i,s,o))return s}return 0}(e.rooms,e.openings,t,o,this._gridPitch,this._rszOpts()),o===e.d&&e.moved)return;e.d=o,e.moved=!0;const a=wa(e.rooms,e.openings,t,o,this._rszOpts().eps);e.changed=Object.keys(a.polys),this._rszApplyPreview(a.polys,a.openings),this._rszLive=this._rszEdgeLabels(a,t)}else{const t=e.fixed,s=this._snap(i);let n=Math.hypot(s[0]-t[0],s[1]-t[1])/(e.span0||1);if(n=Math.max(.05,Math.min(20,n)),n=function(t,e,i,s,n,o){if(!Number.isFinite(n)||n<=0)return 1;if(Ma(t,e,i,s,n,o))return n;let a=1,r=n;for(let n=0;n<28;n++){const n=(a+r)/2;Ma(t,e,i,s,n,o)?a=n:r=n}return a}(e.rooms,e.openings,e.roomId,t,n,this._rszOpts()),n===e.k&&e.moved)return;e.k=n,e.moved=!0;const o=e.rooms.find(t=>t.id===e.roomId),a=e.rooms.filter(t=>t.id!==e.roomId).map(t=>t.poly),r=Sa(o,e.openings,a,t,n,2*this._rszOpts().eps);e.changed=[e.roomId],this._rszApplyPreview({[e.roomId]:r.poly},r.openings),this._rszLive=this._rszScaleLabels(r.poly)}this.requestUpdate()}_rszUp(t){const e=this._rszDrag;if(!e||e.pid!==t.pointerId)return;t.stopPropagation();const i=this._rszPreview;this._rszDrag=null,this._rszLive=null,this._rszPreview=null;if(!(e.moved&&("edge"===e.kind?Math.abs(e.d)>1e-9:Math.abs(e.k-1)>1e-9))||!i)return this._cfgEpoch++,void this.requestUpdate();const s=JSON.parse(e.snap),n=this._curSpaceCfg;if(n){n.rooms=i.sp.rooms,n.openings=i.sp.openings,Array.isArray(i.sp.walls)&&(i.sp.walls.length?n.walls=i.sp.walls:delete n.walls),Array.isArray(i.sp.open_spans)&&i.sp.open_spans.length?n.open_spans=i.sp.open_spans:delete n.open_spans;for(const t of e.changed){const e=n.rooms.find(e=>e.id===t);e?.poly&&(e.poly=fa(e.poly,1e-9))}this._commitOpenSpans(),Array.isArray(n.walls)&&n.walls.length&&(n.walls=Tr(n.walls,n.rooms||[],Zl,1,this._cfgOpenCuts()),n.walls.length||delete n.walls)}this._suppressClick=!0,setTimeout(()=>this._suppressClick=!1,0),this._recordGeometry(this._t("history.resize_room"),s),this._saveConfig(),this.requestUpdate()}_rszCancelDrag(){this._rszDrag&&(this._rszDrag=null,this._rszLive=null,this._rszPreview=null,this._cfgEpoch++,this.requestUpdate())}_rszPointerCancel(t){const e=this._rszDrag;e&&e.pid===t.pointerId&&(t.stopPropagation(),this._rszCancelDrag())}_rszEdgeLabels(t,e){const i=this._rszDrag,s=[],n=t.polys[e.roomId]||i.rooms.find(t=>t.id===e.roomId).poly,o=n.length,a=e.edge,r=(a+1)%o;for(const[t,e]of[[n[(a-1+o)%o],n[a]],[n[a],n[r]],[n[r],n[(r+1)%o]]])s.push({x:(t[0]+e[0])/2,y:(t[1]+e[1])/2,text:this._fmtLen(t,e)});const l="mi"===this.hass?.config?.unit_system?.length,c=Object.keys(t.polys).length?Object.keys(t.polys):[e.roomId],h=this._spaceWalls,d=this._openPairs().flatMap(t=>t.segs),u=this._physicalBodiesR();for(const e of c){const n=t.polys[e]||i.rooms.find(t=>t.id===e).poly,o=h.length&&nl(Object.entries(t.polys).map(([t,e])=>({id:t,poly:e})),e,h,d,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||n,a=xi(o),r=u.length?zl(Fl(o,u))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(o,this._gridPitch,this._cellCm);s.push({x:a[0],y:a[1],text:Da(r,l),area:!0})}return s}_rszScaleLabels(t){const e="mi"===this.hass?.config?.unit_system?.length,i=t.map(t=>t[0]),s=t.map(t=>t[1]),n=Math.max(...i)-Math.min(...i),o=Math.max(...s)-Math.min(...s),a=this._spaceWalls,r=a.length&&this._rszSel&&nl([{id:this._rszSel,poly:t}],this._rszSel,a,[],this._wallKeyPitch,this._cellCm,this._gridPitch,y_)||t,l=xi(r),c=this._physicalBodiesR(),h=c.length?zl(Fl(r,c))*Math.pow(this._cellCm/this._gridPitch,2)/1e4:Ca(r,this._gridPitch,this._cellCm);return[{x:Math.min(...i),y:Math.min(...s),text:`${this._fmtLen([0,0],[n,0])} × ${this._fmtLen([0,0],[o,0])}`},{x:l[0],y:l[1],text:Da(h,e),area:!0}]}_renderResizeLayer(t){const e=Math.max(.013*t.w,5),i=e/2,s=t=>t.toFixed(1),n=`M ${s(-.7*i)} 0 H ${s(.7*i)} M 0 ${s(-.22*i)} V ${s(-i)} M ${s(-.32*i)} ${s(-.6*i)} L 0 ${s(-i)} L ${s(.32*i)} ${s(-.6*i)} M 0 ${s(.22*i)} V ${s(i)} M ${s(-.32*i)} ${s(.6*i)} L 0 ${s(i)} L ${s(.32*i)} ${s(.6*i)}`,o=[],a=this._rszRooms();for(const t of a)for(let i=0;ithis._rszEdgeDown(e,t.id,i)} @pointermove=${t=>this._rszMove(t)} @pointerup=${t=>this._rszUp(t)} @@ -4676,14 +4676,14 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 max=${mr(150,this._imperial)} step="any" .value=${this._drawWallFieldValue} @input=${t=>{this._drawWallField=t.target.value}} - title=${this._t("draw"===this._tool?"markup.draw_wall_title":"partition"===this._tool?"physical.partition_size_title":"physical.column_size_title")} /> + title=${this._t("draw"===this._tool?"markup.draw_wall_title":"physical.column_size_title")} /> ${this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")} ${this._t("physical.allowed_range",{max:mr(this._drawWallMaxCm,this._imperial),unit:this._t(this._imperial?"wallthick.unit_in":"wallthick.unit_cm")})} `}_renderPlanSecondary(){const t=this._editorSecondaryContextId,e=this._physicalSel;if(e){if(!("partition"===e.kind?!!this._curSpaceCfg.partitions?.some(t=>t.id===e.id):"column"===e.kind?!!this._curSpaceCfg.wall_columns?.some(t=>t.id===e.id):!!this._curSpaceCfg.room_drafts?.some(t=>t.id===e.id)))return null;const i="partition"===e.kind?this._t("markup.partition"):"column"===e.kind?this._t("markup.column"):this._t("markup.add");return{contextId:t,kind:"selection",ariaLabel:this._t("editor.context_actions",{object:i}),visibleLabel:i,content:j` `}}const i="draw"===this._tool||"partition"===this._tool||"column"===this._tool,s="partition"===this._tool?"markup.hint_partition":"column"===this._tool?"markup.hint_column":"resize"===this._tool?"markup.hint_resize":"wallthick"===this._tool?"markup.hint_wallthick":"boundary"===this._tool?this._boundaryHintKey:null,n="draw"===this._tool?this._t(this._path.length?"markup.hint_points":"markup.hint_start",this._path.length?{n:this._path.length}:void 0):"";if(!i&&!s&&!n)return null;const o="draw"===this._tool&&this._path.length>0||"boundary"===this._tool&&!!this._openWallAnchor;return{contextId:t,kind:o?"operation":"tool",ariaLabel:this._t("editor.tool_options",{tool:this._t("draw"===this._tool?"markup.add":"partition"===this._tool?"markup.partition":"column"===this._tool?"markup.column":"resize"===this._tool?"markup.resize":"wallthick"===this._tool?"markup.wallthick":"markup.boundary")}),content:j` + `}}const i="draw"===this._tool||"column"===this._tool,s="column"===this._tool?"markup.hint_column":"resize"===this._tool?"markup.hint_resize":"wallthick"===this._tool?"markup.hint_wallthick":"boundary"===this._tool?this._boundaryHintKey:null,n="draw"===this._tool?this._t(this._path.length?"markup.hint_points":"markup.hint_start",this._path.length?{n:this._path.length}:void 0):"";if(!i&&!s&&!n)return null;const o="draw"===this._tool&&this._path.length>0||"boundary"===this._tool&&!!this._openWallAnchor;return{contextId:t,kind:o?"operation":"tool",ariaLabel:this._t("editor.tool_options",{tool:this._t("draw"===this._tool?"markup.add":"column"===this._tool?"markup.column":"resize"===this._tool?"markup.resize":"wallthick"===this._tool?"markup.wallthick":"markup.boundary")}),content:j` ${i?this._renderDrawWallControl():G} ${n?j`${n}`:G} ${s?j`
-
`:j``}_openingAt(t){if(!this._openingsR.length)return null;const e=this._openingsR.flatMap(e=>{const i=e.angle*Math.PI/180,s=t[0]-e.rx,n=t[1]-e.ry,o=s*Math.cos(i)+n*Math.sin(i);return Math.abs(o)>e.rlen/2+12?[]:[{o:e,localY:-s*Math.sin(i)+n*Math.cos(i)}]});if(!e.length)return null;const i=this._spaceModel();if(!i)return null;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return e.find(({o:t,localY:e})=>{const i="gate"===t.type?!t.flip_v:t.flip_v,s=t.partitionHost||this._spaceWalls.length||"gate"===t.type?this._openingFace(t,n,!!i):{ox:0,oy:0,cm:0,side:-1},o=Yd({type:t.type,length:t.rlen,angle:t.angle,amount:this._openingAmt(t),flipH:!!t.flip_h,flipV:!!t.flip_v,cellCm:this._cellCm,gridPitch:this._gridPitch,face:s});return Math.abs(e)<=o.hitHalf})?.o||null}_resolveOpeningPlacement(t){const e=this._openingPreset;if("opening"!==this._tool||!e)return null;const i=this._spaceModel();if(!i)return null;const s=this._openCuts(),n=this._openingWallIndexFor(i,s),o=`${n.key}|partitions:${this._cfgEpoch}`;var a,r,l;this._openingPlacementIntervalsCache&&this._openingPlacementIntervalsCache.key===o||(this._openingPlacementIntervalsCache={key:o,value:[...Qr(i.rooms,this._spaceWalls,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_),...(a=i.partitions,r=this._cellCm,l=this._gridPitch,a.flatMap(t=>!Zh(t.a)||!Zh(t.b)||Math.hypot(t.b[0]-t.a[0],t.b[1]-t.a[1])<=1e-9?[]:[{roomId:"",a:[t.a[0],t.a[1]],b:[t.b[0],t.b[1]],key:`partition:${t.id}`,kind:"outer",cm:t.cm,open:!1,half:fr(t.cm,r,l)/2,partitionHost:{kind:"partition",id:t.id}}]))]});const c=Zp({pointer:[t[0],t[1]],preset:e,geometryRevision:this._cfgEpoch,renderedLength:this._cmToUnits(e.lengthCm),intervals:this._openingPlacementIntervalsCache.value,baseTolerance:1.5*this._gridPitch,bodyPointerPadding:this._cssPxToRender(this._boundaryCoarse?10:6),gridStep:this._gridPitch});this._openingJambBlockCm=c.jambBlockedTarget?c.jambBlockedTarget.physicalHalfWidth/this._gridPitch*this._cellCm:null;const h=c.candidate;if(!h)return null;const d="gate"===h.type?!h.flipV:h.flipV;let u;if(h.host){const t=ed({id:"preview",type:h.type,x:h.x/y_,y:h.y/y_,angle:h.angle,length:h.renderedLength/y_,host:h.host},i.partitions,y_,this._cellCm,this._gridPitch).resolved;u=t?od(t,d):{ox:0,oy:0,cm:0,side:-1}}else u=yl(n.value,{x:h.x,y:h.y,angle:h.angle,length:h.renderedLength,flip_v:d});const p="mi"===this.hass?.config?.unit_system?.length,_=_i([h.x,h.y],h.angle,h.renderedLength,i.rooms,this._gridPitch/2),g=(_?[{distance:_.sideA,midpoint:_.midA},{distance:_.sideB,midpoint:_.midB}]:h.measure.labels).map(t=>({x:t.midpoint[0],y:t.midpoint[1],text:li(t.distance/this._gridPitch*this._cellCm,p)}));return{...h,face:u,measure:{labels:g,guide:h.measure.guide}}}_activateOpeningPlacement(t){this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingPreset=function(t,e){return{type:t,lengthCm:Kp(t),flipH:!1,flipV:!1,revision:e}}(t,++this._openingPresetRevision),this._openingHoverCandidate=null,this._cursorPt=null)}_clearOpeningPlacement(t){this._openingHoverCandidate=null,this._openingJambBlockCm=null,t&&(this._openingPreset=null,this._openingRebindId=null)}_openingClick(t){const e=this._spaceModel();if(!e)return;const i=this._openingRebindId?null:this._openingAt(t);if(i)return void this._editOpening(i);const s=this._openingPreset;if(!s)return;const n=this._openingHoverCandidate,o=n&&Qp(n,[t[0],t[1]],s.revision,this._cfgEpoch)?n:this._resolveOpeningPlacement(t);if(!o){if(null!=this._openingJambBlockCm)return void this._showToast(this._t("opening.partition_jamb_margin",{distance:li(this._openingJambBlockCm,this._imperial)}));const i=1.5*this._gridPitch,s=pi(t,e.rooms,i);return s&&function(t,e,i,s,n){for(const o of s)if(!(Ns([t,e],o)>n)&&Pr([o[0],o[1]],[o[2],o[3]],i))return!0;return!1}(s.x,s.y,s.angle,this._openCuts(),i)?void this._showToast(this._t("toast.opening_on_virtual")):void this._showToast(this._t("toast.opening_no_wall"))}const a=this._openingRebindId?this._curSpaceCfg?.openings?.find(t=>t.id===this._openingRebindId):null;this._openingDialog={...a?{id:a.id,type:a.type,lengthCm:Math.round(a.length*y_/this._gridPitch*this._cellCm),lengthTouched:!1,contact:a.contact||"",lock:a.lock||"",invert:!!a.invert,flipH:!!a.flip_h,flipV:!!a.flip_v}:{type:o.type,lengthCm:o.lengthCm,contact:"",lock:"",invert:!1,flipH:o.flipH,flipV:o.flipV},...o.host?{host:o.host}:{},x:o.x,y:o.y,angle:o.angle},this._openingRebindId=null,this._openingHoverCandidate=null,this._cursorPt=null}_editOpening(t){this._openingDialog={id:t.id,type:t.type,lengthCm:Math.round(t.rlen/this._gridPitch*this._cellCm),lengthTouched:!1,contact:t.contact||"",lock:t.lock||"",invert:!!t.invert,flipH:!!t.flip_h,flipV:!!t.flip_v,...t.host?{host:{...t.host}}:{},x:t.rx,y:t.ry,angle:t.angle}}_opPointerDown(t,e){if("plan"===this._mode&&this._spaceModel()&&"resize"!==this._tool){t.preventDefault(),t.stopPropagation();try{C_(t)}catch{}this._opDrag={id:e.id,moved:!1,sx:t.clientX,sy:t.clientY,dirty:!1,before:this._geometrySnapshot()}}}_opPointerMove(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;if(Math.abs(t.clientX-this._opDrag.sx)+Math.abs(t.clientY-this._opDrag.sy)<=3)return;const i=this._spaceModel();if(!i)return;const s=this._svgPoint(t),n=this._curSpaceCfg,o=n?.openings?.find(t=>t.id===e.id);if(!o)return;if("partition"===o.host?.kind){const t=i.partitions.find(t=>t.id===o.host.id);if(!t)return;const e=t.b[0]-t.a[0],n=t.b[1]-t.a[1],a=Math.hypot(e,n);if(!(a>1e-9))return;const r=e/a,l=n/a;if(Math.abs((s[0]-t.a[0])*l-(s[1]-t.a[1])*r)>4*this._gridPitch)return;const c=o.length*y_/2+Qh(t,this._cellCm,this._gridPitch);let h=(s[0]-t.a[0])*r+(s[1]-t.a[1])*l;if(h=Math.round(h/this._gridPitch)*this._gridPitch,h=Math.max(c,Math.min(a-c,h)),a<2*c-1e-9)return;const d=h/a,u=(t.a[0]+r*h)/y_,p=(t.a[1]+l*h)/this._spaceH;let _=180*Math.atan2(n,e)/Math.PI;_>=90?_-=180:_<-90&&(_+=180);const g=o.host.t!==d||o.x!==u||o.y!==p||o.angle!==_;return this._opDrag.moved=!0,g&&(this._opDrag.dirty=!0),o.host={...o.host,t:d},o.x=u,o.y=p,o.angle=_,this._opMeasure=null,g&&this._cfgEpoch++,void this.requestUpdate()}const a=pi(s,i.rooms,4*this._gridPitch);if(!a)return;this._opDrag.moved=!0;const r=this._opRuler(a,o.length*y_);this._opMeasure=r.measure;const l=r.x/y_,c=r.y/this._spaceH,h=o.x!==l||o.y!==c||o.angle!==a.angle;h&&(this._opDrag.dirty=!0),o.x=l,o.y=c,o.angle=a.angle,h&&this._cfgEpoch++,this.requestUpdate()}_opRuler(t,e){const i=this._spaceModel()?.rooms||[],s=this._gridPitch/2;let n=t.x,o=t.y,a=_i([n,o],t.angle,e,i,s);if(a&&a.centered&&(n!==a.wallCenter[0]||o!==a.wallCenter[1]))[n,o]=a.wallCenter,a=_i([n,o],t.angle,e,i,s);else if(a){const[r,l]=a.wallA,[c,h]=a.wallB,d=c-r,u=h-l,p=Math.hypot(d,u);if(p>0){const c=this._gridPitch,h=Math.min(e/2,p/2);let _=Math.round(((n-r)*d+(o-l)*u)/p/c)*c;_=Math.max(h,Math.min(p-h,_)),n=r+_/p*d,o=l+_/p*u,a=_i([n,o],t.angle,e,i,s)||a}}if(!a)return{x:n,y:o,angle:t.angle,measure:null};const r="mi"===this.hass?.config?.unit_system?.length,l=(t,e)=>({x:e[0],y:e[1],text:li(t/this._gridPitch*this._cellCm,r)});return{x:n,y:o,angle:t.angle,measure:{labels:[l(a.sideA,a.midA),l(a.sideB,a.midB)],guide:a.centered?{x:a.wallCenter[0],y:a.wallCenter[1],angle:t.angle}:null}}}_opPointerUp(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;const i=this._opDrag,s=i.moved;this._opMeasure=null,s&&i.dirty&&(this._recordGeometry(this._t("history.move_opening"),i.before),this._saveConfig()),s?window.setTimeout(()=>this._opDrag=null,0):this._opDrag=null}_opClick(t,e){"plan"===this._mode&&"resize"===this._tool||(t.stopPropagation(),this._opDrag?.moved||"plan"===this._mode&&this._editOpening(e))}_saveOpening(){const t=this._openingDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=this._geometrySnapshot(),n=this._spaceH,o=(e.openings||[]).find(e=>e.id===t.id),a={...o||{},id:t.id||"o"+Date.now().toString(36),type:t.type,x:t.x/y_,y:t.y/n,angle:t.angle,length:o&&!t.lengthTouched?o.length:this._cmToUnits(Math.max(20,t.lengthCm))/y_,...t.host?{host:{...t.host}}:{}};if(a.host){const t=sd(o,a)?id(a,i.partitions,y_,this._cellCm,this._gridPitch):ed(a,i.partitions,y_,this._cellCm,this._gridPitch);if(!t.resolved){const e=i.partitions.find(t=>t.id===a.host.id);if("does-not-fit-jamb"===t.reason&&e){const t=Qh(e,this._cellCm,this._gridPitch);this._showToast(this._t("opening.partition_jamb_margin",{distance:li(t/this._gridPitch*this._cellCm,this._imperial)}))}else this._showToast(this._t("opening.partition_orphan"));return}const s=(e.openings||[]).flatMap(t=>{if(!t.host||t.id===a.id)return[];const e=ed(t,i.partitions,y_,this._cellCm,this._gridPitch).resolved;return e?[e]:[]});if(function(t,e,i=1e-9){const s=t.length/(2*t.axis.length),n=t.t-s,o=t.t+s;return e.some(e=>{if(e.host.id!==t.host.id||e.opening.id===t.opening.id)return!1;const s=e.length/(2*e.axis.length);return Math.max(n,e.t-s)t.id===a.id);r>=0?e.openings[r]=a:e.openings.push(a),this._recordGeometry(this._t(t.id?"history.edit_opening":"history.add_opening"),s),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_deleteOpening(){const t=this._openingDialog,e=this._curSpaceCfg;if(!t?.id||!e?.openings)return;const i=this._geometrySnapshot();e.openings=e.openings.filter(e=>e.id!==t.id),this._recordGeometry(this._t("history.delete_opening"),i),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_contactCandidates(){const t=[];for(const e of Object.keys(this.hass.states)){if(!this._openingEntityAvailable(e))continue;const i=e.split(".")[0];if("binary_sensor"!==i&&"cover"!==i)continue;const s=this.hass.states[e],n=["door","window","opening","garage_door","garage"].includes(s?.attributes?.device_class||"");("cover"!==i||n)&&t.push([e,s?.attributes?.friendly_name||e,n?0:1])}return t.sort((t,e)=>t[2]-e[2]||t[1].localeCompare(e[1])).map(([t,e])=>({value:t,label:e}))}_lockCandidates(){return Object.keys(this.hass.states).filter(t=>t.startsWith("lock.")&&this._openingEntityAvailable(t)).map(t=>({value:t,label:this.hass.states[t]?.attributes?.friendly_name||t})).sort((t,e)=>t.label.localeCompare(e.label))}_mergeClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms,s=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!s?.id)return;const n=s.id;if(!this._mergeSel||this._mergeSel===n)return void(this._mergeSel=this._mergeSel===n?null:n);const o=i.find(t=>t.id===this._mergeSel),a=o?hi(o):null,r=hi(s),l=a&&r?function(t,e){if(!t||!e||t.length<3||e.length<3)return null;const i=si(Ri(t),Ri(e));if(1!==i.length)return null;if(1!==i[0].length)return null;const s=i[0][0].slice(0,-1).map(t=>[t[0],t[1]]);return s.length>=3?s:null}(a,r):null;if(!l)return this._showToast(this._t("toast.merge_not_adjacent")),void(this._mergeSel=null);this._mergeDialog={aId:this._mergeSel,bId:n,poly:l,pick:"a"},this._mergeSel=null}_commitMerge(){const t=this._mergeDialog,e=this._curSpaceCfg;if(!t||!e||!this._spaceModel())return;const i=this._geometrySnapshot(),s=this._spaceH,n="a"===t.pick?t.aId:t.bId,o="a"===t.pick?t.bId:t.aId,a=e.rooms.find(t=>t.id===n);a?(a.poly=t.poly.map(t=>[t[0]/y_,t[1]/s]),delete a.x,delete a.y,delete a.w,delete a.h,e.rooms=e.rooms.filter(t=>t.id!==o),this._commitOpenSpans(),this._recordGeometry(this._t("history.merge_rooms"),i),this._saveConfig(),this._mergeDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.rooms_merged",{name:a.name||""}))):this._mergeDialog=null}_splitClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms;if(!this._splitSel){const e=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!e?.id)return;return void(this._splitSel={roomId:e.id,pts:[]})}const s=i.find(t=>t.id===this._splitSel.roomId),n=s?hi(s):null;if(!s||!n)return void(this._splitSel=null);const o=.02*this._gridPitch,a=6*this._gridPitch,r=function(t,e){if(!e||e.length<2)return null;let i=null,s=1/0;for(let n=0;n=n)continue;n=_;const g=Math.sqrt(u),m=(i>0?Math.max(0,Math.min(g,Math.round(p*g/i)*i)):p*g)/g;s=[a+m*h,r+m*d]}return s}(r,n,this._gridPitch)||r,c=r&&l&&Math.hypot(r[0]-t[0],r[1]-t[1])<=a?l:null,h=!!c&&bi(c,n,o),d=this._splitSel.pts;if(!d.length)return h?void(this._splitSel={...this._splitSel,pts:[c]}):void this._showToast(this._t("toast.split_pick_wall"));if(!h){const e=this._snap(t);return wi(e,n,o)?void(this._splitSel={...this._splitSel,pts:[...d,e]}):void this._showToast(this._t("toast.split_pick_inside"))}const u=Ei(n,[...d,c],o);if(!u)return void this._showToast(this._t("toast.split_bad_cut"));this._resetRoomDialogFields();const[p,_]=u,g=Pi(p)>=Pi(_)?p:_,m=g===p?_:p;this._pendingSplit={roomId:s.id,mainPoly:g,newPoly:m},this._cursorPt=null,this._nameSel="",this._areaSel="",this._roomDialog=!0}get _contourClosed(){return this._path.length>=4&&this._samePt(this._path[0],this._path[this._path.length-1])&&(null!=this._closingWallCm||!this._activeDraftId)}_markupMove(t){if(!this._markup)return;const e=t.pointerType;if(e&&(this._boundaryPointerType=e),"column"===this._tool)return void(this._cursorPt=this._snap(this._svgPoint(t)));if("opening"===this._tool||"boundary"===this._tool||"wallthick"===this._tool)return void(this._cursorPt=this._svgPoint(t));const i=("draw"===this._tool||"partition"===this._tool)&&!this._contourClosed,s="split"===this._tool&&!!this._splitSel?.pts?.length;if(!i&&!s)return;const n=this._svgPoint(t);if(i){const e=this._resolvePlanDrawPoint(n,t.shiftKey);return this._planSnapHover={contextKey:e.contextKey,candidate:e.candidate},this._path.length?void(this._cursorPt=e.point):void this._syncPlanSnapActiveMarker(e.candidate)}this._cursorPt=this._snap(n)}get _openingPreview(){const t=this._openingPreset;if("opening"!==this._tool||!t||!this._cursorPt)return null;const e=this._cursorPt,i=this._openingHoverCandidate;if(i&&Qp(i,[e[0],e[1]],t.revision,this._cfgEpoch))return i;if(this._openingAt(e))return this._openingHoverCandidate=null,null;const s=this._resolveOpeningPlacement(e);return this._openingHoverCandidate=s,s}get _opMeasureView(){return this._opMeasure||this._openingPreview?.measure||null}_saveRoom(){(this._areaSel||this._nameSel.trim())&&(this._wallFaceBatch?this._decideWallFace(!0):this._commitRoom())}_decideWallFace(t){const e=this._wallFaceBatch;if(!e)return;const i=e.candidates[e.index];if(!i)return;const s=t?{candidate:i,create:!0,name:this._nameSel.trim(),area:this._areaSel||null,settings:this._roomSettingsFromDialog()?JSON.parse(JSON.stringify(this._roomSettingsFromDialog())):null}:{candidate:i,create:!1},n=[...e.decisions,s],o=e.index+1;if(o"number"==typeof t&&Number.isFinite(t)&&t>=0?t:null,n=.02*this._gridPitch,o=this._spaceModel();if(!o)return pr;for(const e of this._planSnapGeometrySnapshot().value.segments){if("room"===e.sourceKind||Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])>n)continue;if("partition"===e.sourceKind)return s(o.partitions.find(t=>t.id===e.sourceId)?.cm)??pr;const i=e.sourceId.lastIndexOf(":"),a=i>=0?e.sourceId.slice(0,i):e.sourceId,r=i>=0?Number(e.sourceId.slice(i+1)):-1;return s(o.room_drafts.find(t=>t.id===a)?.segments[r]?.cm)??pr}for(let o=0;o+1{this._showToast(this._t(t,e)),this._roomDialogCancel()},n=t.decisions.filter(t=>t.create),o=n.map(t=>t.candidate.ring),a=i.rooms;for(let t=0;ti.id!==e&&!!hi(i)&&Di(o[t],hi(i)));if(i)return void s("toast.room_overlap",{name:i.name||""})}if((e.rooms||[]).length+n.length>400)return void s("toast.physical_limit");if(n.some(t=>t.candidate.split&&!e.rooms.some(e=>e.id===t.candidate.split.roomId)))return void s("toast.contour_cannot_close");const r=2e-4*this._gridPitch,l=new Map;for(let e=0;et.candidate.atomKeys)),i=n.some(t=>t.candidate.consumeAllActive);for(const s of Bd(this._wallGraphSources(t.activePath),r)){const t=s.sourceKeys.find(t=>l.has(t));!t||i||e.has(s.key)||c.push({a:s.a,b:s.b,cm:l.get(t)})}}else c.push(...bd(t.activePath,t.activeCms,pr));if((e.partitions||[]).length+c.length>$_)return void s("toast.physical_limit");const h=this._geometrySnapshot(),d=n.some(t=>!!t.candidate.split),u=d?tl(i.rooms,e.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,p=d&&Array.isArray(e.walls)?e.walls:null;for(const t of n){const i=t.candidate.split;if(!i)continue;const n=e.rooms.find(t=>t.id===i.roomId);if(!n)return void s("toast.contour_cannot_close");n.poly=i.mainPoly.map(t=>[t[0]/y_,t[1]/this._spaceH]),delete n.x,delete n.y,delete n.w,delete n.h}const _=Date.now().toString(36),g=[];if(n.forEach((t,i)=>{const s=t.area?this.hass.areas[t.area]?.name:"",n={id:`r${_}-${i}`,name:t.name||s||this._t("room.default_name"),area:t.area||null,poly:t.candidate.ring.map(t=>[t[0]/y_,t[1]/this._spaceH]),...t.settings?{settings:JSON.parse(JSON.stringify(t.settings))}:{}};e.rooms.push(n),g.push({room:n,decision:t})}),t.activeDraftId&&Array.isArray(e.room_drafts)&&(e.room_drafts=e.room_drafts.filter(e=>e.id!==t.activeDraftId),e.room_drafts.length||delete e.room_drafts),c.length&&(e.partitions||=[],c.forEach((t,i)=>e.partitions.push({id:`partition-${_}-${i}`,a:[t.a[0]/y_,t.a[1]/y_],b:[t.b[0]/y_,t.b[1]/y_],cm:t.cm}))),d){this._commitOpenSpans();const t=this._normalizeWalls(u,this._openCuts());t.length?e.walls=t:p?.length?e.walls=p:delete e.walls}if(g.length){this._cfgEpoch++;const i=this._openCuts(),s=this._spaceModel();if(!s)return;let n=e.walls;for(const{room:e,decision:o}of g){const a=o.candidate.ring,r=this._wallSourceCmAt(a[0],t.activePath,t.activeCms);n=Er(n,s.rooms,e.id,r,this._wallKeyPitch,i,y_);for(const o of Qr(s.rooms,n,i,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(o.roomId!==e.id||"outer"!==o.kind)continue;const i=[(o.a[0]+o.b[0])/2,(o.a[1]+o.b[1])/2];n=Ar(n,o.a,o.b,this._wallSourceCmAt(i,t.activePath,t.activeCms),this._wallKeyPitch,y_)}}const o=this._normalizeWalls(n,i);o.length?e.walls=o:delete e.walls}this._recordGeometry(this._t("history.wall_face_batch"),h),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._wallFaceBatch=null,this._roomDialog=!1,this._nameSel="",this._areaSel="",this._regSignature="",this._maybeRebuildDevices();const m=new Set(n.map(t=>t.area).filter(t=>!!t));if(m.size){const t={...this._layout};for(const e of this._devices){if(!m.has(e.area||"")||e.space!==this._space)continue;if(this._layout[e.id])continue;const i=this._defPos[e.id];i&&(t[e.id]={s:this._space,x:i.x/y_,y:i.y/y_},this._dirtyPos.add(e.id))}this._layout=t,this._persistLayout()}this._showToast(this._t(n.length?"toast.wall_rooms_saved":"toast.wall_chain_saved",{n:n.length}))}_commitRoom(){const t=this._curSpaceCfg,e=this._spaceModel();if(!t||!e)return;const i=this._geometrySnapshot(),s=this._spaceH,n=!!this._pendingSplit,o=n?tl(e.rooms,t.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,a=n&&Array.isArray(t.walls)?t.walls:null;let r;if(this._pendingSplit){const e=t.rooms.find(t=>t.id===this._pendingSplit.roomId);if(!e)return this._pendingSplit=null,this._splitSel=null,void(this._roomDialog=!1);e.poly=this._pendingSplit.mainPoly.map(t=>[t[0]/y_,t[1]/s]),delete e.x,delete e.y,delete e.w,delete e.h,r=this._pendingSplit.newPoly}else{if(!this._contourClosed)return;r=this._path.slice(0,-1)}const l=this._areaSel?this.hass.areas[this._areaSel]?.name:"",c={id:"r"+Date.now().toString(36),name:this._nameSel||l||this._t("room.default_name"),area:this._areaSel||null,poly:r.map(t=>[t[0]/y_,t[1]/s]),...this._roomSettingsFromDialog()?{settings:this._roomSettingsFromDialog()}:{}};if(t.rooms.push(c),!n&&this._activeDraftId&&Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),n){this._commitOpenSpans();const e=this._normalizeWalls(o,this._openCuts());e.length?t.walls=e:a?.length?t.walls=a:delete t.walls}if(!n){const e=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr],i=e[0]||this._drawWallCm;if(null!=i){this._cfgEpoch++;const s=this._openCuts(),n=this._spaceModel();if(!n)return;let o=Er(t.walls,n.rooms,c.id,i,this._wallKeyPitch,s,y_);for(const t of Qr(n.rooms,o,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(t.roomId!==c.id||"outer"!==t.kind)continue;const s=[(t.a[0]+t.b[0])/2,(t.a[1]+t.b[1])/2],n=r.findIndex((t,e)=>{const i=r[(e+1)%r.length];return Ns(s,[t[0],t[1],i[0],i[1]])<=.02*this._gridPitch});n>=0&&(o=Ar(o,t.a,t.b,e[n]||i,this._wallKeyPitch,y_))}o=this._normalizeWalls(o,s),o.length?t.walls=o:delete t.walls}}this._recordGeometry(this._t(n?"history.split_room":"history.add_room"),i),this._saveConfig(),this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._pendingSplit=null,this._splitSel=null;const h=this._areaSel;this._areaSel="",this._nameSel="",this._roomDialog=!1,this._regSignature="",this._maybeRebuildDevices();let d=0;if(h){const t=y_,e={...this._layout};for(const i of this._devices){if(i.area!==h||i.space!==this._space)continue;if(d++,this._layout[i.id])continue;const s=this._defPos[i.id];s&&(e[i.id]={s:this._space,x:s.x/y_,y:s.y/t},this._dirtyPos.add(i.id))}this._layout=e,this._persistLayout()}const u=this._model.find(t=>t.id===this._space)?.rooms.length||0;this._showToast(h?this._t("toast.room_saved",{n:u,added:d}):this._t("toast.room_saved_no_area",{n:u}))}_cancelPath(){this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),this._roomDialog=!1,this._pendingSplit=null,this._wallFaceBatch=null,this._splitSel=null,this._mergeSel=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._clearOpeningPlacement(!0)}_resumeLastDraft(){const t=this._resumeDraftBySpace[this._space];if(!t)return;const e=this._spaceModel()?.room_drafts.find(e=>e.id===t);e?(this._activeDraftId=t,this._path=e.points.map(t=>[...t]),this._draftSegmentCms=e.segments.map(t=>t.cm),this._clearPlanSnapHover()):delete this._resumeDraftBySpace[this._space]}_roomDialogCancel(){if(this._roomDialog=!1,this._roomEditId)return this._roomEditId=null,this._nameSel="",void(this._areaSel="");if(this._wallFaceBatch){const t=this._wallFaceBatch;return this._wallFaceBatch=null,this._path=t.activePath.map(t=>[...t]),this._draftSegmentCms=[...t.activeCms],this._activeDraftId=t.activeDraftId,this._nameSel="",this._areaSel="",void this.requestUpdate()}if(this._pendingSplit)return this._pendingSplit=null,void(this._splitSel=null);this._undoPoint()}get _freeAreas(){const t=new Set;for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area&&t.add(i.area);for(const e of this._wallFaceBatch?.decisions||[])e.create&&e.area&&t.add(e.area);return Object.values(this.hass?.areas||{}).filter(e=>!t.has(e.area_id)).sort((t,e)=>(t.name||"").localeCompare(e.name||""))}_openMarkerDialog(t){if(this._vacAllCamerasFor=null,this._vacAllCameraCache=null,t&&this._ackNewDevice(t.id),this._norm)if(t){const e=t.marker,i=Object.prototype.hasOwnProperty.call(e||{},"is_light"),s=Object.prototype.hasOwnProperty.call(e||{},"light_entity"),n=Object.prototype.hasOwnProperty.call(e||{},"glow_color"),o=Object.prototype.hasOwnProperty.call(e||{},"value_badge"),a=Object.prototype.hasOwnProperty.call(e||{},"tap_action"),r=Object.prototype.hasOwnProperty.call(e||{},"toggle_entity"),l=ks(e?.glow_color),c=this._devicePresentation(t,!0).valueBadge,h=Bo(this._planHass,t,this._devices),d=qo(this._planHass,t,h);this._markerDialog={devId:t.id,name:t.name,binding:"virtual"===t.bindingKind?"virtual":t.bindingKind+":"+t.bindingRef,bindingMode:"virtual"===t.bindingKind?"virtual":"ha",bindingOpen:!1,showEntities:"entity"===t.bindingKind&&!!this._fullRegistryHass.entities[t.bindingRef||""]?.device_id,bindingFilter:"",icon:t.marker?.icon||"",autoIcon:t.icon||"",display:Bi(t.marker?.display),rippleColor:Rt(t.marker?.ripple_color,""),rippleSize:Number(t.marker?.ripple_size)>0?Number(t.marker.ripple_size):3,size:Number(t.marker?.size)>0?Number(t.marker.size):1,angle:Number(t.marker?.angle)||0,tapAction:Wh(t.marker?.tap_action,t.primary?.split(".")[0]),tapActionTouched:!1,originalHasTapAction:a,originalTapAction:t.marker?.tap_action,tapHintAnnouncement:"",toggleEntity:e?.toggle_entity||"",toggleEntityTouched:!1,originalHasToggleEntity:r,originalToggleEntity:e?.toggle_entity,tapTarget:t.marker?.tap_target||"",tapConfirm:!0===t.marker?.tap_confirm,runFilter:"",controls:Xn(t.marker?.binding,t.marker?.controls,t.entities),controlsFilter:"",lightRole:!0===e?.is_light?"always":!1===e?.is_light?"never":"auto",lightRoleTouched:!1,originalHasIsLight:i,originalIsLight:e?.is_light,lightEntity:e?.light_entity||"",lightEntityTouched:!1,originalHasLightEntity:s,originalLightEntity:e?.light_entity,glowMode:null!=l?.bri?"fixed":l?"color":"auto",glowColor:l?.c||this._fillColors.glow_light.c,glowBrightness:Math.max(1,Math.round(100*(l?.bri??1))),glowColorDrafted:!!l,glowBrightnessDrafted:null!=l?.bri,glowTouched:!1,originalHasGlowColor:n&&(!!l||null===e?.glow_color),originalGlowColor:l||(null===e?.glow_color?null:void 0),valueBadgeEnabled:o?!0===e?.value_badge?.enabled:!!c,valueBadgeSource:e?.value_badge?.source||c?.source||d,valueBadgePosition:e?.value_badge?.position||c?.position||"right",valueBadgeTouched:!1,originalHasValueBadge:o,originalValueBadge:e?.value_badge,useClimateTemp:!0===t.marker?.use_climate_temp,glowRadius:Number(t.marker?.glow_radius_cm)>0?String(this._imperial?Math.round(Number(t.marker.glow_radius_cm)/30.48*10)/10:Math.round(Number(t.marker.glow_radius_cm))/100):"",model:t.model||"",link:t.link||"",description:t.description||"",pdfs:[...t.pdfs||[]],room:t.marker?.room_id?t.space+"#@"+t.marker.room_id:t.space&&t.area?t.space+"#"+t.area:"",hideFromPlan:!0===t.marker?.hidden,busy:!1}}else this._markerDialog={name:"",binding:"virtual",bindingMode:"virtual",bindingOpen:!1,showEntities:!1,bindingFilter:"",icon:"",autoIcon:"",display:"badge",rippleColor:"",rippleSize:3,size:1,angle:0,tapAction:"info",tapActionTouched:!1,originalHasTapAction:!1,originalTapAction:void 0,tapHintAnnouncement:"",toggleEntity:"",toggleEntityTouched:!1,originalHasToggleEntity:!1,originalToggleEntity:void 0,tapTarget:"",tapConfirm:!1,runFilter:"",controls:[],controlsFilter:"",lightRole:"auto",lightRoleTouched:!1,originalHasIsLight:!1,originalIsLight:void 0,lightEntity:"",lightEntityTouched:!1,originalHasLightEntity:!1,originalLightEntity:void 0,glowMode:"auto",glowColor:this._fillColors.glow_light.c,glowBrightness:100,glowColorDrafted:!1,glowBrightnessDrafted:!1,glowTouched:!1,originalHasGlowColor:!1,originalGlowColor:void 0,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgePosition:"right",valueBadgeTouched:!1,originalHasValueBadge:!1,originalValueBadge:void 0,useClimateTemp:!1,glowRadius:"",model:"",link:"",description:"",pdfs:[],room:"",hideFromPlan:!1,busy:!1,uploadId:"up_"+Date.now().toString(36)+Math.random().toString(36).slice(2,6)};else this._showToast(this._t("toast.marker_needs_server"))}_runCandidates(){const t=[];for(const e of Gi)for(const[i,s]of Object.entries(this.hass.states))i.startsWith(e+".")&&this._planEntityAvailable(i)&&t.push({value:i,label:s?.attributes?.friendly_name||i,sub:this._t("run."+e)});return t.sort((t,e)=>t.sub.localeCompare(e.sub)||t.label.localeCompare(e.label))}_bindingCandidates(){const t=this._planHass,e=yo(this._markers),i=new Set(this._markers.filter(t=>t.removed).map(t=>t.binding)),s=new Set;for(const t of this._devices)t.id!==this._markerDialog?.devId&&("device"===t.bindingKind&&t.bindingRef&&s.add("device:"+t.bindingRef),"entity"===t.bindingKind&&t.bindingRef&&s.add("entity:"+t.bindingRef));const n=new Set;for(const t of this._devices)"device"===t.bindingKind&&t.name&&n.add(t.name.trim()+"|"+(t.area||""));const o=[];for(const e of Object.values(t.devices)){if("service"===e.entry_type)continue;const t="device:"+e.id;if(s.has(t))continue;const a=(e.name_by_user||e.name||e.id).trim();t!==this._markerDialog?.binding&&!i.has(t)&&n.has(a+"|"+(e.area_id||""))||o.push({value:t,label:a,sub:(e.model||this._t("marker.sub_device"))+("Group"===e.model?this._t("marker.sub_z2m_group"):"")})}const a=new Set(["group","template","derivative","min_max","threshold","integration","statistics","trend","utility_meter","tod","switch_as_x","schedule"]);for(const[n,r]of Object.entries(t.entities)){const l="entity:"+n;if(s.has(l))continue;if(bo(t,n,e)&&!i.has(l))continue;const c=a.has(r.platform),h="group"===r.platform;if(!c&&!h)continue;if(r.hidden&&!i.has(l))continue;const d=t.states[n];o.push({value:l,label:r.name||d?.attributes?.friendly_name||n,sub:n.split(".")[0]+" · "+("group"===r.platform?this._t("marker.sub_group"):this._t("marker.sub_helper"))})}if(this._markerDialog?.showEntities){const n=new Set(o.map(t=>t.value));for(const[a,r]of Object.entries(t.entities)){const l="entity:"+a;if(s.has(l)||n.has(l)||r.hidden&&!i.has(l))continue;if(bo(t,a,e)&&!i.has(l))continue;const c=t.states[a],h=r.name||c?.attributes?.friendly_name||a,d=r.device_id?t.devices[r.device_id]:null,u=d&&(d.name_by_user||d.name)||"";o.push({value:l,label:h,sub:a.split(".")[0]+" · "+this._t("marker.sub_entity")+(u?" · "+u:"")})}}const r=(this._markerDialog?.bindingFilter||"").toLowerCase().trim(),l=r?o.filter(t=>(t.label+" "+t.sub+" "+t.value).toLowerCase().includes(r)):o;return l.sort((t,e)=>t.label.localeCompare(e.label)),l.slice(0,200)}_physicalBodiesR(t=this._spaceModel()){if(!t)return[];const e=`${t.id}|${this._cfgEpoch}|${this._cellCm}|${this._gridPitch}`;if(this._physicalBodiesCache?.key===e)return this._physicalBodiesCache.all;const i=Rl(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t));return this._physicalBodiesCache={key:e,...i},i.all}_rawPhysicalBodiesR(t=this._spaceModel()){if(!t)return[];this._physicalBodiesR(t);const e=this._physicalBodiesCache;return e?[...e.drafts,...e.partitions,...e.columns]:[]}_cleanFloor(t,e,i=this._spaceModel()){if(!i)return{floor:e,geom:null,path:"",area:zl([[[...e,e[0]]]])};const s=t.id||`#${i.rooms.indexOf(t)}`,n=`${i.id}|${this._cfgEpoch}|${s}`;if(!this._rszPreview){const t=r_(this._cleanFloorCache,n);if(t.hit)return t.value}const o=e.map(t=>t[0]),a=e.map(t=>t[1]),r=[Math.min(...o),Math.min(...a),Math.max(...o),Math.max(...a)],l=this._physicalBodiesR(i).filter(t=>{const e=t.map(t=>t[0]),i=t.map(t=>t[1]);return Math.max(...e)>=r[0]&&Math.min(...e)<=r[2]&&Math.max(...i)>=r[1]&&Math.min(...i)<=r[3]}),c=l.length?Fl(e,l):null,h={floor:e,geom:c,path:c?Cl(c):"",area:zl(c||[[[...e,e[0]]]])};return this._rszPreview||l_(this._cleanFloorCache,n,h,600),h}_autoIconForBinding(t){if("virtual"===t)return"mdi:map-marker";const[e,i]=t.split(":");if(!i)return"";const s=this._fullRegistryHass,n=this._bindingStatus(t),o="active"===n.kind?n.enabledEntityIds:n.allEntityIds;if("device"===e){const t=s.devices?.[i];if(!t)return"mdi:help-circle";const e=o;return e.some(t=>t.startsWith("lock."))?"mdi:lock":vo(s,t.name_by_user||t.name||"",t.model,e,this._iconRules)}if("entity"===e){const t=s.entities?.[i],e=this.hass.states?.[i],n=t?.name||e?.attributes?.friendly_name||i;return i.startsWith("lock.")?"mdi:lock":vo(s,n,"",[i],this._iconRules)}return""}_allRoomsFlat(){const t=[];for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area?t.push({value:e.id+"#"+i.area,label:(e.title||e.id)+" · "+i.name}):i.id&&t.push({value:e.id+"#@"+i.id,label:(e.title||e.id)+" · "+i.name+" · "+this._t("marker.subarea")});return t}_errText(t){if(!t)return this._t("err.unknown");if("string"==typeof t)return t;if("invalid_passage_fields"===t.code){const e=String(t.message||t.error||"").match(/space=([^;]*);\s*opening=([^;]*);\s*fields=([^;]*)/);if(e){const t=this._serverCfg?.spaces?.find(t=>String(t.id)===e[1]),i={contact:"opening.contact_label",lock:"opening.lock_label",invert:"opening.invert",flip_h:"opening.flip_h",flip_v:"opening.flip_v"},s=e[3].split(",").filter(Boolean).map(t=>i[t]?this._t(i[t]):t).join(", ");return this._t("opening.invalid_passage_fields",{room:t?.title||e[1],fields:s})}}if("invalid_partition_opening_jamb_margin"===t.code){const e=String(t.message||t.error||"").match(/margin_cm=([^;]*)/),i=e?Number(e[1]):NaN;if(Number.isFinite(i))return this._t("opening.partition_jamb_margin",{distance:li(i,this._imperial)})}if(t.message)return t.message;if(t.error)return t.error;if(null!=t.code)return this._t("err.code",{code:t.code});try{return JSON.stringify(t)}catch{return String(t)}}_backupErrorText(t){const e=t?.code??t?.error;if("string"==typeof e){const t=`backup.error.${e}`,i=this._t(t);if(i!==t)return i}return this._errText(t)}async _pickMarkerFiles(t){const e=t.target,i=e.files?[...e.files]:[];if(e.value="",!i.length||!this._markerDialog)return;const s=this._markerDialog.uploadId||this._markerDialog.devId||"new",n=[];for(const t of i)try{const e=new FormData;e.append("marker_id",s),e.append("file",t,t.name);const i=this.hass?.fetchWithAuth?await this.hass.fetchWithAuth("/api/houseplan/upload",{method:"POST",body:e}):await fetch("/api/houseplan/upload",{method:"POST",body:e,headers:this.hass?.auth?.data?.access_token?{authorization:`Bearer ${this.hass.auth.data.access_token}`}:{}}),o=await i.json().catch(()=>({}));if(!i.ok||o.error){const t={too_large:this._t("err.too_large",{mb:o.max_mb||50}),bad_ext:this._t("err.bad_ext"),unauthorized:this._t("err.unauthorized")};throw new Error(t[o.error]||o.error||"HTTP "+i.status)}n.push({name:o.name||t.name,url:o.url})}catch(e){this._showToast(this._t("toast.file_failed",{name:t.name,err:this._errText(e)}))}n.length&&this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:[...this._markerDialog.pdfs,...n]},this._showToast(this._t("toast.files_attached",{n:n.length})))}_removeMarkerPdf(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:this._markerDialog.pdfs.filter(e=>e.url!==t)})}_markerLightFields(t){const e={};if(t.lightRoleTouched?"always"===t.lightRole?e.is_light=!0:"never"===t.lightRole&&(e.is_light=!1):t.originalHasIsLight&&(e.is_light=t.originalIsLight??null),t.lightEntityTouched?t.lightEntity&&(e.light_entity=t.lightEntity):t.originalHasLightEntity&&(e.light_entity=t.originalLightEntity??null),t.glowTouched){if("auto"!==t.glowMode){const i={c:Rt(t.glowColor,this._fillColors.glow_light.c)};"fixed"===t.glowMode&&(i.bri=Math.max(.01,Math.min(1,Math.round(t.glowBrightness)/100))),e.glow_color=i}}else t.originalHasGlowColor&&(e.glow_color=t.originalGlowColor??null);return e}_markerTapActionFields(t){return t.tapActionTouched?{tap_action:t.tapAction||null}:t.originalHasTapAction?{tap_action:t.originalTapAction??null}:{}}_markerToggleEntityFields(t){return(e={touched:t.toggleEntityTouched,originalHas:t.originalHasToggleEntity,original:t.originalToggleEntity,value:t.toggleEntity}).touched?e.value?{toggle_entity:e.value}:{}:e.originalHas?{toggle_entity:e.original??null}:{};var e}async _saveMarker(){const t=this._markerDialog;if(!t||t.busy)return;const e=this._effectiveMarkerTapAction(t);if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return;if("virtual"===t.binding&&!t.name.trim())return void this._showToast(this._t("toast.virtual_name_required"));if("run"===e&&!t.tapTarget)return void this._showToast(this._t("toast.run_target_required"));if(t.valueBadgeTouched&&t.valueBadgeEnabled&&!t.valueBadgeSource)return void this._showToast(this._t("toast.value_badge_source_required"));if("ha"===t.bindingMode){const e=this._bindingStatus(t.binding),i=t.devId?this._markers.find(e=>e.id===t.devId):null,s=!i||i.binding!==t.binding;if("active"!==e.kind&&s)return void this._showToast(this._t("ha_disabled"===e.kind?"toast.ha_disabled_add":"toast.ha_binding_unverified"));if("ha_disabled"===e.kind&&!0===i?.hidden&&!t.hideFromPlan)return this._markerDialog={...t,hideFromPlan:!0},void this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device"))}const i=this._serverCfg;if(!i)return;const s=i.markers||[],n=qs(t.room);let o=n?.space||null;const a=n?.area||null,r=n?.roomId||null,l=Fi(t.binding,t.devId,()=>"v_"+Date.now().toString(36)),c=t.devId,h=c?this._devices.find(t=>t.id===c):null,d=n?.space||h?.space||null,u=d?this._spaceModelById(d):this._spaceModel();if(!u)return;const p=u.id;"virtual"!==t.binding||o||(o=p),this._markerDialog={...t,busy:!0};try{const n="virtual"===t.binding?[]:s.filter(e=>e.removed&&e.binding===t.binding).map(t=>t.id),d=n.length>0,_=Xn(t.binding,t.controls,this._bindingEntities(t.binding)),g=s.find(t=>t.id===l||t.id===c)?.vacuum||null,m={id:l,vacuum:g,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&3!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle?t.angle:null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===e&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:_.length?_:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=a_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:!!t.hideFromPlan};("virtual"===t.binding||t.room)&&(m.space=o,m.area=a,m.room_id=r);const f=h?.marker?.room_id??null,v=!!t.room&&null!=h&&(h.space!==o||h.area!==a||f!==r);let y=!1;const b=t.uploadId||c;if(b&&b!==l&&m.pdfs?.length)try{const t=await this.hass.callWS({type:"houseplan/files/migrate",from_id:b,to_id:l}),e=t?.mapping||{};m.pdfs=function(t,e,i,s){if(!e||!i||e===i)return t;const n="/files/"+e+"/",o="/files/"+i+"/";return t.map(t=>{if(!t.url.includes(n))return t;const e=t.url.split(n)[1]||"",[i,a]=[e.split("?")[0],e.includes("?")?"?"+e.split("?")[1]:""];if(s){const e=s[decodeURIComponent(i)]??s[i];return e?{...t,url:t.url.split(n+i)[0]+o+encodeURIComponent(e)+a}:t}return{...t,url:t.url.split(n).join(o)}})}(m.pdfs,b,l,e),y=Object.keys(e).length>0}catch(t){this._showToast(this._t("toast.files_migrate_failed",{err:this._errText(t)}))}i.markers=s,c&&c!==l&&(i.markers=function(t,e,i){if(!e||!i||e===i)return[...t];const s=`marker:${e}`,n=`marker:${i}`;return t.map(t=>{const e=Array.isArray(t.controls)?t.controls.map(t=>t===s?n:t):t.controls,i="derived_marker_state"===t.value_badge?.source?.kind&&t.value_badge.source.ref===s?{...t.value_badge,source:{...t.value_badge.source,ref:n}}:t.value_badge;return e===t.controls&&i===t.value_badge?t:{...t,controls:e,value_badge:i}})}(i.markers,c,l)),c&&c!==l&&"derived_marker_state"===m.value_badge?.source?.kind&&m.value_badge.source.ref===`marker:${c}`&&(m.value_badge.source={kind:"derived_marker_state",ref:`marker:${l}`}),i.markers=i.markers.filter(t=>t.id!==l&&t.id!==c&&("virtual"===m.binding||t.binding!==m.binding)),i.markers.push(m);let w=null;const k=c?this._layout[c]:null,$=k?{s:k.s||h?.space||this._space,x:k.x,y:k.y}:c&&h&&this._defPos[c]?this._normPos(h.space,this._defPos[c].x,this._defPos[c].y):null;if(!d&&$&&$.s===p)l===c&&this._layout[l]&&!v||(w={s:$.s,x:$.x,y:$.y},this._layout={...this._layout,[l]:w});else if(d||!this._layout[l]||v){let t=u.vb[0]+u.vb[2]/2,e=u.vb[1]+u.vb[3]/2;const i=r?u.rooms.find(t=>t.id===r):a?u.rooms.find(t=>t.area===a):void 0;i&&([t,e]=this._roomCenter(i)),w=this._normPos(p,t,e),this._layout={...this._layout,[l]:w}}await this._saveConfigNow(),w&&this._noteLayoutRev(await this.hass.callWS({type:"houseplan/layout/update",device_id:l,pos:w}));const x=new Set(n);c&&c!==l&&x.add(c),x.delete(l);for(const t of x)delete this._layout[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{});y&&b&&await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:b}).catch(()=>{}),this._markerDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_saved"))}catch(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}async _deleteMarker(){const t=this._markerDialog;if(!t||t.busy||!t.devId)return;const e=t.devId?this._devices.find(e=>e.id===t.devId):null;if(!e)return;const i=t.name||this._t("device.fallback");if(!confirm(this._t("confirm.remove_marker",{name:i})))return;const s=this._serverCfg;s.markers=s.markers||[];const n=s.markers,o="virtual"===e.bindingKind?"virtual":e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:"";if(!o)return;const a=function(t,e,i,s){const n=new Set([e]),o=t.filter(t=>{const o=t.id===e||!s&&t.binding===i;return o&&n.add(t.id),!o});return{markers:s?o:[...o,{id:e,binding:i,removed:!0,hidden:!0}],cleanupIds:n}}(s.markers,e.id,o,"virtual"===e.bindingKind);var r,l;s.markers=(r=a.markers,l=a.cleanupIds,r.map(t=>{if(!Array.isArray(t.controls))return t;const e=t.controls.filter(t=>!("string"==typeof t&&t.startsWith("marker:")&&l.has(t.slice(7))));return e.length===t.controls.length?t:{...t,controls:e.length?e:null}}));const c=a.cleanupIds;this._markerDialog={...t,busy:!0};try{await this._saveConfigNow();for(const t of c){delete this._layout[t],delete this._defPos[t],this._dirtyPos.delete(t),this._sentPos.delete(t);const e=this._activityRt.get(t);e&&clearTimeout(e.timer),this._activityRt.delete(t),this._vacRt.delete(t),delete this._vacSrvTrails[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{}),await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:t}).catch(()=>{}),await this.hass.callWS({type:"houseplan/trail/delete",marker_id:t}).catch(()=>{})}this._markerDialog=null,this._infoCard?.id===e.id&&this._closeInfoCard(),this._selId===e.id&&(this._selId=null),this._drag?.id===e.id&&(this._drag=null),this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_removed"))}catch(t){this._serverCfg===s&&(s.markers=n),this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}_normPos(t,e,i){return{s:t,x:e/y_,y:i/y_}}_openSpaceDialog(t,e){if(this._serverStorage&&this._serverCfg)if("edit"===t){const i=this._serverCfg.spaces.find(t=>t.id===e);if(!i)return;const s=cs(i),n=i.settings?.custom_fill&&"object"==typeof i.settings.custom_fill?rs(i.settings.custom_fill):null,o="none"===s.fill?{...n||as,a:0}:n;this._spaceDialog={mode:t,spaceId:e,title:i.title,planUrl:i.plan_url||null,planFile:null,source:i.plan_url?"file":"draw",showBorders:s.showBorders,showNames:s.showNames,hideDecor:s.hideDecor,hideOpenings:s.hideOpenings,roomColor:s.color,roomOpacity:s.opacity,fillMode:"none"===s.fill?"custom":s.fill,customFill:o,glowEnabled:s.glow,bgColor:s.bgColor,bgMode:"static"===i.settings?.bg_mode||"daynight"===i.settings?.bg_mode?i.settings.bg_mode:null,northDeg:Ka({},i.settings),sunRays:"boolean"==typeof i.settings?.sun_rays?i.settings.sun_rays:null,tempMin:s.tempMin,tempMax:s.tempMax,showLqi:s.showLqi??this._config?.show_signal??!0,cardFontScale:s.cardFontScale,labelTemp:s.labelTemp,labelHum:s.labelHum,labelLqi:s.labelLqi,labelLight:s.labelLight,cellCm:Number(i.cell_cm)>0?Number(i.cell_cm):5,busy:!1}}else this._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,source:"file",showBorders:!1,showNames:!1,hideDecor:!1,hideOpenings:!1,roomColor:ns,roomOpacity:os,fillMode:"custom",customFill:{...as,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:20,tempMax:25,showLqi:this._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:5,busy:!1};else this._showToast(this._t("toast.integration_missing"))}async _pickPlanFile(t){const e=t.target,i=e.files?.[0];if(!i||!this._spaceDialog)return;const s={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/webp":"webp"}[i.type]||(i.name.toLowerCase().endsWith(".svg")?"svg":"");if(!s)return void this._showToast(this._t("toast.plan_formats"));const n=new Uint8Array(await i.arrayBuffer());let o="";for(let t=0;t{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:1.414),e.onerror=()=>t(1.414),e.src=r});URL.revokeObjectURL(r),this._spaceDialog={...this._spaceDialog,planFile:{ext:s,b64:a,aspect:l,name:i.name}}}_useServerPlan(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let e=0;e<40;e++){const e=this._display(t);if(e){const i=await new Promise(t=>{const i=new Image;i.onload=()=>t(i.naturalWidth&&i.naturalHeight?i.naturalWidth/i.naturalHeight:0),i.onerror=()=>t(0),i.src=e}),s=this._spaceDialog;return s&&s.planUrl===t&&Number.isFinite(i)&&i>0?(this._spaceDialog={...s,savedAspect:i},i):0}if(await new Promise(t=>setTimeout(t,150)),this._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){if(confirm(this._t("confirm.delete_plan",{name:t})))try{await this.hass.callWS({type:"houseplan/plans/delete",name:t});const e=this._spaceDialog;e?.saved&&(this._spaceDialog={...e,saved:e.saved.filter(e=>e.name!==t)})}catch(t){this._showToast(this._t("toast.plan_delete_failed",{err:this._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return j`
${this._t("space.loading")}
`;const e=t.saved||[];if(!e.length)return j`
${this._t("space.no_saved")}
`;return j`
+
`:j``}_openingAt(t){if(!this._openingsR.length)return null;const e=this._openingsR.flatMap(e=>{const i=e.angle*Math.PI/180,s=t[0]-e.rx,n=t[1]-e.ry,o=s*Math.cos(i)+n*Math.sin(i);return Math.abs(o)>e.rlen/2+12?[]:[{o:e,localY:-s*Math.sin(i)+n*Math.cos(i)}]});if(!e.length)return null;const i=this._spaceModel();if(!i)return null;const s=this._openPairs().flatMap(t=>t.segs),n=this._openingWallIndexFor(i,s).value;return e.find(({o:t,localY:e})=>{const i="gate"===t.type?!t.flip_v:t.flip_v,s=t.partitionHost||this._spaceWalls.length||"gate"===t.type?this._openingFace(t,n,!!i):{ox:0,oy:0,cm:0,side:-1},o=Yd({type:t.type,length:t.rlen,angle:t.angle,amount:this._openingAmt(t),flipH:!!t.flip_h,flipV:!!t.flip_v,cellCm:this._cellCm,gridPitch:this._gridPitch,face:s});return Math.abs(e)<=o.hitHalf})?.o||null}_resolveOpeningPlacement(t){const e=this._openingPreset;if("opening"!==this._tool||!e)return null;const i=this._spaceModel();if(!i)return null;const s=this._openCuts(),n=this._openingWallIndexFor(i,s),o=`${n.key}|partitions:${this._cfgEpoch}`;var a,r,l;this._openingPlacementIntervalsCache&&this._openingPlacementIntervalsCache.key===o||(this._openingPlacementIntervalsCache={key:o,value:[...Qr(i.rooms,this._spaceWalls,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_),...(a=i.partitions,r=this._cellCm,l=this._gridPitch,a.flatMap(t=>!Zh(t.a)||!Zh(t.b)||Math.hypot(t.b[0]-t.a[0],t.b[1]-t.a[1])<=1e-9?[]:[{roomId:"",a:[t.a[0],t.a[1]],b:[t.b[0],t.b[1]],key:`partition:${t.id}`,kind:"outer",cm:t.cm,open:!1,half:fr(t.cm,r,l)/2,partitionHost:{kind:"partition",id:t.id}}]))]});const c=Zp({pointer:[t[0],t[1]],preset:e,geometryRevision:this._cfgEpoch,renderedLength:this._cmToUnits(e.lengthCm),intervals:this._openingPlacementIntervalsCache.value,baseTolerance:1.5*this._gridPitch,bodyPointerPadding:this._cssPxToRender(this._boundaryCoarse?10:6),gridStep:this._gridPitch});this._openingJambBlockCm=c.jambBlockedTarget?c.jambBlockedTarget.physicalHalfWidth/this._gridPitch*this._cellCm:null;const h=c.candidate;if(!h)return null;const d="gate"===h.type?!h.flipV:h.flipV;let u;if(h.host){const t=ed({id:"preview",type:h.type,x:h.x/y_,y:h.y/y_,angle:h.angle,length:h.renderedLength/y_,host:h.host},i.partitions,y_,this._cellCm,this._gridPitch).resolved;u=t?od(t,d):{ox:0,oy:0,cm:0,side:-1}}else u=yl(n.value,{x:h.x,y:h.y,angle:h.angle,length:h.renderedLength,flip_v:d});const p="mi"===this.hass?.config?.unit_system?.length,_=_i([h.x,h.y],h.angle,h.renderedLength,i.rooms,this._gridPitch/2),g=(_?[{distance:_.sideA,midpoint:_.midA},{distance:_.sideB,midpoint:_.midB}]:h.measure.labels).map(t=>({x:t.midpoint[0],y:t.midpoint[1],text:li(t.distance/this._gridPitch*this._cellCm,p)}));return{...h,face:u,measure:{labels:g,guide:h.measure.guide}}}_activateOpeningPlacement(t){this._activateMarkupTool("opening"),"opening"===this._tool&&(this._openingPreset=function(t,e){return{type:t,lengthCm:Kp(t),flipH:!1,flipV:!1,revision:e}}(t,++this._openingPresetRevision),this._openingHoverCandidate=null,this._cursorPt=null)}_clearOpeningPlacement(t){this._openingHoverCandidate=null,this._openingJambBlockCm=null,t&&(this._openingPreset=null,this._openingRebindId=null)}_openingClick(t){const e=this._spaceModel();if(!e)return;const i=this._openingRebindId?null:this._openingAt(t);if(i)return void this._editOpening(i);const s=this._openingPreset;if(!s)return;const n=this._openingHoverCandidate,o=n&&Qp(n,[t[0],t[1]],s.revision,this._cfgEpoch)?n:this._resolveOpeningPlacement(t);if(!o){if(null!=this._openingJambBlockCm)return void this._showToast(this._t("opening.partition_jamb_margin",{distance:li(this._openingJambBlockCm,this._imperial)}));const i=1.5*this._gridPitch,s=pi(t,e.rooms,i);return s&&function(t,e,i,s,n){for(const o of s)if(!(Ns([t,e],o)>n)&&Pr([o[0],o[1]],[o[2],o[3]],i))return!0;return!1}(s.x,s.y,s.angle,this._openCuts(),i)?void this._showToast(this._t("toast.opening_on_virtual")):void this._showToast(this._t("toast.opening_no_wall"))}const a=this._openingRebindId?this._curSpaceCfg?.openings?.find(t=>t.id===this._openingRebindId):null;this._openingDialog={...a?{id:a.id,type:a.type,lengthCm:Math.round(a.length*y_/this._gridPitch*this._cellCm),lengthTouched:!1,contact:a.contact||"",lock:a.lock||"",invert:!!a.invert,flipH:!!a.flip_h,flipV:!!a.flip_v}:{type:o.type,lengthCm:o.lengthCm,contact:"",lock:"",invert:!1,flipH:o.flipH,flipV:o.flipV},...o.host?{host:o.host}:{},x:o.x,y:o.y,angle:o.angle},this._openingRebindId=null,this._openingHoverCandidate=null,this._cursorPt=null}_editOpening(t){this._openingDialog={id:t.id,type:t.type,lengthCm:Math.round(t.rlen/this._gridPitch*this._cellCm),lengthTouched:!1,contact:t.contact||"",lock:t.lock||"",invert:!!t.invert,flipH:!!t.flip_h,flipV:!!t.flip_v,...t.host?{host:{...t.host}}:{},x:t.rx,y:t.ry,angle:t.angle}}_opPointerDown(t,e){if("plan"===this._mode&&this._spaceModel()&&"resize"!==this._tool){t.preventDefault(),t.stopPropagation();try{C_(t)}catch{}this._opDrag={id:e.id,moved:!1,sx:t.clientX,sy:t.clientY,dirty:!1,before:this._geometrySnapshot()}}}_opPointerMove(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;if(Math.abs(t.clientX-this._opDrag.sx)+Math.abs(t.clientY-this._opDrag.sy)<=3)return;const i=this._spaceModel();if(!i)return;const s=this._svgPoint(t),n=this._curSpaceCfg,o=n?.openings?.find(t=>t.id===e.id);if(!o)return;if("partition"===o.host?.kind){const t=i.partitions.find(t=>t.id===o.host.id);if(!t)return;const e=t.b[0]-t.a[0],n=t.b[1]-t.a[1],a=Math.hypot(e,n);if(!(a>1e-9))return;const r=e/a,l=n/a;if(Math.abs((s[0]-t.a[0])*l-(s[1]-t.a[1])*r)>4*this._gridPitch)return;const c=o.length*y_/2+Qh(t,this._cellCm,this._gridPitch);let h=(s[0]-t.a[0])*r+(s[1]-t.a[1])*l;if(h=Math.round(h/this._gridPitch)*this._gridPitch,h=Math.max(c,Math.min(a-c,h)),a<2*c-1e-9)return;const d=h/a,u=(t.a[0]+r*h)/y_,p=(t.a[1]+l*h)/this._spaceH;let _=180*Math.atan2(n,e)/Math.PI;_>=90?_-=180:_<-90&&(_+=180);const g=o.host.t!==d||o.x!==u||o.y!==p||o.angle!==_;return this._opDrag.moved=!0,g&&(this._opDrag.dirty=!0),o.host={...o.host,t:d},o.x=u,o.y=p,o.angle=_,this._opMeasure=null,g&&this._cfgEpoch++,void this.requestUpdate()}const a=pi(s,i.rooms,4*this._gridPitch);if(!a)return;this._opDrag.moved=!0;const r=this._opRuler(a,o.length*y_);this._opMeasure=r.measure;const l=r.x/y_,c=r.y/this._spaceH,h=o.x!==l||o.y!==c||o.angle!==a.angle;h&&(this._opDrag.dirty=!0),o.x=l,o.y=c,o.angle=a.angle,h&&this._cfgEpoch++,this.requestUpdate()}_opRuler(t,e){const i=this._spaceModel()?.rooms||[],s=this._gridPitch/2;let n=t.x,o=t.y,a=_i([n,o],t.angle,e,i,s);if(a&&a.centered&&(n!==a.wallCenter[0]||o!==a.wallCenter[1]))[n,o]=a.wallCenter,a=_i([n,o],t.angle,e,i,s);else if(a){const[r,l]=a.wallA,[c,h]=a.wallB,d=c-r,u=h-l,p=Math.hypot(d,u);if(p>0){const c=this._gridPitch,h=Math.min(e/2,p/2);let _=Math.round(((n-r)*d+(o-l)*u)/p/c)*c;_=Math.max(h,Math.min(p-h,_)),n=r+_/p*d,o=l+_/p*u,a=_i([n,o],t.angle,e,i,s)||a}}if(!a)return{x:n,y:o,angle:t.angle,measure:null};const r="mi"===this.hass?.config?.unit_system?.length,l=(t,e)=>({x:e[0],y:e[1],text:li(t/this._gridPitch*this._cellCm,r)});return{x:n,y:o,angle:t.angle,measure:{labels:[l(a.sideA,a.midA),l(a.sideB,a.midB)],guide:a.centered?{x:a.wallCenter[0],y:a.wallCenter[1],angle:t.angle}:null}}}_opPointerUp(t,e){if(!this._opDrag||this._opDrag.id!==e.id)return;const i=this._opDrag,s=i.moved;this._opMeasure=null,s&&i.dirty&&(this._recordGeometry(this._t("history.move_opening"),i.before),this._saveConfig()),s?window.setTimeout(()=>this._opDrag=null,0):this._opDrag=null}_opClick(t,e){"plan"===this._mode&&"resize"===this._tool||(t.stopPropagation(),this._opDrag?.moved||"plan"===this._mode&&this._editOpening(e))}_saveOpening(){const t=this._openingDialog,e=this._curSpaceCfg,i=this._spaceModel();if(!t||!e||!i)return;const s=this._geometrySnapshot(),n=this._spaceH,o=(e.openings||[]).find(e=>e.id===t.id),a={...o||{},id:t.id||"o"+Date.now().toString(36),type:t.type,x:t.x/y_,y:t.y/n,angle:t.angle,length:o&&!t.lengthTouched?o.length:this._cmToUnits(Math.max(20,t.lengthCm))/y_,...t.host?{host:{...t.host}}:{}};if(a.host){const t=sd(o,a)?id(a,i.partitions,y_,this._cellCm,this._gridPitch):ed(a,i.partitions,y_,this._cellCm,this._gridPitch);if(!t.resolved){const e=i.partitions.find(t=>t.id===a.host.id);if("does-not-fit-jamb"===t.reason&&e){const t=Qh(e,this._cellCm,this._gridPitch);this._showToast(this._t("opening.partition_jamb_margin",{distance:li(t/this._gridPitch*this._cellCm,this._imperial)}))}else this._showToast(this._t("opening.partition_orphan"));return}const s=(e.openings||[]).flatMap(t=>{if(!t.host||t.id===a.id)return[];const e=ed(t,i.partitions,y_,this._cellCm,this._gridPitch).resolved;return e?[e]:[]});if(function(t,e,i=1e-9){const s=t.length/(2*t.axis.length),n=t.t-s,o=t.t+s;return e.some(e=>{if(e.host.id!==t.host.id||e.opening.id===t.opening.id)return!1;const s=e.length/(2*e.axis.length);return Math.max(n,e.t-s)t.id===a.id);r>=0?e.openings[r]=a:e.openings.push(a),this._recordGeometry(this._t(t.id?"history.edit_opening":"history.add_opening"),s),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_deleteOpening(){const t=this._openingDialog,e=this._curSpaceCfg;if(!t?.id||!e?.openings)return;const i=this._geometrySnapshot();e.openings=e.openings.filter(e=>e.id!==t.id),this._recordGeometry(this._t("history.delete_opening"),i),this._saveConfig(),this._openingDialog=null,this.requestUpdate()}_contactCandidates(){const t=[];for(const e of Object.keys(this.hass.states)){if(!this._openingEntityAvailable(e))continue;const i=e.split(".")[0];if("binary_sensor"!==i&&"cover"!==i)continue;const s=this.hass.states[e],n=["door","window","opening","garage_door","garage"].includes(s?.attributes?.device_class||"");("cover"!==i||n)&&t.push([e,s?.attributes?.friendly_name||e,n?0:1])}return t.sort((t,e)=>t[2]-e[2]||t[1].localeCompare(e[1])).map(([t,e])=>({value:t,label:e}))}_lockCandidates(){return Object.keys(this.hass.states).filter(t=>t.startsWith("lock.")&&this._openingEntityAvailable(t)).map(t=>({value:t,label:this.hass.states[t]?.attributes?.friendly_name||t})).sort((t,e)=>t.label.localeCompare(e.label))}_mergeClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms,s=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!s?.id)return;const n=s.id;if(!this._mergeSel||this._mergeSel===n)return void(this._mergeSel=this._mergeSel===n?null:n);const o=i.find(t=>t.id===this._mergeSel),a=o?hi(o):null,r=hi(s),l=a&&r?function(t,e){if(!t||!e||t.length<3||e.length<3)return null;const i=si(Ri(t),Ri(e));if(1!==i.length)return null;if(1!==i[0].length)return null;const s=i[0][0].slice(0,-1).map(t=>[t[0],t[1]]);return s.length>=3?s:null}(a,r):null;if(!l)return this._showToast(this._t("toast.merge_not_adjacent")),void(this._mergeSel=null);this._mergeDialog={aId:this._mergeSel,bId:n,poly:l,pick:"a"},this._mergeSel=null}_commitMerge(){const t=this._mergeDialog,e=this._curSpaceCfg;if(!t||!e||!this._spaceModel())return;const i=this._geometrySnapshot(),s=this._spaceH,n="a"===t.pick?t.aId:t.bId,o="a"===t.pick?t.bId:t.aId,a=e.rooms.find(t=>t.id===n);a?(a.poly=t.poly.map(t=>[t[0]/y_,t[1]/s]),delete a.x,delete a.y,delete a.w,delete a.h,e.rooms=e.rooms.filter(t=>t.id!==o),this._commitOpenSpans(),this._recordGeometry(this._t("history.merge_rooms"),i),this._saveConfig(),this._mergeDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.rooms_merged",{name:a.name||""}))):this._mergeDialog=null}_splitClick(t){const e=this._spaceModel();if(!e)return;const i=e.rooms;if(!this._splitSel){const e=[...i].reverse().find(e=>this._pointInRoom(t,e));if(!e?.id)return;return void(this._splitSel={roomId:e.id,pts:[]})}const s=i.find(t=>t.id===this._splitSel.roomId),n=s?hi(s):null;if(!s||!n)return void(this._splitSel=null);const o=.02*this._gridPitch,a=6*this._gridPitch,r=function(t,e){if(!e||e.length<2)return null;let i=null,s=1/0;for(let n=0;n=n)continue;n=_;const g=Math.sqrt(u),m=(i>0?Math.max(0,Math.min(g,Math.round(p*g/i)*i)):p*g)/g;s=[a+m*h,r+m*d]}return s}(r,n,this._gridPitch)||r,c=r&&l&&Math.hypot(r[0]-t[0],r[1]-t[1])<=a?l:null,h=!!c&&bi(c,n,o),d=this._splitSel.pts;if(!d.length)return h?void(this._splitSel={...this._splitSel,pts:[c]}):void this._showToast(this._t("toast.split_pick_wall"));if(!h){const e=this._snap(t);return wi(e,n,o)?void(this._splitSel={...this._splitSel,pts:[...d,e]}):void this._showToast(this._t("toast.split_pick_inside"))}const u=Ei(n,[...d,c],o);if(!u)return void this._showToast(this._t("toast.split_bad_cut"));this._resetRoomDialogFields();const[p,_]=u,g=Pi(p)>=Pi(_)?p:_,m=g===p?_:p;this._pendingSplit={roomId:s.id,mainPoly:g,newPoly:m},this._cursorPt=null,this._nameSel="",this._areaSel="",this._roomDialog=!0}get _contourClosed(){return this._path.length>=4&&this._samePt(this._path[0],this._path[this._path.length-1])&&(null!=this._closingWallCm||!this._activeDraftId)}_markupMove(t){if(!this._markup)return;const e=t.pointerType;if(e&&(this._boundaryPointerType=e),"column"===this._tool)return void(this._cursorPt=this._snap(this._svgPoint(t)));if("opening"===this._tool||"boundary"===this._tool||"wallthick"===this._tool)return void(this._cursorPt=this._svgPoint(t));const i="draw"===this._tool&&!this._contourClosed,s="split"===this._tool&&!!this._splitSel?.pts?.length;if(!i&&!s)return;const n=this._svgPoint(t);if(i){const e=this._resolvePlanDrawPoint(n,t.shiftKey);return this._planSnapHover={contextKey:e.contextKey,candidate:e.candidate},this._path.length?void(this._cursorPt=e.point):void this._syncPlanSnapActiveMarker(e.candidate)}this._cursorPt=this._snap(n)}get _openingPreview(){const t=this._openingPreset;if("opening"!==this._tool||!t||!this._cursorPt)return null;const e=this._cursorPt,i=this._openingHoverCandidate;if(i&&Qp(i,[e[0],e[1]],t.revision,this._cfgEpoch))return i;if(this._openingAt(e))return this._openingHoverCandidate=null,null;const s=this._resolveOpeningPlacement(e);return this._openingHoverCandidate=s,s}get _opMeasureView(){return this._opMeasure||this._openingPreview?.measure||null}_saveRoom(){(this._areaSel||this._nameSel.trim())&&(this._wallFaceBatch?this._decideWallFace(!0):this._commitRoom())}_decideWallFace(t){const e=this._wallFaceBatch;if(!e)return;const i=e.candidates[e.index];if(!i)return;const s=t?{candidate:i,create:!0,name:this._nameSel.trim(),area:this._areaSel||null,settings:this._roomSettingsFromDialog()?JSON.parse(JSON.stringify(this._roomSettingsFromDialog())):null}:{candidate:i,create:!1},n=[...e.decisions,s],o=e.index+1;if(o"number"==typeof t&&Number.isFinite(t)&&t>=0?t:null,n=.02*this._gridPitch,o=this._spaceModel();if(!o)return pr;for(const e of this._planSnapGeometrySnapshot().value.segments){if("room"===e.sourceKind||Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])>n)continue;if("partition"===e.sourceKind)return s(o.partitions.find(t=>t.id===e.sourceId)?.cm)??pr;const i=e.sourceId.lastIndexOf(":"),a=i>=0?e.sourceId.slice(0,i):e.sourceId,r=i>=0?Number(e.sourceId.slice(i+1)):-1;return s(o.room_drafts.find(t=>t.id===a)?.segments[r]?.cm)??pr}for(let o=0;o+1{this._showToast(this._t(t,e)),this._roomDialogCancel()},n=t.decisions.filter(t=>t.create),o=n.map(t=>t.candidate.ring),a=i.rooms;for(let t=0;ti.id!==e&&!!hi(i)&&Di(o[t],hi(i)));if(i)return void s("toast.room_overlap",{name:i.name||""})}if((e.rooms||[]).length+n.length>400)return void s("toast.physical_limit");if(n.some(t=>t.candidate.split&&!e.rooms.some(e=>e.id===t.candidate.split.roomId)))return void s("toast.contour_cannot_close");const r=2e-4*this._gridPitch,l=new Map;for(let e=0;et.candidate.atomKeys)),i=n.some(t=>t.candidate.consumeAllActive);for(const s of Bd(this._wallGraphSources(t.activePath),r)){const t=s.sourceKeys.find(t=>l.has(t));!t||i||e.has(s.key)||c.push({a:s.a,b:s.b,cm:l.get(t)})}}else c.push(...bd(t.activePath,t.activeCms,pr));if((e.partitions||[]).length+c.length>$_)return void s("toast.physical_limit");const h=this._geometrySnapshot(),d=n.some(t=>!!t.candidate.split),u=d?tl(i.rooms,e.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,p=d&&Array.isArray(e.walls)?e.walls:null;for(const t of n){const i=t.candidate.split;if(!i)continue;const n=e.rooms.find(t=>t.id===i.roomId);if(!n)return void s("toast.contour_cannot_close");n.poly=i.mainPoly.map(t=>[t[0]/y_,t[1]/this._spaceH]),delete n.x,delete n.y,delete n.w,delete n.h}const _=Date.now().toString(36),g=[];if(n.forEach((t,i)=>{const s=t.area?this.hass.areas[t.area]?.name:"",n={id:`r${_}-${i}`,name:t.name||s||this._t("room.default_name"),area:t.area||null,poly:t.candidate.ring.map(t=>[t[0]/y_,t[1]/this._spaceH]),...t.settings?{settings:JSON.parse(JSON.stringify(t.settings))}:{}};e.rooms.push(n),g.push({room:n,decision:t})}),t.activeDraftId&&Array.isArray(e.room_drafts)&&(e.room_drafts=e.room_drafts.filter(e=>e.id!==t.activeDraftId),e.room_drafts.length||delete e.room_drafts),c.length&&(e.partitions||=[],c.forEach((t,i)=>e.partitions.push({id:`partition-${_}-${i}`,a:[t.a[0]/y_,t.a[1]/y_],b:[t.b[0]/y_,t.b[1]/y_],cm:t.cm}))),d){this._commitOpenSpans();const t=this._normalizeWalls(u,this._openCuts());t.length?e.walls=t:p?.length?e.walls=p:delete e.walls}if(g.length){this._cfgEpoch++;const i=this._openCuts(),s=this._spaceModel();if(!s)return;let n=e.walls;for(const{room:e,decision:o}of g){const a=o.candidate.ring,r=this._wallSourceCmAt(a[0],t.activePath,t.activeCms);n=Er(n,s.rooms,e.id,r,this._wallKeyPitch,i,y_);for(const o of Qr(s.rooms,n,i,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(o.roomId!==e.id||"outer"!==o.kind)continue;const i=[(o.a[0]+o.b[0])/2,(o.a[1]+o.b[1])/2];n=Ar(n,o.a,o.b,this._wallSourceCmAt(i,t.activePath,t.activeCms),this._wallKeyPitch,y_)}}const o=this._normalizeWalls(n,i);o.length?e.walls=o:delete e.walls}this._recordGeometry(this._t("history.wall_face_batch"),h),this._saveConfig(),delete this._resumeDraftBySpace[this._space],this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._wallFaceBatch=null,this._roomDialog=!1,this._nameSel="",this._areaSel="",this._regSignature="",this._maybeRebuildDevices();const m=new Set(n.map(t=>t.area).filter(t=>!!t));if(m.size){const t={...this._layout};for(const e of this._devices){if(!m.has(e.area||"")||e.space!==this._space)continue;if(this._layout[e.id])continue;const i=this._defPos[e.id];i&&(t[e.id]={s:this._space,x:i.x/y_,y:i.y/y_},this._dirtyPos.add(e.id))}this._layout=t,this._persistLayout()}this._showToast(this._t(n.length?"toast.wall_rooms_saved":"toast.wall_chain_saved",{n:n.length}))}_commitRoom(){const t=this._curSpaceCfg,e=this._spaceModel();if(!t||!e)return;const i=this._geometrySnapshot(),s=this._spaceH,n=!!this._pendingSplit,o=n?tl(e.rooms,t.walls,this._openCuts(),this._wallKeyPitch,this._cellCm,this._gridPitch,y_):null,a=n&&Array.isArray(t.walls)?t.walls:null;let r;if(this._pendingSplit){const e=t.rooms.find(t=>t.id===this._pendingSplit.roomId);if(!e)return this._pendingSplit=null,this._splitSel=null,void(this._roomDialog=!1);e.poly=this._pendingSplit.mainPoly.map(t=>[t[0]/y_,t[1]/s]),delete e.x,delete e.y,delete e.w,delete e.h,r=this._pendingSplit.newPoly}else{if(!this._contourClosed)return;r=this._path.slice(0,-1)}const l=this._areaSel?this.hass.areas[this._areaSel]?.name:"",c={id:"r"+Date.now().toString(36),name:this._nameSel||l||this._t("room.default_name"),area:this._areaSel||null,poly:r.map(t=>[t[0]/y_,t[1]/s]),...this._roomSettingsFromDialog()?{settings:this._roomSettingsFromDialog()}:{}};if(t.rooms.push(c),!n&&this._activeDraftId&&Array.isArray(t.room_drafts)&&(t.room_drafts=t.room_drafts.filter(t=>t.id!==this._activeDraftId),t.room_drafts.length||delete t.room_drafts),n){this._commitOpenSpans();const e=this._normalizeWalls(o,this._openCuts());e.length?t.walls=e:a?.length?t.walls=a:delete t.walls}if(!n){const e=[...this._draftSegmentCms,this._closingWallCm||this._drawWallCm||pr],i=e[0]||this._drawWallCm;if(null!=i){this._cfgEpoch++;const s=this._openCuts(),n=this._spaceModel();if(!n)return;let o=Er(t.walls,n.rooms,c.id,i,this._wallKeyPitch,s,y_);for(const t of Qr(n.rooms,o,s,this._wallKeyPitch,this._cellCm,this._gridPitch,y_)){if(t.roomId!==c.id||"outer"!==t.kind)continue;const s=[(t.a[0]+t.b[0])/2,(t.a[1]+t.b[1])/2],n=r.findIndex((t,e)=>{const i=r[(e+1)%r.length];return Ns(s,[t[0],t[1],i[0],i[1]])<=.02*this._gridPitch});n>=0&&(o=Ar(o,t.a,t.b,e[n]||i,this._wallKeyPitch,y_))}o=this._normalizeWalls(o,s),o.length?t.walls=o:delete t.walls}}this._recordGeometry(this._t(n?"history.split_room":"history.add_room"),i),this._saveConfig(),this._path=[],delete this._resumeDraftBySpace[this._space],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._pendingSplit=null,this._splitSel=null;const h=this._areaSel;this._areaSel="",this._nameSel="",this._roomDialog=!1,this._regSignature="",this._maybeRebuildDevices();let d=0;if(h){const t=y_,e={...this._layout};for(const i of this._devices){if(i.area!==h||i.space!==this._space)continue;if(d++,this._layout[i.id])continue;const s=this._defPos[i.id];s&&(e[i.id]={s:this._space,x:s.x/y_,y:s.y/t},this._dirtyPos.add(i.id))}this._layout=e,this._persistLayout()}const u=this._model.find(t=>t.id===this._space)?.rooms.length||0;this._showToast(h?this._t("toast.room_saved",{n:u,added:d}):this._t("toast.room_saved_no_area",{n:u}))}_cancelPath(){this._activeDraftId&&(this._resumeDraftBySpace[this._space]=this._activeDraftId),this._path=[],this._activeDraftId=null,this._draftSegmentCms=[],this._closingWallCm=null,this._clearPlanSnapHover(),this._roomDialog=!1,this._pendingSplit=null,this._wallFaceBatch=null,this._splitSel=null,this._mergeSel=null,this._mergeDialog=null,this._openWallAnchor=null,this._boundaryRestoreGuard=null,this._physicalSel=null,this._physicalDrag=null,this._physicalRotate=null,this._clearOpeningPlacement(!0)}_resumeLastDraft(){const t=this._resumeDraftBySpace[this._space];if(!t)return;const e=this._spaceModel()?.room_drafts.find(e=>e.id===t);e?(this._activeDraftId=t,this._path=e.points.map(t=>[...t]),this._draftSegmentCms=e.segments.map(t=>t.cm),this._clearPlanSnapHover()):delete this._resumeDraftBySpace[this._space]}_roomDialogCancel(){if(this._roomDialog=!1,this._roomEditId)return this._roomEditId=null,this._nameSel="",void(this._areaSel="");if(this._wallFaceBatch){const t=this._wallFaceBatch;return this._wallFaceBatch=null,this._path=t.activePath.map(t=>[...t]),this._draftSegmentCms=[...t.activeCms],this._activeDraftId=t.activeDraftId,this._nameSel="",this._areaSel="",void this.requestUpdate()}if(this._pendingSplit)return this._pendingSplit=null,void(this._splitSel=null);this._undoPoint()}get _freeAreas(){const t=new Set;for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area&&t.add(i.area);for(const e of this._wallFaceBatch?.decisions||[])e.create&&e.area&&t.add(e.area);return Object.values(this.hass?.areas||{}).filter(e=>!t.has(e.area_id)).sort((t,e)=>(t.name||"").localeCompare(e.name||""))}_openMarkerDialog(t){if(this._vacAllCamerasFor=null,this._vacAllCameraCache=null,t&&this._ackNewDevice(t.id),this._norm)if(t){const e=t.marker,i=Object.prototype.hasOwnProperty.call(e||{},"is_light"),s=Object.prototype.hasOwnProperty.call(e||{},"light_entity"),n=Object.prototype.hasOwnProperty.call(e||{},"glow_color"),o=Object.prototype.hasOwnProperty.call(e||{},"value_badge"),a=Object.prototype.hasOwnProperty.call(e||{},"tap_action"),r=Object.prototype.hasOwnProperty.call(e||{},"toggle_entity"),l=ks(e?.glow_color),c=this._devicePresentation(t,!0).valueBadge,h=Bo(this._planHass,t,this._devices),d=qo(this._planHass,t,h);this._markerDialog={devId:t.id,name:t.name,binding:"virtual"===t.bindingKind?"virtual":t.bindingKind+":"+t.bindingRef,bindingMode:"virtual"===t.bindingKind?"virtual":"ha",bindingOpen:!1,showEntities:"entity"===t.bindingKind&&!!this._fullRegistryHass.entities[t.bindingRef||""]?.device_id,bindingFilter:"",icon:t.marker?.icon||"",autoIcon:t.icon||"",display:Bi(t.marker?.display),rippleColor:Rt(t.marker?.ripple_color,""),rippleSize:Number(t.marker?.ripple_size)>0?Number(t.marker.ripple_size):3,size:Number(t.marker?.size)>0?Number(t.marker.size):1,angle:Number(t.marker?.angle)||0,tapAction:Wh(t.marker?.tap_action,t.primary?.split(".")[0]),tapActionTouched:!1,originalHasTapAction:a,originalTapAction:t.marker?.tap_action,tapHintAnnouncement:"",toggleEntity:e?.toggle_entity||"",toggleEntityTouched:!1,originalHasToggleEntity:r,originalToggleEntity:e?.toggle_entity,tapTarget:t.marker?.tap_target||"",tapConfirm:!0===t.marker?.tap_confirm,runFilter:"",controls:Xn(t.marker?.binding,t.marker?.controls,t.entities),controlsFilter:"",lightRole:!0===e?.is_light?"always":!1===e?.is_light?"never":"auto",lightRoleTouched:!1,originalHasIsLight:i,originalIsLight:e?.is_light,lightEntity:e?.light_entity||"",lightEntityTouched:!1,originalHasLightEntity:s,originalLightEntity:e?.light_entity,glowMode:null!=l?.bri?"fixed":l?"color":"auto",glowColor:l?.c||this._fillColors.glow_light.c,glowBrightness:Math.max(1,Math.round(100*(l?.bri??1))),glowColorDrafted:!!l,glowBrightnessDrafted:null!=l?.bri,glowTouched:!1,originalHasGlowColor:n&&(!!l||null===e?.glow_color),originalGlowColor:l||(null===e?.glow_color?null:void 0),valueBadgeEnabled:o?!0===e?.value_badge?.enabled:!!c,valueBadgeSource:e?.value_badge?.source||c?.source||d,valueBadgePosition:e?.value_badge?.position||c?.position||"right",valueBadgeTouched:!1,originalHasValueBadge:o,originalValueBadge:e?.value_badge,useClimateTemp:!0===t.marker?.use_climate_temp,glowRadius:Number(t.marker?.glow_radius_cm)>0?String(this._imperial?Math.round(Number(t.marker.glow_radius_cm)/30.48*10)/10:Math.round(Number(t.marker.glow_radius_cm))/100):"",model:t.model||"",link:t.link||"",description:t.description||"",pdfs:[...t.pdfs||[]],room:t.marker?.room_id?t.space+"#@"+t.marker.room_id:t.space&&t.area?t.space+"#"+t.area:"",hideFromPlan:!0===t.marker?.hidden,busy:!1}}else this._markerDialog={name:"",binding:"virtual",bindingMode:"virtual",bindingOpen:!1,showEntities:!1,bindingFilter:"",icon:"",autoIcon:"",display:"badge",rippleColor:"",rippleSize:3,size:1,angle:0,tapAction:"info",tapActionTouched:!1,originalHasTapAction:!1,originalTapAction:void 0,tapHintAnnouncement:"",toggleEntity:"",toggleEntityTouched:!1,originalHasToggleEntity:!1,originalToggleEntity:void 0,tapTarget:"",tapConfirm:!1,runFilter:"",controls:[],controlsFilter:"",lightRole:"auto",lightRoleTouched:!1,originalHasIsLight:!1,originalIsLight:void 0,lightEntity:"",lightEntityTouched:!1,originalHasLightEntity:!1,originalLightEntity:void 0,glowMode:"auto",glowColor:this._fillColors.glow_light.c,glowBrightness:100,glowColorDrafted:!1,glowBrightnessDrafted:!1,glowTouched:!1,originalHasGlowColor:!1,originalGlowColor:void 0,valueBadgeEnabled:!1,valueBadgeSource:null,valueBadgePosition:"right",valueBadgeTouched:!1,originalHasValueBadge:!1,originalValueBadge:void 0,useClimateTemp:!1,glowRadius:"",model:"",link:"",description:"",pdfs:[],room:"",hideFromPlan:!1,busy:!1,uploadId:"up_"+Date.now().toString(36)+Math.random().toString(36).slice(2,6)};else this._showToast(this._t("toast.marker_needs_server"))}_runCandidates(){const t=[];for(const e of Gi)for(const[i,s]of Object.entries(this.hass.states))i.startsWith(e+".")&&this._planEntityAvailable(i)&&t.push({value:i,label:s?.attributes?.friendly_name||i,sub:this._t("run."+e)});return t.sort((t,e)=>t.sub.localeCompare(e.sub)||t.label.localeCompare(e.label))}_bindingCandidates(){const t=this._planHass,e=yo(this._markers),i=new Set(this._markers.filter(t=>t.removed).map(t=>t.binding)),s=new Set;for(const t of this._devices)t.id!==this._markerDialog?.devId&&("device"===t.bindingKind&&t.bindingRef&&s.add("device:"+t.bindingRef),"entity"===t.bindingKind&&t.bindingRef&&s.add("entity:"+t.bindingRef));const n=new Set;for(const t of this._devices)"device"===t.bindingKind&&t.name&&n.add(t.name.trim()+"|"+(t.area||""));const o=[];for(const e of Object.values(t.devices)){if("service"===e.entry_type)continue;const t="device:"+e.id;if(s.has(t))continue;const a=(e.name_by_user||e.name||e.id).trim();t!==this._markerDialog?.binding&&!i.has(t)&&n.has(a+"|"+(e.area_id||""))||o.push({value:t,label:a,sub:(e.model||this._t("marker.sub_device"))+("Group"===e.model?this._t("marker.sub_z2m_group"):"")})}const a=new Set(["group","template","derivative","min_max","threshold","integration","statistics","trend","utility_meter","tod","switch_as_x","schedule"]);for(const[n,r]of Object.entries(t.entities)){const l="entity:"+n;if(s.has(l))continue;if(bo(t,n,e)&&!i.has(l))continue;const c=a.has(r.platform),h="group"===r.platform;if(!c&&!h)continue;if(r.hidden&&!i.has(l))continue;const d=t.states[n];o.push({value:l,label:r.name||d?.attributes?.friendly_name||n,sub:n.split(".")[0]+" · "+("group"===r.platform?this._t("marker.sub_group"):this._t("marker.sub_helper"))})}if(this._markerDialog?.showEntities){const n=new Set(o.map(t=>t.value));for(const[a,r]of Object.entries(t.entities)){const l="entity:"+a;if(s.has(l)||n.has(l)||r.hidden&&!i.has(l))continue;if(bo(t,a,e)&&!i.has(l))continue;const c=t.states[a],h=r.name||c?.attributes?.friendly_name||a,d=r.device_id?t.devices[r.device_id]:null,u=d&&(d.name_by_user||d.name)||"";o.push({value:l,label:h,sub:a.split(".")[0]+" · "+this._t("marker.sub_entity")+(u?" · "+u:"")})}}const r=(this._markerDialog?.bindingFilter||"").toLowerCase().trim(),l=r?o.filter(t=>(t.label+" "+t.sub+" "+t.value).toLowerCase().includes(r)):o;return l.sort((t,e)=>t.label.localeCompare(e.label)),l.slice(0,200)}_physicalBodiesR(t=this._spaceModel()){if(!t)return[];const e=`${t.id}|${this._cfgEpoch}|${this._cellCm}|${this._gridPitch}`;if(this._physicalBodiesCache?.key===e)return this._physicalBodiesCache.all;const i=Rl(t,this._cellCm,this._gridPitch,2e-4*this._gridPitch,this._partitionOpeningCuts(t));return this._physicalBodiesCache={key:e,...i},i.all}_rawPhysicalBodiesR(t=this._spaceModel()){if(!t)return[];this._physicalBodiesR(t);const e=this._physicalBodiesCache;return e?[...e.drafts,...e.partitions,...e.columns]:[]}_cleanFloor(t,e,i=this._spaceModel()){if(!i)return{floor:e,geom:null,path:"",area:zl([[[...e,e[0]]]])};const s=t.id||`#${i.rooms.indexOf(t)}`,n=`${i.id}|${this._cfgEpoch}|${s}`;if(!this._rszPreview){const t=r_(this._cleanFloorCache,n);if(t.hit)return t.value}const o=e.map(t=>t[0]),a=e.map(t=>t[1]),r=[Math.min(...o),Math.min(...a),Math.max(...o),Math.max(...a)],l=this._physicalBodiesR(i).filter(t=>{const e=t.map(t=>t[0]),i=t.map(t=>t[1]);return Math.max(...e)>=r[0]&&Math.min(...e)<=r[2]&&Math.max(...i)>=r[1]&&Math.min(...i)<=r[3]}),c=l.length?Fl(e,l):null,h={floor:e,geom:c,path:c?Cl(c):"",area:zl(c||[[[...e,e[0]]]])};return this._rszPreview||l_(this._cleanFloorCache,n,h,600),h}_autoIconForBinding(t){if("virtual"===t)return"mdi:map-marker";const[e,i]=t.split(":");if(!i)return"";const s=this._fullRegistryHass,n=this._bindingStatus(t),o="active"===n.kind?n.enabledEntityIds:n.allEntityIds;if("device"===e){const t=s.devices?.[i];if(!t)return"mdi:help-circle";const e=o;return e.some(t=>t.startsWith("lock."))?"mdi:lock":vo(s,t.name_by_user||t.name||"",t.model,e,this._iconRules)}if("entity"===e){const t=s.entities?.[i],e=this.hass.states?.[i],n=t?.name||e?.attributes?.friendly_name||i;return i.startsWith("lock.")?"mdi:lock":vo(s,n,"",[i],this._iconRules)}return""}_allRoomsFlat(){const t=[];for(const e of this._serverCfg?.spaces||[])for(const i of e.rooms||[])i.area?t.push({value:e.id+"#"+i.area,label:(e.title||e.id)+" · "+i.name}):i.id&&t.push({value:e.id+"#@"+i.id,label:(e.title||e.id)+" · "+i.name+" · "+this._t("marker.subarea")});return t}_errText(t){if(!t)return this._t("err.unknown");if("string"==typeof t)return t;if("invalid_passage_fields"===t.code){const e=String(t.message||t.error||"").match(/space=([^;]*);\s*opening=([^;]*);\s*fields=([^;]*)/);if(e){const t=this._serverCfg?.spaces?.find(t=>String(t.id)===e[1]),i={contact:"opening.contact_label",lock:"opening.lock_label",invert:"opening.invert",flip_h:"opening.flip_h",flip_v:"opening.flip_v"},s=e[3].split(",").filter(Boolean).map(t=>i[t]?this._t(i[t]):t).join(", ");return this._t("opening.invalid_passage_fields",{room:t?.title||e[1],fields:s})}}if("invalid_partition_opening_jamb_margin"===t.code){const e=String(t.message||t.error||"").match(/margin_cm=([^;]*)/),i=e?Number(e[1]):NaN;if(Number.isFinite(i))return this._t("opening.partition_jamb_margin",{distance:li(i,this._imperial)})}if(t.message)return t.message;if(t.error)return t.error;if(null!=t.code)return this._t("err.code",{code:t.code});try{return JSON.stringify(t)}catch{return String(t)}}_backupErrorText(t){const e=t?.code??t?.error;if("string"==typeof e){const t=`backup.error.${e}`,i=this._t(t);if(i!==t)return i}return this._errText(t)}async _pickMarkerFiles(t){const e=t.target,i=e.files?[...e.files]:[];if(e.value="",!i.length||!this._markerDialog)return;const s=this._markerDialog.uploadId||this._markerDialog.devId||"new",n=[];for(const t of i)try{const e=new FormData;e.append("marker_id",s),e.append("file",t,t.name);const i=this.hass?.fetchWithAuth?await this.hass.fetchWithAuth("/api/houseplan/upload",{method:"POST",body:e}):await fetch("/api/houseplan/upload",{method:"POST",body:e,headers:this.hass?.auth?.data?.access_token?{authorization:`Bearer ${this.hass.auth.data.access_token}`}:{}}),o=await i.json().catch(()=>({}));if(!i.ok||o.error){const t={too_large:this._t("err.too_large",{mb:o.max_mb||50}),bad_ext:this._t("err.bad_ext"),unauthorized:this._t("err.unauthorized")};throw new Error(t[o.error]||o.error||"HTTP "+i.status)}n.push({name:o.name||t.name,url:o.url})}catch(e){this._showToast(this._t("toast.file_failed",{name:t.name,err:this._errText(e)}))}n.length&&this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:[...this._markerDialog.pdfs,...n]},this._showToast(this._t("toast.files_attached",{n:n.length})))}_removeMarkerPdf(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,pdfs:this._markerDialog.pdfs.filter(e=>e.url!==t)})}_markerLightFields(t){const e={};if(t.lightRoleTouched?"always"===t.lightRole?e.is_light=!0:"never"===t.lightRole&&(e.is_light=!1):t.originalHasIsLight&&(e.is_light=t.originalIsLight??null),t.lightEntityTouched?t.lightEntity&&(e.light_entity=t.lightEntity):t.originalHasLightEntity&&(e.light_entity=t.originalLightEntity??null),t.glowTouched){if("auto"!==t.glowMode){const i={c:Rt(t.glowColor,this._fillColors.glow_light.c)};"fixed"===t.glowMode&&(i.bri=Math.max(.01,Math.min(1,Math.round(t.glowBrightness)/100))),e.glow_color=i}}else t.originalHasGlowColor&&(e.glow_color=t.originalGlowColor??null);return e}_markerTapActionFields(t){return t.tapActionTouched?{tap_action:t.tapAction||null}:t.originalHasTapAction?{tap_action:t.originalTapAction??null}:{}}_markerToggleEntityFields(t){return(e={touched:t.toggleEntityTouched,originalHas:t.originalHasToggleEntity,original:t.originalToggleEntity,value:t.toggleEntity}).touched?e.value?{toggle_entity:e.value}:{}:e.originalHas?{toggle_entity:e.original??null}:{};var e}async _saveMarker(){const t=this._markerDialog;if(!t||t.busy)return;const e=this._effectiveMarkerTapAction(t);if("ha"===t.bindingMode&&(!t.binding||"virtual"===t.binding))return;if("virtual"===t.binding&&!t.name.trim())return void this._showToast(this._t("toast.virtual_name_required"));if("run"===e&&!t.tapTarget)return void this._showToast(this._t("toast.run_target_required"));if(t.valueBadgeTouched&&t.valueBadgeEnabled&&!t.valueBadgeSource)return void this._showToast(this._t("toast.value_badge_source_required"));if("ha"===t.bindingMode){const e=this._bindingStatus(t.binding),i=t.devId?this._markers.find(e=>e.id===t.devId):null,s=!i||i.binding!==t.binding;if("active"!==e.kind&&s)return void this._showToast(this._t("ha_disabled"===e.kind?"toast.ha_disabled_add":"toast.ha_binding_unverified"));if("ha_disabled"===e.kind&&!0===i?.hidden&&!t.hideFromPlan)return this._markerDialog={...t,hideFromPlan:!0},void this._showToast(this._t("entity"===e.reason?"toast.ha_disabled_show_entity":"toast.ha_disabled_show_device"))}const i=this._serverCfg;if(!i)return;const s=i.markers||[],n=qs(t.room);let o=n?.space||null;const a=n?.area||null,r=n?.roomId||null,l=Fi(t.binding,t.devId,()=>"v_"+Date.now().toString(36)),c=t.devId,h=c?this._devices.find(t=>t.id===c):null,d=n?.space||h?.space||null,u=d?this._spaceModelById(d):this._spaceModel();if(!u)return;const p=u.id;"virtual"!==t.binding||o||(o=p),this._markerDialog={...t,busy:!0};try{const n="virtual"===t.binding?[]:s.filter(e=>e.removed&&e.binding===t.binding).map(t=>t.id),d=n.length>0,_=Xn(t.binding,t.controls,this._bindingEntities(t.binding)),g=s.find(t=>t.id===l||t.id===c)?.vacuum||null,m={id:l,vacuum:g,binding:t.binding,name:t.name.trim()||null,icon:t.icon||null,display:"badge"!==t.display?t.display:null,ripple_color:"icon_ripple"===t.display&&t.rippleColor?t.rippleColor:null,ripple_size:"icon_ripple"===t.display&&3!==t.rippleSize?t.rippleSize:null,size:1!==t.size?t.size:null,angle:t.angle?t.angle:null,...this._markerTapActionFields(t),...this._markerToggleEntityFields(t),tap_target:"run"===e&&t.tapTarget||null,tap_confirm:!!t.tapConfirm||null,controls:_.length?_:null,...this._markerLightFields(t),...this._markerValueBadgeFields(t),use_climate_temp:!!t.useClimateTemp||null,glow_radius_cm:(()=>{const e=a_(t.glowRadius);return null==e||e<=0?null:Math.round(this._imperial?30.48*e:100*e)})(),model:t.model.trim()||null,link:t.link.trim()||null,description:t.description.trim()||null,pdfs:t.pdfs,hidden:!!t.hideFromPlan};("virtual"===t.binding||t.room)&&(m.space=o,m.area=a,m.room_id=r);const f=h?.marker?.room_id??null,v=!!t.room&&null!=h&&(h.space!==o||h.area!==a||f!==r);let y=!1;const b=t.uploadId||c;if(b&&b!==l&&m.pdfs?.length)try{const t=await this.hass.callWS({type:"houseplan/files/migrate",from_id:b,to_id:l}),e=t?.mapping||{};m.pdfs=function(t,e,i,s){if(!e||!i||e===i)return t;const n="/files/"+e+"/",o="/files/"+i+"/";return t.map(t=>{if(!t.url.includes(n))return t;const e=t.url.split(n)[1]||"",[i,a]=[e.split("?")[0],e.includes("?")?"?"+e.split("?")[1]:""];if(s){const e=s[decodeURIComponent(i)]??s[i];return e?{...t,url:t.url.split(n+i)[0]+o+encodeURIComponent(e)+a}:t}return{...t,url:t.url.split(n).join(o)}})}(m.pdfs,b,l,e),y=Object.keys(e).length>0}catch(t){this._showToast(this._t("toast.files_migrate_failed",{err:this._errText(t)}))}i.markers=s,c&&c!==l&&(i.markers=function(t,e,i){if(!e||!i||e===i)return[...t];const s=`marker:${e}`,n=`marker:${i}`;return t.map(t=>{const e=Array.isArray(t.controls)?t.controls.map(t=>t===s?n:t):t.controls,i="derived_marker_state"===t.value_badge?.source?.kind&&t.value_badge.source.ref===s?{...t.value_badge,source:{...t.value_badge.source,ref:n}}:t.value_badge;return e===t.controls&&i===t.value_badge?t:{...t,controls:e,value_badge:i}})}(i.markers,c,l)),c&&c!==l&&"derived_marker_state"===m.value_badge?.source?.kind&&m.value_badge.source.ref===`marker:${c}`&&(m.value_badge.source={kind:"derived_marker_state",ref:`marker:${l}`}),i.markers=i.markers.filter(t=>t.id!==l&&t.id!==c&&("virtual"===m.binding||t.binding!==m.binding)),i.markers.push(m);let w=null;const k=c?this._layout[c]:null,$=k?{s:k.s||h?.space||this._space,x:k.x,y:k.y}:c&&h&&this._defPos[c]?this._normPos(h.space,this._defPos[c].x,this._defPos[c].y):null;if(!d&&$&&$.s===p)l===c&&this._layout[l]&&!v||(w={s:$.s,x:$.x,y:$.y},this._layout={...this._layout,[l]:w});else if(d||!this._layout[l]||v){let t=u.vb[0]+u.vb[2]/2,e=u.vb[1]+u.vb[3]/2;const i=r?u.rooms.find(t=>t.id===r):a?u.rooms.find(t=>t.area===a):void 0;i&&([t,e]=this._roomCenter(i)),w=this._normPos(p,t,e),this._layout={...this._layout,[l]:w}}await this._saveConfigNow(),w&&this._noteLayoutRev(await this.hass.callWS({type:"houseplan/layout/update",device_id:l,pos:w}));const x=new Set(n);c&&c!==l&&x.add(c),x.delete(l);for(const t of x)delete this._layout[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{});y&&b&&await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:b}).catch(()=>{}),this._markerDialog=null,this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_saved"))}catch(t){this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}async _deleteMarker(){const t=this._markerDialog;if(!t||t.busy||!t.devId)return;const e=t.devId?this._devices.find(e=>e.id===t.devId):null;if(!e)return;const i=t.name||this._t("device.fallback");if(!confirm(this._t("confirm.remove_marker",{name:i})))return;const s=this._serverCfg;s.markers=s.markers||[];const n=s.markers,o="virtual"===e.bindingKind?"virtual":e.bindingKind&&e.bindingRef?`${e.bindingKind}:${e.bindingRef}`:"";if(!o)return;const a=function(t,e,i,s){const n=new Set([e]),o=t.filter(t=>{const o=t.id===e||!s&&t.binding===i;return o&&n.add(t.id),!o});return{markers:s?o:[...o,{id:e,binding:i,removed:!0,hidden:!0}],cleanupIds:n}}(s.markers,e.id,o,"virtual"===e.bindingKind);var r,l;s.markers=(r=a.markers,l=a.cleanupIds,r.map(t=>{if(!Array.isArray(t.controls))return t;const e=t.controls.filter(t=>!("string"==typeof t&&t.startsWith("marker:")&&l.has(t.slice(7))));return e.length===t.controls.length?t:{...t,controls:e.length?e:null}}));const c=a.cleanupIds;this._markerDialog={...t,busy:!0};try{await this._saveConfigNow();for(const t of c){delete this._layout[t],delete this._defPos[t],this._dirtyPos.delete(t),this._sentPos.delete(t);const e=this._activityRt.get(t);e&&clearTimeout(e.timer),this._activityRt.delete(t),this._vacRt.delete(t),delete this._vacSrvTrails[t],await this.hass.callWS({type:"houseplan/layout/delete",device_id:t}).then(t=>this._noteLayoutRev(t)).catch(()=>{}),await this.hass.callWS({type:"houseplan/files/cleanup",marker_id:t}).catch(()=>{}),await this.hass.callWS({type:"houseplan/trail/delete",marker_id:t}).catch(()=>{})}this._markerDialog=null,this._infoCard?.id===e.id&&this._closeInfoCard(),this._selId===e.id&&(this._selId=null),this._drag?.id===e.id&&(this._drag=null),this._regSignature="",this._maybeRebuildDevices(),this._showToast(this._t("toast.marker_removed"))}catch(t){this._serverCfg===s&&(s.markers=n),this._markerDialog&&(this._markerDialog={...this._markerDialog,busy:!1}),this._showToast(this._t("toast.error",{err:this._errText(t)}))}}_normPos(t,e,i){return{s:t,x:e/y_,y:i/y_}}_openSpaceDialog(t,e){if(this._serverStorage&&this._serverCfg)if("edit"===t){const i=this._serverCfg.spaces.find(t=>t.id===e);if(!i)return;const s=cs(i),n=i.settings?.custom_fill&&"object"==typeof i.settings.custom_fill?rs(i.settings.custom_fill):null,o="none"===s.fill?{...n||as,a:0}:n;this._spaceDialog={mode:t,spaceId:e,title:i.title,planUrl:i.plan_url||null,planFile:null,source:i.plan_url?"file":"draw",showBorders:s.showBorders,showNames:s.showNames,hideDecor:s.hideDecor,hideOpenings:s.hideOpenings,roomColor:s.color,roomOpacity:s.opacity,fillMode:"none"===s.fill?"custom":s.fill,customFill:o,glowEnabled:s.glow,bgColor:s.bgColor,bgMode:"static"===i.settings?.bg_mode||"daynight"===i.settings?.bg_mode?i.settings.bg_mode:null,northDeg:Ka({},i.settings),sunRays:"boolean"==typeof i.settings?.sun_rays?i.settings.sun_rays:null,tempMin:s.tempMin,tempMax:s.tempMax,showLqi:s.showLqi??this._config?.show_signal??!0,cardFontScale:s.cardFontScale,labelTemp:s.labelTemp,labelHum:s.labelHum,labelLqi:s.labelLqi,labelLight:s.labelLight,cellCm:Number(i.cell_cm)>0?Number(i.cell_cm):5,busy:!1}}else this._spaceDialog={mode:t,title:"",planUrl:null,planFile:null,source:"file",showBorders:!1,showNames:!1,hideDecor:!1,hideOpenings:!1,roomColor:ns,roomOpacity:os,fillMode:"custom",customFill:{...as,a:0},glowEnabled:!0,bgColor:null,bgMode:"daynight",northDeg:null,sunRays:null,tempMin:20,tempMax:25,showLqi:this._config?.show_signal??!0,cardFontScale:1,labelTemp:!1,labelHum:!1,labelLqi:!1,labelLight:!1,cellCm:5,busy:!1};else this._showToast(this._t("toast.integration_missing"))}async _pickPlanFile(t){const e=t.target,i=e.files?.[0];if(!i||!this._spaceDialog)return;const s={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/webp":"webp"}[i.type]||(i.name.toLowerCase().endsWith(".svg")?"svg":"");if(!s)return void this._showToast(this._t("toast.plan_formats"));const n=new Uint8Array(await i.arrayBuffer());let o="";for(let t=0;t{const e=new Image;e.onload=()=>t(e.naturalWidth&&e.naturalHeight?e.naturalWidth/e.naturalHeight:1.414),e.onerror=()=>t(1.414),e.src=r});URL.revokeObjectURL(r),this._spaceDialog={...this._spaceDialog,planFile:{ext:s,b64:a,aspect:l,name:i.name}}}_useServerPlan(t){const e=this._spaceDialog;e&&(this._spaceDialog={...e,planUrl:t,planFile:null,pickSaved:!1,savedAspect:void 0},this._aspectJob=this._readPlanAspect(t))}async _readPlanAspect(t){for(let e=0;e<40;e++){const e=this._display(t);if(e){const i=await new Promise(t=>{const i=new Image;i.onload=()=>t(i.naturalWidth&&i.naturalHeight?i.naturalWidth/i.naturalHeight:0),i.onerror=()=>t(0),i.src=e}),s=this._spaceDialog;return s&&s.planUrl===t&&Number.isFinite(i)&&i>0?(this._spaceDialog={...s,savedAspect:i},i):0}if(await new Promise(t=>setTimeout(t,150)),this._spaceDialog?.planUrl!==t)return 0}return 0}async _deleteServerPlan(t){if(confirm(this._t("confirm.delete_plan",{name:t})))try{await this.hass.callWS({type:"houseplan/plans/delete",name:t});const e=this._spaceDialog;e?.saved&&(this._spaceDialog={...e,saved:e.saved.filter(e=>e.name!==t)})}catch(t){this._showToast(this._t("toast.plan_delete_failed",{err:this._errText(t)}))}}_renderServerPlans(t){if(t.savedBusy)return j`
${this._t("space.loading")}
`;const e=t.saved||[];if(!e.length)return j`
${this._t("space.no_saved")}
`;return j`
${e.map(e=>j`
@@ -5818,7 +5818,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 @pointermove=${t=>this._rlResizeMove(t)} @pointerup=${()=>this._rlResizeUp()} @pointercancel=${()=>this._rlResizeUp()}>`):G} -
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"!==this._tool&&"partition"!==this._tool||!this._path.length||this._contourClosed?"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:this._path[this._path.length-1]:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=Os(e,i),a=Math.round(10*o)/10,r=Hs(o);return j`
+
`}get _measureAnchor(){return this._markup&&this._cursorPt?"draw"===this._tool&&this._path.length&&!this._contourClosed?this._path[this._path.length-1]:"split"===this._tool&&this._splitSel?.pts?.length?this._splitSel.pts[this._splitSel.pts.length-1]:null:null}_renderMeasureLabel(t){const e=this._measureAnchor,i=this._cursorPt,s=(i[0]-t.x)/t.w*100,n=(i[1]-t.y)/t.h*100,o=Os(e,i),a=Math.round(10*o)/10,r=Hs(o);return j`
${this._fmtLen(e,i)} · ${a}°
`}get _decorMeasure(){const t=this._decorDraft;if(!t||"decor"!==this._mode)return null;const[e,i]=t.a,[s,n]=t.b;if(Math.abs(e-s)<1e-6&&Math.abs(i-n)<1e-6)return null;const o=(e+s)/2,a=(i+n)/2;if("line"===t.kind){const e=Os(t.a,t.b);return{x:o,y:a,on45:Hs(e),text:`${this._fmtLen(t.a,t.b)} · ${Math.round(10*e)/10}°`}}const r=this._fmtLen([e,i],[s,i]),l=this._fmtLen([s,i],[s,n]);if("ellipse"===t.kind){const t=this._fmtLen([0,0],[Math.abs(s-e)/2,0]),r=this._fmtLen([0,0],[0,Math.abs(n-i)/2]);return{x:o,y:a,on45:!1,text:Math.abs(Math.abs(s-e)-Math.abs(n-i))<1e-6?`R ${t}`:`Rx ${t} × Ry ${r}`}}return{x:o,y:a,on45:!1,text:`${r} × ${l} · ${Da(ar(Math.abs(s-e),this._cellCm,this._gridPitch)*ar(Math.abs(n-i),this._cellCm,this._gridPitch)/1e4,this._imperial)}`}}get _alignPoint(){if(this._markup){if("draw"===this._tool&&this._path.length&&!this._contourClosed&&this._cursorPt)return this._cursorPt;if("split"===this._tool&&this._splitSel?.pts?.length&&this._cursorPt)return this._cursorPt;if(this._drag?.id.startsWith("rl_")&&this._drag.moved){const t=this._drag.id.slice(3),e=this._spaceModel()?.rooms.find(e=>e.id===t);return e?(()=>{const t=this._labelPos(e,this._space);return[t.x,t.y]})():null}return null}if("devices"===this._mode&&this._drag?.moved){const t=this._devices.find(t=>t.id===this._drag.id);return t?(()=>{const e=this._pos(t);return[e.x,e.y]})():null}if("decor"===this._mode){if(this._decorDraft)return this._decorDraft.b;if(this._decorMove){const t=this._decorList.find(t=>t.id===this._decorMove.id);if(!t)return null;const e=y_,i=this._decorH;return"line"===t.kind?[t.x1*e,t.y1*i]:[t.x*e,t.y*i]}return null}return null}_alignCandidates(){const t=[],e=this._spaceModel();if(this._markup){if(!e)return t;if(this._drag?.id.startsWith("rl_")){const i=this._drag.id.slice(3);for(const s of e.rooms){if(!s.name||s.id===i)continue;const e=this._labelPos(s,this._space);t.push([e.x,e.y])}return t}for(const i of e.rooms){const e=hi(i);if(e)for(const i of e)t.push(i)}if("draw"===this._tool)for(const e of this._path)t.push(e);if("split"===this._tool&&this._splitSel?.pts)for(const e of this._splitSel.pts)t.push(e);return t}if("devices"===this._mode){for(const e of this._devices){if(e.space!==this._space||e.id===this._drag?.id||"ha_disabled"===e.bindingStatus?.kind)continue;const i=this._pos(e);t.push([i.x,i.y])}return t}if("decor"===this._mode){const e=this._decorMove?.id;return t.push(...this._decorSnapGeometry(e).points),this._decorDraft&&t.push(this._decorDraft.a),t}return t}_renderAlignGuides(){const t=this._alignPoint;if(!t)return W``;const e=this._drag?.id.startsWith("rl_")?.5*this._gridPitch:.05*this._gridPitch,i=function(t,e,i){let s=null,n=null;for(const o of e)if(!(Math.abs(o[0]-t[0])<1e-6&&Math.abs(o[1]-t[1])<1e-6)){if(Math.abs(o[0]-t[0])<=i){const e=Math.abs(o[1]-t[1]);e>1e-6&&(!s||e1e-6&&(!n||e ${i.map(e=>{const[i,o,a,r]="x"===e.axis?[e.at,e.from[1],e.at,t[1]+Math.sign(t[1]-e.from[1])*n]:[e.from[0],e.at,t[0]+Math.sign(t[0]-e.from[0])*n,e.at];return W` `})} @@ -5993,7 +5993,7 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 data-kind="rotate" @pointerdown=${t=>this._physicalRotateDown(t,s)} @pointermove=${t=>this._physicalRotateMove(t)} @pointerup=${t=>this._physicalRotateUp(t)}> - `})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool&&"partition"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=fr(5,this._cellCm,this._gridPitch),s=fr(10,this._cellCm,this._gridPitch);return W``})();return W`${c}${h}${d}${p}${_}`}_renderPlanSnapOverlay(){if(!this._markup||"draw"!==this._tool)return W``;const t=this._planSnapGeometrySnapshot().value,e=this._activePlanSnapCandidate,i=fr(5,this._cellCm,this._gridPitch),s=fr(10,this._cellCm,this._gridPitch);return W``}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(fr(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=il(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,y_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:fr(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return Nr([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Ds(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,a=this._gridPitch,r=this._viewOr(this._baseVb()),l="draw"===this._tool||"partition"===this._tool?this._drawWallCm:null,c=(()=>"draw"!==this._tool&&"partition"!==this._tool||!o.length||!(null!=l&&l>0)?null:this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null)(),h=c?c.slice(0,-1).map((t,e)=>fr(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||pr:l||pr,this._cellCm,this._gridPitch)/2):[],d=c?Lr(c,fr(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` + `}_syncPlanSnapActiveMarker(t){const e=this.renderRoot?.querySelector('[data-hp="plan-snap-active-marker"]');if(e){if(e.setAttribute("class",`plan-snap-node${t?" active":""}${"line"===t?.kind?" dynamic":""}`),e.setAttribute("data-active",t?"true":"false"),e.setAttribute("visibility",t?"visible":"hidden"),!t)return e.removeAttribute("data-kind"),void e.removeAttribute("data-key");e.setAttribute("data-kind",t.kind),e.setAttribute("data-key",t.key),e.setAttribute("cx",String(t.point[0])),e.setAttribute("cy",String(t.point[1])),e.setAttribute("r",String(fr(10,this._cellCm,this._gridPitch)))}}_planSnapPhysicalSegment(t){let e=0;const i=this._spaceModel();if(!i)return null;if("partition"===t.sourceKind)e=Number(i.partitions.find(e=>e.id===t.sourceId)?.cm)||0;else if("draft"===t.sourceKind){const s=/^(.*):(\d+)$/.exec(t.sourceId),n=s?i.room_drafts.find(t=>t.id===s[1]):null;e=n&&s&&Number(n.segments[Number(s[2])]?.cm)||0}else e=il(i.rooms,this._spaceWalls,this._openCuts(),[t.a[0],t.a[1],t.b[0],t.b[1]],this._wallKeyPitch,this._cellCm,this._gridPitch,y_);return e>0?{a:[...t.a],b:[...t.b],halfDepth:fr(e,this._cellCm,this._gridPitch)/2}:null}_drawPreviewJoinPatchD(t,e){if(t.length<2)return"";const i=[];for(let s=0;s+10&&i.push({a:t[s],b:t[s+1],halfDepth:e[s]});if(!i.length)return"";const s=2e-4*this._gridPitch,n=this._planSnapGeometrySnapshot().value.segments.filter(e=>t.some(t=>Ns(t,[e.a[0],e.a[1],e.b[0],e.b[1]])<=s)).map(t=>this._planSnapPhysicalSegment(t)).filter(t=>!!t);return Nr([...i,...n],s).map(t=>`M ${t.map(t=>`${t[0]} ${t[1]}`).join(" L ")} Z`).join(" ")}_renderMarkupLayer(t){const e=this._openPairs().flatMap(t=>t.segs),i=this._thickWallCuts(),s=e.concat(i),n=s.length?Ds(this._segments,s,.02*this._gridPitch):this._segments,o=this._path,a=this._gridPitch,r=this._viewOr(this._baseVb()),l="draw"===this._tool?this._drawWallCm:null,c=(()=>"draw"===this._tool&&o.length&&null!=l&&l>0?this._contourClosed?o:this._cursorPt?[...o,this._cursorPt]:o.length>=2?o:null:null)(),h=c?c.slice(0,-1).map((t,e)=>fr(Number(this._draftSegmentCms[e])>0?Number(this._draftSegmentCms[e]):this._contourClosed&&e===c.length-2?this._closingWallCm||l||pr:l||pr,this._cellCm,this._gridPitch)/2):[],d=c?Lr(c,fr(l,this._cellCm,this._gridPitch)/2,this._contourClosed,h):"",u=c?this._drawPreviewJoinPatchD(c,h):"";return W` ${this._gridLevels()?W``:G} ${n.map(t=>W``)} ${this._renderPhysicalEditorLayer()} @@ -6023,8 +6023,8 @@ globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="ccbc4fa08439a1d7a585a5b742035d048a80 ${u?W` `:G} ${o.length>1?W``:G} - ${!o.length||!this._cursorPt||"draw"!==this._tool&&"partition"!==this._tool||this._contourClosed?G:W``} + ${o.length&&this._cursorPt&&"draw"===this._tool&&!this._contourClosed?W``:G} ${o.map((t,e)=>W``)} ${"split"===this._tool&&this._splitSel?.pts?.length?W`${this._splitSel.pts.length>1?W``:G} ${this._splitSel.pts.map((t,e)=>W``)} diff --git a/docs/STATUS.md b/docs/STATUS.md index 8151a326..bd6a5505 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -22,7 +22,7 @@ metadata). Only an explicit owner-approved emergency hotfix may skip this gate. | Item | State | |---|---| | Version | **v1.65.0-beta.4** everywhere (manifest, const.py, package.json, CARD_VERSION) — prerelease candidate for the current `S8-merged` queue | -| Current local cycle | v1.65.0-beta.4 candidate carries #180, #192, #193, #196 and #197: every remaining colour/opacity setting uses the unified picker with a real hue spectrum, open passages preview their exact future wall cut, room hover exposes humidity, and degenerate optional junction patches can no longer erase the canonical masonry, floor or light barriers. Publication waits for a green exact-SHA Validate and fail-closed prerelease preflight; v1.65.0-beta.3 is published and stable v1.64.0 remains unchanged. | +| Current local cycle | v1.65.0-beta.4 candidate carries #180, #192, #193, #196 and #197: every remaining colour/opacity setting uses the unified picker with a real hue spectrum, open passages preview their exact future wall cut, room hover exposes humidity, and degenerate optional junction patches can no longer erase the canonical masonry, floor or light barriers. #176 additionally removes the unreachable pre-#173 Partition tool-state while retaining legacy warm-token normalization and the persisted independent-wall model. Publication waits for a green exact-SHA Validate and fail-closed prerelease preflight; v1.65.0-beta.3 is published and stable v1.64.0 remains unchanged. | | Hidden Labs Stage | #89 Stage 1 ships in v1.63.0-beta.1. #122 Stage 2 ships in v1.64.0 and evolves the same hidden, expiring `iso` experiment with matte walls, a low exterior floor edge, restrained shared shadows and live vertical door/window/gate panels. Flat remains default; editors and `houseplan-space-card` remain flat; live floor effects and HA actions remain unchanged. Public activation remains a separate task. | | Workflow | Superseded 2026-08-12: the pre-1.62 rule of "local edits without tests or commits" is **dead** — since release 1.62 every product change follows `PROCESS.md` (issue in `S5-ready`+, branch `issue/-slug`, trailers on every commit, review pipeline; `AGENTS.md` is the summary). Release mechanics below remain current. A requested pre-release gets a production build plus the smallest targeted unit/smoke set covering the changed surfaces, one tested `dev` commit/tag and a GitHub Release with `prerelease=true`; `main` stays untouched. The complete local frontend/backend/smoke gate runs only before a stable release, after which `main` is fast-forwarded to the exact tested `dev` SHA and the GitHub Release uses `prerelease=false`. Release bodies are short and bilingual (Russian first): only significant user changes get individual bullets, while minor/code-only work is grouped as `Мелкие исправления и улучшения` / `Small fixes and improvements`; every body ends with separate links to the Russian and English changelogs. Detailed RU/EN changelog bullets may link the corresponding closed GitHub Issues; open or partially delivered issues are never presented as shipped. Telegram announcements are sent only for stable releases; beta and RC publication is silent. `docs/RELEASE-NOTES.md` is the current canonical body instance; `npm run release:prerelease -- --issues=… --yes` is the primary local publication path and the manual `Publish prerelease` workflow is its GitHub-only equivalent once present on `main`. Nothing is copied to the home instance by hand | | GitHub | https://github.com/Matysh/houseplan-card — [Issues](https://github.com/Matysh/houseplan-card/issues) are the canonical task records; their labels carry priority and workflow status (`PROCESS.md` §9). GitHub Projects is no longer used. `main` carries stable releases; pre-release tags may point directly at `dev`. Work lands on `dev` and is merged into `main` for a stable release, so `dev` is normally equal to or ahead of `main`, never behind. Push via SSH key `ha_jb` (remote git@github.com:…); API releases via the fine-grained PAT in `~/.git-credentials` (Contents R/W, issued 2026-07-23) | diff --git a/docs/TESTING.md b/docs/TESTING.md index 1f4010e0..a96d4043 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -487,14 +487,19 @@ separately promised workflows: - [ ] The toolbar has one **Walls** tool and no separate Room outline or Partition drawing button; Split remains available [auto: - smoke_unified_wall_tool] + smoke_unified_wall_tool + unified-wall-tool-source.test] - [ ] Grid appears; dots snap; the wall chain draws pair-by-pair; shared walls reused - [ ] Ruler: while drawing, the length of the current segment follows the cursor (metres, or feet+inches on an imperial HA); scale = space "cm per cell" (default 5) - [ ] Every completed segment is crash-safe in `room_drafts`. Changing tool, editor or floor finishes an open chain as ordinary partitions in one history/config transaction; the finished chain is not resumed as a draft - [auto: smoke_unified_wall_tool] + [auto: smoke_unified_wall_tool + smoke_free_walls + + smoke_plan_snap_overlay] +- [ ] A legacy warm-viewport token `partition` still opens the unified Walls + tool, but `partition` is not a runtime tool-state, dispatch branch or + golden-matrix option [auto: wall-face-graph.test + + unified-wall-tool-source.test + golden-matrix.test] - [ ] Re-selecting Walls, Reset, pan, pinch, a second pointer, `pointercancel` and a suppressed synthetic click never finish a chain or save an extra segment [auto: smoke_unified_wall_tool] diff --git a/docs/images/06-device-display-preview.png b/docs/images/06-device-display-preview.png index 5d53977d313e2e9ade9989cbe066431d57fd7859..eb84528193c85323b789cbdb0025f65310761143 100644 GIT binary patch literal 288220 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 r+-QI^7I5p-_ZxuEa2&pXP?f~yg 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 z zWcCC|v!~qc`oY_gEcrFK#=>Ee{p)VW`w@+)9Jary5a!pI$9b+Tq{u&M4lJ6`Q!v$x z|2q3o(a;=C`BUf;f&NN>KcV5 zr7(Q&wC{y-R|r?*@mV^mg<+$j`x5~uvEh-|30Uxq?2T%zg>)B!>U zZMFqjV#c~|+7JPX>W|#yzjb+a*5ix9%uSKZL4amQ*U~M7ehK{l@rZHYujY)H&IMnC z*-JO^FKeWN*=5AKy=TMU4#HP#`w5S~_Jy__FHC0J9_h2pk8zqW+mG|G%12&%oo?p8 zbsOrqD(VlvpdjH-!-BE0lfUa^b{ld3-qVV!88XN%W`$)-6+g6knLt#Qktm$z+QWp> z#z;zlFCZ!wUk32AQ&&Oxl&#Ra$dIxXZYkDQR!*wQTRWW&M^ma7Grsa_-^4iEVjTq4 zy{!mKn0A@?Z05T;yk5=A7oEq5%Bu$tfL{H~>mo8<%PkOa4maU$ta|>B$Lf=w0}9Vg zD}LMi=*dXMj}!GQ?h9FL=C(=(rYI648v9s^HH+0pjLc6=C) zmV<8Gt#F|9T*p^lBl|wn8WRi_G$aKoIZD=1QHfAQNsCg7Wh5#@hCZDxX5uO*-wH|l zwIIb5nTI3POt)^Eleh{c=JlX9wT}T1ajf3D4xkM6(S;yshe4+GnBlpz)TUwSMyMTo zv!UHWWss(RLk{%WuxyA`^&QOe1$d#)I1pLy-DbmJ3hiW68u1Y23@ z)Uyxc=L9H}>7z6-CGjHDE|2ZcCS^vyx}z6Bxoc2z8s=B){x4Q#p>ky&Sc6 zy#{Xn=hu6eiUH*R)dj4!huLS7gb z@6C~WtW?-y0Cr(VVo7WlxlVi~H=WTZqY%U#)h{Qsqk9u79C~xJ`&lUR@oQH=1D5{}>D{J=@3VSBNOX{tv|5;vF`!zR$FNiM1nRSSX2ye8=AATfnz zk)`D(fjx4C#7mL6^L-Jb5*rKCb6p)IZC#p>h>n{b-I}^tm~0V`72*J^WJd|e&cQC7 zBgB5)8u|PQ{M*Edqc0-+?ns><(mw+`9q&x6KG-G)^$pdKWr#nRRF65j7iipObh;Il zpjA8Vn<_oF-Re|Hw>UNxlDH=k2Apd`zGy&&C~;|93GQx|*o_)Qa0ldvd(CO`G`}kG z0El&z<*pw6#*y*DGr=60ckNtGm^8XKM>x-tDASNdW7yrOwFh&VK`@)(Fk+$|@ezs+ z)d`|JaU(sSi~(h=)S*F_2`d~KX+9_{X+AScYgYqZ(m`n`I48O>S`SUN` zTZv%IKy-i9JR!PM&9HF9YvhPzO34?Y;r)+)5gezx(IovAPd=rlS3htf`=`i_hDRWT7o>zVQ+^KrJ7GDRYYL8RTNseX|` zpSu`!;FJ-j-O<=sCmajGNN|X$?f@EcU^ifLLV&oa)Ctseent7!Oj|7Ap5&KqD;9Ps z+%&eYY&+Vrd-iJ#Y=@3xCBtH?&~P@at_@|8MujihgcAbNm6Yu`|VrdAV zs?WYMAQ>$|So<-Fm5D*7`e|arT*o1F>frh3|4X0z2Z;X}X9(={xh1ryJ2AI*%qmxm zd!P`=hSKn@ca!;x~Z`MZ}Oe3`9rq0=fchf;PGfEZhWKXb4Ne2AR1hLfCu00%Z_2 z>&6i*y`gGmIURcOO+!YhBJP59%#{6y7Ayq*Z?by6A_LHta3Tx4=k#Fy?^=%^HzRLq za$D#TyR{L1t9)|j3y}5t+d+usB=~@ccry6~nP{QDK6UbS`WK3_nZjcthRihwb*7Z?|8vud{KJI+4^O6EFg*nQp5J{2!w>q<&fY*hzp|HsyunEyWq0sOth4NOnJM3f7gUt?H`r>SG2$p(UeF4y&k>f}D| z)pznt5~fkqC(|>!7q3&`N*M5dW`EMXaAU0dwLI4ug1m5Y5<(Ycx4<>LZ&&!FiO5X3 zM8Q?4vAEq-F>|NdMuDSw_`AtGjA5tOBA<_tb<<;+Hu)Hn*)$hPR-M^{{?;VpSiX?B zuTGV(Tvt(wqH0DcKZ1Evm+-#?Gr*!y2Tym=7E5$JDwlCUDX;8ESy(dh!N^rH8>zHa zwglco5=MHO6RZ@7SFWEG^6aBUH1END=AU|^Zh&EKzvbv}Q)T4)JMQBVb%_d?*#-akV(r<@o2l z$czvFn*}$^NhAd4+~4C4OlmGQlCeb}C{uZWg1XP%5AAHtaSl+ZEmGj{-t`F9vl)E* zC}?BHSZ*!~v--O%(Ywp#r$-Ak3=p0@iOR$ljV$k+n%Da+=AR40i89$^ep#uSo;%R( zyx15ecF%RO7&oTEedgz!wwDy|h9bnswUGkrZu(}SIqGdwvWUhSOlWIuw9+xJfr%As zd?39$rvWlxo5Y|FbXZF5obRyXlx!cqp(3_>&usA3`d6zNly&t>iOtQvK9R^fOtK) zbL>Dbd|(H>ofx$U*}={aN&k~j1JK&>_M?UeU%q|-jACQ;rTl;1tYhbEE10}^%@A@h zZ1G97jFC}gR6`|MXf7|fm=6_pp|LPC)RiS2?B;SaM#zpWJECORW23g@z020MW2pcc zybi!R*#w~0MAg5J=QuV(>jr6=nj9+|@&N1$fXe!8ucu{a>KU-7MJbe9NuS;tn`iVKUW_+c-RroHa%L5`!m~^rnvmKeTq>kp+4n!5OmRUsf$kyDwq@& z6n~71+oWMq`)708U%{4ST1LJWn>dJ+p{mV&VX5NG^F%&q+2SprNP zdJVt&Xbe$gCrgL~TcC?h6Ms;SJqTW*63iGj=GeiS z^uQqyl?Mns6%OgDpA3d8bxUd=9)5!RaEPr#4q)Q&6!y6^NY;MrpRTi$XG=|EO03TG z^uJP1T@_DGi1OvGf$&8I;ypYrZP#6E&CRMWmD*J;?fxhX*=y-d6|Lh#iH`aM{?MOi zI445nqwL_`Ft3?(# z{W6Rh3jXSz{{L|!D}E0OK}>&WK>xd~ap4<}!7#g>pOKI}6S^IuggHJG^HoMCg!6{h zhpU`M+K&}Zk^D>FECDuRW^GAf&agpAmy2e+1~NN>hy;dA#IOtDVJXcHmLStCFR6m$ z7AOycQ+qUU(&zN6Y7i`Rr!YMU*1ISM@qF%#3&OUY2KCO66lpI)742}a%yw)ANa%JM zkxYRQ%a^eY#_gxaO7RpQ91O8KWGb}o16mjz-`F1j1vv`{%<^=SA6!sjB;125g6H*_ z%IumF6s>)AF{!swg@lnN;viB*oD=GP1_$F_+M5!LHIV}FRo}{=hN{la4292&Sz;_ocfkR{{v(fb`Rm5>G%P@(Jm1fUH zxgYPHQM}-B+{Fua9%p;|5lf#w(VmYfZIG>Z%Lo5jQF54`5@A@1Q%0mBqc=zcrzxst zQ7e7TwAYFis|V+hL$YYfdGP#ug|fbnWsH6yzTwz9r=0i>-Fkp!I1;jGf~!~zWP~?r zn8EIWdIMPe%qAMED0Pj5g}MRUP!E{!OcdnXKBlIwZ2S?)VjeSF-<4iv;?|BcZ4de; z7{Sli2Boe6^niw}5Hvg!N4QlizJEmkOU?8Fml|$Ng=M9&Vb7@j zga_Asu@3q}ZQ=7#rZ6wq)xQo41SUmNOIT7ApuA?{nuCD+4fbZKOXL#F$>`oB4u7>5oTXXY?FNW3NO+)m=}S!uKMH;jJ%E9Ehn_A> z`K*B;LpuE;_W`q|^&aWf{SIW!E`kx>Gu-RwU{tcHB zji2a|dOVTN@EAc1$W+aii0X{YwdN4g{XhhIyoiFHy7)OmjcLR}3M(}B)C7h1EjsB# z>a7%Alzo^SWFb_D6i$RHJ>%DTh8t3@M>+7OH}sUrUD$z|CZuB-FOHuuPSiKieFJ0h z!$ux`y(X|IH7i>P_Tbf}Zphz=QaYqHRO0%%u7ido#M4|9>YE*B+w7mGerV{`dnBpH zao1+EjmVuk+nutOp8&-Z%K(2=JcXH9=TS5SC!tEgpP$9So-~SG%RLdKa-lM{cQD^& z2`1#grt@FHJLkF?UDzs!NS58kq9oL{;BI5_rDivaS!mYzI9$GEG-kf|7&L~QVo_+u zs5-;A@tq-P**}#OGuR-NEkSWCr(YWqoT;qSVWolp!{jwdo`5)4pPl#w>7X%UGq+1F zZOoDE8c(|daRg~hFBe5Qgize_Jv@lKvN~LXtS}*_HLOG- zwciHvpt|=hbsa)XerAjfk`k16g~AI@ywB_$m#mLhg&27pE$(b5X&4qCNG0iQv`F!L zW^uVDTYH}oE<l|>h^gbo+CnJJ4m@`Fm@>ETpRxK>ZA zMaMgyNwc$ognB?)qzmFXfSpkLkN5R2;3NTw?5h%2A~A(++@#8uI_U$CU1JP4LzO7Z zZKqQpp+NM!&o#n|LPM2MIeK}u;c{A196HwoLT%bN*aO87dWHm43&Ifzb1M5g1vsOW;%Ho5%xqQ-Beg{kx?s z%{8~o4t2xPZ7)wDc`b)3UVO)mde~5Vv)X_p#3OG~io_$T2y%5v`1jmZnf&F@7J8FEdJY2z zT3ik;!(9-;Y=+5Ph1~Zmzs7m*dGIIKUgFr-FT(2AFYCRG6OrWe!aa7n)1Oz;TOPK8 zPaN0`90p!ti0*nBUZE{%d&&iYf05Ea{OeASRBZ-*>@hj$8cf0a3wnqug4Ii^rOfOo z!z_vSqW0jb$$uUj7R8>WWvp}#>JW)R3I0rgsVSw@fJr`HA~utiFhx#YDkJ1?R+SC? z5@j7wxNc1``6v9W*&G>bim8r$e#PhyuPVf~6DjdJt|Pn}F2**W-P08nUiKPW^9ez2 zhX76JPv%)D#LGPlrnfx)I)664zP=`lZQ9uiPIui?WoL8zC&q1`Z@>IR``>jCYDM5X z;*xj-1}Y>$J;x<&I&9diyN^FPN}%{~L=JA8CG?1P!xlsZV<| zs?M|M`~-sFQ#CYN?tR1}F0JR*5;%})Q!Kz* z)5zH9$e!94Xc(2K<3+jf*2*HY^arqtDsp3d7?aFD11xN|TX90I!{V~0qbQa3C*roZ z&~uM{?(UYbr7AEAO-Izvp)KCbN+f_exDms}79^>9Y0kiG3-Y zCE)t_{o>P3z(LdAQSsC3zj>1r(-)WzD1hF>aSq~7P5b)!y3?{Y??uNSt%5snNd=qc z12Bp{2V851b0Pb;+x(u>fD6rby!~zdJ*X%*ft+x!&M;ql&aH1w7LwqfoT_ZLr{71O zu2^FPo`W9Wff={Ya*m#`N?|+xx7``@-q>%vwsngUK{N&zybZ-a0tegoF$HF1e=p%rstNhS$2j4nw7_jJUJb@U$O*5J2#+ zOWVGmCTNMn2T?hs%YSifDWacNnW@rGX8;1o(+`@z2aZ8JSznPU61q(@6K z3ud3Yyr_q#|2TPxGD+8GzstOk2TAP`BR`dR4^^rVvX;dUNVgA~u(y}2Y6<}=H>u|> zn~w8sch+rg{r7G6t#^MS&3WHft_S}9)9l}m)sq+9Z3Q#@x~ul;!K@bg%|0?Bog)nT z@N%pD{yh(FN{s)Bx#9A;{T<#S@~9_VJi4Mwv)O6QZrHd&h+OmEK)v2_eJ$t5neMmE zh^0tGel1{%{?CK<&0m!De69BQp9}hj=as_Q6nDu>>H0l3R|s_rU^OG;^XPFW?Ky}z z_PmNl=a1#}Jo)+8Mic-&OV4t?PsPgHRVMIm2C zKwK_7=agJEnI*KSN6O(rimAYMB*HdPtd7VX51CPtpD8uw=m)~UaOPrNL_f(t^9&%q z1f0kjLpMY1+K2(n^AnaXa!9N`rF1sT2p_U!Dc7zW2qAL&UyU3A5dONCwx5Jc0*{=V zVV?Zah|fdl_=tX!@X#;fm)b3x7C$uP(~(r~5OaHOE$(X*_)luy6kXR@ue*syak1sW z01rsbL&JrXJ9GHT-NV+lE=crt`HO=LoS2V~J9DqTfUI&%t&W2M6R}ie{sXJb&Uh{w zG0rC?mf34Ro?WhTe02|=3?F()z-x=7tLxI!|3d;Yl~p5iHiIriCMX=|-*_ygQ(11~ z50&lAbS%(ESfgeAL7`Q-ZT>nyk@MMQ%O!`t5uMmrKE8#TFRWZjh8ov)ms$$GHweeQ zSDsj0m#5S;j|cBJBSP*&P2F8@5Rydb+_>fE!7?QuX)fUp{4TF`tD;0Q;9`5rD>7Bf|TRX)+p?hFxY;!>~E9A4_I4(&&2bhv=tZ1e-PeSgISLLBnGGvhW#PIb__^L+8L-dfa;4R zHO0Rc%%zDRam2peq6Mi!S{&$RtKek{BmZ^fZ@7w7FQ&$UbA3yR1j@jPe*GN* ztM%z?HZ1a(WP8yd2BW&$2ZkXxj8Q4Wkg*_aaf&95QNgPsPn4N7x>QnWqEL5nXtWgeZKz}hL(!V zci)JPmxzfpm-V!|B-dG|*4rOVvNNgc5-$WYLo8Pj^r;dG$TPsZ1V++y{M{L?=jZ}VB3c>-BvlgCwbx}MPx zMc+Zh%x1s7*q4ZN6IWMPTieP;;MHamG6^pstahI-TO#r`m{xP*N=5P5czqamYqc1q zFAzRYe}BY@{MvT=yw=s_Pad)7`nEFuO6&O#ia|#g0)S#z=1-=j!f+xdZ8^=PXNG(C z?0**ERO)ah@(C<7{hdc!rFJEp9shk!?z$1$oQhNQSM?P&D{D!;w4)Dd=3}mu{WshU z3{~Xf9QBB3tB*Bpg!lU8%{v*Qp9WL@5{#C|OlOC%K}j1Lnft*}>uEyHwT$IA6Ph*6qhI*lH|Sn@-bP@6$K?DB?9<3V*z>4-ZQ<@B(gV zz_7G4$KP~YHO#Q=Jk~b;ez@=Tl<(zcXt+D4Zhf1*6{zPZ&vbor)_pMw~@^*u`HEX1snx8v4BoBUAf1C z+AWQxEf*f~8=;|j^@intcb|&^~$pK{Gx|{69X>`{RKRr|$0GGLp z&Z;!_AaN4m8(?-AP@*Be5po=|0L6}R5j<9~YzVzvWpjsZlBiGOvU2(?tXo-%?k_HN zgr8Qq@7rPQ`Zw2-V~B^+)1jX%&8cvm=a@49?O6c8%G&WZQ`u zm!I+tzR03;;zo9Z1^os@f|Z#mXwDfKvh_ns$3I-K)SEGg0|(%*_rdKC=PgLEiTG1ONe3oh)X!F%odM4_n^Qn}{{@+){z>uni&c|<$p~+i zAwPQlKTDyRJ$E=Uw|{^pAYi|VWO7o&VYNi*vwsAH3q-a}tP^;RV#MwvXN^EjzBu8p zfef!3y#mw<9yKpZvp_zd?g)Dp z#oG>nI>T|2Z14eqDFr%6#@OR1!=%Yio-I>1&9n>xc_q@(HPH@Dsb|tlowgDI5D?Vv zh78B$2CrI?w}?ZUsB}wTvGp7#MXM*sOtY>)$TbwO^*g4WYfe zxpQ~KD(+^Cdgs*E=&6*A^-}fvw+j@n2o0cPqbcI&P8 z|E^w3Yj>JTRvwTm&Q-m&=XUY}*PH|a(sJufmDG8mkwoR^N>8p6SSyzRB|L$7G8BHj zONo;dO%53&*u*Ia(@+)Zy;A1j{MrF#eZCW=T6f|Zl@~9`IaSuKMX(+^}FX8 z0d&wgfD>3A<+r^Ke_aS~eQP>Cdl^fug?4oQ1q&OkUeES}%D10Wu_OD?ri=j%~^!Q<(KXdMjo{#Pee zO>yKgUL?lP{l^XtUV6NLm$#f1oJq-kjk|lo;rE)gU-&U>siJ-$cWHnv)UmH6!nN!A zC;T{3Rj6hBXasz#EqOV8nc3o+Oj}8osVK5DTaIknx`{`~zSS_}BQYhmoSVz^_Y+TC zHi>G7rB=$TF$yV_*)%7yp7Dv(eZtXK8+X%n5_}}zbqo!At2@Gh2}u!vbyUM^BWSsk*Wos;0uidK1p%nLx-#A*FWB(XhbW1mt={f`nf&ed=$HOB z@MB-~tta{iIFVo%U9&Fzwf_BX9XtN$@N$gHe81VcrE>a|=XNLh2k-4oXMXyXa%{L3-Pz8>Gk6YVYUy9Qq-!Wo=i%xEJhLz18X+5HLPFc5s2b-fF%d%74M8 zzHHVWF}0RzKv`Nt351kmLIKV-$9ehk1H;}IX?X=ueVN~4j)D@8z=BjO!LnM1ylJme zm-wUf7hF6T_5a7ySBA9}EnSyFDGtSoyK8{pPOw68r?|VjYmnkzDDLhQcXxN!AjQ1} zzVzPve)|u95^|n%&YnH9X3bhBP~&N~B{?w!dtW^3y{XsZx53dPGvDZ5;3i&`!u{Ak zk+1JuYARn?B~n4V0@5KyD#}qMieL7164}KYkWg(j<(+9==-(H?n*rkJMXf1ywB@~7kK)|=ugq~4lgs>zH&}L`=6r5=$BP}aOlmX!KBQO+r zKLf@i7eA7EUE04M+HbxI39cdY>aBj+x{7g!Di;XPWI@CA&Sz3?Jf+h8ki4VjgD4!fgL*p(%@R!x)*g=U(qa(Aew+m3D5_JO{Bv5<9DDfLUsp zO#AEWFI|h~$Y0udI<=YZMGZSOUsa@o&Y<1&lBtC#0ZJ8s*t7P2`_lGnJOrE%A zMA8huz3-`~FwfBYUuU8+x^#X@-A--!mWGV(sGt}DD3rp%2wNGDfl-)LlYf@nOC7MC z;jNXv>zZs_W=9wrEXhmsM9lL*M3gOfy^N)y?|2Ng&*2NSx$f|Ln`}ED2xjHESg+#X zM3&kdn)f<8^b~zef_ek`(=R^j;il=o&uHv5nC#b#ZC zHmkZt{YV@{HP-}hLkpG3d>+6*gUH_(ifc*|@nA|^L>sPMKkoZ11xDE&#r$UN(vehe z!M;d&O8^VxJB<`f$mu#!Pkbz0qz+>ct9;H}l%{nKnaq8?8H{G}+@sPs$pKVHw4l}@i zZwR6aV>VcRM+d4LCVCTmOZEAR=L59}Pk?$=+M+sS5}>4E_d*9_XTBvG{zIWU&F$<` zn5(CWEEff;YYm1C7NJh;*@Aq6^;N26Rp(1B62M9;!4U1$$~cHrnHFY&s80d@9^!4Q#wi!am(lW8E>eSD<* z&p+-1j^$>IR?{@SnL{~Wr7$@j@k+|aL89y_?5KkGus!zK!5S6JApM!LN9O1j|tA zThFYUyI#V7NTzwhPHg2@6hJHWL2sZ6XUzxV+WR`T9_V(!o4Bgj(3DEX_UK$K-X z>?Oz79s$$b?9bJmkRU{MsOgpbOqR#VF**LmKs8?%){UY3yw}Snv}Zud26XQp?+{mZ zoZ!@`x3D(-9W|-FX5Bxd3phq9-brtY2Aw>=_%Y-DcQ&=i&@y3LfrW5`#~jPQE{V|` zUTJ`#TIJ1_WRDqQ$CVYWcfjXE@_W5y4;x=s2_E)HeuvNb#=K`mRk!u_(8eE^l^tTZ(S%#R|vxw{dKoZg~j)Ycg=< zV;yciufhk;G&oA@R{u)4hDxISlkq$O8528*QlLnup+SWm059 zd#JbF*AIiz>i3eh_y*HKtyn_}e-HHk9zcn_!D~x8&J(@8@A)gg-h*4YpHID%B6kd; z`XO-03@RSF%}~-=7H&@#X%$O?sm!=}Gm$3a% zEL9029}FU2d@osLaLW`0e@yz0a+_f=qz6IrJUG6w0mltzXN?^@|CA7KW#1rbpMs&# zyHBcw200k@V?JpB8%h^%jlb~g%jN?~PyXBUn7*E#w*2gV1u_3J71KPSP59zGwDw-}%fv4;+lXVUXsj0-crk4D|=skZP{Mt$B2YjI&pmrU08{ua^gQuAs( z;%`L$ZYV=_V$gQ^(@ddWwd3leWlL&T9mMeqp05=nO1?(e)wp8_IWQ{G4^OOO%IEb8 zv(QAVEBku*^gnMvB-oJeZ!Iya5|U%~D$z)99sL&au#TtT-aGP#qY8Et+%mo2m=*U3 zl(vo(ao`BGb_pEt*eTM$Y0?tvhf$i!a^J%->8SHM4Sm%NdfKSvs@b(l?)_Hr<%4q# zikaTq_L8fx9@_(0orxU;wv$7=T7-i+E<1coOd|l*|&Jug@qc@eOnbdUkKic({$Lb`2<6pOQP*=ylt_$L`*?JUsq zv;;&rx~%92Y`j!rN&Jow&8bZJzK|fev9?wz0=$NK5J4bsNJf&&yIVy1eX`743`3a` z)PxpDF5XHGmv7itl@E&^rI=}h5!JN+d`AqM{vP+f(MR6^YO8V&XPD-#hteEvDXLri zkIml~re7q8H6DWf{LJB8EQ;Wh!}u9=Zx)V}Zj zrL-J~7g**0NuBqK(a54#VxGp|ub3=7qElc09M?yimxUvvFe@W~b}PS;LI)G*sVTN1 zzcFa!(rGwe`o()m=b9~6=q^PQ=OJ~MvS}f&bmKjxE(p&O0p6m~lx67KtMXg`j2d1< zdm%8YA)VRH2CojCkb7Q4a;V1zIqDtk8m1whQPL*ayGPQN&UttHC`8H}0Et)${DG5; zJizJ!-k0%{bkE1|*b5D3R#GpBA=d|3*B@yYNrCb!jI*e=t^2dd^Sn5^*oI#DDbvjd z+(_leP&YutOi)`n63AC;9=*1cP7UwuxH#MU_d>O$xyx4PpH16uzm_R7;U?1+noK0P z55DNGW?ZBhe`|GJxL8SIcJZvH1N;mh_~m+q%OLBD>9=T8+sJ5Et9dtGfXsNdU%%1% z$kXJyC_ssa8tVAFcNZ0}hGFmMy`fEJY2PxNhRyM=y$s*B>86X#-+AD7+SrTqjEf>f zNy7j1*d;Q4?kF(E5XNK*Ob&8BK@RRTz_(4!2d>`JI3B0ykxN>yrjNL2wEKSPgCKho z{D=ftTQ#$Yd5Bgec`o)yU~|bOIe?2^vUrN|uQZ7o8lJZSm*J0AJo+RZ_cNp+Fk51c zj`E2snA{swAsqFCzT2YnFCLBL&<{uvfFX)2^Yl|;hn)RztvAvu1TKRPrP`VfZx{mK zalGok{qEKGaVKoq#Rh6LAcUUf$DM3HQNumYAC9P-1f5!g3fu3`S_ntoOsxsW&FDI8 zz77mfe22dn$g;zEshALNZ_aPWRKajdX zrLoeP<1z9X8-D}9C2Ca+@?oi->uE!hD)$=WbcB*U;bCC#ZWLNfoalYtvd_IO`k*5=qHt7hOnc&2wqPeMcDA7Ab}5wQb4Ng}E+zhQ~*)_n$_3pB~@!u=b|?QjR1b^SWnu~bwuNwRgBJQcc+Dz zz1CiJpbKE)>o%a8Li3V=fdg4qKecvpDZql7MCT$_zsvV4F;w&Tnab~SlIOn1`&Y?@ z1H}AO^8A^8dM2KmQ~O&+f|y?a@Xu9CL-rSugpz~pFSI)^eizfoQ}PV583-uCHb9%Y zB4ax)J&p55mnkCp2A>widU`F`sLKVk0*7~sTxLy|x%HGs^y#c2b#*n9Nz%sq(Vd z*&I+Kb0Eh+2Nc}%OU;Q#Q(}_)9DT-_w9bLaz% zN?^}GAi{V&!cHjiVQtgDRMpSzg3`078wF{lSji0 zU7*AW3|fuvg+gmwD%KZXn%=}&YG{VzHM}qYl`4WJHcg1A zK8eC)07^KW)XNqv>yZ;QCFY|SxMXGr?qISW=Et|X2hxB9qPt9<*Ge>wo7v6@(YDnE zhI}SCX$r0P$l?N-zVK*eRo=m4ChWk5Ro?Cd*JK4Mfk-CUhD)67p-E*o1T zzn?70m{AQbhWJ)+h)b;X{39p}+HG7kLRYh>u4AbRMikXZl!>%c!A#hjv6!OsoLQ17 zwk^q#wy6T_Lq~P53(hyg{{(znkK|BGAC8kAtAjm4Ns=)QLzy%Eu!t5x*Tp4a zUU*%^u86Yt$Kc-rn2-%H;Ty`tn8bR?qHK?(YwbQUc((`s{#9r62W$Q}yLjgS4?i2N=bJ3}idEOyq{O}LTUPshr5>(yt3(`+%Nfr;z4 znkeYgsL`w-0)a(0kck?%E36G+UL|9s1;qXjt&9{aG4(#*bGr6IMPXL|c)N$sn z1K;DT5TKH-Xh@3MBoS7YY3-3XL$wO_`2NOa8?*)YuUFb-0ByP)Il{E#2|mp=WNf?2r3W_Vgb!b^y?p0QPyML@WN z2Q`7y)*JlJh4m*k0zLsgC|`nd3QspJmqEcAF2=e*Otl>2>yV?(Zk&2O2WO*~qvPfc zAK=|I8($d&!aU>%5y_1Ht8oBaN*BMs#b;1g>MMYGT52sgP$en=z%7M_H2$Ix_gA$$ zbQ>6v1sQ8q(T|}shvpaq@+P~XD+d|-FU>T!xI%~Kx$-_COVDgI$X#We%uKK@_84^k?^g{BM0&27=$azn`s{N1MDb)~h31pJ z<53i~-?8tjxtJxJ1&j94wPN;oxnkskTy5S{HM@i-M)EF|y~E{(H@bVsBQ6T|+wBw` ztFb}jk^-c8S-R+A#$IeXAL6gwMV=QwtlL-pCGQUBgN3eOQPFVje%DN4z0W*LUtBWZ zzVI<}@H$AF*w5ojm;RZ{ z7iHj^N&94~&y_E=$?UgLHJ6B006EquUZmYr9t2Iu8P54ZL?vtmWYiwR>}KJN2xdM% zqKUeCZnw|H>#rDV&SR7$DNsT73YDn_(Pa#-F3btyY^?CRPs4OT?v1iM@cz^bsFp@P zCFEc0{80~oY7T_19!LNertONwXGEQCMFy&@HAH@U=xWO|Hf6Yex9Vx0Z#a-ERJ zhx#~`@+JU8Ny$EKvHj}3Ukey?XHa|ZG6Gg5yuuIn_y|BQFD%=o9ZVKEIdZ8IQ2vZV z-0OUq8ame6=#-);rNfJQn%3vCXwm7o=LGYDPbW-pT(v8|!IHMv<6|-JZq|~hzxC4K zUvrqO82e?^sg#GsF;#8h)?LqoJM-W`vR_~mI^D@p3mSZ-o&=}WfJ9J}NK_o+dfO+@dnE%C_9=Xp@PKRo!of-2)J}e4rl56n8H$*etE%zJ5ZTwI{dpI&wk*}XdKT?gQrG!%2NeZRx^O#-1tK*k*m6O!~5}bol z6*hvp(l${r68JiUO9_m?Pxb+o+9;C6=^NU_kU7EE2e6ci$rF@+ zi)^8d7&*|30ddv@ze0tc{WI&*Q?Q@S_v{8jOnyq!N$J7a8;kO&q*oH+iHLplWA+e8 z0wBSHjX*k`t3{G7NhEkUU(j+`<=8Su3>YK}m1$(ciF`>!$|YH9kA&awyPP&$T_4MX zu(WIoyalOxD10=Q!bD4tf48uNZ^??HsL_@HPuz+KzgdWKuyUeOTID(4u}lRlLBaZn z*X6~uuK*HJx0;q)t{Mh~APGL7y-Oz<|^Q>r{Pt>DTd+Ghw5`o11vOOriV#q z7bIuuActn&6Hfqi)aWZXgUswOP`uoB?uaTX}rInf9I>V#P8GNHdWS;h|1?s zIDt&bQ=GyqvZ8(JNrm~j^sjYO-j%R3;Re-Jc4#m}8?uMM%!pW=rcB`DWH!_MNKo3h zjP51}t>AnpCW*!&k`bwf^sX~-sXkh7jgTwbmYj%4M2QY^EQVQtS@h{ROQri19SI`i zJgm@&{}*p>1LD+Px+pOifU}w6IAhI!q%IK)LG%qUH=cOZ#0013gjIp_f zOAS?}Fl;ak+4nrGY4JO9U_VAu`VNKxt_&MAWB~9mF|G+~;)nG1iSe;*F5gr;v?%|i ziAhShzXiu;dEZY``(hAQ083bCOY=AYn)t(25EOVg%Kz>jc9>+gg196b1S3j&x)yR# zvS*l5_lYV9OXp?#@i9I0zXPK3I5c|zk#^Vy|GA%mJ(pygoZ*$kVJ3h2bM=341nNZE zZKN;AmonSrZR(MkSVYl8x1-!e+F<}kQKJ!1vHbi48~+arAed0ZmC&%~GH&^F{)2uj z$!_2i`URcCg<>a4BQOVms!5UN{+}yTCu@eWv!Z-t>@6m3g9{348c!AY8mjC}^`h2g z$~VqU`ipA4SAa5<96|0kSzVCZr5Q2W3fTs~Ukgs=o=AHmITC)zDR*`BH9HYpG8N%SP`ckoKzxdgZwA7Y3cn*eOk)(U$gbYZ^%rFUSb(-Cej&@kh@3W*o&rwUDVbAj z^Q*5jskZX80&6Nzc0DySh+p-eca#@v9OG<2bAw|~y;KsKXtW!oYChbT2pUZAwk^7b zP5I$q)$H_LTk4Ys6R4MY>>KeXnIbEv8%I6$1W61rwWT`txe{lBbsrx@@WiT6uG z-C^JdE~NsB!ntlh$zCF@K>!; zRWF9tm6oU4+FCLWnSk+Mmm~0s)Zo4IW0D7I;St@gj-=BEo$rsOy8?V9Sx31IPdwaw zN2Tets^Uot*Fkkgz-H4H1L@hry}XJKp-+z^G!8e8cfnQ$|IMik4&HxR!V$d|T=2AD zmuxjbpdXEF$4*@)ZC#BYo-L7OlAUq=F8TyY7Y|h~TuhEIPs^rc_}cjym1+#Fw3?I{ zRW%OGfTIi$$LOfrT@xL_$gNn&l9-v8oHXVO&n*mW0M07Og3w18^__=zUX{UR-$c2S zSddFWIW2B4WKT-k>V$x23ltf$CZ{XioG< zBI^o1c6iP`XGNaxB2S*8xjAMl6Oym(&V5nLquarepRL-OQGAcf@gY7eNY!RidN(lG zXUQp|k0-=bYb5Rhz*4*uW)NXeq)!0NxGF>nNK>}CkK@Xo=*&KR$%gd$=&Xv=cxcU< zr9}TlKd!5&@nnI2_u`A-K7YrZqqumbfLoAGZ&Q`=R;wdH88oYKd*-u z^NV%I+hs>%Av>`#V1bvDIF4>_(>YkltwB^Q3BMzB#5|=Cf`al46}RV*iphqi%~`ISD~VWpLovi3VS{nt zqVupstaj>^L7)K7;(z7E_WZl|c;j<4&Q%G-pKQ)!hbbP5{zN-7zwvyn;Hsxv2M6Ws4OT4%~49b zg_XC4G)Rpc6FHYmycH$iesQNeRfq1YU>#%Y@3kho)f$#hy;j-Q6^-5MEz-s$R@Ta% zg>up((-+CGnXdhtU0-e2Sq(ovMdC7TPLhMvHf8%DZ46>85nD7}Gdh(H?i#DIWrQjFw_SLogf zJn{smV?!0f19i5g*AO9Kiz)(T4LE;EhnmiSf8G8AKA(-&F#L!IHK@bXSg6x-%<}E{ zm;XhOEK6ulz~R@M;zAL>ukvy)C)Hh){M;|KAxi1L{o9X!Rry_U{$~SKK#!b_=#D0n z6;YHra^Lq!v~XYELKQbcg=+;(-m~si$mT+tvYJL*GZUJnq#5!?fB$%?sK+kOpBcl@ zNkp0lipYToP7>jj!}gEkocI|W7+}NDlUm4LD#mU@GYfJH=?Zg46`c(j2&748=R{gn zrE%X6a87T8yL`w!GqqeF?`xQiEAzq`VjQi@85)^QqVAea0>)kUN{V|Lifn&iFfAF6 zdl}7xr2lpUf(#L2Ow6u&Q`Zw76F9v2K2m|w!@a}T!k0^lKK&v#r|}k?k9p8H@_ zBV`b#%dU?<-3LfA^;e8D8wypG?7|ph7ekF#wmNPeJ=l`a7)@{>N^6S;Xwi8#0<6{jsTQ4)wVs)9?&dM9#p zzRY#fgHfttX#uTW3QS8YI*9xKF5a1bQK7eR7%@32%0;JV4}txdeI-z#;qoV2Xx^qN zDA=g{TV>gbF-sMXx=|H7x|T7C8}V4o(c!9vE2=9)NMYoSgRQk|G%Bt7#=eer`iKka zAhAw9zeEB#WY$3iXd@a7wi#=xgzGzI11ga-;mE`lo5mw*2n3{xEG3hjZ2oQfWxv)L z?Dsgy-St}icCE`-;=1>3v&rrS?0`&s>@_l`H)HoJkFb#UY^&{vBl|CM?b~O&m+>+E z7wuYI5vqbd(LQ-ZuUyH_)`0d@K6<(8vX_LHPXySaJ{}NiLte&jUC%O6T(vCRw5{M3N(9eyM~8 z_zXO`8^lS~h2DNB$W!lj=h8s7l>4HCiBpBHM%32pg)~c!LH?sGEYg&rO^CpWdUAnw5rwhHUS?XqPdmw?CvR3%9-2RX7}k z(6<)td`rPS-{?4DEL*NoJq=b(+{GsPT*1FYIdU?j;C(F3ryo<3;{s31ECd}Vp{#lS zvzfFhSZs54OS zc2aDu8CajEa=jZ!F#7C946&e0Vz_ax)A=OnTlnGE2mi@rjo^P}S9s5o>xkSz>a0f9 z>KB&;nAYJDWVWh{p<#NyBE#O9iAa?v-jW2hNR(5*g6^pA^}=Cm_t)=7Q$2=E7SD^ov+0y!V-sK zk(-q543FPVDM?>vh5rg(lDD~)GgE&V&}-Xh*$dk$&i3~j>WWeLs`y(61kFGDrM^4RblMn{tuF)GEs5K{PQD!Fro21D#~-nDGwC(x-I)s57@() zUb-EN7%9EFa$LYIb2$0_eV1cFy6j;c@@^H3O1O2^c9EM++I(b3UM?0MUrXxy_7-Yn zzwwM}WWKE&nSwXjT@d*_MVeYaFPu^e&AK@hf!2+^_c!h^puJpkvMBPu zM1nGg+B=jVE8z@6dUoJu7|^{nP3{A`74u%n{p>M9S3zLmtwI(yxGqj<=4JoBG+KI53c4E&%#a-sMsC5f1jgIZm-A2LZr_Xji^+2rA=$QG4DOFG_ z&K&!{npMIht)q(7=`WW%oNB^>j(7!P>o#Fn6_PCgJWcfM9*z z#L{xwTjSfb$kVw&;T+_W@VG9Y4MF19a^Rk;g%{wsca_Zz>l@}geKb6fFKRHIK-C71 z_*RYDsQvWk&E!X+FV~qDEuPQ=;TZR7aeW|Fzt+l2d%SgiyHWV9mAmWr?_KBO4Md!c z$Hx$l5#}<8g`KKQ#KXBo*_+3ledrwPfQ}*?U9n+C=vwlW|IYGb8c@`Lfipf5p^LN3gUME^b^YZ;?VAJinR^V|j}3xi{*W-V_`=?nv0g8NQj}wAQ9=sl z52(|#-NCt{!Y-GyvjIWCdGg2&?|XAq7k>FInd%WYk$hbeR7=|c3Y<#RRrQ!fNvn^u zJ-qDm9A~2WbCuDCGh{LZSs{{}d!sVJ(iTA3LYPQU3>fp+ftA4WR@EhqH_Dsi`)@Pa zCp?42O=euH24ivD)f#);`^mUs^A1|`;T})77D*LmU3{PmJ<>tElhTX&8+p~1g2p#8ozbuL>MU6_ZT1B9G6M3J}E z`jRbQ9dIIkF{Rxuq+ z+_KI-^UhQ2c2~gmW-uzUO1pGgnErDt9PPlUOrNmH2ULPOPYG&PrB6Yc!{2oX)kP>X zkqRxsF%E$?IH(dQ9@eUOHjGx^NHu%6BEI}c{v=?pH%b& zBi59|)A725f}=7Mx#6=S(i(*F^L;dhmtG8f=^;pkSg!5MqU8WRj=}RC!z7vNL{#Da z!Kz>kwdC)%<6c96vQGkAb*sj7MAX)<0_kO&wSeOaeD{0~u{Gk@6wa+$f!#`csU704 z9y!?+-pItjgPq1bHUeA8{QBwIB7r)ypZJ6&77bR81afuDP4B#Guvtg*KEDyK{Mo$u z*E;GpC^Yy(D!AHmpfhF^!xt0UD(gyawkRj8$)zFp*Yn~nHWY`*UM=MJyH^X^kP(p- zhQEIPZ_{Lx`X31;y9G8?X|8t)+=cNAitJ5HES%{(ww%?_&Whp#i*g z`a1dYs@u%ci1voC-|o zEoxNj6obGesEo*{+vH5SqCBWfg)r@2b3g0z)Y{oO4;(JGHo)_tqV?a~hO$Lz8eKI2)**CAfX%`}lf=-gA+;A3FGl{$uXbc*ght*4R43)I;lv+gr90 zKTmsKDlc0SM`faB3PBYw;#41IDgf7?YsLR^Mrnc@X1ZOqy$;MtA_bliLhSa`lSGnQ zc6ZVoqs}M2NlR22D$O`1v&-ao2i|9`HW;^2rg&Z@j;UxtwT3;cWGxX|?2NmZypJtv zW@j!fq(MRO9KLAsNDLA1ZQHg_-dvUvpQ%uul0d;l6rNVWSUD)m4pFxSJopwl6hO?O zu^*bZ6@cPu9U#zj#!=qr6n`*Ua1V&d$WKuz*ct;~H54#d&gW8;Br*IKslmWGw!IP;r)Bq83-{A@jVHiA^e$437F3NprQ%qUWml&t{tY6(aNxpLQv z8HO8;OBZ8y)Npjlc_PO88h8;9M{=0L;BG|}p|?bnFyfh#o3FEJ|; zv+HdnAU;DRSXicGq15kFVL4re0U|6c!v0?e;*u-xZ=>Z?KFzdzdX4}U2kEcn8_ZT% z>pIn|voGx8yD)a*n{qgwl;SeHZF%{&r*mBPK4%ddh++iQr?I#?^V`an`2Tc9in|Oj_Z%=7k^^#q(SGv@%VX+k}{? z%Bn##|7n!+DqYuuO#1QE_1Z#HCH%uxUW+K+8dn?~Z=vX8E1Qm#xItwEKKTCv=;~xC z4y8aCM!e_KC-n}O&p|=8{qt3Vv5b4#sbVvk(5`N!8zDRjA@hM%qJhP5w|047Uapc$ zw|TUBsuya9;UYX9!3ux@iq6kgm8VI}xVHN(q2=ltXGn=OPD6FWumI`*LrFs^jIGJa z5+!qB$jLG+Bgh(fx7U=66k>FYT~ue(80^|O9F)u*7(mrfpeuzlhE&+|aoMpWkDr&n zEzT*7i;j43XX8JyPb=pkO&>-gYxY;AA+LJg+?MYt1|O)d;Z6|kpT|{?|+X` zhiqeQm9CW}LSXu{bWuxc>wX+n5cV4W^<*niUEbW1q%cl0BM4+XolD2gz&F(gTc{)h zrZEvyp0;i)&f|ak$+6LViegxfk5&33kEVZ7WYFoOq+Ix8u8-**f*~%S*hZ$db*NfS5c8MNmfEE zVtyH*c%)SA6q>#RQIPSL&ajV;v(A8pMGRw3gE7EQbd^cmN3vhm+aYn6PA!i3&0>m+M zy^yE41nnqU&>KzB_U^c{ET>hU>zt-FZR+dxQ9Lb5$A_Z-$D#!Ot72g6#ZWc%#Js-UO_q%)$#bUsW!l>u-$Em_5-@-}$a4=> zGj-Lp*y(@gHq-}n$wRxD*tayy#pP9^MV{CX9x%qA#i&uF!ue#{s0nUo`YD40-Uk-s zdaC0>aXzOOLCya@ZHF=u&Pq(nd_gCs8rWGcDseIKc#sRfZ^&HA)up*^nHA=N42GoQ zc^wiveO#)LayV}giD#b98aWnflBc&(*cq@t`M^_8Qex?tDSOBZA@cCY7~@O}KUQBcGtjRaV_2V(>|F-)~Z!YK*1)Lk^E zJ>XNx#WF$?&_t1*Pnf%@hE}u=^Aj9RIa#F-c2)UL6ofxNT`+|e5+Z&V-;%x z>Ko|3&xyo21)*9n;f$Z8{`X)>=`E2?iyh0pP1&daKsG*<7}H?L@I95v`}!$sZ)Wk` zanUZN$90_|1(cP|j@S>DNJFly;Mh{_~G-UQD7$8olAVvbrPo-@KLd1^N7z| zOV9$&G+CCC8^no9nD+E|-tous8yA$jwa9DUC}_5NwAxy)69BH`y4Fa_5yb{VKF>&A z^TA1I1?5&E;4~lR5_i)G{X3UP4L6vmvGE&l|D+~d9yI}kj`{}=HWwyZ;R zYe{*Gg5A2~>$C0A?3C2Q1z-D7{Nb(u9$pl~IF2=dLWCDoqG4AeBE1z~u^qqswU=0e z)y7E%+155kj&SL&6oRP|5LYp<$N{HV=h&3X76kO-5VvqLqR7uHS7p@O*du-`F(Kep z`7xaXfOTmZ$ zWx9I{^U~AXLWtYNio!4*QE?Aa&vTUTC#)Y7TF=`s)qQOA`c49zqSV$V)rONC?9)!gA@5ocA z#9C8NcMcU#%(WAHzpL5)8{eyZ zk2g0ICZ{HP9IpQQ-`vX`M(T>X=ajnd)l9%YRhYT47yqS-PE9{m}D)Mj}^(HFE71?Kj5qRXReS%8>6+RBN!Ad4V0WJ=Iw`XL8G)(@U+4buTL#OYRsHrU6yK!qk&zMR zZ%ysD)WSEv?cc^C5;>+xEsR}mQkcb(l{_W==cY7t96zX8BO~9qkg;TjG+C@wE^a_w z*N-yY&sXZrp`9-m|7TuV$5`Qe$bF`{{8xD;B`K**J=eae7Q4d#p`--9P^6E8OXzA) z-w*laX54wQ16n74SKWF#T*~&b(EzsE^?@x`H;vs91TPl4-s2loEgu9qbs=bpbkT>Q z3xkpgJGS*-$~5$$`X$-V`^9=!ks5z5!-O#?UE_S07mof93n0BkOwWSB)$PfXd@nf;V+tpG6-9J||VpC!y!9 znONqX%}f#>J@p`@8QS$$ea8lhB!@>wq~2#xU_4gOW#(y`8)8AIX8KP`D))L$x<-rP#5_Svy0rPJ87Os#gNAuE@QuNV+u2~VS={W$>9-W)t_dc&(KwBnFPY9?;BT(l z$qheN)ZVkGr;JLh&f#T#E(}DT>Hc8hA&CCtEvyvxdUe9g*fF=Id08jTo@J4+G}|rs z1$eqTE!H9QOHp4lXT$Ti8LT()>h76`xV;%OFUxL5tkjJ2A~j8@z%*xR_;rDW&xo3- zs6SBp`Lv7+j#Uyiq_`;^zH6E4S00&o9S7Xqhj+Tx_9GMQu&AyQBW0k2UucH5!(u%H zG%aCeAcE`5$3$;$20p%+&z%-B&8H7ySW`d*ZqiuOV?*{W3J%n9F{=1j1h$tHBtrr| zE%RJBsqwMA+yRg9%Q{@`$AT#Mm=GuxFiVPqO6V!%BOmn^6)?Hq&yNmbT`*}$RBGqN zmV}gG-tF{qk8F;9@gZ2*5i*@S#@a>n3~!s|w+&00v*)BB?5imJogI$2IzV8#$#=+G z=u-4b3#DSlkdIGq$R;Dsgy#yQhRscOVzc+@)Q%yT`hM~XikX!A`nAZM5*4!ox%&Nm zW}cm4hJU!T%iVjyW{JyvoN<7Z> zYrF=d@S8aC#tIX}mC~jXd6}$|^`bkr^Pr49x&*ZZf=3z3k!e!$jm)20wm{+Ok6+q` zd1;@>y~ktGZ)>5rAO=;p+&6CJn0CvxrNw#rpS{xrhVz8^Y#l8(JJ()lzYCY%6w0)xpKQR;Af_*G>5eof(-yybfpz5Z#&zpF%M zxUPUsP1Igxv~eA6XNQ_*DPWlJ*VK4d9o5QlL%_{NL}~owr`e`TKT|qU=YnPBj;ADs zrkiu)Okq27m%UZ@*N)+%t~)W&2fJ1#YL(ylUf5Ua20(jvs1xy2YPhgvlsOqymLES# z)qCoi9jdsH(|Ak#l4v8DWn@hL7)cOsPGQT3EZOlHHGb5LTFY7>@VO!4HAg_7iHIcL zDx=}ED5Kz?^VU0*6SbGarbRoiN074)JlwDRTQhjs_-L}h{ei3ld~5l7SKZRs-r^U`L&`FR)15N6oJWRi%v1y@xsO~p zod5jfI`}k>@tSG#4bSo7lU)ZnW{=UzIwpRwHafgHh@mqkqt~6=CGtC4j54k?y-tV* zGAsD`0`wI3&L2l+2dEu)b@|L@%9|q-XDLx{Q@=ge78QYcY%F{Den1);k+;}xwX(|8 zUsjplB33>w!Tyy(X5NAltU{4zwm5O9DVJPrU(l>=_x4IIyM(L&FD!XwgMplbUdvxh zdk^hY8kHlu0{1F?dbHC&x5{Jh=yv>KvEQ9X;_5*Jr(OTYe4G=QqwjLgzyC{)*b6na ztoP^h`?FPkKm8SQ95sa5NNIjI2GmAQ9j-L4RKU4A51uX56~f%>tka#65<`w!FUFtH z6<|k2FN}{1i)eXlo){}ON^XDqL{3h2e&qWsGw>)?$5maT!Pdv;c5SHYQAfs>=*rzq zdP7DL&vj~h%$xY#wCAr5oTZzM1G#d{rlbK4Fmj?svw+`q_2^ zij^~iyV^;cC9fN+tebG-y}>bHu|@BBU>rLl5P{xxT-5A-GrpflmOL9&?;?!dZzfr8 z27;w};u;v)m5yEdd!`psG+m3)=76mDy4}NO?X_|h5Q3tve9LE)?ZXBDrOoyvK2t^OT_1rmx6*zkbbCT?HGWU z4?02$wOk2+2%6_SE!b*!x59qYTVKc@9_7W1USw}; zYlykGnv@WrAo}}>C>adooiPJYWh<7h!G{rS4No_8GJN}XvV@&+&2U+yT?SA~qqM9O zzZaN;WpxqNU%5>oCPS$tD=-Gp20P&YK0Ys?zinuI0uyBqz@!8h%Rpq$`9zMMmi}J; z1Jjbkm|#Miz)dQ}kVQpeGKt`94s;mOT_+9so+fp^fK%R`^c&xOB6!$yi9Yh9#>JJ# z*b0A6@jQ0w$s<2u&vNICbzj$sHXj9x`Fw1W&9oad+oeO&(xxtgK6?Jrd?4tK?|L);%_e=7&Uvi~s{q}4z<=x!)T`T@C zuYzWw-yZpRxY%C|YA~44%ObdNCL)x=tzI<=k$)V3_klr4QV63A zYR#5wquC8gQEByj>?MD7FDt3;vv3a*IC3`I!Oaz-$dUDGeerUfUJmuO6Gfb;Wh5FJ7L_9^9r zvqdcKzebmQGJ*%p(M6G)vM*KwuRPmPC(&9@aY$E*f_K&t)4Guo)3z=EA!bQH$QB=t zwzZC9pOObHpL>=igsBOx%*-1%x2SlNOMw>?0;c)%h_>40F%(Lp_$H>vFFx;CDw4<(0la?>8j+Q>g1Kus|CV5&+~WQ8YIs3 zQ98BA{X%P~ZGZy)woeEuxzLhYgHA>N-V<4RN|hf`BwM@0_yEb1BNtN+VSE_qmi?|F zhic9JgIAC_Y)7c1vS;9&887Op=|?g(`=IS`Kf}*3^DFittxRy#mC)X*e`Owua{n=R zf`Ntfk0i~e^^%=**fU>Kh_%{J1*Pli-tSA~L`u&{1=b+$Xug?GD&J3#^xdMqq>gh` z=C1QPa0+TV5z>PLuYvX8DqEV<5P7%&kA?Ui8VZ2o07Ei1t|J3U{a(-*G0qU#{#uOAlrxWe_oF zD6@?6D%hhhy}C?+**rV>Q(DHtHAHgyp2{h`DZ1O#AaE^6co{bdxj8i9v-FP-fHIK3 zl)hloI;cA6NOCK6hlRt-cG;ZA$$ArGWJpgLZOJPJKJ8GaOFVg*r#2IL#1F;ZT4$0$ z4fnQ*I4`-k2Q4}QOQNi#-H*1-y=~))W%7>e>8koPJc5LP_9feH-@qRs8R17W93q6o zGI86X=`k^wQEzZ_4{Fs$#zOL2~ za`Zdees*+Q_NqPp-a#P!;l}U5kpkCyxMhRhytF6@OmP}981^SCymH!M)~0?(z5uzv z`5cOtvYq-@;nP)%LeyTte980}ph+MLncw|UpX`LZt_QSiB6r`PWJ`o%In-lVcwLxR z@ri_+u~`OhjhUEehzL{~FTMnF6^`cB#p=m%F>p^5|G6wzr8wWDs7ble%a2oH4v&ud z{fRIxpaY<>tG!p9uRBj(b)MIIzbC>7Sf(UhUd`{P{c(1AI>ij^ed+-0X9VVGQ7)`~ zlO>&xdjkJ^LEfF9@vIId{n3c1U`kz;n$blGU@u~#hKsPFk_|IU}mhEr$d zc(Ma=X8qe+WVH~$Tq@M5^NH4Hi?>~ji_=&RB*adCFz%8?`W`b`6_(OYo;#kO$2WFO*$T#tCVcd?h9!00y%$(u5!RN0gmrgK^KU9O|lA%oTlRS}unb3ul%kQPO` z0C(ltFhVpPxv<#&)YpIH)_2ccMi=Ib^HjJ>N^2JTC^MR9^va@nbQ08*4cQ!8p|g%O zc=bVYy~XMS60*pZ8BzU+!lnP8e^$9n%4g}v|M7Y2tNZ-JEb zusD$c+&hLz!a|ROxiJ2QYza|8$xiz0MJ1T};c}&I!^ z+bYU1y%Wa3crbCua{}h^Gx|!e>#wdB4B5dfF8wn|7S(Ayf99$5;Dv(pAM*#7G+Zw% z^n1U<^7C_~>x@>r2{XnOuPUD4CPD3DLpGrF1H4J$!VXWM8WZvv5SR^kg2neVJUTVz zoq5sjv?v05eV1=Twzgm;C^fhd(0(9F7jOiP?&j*WSr}n{SLFAa zkjVdeNTr1}(g~S8Hr~C-bE4e2Kk{Ylvda6O{5E-!lz{XqjvV9Ld=}(vzCkm{{mXgo z&ej&WIKc%MH;!}xzV!#GeTyYdSYkx*bs`q{dPs`o+baeL#mxu|)q>a02D;~Qdx`(^ z*OUdJn+Lg9F_3w^>tq_a4PbIU8*w|9KlHo6U)&420G5VLu4MTSRL*}3&XK2h@fH5P z=$wRM(EXtiN*Y)Q#f&SKQGA7j!f5bF%`xNQ_n<Ov;x8C9#=dcU?8GAiC3^ zB@Jqc9u)5yjC^1i86!(y$J5dArTYin`-jkFrcuNsYxi<4O$6^qWlYRB!-tM(p`?~G zGqpKgPejffRud8uc;3wqeW>!qYX4pKsza;X_bRE%2fY@>;%%T6Il?Cka^p?3X58^7 zg0_a?d8`o?IN6;uok>iqSSGv{o?OzGYyj)g(SNsyE;gpka1?F7T}Y%P%e=@R>RyN!4$X$4vtKk&N0HobIvDHYk;Q)k*b8X+~D+o1&UjIMkfwi`PTmer-6o zj9RWAcg0g3gF8G+qC3vnDgp+`T|SwivSxSJQ(P>nKWT>R7KQe`>``fv7*?Tu78~_@10CE|7BOWI$#J?5xG8u3KZWu%4pHEI62A<*xIR0=xJE_8NT=Dqz{!>vgf#k{X zIn5&7`_u6u?shxxvs0k3rC#Ur>Y2g&uV21MMYP!(hFeo#!4xxdS>fg7@z%H~|L0QV zQio(^HIpuHMeV1fo@5D7NVKV0Nea?=tOpP9^Yb^D(MkIHtQV;&MAO(G{;;TQ80r|2U8a_;>&Fzz2XZW0=XmV^m}eRh;JiY8?Ckb9sDEJM~sWYP?HB zN?pN(|I7CwtyOqVu6OZ~9FH&2-TST}^05`Gj2f67*Kak$U6cAQgW)-?vm)x17h%UDzibRcXHxkDs!rVA>Zg)kPRb#Ft;b zS_@UTV1TIPpUBBBqbD0&16p$jcgw9Abw6ichiHe?jI@?NPaXB2i{DKzc3h6Vzt~IY zJl{5Mv{-E5wP)P^|CluJ-)$B*Tt+vrIjk_PnSsVqC6(o3+Z{G6EPQ9cy1KwzYbvn? z%6h$nbE4B)&3jDPgqgP=LbNmMV-QXZGE}#+`mRA7zhLi?^0k7_#tgdEn;7}Sp*5we zjxAq0eJBbuDlH+A@P~$V^^}+O+mk=EzdAF8ypGN2ZYbWW1OWGb`Z`ncth94j^se@; zz2afIwLMh)XD}FTe4#pZENBjYAtC<6$D%+JP?ceTV+YSfpF|IOA`PE2wPE#eb<|w!NJx}@vHejgV3YoR`~C^OJdO=th*Q*v2RaN@A#A7 z7ymo9<@h&ud4!J1Q_l|`2L4jLG}ABAPTX3j{oJYM9c0G+rCJvyX0m#%l=qc``#0K9 zivg-bEn{a>2?sMv;zSdz%Df&*yI!}f1*Zpxqm&mP*YgJB?1!}2+lmW=e~tr^D;nbb zRnv_E1YzurLF2oL>M6?^r(oJYQ7JtOv6Hc)qMs3c4HE#x8q~r`zPz9@Z_hbgzUW`? z0ZmfSnw8&JIMSp7w;md0Ent!FLhw`!sF2J_-_EF>AUEGnd^y;!${(kFgqMZAHhuI8 z6ARJw3|z;>#vk<}_p&4><$$nomANvC9;V=Kj~gp*j%A@k5Dj?sR3l?@xy845ee=H4 z^oh4wa#=I^=J^AD%e2sa!9#L=J2MgGKJSm1S+;t%{Td}jB@zXtdo;Fq|D=`g6X3g< zCF@tw^+-?KK26Uj>(Jj}a*nwHMPhC4V!)MZf9UP#zNFRTk6s46SQ+w9mCS1FQO<(} zrCC0H%&T0s0kH0k1E5nOFWNW9uX3?kTK203ZIaj7*Pzauef0>_#!tpRBLMK#w(LM7 z>HXq>weMo4!m706WTfh0zte~O-*bV1Rq#XYl2ZZVC!=lhmaIHXCR^Cqb@aY?D9ugp zQZv%|$wzvvOPnX$=*NLj^jxEN^ie#*2-Z|3lfjxaWz3XrcOR4b6(3#JAZhRFzgA~3m z1*0fOrStLED1Ks7g`K|3tGn`KPUMO>r*k1<(#p+wuh1Hsz0mql8^HtlBQCNUjh6%c zjuE>k*xJCH6csp>Kv(DV#@R*lp{pTZ>vA4TP=J{&+ z`w~V1)!Q|FS{HA)b*ZBB1Q3wdRFEu=AtmYeA#<%-m_!Aw0+@?WFVLmD#}ug@FF*$D zcvcW-lgv+0w-vW8vbG!zui)v>roft3$RGNo0)ZV*a5`Cx#+rq|$cVpXeqPtNyeszM zenV!8K5MCPjBra#tsPRDH%66O9M;o|4?@RqPa_T0@Zuj>zUY7cgeqJPod(-ZYym$S*h zMhPERtuo>VG~uA-+oh%V9xHBxo1;Y{ZLz|E8!UK2|wI*VZ~B`%N?5=b`-YobU%C>9LyzA9N?J^3#DX(>swK)gd7mQ%fB@i~cl$Am1N z8}CihDrdp`xsk(0rl zc4Am?P?odsRhz2cgI;Kt7b#eP$}9WGluavF{t6!>kQyU8P6g1Cjn7MB&_0?u0rUj; ztXs*z22SAsf(yvsfpG8rb^Y|ue;3==^qNc?{@Jt7;_e%YtzTz&3vU$p zoBvAc>Hef1nf(h6kY*n%pA*O^wJ-PcfbfJ*9!->n{qZHGIlMV*>*7G0p#b~KO~{AJ z`%CwHHuw(

CJEgS`<;Z6FO{-b1{<>H!D5MvW6l<5ZbKLxZ8>M*YYUJXYRH_fnU8 zMN!9(7-HrUhD43z+t7@WR{^f3jgJxBP6i?P9YIv3y!lLSYy33zE}RDp-v1*$S>h*` zJMM!<l4}-*O(QUpjaG<=v1qQ5${7i=1&+42;(la*Z21`+N-mrQg)#d9X8HQbB!pdsgLp z)rQ04Gx|iL$>HvL@&4ZB#KpyRJ;wL>B&!k*OL+#iQ4TXGStw|h9N-`K_-o}7T_j7O-Zo>Q1wJ> zi)*DYSu(~w_*WU!Toe_w)3r{fcPsB`|JrgX%1P}W@)as1#b0?2VBl%}!ESp9`I@Zq z$2fwVuS4hcl$XF|_8qJn#6|K{|41Q()N#{nRWJ!VF7!$WyTLUd`^0Ijb@$ISkC%)C z4bI43u*>&%Grhf@O;!N(=F;Eb-g@`5r!|^dnAieRPekWi@?rE0yQoX2!|cIpZoe)~ z6{q~`SFcgd6{h6qaZS0|uBO)&6Dpxftx~g~O1${V!geZ-Q6k^wNytxLHSe?-avba1 z)-$O2ej-{aGmisVaojWQn2DT4z)Hic|4|MY>b(q{t_siOKNshpG`|VDr+ZCnA9Ja$2d##vN9} zmJuvZaedHpK>6-xgx{n4gv4K@UPav|MI|X%Z2wag4&Uq7(5#z>qD5I-Z!=*Xbh9w5 zB(fwOk+7RUnDR9c?tyP!t%hq(B=fi#$E98;{pC<0=H^iRyDHYoOO17c#z24 z1@|cESO`zd0L)B|XGHd0DImyGJ;*||Qa@KUrRGnVja&KJM4vX+XFh9IQ1V_AUz&Y7 z;gHk3f%;H*LuAkA$Z7HqbpmjP@=82|I($)Cm7avZveX4#Lu3}9HwEYdT}@4Iu&(<& z0zqi62mGeM)6Y@Fr1Pp+u zbAP^ml}{-M7&IWsMtqSWVY^g-(e{lKYI}di^J)A3GENs*Kbu*Fjo5JTc%-u}g;Zb> zT-v8OVRUPh4e=H=8mQU7Va!Sa#c9cWq|lVBrhDn<6p?$6x&MK>ce&-!QlubbW|s~z z%J{orx_5=W&&^_lZSO^6e|!y%KW&jiBLSft~H}U zo|8-FqX0{o)r$R4uBVk3Mb2V7{`nK0Ig{{1da8MWlak|C9mDcE_CG6C;ZwO1GVjLa+BKR?1WZ}>J>aW!evPBD<_OMZ!_(L- zRbpQ*kx1@W%V=AR#{m+-0H?uHozwd|%&o_BnI%MYoofujL_$^XRY!14$t{6w9We#~xx9x?kV!>=5tt;)U z6bxie=pboQ2jk_#!tt%|f1bP;JdWvlQ^RYb8r=iNx--bKFoHdF`W`I8RU3b^;ndqj9gkcW}ZE4G(aB*eS-@Lq_v~)4VwY`zJe4iZT zdj|5k_GcUXRrzflF^~mfmRjKMnH*{bEsTUl%c&xefo4Qw>?gl*veXjgzmSRQ$Np0& zNn$V0zMk)->JXShZs5|%rN^2jG@R@nk@(hwOlOk|-{?4WbatW2R+s?=(z+f^U(?`Z zwbem<4fY{eqD#AVqNjAMV_fIl)aj3xa^s>y_-q;ZdFT6zO6o;Z?9atImMh1M>*@!# z^|51IVq?bjm^7$@gRww33}<@dflx}FE9{yHjgp<2Dt(vR-a&-4c7LUaGroBtHkne&;BpH&dbcfchz6P{po7CN&o{>;%nDSq^{j#&=%QorhBVqRepNx zq{B5EIE`yMpY;5sm)n(g1Y_`) zG*f47a{l6=tplb4@=y;1JCjwn)diygKyD!I0BR}&) za|^NkIeHBnxundq8-HuYgsKu6E*fw}c1z9>YP)%czdxXsnYJ0ZvzjXMdr|!<=qZnS z_{3On@GB}gSa9EQ9tsmlI3P`4{{hk>$m|N5ATmv4RF}JkaJtwhMRuUM+S~c~yqR$0 z)Ei#M`#S^GerVtVq?&7M2Kh!IdGxjQiYb~x4{};AL*2n#@fIw!8WZShGE{${z+RbDrj+74xF~_AErp<&Kf?%&-&BT`{ zX&FpaylxN98V+incW+HPT8I9nIUpDdgoT+Fb+hGKrNEi#gG`R9mI_NR1gAH@g zdMviWa^P-i1DcZmp|(6x21ll}R#EY<#Z$+DE3HWSW9+bp|0U()nkgHW{5-Q$-c-j` z@AMZsakl-DC{9$0Z`a$h$+hgE=hpTymyrnNJ&mop%a4nl*luZQJ89oY zSrs`OZwP5#sA4`ckBbx;RN!@tsmb!fp|J&5#n01RhDh^OMbxBd6Tq$PDHhE2DwQ_S4o9hILC>TYOoWaQYO#vaBp2!LKfD; zxqqreKhxzHf`P$+oZMov`h>p@ST7PS^zAT{Jxx=Lzqz(;ehj{Qye2Tvt-vSNUm1-8 zazq}!cCll#!m+MP`;A>J|DgLw#3UjG#fuIqbyQkGuxn$a5&4^fNX|u2FPgnMy>&ArubZu zL=N^QGZjk99274EueqkH5${(TC);0xW!f(Dr$cB;DuL8%B7?DJ`K25{3g5KS0)&_9 zPx$k#YW6s+>pHHqvMs6UFpH3nwH(7fVtPmu-Fo3DPt!IoX0D;hQV1S6UiCR8MtCSN za1Wvbd@At5h_TEEl5n-9rb@5hYe&@IyiwvyN?BJl` zVcC;f@IB--PtIIDE<{1iF|FA(@33#`Z~Vhr5=86T#wqqmC-u_M&*~RevDPQO6>B$c z=I_@vgC?TBeVbeBzE6Um_byZ)hajIvy|Iv<$6cMu=L;P>Sn56!zc~%B97k|-bIH4W z644-v$qXzZVNf8J8D3aqto^pZFcb7aOP#RyS;05F0*mp(%DnP$yvnBp+J>L3x53zw5*Qg2Mcz31W#7fNmmJF_%+N zX6H8vEGJQCTYG+`E3L6%m!b>2lNE5Gr%{DcX-U|YJ5+@^oWw}ZE_9`L!_OvM7Azps>LTFHUM(16HV_4cawWdh(-0>A)PXWv??>%Q^WMh(N zR&9-L(t7a$Lr$x^c#GS91Fw3GzGqr5<;rKPm;tslC0%}C`P!7Zenhslo}#~$2gmf` z5mC|sv;5?-;)z(L51gRnkl{*O_7VH(19%H74O@$3<&wY3Hia&`-^b=^24aMVTn6#* zMEFU;N~0cw(BF)FF>Ud!G69#80Vrgo^)ocniKqD}sRo@O{PlZpNnz^^Tx-OK1s?-r zB&oL?xgcFK#m7%RgF*EkQS+fHFy5_a>#d03UO_rGt)XL`kUQS|6VfO}NNRX`%zBwE z%Wywdeiu-!SNDiQAmBP^QPGm0RaL(CaS5kf+ zsWrlcIks|oV&Awd9~92o1K~_N?2Ah820!9f&JT2KS`F4P)&!e2-%0t&Y8@=pM?53y zSLDpF5snk!7${Z58GStM%=oZh*?M&J?kF`SC8q^`(BL(MOkh(ta{VK>rrwe%|I6>E z@6X4_EIjY66(b$4wgfx%zA*sNWwH!tNv@)-%tXx6`r(jxQ->mDE$h&1hJu7EN@BfW zS=W!(!UbA`{N~V#je2ALf>89S$ihrF>3GLZ}< z*Mfe8SI@l|C)}V~^D6bkARyk1XfeM1D)^L(%jdGkkM+Lo?tF3gH<9-9yj8V)z(z!} zhbDq?cDCp^T4-KUnd2Q0-Mni7`c1?v;zRmP610Qw+Bo`fx6Q6yv+4MN#Ht?RX?-Ef ze${yy(Mi}6abJ{OD(f}xHY+VKW@o(xB@y{pypo_S{Zkw5PTEg4;LEbdva0%Zu-m?W z%uuHL0upeUnT+f`U#puqgeqU;K9?GGOQdL5L+pU6JkbF}i;L!&TSs0SQGAVhqmU;G zJl|f_-X%L6pI{Xw5?ggpT3p8Kv#iEX_}({}_KCb(=&4kyAnO}Nsw6vDtgxJ8PDghO z>3jm?nMH}D`Fp~_Jn<@zDgOS0#pkU#xK=N;#DV>(j#mkg<~rx(e#!w#hE*jmeIo*YWN@l=BYZ-pRwQ{(bt+B_b& zI|}2e{_x=OF6xD7^6@7}e)MU9_{UOe?M^#Cr8zzc*v;jvM3n_8(0ZjrKC&PYKTAwUg;`h+0iGX8rgC0~GvpJ-pepUce2Imy!iWui{>03wu!a)fx{i z$UZbP#Q2K!$)7>&V$G!Vn90~%N&(NrTeVC?FP*SE^xf$|98+B` DrD7CCZ<$lNJ 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Þ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

e-|w+x7! z={GOsU)v3Te~6*&qNPplqtm0aGz}JL!q!eeqIp^zolJJF)}tc@4l>-+zDT4Zj@p|h zsG<>WdWhDwg-V6(p@5ZOhz(!}SXlL@Fp4}3(FvpKfWe8>2x?(eVhtG8)xl7o2Dv^j zqA!JXD$Fx+vt@O|up;P!Q83{3IXV^wLYBX~0|uHSb^(k+v@nWWf}xqp@fu((6QwZh zN;TIg)nmZ`w%ep4VPFVjyA^R4&A||zO!tooBYx3yGj6v>M@h&YKin#}7tN?Dt5CmE zG%2?0CL$lF-LP?0OsZytNJ+Mb!vC0!yotkcy*p?o!%9Si;8jVY?LjS1W_qF)hCF_m zz$nDQRuu7u#U#j8n(uL>k7}!Z;km_%UIK zctZR6-o1}L{rtD&(e3ZKlbJ#rbcOLdWN*`EqWaZ+P$vTC&9fQXAmzp+MW)4y_LBTo zZY)uKRx;F*PSFc1Z&*(lh4*%cwprMhxa#lgTZRi{v zcehdt(YqSOO%Zm$dN=C?bG~0MUr?y;ZyWQ8zp&b97hruSFx+~?XgJtX5i-iBD!=;D zi;wBiMfY$DfLv}JBH(-gP}7&FY2@G@s#tmH&JONh3!`HGEjtZP})p5b#9;1$6T zBADfWzI*SZPrmr=d+!{29vwK>!(?DCw3LHKU2f^@GH*x66{vk1XiYa~WfekyT<1dJ z#fW_%FB4xRpnd5I7tNEl!Fmo|MtO`gjKKS4=25BURu8E#8%(xv>#d5gN}p+ix6Fp$@0;qS#c2qI{Dtx#*p zM>~5f3~t&zyS{IMk$Wh(Cqi5!jMam`ls~g6of|qu?(%zOw2Up?LZ4k7j zo0mNq;p&jI#>P)~?|(>pbnk1Au8d;Ye*#m=_&I1dgoL}h-80S6L2lRCg(nDnB{Y75 zaOeGOVi$bFM}$9#7Ad5m^$J+2=PDosrMK9_gd!?mo1F5F2YYrWjLwl3V30#75)lkO zX7os;CMKpu`=48Ij+yWLraT9Be^0c@<5rCF3*3pe^_^BluwNH+9TdL%2jKbV>IwdH z4$P|$kFO}P!rMT^KZ*D`m{y}uggwRev$lQpbFW7rgqu?|+<(m)IYD=tCd+(1(t&mPfZ)ctQ+-C)N(R1*cBG=EW1M zlB*8F9={}y?xRmW|K0oVG9H~)i*ehawZQ>Q=P^4}?e33VaBsZ^@UA{L?u|9m6LTNj zIjYdv%b2C1!RGJhK+YZF_P;Fd-Oi+m>y z+wSUa_>4?g0l7ggTC+5bB-*rsFL$`-4|bd z^X^-3eDmG+(1$+sp$~o7DBOTY*N3IyHg@W~4?)=1vb!@Neh%K!?#ijIT(m9><+q5R z?%g8`gUpM=gZ+v-TOd4F!QbOSXYr%G0aBpnZ}>Yr+QmWP{bHf^e!!g0%_sllr#rYiHX`FRCJ_$?v;!h^EvU$-k~-9LLtsL9Z7=`A;< zZ#>{SkwqqL?)i-cvC>nqVr1cM(6xRV+SMO_!2*I?E?rDNp!cl>hR>PcdvuvImtA{w z5Y7TzdW>ceF0Ag+{r-b@Z;XPx4}IuEAO88m1|FR;Fho`ac?-NF)s>4jgK=BomX2Q{ zp3my4RIJ~gK#^BS&cUjbWPg!yKX1v$gR4i7WBqnvR^xPD4=6*9eEf1=mxcVUF^17d z&cPgv1tHA9m@lxZL?9C6(cS<1$8L{~*ZJjiW({opk2z`ymJ2el<56_{U|wM^<63p!)Z>)9YwC)U0$UeH*qk-ZfX^c#pcN(8#2A?Nf)Hj* zG)8?OjjppwZL`jk$zVMBb4(_yzVYN7{(*^cNmu*sI)=+hZyYHsjYS{ZAG4u|t zVO=2O{h(D5hnyF6r0NpEV=T~QGK7psbf(&@EY0#GI1Cs%G8TfT`CNwJQH;2DQ&$S< zRPA|7>knF1Vq1piSFtZD?V&Zcj|=a4043KR{{R3G07*naRKv|S-neeOvce#;A~i?( z=ffc^(f<@4nGqwyS{~ir?#{*KWr6~7^vxY2XsgVK6#pKiU(jz>)-}OE?#8_9fUyBb za}VPQgs~aID=%xQsE4td2sG{cTB#Owvx-M|?oG3re4GsCVI^4B@432mG8Ii1^}I&O z6`s(DlRdv^a55-)^6|QvP^$2XOT&RKFX7CPk1H5M21YYi_j3-)*hiR3@^Q`O^`wxG zUwc4o9$bpaK$3y_Dz2MGafOSm0hR?dwkN8a^BJDbVY_Lnap`NAL}yYYwi?_Y3*QT? z8$6#jk7iJ$(bhncj}J?qajrR=5)7CO@Gt{oBAE(H-%pgh z19!2QfB5ld|MEeXM|XOD{^eKS%AbU`?X__vG|R0dy3_1%Xb)ft`MgoyjAB9%&|VoQ zYDv4HHi!ygZbm`p2FQex03h_IP+pgZnu!~&Zy{QRV59v<=Nf5%ilMtf!&B#!fmZpb zd?S@<+OGqHvKwzuQ1jA40)71Nw5&!Z^<8 zY2HwxHNsw7EX;mglhwE(pkQYFoE66`2bp6aPnw6sVjCkh!MJq~bKM*Ek>}>PWQ&1~6CHnN$s*%J^VK z?7SHr>Th73NRQ=4S?5BMkqEcbs#>M7Fu?cCRg6YY4ysYyyrv8d(>DM$e~Ec6tbeN! zif}y${Pr>n7H$OTK@{r{^@@-seGVALH9|}BQ-FY6-|%NCgea`*(UsiM3C-RMieNhG zz8#{bTclb=lvr>XqP!S0TUMFjxn@O8KEvfO5C-LjFd~Dm$&++DhVitlW*H33vwm+3 zBPBZbDa+R*A4feAb;0088^BO6h#U+px^5VbIGaVN7~b<7=8>m&Nd3P8OAUm4+A!Zk*RV=hNzbBGvwpS0AodY=5$K+`9HpT;kjqKJ-R>t?W1-9 zQEr^z(PeWnhutCW7sAKCXquyo=3+sjX0MKmPXg(@%Z#?M3_4^nOLy z;+Cep(|Z`~7NGH91h~a=gly1WnLbgeGcJ^ks53Iok7sEKWBuE+fZD1P%Kmc8?E+$3 zRhTOm5z_T|v!e(Fwjak?J$41(rLgV_x&vCRdIBd0d_M_YQsZvpspUpP8nvsoYqCS8P6M2apg?Z=vg~3+abm_f&-&= z&owCIOToyQ3-h}Yk1i@Ji#DiPoUkKX=6Odk%P_zd!q_O)k|f9@1k9?p8wRWo13F-I zf?t{;`#gHBtda^hgMpb|2>G7jClvhSbw#c$u4!%xUO&yKGR#_^J}Xd+$e(KSso9*@lL`UR$0zs+&9Rw)X( z6d9{2E=}LefKe*YYu3`b(aZZGazj?0h%Ai8d?^r{DhayB2+a2J4~Ucpz!(JkEK zdK*ribY9D+C-O*Sv=d6s`rf!0mvxnj%3^N}ld>69BHRe2RK@NX$5K>Q(bkE8-ElcA zYuZKyQ5-M)FlUFS2EW%gHl8+8U$lciYUVX#@5#O&cS}i9^HTc zkH5b5%1c#Me)F9%zjQwlY9C`@w&p@>N?z_SnW+UhbKC_i3T-%AX9-OtwLhcC$Cab1 z-Ko}LRFr6~pK8r|>ZOme!sF4d1I7{Z;qv@N4*&Fr0R4lCHq=9(zFcy|p zp>PVa35DB~5F(n59Kp2l&(LP*Q-`<8FyBV%bEY;Cw1&SzTwp*J54K1F(C+GaxgwbT zKyT00Xam4)n)yC?KxIa8bA;QA%GXDvP+9FlPV)J8LTf7S1sBAMp`fZ zMD;^voahmO(JGeBuh5L}!d{4Cx`+O&vW2E!&=t11U3@K9{aKwW_NEj)G{BuhPF}LY zU6$)+4%l`xPO-2#j*y6t$(ioB?J9Io&UV9>Nw zcEf-xfze%MPzK3WAru?I5Q^uPhtVPGf&tGwb-2`{d+(jMKL5wpwjkPn6Z_+0Yaq$T z%OWNpKae7MO0JA~$%}(=vr|j1@Mv>Vi?-`#E1|a`BmZE6RMvP<`4R_XQZ@9(h+tR| zN)ZQRI}c;4ZX_3HYQ$WBxQ*K{r8!dWZLybyh*2Raytz~`9+cw&f5phSsKx_WH$(FC z2Gv!<7!_rjiagEy9vyjfe|zoamtJ`O*@q90LI`pdARq&`zL~x*g(9%WlY}u7};(vmB09BJOmwE_yA1-!k!iN;kzsuhG@@@^dEu;3PhYlmtd{I*d!KU zeNnDrMc~>*IY(!cyc=jlOYRowO9aQvM07Gt?Wb7H3DGXj2dUisr=DLI1mm~~=bA@t z39Sk45`^mY^9faoQ5-Ld_VxUX(EKQpeA@b^PnU_Hb1SD~l6=xd%p24biM%$1h@wO5 zp0y8KGVwUHoiL!IPs{*2;k0p#N2gm^gn4-(m^#8(Uhj<^u{edWxCFa83$_~uVt`X`1_{32k8^-}dPo9(HA;hDdHX7l?ys-EBKPQwMq}6oI#Tmoy zjH=+N4myI%G_bW@D>z48ThpojL)Xr@(oT%tbLhjB1v6Om&$|0(S7{Ru%{`4rM=No^ zyS0)qCf8BD(T2Q724ZP1@I5+atU!trf`_7Rn(4*GAAa{i@6q+44}IvvlMs53?p8v- zQ+E>~>d^W-I`Zh;9-WJruCFuOah?T@@yR{6S%$GyZ8y<`h|3e+bJoofkq1;nJ5HK= zAvnD0mm$1I>BttLfcFGqY3PiE1)FafZRf&DLxNKWV8=nW$N?Tof`+S`3%lmcC z{nQ3DqOT=zt?4``)~^$`lE%h&CcmE#V-fqACfz~joaPjH-@&e(e-DiafABj-AJz`S zQz^7d8QkqAK__Xuri&u7@pBt=Q3n3gaD$HX_uPEdreI^ZOxUpl-V%f#^r$hqX%OFe z>y5|08HKM!ANtUTKJ;O&(0g>Z6>jnNOP;0-u|wo;n#iSMI!|YYHvuE{=xC4bwU<+m z&dWzR7iuR4;{$lsH`8C%S$8UiAzBv&+zlPZ6c4RC|2d>0XhkUoKbiml%s6e{W*sIj zAB1~-`a$7I*)08>%to0AoVL(q(QcJrMd7SC!JL3JJ7@(5**LuD$_9TcG_LtY7jKC)E9PgBWS1&k*er`Ufl~pBFvnoyjw`7Ts|HMd6S)Y9 zhvpnIM)^T^vVBxQSRl8MV2co)-kSC3Fqe~Ek4YYN;q)GQvyi;(yBG|s$MNWnPflxn zBmQ-UbfUSffISTOCBe8!gguNN#s)C_u%bt|shMqzBF@_H5N+loY!2hLCY4*-sZ&I7 zRVl_*pc2aih=Wp$SW%6`QVh#Tq$mQ7NJOG}-CQn|s0!~DKuJS!Iq!l|6=FQ#VMv4- z7y|{P$bLunSN}UYHVEr-pk^u)`kQhDZQ|Q6>uPeJid|2sL|!^>)|pcEDtZ!K!)lqY%}Xm z$$yGi8DKaZEb2CD+tl`+62EE8t;G7)77k#D6;T5#q2?}$0ZPsouPop}DsA}w zoEf4)$8IMgu++nTMi#tEDTH^Ss*{I1fqq&IzCDO;!53n4kM7~o(O>@l$^PzkSQKo) z?A$Ff41t+cm>2aht`A0cSyv8Yv$C!nA)5*wgJFDK7@L*#I54iTtX|X+R`lo^O+L<> z^f+xrK^~N9I>$wWqe?`q-%d0hh$`kK$LT^AHS#=YpA`zAKkcR;p#_7CSL@-oYM;RCwN_4JZ_%flw*~Nwaj_#!wpV!?z z3PBoEYgkCSaKjhuqt~LQF*Yl<5@~TRRFW`}&{ZQ*jjbJN?J-c~k}_4}`GHO$3rYJM z<|vFv6In*9+-P{Nu||f0MU#(fis8s)Mkzv_))j-sNR_$O=;dV`3JJcp#L6atP1xw% zxK((x;H_EN?oesQPfPF}_8ipk+C(mG{)_{Dz0g9@ zE-+f+@-)K+A*Fv2UXmsN?xphT<+kq{L+$Ey4Ga+`WofLYUdYtB25fl#7tKx2$P{eq z1H7nKgNPS3*$j;c__DI8GB6+y-ilNw!lW#8e2^xx^|k}e3(p&DjC#`!AU!%cTD<`) ztb3{#O_1$2XgWX>pf+7!PXb=B>nCco)*by2!TQ`mu;An8nwMOGPo_35tmx7G+n@gO z_M5Lp_6MpNK+*mtO1vIXofF{|msM|u5SNJ3!E(be>SZvR4Rly9DQi6#=Eb)L3|I!E zUK0j*sn$~z@-RRR*mYs(w_crB6b}Ooj3xtvO$DvVaqTcL4+9;HCWWyCVTTU8VAPwy zSn#3_7;RW}k4~BNr>=Cv1SkB&?S?mN0%uohaIlkgx2|40>vzXj%B z$fIql6Dkqy6Le;pUn67h1r^3969K8`=4k=jZ`8cMFmm@8Xb@#*%0*zNm9{X8+}gg0 zCi(2!x`3Azdd2%cvAMZJlo)2@L*V+nmxDlGaprH~>7}*aWf%3y^+I1g0q$iOMl*jf zirdCO^wN4I3h#NS1<@wa*$OXVo2>vohg`sXPVF-Dh~s3t;(S5%-GI{ zra45kEgLne`&;-Tolpd2Ks?%oULG)ONs%zu0pfYp>$NS1qr=mY6@d309k8=#n8t;6 zINRx@OV_J=bnn0W_EU$4a5Dkdmn`d1EB81r{<>)Zx`yhqsTJWSVBj(skjKA)4lyt4 zNVYKyToXn|K3y#WODe_m(Z38rgwOk0` zkbIM2kUSA>m|tg0ukjt7F*p%9YH#z-X?e*#5gOyXNmq;Qdx~8*Ma@gzAYT>;wr#L= zRhY8uVk-+nboY|$3%7LpWlZpI{R{NzRKZT^7c0 zR8g^&nvDSw9Vj#Ro9JVWagBveC<%)T@VCgd%0!_zI=vkAKAmLqE8ItSqE&{)U%2`@ z1h!_Sp+|QJ!BNbW?dNdbi%z-L=DQwy8q&3BVH4Qz9evGvfWUrVhZZ5aqj%_Prtiz) zc&_zyLJG0z!^x;et%dQDmy zBKa7GP~7rq7que(#JtInOVySIYlzf9xdIriJLRaoMg0AnXnRi3ZIoK$vmO5RHikev zMOcW^wgEz}EWTb~o7G3+nled>!Z6(jFzjq$x+q(gXzwEO%TX}Y0aJTyJNw#P%cFbl z>8GZ%Sqejw?WS$nEh@X&v2l}B-7tz9gi&;gL?*-HwqYzmi0kW6ElCxfqN{~baI;MZ zjM9ietb=d~4D5yhER2GK0eMl;3B%BBb5ph?&fXXXfXJ0q2wsOJSC+@$4J((`f`?3d z75YP)xU5PngTa+m2=ze{COAl3(ELZXpORf-U~E^An#`Y1a{S15#96u~G< z63Glx@D>L3n-X|6TyMCYi&ChjyW>(M(~eGdu<-mEFPZRdW8u62-~S5yI+3P=RuvYwW}h>S;;RtA zzm!y9X43G8=_58g;g=OOsLeFY$VMmxg!O7aoHMh0=qd>R1{Z{AxdNP_k6uY04A5&} z!h5LxDRQ$UXW1BufZW`=nP^=Y=;sOPx}FjhTmp#O3)*p~h2}}Trw8#zvqjq&Z5zd< zMO%EXIODSm(~QYFs1RvV6Gs%LZy>~jtsSmGLII5Z+9KB9^`g6}C;)51x*pwNFkqZI zfShU4E$UzxFGOaU;2LCB+AbgTxz!L>S+yo5hgi&&iw1V*!cWTOhtuZyR()guIjFRLrx$Dq z$A~68NxD$JoH5gPRIZNC$p$#*x@abmgIkv0_(mY!j1Yv+aTwS1!zSN`J8jqiQ_UUXE zZaYr?V_L`jEaF&JYVHd`7uQPAJ;21g!#3-{qr<>C43a==)+2-lmlwx5Oc>kD%S>;8z!J5D! zzDyh)+E{L6XGxS;9Z{O#letjJVl%P5KPCqeOWaQ)iqBW&rUL?xHW7I7Z8br3 z#PoEDj7r-aR4~W1&0G#5={9KzS=Cwfw%$2rJ-TQ{LN+UGvudlu=aV*RJN31P57m3x#!vf!}huGo^$cTJkdSExTuvvnl>p60aBmDFTqCe zTqE<{s-IBAC8e2wyL`v|;zdf$SI@6=)_q`dGJaiFFc7V9&AB_P$pH zS8S$?Yyn{;6frNh=x_%>K*k?-fB4j3jv$I#S`PEo(*D70ZJ2yGye}p8CS59weXI-*qZVa&=jAaG z?3D-wgw<%0tC_urQ9`Z9!=Xa08;)upq3o~ADNtQh8lP%agx|Um1>OD8e?H3hc7Gq% zNeO*I9L;aC%x2NsuUib96rSjgRsV_3k1p zCK7}iF460{ibUj75tYVTWJ6+;nS_y-v{>0Zi&K2N=L#cZX}l{&>;Vr|ZFd@BhVP z>_2X|zg~wbmhKSPT4~R2pcq{eMspwGR3GZHxoFMvss3R2gLU`O`urbRgGZjPuS#K* zF(`j7mJo9!!`OF?XQpKwTu7Uu|1SLk5<<;9S}Jtc%reRqvnPd%!P_hhKpxHpl-7AR zJ01;&k-CZZ){1KxMaTK>b7aR_ERnPYHOB0J=n3;C%~8TE^Ru7$+q4Y{V?LCf`m&>) zj&k{B{dldcn`__Frg^;_^8JBS2}XP{lq!0le^<2-qTttW5l+2}jvfl6e( zLv7N5cEW+>SkAcj8vC56;bPc!Z5QP;VHW0B^=eR>5S3Hr_ZH$>9txaub{_)s_*NVB z;V9p26n11QIQq?)+67t26&A32-tAYBT&Zs83_%8DupY@*g}I32ydRHF zNmtA#n}6hb8X2cs7ThkQK+%38&iwYlR|-&B_?1OT%r(_vr~c;CA&v z2R>yiXcX2=qt3T_J(t$-9;016^cE2oXeP8E95cv_Zl6Hj7M>Wf9pfEFTwAaLo!Q<( zH&GmXT+L&e)JDGhSkT6^y(LY+9RqWvjs^6eG4KqWC+grh;)o%SDJ|5L@m~qX6o0T? z8=~GdyRy;ot?#pyT$ikmTPXCY`{c|2a8x25_;B|zl1WPnF+$<8+Z03x74Z|PEU!wo zLX%9Dra>}>;?P8&`L0F1A(Q_r+`8D9h@X&@(%8^<#LtKyOIJC^vpKLbnMUwbGBijK zRMQYVD-}HArB+VoQ^P$GLtNgje^yRB_54+G)I82kw}SpdU7es#*e)jz#?a7t`FyRx zP%R!`mhIOj6IN+y)NgXFU-!jXl)6d37JR!(b)7P=UcU=c&QY+DvM^YPd(BTpZYB24 zqme>q#Q>MHCEd)Vg(;Z@s-k7`=QRe#D$~5OENQF}8-^cubL&CxWKxAm5~=lx`D(Z; z#E7KI31e$;wH{V%9 zG#uWzg?-_R8yfJl`doqLN7WFNyO7YB6pE$0oV)wWY}0=3#5xhYn*H~^laI3PeSwx{ zc7fyD#`bNMixNhvtlA`z3eO;08#KLz&m9I(xIF6E_A7a@8K0RYPHCUx|HA?be%-Ff zPx#B08q=Y?9Rrt=x6iaOZcbiF2etYsP2`BHRNBpE2ZbT z6SMU=p3VCEm`cs=qE@k6x1{(|ZN@L}7^fkPvR7od^pd$~OZzfkbTC`QhJwXhUfysM z5&O_1BP7;!XR~35R@KVx?HmxJJ+v{VFlRwn++PYDFHwc z?$u8mm_se1m?gCFg_qYv>0s*XXtUduVebQRw;MT+Q$pKApUxZS;)b(L21OUiCgj~c z>UKE;bWf-D#@=mLb9`_qeT`{An|7!?m<=y*7%O?O(ERPZ?bs%UuDc_Kd9UjHe(`lT0? zp*n#2tL`1gsmhTe+5%*w3SX|&`nL||#XFv+U6ASGRHi0N;ya7Uz4K9)BFR}2yM*Bn zD~H^7ZuHR-O|nErVqL4td)By;j)cu0#^0Sgv2NyAO;*+yT6rpG27gq2_1>d^oXYWU zZmgf;hW60lzG^v;X9`4BOM0@yjIK43s^@GKE>fO@xSP;Mbx#*bu%DZm*4P4IUvZ%! zgR_MWMOPIKsJB~Ay0uDymTgfJPbPD{@Z=mW@u0+XSjN)+DWweK+gSOr!=?>`08ch& zaUznJO@Pv;;>g~MvCEzNEcho;q8=CH@+O{l0^b}tRG84(Xe!)k29y$70)r2 z>Q9iygp*SkQ8i`IdrycZP>#ul+A)#w zBP>3DOCBP0vc?Euz{baEXMZma&qJ?-@!}#asV6benL0Yn?&as17ibZGbU#8VR0eIs ziI{>jC~z$I8@XwCVT3ZWkUX^vSS1azWaU>njdbG;W2g7Z7F(8mVSJ$FKpE?AZwYLD z@RNtGnQ&|DGDJ?j^OOq-zli-THFoo0UCx86W%ow)nuhmyxJp<-k2$MfMb&N-G3i{u z2?L(ak}XAua{tU^M^KL5u-;smFw>wJIykHF|Z_!5R}v>_oa%LdEv z;D&%vx5l~CP!GK1+JGEs8?{H;Lzf(d8{FNCvwt}+j&d@>61ZUe8c=MGVUj(@O!Li= zhL4Q&$}xy;^vDHS>cxd6N?Q&OzV*NkqSXEeFIr_%_P#5gF2fVL^F)Oy6m4$_!p!ww z58m5JnZ)_}TF^lVRFK3~@kjP8jp??xwp}gNA-*|58&ciN8Vi*6k-qJLx$4Y#g$4y> z9mrfQyTDJsqIa%be8g& zi^ZvWzg~Ebk9U*YjoLS#Gi7bi;ic}=f@1=l(b+QC9<)ugz^diI6=BLss2j*&wxa6Sz3)*t zdH=-WkAJBUgd*H3wrx@;$`EbK;IZKLzWH#v;4H5tH1qoN6!gLH<#I3NsiUs04n?hJ zOg)|zPbYUn85q;y z1!$0T^F%%O6uHCPw^OaOyB-_1T*hQnrxtB>CSQxXi=DQ#`)@9Idjcpho$WlW7@7X@ zR}WERk#jRto|O;(dBW>MZ|Fv$9{VjDb21l)7&ALwQIDdD@u44&<7ZL--Umub7 z8u;K^%(Ci+{Cuurn;Z%TKo|VjBgn7*+NhC-xvw zLX`H<>KE!YT2q|pi~t#A#S<&~d&FPEso2wN>`1k5;CZbsx0jzhM4pb&jg0czW3EzSJacMpeLT3twYU0<5EV*q0>T2z&E;R%B@Odxb&6EDR;X%e* zRSXw(0bcq>`MO<5?dz`v7#nBpdwn10BYE;nx0R$a3;yPr(_EZUSqyqVr@jaMB7nX` zKg-u=#h{518Omb#qoPMAL(@an1q}Yoy2=bK)&}+%dr`Nq&e2r_XsCQPOvG&TCsZ>k zt(nGHYNjFmbrJN_K5wXwC(sIQN+ukOE}j?+F~?sP&QO09kNr4L)Uvsl7xV{qJNO-C zMMo$c>!+SD%~JMW76#PLMr2}#B3FE|1bz)S%Jlk`CVR8Y%87~G)X=%~-+;2~_GgqV zpCQ|K>;Q01i6!zqJa>34NcFBs9Al-y~l8EQ`^pg7?>bde*`#&jL5c6XV=A zmqgEZVcm}9BKdCak=^rD-K7Z_S=VS+g^B!yxE6?#-oh5jViO_vFOLN+`843cbOGz_1?RJ zdFbU!9JkI?$bs19hC~CVU+3(h0U?w7Uv{_L+Ek1&47r12e;paK%#1DZVt(_mz9b5C z_W$xnJ>#^$qnTXm{T5@h6n+N5JHuTMZg*b&1t=+I_{AOBe4RL>X)gVv_X)G4%t6| zf{(2*?!eFUM#MigYX^cv#I+?1?h1N)aq{#@vc3D*zg0mpk>8u7!Tk*Lr9(?S28d^q zZ_^9=K35;6c`)hgnvY^pTZA^f=hl<-cfCB>wB|!7SV=ZQv)EvB)5-9iVUudlZqm@! zA;Ph3q0aa?Eg=50_?4kI5!a1_r*F~2H-lAL>6MpXFev)XlcQh!4=ut*MYhG`DeRA^VUM9p-K1|a>)*2@h{>SnV2c9c&*9;v zO3sd3I9#1hVzm5tZp0HW>nccTglow?DNWtvbL4Sro681bWM~J{j7$3VMAq;`7yk@@ zpf#-=zO-J{Jd&7CP|;}?s?U0*>o!`Oa=2aZz%(@biB)x(C#vDS+n{F0rEF!!EfT2K z#HSqbOP)>jTjN~HetrhN=BR{yeH%%=?(*I0@=B}qkkiA-+;h_((x~#Suxo22C`!!_ zj?@ta{>fjXlZ$LQ=W}Vf@8gplg2&>@$J9XNp14296nviUF&qvJCBE69!xYDF{pLk( zNTpxkKWNQ6q%jC~`YhY@eOpq&UiaWa>n5|XHCfo*w@#b!xMd{2(mqa>kjWC~E3|<` zW%?vHkYNf$8~@w)#w*>fsRznlZTsXhWCkr+UEY8*XLlkFX|G^2ZqChEOJ%xu`X*(J zn4iodTo6{Mu#kKXZqbAVVsTzg*RTMpXa@tscb9THPOqF1PeL*b`c3$hpm9Q3o?=Bi9vAOR17wAoa0&jbi7$tZC3IkISCkX($zzW)W`^*lCb6FtKhxw-`13clh(s=^}Qgq z?WoNY^*+Y8^Lpo2HEj8jZDVXq=(N$FuU^we(5Z&fkxc->Hd9~{_oqdv0r^`rIa=kTb*KMemoj!hx2 za63L)mk^R<#=1}=dg^;+VYF_HOdkguL%)}R`#z@r449mr*M_T{}O8xdLM zMQpQuFf!Dijub z`#sxUo!u)r+l{Lo3v>YqpArHBL0O101(H1?G~1YLA?OzzqF#duJqetO{b@i6cop3$ zi9GyV2gfDf@(n-4DCtg)tqWW1H+Iy5aLtWelU(^)Y6Xlwce+s+^Th~^f<+u!rQG6t zbHZPnZgE_}^8|#L+QZb&J5`D@F)ivcma}bVP0WJw$G_R+W1Q3GS}#i#xtI=6Dyv6+ z<4)t^*N%Htd|v%|Hf4te_6cI#o>=IjxxJ+v@sq!kM@2T7iq0cMYI_%4Gku8NBqQRbZKw;d_0YX!}0*+{aY8$7-j|O?lWRB(>A+EI(kT?1D8%kSK^LO(j zltGHR5JevCXRD@s*m~qja`;B6oH(`q>T(KcX_6SQ4qB~RXQo;*ZbIHq)WY-hq*^1ztK6VNoI+z zs?|q3rOszlCWU;RJamd=dj(a8l&_2 zRR8lDeA_3t0_%-NfDKDwmZ+BUJxBIVH8|Hh;utrc|#`yHAuE}m=^Z+ zLxFA`I)q+Qr@H=6C(2)kVJm}k30aAsM5#k4VFE2ok8j`km_+$%FW04m^sQ;=Y%1i# z)-pK?j8R_y!DI?6TtPY=C4Ie{QEVRcF3oJYiPdb2mkLd?F)FX#v3<7sxB~lIxyV~~ zw7&UHcC>ua?zS1J)pQNZw`Jk*+(WvtwB0g`PziInLqv(bQkhKJODkD>@7 zq(2Oi4*CagrkX7^i!m!X3OH_wNJ|=DlwBTrH;|6dVC3*aCS_6K-8^AR|GJ6e`0CtP_+#k&y3JtQp4j*2Mb+Dr*gbSm7ZaH6n6uZnJ^c97r!PdILo-Yv8;JF181YE^|JX)q|2k;_f5dR_ z;aVNGc*|JpPu?8;K9zSeCCOLG?AUxOD;lQ-JxquA5MdF?-M=kBm7(t{D!7#Cj26vO zkOD%CVq~Z;uKTNN)?Hd;E{Z0m=uWd7dzU3*v|Ca`O$e`@GVDyC@i>M zw!VQ&?N-(m7ao3Jfhg$~zN0qyfT2&hVGib{6*$$Ng@F4Qz`QuAUgmog5K16lPR(on zWKdTXr#U*>Dj;o#L5oRFkvnR~+`z}0g>hy6nvq6ty$EdtFFWl+l81%qD9Il8EX`*v zJso2ESl{-c{~tb7V@gj4FaK?Tvj>c zroEuI*Mzb*6v%tZ%uZ67?7-@-Yb!#=#6UCP-eRbD(WQayy~{=tGA&Cdb>#i(qgGQx z<8!7w`?6gto6@^MYuLcQtSOtBW{QL@MoSm&F!W>h(p1Y&&3ZdwO|%OHF_9;Czw%_G zIW&Is(ec%2Z@7rMZr4jtvr>;V%tZBIHC7FAS{5hVI&-jo(%v0XDw5fVwM7vY6A4Y$ zmGw2&A#N6E7!~lY4-4s?KnR}hEj`}1w8w)=^Ky|>%s`_>Vi!L~R1(^e^<_;M6UU5+ z*}p>gA+E!R3MINKG|V2tRumRUUXf{ZrLN60OM3nimYACuDX66h3XN8Hg;6& z;WRsz>A=E7z_w(}FhdKx%4nRh(`-0p=+FF&JAYhn2I5wBc69o^g|}F7SBJjbIG^_t zSK>mb{2e7`%`>-?FAg^iJ0iaNlbb&YoT<_`mQyX(nEdF&*n|t~6mt$zm-%ry_ScJo zU~3gZSo5<@2I(ucqX4XkU6);(CqhN~v*Fs$0ak)}bE1UPQk6FNWeV3jXJI<3?q3DR zQtQ9O0ER+0QPoq$3v?omw$7}Gs0%zJk+6uFCh_J$JEHg(0^c7!r&DC6o6VkKOi08t z#?tX8fJ9E8n_m6@aEWms1j4N%`k&w*{Gl5P!UE)9x(bD-XQQf?ioc3>FqXCqS98M) zqv!V=1$7lp?i`NS3s+~+9|bNx{q6ktPmJHL~TKPD2U3gkvpmFsjJv))>nm~+(M$Mo3Ul{i!ScuUHbv2!yTca!DyVN~dz5>L{fT9^|53lA<^$1f#m#<=M5mZn% zBbewEufmbK1(zW@m3P2JwI*p=93kZJaVkrEy!;T-XX3t~`$gWaCVqbX&}ITVS)Dj3 zKBOxxkbGyw$~*}CceDCriv8ezY{B5^C_13q4MKvsB+vZa_cz57thrF^$z=-m*9gDK zBe*IYxBDl9Y{C6NGR78?Q0r*eB`#2cif!b8GRMx|_jTUU7j*`yk!6vz=db)1>~`|f zINzA$=r0;R*vr`C79Spcu|)GWe1o)@^VaY}&C8)Q}d!g8AgJ|Mw3 zr{~Z~Z~`hWqIDqrzCGu`Pl)T^?5__tC+x}`mpMYm`mKc8`>|F6GLUCV~`#1-C% zON6dzU+yGLBw^5`75dewfUSh3tt);8pnd*4SZYo323F+aU5Sk%G zy#7<3xfczn` zg;Z=&)1FN^v094C(<|(r1jPOKxWW}Wkt);{_} z&>DhPdtXg1e}^Olt?7q3UWf_gmnjbalIyhmMblCB4*QD44I<7$!m#IpfV+K#1ZFZJ zckh|HeiZE}>+q<3qX@=fY8Q*etJ0;q+>qo^X4mj`2Z zxmf^|Qa02bA=NMqVfZWUBD_`s-gOf$gP2aGMi$GG=d|i+aS^c>+}%p}foa1dt7H(e zAmfWc2tMT{*^WmT-M>?l=zgX_1;dPw#8NA?kzz?(uplT}Jn3m_1wT~MlfCw(VpEd)-45^J z@BKAuV)2rj**|ii^gBPAQ5C*9njudRdEBnsaFmh(jY0V30O^C(sei+Q4qg03jlacO zeO{i44E_Hjhj4Uqvd!b=?yvI2`wAeC``@da*pMAi2Ry-(kE@4SIorh&oZF-gAGZ#@ zxcv^t79e=M>&>E%mlr^LE>Bh*Y?T@K=G zl>N`|h-OFEJg;`*2A;0lC{Khv<+8|PAuR)bXJ=E4`A=K9P3wy*E5qWg&FzmXKyREq z)=li5QWTv5u?Tq_QcdUMG`MD%v+MbK^XMp-Zyhu=u=C;WV%29B8Rc5VKO-kESADDV z`CwGl10%WQ8MwvC$w|j!?*;i!Kv!^-gvg=e-vMxk(}2gw0aVPOVbh$MZ7389w0Q~W z5f!`inQdF%heO$Xk&D@liwTjL*ZW(lT{x2eTFDr6U@F+DhtZ;T+O2}^c1I#@lqI8F@fA?ZPe*BA7w0;CE zFYlWAJ}NFClITL!5aA#&nIlRZub%_xoNidkao%IEdD*BBdK8!OpY^mkbcv9}3qXct z^Zmu4J^`Y(qJZ}2E1XyIQsSC|$ObB~&KHJU^G_mv`Asfj6k0_9p@ayE2l}`Lh$%=`i1WzsL;KloZR@Y41u)AE{r^d^ydZ zD_*@$Ot%G5Lj`lVGi#b6a-_4z3w!rbuj8aJZebyZeuT`5&{;==*Qf?uX_97$RPuSxI;w3JDVV z+yqj2dHGwRNPx~Am~b44QS@MnUZWz!-03I5@BDi0=d(io>}XhtNJhQQgteP|nwyLn zW>$#&s}RD^@f-&iVT;5(J9NQ8jNCk67E}{8&%dQ(cltk&B_W-sUto6RU410dTa8GU zv<)QGM9gBz@z9sZx7G*U42$z9Mb0rFl4KFK5F+cz;zc;?lxasLaMhD53+GmpV6S$+ z1(5_v7BsQVq7es&h_7~(X9Hpy5X?KIfX7v2Q{g?Cb12k=3ohz;bBt9drpp~bjec~c zlm3}|wld(Q#|O3n9wfPoujwjId>jn8`)=Y)-Ink;7w~lKqY5PA@~j9SZn_?yQqv98 zcn#g13;6C$g-YZT>Ql1yMeZI)XX-9qV5b3sg$=pCw4ttc;p={mVo2IZcy|K< zFSp#z6nO#9nPha>a^H3%NOEJ7RTR*wm~{mHImA&k@B}Pn zLJvyw-g#qt0e35drvJLGN1|cAThDh6l+#i#Ck|^xSP3D@4(Z{tg8`3E4#W84;`jR} z!sm|xFKs`p?vEZfVez6qPjfm3-v3&FwPpQzt7b({ugmM=3Rra>mxy>Yo^Lt3$ag-- z$NgJae>w{X%!UomcK-9}@;bbGM0>;TI|-(S<{Oxk!$PYZNk(Qn1R41c>6@dRLN_C$obHxM5WM|_n5(z}dfCg{?HCddq4Ca; za!KIT=bLpX58tCoba=dp7x8(BT^KSs4U~eJ26&{Wg$t0R&)e+Qy^S4-Gd>^l5cPf8 znh3Z}zY)y&9WEaO z#XTc|PZ1UhIR@G?7WDEo5df9W_Yeq2O?C74e;y2&gN24mSs8XU`57Y30=jIAC?7Y?x}iFqHe z#YYLpKGTST599I%_iw-!0f>j%8Jfn(lMgvY&oW%DPrRZ6QOm-Iv!-em5^n@!$#64fd5UO7@&VB#P zq&`V&RpS>gRUG>M(kNlQ#uy)M;A1GYF79A`@Epdrx+=whS|l09a?isPSNzFEfUh!# zHXs+5HUfOF8)l)<{_J83@_yf!+$KP$;{j0F(P)nOeE z*V#ZU0x%1JB%Lj9>4y~i_>;raPDYo;73f1#z{}xjzylzBcjFLnKZ-sfTsI4)-2v`& zvKAm03*7zbcuSR81vuaJeACr_ch3q~;k=OU?P_5`G~3Yz{J~|FcXSPxQ#_rinE&AE zYDFc)lb?{*nD&L6vK^4Tkhj_0N&gRBS-luA0dQ$>i|pf7IP2YfT#M*Ql7O~7b>sqV z>vz3h@dyA+_q#j3;XxD-YJI?_oXU#h?JJW;Dqf?GyrN1=j7RXmS2nk7>6Jdy&tu>S zlh+#1NR6V;Sc@6KP&B;ynX%pFUWHFd`@Yc z5Ou>4a>>eAAf<&gFck7jiymyc;zCTK%88Sx43zP9$S(ZnFgUO;+{!o!eHcvja!v1$ zZ35;ke*%dI4~cRq_Y>U$#~ZOK&JnZEiNk6=62}DaiO>wq&1K_+VKA0)#GFyLOw>W( zdzKxdWmPPUUbU}pV=$!%7DanVIKx^d-yLbq zbkrN<%q&ppidXdXU$M_&kd%R!+S+Tkf74wB%dCRW&3+a3J{$<6{jY8RHSng$%XQr_ zQ}$+W4XOvsIH#BMp0;zCQ1d>OXl-k;Vq-!0>z7Bccl@}Q>wf5r*|ZCdck_n?5d!Ch zM!SRp+#YX+r>*YhptHXB7bwOY^j#lP_4#8S_e%eN50T1keS98K`Fc&Udj2VW846`S zX(ViX05t6X)0mAZJHk+lob_*>5=K8a=G_nccM5Lc05AK05BHzayZ-xcq?bbdez$vQ zm)~eg%WmL5CZUHgmV$hF2kJ|TuRyK&{~iJkYDL|ad|dr*OEIFQSN}7P9v2&F44?XD z6o>DH(Hs&|wh5HEvq#(L0VG^^b@Jjhr-WO)neWY9`@m>RdtwqjB_l3^ca z|IlI))=U5rm{cqU^wxI8l#hjVcsAMYZuRvZP^oWSrxN^BAjVn)3{RR#@mrtQOqgk= zY^kmK2BY9P;p$QKRW00vL;%@H z$i=j+M4&yf^Mn&ENH>!~dEiQ;0Ln1YJ(TL^0{;FE=`3p&1eCAVkRZ8t8@Y_SVRSWb zQ=5|X`*g>jtU;5-UsKZxS_JXIrNjm1$V@X?!$tQ6M!1Nk-^6PyVGRF>PonZPd)-Ag z=~xGG#tB^M5Z^&j!z68v{ZDeH&|4-ceo(L=YPk)Rwi{zcw@exh2n#ou5hTVF^{;_s z0hM>M&>H)DGY_SIAMQMH3lp}tw1#1er0J6MBr=7yivR+Lapx&cquIV~miigz|N9Ou z02Zo#b@y~NMOVj7NRSAxaQ-K$6972oPZj`IU1e zSX|((58B){s^U~I9wNm>|LObL3K&pw6g1-DhvaXg;F!IkK@*9yg5v8m3pNwTzfH$K zM;KYv#spg0k&cxW^qegyMhT-oMbkoep@>M-LLeeNt=~Z>BO1T=V}=sqqYVk}KDHRY z+g+u?*fVM=K@reUr^TwI&aPmo18cIVAZn&PPTISH>iHk;0RQ@F4BIp;T}!@^+;QV} z`-qd$|8f4X=IF?FCZbr>D#v^3@eUS`b$y-Zw>vKJmbX$>(G8?_z51GLY`|z-XPV)_fk6NsechVxEhfI7;if02g;J&+q>1%;?9PY=Rw0 z=*13E9-~}zR`}D-!a6y5ZbBN9gv&6e^P}(S>$`!|r(Mjf56%fH6B9tLP}RU^zrW)t zmy9keo_YNGdi%~Ie?RbYNwl-IJ?Ck6j6*p|{dNpnG%;<6aMcZ~Xl$ zw^!bFN~Lwo-~<(wiL#9$t(Da=?BrHzyHBBjV)X2~?s= zLx_x+YB|-zbfv@luFnhDq73P$O3_)Z+(6JI8cf_5F&b4NFMv2LCw!M?7Wyi{0iGHZJT9B_{r0a|D7oH z`2S%67Yt)aOUCDC5szBI!W0(asLHtiMF#kV;8_SS*Hfh-)@SDzz~d+l13Y}IcE$LW zxLp1M@nX38mWDm>?3mr|c*B4l`Y&X|;?^WZeBzfL?U2aTmpCYdSN|MYk z5sYSy`BRF4R+<#PW%T_8)MI}n6(-E|x(gT4VQkU0r(K^cg!Ka+0+r$K_hWiBZkcH4 zRxE$`KYE%+mY-ph2-cggTCqF=;mA^u124JD-w;_!zw3S<2e&M=^bt+ZJf*OwIR3Nk zqu)>Zpd|Y>`%@fc$PVH>!RzXPxNw{FVy02&QNNS@LXplL1qNx7bK_(3M==xq zyhz-guKGMVU4^rx8*TpDJKaOFFw)4IpS?1Qmr;;Pea>>3wyg^R&n_e3rjp8RYjReq zfpn(TCoz1Mho>uHRA+};U6gK7(=Dn|GZ|(~L^n;he;!4W&ZCQW!XY<997O46oI6t#Dy3*&iIH3! z+ol%F8Wm?;>%GN6&cL07na*b~Ok&srE*O@IOR|?^1$K8%|8NqVV7LTk9;J_Mn+JOx z@h4DeRsIfQ#Yj%w>sDU?>)K(_E%pr;DSDUvZrnzX2VRae`(t11F$8DnZ^REDX z8%)SWwBkW={ZCJKcNNjenhbuO`=dJ5(^K0Sg#@2-#aslUtDU2fU9sf^&zIGvjRoB2 z(fsZ8^{0gw43Wr|R{=yf0=(z;7NsXT1Zx2|?Ej-b`=8RqyR(-UhZn{1a$3D>P2K4e zRNaJ!2cPfsG3DFyjr>Sx| zZ*TAGvQzA(PZwU8IJFEQW24dEK2W}Ssv=$YMS-BfgO2Mc zi20Du%6;vxW^HD)dXn`NPdYjwWP37Wd;vn8iN*~k#5BN*;gNJpxc?TUMLj?a(%_N9 zpZgo5k*d@|7t}UQ{lu&RiiT7ORc%_S_a>P2c&dS;z95CvtM`HBW|?piOcZDcWkQJR zAVJ1%Lo~BmD%?j9bym9}O*7wEg2-`#71sW;!7Yw6r{Od2`jEBMxh|d*%g^7?;*)(W>nRVIQCkF7){nyvxbT{nDKkqhlJtW~KBUpd{H!bZ7G1!h;Lrz%v9U;3 zL_-{AWO@RHFz$_g`dmpXh+ZcxqZkiiLx`r|QWO(^0o6vAfHfgouMxIC&ADSUz8uwJ1m{>kcf#1H}cZNLA<_ zs5L5MKV6OdikansMTM)gg0#>i{h!$^rs_Ldjml~V^gHC#bwLU|n^LW8OW4U6R`*|c z+6&97q>%=o$#vnEFZ=)g{X^w<9%N+1y;z(EXU1S_;c2Lw2@H-xAGbRY~2?T%R{ zbmgX8%@#?iWBS7nIJm2g@03%R!rtpF%NhSp#bw=Zgqbr$+h+w)ckO&Ki$x-n(Atrw zA4%Fk%U6^*yE6JMfWuJ~5oTOTcEf}!=^QrtS}?+MIHXo;ZF!=*j0=VIm~pMwjJauJ zc37)Bbexvk9aNq!d2MQ@2yF8UMD{GW%G>{0pO%b8Huz zW7d<&2`4J0a46xM5xjOlfmHgJ8B+u9m)~eesl`uopGgr-)Ox8x3q~YZY}C5N z)#LC$j2d(gGKgCeJ>M~~LqQO9wR9H%4BwnVjZu6XGD4Zc9J6b=tad56zk?)ss$nH* zXf1SJ@n=yJ(ckbZHhGVyCswUV5m*zN@XjE0j48}Xo`XXnV6JUA$|&K<&zbq_A3wkF zOm@XD1l*`01}Vr?${GPvsZ~+Pdpv}u(9naom?30w;%`DK9_4zNiVTUmsY3GV#kJ@` zCfE=aH(zGI(WhTLlTZDk!T-)A7NXm4zTb?K#T24eR4LH}Q@`3T4^QIhhF=*il_EEznMaJsW3wEns9ul&k3m=K^h1Ra$@7`N?njI1;?fOlo;PO z{Z+3BXMqVOdrry1UU@CKzLM{TV#Ym+ExKcsup=wS zz)oE`f+fT{GYg`AP*5}5>C<32a5H-o@;gN~{eyx-!xEbDZ+wjNW_Q`?0ZgOcm>35g zbiuD6vqHotJbub=Kwur(FoTA$OIXM?4ZyIbOU&X7$Hl;tH)on2(AG5Thbcb8sF|e0 zXpl|F+(~nz*hWj6-hedc$4^ea{cL!ey_l753V&;L1eZH*A|p>Mem;ZWZa%&dfMJWS z7K@(fcx{Yaug#x~yLepZ`DFdR`ih*CX89rJ8+wzh*7q_btD*z~#e>zjdiAYe+q46# zxYSZzBc^YX3WqS)DSO;KBNOS^@-%dLw&wI;TuSr=(pFXx#bC>ilj{$t7@yLDe9R{P;vnK0}(Ia=g&H>Zp)A#Z&*u+G$rBsn1c<^w0C{i#;i zf?te6ACvj$U%kfh#*Qt87X)H~(Y_67g_r%HEPp44Y$sKMIe__&?u={!p!2@NWEQ+wD%%EP+5ge4OMjD!6z-RjJG){^itzNubMU!P( zhQC)$eYz}z1Fjq@C~GS#iX=!no5%9DilCqg20 zHpP@*pTmgq7s*>QcFojsgO7x52XA-h6vr1$6UeAe;#Nwe^vqanESRnbddw0Fm}JTh z-ugteMPj+7-Vk5}h|Ch_0jnqmf=a5Tg_IeAI;8XybKws?da#OVhviAXuz{4l%H(H0 zLi@v8`uQ?cL|7@@vX8h^lpdf)Zn#KaF9dF&-SBlxIbubTWSWqEnFX6sH-f>^mR`f} zLSymObu5d++BTW` z$~!R7X>*DpFW=>9&k%zVR<#}UnUp`zQRjPFha4r z>gEg%4r)XQ{A*6CC%62qHJYZ9iN2UQiCl_A27wu)oGC&1ok!e&h;0T%@jcS3g*2AV zAr)pLtpBI0HxGv@{@;fQV=&f+j=ixCS&n^|EMs5BzNH!azJ-#=Iv6AST7=JR>J-{19no`2_DbFOpdoNM0i`+nU^bqcs1ocm^cTzRfHZKUy8 zm3*fANMgsZVr~NeH6FyWia&TYLptMuL4(`RAWkiZ>#uz~dPg;%JY#>3_rI<6_05iG zjBQ?OP6@^iR|WCyfX&=4e{gMFHaR0e~w#d%}E=s9n#emJJQYcw=CM{X-`qCVK+Fq}EI{8kg|9E$Nyo@F~+j{R)Zo6g1 zmE)SPkTwfNv)yMQsQ!`8BbJo&`TwQPt)v1m(54i+EPSR6oDMgt&7n^#2?PV zdiXvL{f4{ImIkHYAOf2|G4B~Mcxi$}ckB?c^|$&ObixAo61h12x)gh<>4_qg)iOXY zIFd__kUj*;n5K)sEcBrndIC6g1Wo383{sW7hC>rZ*>f>RP%-IQmx+Op6n0T?eO{A< z1OSid>#C1>HqA$#gQpGV1s{3Lz}-+UbbHP`RkU+>u_FEfHqnZlX2~;Q+4ef@B2PM) zB8OxZH!ta-S|!!H8w~wjkdp=nz-hD=hiN#rWH=RJ>;WTSIms2Ae>IRd+Hl6p6}HJ% zWrb4bbI|a>v;XA+RH^8QCYV8HnNA~3Bh19^M{O&d6ycK&X+_=^yqG`@f$V6X#t<-y zve&3|XHCI*s?Ja1HYp%P>5-&W&hO1>PSJKF22{2#-NaeUo~!;N`Rs3IA)c zHYz6b8L(E3Jm-IGRTJQPOq?dA^F+d=yK;bmkdv5TQZi}MG>wyIMq#t2YHSMFF>iVS zrTXJ!VYEb13tFI%Nh3b7Qs4c4Gl$jMZkE-IseY52Fp~!#Ih*nz3D|g{;F?U;eDS}Z ziiRh8s910&bo&0LEOcKD0%8nDL@RD>oJypYR9vx<08+7Ul(|v{0?Hy&=#i7?HdFYvr8dXqw`tr zr6;1_co_rM@Zg7uLgP!k!?5dMzbi#p0cYk;=IB?YAqzoZtA@pgd zp;KGc;Ao*2^S!W?^IWeQ!aWzaV4Q>r3r>?Zg{t=t?_)gj%Js?ajzZ?W46wY_;wwml zWGjJ!^w5t+9irvxZ~iR^dcN$JrGD9)&q@7OxKlrwx8Uea4;3YZe3{(A2$Vq;yc)VG z_Mp%{{HKwrhnDwxjhJ3S0PpWNF2W^X8g}q+Jyek^>*^S&J=ziqJJREV=$P1b=y$2G z2=9cbFwlIYTrs$(9soQF~sm%Y6goa{hPbZO(m`F|OxkxhW!(ZUwVaN4m%R5wVla{`hEMuc;w7adx-HwkPD5{~uuQ4$LwG-_Z8yA#_E^HbU zL%-59>XWnDOruHkY-Y~}R}1LuPyH?Onwtf-%xbFkQ~A2Irs62qZ1P%YmBU}Vxtr%!p+<=vqVA5spHqp`<^h6CcvKOWs< zK*|nWuDN_I_IFoYRT*RKyT7Z97JX0DRwAvLC=|%+-U*G!|0xXm&k5xNLo7Gmj>u|1 zxl?c)+H~Fh>EnC!tXUgbF;!XrHZzIjzpH}sCo8U_0O!4;ktzVtBBU92lBVO-!D43b6Ug}Bn3 zs4`JZOKu351J|VmDoDfz+lz-yRj&L5*T#W_gcHeYOt84L612$Ua}cRbs(WO%6WhMb zp5_N*>sa_``WQXyXR&fkWJhoM*k<6_ySK-GG@PHeiyc(4d@e)=M;O<{-}9w8_{(-M zzfoMW&xq|HKFYdl(I%{NZwy;TVFG9GD7eY(G`Xvs{9^VOcCe>d!-0EqQ?J>8_QrW80%GahJ}5?eo2WW5?GXFM`_E*C_VLYN+iSvC?xf(g0-)X8|zL5kFxZr@rRT zFNFI4paeE#Ry#F`z;H41_G-IJxl|4uW=}!5hmxUpkmG9`|GgOu?BTDxK&B+0rgHzN zZGBIGB4vK&Ytf*3D}rK;c@x^xv*PqRs8P3heT`C@x9alM>9tF4aP+`RBZyHWD3YmA zgQxsG_4+2-adH9rCK18dG+4=zB8}d=poiZSD_xmTxL}v_9~o8#2LkA6RDoQgS%BUz z&?+zMNAd~;6&~bp0Y>&7Cs}!3(_PXYAURgNu*ge5oV-McjYmPL0ZK#6sq}PyD;Lb3 zR)8QkFnRkiHWV6t5N7IKb}8T%KghxFZy@0x0)%<_jw*xb@&&98_iMrU+vJrR78`TLv~K}*iaAdoGXqoO_W~DVf6J` zL(qA4?_oUJZsv@%x_d@i;KFINoan?A-_Yl^;ulvYwN~Bv{Wt5>Vc7kKk55R*@%ZYQ zP3jkuSmx=T=HwOj-n+M)4)%Y|`xN;XWB(Q&-xd3_SifN@p;vfx4<#!4kWp1btKgbA z&$SynroPberQOF(XB1`O($do#)k5cD8qT9kwaaatu2--&y7#1WW!5gRys%w++Lqd2 z6&V;E>7#OT)0s<&u_VZplFb8JTkJ@|+LBkK2%VAv*;X+s)Cg5p;Q`afPn^wPWO}k) zMLz!C_EcI_&~j(td6)dFb*bN)&IkMZ@sq28vB2Xd79f7#{JF~c;MCiErKhVYo&)3A zS*B;Z`qSBwG0Lfr7)P?Pu662V#<=~iFthg9N@%SeZe=-lPk(xWB_r9!CH%~LWAf|R z2SOmbnc74d1y+|QP@7a2cX&A^Q4YT&Dl{!$&*$3^-L0fjg5VQ zRm|mA6UQ&OBuH(whOcdEVQV+#$t{UF=XVU6mM@;X&@y2sb*pQex?M%|^ruLJD0*SMPsaKcJ6k&bfcu#hfNsBKC zTT_(+zvzU(2-GCXypI~zz+7U2dZ8n#X`Cycz;!NsLTa(2s;7P!_maz3bHe;lR=U5$D)V<8gw<^ zMm4iqBBN157XwPP!HQ!xq|eKYTR;qie{1)=Efz$ejc4@;#^}FV$2h*Osk>^9v86p6 z!xy=pj!F<3+@oY@1@P{QX$u)VDJCCijN5m*7;Gg|tTJu`3I^?09jzl@cX>CW8I8}_ zd#Ln;Wf*=jZocn>W--HzYuHE^bF!P3*>%Z6(mmOYbzt(VLrv@aFMEaWlMC01(_M11 zzO|kMWH|qJt8h(z-Yae4ff0nP^Kn-eyDON#3dKBpTxF}-B7>Abz!s-wSRlk*Oe@;Cps>!ga!-M7j5UvGWL zmlp|Gmtfz|HC^lP^|b~DBsu*&E+vFD4bSrq9B#BBPbPW+)})yJXDr`P$|kgW=Y8^g zSxXLqCz*%8Zali0v$% zp}6$`z5OeBzBi@=4X;jD=W4!Z(0VZqG3ah}g=78&v37vF~M@a6}#pf?ne=f)Dv zfrsVWx3jfefTh@auU2Ho4Z~fR-MzitY=a7VDT$KN3tg5R33XT4ZCYFyw@aq_qw1N% zB`xa4+Hi|ln@kFQ0IyS)-q~R>P?P+7x5Fy7d|3T{{DaCQxq_zU4lNc{e?<-D^q&JA z3X)osYU_6+U#xrM)3C3C+tN}i6*P;}%D(q)538H0PAJj+6eR%?KyOlI`nVF|95>6M zb8Fll7d2ttOO;FF4&vorD&KF(f_75@Im=v|F^tQ?5 z7z*Uc@>S~bRTT;lE9jTKX|V&jIpt%kQ}0h#d;hJitc3s6pTjDRk@j6*u4lJsk~1si zQs8k!jM40#ZK^$Ojyh~lq%PV{Ka)>ZO}#sk1sB|UE?1JcBVhIwoVSWL-1&?FGZQso zfiK-Z=KIPg=YFfIZ@{QoczrNH+ZMO|!-HUu2@Ux^KeXDJc92;v5iLa2SA_qV5D^)J zas#zA$lPymobKTH#Dy!g=3EeYkvjZ!YHqiK{_nZh=dGlsq+nXss#C7w?$M7YtuW$2 z={SB3^vkkiS`mKRB7*|yDReMK=e!Ezyge5c-%SN+P}pG7`hsp2G4!k9%tJPHC#or5 z;Q=A$9DsCw9_OtYBK(qRI4h`5{ z8qgvZob!%wBy#&URIS@G2swBaUeZ*l*}(WUAW94}q1k0c(uN8}jU-JN22Wu+f zBXvB#Ml%SP9ac=P_ujAKao~EV=1I>+7o^zr{V-u6w@jAn@?y*{vev=D-JuT}YHs0d zVcqq6i+7ADGoMM{2t&d5inIYQeXo7y<8Pa`9_#)^X@~{S7u)Ci=eI2w`BR6l)(%|w z>XW4>jhXAZ5micx5|(ToANmG;8?a&j1^Q7sL-EIpmLvE1k$PQ8#yquI<`&fg>uhd` zq2HCCJMSuajVgQAUcYnOAjC16M^~;_FBcX>q-uqtL!WHV>KaMT(&_o>VQ3~Feo!*; zcZhOa@m)R_c{+Q2-pKDw!Dn)5+GF&Vh#gU1Db1B0^CB~LXqJ!M;qT>lf{~x${Sr2K ziIMI&t|R@wLXe9-rG+-8cd@T*BNn`L4Lb^i1z8Qc&5+@q{$A0lAVTl~!6;dR{#K>x zGiJ(yTKH*NfRZXz^Id-xMgO-|v_#K|CF07reEN!px$})1l_G*guh!X1A`#OJihZZj zz;_;0FQKuG8n&Zh)W4P6pJUQTK_(H< zB28$%_m2_B$wh%22VpdB;3A5QWONfzv14SHBV2O!Hpel1xUVo&=HFVKY_%FzPCvaGp>X;K@Ep0semIA10vaP-F~ zRSpg~DPL#MLw=gqslHhws-Ya@QUf)vo@+|~UoL=mO2Y#KD=->-8YCotNu;;si>T$T z5HE}fYz@_=xL3os!2!{o1+NJjX{jyVw0!W{6hs;C&Ag#B8ar?eJJWJAnuA*TxDRQ?Rnd% zg%+tI548pjZ4B~OwJi(^MC}COZR{s2lJ#^Vz5LNlhb47C+r`g|<XG=$C*k=JTLF z28o>96gGa5N)kw$Pc15K=i9hKw7M)5BxUAwrLaJ#SinJ({*m7BU4Q3-$+)b_V3RLpY*g}vZE(hB;T5- zvwiOCke)(`8l&1z^%ZD`)JL^AcJL6zH*)WON{;1G2RId% zmr8At3bpzpgk6u>DuFRU$G)p!9e8o2=}`I!BL%;o$}W8N;D8N z_DerKGg5Qn4WrL~*v6hW(!Ng{8Xk3bQ`=J;de@n1Isww%b)ZgL7j1#Ie^WE8WOBo4 z#K00tU@^FQ71yu!tFoL@2mf^yp#NY@GqsjMjzW!FX(R)F-HA;!}s*2 zgQ0-HE-O8a^i~5MML`h2{O_~n!QQs1 zzs2&o+ua=$?a$xI*SmW=f3BUq{U@Hi`{~o`vpfIp1O&ZdZamP5V`~5Qhddby{SS67 zZ~p&+Xv>I-F}c$ppMJdEyf$=6Lrtr|CAtvk`aQb7N=i7ZY;5dW+##;Lb2T%U4&7KB zY3)+Nj$iyqsT#W3tGhS--_D``Hu!4)$xS>Z1QngV`Z;WRYJBy5q43?##r5&k?%yTW zCl+PGdJeS9IA^N=#6A6)>XlZDL{iKe=WpmQ)D>HMUpF3CC2;?REk>FAq{p+Sa#mIe zbQizRUjV)S+H1b&d}}ImA_Jg%PRGbb20Z7t;vCVVuc>)spV&Qinjl4e-O6J+aPqyD;SH)65odxC&t901At4 z-|unsEsXj=v`?Wn>EZ{+jd^qNTHTD{IZ2h;Q4eI+Ig2FPUwXfgRqKv4H+y0{L$uBP z6FN+uNM50A4w}X=Fg5?ZAAVQAVBxt%6g8=c=l&w7$gXhDBn&i3Rs#+LFNt{dQczuL zrPI9A&uE$?4?r9+(ET0E+1Io2xX3&CLQj58!<(GU?mJ znBlze--YPO2RD9z@V7_4T7Zr{<4`NeIyp>%ZK z)=ZHrunXQWcp%>^n}B{OQ(8Uc<)^?aUv-61&wFmro`uP#%DJ$wt;o19!J)9Rb%Dr~ z@N6RtQ@v)&{dFukX;m`=jvC(tS1vGfo63AIxhVzthpG#Xv*^ow=%s0cLid{pNT>*nl z$63})WFo?kOH}XSEA^6uFipD1vM|`1Z8~(dg7NWa?tqAlxzie0kc2i3KLz?X3HrG> zB`)lBe=O`08U>1Yb;6nR`?fS+!GkX&6OkUK^#WwV=pNCs|R(Q43ZGrG>!(^fuwu zhFMRScq-6qaoZsXPoudY+$zppdMy2anXJ67SQRFQJ!nId>-GOVGY7}NhD+u70=546 z8%B8e6JvG?J#NH{gAr2@4{txl`oA?89GhD5UBwz$9z zB!?n8dt*N_w?P}+l4v0_-x5Zep{L9x`p4r8I6!>IfZN*VrELQQK`@;OLXz=GlqJcD z1LCEMQ~i7UY;gusRjs?%6faztlLDnE@|-^>d>lCuHAd*7>sx+TaPx}d zz=d?9qMC1ZHA2Rq^au|e;5Osw|6qp4AqXWh0VGnfX`^oDEwT58)d(N87&|+ z8L$&l62mB|xD+wO&73LJxg?mkNu*{bdzEheGXzzt9L&=8NdQOxDe&Rb&a)V{-LoR7`&!-ktMIWI2#F&VtXor*6iw2!3}!Fdghzf#Py{&=FC z>qDRjhpQ?YW0t0tNu8K9bWgLqG+fA;5F&N`Qh$nsd_V*F@Q45Cc^?ffQ#1C{>c_6Q z!VrEMAXhk7&$pBCq4gk^hTkdZR4ZXs)TfjQmLyWdI2k!91*;vdNDt0I2;NwP?Y(*7(OZsgmr?u5AA1x!mvPWLrn) zJl{e(>(D9y>JwiFgc70E~>Ps+Lm8 zke6pBVmWKPe+R~d*+qp=*ET)(5J&d(I4Tq%zJI1~+7jU3>f2sOu(YFDCLRV3MDZ5X zq~vt}x?ja1s?7ZED|QHcyYEVzg;4UJ#7<=9MH@?60>y3yKbQN_VGl1NhzqtCCao+P zJb&x6RQ-|f;SMtJ;AifXv5X$cpWIEC``&k!=gN=V&%^Q!j>F+^`OFQ>y;W8HPWwqw zrJrs^X$bajEVR3v6L|UrJ)*tbOs0MsyHrYVw$~h@QrpiDDGq)D?P`#1jTM;pz)sCGTELk8_eb;~ONl!*?rg=Tc2A4 z6L=h~tjaZ|40gmlLWT1zh%W9$HX#xIDs}=QVDc0$QBDA)jDT|= zlp3g7$RAqogNnVjUHJ&ciV zk*^yfNB&;-jO+U$0{!=8Qljm)-1I^1W8B{Ldz7&9?d|Q@>U%W@X*9iPEbnS z3gWz`Vm=QeX~@ruj0=7;M{n8X3DYwcHr&jSGA$o@1_~voY<0OXz_dmsX6)zP7)AU% za(k@!dytaq@2(C~jFN#*64BFC&&jRHo}z{1+oKXDnO^f@=EEG2eu`SI=MvCj~&RZYI1$T3je-63f^&W|hI1*(})#9`29Sv)0=-3ihk#XIgXg$|oWsocLg? z&m0Q!Yiw$S=;P$mNT!Y#ZHCs0u37%X&$v#195qxpQleHF5-3x`H^U4Rkl zrI>|Xyk30ODY1|v#PX=YBYlG3Lmu})J%ssGFa-m2=HJ7c)H)g&HJR4R~n`@ZOJ7fFtL z^7c=dXw=Hbz9r?HH!gTm#;8pExr+=q5BSp`sbkWr?Fz{o6+g$*l#_DIk1pXzX&61p zpP#{8L<}=Hddr`_R|aT+jz$HPBI<2KRcL5>nh0MoI^vZ4HC=>qLJRkaDl5(Gm(E~p zXjSlw?|b%y|K$R9%rTz&i{N2SAq$|%`TM8`sjg3_aCoRaIuAB8t=jbtX4og?TnOWT zxk=Flx|bitoCiu^E|cnDVc|11*z@CHMw$?OHE$93s0ze`=B>M*6XK-f`c~rLDE!ad z>hs{&aIY^bbyk0_!fpg=rjk5n6xcwKy{h~_^P>YjL z?)vGq)Uywl;W~IY(N+0}>d?M75i_c@wC&n^wvis+qLR2TO{(WrwWeq~ru%;tT5Qjn z@cOi~(0E-C1qu@7Iz<6ylb}JD>JZ-kA(%xlFGMn^{$3gO4$P&UJ_)S9RPZ@|QJ^P? zt~XTbNl0Plfk;oq&}|=RJEsL4##o){f|JWDTVJuq-j@Uv!;N`gT0#hA)M+m2kMtGP zj+jel8ZvT~%V~jW6}(GgSa&u!_6+{waBc4LS=UuPC`lI zmHGN$Ce$O$baPExmQ~XPxVCb;ND3qTd51-`Ce6ex$Q6??q3)c5choeD85Xw8_rUp!Z@a7|gSU3Ze zTCp}zgnrE%^yUU+3S`yoz&LG{OkJiFk1QESa9j3QuZsuHb%_EVPr{COEyTEJ^gKP z0&FEpOlThr2MFD}anoWWg(UbeQE=Otz?Q9|JX?al093x-aMNmo{{I z3e7{mueuzEbHn_?*D+R-h)=xsu8mMgbOegGs5OL*VEl{+)^}{QciI+$5vRP{)NJHm zXYjZ-a6PCUMyQoCVAOMNd}rXK|FcLkBk*ZS8=f0*hWB0^IQXsbYagy8Eg*_-!!}BN zitgmag$d3k>?hGDwNglYZ9+=&zTgcnV{yT=w^YxmX?v8e#WJXvX+Qqfe7y9JYV1=D zzwyh}Jf}RSvmYf9HNL9S(~smA^j4KUMTig9MN{)H-6ynqT;jnsEoX`dUeoM=mtN9b z@9ZaLP=vKZa|#ETQ8jJp~v5k(eiLgh?ikTfD&Wd=NzX_gy`_bG1dSu6B&=-sH*CYGtTzm3b z={u&lm7;J%Np9tQ5oH}}n)D;03{3eQTg2b>burP9)4wqG$I^L}_tY~xX?j7?xKgPl zO4KB10pEG)IUwVqvb}Cif>MZ8M78p`3y^0L7y~M1{rNay{TmcX_$_Q_ukW2%80$u& z;=+jt9%HPs{u&2(h}keOd(0I^){f)`exXKmaA|GhCVl00r~)v9=AEkMz#bwu_~V24lFVZvTDP**0&DChHlEwac#J`1 zPhN^HMlA$E`xg}$^t$S*m7@%`VFpuUqzS2=cgdh=VCQJC$l zGgx2n&i00EzVesDZhFMB4FWcW6QZ@mx_S>E7)X>TmB8C}uje#-EMK2@986^BzrsYL zNVuNJe%{P9S^Cb69xtheIpc`u6Gb?BP*M2LiPS9Q89X|oEy8psg$rkD2>BFi%sJLG z;kl0s)<_Q9R3OxW(~6?$DR>#+w*c&bde<~6kio-N&U4@AM?S_GFCc+7@iylkwtae2 z%EnaUpFKHyW5t z1*H2e3eJSw_~quDexd%+%!AME6p%@J z%dS=)Kpxt_=;X50gguZq3M%EjqtL{_CyAc zXgquPB5~ZxuXvNno|oCMUFyO0OiCnmnE~l%CKNK)+5V+tt_x*cYVeHcH!Om6Sk_T^ z_}=&~GoCIS4BYdoJ9U00c5KnIg5Yn?PO9WFkf|5dGM^b4t%B*#AYHR`7lL#zX2ue0 zG8652l^#@XRWbi?o?Mt$8faklM@W<%j`EIm`QL-zhTxRcIv7Sn-~@xy9j@n3t_86Bd{L8NwjU)f(kL-Bk%~AOOQ}k*2Sr@ku5n4n*!;oe!iE9Jqcm0qRKp1~ z4e)X;ci0+w9`L|-SBT!ZW0!ldWIc~ep2Yn#FH4py1R;%0K>u71&5iuIHRBH%luh;`_|X7x3`G@R|e4SSQ+I41^NM0wRSR|3i@nrG}}Bt9tm?A|RnjfX?8Z~ZE2 zi2B~n}zDF_lcB-_*K&18fNgn^zEh&gl)#@xrP05oRS;4kF z#3_&!PH3HD;7t*_EE*J8q8X2H2G+6#x+c_ZL)!K)3N;nZMEjf8&NH$HO9Ta0PWA`S zA=j{BhECU{2zAxeVnVes!q#GUr*AWQ2<_mF=a7sPF#hu#AU{)u}MOi@S7aLndgA2l*-OU4 zXvEv6eIlMJp8dEO!#14%I0 z{L2alYuY6FS4qt2ViZMCvRsZ~II4Bw4Y+Hh@iJZgr(=1abU)1|oi9)WCFLn^d28Sh zkw)_qpguI|#gEl$4A$ycBO7|Je!&Q!`GCw!Y$@yQxmAQ2ER%q4*_i+f=1)1v*|BFB z*TDDnL!W4X8e4eK0Rg`JB1WdQ9^JB4qvF|gY`}F36<>O zlu=QJcRd!S8)Vye)=_&a=rhLFZ#i2W%F_RNwgRzsKc&S0Y^3V93Lxf!l70r1o`=jN zbl26@~gD)j!MsF5Wq|vsC!jR%pm>@l{oZZj7+7di0UgkV1`bQpEfp>TKxLFP!SmA4xHT5asut8M@$EMiXWoX z$`M^f45&l&Z}Z-pHyI2Ss;U1??~p2Hg#F>ndI7|aFaU$qEJc`C-4Hv-SfzqAz5h^% ze}QrBB{uvK%WP}8{DL27n?J^wEYg@}&v$SDl=2Au)4UP-B1&*OJ@Hp9^(zTL(R%j@ z1>PI*K>U*8x)sC%zRY4YONU9i0_!#o%t-~(DOct@uG@e@>?8^__wUi8Bf6gN-|~`9 z4U;H)kd$-(Ezt!T4C~)F^G{M9V#S3w+d4p#RBVBq?xU>)&4jGqdi#{CRxO)+g~en) z)Wf}`T(|Etxq#3REHX;BZkZW-v0~q?ESNM?p@?#A=e@s`t0pz#FOK`f1CfV z{5z|=d|*5cc_@@Y%l6)O)2lLdlDq*O%cG^4X5SJ(v65MRv;2?1TY#l1jJiFli$Zav zrzBw9S}mclu$aIpEy6V<;opJy$?@^Oqko%MIX|FYX|Jn9ov6$#%=cc+3I3t9rb{`C z76A#@g2^6&f4(R8ROE!4(jq6w@dEvfltd#f*kJEXjxUn}kV9~#1sf``_zdUb9?|L+ zDEL3kKmSM3y&Bf5v=k>XMQ_gv(a@MJUM*D^H~)xUoP)~BshR8)}vyi_z) Yw`g?w<>$IADW6ao8(8Q+*2N_LKaE1q`2YX_ literal 288221 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%0DI2+F?h}F{M6kjc-(&WxGPt~ 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

Y);vnZ|wd3i3 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≺g9@R!*7-@72+TAck_Vu3Ch~q`ts-4T@rEZ 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 F{{o$2d~W~% delta 147264 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 z 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�QTm=P1mjkzw0>r>@2_jud9bc( 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 diff --git a/docs/images/screenshots.json b/docs/images/screenshots.json index 4b183f2c..20e3c0ae 100644 --- a/docs/images/screenshots.json +++ b/docs/images/screenshots.json @@ -1,7 +1,7 @@ { "version": 1, "fixture": "synthetic-only", - "sourceFingerprint": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", + "sourceFingerprint": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", "captureScriptSha256": "34f2219790d46efd8250e7a1bd829cb8fc0b0547e1260635fefa52407551b41b", "command": "npm run build && node demo/docs/capture.mjs", "scenarios": { @@ -13,7 +13,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", "imageSha256": "d36b6f9f8139f31ef73a780c6511a640a26055efd9d7a24c24fd48b1d8379bf0" }, "view-touch": { @@ -24,7 +24,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", "imageSha256": "358e25ff9984d0fb0c03cfbb848df40c425fdfe64cd5f4f613b1e754ca9d4249" }, "space-create": { @@ -35,7 +35,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", "imageSha256": "c53db2e5c642a5549c13f3c93a5b359fed69bdb2621bf71a243a877ffcb95e6b" }, "room-contour-close": { @@ -46,7 +46,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", "imageSha256": "5ca7f24642926072ccbc5bf48341c5310329918631b147c116f9c29e20e4927e" }, "plan-context-tray": { @@ -57,7 +57,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", "imageSha256": "164b79fd9075a1425cffe3c85c88b689dfda90b79856bb4ed6655507b166b3e0" }, "device-editor": { @@ -68,8 +68,8 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", - "imageSha256": "7a22a81e2abedf5a520bd36b7509d953cbfa9962b48c0ffbc233666a6215c04b" + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", + "imageSha256": "7c3e25534fc819c45431907616c3d523961505859ee68af27cce2daec9f04fb0" }, "device-display-preview": { "file": "06-device-display-preview.png", @@ -79,8 +79,8 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", - "imageSha256": "df3a54395c83bffd7a161f1fb3de0143e12e76567535aedf9883873ead74df91" + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", + "imageSha256": "f6014caed7b7d28790b8548996ba09d806a4e4d51fbb7e8d3fb3c582ebe49167" }, "background-editor": { "file": "07-background-editor.png", @@ -90,7 +90,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", "imageSha256": "d7cfe70551d9260169df8efd832e32ed7df99c7f60b55d1fd4a8322bd4c47175" }, "room-card": { @@ -101,7 +101,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", "imageSha256": "176abba71d41cfb045a33f82a794d9fbb2a5d3c48e6df66e6ec3a8e448311b11" }, "device-info": { @@ -112,7 +112,7 @@ }, "theme": "dark", "language": "en", - "sourceSha256": "ccbc4fa08439a1d7a585a5b742035d048a8039fe4d023a48788f811884b6316c", + "sourceSha256": "edb4278c0d33b75e417cc0b2d83ac8a46f2be4cf0d2c46aed801c566d82b70bc", "imageSha256": "2199ed88b215bf2bff63bf665028f78b2aa6a92c3032b803931790f2ef071893" } } diff --git a/src/houseplan-card.ts b/src/houseplan-card.ts index a1b21e44..e31e2f70 100755 --- a/src/houseplan-card.ts +++ b/src/houseplan-card.ts @@ -513,7 +513,7 @@ const unionRect = (a: Rect, b: Rect): Rect => { return { x, y, w: Math.max(a.x + a.w, b.x + b.w) - x, h: Math.max(a.y + a.h, b.y + b.h) - y }; }; -type MarkupTool = 'select' | 'draw' | 'partition' | 'column' | 'merge' | 'split' | 'resize' | 'opening' | 'boundary' | 'wallthick' | 'delroom'; +type MarkupTool = 'select' | 'draw' | 'column' | 'merge' | 'split' | 'resize' | 'opening' | 'boundary' | 'wallthick' | 'delroom'; type RoomFillFrame = { byRoom: Map; byId: Map; @@ -544,7 +544,7 @@ type WallFaceBatch = { */ type GlowClipGeometry = { lit: string[] }; const MARKUP_TOOLS = new Set([ - 'select', 'draw', 'partition', 'column', 'merge', 'split', 'resize', + 'select', 'draw', 'column', 'merge', 'split', 'resize', 'opening', 'boundary', 'wallthick', 'delroom', ]); /** Warm viewport is page-memory, so it may contain a tool name from the old bundle. */ @@ -2238,7 +2238,7 @@ class HouseplanCard extends LitElement { } // A crash-safe segment is a real geometry command, but Undo keeps the // surviving draft active so the visible contract remains “one point back”. - if ((this._tool === 'draw' || this._tool === 'partition') && this._path.length) { + if (this._tool === 'draw' && this._path.length) { if (this._activeDraftId && this._path.length > 1) this._undoActiveDraftPoint(); else this._undoPoint(); return; @@ -2267,11 +2267,6 @@ class HouseplanCard extends LitElement { this._undoPoint(); return; } - if (this._tool === 'partition' && this._path.length) { - e.preventDefault(); - this._undoPoint(); - return; - } if (this._physicalSel) { e.preventDefault(); this._physicalSel = null; @@ -2320,7 +2315,7 @@ class HouseplanCard extends LitElement { return; } if (this._tool === 'opening' || this._tool === 'wallthick' || this._tool === 'delroom' - || this._tool === 'partition' || this._tool === 'column') { + || this._tool === 'column') { e.preventDefault(); if (this._tool === 'opening') this._clearOpeningPlacement(true); this._tool = 'draw'; @@ -5359,7 +5354,7 @@ class HouseplanCard extends LitElement { if (this._tool === 'opening') { this._cursorPt = null; this._clearOpeningPlacement(false); - } else if (this._tool === 'draw' || this._tool === 'partition') { + } else if (this._tool === 'draw') { this._clearPlanSnapHover(); } const pts = [...this._pointers.values()]; @@ -5426,7 +5421,7 @@ class HouseplanCard extends LitElement { if (this._tool === 'opening') { this._cursorPt = null; this._clearOpeningPlacement(false); - } else if (this._tool === 'draw' || this._tool === 'partition') { + } else if (this._tool === 'draw') { this._clearPlanSnapHover(); } const pts = [...this._pointers.values()]; @@ -5447,7 +5442,7 @@ class HouseplanCard extends LitElement { if (this._tool === 'opening') { this._cursorPt = null; this._clearOpeningPlacement(false); - } else if (this._tool === 'draw' || this._tool === 'partition') { + } else if (this._tool === 'draw') { this._clearPlanSnapHover(); } } @@ -5484,7 +5479,7 @@ class HouseplanCard extends LitElement { if (this._tool === 'opening') { this._cursorPt = null; this._clearOpeningPlacement(false); - } else if (this._tool === 'draw' || this._tool === 'partition') { + } else if (this._tool === 'draw') { this._clearPlanSnapHover(); } } @@ -6361,7 +6356,7 @@ class HouseplanCard extends LitElement { } private get _activePlanSnapCandidate(): PlanSnapCandidate | null { - if (!this._markup || (this._tool !== 'draw' && this._tool !== 'partition')) return null; + if (!this._markup || this._tool !== 'draw') return null; const hover = this._planSnapHover; if (!hover) return null; const snapshot = this._planSnapGeometrySnapshot(); @@ -6598,7 +6593,7 @@ class HouseplanCard extends LitElement { if (this._tool === 'opening') { this._cursorPt = null; this._clearOpeningPlacement(false); - } else if (this._tool === 'draw' || this._tool === 'partition') { + } else if (this._tool === 'draw') { this._clearPlanSnapHover(); } const viewportGestureEnded = !!this._pinchStart || !!this._panStart; @@ -6831,10 +6826,6 @@ class HouseplanCard extends LitElement { this._splitClick(raw); return; } - if (this._tool === 'partition') { - this._partitionClick(raw, ev.shiftKey); - return; - } if (this._tool === 'column') { this._columnClick(raw); return; @@ -7140,29 +7131,6 @@ class HouseplanCard extends LitElement { this._roomDialog = true; } - private _partitionClick(raw: number[], lock45: boolean): void { - const pt = this._resolvePlanDrawPoint(raw, lock45).point; - if (!this._path.length) { this._path = [pt]; return; } - const a = this._path[0]; - if (this._samePt(a, pt)) return; - const cm = this._drawWallCm; - if (cm == null) { this._showPhysicalRange(100); return; } - if (!this._curSpaceCfg || this._limitReached('partition')) return; - const before = this._geometrySnapshot(); - const sp = this._curSpaceCfg as any; - sp.partitions ||= []; - const id = 'partition-' + Date.now().toString(36); - sp.partitions.push({ id, a: [a[0] / NORM_W, a[1] / NORM_W], - b: [pt[0] / NORM_W, pt[1] / NORM_W], cm }); - this._path = []; - this._activeDraftId = null; - this._draftSegmentCms = []; - this._closingWallCm = null; - this._clearPlanSnapHover(); - this._recordGeometry(this._t('history.partition_add'), before); - this._saveConfig(); - } - private _columnClick(raw: number[]): void { const center = this._snap(raw); const cm = this._drawWallCm; @@ -9556,7 +9524,6 @@ class HouseplanCard extends LitElement { this._drawWallField = (e.target as HTMLInputElement).value; }} title=${this._t(this._tool === 'draw' ? 'markup.draw_wall_title' - : this._tool === 'partition' ? 'physical.partition_size_title' : 'physical.column_size_title')} /> ${this._t(this._imperial ? 'wallthick.unit_in' : 'wallthick.unit_cm')} ${this._t('physical.allowed_range', { @@ -9594,9 +9561,8 @@ class HouseplanCard extends LitElement { }; } - const hasThickness = this._tool === 'draw' || this._tool === 'partition' || this._tool === 'column'; - const hintKey = this._tool === 'partition' ? 'markup.hint_partition' - : this._tool === 'column' ? 'markup.hint_column' + const hasThickness = this._tool === 'draw' || this._tool === 'column'; + const hintKey = this._tool === 'column' ? 'markup.hint_column' : this._tool === 'resize' ? 'markup.hint_resize' : this._tool === 'wallthick' ? 'markup.hint_wallthick' : this._tool === 'boundary' ? this._boundaryHintKey @@ -9613,7 +9579,6 @@ class HouseplanCard extends LitElement { kind: operation ? 'operation' : 'tool', ariaLabel: this._t('editor.tool_options', { tool: this._t((this._tool === 'draw' ? 'markup.add' - : this._tool === 'partition' ? 'markup.partition' : this._tool === 'column' ? 'markup.column' : this._tool === 'resize' ? 'markup.resize' : this._tool === 'wallthick' ? 'markup.wallthick' @@ -11905,8 +11870,7 @@ class HouseplanCard extends LitElement { this._cursorPt = this._svgPoint(ev); return; } - const architectural = (this._tool === 'draw' || this._tool === 'partition') - && !this._contourClosed; + const architectural = this._tool === 'draw' && !this._contourClosed; const cutting = this._tool === 'split' && !!this._splitSel?.pts?.length; if (!architectural && !cutting) return; const raw = this._svgPoint(ev); @@ -17199,8 +17163,7 @@ class HouseplanCard extends LitElement { /** Where the live measurement starts: the last outline point, or the first split point. */ private get _measureAnchor(): number[] | null { if (!this._markup || !this._cursorPt) return null; - if ((this._tool === 'draw' || this._tool === 'partition') - && this._path.length && !this._contourClosed) + if (this._tool === 'draw' && this._path.length && !this._contourClosed) return this._path[this._path.length - 1]; if (this._tool === 'split' && this._splitSel?.pts?.length) return this._splitSel.pts[this._splitSel.pts.length - 1]; @@ -17920,7 +17883,7 @@ class HouseplanCard extends LitElement { } private _renderPlanSnapOverlay(): TemplateResult { - if (!this._markup || (this._tool !== 'draw' && this._tool !== 'partition')) { + if (!this._markup || this._tool !== 'draw') { return svg`` as unknown as TemplateResult; } const geometry = this._planSnapGeometrySnapshot().value; @@ -18036,9 +17999,9 @@ class HouseplanCard extends LitElement { const path = this._path; const g = this._gridPitch; const view = this._viewOr(this._baseVb()); - const drawCm = this._tool === 'draw' || this._tool === 'partition' ? this._drawWallCm : null; + const drawCm = this._tool === 'draw' ? this._drawWallCm : null; const previewPts = (() => { - if ((this._tool !== 'draw' && this._tool !== 'partition') || !path.length || !(drawCm != null && drawCm > 0)) return null; + if (this._tool !== 'draw' || !path.length || !(drawCm != null && drawCm > 0)) return null; if (this._contourClosed) return path; if (this._cursorPt) return [...path, this._cursorPt]; return path.length >= 2 ? path : null; @@ -18088,7 +18051,7 @@ class HouseplanCard extends LitElement { ${path.length > 1 ? svg`` : nothing} - ${path.length && this._cursorPt && (this._tool === 'draw' || this._tool === 'partition') && !this._contourClosed + ${path.length && this._cursorPt && this._tool === 'draw' && !this._contourClosed ? svg`` : nothing} diff --git a/src/i18n/en.json b/src/i18n/en.json index 841f0e83..34ad5afd 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -13,12 +13,10 @@ "color_picker.invalid_hex": "Enter a 3- or 6-digit hex color", "btn.properties": "Properties", "btn.keep_as_walls": "Keep as walls", - "title.markup_partition": "Partition: draw one independent physical wall", "title.markup_select": "Select and edit walls, columns and saved outlines", "title.markup_column": "Column: click a grid point to place a square column", "markup.partition": "Partition", "markup.column": "Column", - "markup.hint_partition": "two clicks draw one partition · Shift locks to 45°", "markup.hint_column": "click a grid point to place a square column", "history.draft_segment": "Add room-draft segment", "history.draft_merge": "Join unfinished room outlines", @@ -47,7 +45,6 @@ "physical.allowed_range": "Allowed: 1–{max} {unit}", "physical.delete_segment": "Delete segment", "physical.delete_draft": "Delete entire outline", - "physical.partition_size_title": "Thickness of the partition created by the second click (1–100 cm).", "physical.column_size_title": "Outer side of the square column placed by the click (1–150 cm).", "card.title": "House plan", "count.devices": "{n} dev.", diff --git a/src/i18n/ru.json b/src/i18n/ru.json index f0f8a4c1..ef9fda5f 100644 --- a/src/i18n/ru.json +++ b/src/i18n/ru.json @@ -13,12 +13,10 @@ "color_picker.invalid_hex": "Введите цвет HEX из 3 или 6 цифр", "btn.properties": "Свойства", "btn.keep_as_walls": "Оставить стенами", - "title.markup_partition": "Перегородка: нарисуйте одну независимую физическую стену", "title.markup_select": "Выбор и редактирование стен, колонн и сохранённых контуров", "title.markup_column": "Колонна: кликните точку сетки для квадратной колонны", "markup.partition": "Перегородка", "markup.column": "Колонна", - "markup.hint_partition": "два клика рисуют одну перегородку · Shift фиксирует шаг 45°", "markup.hint_column": "кликните точку сетки, чтобы поставить квадратную колонну", "history.draft_segment": "Добавление сегмента черновика комнаты", "history.draft_merge": "Соединение незавершённых контуров комнаты", @@ -47,7 +45,6 @@ "physical.allowed_range": "Допустимо: 1–{max} {unit}", "physical.delete_segment": "Удалить сегмент", "physical.delete_draft": "Удалить весь контур", - "physical.partition_size_title": "Толщина перегородки, создаваемой вторым кликом (1–100 см).", "physical.column_size_title": "Внешняя сторона квадратной колонны, создаваемой кликом (1–150 см).", "card.title": "План дома", "count.devices": "{n} устр.", diff --git a/test/golden-matrix.test.mjs b/test/golden-matrix.test.mjs index 3b4c803c..89869964 100644 --- a/test/golden-matrix.test.mjs +++ b/test/golden-matrix.test.mjs @@ -69,7 +69,7 @@ test('golden matrix has stable unique ids and bounded comparison thresholds', () assert.equal(scenario.openHelp, scenario.helpTextRegion.key, scenario.id); } if (scenario.planSnap) { - assert.equal(['draw', 'partition'].includes(scenario.planSnap.tool), true, scenario.id); + assert.equal(scenario.planSnap.tool, 'draw', scenario.id); assert.equal(['endpoint', 'line'].includes(scenario.planSnap.expectedKind), true, scenario.id); assert.equal(scenario.mode, 'plan', scenario.id); assert.equal(scenario.capture, 'page', scenario.id); diff --git a/test/unified-wall-tool-source.test.mjs b/test/unified-wall-tool-source.test.mjs new file mode 100644 index 00000000..1c8c2a81 --- /dev/null +++ b/test/unified-wall-tool-source.test.mjs @@ -0,0 +1,34 @@ +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import test from 'node:test'; + +const cardSource = readFileSync(new URL('../src/houseplan-card.ts', import.meta.url), 'utf8'); +const en = JSON.parse(readFileSync(new URL('../src/i18n/en.json', import.meta.url), 'utf8')); +const ru = JSON.parse(readFileSync(new URL('../src/i18n/ru.json', import.meta.url), 'utf8')); + +test('runtime exposes only the unified Walls tool state', () => { + const toolType = cardSource.match(/type MarkupTool = ([^;]+);/)?.[1] || ''; + const toolSet = cardSource.match(/const MARKUP_TOOLS = new Set\(\[([\s\S]*?)\]\);/)?.[1] || ''; + + assert.doesNotMatch(toolType, /['"]partition['"]/); + assert.doesNotMatch(toolSet, /['"]partition['"]/); + assert.doesNotMatch(cardSource, /\b_partitionClick\b/); + assert.doesNotMatch(cardSource, /this\._tool\s*(?:===|!==)\s*['"]partition['"]/); + assert.doesNotMatch(cardSource, /['"]partition['"]\s*(?:===|!==)\s*this\._tool/); +}); + +test('only old tool copy is removed while persisted partition copy remains', () => { + for (const locale of [en, ru]) { + for (const key of [ + 'title.markup_partition', + 'markup.hint_partition', + 'physical.partition_size_title', + ]) assert.equal(key in locale, false, key); + + for (const key of [ + 'markup.partition', + 'physical.partition_properties', + 'history.partition_add', + ]) assert.equal(typeof locale[key], 'string', key); + } +});