Multitud de iconos más
Build & Deploy Farolero / Análisis de código (push) Successful in 14s
Build & Deploy Farolero / Build APK + AAB release (push) Successful in 1m46s

This commit is contained in:
2026-05-12 01:36:41 +02:00
parent 158a7ae6a8
commit 90ada9099f
51 changed files with 41 additions and 32 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

+1 -1
View File
@@ -143,7 +143,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
color: color.withValues(alpha: 0.18), color: color.withValues(alpha: 0.18),
child: Column( child: Column(
children: [ children: [
Icon( IconoFarolero(
acierto ? Icons.celebration : Icons.cancel, acierto ? Icons.celebration : Icons.cancel,
color: color, color: color,
size: 52, size: 52,
+3 -3
View File
@@ -382,7 +382,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14),
child: Row( child: Row(
children: [ children: [
Icon( IconoFarolero(
_modoMultimovil ? Icons.devices : Icons.phone_android, _modoMultimovil ? Icons.devices : Icons.phone_android,
color: TemaApp.colorNaranja, color: TemaApp.colorNaranja,
), ),
@@ -416,7 +416,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
width: double.infinity, width: double.infinity,
child: DropdownButtonFormField<String>( child: DropdownButtonFormField<String>(
initialValue: _categoria, initialValue: _categoria,
decoration: const InputDecoration( decoration: InputDecoration(
prefixIcon: Padding( prefixIcon: Padding(
padding: EdgeInsets.all(10), padding: EdgeInsets.all(10),
child: Image.asset( child: Image.asset(
@@ -531,7 +531,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
trailing: esPerfilLocal trailing: esPerfilLocal
? IconoFarolero(Icons.lock, color: TemaApp.colorDorado) ? IconoFarolero(Icons.lock, color: TemaApp.colorDorado)
: IconButton( : IconButton(
icon: const Icon( icon: IconoFarolero(
Icons.close, Icons.close,
color: TemaApp.colorAcento, color: TemaApp.colorAcento,
), ),
+3 -3
View File
@@ -341,7 +341,7 @@ class _IconoResultadoPremium extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (icono != Icons.theater_comedy) { if (icono != Icons.theater_comedy) {
return Icon(icono, size: 82, color: TemaApp.colorDorado); return IconoFarolero(icono, size: 82, color: TemaApp.colorDorado);
} }
return Stack( return Stack(
@@ -351,7 +351,7 @@ class _IconoResultadoPremium extends StatelessWidget {
offset: const Offset(-18, 12), offset: const Offset(-18, 12),
child: Transform.rotate( child: Transform.rotate(
angle: -0.10, angle: -0.10,
child: Icon( child: IconoFarolero(
Icons.mood, Icons.mood,
size: 66, size: 66,
color: TemaApp.colorDorado.withValues(alpha: 0.98), color: TemaApp.colorDorado.withValues(alpha: 0.98),
@@ -362,7 +362,7 @@ class _IconoResultadoPremium extends StatelessWidget {
offset: const Offset(20, -13), offset: const Offset(20, -13),
child: Transform.rotate( child: Transform.rotate(
angle: 0.12, angle: 0.12,
child: Icon( child: IconoFarolero(
Icons.sentiment_dissatisfied, Icons.sentiment_dissatisfied,
size: 70, size: 70,
color: TemaApp.colorDorado.withValues(alpha: 0.98), color: TemaApp.colorDorado.withValues(alpha: 0.98),
+2 -2
View File
@@ -1093,7 +1093,7 @@ class _PantallaRevelarPalabraHostState
child: _manteniendo child: _manteniendo
? Column( ? Column(
children: [ children: [
Icon( IconoFarolero(
widget.esImpostor widget.esImpostor
? Icons.theater_comedy ? Icons.theater_comedy
: Icons.key, : Icons.key,
@@ -1135,7 +1135,7 @@ class _PantallaRevelarPalabraHostState
) )
: Column( : Column(
children: [ children: [
const Icon( IconoFarolero(
Icons.lock, Icons.lock,
color: TemaApp.colorDorado, color: TemaApp.colorDorado,
size: 48, size: 48,
+1 -1
View File
@@ -69,7 +69,7 @@ class PantallaHistorial extends StatelessWidget {
color: color.withValues(alpha: 0.18), color: color.withValues(alpha: 0.18),
border: Border.all(color: color), border: Border.all(color: color),
), ),
child: Icon( child: IconoFarolero(
ganaronJugadores ganaronJugadores
? Icons.groups_rounded ? Icons.groups_rounded
: Icons.theater_comedy_rounded, : Icons.theater_comedy_rounded,
+1 -1
View File
@@ -254,7 +254,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
), ),
child: Row( child: Row(
children: [ children: [
Icon(icon, color: color, size: 26), IconoFarolero(icon, color: color, size: 26),
const SizedBox(width: 10), const SizedBox(width: 10),
Expanded( Expanded(
child: Text( child: Text(
+1 -1
View File
@@ -86,7 +86,7 @@ class _PantallaPalabraClienteState extends State<PantallaPalabraCliente> {
), ),
child: Column( child: Column(
children: [ children: [
Icon( IconoFarolero(
_palabraVisible ? Icons.visibility : Icons.visibility_off, _palabraVisible ? Icons.visibility : Icons.visibility_off,
color: _palabraVisible color: _palabraVisible
? Colors.white ? Colors.white
+1 -1
View File
@@ -89,7 +89,7 @@ class _PantallaPalabrasClienteState extends State<PantallaPalabrasCliente> {
), ),
child: Column( child: Column(
children: [ children: [
Icon( IconoFarolero(
_visible ? Icons.visibility : Icons.visibility_off, _visible ? Icons.visibility : Icons.visibility_off,
color: _visible ? Colors.white : TemaApp.colorTextoSecundario, color: _visible ? Colors.white : TemaApp.colorTextoSecundario,
size: 32, size: 32,
+1 -1
View File
@@ -451,7 +451,7 @@ class _BotonInicioPremium extends StatelessWidget {
children: [ children: [
SizedBox( SizedBox(
width: hero ? 50 : 42, width: hero ? 50 : 42,
child: Icon( child: IconoFarolero(
icono, icono,
color: foreground, color: foreground,
size: hero ? 38 : 29, size: hero ? 38 : 29,
+1 -1
View File
@@ -66,7 +66,7 @@ class PantallaReglas extends StatelessWidget {
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
border: Border.all(color: TemaApp.colorNaranja), border: Border.all(color: TemaApp.colorNaranja),
), ),
child: Icon(icono, color: TemaApp.colorNaranja, size: 30), child: IconoFarolero(icono, color: TemaApp.colorNaranja, size: 30),
), ),
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
+1 -1
View File
@@ -90,7 +90,7 @@ class _DialogoRevisionPalabra extends StatelessWidget {
), ),
child: Column( child: Column(
children: [ children: [
Icon( IconoFarolero(
jugador.esImpostor ? Icons.theater_comedy : Icons.key, jugador.esImpostor ? Icons.theater_comedy : Icons.key,
color: jugador.esImpostor color: jugador.esImpostor
? TemaApp.colorAcento ? TemaApp.colorAcento
@@ -188,7 +188,7 @@ class _ModoCard extends StatelessWidget {
borderRadius: BorderRadius.circular(20), borderRadius: BorderRadius.circular(20),
border: Border.all(color: color.withValues(alpha: 0.72)), border: Border.all(color: color.withValues(alpha: 0.72)),
), ),
child: Icon(icono, color: color, size: 32), child: IconoFarolero(icono, color: color, size: 32),
), ),
const SizedBox(width: 16), const SizedBox(width: 16),
Expanded( Expanded(
+3 -3
View File
@@ -625,7 +625,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: Row( child: Row(
children: [ children: [
const Icon( IconoFarolero(
Icons.theater_comedy, Icons.theater_comedy,
color: TemaApp.colorNaranja, color: TemaApp.colorNaranja,
size: 30, size: 30,
@@ -646,7 +646,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
], ],
), ),
), ),
const Icon( IconoFarolero(
Icons.arrow_forward_ios, Icons.arrow_forward_ios,
size: 16, size: 16,
color: TemaApp.colorDorado, color: TemaApp.colorDorado,
@@ -773,7 +773,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
children: [ children: [
// OpciÃÆÃâÃâ Ã¢â¬â¢ÃƒÆÃ¢â¬Â ÃƒÂ¢Ã¢âšÂ¬Ã¢âžÂ¢ÃƒÆÃââââšÂ¬Ã¡ÃÆÃ¢â¬Å¡ÃƒâšÃ³n crear nuevo usuario (tarea 3.5) // OpciÃÆÃâÃâ Ã¢â¬â¢ÃƒÆÃ¢â¬Â ÃƒÂ¢Ã¢âšÂ¬Ã¢âžÂ¢ÃƒÆÃââââšÂ¬Ã¡ÃÆÃ¢â¬Å¡ÃƒâšÃ³n crear nuevo usuario (tarea 3.5)
ListTile( ListTile(
leading: const Icon( leading: IconoFarolero(
Icons.add, Icons.add,
color: TemaApp.colorAcento, color: TemaApp.colorAcento,
), ),
+1 -1
View File
@@ -174,7 +174,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
child: _manteniendo child: _manteniendo
? Column( ? Column(
children: [ children: [
Icon( IconoFarolero(
widget.esImpostor ? Icons.theater_comedy : Icons.search, widget.esImpostor ? Icons.theater_comedy : Icons.search,
color: colorEstado, color: colorEstado,
size: 52, size: 52,
+13 -5
View File
@@ -37,6 +37,7 @@ class IconoFarolero extends StatelessWidget {
if (icono == Icons.home) return 'assets/ui/generated/icons/nav_home.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.replay) return 'assets/ui/generated/icons/action_replay.webp';
if (icono == Icons.save) return 'assets/ui/generated/icons/action_save.webp'; if (icono == Icons.save) return 'assets/ui/generated/icons/action_save.webp';
if (icono == Icons.settings_rounded) return 'assets/ui/generated/icons/settings_gear.webp';
if (icono == Icons.delete_outline) return 'assets/ui/generated/icons/action_delete.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.lock) return 'assets/ui/generated/icons/status_lock.webp';
if (icono == Icons.key) return 'assets/ui/generated/icons/status_key.webp'; if (icono == Icons.key) return 'assets/ui/generated/icons/status_key.webp';
@@ -53,6 +54,11 @@ class IconoFarolero extends StatelessWidget {
return 'assets/ui/generated/icons/status_cancel.webp'; return 'assets/ui/generated/icons/status_cancel.webp';
} }
if (icono == Icons.link_off) return 'assets/ui/generated/icons/status_disconnected.webp'; if (icono == Icons.link_off) return 'assets/ui/generated/icons/status_disconnected.webp';
if (icono == Icons.alternate_email) return 'assets/ui/generated/icons/profile_identity.webp';
if (icono == Icons.question_mark_rounded) return 'assets/ui/generated/icons/help_question.webp';
if (icono == Icons.bolt_rounded) return 'assets/ui/generated/icons/quick_bolt.webp';
if (icono == Icons.mood) return 'assets/ui/generated/icons/mood_happy.webp';
if (icono == Icons.sentiment_dissatisfied) return 'assets/ui/generated/icons/mood_sad.webp';
if (icono == Icons.search || if (icono == Icons.search ||
icono == Icons.person_search || icono == Icons.person_search ||
icono == Icons.gps_fixed) { icono == Icons.gps_fixed) {
@@ -65,20 +71,22 @@ class IconoFarolero extends StatelessWidget {
if (icono == Icons.theater_comedy || if (icono == Icons.theater_comedy ||
icono == Icons.theater_comedy_rounded || icono == Icons.theater_comedy_rounded ||
icono == Icons.psychology) { icono == Icons.psychology) {
return 'assets/ui/generated/actions/action_impostor_mask.webp'; return 'assets/ui/generated/icons/impostor_shadow.webp';
} }
if (icono == Icons.emoji_events || if (icono == Icons.emoji_events ||
icono == Icons.celebration || icono == Icons.celebration ||
icono == Icons.bar_chart) { icono == Icons.bar_chart) {
return 'assets/ui/generated/actions/action_result_trophy.webp'; return icono == Icons.bar_chart
? 'assets/ui/generated/icons/stats_chart.webp'
: 'assets/ui/generated/icons/winner_laurel.webp';
} }
if (icono == Icons.forum || if (icono == Icons.forum ||
icono == Icons.chat_bubble || icono == Icons.chat_bubble ||
icono == Icons.record_voice_over) { icono == Icons.record_voice_over) {
return 'assets/ui/generated/actions/action_rules_book.webp'; return 'assets/ui/generated/actions/action_rules_book.webp';
} }
if (icono == Icons.person || if (icono == Icons.person) return 'assets/ui/generated/icons/profile_player.webp';
icono == Icons.groups || if (icono == Icons.groups ||
icono == Icons.groups_rounded) { icono == Icons.groups_rounded) {
return 'assets/ui/generated/actions/action_players_group.webp'; return 'assets/ui/generated/actions/action_players_group.webp';
} }
@@ -100,7 +108,7 @@ class IconoFarolero extends StatelessWidget {
return 'assets/ui/generated/actions/action_rules_book.webp'; return 'assets/ui/generated/actions/action_rules_book.webp';
} }
if (icono == Icons.hourglass_bottom || icono == Icons.hourglass_empty) { if (icono == Icons.hourglass_bottom || icono == Icons.hourglass_empty) {
return 'assets/ui/generated/actions/action_timer_hourglass.webp'; return 'assets/ui/generated/icons/timer_hourglass.webp';
} }
if (icono == Icons.play_arrow || icono == Icons.play_arrow_rounded) { if (icono == Icons.play_arrow || icono == Icons.play_arrow_rounded) {
return 'assets/ui/generated/actions/action_create_game.webp'; return 'assets/ui/generated/actions/action_create_game.webp';
+6 -6
View File
@@ -154,7 +154,7 @@ class DetalleVotosFarolero extends StatelessWidget {
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 4),
child: Row( child: Row(
children: [ children: [
Icon( IconoFarolero(
fueAlEliminado ? Icons.how_to_vote : Icons.arrow_forward, fueAlEliminado ? Icons.how_to_vote : Icons.arrow_forward,
size: 18, size: 18,
color: fueAlEliminado color: fueAlEliminado
@@ -372,7 +372,7 @@ class IconoResultadoPremiumFarolero extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (icono != Icons.theater_comedy) { if (icono != Icons.theater_comedy) {
return Icon(icono, size: 82, color: TemaApp.colorDorado); return IconoFarolero(icono, size: 82, color: TemaApp.colorDorado);
} }
return Stack( return Stack(
alignment: Alignment.center, alignment: Alignment.center,
@@ -381,7 +381,7 @@ class IconoResultadoPremiumFarolero extends StatelessWidget {
offset: const Offset(-18, 12), offset: const Offset(-18, 12),
child: Transform.rotate( child: Transform.rotate(
angle: -0.10, angle: -0.10,
child: Icon( child: IconoFarolero(
Icons.mood, Icons.mood,
size: 66, size: 66,
color: TemaApp.colorDorado.withValues(alpha: 0.98), color: TemaApp.colorDorado.withValues(alpha: 0.98),
@@ -392,7 +392,7 @@ class IconoResultadoPremiumFarolero extends StatelessWidget {
offset: const Offset(20, -13), offset: const Offset(20, -13),
child: Transform.rotate( child: Transform.rotate(
angle: 0.12, angle: 0.12,
child: Icon( child: IconoFarolero(
Icons.sentiment_dissatisfied, Icons.sentiment_dissatisfied,
size: 70, size: 70,
color: TemaApp.colorDorado.withValues(alpha: 0.98), color: TemaApp.colorDorado.withValues(alpha: 0.98),
@@ -826,7 +826,7 @@ class TarjetaImpostoresPremium extends StatelessWidget {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
const Icon( IconoFarolero(
Icons.theater_comedy, Icons.theater_comedy,
size: 20, size: 20,
color: TemaApp.colorAcento, color: TemaApp.colorAcento,
@@ -844,7 +844,7 @@ class TarjetaImpostoresPremium extends StatelessWidget {
), ),
if (jugador.eliminado) ...[ if (jugador.eliminado) ...[
const SizedBox(width: 8), const SizedBox(width: 8),
const Icon( IconoFarolero(
Icons.close, Icons.close,
size: 16, size: 16,
color: TemaApp.colorTextoSecundario, color: TemaApp.colorTextoSecundario,
+1
View File
@@ -43,6 +43,7 @@ metadata:
18. **Analyzer cleanliness is mandatory.** When editing Dart, do not introduce unused getters/fields or analyzer-only style issues. Avoid `(_, __)`/`(_, __, ___)` callback parameters because `unnecessary_underscores` is enabled; name unused callback parameters descriptively (`context`, `index`, `error`, `stackTrace`) or use only one `_` where valid. 18. **Analyzer cleanliness is mandatory.** When editing Dart, do not introduce unused getters/fields or analyzer-only style issues. Avoid `(_, __)`/`(_, __, ___)` callback parameters because `unnecessary_underscores` is enabled; name unused callback parameters descriptively (`context`, `index`, `error`, `stackTrace`) or use only one `_` where valid.
19. **Premium buttons must be scalable by construction.** Do not place a decorative button PNG over a Flutter button that already has its own shape/background. Either use a true scalable technique (9-slice/centerSlice with protected corners/ornaments) or draw the frame with Flutter `CustomPainter`. Text, icons, hit state, disabled state, and dynamic width must remain real widgets and must not distort the artwork. 19. **Premium buttons must be scalable by construction.** Do not place a decorative button PNG over a Flutter button that already has its own shape/background. Either use a true scalable technique (9-slice/centerSlice with protected corners/ornaments) or draw the frame with Flutter `CustomPainter`. Text, icons, hit state, disabled state, and dynamic width must remain real widgets and must not distort the artwork.
20. **Generated backgrounds should not be polluted by procedural placeholders.** Once a screen has a real generated atmosphere background, remove temporary `CustomPainter` silhouettes, confetti rectangles, generic circles, or debug-looking shape layers unless they are intentional premium effects. 20. **Generated backgrounds should not be polluted by procedural placeholders.** Once a screen has a real generated atmosphere background, remove temporary `CustomPainter` silhouettes, confetti rectangles, generic circles, or debug-looking shape layers unless they are intentional premium effects.
21. **Icon atlas separator lines must be 1px only.** When generating multi-icon grids for later cropping, request exact 1px magenta separator lines and a chroma background per cell. Thick separators are forbidden because crop/resize/compression can leak separator pixels into final icons. After cropping, validate edge transparency and remove chroma/fringe pixels before exporting runtime WebP/PNG.
## Mandatory Image Generation Rule ## Mandatory Image Generation Rule
Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB