Personalizar exemplos
Informe um UUID válido para trocar o proprietário nos endpoints exibidos.
Enquanto o valor não for um UUID de rota, os exemplos usam o placeholder seguroSEU_USER_ID.
Linha do widget
Instalação e escopo
Este é o guia avançado; a instalação normativa fica em um único lugar.
Siga o Guia canônico de instalação para publicar o loader global no rodapé da loja. Para Home, consulte também o loader personalizado para Home.
Não combine um loader direto e um loader personalizado. O runtime é um script clássico assíncrono, deve ser carregado uma vez e usa crossorigin="anonymous". Ao criar a tag por JavaScript, configure também script.crossOrigin = "anonymous".
Esta página não repete os passos de cada plataforma: ela documenta somente o contrato avançado depois que a instalação canônica foi concluída.
Endpoints e pré-requisitos
O endpoint de script é hospedado pela Provei em https://app.provei.ai. O script obtém a configuração, resolve o produto pela URL e cria o iframe correspondente à linha selecionada.
| Linha | Script | Iframe do runtime | Versão |
|---|---|---|---|
| Home — Móveis, Revestimentos e Pisos | GET /api/v2/snippet/[userId] | /widget-v2/[userId] | 2.1.0 |
| Fashion — Provador Virtual | GET /api/v2/snippet-fashion/[userId] | /widget-v2-fashion/[userId] | 2.0.0 |
<script src="https://app.provei.ai/api/v2/snippet/SEU_USER_ID" async crossorigin="anonymous"></script>O valor usado no exemplo é $SEU_USER_ID. A URL real deve conter o UUID da conta autorizada.
Guardas que precisam estar prontas
- UUID: o
userIdprecisa seguir o UUID de rota; um valor inválido retorna 400. - Provisionamento: o perfil precisa existir, ter a vertical correta e possuir um produto/runtime liberado. Home aceita os modos técnicos
furniture,revestimentoepisos; Fashion usa apenasfashion. - Origem exata: o suporte/admin da Provei registra a origem principal e as origens adicionais da loja. A requisição deve vir de uma delas via
OriginouReferer; não há cadastro self-service para este vínculo. - Produto ativo: a URL atual precisa corresponder ao produto cadastrado para aquele proprietário. Sem correspondência, o runtime não mostra o launcher e não tenta aceitar um tipo enviado pelo navegador.
- Para Home e Fashion, o retorno de configuração ainda precisa indicar plano ativo e créditos para que o launcher apareça.
A comparação normaliza o endereço: origem em minúsculas e URL sem query, hash ou barra final. Em Fashion, a URL canônica também pode ser usada quando preserva o mesmo caminho. Se o match Home estiver indisponível ou ambíguo, a resposta é simplesmente matched: false; isso não rejeita o script já autorizado.
Modos de exibição
A configuração do painel pode renderizar o runtime em três modos:
Modal
O launcher abre o iframe sobre a página.
Drawer
O iframe entra como uma gaveta lateral.
Inline
O runtime renderiza dentro do container configurado.
Importante sobre inline: open() é no-op quandodisplay_mode é inline. O container é exibido pelo próprio runtime; não use um botão que dependa de abrir um modal.
API JavaScript
Home publica window.reverbsWidgetReady, uma Promise do mesmo proprietário, além de window.reverbsWidget e window.reverbsWidgetOwnerId. A Promise resolve para a instância depois da inicialização do runtime.
(function () {
var EXPECTED_OWNER = '00000000-0000-4000-8000-000000000001';
var done = false;
function cleanup() {
window.removeEventListener('reverbs:ready', onReady);
window.removeEventListener('reverbs:error', onError);
}
function owns(detail) {
return detail && detail.userId === EXPECTED_OWNER;
}
function onReady(event) {
var detail = event && event.detail;
if (done || !owns(detail) || !detail.widget) return;
done = true;
cleanup();
console.log('Home inicializado', detail.widget);
}
function onError(event) {
var detail = event && event.detail;
if (done || !owns(detail)) return;
done = true;
cleanup();
console.error('Home indisponível', detail.code, detail.message);
}
var ready = window.reverbsWidgetReady;
if (
window.reverbsWidgetOwnerId === EXPECTED_OWNER &&
ready &&
typeof ready.then === 'function'
) {
ready.then(
function (widget) {
onReady({ detail: { userId: EXPECTED_OWNER, widget: widget } });
},
function (error) {
onError({ detail: error });
}
);
} else {
// Instale estes listeners antes de inserir/recarregar o loader.
window.addEventListener('reverbs:ready', onReady);
window.addEventListener('reverbs:error', onError);
}
})();O exemplo remove exatamente os callbacks registrados e ignora eventos de outros proprietários. Se já houver um bootstrap do mesmo UUID, use a Promise existente; um UUID diferente recebeowner_conflict e não substitui o runtime. A limpeza do loader acontece após um ready, error ou script-error terminal; uma requisição de rede que fique indefinidamente pendente não recebe timeout artificial.
| Método | Comportamento |
|---|---|
| open() | Abre o modal/drawer quando há produto correspondente. |
| close() | Fecha o modal/drawer aberto. |
| destroy() | Remove elementos, listeners, runtime e estado público desta instância. |
Eventos
Os eventos Home são emitidos em window. Filtre sempreevent.detail.userId antes de reagir a eventos terminais de uma página que possa conter mais de um proprietário.
| Evento | Detalhe |
|---|---|
| reverbs:ready | Inicialização terminal; detail.widget e detail.userId. |
| reverbs:error | Falha terminal; detail.code, detail.message e detail.userId. |
| reverbs:open | Modal/drawer aberto; detail.widget. |
| reverbs:close | Modal/drawer fechado; detail.widget. |
| reverbs:destroy | Instância destruída; detail.widget. |
Códigos de instalação observáveis incluem config_unavailable, initialization_failed, owner_conflict e script_load_failed.reverbs:ready confirma a inicialização do runtime, não que plano, créditos ou match de produto tenham produzido um launcher visível.
CSS Variables
O runtime emite estes nomes exatos de variáveis CSS. Os valores padrão vêm da configuração do tema; customizações próprias devem respeitar a cascata e não substituir os nomes por aliases.
Os temas dos runtimes usam as variáveis abaixo. O painel/runtime define os valores padrão; customizações próprias devem respeitar a cascata e os nomes exatos.
Botão
| Variável | Uso |
|---|---|
| --reverbs-btn-gradient | Gradiente de fundo. |
| --reverbs-btn-color | Cor do texto. |
| --reverbs-btn-border-gradient | Gradiente da borda. |
| --reverbs-btn-shadow | Sombra em repouso. |
| --reverbs-btn-shadow-hover | Sombra no hover. |
| --reverbs-btn-glow | Brilho decorativo. |
Modal e drawer
| Variável | Uso |
|---|---|
| --reverbs-modal-bg | Fundo do overlay. |
| --reverbs-modal-content-bg | Fundo do conteúdo. |
| --reverbs-modal-header-bg | Fundo do cabeçalho. |
| --reverbs-modal-text | Cor do texto. |
| --reverbs-modal-border | Borda do container. |
<style>
:root {
--reverbs-btn-gradient: linear-gradient(135deg, #0f766e, #14b8a6);
--reverbs-btn-color: #ffffff;
--reverbs-btn-border-gradient: linear-gradient(135deg, #115e59, #2dd4bf);
--reverbs-btn-shadow: 0 4px 24px rgba(15, 118, 110, 0.25);
--reverbs-btn-shadow-hover: 0 8px 32px rgba(15, 118, 110, 0.35);
--reverbs-btn-glow: rgba(45, 212, 191, 0.2);
}
</style>Temas
O runtime fornece quatro temas configuráveis:
| Chave | Uso |
|---|---|
| default | Tema padrão. |
| light | Fundo claro. |
| dark | Fundo escuro. |
| minimal | Aparência discreta. |
A chave é aplicada pela configuração do widget e passada ao iframe; não use nomes de temas fora desta lista.
Atributos HTML
data-reverbs-trigger
O runtime escuta elementos com data-reverbs-trigger, cancela o comportamento padrão do link e chama o método apropriado:
<button data-reverbs-trigger>
Ver no meu ambiente
</button>
<a href="/produto" data-reverbs-trigger>
Ver no meu ambiente
</a>data-reverbs-auto-show
Elementos com data-reverbs-auto-show ficam visíveis quando a URL encontra um produto elegível e são ocultados quando não há correspondência.
<div data-reverbs-auto-show style="display: none">
Ver no meu ambiente
</div>Para seletores personalizados, use a opçãotrigger_selector na configuração do runtime. Um mesmo elemento não deve receber loaders duplicados.
Exemplos de uso
Abrir com uma ação própria
<button id="reverbs-home-open">Ver no meu ambiente</button>
<script>
(function () {
var expectedOwner = '00000000-0000-4000-8000-000000000001';
var button = document.getElementById('reverbs-home-open');
if (!button) return;
button.addEventListener('click', function () {
var widget = window.reverbsWidget;
if (
window.reverbsWidgetOwnerId !== expectedOwner ||
!widget ||
typeof widget.open !== 'function'
) {
console.warn('Home indisponível para este proprietário');
return;
}
widget.open();
});
})();
</script>Produto e navegação SPA
Com auto_detect_url habilitado, Home usa /api/v2/widget/match com a URL atual e escolhe no servidorfurniture, revestimento ou pisos conforme o produto provisionado. Não envie product_type pelo navegador. A navegação SPA é observada para refazer o match sem reinstalar o script. O config público traz home_match_index, as chaves das URLs dos produtos ativos: páginas fora do catálogo (home, categorias, busca) não chamam o match. Sem o índice, o match é feito em toda página.
Troubleshooting
O launcher não aparece
- Confirme UUID, perfil liberado e modo provisionado para a linha correta.
- Confira se a origem exata da loja foi registrada e se a página é a URL do produto ativo.
- Verifique se plano e créditos estão disponíveis para Home/Fashion.
- Inspecione as requisições do snippet e do match a partir da página de produto autorizada. Não abra a URL do script diretamente na barra de endereços: isso não reproduz o contexto de origem.
Códigos HTTP esperados
| Código | Interpretação |
|---|---|
| 400 | UUID ou parâmetro inválido. |
| 403 | Origem não autorizada para o proprietário. |
| 404 | Perfil, produto ou runtime não encontrado/provisionado. |
| 500 | Falha na geração do script/configuração. |
Uma resposta 200 do script não garante produto correspondido. Veja matched na resposta de match e os eventos do runtime.
Logs de depuração
Acrescente ?reverbs_debug=1 à URL da página e recarregue. O parâmetro é interpretado pelo runtime Home e pelo Fashion; remova-o ao terminar.
Precisa de ajuda? Envie ao suporte a URL da página de produto, o status das requisições e o código exibido — nunca inclua dados de outro proprietário.