diff --git a/assets/ui/generated/actions/action_category_cards.webp b/assets/ui/generated/actions/action_category_cards.webp index 08efd77..460f84a 100644 Binary files a/assets/ui/generated/actions/action_category_cards.webp and b/assets/ui/generated/actions/action_category_cards.webp differ diff --git a/assets/ui/generated/actions/action_join_search.webp b/assets/ui/generated/actions/action_join_search.webp index 370ccd8..7c26b8b 100644 Binary files a/assets/ui/generated/actions/action_join_search.webp and b/assets/ui/generated/actions/action_join_search.webp differ diff --git a/assets/ui/generated/actions/action_multidevice_signal.webp b/assets/ui/generated/actions/action_multidevice_signal.webp index 1331e99..02b35d7 100644 Binary files a/assets/ui/generated/actions/action_multidevice_signal.webp and b/assets/ui/generated/actions/action_multidevice_signal.webp differ diff --git a/assets/ui/generated/actions/action_qr_scan.webp b/assets/ui/generated/actions/action_qr_scan.webp index f5b1c87..517b36f 100644 Binary files a/assets/ui/generated/actions/action_qr_scan.webp and b/assets/ui/generated/actions/action_qr_scan.webp differ diff --git a/assets/ui/generated/actions/action_result_trophy.webp b/assets/ui/generated/actions/action_result_trophy.webp index 9d61c23..fcc2adf 100644 Binary files a/assets/ui/generated/actions/action_result_trophy.webp and b/assets/ui/generated/actions/action_result_trophy.webp differ diff --git a/assets/ui/generated/actions/action_rules_book.webp b/assets/ui/generated/actions/action_rules_book.webp index 9a5c752..3815cf3 100644 Binary files a/assets/ui/generated/actions/action_rules_book.webp and b/assets/ui/generated/actions/action_rules_book.webp differ diff --git a/assets/ui/generated/icons/action_delete.webp b/assets/ui/generated/icons/action_delete.webp index 4e4d834..964785f 100644 Binary files a/assets/ui/generated/icons/action_delete.webp and b/assets/ui/generated/icons/action_delete.webp differ diff --git a/assets/ui/generated/icons/action_hide_eye.webp b/assets/ui/generated/icons/action_hide_eye.webp index 7bdfae7..ba12eb5 100644 Binary files a/assets/ui/generated/icons/action_hide_eye.webp and b/assets/ui/generated/icons/action_hide_eye.webp differ diff --git a/assets/ui/generated/icons/action_replay.webp b/assets/ui/generated/icons/action_replay.webp index 83c496a..02c598f 100644 Binary files a/assets/ui/generated/icons/action_replay.webp and b/assets/ui/generated/icons/action_replay.webp differ diff --git a/assets/ui/generated/icons/action_reveal_eye.webp b/assets/ui/generated/icons/action_reveal_eye.webp index 9813c55..ca45366 100644 Binary files a/assets/ui/generated/icons/action_reveal_eye.webp and b/assets/ui/generated/icons/action_reveal_eye.webp differ diff --git a/assets/ui/generated/icons/action_save.webp b/assets/ui/generated/icons/action_save.webp index 7c0c983..d873092 100644 Binary files a/assets/ui/generated/icons/action_save.webp and b/assets/ui/generated/icons/action_save.webp differ diff --git a/assets/ui/generated/icons/control_minus.webp b/assets/ui/generated/icons/control_minus.webp index 4f02e70..cc126cd 100644 Binary files a/assets/ui/generated/icons/control_minus.webp and b/assets/ui/generated/icons/control_minus.webp differ diff --git a/assets/ui/generated/icons/control_plus.webp b/assets/ui/generated/icons/control_plus.webp index d650e69..45e19b1 100644 Binary files a/assets/ui/generated/icons/control_plus.webp and b/assets/ui/generated/icons/control_plus.webp differ diff --git a/assets/ui/generated/icons/help_question.webp b/assets/ui/generated/icons/help_question.webp new file mode 100644 index 0000000..f0c642a Binary files /dev/null and b/assets/ui/generated/icons/help_question.webp differ diff --git a/assets/ui/generated/icons/impostor_shadow.webp b/assets/ui/generated/icons/impostor_shadow.webp new file mode 100644 index 0000000..ce6dfb8 Binary files /dev/null and b/assets/ui/generated/icons/impostor_shadow.webp differ diff --git a/assets/ui/generated/icons/mood_happy.webp b/assets/ui/generated/icons/mood_happy.webp new file mode 100644 index 0000000..268cd40 Binary files /dev/null and b/assets/ui/generated/icons/mood_happy.webp differ diff --git a/assets/ui/generated/icons/mood_sad.webp b/assets/ui/generated/icons/mood_sad.webp new file mode 100644 index 0000000..cf4a786 Binary files /dev/null and b/assets/ui/generated/icons/mood_sad.webp differ diff --git a/assets/ui/generated/icons/nav_back.webp b/assets/ui/generated/icons/nav_back.webp index edadd3e..4295f0c 100644 Binary files a/assets/ui/generated/icons/nav_back.webp and b/assets/ui/generated/icons/nav_back.webp differ diff --git a/assets/ui/generated/icons/nav_close.webp b/assets/ui/generated/icons/nav_close.webp index 0fdb2c0..8fd98a0 100644 Binary files a/assets/ui/generated/icons/nav_close.webp and b/assets/ui/generated/icons/nav_close.webp differ diff --git a/assets/ui/generated/icons/nav_forward.webp b/assets/ui/generated/icons/nav_forward.webp index 81a4b9e..c939c99 100644 Binary files a/assets/ui/generated/icons/nav_forward.webp and b/assets/ui/generated/icons/nav_forward.webp differ diff --git a/assets/ui/generated/icons/nav_home.webp b/assets/ui/generated/icons/nav_home.webp index 44161a0..c6601ed 100644 Binary files a/assets/ui/generated/icons/nav_home.webp and b/assets/ui/generated/icons/nav_home.webp differ diff --git a/assets/ui/generated/icons/profile_identity.webp b/assets/ui/generated/icons/profile_identity.webp new file mode 100644 index 0000000..dc7a3aa Binary files /dev/null and b/assets/ui/generated/icons/profile_identity.webp differ diff --git a/assets/ui/generated/icons/profile_player.webp b/assets/ui/generated/icons/profile_player.webp new file mode 100644 index 0000000..1cae529 Binary files /dev/null and b/assets/ui/generated/icons/profile_player.webp differ diff --git a/assets/ui/generated/icons/quick_bolt.webp b/assets/ui/generated/icons/quick_bolt.webp new file mode 100644 index 0000000..b83a956 Binary files /dev/null and b/assets/ui/generated/icons/quick_bolt.webp differ diff --git a/assets/ui/generated/icons/settings_gear.webp b/assets/ui/generated/icons/settings_gear.webp new file mode 100644 index 0000000..3a833e2 Binary files /dev/null and b/assets/ui/generated/icons/settings_gear.webp differ diff --git a/assets/ui/generated/icons/stats_chart.webp b/assets/ui/generated/icons/stats_chart.webp new file mode 100644 index 0000000..7bbb2b3 Binary files /dev/null and b/assets/ui/generated/icons/stats_chart.webp differ diff --git a/assets/ui/generated/icons/status_cancel.webp b/assets/ui/generated/icons/status_cancel.webp index 898dd92..400b898 100644 Binary files a/assets/ui/generated/icons/status_cancel.webp and b/assets/ui/generated/icons/status_cancel.webp differ diff --git a/assets/ui/generated/icons/status_check.webp b/assets/ui/generated/icons/status_check.webp index 00de000..49974f6 100644 Binary files a/assets/ui/generated/icons/status_check.webp and b/assets/ui/generated/icons/status_check.webp differ diff --git a/assets/ui/generated/icons/status_disconnected.webp b/assets/ui/generated/icons/status_disconnected.webp index b53593a..9d662de 100644 Binary files a/assets/ui/generated/icons/status_disconnected.webp and b/assets/ui/generated/icons/status_disconnected.webp differ diff --git a/assets/ui/generated/icons/status_key.webp b/assets/ui/generated/icons/status_key.webp index f78158b..19007f9 100644 Binary files a/assets/ui/generated/icons/status_key.webp and b/assets/ui/generated/icons/status_key.webp differ diff --git a/assets/ui/generated/icons/status_lock.webp b/assets/ui/generated/icons/status_lock.webp index 2115e66..ce08b71 100644 Binary files a/assets/ui/generated/icons/status_lock.webp and b/assets/ui/generated/icons/status_lock.webp differ diff --git a/assets/ui/generated/icons/timer_hourglass.webp b/assets/ui/generated/icons/timer_hourglass.webp new file mode 100644 index 0000000..e2e634d Binary files /dev/null and b/assets/ui/generated/icons/timer_hourglass.webp differ diff --git a/assets/ui/generated/icons/winner_laurel.webp b/assets/ui/generated/icons/winner_laurel.webp new file mode 100644 index 0000000..408ad29 Binary files /dev/null and b/assets/ui/generated/icons/winner_laurel.webp differ diff --git a/lib/pantallas/pantalla_adivinanza.dart b/lib/pantallas/pantalla_adivinanza.dart index ebf0564..1ac992e 100644 --- a/lib/pantallas/pantalla_adivinanza.dart +++ b/lib/pantallas/pantalla_adivinanza.dart @@ -143,7 +143,7 @@ class _PantallaAdivinanzaState extends State { color: color.withValues(alpha: 0.18), child: Column( children: [ - Icon( + IconoFarolero( acierto ? Icons.celebration : Icons.cancel, color: color, size: 52, diff --git a/lib/pantallas/pantalla_crear_partida.dart b/lib/pantallas/pantalla_crear_partida.dart index a95d140..217dfea 100644 --- a/lib/pantallas/pantalla_crear_partida.dart +++ b/lib/pantallas/pantalla_crear_partida.dart @@ -382,7 +382,7 @@ class _PantallaCrearPartidaState extends State { padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), child: Row( children: [ - Icon( + IconoFarolero( _modoMultimovil ? Icons.devices : Icons.phone_android, color: TemaApp.colorNaranja, ), @@ -416,7 +416,7 @@ class _PantallaCrearPartidaState extends State { width: double.infinity, child: DropdownButtonFormField( initialValue: _categoria, - decoration: const InputDecoration( + decoration: InputDecoration( prefixIcon: Padding( padding: EdgeInsets.all(10), child: Image.asset( @@ -531,7 +531,7 @@ class _PantallaCrearPartidaState extends State { trailing: esPerfilLocal ? IconoFarolero(Icons.lock, color: TemaApp.colorDorado) : IconButton( - icon: const Icon( + icon: IconoFarolero( Icons.close, color: TemaApp.colorAcento, ), diff --git a/lib/pantallas/pantalla_fin_partida.dart b/lib/pantallas/pantalla_fin_partida.dart index f365f7c..9688467 100644 --- a/lib/pantallas/pantalla_fin_partida.dart +++ b/lib/pantallas/pantalla_fin_partida.dart @@ -341,7 +341,7 @@ class _IconoResultadoPremium extends StatelessWidget { @override Widget build(BuildContext context) { if (icono != Icons.theater_comedy) { - return Icon(icono, size: 82, color: TemaApp.colorDorado); + return IconoFarolero(icono, size: 82, color: TemaApp.colorDorado); } return Stack( @@ -351,7 +351,7 @@ class _IconoResultadoPremium extends StatelessWidget { offset: const Offset(-18, 12), child: Transform.rotate( angle: -0.10, - child: Icon( + child: IconoFarolero( Icons.mood, size: 66, color: TemaApp.colorDorado.withValues(alpha: 0.98), @@ -362,7 +362,7 @@ class _IconoResultadoPremium extends StatelessWidget { offset: const Offset(20, -13), child: Transform.rotate( angle: 0.12, - child: Icon( + child: IconoFarolero( Icons.sentiment_dissatisfied, size: 70, color: TemaApp.colorDorado.withValues(alpha: 0.98), diff --git a/lib/pantallas/pantalla_gestor_host.dart b/lib/pantallas/pantalla_gestor_host.dart index 6b263ed..1e3dca9 100644 --- a/lib/pantallas/pantalla_gestor_host.dart +++ b/lib/pantallas/pantalla_gestor_host.dart @@ -1093,7 +1093,7 @@ class _PantallaRevelarPalabraHostState child: _manteniendo ? Column( children: [ - Icon( + IconoFarolero( widget.esImpostor ? Icons.theater_comedy : Icons.key, @@ -1135,7 +1135,7 @@ class _PantallaRevelarPalabraHostState ) : Column( children: [ - const Icon( + IconoFarolero( Icons.lock, color: TemaApp.colorDorado, size: 48, diff --git a/lib/pantallas/pantalla_historial.dart b/lib/pantallas/pantalla_historial.dart index 224a9a8..fa6c2ab 100644 --- a/lib/pantallas/pantalla_historial.dart +++ b/lib/pantallas/pantalla_historial.dart @@ -69,7 +69,7 @@ class PantallaHistorial extends StatelessWidget { color: color.withValues(alpha: 0.18), border: Border.all(color: color), ), - child: Icon( + child: IconoFarolero( ganaronJugadores ? Icons.groups_rounded : Icons.theater_comedy_rounded, diff --git a/lib/pantallas/pantalla_lobby_host.dart b/lib/pantallas/pantalla_lobby_host.dart index 82436bb..c2d2583 100644 --- a/lib/pantallas/pantalla_lobby_host.dart +++ b/lib/pantallas/pantalla_lobby_host.dart @@ -254,7 +254,7 @@ class _PantallaLobbyHostState extends State { ), child: Row( children: [ - Icon(icon, color: color, size: 26), + IconoFarolero(icon, color: color, size: 26), const SizedBox(width: 10), Expanded( child: Text( diff --git a/lib/pantallas/pantalla_palabra_cliente.dart b/lib/pantallas/pantalla_palabra_cliente.dart index 7502ad5..3bee04d 100644 --- a/lib/pantallas/pantalla_palabra_cliente.dart +++ b/lib/pantallas/pantalla_palabra_cliente.dart @@ -86,7 +86,7 @@ class _PantallaPalabraClienteState extends State { ), child: Column( children: [ - Icon( + IconoFarolero( _palabraVisible ? Icons.visibility : Icons.visibility_off, color: _palabraVisible ? Colors.white diff --git a/lib/pantallas/pantalla_palabras_cliente.dart b/lib/pantallas/pantalla_palabras_cliente.dart index 66c2cc2..8281996 100644 --- a/lib/pantallas/pantalla_palabras_cliente.dart +++ b/lib/pantallas/pantalla_palabras_cliente.dart @@ -89,7 +89,7 @@ class _PantallaPalabrasClienteState extends State { ), child: Column( children: [ - Icon( + IconoFarolero( _visible ? Icons.visibility : Icons.visibility_off, color: _visible ? Colors.white : TemaApp.colorTextoSecundario, size: 32, diff --git a/lib/pantallas/pantalla_principal.dart b/lib/pantallas/pantalla_principal.dart index ea75562..dc795f1 100644 --- a/lib/pantallas/pantalla_principal.dart +++ b/lib/pantallas/pantalla_principal.dart @@ -451,7 +451,7 @@ class _BotonInicioPremium extends StatelessWidget { children: [ SizedBox( width: hero ? 50 : 42, - child: Icon( + child: IconoFarolero( icono, color: foreground, size: hero ? 38 : 29, diff --git a/lib/pantallas/pantalla_reglas.dart b/lib/pantallas/pantalla_reglas.dart index 415ca1f..031221f 100644 --- a/lib/pantallas/pantalla_reglas.dart +++ b/lib/pantallas/pantalla_reglas.dart @@ -66,7 +66,7 @@ class PantallaReglas extends StatelessWidget { borderRadius: BorderRadius.circular(16), 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), Expanded( diff --git a/lib/pantallas/pantalla_revision_palabra.dart b/lib/pantallas/pantalla_revision_palabra.dart index 51a97f5..5d27864 100644 --- a/lib/pantallas/pantalla_revision_palabra.dart +++ b/lib/pantallas/pantalla_revision_palabra.dart @@ -90,7 +90,7 @@ class _DialogoRevisionPalabra extends StatelessWidget { ), child: Column( children: [ - Icon( + IconoFarolero( jugador.esImpostor ? Icons.theater_comedy : Icons.key, color: jugador.esImpostor ? TemaApp.colorAcento diff --git a/lib/pantallas/pantalla_seleccion_modo_juego.dart b/lib/pantallas/pantalla_seleccion_modo_juego.dart index 7517f77..65d8b02 100644 --- a/lib/pantallas/pantalla_seleccion_modo_juego.dart +++ b/lib/pantallas/pantalla_seleccion_modo_juego.dart @@ -188,7 +188,7 @@ class _ModoCard extends StatelessWidget { borderRadius: BorderRadius.circular(20), 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), Expanded( diff --git a/lib/pantallas/pantalla_unirse.dart b/lib/pantallas/pantalla_unirse.dart index e4867d2..96c94e4 100644 --- a/lib/pantallas/pantalla_unirse.dart +++ b/lib/pantallas/pantalla_unirse.dart @@ -625,7 +625,7 @@ class _PantallaUnirseState extends State { padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), child: Row( children: [ - const Icon( + IconoFarolero( Icons.theater_comedy, color: TemaApp.colorNaranja, size: 30, @@ -646,7 +646,7 @@ class _PantallaUnirseState extends State { ], ), ), - const Icon( + IconoFarolero( Icons.arrow_forward_ios, size: 16, color: TemaApp.colorDorado, @@ -773,7 +773,7 @@ class _PantallaUnirseState extends State { children: [ // Opción crear nuevo usuario (tarea 3.5) ListTile( - leading: const Icon( + leading: IconoFarolero( Icons.add, color: TemaApp.colorAcento, ), diff --git a/lib/pantallas/pantalla_ver_palabra.dart b/lib/pantallas/pantalla_ver_palabra.dart index c2104e0..504bc27 100644 --- a/lib/pantallas/pantalla_ver_palabra.dart +++ b/lib/pantallas/pantalla_ver_palabra.dart @@ -174,7 +174,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> { child: _manteniendo ? Column( children: [ - Icon( + IconoFarolero( widget.esImpostor ? Icons.theater_comedy : Icons.search, color: colorEstado, size: 52, diff --git a/lib/tema/componentes_farolero.dart b/lib/tema/componentes_farolero.dart index 0bda716..fa504a5 100644 --- a/lib/tema/componentes_farolero.dart +++ b/lib/tema/componentes_farolero.dart @@ -37,6 +37,7 @@ class IconoFarolero extends StatelessWidget { 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.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.lock) return 'assets/ui/generated/icons/status_lock.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'; } 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 || icono == Icons.person_search || icono == Icons.gps_fixed) { @@ -65,20 +71,22 @@ class IconoFarolero extends StatelessWidget { if (icono == Icons.theater_comedy || icono == Icons.theater_comedy_rounded || 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 || icono == Icons.celebration || 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 || 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 || + if (icono == Icons.person) return 'assets/ui/generated/icons/profile_player.webp'; + if (icono == Icons.groups || icono == Icons.groups_rounded) { 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'; } 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) { return 'assets/ui/generated/actions/action_create_game.webp'; diff --git a/lib/tema/componentes_resultado_farolero.dart b/lib/tema/componentes_resultado_farolero.dart index 8f9211c..4ed8fa1 100644 --- a/lib/tema/componentes_resultado_farolero.dart +++ b/lib/tema/componentes_resultado_farolero.dart @@ -154,7 +154,7 @@ class DetalleVotosFarolero extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 4), child: Row( children: [ - Icon( + IconoFarolero( fueAlEliminado ? Icons.how_to_vote : Icons.arrow_forward, size: 18, color: fueAlEliminado @@ -372,7 +372,7 @@ class IconoResultadoPremiumFarolero extends StatelessWidget { @override Widget build(BuildContext context) { if (icono != Icons.theater_comedy) { - return Icon(icono, size: 82, color: TemaApp.colorDorado); + return IconoFarolero(icono, size: 82, color: TemaApp.colorDorado); } return Stack( alignment: Alignment.center, @@ -381,7 +381,7 @@ class IconoResultadoPremiumFarolero extends StatelessWidget { offset: const Offset(-18, 12), child: Transform.rotate( angle: -0.10, - child: Icon( + child: IconoFarolero( Icons.mood, size: 66, color: TemaApp.colorDorado.withValues(alpha: 0.98), @@ -392,7 +392,7 @@ class IconoResultadoPremiumFarolero extends StatelessWidget { offset: const Offset(20, -13), child: Transform.rotate( angle: 0.12, - child: Icon( + child: IconoFarolero( Icons.sentiment_dissatisfied, size: 70, color: TemaApp.colorDorado.withValues(alpha: 0.98), @@ -826,7 +826,7 @@ class TarjetaImpostoresPremium extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Icon( + IconoFarolero( Icons.theater_comedy, size: 20, color: TemaApp.colorAcento, @@ -844,7 +844,7 @@ class TarjetaImpostoresPremium extends StatelessWidget { ), if (jugador.eliminado) ...[ const SizedBox(width: 8), - const Icon( + IconoFarolero( Icons.close, size: 16, color: TemaApp.colorTextoSecundario, diff --git a/skills/premium-game-ui/SKILL.md b/skills/premium-game-ui/SKILL.md index 418cd34..6c1125b 100644 --- a/skills/premium-game-ui/SKILL.md +++ b/skills/premium-game-ui/SKILL.md @@ -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. 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. +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 diff --git a/tmp_icon_correction_preview.png b/tmp_icon_correction_preview.png new file mode 100644 index 0000000..7bc8244 Binary files /dev/null and b/tmp_icon_correction_preview.png differ