fix(2.5D): preserve geometry on settings toggle
Проверка (CI) / Классификация изменённых файлов (push) Successful in 3m7s
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 6m52s
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / HACS: валидация репозитория (push) Failing after 29s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 57s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 16s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 1m25s
Проверка (CI) / Смоки в браузере (шард 1 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 2 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 3 из 3) (push) Skipped
Проверка (CI) / Смоки: все шарды зелёные (push) Skipped
Проверка (CI) / Golden-кадры против принятых эталонов (push) Skipped
Проверка (CI) / Перф-смок: бюджет времени кадра (push) Skipped
Проверка (CI) / Геометрия: TS/Python parity исполнена (push) Failing after 1m32s
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Failing after 5m6s
Проверка (CI) / Доказательство выполненных проверок (push) Failing after 18s

Issue: #649
User-Visible: no
This commit is contained in:
Sergey Matyunin
2026-09-25 23:33:07 +03:00
parent 8703727951
commit ec2b8c1522
74 changed files with 709 additions and 681 deletions
+4 -3
View File
@@ -23,7 +23,7 @@ const read = (ids) => page.evaluate(([white, tinted]) => {
const marker = (id) => root.querySelector(`.devlayer .dev:not(.iso-tile-shadow)[data-id="${id}"]`);
const twin = (id) => root.querySelector(`.iso-tile-shadows .iso-tile-shadow[data-shadow-of="${id}"]`);
const shadow = (id) => {
const s = twin(id)?.querySelector('.device-core');
const s = twin(id);
const m = s && getComputedStyle(s).boxShadow
.match(/rgba?\(28, 32, 28(?:, ([\d.]+))?\) (-?[\d.]+)px (-?[\d.]+)px ([\d.]+)px (-?[\d.]+)px/);
return m ? { a: Number(m[1] ?? 1), dx: +m[2], dy: +m[3], blur: +m[4], spread: +m[5] } : null;
@@ -36,7 +36,7 @@ const read = (ids) => page.evaluate(([white, tinted]) => {
const edge = cs.boxShadow.match(/^(rgba?\([^)]*\)) 0px ([\d.]+)px 0px/);
const frame = dev.querySelector('.device-shell-frame');
const rect = core.getBoundingClientRect();
const twinCore = twin(id)?.querySelector('.device-core')?.getBoundingClientRect();
const twinCore = twin(id)?.getBoundingClientRect();
return {
w: rect.width, h: rect.height, top: rect.top,
radius: px(cs.borderTopLeftRadius), bg: cs.backgroundColor,
@@ -59,7 +59,8 @@ const read = (ids) => page.evaluate(([white, tinted]) => {
twinsInert: [...root.querySelectorAll('.iso-tile-shadow')].every((s) => getComputedStyle(s).pointerEvents === 'none'
&& s.getAttribute('aria-hidden') === 'true' && !s.hasAttribute('tabindex')),
twinsGeometryOnly: [...root.querySelectorAll('.iso-tile-shadows .dev.iso-tile-shadow')]
.every((s) => !s.querySelector('ha-icon, .device-pulse, .activity-dot, .newdot, .habadge, .lqi')),
.every((s) => !s.querySelector('ha-icon, .device-pulse, .activity-dot, .newdot, .habadge, .lqi')
&& (s.querySelector('.value-badge') || s.childElementCount === 0)),
badgeGap: (() => {
const dev = marker('d_temp');
const core = dev?.querySelector('.device-core')?.getBoundingClientRect();