Dans un projet professionnel, on veut des boutons cohérents : mêmes tailles,
mêmes radius, mêmes états hover/focus. Une mixin centralise cette logique.
// Mixin de base pour les boutons
@mixin button-core(
$bg: #3b82f6,
$text: white,
$radius: 12px,
$padding: 10px 16px
) {
background: $bg;
color: $text;
padding: $padding;
border-radius: $radius;
border: 1px solid transparent;
cursor: pointer;
font-weight: 600;
font-size: 14px;
text-align: center;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
transition: all 0.2s ease;
text-decoration: none;
user-select: none;
// États
&:hover {
background: darken($bg, 10%);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
&:active {
transform: translateY(0);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
&:focus-visible {
outline: 3px solid rgba($bg, 0.4);
outline-offset: 2px;
}
&:disabled {
opacity: 0.6;
cursor: not-allowed;
pointer-events: none;
}
// Variante loading
&.loading {
position: relative;
color: transparent;
&::after {
content: '';
position: absolute;
width: 16px;
height: 16px;
border: 2px solid rgba(255, 255, 255, 0.3);
border-top-color: white;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
}
}
// Application
.btn {
@include button-core();
}
.btn--danger {
@include button-core($bg: #ef4444);
}
.btn--success {
@include button-core($bg: #10b981);
}
.btn--outline {
@include button-core($bg: transparent, $text: #3b82f6);
border-color: rgba(59, 130, 246, 0.6);
&:hover {
background: rgba(59, 130, 246, 0.1);
}
}
.btn--small {
@include button-core($padding: 6px 12px, $radius: 8px);
font-size: 13px;
}
.btn--large {
@include button-core($padding: 14px 24px, $radius: 16px);
font-size: 16px;
}
Conseil terrain
Mets les mixins de "design system" (boutons, cartes, typographie, formulaires)
dans un dossier dédié (ex: abstracts/mixins/) et versionne-les
comme des briques réutilisables. Documente-les avec des commentaires expliquant
les paramètres et les cas d'usage.