mirror of
https://github.com/R0m1k3/xtremflow.git
synced 2026-10-11 17:30:00 +02:00
fix(ui): remplacer les couleurs Material codées en dur par les jetons Warm Cinema
41 couleurs Material brutes traînaient encore dans l'interface, hors palette : rouge, vert, orange et surtout un violet omniprésent sur les Season Pass, qui n'appartient à aucune famille du thème. Correspondances retenues : - Colors.red / redAccent -> AppColors.live (#E5484D) pour les badges LIVE et les indicateurs d'enregistrement, AppColors.error pour les messages d'erreur - Colors.green / greenAccent -> AppColors.success - Colors.orangeAccent -> AppColors.warning - Colors.amber -> AppColors.ratingGold, pour aligner les étoiles de notation du mobile sur celles du bureau - Colors.purpleAccent -> famille secondary (terre cuite) - fonds de boutons passés sur les variantes *Container avec leur couleur de premier plan, le remplissage clair ne portant pas de texte lisible Le titre du programme EPG dans la grille Live TV utilisait ratingGold, un jeton réservé aux notes : il passe sur primary, l'accent ember du thème. Les fonds de SnackBar vert/rouge deviennent surfaceContainerHigh, le succès et l'échec restant portés par le pictogramme du message. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
537312908a
commit
8b82b101aa
10 files changed
+54
-48
No files matched your search
@@ -1042,7 +1042,7 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.red,
|
||||
color: AppColors.live,
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: const Text(
|
||||
@@ -1090,7 +1090,7 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.red,
|
||||
color: AppColors.live,
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: const Text(
|
||||
@@ -1139,7 +1139,7 @@ class _PlayerScreenState extends ConsumerState<PlayerScreen> {
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.red,
|
||||
color: AppColors.live,
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: const Text(
|
||||
|
||||
@@ -156,7 +156,7 @@ class _SeriesDetailScreenState extends ConsumerState<SeriesDetailScreen> {
|
||||
if (_seriesInfo!.rating != null)
|
||||
Row(
|
||||
children: [
|
||||
Icon(Icons.star, size: 16, color: Colors.amber.shade700),
|
||||
Icon(Icons.star, size: 16, color: AppColors.ratingGold),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
_formatRating(_seriesInfo!.rating!)!,
|
||||
|
||||
@@ -63,7 +63,8 @@ class _LiveTVTabState extends ConsumerState<LiveTVTab>
|
||||
body: channelsAsync.when(
|
||||
loading: () => const ThemedLoading(),
|
||||
error: (e, s) => Center(
|
||||
child: Text('Error: $e', style: const TextStyle(color: AppColors.onSurface)),
|
||||
child: Text('Error: $e',
|
||||
style: const TextStyle(color: AppColors.onSurface)),
|
||||
),
|
||||
data: (groupedChannels) {
|
||||
var categories = groupedChannels.keys.toList();
|
||||
@@ -160,9 +161,10 @@ class _LiveTVTabState extends ConsumerState<LiveTVTab>
|
||||
style: GoogleFonts.karla(color: AppColors.onSurface),
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Search channels...',
|
||||
hintStyle: GoogleFonts.karla(color: AppColors.onSurface54),
|
||||
prefixIcon:
|
||||
const Icon(Icons.search, color: AppColors.onSurface54),
|
||||
hintStyle:
|
||||
GoogleFonts.karla(color: AppColors.onSurface54),
|
||||
prefixIcon: const Icon(Icons.search,
|
||||
color: AppColors.onSurface54),
|
||||
border: InputBorder.none,
|
||||
contentPadding: const EdgeInsets.symmetric(
|
||||
horizontal: 16,
|
||||
@@ -483,7 +485,7 @@ class _LiveTVTabState extends ConsumerState<LiveTVTab>
|
||||
return Text(
|
||||
currentProgram.title,
|
||||
style: GoogleFonts.karla(
|
||||
color: AppColors.ratingGold,
|
||||
color: AppColors.primary,
|
||||
fontSize: 10,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
@@ -501,7 +503,7 @@ class _LiveTVTabState extends ConsumerState<LiveTVTab>
|
||||
error: (_, __) => Text(
|
||||
'Err',
|
||||
style: GoogleFonts.karla(
|
||||
color: Colors.red,
|
||||
color: AppColors.error,
|
||||
fontSize: 10,
|
||||
),
|
||||
),
|
||||
@@ -531,7 +533,7 @@ class _LiveTVTabState extends ConsumerState<LiveTVTab>
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.fiber_manual_record,
|
||||
color: Colors.redAccent,
|
||||
color: AppColors.live,
|
||||
size: 16,
|
||||
),
|
||||
),
|
||||
|
||||
@@ -298,12 +298,12 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView>
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: isSelected
|
||||
? Colors.redAccent.withOpacity(0.2)
|
||||
? AppColors.live.withOpacity(0.2)
|
||||
: AppColors.onSurface.withOpacity(0.05),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
border: Border.all(
|
||||
color: isSelected
|
||||
? Colors.redAccent.withOpacity(0.5)
|
||||
? AppColors.live.withOpacity(0.5)
|
||||
: Colors.transparent,
|
||||
),
|
||||
),
|
||||
@@ -415,7 +415,7 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView>
|
||||
child: Text(
|
||||
'Erreur EPG: $_epgError',
|
||||
style: const TextStyle(
|
||||
color: Colors.redAccent,
|
||||
color: AppColors.live,
|
||||
fontSize: 12,
|
||||
),
|
||||
textAlign: TextAlign.center,
|
||||
@@ -519,7 +519,7 @@ class _ProgrammeCard extends StatelessWidget {
|
||||
children: [
|
||||
const Icon(
|
||||
Icons.fiber_manual_record,
|
||||
color: Colors.redAccent,
|
||||
color: AppColors.live,
|
||||
size: 20,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
@@ -565,7 +565,10 @@ class _ProgrammeCard extends StatelessWidget {
|
||||
child: const Text('Annuler'),
|
||||
),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(backgroundColor: Colors.redAccent),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.errorContainer,
|
||||
foregroundColor: AppColors.onErrorContainer,
|
||||
),
|
||||
onPressed: () async {
|
||||
Navigator.pop(ctx);
|
||||
await _saveRecording(
|
||||
@@ -608,9 +611,7 @@ class _ProgrammeCard extends StatelessWidget {
|
||||
? '✅ "$title" planifié !'
|
||||
: '❌ Erreur: ${response.body}',
|
||||
),
|
||||
backgroundColor: response.statusCode == 200
|
||||
? Colors.green.shade800
|
||||
: Colors.red.shade800,
|
||||
backgroundColor: AppColors.surfaceContainerHigh,
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -631,14 +632,14 @@ class _ProgrammeCard extends StatelessWidget {
|
||||
margin: const EdgeInsets.only(bottom: 6),
|
||||
decoration: BoxDecoration(
|
||||
color: isNow
|
||||
? Colors.red.withOpacity(0.15)
|
||||
? AppColors.live.withValues(alpha: 0.15)
|
||||
: isPast
|
||||
? AppColors.onSurface.withOpacity(0.03)
|
||||
: AppColors.onSurface.withOpacity(0.06),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(
|
||||
color: isNow
|
||||
? Colors.redAccent.withOpacity(0.4)
|
||||
? AppColors.live.withOpacity(0.4)
|
||||
: AppColors.onSurface.withOpacity(0.07),
|
||||
),
|
||||
),
|
||||
@@ -654,7 +655,7 @@ class _ProgrammeCard extends StatelessWidget {
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 5, vertical: 2),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.redAccent,
|
||||
color: AppColors.live,
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
),
|
||||
child: Text(
|
||||
@@ -705,7 +706,7 @@ class _ProgrammeCard extends StatelessWidget {
|
||||
? IconButton(
|
||||
icon: const Icon(
|
||||
Icons.fiber_manual_record,
|
||||
color: Colors.redAccent,
|
||||
color: AppColors.live,
|
||||
size: 20,
|
||||
),
|
||||
tooltip: 'Enregistrer ce programme',
|
||||
@@ -861,9 +862,9 @@ class _RecordingsListViewState extends State<_RecordingsListView> {
|
||||
}
|
||||
|
||||
Color _statusColor(String status) => switch (status) {
|
||||
'recording' => Colors.redAccent,
|
||||
'completed' => Colors.green,
|
||||
'failed' => Colors.orangeAccent,
|
||||
'recording' => AppColors.live,
|
||||
'completed' => AppColors.success,
|
||||
'failed' => AppColors.warning,
|
||||
_ => AppColors.primaryContainer,
|
||||
};
|
||||
|
||||
@@ -909,7 +910,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> {
|
||||
? Center(
|
||||
child: Text(
|
||||
_error ?? 'Erreur',
|
||||
style: const TextStyle(color: Colors.redAccent),
|
||||
style: const TextStyle(color: AppColors.live),
|
||||
),
|
||||
)
|
||||
: _recordings.isEmpty
|
||||
@@ -983,7 +984,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> {
|
||||
Text(
|
||||
'⚠ ${rec['error_reason']}',
|
||||
style: const TextStyle(
|
||||
color: Colors.orangeAccent,
|
||||
color: AppColors.warning,
|
||||
fontSize: 11,
|
||||
),
|
||||
),
|
||||
@@ -1019,7 +1020,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> {
|
||||
IconButton(
|
||||
icon: const Icon(
|
||||
Icons.stop_circle,
|
||||
color: Colors.redAccent,
|
||||
color: AppColors.live,
|
||||
),
|
||||
tooltip: 'Arrêter',
|
||||
onPressed: () => _stopRecording(
|
||||
@@ -1031,7 +1032,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> {
|
||||
IconButton(
|
||||
icon: const Icon(
|
||||
Icons.play_circle_outline,
|
||||
color: Colors.greenAccent,
|
||||
color: AppColors.success,
|
||||
size: 20,
|
||||
),
|
||||
tooltip: 'Lecture',
|
||||
@@ -1129,7 +1130,7 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> {
|
||||
backgroundColor: AppColors.surfaceContainer,
|
||||
title: Row(
|
||||
children: [
|
||||
const Icon(Icons.repeat, color: Colors.purpleAccent),
|
||||
const Icon(Icons.repeat, color: AppColors.secondary),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
'Nouveau Season Pass',
|
||||
@@ -1167,8 +1168,10 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> {
|
||||
child: const Text('Annuler'),
|
||||
),
|
||||
ElevatedButton(
|
||||
style:
|
||||
ElevatedButton.styleFrom(backgroundColor: Colors.purpleAccent),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: AppColors.secondaryContainer,
|
||||
foregroundColor: AppColors.onSecondaryContainer,
|
||||
),
|
||||
onPressed: () async {
|
||||
final t = titleCtrl.text.trim();
|
||||
final c = channelCtrl.text.trim();
|
||||
@@ -1215,7 +1218,7 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> {
|
||||
borderSide: BorderSide(color: AppColors.onSurface24),
|
||||
),
|
||||
focusedBorder: const UnderlineInputBorder(
|
||||
borderSide: BorderSide(color: Colors.purpleAccent),
|
||||
borderSide: BorderSide(color: AppColors.secondary),
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -1236,7 +1239,8 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> {
|
||||
),
|
||||
ElevatedButton.icon(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.purpleAccent,
|
||||
backgroundColor: AppColors.secondaryContainer,
|
||||
foregroundColor: AppColors.onSecondaryContainer,
|
||||
),
|
||||
icon: const Icon(Icons.add, size: 18),
|
||||
label: const Text('Nouveau'),
|
||||
@@ -1248,15 +1252,15 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> {
|
||||
Container(
|
||||
padding: const EdgeInsets.all(12),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.purpleAccent.withOpacity(0.08),
|
||||
color: AppColors.secondary.withOpacity(0.08),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(color: Colors.purpleAccent.withOpacity(0.2)),
|
||||
border: Border.all(color: AppColors.secondary.withOpacity(0.2)),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
const Icon(
|
||||
Icons.info_outline,
|
||||
color: Colors.purpleAccent,
|
||||
color: AppColors.secondary,
|
||||
size: 18,
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
@@ -1264,7 +1268,7 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> {
|
||||
child: Text(
|
||||
'Scanne l\'EPG toutes les 4h et programme automatiquement les nouvelles diffusions. Seuls les nouveaux épisodes sont enregistrés.',
|
||||
style: GoogleFonts.fraunces(
|
||||
color: Colors.purpleAccent.shade100,
|
||||
color: AppColors.secondaryFixed,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
@@ -1313,16 +1317,16 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> {
|
||||
return Container(
|
||||
margin: const EdgeInsets.only(bottom: 8),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.purpleAccent.withOpacity(0.08),
|
||||
color: AppColors.secondary.withOpacity(0.08),
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
border: Border.all(
|
||||
color: Colors.purpleAccent.withOpacity(0.2),
|
||||
color: AppColors.secondary.withOpacity(0.2),
|
||||
),
|
||||
),
|
||||
child: ListTile(
|
||||
leading: const Icon(
|
||||
Icons.repeat,
|
||||
color: Colors.purpleAccent,
|
||||
color: AppColors.secondary,
|
||||
),
|
||||
title: Text(
|
||||
p['show_title'] ?? '—',
|
||||
|
||||
@@ -201,7 +201,7 @@ class _SimpleRecordingWidgetState extends State<SimpleRecordingWidget> {
|
||||
icon: const Icon(Icons.stop),
|
||||
label: const Text('STOP RECORDING'),
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red,
|
||||
backgroundColor: AppColors.errorContainer,
|
||||
foregroundColor: AppColors.onSurface,
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
),
|
||||
|
||||
@@ -193,7 +193,7 @@ class StreamingSettingsTab extends ConsumerWidget {
|
||||
style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurfaceVariant),
|
||||
),
|
||||
value: settings.enableNvidiaGpu,
|
||||
activeThumbColor: Colors.green,
|
||||
activeThumbColor: AppColors.success,
|
||||
onChanged: (v) => notifier.setEnableNvidiaGpu(v),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -200,7 +200,7 @@ class _MobileSeriesDetailScreenState
|
||||
const Icon(
|
||||
Icons.star,
|
||||
size: 16,
|
||||
color: Colors.amber,
|
||||
color: AppColors.ratingGold,
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
|
||||
@@ -76,7 +76,7 @@ class _MobileLiveTVTabState extends ConsumerState<MobileLiveTVTab> {
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
const Icon(Icons.error_outline, color: Colors.red, size: 48),
|
||||
const Icon(Icons.error_outline, color: AppColors.error, size: 48),
|
||||
const SizedBox(height: 16),
|
||||
Text(
|
||||
'Failed to load channels',
|
||||
|
||||
@@ -386,7 +386,7 @@ class _MobileMoviesTabState extends ConsumerState<MobileMoviesTab> {
|
||||
const Icon(
|
||||
Icons.star,
|
||||
size: 10,
|
||||
color: Colors.amber,
|
||||
color: AppColors.ratingGold,
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
|
||||
@@ -361,7 +361,7 @@ class _MobileSeriesTabState extends ConsumerState<MobileSeriesTab> {
|
||||
const Icon(
|
||||
Icons.star,
|
||||
size: 10,
|
||||
color: Colors.amber,
|
||||
color: AppColors.ratingGold,
|
||||
),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
|
||||
Reference in new issue
Block a user