Compare commits
6 Commits
5697c2a5a1
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 553456836f | |||
| cee8c7c2ce | |||
| 8f78652ac6 | |||
| bb4359656f | |||
| 90ada9099f | |||
| 158a7ae6a8 |
@@ -0,0 +1 @@
|
|||||||
|
CYSATD23LTB4SAAAAAAAAAAAAA
|
||||||
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 22 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 |
@@ -99,7 +99,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
|
|||||||
controller: _controlador,
|
controller: _controlador,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: l10n.guessWordHint,
|
hintText: l10n.guessWordHint,
|
||||||
prefixIcon: const Icon(Icons.search),
|
prefixIcon: IconoFarolero(Icons.search),
|
||||||
),
|
),
|
||||||
textCapitalization: TextCapitalization.sentences,
|
textCapitalization: TextCapitalization.sentences,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
@@ -143,7 +143,7 @@ class _PantallaAdivinanzaState extends State<PantallaAdivinanza> {
|
|||||||
color: color.withValues(alpha: 0.18),
|
color: color.withValues(alpha: 0.18),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
IconoFarolero(
|
||||||
acierto ? Icons.celebration : Icons.cancel,
|
acierto ? Icons.celebration : Icons.cancel,
|
||||||
color: color,
|
color: color,
|
||||||
size: 52,
|
size: 52,
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ class _PantallaAjustesState extends State<PantallaAjustes> {
|
|||||||
leading: Text(bandera, style: const TextStyle(fontSize: 24)),
|
leading: Text(bandera, style: const TextStyle(fontSize: 24)),
|
||||||
title: Text(nombre),
|
title: Text(nombre),
|
||||||
trailing: seleccionado
|
trailing: seleccionado
|
||||||
? const Icon(Icons.check_circle, color: TemaApp.colorAcento)
|
? IconoFarolero(Icons.check_circle, color: TemaApp.colorAcento)
|
||||||
: null,
|
: null,
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
dense: true,
|
dense: true,
|
||||||
@@ -172,7 +172,7 @@ class _PantallaAjustesState extends State<PantallaAjustes> {
|
|||||||
onChanged: (_) => setDialogState(() {}),
|
onChanged: (_) => setDialogState(() {}),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: l10n.profileName,
|
labelText: l10n.profileName,
|
||||||
prefixIcon: const Icon(Icons.person),
|
prefixIcon: IconoFarolero(Icons.person),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
@@ -180,7 +180,7 @@ class _PantallaAjustesState extends State<PantallaAjustes> {
|
|||||||
controller: nickController,
|
controller: nickController,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: l10n.profileNick,
|
labelText: l10n.profileNick,
|
||||||
prefixIcon: const Icon(Icons.alternate_email),
|
prefixIcon: IconoFarolero(Icons.alternate_email),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 18),
|
const SizedBox(height: 18),
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
@@ -416,7 +416,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
child: DropdownButtonFormField<String>(
|
child: DropdownButtonFormField<String>(
|
||||||
initialValue: _categoria,
|
initialValue: _categoria,
|
||||||
decoration: const InputDecoration(
|
decoration: InputDecoration(
|
||||||
prefixIcon: Padding(
|
prefixIcon: Padding(
|
||||||
padding: EdgeInsets.all(10),
|
padding: EdgeInsets.all(10),
|
||||||
child: Image.asset(
|
child: Image.asset(
|
||||||
@@ -490,7 +490,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
const SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
IconButton.filled(
|
IconButton.filled(
|
||||||
onPressed: _agregarJugador,
|
onPressed: _agregarJugador,
|
||||||
icon: const Icon(Icons.add),
|
icon: IconoFarolero(Icons.add),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -529,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,
|
||||||
),
|
),
|
||||||
@@ -570,7 +570,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
onPressed: _numImpostores > 1
|
onPressed: _numImpostores > 1
|
||||||
? () => setState(() => _numImpostores--)
|
? () => setState(() => _numImpostores--)
|
||||||
: null,
|
: null,
|
||||||
icon: const Icon(Icons.remove_circle_outline),
|
icon: IconoFarolero(Icons.remove_circle_outline),
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
'$_numImpostores',
|
'$_numImpostores',
|
||||||
@@ -580,7 +580,7 @@ class _PantallaCrearPartidaState extends State<PantallaCrearPartida> {
|
|||||||
onPressed: _numImpostores < _maxImpostores
|
onPressed: _numImpostores < _maxImpostores
|
||||||
? () => setState(() => _numImpostores++)
|
? () => setState(() => _numImpostores++)
|
||||||
: null,
|
: null,
|
||||||
icon: const Icon(Icons.add_circle_outline),
|
icon: IconoFarolero(Icons.add_circle_outline),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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),
|
||||||
@@ -846,7 +846,7 @@ class _TarjetaImpostores extends StatelessWidget {
|
|||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.theater_comedy, color: TemaApp.colorAcento),
|
IconoFarolero(Icons.theater_comedy, color: TemaApp.colorAcento),
|
||||||
const SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
Flexible(
|
Flexible(
|
||||||
child: Text(
|
child: Text(
|
||||||
@@ -867,7 +867,7 @@ class _TarjetaImpostores extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.theater_comedy,
|
IconoFarolero(Icons.theater_comedy,
|
||||||
size: 20, color: TemaApp.colorAcento),
|
size: 20, color: TemaApp.colorAcento),
|
||||||
const SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
Text(
|
Text(
|
||||||
@@ -879,7 +879,7 @@ class _TarjetaImpostores extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
if (j.eliminado) ...[
|
if (j.eliminado) ...[
|
||||||
const SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
const Icon(Icons.close,
|
IconoFarolero(Icons.close,
|
||||||
size: 16, color: TemaApp.colorTextoSecundario),
|
size: 16, color: TemaApp.colorTextoSecundario),
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ class _PantallaFinPartidaOnlineState extends State<PantallaFinPartidaOnline> {
|
|||||||
return [
|
return [
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: l10n.seeYourWord,
|
tooltip: l10n.seeYourWord,
|
||||||
icon: const Icon(Icons.visibility),
|
icon: IconoFarolero(Icons.visibility),
|
||||||
onPressed: widget.jugadoresControlados.isEmpty
|
onPressed: widget.jugadoresControlados.isEmpty
|
||||||
? null
|
? null
|
||||||
: () => mostrarRevisionPalabraOnline(
|
: () => mostrarRevisionPalabraOnline(
|
||||||
@@ -207,7 +207,7 @@ class _PantallaFinPartidaOnlineState extends State<PantallaFinPartidaOnline> {
|
|||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: l10n.notesTitle,
|
tooltip: l10n.notesTitle,
|
||||||
icon: const Icon(Icons.edit_note),
|
icon: IconoFarolero(Icons.edit_note),
|
||||||
onPressed: snapshot.roomId == null || widget.jugadoresControlados.isEmpty
|
onPressed: snapshot.roomId == null || widget.jugadoresControlados.isEmpty
|
||||||
? null
|
? null
|
||||||
: () => Navigator.push(
|
: () => Navigator.push(
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: l10n.seeYourWord,
|
tooltip: l10n.seeYourWord,
|
||||||
icon: const Icon(Icons.visibility),
|
icon: IconoFarolero(Icons.visibility),
|
||||||
onPressed: partida.fase.index <= FaseJuego.verPalabra.index
|
onPressed: partida.fase.index <= FaseJuego.verPalabra.index
|
||||||
? null
|
? null
|
||||||
: () => mostrarRevisionPalabraOnline(
|
: () => mostrarRevisionPalabraOnline(
|
||||||
@@ -179,7 +179,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: l10n.notesTitle,
|
tooltip: l10n.notesTitle,
|
||||||
icon: const Icon(Icons.edit_note),
|
icon: IconoFarolero(Icons.edit_note),
|
||||||
onPressed: partida.fase.index < FaseJuego.debate.index ||
|
onPressed: partida.fase.index < FaseJuego.debate.index ||
|
||||||
nearby.roomId == null
|
nearby.roomId == null
|
||||||
? null
|
? null
|
||||||
@@ -198,7 +198,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: const Icon(Icons.close),
|
icon: IconoFarolero(Icons.close),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await nearby.desconectar();
|
await nearby.desconectar();
|
||||||
widget.onPartidaFin();
|
widget.onPartidaFin();
|
||||||
@@ -263,7 +263,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.link_off, color: TemaApp.colorAcento),
|
IconoFarolero(Icons.link_off, color: TemaApp.colorAcento),
|
||||||
const SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
@@ -583,7 +583,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
|
|||||||
),
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.record_voice_over, color: TemaApp.colorNaranja),
|
IconoFarolero(Icons.record_voice_over, color: TemaApp.colorNaranja),
|
||||||
const SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
@@ -1093,7 +1093,7 @@ class _PantallaRevelarPalabraHostState
|
|||||||
child: _manteniendo
|
child: _manteniendo
|
||||||
? Column(
|
? Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
IconoFarolero(
|
||||||
widget.esImpostor
|
widget.esImpostor
|
||||||
? Icons.theater_comedy
|
? Icons.theater_comedy
|
||||||
: Icons.key,
|
: Icons.key,
|
||||||
@@ -1135,7 +1135,7 @@ class _PantallaRevelarPalabraHostState
|
|||||||
)
|
)
|
||||||
: Column(
|
: Column(
|
||||||
children: [
|
children: [
|
||||||
const Icon(
|
IconoFarolero(
|
||||||
Icons.lock,
|
Icons.lock,
|
||||||
color: TemaApp.colorDorado,
|
color: TemaApp.colorDorado,
|
||||||
size: 48,
|
size: 48,
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class PantallaHistorial extends StatelessWidget {
|
|||||||
color: color.withValues(alpha: 0.18),
|
color: color.withValues(alpha: 0.18),
|
||||||
border: Border.all(color: color),
|
border: Border.all(color: color),
|
||||||
),
|
),
|
||||||
child: Icon(
|
child: IconoFarolero(
|
||||||
ganaronJugadores
|
ganaronJugadores
|
||||||
? Icons.groups_rounded
|
? Icons.groups_rounded
|
||||||
: Icons.theater_comedy_rounded,
|
: Icons.theater_comedy_rounded,
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(widget.nombreSala),
|
title: Text(widget.nombreSala),
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: const Icon(Icons.close),
|
icon: IconoFarolero(Icons.close),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await nearby.desconectar();
|
await nearby.desconectar();
|
||||||
if (context.mounted) Navigator.pop(context);
|
if (context.mounted) Navigator.pop(context);
|
||||||
@@ -148,7 +148,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
|
|||||||
),
|
),
|
||||||
IconButton.filledTonal(
|
IconButton.filledTonal(
|
||||||
onPressed: () => _crearNuevoUsuario(context),
|
onPressed: () => _crearNuevoUsuario(context),
|
||||||
icon: const Icon(Icons.person_add),
|
icon: IconoFarolero(Icons.person_add),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -254,7 +254,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
|
|||||||
),
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Icon(icon, color: color, size: 26),
|
IconoFarolero(icon, color: color, size: 26),
|
||||||
const SizedBox(width: 10),
|
const SizedBox(width: 10),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
@@ -330,19 +330,19 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
|
|||||||
if (seleccionadoPorMi)
|
if (seleccionadoPorMi)
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: l10n.release,
|
tooltip: l10n.release,
|
||||||
icon: const Icon(Icons.close),
|
icon: IconoFarolero(Icons.close),
|
||||||
onPressed: () => nearby.liberarUsuarioSala(usuario.id),
|
onPressed: () => nearby.liberarUsuarioSala(usuario.id),
|
||||||
)
|
)
|
||||||
else if (!seleccionadoPorOtro)
|
else if (!seleccionadoPorOtro)
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: l10n.select,
|
tooltip: l10n.select,
|
||||||
icon: const Icon(Icons.check_circle_outline),
|
icon: IconoFarolero(Icons.check_circle_outline),
|
||||||
onPressed: () => nearby.seleccionarUsuarioSala(usuario.id),
|
onPressed: () => nearby.seleccionarUsuarioSala(usuario.id),
|
||||||
),
|
),
|
||||||
if (!usuario.estaSeleccionado)
|
if (!usuario.estaSeleccionado)
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: l10n.delete,
|
tooltip: l10n.delete,
|
||||||
icon: const Icon(Icons.delete_outline, color: TemaApp.colorAcento),
|
icon: IconoFarolero(Icons.delete_outline, color: TemaApp.colorAcento),
|
||||||
onPressed: () => nearby.eliminarUsuarioSala(usuario.id),
|
onPressed: () => nearby.eliminarUsuarioSala(usuario.id),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -381,7 +381,7 @@ class _PantallaLobbyHostState extends State<PantallaLobbyHost> {
|
|||||||
textCapitalization: TextCapitalization.words,
|
textCapitalization: TextCapitalization.words,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: l10n.yourName,
|
hintText: l10n.yourName,
|
||||||
prefixIcon: const Icon(Icons.person),
|
prefixIcon: IconoFarolero(Icons.person),
|
||||||
),
|
),
|
||||||
onSubmitted: (v) => Navigator.pop(ctx, v),
|
onSubmitted: (v) => Navigator.pop(ctx, v),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -467,7 +467,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
controller: _nombreController,
|
controller: _nombreController,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: l10n.yourName,
|
labelText: l10n.yourName,
|
||||||
prefixIcon: const Icon(Icons.person),
|
prefixIcon: IconoFarolero(Icons.person),
|
||||||
),
|
),
|
||||||
validator: (v) {
|
validator: (v) {
|
||||||
if (v == null || v.trim().isEmpty) return l10n.nameRequired;
|
if (v == null || v.trim().isEmpty) return l10n.nameRequired;
|
||||||
@@ -509,7 +509,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(l10n.joinGameTitle),
|
title: Text(l10n.joinGameTitle),
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: const Icon(Icons.arrow_back),
|
icon: IconoFarolero(Icons.arrow_back),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await nearby.pararBusqueda();
|
await nearby.pararBusqueda();
|
||||||
setState(() {
|
setState(() {
|
||||||
@@ -625,7 +625,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
|
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
const Icon(
|
IconoFarolero(
|
||||||
Icons.theater_comedy,
|
Icons.theater_comedy,
|
||||||
color: TemaApp.colorNaranja,
|
color: TemaApp.colorNaranja,
|
||||||
size: 30,
|
size: 30,
|
||||||
@@ -646,7 +646,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const Icon(
|
IconoFarolero(
|
||||||
Icons.arrow_forward_ios,
|
Icons.arrow_forward_ios,
|
||||||
size: 16,
|
size: 16,
|
||||||
color: TemaApp.colorDorado,
|
color: TemaApp.colorDorado,
|
||||||
@@ -667,7 +667,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(l10n.scanQR),
|
title: Text(l10n.scanQR),
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: const Icon(Icons.arrow_back),
|
icon: IconoFarolero(Icons.arrow_back),
|
||||||
onPressed: () => setState(() => _escaneandoQR = false),
|
onPressed: () => setState(() => _escaneandoQR = false),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -714,7 +714,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(_salaSeleccionada ?? l10n.joinGameTitle),
|
title: Text(_salaSeleccionada ?? l10n.joinGameTitle),
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: const Icon(Icons.close),
|
icon: IconoFarolero(Icons.close),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
final nearby = context.read<ServicioNearby>();
|
final nearby = context.read<ServicioNearby>();
|
||||||
await nearby.desconectar();
|
await nearby.desconectar();
|
||||||
@@ -773,7 +773,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
children: [
|
children: [
|
||||||
// Opción crear nuevo usuario (tarea 3.5)
|
// Opción crear nuevo usuario (tarea 3.5)
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: const Icon(
|
leading: IconoFarolero(
|
||||||
Icons.add,
|
Icons.add,
|
||||||
color: TemaApp.colorAcento,
|
color: TemaApp.colorAcento,
|
||||||
),
|
),
|
||||||
@@ -792,7 +792,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
// Si no hay usuarios, permitir crear uno
|
// Si no hay usuarios, permitir crear uno
|
||||||
OutlinedButton.icon(
|
OutlinedButton.icon(
|
||||||
onPressed: () => _crearNuevoUsuario(context),
|
onPressed: () => _crearNuevoUsuario(context),
|
||||||
icon: const Icon(Icons.person_add),
|
icon: IconoFarolero(Icons.person_add),
|
||||||
label: Text(l10n.createNewUser),
|
label: Text(l10n.createNewUser),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -823,7 +823,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
textCapitalization: TextCapitalization.words,
|
textCapitalization: TextCapitalization.words,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: l10n.yourName,
|
hintText: l10n.yourName,
|
||||||
prefixIcon: const Icon(Icons.person),
|
prefixIcon: IconoFarolero(Icons.person),
|
||||||
),
|
),
|
||||||
onSubmitted: (v) => Navigator.pop(ctx, v),
|
onSubmitted: (v) => Navigator.pop(ctx, v),
|
||||||
),
|
),
|
||||||
@@ -902,7 +902,7 @@ class _PantallaUnirseState extends State<PantallaUnirse> {
|
|||||||
),
|
),
|
||||||
trailing: seleccionadoPorMi
|
trailing: seleccionadoPorMi
|
||||||
? IconButton(
|
? IconButton(
|
||||||
icon: const Icon(Icons.close),
|
icon: IconoFarolero(Icons.close),
|
||||||
onPressed: () => nearby.liberarUsuarioSala(usuario.id),
|
onPressed: () => nearby.liberarUsuarioSala(usuario.id),
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
|
|||||||
child: _manteniendo
|
child: _manteniendo
|
||||||
? Column(
|
? Column(
|
||||||
children: [
|
children: [
|
||||||
Icon(
|
IconoFarolero(
|
||||||
widget.esImpostor ? Icons.theater_comedy : Icons.search,
|
widget.esImpostor ? Icons.theater_comedy : Icons.search,
|
||||||
color: colorEstado,
|
color: colorEstado,
|
||||||
size: 52,
|
size: 52,
|
||||||
@@ -201,7 +201,7 @@ class _PantallaRevelarPalabraState extends State<_PantallaRevelarPalabra> {
|
|||||||
)
|
)
|
||||||
: Column(
|
: Column(
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.lock, color: TemaApp.colorDorado, size: 52),
|
IconoFarolero(Icons.lock, color: TemaApp.colorDorado, size: 52),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
Text(
|
Text(
|
||||||
l10n.holdToSeeWord,
|
l10n.holdToSeeWord,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -120,16 +248,15 @@ class EncabezadoFarolero extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
child: assetIconPath == null
|
child: Padding(
|
||||||
? Icon(icono, color: color, size: 30)
|
padding: const EdgeInsets.all(6),
|
||||||
: Padding(
|
child: IconoFarolero(
|
||||||
padding: const EdgeInsets.all(6),
|
icono,
|
||||||
child: Image.asset(
|
assetPath: assetIconPath,
|
||||||
assetIconPath!,
|
color: color,
|
||||||
fit: BoxFit.contain,
|
size: 30,
|
||||||
filterQuality: FilterQuality.medium,
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
const SizedBox(width: 14),
|
const SizedBox(width: 14),
|
||||||
Expanded(
|
Expanded(
|
||||||
@@ -192,13 +319,12 @@ class EstadoVacioFarolero extends StatelessWidget {
|
|||||||
SizedBox(
|
SizedBox(
|
||||||
width: 64,
|
width: 64,
|
||||||
height: 64,
|
height: 64,
|
||||||
child: assetIconPath == null
|
child: IconoFarolero(
|
||||||
? Icon(icono, color: TemaApp.colorNaranja, size: 46)
|
icono,
|
||||||
: Image.asset(
|
assetPath: assetIconPath,
|
||||||
assetIconPath!,
|
color: TemaApp.colorNaranja,
|
||||||
fit: BoxFit.contain,
|
size: 58,
|
||||||
filterQuality: FilterQuality.medium,
|
),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
const SizedBox(height: 14),
|
const SizedBox(height: 14),
|
||||||
Text(
|
Text(
|
||||||
@@ -230,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,
|
||||||
@@ -331,13 +457,12 @@ class BotonFarolero extends StatelessWidget {
|
|||||||
SizedBox(
|
SizedBox(
|
||||||
width: 44,
|
width: 44,
|
||||||
height: 40,
|
height: 40,
|
||||||
child: assetIconPath == null
|
child: IconoFarolero(
|
||||||
? Icon(icono, color: colorTexto, size: 30)
|
icono,
|
||||||
: Image.asset(
|
assetPath: assetIconPath,
|
||||||
assetIconPath!,
|
color: colorTexto,
|
||||||
fit: BoxFit.contain,
|
size: 38,
|
||||||
filterQuality: FilterQuality.medium,
|
),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
const SizedBox(width: 10),
|
const SizedBox(width: 10),
|
||||||
Expanded(
|
Expanded(
|
||||||
@@ -413,16 +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: assetIconPath == null
|
child: Padding(
|
||||||
? Icon(icono, color: color, size: 30)
|
padding: const EdgeInsets.all(6),
|
||||||
: Padding(
|
child: IconoFarolero(
|
||||||
padding: const EdgeInsets.all(6),
|
icono,
|
||||||
child: Image.asset(
|
assetPath: assetIconPath,
|
||||||
assetIconPath!,
|
color: color,
|
||||||
fit: BoxFit.contain,
|
size: 30,
|
||||||
filterQuality: FilterQuality.medium,
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
const SizedBox(width: 14),
|
const SizedBox(width: 14),
|
||||||
Expanded(
|
Expanded(
|
||||||
@@ -511,16 +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: assetIconPath == null
|
child: Padding(
|
||||||
? Icon(icono, color: color, size: 24)
|
padding: const EdgeInsets.all(5),
|
||||||
: Padding(
|
child: IconoFarolero(
|
||||||
padding: const EdgeInsets.all(5),
|
icono,
|
||||||
child: Image.asset(
|
assetPath: assetIconPath,
|
||||||
assetIconPath!,
|
color: color,
|
||||||
fit: BoxFit.contain,
|
size: 26,
|
||||||
filterQuality: FilterQuality.medium,
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
const SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Expanded(
|
Expanded(
|
||||||
@@ -549,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,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -878,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),
|
||||||
@@ -804,7 +805,7 @@ class TarjetaImpostoresPremium extends StatelessWidget {
|
|||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.theater_comedy, color: TemaApp.colorAcento),
|
IconoFarolero(Icons.theater_comedy, color: TemaApp.colorAcento),
|
||||||
const SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
Flexible(
|
Flexible(
|
||||||
child: Text(
|
child: Text(
|
||||||
@@ -825,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,
|
||||||
@@ -843,7 +844,7 @@ class TarjetaImpostoresPremium extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
if (jugador.eliminado) ...[
|
if (jugador.eliminado) ...[
|
||||||
const SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
const Icon(
|
IconoFarolero(
|
||||||
Icons.close,
|
Icons.close,
|
||||||
size: 16,
|
size: 16,
|
||||||
color: TemaApp.colorTextoSecundario,
|
color: TemaApp.colorTextoSecundario,
|
||||||
|
|||||||
@@ -1,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
|
||||||
@@ -48,3 +48,4 @@ flutter:
|
|||||||
- assets/ui/generated/gameplay/
|
- assets/ui/generated/gameplay/
|
||||||
- assets/ui/generated/meta/
|
- assets/ui/generated/meta/
|
||||||
- assets/ui/generated/actions/
|
- assets/ui/generated/actions/
|
||||||
|
- assets/ui/generated/icons/
|
||||||
|
|||||||
@@ -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: 245 KiB |