|
1 | 1 | # Mémoire persistante — MHA Widget Hub |
2 | 2 |
|
3 | | -Dernière consolidation : 2026-07-15 |
| 3 | +Dernière consolidation : 2026-07-19 |
4 | 4 |
|
5 | 5 | Ce fichier contient les connaissances durables qui seraient coûteuses à redécouvrir. |
6 | 6 | Le code et les tests actuels restent la source de vérité. Les instructions de travail |
7 | 7 | appartiennent à `AGENTS.md`. |
8 | 8 |
|
9 | 9 | ## Décisions et raisons |
10 | 10 |
|
| 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 | + |
11 | 29 | ### 2026-07-15 — Faire du mouvement une signature visuelle MHA |
12 | 30 |
|
13 | 31 | - **Statut :** confirmé. |
@@ -61,6 +79,63 @@ appartiennent à `AGENTS.md`. |
61 | 79 | `widget-config-popup.js`, afin de rester découplés du DOM interne des contrôles |
62 | 80 | partagés. |
63 | 81 |
|
| 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 | + |
64 | 139 | ## Pièges connus |
65 | 140 |
|
66 | 141 | - Les contrôles MHA vivent dans le Shadow DOM du hub. Pour détecter un clic |
@@ -157,7 +232,13 @@ appartiennent à `AGENTS.md`. |
157 | 232 | toujours les conditions de la période courante, ou de la période suivante |
158 | 233 | après le milieu de la période courante; son ancienne logique prioritaire sert |
159 | 234 | 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. |
161 | 242 | - Les surfaces du dock OneUI, standard comme compactes, sont légèrement |
162 | 243 | translucides, floutées et teintées par la couleur d’accent active du thème. |
163 | 244 | La pastille de l’élément actif reprend cette teinte avec une intensité plus |
@@ -231,3 +312,14 @@ appartiennent à `AGENTS.md`. |
231 | 312 | - Sur la page Média mobile, le dock reste masqué pendant toute l’ouverture de la |
232 | 313 | sheet « Lecteurs disponibles »; son empreinte structurelle est conservée pour |
233 | 314 | é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