style(énergie): solaire en jaune, SOC en vert, maison en bleu

Demande de Patrick du 2026-10-15, alignée sur la lecture Victron :
- autoconsommé : jaune doré (était orange) — tout le solaire est jaune,
  l'exporté en jaune pâle par-dessus (nouveau jeton exportSolaire) ;
- SOC de la batterie : vert pointillé (était l'indigo des bornes) ;
- consommation / soutiré : bleu, inchangé.
Le jeton garde son nom (selfUse) : c'est son rôle, pas sa teinte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Patrick Schurig 2026-10-15 07:09:13 +02:00
parent 467384cd4d
commit c1a4d5f46c
2 changed files with 39 additions and 27 deletions

View File

@ -617,7 +617,7 @@ class _EnergyScreenState extends State<EnergyScreen> {
subtitle: 'kWh par période',
legend: [
_LegendDot(EtmTokens.selfUse, 'Autoconsommé'),
_LegendDot(EtmTokens.amber, 'Exporté'),
_LegendDot(EtmTokens.exportSolaire, 'Exporté'),
_LegendDot(EtmTokens.blue, 'Soutiré'),
],
height: 240,
@ -661,10 +661,10 @@ class _EnergyScreenState extends State<EnergyScreen> {
: 'kW — le sommet de la pile est la production',
legend: [
_LegendDot(EtmTokens.selfUse, 'Autoconsommé'),
_LegendDot(EtmTokens.amber, 'Exporté'),
_LegendDot(EtmTokens.exportSolaire, 'Exporté'),
_LegendDot(EtmTokens.blue, 'Consommation'),
if (_aUneBatterie)
_LegendDot(EtmTokens.ev, 'SOC %', dashed: true),
_LegendDot(EtmTokens.soc, 'SOC %', dashed: true),
],
height: 220,
loading: _loading,
@ -988,7 +988,7 @@ class _EnergyScreenState extends State<EnergyScreen> {
meta: meta,
child: Text(
'$pct%',
style: EtmTokens.sans(size: 9, color: EtmTokens.ev),
style: EtmTokens.sans(size: 9, color: EtmTokens.soc),
),
);
},
@ -1033,11 +1033,14 @@ class _EnergyScreenState extends State<EnergyScreen> {
//
// Empilées, il n'y a plus de recouvrement possible :
//
// jaune PV → réseau (exporté) ┐
// orange PV → maison (autoconsommé) ┘ sommet = production totale
// jaune pâle PV → réseau (exporté) ┐
// jaune doré PV → maison (autoconsommé) ┘ sommet = production totale
//
// (L'autoconsommé était orange jusqu'au 2026-10-15 ; Patrick : tout le solaire en
// jaune, les deux parts distinguées par la luminosité.)
//
// La production cesse d'être une courbe : elle EST le haut de la pile. Et quand
// rien n'est exporté, la bande jaune a une hauteur nulle — ce qui est vrai, et se
// rien n'est exporté, la bande pâle a une hauteur nulle — ce qui est vrai, et se
// lit d'un coup d'œil : « tout ce qui est produit est consommé sur place ».
// L'export devient une SURFACE au lieu d'un écart à mesurer à l'œil entre deux
// traits.
@ -1045,14 +1048,14 @@ class _EnergyScreenState extends State<EnergyScreen> {
// Tracé du haut vers le bas : chaque aire est remplie jusqu'à zéro et la suivante
// repeint par-dessus. Même procédé que l'empilement par consommateur.
lineBarsData: [
_aire(prodSpots, EtmTokens.amber), // sommet = production
_aire(prodSpots, EtmTokens.exportSolaire), // sommet = production
_aire(autoSpots, EtmTokens.selfUse), // repeint la part autoconsommée
_line(consoSpots, EtmTokens.blue),
// Le SOC est en indigo, pas en vert pointillé : le vert pointillé a servi à
// l'autoconsommation le temps d'un essai, et sur une installation AVEC batterie
// les deux auraient été indiscernables. Aucun banc sans batterie ne pouvait le
// montrer.
if (hasSoc) _line(socSpots, EtmTokens.ev, dashed: true, width: 1.5),
// Le SOC est VERT pointillé (Patrick, 2026-10-15 : vert = SOC, bleu = maison,
// jaune = solaire). Il avait été passé en indigo parce qu'un essai donnait le
// vert pointillé à l'autoconsommation ; celle-ci est désormais jaune, le conflit
// a disparu.
if (hasSoc) _line(socSpots, EtmTokens.soc, dashed: true, width: 1.5),
],
lineTouchData: LineTouchData(
touchTooltipData: LineTouchTooltipData(
@ -1184,9 +1187,9 @@ class _EnergyScreenState extends State<EnergyScreen> {
final groupes = <BarChartGroupData>[];
var maxKwh = 0.5;
final orange = EtmTokens.selfUse;
final jaune = EtmTokens.amber;
// Le soutiré passe du rouge au BLEU (demande de Patrick, 2026-09-09) : avec l'orange
final dore = EtmTokens.selfUse; // l'autoconsommé, partagé par les deux barres
final jaune = EtmTokens.exportSolaire;
// Le soutiré passe du rouge au BLEU (demande de Patrick, 2026-09-09) : avec le bloc
// partagé sur les deux barres, le rouge en faisait une image trop chaude, et le bleu
// est déjà la couleur de la maison partout ailleurs dans l'app.
final bleu = EtmTokens.blue;
@ -1216,7 +1219,7 @@ class _EnergyScreenState extends State<EnergyScreen> {
width: _largeurBarre(),
borderRadius: const BorderRadius.vertical(top: Radius.circular(2)),
rodStackItems: [
BarChartRodStackItem(0, self, orange),
BarChartRodStackItem(0, self, dore),
BarChartRodStackItem(self, prod, jaune),
],
color: jaune,
@ -1226,7 +1229,7 @@ class _EnergyScreenState extends State<EnergyScreen> {
width: _largeurBarre(),
borderRadius: const BorderRadius.vertical(top: Radius.circular(2)),
rodStackItems: [
BarChartRodStackItem(0, self.clamp(0.0, conso), orange),
BarChartRodStackItem(0, self.clamp(0.0, conso), dore),
BarChartRodStackItem(self.clamp(0.0, conso), conso, bleu),
],
color: bleu,
@ -1791,7 +1794,7 @@ class _KpiSection extends StatelessWidget {
Row(children: [
_KpiTile(
icon: Icons.recycling_rounded,
color: EtmTokens.selfUse,
color: EtmTokens.selfUse, // jaune doré, comme sa bande dans les graphes
bgColor: EtmTokens.amberSoft,
label: 'Autoconsommation',
value: pct(b?.selfConsumptionRate),

View File

@ -93,15 +93,24 @@ class EtmTokens {
static const Color ev = Color(0xFF7C6CE4); // bornes — indigo
static const Color evDark = Color(0xFF8E80EA);
/// **L'autoconsommé**, dans l'empilement du graphe de flux — orange, sous le jaune de
/// l'exporté dont le sommet donne la production totale.
/// **L'autoconsommé** — le solaire gardé sur place. JAUNE doré, depuis le 2026-10-15
/// (Patrick : « la production solaire doit être jaune ; vert = SOC ; bleu = la maison ») :
/// c'était un orange, qui faisait lire le solaire consommé comme autre chose que du solaire.
///
/// ⚠️ Voisine de [pac] (ambre-orange), et c'est assumé : les deux n'apparaissent jamais
/// dans le même graphe — celle-ci décompose la PRODUCTION, celle-là un CONSOMMATEUR. Si
/// la proximité gêne à l'écran sur la page complète, c'est [pac] qui bougera : la paire
/// jaune/orange a été choisie par Patrick pour ce graphe-ci.
static const Color selfUse = Color(0xFFF4661B);
static const Color selfUseDark = Color(0xFFFA7A34);
/// Il s'empile sous [exportSolaire] (jaune pâle) : les deux ensemble font la production,
/// et restent distincts par la luminosité plutôt que par la teinte.
static const Color selfUse = Color(0xFFE6A100);
static const Color selfUseDark = Color(0xFFF5B700);
/// **Le solaire exporté** — jaune pâle, posé sur [selfUse] dans les empilements.
static const Color exportSolaire = Color(0xFFFFD54F);
static const Color exportSolaireDark = Color(0xFFFFE07A);
static Color exportSolaireOf(BuildContext c) =>
_isDark(c) ? exportSolaireDark : exportSolaire;
/// **L'état de charge de la batterie** — vert (même demande du 2026-10-15). Était l'indigo
/// des bornes, ce qui faisait lire le SOC comme une grandeur de recharge VE.
static const Color soc = green;
static Color selfUseOf(BuildContext c) => _isDark(c) ? selfUseDark : selfUse;
static Color pacOf(BuildContext c) => _isDark(c) ? pacDark : pac;