mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-28 19:01:34 +00:00
#525 увёл оба списка сцены с `map()` на `repeat(items, (item) => item.id, …)`, чтобы Lit не переиспользовал узлы по позиции и не проигрывал анимацию двери, которой не было. Правка верная, но на плане с двумя сотнями маркеров она оказалась дорогой ровно там, где пользы не приносит: при смене пространства ключи не пересекаются вовсе, и `repeat` строит две карты ключей и обходит оба списка, чтобы затем всё равно выбросить всё и создать заново. Бисект по медиане `switchCycleMs` на `large-house`: 871,2 перед #525 → 953,5 после. На раннере эти 80 мс распадаются на шесть-девять дополнительных длинных задач, и `longTask.countP95` вышел за порог стабильного гейта. Теперь оба списка рендерятся как `keyed(space.id, repeat(…))`. Внешний ключ делает смену пространства: поддерево выбрасывается целиком, дифа нет. Внутренний остаётся, потому что состав списков едет и внутри пространства — у маркеров от призраков редактора и живого синка, у проёмов от записи с нерешённым хостом, которая живёт только в режиме plan, — а переходы на `.device-shell-frame`, `.op-leaf` и `.op-arc` никуда не делись. Замер после правки: `switchCycleMs` 889,1 против 936,0 на `main` и 871,2 до #525. Потолок карточки поднят на одну строку — на `import { keyed }`; переносить нечего, сам рендер не вырос ни на символ. Issue: #534 User-Visible: yes
2 lines
5.9 KiB
JavaScript
2 lines
5.9 KiB
JavaScript
globalThis.__HOUSEPLAN_BUILD_FINGERPRINT__="b3e08d50a47faaba7562dc080f267ca13de845113735892a9115a6cdd991392a";import{e7 as e}from"./houseplan-card-bOJWMeFY.js";const t=new WeakMap,n=e=>{let n=t.get(e);return n||(n={painted:null,pending:null,raf:0,anchor:null},t.set(e,n)),n},o=e=>`${e.x} ${e.y} ${e.w} ${e.h}`;function r(e,t){return{translateXPercent:(e.x-t.x)/t.w*100,translateYPercent:(e.y-t.y)/t.h*100,scaleX:e.w/t.w,scaleY:e.h/t.h}}const a=e=>0===e.translateXPercent&&0===e.translateYPercent&&1===e.scaleX&&1===e.scaleY,i=.15;const s=e=>[e.x,e.y,e.w,e.h].every(Number.isFinite)&&e.w>0&&e.h>0,l=(e,t)=>{const n=e.style;if(!t)return void(n.transform&&(n.removeProperty("transform"),n.removeProperty("transform-origin"),n.removeProperty("will-change")));const o=(e=>`translate(${e.translateXPercent}%,${e.translateYPercent}%) scale(${e.scaleX},${e.scaleY})`)(t);n.transform!==o&&(n.transformOrigin="0 0",n.willChange="transform",n.transform=o)},c=(e,t)=>{e.getAttribute("viewBox")!==t&&e.setAttribute("viewBox",t)};function f(e,t,n,f,u={}){const d=u.now??("undefined"!=typeof performance?performance.now():Date.now()),m=f??{frame:t,at:-1/0};if(!s(t.view)||!s(n.view)||!s(n.floor))return m;const h=!0===u.force||!s(m.frame.view)||!s(m.frame.floor)||function(e,t,n){if(n-e.at>=100)return!0;const o=e.frame.view,r=t.view;if(Math.abs(r.x-o.x)>=r.w*i)return!0;if(Math.abs(r.y-o.y)>=r.h*i)return!0;const a=o.w/r.w;return Math.abs(1-a)>=i}(m,n,d),p=h?{frame:n,at:d}:m;if(h){const t=o(n.view),r=o(n.floor);for(const n of e.querySelectorAll('[data-hp-live-viewbox="camera"]'))c(n,t);for(const t of e.querySelectorAll('[data-hp-live-viewbox="floor"]'))c(t,r)}const v=r(p.frame.view,n.view),g=r(p.frame.floor,n.floor);for(const t of e.querySelectorAll('[data-hp-live-viewbox="camera"]'))l(t,a(v)?null:v);for(const t of e.querySelectorAll('[data-hp-live-viewbox="floor"]'))l(t,a(g)?null:g);const w=r(t.view,n.view);for(const t of e.querySelectorAll('[data-hp-live-layer="camera"]'))l(t,a(w)?null:w);const y=e.querySelector("[data-hp-live-zoom]");if(y){const e=n.zoom<=1;y.hidden!==e&&(y.hidden=e);const t=y.querySelector("[data-hp-live-zoom-value]"),o=`${Math.round(100*n.zoom)}%`;t&&t.textContent!==o&&(t.textContent=o)}return p}const u=e=>{const t=e._viewOr(e._baseVb());return{view:{...t},floor:{...e._floorView(t)},zoom:e._zoom}};const d=new WeakMap,m=(e,t,n,o)=>{if(!n)return;const r=document.createElement("span");if(r.className="m",t){r.append(`${t} `);const e=document.createElement("b");e.textContent=n,o&&(e.style.color=o),r.append(e)}else r.textContent=n;e.append(r)},h=(e,t,n)=>{const o=e.querySelector(t);o&&(o.setAttribute("d",n),o.toggleAttribute("hidden",!n))};function p(t){const n=t,o=n.renderRoot;if(!o)return;((t,n)=>{const o=n.querySelector("[data-hp-live-tip]");if(!o)return;const r=t._tip;if(!r)return o.hidden=!0,void o.replaceChildren();o.style.left=`${r.x+12}px`,o.style.top=`${r.y+12}px`,o.replaceChildren();const a=document.createElement("b");a.textContent=r.title,o.append(a),m(o,"",r.meta),m(o,t._t("tip.temp_avg"),null==r.temp?"":`${r.temp}°`),m(o,t._t("tip.hum_avg"),null==r.hum?"":`${r.hum}%`),m(o,t._t("tip.lqi"),null==r.lqi?"":String(r.lqi),null==r.lqi?void 0:e(r.lqi)),o.hidden=!1})(n,o);const r=n._hoverRoom,a=d.get(t),i=r?.space||"",s=r?.room||null;if(a?.room===s&&a?.space===i)return;d.set(t,{room:s,space:i});const l=r&&n._spaceModel(),c=l?n._roomHoverPaths(l):null;h(o,'[data-hp-live-room-hover="fill"]',c?.fillD||""),h(o,'[data-hp-live-room-hover="halo"]',c?.outlineD||""),h(o,'[data-hp-live-room-hover="outline"]',c?.outlineD||"")}function v(e){d.delete(e)}class g{constructor(e){this.host=e,this.deferredHass=!1}hass(e,t,n,o){const r=function(e,t,n){if(e===t)return"none";if(!e||!t||!n)return"structural";if(e.connection!==t.connection||e.entities!==t.entities||e.devices!==t.devices||e.areas!==t.areas||e.themes!==t.themes||e.user!==t.user||e.config!==t.config||e.floors!==t.floors||e.services!==t.services||e.panels!==t.panels||e.language!==t.language||e.locale?.language!==t.locale?.language||e.locale?.number_format!==t.locale?.number_format||e.locale?.time_format!==t.locale?.time_format||e.locale?.date_format!==t.locale?.date_format)return"structural";const o=new Set(["states","connection","entities","devices","areas","themes","user","config","floors","services","panels","language","locale"]);for(const n of new Set([...Object.keys(e),...Object.keys(t)]))if(!o.has(n)&&e[n]!==t[n])return"structural";for(const o of n.entityIds)if(e.states?.[o]!==t.states?.[o])return"state";return"none"}(e,t,n),a="state"===r&&this.active();a&&(this.deferredHass=!0);const i="none"!==r&&!a;return i||this.host._renderLife.observe(e,t,n,o),i}clear(){this.deferredHass=!1}take(){const e=this.deferredHass;return this.deferredHass=!1,e}viewport(e=!1){!function(e,t=!1){const o=e,r=n(e),a=u(o);if(t)return r.raf&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(r.raf),r.raf=0,r.pending=null,r.painted||(r.painted=a),void(r.anchor=f(o.renderRoot,r.painted,a,r.anchor));r.pending=a,r.raf||"function"!=typeof requestAnimationFrame||(r.raf=requestAnimationFrame(()=>{r.raf=0;const e=r.pending;r.pending=null;const t=o.renderRoot;e&&t&&(r.painted||(r.painted=e),r.anchor=f(t,r.painted,e,r.anchor))}))}(this.host,e)}hover(){p(this.host)}active(){const e=this.host;return e._pointers.size>0||e._cameraTransition.active||!!e._deviceDrag||!!e._physicalDrag||!!e._physicalRotate||!!e._decorMove||!!e._decorDraft||!!e._dtDrag||!!e._bdDrag||!!e._opDrag||!!e._resize?.dragging}commit(){!function(e){const t=e,o=n(e);o.raf&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(o.raf),o.raf=0,o.pending=null,o.painted=u(t);const r=t.renderRoot;if(r){for(const e of r.querySelectorAll('[data-hp-live-layer="camera"]'))l(e,null);o.anchor=f(r,o.painted,o.painted,o.anchor,{force:!0})}}(this.host),v(this.host),p(this.host)}dispose(){!function(e){const n=t.get(e);n?.raf&&"function"==typeof cancelAnimationFrame&&cancelAnimationFrame(n.raf),t.delete(e)}(this.host),v(this.host)}}export{g as LiveRuntime};
|