Personnalisation
Les écrans et les couleurs se préparent dans la console, puis s’attachent au widget par un seul identifiant.
Vous ne décrivez pas l’apparence du widget dans votre code. Vous préparez une personnalisation dans la console ops, et vous l’attachez au widget par son identifiant.
Cette séparation est le but recherché. Les personnes qui décident de l’allure du widget sont rarement celles qui déploient la page, et un changement de palette ne devrait pas demander une livraison.
1. Créer une personnalisation dans la console
Dans la console ops, l’atelier de personnalisation permet de préparer et de prévisualiser ce que le widget affichera. Pour une personnalisation v2, il couvre la quasi-totalité de la surface, écran par écran :
| Ce que vous pouvez changer | Où |
|---|---|
| Les écrans que le parcours comporte | Chaque écran s’affiche ou non |
| Le contenu d’un écran, élément par élément | Un arbre qui s’édite nœud par nœud, dans les dix langues |
| Les cases de consentement que l’écran demande | Quatre cases, chacune affichée ou non ; les deux premières le sont d’origine, les deux autres sont à écrire |
| Le cadre autour des écrans — barre d’outils, panneau du menu, surface placée dessous | Des arbres, qui s’éditent comme le contenu d’un écran |
| Chaque bouton, son libellé et son apparence | Un petit arbre par langue, qui s’édite comme le contenu d’un écran |
| Entrées du menu, textes du formulaire | Un champ par langue, avec une recopie vers toutes |
| Les entrées que le menu propose | Les trois entrées documentaires s’affichent ou non ; le choix de la langue reste toujours |
| La bulle qui désigne le bouton du menu | Son contenu, son lien de fermeture, et l’écran de consignes qui la montre |
| Couleurs, espacements, dimensions, rôles typographiques | Sur n’importe quel nœud, et sur chaque bouton séparément, par langue |
| Le formulaire d’informations personnelles | Chaque champ présent ou non, obligatoire ou non, avec ses bornes, et le système d’unités proposé d’abord — y compris un identifiant libre qui vous est propre (externalId), absent par défaut et rendu dans le userData du résultat |
| Le départ de la mesure | De lui-même une fois le visage immobile, ou sur un bouton ; et la durée d’immobilité exigée |
| Les couleurs de l’écran de résultat | Une paire par valeur mesurée |
| Valeurs mesurées, étiquettes, langue d’ouverture | Ensemble, comme réglages de mesure |
Le contenu d’un écran est un arbre d’éléments — conteneurs, paragraphes, textes, images, liens. On y ajoute un enfant, on le déplace, on le duplique, on change son type, on règle ce qu’il porte. L’atelier ne propose que ce que le widget accepte à cet endroit : un arbre construit là est un arbre que le widget affichera.
Trois choses restent telles que le widget les livre : les trois documents du menu — notice d’utilisation, conditions d’utilisation, politique de confidentialité —, qui sont le texte propre du fabricant ; les noms des langues dans le panneau des langues, chacun écrit dans sa propre langue ; et la courte ligne d’état sous le cadre, sur l’écran de placement.
Un widget en fonctionnement se tient à côté des réglages, sur l’écran même que vous éditez — tous les écrans, y compris ceux qu’aucun réglage n’atteint : le résultat, les deux fins anormales et les cinq refus de la caméra sont montrés avec des données fabriquées, de sorte que leur apparence se juge sans avoir à les provoquer. Ce que vous validez est ce que vos utilisateurs verront, et le widget refuse de démarrer sur un arbre qu’il ne saurait pas afficher, ce qui est la façon dont une erreur se voit avant d’être enregistrée. Le même atelier sert aux deux versions du widget ; la page v1 montre celui de la v1 en images.
À côté de cette vue écran par écran, l’aperçu montre aussi le widget entier, tel qu’un intégrateur le monte : les commandes fonctionnent, le parcours se déroule de bout en bout, et une mesure peut y être prise. C’est ce vers quoi on va pour juger un enchaînement plutôt qu’un écran — au prix que chaque modification recharge le widget, donc reprend le parcours à son début.
Une personnalisation appartient à votre compte, porte un nom et une description, et est rattachée à une version du widget. Plusieurs peuvent coexister : une par produit, par marque, par campagne.
2. L’attacher au widget
Ajoutez son identifiant à l’adresse depuis laquelle vous chargez le widget.
<script type="module">
import SaphereScan from "https://cdn.saphere.ai/saphere-scan/v2/main.js?customizationId=8f1c2d34-5a6b-4c7d-8e9f-0a1b2c3d4e5f"
</script>
Rien d’autre ne change dans votre intégration : même appel, mêmes options, mêmes événements. Le widget est servi en portant déjà la personnalisation.
Un identifiant qui ne désigne aucune personnalisation v2 sur cet environnement — une personnalisation préparée sur l’autre environnement, une autre préparée pour le widget v1, une faute de frappe — n’est pas une erreur : le widget est servi avec ses propres défauts, sans rien signaler. Une valeur qui n’est pas du tout un identifiant fait répondre une erreur à l’adresse, et l’import échoue. Pour savoir ce que porte une adresse donnée, importez depuis elle et appelez describeDefaults().
Elle se comporte comme une charge d’options partielle, posée entre les défauts du widget et les vôtres : ce qu’elle ne dit pas reste au défaut, et ce que vous passez à create() ou à setOptions() l’emporte sur elle. C’est ce qui permet de laisser une personnalisation décider de l’apparence tout en gardant la main, dans le code, sur ce qui dépend de l’utilisateur.
Une adresse, deux décisions
L’adresse depuis laquelle vous chargez décide déjà de l’environnement —cdn.test.saphere.ai atteint le Test, cdn.saphere.ai la Production. Elle décide désormais aussi de l’apparence. Une personnalisation préparée sur le Test n’est pas le même enregistrement qu’une personnalisation préparée en Production : son identifiant ne se transpose donc pas. Voir Environnements.Ce qui reste dans votre code
Certains réglages relèvent de l’intégration et non de l’apparence, et restent donc dans les options que vous passez à create(). Vos options s’appliquent en dernier : partout où elles et la personnalisation disent quelque chose, ce sont les vôtres qui l’emportent.
| Option | Pourquoi elle reste chez vous |
|---|---|
lang | La langue dépend de votre utilisateur. Sans elle, le widget suit la langue du navigateur — sauf si la personnalisation fixe une langue d’ouverture, qui vaut alors pour tous |
proxy.retrieveAccessToken | Elle nomme votre propre point d’entrée |
createMeasureOptions | Elle porte ce que vous savez de la personne mesurée |
onEvent, hooks | C’est votre code |
Modifier une personnalisation
Modifiez-la dans l’atelier. Le widget reprend la nouvelle version au chargement suivant, sans aucun déploiement de votre côté, puisque l’identifiant dans votre page ne change pas.
C’est aussi pourquoi une personnalisation mérite d’être relue avant d’être enregistrée : elle prend effet pour tous ceux qui utilisent cet identifiant.
Partir de ce que le widget livre
L’atelier part des contenus par défaut du widget plutôt que d’une page blanche, et ne garde que ce que vous avez changé : ce que vous laissez tel quel suit le widget et ses évolutions, ce que vous éditez reste comme vous l’avez laissé.
Si vous construisez votre propre outillage, le même point de départ s’obtient depuis le module :
import SaphereScan from "https://cdn.saphere.ai/saphere-scan/v2/main.js"
// ce que le widget appliquerait sans rien lui passer : toute l'arborescence des options, en JSON
const defaults = SaphereScan.describeDefaults()
// ce qu'il appliquerait pour les options envisagées, sans rien monter
const resolved = SaphereScan.describeDefaults({ components: { onboarding: { onboarding3: { ignore: false } } } })
La résolution est exactement celle de create(), personnalisation comprise : chargé depuis une adresse portant un customizationId, le module décrit ce que ce bundle appliquerait, et non les défauts nus. Elle lève sur des options que le widget refuserait — de quoi vérifier une charge avant de la livrer. Deux choses n’en ressortent pas : tout ce qui est une fonction — onEvent, les hooks, le fetch d’une stratégie handle, un createMeasureOptions écrit en fonction —, et les dessins que le widget embarque, qui sont du code et non des données.
Disponibilité
L’atelier et le paramètrecustomizationId accompagnent le déploiement du widget v2, qui est en bêta. Demandez à i-Virtual où ils en sont pour votre compte avant de bâtir une livraison dessus.