Ir para o conteúdo

Shadow DOM e estilos

Como o widget se isola do CSS do seu site, o que ele insere na página e o que fazer quando algo cobre o chat.

Atualizado em

O chat do Data Lead é renderizado dentro de um Shadow DOM. Isso significa que o CSS do seu site não vaza para dentro do chat, e o CSS do chat não vaza para o seu site. É a razão de o widget não precisar de iframe para não quebrar o seu layout.

O que o widget insere na sua página

Elemento Onde Para quê
<div id="datastone-lead"> com um shadow root aberto Final do <body> Hospeda o launcher, o painel do chat e a faixa de consentimento
<script data-datastone="widget"> e <script data-datastone="behavior"> <head> O chat e o coletor de páginas
<style> dentro do shadow root — Todo o CSS do chat
<div data-datastone="turnstile-holder"> e um <style> no <head> <body> / <head> Caixa do desafio anti-bot, só quando ele está habilitado

O contêiner do desafio anti-bot fica fora do Shadow DOM de propósito: é um script de terceiro e não precisa atravessar a fronteira do widget. Enquanto está vazio — o caso normal — ele não recebe clique nenhum.

Isolamento: o que isso garante e o que não garante

Garante: nenhuma regra do seu CSS (nem um * { font-family: … }, nem um reset agressivo) altera o chat. A raiz do shadow começa com all: initial, então o chat parte de um estado neutro e define tudo o que usa.

Não garante: posição e empilhamento. O host é um elemento comum do seu <body>, então ele participa do contexto de empilhamento da página. Na prática:

  • o launcher e a faixa usam z-index: 2147483000, o painel 2147483001 e a caixa do desafio 2147483004;
  • se algum elemento do seu site usar um z-index maior (ou criar um contexto de empilhamento que contenha o chat), ele pode cobrir o widget;
  • um body { overflow: hidden } aplicado por um modal do seu site pode afetar a rolagem enquanto o modal estiver aberto.

Se o chat aparecer atrás de algo, procure no seu CSS por z-index acima de 2 bilhões, por transform/filter/will-change em ancestrais do <body> e por barras fixas de cookies.

Geometria padrão

Elemento Tamanho e posição
Launcher Círculo de 56 px, a 20 px do rodapé e da lateral escolhida
Painel (desktop) 380 px de largura, 560 px de altura, ancorado 88 px acima do rodapé; nunca ultrapassa a janela
Painel (até 640 px de largura) Ocupa a largura toda e 92% da altura, encostado no rodapé, respeitando a área segura do aparelho
Faixa de consentimento Ao lado do launcher, como região da página — não é modal e não prende o foco

O lado (direita ou esquerda) é uma configuração da conta, não do seu CSS.

O que é personalizável — e o que não é

A personalização fica em Personalização, no menu lateral do painel, e trabalha com tokens validados, nunca com CSS livre:

  • cor primária e cor do balão do visitante, em hexadecimal #RRGGBB;
  • raio de canto, de 0 a 24 px;
  • nome do agente;
  • posição (direita ou esquerda);
  • avatar do agente (imagem enviada pelo formulário, com limite de tamanho e tipo);
  • remover a marca do widget, quando o seu plano inclui.

A fonte é a do sistema, para o chat não baixar arquivo nenhum e não depender do font-src da sua política. Não há campo de CSS personalizado, e não há como injetar estilos no shadow root de fora: qualquer folha de estilo sua é, por construção, ignorada pelo chat.

A prévia ao lado do formulário é o widget real, montado em modo demonstração: trocar cor e nome ali não gasta IA nem grava conversa nenhuma.

Formulário de tokens à esquerda e a prévia ao vivo do widget à direita

Acessibilidade e contraste

O chat mantém alvos de toque de pelo menos 44 px nos controles principais, anel de foco visível em duas cores (para contrastar tanto em fundo claro quanto escuro) e respeita prefers-reduced-motion na animação de "digitando". Como você escolhe as cores, vale conferir o contraste do texto sobre a cor primária ao trocar a paleta.

Inspecionando o chat

No DevTools, procure por #datastone-lead no final do <body> e expanda o #shadow-root (open). O shadow root é aberto, então o inspetor mostra a árvore inteira e você consegue testar mudanças de estilo ali mesmo — lembrando que elas não sobrevivem ao recarregamento, já que o CSS é gerado a partir dos tokens da conta.

Para checar rapidamente pela console se o widget montou:

document.getElementById("datastone-lead")?.shadowRoot?.querySelector(".launcher");

Se isso devolver null, o chat ainda não montou — veja Solução de problemas.

Veja também

Precisa de ajuda?

Fale com o suporte da Data Stone pelo canal combinado com a sua conta. Um print da página com o chat sobreposto e o seletor CSS do elemento que o cobre resolvem a maioria dos casos.