Iconografía básica

This commit is contained in:
2026-05-12 01:20:19 +02:00
parent 5697c2a5a1
commit 158a7ae6a8
36 changed files with 221 additions and 103 deletions
+163 -47
View File
@@ -6,6 +6,126 @@ import 'package:google_fonts/google_fonts.dart';
import '../modelos/gamificacion_usuario.dart';
import 'tema_app.dart';
class IconoFarolero extends StatelessWidget {
final IconData icono;
final String? assetPath;
final Color? color;
final double size;
const IconoFarolero(
this.icono, {
super.key,
this.assetPath,
this.color,
this.size = 28,
});
static String? assetFor(IconData icono) {
if (icono == Icons.arrow_back) return 'assets/ui/generated/icons/nav_back.webp';
if (icono == Icons.close) return 'assets/ui/generated/icons/nav_close.webp';
if (icono == Icons.check ||
icono == Icons.check_circle ||
icono == Icons.check_circle_outline) {
return 'assets/ui/generated/icons/status_check.webp';
}
if (icono == Icons.arrow_forward ||
icono == Icons.arrow_forward_ios ||
icono == Icons.chevron_right_rounded ||
icono == Icons.skip_next) {
return 'assets/ui/generated/icons/nav_forward.webp';
}
if (icono == Icons.home) return 'assets/ui/generated/icons/nav_home.webp';
if (icono == Icons.replay) return 'assets/ui/generated/icons/action_replay.webp';
if (icono == Icons.save) return 'assets/ui/generated/icons/action_save.webp';
if (icono == Icons.delete_outline) return 'assets/ui/generated/icons/action_delete.webp';
if (icono == Icons.lock) return 'assets/ui/generated/icons/status_lock.webp';
if (icono == Icons.key) return 'assets/ui/generated/icons/status_key.webp';
if (icono == Icons.visibility) return 'assets/ui/generated/icons/action_reveal_eye.webp';
if (icono == Icons.visibility_off) return 'assets/ui/generated/icons/action_hide_eye.webp';
if (icono == Icons.add ||
icono == Icons.add_circle_outline ||
icono == Icons.person_add ||
icono == Icons.person_add_alt_1) {
return 'assets/ui/generated/icons/control_plus.webp';
}
if (icono == Icons.remove_circle_outline) return 'assets/ui/generated/icons/control_minus.webp';
if (icono == Icons.cancel || icono == Icons.person_off) {
return 'assets/ui/generated/icons/status_cancel.webp';
}
if (icono == Icons.link_off) return 'assets/ui/generated/icons/status_disconnected.webp';
if (icono == Icons.search ||
icono == Icons.person_search ||
icono == Icons.gps_fixed) {
return 'assets/ui/generated/actions/action_join_search.webp';
}
if (icono == Icons.how_to_vote) return 'assets/ui/generated/actions/action_vote_mask.webp';
if (icono == Icons.edit_note || icono == Icons.note) {
return 'assets/ui/generated/actions/action_notes_quill.webp';
}
if (icono == Icons.theater_comedy ||
icono == Icons.theater_comedy_rounded ||
icono == Icons.psychology) {
return 'assets/ui/generated/actions/action_impostor_mask.webp';
}
if (icono == Icons.emoji_events ||
icono == Icons.celebration ||
icono == Icons.bar_chart) {
return 'assets/ui/generated/actions/action_result_trophy.webp';
}
if (icono == Icons.forum ||
icono == Icons.chat_bubble ||
icono == Icons.record_voice_over) {
return 'assets/ui/generated/actions/action_rules_book.webp';
}
if (icono == Icons.person ||
icono == Icons.groups ||
icono == Icons.groups_rounded) {
return 'assets/ui/generated/actions/action_players_group.webp';
}
if (icono == Icons.devices ||
icono == Icons.devices_rounded ||
icono == Icons.phone_android ||
icono == Icons.phone_android_rounded) {
return 'assets/ui/generated/actions/action_mobile_device.webp';
}
if (icono == Icons.wifi_tethering ||
icono == Icons.bluetooth_searching ||
icono == Icons.radar ||
icono == Icons.sync) {
return 'assets/ui/generated/actions/action_multidevice_signal.webp';
}
if (icono == Icons.qr_code_scanner) return 'assets/ui/generated/actions/action_qr_scan.webp';
if (icono == Icons.history_rounded) return 'assets/ui/generated/actions/action_history_ledger.webp';
if (icono == Icons.menu_book_rounded || icono == Icons.lightbulb) {
return 'assets/ui/generated/actions/action_rules_book.webp';
}
if (icono == Icons.hourglass_bottom || icono == Icons.hourglass_empty) {
return 'assets/ui/generated/actions/action_timer_hourglass.webp';
}
if (icono == Icons.play_arrow || icono == Icons.play_arrow_rounded) {
return 'assets/ui/generated/actions/action_create_game.webp';
}
return null;
}
@override
Widget build(BuildContext context) {
final resolved = assetPath ?? assetFor(icono);
if (resolved == null) {
return Icon(icono, color: color, size: size);
}
return Image.asset(
resolved,
width: size,
height: size,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
errorBuilder: (context, error, stackTrace) =>
Icon(icono, color: color, size: size),
);
}
}
class FondoFarolero extends StatelessWidget {
final Widget child;
final bool intenso;
@@ -120,16 +240,15 @@ class EncabezadoFarolero extends StatelessWidget {
),
],
),
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,
),
),
child: Padding(
padding: const EdgeInsets.all(6),
child: IconoFarolero(
icono,
assetPath: assetIconPath,
color: color,
size: 30,
),
),
),
const SizedBox(width: 14),
Expanded(
@@ -192,13 +311,12 @@ class EstadoVacioFarolero extends StatelessWidget {
SizedBox(
width: 64,
height: 64,
child: assetIconPath == null
? Icon(icono, color: TemaApp.colorNaranja, size: 46)
: Image.asset(
assetIconPath!,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
child: IconoFarolero(
icono,
assetPath: assetIconPath,
color: TemaApp.colorNaranja,
size: 58,
),
),
const SizedBox(height: 14),
Text(
@@ -230,7 +348,7 @@ class LogoFarolero extends StatelessWidget {
children: [
Positioned(
top: 0,
child: Icon(
child: IconoFarolero(
Icons.lightbulb,
color: TemaApp.colorDorado.withValues(alpha: 0.32),
size: size * 0.82,
@@ -331,13 +449,12 @@ class BotonFarolero extends StatelessWidget {
SizedBox(
width: 44,
height: 40,
child: assetIconPath == null
? Icon(icono, color: colorTexto, size: 30)
: Image.asset(
assetIconPath!,
fit: BoxFit.contain,
filterQuality: FilterQuality.medium,
),
child: IconoFarolero(
icono,
assetPath: assetIconPath,
color: colorTexto,
size: 38,
),
),
const SizedBox(width: 10),
Expanded(
@@ -413,16 +530,15 @@ class TarjetaFaseFarolero extends StatelessWidget {
),
border: Border.all(color: color.withValues(alpha: 0.72)),
),
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,
),
),
child: Padding(
padding: const EdgeInsets.all(6),
child: IconoFarolero(
icono,
assetPath: assetIconPath,
color: color,
size: 30,
),
),
),
const SizedBox(width: 14),
Expanded(
@@ -511,16 +627,15 @@ class EstadoJugadorFarolero extends StatelessWidget {
color: color.withValues(alpha: 0.16),
border: Border.all(color: color.withValues(alpha: 0.72)),
),
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,
),
),
child: Padding(
padding: const EdgeInsets.all(5),
child: IconoFarolero(
icono,
assetPath: assetIconPath,
color: color,
size: 26,
),
),
),
const SizedBox(width: 12),
Expanded(
@@ -549,9 +664,10 @@ class EstadoJugadorFarolero extends StatelessWidget {
],
),
),
Icon(
IconoFarolero(
completado ? Icons.check_circle : Icons.hourglass_bottom,
color: completado ? TemaApp.colorVerde : TemaApp.colorTextoSecundario,
size: 28,
),
],
),
@@ -878,7 +994,7 @@ class AccesoFarolero extends StatelessWidget {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(icono, color: TemaApp.colorNaranja, size: 22),
IconoFarolero(icono, color: TemaApp.colorNaranja, size: 24),
const SizedBox(height: 5),
Text(
etiqueta.toUpperCase(),
+3 -2
View File
@@ -8,6 +8,7 @@ import '../modelos/gamificacion_usuario.dart';
import '../modelos/jugador.dart';
import '../modelos/partida.dart';
import 'tema_app.dart';
import 'componentes_farolero.dart';
class ResultadoRondaFarolero extends StatelessWidget {
final ResultadoVotacion resultado;
@@ -122,7 +123,7 @@ class DetalleVotosFarolero extends StatelessWidget {
children: [
Row(
children: [
const Icon(Icons.bar_chart, color: TemaApp.colorNaranja),
IconoFarolero(Icons.bar_chart, color: TemaApp.colorNaranja),
const SizedBox(width: 8),
Expanded(
child: Text(
@@ -804,7 +805,7 @@ class TarjetaImpostoresPremium extends StatelessWidget {
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.theater_comedy, color: TemaApp.colorAcento),
IconoFarolero(Icons.theater_comedy, color: TemaApp.colorAcento),
const SizedBox(width: 8),
Flexible(
child: Text(