Compare commits
12 Commits
50cf83826c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 553456836f | |||
| cee8c7c2ce | |||
| 8f78652ac6 | |||
| bb4359656f | |||
| 90ada9099f | |||
| 158a7ae6a8 | |||
| 5697c2a5a1 | |||
| 7ee8c6ae2f | |||
| 1885c85de9 | |||
| a055ed808c | |||
| 4334e06b04 | |||
| be255d5ea3 |
@@ -0,0 +1 @@
|
|||||||
|
CYSATD23LTB4SAAAAAAAAAAAAA
|
||||||
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 8.8 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 7.5 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 9.3 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 8.3 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 285 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 70 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';
|
||||||
@@ -71,6 +71,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
|
|||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
TarjetaFaseFarolero(
|
TarjetaFaseFarolero(
|
||||||
icono: Icons.theater_comedy,
|
icono: Icons.theater_comedy,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_impostor_mask.webp',
|
||||||
titulo: l10n.impostorCanGuess,
|
titulo: l10n.impostorCanGuess,
|
||||||
subtitulo: l10n.ifCorrectImpostorsWin,
|
subtitulo: l10n.ifCorrectImpostorsWin,
|
||||||
color: TemaApp.colorAcento,
|
color: TemaApp.colorAcento,
|
||||||
@@ -98,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,
|
||||||
@@ -122,6 +123,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,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -141,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,
|
||||||
@@ -173,6 +175,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(
|
||||||
|
|||||||
@@ -69,7 +69,12 @@ class _PantallaAjustesState extends State<PantallaAjustes> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
const Icon(Icons.edit),
|
Image.asset(
|
||||||
|
'assets/ui/generated/actions/action_settings_gear.webp',
|
||||||
|
width: 38,
|
||||||
|
height: 38,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -130,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,
|
||||||
@@ -167,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),
|
||||||
@@ -175,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),
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
|
|
||||||
Future<void> _iniciarPartidaMulti() async {
|
Future<void> _iniciarPartidaMulti() async {
|
||||||
final l10n = AppLocalizations.of(context)!;
|
final l10n = AppLocalizations.of(context)!;
|
||||||
// 1. Pedir permisos automáticamente
|
// 1. Pedir permisos automáticamente
|
||||||
final permisosOk = await ServicioPermisos.solicitarPermisosNearby(context);
|
final permisosOk = await ServicioPermisos.solicitarPermisosNearby(context);
|
||||||
if (!permisosOk) {
|
if (!permisosOk) {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
@@ -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},
|
||||||
@@ -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,
|
||||||
),
|
),
|
||||||
@@ -400,7 +400,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
],
|
],
|
||||||
// Categoría
|
// CategorÃÂa
|
||||||
Card(
|
Card(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.fromLTRB(18, 18, 18, 28),
|
padding: const EdgeInsets.fromLTRB(18, 18, 18, 28),
|
||||||
@@ -416,8 +416,16 @@ 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: Icon(Icons.category),
|
prefixIcon: Padding(
|
||||||
|
padding: EdgeInsets.all(10),
|
||||||
|
child: Image.asset(
|
||||||
|
'assets/ui/generated/actions/action_category_cards.webp',
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
items: categorias.map((c) {
|
items: categorias.map((c) {
|
||||||
return DropdownMenuItem(
|
return DropdownMenuItem(
|
||||||
@@ -465,7 +473,15 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
controller: _controladorNombre,
|
controller: _controladorNombre,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: l10n.playerNameHint,
|
hintText: l10n.playerNameHint,
|
||||||
prefixIcon: const Icon(Icons.person_add),
|
prefixIcon: Padding(
|
||||||
|
padding: EdgeInsets.all(10),
|
||||||
|
child: Image.asset(
|
||||||
|
'assets/ui/generated/actions/action_add_player.webp',
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
textCapitalization: TextCapitalization.words,
|
textCapitalization: TextCapitalization.words,
|
||||||
onSubmitted: (_) => _agregarJugador(),
|
onSubmitted: (_) => _agregarJugador(),
|
||||||
@@ -474,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),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -513,9 +529,9 @@ 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: IconoFarolero(
|
||||||
Icons.close,
|
Icons.close,
|
||||||
color: TemaApp.colorAcento,
|
color: TemaApp.colorAcento,
|
||||||
),
|
),
|
||||||
@@ -530,7 +546,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
],
|
],
|
||||||
|
|
||||||
// Configuración de partida
|
// Configuración de partida
|
||||||
Card(
|
Card(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.fromLTRB(18, 18, 18, 28),
|
padding: const EdgeInsets.fromLTRB(18, 18, 18, 28),
|
||||||
@@ -543,7 +559,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
|
|
||||||
// Número de impostores
|
// Número de impostores
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
@@ -554,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',
|
||||||
@@ -564,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),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -604,10 +620,11 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 24),
|
const SizedBox(height: 24),
|
||||||
|
|
||||||
// Botón iniciar
|
// Botón iniciar
|
||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: l10n.startGame,
|
texto: l10n.startGame,
|
||||||
icono: Icons.play_arrow,
|
icono: Icons.play_arrow,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_create_game.webp',
|
||||||
onPressed: (_modoMultimovil || _jugadores.length >= 3)
|
onPressed: (_modoMultimovil || _jugadores.length >= 3)
|
||||||
? _iniciarPartida
|
? _iniciarPartida
|
||||||
: null,
|
: null,
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
|
|||||||
Expanded(
|
Expanded(
|
||||||
child: TarjetaFaseFarolero(
|
child: TarjetaFaseFarolero(
|
||||||
icono: Icons.forum,
|
icono: Icons.forum,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
|
||||||
titulo: l10n.playersInDebate,
|
titulo: l10n.playersInDebate,
|
||||||
subtitulo: l10n.activePlayersInfo(
|
subtitulo: l10n.activePlayersInfo(
|
||||||
partida.jugadoresActivos.length,
|
partida.jugadoresActivos.length,
|
||||||
@@ -107,6 +108,7 @@ class _PantallaDebateState extends State<PantallaDebate> {
|
|||||||
nombre: '${index + 1}. ${jugador.nombre}',
|
nombre: '${index + 1}. ${jugador.nombre}',
|
||||||
subtitulo: jugador.eliminado ? l10n.eliminated : null,
|
subtitulo: jugador.eliminado ? l10n.eliminated : null,
|
||||||
icono: jugador.eliminado ? Icons.person_off : Icons.record_voice_over,
|
icono: jugador.eliminado ? Icons.person_off : Icons.record_voice_over,
|
||||||
|
assetIconPath: jugador.eliminado ? null : 'assets/ui/generated/actions/action_players_group.webp',
|
||||||
destacado: !jugador.eliminado,
|
destacado: !jugador.eliminado,
|
||||||
completado: !jugador.eliminado,
|
completado: !jugador.eliminado,
|
||||||
);
|
);
|
||||||
@@ -122,6 +124,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 +139,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';
|
||||||
@@ -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,
|
||||||
@@ -166,6 +166,7 @@ class _PantallaDebateClienteState extends State<PantallaDebateCliente> {
|
|||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
TarjetaFaseFarolero(
|
TarjetaFaseFarolero(
|
||||||
icono: Icons.forum,
|
icono: Icons.forum,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
|
||||||
titulo: l10n.debate,
|
titulo: l10n.debate,
|
||||||
subtitulo: l10n.debateInstructions,
|
subtitulo: l10n.debateInstructions,
|
||||||
child: Column(
|
child: Column(
|
||||||
@@ -195,6 +196,7 @@ class _PantallaDebateClienteState extends State<PantallaDebateCliente> {
|
|||||||
destacado: true,
|
destacado: true,
|
||||||
completado: true,
|
completado: true,
|
||||||
icono: Icons.record_voice_over,
|
icono: Icons.record_voice_over,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_players_group.webp',
|
||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
],
|
],
|
||||||
@@ -205,6 +207,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
|
||||||
: () {
|
: () {
|
||||||
|
|||||||
@@ -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),
|
||||||
@@ -412,10 +412,13 @@ class _TarjetaProgresoGamificacion extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
child: const Icon(
|
child: Padding(
|
||||||
Icons.local_fire_department,
|
padding: const EdgeInsets.all(7),
|
||||||
color: Color(0xFF1B1010),
|
child: Image.asset(
|
||||||
size: 30,
|
'assets/ui/generated/actions/action_fire_badge.webp',
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
filterQuality: FilterQuality.medium,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 14),
|
const SizedBox(width: 14),
|
||||||
@@ -582,8 +585,13 @@ class _DeltaFuego extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.local_fire_department,
|
Image.asset(
|
||||||
color: TemaApp.colorNaranja, size: 24),
|
'assets/ui/generated/actions/action_fire_badge.webp',
|
||||||
|
width: 26,
|
||||||
|
height: 26,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
filterQuality: FilterQuality.medium,
|
||||||
|
),
|
||||||
const SizedBox(width: 4),
|
const SizedBox(width: 4),
|
||||||
Text(
|
Text(
|
||||||
texto,
|
texto,
|
||||||
@@ -838,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(
|
||||||
@@ -859,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(
|
||||||
@@ -871,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),
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
@@ -950,6 +958,7 @@ class _BotonesFinPartida extends StatelessWidget {
|
|||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: l10n.rematch,
|
texto: l10n.rematch,
|
||||||
icono: Icons.replay,
|
icono: Icons.replay,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_create_game.webp',
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
estado.revancha();
|
estado.revancha();
|
||||||
Navigator.pushReplacement(
|
Navigator.pushReplacement(
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ class _PantallaFinPartidaOnlineState extends State<PantallaFinPartidaOnline> {
|
|||||||
BotonFarolero.oscuro(
|
BotonFarolero.oscuro(
|
||||||
texto: l10n.mainMenu,
|
texto: l10n.mainMenu,
|
||||||
icono: Icons.home,
|
icono: Icons.home,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_result_trophy.webp',
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await context.read<ServicioNearby>().desconectar();
|
await context.read<ServicioNearby>().desconectar();
|
||||||
if (!context.mounted) return;
|
if (!context.mounted) return;
|
||||||
@@ -195,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(
|
||||||
@@ -206,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(
|
||||||
|
|||||||
@@ -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(
|
||||||
@@ -286,6 +286,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
child: BotonFarolero.oscuro(
|
child: BotonFarolero.oscuro(
|
||||||
texto: AppLocalizations.of(context)!.assumeOnThisPhone,
|
texto: AppLocalizations.of(context)!.assumeOnThisPhone,
|
||||||
icono: Icons.person_add_alt_1,
|
icono: Icons.person_add_alt_1,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_add_player.webp',
|
||||||
onPressed: () => nearby.asumirUsuariosDesconectados(),
|
onPressed: () => nearby.asumirUsuariosDesconectados(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -411,6 +412,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
) {
|
) {
|
||||||
return TarjetaFaseFarolero(
|
return TarjetaFaseFarolero(
|
||||||
icono: Icons.visibility,
|
icono: Icons.visibility,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
|
||||||
titulo: l10n.waitingPlayersSeeWord,
|
titulo: l10n.waitingPlayersSeeWord,
|
||||||
subtitulo: l10n.connectedPlayers,
|
subtitulo: l10n.connectedPlayers,
|
||||||
child: Column(
|
child: Column(
|
||||||
@@ -427,6 +429,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: l10n.seeYourWord,
|
texto: l10n.seeYourWord,
|
||||||
icono: Icons.visibility,
|
icono: Icons.visibility,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
|
||||||
onPressed: () => _mostrarPalabraHost(context),
|
onPressed: () => _mostrarPalabraHost(context),
|
||||||
),
|
),
|
||||||
if (todosListos) ...[
|
if (todosListos) ...[
|
||||||
@@ -538,6 +541,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
|
|
||||||
return TarjetaFaseFarolero(
|
return TarjetaFaseFarolero(
|
||||||
icono: Icons.forum,
|
icono: Icons.forum,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
|
||||||
titulo: l10n.debate,
|
titulo: l10n.debate,
|
||||||
subtitulo: l10n.debateInstructions,
|
subtitulo: l10n.debateInstructions,
|
||||||
child: Column(
|
child: Column(
|
||||||
@@ -579,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(
|
||||||
@@ -605,6 +609,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
|
|
||||||
return TarjetaFaseFarolero(
|
return TarjetaFaseFarolero(
|
||||||
icono: Icons.how_to_vote,
|
icono: Icons.how_to_vote,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_vote_mask.webp',
|
||||||
titulo: l10n.voting,
|
titulo: l10n.voting,
|
||||||
subtitulo: l10n.votesProgress(votosEmitidos, totalVotos),
|
subtitulo: l10n.votesProgress(votosEmitidos, totalVotos),
|
||||||
color: TemaApp.colorAcento,
|
color: TemaApp.colorAcento,
|
||||||
@@ -668,6 +673,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
: null;
|
: null;
|
||||||
return TarjetaFaseFarolero(
|
return TarjetaFaseFarolero(
|
||||||
icono: Icons.psychology,
|
icono: Icons.psychology,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_impostor_mask.webp',
|
||||||
titulo: l10n.impostorGuessTitle,
|
titulo: l10n.impostorGuessTitle,
|
||||||
subtitulo: ultimo == null
|
subtitulo: ultimo == null
|
||||||
? l10n.impostorCanGuess
|
? l10n.impostorCanGuess
|
||||||
@@ -783,6 +789,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
destacado: esHost,
|
destacado: esHost,
|
||||||
completado: listo,
|
completado: listo,
|
||||||
icono: esHost ? Icons.phone_android : Icons.devices,
|
icono: esHost ? Icons.phone_android : Icons.devices,
|
||||||
|
assetIconPath: esHost ? 'assets/ui/generated/actions/action_mobile_device.webp' : 'assets/ui/generated/actions/action_multidevice_signal.webp',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -798,18 +805,21 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
return BotonFarolero(
|
return BotonFarolero(
|
||||||
texto: todosListos ? l10n.allSeenStartDebate : l10n.waitingPlayersSeeWord,
|
texto: todosListos ? l10n.allSeenStartDebate : l10n.waitingPlayersSeeWord,
|
||||||
icono: Icons.forum,
|
icono: Icons.forum,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
|
||||||
onPressed: todosListos ? () => _avanzarAFase(FaseJuego.debate) : null,
|
onPressed: todosListos ? () => _avanzarAFase(FaseJuego.debate) : null,
|
||||||
);
|
);
|
||||||
case FaseJuego.debate:
|
case FaseJuego.debate:
|
||||||
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 +853,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 +864,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 +890,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),
|
||||||
@@ -1080,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,
|
||||||
@@ -1122,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,
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ class PantallaHistorial extends StatelessWidget {
|
|||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
EstadoVacioFarolero(
|
EstadoVacioFarolero(
|
||||||
icono: Icons.history_rounded,
|
icono: Icons.history_rounded,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_history_ledger.webp',
|
||||||
titulo: l10n.history,
|
titulo: l10n.history,
|
||||||
subtitulo: l10n.noSavedGames,
|
subtitulo: l10n.noSavedGames,
|
||||||
),
|
),
|
||||||
@@ -68,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,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import '../servicios/servicio_perfil_usuario.dart';
|
|||||||
import '../tema/componentes_farolero.dart';
|
import '../tema/componentes_farolero.dart';
|
||||||
import '../tema/tema_app.dart';
|
import '../tema/tema_app.dart';
|
||||||
|
|
||||||
/// Lobby del host. El host es autoridad de sala y también cliente local.
|
/// Lobby del host. El host es autoridad de sala y también cliente local.
|
||||||
class PantallaLobbyHost extends StatefulWidget {
|
class PantallaLobbyHost extends StatefulWidget {
|
||||||
final String nombreSala;
|
final String nombreSala;
|
||||||
final VoidCallback onIniciar;
|
final VoidCallback onIniciar;
|
||||||
@@ -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);
|
||||||
@@ -63,6 +63,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
|
|||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
EncabezadoFarolero(
|
EncabezadoFarolero(
|
||||||
icono: Icons.wifi_tethering,
|
icono: Icons.wifi_tethering,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_multidevice_signal.webp',
|
||||||
titulo: widget.nombreSala,
|
titulo: widget.nombreSala,
|
||||||
subtitulo: l10n.scanToJoin,
|
subtitulo: l10n.scanToJoin,
|
||||||
),
|
),
|
||||||
@@ -147,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),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -186,6 +187,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
|
|||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: _iniciando ? l10n.starting : l10n.startGame,
|
texto: _iniciando ? l10n.starting : l10n.startGame,
|
||||||
icono: Icons.play_arrow,
|
icono: Icons.play_arrow,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_create_game.webp',
|
||||||
onPressed: puedeIniciar && !_iniciando
|
onPressed: puedeIniciar && !_iniciando
|
||||||
? () {
|
? () {
|
||||||
setState(() => _iniciando = true);
|
setState(() => _iniciando = true);
|
||||||
@@ -252,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(
|
||||||
@@ -328,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),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -379,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),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -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
|
||||||
@@ -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(
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -135,6 +135,7 @@ class _PantallaPalabrasClienteState extends State<PantallaPalabrasCliente> {
|
|||||||
? (_esUltimo ? l10n.iveSeenIt : l10n.next)
|
? (_esUltimo ? l10n.iveSeenIt : l10n.next)
|
||||||
: l10n.tapToSee,
|
: l10n.tapToSee,
|
||||||
icono: _esUltimo ? Icons.check : Icons.arrow_forward,
|
icono: _esUltimo ? Icons.check : Icons.arrow_forward,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
|
||||||
onPressed: _actualRevelado ? _continuar : null,
|
onPressed: _actualRevelado ? _continuar : null,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -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,
|
||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Iniciar animación de suspense
|
// Iniciar animación de suspense
|
||||||
Future.delayed(const Duration(milliseconds: 500), () {
|
Future.delayed(const Duration(milliseconds: 500), () {
|
||||||
_animController.forward().then((_) {
|
_animController.forward().then((_) {
|
||||||
setState(() => _revelado = true);
|
setState(() => _revelado = true);
|
||||||
@@ -72,7 +72,7 @@ class _PantallaResultadoState extends State<PantallaResultado>
|
|||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
// Animación de suspense
|
// Animación de suspense
|
||||||
if (!_revelado) ...[
|
if (!_revelado) ...[
|
||||||
const ArteGameplayFarolero.resultado(height: 152),
|
const ArteGameplayFarolero.resultado(height: 152),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(
|
||||||
@@ -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),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import 'pantalla_resultado_online.dart';
|
|||||||
import 'pantalla_fin_partida_online.dart';
|
import 'pantalla_fin_partida_online.dart';
|
||||||
|
|
||||||
/// Pantalla para unirse a una partida multidispositivo.
|
/// Pantalla para unirse a una partida multidispositivo.
|
||||||
/// Flujo: nombre → discovery automático (lista de salas) → fallback QR
|
/// Flujo: nombre → discovery automático (lista de salas) → fallback QR
|
||||||
class PantallaUnirse extends StatefulWidget {
|
class PantallaUnirse extends StatefulWidget {
|
||||||
const PantallaUnirse({super.key});
|
const PantallaUnirse({super.key});
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
nearby.onMensaje((endpointId, mensaje) {
|
nearby.onMensaje((endpointId, mensaje) {
|
||||||
if (!mounted) return;
|
if (!mounted) return;
|
||||||
if (mensaje.tipo == TipoMensaje.partidaInicio) {
|
if (mensaje.tipo == TipoMensaje.partidaInicio) {
|
||||||
// El host ha iniciado la partida — nos ha enviado nuestra palabra
|
// El host ha iniciado la partida  nos ha enviado nuestra palabra
|
||||||
final jugadoresData = mensaje.datos['jugadores'] as List<dynamic>?;
|
final jugadoresData = mensaje.datos['jugadores'] as List<dynamic>?;
|
||||||
final jugadoresTodosData =
|
final jugadoresTodosData =
|
||||||
mensaje.datos['jugadoresTodos'] as List<dynamic>?;
|
mensaje.datos['jugadoresTodos'] as List<dynamic>?;
|
||||||
@@ -303,7 +303,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
if (!_formKey.currentState!.validate()) return;
|
if (!_formKey.currentState!.validate()) return;
|
||||||
final l10n = AppLocalizations.of(context)!;
|
final l10n = AppLocalizations.of(context)!;
|
||||||
|
|
||||||
// Solicitar permisos automáticamente
|
// Solicitar permisos automáticamente
|
||||||
final permisosOk = await ServicioPermisos.solicitarPermisosNearby(context);
|
final permisosOk = await ServicioPermisos.solicitarPermisosNearby(context);
|
||||||
if (!permisosOk) {
|
if (!permisosOk) {
|
||||||
setState(() {
|
setState(() {
|
||||||
@@ -365,7 +365,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
_conectando = false;
|
_conectando = false;
|
||||||
_error = l10n.couldNotConnectToHost(nombreHost);
|
_error = l10n.couldNotConnectToHost(nombreHost);
|
||||||
});
|
});
|
||||||
// Reiniciar búsqueda
|
// Reiniciar búsqueda
|
||||||
_iniciarBusqueda();
|
_iniciarBusqueda();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -395,7 +395,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
datos['host'] as String? ?? datos['sala'] as String? ?? l10n.room;
|
datos['host'] as String? ?? datos['sala'] as String? ?? l10n.room;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Iniciar búsqueda para que Nearby encuentre al host
|
// Iniciar búsqueda para que Nearby encuentre al host
|
||||||
final nearby = context.read<ServicioNearby>();
|
final nearby = context.read<ServicioNearby>();
|
||||||
if (!nearby.buscando) {
|
if (!nearby.buscando) {
|
||||||
final servicioPerfil = context.read<ServicioPerfilUsuario>();
|
final servicioPerfil = context.read<ServicioPerfilUsuario>();
|
||||||
@@ -419,7 +419,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
final l10n = AppLocalizations.of(context)!;
|
final l10n = AppLocalizations.of(context)!;
|
||||||
final nearby = context.watch<ServicioNearby>();
|
final nearby = context.watch<ServicioNearby>();
|
||||||
|
|
||||||
// Si estamos conectados → pantalla de espera
|
// Si estamos conectados → pantalla de espera
|
||||||
if (nearby.conectado && !nearby.esHost) {
|
if (nearby.conectado && !nearby.esHost) {
|
||||||
return _buildPantallaEspera(context, l10n);
|
return _buildPantallaEspera(context, l10n);
|
||||||
}
|
}
|
||||||
@@ -457,6 +457,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
const SizedBox(height: 14),
|
const SizedBox(height: 14),
|
||||||
EncabezadoFarolero(
|
EncabezadoFarolero(
|
||||||
icono: Icons.bluetooth_searching,
|
icono: Icons.bluetooth_searching,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_multidevice_signal.webp',
|
||||||
titulo: l10n.joinGameTitle,
|
titulo: l10n.joinGameTitle,
|
||||||
subtitulo: l10n.enterNameToSearch,
|
subtitulo: l10n.enterNameToSearch,
|
||||||
color: TemaApp.colorAzul,
|
color: TemaApp.colorAzul,
|
||||||
@@ -466,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;
|
||||||
@@ -479,6 +480,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
BotonFarolero(
|
BotonFarolero(
|
||||||
texto: l10n.searchGames,
|
texto: l10n.searchGames,
|
||||||
icono: Icons.search,
|
icono: Icons.search,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_join_search.webp',
|
||||||
onPressed: _iniciarBusqueda,
|
onPressed: _iniciarBusqueda,
|
||||||
),
|
),
|
||||||
if (_error != null) ...[
|
if (_error != null) ...[
|
||||||
@@ -507,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(() {
|
||||||
@@ -527,6 +529,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
EncabezadoFarolero(
|
EncabezadoFarolero(
|
||||||
icono: _conectando ? Icons.sync : Icons.radar,
|
icono: _conectando ? Icons.sync : Icons.radar,
|
||||||
|
assetIconPath: _conectando ? null : 'assets/ui/generated/actions/action_join_search.webp',
|
||||||
titulo: _conectando
|
titulo: _conectando
|
||||||
? '${l10n.connectingTo} ${_salaSeleccionada ?? ""}...'
|
? '${l10n.connectingTo} ${_salaSeleccionada ?? ""}...'
|
||||||
: l10n.searchingGames,
|
: l10n.searchingGames,
|
||||||
@@ -553,6 +556,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
? Center(
|
? Center(
|
||||||
child: EstadoVacioFarolero(
|
child: EstadoVacioFarolero(
|
||||||
icono: Icons.radar,
|
icono: Icons.radar,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_join_search.webp',
|
||||||
titulo: l10n.noGamesFound,
|
titulo: l10n.noGamesFound,
|
||||||
subtitulo: l10n.noGamesFoundHint,
|
subtitulo: l10n.noGamesFoundHint,
|
||||||
),
|
),
|
||||||
@@ -584,10 +588,11 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
child: OutlinedButton.icon(
|
child: BotonFarolero.oscuro(
|
||||||
|
texto: l10n.scanQR,
|
||||||
|
icono: Icons.qr_code_scanner,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_qr_scan.webp',
|
||||||
onPressed: _abrirEscaner,
|
onPressed: _abrirEscaner,
|
||||||
icon: const Icon(Icons.qr_code_scanner),
|
|
||||||
label: Text(l10n.scanQR),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -620,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,
|
||||||
@@ -641,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,
|
||||||
@@ -655,14 +660,14 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ==================== ESCÁNER QR ====================
|
// ==================== ESCÃÂÂÂÂÂNER QR ====================
|
||||||
|
|
||||||
Widget _buildEscaner(BuildContext context, AppLocalizations l10n) {
|
Widget _buildEscaner(BuildContext context, AppLocalizations l10n) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
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),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -709,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();
|
||||||
@@ -766,9 +771,9 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
padding: const EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
child: Column(
|
child: Column(
|
||||||
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,
|
||||||
),
|
),
|
||||||
@@ -787,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),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -798,7 +803,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Crea un nuevo usuario y lo envía al host
|
/// Crea un nuevo usuario y lo envÃÂÂÂÂÂa al host
|
||||||
Future<void> _crearNuevoUsuario(BuildContext context) async {
|
Future<void> _crearNuevoUsuario(BuildContext context) async {
|
||||||
final l10n = AppLocalizations.of(context)!;
|
final l10n = AppLocalizations.of(context)!;
|
||||||
final controller = TextEditingController();
|
final controller = TextEditingController();
|
||||||
@@ -818,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),
|
||||||
),
|
),
|
||||||
@@ -847,7 +852,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Envía el usuario seleccionado/creado al host
|
/// EnvÃÂÂÂÂÂa el usuario seleccionado/creado al host
|
||||||
void _enviarUsuarioAlHost(Usuario usuario) {
|
void _enviarUsuarioAlHost(Usuario usuario) {
|
||||||
final l10n = AppLocalizations.of(context)!;
|
final l10n = AppLocalizations.of(context)!;
|
||||||
final nearby = context.read<ServicioNearby>();
|
final nearby = context.read<ServicioNearby>();
|
||||||
@@ -897,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,
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
|
|||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
TarjetaFaseFarolero(
|
TarjetaFaseFarolero(
|
||||||
icono: Icons.visibility,
|
icono: Icons.visibility,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
|
||||||
titulo: l10n.roundNumber(partida.rondaActual),
|
titulo: l10n.roundNumber(partida.rondaActual),
|
||||||
subtitulo: l10n.eachPlayerMustSee,
|
subtitulo: l10n.eachPlayerMustSee,
|
||||||
),
|
),
|
||||||
@@ -57,6 +58,7 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
|
|||||||
nombre: '${index + 1}. ${jugador.nombre}',
|
nombre: '${index + 1}. ${jugador.nombre}',
|
||||||
subtitulo: haVisto ? l10n.alreadySeen : l10n.tapToSee,
|
subtitulo: haVisto ? l10n.alreadySeen : l10n.tapToSee,
|
||||||
icono: haVisto ? Icons.check_circle : Icons.visibility,
|
icono: haVisto ? Icons.check_circle : Icons.visibility,
|
||||||
|
assetIconPath: haVisto ? null : 'assets/ui/generated/actions/action_reveal_word.webp',
|
||||||
destacado: haVisto,
|
destacado: haVisto,
|
||||||
completado: haVisto,
|
completado: haVisto,
|
||||||
onTap: haVisto ? null : () => _mostrarPalabra(context, jugador.id),
|
onTap: haVisto ? null : () => _mostrarPalabra(context, jugador.id),
|
||||||
@@ -70,6 +72,7 @@ class _PantallaVerPalabraState extends State<PantallaVerPalabra> {
|
|||||||
? l10n.allSeenStartDebate
|
? l10n.allSeenStartDebate
|
||||||
: l10n.playersRemaining(partida.jugadores.length - _hanVisto.length),
|
: l10n.playersRemaining(partida.jugadores.length - _hanVisto.length),
|
||||||
icono: Icons.forum,
|
icono: Icons.forum,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_rules_book.webp',
|
||||||
onPressed: todosHanVisto
|
onPressed: todosHanVisto
|
||||||
? () {
|
? () {
|
||||||
estado.iniciarDebate();
|
estado.iniciarDebate();
|
||||||
@@ -154,6 +157,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
|
|||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
TarjetaFaseFarolero(
|
TarjetaFaseFarolero(
|
||||||
icono: widget.esImpostor ? Icons.theater_comedy : Icons.search,
|
icono: widget.esImpostor ? Icons.theater_comedy : Icons.search,
|
||||||
|
assetIconPath: widget.esImpostor ? 'assets/ui/generated/actions/action_impostor_mask.webp' : 'assets/ui/generated/actions/action_reveal_word.webp',
|
||||||
titulo: widget.nombre,
|
titulo: widget.nombre,
|
||||||
subtitulo: l10n.holdToSeeWord,
|
subtitulo: l10n.holdToSeeWord,
|
||||||
color: colorEstado,
|
color: colorEstado,
|
||||||
@@ -170,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,
|
||||||
@@ -197,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,
|
||||||
@@ -250,6 +254,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
|
|||||||
BotonFarolero.secundario(
|
BotonFarolero.secundario(
|
||||||
texto: l10n.seenMyWord,
|
texto: l10n.seenMyWord,
|
||||||
icono: Icons.check,
|
icono: Icons.check,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_reveal_word.webp',
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
widget.onVisto();
|
widget.onVisto();
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
|
|||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
TarjetaFaseFarolero(
|
TarjetaFaseFarolero(
|
||||||
icono: Icons.how_to_vote,
|
icono: Icons.how_to_vote,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_vote_mask.webp',
|
||||||
titulo: l10n.voteOf(votanteActual.nombre),
|
titulo: l10n.voteOf(votanteActual.nombre),
|
||||||
subtitulo: l10n.votesProgress(estado.votos.length, activos.length),
|
subtitulo: l10n.votesProgress(estado.votos.length, activos.length),
|
||||||
color: TemaApp.colorAcento,
|
color: TemaApp.colorAcento,
|
||||||
@@ -78,6 +79,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
|
|||||||
Expanded(
|
Expanded(
|
||||||
child: TarjetaFaseFarolero(
|
child: TarjetaFaseFarolero(
|
||||||
icono: Icons.person_search,
|
icono: Icons.person_search,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_players_group.webp',
|
||||||
titulo: l10n.whoIsImpostor,
|
titulo: l10n.whoIsImpostor,
|
||||||
subtitulo: l10n.selectOnePlayer,
|
subtitulo: l10n.selectOnePlayer,
|
||||||
color: TemaApp.colorNaranja,
|
color: TemaApp.colorNaranja,
|
||||||
@@ -102,6 +104,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!);
|
||||||
@@ -138,6 +141,7 @@ class _PantallaVotacionState extends State<PantallaVotacion> {
|
|||||||
const SizedBox(height: 24),
|
const SizedBox(height: 24),
|
||||||
TarjetaFaseFarolero(
|
TarjetaFaseFarolero(
|
||||||
icono: Icons.check_circle,
|
icono: Icons.check_circle,
|
||||||
|
assetIconPath: 'assets/ui/generated/actions/action_result_trophy.webp',
|
||||||
titulo: l10n.allVoted,
|
titulo: l10n.allVoted,
|
||||||
subtitulo: l10n.tapToReveal,
|
subtitulo: l10n.tapToReveal,
|
||||||
color: TemaApp.colorVerde,
|
color: TemaApp.colorVerde,
|
||||||
@@ -147,6 +151,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 {
|
||||||
@@ -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,
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -6,6 +6,134 @@ 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.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';
|
||||||
|
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.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) {
|
||||||
|
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/icons/impostor_shadow.webp';
|
||||||
|
}
|
||||||
|
if (icono == Icons.emoji_events ||
|
||||||
|
icono == Icons.celebration ||
|
||||||
|
icono == Icons.bar_chart) {
|
||||||
|
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) 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';
|
||||||
|
}
|
||||||
|
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/icons/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;
|
||||||
@@ -77,6 +205,7 @@ class PanelFarolero extends StatelessWidget {
|
|||||||
|
|
||||||
class EncabezadoFarolero extends StatelessWidget {
|
class EncabezadoFarolero extends StatelessWidget {
|
||||||
final IconData icono;
|
final IconData icono;
|
||||||
|
final String? assetIconPath;
|
||||||
final String titulo;
|
final String titulo;
|
||||||
final String? subtitulo;
|
final String? subtitulo;
|
||||||
final Color color;
|
final Color color;
|
||||||
@@ -86,6 +215,7 @@ class EncabezadoFarolero extends StatelessWidget {
|
|||||||
const EncabezadoFarolero({
|
const EncabezadoFarolero({
|
||||||
super.key,
|
super.key,
|
||||||
required this.icono,
|
required this.icono,
|
||||||
|
this.assetIconPath,
|
||||||
required this.titulo,
|
required this.titulo,
|
||||||
this.subtitulo,
|
this.subtitulo,
|
||||||
this.color = TemaApp.colorNaranja,
|
this.color = TemaApp.colorNaranja,
|
||||||
@@ -118,7 +248,15 @@ class EncabezadoFarolero extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
child: Icon(icono, color: color, size: 30),
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(6),
|
||||||
|
child: IconoFarolero(
|
||||||
|
icono,
|
||||||
|
assetPath: assetIconPath,
|
||||||
|
color: color,
|
||||||
|
size: 30,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 14),
|
const SizedBox(width: 14),
|
||||||
Expanded(
|
Expanded(
|
||||||
@@ -159,12 +297,14 @@ class EncabezadoFarolero extends StatelessWidget {
|
|||||||
|
|
||||||
class EstadoVacioFarolero extends StatelessWidget {
|
class EstadoVacioFarolero extends StatelessWidget {
|
||||||
final IconData icono;
|
final IconData icono;
|
||||||
|
final String? assetIconPath;
|
||||||
final String titulo;
|
final String titulo;
|
||||||
final String subtitulo;
|
final String subtitulo;
|
||||||
|
|
||||||
const EstadoVacioFarolero({
|
const EstadoVacioFarolero({
|
||||||
super.key,
|
super.key,
|
||||||
required this.icono,
|
required this.icono,
|
||||||
|
this.assetIconPath,
|
||||||
required this.titulo,
|
required this.titulo,
|
||||||
required this.subtitulo,
|
required this.subtitulo,
|
||||||
});
|
});
|
||||||
@@ -176,7 +316,16 @@ class EstadoVacioFarolero extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(icono, color: TemaApp.colorNaranja, size: 46),
|
SizedBox(
|
||||||
|
width: 64,
|
||||||
|
height: 64,
|
||||||
|
child: IconoFarolero(
|
||||||
|
icono,
|
||||||
|
assetPath: assetIconPath,
|
||||||
|
color: TemaApp.colorNaranja,
|
||||||
|
size: 58,
|
||||||
|
),
|
||||||
|
),
|
||||||
const SizedBox(height: 14),
|
const SizedBox(height: 14),
|
||||||
Text(
|
Text(
|
||||||
titulo,
|
titulo,
|
||||||
@@ -207,7 +356,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,
|
||||||
@@ -233,6 +382,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 +392,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 +403,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 +417,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 +456,13 @@ class BotonFarolero extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 44,
|
width: 44,
|
||||||
child: Icon(icono, color: colorTexto, size: 30),
|
height: 40,
|
||||||
|
child: IconoFarolero(
|
||||||
|
icono,
|
||||||
|
assetPath: assetIconPath,
|
||||||
|
color: colorTexto,
|
||||||
|
size: 38,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 10),
|
const SizedBox(width: 10),
|
||||||
Expanded(
|
Expanded(
|
||||||
@@ -337,6 +496,7 @@ class BotonFarolero extends StatelessWidget {
|
|||||||
|
|
||||||
class TarjetaFaseFarolero extends StatelessWidget {
|
class TarjetaFaseFarolero extends StatelessWidget {
|
||||||
final IconData icono;
|
final IconData icono;
|
||||||
|
final String? assetIconPath;
|
||||||
final String titulo;
|
final String titulo;
|
||||||
final String? subtitulo;
|
final String? subtitulo;
|
||||||
final Color color;
|
final Color color;
|
||||||
@@ -346,6 +506,7 @@ class TarjetaFaseFarolero extends StatelessWidget {
|
|||||||
const TarjetaFaseFarolero({
|
const TarjetaFaseFarolero({
|
||||||
super.key,
|
super.key,
|
||||||
required this.icono,
|
required this.icono,
|
||||||
|
this.assetIconPath,
|
||||||
required this.titulo,
|
required this.titulo,
|
||||||
this.subtitulo,
|
this.subtitulo,
|
||||||
this.color = TemaApp.colorNaranja,
|
this.color = TemaApp.colorNaranja,
|
||||||
@@ -377,7 +538,15 @@ class TarjetaFaseFarolero extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
border: Border.all(color: color.withValues(alpha: 0.72)),
|
border: Border.all(color: color.withValues(alpha: 0.72)),
|
||||||
),
|
),
|
||||||
child: Icon(icono, color: color, size: 30),
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(6),
|
||||||
|
child: IconoFarolero(
|
||||||
|
icono,
|
||||||
|
assetPath: assetIconPath,
|
||||||
|
color: color,
|
||||||
|
size: 30,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 14),
|
const SizedBox(width: 14),
|
||||||
Expanded(
|
Expanded(
|
||||||
@@ -418,6 +587,7 @@ class EstadoJugadorFarolero extends StatelessWidget {
|
|||||||
final bool destacado;
|
final bool destacado;
|
||||||
final bool completado;
|
final bool completado;
|
||||||
final IconData icono;
|
final IconData icono;
|
||||||
|
final String? assetIconPath;
|
||||||
final String? subtitulo;
|
final String? subtitulo;
|
||||||
final VoidCallback? onTap;
|
final VoidCallback? onTap;
|
||||||
|
|
||||||
@@ -427,6 +597,7 @@ class EstadoJugadorFarolero extends StatelessWidget {
|
|||||||
this.destacado = false,
|
this.destacado = false,
|
||||||
this.completado = false,
|
this.completado = false,
|
||||||
this.icono = Icons.person,
|
this.icono = Icons.person,
|
||||||
|
this.assetIconPath,
|
||||||
this.subtitulo,
|
this.subtitulo,
|
||||||
this.onTap,
|
this.onTap,
|
||||||
});
|
});
|
||||||
@@ -464,7 +635,15 @@ 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: Icon(icono, color: color, size: 24),
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(5),
|
||||||
|
child: IconoFarolero(
|
||||||
|
icono,
|
||||||
|
assetPath: assetIconPath,
|
||||||
|
color: color,
|
||||||
|
size: 26,
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Expanded(
|
Expanded(
|
||||||
@@ -493,9 +672,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,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -553,7 +733,7 @@ class TemporizadorFarolero extends StatelessWidget {
|
|||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
children: [
|
children: [
|
||||||
Image.asset(
|
Image.asset(
|
||||||
'assets/ui/generated/gameplay/gameplay_phase_emblem.webp',
|
'assets/ui/generated/actions/action_timer_hourglass.webp',
|
||||||
height: 132,
|
height: 132,
|
||||||
fit: BoxFit.contain,
|
fit: BoxFit.contain,
|
||||||
opacity: const AlwaysStoppedAnimation(0.34),
|
opacity: const AlwaysStoppedAnimation(0.34),
|
||||||
@@ -822,7 +1002,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(),
|
||||||
|
|||||||
@@ -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(
|
||||||
@@ -153,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
|
||||||
@@ -371,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,
|
||||||
@@ -380,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),
|
||||||
@@ -391,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),
|
||||||
@@ -590,8 +591,13 @@ class BarraFuegoPremiumFarolero extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.local_fire_department,
|
Image.asset(
|
||||||
color: TemaApp.colorNaranja, size: 18),
|
'assets/ui/generated/actions/action_fire_badge.webp',
|
||||||
|
width: 22,
|
||||||
|
height: 22,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
filterQuality: FilterQuality.medium,
|
||||||
|
),
|
||||||
const SizedBox(width: 6),
|
const SizedBox(width: 6),
|
||||||
Text(
|
Text(
|
||||||
'${AppLocalizations.of(context)!.fireLabel} '
|
'${AppLocalizations.of(context)!.fireLabel} '
|
||||||
@@ -799,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(
|
||||||
@@ -820,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,
|
||||||
@@ -838,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,
|
||||||
@@ -1147,10 +1153,13 @@ class _IconoFuegoRecompensa extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
child: const Icon(
|
child: Padding(
|
||||||
Icons.local_fire_department,
|
padding: const EdgeInsets.all(7),
|
||||||
color: Color(0xFF1B1010),
|
child: Image.asset(
|
||||||
size: 30,
|
'assets/ui/generated/actions/action_fire_badge.webp',
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
filterQuality: FilterQuality.medium,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1185,10 +1194,12 @@ class _DeltaFuegoPremium extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
const Icon(
|
Image.asset(
|
||||||
Icons.local_fire_department,
|
'assets/ui/generated/actions/action_fire_badge.webp',
|
||||||
color: TemaApp.colorNaranja,
|
width: 26,
|
||||||
size: 24,
|
height: 26,
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
filterQuality: FilterQuality.medium,
|
||||||
),
|
),
|
||||||
const SizedBox(width: 4),
|
const SizedBox(width: 4),
|
||||||
Text(
|
Text(
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
name: farolero
|
name: farolero
|
||||||
description: "Farolero — Juego de deducción social. ¿Quién finge saber?"
|
description: "Farolero — Juego de deducción social. ¿Quién finge saber?"
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
version: 1.1.39+44
|
version: 1.1.41+46
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.11.1
|
sdk: ^3.11.1
|
||||||
@@ -47,3 +47,5 @@ flutter:
|
|||||||
- assets/ui/generated/final_rewards/
|
- assets/ui/generated/final_rewards/
|
||||||
- assets/ui/generated/gameplay/
|
- assets/ui/generated/gameplay/
|
||||||
- assets/ui/generated/meta/
|
- assets/ui/generated/meta/
|
||||||
|
- assets/ui/generated/actions/
|
||||||
|
- assets/ui/generated/icons/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 223 KiB |
|
After Width: | Height: | Size: 430 KiB |
|
After Width: | Height: | Size: 427 KiB |
|
After Width: | Height: | Size: 385 KiB |
@@ -0,0 +1,133 @@
|
|||||||
|
"Path","SizeKB","Refs"
|
||||||
|
"assets/app_icon/farolero_app_icon.png","1580,7","0"
|
||||||
|
"assets/avatars/avatar_02.png","103,9","1"
|
||||||
|
"assets/avatars/avatar_03.png","106,1","1"
|
||||||
|
"assets/avatars/avatar_04.png","94,6","1"
|
||||||
|
"assets/avatars/avatar_05.png","108,7","1"
|
||||||
|
"assets/avatars/avatar_06.png","106,7","1"
|
||||||
|
"assets/avatars/avatar_07.png","105,3","1"
|
||||||
|
"assets/avatars/avatar_08.png","106","1"
|
||||||
|
"assets/avatars/avatar_09.png","101,1","1"
|
||||||
|
"assets/avatars/avatar_10.png","113,7","1"
|
||||||
|
"assets/avatars/avatar_11.png","103,7","1"
|
||||||
|
"assets/avatars/avatar_12.png","109,1","1"
|
||||||
|
"assets/avatars/avatar_13.png","109,3","1"
|
||||||
|
"assets/avatars/avatar_14.png","109,9","1"
|
||||||
|
"assets/avatars/avatar_15.png","112,9","1"
|
||||||
|
"assets/avatars/avatar_16.png","109,3","1"
|
||||||
|
"assets/avatars/avatar_17.png","105,4","1"
|
||||||
|
"assets/avatars/avatar_18.png","105,5","1"
|
||||||
|
"assets/avatars/avatar_19.png","111,5","1"
|
||||||
|
"assets/avatars/avatar_20.png","106,8","1"
|
||||||
|
"assets/avatars/avatar_21.png","106,1","1"
|
||||||
|
"assets/avatars/avatar_22.png","110,5","1"
|
||||||
|
"assets/avatars/avatar_23.png","103,9","1"
|
||||||
|
"assets/avatars/avatar_24.png","108,6","1"
|
||||||
|
"assets/avatars/avatar_25.png","115,7","1"
|
||||||
|
"assets/avatars/avatar_26.png","108,4","1"
|
||||||
|
"assets/avatars/avatar_27.png","114,9","1"
|
||||||
|
"assets/avatars/avatar_28.png","111,8","1"
|
||||||
|
"assets/avatars/avatar_29.png","102,8","1"
|
||||||
|
"assets/avatars/avatar_30.png","103,1","1"
|
||||||
|
"assets/avatars/avatar_31.png","116,6","1"
|
||||||
|
"assets/avatars/avatar_32.png","114,2","1"
|
||||||
|
"assets/avatars/avatar_33.png","117,3","1"
|
||||||
|
"assets/avatars/avatar_34.png","117,8","1"
|
||||||
|
"assets/avatars/avatar_35.png","119,2","1"
|
||||||
|
"assets/avatars/avatar_36.png","121,4","1"
|
||||||
|
"assets/avatars/avatar_37.png","121","1"
|
||||||
|
"assets/avatars/avatar_38.png","123,4","1"
|
||||||
|
"assets/avatars/avatar_39.png","121,8","1"
|
||||||
|
"assets/avatars/avatar_40.png","122,1","1"
|
||||||
|
"assets/avatars/avatar_41.png","124,5","1"
|
||||||
|
"assets/avatars/avatar_42.png","119,9","1"
|
||||||
|
"assets/avatars/avatar_43.png","126,4","1"
|
||||||
|
"assets/avatars/avatar_44.png","124,3","1"
|
||||||
|
"assets/avatars/avatar_45.png","125,3","1"
|
||||||
|
"assets/avatars/avatar_46.png","121,7","1"
|
||||||
|
"assets/avatars/avatar_47.png","115,9","1"
|
||||||
|
"assets/avatars/avatar_48.png","115,3","1"
|
||||||
|
"assets/avatars/avatar_49.png","113,2","1"
|
||||||
|
"assets/avatars/avatar_50.png","106,8","1"
|
||||||
|
"assets/avatars/avatar_51.png","118,7","1"
|
||||||
|
"assets/avatars/avatar_52.png","116","1"
|
||||||
|
"assets/avatars/avatar_53.png","117,6","1"
|
||||||
|
"assets/avatars/avatar_54.png","109,6","1"
|
||||||
|
"assets/avatars/avatar_55.png","119,3","1"
|
||||||
|
"assets/avatars/avatar_56.png","118,2","1"
|
||||||
|
"assets/avatars/avatar_57.png","115,5","1"
|
||||||
|
"assets/avatars/avatar_58.png","108,3","1"
|
||||||
|
"assets/avatars/avatar_59.png","113,6","1"
|
||||||
|
"assets/avatars/avatar_60.png","112,4","1"
|
||||||
|
"assets/avatars/avatar_61.png","112,3","1"
|
||||||
|
"assets/avatars/avatar_62.png","106,8","1"
|
||||||
|
"assets/avatars/avatar_63.png","105,9","1"
|
||||||
|
"assets/avatars/avatar_64.png","108,6","1"
|
||||||
|
"assets/avatars/avatar_65.png","111,9","1"
|
||||||
|
"assets/avatars/avatar_66.png","103,6","1"
|
||||||
|
"assets/avatars/avatar_67.png","115,8","1"
|
||||||
|
"assets/avatars/avatar_68.png","115,3","1"
|
||||||
|
"assets/avatars/avatar_69.png","113,9","1"
|
||||||
|
"assets/avatars/avatar_70.png","105,8","1"
|
||||||
|
"assets/avatars/avatar_71.png","113,6","1"
|
||||||
|
"assets/avatars/avatar_72.png","112,5","1"
|
||||||
|
"assets/avatars/avatar_73.png","114,4","1"
|
||||||
|
"assets/avatars/avatar_74.png","107,5","1"
|
||||||
|
"assets/avatars/avatar_75.png","111,4","1"
|
||||||
|
"assets/avatars/avatar_76.png","111,7","1"
|
||||||
|
"assets/avatars/avatar_77.png","113,5","1"
|
||||||
|
"assets/avatars/avatar_78.png","105,9","1"
|
||||||
|
"assets/avatars/avatar_79.png","108","1"
|
||||||
|
"assets/avatars/avatar_80.png","104,6","1"
|
||||||
|
"assets/avatars/avatar_81.png","105,7","1"
|
||||||
|
"assets/avatars/avatar_82.png","113,1","1"
|
||||||
|
"assets/avatars/avatar_83.png","110,8","1"
|
||||||
|
"assets/avatars/avatar_84.png","104,7","1"
|
||||||
|
"assets/medals/brasa.webp","22,9","1"
|
||||||
|
"assets/medals/cincuenta_victorias.webp","25,3","1"
|
||||||
|
"assets/medals/diez_victorias.webp","20,5","1"
|
||||||
|
"assets/medals/habitual.webp","25,7","1"
|
||||||
|
"assets/medals/impostor_habitual.webp","25","1"
|
||||||
|
"assets/medals/incandescente.webp","27","1"
|
||||||
|
"assets/medals/leyenda.webp","27,7","1"
|
||||||
|
"assets/medals/llama_fuerte.webp","24,2","1"
|
||||||
|
"assets/medals/llama_suave.webp","22","1"
|
||||||
|
"assets/medals/lobo_faroles.webp","24,6","1"
|
||||||
|
"assets/medals/novato.webp","20,9","1"
|
||||||
|
"assets/medals/primer_engano.webp","23,2","1"
|
||||||
|
"assets/medals/primera_victoria.webp","18,1","1"
|
||||||
|
"assets/medals/veinticinco_victorias.webp","24","1"
|
||||||
|
"assets/medals/veterano.webp","26,9","1"
|
||||||
|
"assets/ui/generated/actions/action_category_cards.webp","10,1","1"
|
||||||
|
"assets/ui/generated/actions/action_history_ledger.webp","8,8","1"
|
||||||
|
"assets/ui/generated/actions/action_mobile_device.webp","7,5","1"
|
||||||
|
"assets/ui/generated/actions/action_notes_quill.webp","9,8","1"
|
||||||
|
"assets/ui/generated/actions/action_qr_scan.webp","8,5","1"
|
||||||
|
"assets/ui/generated/actions/action_settings_gear.webp","10,8","1"
|
||||||
|
"assets/ui/generated/actions/action_timer_hourglass.webp","8,3","1"
|
||||||
|
"assets/ui/generated/create_game/create_game_header_art.webp","122,5","1"
|
||||||
|
"assets/ui/generated/gameplay/notes_strategy_art.webp","126,4","1"
|
||||||
|
"assets/ui/generated/join_lobby/qr_frame.webp","113,2","1"
|
||||||
|
"assets/ui/generated/main/main_atmosphere_bg.webp","89,1","1"
|
||||||
|
"assets/ui/generated/meta/history_ledger_art.webp","130,9","1"
|
||||||
|
"assets/ui/generated/meta/settings_profile_art.webp","124,2","1"
|
||||||
|
"assets/ui/generated/mode/mode_duel_hero.webp","84,7","1"
|
||||||
|
"assets/ui/generated/shared/screen_atmosphere_bg.webp","143,1","1"
|
||||||
|
"assets/avatars/avatar_01.png","90,4","2"
|
||||||
|
"assets/rewards/medal_unlock_burst.webp","185,8","2"
|
||||||
|
"assets/ui/generated/actions/action_add_player.webp","8,2","2"
|
||||||
|
"assets/ui/generated/final_rewards/cinematic_burst.webp","178,6","2"
|
||||||
|
"assets/ui/generated/gameplay/gameplay_phase_emblem.webp","113,2","2"
|
||||||
|
"assets/ui/generated/join_lobby/signal_art.webp","129,3","2"
|
||||||
|
"assets/ui/generated/main/main_lantern_hero.webp","69,4","2"
|
||||||
|
"assets/ui/generated/actions/action_create_game.webp","8,6","3"
|
||||||
|
"assets/ui/generated/actions/action_join_search.webp","8,2","3"
|
||||||
|
"assets/ui/generated/actions/action_multidevice_signal.webp","9,8","3"
|
||||||
|
"assets/ui/generated/actions/action_players_group.webp","9","3"
|
||||||
|
"assets/ui/generated/meta/result_verdict_art.webp","129,1","3"
|
||||||
|
"assets/ui/generated/actions/action_fire_badge.webp","8,1","5"
|
||||||
|
"assets/ui/generated/actions/action_rules_book.webp","7,2","5"
|
||||||
|
"assets/ui/generated/actions/action_impostor_mask.webp","8,1","6"
|
||||||
|
"assets/ui/generated/actions/action_result_trophy.webp","12,2","6"
|
||||||
|
"assets/ui/generated/actions/action_reveal_word.webp","9,3","7"
|
||||||
|
"assets/ui/generated/actions/action_vote_mask.webp","8,6","7"
|
||||||
|
|
After Width: | Height: | Size: 245 KiB |
@@ -0,0 +1,187 @@
|
|||||||
|
"Icon","File","Line","Text"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_adivinanza.dart","73","icono: Icons.theater_comedy,"
|
||||||
|
"Icons.search","lib\pantallas\pantalla_adivinanza.dart","102","prefixIcon: const Icon(Icons.search),"
|
||||||
|
"Icons.skip_next","lib\pantallas\pantalla_adivinanza.dart","116","icono: Icons.skip_next,"
|
||||||
|
"Icons.send","lib\pantallas\pantalla_adivinanza.dart","125","icono: Icons.send,"
|
||||||
|
"Icons.celebration","lib\pantallas\pantalla_adivinanza.dart","147","acierto ? Icons.celebration : Icons.cancel,"
|
||||||
|
"Icons.cancel","lib\pantallas\pantalla_adivinanza.dart","147","acierto ? Icons.celebration : Icons.cancel,"
|
||||||
|
"Icons.emoji_events","lib\pantallas\pantalla_adivinanza.dart","177","icono: acierto ? Icons.emoji_events : Icons.skip_next,"
|
||||||
|
"Icons.skip_next","lib\pantallas\pantalla_adivinanza.dart","177","icono: acierto ? Icons.emoji_events : Icons.skip_next,"
|
||||||
|
"Icons.check_circle","lib\pantallas\pantalla_ajustes.dart","138","? const Icon(Icons.check_circle, color: TemaApp.colorAcento)"
|
||||||
|
"Icons.person","lib\pantallas\pantalla_ajustes.dart","175","prefixIcon: const Icon(Icons.person),"
|
||||||
|
"Icons.alternate_email","lib\pantallas\pantalla_ajustes.dart","183","prefixIcon: const Icon(Icons.alternate_email),"
|
||||||
|
"Icons.phone_android","lib\pantallas\pantalla_crear_partida.dart","356","icon: const Icon(Icons.phone_android),"
|
||||||
|
"Icons.devices","lib\pantallas\pantalla_crear_partida.dart","361","icon: const Icon(Icons.devices),"
|
||||||
|
"Icons.devices","lib\pantallas\pantalla_crear_partida.dart","386","_modoMultimovil ? Icons.devices : Icons.phone_android,"
|
||||||
|
"Icons.phone_android","lib\pantallas\pantalla_crear_partida.dart","386","_modoMultimovil ? Icons.devices : Icons.phone_android,"
|
||||||
|
"Icons.add","lib\pantallas\pantalla_crear_partida.dart","493","icon: const Icon(Icons.add),"
|
||||||
|
"Icons.lock","lib\pantallas\pantalla_crear_partida.dart","532","? const Icon(Icons.lock, color: TemaApp.colorDorado)"
|
||||||
|
"Icons.close","lib\pantallas\pantalla_crear_partida.dart","535","Icons.close,"
|
||||||
|
"Icons.remove_circle_outline","lib\pantallas\pantalla_crear_partida.dart","573","icon: const Icon(Icons.remove_circle_outline),"
|
||||||
|
"Icons.add_circle_outline","lib\pantallas\pantalla_crear_partida.dart","583","icon: const Icon(Icons.add_circle_outline),"
|
||||||
|
"Icons.play_arrow","lib\pantallas\pantalla_crear_partida.dart","626","icono: Icons.play_arrow,"
|
||||||
|
"Icons.forum","lib\pantallas\pantalla_debate.dart","94","icono: Icons.forum,"
|
||||||
|
"Icons.person_off","lib\pantallas\pantalla_debate.dart","110","icono: jugador.eliminado ? Icons.person_off : Icons.record_voice_over,"
|
||||||
|
"Icons.record_voice_over","lib\pantallas\pantalla_debate.dart","110","icono: jugador.eliminado ? Icons.person_off : Icons.record_voice_over,"
|
||||||
|
"Icons.edit_note","lib\pantallas\pantalla_debate.dart","126","icono: Icons.edit_note,"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_debate.dart","141","icono: Icons.how_to_vote,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_debate_cliente.dart","130","icon: const Icon(Icons.visibility),"
|
||||||
|
"Icons.edit_note","lib\pantallas\pantalla_debate_cliente.dart","141","icon: const Icon(Icons.edit_note),"
|
||||||
|
"Icons.forum","lib\pantallas\pantalla_debate_cliente.dart","168","icono: Icons.forum,"
|
||||||
|
"Icons.record_voice_over","lib\pantallas\pantalla_debate_cliente.dart","198","icono: Icons.record_voice_over,"
|
||||||
|
"Icons.hourglass_empty","lib\pantallas\pantalla_debate_cliente.dart","208","? Icons.hourglass_empty"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_debate_cliente.dart","209",": Icons.how_to_vote,"
|
||||||
|
"Icons.emoji_events","lib\pantallas\pantalla_fin_partida.dart","122","? Icons.emoji_events"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_fin_partida.dart","123",": Icons.theater_comedy,"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_fin_partida.dart","343","if (icono != Icons.theater_comedy) {"
|
||||||
|
"Icons.mood","lib\pantallas\pantalla_fin_partida.dart","355","Icons.mood,"
|
||||||
|
"Icons.sentiment_dissatisfied","lib\pantallas\pantalla_fin_partida.dart","366","Icons.sentiment_dissatisfied,"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_fin_partida.dart","849","const Icon(Icons.theater_comedy, color: TemaApp.colorAcento),"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_fin_partida.dart","870","const Icon(Icons.theater_comedy,"
|
||||||
|
"Icons.close","lib\pantallas\pantalla_fin_partida.dart","882","const Icon(Icons.close,"
|
||||||
|
"Icons.replay","lib\pantallas\pantalla_fin_partida.dart","960","icono: Icons.replay,"
|
||||||
|
"Icons.home","lib\pantallas\pantalla_fin_partida.dart","973","icono: Icons.home,"
|
||||||
|
"Icons.emoji_events","lib\pantallas\pantalla_fin_partida_online.dart","132","? Icons.emoji_events"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_fin_partida_online.dart","133",": Icons.theater_comedy,"
|
||||||
|
"Icons.home","lib\pantallas\pantalla_fin_partida_online.dart","166","icono: Icons.home,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_fin_partida_online.dart","199","icon: const Icon(Icons.visibility),"
|
||||||
|
"Icons.edit_note","lib\pantallas\pantalla_fin_partida_online.dart","210","icon: const Icon(Icons.edit_note),"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_gestor_host.dart","166","icon: const Icon(Icons.visibility),"
|
||||||
|
"Icons.edit_note","lib\pantallas\pantalla_gestor_host.dart","182","icon: const Icon(Icons.edit_note),"
|
||||||
|
"Icons.close","lib\pantallas\pantalla_gestor_host.dart","201","icon: const Icon(Icons.close),"
|
||||||
|
"Icons.link_off","lib\pantallas\pantalla_gestor_host.dart","266","const Icon(Icons.link_off, color: TemaApp.colorAcento),"
|
||||||
|
"Icons.person_add_alt_1","lib\pantallas\pantalla_gestor_host.dart","288","icono: Icons.person_add_alt_1,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_gestor_host.dart","414","icono: Icons.visibility,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_gestor_host.dart","431","icono: Icons.visibility,"
|
||||||
|
"Icons.check_circle","lib\pantallas\pantalla_gestor_host.dart","440","icono: Icons.check_circle,"
|
||||||
|
"Icons.forum","lib\pantallas\pantalla_gestor_host.dart","543","icono: Icons.forum,"
|
||||||
|
"Icons.record_voice_over","lib\pantallas\pantalla_gestor_host.dart","586","const Icon(Icons.record_voice_over, color: TemaApp.colorNaranja),"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_gestor_host.dart","611","icono: Icons.how_to_vote,"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_gestor_host.dart","632","icono: Icons.how_to_vote,"
|
||||||
|
"Icons.check_circle","lib\pantallas\pantalla_gestor_host.dart","644","icono: Icons.check_circle,"
|
||||||
|
"Icons.psychology","lib\pantallas\pantalla_gestor_host.dart","675","icono: Icons.psychology,"
|
||||||
|
"Icons.emoji_events","lib\pantallas\pantalla_gestor_host.dart","701","icono: ganaronJugadores ? Icons.emoji_events : Icons.theater_comedy,"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_gestor_host.dart","701","icono: ganaronJugadores ? Icons.emoji_events : Icons.theater_comedy,"
|
||||||
|
"Icons.phone_android","lib\pantallas\pantalla_gestor_host.dart","791","icono: esHost ? Icons.phone_android : Icons.devices,"
|
||||||
|
"Icons.devices","lib\pantallas\pantalla_gestor_host.dart","791","icono: esHost ? Icons.phone_android : Icons.devices,"
|
||||||
|
"Icons.forum","lib\pantallas\pantalla_gestor_host.dart","807","icono: Icons.forum,"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_gestor_host.dart","814","icono: Icons.how_to_vote,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_gestor_host.dart","821","icono: Icons.visibility,"
|
||||||
|
"Icons.home","lib\pantallas\pantalla_gestor_host.dart","832","icono: Icons.home,"
|
||||||
|
"Icons.emoji_events","lib\pantallas\pantalla_gestor_host.dart","855","icono: Icons.emoji_events,"
|
||||||
|
"Icons.psychology","lib\pantallas\pantalla_gestor_host.dart","866","icono: Icons.psychology,"
|
||||||
|
"Icons.skip_next","lib\pantallas\pantalla_gestor_host.dart","873","icono: Icons.skip_next,"
|
||||||
|
"Icons.skip_next","lib\pantallas\pantalla_gestor_host.dart","882","icono: Icons.skip_next,"
|
||||||
|
"Icons.check_circle","lib\pantallas\pantalla_gestor_host.dart","892","icono: Icons.check_circle,"
|
||||||
|
"Icons.skip_next","lib\pantallas\pantalla_gestor_host.dart","899","icono: Icons.skip_next,"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_gestor_host.dart","1098","? Icons.theater_comedy"
|
||||||
|
"Icons.key","lib\pantallas\pantalla_gestor_host.dart","1099",": Icons.key,"
|
||||||
|
"Icons.lock","lib\pantallas\pantalla_gestor_host.dart","1139","Icons.lock,"
|
||||||
|
"Icons.check","lib\pantallas\pantalla_gestor_host.dart","1190","icono: Icons.check,"
|
||||||
|
"Icons.history_rounded","lib\pantallas\pantalla_historial.dart","32","icono: Icons.history_rounded,"
|
||||||
|
"Icons.groups_rounded","lib\pantallas\pantalla_historial.dart","74","? Icons.groups_rounded"
|
||||||
|
"Icons.theater_comedy_rounded","lib\pantallas\pantalla_historial.dart","75",": Icons.theater_comedy_rounded,"
|
||||||
|
"Icons.close","lib\pantallas\pantalla_lobby_host.dart","43","icon: const Icon(Icons.close),"
|
||||||
|
"Icons.wifi_tethering","lib\pantallas\pantalla_lobby_host.dart","65","icono: Icons.wifi_tethering,"
|
||||||
|
"Icons.person_add","lib\pantallas\pantalla_lobby_host.dart","151","icon: const Icon(Icons.person_add),"
|
||||||
|
"Icons.play_arrow","lib\pantallas\pantalla_lobby_host.dart","189","icono: Icons.play_arrow,"
|
||||||
|
"Icons.groups","lib\pantallas\pantalla_lobby_host.dart","219","icon: Icons.groups,"
|
||||||
|
"Icons.devices","lib\pantallas\pantalla_lobby_host.dart","229","icon: Icons.devices,"
|
||||||
|
"Icons.close","lib\pantallas\pantalla_lobby_host.dart","333","icon: const Icon(Icons.close),"
|
||||||
|
"Icons.check_circle_outline","lib\pantallas\pantalla_lobby_host.dart","339","icon: const Icon(Icons.check_circle_outline),"
|
||||||
|
"Icons.delete_outline","lib\pantallas\pantalla_lobby_host.dart","345","icon: const Icon(Icons.delete_outline, color: TemaApp.colorAcento),"
|
||||||
|
"Icons.person","lib\pantallas\pantalla_lobby_host.dart","384","prefixIcon: const Icon(Icons.person),"
|
||||||
|
"Icons.save","lib\pantallas\pantalla_notas.dart","78","icon: const Icon(Icons.save),"
|
||||||
|
"Icons.arrow_forward_ios","lib\pantallas\pantalla_notas.dart","132","trailing: const Icon(Icons.arrow_forward_ios, size: 16),"
|
||||||
|
"Icons.arrow_back","lib\pantallas\pantalla_notas.dart","169","icon: const Icon(Icons.arrow_back),"
|
||||||
|
"Icons.person","lib\pantallas\pantalla_notas.dart","205","prefixIcon: const Icon(Icons.person, size: 20),"
|
||||||
|
"Icons.note","lib\pantallas\pantalla_notas.dart","226","prefixIcon: const Icon(Icons.note, size: 20),"
|
||||||
|
"Icons.save","lib\pantallas\pantalla_notas_online.dart","108","icon: const Icon(Icons.save),"
|
||||||
|
"Icons.edit_note","lib\pantallas\pantalla_notas_online.dart","146","leading: const Icon(Icons.edit_note),"
|
||||||
|
"Icons.arrow_back","lib\pantallas\pantalla_notas_online.dart","176","icon: const Icon(Icons.arrow_back),"
|
||||||
|
"Icons.person","lib\pantallas\pantalla_notas_online.dart","208","prefixIcon: const Icon(Icons.person, size: 20),"
|
||||||
|
"Icons.note","lib\pantallas\pantalla_notas_online.dart","228","prefixIcon: const Icon(Icons.note, size: 20),"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_palabras_cliente.dart","93","_visible ? Icons.visibility : Icons.visibility_off,"
|
||||||
|
"Icons.visibility_off","lib\pantallas\pantalla_palabras_cliente.dart","93","_visible ? Icons.visibility : Icons.visibility_off,"
|
||||||
|
"Icons.check","lib\pantallas\pantalla_palabras_cliente.dart","137","icono: _esUltimo ? Icons.check : Icons.arrow_forward,"
|
||||||
|
"Icons.arrow_forward","lib\pantallas\pantalla_palabras_cliente.dart","137","icono: _esUltimo ? Icons.check : Icons.arrow_forward,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_palabra_cliente.dart","90","_palabraVisible ? Icons.visibility : Icons.visibility_off,"
|
||||||
|
"Icons.visibility_off","lib\pantallas\pantalla_palabra_cliente.dart","90","_palabraVisible ? Icons.visibility : Icons.visibility_off,"
|
||||||
|
"Icons.lightbulb","lib\pantallas\pantalla_palabra_cliente.dart","137","const Icon(Icons.lightbulb, color: TemaApp.colorAcento),"
|
||||||
|
"Icons.check","lib\pantallas\pantalla_palabra_cliente.dart","172","icono: Icons.check,"
|
||||||
|
"Icons.play_arrow_rounded","lib\pantallas\pantalla_principal.dart","104","icono: Icons.play_arrow_rounded,"
|
||||||
|
"Icons.bolt_rounded","lib\pantallas\pantalla_principal.dart","117","icono: Icons.bolt_rounded,"
|
||||||
|
"Icons.question_mark_rounded","lib\pantallas\pantalla_principal.dart","128","icono: Icons.question_mark_rounded,"
|
||||||
|
"Icons.settings_rounded","lib\pantallas\pantalla_principal.dart","264","icon: const Icon(Icons.settings_rounded),"
|
||||||
|
"Icons.history_rounded","lib\pantallas\pantalla_principal.dart","509","const Icon(Icons.history_rounded, color: TemaApp.colorNaranja),"
|
||||||
|
"Icons.menu_book_rounded","lib\pantallas\pantalla_reglas.dart","30","icono: Icons.menu_book_rounded,"
|
||||||
|
"Icons.person_search","lib\pantallas\pantalla_reglas.dart","35","_seccion(context, 1, Icons.person_search, l10n.rulesWhatIsTitle, l10n.rulesWhatIsBody),"
|
||||||
|
"Icons.chat_bubble","lib\pantallas\pantalla_reglas.dart","36","_seccion(context, 2, Icons.chat_bubble, l10n.rulesHowToPlayTitle, l10n.rulesHowToPlayBody),"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_reglas.dart","37","_seccion(context, 3, Icons.how_to_vote, l10n.rulesWhoWinsTitle, l10n.rulesWhoWinsBody),"
|
||||||
|
"Icons.lightbulb","lib\pantallas\pantalla_reglas.dart","38","_seccion(context, 4, Icons.lightbulb, l10n.rulesTipsPlayersTitle, l10n.rulesTipsPlayersBody),"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_reglas.dart","39","_seccion(context, 5, Icons.theater_comedy, l10n.rulesTipsImpostorTitle, l10n.rulesTipsImpostorBody),"
|
||||||
|
"Icons.devices","lib\pantallas\pantalla_reglas.dart","40","_seccion(context, 6, Icons.devices, l10n.rulesModesTitle, l10n.rulesModesBody),"
|
||||||
|
"Icons.emoji_events","lib\pantallas\pantalla_resultado.dart","115","icono: Icons.emoji_events,"
|
||||||
|
"Icons.gps_fixed","lib\pantallas\pantalla_resultado.dart","130","icono: Icons.gps_fixed,"
|
||||||
|
"Icons.skip_next","lib\pantallas\pantalla_resultado.dart","143","icono: Icons.skip_next,"
|
||||||
|
"Icons.skip_next","lib\pantallas\pantalla_resultado.dart","152","icono: Icons.skip_next,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_resultado_online.dart","194","icon: const Icon(Icons.visibility),"
|
||||||
|
"Icons.edit_note","lib\pantallas\pantalla_resultado_online.dart","205","icon: const Icon(Icons.edit_note),"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_revision_palabra.dart","34","icono: Icons.visibility,"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_revision_palabra.dart","94","jugador.esImpostor ? Icons.theater_comedy : Icons.key,"
|
||||||
|
"Icons.key","lib\pantallas\pantalla_revision_palabra.dart","94","jugador.esImpostor ? Icons.theater_comedy : Icons.key,"
|
||||||
|
"Icons.check","lib\pantallas\pantalla_revision_palabra.dart","123","icono: Icons.check,"
|
||||||
|
"Icons.phone_android_rounded","lib\pantallas\pantalla_seleccion_modo_juego.dart","36","icono: Icons.phone_android_rounded,"
|
||||||
|
"Icons.devices_rounded","lib\pantallas\pantalla_seleccion_modo_juego.dart","52","icono: Icons.devices_rounded,"
|
||||||
|
"Icons.chevron_right_rounded","lib\pantallas\pantalla_seleccion_modo_juego.dart","231","Icon(Icons.chevron_right_rounded, color: color, size: 30),"
|
||||||
|
"Icons.bluetooth_searching","lib\pantallas\pantalla_unirse.dart","459","icono: Icons.bluetooth_searching,"
|
||||||
|
"Icons.person","lib\pantallas\pantalla_unirse.dart","470","prefixIcon: const Icon(Icons.person),"
|
||||||
|
"Icons.search","lib\pantallas\pantalla_unirse.dart","482","icono: Icons.search,"
|
||||||
|
"Icons.arrow_back","lib\pantallas\pantalla_unirse.dart","512","icon: const Icon(Icons.arrow_back),"
|
||||||
|
"Icons.sync","lib\pantallas\pantalla_unirse.dart","531","icono: _conectando ? Icons.sync : Icons.radar,"
|
||||||
|
"Icons.radar","lib\pantallas\pantalla_unirse.dart","531","icono: _conectando ? Icons.sync : Icons.radar,"
|
||||||
|
"Icons.radar","lib\pantallas\pantalla_unirse.dart","558","icono: Icons.radar,"
|
||||||
|
"Icons.qr_code_scanner","lib\pantallas\pantalla_unirse.dart","593","icono: Icons.qr_code_scanner,"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_unirse.dart","629","Icons.theater_comedy,"
|
||||||
|
"Icons.arrow_forward_ios","lib\pantallas\pantalla_unirse.dart","650","Icons.arrow_forward_ios,"
|
||||||
|
"Icons.arrow_back","lib\pantallas\pantalla_unirse.dart","670","icon: const Icon(Icons.arrow_back),"
|
||||||
|
"Icons.close","lib\pantallas\pantalla_unirse.dart","717","icon: const Icon(Icons.close),"
|
||||||
|
"Icons.check_circle","lib\pantallas\pantalla_unirse.dart","740","icono: Icons.check_circle,"
|
||||||
|
"Icons.add","lib\pantallas\pantalla_unirse.dart","777","Icons.add,"
|
||||||
|
"Icons.person_add","lib\pantallas\pantalla_unirse.dart","795","icon: const Icon(Icons.person_add),"
|
||||||
|
"Icons.person","lib\pantallas\pantalla_unirse.dart","826","prefixIcon: const Icon(Icons.person),"
|
||||||
|
"Icons.close","lib\pantallas\pantalla_unirse.dart","905","icon: const Icon(Icons.close),"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_ver_palabra.dart","44","icono: Icons.visibility,"
|
||||||
|
"Icons.check_circle","lib\pantallas\pantalla_ver_palabra.dart","60","icono: haVisto ? Icons.check_circle : Icons.visibility,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_ver_palabra.dart","60","icono: haVisto ? Icons.check_circle : Icons.visibility,"
|
||||||
|
"Icons.forum","lib\pantallas\pantalla_ver_palabra.dart","74","icono: Icons.forum,"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_ver_palabra.dart","159","icono: widget.esImpostor ? Icons.theater_comedy : Icons.search,"
|
||||||
|
"Icons.search","lib\pantallas\pantalla_ver_palabra.dart","159","icono: widget.esImpostor ? Icons.theater_comedy : Icons.search,"
|
||||||
|
"Icons.theater_comedy","lib\pantallas\pantalla_ver_palabra.dart","178","widget.esImpostor ? Icons.theater_comedy : Icons.search,"
|
||||||
|
"Icons.search","lib\pantallas\pantalla_ver_palabra.dart","178","widget.esImpostor ? Icons.theater_comedy : Icons.search,"
|
||||||
|
"Icons.lock","lib\pantallas\pantalla_ver_palabra.dart","204","const Icon(Icons.lock, color: TemaApp.colorDorado, size: 52),"
|
||||||
|
"Icons.check","lib\pantallas\pantalla_ver_palabra.dart","256","icono: Icons.check,"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_votacion.dart","63","icono: Icons.how_to_vote,"
|
||||||
|
"Icons.person_search","lib\pantallas\pantalla_votacion.dart","81","icono: Icons.person_search,"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_votacion.dart","106","icono: Icons.how_to_vote,"
|
||||||
|
"Icons.check_circle","lib\pantallas\pantalla_votacion.dart","143","icono: Icons.check_circle,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_votacion.dart","153","icono: Icons.visibility,"
|
||||||
|
"Icons.visibility","lib\pantallas\pantalla_votacion_cliente.dart","125","icon: const Icon(Icons.visibility),"
|
||||||
|
"Icons.edit_note","lib\pantallas\pantalla_votacion_cliente.dart","136","icon: const Icon(Icons.edit_note),"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_votacion_cliente.dart","162","icono: Icons.how_to_vote,"
|
||||||
|
"Icons.how_to_vote","lib\pantallas\pantalla_votacion_cliente.dart","188","icono: Icons.how_to_vote,"
|
||||||
|
"Icons.lightbulb","lib\tema\componentes_farolero.dart","234","Icons.lightbulb,"
|
||||||
|
"Icons.person","lib\tema\componentes_farolero.dart","475","this.icono = Icons.person,"
|
||||||
|
"Icons.check_circle","lib\tema\componentes_farolero.dart","553","completado ? Icons.check_circle : Icons.hourglass_bottom,"
|
||||||
|
"Icons.hourglass_bottom","lib\tema\componentes_farolero.dart","553","completado ? Icons.check_circle : Icons.hourglass_bottom,"
|
||||||
|
"Icons.check","lib\tema\componentes_farolero.dart","583","icono: seleccionado ? Icons.check : Icons.person_search,"
|
||||||
|
"Icons.person_search","lib\tema\componentes_farolero.dart","583","icono: seleccionado ? Icons.check : Icons.person_search,"
|
||||||
|
"Icons.bar_chart","lib\tema\componentes_resultado_farolero.dart","125","const Icon(Icons.bar_chart, color: TemaApp.colorNaranja),"
|
||||||
|
"Icons.how_to_vote","lib\tema\componentes_resultado_farolero.dart","157","fueAlEliminado ? Icons.how_to_vote : Icons.arrow_forward,"
|
||||||
|
"Icons.arrow_forward","lib\tema\componentes_resultado_farolero.dart","157","fueAlEliminado ? Icons.how_to_vote : Icons.arrow_forward,"
|
||||||
|
"Icons.theater_comedy","lib\tema\componentes_resultado_farolero.dart","373","if (icono != Icons.theater_comedy) {"
|
||||||
|
"Icons.mood","lib\tema\componentes_resultado_farolero.dart","384","Icons.mood,"
|
||||||
|
"Icons.sentiment_dissatisfied","lib\tema\componentes_resultado_farolero.dart","395","Icons.sentiment_dissatisfied,"
|
||||||
|
"Icons.theater_comedy","lib\tema\componentes_resultado_farolero.dart","807","const Icon(Icons.theater_comedy, color: TemaApp.colorAcento),"
|
||||||
|
"Icons.theater_comedy","lib\tema\componentes_resultado_farolero.dart","829","Icons.theater_comedy,"
|
||||||
|
"Icons.close","lib\tema\componentes_resultado_farolero.dart","847","Icons.close,"
|
||||||
|