Reatividade declarativa

Sua página PHP.
Agora reativa.
Sem npm.

Um arquivo, uma tag <script>, e sua página passa a ser reativa. Proxy recursivo, dependency tracking granular, ~3.6KB gzip. Funciona em qualquer stack.

Zero dependências Sem build tools MIT License
demo.html
Preview ao vivo
● Disponível
● Fora de estoque
~3.6KB
gzipped
0
dependências
15min
curva de aprendizado
<16ms
update em 5k itens
1
arquivo necessário
// exemplos interativos

Veja funcionando agora

Cada exemplo abaixo está rodando de verdade com shadow-proxy.js. Edite, clique, experimente.

index.html
<div x-data="produto">
  <h2 x-bind="{nome}"></h2>
  <p  x-bind="R$ {preco}"></p>

  <div x-if="ativo">✅ Disponível</div>
  <div x-if="!ativo">❌ Indisponível</div>
</div>

<input x-model="produto.nome">

<script>
  proxy.initProxy();

  proxy.template.produto.nome  = "Coxinha Supreme";
  proxy.template.produto.preco = 9.90;
  proxy.template.produto.ativo = true;
</script>
Resultado ao vivo
✅ Disponível
❌ Indisponível
lista-reativa.html
<div x-data="tarefas">
  <div x-for="item, k in lista">
    <span x-bind="{item.texto}"></span>
    <button x-on:click="toggle(k)"></button>
    <button x-on:click="remove(k)"></button>
  </div>
</div>

<script>
  proxy.initProxy();

  proxy.template.tarefas.lista = [
    { texto: "Aprender shadow-proxy", done: false },
    { texto: "Refatorar o projeto", done: false },
  ];

  proxy.template.tarefas.toggle = function(k) {
    proxy.template.tarefas.lista[k].done
      = !proxy.template.tarefas.lista[k].done;
  };
</script>
Resultado ao vivo
watcher.html
<div x-data="contador">
  <h2 x-bind="{valor}"></h2>
</div>

<input type="range" x-model="contador.valor">

<script>
  proxy.initProxy();
  proxy.template.contador.valor = 50;

  // Observa qualquer mudança no valor
  proxy.on('contador.valor', (novo, velho) => {
    console.log(`${velho} → ${novo}`);
  });
</script>
Resultado ao vivo
contador.valor
// proxy.on log

// por que usar

Tudo que você precisa,
nada que você não precisa

shadow-proxy.js entrega reatividade real sem as abstrações desnecessárias dos grandes frameworks.

Proxy Recursivo
Qualquer nível de aninhamento é rastreado automaticamente. Sem observers manuais, sem boilerplate.
🎯
Update Cirúrgico
lista[250].nome = 'x' toca exatamente 1 nó no DOM, independente do tamanho da lista.
🔗
Two-way Binding
x-model funciona com input, checkbox, radio e select. Mudanças no DOM refletem no objeto automaticamente.
🏗️
Loops Aninháveis
x-for com índice nomeado, sintaxe flexível, e suporte a arrays vazios sem dados dummy.
🛡️
Lifecycle Hooks
$beforeRender, $afterRender, $beforeDestroy, $afterDestroy — controle total sobre o ciclo de vida.
🔍
Destroy Real
Limpa effects, event listeners, watchers e store em cascata. Essencial para SPAs com fetch.

// comparação

Por que não Alpine, Vue ou React?

Existe um espaço enorme entre "página HTML com PHP" e "SPA completa com React". shadow-proxy.js ocupa exatamente esse espaço.

Característica ShadowProxy Alpine.js Vue.js (CDN) React (CDN)
Tamanho (min+gzip) ~3.6KB ~13.5KB ~34KB ~45KB
Build tools Não precisa
Dependências Zero Zero Zero Zero
Curva de aprendizado 15 minutos 1 hora 2 dias 1 semana
Two-way binding
Error handler customizável
Destroy real (SPA/fetch)
Funciona em PHP puro

// instalação

Pronto em 30 segundos

Um arquivo. Sem npm, sem config, sem opinião sobre sua stack.

Via CDN (mais rápido)
<script src="https://cdn.jsdelivr.net/gh/israel-nogueira/shadow-proxy@refs/heads/no-reflow/assets/js/night-proxy.min.js"></script>
Download direto
<script src="./assets/js/shadow-proxy.js"></script>
✓ É só isso. Inclua o script no <head>, adicione x-data no HTML e chame proxy.initProxy(). Sua página já é reativa.