Button
Déclenche une action utilisateur. Quatre variantes, chacune avec une hiérarchie et un usage précis. La variante critical porte des règles comportementales spéciales pour les actions irréversibles.
Variantes
Primary — action principale, 1 maximum par section
Secondary — action alternative
Ghost — action tertiaire, faible emphase
Critical — action irréversible (confirmation obligatoire)
Règles absolues
- Maximum 1 bouton
primarypar section ou formulaire - Toujours un libellé explicite — jamais "OK" ou "Confirmer" seul
- Le bouton
criticalDOIT déclencher un pattern de confirmation - Toujours un
:focus-visiblevisible —outline: 2px solid var(--sda-semantic-color-border-focus) - Jamais deux boutons
primarycôte à côte - Jamais de couleur ou espacement en dur
- Jamais de variante inventée hors de
component.json
Tokens de composant
| Token CSS | Référence sémantique | Valeur résolue |
|---|---|---|
--sda-component-button-primary-background | semantic.color.action.primary | #0d74ce |
--sda-component-button-primary-background-hover | semantic.color.action.primary-hover | #113264 |
--sda-component-button-primary-background-disabled | semantic.color.action.primary-disabled | #d9d9d9 |
--sda-component-button-primary-text | semantic.color.text.on-action | #ffffff |
--sda-component-button-primary-padding-x | semantic.space.control.padding-x | 16px |
--sda-component-button-primary-padding-y | semantic.space.control.padding-y | 8px |
--sda-component-button-primary-radius | semantic.radius.control | 6px |
--sda-component-button-critical-background | semantic.color.feedback.danger | #ce2c31 |
--sda-component-button-secondary-text | semantic.color.action.primary | #0d74ce |
--sda-component-button-secondary-border | semantic.color.action.primary | #0d74ce |
--sda-component-button-ghost-text | semantic.color.action.primary | #0d74ce |
Accessibilité
- Contraste minimum 4.5:1 sur fond blanc (WCAG AA)
- Navigation clavier complète — Tab, Enter, Space
- Focus visible :
outline: 2px solid var(--sda-semantic-color-border-focus); outline-offset: 2px - Pour les boutons icône seul :
aria-labelobligatoire - État
loading:aria-busy="true"+ largeur préservée - État
disabled:aria-disabled="true"oudisabled
Règles spéciales — variante critical
Token component.button.critical.$metadata.requires-confirmation = true. Avant d'utiliser cette variante, vérifier :
- Le pattern de confirmation existe dans l'interface (modale, popconfirm)
- Le libellé décrit l'action — ex: "Supprimer définitivement le dossier"
- Le contraste est ≥ 4.5:1 sur fond blanc
- L'agent escalade à un humain si le caractère irréversible de l'action n'est pas certain
Implémentation — Lit Web Component
import { LitElement, html, css } from 'lit';
class DsButton extends LitElement {
static properties = {
variant: { type: String }, // 'primary' | 'secondary' | 'critical' | 'ghost'
disabled: { type: Boolean },
loading: { type: Boolean },
};
static styles = css`
button {
background: var(--sda-component-button-primary-background);
color: var(--sda-component-button-primary-text);
padding: var(--sda-component-button-primary-padding-y) var(--sda-component-button-primary-padding-x);
border-radius: var(--sda-component-button-primary-radius);
font-size: var(--sda-semantic-typography-label-size);
font-weight:var(--sda-semantic-typography-label-weight);
border: none; cursor: pointer;
}
button:focus-visible {
outline: 2px solid var(--sda-semantic-color-border-focus);
outline-offset: 2px;
}
`;
}
customElements.define('ds-button', DsButton);
DOs et DON'Ts
À faire
- Libellé explicite décrivant l'action (« Supprimer définitivement le dossier »)
- Maximum 1 bouton
primarypar section ou formulaire - Toujours un
:focus-visiblevisible pour la navigation clavier - État
loadingavecaria-busy="true"pour les actions asynchrones - Pattern de confirmation obligatoire avant chaque action
critical
À éviter
- Libellé vague : « OK », « Confirmer », « Valider » seul
- Deux boutons
primarycôte à côte dans le même formulaire - Couleurs ou espacements en dur (
style="background:red") - Variantes inventées hors de
tokens/component.json - Bouton
criticalsans pattern de confirmation
Anti-patterns
| Mauvais | Pourquoi |
|---|---|
<button style="background:red">Supprimer</button> | Valeur en dur, variante non reconnue, pas de token |
<sda-button variant="critical">OK</sda-button> | Libellé non explicite pour une action critique |
Deux variant="primary" dans le même formulaire | Hiérarchie cassée — perte de clarté UX |
<sda-button variant="danger"> | Variante inexistante — escalader, demander la variante correcte |