Limpieza de peso de imágenes

This commit is contained in:
2026-05-11 20:30:59 +02:00
parent 928cbd8a1d
commit e7c5b08ec0
94 changed files with 181 additions and 246 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

BIN
assets/medals/brasa.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

BIN
assets/medals/habitual.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

BIN
assets/medals/leyenda.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

BIN
assets/medals/novato.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

BIN
assets/medals/veterano.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 538 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 993 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 504 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

View File

@@ -76,21 +76,21 @@ class EstadisticasPerfilUsuario {
}); });
static const catalogoMedallas = <String, MedallaUsuario>{ static const catalogoMedallas = <String, MedallaUsuario>{
'novato': MedallaUsuario(id: 'novato', emoji: '🎲', assetPath: 'assets/medals/novato.png', nombre: 'Novato', descripcion: 'Jugó su primera partida.'), 'novato': MedallaUsuario(id: 'novato', emoji: '🎲', assetPath: 'assets/medals/novato.webp', nombre: 'Novato', descripcion: 'Jugó su primera partida.'),
'habitual': MedallaUsuario(id: 'habitual', emoji: '🧭', assetPath: 'assets/medals/habitual.png', nombre: 'Habitual', descripcion: 'Jugó 10 partidas.'), 'habitual': MedallaUsuario(id: 'habitual', emoji: '🧭', assetPath: 'assets/medals/habitual.webp', nombre: 'Habitual', descripcion: 'Jugó 10 partidas.'),
'veterano': MedallaUsuario(id: 'veterano', emoji: '🏛️', assetPath: 'assets/medals/veterano.png', nombre: 'Veterano', descripcion: 'Jugó 50 partidas.'), 'veterano': MedallaUsuario(id: 'veterano', emoji: '🏛️', assetPath: 'assets/medals/veterano.webp', nombre: 'Veterano', descripcion: 'Jugó 50 partidas.'),
'leyenda': MedallaUsuario(id: 'leyenda', emoji: '👑', assetPath: 'assets/medals/leyenda.png', nombre: 'Leyenda', descripcion: 'Jugó 100 partidas.'), 'leyenda': MedallaUsuario(id: 'leyenda', emoji: '👑', assetPath: 'assets/medals/leyenda.webp', nombre: 'Leyenda', descripcion: 'Jugó 100 partidas.'),
'primera_victoria': MedallaUsuario(id: 'primera_victoria', emoji: '🥉', assetPath: 'assets/medals/primera_victoria.png', nombre: 'Primera victoria', descripcion: 'Ganó una partida.'), 'primera_victoria': MedallaUsuario(id: 'primera_victoria', emoji: '🥉', assetPath: 'assets/medals/primera_victoria.webp', nombre: 'Primera victoria', descripcion: 'Ganó una partida.'),
'diez_victorias': MedallaUsuario(id: 'diez_victorias', emoji: '🥈', assetPath: 'assets/medals/diez_victorias.png', nombre: 'Diez victorias', descripcion: 'Ganó 10 partidas.'), 'diez_victorias': MedallaUsuario(id: 'diez_victorias', emoji: '🥈', assetPath: 'assets/medals/diez_victorias.webp', nombre: 'Diez victorias', descripcion: 'Ganó 10 partidas.'),
'veinticinco_victorias': MedallaUsuario(id: 'veinticinco_victorias', emoji: '🥇', assetPath: 'assets/medals/veinticinco_victorias.png', nombre: 'Veinticinco victorias', descripcion: 'Ganó 25 partidas.'), 'veinticinco_victorias': MedallaUsuario(id: 'veinticinco_victorias', emoji: '🥇', assetPath: 'assets/medals/veinticinco_victorias.webp', nombre: 'Veinticinco victorias', descripcion: 'Ganó 25 partidas.'),
'cincuenta_victorias': MedallaUsuario(id: 'cincuenta_victorias', emoji: '💎', assetPath: 'assets/medals/cincuenta_victorias.png', nombre: 'Cincuenta victorias', descripcion: 'Ganó 50 partidas.'), 'cincuenta_victorias': MedallaUsuario(id: 'cincuenta_victorias', emoji: '💎', assetPath: 'assets/medals/cincuenta_victorias.webp', nombre: 'Cincuenta victorias', descripcion: 'Ganó 50 partidas.'),
'primer_engano': MedallaUsuario(id: 'primer_engano', emoji: '🎭', assetPath: 'assets/medals/primer_engano.png', nombre: 'Primer engaño', descripcion: 'Ganó como impostor.'), 'primer_engano': MedallaUsuario(id: 'primer_engano', emoji: '🎭', assetPath: 'assets/medals/primer_engano.webp', nombre: 'Primer engaño', descripcion: 'Ganó como impostor.'),
'impostor_habitual': MedallaUsuario(id: 'impostor_habitual', emoji: '🃏', assetPath: 'assets/medals/impostor_habitual.png', nombre: 'Impostor habitual', descripcion: 'Ganó 5 partidas como impostor.'), 'impostor_habitual': MedallaUsuario(id: 'impostor_habitual', emoji: '🃏', assetPath: 'assets/medals/impostor_habitual.webp', nombre: 'Impostor habitual', descripcion: 'Ganó 5 partidas como impostor.'),
'lobo_faroles': MedallaUsuario(id: 'lobo_faroles', emoji: '🐺', assetPath: 'assets/medals/lobo_faroles.png', nombre: 'Lobo entre faroles', descripcion: 'Ganó 15 partidas como impostor.'), 'lobo_faroles': MedallaUsuario(id: 'lobo_faroles', emoji: '🐺', assetPath: 'assets/medals/lobo_faroles.webp', nombre: 'Lobo entre faroles', descripcion: 'Ganó 15 partidas como impostor.'),
'brasa': MedallaUsuario(id: 'brasa', emoji: '♨️', assetPath: 'assets/medals/brasa.png', nombre: 'Brasa', descripcion: 'Mantiene algo de fuego reciente.'), 'brasa': MedallaUsuario(id: 'brasa', emoji: '♨️', assetPath: 'assets/medals/brasa.webp', nombre: 'Brasa', descripcion: 'Mantiene algo de fuego reciente.'),
'llama_suave': MedallaUsuario(id: 'llama_suave', emoji: '🔥', assetPath: 'assets/medals/llama_suave.png', nombre: 'Llama suave', descripcion: 'Está jugando con cierta asiduidad.'), 'llama_suave': MedallaUsuario(id: 'llama_suave', emoji: '🔥', assetPath: 'assets/medals/llama_suave.webp', nombre: 'Llama suave', descripcion: 'Está jugando con cierta asiduidad.'),
'llama_fuerte': MedallaUsuario(id: 'llama_fuerte', emoji: '🔥', assetPath: 'assets/medals/llama_fuerte.png', nombre: 'Llama fuerte', descripcion: 'Tiene una asiduidad alta.'), 'llama_fuerte': MedallaUsuario(id: 'llama_fuerte', emoji: '🔥', assetPath: 'assets/medals/llama_fuerte.webp', nombre: 'Llama fuerte', descripcion: 'Tiene una asiduidad alta.'),
'incandescente': MedallaUsuario(id: 'incandescente', emoji: '🌋', assetPath: 'assets/medals/incandescente.png', nombre: 'Incandescente', descripcion: 'Tiene el fuego al máximo.'), 'incandescente': MedallaUsuario(id: 'incandescente', emoji: '🌋', assetPath: 'assets/medals/incandescente.webp', nombre: 'Incandescente', descripcion: 'Tiene el fuego al máximo.'),
}; };
EstadisticasPerfilUsuario copiar({ EstadisticasPerfilUsuario copiar({

View File

@@ -58,7 +58,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
subtitulo: l10n.ifCorrectImpostorsWin, subtitulo: l10n.ifCorrectImpostorsWin,
color: TemaApp.colorAcento, color: TemaApp.colorAcento,
trailing: Image.asset( trailing: Image.asset(
'assets/ui/premium/vote_danger_glow.png', 'assets/ui/generated/meta/result_verdict_art.webp',
width: 42, width: 42,
height: 42, height: 42,
opacity: const AlwaysStoppedAnimation(0.64), opacity: const AlwaysStoppedAnimation(0.64),

View File

@@ -644,7 +644,7 @@ class _CrearPartidaHeader extends StatelessWidget {
AspectRatio( AspectRatio(
aspectRatio: 2, aspectRatio: 2,
child: Image.asset( child: Image.asset(
'assets/ui/generated/create_game/create_game_header_art.png', 'assets/ui/generated/create_game/create_game_header_art.webp',
fit: BoxFit.contain, fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.96), opacity: const AlwaysStoppedAnimation(0.96),
), ),

View File

@@ -103,7 +103,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
children: [ children: [
Positioned.fill( Positioned.fill(
child: Image.asset( child: Image.asset(
'assets/ui/premium/timer_ring_glow.png', 'assets/ui/generated/gameplay/gameplay_phase_emblem.webp',
fit: BoxFit.contain, fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.36), opacity: const AlwaysStoppedAnimation(0.36),
), ),

View File

@@ -183,7 +183,7 @@ class _PantallaDebateClienteState extends State<PantallaDebateCliente> {
children: [ children: [
Positioned.fill( Positioned.fill(
child: Image.asset( child: Image.asset(
'assets/ui/premium/timer_ring_glow.png', 'assets/ui/generated/gameplay/gameplay_phase_emblem.webp',
fit: BoxFit.contain, fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.42), opacity: const AlwaysStoppedAnimation(0.42),
), ),

View File

@@ -125,51 +125,49 @@ class _PantallaFinPartidaState extends State<PantallaFinPartida> {
? TemaApp.colorVerde ? TemaApp.colorVerde
: TemaApp.colorAcento, : TemaApp.colorAcento,
), ),
Transform.translate( const SizedBox(height: 12),
offset: const Offset(0, -18), Column(
child: Column( children: [
children: [ if (_progreso == null)
if (_progreso == null) const _TarjetaRecompensaCargando()
const _TarjetaRecompensaCargando() else
else _TarjetaProgresoGamificacion(progreso: _progreso!),
_TarjetaProgresoGamificacion(progreso: _progreso!), const SizedBox(height: 18),
const SizedBox(height: 18), _TarjetaSecreto(
_TarjetaSecreto( palabra: partida.palabraSecreta,
palabra: partida.palabraSecreta, categoria: BancoPalabras.nombreBonitoCategoria(
categoria: BancoPalabras.nombreBonitoCategoria( partida.categoriaReal,
partida.categoriaReal, l10n,
l10n,
),
), ),
const SizedBox(height: 18), ),
_TarjetaImpostores( const SizedBox(height: 18),
titulo: impostores.length == 1 _TarjetaImpostores(
? l10n.theImpostorWas titulo: impostores.length == 1
: l10n.theImpostorsWere, ? l10n.theImpostorWas
impostores: impostores, : l10n.theImpostorsWere,
), impostores: impostores,
const SizedBox(height: 18), ),
if (partida.historialVotaciones.isNotEmpty) const SizedBox(height: 18),
_TarjetaHistorialVotos(partida: partida, l10n: l10n), if (partida.historialVotaciones.isNotEmpty)
const SizedBox(height: 24), _TarjetaHistorialVotos(partida: partida, l10n: l10n),
_BotonesFinPartida( const SizedBox(height: 24),
estado: estado, _BotonesFinPartida(
onPrincipal: () async { estado: estado,
await context.read<ServicioNearby>().desconectar(); onPrincipal: () async {
estado.limpiar(); await context.read<ServicioNearby>().desconectar();
if (!context.mounted) return; estado.limpiar();
Navigator.pushAndRemoveUntil( if (!context.mounted) return;
context, Navigator.pushAndRemoveUntil(
MaterialPageRoute( context,
builder: (_) => const PantallaPrincipal(), MaterialPageRoute(
), builder: (_) => const PantallaPrincipal(),
(route) => false, ),
); (route) => false,
}, );
), },
const SizedBox(height: 16), ),
], const SizedBox(height: 16),
), ],
), ),
], ],
), ),
@@ -231,7 +229,7 @@ class _HeroResultado extends StatelessWidget {
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
SizedBox( SizedBox(
height: 420, height: 548,
width: double.infinity, width: double.infinity,
child: CustomPaint(painter: _HeroCinematicoPainter(color: color)), child: CustomPaint(painter: _HeroCinematicoPainter(color: color)),
), ),
@@ -267,7 +265,7 @@ class _HeroResultado extends StatelessWidget {
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Image.asset( Image.asset(
'assets/ui/generated/final_rewards/cinematic_burst.png', 'assets/ui/generated/final_rewards/cinematic_burst.webp',
width: 260, width: 260,
height: 260, height: 260,
fit: BoxFit.contain, fit: BoxFit.contain,
@@ -310,17 +308,22 @@ class _HeroResultado extends StatelessWidget {
) )
.shimmer(delay: 700.ms, duration: 1500.ms), .shimmer(delay: 700.ms, duration: 1500.ms),
const SizedBox(height: 12), const SizedBox(height: 12),
Text( Padding(
'$apertura$tituloLimpio!', padding: const EdgeInsets.symmetric(horizontal: 16),
textAlign: TextAlign.center, child: Text(
style: Theme.of(context).textTheme.headlineMedium?.copyWith( '$apertura$tituloLimpio!',
color: color, maxLines: 2,
fontSize: 34, overflow: TextOverflow.ellipsis,
fontWeight: FontWeight.w900, textAlign: TextAlign.center,
letterSpacing: 1.2, style: Theme.of(context).textTheme.headlineMedium?.copyWith(
shadows: [ color: color,
Shadow(color: color.withValues(alpha: 0.90), blurRadius: 24), fontSize: 32,
], fontWeight: FontWeight.w900,
letterSpacing: 1.0,
shadows: [
Shadow(color: color.withValues(alpha: 0.90), blurRadius: 24),
],
),
), ),
).animate().fadeIn(delay: 180.ms).slideY(begin: 0.25), ).animate().fadeIn(delay: 180.ms).slideY(begin: 0.25),
], ],
@@ -730,7 +733,7 @@ class _MedallaDesbloqueada extends StatelessWidget {
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Image.asset( Image.asset(
'assets/rewards/medal_unlock_burst.png', 'assets/rewards/medal_unlock_burst.webp',
width: 82, width: 82,
height: 82, height: 82,
fit: BoxFit.cover, fit: BoxFit.cover,
@@ -943,30 +946,22 @@ class _BotonesFinPartida extends StatelessWidget {
final l10n = AppLocalizations.of(context)!; final l10n = AppLocalizations.of(context)!;
return Column( return Column(
children: [ children: [
SizedBox( BotonFarolero(
width: double.infinity, texto: l10n.rematch,
height: 56, icono: Icons.replay,
child: ElevatedButton.icon( onPressed: () {
onPressed: () { estado.revancha();
estado.revancha(); Navigator.pushReplacement(
Navigator.pushReplacement( context,
context, MaterialPageRoute(builder: (_) => const PantallaVerPalabra()),
MaterialPageRoute(builder: (_) => const PantallaVerPalabra()), );
); },
},
icon: const Icon(Icons.replay),
label: Text(l10n.rematch),
),
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
SizedBox( BotonFarolero.oscuro(
width: double.infinity, texto: l10n.mainMenu,
height: 56, icono: Icons.home,
child: OutlinedButton.icon( onPressed: onPrincipal,
onPressed: onPrincipal,
icon: const Icon(Icons.home),
label: Text(l10n.mainMenu),
),
), ),
], ],
); );

View File

@@ -209,24 +209,20 @@ class _PantallaFinPartidaOnlineState extends State<PantallaFinPartidaOnline> {
), ),
), ),
const SizedBox(height: 24), const SizedBox(height: 24),
SizedBox( BotonFarolero.oscuro(
width: double.infinity, texto: l10n.mainMenu,
height: 56, icono: Icons.home,
child: OutlinedButton.icon( onPressed: () async {
onPressed: () async { await context.read<ServicioNearby>().desconectar();
await context.read<ServicioNearby>().desconectar(); if (!context.mounted) return;
if (!context.mounted) return; Navigator.pushAndRemoveUntil(
Navigator.pushAndRemoveUntil( context,
context, MaterialPageRoute(
MaterialPageRoute( builder: (_) => const PantallaPrincipal(),
builder: (_) => const PantallaPrincipal(), ),
), (route) => false,
(route) => false, );
); },
},
icon: const Icon(Icons.home),
label: Text(l10n.mainMenu),
),
), ),
], ],
), ),
@@ -277,7 +273,7 @@ class _ResultadoOnlineHero extends StatelessWidget {
child: Column( child: Column(
children: [ children: [
Image.asset( Image.asset(
'assets/ui/generated/final_rewards/cinematic_burst.png', 'assets/ui/generated/final_rewards/cinematic_burst.webp',
height: 250, height: 250,
fit: BoxFit.contain, fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.95), opacity: const AlwaysStoppedAnimation(0.95),

View File

@@ -80,7 +80,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
Positioned.fill( Positioned.fill(
child: IgnorePointer( child: IgnorePointer(
child: Image.asset( child: Image.asset(
'assets/ui/generated/join_lobby/qr_frame.png', 'assets/ui/generated/join_lobby/qr_frame.webp',
fit: BoxFit.contain, fit: BoxFit.contain,
), ),
), ),
@@ -418,7 +418,7 @@ class _LobbySignalArt extends StatelessWidget {
height: 104, height: 104,
width: double.infinity, width: double.infinity,
child: Image.asset( child: Image.asset(
'assets/ui/generated/join_lobby/signal_art.png', 'assets/ui/generated/join_lobby/signal_art.webp',
fit: BoxFit.contain, fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.90), opacity: const AlwaysStoppedAnimation(0.90),
), ),

View File

@@ -31,7 +31,7 @@ class PantallaPrincipal extends StatelessWidget {
children: [ children: [
Positioned.fill( Positioned.fill(
child: Image.asset( child: Image.asset(
'assets/ui/generated/main/main_atmosphere_bg.png', 'assets/ui/generated/main/main_atmosphere_bg.webp',
fit: BoxFit.cover, fit: BoxFit.cover,
alignment: Alignment.center, alignment: Alignment.center,
), ),
@@ -291,16 +291,16 @@ class _HeroInicioPremium extends StatelessWidget {
children: [ children: [
Positioned.fill( Positioned.fill(
child: Image.asset( child: Image.asset(
'assets/ui/premium/lantern_radial_glow.png', 'assets/ui/generated/main/main_lantern_hero.webp',
fit: BoxFit.contain, fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.48), opacity: const AlwaysStoppedAnimation(0.18),
), ),
), ),
Column( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Image.asset( Image.asset(
'assets/ui/generated/main/main_lantern_hero.png', 'assets/ui/generated/main/main_lantern_hero.webp',
width: heroSize, width: heroSize,
height: heroSize, height: heroSize,
fit: BoxFit.contain, fit: BoxFit.contain,
@@ -455,7 +455,7 @@ class _BotonInicioPremium extends StatelessWidget {
children: [ children: [
Positioned.fill( Positioned.fill(
child: Image.asset( child: Image.asset(
'assets/ui/premium/card_sheen_overlay.png', 'assets/ui/generated/main/main_cta_frame.webp',
fit: BoxFit.cover, fit: BoxFit.cover,
opacity: AlwaysStoppedAnimation(hero ? 0.20 : 0.14), opacity: AlwaysStoppedAnimation(hero ? 0.20 : 0.14),
), ),

View File

@@ -283,68 +283,50 @@ class _PantallaResultadoState extends State<PantallaResultado>
final partida = estado.partida; final partida = estado.partida;
if (partida == null) return const SizedBox.shrink(); if (partida == null) return const SizedBox.shrink();
// Comprobar si la partida terminó
final finPartida = estado.comprobarFinPartida(); final finPartida = estado.comprobarFinPartida();
if (finPartida) { if (finPartida) {
return SizedBox( return BotonFarolero(
width: double.infinity, texto: l10n.seeEndResult,
height: 56, icono: Icons.emoji_events,
child: ElevatedButton.icon( onPressed: () {
onPressed: () { Navigator.pushReplacement(
Navigator.pushReplacement( context,
context, MaterialPageRoute(builder: (_) => const PantallaFinPartida()),
MaterialPageRoute(builder: (_) => const PantallaFinPartida()), );
); },
},
icon: const Icon(Icons.emoji_events),
label: Text(l10n.seeEndResult),
),
); );
} }
// Si era impostor, puede intentar adivinar
if (widget.resultado.eraImpostor) { if (widget.resultado.eraImpostor) {
return Column( return Column(
children: [ children: [
SizedBox( BotonFarolero.oscuro(
width: double.infinity, texto: l10n.impostorGuessWord,
height: 56, icono: Icons.gps_fixed,
child: OutlinedButton.icon( onPressed: () {
onPressed: () { Navigator.pushReplacement(
Navigator.pushReplacement( context,
context, MaterialPageRoute(
MaterialPageRoute( builder: (_) => const PantallaAdivinanza(),
builder: (_) => const PantallaAdivinanza(), ),
), );
); },
},
icon: const Text('🎯', style: TextStyle(fontSize: 18)),
label: Text(l10n.impostorGuessWord),
),
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
SizedBox( BotonFarolero(
width: double.infinity, texto: l10n.nextRound,
height: 56, icono: Icons.skip_next,
child: ElevatedButton.icon( onPressed: () => _siguienteRonda(context, estado),
onPressed: () => _siguienteRonda(context, estado),
icon: const Icon(Icons.skip_next),
label: Text(l10n.nextRound),
),
), ),
], ],
); );
} }
return SizedBox( return BotonFarolero(
width: double.infinity, texto: l10n.nextRound,
height: 56, icono: Icons.skip_next,
child: ElevatedButton.icon( onPressed: () => _siguienteRonda(context, estado),
onPressed: () => _siguienteRonda(context, estado),
icon: const Icon(Icons.skip_next),
label: Text(l10n.nextRound),
),
); );
} }

View File

@@ -33,7 +33,7 @@ class PantallaSeleccionModoJuego extends StatelessWidget {
).animate().fadeIn(duration: 320.ms).slideY(begin: -0.12), ).animate().fadeIn(duration: 320.ms).slideY(begin: -0.12),
const SizedBox(height: 34), const SizedBox(height: 34),
_ModoCard( _ModoCard(
marcoAsset: 'assets/ui/generated/mode/mode_single_card_frame.png', marcoAsset: 'assets/ui/generated/mode/mode_single_card_frame.webp',
icono: Icons.phone_android_rounded, icono: Icons.phone_android_rounded,
titulo: l10n.singleDevice, titulo: l10n.singleDevice,
subtitulo: l10n.singleDeviceSubtitle, subtitulo: l10n.singleDeviceSubtitle,
@@ -50,7 +50,7 @@ class PantallaSeleccionModoJuego extends StatelessWidget {
).animate().fadeIn(delay: 120.ms).slideX(begin: -0.08), ).animate().fadeIn(delay: 120.ms).slideX(begin: -0.08),
const SizedBox(height: 16), const SizedBox(height: 16),
_ModoCard( _ModoCard(
marcoAsset: 'assets/ui/generated/mode/mode_multi_card_frame.png', marcoAsset: 'assets/ui/generated/mode/mode_multi_card_frame.webp',
icono: Icons.devices_rounded, icono: Icons.devices_rounded,
titulo: l10n.multiDevice, titulo: l10n.multiDevice,
subtitulo: l10n.multiDeviceSubtitle, subtitulo: l10n.multiDeviceSubtitle,
@@ -93,7 +93,7 @@ class _ModoHero extends StatelessWidget {
SizedBox( SizedBox(
height: 230, height: 230,
child: Image.asset( child: Image.asset(
'assets/ui/generated/mode/mode_duel_hero.png', 'assets/ui/generated/mode/mode_duel_hero.webp',
fit: BoxFit.contain, fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.95), opacity: const AlwaysStoppedAnimation(0.95),
), ),
@@ -186,13 +186,6 @@ class _ModoCard extends StatelessWidget {
opacity: AlwaysStoppedAnimation(destacado ? 0.22 : 0.18), opacity: AlwaysStoppedAnimation(destacado ? 0.22 : 0.18),
), ),
), ),
Positioned.fill(
child: Image.asset(
'assets/ui/premium/card_sheen_overlay.png',
fit: BoxFit.cover,
opacity: AlwaysStoppedAnimation(destacado ? 0.28 : 0.18),
),
),
Padding( Padding(
padding: const EdgeInsets.fromLTRB(18, 18, 14, 18), padding: const EdgeInsets.fromLTRB(18, 18, 14, 18),
child: Row( child: Row(

View File

@@ -942,7 +942,7 @@ class _JoinLobbySignalArt extends StatelessWidget {
height: height, height: height,
width: double.infinity, width: double.infinity,
child: Image.asset( child: Image.asset(
'assets/ui/generated/join_lobby/signal_art.png', 'assets/ui/generated/join_lobby/signal_art.webp',
fit: BoxFit.contain, fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.94), opacity: const AlwaysStoppedAnimation(0.94),
), ),

View File

@@ -114,7 +114,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
subtitulo: l10n.selectOnePlayer, subtitulo: l10n.selectOnePlayer,
color: TemaApp.colorAcento, color: TemaApp.colorAcento,
trailing: Image.asset( trailing: Image.asset(
'assets/ui/premium/vote_danger_glow.png', 'assets/ui/generated/meta/result_verdict_art.webp',
width: 42, width: 42,
height: 42, height: 42,
opacity: const AlwaysStoppedAnimation(0.64), opacity: const AlwaysStoppedAnimation(0.64),

View File

@@ -141,7 +141,7 @@ class _PantallaVotacionClienteState extends State<PantallaVotacionCliente> {
subtitulo: l10n.selectOnePlayer, subtitulo: l10n.selectOnePlayer,
color: TemaApp.colorAcento, color: TemaApp.colorAcento,
trailing: Image.asset( trailing: Image.asset(
'assets/ui/premium/vote_danger_glow.png', 'assets/ui/generated/meta/result_verdict_art.webp',
width: 42, width: 42,
height: 42, height: 42,
opacity: const AlwaysStoppedAnimation(0.64), opacity: const AlwaysStoppedAnimation(0.64),

View File

@@ -22,45 +22,21 @@ class FondoFarolero extends StatelessWidget {
decoration: const BoxDecoration(gradient: TemaApp.gradienteFondo), decoration: const BoxDecoration(gradient: TemaApp.gradienteFondo),
child: Stack( child: Stack(
children: [ children: [
if (intenso) Positioned.fill(
Positioned.fill( child: IgnorePointer(
child: IgnorePointer( child: Image.asset(
child: Image.asset( 'assets/ui/generated/shared/screen_atmosphere_bg.webp',
'assets/ui/generated/gameplay/gameplay_atmosphere_bg.png', fit: BoxFit.cover,
fit: BoxFit.cover, opacity: AlwaysStoppedAnimation(intenso ? 0.76 : 0.48),
opacity: const AlwaysStoppedAnimation(0.30), filterQuality: FilterQuality.high,
filterQuality: FilterQuality.high, errorBuilder: (context, error, stackTrace) =>
errorBuilder: (context, error, stackTrace) => const SizedBox.shrink(),
const SizedBox.shrink(),
),
), ),
), ),
),
Positioned.fill( Positioned.fill(
child: CustomPaint(painter: _FondoFaroleroPainter(intenso: intenso)), child: CustomPaint(painter: _FondoFaroleroPainter(intenso: intenso)),
), ),
Positioned(
top: intenso ? -180 : -140,
left: -220,
right: -220,
child: IgnorePointer(
child: Image.asset(
'assets/ui/premium/lantern_radial_glow.png',
height: intenso ? 720 : 560,
fit: BoxFit.contain,
opacity: AlwaysStoppedAnimation(intenso ? 0.56 : 0.34),
),
),
),
Positioned.fill(
child: IgnorePointer(
child: Image.asset(
'assets/ui/premium/sparks_overlay.png',
fit: BoxFit.cover,
repeat: ImageRepeat.repeat,
opacity: AlwaysStoppedAnimation(intenso ? 0.38 : 0.22),
),
),
),
Positioned.fill(child: child), Positioned.fill(child: child),
], ],
), ),
@@ -94,13 +70,6 @@ class PanelFarolero extends StatelessWidget {
borderRadius: BorderRadius.circular(14), borderRadius: BorderRadius.circular(14),
child: Stack( child: Stack(
children: [ children: [
Positioned.fill(
child: Image.asset(
'assets/ui/premium/card_sheen_overlay.png',
fit: BoxFit.cover,
opacity: const AlwaysStoppedAnimation(0.26),
),
),
Padding(padding: padding, child: child), Padding(padding: padding, child: child),
], ],
), ),
@@ -348,14 +317,19 @@ class BotonFarolero extends StatelessWidget {
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Positioned.fill( Positioned.fill(
child: Image.asset( child: IgnorePointer(
'assets/ui/premium/card_sheen_overlay.png', child: Image.asset(
fit: BoxFit.cover, 'assets/ui/generated/main/main_cta_frame.webp',
opacity: const AlwaysStoppedAnimation(0.14), fit: BoxFit.fill,
opacity: AlwaysStoppedAnimation(habilitado ? 0.72 : 0.24),
filterQuality: FilterQuality.high,
errorBuilder: (context, error, stackTrace) =>
const SizedBox.shrink(),
),
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 12), padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
@@ -415,35 +389,35 @@ class ArteGameplayFarolero extends StatelessWidget {
this.height = 128, this.height = 128,
this.opacity = 0.92, this.opacity = 0.92,
this.padding = EdgeInsets.zero, this.padding = EdgeInsets.zero,
}) : assetPath = 'assets/ui/generated/gameplay/gameplay_phase_emblem.png'; }) : assetPath = 'assets/ui/generated/gameplay/gameplay_phase_emblem.webp';
const ArteGameplayFarolero.notas({ const ArteGameplayFarolero.notas({
super.key, super.key,
this.height = 150, this.height = 150,
this.opacity = 0.94, this.opacity = 0.94,
this.padding = EdgeInsets.zero, this.padding = EdgeInsets.zero,
}) : assetPath = 'assets/ui/generated/gameplay/notes_strategy_art.png'; }) : assetPath = 'assets/ui/generated/gameplay/notes_strategy_art.webp';
const ArteGameplayFarolero.ajustes({ const ArteGameplayFarolero.ajustes({
super.key, super.key,
this.height = 150, this.height = 150,
this.opacity = 0.94, this.opacity = 0.94,
this.padding = EdgeInsets.zero, this.padding = EdgeInsets.zero,
}) : assetPath = 'assets/ui/generated/meta/settings_profile_art.png'; }) : assetPath = 'assets/ui/generated/meta/settings_profile_art.webp';
const ArteGameplayFarolero.historial({ const ArteGameplayFarolero.historial({
super.key, super.key,
this.height = 150, this.height = 150,
this.opacity = 0.94, this.opacity = 0.94,
this.padding = EdgeInsets.zero, this.padding = EdgeInsets.zero,
}) : assetPath = 'assets/ui/generated/meta/history_ledger_art.png'; }) : assetPath = 'assets/ui/generated/meta/history_ledger_art.webp';
const ArteGameplayFarolero.resultado({ const ArteGameplayFarolero.resultado({
super.key, super.key,
this.height = 150, this.height = 150,
this.opacity = 0.94, this.opacity = 0.94,
this.padding = EdgeInsets.zero, this.padding = EdgeInsets.zero,
}) : assetPath = 'assets/ui/generated/meta/result_verdict_art.png'; }) : assetPath = 'assets/ui/generated/meta/result_verdict_art.webp';
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -538,7 +512,7 @@ class TarjetaPalabraFarolero extends StatelessWidget {
children: [ children: [
Positioned.fill( Positioned.fill(
child: Image.asset( child: Image.asset(
'assets/ui/generated/gameplay/gameplay_phase_emblem.png', 'assets/ui/generated/gameplay/gameplay_phase_emblem.webp',
fit: BoxFit.contain, fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.14), opacity: const AlwaysStoppedAnimation(0.14),
filterQuality: FilterQuality.high, filterQuality: FilterQuality.high,
@@ -546,13 +520,6 @@ class TarjetaPalabraFarolero extends StatelessWidget {
const SizedBox.shrink(), const SizedBox.shrink(),
), ),
), ),
Positioned.fill(
child: Image.asset(
'assets/ui/premium/word_reveal_glow.png',
fit: BoxFit.cover,
opacity: const AlwaysStoppedAnimation(0.28),
),
),
Text( Text(
palabra.toUpperCase(), palabra.toUpperCase(),
textAlign: TextAlign.center, textAlign: TextAlign.center,

View File

@@ -99,8 +99,10 @@ class TemaApp {
foregroundColor: Colors.black, foregroundColor: Colors.black,
disabledBackgroundColor: colorTarjeta, disabledBackgroundColor: colorTarjeta,
disabledForegroundColor: colorTextoSecundario, disabledForegroundColor: colorTextoSecundario,
elevation: 0, elevation: 10,
shadowColor: colorNaranja.withValues(alpha: 0.34),
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
side: BorderSide(color: colorDorado.withValues(alpha: 0.72)),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)),
textStyle: GoogleFonts.oswald( textStyle: GoogleFonts.oswald(
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
@@ -112,7 +114,8 @@ class TemaApp {
outlinedButtonTheme: OutlinedButtonThemeData( outlinedButtonTheme: OutlinedButtonThemeData(
style: OutlinedButton.styleFrom( style: OutlinedButton.styleFrom(
foregroundColor: colorTexto, foregroundColor: colorTexto,
side: const BorderSide(color: colorBorde), backgroundColor: colorSuperficie.withValues(alpha: 0.70),
side: BorderSide(color: colorDorado.withValues(alpha: 0.52)),
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16), padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)),
textStyle: GoogleFonts.oswald( textStyle: GoogleFonts.oswald(

View File

@@ -38,7 +38,6 @@ flutter:
- assets/avatars/ - assets/avatars/
- assets/medals/ - assets/medals/
- assets/rewards/ - assets/rewards/
- assets/ui/premium/
- assets/ui/generated/ - assets/ui/generated/
- assets/ui/generated/shared/ - assets/ui/generated/shared/
- assets/ui/generated/main/ - assets/ui/generated/main/