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.
Triggers a user action. Four variants, each with a precise hierarchy and use case. The critical variant carries special behavioral rules for irreversible actions.
VariantesVariants
Primary — action principale, 1 maximum par sectionPrimary — main action, 1 maximum per section
Secondary — action alternativeSecondary — alternative action
Ghost — action tertiaire, faible emphaseGhost — tertiary action, low emphasis
Critical — action irréversible (confirmation obligatoire)Critical — irreversible action (confirmation required)
Règles absoluesAbsolute rules
- Maximum 1 bouton
primarypar section ou formulaireMaximum 1primarybutton per section or form - Toujours un libellé explicite — jamais "OK" ou "Confirmer" seulAlways an explicit label — never "OK" or "Confirm" alone
- Le bouton
criticalDOIT déclencher un pattern de confirmationThecriticalbutton MUST trigger a confirmation pattern - Toujours un
:focus-visiblevisible —outline: 2px solid var(--sda-semantic-color-border-focus)Always a visible:focus-visible—outline: 2px solid var(--sda-semantic-color-border-focus) - Jamais deux boutons
primarycôte à côteNever twoprimarybuttons side by side - Jamais de couleur ou espacement en durNever hardcoded colors or spacing
- Jamais de variante inventée hors de
component.jsonNever an invented variant outsidecomponent.json
Tokens de composantComponent tokens
| Token CSS | Référence sémantiqueSemantic reference | Valeur résolueResolved value |
|---|---|---|
--sda-component-button-primary-background | semantic.color.action.primary | #12a594 |
--sda-component-button-primary-background-hover | semantic.color.action.primary-hover | #0d9b8a |
--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 | #12a594 |
--sda-component-button-secondary-border | semantic.color.action.primary | #12a594 |
--sda-component-button-ghost-text | semantic.color.action.primary | #12a594 |
AccessibilitéAccessibility
- Contraste minimum 4.5:1 sur fond blanc (WCAG AA)Minimum contrast 4.5:1 on white background (WCAG AA)
- Navigation clavier complète — Tab, Enter, SpaceFull keyboard navigation — Tab, Enter, Space
- Focus visible :
outline: 2px solid var(--sda-semantic-color-border-focus); outline-offset: 2pxVisible focus:outline: 2px solid var(--sda-semantic-color-border-focus); outline-offset: 2px - Pour les boutons icône seul :
aria-labelobligatoireFor icon-only buttons:aria-labelrequired - État
loading:aria-busy="true"+ largeur préservéeloadingstate:aria-busy="true"+ width preserved - État
disabled:aria-disabled="true"oudisableddisabledstate:aria-disabled="true"ordisabled
Règles spéciales — variante criticalSpecial rules — critical variant
Token component.button.critical.$metadata.requires-confirmation = true. Avant d'utiliser cette variante, vérifier :Before using this variant, verify:
- Le pattern de confirmation existe dans l'interface (modale, popconfirm)The confirmation pattern exists in the UI (modal, popconfirm)
- Le libellé décrit l'action — ex: "Supprimer définitivement le dossier"The label describes the action — e.g. "Delete folder permanently"
- Le contraste est ≥ 4.5:1 sur fond blancContrast is ≥ 4.5:1 on white background
- L'agent escalade à un humain si le caractère irréversible de l'action n'est pas certainThe agent escalates to a human if the irreversibility of the action is uncertain
Implémentation — Lit Web ComponentImplementation — 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
À faireDo
- Libellé explicite décrivant l'action (« Supprimer définitivement le dossier »)Explicit label describing the action ("Delete folder permanently")
- Maximum 1 bouton
primarypar section ou formulaireMaximum 1primarybutton per section or form - Toujours un
:focus-visiblevisible pour la navigation clavierAlways a visible:focus-visiblefor keyboard navigation - État
loadingavecaria-busy="true"pour les actions asynchronesloadingstate witharia-busy="true"for async actions - Pattern de confirmation obligatoire avant chaque action
criticalMandatory confirmation pattern before eachcriticalaction
À éviterDon't
- Libellé vague : « OK », « Confirmer », « Valider » seulVague label: "OK", "Confirm", "Submit" alone
- Deux boutons
primarycôte à côte dans le même formulaireTwoprimarybuttons side by side in the same form - Couleurs ou espacements en dur (
style="background:red")Hardcoded colors or spacing (style="background:red") - Variantes inventées hors de
tokens/component.jsonInvented variants outsidetokens/component.json - Bouton
criticalsans pattern de confirmationcriticalbutton without a confirmation pattern
Anti-patternsAnti-patterns
| MauvaisBad | PourquoiWhy |
|---|---|
<button style="background:red">Supprimer</button> | Valeur en dur, variante non reconnue, pas de tokenHardcoded value, unrecognized variant, no token |
<sda-button variant="critical">OK</sda-button> | Libellé non explicite pour une action critiqueNon-explicit label for a critical action |
Deux variant="primary" dans le même formulaireTwo variant="primary" in the same form | Hiérarchie cassée — perte de clarté UXBroken hierarchy — loss of UX clarity |
<sda-button variant="danger"> | Variante inexistante — escalader, demander la variante correcteNon-existent variant — escalate, ask for the correct variant |