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
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

+1 -1
View File
@@ -99,7 +99,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
controller: _controlador, controller: _controlador,
decoration: InputDecoration( decoration: InputDecoration(
hintText: l10n.guessWordHint, hintText: l10n.guessWordHint,
prefixIcon: const Icon(Icons.search), prefixIcon: IconoFarolero(Icons.search),
), ),
textCapitalization: TextCapitalization.sentences, textCapitalization: TextCapitalization.sentences,
textAlign: TextAlign.center, textAlign: TextAlign.center,
+3 -3
View File
@@ -135,7 +135,7 @@ class _PantallaAjustesState extends State<PantallaAjustes> {
leading: Text(bandera, style: const TextStyle(fontSize: 24)), leading: Text(bandera, style: const TextStyle(fontSize: 24)),
title: Text(nombre), title: Text(nombre),
trailing: seleccionado trailing: seleccionado
? const Icon(Icons.check_circle, color: TemaApp.colorAcento) ? IconoFarolero(Icons.check_circle, color: TemaApp.colorAcento)
: null, : null,
onTap: onTap, onTap: onTap,
dense: true, dense: true,
@@ -172,7 +172,7 @@ class _PantallaAjustesState extends State<PantallaAjustes> {
onChanged: (_) => setDialogState(() {}), onChanged: (_) => setDialogState(() {}),
decoration: InputDecoration( decoration: InputDecoration(
labelText: l10n.profileName, labelText: l10n.profileName,
prefixIcon: const Icon(Icons.person), prefixIcon: IconoFarolero(Icons.person),
), ),
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
@@ -180,7 +180,7 @@ class _PantallaAjustesState extends State<PantallaAjustes> {
controller: nickController, controller: nickController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: l10n.profileNick, labelText: l10n.profileNick,
prefixIcon: const Icon(Icons.alternate_email), prefixIcon: IconoFarolero(Icons.alternate_email),
), ),
), ),
const SizedBox(height: 18), const SizedBox(height: 18),
+6 -6
View File
@@ -353,12 +353,12 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
ButtonSegment( ButtonSegment(
value: false, value: false,
label: Text(l10n.singleDevice), label: Text(l10n.singleDevice),
icon: const Icon(Icons.phone_android), icon: IconoFarolero(Icons.phone_android),
), ),
ButtonSegment( ButtonSegment(
value: true, value: true,
label: Text(l10n.multiDevice), label: Text(l10n.multiDevice),
icon: const Icon(Icons.devices), icon: IconoFarolero(Icons.devices),
), ),
], ],
selected: {_modoMultimovil}, selected: {_modoMultimovil},
@@ -490,7 +490,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
const SizedBox(width: 8), const SizedBox(width: 8),
IconButton.filled( IconButton.filled(
onPressed: _agregarJugador, onPressed: _agregarJugador,
icon: const Icon(Icons.add), icon: IconoFarolero(Icons.add),
), ),
], ],
), ),
@@ -529,7 +529,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
? Text(l10n.mainDeviceUser) ? Text(l10n.mainDeviceUser)
: null, : null,
trailing: esPerfilLocal trailing: esPerfilLocal
? const Icon(Icons.lock, color: TemaApp.colorDorado) ? IconoFarolero(Icons.lock, color: TemaApp.colorDorado)
: IconButton( : IconButton(
icon: const Icon( icon: const Icon(
Icons.close, Icons.close,
@@ -570,7 +570,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
onPressed: _numImpostores > 1 onPressed: _numImpostores > 1
? () => setState(() => _numImpostores--) ? () => setState(() => _numImpostores--)
: null, : null,
icon: const Icon(Icons.remove_circle_outline), icon: IconoFarolero(Icons.remove_circle_outline),
), ),
Text( Text(
'$_numImpostores', '$_numImpostores',
@@ -580,7 +580,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
onPressed: _numImpostores < _maxImpostores onPressed: _numImpostores < _maxImpostores
? () => setState(() => _numImpostores++) ? () => setState(() => _numImpostores++)
: null, : null,
icon: const Icon(Icons.add_circle_outline), icon: IconoFarolero(Icons.add_circle_outline),
), ),
], ],
), ),
+2 -2
View File
@@ -127,7 +127,7 @@ class _PantallaDebateClienteState extends State<PantallaDebateCliente> {
actions: [ actions: [
IconButton( IconButton(
tooltip: l10n.seeYourWord, tooltip: l10n.seeYourWord,
icon: const Icon(Icons.visibility), icon: IconoFarolero(Icons.visibility),
onPressed: widget.jugadoresControlados.isEmpty onPressed: widget.jugadoresControlados.isEmpty
? null ? null
: () => mostrarRevisionPalabraOnline( : () => mostrarRevisionPalabraOnline(
@@ -138,7 +138,7 @@ class _PantallaDebateClienteState extends State<PantallaDebateCliente> {
), ),
IconButton( IconButton(
tooltip: l10n.notesTitle, tooltip: l10n.notesTitle,
icon: const Icon(Icons.edit_note), icon: IconoFarolero(Icons.edit_note),
onPressed: _puedeAbrirNotas onPressed: _puedeAbrirNotas
? () => Navigator.push( ? () => Navigator.push(
context, context,
+3 -3
View File
@@ -846,7 +846,7 @@ class _TarjetaImpostores extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
const Icon(Icons.theater_comedy, color: TemaApp.colorAcento), IconoFarolero(Icons.theater_comedy, color: TemaApp.colorAcento),
const SizedBox(width: 8), const SizedBox(width: 8),
Flexible( Flexible(
child: Text( child: Text(
@@ -867,7 +867,7 @@ class _TarjetaImpostores extends StatelessWidget {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
const Icon(Icons.theater_comedy, IconoFarolero(Icons.theater_comedy,
size: 20, color: TemaApp.colorAcento), size: 20, color: TemaApp.colorAcento),
const SizedBox(width: 8), const SizedBox(width: 8),
Text( Text(
@@ -879,7 +879,7 @@ class _TarjetaImpostores extends StatelessWidget {
), ),
if (j.eliminado) ...[ if (j.eliminado) ...[
const SizedBox(width: 8), const SizedBox(width: 8),
const Icon(Icons.close, IconoFarolero(Icons.close,
size: 16, color: TemaApp.colorTextoSecundario), size: 16, color: TemaApp.colorTextoSecundario),
], ],
], ],
@@ -196,7 +196,7 @@ class _PantallaFinPartidaOnlineState extends State<PantallaFinPartidaOnline> {
return [ return [
IconButton( IconButton(
tooltip: l10n.seeYourWord, tooltip: l10n.seeYourWord,
icon: const Icon(Icons.visibility), icon: IconoFarolero(Icons.visibility),
onPressed: widget.jugadoresControlados.isEmpty onPressed: widget.jugadoresControlados.isEmpty
? null ? null
: () => mostrarRevisionPalabraOnline( : () => mostrarRevisionPalabraOnline(
@@ -207,7 +207,7 @@ class _PantallaFinPartidaOnlineState extends State<PantallaFinPartidaOnline> {
), ),
IconButton( IconButton(
tooltip: l10n.notesTitle, tooltip: l10n.notesTitle,
icon: const Icon(Icons.edit_note), icon: IconoFarolero(Icons.edit_note),
onPressed: snapshot.roomId == null || widget.jugadoresControlados.isEmpty onPressed: snapshot.roomId == null || widget.jugadoresControlados.isEmpty
? null ? null
: () => Navigator.push( : () => Navigator.push(
+5 -5
View File
@@ -163,7 +163,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
actions: [ actions: [
IconButton( IconButton(
tooltip: l10n.seeYourWord, tooltip: l10n.seeYourWord,
icon: const Icon(Icons.visibility), icon: IconoFarolero(Icons.visibility),
onPressed: partida.fase.index <= FaseJuego.verPalabra.index onPressed: partida.fase.index <= FaseJuego.verPalabra.index
? null ? null
: () => mostrarRevisionPalabraOnline( : () => mostrarRevisionPalabraOnline(
@@ -179,7 +179,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
), ),
IconButton( IconButton(
tooltip: l10n.notesTitle, tooltip: l10n.notesTitle,
icon: const Icon(Icons.edit_note), icon: IconoFarolero(Icons.edit_note),
onPressed: partida.fase.index < FaseJuego.debate.index || onPressed: partida.fase.index < FaseJuego.debate.index ||
nearby.roomId == null nearby.roomId == null
? null ? null
@@ -198,7 +198,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
), ),
), ),
IconButton( IconButton(
icon: const Icon(Icons.close), icon: IconoFarolero(Icons.close),
onPressed: () async { onPressed: () async {
await nearby.desconectar(); await nearby.desconectar();
widget.onPartidaFin(); widget.onPartidaFin();
@@ -263,7 +263,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
children: [ children: [
Row( Row(
children: [ children: [
const Icon(Icons.link_off, color: TemaApp.colorAcento), IconoFarolero(Icons.link_off, color: TemaApp.colorAcento),
const SizedBox(width: 8), const SizedBox(width: 8),
Expanded( Expanded(
child: Text( child: Text(
@@ -583,7 +583,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
), ),
child: Row( child: Row(
children: [ children: [
const Icon(Icons.record_voice_over, color: TemaApp.colorNaranja), IconoFarolero(Icons.record_voice_over, color: TemaApp.colorNaranja),
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
child: Text( child: Text(
+6 -6
View File
@@ -40,7 +40,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
appBar: AppBar( appBar: AppBar(
title: Text(widget.nombreSala), title: Text(widget.nombreSala),
leading: IconButton( leading: IconButton(
icon: const Icon(Icons.close), icon: IconoFarolero(Icons.close),
onPressed: () async { onPressed: () async {
await nearby.desconectar(); await nearby.desconectar();
if (context.mounted) Navigator.pop(context); if (context.mounted) Navigator.pop(context);
@@ -148,7 +148,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
), ),
IconButton.filledTonal( IconButton.filledTonal(
onPressed: () => _crearNuevoUsuario(context), onPressed: () => _crearNuevoUsuario(context),
icon: const Icon(Icons.person_add), icon: IconoFarolero(Icons.person_add),
), ),
], ],
), ),
@@ -330,19 +330,19 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
if (seleccionadoPorMi) if (seleccionadoPorMi)
IconButton( IconButton(
tooltip: l10n.release, tooltip: l10n.release,
icon: const Icon(Icons.close), icon: IconoFarolero(Icons.close),
onPressed: () => nearby.liberarUsuarioSala(usuario.id), onPressed: () => nearby.liberarUsuarioSala(usuario.id),
) )
else if (!seleccionadoPorOtro) else if (!seleccionadoPorOtro)
IconButton( IconButton(
tooltip: l10n.select, tooltip: l10n.select,
icon: const Icon(Icons.check_circle_outline), icon: IconoFarolero(Icons.check_circle_outline),
onPressed: () => nearby.seleccionarUsuarioSala(usuario.id), onPressed: () => nearby.seleccionarUsuarioSala(usuario.id),
), ),
if (!usuario.estaSeleccionado) if (!usuario.estaSeleccionado)
IconButton( IconButton(
tooltip: l10n.delete, tooltip: l10n.delete,
icon: const Icon(Icons.delete_outline, color: TemaApp.colorAcento), icon: IconoFarolero(Icons.delete_outline, color: TemaApp.colorAcento),
onPressed: () => nearby.eliminarUsuarioSala(usuario.id), onPressed: () => nearby.eliminarUsuarioSala(usuario.id),
), ),
], ],
@@ -381,7 +381,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
textCapitalization: TextCapitalization.words, textCapitalization: TextCapitalization.words,
decoration: InputDecoration( decoration: InputDecoration(
hintText: l10n.yourName, hintText: l10n.yourName,
prefixIcon: const Icon(Icons.person), prefixIcon: IconoFarolero(Icons.person),
), ),
onSubmitted: (v) => Navigator.pop(ctx, v), onSubmitted: (v) => Navigator.pop(ctx, v),
), ),
+5 -5
View File
@@ -75,7 +75,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
actions: [ actions: [
if (_jugadorSeleccionadoId != null) if (_jugadorSeleccionadoId != null)
IconButton( IconButton(
icon: const Icon(Icons.save), icon: IconoFarolero(Icons.save),
onPressed: () async { onPressed: () async {
await _guardarNotas(); await _guardarNotas();
if (context.mounted) { if (context.mounted) {
@@ -129,7 +129,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
style: const TextStyle(color: Colors.white)), style: const TextStyle(color: Colors.white)),
), ),
title: Text(j.nombre), title: Text(j.nombre),
trailing: const Icon(Icons.arrow_forward_ios, size: 16), trailing: IconoFarolero(Icons.arrow_forward_ios, size: 16),
onTap: () { onTap: () {
setState(() { setState(() {
_jugadorSeleccionadoId = j.id; _jugadorSeleccionadoId = j.id;
@@ -166,7 +166,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
Row( Row(
children: [ children: [
IconButton( IconButton(
icon: const Icon(Icons.arrow_back), icon: IconoFarolero(Icons.arrow_back),
onPressed: () async { onPressed: () async {
await _guardarNotas(); await _guardarNotas();
setState(() { setState(() {
@@ -202,7 +202,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
controller: _controladores[j.id], controller: _controladores[j.id],
decoration: InputDecoration( decoration: InputDecoration(
labelText: j.nombre, labelText: j.nombre,
prefixIcon: const Icon(Icons.person, size: 20), prefixIcon: IconoFarolero(Icons.person, size: 20),
hintText: l10n.playerNoteHint, hintText: l10n.playerNoteHint,
), ),
maxLines: 2, maxLines: 2,
@@ -223,7 +223,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
controller: _controladorNotaLibre, controller: _controladorNotaLibre,
decoration: InputDecoration( decoration: InputDecoration(
hintText: l10n.freeNoteHint, hintText: l10n.freeNoteHint,
prefixIcon: const Icon(Icons.note, size: 20), prefixIcon: IconoFarolero(Icons.note, size: 20),
), ),
maxLines: 5, maxLines: 5,
minLines: 3, minLines: 3,
+5 -5
View File
@@ -105,7 +105,7 @@ class _PantallaNotasOnlineState extends State<PantallaNotasOnline> {
actions: [ actions: [
if (_autor != null) if (_autor != null)
IconButton( IconButton(
icon: const Icon(Icons.save), icon: IconoFarolero(Icons.save),
onPressed: () async { onPressed: () async {
await _guardarNotas(); await _guardarNotas();
if (!context.mounted) return; if (!context.mounted) return;
@@ -143,7 +143,7 @@ class _PantallaNotasOnlineState extends State<PantallaNotasOnline> {
.map( .map(
(autor) => Card( (autor) => Card(
child: ListTile( child: ListTile(
leading: const Icon(Icons.edit_note), leading: IconoFarolero(Icons.edit_note),
title: Text(autor.nombre), title: Text(autor.nombre),
onTap: () => _seleccionarAutor(autor), onTap: () => _seleccionarAutor(autor),
), ),
@@ -173,7 +173,7 @@ class _PantallaNotasOnlineState extends State<PantallaNotasOnline> {
children: [ children: [
if (widget.autoresControlados.length > 1) if (widget.autoresControlados.length > 1)
IconButton( IconButton(
icon: const Icon(Icons.arrow_back), icon: IconoFarolero(Icons.arrow_back),
onPressed: () async { onPressed: () async {
await _guardarNotas(); await _guardarNotas();
if (!mounted) return; if (!mounted) return;
@@ -205,7 +205,7 @@ class _PantallaNotasOnlineState extends State<PantallaNotasOnline> {
controller: _controladores[jugador.id], controller: _controladores[jugador.id],
decoration: InputDecoration( decoration: InputDecoration(
labelText: jugador.nombre, labelText: jugador.nombre,
prefixIcon: const Icon(Icons.person, size: 20), prefixIcon: IconoFarolero(Icons.person, size: 20),
hintText: l10n.playerNoteHint, hintText: l10n.playerNoteHint,
), ),
maxLines: 2, maxLines: 2,
@@ -225,7 +225,7 @@ class _PantallaNotasOnlineState extends State<PantallaNotasOnline> {
controller: _notaLibreController, controller: _notaLibreController,
decoration: InputDecoration( decoration: InputDecoration(
hintText: l10n.freeNoteHint, hintText: l10n.freeNoteHint,
prefixIcon: const Icon(Icons.note, size: 20), prefixIcon: IconoFarolero(Icons.note, size: 20),
), ),
maxLines: 5, maxLines: 5,
minLines: 3, minLines: 3,
+1 -1
View File
@@ -134,7 +134,7 @@ class _PantallaPalabraClienteState extends State<PantallaPalabraCliente> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
const Icon(Icons.lightbulb, color: TemaApp.colorAcento), IconoFarolero(Icons.lightbulb, color: TemaApp.colorAcento),
const SizedBox(width: 8), const SizedBox(width: 8),
Flexible( Flexible(
child: Text( child: Text(
+2 -2
View File
@@ -261,7 +261,7 @@ class _PerfilInicioPremium extends StatelessWidget {
foregroundColor: TemaApp.colorDorado, foregroundColor: TemaApp.colorDorado,
side: BorderSide(color: TemaApp.colorDorado.withValues(alpha: 0.44)), side: BorderSide(color: TemaApp.colorDorado.withValues(alpha: 0.44)),
), ),
icon: const Icon(Icons.settings_rounded), icon: IconoFarolero(Icons.settings_rounded),
), ),
], ],
), ),
@@ -506,7 +506,7 @@ class _AccesoHistorialPremium extends StatelessWidget {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
const Icon(Icons.history_rounded, color: TemaApp.colorNaranja), IconoFarolero(Icons.history_rounded, color: TemaApp.colorNaranja),
const SizedBox(width: 10), const SizedBox(width: 10),
Text( Text(
etiqueta.toUpperCase(), etiqueta.toUpperCase(),
+2 -2
View File
@@ -191,7 +191,7 @@ class _PantallaResultadoOnlineState extends State<PantallaResultadoOnline> {
List<Widget> _acciones(BuildContext context, AppLocalizations l10n) => [ List<Widget> _acciones(BuildContext context, AppLocalizations l10n) => [
IconButton( IconButton(
tooltip: l10n.seeYourWord, tooltip: l10n.seeYourWord,
icon: const Icon(Icons.visibility), icon: IconoFarolero(Icons.visibility),
onPressed: widget.jugadoresControlados.isEmpty onPressed: widget.jugadoresControlados.isEmpty
? null ? null
: () => mostrarRevisionPalabraOnline( : () => mostrarRevisionPalabraOnline(
@@ -202,7 +202,7 @@ class _PantallaResultadoOnlineState extends State<PantallaResultadoOnline> {
), ),
IconButton( IconButton(
tooltip: l10n.notesTitle, tooltip: l10n.notesTitle,
icon: const Icon(Icons.edit_note), icon: IconoFarolero(Icons.edit_note),
onPressed: _snapshot.roomId == null || widget.jugadoresControlados.isEmpty onPressed: _snapshot.roomId == null || widget.jugadoresControlados.isEmpty
? null ? null
: () => Navigator.push( : () => Navigator.push(
@@ -228,7 +228,7 @@ class _ModoCard extends StatelessWidget {
), ),
), ),
const SizedBox(width: 8), const SizedBox(width: 8),
Icon(Icons.chevron_right_rounded, color: color, size: 30), IconoFarolero(Icons.chevron_right_rounded, color: color, size: 30),
], ],
), ),
), ),
+7 -7
View File
@@ -467,7 +467,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
controller: _nombreController, controller: _nombreController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: l10n.yourName, labelText: l10n.yourName,
prefixIcon: const Icon(Icons.person), prefixIcon: IconoFarolero(Icons.person),
), ),
validator: (v) { validator: (v) {
if (v == null || v.trim().isEmpty) return l10n.nameRequired; if (v == null || v.trim().isEmpty) return l10n.nameRequired;
@@ -509,7 +509,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
appBar: AppBar( appBar: AppBar(
title: Text(l10n.joinGameTitle), title: Text(l10n.joinGameTitle),
leading: IconButton( leading: IconButton(
icon: const Icon(Icons.arrow_back), icon: IconoFarolero(Icons.arrow_back),
onPressed: () async { onPressed: () async {
await nearby.pararBusqueda(); await nearby.pararBusqueda();
setState(() { setState(() {
@@ -667,7 +667,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
appBar: AppBar( appBar: AppBar(
title: Text(l10n.scanQR), title: Text(l10n.scanQR),
leading: IconButton( leading: IconButton(
icon: const Icon(Icons.arrow_back), icon: IconoFarolero(Icons.arrow_back),
onPressed: () => setState(() => _escaneandoQR = false), onPressed: () => setState(() => _escaneandoQR = false),
), ),
), ),
@@ -714,7 +714,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
appBar: AppBar( appBar: AppBar(
title: Text(_salaSeleccionada ?? l10n.joinGameTitle), title: Text(_salaSeleccionada ?? l10n.joinGameTitle),
leading: IconButton( leading: IconButton(
icon: const Icon(Icons.close), icon: IconoFarolero(Icons.close),
onPressed: () async { onPressed: () async {
final nearby = context.read<ServicioNearby>(); final nearby = context.read<ServicioNearby>();
await nearby.desconectar(); await nearby.desconectar();
@@ -792,7 +792,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
// Si no hay usuarios, permitir crear uno // Si no hay usuarios, permitir crear uno
OutlinedButton.icon( OutlinedButton.icon(
onPressed: () => _crearNuevoUsuario(context), onPressed: () => _crearNuevoUsuario(context),
icon: const Icon(Icons.person_add), icon: IconoFarolero(Icons.person_add),
label: Text(l10n.createNewUser), label: Text(l10n.createNewUser),
), ),
], ],
@@ -823,7 +823,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
textCapitalization: TextCapitalization.words, textCapitalization: TextCapitalization.words,
decoration: InputDecoration( decoration: InputDecoration(
hintText: l10n.yourName, hintText: l10n.yourName,
prefixIcon: const Icon(Icons.person), prefixIcon: IconoFarolero(Icons.person),
), ),
onSubmitted: (v) => Navigator.pop(ctx, v), onSubmitted: (v) => Navigator.pop(ctx, v),
), ),
@@ -902,7 +902,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
), ),
trailing: seleccionadoPorMi trailing: seleccionadoPorMi
? IconButton( ? IconButton(
icon: const Icon(Icons.close), icon: IconoFarolero(Icons.close),
onPressed: () => nearby.liberarUsuarioSala(usuario.id), onPressed: () => nearby.liberarUsuarioSala(usuario.id),
) )
: null, : null,
+1 -1
View File
@@ -201,7 +201,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
) )
: Column( : Column(
children: [ children: [
const Icon(Icons.lock, color: TemaApp.colorDorado, size: 52), IconoFarolero(Icons.lock, color: TemaApp.colorDorado, size: 52),
const SizedBox(height: 16), const SizedBox(height: 16),
Text( Text(
l10n.holdToSeeWord, l10n.holdToSeeWord,
+2 -2
View File
@@ -122,7 +122,7 @@ class _PantallaVotacionClienteState extends State<PantallaVotacionCliente> {
actions: [ actions: [
IconButton( IconButton(
tooltip: l10n.seeYourWord, tooltip: l10n.seeYourWord,
icon: const Icon(Icons.visibility), icon: IconoFarolero(Icons.visibility),
onPressed: widget.jugadoresControlados.isEmpty onPressed: widget.jugadoresControlados.isEmpty
? null ? null
: () => mostrarRevisionPalabraOnline( : () => mostrarRevisionPalabraOnline(
@@ -133,7 +133,7 @@ class _PantallaVotacionClienteState extends State<PantallaVotacionCliente> {
), ),
IconButton( IconButton(
tooltip: l10n.notesTitle, tooltip: l10n.notesTitle,
icon: const Icon(Icons.edit_note), icon: IconoFarolero(Icons.edit_note),
onPressed: _puedeAbrirNotas onPressed: _puedeAbrirNotas
? () => Navigator.push( ? () => Navigator.push(
context, context,
+152 -36
View File
@@ -6,6 +6,126 @@ import 'package:google_fonts/google_fonts.dart';
import '../modelos/gamificacion_usuario.dart'; import '../modelos/gamificacion_usuario.dart';
import 'tema_app.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 { class FondoFarolero extends StatelessWidget {
final Widget child; final Widget child;
final bool intenso; final bool intenso;
@@ -120,14 +240,13 @@ class EncabezadoFarolero extends StatelessWidget {
), ),
], ],
), ),
child: assetIconPath == null child: Padding(
? Icon(icono, color: color, size: 30)
: Padding(
padding: const EdgeInsets.all(6), padding: const EdgeInsets.all(6),
child: Image.asset( child: IconoFarolero(
assetIconPath!, icono,
fit: BoxFit.contain, assetPath: assetIconPath,
filterQuality: FilterQuality.medium, color: color,
size: 30,
), ),
), ),
), ),
@@ -192,12 +311,11 @@ class EstadoVacioFarolero extends StatelessWidget {
SizedBox( SizedBox(
width: 64, width: 64,
height: 64, height: 64,
child: assetIconPath == null child: IconoFarolero(
? Icon(icono, color: TemaApp.colorNaranja, size: 46) icono,
: Image.asset( assetPath: assetIconPath,
assetIconPath!, color: TemaApp.colorNaranja,
fit: BoxFit.contain, size: 58,
filterQuality: FilterQuality.medium,
), ),
), ),
const SizedBox(height: 14), const SizedBox(height: 14),
@@ -230,7 +348,7 @@ class LogoFarolero extends StatelessWidget {
children: [ children: [
Positioned( Positioned(
top: 0, top: 0,
child: Icon( child: IconoFarolero(
Icons.lightbulb, Icons.lightbulb,
color: TemaApp.colorDorado.withValues(alpha: 0.32), color: TemaApp.colorDorado.withValues(alpha: 0.32),
size: size * 0.82, size: size * 0.82,
@@ -331,12 +449,11 @@ class BotonFarolero extends StatelessWidget {
SizedBox( SizedBox(
width: 44, width: 44,
height: 40, height: 40,
child: assetIconPath == null child: IconoFarolero(
? Icon(icono, color: colorTexto, size: 30) icono,
: Image.asset( assetPath: assetIconPath,
assetIconPath!, color: colorTexto,
fit: BoxFit.contain, size: 38,
filterQuality: FilterQuality.medium,
), ),
), ),
const SizedBox(width: 10), const SizedBox(width: 10),
@@ -413,14 +530,13 @@ class TarjetaFaseFarolero extends StatelessWidget {
), ),
border: Border.all(color: color.withValues(alpha: 0.72)), border: Border.all(color: color.withValues(alpha: 0.72)),
), ),
child: assetIconPath == null child: Padding(
? Icon(icono, color: color, size: 30)
: Padding(
padding: const EdgeInsets.all(6), padding: const EdgeInsets.all(6),
child: Image.asset( child: IconoFarolero(
assetIconPath!, icono,
fit: BoxFit.contain, assetPath: assetIconPath,
filterQuality: FilterQuality.medium, color: color,
size: 30,
), ),
), ),
), ),
@@ -511,14 +627,13 @@ class EstadoJugadorFarolero extends StatelessWidget {
color: color.withValues(alpha: 0.16), color: color.withValues(alpha: 0.16),
border: Border.all(color: color.withValues(alpha: 0.72)), border: Border.all(color: color.withValues(alpha: 0.72)),
), ),
child: assetIconPath == null child: Padding(
? Icon(icono, color: color, size: 24)
: Padding(
padding: const EdgeInsets.all(5), padding: const EdgeInsets.all(5),
child: Image.asset( child: IconoFarolero(
assetIconPath!, icono,
fit: BoxFit.contain, assetPath: assetIconPath,
filterQuality: FilterQuality.medium, color: color,
size: 26,
), ),
), ),
), ),
@@ -549,9 +664,10 @@ class EstadoJugadorFarolero extends StatelessWidget {
], ],
), ),
), ),
Icon( IconoFarolero(
completado ? Icons.check_circle : Icons.hourglass_bottom, completado ? Icons.check_circle : Icons.hourglass_bottom,
color: completado ? TemaApp.colorVerde : TemaApp.colorTextoSecundario, color: completado ? TemaApp.colorVerde : TemaApp.colorTextoSecundario,
size: 28,
), ),
], ],
), ),
@@ -878,7 +994,7 @@ class AccesoFarolero extends StatelessWidget {
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Icon(icono, color: TemaApp.colorNaranja, size: 22), IconoFarolero(icono, color: TemaApp.colorNaranja, size: 24),
const SizedBox(height: 5), const SizedBox(height: 5),
Text( Text(
etiqueta.toUpperCase(), etiqueta.toUpperCase(),
+3 -2
View File
@@ -8,6 +8,7 @@ import '../modelos/gamificacion_usuario.dart';
import '../modelos/jugador.dart'; import '../modelos/jugador.dart';
import '../modelos/partida.dart'; import '../modelos/partida.dart';
import 'tema_app.dart'; import 'tema_app.dart';
import 'componentes_farolero.dart';
class ResultadoRondaFarolero extends StatelessWidget { class ResultadoRondaFarolero extends StatelessWidget {
final ResultadoVotacion resultado; final ResultadoVotacion resultado;
@@ -122,7 +123,7 @@ class DetalleVotosFarolero extends StatelessWidget {
children: [ children: [
Row( Row(
children: [ children: [
const Icon(Icons.bar_chart, color: TemaApp.colorNaranja), IconoFarolero(Icons.bar_chart, color: TemaApp.colorNaranja),
const SizedBox(width: 8), const SizedBox(width: 8),
Expanded( Expanded(
child: Text( child: Text(
@@ -804,7 +805,7 @@ class TarjetaImpostoresPremium extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
const Icon(Icons.theater_comedy, color: TemaApp.colorAcento), IconoFarolero(Icons.theater_comedy, color: TemaApp.colorAcento),
const SizedBox(width: 8), const SizedBox(width: 8),
Flexible( Flexible(
child: Text( child: Text(
+1
View File
@@ -48,3 +48,4 @@ flutter:
- assets/ui/generated/gameplay/ - assets/ui/generated/gameplay/
- assets/ui/generated/meta/ - assets/ui/generated/meta/
- assets/ui/generated/actions/ - assets/ui/generated/actions/
- assets/ui/generated/icons/