Skip to content

Commit 96e8097

Browse files
authored
Merge pull request #84 from jingle-jew/dev
Add detailed light controls and dynamic weather page
2 parents 7673761 + 27ccc30 commit 96e8097

101 files changed

Lines changed: 6491 additions & 104 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.codex/PROJECT_MEMORY.md

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,31 @@
11
# Mémoire persistante — MHA Widget Hub
22

3-
Dernière consolidation : 2026-07-15
3+
Dernière consolidation : 2026-07-19
44

55
Ce fichier contient les connaissances durables qui seraient coûteuses à redécouvrir.
66
Le code et les tests actuels restent la source de vérité. Les instructions de travail
77
appartiennent à `AGENTS.md`.
88

99
## Décisions et raisons
1010

11+
### 2026-07-19 — Composer le popup lumière autour de deux colonnes stables
12+
13+
- **Statut :** confirmé.
14+
- **Décision :** sur tablette et desktop, le popup lumière conserve une même
15+
géométrie externe et deux colonnes : les contrôles rapides à gauche, la
16+
couleur à droite. Le réglage `orientation` est exposé par dataset et pilote
17+
uniquement la composition complète de la colonne gauche (ordre, axe des
18+
sliders, disposition des ambiances et proportions) à partir d'une seule
19+
structure DOM. La colonne couleur reste commune aux deux modes.
20+
- **Pourquoi :** limiter l'orientation à un slider laissait les ambiances et les
21+
proportions hors du contrat de configuration, tandis que dupliquer les vues
22+
aurait créé deux chemins de synchronisation Home Assistant fragiles.
23+
- **Conséquence :** luminosité et température restent dans les contrôles
24+
rapides; saturation, teinte et roue colorimétrique partagent un seul état HSV
25+
synchronisé avec Home Assistant. Les futurs ajustements d'alignement doivent
26+
rester dans la grille CSS pilotée par `data-orientation`, sans créer une
27+
seconde implémentation JavaScript.
28+
1129
### 2026-07-15 — Faire du mouvement une signature visuelle MHA
1230

1331
- **Statut :** confirmé.
@@ -61,6 +79,63 @@ appartiennent à `AGENTS.md`.
6179
`widget-config-popup.js`, afin de rester découplés du DOM interne des contrôles
6280
partagés.
6381

82+
### 2026-07-18 — Composer les nuages météo avec chaque paysage
83+
84+
- **Statut :** confirmé.
85+
- **Décision :** chaque WebP météo fournit un petit profil de composition
86+
déclaratif dans `weather-background-assets.js` : horizon perçu, hauteur utile
87+
du champ nuageux, début et douceur du fondu, intensité de la brume. Le
88+
générateur conserve ses profondeurs `far`/`mid`/`near`, son mouvement et sa
89+
génération procédurale, mais construit quelques grandes nappes chevauchées
90+
dont la distribution est pilotée par la météo et ce profil de scène.
91+
- **Pourquoi :** une hauteur globale et de petits nuages placés indépendamment
92+
donnent l'impression d'une couche posée devant la photographie. Le contrat de
93+
composition permet aux nappes basses de se dissoudre autour du relief et à la
94+
brume de prolonger naturellement l'atmosphère déjà présente dans le WebP.
95+
- **Conséquence :** garder les paysages comme source visuelle principale; pour
96+
calibrer ou ajouter un asset météo, ajuster d'abord son profil de composition
97+
plutôt que créer une exception CSS ou analyser l'image au runtime. Les
98+
changements fins d'opacité et de vent se synchronisent en place; seul un
99+
changement du nombre de nappes réutilise le crossfade de scène existant.
100+
101+
### 2026-07-18 — Résoudre les scènes météo depuis une registry de paysages
102+
103+
- **Statut :** confirmé.
104+
- **Décision :** `weather-background-assets.js` est la source de vérité des
105+
paysages météo. Chaque entrée déclare son identifiant, son libellé, sa
106+
preview, ses WebP par moment (`dawn` à `night`) et ambiance (`clear`,
107+
`overcast-light`, `overcast-high`), son profil de composition et un point de
108+
raccord optionnel pour de futurs assets d'hiver. Le paysage sélectionné est
109+
persisté dans la configuration de la page sous `weatherLandscapeId`, avec
110+
`alpine-lake` comme fallback.
111+
- **Pourquoi :** séparer le paysage photographique des effets procéduraux
112+
conserve le moteur météo existant tout en rendant la sélection testable et
113+
extensible. Le resolver ne construit jamais une URL supposée : il ne choisit
114+
que parmi les assets déclarés et applique une chaîne de fallback explicite.
115+
- **Conséquence :** ajouter un paysage passe d'abord par cette registry et par
116+
le settings-panel de la page Météo, sans créer de stockage parallèle. Le
117+
panneau dev garde la condition et le moment comme deux axes indépendants; son
118+
override `_mha_weather_period_override` appartient uniquement au mock local.
119+
120+
### 2026-07-18 — Supporter les paysages météo procéduraux dans la registry
121+
122+
- **Statut :** confirmé.
123+
- **Décision :** une entrée de `weather-background-assets.js` déclare désormais
124+
explicitement son `type` (`raster` ou `procedural`) et son `renderer`. Le
125+
renderer `celestial-gradient` possède ses sept profils temporels, ses
126+
interpolations et ses fallbacks solaire/lunaire dans
127+
`weather-celestial-gradient.js`; il ne dépend pas des ambiances issues des
128+
conditions météo.
129+
- **Pourquoi :** le paysage de ciel doit partager sélection, persistance,
130+
composition et couches d'effets avec les WebP sans simuler une URL d'image ni
131+
dupliquer le moteur météo.
132+
- **Conséquence :** la `sceneKey` procédurale reste structurelle. Les changements
133+
de couleurs, positions des astres, phase lunaire et opacité des étoiles sont
134+
synchronisés en place par variables CSS lorsque la structure météo ne change
135+
pas; ils ne recréent donc ni le fond ni les nuages/précipitations. Toute future
136+
entrée procédurale doit préserver cette séparation entre renderer temporel et
137+
effets météo indépendants.
138+
64139
## Pièges connus
65140

66141
- Les contrôles MHA vivent dans le Shadow DOM du hub. Pour détecter un clic
@@ -157,7 +232,13 @@ appartiennent à `AGENTS.md`.
157232
toujours les conditions de la période courante, ou de la période suivante
158233
après le milieu de la période courante; son ancienne logique prioritaire sert
159234
uniquement de ligne d’avis secondaire. Lorsqu’un avis existe, cette ligne est
160-
précédée d’un petit glyphe triangulaire d’avertissement.
235+
précédée d’un petit glyphe triangulaire d’avertissement. Les avis de pluie et
236+
de neige emploient une heure locale approximative lorsque les prévisions sont
237+
horaires (« vers 14 h »), puis retombent sur la période naturelle (« ce soir »)
238+
avec des prévisions quotidiennes. Ce choix de source reste automatique : la
239+
configuration du « Bref météo » expose uniquement l’entité météo et ne
240+
persiste pas de `forecastType`; le sélecteur horaire/quotidien demeure réservé
241+
aux widgets météo qui affichent réellement une prévision choisie.
161242
- Les surfaces du dock OneUI, standard comme compactes, sont légèrement
162243
translucides, floutées et teintées par la couleur d’accent active du thème.
163244
La pastille de l’élément actif reprend cette teinte avec une intensité plus
@@ -231,3 +312,14 @@ appartiennent à `AGENTS.md`.
231312
- Sur la page Média mobile, le dock reste masqué pendant toute l’ouverture de la
232313
sheet « Lecteurs disponibles »; son empreinte structurelle est conservée pour
233314
éviter un reflow.
315+
- Le contrôle détaillé des entités `light` s’ouvre uniquement depuis la zone
316+
informative des widgets `toggle` et `toggle-slider`; leurs toggles, sliders et
317+
outils d’édition gardent leurs interactions directes. Il repose sur le contrat
318+
de surface existant (`page-creator` en popup et sheet mobile), dont l’en-tête
319+
conserve le swipe descendant de fermeture. Le contenu est séparé en vues
320+
contrôle, couleur personnalisée et configuration. En portrait mobile, les
321+
deux sections principales se parcourent par scroll vertical paginé; en
322+
paysage, tablette et desktop elles restent côte à côte sans scroll global.
323+
Les préréglages persistants appartiennent à `widget.lightPopup` et sont
324+
normalisés par le registry du widget; les appels HA restent centralisés dans
325+
l’adaptateur lumière et les sliders utilisent l’action coalescée existante.

0 commit comments

Comments
 (0)