diff --git a/android/app/assets/carinha.html b/android/app/assets/carinha.html
index b4c3c12..49be5e5 100644
--- a/android/app/assets/carinha.html
+++ b/android/app/assets/carinha.html
@@ -613,6 +613,7 @@ if (MODO_PAINEL) {
const m = e.data;
if (m.tipo === 'ordem' && typeof m.ordem === 'string') trata(m.ordem);
else if (m.tipo === 'config' && m.config) configurarApp(m.config);
+ else if (m.tipo === 'sono' && !!m.dormindo !== r.dormindo) trata(m.dormindo ? 'dormir' : 'acordar');
else if (m.tipo === 'legenda' && typeof m.texto === 'string' && window.MotorRosto) window.MotorRosto.faixa('legenda', { texto: m.texto });
});
} else if (new URLSearchParams(location.search).get('espelho') === '1') setInterval(aplicarAparencia, 1000);
diff --git a/carinha.html b/carinha.html
index b4c3c12..49be5e5 100644
--- a/carinha.html
+++ b/carinha.html
@@ -613,6 +613,7 @@ if (MODO_PAINEL) {
const m = e.data;
if (m.tipo === 'ordem' && typeof m.ordem === 'string') trata(m.ordem);
else if (m.tipo === 'config' && m.config) configurarApp(m.config);
+ else if (m.tipo === 'sono' && !!m.dormindo !== r.dormindo) trata(m.dormindo ? 'dormir' : 'acordar');
else if (m.tipo === 'legenda' && typeof m.texto === 'string' && window.MotorRosto) window.MotorRosto.faixa('legenda', { texto: m.texto });
});
} else if (new URLSearchParams(location.search).get('espelho') === '1') setInterval(aplicarAparencia, 1000);
diff --git a/web/src/lib/componentes/RostoPrevia.svelte b/web/src/lib/componentes/RostoPrevia.svelte
index bafb06e..43957d7 100644
--- a/web/src/lib/componentes/RostoPrevia.svelte
+++ b/web/src/lib/componentes/RostoPrevia.svelte
@@ -7,7 +7,8 @@
import { onDestroy } from 'svelte';
import { estado, ouvir } from '../estado.svelte';
- let { titulo = 'Prévia do rosto' }: { titulo?: string } = $props();
+ /** espelharSono: dorme/acorda junto com o celular (ele adormece sozinho no silêncio). */
+ let { titulo = 'Prévia do rosto', espelharSono = true }: { titulo?: string; espelharSono?: boolean } = $props();
let quadro: HTMLIFrameElement;
let pronto = $state(false);
@@ -20,6 +21,13 @@
if (estado.appConfig) enviar({ tipo: 'config', config: $state.snapshot(estado.appConfig) });
}
+ // Sono que o celular decidiu sozinho (silêncio, toque, barulho) não passa pelo SSE de ordens:
+ // vem na telemetria. Sem celular online, a prévia fica como está.
+ const dormindoNoCelular = $derived(estado.celularOnline ? !!estado.app?.estado?.dormindo : null);
+ $effect(() => {
+ if (espelharSono && pronto && dormindoNoCelular !== null) enviar({ tipo: 'sono', dormindo: dormindoNoCelular });
+ });
+
let ultimaConversa = estado.conversa?.ultima?.id;
const cancelar = [
ouvir('expressao', (d) => enviar({ tipo: 'ordem', ordem: d.ordem })),
diff --git a/web/src/telas/Reacoes.svelte b/web/src/telas/Reacoes.svelte
index ecabd45..fdc13d8 100644
--- a/web/src/telas/Reacoes.svelte
+++ b/web/src/telas/Reacoes.svelte
@@ -249,7 +249,7 @@
diff --git a/web/src/telas/Rosto.svelte b/web/src/telas/Rosto.svelte
index 8e2714e..3bebce2 100644
--- a/web/src/telas/Rosto.svelte
+++ b/web/src/telas/Rosto.svelte
@@ -70,7 +70,7 @@
-
+
{nomeRosto(atual).toUpperCase()}{aceitaFormato ? ' · ' + (FORMATOS_INFO[formatoAtual] ?? formatoAtual).toUpperCase() : ''}