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.
| Elemento | Classe | Notas |
|---|---|---|
| Botão de abrir | .opini-trigger | A pílula que flutua no canto. |
| Marca no botão | .opini-trigger-mark | A marca do Opini à esquerda do rótulo. Desative nas configurações do widget. |
| Link "Powered by" | .opini-powered | O pequeno link “Powered by Opini”. Desative nas configurações do widget. |
| Botão em bolha | .opini-bubble | Adicionada ao botão quando o formato é Bolha. |
| Forma da bolha | .opini-bubble-shape | O balão em si. A cor dele é o fundo. |
| Pupila da bolha | .opini-bubble-pupil | O ponto dentro do balão. |
| Rótulo da bolha | .opini-trigger-label | O rótulo que aparece ao lado da bolha ao passar o mouse. |
| Contêiner do popover | .opini-popover | O painel de feedback inteiro. Uma folha inferior no celular. |
| Cabeçalho | .opini-head | O ícone, o título, o subtítulo e o botão de fechar. |
| Ícone do cabeçalho | .opini-tile | O quadrado colorido com a marca do Opini. |
| Botão de fechar | .opini-close | O × no canto do popover. |
| Título do formulário | .opini-title | O texto grande no topo. |
| Subtítulo do formulário | .opini-sub | A linha menor abaixo do título. |
| Formulário | .opini-form | O elemento <form> que envolve todos os campos. |
| Campo de mensagem | .opini-message | Onde o visitante escreve o feedback. |
| Campo de nome | .opini-name | Campo de nome. Obrigatório, escondido quando você identifica o usuário. |
| Campo de e-mail | .opini-email | Campo de e-mail. Obrigatório, escondido quando você identifica o usuário. |
| Linha de campo | .opini-field | Uma linha: o rótulo à esquerda, o campo à direita. |
| Linhas de nome e e-mail | .opini-row | Envolve as linhas de nome e e-mail. Esconda e os dois viram opcionais. |
| Rótulo da linha | .opini-field-label | O rótulo dentro de uma linha. |
| Linha com erro | .opini-field.opini-invalid | Uma linha cujo campo precisa ser corrigido. |
| Erro do campo | .opini-err | A mensagem abaixo de um campo que precisa ser corrigido. |
| Área de anexo | .opini-attach-region | O lado esquerdo do rodapé. Visitantes também podem colar ou soltar uma imagem em qualquer lugar do painel. |
| Link de anexo | .opini-attach-btn | O link “+ Anexar imagem” mostrado antes de escolher uma imagem. |
| Prévia do anexo | .opini-attach-preview | A linha com miniatura e nome do arquivo mostrada depois de escolher uma imagem. |
| Miniatura do anexo | .opini-attach-thumb | A pequena prévia da imagem escolhida. |
| Botão de remover imagem | .opini-attach-remove | O × que remove a imagem escolhida para o visitante escolher outra. |
| Erro de envio | .opini-msg | Aparece acima do rodapé quando o envio falha. |
| Variante de erro | .opini-msg.opini-msg-err | Igual ao anterior, mas só quando há um erro. |
| Rodapé | .opini-foot | A linha de baixo com o link de anexo e o botão de enviar. |
| Botão de enviar | .opini-submit | O botão de enviar. |
| Estado de sucesso | .opini-success | Substitui o formulário depois de um envio bem-sucedido. |
| Marca de sucesso | .opini-check | O grande visto no estado de sucesso. |
| Título de sucesso | .opini-thanks | O 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.
/* 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".
/* 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.
/* 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.
</stylee<scriptsão recusados (eles escapariam da tag<style>injetada).- Bytes NUL são recusados.
- Fontes personalizadas: use
@importcom 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.