FAB context menu + dockstation · sinapse ⇄ djow · UMD autossuficiente
Snapshot vivo do estado: o próprio FAB + dockstation estão montados no bottom/center desta página.
Mouse e touch do sinapse interno vivem aqui (fabi.sinapse.configure({container})). Setas do teclado funcionam na página
toda.
Navegação programática da pilha — o pager injeta voltar (si) e mais (om) sozinho.
Sangramento orgânico de tinta no corpo djow — a aura propaga para a dockstation e para esta página.
Timeline de tudo que o emitter do fabi publicou nesta sessão.
Toda navegação e ação do fabi é operável por sinapse actions — todas as combinações têm handler; o restante flui como passthrough em
on('input').
| ação | oculto | repouso | dial em cena |
|---|---|---|---|
| press.X | — | gesture_open === X → abre root | ativa a opção da seção X |
| tap.ps | summon | abre o root menu | ativa mantendo o dial |
| tap.om | — | dismiss (esconde tudo) | ativa mantendo o dial |
| tap.si / tap.ga | — | dockstation como menu | ativa mantendo o dial |
| hold.X | — | abre o root menu | arma (foca) a opção X |
| unhold.X | — | — | ativa a opção armada |
| holding · keep · keeping · unkeep | passthrough integral em on('input') | ||
Injete ações semânticas direto no sinapse interno e observe o fabi responder (FAB no rodapé da página).
Passthrough integral: cada ação do sinapse observada pelo fabi, com heatmap por ação e por seção.
Comandos fonéticos 100% offline (Web Audio, sem modelo, sem rede). RMS ao vivo, classe acústica detectada e transientes — e o fabi no rodapé responde de verdade a cada comando.
Sequência por seção: press → tap → hold → keep → unkeep, em si, ps, ga e om.
X ∈ si · ps · ga · om — núcleos acusticamente separáveis; estalo e palma são transientes. Calibre os 4 perfis para precisão com a sua voz — persiste offline.
Asas de vidro flanqueando o FAB. Excedente de dock_max_per_wing vira o chip ⋯, servido pelo próprio dial como menu.
Badges vivos com a cor da aura: número, true (ponto) ou null (some).
Com busy, o corpo djow acelera e as asas do dock respiram. O pulse é o aviso pontual: algo aconteceu.
O bundle embute @iandara/djow e @iandara/sinapse por inteiro — o build falha se o embed quebrar (asserção de autossuficiência).
packages/fabi/ │ ├── main.mjs entry point exports + docs ├── build.mjs esbuild → UMD embute djow + sinapse │ ├── constants.mjs defaults · seções arcos · _dock · _adhoc · fill order ├── orbit.mjs funções puras geometria do dial · vetor→seção ├── context.mjs ContextEngine análise de ambiente · providers ├── pager.mjs funções puras dial pages · asas do dock ├── fab.mjs FabShell zona · dial · gestos · corpo djow ├── dock.mjs Dockstation asas · labels · badges · ⋯ ├── fabi.mjs classe Fabi sinapse ⇄ shell · pilha · matriz │ └── __tests__/ └── fabi.test.mjs 57 testes · headless + fechamento do bundle
Uma linha para ter o context menu completo — o host declara menus e itens; o fabi cuida do resto.
Cada camada com uma responsabilidade — o fabi é o meio de campo que liga input semântico à apresentação orgânica.