mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-06 22:49:16 +00:00
feat(moon): the moon with any background, and its status in General settings (#718)
The owner decided on 30.09 that the moon is not part of the "Follow the Sun" environment but a switch of its own: with a static background (global or a space's own) the card showed no moon even with the switch on, and the switch said nothing about why the moon was missing right now. With a static background there is no environment, so the moon stands in its own layer, `.hp-moon-sky`: the first child of `.stage` / `.hp-static-stage`, the whole scene, no z-index, filter or will-change, under the plan by DOM order, fading with the #101 View weight. Inside is the very #661 element, so place, size, art and fades are unchanged, and a background switch moves it to its new parent in the same render without a flicker. The phase comes from the same `resolveDayCycle`, computed only while the moon is on and on View; without `sun.sun` both cards keep their 30 s clock ticker and re-render only when the phase changes (the environment is still compared by its whole fingerprint). General settings get a second caption line under the moon switch (`data-moon-status`): one snapshot per opening, judged by the lazy chunk as if the switch were on, first reason wins (no home, day, below 3°, under 3 %), numbers rounded and clamped below the threshold they missed. `moonStatus` decides "shown" with the same `moonShownAt` as the element. It lives in a WeakMap beside the draft, so it never makes the dialog dirty; a closed opening's result is dropped. The dialog loads the chunk through the gate's loader (`withMoon`), now shared by every caller while a load is in flight, so there is still one fingerprint check and one retry token. Bundle (same build, against origin/dev): initial View 300 072 -> 300 248 B gzip (+176 B, under the 500 B of the spec; budget and ceiling not raised); lazy editor 238 558 -> 238 991 B (+433 B, the line and English strings); lazy moon 11 385 -> 11 712 B (+327 B, layer CSS and status). `src/moon.ts` stays out of the initial and the editor graph; bundle-budget now refuses an editor/moon overlap. Monolith metrics: hostRefs 4 885 -> 4 888 — the three `host.` reads of `src/editors/moon-status.ts` (hass, `_settingsDialog`, requestUpdate) through its own three-member interface, not the editor port; the other five metrics are unchanged. houseplan-editor-runtime.ts grows by two lines (import, call). Tests: AC9/AC10/AC15 and the sky layer in test/moon.test.mjs (the #661 "static -> nothing" check inverted), AC14 and the opening lifecycle in test/moon-settings.test.mjs, smokes demo/smoke_moon_static.mjs (AC1-AC6; AC1 and AC3 were red on dev) and demo/smoke_moon_status.mjs (AC11/AC12), AC7 in smoke_daycycle_layer_budget. Golden: two new scenes (static-bg-moon-gibbous-white-light, static-bg-moon-crescent-south-dark, matrix v70), the harness checks the moon's parent by background and waits for the status line in the General settings frames. Four new mutants; the clock ticker one is a browser guard (201 at the guideline of 200). Issue: #718 User-Visible: yes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
This commit is contained in:
+38
-8
@@ -1797,7 +1797,7 @@ WebP и безопасный SVG; лимит 2 МиБ относится к со
|
||||
|
||||
## 15. Солнце и Луна: фон, оконные лучи и луна
|
||||
|
||||
Фон и оконные лучи — две независимые функции; луна живёт на фоне. Фон **Следует за Солнцем** работает без компаса:
|
||||
Фон, оконные лучи и луна — независимые функции; луна стоит за планом при любом фоне. Фон **Следует за Солнцем** работает без компаса:
|
||||
он использует корректные данные `sun.sun`, а при их отсутствии автоматически
|
||||
переходит на локальные часы браузера. Направление севера и `sun.sun` обязательны
|
||||
только для оконных лучей. Общие значения можно переопределить в конкретном
|
||||
@@ -1857,19 +1857,28 @@ WebP и безопасный SVG; лимит 2 МиБ относится к со
|
||||
|
||||
### Луна
|
||||
|
||||
При фоне **Следует за Солнцем** в сумерках (утренних и вечерних) и ночью в левом
|
||||
верхнем углу сцены видна луна в текущей фазе — тонкий серп, половина, полная.
|
||||
Включается одним переключателем в общих настройках, раздел **Солнце и Луна** →
|
||||
**Луна на плане в сумерках и ночью**. У новых установок переключатель включён,
|
||||
у обновлённых старых — выключен, пока его не включат: обновление не меняет вид
|
||||
плана.
|
||||
При любом фоне — **Следует за Солнцем**, фоне темы или своём цвете — в сумерках
|
||||
(утренних и вечерних) и ночью в левом верхнем углу сцены видна луна в текущей
|
||||
фазе — тонкий серп, половина, полная. Включается одним переключателем в общих
|
||||
настройках, раздел **Солнце и Луна** → **Луна на плане в сумерках и ночью**. У
|
||||
новых установок переключатель включён, у обновлённых старых — выключен, пока его
|
||||
не включат: обновление не меняет вид плана. Если переключатель уже был включён,
|
||||
а фон статичный, после обновления луна появится и на нём; убрать её — тем же
|
||||
переключателем.
|
||||
|
||||
Сумерки и ночь определяются так же, как у фона «Следует за Солнцем»: при
|
||||
корректном `sun.sun` — по высоте Солнца (ниже 6°), без него — по часам
|
||||
браузера (день 08:00–18:00). Статичный фон при этом не меняется: вокруг плана
|
||||
остаётся выбранный цвет, градиентов и свечения контура нет, добавляется только
|
||||
луна.
|
||||
|
||||
| Условие | Результат |
|
||||
|---|---|
|
||||
| День, луна ниже 3° над горизонтом или новолуние (освещено меньше 3 %) | Луны нет |
|
||||
| Луна поднимается выше 3° или уходит ниже | Плавно появляется/исчезает за 2 секунды; при системном уменьшении движения — сразу |
|
||||
| Фаза | Меняется непрерывно, каждый день; освещённая сторона всегда слева, убывание идёт теми же состояниями в обратном порядке |
|
||||
| Пространство с собственным статическим фоном | Луны нет — она часть фона «Следует за Солнцем» |
|
||||
| Пространство с собственным статическим фоном | Луна та же: то же место, размер и фаза, фон — выбранный цвет |
|
||||
| Смена фона или переход на вкладку с другим фоном | Луна не мигает и остаётся на месте |
|
||||
| План закрывает угол сцены | Луна за планом: видна та часть диска, что в полях; план, устройства и подписи всегда поверх неё |
|
||||
| Редакторы | Луны нет |
|
||||
| Полная карточка, киоск, статическая карточка пространства | Одинаково |
|
||||
@@ -1881,6 +1890,27 @@ WebP и безопасный SVG; лимит 2 МиБ относится к со
|
||||
появления. Точность положения около 1°: момент пересечения 3° может разойтись с
|
||||
эфемеридами на несколько минут. Наклон терминатора и пепельный свет не
|
||||
воспроизводятся, тёмная сторона — едва заметный силуэт для читаемости серпа.
|
||||
Картинка одна для всех фонов: на среднем сером своём цвете луна контрастнее не
|
||||
станет.
|
||||
|
||||
Под переключателем — строка «Сейчас: …»: видна ли луна в эту минуту, а если нет,
|
||||
то почему — первая по порядку причина:
|
||||
|
||||
| Строка | Когда |
|
||||
|---|---|
|
||||
| Сейчас: показывается (на 24° над горизонтом, освещено 79 %). | Луна видна; высота и освещённость округлены до целых |
|
||||
| Сейчас: не показывается (в Home Assistant не заданы координаты дома). | Нет широты и долготы дома — даже днём |
|
||||
| Сейчас: не показывается (Солнце на 25° над горизонтом, луна видна, когда оно ниже 6°). | День по `sun.sun` |
|
||||
| Сейчас: не показывается (день по часам, 08:00–18:00: в Home Assistant нет данных sun.sun). | День по часам браузера |
|
||||
| Сейчас: не показывается (луна на высоте 2°, видна от 3° над горизонтом). | Луна ниже 3° |
|
||||
| Сейчас: не показывается (новолуние, освещено 2 %, видна от 3 %). | Освещено меньше 3 % |
|
||||
|
||||
Строка считается один раз при открытии диалога и говорит, что было бы при
|
||||
включённом переключателе: положение тумблера, выбор фона в диалоге и
|
||||
настройки пространств на неё не влияют. Она относится к браузеру, в котором
|
||||
открыт диалог: если у настенного планшета другие часы или часовой пояс, его
|
||||
луна может появиться или исчезнуть в другой момент. Пока данные луны
|
||||
загружаются или если загрузка не удалась, строки нет — остаётся общее пояснение.
|
||||
|
||||
## 16. Роботы-пылесосы
|
||||
|
||||
|
||||
Reference in New Issue
Block a user