etm-powersync-app/lib/theme/app_theme.dart
Patrick Schurig c638ec6c52 feat: connexions multi-HEMS + rôles & appareils (beta add/config)
Lot Connexions multi-HEMS :
- modèle Installation + InstallationStore (persistance par UUID ;
  métadonnées SharedPreferences, token via flutter_secure_storage)
- ConnectionManager au-dessus de nymea_service : mono-connexion, switchTo,
  connectNew, enterDemo (démo = active factice), contrôle d'identité DHCP
- nymea_service : connect() réveillé (ws://4444, token par UUID), capture
  Hello (uuid/name/initialSetupRequired), authenticate/createUser, resetState
- écran Installations (3 états) + déverrouillage installateur depuis la racine
- écran Connexion : auth 2 branches (JSONRPC.Authenticate / CreateUser),
  détection auto via initialSetupRequired, segmenteur de repli
- gate de routage (redirect + refreshListenable merge[cm,svc]) ;
  hasActiveConnection = isSimulation || (connected && authenticated)
- en-tête drawer cliquable → Installations
- invalidation des caches au switch (service.resetState + clearForSwitch
  rôles/scheduler/tariff), sans persist()

Lot Rôles & appareils :
- EnergySetupProvider refondu en tri-état (present/absent/non-configuré)
- écran roles_devices_screen (3 zones, drag-priorité, inférence solaire/batterie)
- LoadDescriptor (etmvariableload, rév.2 : PAC exclue → SG-Ready) ;
  Energy.SetRootMeter réel, Get/SetLoadConfig en stub loggé

Correctifs :
- bug signe énergie : production +, consommation NÉGATIVE sur nymea 1.15.2
  → consumptionW/home en .abs() (autoconso n'est plus clouée à 0)
- UUID Hello brace-wrapped normalisé

Tests : flutter analyze 0 erreur ; gate + zéro-fuite au switch (5/5 verts).
Validé en vrai : login auth .120, .75 ouvert, switch, déverrouillage installateur.
Note : embarque aussi le WIP dashboard/thème déjà présent dans l'arbre.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-28 08:39:08 +02:00

70 lines
3.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
class AppTheme {
// ── Couleurs historiques (widgets existants) ──────────────────────────────
static const Color primaryGreen = Color(0xFF4CAF50);
static const Color solarYellow = Color(0xFFF5C842);
static const Color gridGray = Color(0xFF5A6473);
static const Color homeBlue = Color(0xFF5BA4CF);
static const Color batteryGreen = Color(0xFF4CAF50);
static const Color accentOrange = Color(0xFFFF7043);
static const Color backgroundGray= Color(0xFFF0F2F5);
static const Color cardWhite = Color(0xFFFFFFFF);
static const Color textDark = Color(0xFF1A1A2E);
static const Color textLight = Color(0xFF6B7280);
static const Color boostRed = Color(0xFFEF5350);
static const Color pvGreen = Color(0xFF43A047);
static const Color minPvBlue = Color(0xFF42A5F5);
static const Color accentTeal = Color(0xFF57BAAE);
static const Color tileBackground= Color(0xFFF2F4F7);
static const double cornerRadius = 10.0;
static const Color powerAcquisitionColor = Color(0xFFCD5C5C);
static const Color powerReturnColor = Color(0xFFCDCD5C);
static const Color powerConsumptionColor = Color(0xFF5C95CD);
static const Color powerSelfProductionColor= Color(0xFF5CCD5C);
static const Color powerBatteryChargingColor = Color(0xFF955CCD);
static const Color powerBatteryDischargingColor= Color(0xFFCD955C);
// ── Thème clair ───────────────────────────────────────────────────────────
static ThemeData get theme => ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFF31A3DD),
surface: const Color(0xFFEEF2F5),
),
scaffoldBackgroundColor: const Color(0xFFEEF2F5),
cardTheme: const CardThemeData(
color: Colors.white,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20)),
),
margin: EdgeInsets.zero,
),
textTheme: GoogleFonts.ibmPlexSansTextTheme(ThemeData.light().textTheme),
useMaterial3: true,
);
// ── Thème sombre ──────────────────────────────────────────────────────────
static ThemeData get darkTheme => ThemeData(
brightness: Brightness.dark,
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFF31A3DD),
brightness: Brightness.dark,
surface: const Color(0xFF0D2B3B),
),
scaffoldBackgroundColor: const Color(0xFF06141D),
cardTheme: const CardThemeData(
color: Color(0xFF0D2B3B),
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20)),
),
margin: EdgeInsets.zero,
),
textTheme: GoogleFonts.ibmPlexSansTextTheme(ThemeData.dark().textTheme),
useMaterial3: true,
);
}