uso de imágenes y eliminación de innecesarias

This commit is contained in:
2026-05-12 01:09:05 +02:00
parent a055ed808c
commit 1885c85de9
28 changed files with 298 additions and 47 deletions
+1
View File
@@ -71,6 +71,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
const SizedBox(height: 12),
TarjetaFaseFarolero(
icono: Icons.theater_comedy,
assetIconPath: 'assets/ui/generated/actions/action_impostor_mask.webp',
titulo: l10n.impostorCanGuess,
subtitulo: l10n.ifCorrectImpostorsWin,
color: TemaApp.colorAcento,
+6 -1
View File
@@ -69,7 +69,12 @@ class _PantallaAjustesState extends State<PantallaAjustes> {
),
),
const SizedBox(width: 12),
const Icon(Icons.edit),
Image.asset(
'assets/ui/generated/actions/action_settings_gear.webp',
width: 38,
height: 38,
fit: BoxFit.contain,
),
],
),
),
+24 -7
View File
@@ -151,7 +151,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
Future<void> _iniciarPartidaMulti() async {
final l10n = AppLocalizations.of(context)!;
// 1. Pedir permisos automáticamente
// 1. Pedir permisos automáticamente
final permisosOk = await ServicioPermisos.solicitarPermisosNearby(context);
if (!permisosOk) {
if (mounted) {
@@ -400,7 +400,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
),
const SizedBox(height: 12),
],
// Categoría
// Categoría
Card(
child: Padding(
padding: const EdgeInsets.fromLTRB(18, 18, 18, 28),
@@ -417,7 +417,15 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
child: DropdownButtonFormField<String>(
initialValue: _categoria,
decoration: const InputDecoration(
prefixIcon: Icon(Icons.category),
prefixIcon: Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
'assets/ui/generated/actions/action_category_cards.webp',
width: 24,
height: 24,
fit: BoxFit.contain,
),
),
),
items: categorias.map((c) {
return DropdownMenuItem(
@@ -465,7 +473,15 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
controller: _controladorNombre,
decoration: InputDecoration(
hintText: l10n.playerNameHint,
prefixIcon: const Icon(Icons.person_add),
prefixIcon: Padding(
padding: EdgeInsets.all(10),
child: Image.asset(
'assets/ui/generated/actions/action_add_player.webp',
width: 24,
height: 24,
fit: BoxFit.contain,
),
),
),
textCapitalization: TextCapitalization.words,
onSubmitted: (_) => _agregarJugador(),
@@ -530,7 +546,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
const SizedBox(height: 12),
],
// Configuración de partida
// Configuración de partida
Card(
child: Padding(
padding: const EdgeInsets.fromLTRB(18, 18, 18, 28),
@@ -543,7 +559,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
),
const SizedBox(height: 12),
// Número de impostores
// Número de impostores
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
@@ -604,10 +620,11 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
),
const SizedBox(height: 24),
// Botón iniciar
// Botón iniciar
BotonFarolero(
texto: l10n.startGame,
icono: Icons.play_arrow,
assetIconPath: 'assets/ui/generated/actions/action_create_game.webp',
onPressed: (_modoMultimovil || _jugadores.length >= 3)
? _iniciarPartida
: null,
+2
View File
@@ -92,6 +92,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
Expanded(
child: TarjetaFaseFarolero(
icono: Icons.forum,
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
titulo: l10n.playersInDebate,
subtitulo: l10n.activePlayersInfo(
partida.jugadoresActivos.length,
@@ -107,6 +108,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
nombre: '${index + 1}. ${jugador.nombre}',
subtitulo: jugador.eliminado ? l10n.eliminated : null,
icono: jugador.eliminado ? Icons.person_off : Icons.record_voice_over,
assetIconPath: jugador.eliminado ? null : 'assets/ui/generated/actions/action_players_group.webp',
destacado: !jugador.eliminado,
completado: !jugador.eliminado,
);
@@ -166,6 +166,7 @@ class _PantallaDebateClienteState extends State<PantallaDebateCliente> {
const SizedBox(height: 12),
TarjetaFaseFarolero(
icono: Icons.forum,
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
titulo: l10n.debate,
subtitulo: l10n.debateInstructions,
child: Column(
@@ -195,6 +196,7 @@ class _PantallaDebateClienteState extends State<PantallaDebateCliente> {
destacado: true,
completado: true,
icono: Icons.record_voice_over,
assetIconPath: 'assets/ui/generated/actions/action_players_group.webp',
),
const SizedBox(height: 12),
],
+15 -6
View File
@@ -412,10 +412,13 @@ class _TarjetaProgresoGamificacion extends StatelessWidget {
),
],
),
child: const Icon(
Icons.local_fire_department,
color: Color(0xFF1B1010),
size: 30,
child: Padding(
padding: const EdgeInsets.all(7),
child: Image.asset(
'assets/ui/generated/actions/action_fire_badge.webp',
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
),
),
const SizedBox(width: 14),
@@ -582,8 +585,13 @@ class _DeltaFuego extends StatelessWidget {
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.local_fire_department,
color: TemaApp.colorNaranja, size: 24),
Image.asset(
'assets/ui/generated/actions/action_fire_badge.webp',
width: 26,
height: 26,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
const SizedBox(width: 4),
Text(
texto,
@@ -950,6 +958,7 @@ class _BotonesFinPartida extends StatelessWidget {
BotonFarolero(
texto: l10n.rematch,
icono: Icons.replay,
assetIconPath: 'assets/ui/generated/actions/action_create_game.webp',
onPressed: () {
estado.revancha();
Navigator.pushReplacement(
@@ -164,6 +164,7 @@ class _PantallaFinPartidaOnlineState extends State<PantallaFinPartidaOnline> {
BotonFarolero.oscuro(
texto: l10n.mainMenu,
icono: Icons.home,
assetIconPath: 'assets/ui/generated/actions/action_result_trophy.webp',
onPressed: () async {
await context.read<ServicioNearby>().desconectar();
if (!context.mounted) return;
+8
View File
@@ -286,6 +286,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
child: BotonFarolero.oscuro(
texto: AppLocalizations.of(context)!.assumeOnThisPhone,
icono: Icons.person_add_alt_1,
assetIconPath: 'assets/ui/generated/actions/action_add_player.webp',
onPressed: () => nearby.asumirUsuariosDesconectados(),
),
),
@@ -411,6 +412,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
) {
return TarjetaFaseFarolero(
icono: Icons.visibility,
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
titulo: l10n.waitingPlayersSeeWord,
subtitulo: l10n.connectedPlayers,
child: Column(
@@ -427,6 +429,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
BotonFarolero(
texto: l10n.seeYourWord,
icono: Icons.visibility,
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
onPressed: () => _mostrarPalabraHost(context),
),
if (todosListos) ...[
@@ -538,6 +541,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
return TarjetaFaseFarolero(
icono: Icons.forum,
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
titulo: l10n.debate,
subtitulo: l10n.debateInstructions,
child: Column(
@@ -605,6 +609,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
return TarjetaFaseFarolero(
icono: Icons.how_to_vote,
assetIconPath: 'assets/ui/generated/actions/action_vote_mask.webp',
titulo: l10n.voting,
subtitulo: l10n.votesProgress(votosEmitidos, totalVotos),
color: TemaApp.colorAcento,
@@ -668,6 +673,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
: null;
return TarjetaFaseFarolero(
icono: Icons.psychology,
assetIconPath: 'assets/ui/generated/actions/action_impostor_mask.webp',
titulo: l10n.impostorGuessTitle,
subtitulo: ultimo == null
? l10n.impostorCanGuess
@@ -783,6 +789,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
destacado: esHost,
completado: listo,
icono: esHost ? Icons.phone_android : Icons.devices,
assetIconPath: esHost ? 'assets/ui/generated/actions/action_mobile_device.webp' : 'assets/ui/generated/actions/action_multidevice_signal.webp',
);
}
@@ -798,6 +805,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
return BotonFarolero(
texto: todosListos ? l10n.allSeenStartDebate : l10n.waitingPlayersSeeWord,
icono: Icons.forum,
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
onPressed: todosListos ? () => _avanzarAFase(FaseJuego.debate) : null,
);
case FaseJuego.debate:
+1
View File
@@ -30,6 +30,7 @@ class PantallaHistorial extends StatelessWidget {
const SizedBox(height: 12),
EstadoVacioFarolero(
icono: Icons.history_rounded,
assetIconPath: 'assets/ui/generated/actions/action_history_ledger.webp',
titulo: l10n.history,
subtitulo: l10n.noSavedGames,
),
+3 -1
View File
@@ -8,7 +8,7 @@ import '../servicios/servicio_perfil_usuario.dart';
import '../tema/componentes_farolero.dart';
import '../tema/tema_app.dart';
/// Lobby del host. El host es autoridad de sala y también cliente local.
/// Lobby del host. El host es autoridad de sala y también cliente local.
class PantallaLobbyHost extends StatefulWidget {
final String nombreSala;
final VoidCallback onIniciar;
@@ -63,6 +63,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
const SizedBox(height: 12),
EncabezadoFarolero(
icono: Icons.wifi_tethering,
assetIconPath: 'assets/ui/generated/actions/action_multidevice_signal.webp',
titulo: widget.nombreSala,
subtitulo: l10n.scanToJoin,
),
@@ -186,6 +187,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
BotonFarolero(
texto: _iniciando ? l10n.starting : l10n.startGame,
icono: Icons.play_arrow,
assetIconPath: 'assets/ui/generated/actions/action_create_game.webp',
onPressed: puedeIniciar && !_iniciando
? () {
setState(() => _iniciando = true);
+2 -2
View File
@@ -5,7 +5,7 @@ import 'package:farolero/tema/componentes_farolero.dart';
import 'package:farolero/tema/tema_app.dart';
/// Pantalla que ve cada jugador cuando recibe su palabra (modo multidispositivo).
/// El cliente recibe la palabra vía ServicioNearby y se navega aquí.
/// El cliente recibe la palabra vía ServicioNearby y se navega aquí.
/// NO es la pantalla del host.
class PantallaPalabraCliente extends StatefulWidget {
final String palabra;
@@ -166,7 +166,7 @@ class _PantallaPalabraClienteState extends State<PantallaPalabraCliente> {
),
const Spacer(),
// Botón confirmar
// Botón confirmar
BotonFarolero(
texto: _haRevelado ? l10n.iveSeenIt : l10n.tapToSee,
icono: Icons.check,
@@ -135,6 +135,7 @@ class _PantallaPalabrasClienteState extends State<PantallaPalabrasCliente> {
? (_esUltimo ? l10n.iveSeenIt : l10n.next)
: l10n.tapToSee,
icono: _esUltimo ? Icons.check : Icons.arrow_forward,
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
onPressed: _actualRevelado ? _continuar : null,
),
],
+2 -2
View File
@@ -39,7 +39,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
),
);
// Iniciar animación de suspense
// Iniciar animación de suspense
Future.delayed(const Duration(milliseconds: 500), () {
_animController.forward().then((_) {
setState(() => _revelado = true);
@@ -72,7 +72,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Animación de suspense
// Animación de suspense
if (!_revelado) ...[
const ArteGameplayFarolero.resultado(height: 152),
const SizedBox(height: 16),
+18 -13
View File
@@ -19,7 +19,7 @@ import 'pantalla_resultado_online.dart';
import 'pantalla_fin_partida_online.dart';
/// Pantalla para unirse a una partida multidispositivo.
/// Flujo: nombre → discovery automático (lista de salas) → fallback QR
/// Flujo: nombre → discovery automático (lista de salas) → fallback QR
class PantallaUnirse extends StatefulWidget {
const PantallaUnirse({super.key});
@@ -64,7 +64,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
nearby.onMensaje((endpointId, mensaje) {
if (!mounted) return;
if (mensaje.tipo == TipoMensaje.partidaInicio) {
// El host ha iniciado la partida nos ha enviado nuestra palabra
// El host ha iniciado la partida — nos ha enviado nuestra palabra
final jugadoresData = mensaje.datos['jugadores'] as List<dynamic>?;
final jugadoresTodosData =
mensaje.datos['jugadoresTodos'] as List<dynamic>?;
@@ -303,7 +303,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
if (!_formKey.currentState!.validate()) return;
final l10n = AppLocalizations.of(context)!;
// Solicitar permisos automáticamente
// Solicitar permisos automáticamente
final permisosOk = await ServicioPermisos.solicitarPermisosNearby(context);
if (!permisosOk) {
setState(() {
@@ -365,7 +365,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
_conectando = false;
_error = l10n.couldNotConnectToHost(nombreHost);
});
// Reiniciar búsqueda
// Reiniciar búsqueda
_iniciarBusqueda();
}
}
@@ -395,7 +395,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
datos['host'] as String? ?? datos['sala'] as String? ?? l10n.room;
});
// Iniciar búsqueda para que Nearby encuentre al host
// Iniciar búsqueda para que Nearby encuentre al host
final nearby = context.read<ServicioNearby>();
if (!nearby.buscando) {
final servicioPerfil = context.read<ServicioPerfilUsuario>();
@@ -419,7 +419,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
final l10n = AppLocalizations.of(context)!;
final nearby = context.watch<ServicioNearby>();
// Si estamos conectados pantalla de espera
// Si estamos conectados → pantalla de espera
if (nearby.conectado && !nearby.esHost) {
return _buildPantallaEspera(context, l10n);
}
@@ -457,6 +457,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
const SizedBox(height: 14),
EncabezadoFarolero(
icono: Icons.bluetooth_searching,
assetIconPath: 'assets/ui/generated/actions/action_multidevice_signal.webp',
titulo: l10n.joinGameTitle,
subtitulo: l10n.enterNameToSearch,
color: TemaApp.colorAzul,
@@ -479,6 +480,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
BotonFarolero(
texto: l10n.searchGames,
icono: Icons.search,
assetIconPath: 'assets/ui/generated/actions/action_join_search.webp',
onPressed: _iniciarBusqueda,
),
if (_error != null) ...[
@@ -527,6 +529,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
const SizedBox(height: 12),
EncabezadoFarolero(
icono: _conectando ? Icons.sync : Icons.radar,
assetIconPath: _conectando ? null : 'assets/ui/generated/actions/action_join_search.webp',
titulo: _conectando
? '${l10n.connectingTo} ${_salaSeleccionada ?? ""}...'
: l10n.searchingGames,
@@ -553,6 +556,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
? Center(
child: EstadoVacioFarolero(
icono: Icons.radar,
assetIconPath: 'assets/ui/generated/actions/action_join_search.webp',
titulo: l10n.noGamesFound,
subtitulo: l10n.noGamesFoundHint,
),
@@ -584,10 +588,11 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
const SizedBox(height: 8),
SizedBox(
width: double.infinity,
child: OutlinedButton.icon(
child: BotonFarolero.oscuro(
texto: l10n.scanQR,
icono: Icons.qr_code_scanner,
assetIconPath: 'assets/ui/generated/actions/action_qr_scan.webp',
onPressed: _abrirEscaner,
icon: const Icon(Icons.qr_code_scanner),
label: Text(l10n.scanQR),
),
),
],
@@ -655,7 +660,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
);
}
// ==================== ESCÁNER QR ====================
// ==================== ESCÁNER QR ====================
Widget _buildEscaner(BuildContext context, AppLocalizations l10n) {
return Scaffold(
@@ -766,7 +771,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
padding: const EdgeInsets.all(12),
child: Column(
children: [
// Opción crear nuevo usuario (tarea 3.5)
// Opción crear nuevo usuario (tarea 3.5)
ListTile(
leading: const Icon(
Icons.add,
@@ -798,7 +803,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
);
}
/// Crea un nuevo usuario y lo envía al host
/// Crea un nuevo usuario y lo envía al host
Future<void> _crearNuevoUsuario(BuildContext context) async {
final l10n = AppLocalizations.of(context)!;
final controller = TextEditingController();
@@ -847,7 +852,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
}
}
/// Envía el usuario seleccionado/creado al host
/// Envía el usuario seleccionado/creado al host
void _enviarUsuarioAlHost(Usuario usuario) {
final l10n = AppLocalizations.of(context)!;
final nearby = context.read<ServicioNearby>();
+5
View File
@@ -42,6 +42,7 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
const SizedBox(height: 10),
TarjetaFaseFarolero(
icono: Icons.visibility,
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
titulo: l10n.roundNumber(partida.rondaActual),
subtitulo: l10n.eachPlayerMustSee,
),
@@ -57,6 +58,7 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
nombre: '${index + 1}. ${jugador.nombre}',
subtitulo: haVisto ? l10n.alreadySeen : l10n.tapToSee,
icono: haVisto ? Icons.check_circle : Icons.visibility,
assetIconPath: haVisto ? null : 'assets/ui/generated/actions/action_reveal_word.webp',
destacado: haVisto,
completado: haVisto,
onTap: haVisto ? null : () => _mostrarPalabra(context, jugador.id),
@@ -70,6 +72,7 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
? l10n.allSeenStartDebate
: l10n.playersRemaining(partida.jugadores.length - _hanVisto.length),
icono: Icons.forum,
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
onPressed: todosHanVisto
? () {
estado.iniciarDebate();
@@ -154,6 +157,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
const SizedBox(height: 12),
TarjetaFaseFarolero(
icono: widget.esImpostor ? Icons.theater_comedy : Icons.search,
assetIconPath: widget.esImpostor ? 'assets/ui/generated/actions/action_impostor_mask.webp' : 'assets/ui/generated/actions/action_reveal_word.webp',
titulo: widget.nombre,
subtitulo: l10n.holdToSeeWord,
color: colorEstado,
@@ -250,6 +254,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
BotonFarolero.secundario(
texto: l10n.seenMyWord,
icono: Icons.check,
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
onPressed: () {
widget.onVisto();
Navigator.pop(context);
+3
View File
@@ -61,6 +61,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
const SizedBox(height: 10),
TarjetaFaseFarolero(
icono: Icons.how_to_vote,
assetIconPath: 'assets/ui/generated/actions/action_vote_mask.webp',
titulo: l10n.voteOf(votanteActual.nombre),
subtitulo: l10n.votesProgress(estado.votos.length, activos.length),
color: TemaApp.colorAcento,
@@ -78,6 +79,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
Expanded(
child: TarjetaFaseFarolero(
icono: Icons.person_search,
assetIconPath: 'assets/ui/generated/actions/action_players_group.webp',
titulo: l10n.whoIsImpostor,
subtitulo: l10n.selectOnePlayer,
color: TemaApp.colorNaranja,
@@ -139,6 +141,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
const SizedBox(height: 24),
TarjetaFaseFarolero(
icono: Icons.check_circle,
assetIconPath: 'assets/ui/generated/actions/action_result_trophy.webp',
titulo: l10n.allVoted,
subtitulo: l10n.tapToReveal,
color: TemaApp.colorVerde,
+50 -5
View File
@@ -77,6 +77,7 @@ class PanelFarolero extends StatelessWidget {
class EncabezadoFarolero extends StatelessWidget {
final IconData icono;
final String? assetIconPath;
final String titulo;
final String? subtitulo;
final Color color;
@@ -86,6 +87,7 @@ class EncabezadoFarolero extends StatelessWidget {
const EncabezadoFarolero({
super.key,
required this.icono,
this.assetIconPath,
required this.titulo,
this.subtitulo,
this.color = TemaApp.colorNaranja,
@@ -118,7 +120,16 @@ class EncabezadoFarolero extends StatelessWidget {
),
],
),
child: Icon(icono, color: color, size: 30),
child: assetIconPath == null
? Icon(icono, color: color, size: 30)
: Padding(
padding: const EdgeInsets.all(6),
child: Image.asset(
assetIconPath!,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
),
),
const SizedBox(width: 14),
Expanded(
@@ -159,12 +170,14 @@ class EncabezadoFarolero extends StatelessWidget {
class EstadoVacioFarolero extends StatelessWidget {
final IconData icono;
final String? assetIconPath;
final String titulo;
final String subtitulo;
const EstadoVacioFarolero({
super.key,
required this.icono,
this.assetIconPath,
required this.titulo,
required this.subtitulo,
});
@@ -176,7 +189,17 @@ class EstadoVacioFarolero extends StatelessWidget {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(icono, color: TemaApp.colorNaranja, size: 46),
SizedBox(
width: 64,
height: 64,
child: assetIconPath == null
? Icon(icono, color: TemaApp.colorNaranja, size: 46)
: Image.asset(
assetIconPath!,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
),
const SizedBox(height: 14),
Text(
titulo,
@@ -348,6 +371,7 @@ class BotonFarolero extends StatelessWidget {
class TarjetaFaseFarolero extends StatelessWidget {
final IconData icono;
final String? assetIconPath;
final String titulo;
final String? subtitulo;
final Color color;
@@ -357,6 +381,7 @@ class TarjetaFaseFarolero extends StatelessWidget {
const TarjetaFaseFarolero({
super.key,
required this.icono,
this.assetIconPath,
required this.titulo,
this.subtitulo,
this.color = TemaApp.colorNaranja,
@@ -388,7 +413,16 @@ class TarjetaFaseFarolero extends StatelessWidget {
),
border: Border.all(color: color.withValues(alpha: 0.72)),
),
child: Icon(icono, color: color, size: 30),
child: assetIconPath == null
? Icon(icono, color: color, size: 30)
: Padding(
padding: const EdgeInsets.all(6),
child: Image.asset(
assetIconPath!,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
),
),
const SizedBox(width: 14),
Expanded(
@@ -429,6 +463,7 @@ class EstadoJugadorFarolero extends StatelessWidget {
final bool destacado;
final bool completado;
final IconData icono;
final String? assetIconPath;
final String? subtitulo;
final VoidCallback? onTap;
@@ -438,6 +473,7 @@ class EstadoJugadorFarolero extends StatelessWidget {
this.destacado = false,
this.completado = false,
this.icono = Icons.person,
this.assetIconPath,
this.subtitulo,
this.onTap,
});
@@ -475,7 +511,16 @@ class EstadoJugadorFarolero extends StatelessWidget {
color: color.withValues(alpha: 0.16),
border: Border.all(color: color.withValues(alpha: 0.72)),
),
child: Icon(icono, color: color, size: 24),
child: assetIconPath == null
? Icon(icono, color: color, size: 24)
: Padding(
padding: const EdgeInsets.all(5),
child: Image.asset(
assetIconPath!,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
),
),
const SizedBox(width: 12),
Expanded(
@@ -564,7 +609,7 @@ class TemporizadorFarolero extends StatelessWidget {
alignment: Alignment.center,
children: [
Image.asset(
'assets/ui/generated/gameplay/gameplay_phase_emblem.webp',
'assets/ui/generated/actions/action_timer_hourglass.webp',
height: 132,
fit: BoxFit.contain,
opacity: const AlwaysStoppedAnimation(0.34),
+20 -10
View File
@@ -590,8 +590,13 @@ class BarraFuegoPremiumFarolero extends StatelessWidget {
children: [
Row(
children: [
const Icon(Icons.local_fire_department,
color: TemaApp.colorNaranja, size: 18),
Image.asset(
'assets/ui/generated/actions/action_fire_badge.webp',
width: 22,
height: 22,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
const SizedBox(width: 6),
Text(
'${AppLocalizations.of(context)!.fireLabel} '
@@ -1147,10 +1152,13 @@ class _IconoFuegoRecompensa extends StatelessWidget {
),
],
),
child: const Icon(
Icons.local_fire_department,
color: Color(0xFF1B1010),
size: 30,
child: Padding(
padding: const EdgeInsets.all(7),
child: Image.asset(
'assets/ui/generated/actions/action_fire_badge.webp',
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
),
);
}
@@ -1185,10 +1193,12 @@ class _DeltaFuegoPremium extends StatelessWidget {
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(
Icons.local_fire_department,
color: TemaApp.colorNaranja,
size: 24,
Image.asset(
'assets/ui/generated/actions/action_fire_badge.webp',
width: 26,
height: 26,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
const SizedBox(width: 4),
Text(