- rosto-motor.js: emocoes como posicao de palpebra (cima, inclinacao, baixo) com transicao suave; respiracao, sacadas e piscada que achata o olho - rostos novos Carinha Viva, Bloco, Matriz (LEDs) e Lente (iris/pupila); os classicos continuam; emoji/figurinha nos olhos seguem no SVG - formato do olho (padrao, redondo, pilula, quadrado, largo) para Viva, Bloco e Matriz; salvo na aparencia e enviado como ordem "formato X" - toque na tela do S10: cutucar = susto e risada, deslizar = carinho, tocar dormindo acorda - painel: tela Rosto (celular em destaque, cartoes de rosto, formatos, cores, testar emocoes so na previa ou no celular, lista do que ja esta pronto); Ao vivo leva a ela; paleta ganha rostos e formatos - corrige /comando rosto que nao salvava a aparencia Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
53 lines
2.1 KiB
TypeScript
53 lines
2.1 KiB
TypeScript
/** Registro da command palette (Ctrl+K): cada parte do painel contribui com itens. */
|
|
import {
|
|
cor, CORES, formato, FORMATOS_INFO, gesto, GESTOS_INFO, gestosDisponiveis, nomeRosto, pararTudo, rearmar, recarregarCelular, rosto,
|
|
} from './comandos.svelte';
|
|
import { estado } from './estado.svelte';
|
|
import { nav, ROTAS } from './rotas.svelte';
|
|
|
|
export interface ItemPaleta {
|
|
id: string;
|
|
grupo: string;
|
|
titulo: string;
|
|
dica?: string;
|
|
fazer: () => unknown;
|
|
}
|
|
|
|
type Fonte = () => ItemPaleta[];
|
|
const fontes = new Set<Fonte>();
|
|
|
|
export function registrarNaPaleta(fonte: Fonte): () => void {
|
|
fontes.add(fonte);
|
|
return () => fontes.delete(fonte);
|
|
}
|
|
|
|
class Paleta {
|
|
aberta = $state(false);
|
|
abrir = () => (this.aberta = true);
|
|
fechar = () => (this.aberta = false);
|
|
}
|
|
export const paleta = new Paleta();
|
|
|
|
export function itensDaPaleta(): ItemPaleta[] {
|
|
return [...fontes].flatMap((f) => f());
|
|
}
|
|
|
|
// Itens base: navegação, ações gerais, gestos, rostos e cores.
|
|
registrarNaPaleta(() => [
|
|
...ROTAS.map((r) => ({ id: 'ir-' + r.id, grupo: 'Ir para', titulo: r.titulo, fazer: () => nav.ir(r.id) })),
|
|
{ id: 'ir-rosto', grupo: 'Ir para', titulo: 'Rosto (estilo, formato e cor)', fazer: () => nav.ir('rosto') },
|
|
...estado.formatos.map((f) => ({ id: 'formato-' + f, grupo: 'Formato dos olhos', titulo: FORMATOS_INFO[f] ?? f, fazer: () => formato(f) })),
|
|
estado.estop.ativo
|
|
? { id: 'rearmar', grupo: 'Ações', titulo: 'Rearmar motores', fazer: rearmar }
|
|
: { id: 'estop', grupo: 'Ações', titulo: 'Parar tudo (E-Stop)', dica: 'Shift+Espaço', fazer: pararTudo },
|
|
{ id: 'recarregar', grupo: 'Ações', titulo: 'Recarregar tela do celular', fazer: recarregarCelular },
|
|
...gestosDisponiveis().map((g) => ({
|
|
id: 'gesto-' + g,
|
|
grupo: 'Gestos',
|
|
titulo: `${GESTOS_INFO[g].emoji} ${GESTOS_INFO[g].nome}`,
|
|
fazer: () => gesto(g),
|
|
})),
|
|
...estado.rostos.map((r) => ({ id: 'rosto-' + r, grupo: 'Rosto', titulo: 'Rosto ' + nomeRosto(r), fazer: () => rosto(r) })),
|
|
...CORES.map((c) => ({ id: 'cor-' + c.nome, grupo: 'Cor dos olhos', titulo: c.nome, fazer: () => cor(c.rgb) })),
|
|
]);
|