Les exemples suivent le métier, la densité et le thème choisis.

Fondations

Mouvement

stableClasses hb-list-row--new hb-toast-enter hb-skeleton-pulse

Tokens

TokenValeurUsage
--duration-press120 msenfoncement d'un bouton, d'une touche, d'une case
--duration-state180 mschangement d'état : fond, couleur, filet, survol, focus
--duration-tooltip150 msinfobulle
--duration-menu220 msmenu, toast, accordéon, coche, apparition d'une ligne
--duration-drawer360 mspanneau latéral, dialogue
--ease-outsortie rapideétat, enfoncement, focus
--ease-springressort léger, 7 % de dépassementce qui confirme : coche, radio, interrupteur, menu, dialogue, toast
--ease-movesymétriquedéplacement, barre indéterminée, balayage
--ease-drawerlongue décélérationpanneau latéral

En JavaScript, Hublot.motion donne les mêmes valeurs pour une <transition> Vue ou l'API Web Animations. Le ressort est une courbe linear() : Safari iOS 17.2 et plus, Chrome 113 et plus ; ailleurs la transition se fait en ease, sans casse.

Ce qui bouge, et pourquoi

MomentMouvementCe qu'il dit
appui sur un bouton, une touchescale(.97) en 120 ms« c'est pris » sous le doigt
case cochée, radio choisila coche apparaît avec un léger rebondl'état a changé
interrupteurla pastille glisse avec un rebond et s'étire sous le doigtcomme sur iOS : on sent le basculement
focus clavierl'anneau se resserre sur le contrôleoù est le focus maintenant
menu, dialogueapparaît de 4 px plus haut, de 97 % à 100 %d'où il vient, sans masquer d'un coup
toastmonte du bas avec un rebondune confirmation est arrivée
ligne ajoutée (hb-list-row--new, is-new)éclat métier et barre à gauche qui s'éteignent en 1,6 soù est ce qu'on vient d'ajouter
chargementbalayage lumineux sur le squelette, anneau qui tourneça avance
changement de thèmefondu enchaîné de toute la page (Hublot.setMode)rien n'a sauté
Vérifier les DLC du libre-service
Tâche qui vient d'être ajoutée
Code
<div class="hb-row" style="gap:var(--space-5)">
  <button class="hb-btn hb-btn-primary">Appuyer</button>
  <label class="hb-check-label"><input type="checkbox" class="hb-check"> Cocher</label>
  <label class="hb-check-label"><input type="radio" class="hb-radio" name="mv"> Choisir</label>
  <label class="hb-check-label"><input type="checkbox" class="hb-switch"> Basculer</label>
</div>
<div class="hb-list" style="max-width:560px">
  <div class="hb-list-row"><span class="hb-list-handle"></span><input type="checkbox" class="hb-check hb-list-check" aria-label="Faite"><div class="hb-list-body"><span class="hb-list-title">Vérifier les DLC du libre-service</span></div></div>
  <div class="hb-list-row hb-list-row--new"><span class="hb-list-handle"></span><input type="checkbox" class="hb-check hb-list-check" aria-label="Faite"><div class="hb-list-body"><span class="hb-list-title">Tâche qui vient d'être ajoutée</span></div></div>
</div>
<div class="hb-card hb-card-body hb-skeleton-pulse" style="max-width:420px"><span class="hb-skeleton hb-skeleton--text" style="width:50%"></span><span class="hb-skeleton"></span><span class="hb-skeleton hb-skeleton--block" style="margin-top:var(--space-3)"></span></div>

Règles

  • Une animation répond à une action ou montre une attente. Aucune entrée animée de section, aucun survol qui fait bouger une carte.
  • transform et opacity seulement pour ce qui se déplace ; les couleurs et filets changent en --duration-state. Jamais d'animation de height, width ou top : saccades sur les tablettes d'entrée de gamme.
  • Le rebond reste léger et court ; il n'est jamais posé sur un déplacement long (panneau latéral, page).
  • prefers-reduced-motion ramène tout à un fondu court ; seul l'anneau de chargement continue, parce qu'il porte une information.