- web/ com Vite + Svelte 5 + TypeScript; servidor entrega web/dist em "/" (telas antigas seguem em /dashboard, /painel, /braco...) - design system em tokens CSS, tema escuro e claro, fontes locais - estado unico: foto de /estado + um EventSource em /eventos, sem polling - shell com navegacao lateral/inferior, selos de status reais e E-Stop fixo - command palette (Ctrl+K), gestos favoritos com atalhos 1-9, g+letra navega - Ao vivo: camera WebRTC e rastreamento portados para TS, rosto, aparencia, sensores do celular, IA local e feed de acontecimentos - Ajustes: campos do celular agrupados com busca, salvamento otimista e restaurar padrao (GET /app/padrao); motor da conversa, Gemini e token - carinha.html ganha modo ?painel=1 dirigido por postMessage (sem polling) - teste Playwright de ponta a ponta do painel novo Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
1.0 KiB
Svelte
43 lines
1.0 KiB
Svelte
<script lang="ts">
|
|
import { OctagonX, RotateCcw } from '@lucide/svelte';
|
|
import { pararTudo, rearmar } from '../comandos.svelte';
|
|
import { estado } from '../estado.svelte';
|
|
</script>
|
|
|
|
{#if estado.estop.ativo}
|
|
<button class="btn estop parado" onclick={rearmar} title="Motores travados pelo E-Stop. Clique para rearmar.">
|
|
<RotateCcw size={18} /> <span>PARADO · Rearmar</span>
|
|
</button>
|
|
{:else}
|
|
<button class="btn perigo estop" onclick={pararTudo} title="Parar tudo (Shift+Espaço ou Esc duas vezes)">
|
|
<OctagonX size={18} /> <span>Parar tudo</span>
|
|
</button>
|
|
{/if}
|
|
|
|
<style>
|
|
.estop {
|
|
font-weight: 700;
|
|
letter-spacing: 0.02em;
|
|
}
|
|
.parado {
|
|
background: var(--aviso-suave);
|
|
border-color: var(--aviso);
|
|
color: var(--aviso);
|
|
animation: pulso 1.6s ease-in-out infinite;
|
|
}
|
|
@keyframes pulso {
|
|
50% {
|
|
box-shadow: 0 0 0 4px var(--aviso-suave);
|
|
}
|
|
}
|
|
@media (max-width: 480px) {
|
|
span {
|
|
display: none;
|
|
}
|
|
.estop {
|
|
width: 44px;
|
|
padding: 0;
|
|
}
|
|
}
|
|
</style>
|