Widget Provei — guia avançado

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.

LinhaScriptIframe do runtimeVersão
Home — Móveis, Revestimentos e PisosGET /api/v2/snippet/[userId]/widget-v2/[userId]2.1.0
Fashion — Provador VirtualGET /api/v2/snippet-fashion/[userId]/widget-v2-fashion/[userId]2.0.0
Endpoint de Móveis
<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 userId precisa 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, revestimento e pisos; 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 Origin ou Referer; 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.

Lifecycle Home com proprietário fixo
(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étodoComportamento
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.

EventoDetalhe
reverbs:readyInicialização terminal; detail.widget e detail.userId.
reverbs:errorFalha terminal; detail.code, detail.message e detail.userId.
reverbs:openModal/drawer aberto; detail.widget.
reverbs:closeModal/drawer fechado; detail.widget.
reverbs:destroyInstâ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ávelUso
--reverbs-btn-gradientGradiente de fundo.
--reverbs-btn-colorCor do texto.
--reverbs-btn-border-gradientGradiente da borda.
--reverbs-btn-shadowSombra em repouso.
--reverbs-btn-shadow-hoverSombra no hover.
--reverbs-btn-glowBrilho decorativo.

Modal e drawer

VariávelUso
--reverbs-modal-bgFundo do overlay.
--reverbs-modal-content-bgFundo do conteúdo.
--reverbs-modal-header-bgFundo do cabeçalho.
--reverbs-modal-textCor do texto.
--reverbs-modal-borderBorda do container.
Sobrescrever variáveis
<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:

ChaveUso
defaultTema padrão.
lightFundo claro.
darkFundo escuro.
minimalAparê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ódigoInterpretação
400UUID ou parâmetro inválido.
403Origem não autorizada para o proprietário.
404Perfil, produto ou runtime não encontrado/provisionado.
500Falha 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.