Pular para o conteúdo

Estilizar o widget

Cada elemento público do widget tem uma classe .opini-* estável. Cole seu próprio CSS no campo CSS personalizado do painel e ele vai para dentro do shadow root do widget, restrito ao widget: sua página não é afetada.

Seletores

Use estas classes no seu CSS. O contrato é estável entre versões menores: adicionamos classes novas, mas nunca renomeamos nem removemos as existentes sem uma versão maior.

ElementoClasseNotas
Botão de abrir.opini-triggerA pílula que flutua no canto.
Marca no botão.opini-trigger-markA marca do Opini à esquerda do rótulo. Desative nas configurações do widget.
Link "Powered by".opini-poweredO pequeno link “Powered by Opini”. Desative nas configurações do widget.
Botão em bolha.opini-bubbleAdicionada ao botão quando o formato é Bolha.
Forma da bolha.opini-bubble-shapeO balão em si. A cor dele é o fundo.
Pupila da bolha.opini-bubble-pupilO ponto dentro do balão.
Rótulo da bolha.opini-trigger-labelO rótulo que aparece ao lado da bolha ao passar o mouse.
Contêiner do popover.opini-popoverO painel de feedback inteiro. Uma folha inferior no celular.
Cabeçalho.opini-headO ícone, o título, o subtítulo e o botão de fechar.
Ícone do cabeçalho.opini-tileO quadrado colorido com a marca do Opini.
Botão de fechar.opini-closeO × no canto do popover.
Título do formulário.opini-titleO texto grande no topo.
Subtítulo do formulário.opini-subA linha menor abaixo do título.
Formulário.opini-formO elemento <form> que envolve todos os campos.
Campo de mensagem.opini-messageOnde o visitante escreve o feedback.
Campo de nome.opini-nameCampo de nome. Obrigatório, escondido quando você identifica o usuário.
Campo de e-mail.opini-emailCampo de e-mail. Obrigatório, escondido quando você identifica o usuário.
Linha de campo.opini-fieldUma linha: o rótulo à esquerda, o campo à direita.
Linhas de nome e e-mail.opini-rowEnvolve as linhas de nome e e-mail. Esconda e os dois viram opcionais.
Rótulo da linha.opini-field-labelO rótulo dentro de uma linha.
Linha com erro.opini-field.opini-invalidUma linha cujo campo precisa ser corrigido.
Erro do campo.opini-errA mensagem abaixo de um campo que precisa ser corrigido.
Área de anexo.opini-attach-regionO lado esquerdo do rodapé. Visitantes também podem colar ou soltar uma imagem em qualquer lugar do painel.
Link de anexo.opini-attach-btnO link “+ Anexar imagem” mostrado antes de escolher uma imagem.
Prévia do anexo.opini-attach-previewA linha com miniatura e nome do arquivo mostrada depois de escolher uma imagem.
Miniatura do anexo.opini-attach-thumbA pequena prévia da imagem escolhida.
Botão de remover imagem.opini-attach-removeO × que remove a imagem escolhida para o visitante escolher outra.
Erro de envio.opini-msgAparece acima do rodapé quando o envio falha.
Variante de erro.opini-msg.opini-msg-errIgual ao anterior, mas só quando há um erro.
Rodapé.opini-footA linha de baixo com o link de anexo e o botão de enviar.
Botão de enviar.opini-submitO botão de enviar.
Estado de sucesso.opini-successSubstitui o formulário depois de um envio bem-sucedido.
Marca de sucesso.opini-checkO grande visto no estado de sucesso.
Título de sucesso.opini-thanksO título de agradecimento.

Os nomes curtos antigos (.trigger, .popover, …) ainda funcionam junto com as classes com prefixo por mais uma versão menor. Migre para o contrato .opini-* hoje: os apelidos saem na versão seguinte.

Onde colar

Abra Configurações → Widget do projeto, expanda CSS personalizado (avançado) e cole sua folha de estilos no campo. Salve, e o próximo carregamento da página no seu site já usa o CSS. Ele é injetado no shadow root do widget depois da folha de estilos padrão, então a ordem já basta para sobrescrever qualquer regra. Nada de guerra de !important.

O Shadow DOM limita o alcance: seu CSS afeta o widget e nada mais na página.

Exemplos

Três pontos de partida para copiar e colar. Cada um vai direto no campo CSS personalizado.

Modal centralizado

Fixe o popover no meio da tela em vez de ancorá-lo no canto do botão.

css
/* Centered modal — drop the corner anchor and put the popover
   in the middle of the screen. */
.opini-popover {
  top: 50%;
  left: 50%;
  bottom: auto;
  right: auto;
  transform: translate(-50%, -50%);
  width: min(440px, calc(100vw - 24px));
  border-radius: 20px;
}
.opini-trigger {
  background: #111827;
  color: #f9fafb;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

Editorial escuro

Título com serifa, borda fina, destaque cor de vinho. Combine com widget_theme = "dark".

css
/* Dark editorial — serif headline, hairline border, oxblood
   accent. Pair with widget_theme = "dark" in Settings. */
.opini-popover {
  background: #0b0b0d;
  border: 1px solid #1f1f24;
  box-shadow: 0 30px 80px rgba(0, 0, 0, 0.55);
}
.opini-title {
  font-family: "Playfair Display", "Georgia", serif;
  font-weight: 600;
  font-size: 22px;
  letter-spacing: -0.02em;
}
.opini-sub { color: #8b8b95; font-style: italic; }
.opini-submit {
  background-image: none !important;
  background: #7c1d2a;
  border-radius: 4px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.opini-submit:hover { background: #92242f; }

Aviso compacto no canto

Reduza o botão a um círculo e o popover a um campo compacto, para sites onde o feedback é um comentário rápido.

css
/* Slim corner toast — hide the header, shrink the popover,
   and turn the launcher into a single ▸ character. */
.opini-popover {
  width: 320px;
  border-radius: 14px;
}
.opini-head { display: none; }
.opini-message { min-height: 64px; }
.opini-trigger {
  width: 36px;
  height: 36px;
  padding: 0;
  border-radius: 999px;
  font-size: 0;
}
.opini-trigger::before {
  content: "▸";
  font-size: 18px;
  line-height: 1;
}

Limites

  • Até 32 KB de CSS por projeto.
  • </style e <script são recusados (eles escapariam da tag <style> injetada).
  • Bytes NUL são recusados.
  • Fontes personalizadas: use @import com uma URL do Google Fonts no seu CSS; o widget as baixa no navegador do visitante. O Opini não hospeda arquivos de fonte.
  • Não analisamos o CSS: CSS inválido simplesmente não aparece, como em qualquer lugar.