mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
7d4d75bdfb90c99de2b7e59ddc2cd9a910390de9
5
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
47469bab22 |
Монолит: мёртвый код снят по noUnusedLocals, связность измеряется шестью числами и гейтом (#624)
Карточка и редакторский рантайм держали ≈380 неиспользуемых импортов, 56 мёртвых объявлений и дублей типов (warm-boot, LS_*, GLOW_*, debounce, navigate, lruRead — копии карточки в рантайме) и 112 приватных членов карточки, которых не читал никто — делегаты `_editorRuntimeOrThrow()._x()`, оставшиеся от выноса #425, и аксессоры glow-состояния. Всё это снято; в 9 других файлах — по одиночной ошибке. Делегаты и поля, которых касаются браузерные смоки (`card._x(...)`), оставлены и посчитаны отдельно. Гейт `npm run lint:unused` (scripts/unused-locals-gate.mjs, в gate:small и Validate после сборки): `tsc --noUnusedLocals` чист, кроме приватных членов карточки из порта HouseplanEditorHostPort / `host.` (portPrivates) и членов, которых зовёт харнесс (harnessPrivates); храповик по шести числам scripts/monolith-metrics.mjs против scripts/monolith-baseline.json — delegates 260→159, portMembers 350, hostRefs 4948, portPrivates 96, harnessPrivates 107, bundleBytes 2 510 141→2 500 387. `npm run inventory` печатает те же числа. Заморозка 54 тестов, читающих монолит как текст (test/monolith-text-anchors.test.mjs); PROCESS.md §2.7 — правило. Логический исходник для контрактных тестов (test/houseplan-source.mjs) дописывает члены рантайма без делегата в карточке — контракт продукта не зависит от наличия заглушки. Потолки ядер и initial gzip опущены на выигрыш (292 000 → 290 400). Бандл пересобран, три копии синхронны. Issue: #624 User-Visible: no |
||
|
|
de71bd7967 |
feat(general): «Общие настройки» по референсу — серия 2 из четырёх (#600)
§5 SPEC.md референса. Семь карточек #598 остались, менялось содержимое: - Display — две полные строки с иконкой, подписью и тумблером справа; пояснение радара по §5.2 стало подписью строки (текст прежний, ключ переехал в ленивый словарь как gs.radar_show_live_hint, «?» у строки больше нет); - Zigbee links — заголовок и «?» функции (topology.help) рисует карточка, а блок hp-zigbee-topology-settings получил режим embedded: строка-тумблер, callout «сохраните настройку», подзаголовки ZHA / Zigbee2MQTT, поле тем и строки действий контролами набора. Заголовок больше не удваивается (дефект 1). Лист набора вносится в теневой корень компонента; токены --hpf-* наследуются с хоста. Прежний render без embedded не тронут — его держит контракт #459; - Room fill colors — три подзаголовка (Lights / Temperature / Zigbee signal, Q6) и плитки цвета по три в ряд: название на свотче, hex, число прозрачности; свотч — trigger прежнего hp-color-opacity (Q5); - Light-source glow — две плитки и поле радиуса с единицей внутри рамки; - Plan — плашка цвета стен, сегмент фона, при Static — плашка фона с Reset и подсказкой (тема / свой цвет); - Sun — gs.sun_missing остаётся callout'ом (К5); север: поле градусов с «°», ссылка Clear, «N» и компас 44 px справа — индикатор набора, но тянуть его по-прежнему можно (smoke_sun гоняет настоящий drag; старый 120-px SVG и его CSS в plan.styles.ts удалены); лучи — строка-тумблер с подписью; источник лучей — сегмент (sun-settings-view.ts переписан с <select> на segmented, логика та же); - Data — подзаголовки с «?» и строки действий набора. К10 (Q1): Save только при изменениях и без ошибок (радиус > 0, север 0–359), статус в футере, вопрос при закрытии с изменениями; снимок при открытии — editors/general-form-state.ts поверх общего editors/dialog-baseline.ts (на него же переведён space-form-state.ts). _settingsDialog не получил новых ключей. Удалено мёртвое: _renderColorRow (рантайм и карточка), .sunrow/.suncol, ключи gs.wall_group, gs.bg_group, gs.bg_theme, gs.radar_show_live.help(.aria) в четырёх локалях. Девять новых ключей — в i18n/settings. Смоки переписаны осознанно, с пометкой #600: smoke_general_settings (инвентарь по классам набора, подзаголовки .hpf-sub h4, пояснения под «?» и подписью, ни одного .rhint), smoke_sun (сегмент источника лучей вместо select, поле #gs-north, radius drag 18 px), smoke_backup_transfer (подзаголовок и строка действий), smoke_settings_dialog_cards (callout вместо .rhint). Новый фокусный свидетель demo/smoke_general_settings_form.mjs: семь карточек и отсутствие старой разметки, один заголовок у Zigbee, десять плиток, компас 44, цели 44, запись плиток/плашки/радиуса/севера/сегментов в свои ключи, Save/dirty/вопрос при закрытии. Мутанты: general-save-enabled-without-changes, general-tile-opacity-writes-a-neighbour-key, general-north-clear-writes-zero, topology-embedded-draws-its-own-heading; якоря state-callout-hidden-under-help и dialog-card-loses-its-heading переставлены на новую разметку. Контрактные тесты: houseplan-source.mjs приводит `host.` к `this.` и в телах вынесенных диалогов; color-picker — три явных showOpacity=true (плитки, плашка стены, цвет комнаты); счётчик производных .aria 35 → 34. Бюджет: стартовый граф 290 711 — потолок ОПУЩЕН 292 500 → 292 200 (ушёл 120-px компас из eager-листа и мёртвые ключи); ленивый редакторский 237 929 — потолок 236 300 → 238 600 с разбором в bundle-budget.mjs. Гейты: typecheck, build, bundle:sync, npm test 2792 pass, mutation-gate --check, семь смоков «Общих», smoke_color_picker_consumers без правок. Issue: #600 User-Visible: no |
||
|
|
91a008db9c |
feat(space): диалог «Пространство» по референсу — серия 1 из четырёх (#600)
§4 SPEC.md референса, четыре карточки: Basics (имя и масштаб в сетке 1fr/175, подложка двумя choice-карточками, callout о пересчёте масштаба), Appearance (строка-тумблер границ с иконкой и подписью, сегмент стиля стен с образцами линии, плашка цвета с hex/прозрачностью/Reset, сегмент заливки с деталями режима, компактный список «Видимые слои» с логикой «включено = видно» — К2), Room cards (строка-тумблер названий, четыре плитки значений с отключением и callout-ссылкой, слайдер размера с числом, концами и «Сбросить до 100%», образец карточки внутри блока на тинте — Q2), Sun & light (сегмент фона, плашка цвета фона, радио «свет через окна» в строку, север селектом с компасом 44 px и полем градусов, строка-тумблер свечения). Одна форма на два рантайма. `renderSpaceForm` в `editors/space-form.ts` собирает тело и футер; редакторский вход (`space-settings-dialog.ts`) и онбординг подают порт с тем, что у них различается, и сами рисуют `<hp-dialog data-kind=…>` — контракт #489 требует литеральный kind. Копия разметки онбординга на 300 строк удалена; локальные дубли CELL_CM_* и strictNumber там же — тоже («одно число — один источник»). К10 (решение владельца Q1): Save активен только при изменениях и без ошибок, в футере «Есть несохранённые изменения» либо ссылка «Проверьте поля: N» к первому ошибочному; «✕», Cancel и Escape с изменениями спрашивают через `_confirmDanger`, без изменений закрывают сразу. Снимок делается при открытии (`editors/space-form-state.ts`, WeakMap по хосту) — `SpaceDialogState` не получил ни одного ключа. Валидация: имя, подложка без изображения, диапазон температур, север 0–359 — с `aria-invalid` и текстом под полем. Строки. 51 новый ключ живёт в ленивом словаре `i18n/settings` (приём #423/#459), не в первом кадре: стартовый граф 291 260 при потолке 292 500. Отдельный словарь, а не `support`, — иначе онбординг тянул бы весь словарь редактора ради одной формы. 11 существующих ключей переименованы по Q6 («Space name», «Appearance», «Room cards», «Draw it myself», «Zigbee signal next to devices»…), 9 мёртвых удалены из четырёх локалей. `hp-color-opacity` получил `hide-label`: подпись рисует плашка, `label` остаётся для title/aria и `smoke_color_picker_consumers` проходит без правок (AC5). Смоки. Переписаны осознанно (К6 снят), каждый — с пометкой #600 у правки: smoke_hide_layers (компактные строки, инверсия К2 проверяется кликом), smoke_ux_fixes (сегмент, строка-тумблер, поля °C, ширина 560 — Q7), smoke_dialog_footer_width (560 для form-shell), smoke_temp_fill (два поля по id), smoke_settings_dialog_cards (три сегмента), smoke_space_settings и smoke_space_create_display_defaults и smoke_lazy_editor_chunk (choice-карточка по смыслу, не по индексу — порядок §4.2 draw → file), smoke_space_scale_defaults (поле с единицей). Новый фокусный свидетель demo/smoke_space_settings_form.mjs: состав карточек и отсутствие старой разметки, оболочка 560 и один скроллер, цели 44, запись каждого нового контрола в свой ключ, Save/dirty/вопрос при закрытии, семь контрольных ширин (320…1920). Мутанты: space-fill-segment-writes-a-neighbour-key, space-save-enabled-without-changes, space-discard-without-asking, space-layer-toggle-loses-inversion. Контрактные тесты: `houseplan-source.mjs` дописывает общие модули диалогов к логическому исходнику; коллектор i18n видит `help(...)` порта и `shelp(...)` (заодно встал на учёт `radar.help`, проходивший мимо счётчика — 30 → 35). Потолок ленивого редакторского графа 225 900 → 236 300 (замер 235 560) с разбором в bundle-budget.mjs: словарь на четыре локали и подписи — большая часть роста; промежуточно, итог в конце серий. Гейты: typecheck, build, bundle:sync, npm test 2792 pass (красным был только потолок — поднят с доводом), 10 смоков пространства зелёные, smoke_color_picker_consumers без правок, mutation-gate --check. Issue: #600 User-Visible: no |
||
|
|
b76f3e5756 |
refactor: вынести четыре диалога настроек в модули (#592)
Шаг 0 эпика #591. Видимых изменений нет — это подготовка: оба ядра стояли в трёх строках от жёсткого потолка, а разметка диалогов была крупнейшей перемещаемой частью редакторского рантайма. Перенос механический и проверяемый. Тела всех четырёх методов уехали побайтово: тип `this` объявлен параметром функции, поэтому ни одна строка разметки, ни один обработчик и ни один якорь мутанта не переписаны, а в классе остались однострочные делегаты. Сверка при подготовке коммита: 43 617, 16 795, 10 590 и 6 719 символов совпали посимвольно с оригиналом. src/editors/marker-dialog.ts диалог устройства на плане src/editors/space-settings-dialog.ts диалог пространства src/editors/general-settings-dialog.ts общие настройки src/editors/room-settings-dialog.ts настройки комнаты Имена файлов пространства и комнаты уточнены против ТЗ: рядом уже живёт `src/space-dialog.ts` с логикой того же диалога, и два `space-dialog.ts` в одном дереве путали бы обоих — и человека, и grep. Попутно из рантайма уехали два словаря ярлыков режима отображения (их единственный потребитель — диалог устройства) и границы шага сетки: последние теперь объявлены в модуле, который рисует поле, а кламп записи импортирует их оттуда. Направление импорта то же, что у самой функции рисования, цикла нет. `_radarSetup` стал публичным: диалог устройства обращается к контроллеру из своего модуля, а остальной класс и так живёт на `public _x`. Потолок ядра опущен 14100 → 12810 — ровно на 1290 вынесенных строк, запас над фактом прежний. Незафиксированный выигрыш ядро отыграло бы первой же правкой. Сборщик логического исходника для контрактных тестов (`test/houseplan-source.mjs`) научен подставлять тело вынесенной функции вместо делегата: шесть тестов, читающих разметку, продолжают видеть ровно то же, что и до переноса, — иначе их пришлось бы переучивать на новые пути в тот самый момент, когда они должны доказать, что перенос ничего не изменил. Issue: #592 User-Visible: no |
||
|
|
2c65fcec03 |
perf: lazy-load editor runtime
Issue: #337 User-Visible: yes |