algunos iconos PRO
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 9.3 KiB |
@@ -0,0 +1,84 @@
|
|||||||
|
# Inventario de iconos/assets premium pendientes — Farolero
|
||||||
|
|
||||||
|
Criterio: sustituir iconos Material/emoji/texto que tengan peso visual por ilustraciones premium transparentes, manteniendo texto/estado como Flutter real. Objetivo: assets WebP/PNG con alpha, tamaño ajustado al render real y peso controlado.
|
||||||
|
|
||||||
|
## Resumen técnico
|
||||||
|
|
||||||
|
- Assets totales de imagen: 122.
|
||||||
|
- Peso por carpetas: `assets/avatars` ~9.16 MB, `assets/ui` ~2.07 MB, `assets/app_icon` ~1.54 MB, `assets/medals` ~0.35 MB, `assets/rewards` ~0.18 MB.
|
||||||
|
- Assets no referenciados literalmente en código/pubspec: `assets/app_icon/farolero_app_icon.png` y `assets/ui/premium/*`.
|
||||||
|
- `assets/ui/premium/*` debe eliminarse del runtime si no se usa: son glows/overlays antiguos y de baja calidad frente al sistema `assets/ui/generated/*`.
|
||||||
|
- Se detectan ~190 usos de `Icons.*`; no todos deben sustituirse. Los de navegación/cierre/campos pueden seguir vectoriales. Los de acciones principales, fases, resultados y notas sí deberían ser assets generados.
|
||||||
|
|
||||||
|
## Reglas de tamaño/peso propuestas
|
||||||
|
|
||||||
|
| Tipo | Tamaño fuente generado | Tamaño runtime | Peso objetivo |
|
||||||
|
| --- | ---: | ---: | ---: |
|
||||||
|
| Icono de botón/acción | 512x512 | 128x128 o 160x160 WebP alpha | 12-35 KB |
|
||||||
|
| Icono de fase/tarjeta | 768x768 | 192x192 o 256x256 WebP alpha | 35-90 KB |
|
||||||
|
| Hero de pantalla | 1024x1024 | 512x512 WebP alpha | 70-160 KB |
|
||||||
|
| Fondo pantalla | 1440x2560 fuente | 900x1599 WebP/JPEG | 80-180 KB |
|
||||||
|
| Marco QR | 512x512 fuente | 192x192/256x256 WebP alpha | 40-100 KB |
|
||||||
|
| App icon | 1024x1024 PNG fuente | mantener fuente + generar mipmaps | fuente puede pesar 1-2 MB |
|
||||||
|
|
||||||
|
## Prioridad A — reemplazar ya
|
||||||
|
|
||||||
|
| Uso visual | Iconos/líneas detectadas | Asset recomendado | Runtime recomendado | Peso objetivo | Motivo |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| Notas | `Icons.edit_note`, `Icons.note`, `Icons.save` en `pantalla_debate.dart`, `pantalla_notas*.dart`, `pantalla_gestor_host.dart`, `pantalla_resultado_online.dart`, `pantalla_fin_partida_online.dart` | `assets/ui/generated/actions/action_notes_quill.webp` | 160x160 WebP alpha | 20-45 KB | El botón de notas se ve pobre; debe ser cuaderno/pergamino/pluma/farol premium. |
|
||||||
|
| Votación | `Icons.how_to_vote`, `Icons.person_search`, `Icons.gps_fixed` en voto/resultado/reglas | `assets/ui/generated/actions/action_vote_mask.webp` | 160x160 o 192x192 WebP alpha | 25-60 KB | Acción central de juego, ahora parece Material. |
|
||||||
|
| Ver palabra / revelar | `Icons.visibility`, `Icons.visibility_off`, `Icons.key`, `Icons.lock`, `Icons.search` | `assets/ui/generated/actions/action_reveal_word.webp` | 160x160 WebP alpha | 20-45 KB | Fase clave; debe verse como secreto/farol/carta sellada. |
|
||||||
|
| Impostor | `Icons.theater_comedy`, `Icons.psychology` | `assets/ui/generated/actions/action_impostor_mask.webp` | 192x192 WebP alpha | 35-75 KB | Se usa mucho y define identidad del juego. |
|
||||||
|
| Resultado/victoria | `Icons.emoji_events`, `Icons.celebration`, `Icons.mood`, `Icons.sentiment_dissatisfied` | `assets/ui/generated/actions/action_result_trophy.webp` | 192x192 WebP alpha | 35-75 KB | Pantallas de resultado necesitan impacto/gamificación. |
|
||||||
|
| Fuego/progreso | `Icons.local_fire_department`, emojis de fuego en medallas como fallback | `assets/ui/generated/actions/action_fire_badge.webp` | 160x160 WebP alpha | 20-45 KB | Mantener estética de farol/fuego sin emoji. |
|
||||||
|
|
||||||
|
## Prioridad B — reutilizar/generar si queda feo en pantalla
|
||||||
|
|
||||||
|
| Uso visual | Iconos/líneas detectadas | Asset recomendado | Runtime recomendado | Peso objetivo | Motivo |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| Debate | `Icons.forum`, `Icons.record_voice_over`, `Icons.chat_bubble` | `assets/ui/generated/actions/action_debate_voice.webp` | 160x160 WebP alpha | 20-45 KB | Fase frecuente; puede reutilizarse en reglas y host. |
|
||||||
|
| Multidispositivo | `Icons.devices`, `Icons.phone_android`, `Icons.bluetooth_searching`, `Icons.wifi_tethering`, `Icons.radar` | reutilizar/mejorar `join_lobby/signal_art.webp` o nuevo `action_multidevice_signal.webp` | 192x192 WebP alpha | 35-80 KB | Hay asset de señal, pero varios botones siguen con iconos Material. |
|
||||||
|
| Jugadores | `Icons.person`, `Icons.person_add`, `Icons.groups`, `Icons.person_off` | `action_players_token.webp` | 128x128 WebP alpha | 12-35 KB | En listas pequeñas puede bastar vectorial; en CTAs/tarjetas debería ser asset. |
|
||||||
|
| Historial | `Icons.history_rounded`, `Icons.arrow_forward_ios` | reutilizar `meta/history_ledger_art.webp` | 160x160 WebP alpha | ya existe 130 KB; quizá recomprimir a 70-90 KB | Ya hay asset, pero botones siguen con icono. |
|
||||||
|
| Ajustes/perfil | `Icons.settings_rounded`, `Icons.edit`, `Icons.alternate_email` | reutilizar `meta/settings_profile_art.webp` | 160x160 WebP alpha | ya existe 124 KB; quizá recomprimir a 60-90 KB | Útil en perfil/configuración. |
|
||||||
|
| Crear partida | `Icons.category`, `Icons.add`, `Icons.remove_circle_outline`, `Icons.add_circle_outline` | `action_create_game.webp` / reutilizar `create_game_header_art.webp` | 128-192 WebP alpha | 20-70 KB | Pantalla aún básica en varias zonas. |
|
||||||
|
|
||||||
|
## Prioridad C — mantener vectorial salvo que sea protagonista
|
||||||
|
|
||||||
|
- `Icons.close`, `Icons.arrow_back`, `Icons.chevron_right_rounded`, `Icons.arrow_forward`, `Icons.check`, `Icons.cancel` como controles pequeños pueden seguir vectoriales.
|
||||||
|
- En botones premium principales, si el icono ocupa mucho protagonismo, conviene usar asset ilustrado.
|
||||||
|
- En `TextField.prefixIcon`, usar vectorial es aceptable salvo pantallas premium donde el icono sea grande o repetido.
|
||||||
|
|
||||||
|
## Assets existentes a reutilizar antes de generar
|
||||||
|
|
||||||
|
| Asset | Tamaño | Peso | Estado |
|
||||||
|
| --- | ---: | ---: | --- |
|
||||||
|
| `assets/ui/generated/gameplay/notes_strategy_art.webp` | 256x256 | ~126 KB | Bueno como hero de notas; pesado para botón. Generar derivado `action_notes_quill.webp` 128/160 px. |
|
||||||
|
| `assets/ui/generated/meta/result_verdict_art.webp` | 256x256 | ~129 KB | Bueno para resultado; pesado como icono de botón. Crear derivado 160 px. |
|
||||||
|
| `assets/ui/generated/gameplay/gameplay_phase_emblem.webp` | 256x256 | ~113 KB | Reutilizable como fase genérica; no sustituye iconos específicos. |
|
||||||
|
| `assets/ui/generated/join_lobby/signal_art.webp` | 176x88 | ~129 KB | Calidad correcta pero peso alto para tamaño; recomprimir objetivo 45-80 KB. |
|
||||||
|
| `assets/ui/generated/meta/history_ledger_art.webp` | 256x256 | ~131 KB | Reutilizable; recomprimir si se usa como icono pequeño. |
|
||||||
|
| `assets/ui/generated/meta/settings_profile_art.webp` | 256x256 | ~124 KB | Reutilizable; recomprimir si se usa como icono pequeño. |
|
||||||
|
| `assets/ui/generated/create_game/create_game_header_art.webp` | 176x88 | ~122 KB | Peso alto para tamaño; recomprimir o generar iconos derivados. |
|
||||||
|
|
||||||
|
## Assets a retirar o no usar como runtime
|
||||||
|
|
||||||
|
| Asset/carpeta | Motivo |
|
||||||
|
| --- | --- |
|
||||||
|
| `assets/ui/premium/lantern_radial_glow.png` | 1024x1024, 285 KB, no referenciado; glow procedural/antiguo. |
|
||||||
|
| `assets/ui/premium/vote_danger_glow.png` | no referenciado; reemplazar por asset premium real si hace falta. |
|
||||||
|
| `assets/ui/premium/word_reveal_glow.png` | no referenciado; reemplazar por asset premium real si hace falta. |
|
||||||
|
| `assets/ui/premium/corner_orange_glow.png` | no referenciado; placeholder procedural. |
|
||||||
|
| `assets/ui/premium/timer_ring_glow.png` | no referenciado; si se quiere temporizador premium, generar ilustración específica. |
|
||||||
|
| `assets/ui/premium/card_sheen_overlay.png` | no referenciado; solo conservar si se integra conscientemente. |
|
||||||
|
| `assets/ui/premium/qr_frame_overlay.png` | no referenciado; el QR debe mantener zona blanca limpia. |
|
||||||
|
| `assets/ui/premium/sparks_overlay.png` | no referenciado; mejor usar efectos controlados o asset optimizado. |
|
||||||
|
|
||||||
|
## Plan de generación recomendado
|
||||||
|
|
||||||
|
1. Generar un kit pequeño `assets/ui/generated/actions/` con 8-10 iconos ilustrados transparentes.
|
||||||
|
2. Redimensionar/comprimir cada icono a 128/160/192 px según uso.
|
||||||
|
3. Añadir soporte en `BotonFarolero` y `TarjetaFaseFarolero` para `assetIconPath`, manteniendo `IconData` solo como fallback.
|
||||||
|
4. Migrar primero acciones visibles: notas, votar, ver palabra, impostor, resultado, fuego.
|
||||||
|
5. Reutilizar los mismos assets en host/cliente/local para no multiplicar peso.
|
||||||
|
6. Eliminar `assets/ui/premium/` del runtime si sigue sin referencias reales.
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import '../estado/estado_juego.dart';
|
import '../estado/estado_juego.dart';
|
||||||
@@ -122,6 +122,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
|
|||||||
child: BotonFarolero(
|
child: BotonFarolero(
|
||||||
texto: l10n.guess,
|
texto: l10n.guess,
|
||||||
icono: Icons.send,
|
icono: Icons.send,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_impostor_mask.webp',
|
||||||
onPressed: _controlador.text.trim().isNotEmpty ? _intentarAdivinar : null,
|
onPressed: _controlador.text.trim().isNotEmpty ? _intentarAdivinar : null,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -173,6 +174,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
|
|||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: acierto ? l10n.seeEndResult : l10n.nextRound,
|
texto: acierto ? l10n.seeEndResult : l10n.nextRound,
|
||||||
icono: acierto ? Icons.emoji_events : Icons.skip_next,
|
icono: acierto ? Icons.emoji_events : Icons.skip_next,
|
||||||
|
assetIconPath: acierto ? 'assets/ui/generated/actions/action_result_trophy.webp' : null,
|
||||||
onPressed: acierto
|
onPressed: acierto
|
||||||
? () {
|
? () {
|
||||||
Navigator.pushReplacement(
|
Navigator.pushReplacement(
|
||||||
|
|||||||
@@ -122,6 +122,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
|
|||||||
child: BotonFarolero.oscuro(
|
child: BotonFarolero.oscuro(
|
||||||
texto: l10n.notes,
|
texto: l10n.notes,
|
||||||
icono: Icons.edit_note,
|
icono: Icons.edit_note,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_notes_quill.webp',
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
@@ -136,6 +137,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
|
|||||||
child: BotonFarolero(
|
child: BotonFarolero(
|
||||||
texto: l10n.goToVoting,
|
texto: l10n.goToVoting,
|
||||||
icono: Icons.how_to_vote,
|
icono: Icons.how_to_vote,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_vote_mask.webp',
|
||||||
onPressed: _irAVotacion,
|
onPressed: _irAVotacion,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||||
import 'package:farolero/modelos/inicio_partida_multijugador.dart';
|
import 'package:farolero/modelos/inicio_partida_multijugador.dart';
|
||||||
@@ -205,6 +205,9 @@ class _PantallaDebateClienteState extends State<PantallaDebateCliente> {
|
|||||||
icono: _votacionSolicitada
|
icono: _votacionSolicitada
|
||||||
? Icons.hourglass_empty
|
? Icons.hourglass_empty
|
||||||
: Icons.how_to_vote,
|
: Icons.how_to_vote,
|
||||||
|
assetIconPath: _votacionSolicitada
|
||||||
|
? null
|
||||||
|
: 'assets/ui/generated/actions/action_vote_mask.webp',
|
||||||
onPressed: _votacionSolicitada
|
onPressed: _votacionSolicitada
|
||||||
? null
|
? null
|
||||||
: () {
|
: () {
|
||||||
|
|||||||
@@ -804,12 +804,14 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
return BotonFarolero.secundario(
|
return BotonFarolero.secundario(
|
||||||
texto: l10n.goToVoting,
|
texto: l10n.goToVoting,
|
||||||
icono: Icons.how_to_vote,
|
icono: Icons.how_to_vote,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_vote_mask.webp',
|
||||||
onPressed: () => _avanzarAFase(FaseJuego.votacion),
|
onPressed: () => _avanzarAFase(FaseJuego.votacion),
|
||||||
);
|
);
|
||||||
case FaseJuego.votacion:
|
case FaseJuego.votacion:
|
||||||
return BotonFarolero(
|
return BotonFarolero(
|
||||||
texto: todosVotaron ? l10n.revealResult : l10n.waitingVoting,
|
texto: todosVotaron ? l10n.revealResult : l10n.waitingVoting,
|
||||||
icono: Icons.visibility,
|
icono: Icons.visibility,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_result_trophy.webp',
|
||||||
onPressed: todosVotaron ? () => _avanzarAFase(FaseJuego.resultado) : null,
|
onPressed: todosVotaron ? () => _avanzarAFase(FaseJuego.resultado) : null,
|
||||||
);
|
);
|
||||||
case FaseJuego.resultado:
|
case FaseJuego.resultado:
|
||||||
@@ -843,6 +845,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
return BotonFarolero(
|
return BotonFarolero(
|
||||||
texto: l10n.seeEndResult,
|
texto: l10n.seeEndResult,
|
||||||
icono: Icons.emoji_events,
|
icono: Icons.emoji_events,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_result_trophy.webp',
|
||||||
onPressed: () => _finalizarPartidaOnline(context),
|
onPressed: () => _finalizarPartidaOnline(context),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -853,6 +856,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
BotonFarolero.oscuro(
|
BotonFarolero.oscuro(
|
||||||
texto: l10n.impostorGuessWord,
|
texto: l10n.impostorGuessWord,
|
||||||
icono: Icons.psychology,
|
icono: Icons.psychology,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_impostor_mask.webp',
|
||||||
onPressed: () => _iniciarAdivinanzaOnline(context),
|
onPressed: () => _iniciarAdivinanzaOnline(context),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
@@ -878,6 +882,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: l10n.guess,
|
texto: l10n.guess,
|
||||||
icono: Icons.check_circle,
|
icono: Icons.check_circle,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_impostor_mask.webp',
|
||||||
onPressed: () => _resolverAdivinanzaOnline(context),
|
onPressed: () => _resolverAdivinanzaOnline(context),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import 'package:farolero/tema/componentes_farolero.dart';
|
|||||||
import 'package:farolero/tema/tema_app.dart';
|
import 'package:farolero/tema/tema_app.dart';
|
||||||
|
|
||||||
/// Pantalla que ve cada jugador cuando recibe su palabra (modo multidispositivo).
|
/// 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.
|
/// NO es la pantalla del host.
|
||||||
class PantallaPalabraCliente extends StatefulWidget {
|
class PantallaPalabraCliente extends StatefulWidget {
|
||||||
final String palabra;
|
final String palabra;
|
||||||
@@ -166,7 +166,7 @@ class _PantallaPalabraClienteState extends State<PantallaPalabraCliente> {
|
|||||||
),
|
),
|
||||||
|
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
// Botón confirmar
|
// Botón confirmar
|
||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: _haRevelado ? l10n.iveSeenIt : l10n.tapToSee,
|
texto: _haRevelado ? l10n.iveSeenIt : l10n.tapToSee,
|
||||||
icono: Icons.check,
|
icono: Icons.check,
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
|
|||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: l10n.confirmVote,
|
texto: l10n.confirmVote,
|
||||||
icono: Icons.how_to_vote,
|
icono: Icons.how_to_vote,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_vote_mask.webp',
|
||||||
onPressed: _seleccionado != null
|
onPressed: _seleccionado != null
|
||||||
? () {
|
? () {
|
||||||
estado.registrarVoto(votanteActual.id, _seleccionado!);
|
estado.registrarVoto(votanteActual.id, _seleccionado!);
|
||||||
@@ -147,6 +148,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
|
|||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: l10n.revealResult,
|
texto: l10n.revealResult,
|
||||||
icono: Icons.visibility,
|
icono: Icons.visibility,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_result_trophy.webp',
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
final resultado = estado.procesarVotacion();
|
final resultado = estado.procesarVotacion();
|
||||||
if (resultado != null) {
|
if (resultado != null) {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import 'package:farolero/tema/componentes_farolero.dart';
|
|||||||
import 'package:farolero/tema/tema_app.dart';
|
import 'package:farolero/tema/tema_app.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
/// Pantalla de votación para cliente multidispositivo.
|
/// Pantalla de votación para cliente multidispositivo.
|
||||||
/// Un cliente puede manejar uno o varios jugadores, por eso se recoge un voto
|
/// Un cliente puede manejar uno o varios jugadores, por eso se recoge un voto
|
||||||
/// por cada jugador controlado activo.
|
/// por cada jugador controlado activo.
|
||||||
class PantallaVotacionCliente extends StatefulWidget {
|
class PantallaVotacionCliente extends StatefulWidget {
|
||||||
@@ -186,6 +186,7 @@ class _PantallaVotacionClienteState extends State<PantallaVotacionCliente> {
|
|||||||
BotonFarolero.secundario(
|
BotonFarolero.secundario(
|
||||||
texto: l10n.votar,
|
texto: l10n.votar,
|
||||||
icono: Icons.how_to_vote,
|
icono: Icons.how_to_vote,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_vote_mask.webp',
|
||||||
onPressed: _votacionCompleta
|
onPressed: _votacionCompleta
|
||||||
? () => widget.onVotos(Map.unmodifiable(_votosPorVotante))
|
? () => widget.onVotos(Map.unmodifiable(_votosPorVotante))
|
||||||
: null,
|
: null,
|
||||||
|
|||||||
@@ -233,6 +233,7 @@ class LogoFarolero extends StatelessWidget {
|
|||||||
class BotonFarolero extends StatelessWidget {
|
class BotonFarolero extends StatelessWidget {
|
||||||
final String texto;
|
final String texto;
|
||||||
final IconData icono;
|
final IconData icono;
|
||||||
|
final String? assetIconPath;
|
||||||
final VoidCallback? onPressed;
|
final VoidCallback? onPressed;
|
||||||
final LinearGradient gradient;
|
final LinearGradient gradient;
|
||||||
final Color foreground;
|
final Color foreground;
|
||||||
@@ -242,6 +243,7 @@ class BotonFarolero extends StatelessWidget {
|
|||||||
super.key,
|
super.key,
|
||||||
required this.texto,
|
required this.texto,
|
||||||
required this.icono,
|
required this.icono,
|
||||||
|
this.assetIconPath,
|
||||||
required this.onPressed,
|
required this.onPressed,
|
||||||
this.gradient = TemaApp.gradientePrimario,
|
this.gradient = TemaApp.gradientePrimario,
|
||||||
this.foreground = Colors.black,
|
this.foreground = Colors.black,
|
||||||
@@ -252,6 +254,7 @@ class BotonFarolero extends StatelessWidget {
|
|||||||
super.key,
|
super.key,
|
||||||
required this.texto,
|
required this.texto,
|
||||||
required this.icono,
|
required this.icono,
|
||||||
|
this.assetIconPath,
|
||||||
required this.onPressed,
|
required this.onPressed,
|
||||||
}) : gradient = const LinearGradient(
|
}) : gradient = const LinearGradient(
|
||||||
colors: [TemaApp.colorPurpura, Color(0xFF2B1736)],
|
colors: [TemaApp.colorPurpura, Color(0xFF2B1736)],
|
||||||
@@ -265,6 +268,7 @@ class BotonFarolero extends StatelessWidget {
|
|||||||
super.key,
|
super.key,
|
||||||
required this.texto,
|
required this.texto,
|
||||||
required this.icono,
|
required this.icono,
|
||||||
|
this.assetIconPath,
|
||||||
required this.onPressed,
|
required this.onPressed,
|
||||||
}) : gradient = const LinearGradient(
|
}) : gradient = const LinearGradient(
|
||||||
colors: [Color(0xFF151F27), Color(0xFF090E13)],
|
colors: [Color(0xFF151F27), Color(0xFF090E13)],
|
||||||
@@ -303,7 +307,14 @@ class BotonFarolero extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 44,
|
width: 44,
|
||||||
child: Icon(icono, color: colorTexto, size: 30),
|
height: 40,
|
||||||
|
child: assetIconPath == null
|
||||||
|
? Icon(icono, color: colorTexto, size: 30)
|
||||||
|
: Image.asset(
|
||||||
|
assetIconPath!,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
filterQuality: FilterQuality.medium,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 10),
|
const SizedBox(width: 10),
|
||||||
Expanded(
|
Expanded(
|
||||||
|
|||||||
|
After Width: | Height: | Size: 223 KiB |