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

Tokens de composant

Token CSSRéférence sémantiqueValeur résolue
--sda-component-button-primary-backgroundsemantic.color.action.primary#0d74ce
--sda-component-button-primary-background-hoversemantic.color.action.primary-hover#113264
--sda-component-button-primary-background-disabledsemantic.color.action.primary-disabled#d9d9d9
--sda-component-button-primary-textsemantic.color.text.on-action#ffffff
--sda-component-button-primary-padding-xsemantic.space.control.padding-x16px
--sda-component-button-primary-padding-ysemantic.space.control.padding-y8px
--sda-component-button-primary-radiussemantic.radius.control6px
--sda-component-button-critical-backgroundsemantic.color.feedback.danger#ce2c31
--sda-component-button-secondary-textsemantic.color.action.primary#0d74ce
--sda-component-button-secondary-bordersemantic.color.action.primary#0d74ce
--sda-component-button-ghost-textsemantic.color.action.primary#0d74ce

Accessibilité

Règles spéciales — variante critical

Token component.button.critical.$metadata.requires-confirmation = true. Avant d'utiliser cette variante, vérifier :

  1. Le pattern de confirmation existe dans l'interface (modale, popconfirm)
  2. Le libellé décrit l'action — ex: "Supprimer définitivement le dossier"
  3. Le contraste est ≥ 4.5:1 sur fond blanc
  4. 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 primary par section ou formulaire
  • Toujours un :focus-visible visible pour la navigation clavier
  • État loading avec aria-busy="true" pour les actions asynchrones
  • Pattern de confirmation obligatoire avant chaque action critical

À éviter

  • Libellé vague : « OK », « Confirmer », « Valider » seul
  • Deux boutons primary cô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 critical sans pattern de confirmation

Anti-patterns

MauvaisPourquoi
<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 formulaireHiérarchie cassée — perte de clarté UX
<sda-button variant="danger">Variante inexistante — escalader, demander la variante correcte
Contribuer à ce projetContribute to this project Ce système est ouvert aux contributions — tokens, composants, décisions architecturales, corrections d'accessibilité ou documentation. Toute amélioration est bienvenue. This system welcomes contributions — tokens, components, architectural decisions, accessibility fixes, or documentation. Every improvement counts.
Voir sur GitHub → View on GitHub →