Styliser le widget
Chaque élément public du widget a une classe .opini-* stable. Collez votre CSS dans le champ CSS personnalisé du tableau de bord : il est placé dans le shadow root du widget et ne touche que le widget, jamais votre page.
Sélecteurs
Ciblez ces classes dans votre CSS. Le contrat est stable entre versions mineures : nous ajoutons des classes, mais n'en renommons ni n'en supprimons jamais sans version majeure.
| Élément | Classe | Notes |
|---|---|---|
| Bouton d'ouverture | .opini-trigger | La pastille qui flotte dans le coin. |
| Logo du bouton | .opini-trigger-mark | Le logo Opini à gauche du libellé. Désactivable dans les réglages du widget. |
| Lien « Powered by » | .opini-powered | Le petit lien « Powered by Opini ». Désactivable dans les réglages du widget. |
| Bouton bulle | .opini-bubble | Ajouté au bouton quand sa forme est Bulle. |
| Forme de la bulle | .opini-bubble-shape | La bulle elle-même. Sa couleur est le fond. |
| Pupille de la bulle | .opini-bubble-pupil | Le point dans la bulle. |
| Libellé de la bulle | .opini-trigger-label | Le libellé qui apparaît à côté de la bulle au survol. |
| Conteneur du popover | .opini-popover | Tout le panneau de feedback. Une feuille en bas de l'écran sur mobile. |
| En-tête | .opini-head | L'icône, le titre, le sous-titre et le bouton fermer. |
| Icône de l'en-tête | .opini-tile | Le carré teinté avec le logo Opini. |
| Bouton fermer | .opini-close | Le × dans le coin du popover. |
| Titre du formulaire | .opini-title | Le grand texte en haut. |
| Sous-titre du formulaire | .opini-sub | La ligne plus petite sous le titre. |
| Formulaire | .opini-form | L'élément <form> qui entoure tous les champs. |
| Zone de message | .opini-message | Là où le visiteur écrit son retour. |
| Champ nom | .opini-name | Champ nom. Obligatoire, masqué quand vous identifiez l'utilisateur. |
| Champ e-mail | .opini-email | Champ e-mail. Obligatoire, masqué quand vous identifiez l'utilisateur. |
| Ligne de champ | .opini-field | Une ligne : le libellé à gauche, le champ à droite. |
| Lignes nom et e-mail | .opini-row | Entoure les lignes nom et e-mail. Masquez-le et les deux deviennent facultatifs. |
| Libellé de ligne | .opini-field-label | Le libellé dans une ligne. |
| Ligne en erreur | .opini-field.opini-invalid | Une ligne dont le champ est à corriger. |
| Erreur de champ | .opini-err | Le message sous un champ à corriger. |
| Zone de pièce jointe | .opini-attach-region | La partie gauche du pied. Les visiteurs peuvent aussi coller ou déposer une image n'importe où sur le panneau. |
| Lien de pièce jointe | .opini-attach-btn | Le lien « + Joindre une image » affiché avant le choix d'une image. |
| Aperçu de la pièce jointe | .opini-attach-preview | La ligne miniature + nom de fichier affichée après le choix d'une image. |
| Miniature de la pièce jointe | .opini-attach-thumb | Le petit aperçu dans la ligne de l'image choisie. |
| Bouton retirer l'image | .opini-attach-remove | Le × qui retire l'image choisie pour en choisir une autre. |
| Erreur d'envoi | .opini-msg | Affiché au-dessus du pied quand l'envoi échoue. |
| Variante d'erreur | .opini-msg.opini-msg-err | Comme ci-dessus, mais seulement quand une erreur s'affiche. |
| Pied | .opini-foot | La ligne du bas avec le lien de pièce jointe et le bouton envoyer. |
| Bouton envoyer | .opini-submit | Le bouton envoyer. |
| État de réussite | .opini-success | Remplace le formulaire après un envoi réussi. |
| Coche de réussite | .opini-check | La grande coche de l'état de réussite. |
| Titre de réussite | .opini-thanks | Le titre de remerciement. |
Les anciens noms courts (.trigger, .popover, …) restent disponibles à côté des classes préfixées pendant une version mineure. Passez au contrat .opini-* dès maintenant : les alias disparaîtront à la version suivante.
Où le coller
Ouvrez Paramètres → Widget de votre projet, dépliez CSS personnalisé (avancé) et collez votre feuille de style dans le champ. Enregistrez : le prochain chargement de page sur votre site la prend en compte. Le CSS est injecté dans le shadow root du widget après la feuille de style intégrée, l'ordre suffit donc à surcharger n'importe quelle règle. Pas de surenchère de !important.
Le Shadow DOM limite la portée : votre CSS cible le widget et rien d'autre sur la page.
Exemples
Trois points de départ à copier-coller. Chacun se colle tel quel dans le champ CSS personnalisé.
Fenêtre centrée
Placez le popover au milieu de l'écran au lieu de l'ancrer au coin du bouton.
/* 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;
}Éditorial sombre
Titre à empattements, bordure fine, accent bordeaux. À associer à 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; }Notification compacte
Réduisez le bouton à un cercle et le popover à un champ compact, pour les sites où le feedback est une remarque rapide.
/* 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
- Jusqu'à 32 Ko de CSS par projet.
</styleet<scriptsont refusés (ils sortiraient de la balise<style>injectée).- Les octets NUL sont refusés.
- Polices personnalisées : faites un
@importd'une URL Google Fonts dans votre CSS ; le widget les charge depuis le navigateur du visiteur. Opini n'héberge pas de fichiers de police. - Nous n'analysons pas le CSS : un CSS invalide ne s'applique simplement pas, comme partout.