Convocando o meio de campo...

FABI

FAB context menu + dockstation · sinapse ⇄ djow · UMD autossuficiente

STATE: BOOTING UMD BUNDLE
Meio de Campo fabi.state

Snapshot vivo do estado: o próprio FAB + dockstation estão montados no bottom/center desta página.

visible -
dial -
página -
tema -
Booting state snapshot...
Playground Surface sinapse do fabi rebindado

Mouse e touch do sinapse interno vivem aqui (fabi.sinapse.configure({container})). Setas do teclado funcionam na página toda.

ps
si
ga
om
dead zone
repouso: swipe ↑ abre root · swipe ↓ esconde · swipe ←/→ dock no dial
dial: toque ativa · duplo/swipe mantém aberto · manter arma + soltar confirma
Menus open() · push() · back()

Navegação programática da pilha — o pager injeta voltar (si) e mais (om) sozinho.

Temas Elementais set_theme() · aura

Sangramento orgânico de tinta no corpo djow — a aura propaga para a dockstation e para esta página.

Event Stream fabi.on(*)

Timeline de tudo que o emitter do fabi publicou nesta sessão.

--:--:--SYSTEMsem eventos.
Matriz Semântica 8 ações × 4 seções

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')
Manual Dispatch Lab fabi.sinapse.fire

Injete ações semânticas direto no sinapse interno e observe o fabi responder (FAB no rodapé da página).

Nenhum dispatch executado.
Input Telemetry on('input')

Passthrough integral: cada ação do sinapse observada pelo fabi, com heatmap por ação e por seção.

inputs 0
last action -
last section -
selects 0
--:--:--SYSTEMaguardando inputs...
VOICE: offline
Live Signal voice_on_frame · DSP local

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.

si · /i/
ps · /s/
ga · /a/
om · /m/
Sessão inativa. Ative o microfone para calibrar e treinar os comandos.
Guided Checklist 0 / 20

Sequência por seção: press → tap → hold → keep → unkeep, em si, ps, ga e om.

Vocabulário Fonético 6 ações × 4 seções

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.

press.X falar "X" curto tap.X falar "X" e logo estalar os dedos hold.X sustentar "Xxxx..." (holding ticka) unhold.X silenciar o "Xxxx..." keep.X enquanto sustenta, bater palma 1× unkeep.X bater palma 2× (sem vocalizar)
Dock Items dock() · overflow ⋯

Asas de vidro flanqueando o FAB. Excedente de dock_max_per_wing vira o chip ⋯, servido pelo próprio dial como menu.

Carregando dockstation...
Badges dock_badge(id, badge)

Badges vivos com a cor da aura: número, true (ponto) ou null (some).

Nenhum badge alterado.
Estados Orgânicos set_busy() · pulse()

Com busy, o corpo djow acelera e as asas do dock respiram. O pulse é o aviso pontual: algo aconteceu.

busy : false
Module Map v0.1.0 · UMD autossuficiente

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
sinapse fabi djow
main.mjs fabi.mjs dock.mjs + pager.mjs + constants.mjs
API Pública window.fabi

Uma linha para ter o context menu completo — o host declara menus e itens; o fabi cuida do resto.

// UMD — CDN global (este demo) const menu = fabi.create_fabi(document.body, { menus, dock }); // Navegação e menus menu.open('ajustes'); menu.open([{label:'Sim'}]); menu.push('sub'); menu.back(); menu.next_page(); menu.open_dock_menu(); // Dockstation menu.dock(items); menu.dock_badge('inbox', 7); // Estados orgânicos e temas menu.set_theme('fogo'); menu.set_busy(true); menu.pulse(); menu.dismiss(); menu.summon(); // Eventos e escotilhas menu.on('select', (item, section) => {}); menu.on('input', (action, section) => {}); menu.djow · menu.sinapse · menu.dockstation · menu.engine · menu.state
Camadas separação de conceitos

Cada camada com uma responsabilidade — o fabi é o meio de campo que liga input semântico à apresentação orgânica.

@iandara/sinapse input semântico: 8 ações × 4 seções de qualquer estratégia (keyboard · mouse · touch com swipe=tap · voice · camera · orientation · gesture) @iandara/fabi o parça, dono do FAB: zona + dial + scrim + gestos · matriz completa de handlers · menus nomeados com pilha e paginação · análise de contexto · dockstation com overflow · propagação de temas · passthrough on('input') @iandara/djow o bloco orgânico: corpo WebGL de tinta viva que preenche o container · transições elementais (fogo · agua · terra · ar) — só estética, dirigida pelo host