Cas pro 1 : variantes de boutons (primary / secondary / danger)
Créer un système de boutons cohérent avec différentes variantes visuelles.
SCSS :
@mixin button-variant($type) {
// Styles communs à tous les boutons
padding: 10px 16px;
border-radius: 12px;
font-weight: 600;
border: none;
cursor: pointer;
transition: all 0.3s ease;
// Styles spécifiques selon le type
@if $type == primary {
background: #7aa7ff;
color: white;
&:hover {
background: darken(#7aa7ff, 10%);
transform: translateY(-2px);
}
} @else if $type == secondary {
background: transparent;
color: #7aa7ff;
border: 1px solid #7aa7ff;
&:hover {
background: rgba(122, 167, 255, 0.1);
}
} @else if $type == danger {
background: #ef4444;
color: white;
&:hover {
background: darken(#ef4444, 10%);
}
} @else {
// Variante par défaut (neutre)
background: #94a3b8;
color: white;
}
}
.btn-primary {
@include button-variant(primary);
}
.btn-secondary {
@include button-variant(secondary);
}
.btn-danger {
@include button-variant(danger);
}
CSS généré (extrait pour .btn-primary) :
.btn-primary {
padding: 10px 16px;
border-radius: 12px;
font-weight: 600;
border: none;
cursor: pointer;
transition: all 0.3s ease;
background: #7aa7ff;
color: white;
}
.btn-primary:hover {
background: #5d8fff;
transform: translateY(-2px);
}
Toute la logique visuelle du bouton est centralisée dans une seule mixin. Pour ajouter une nouvelle variante, il suffit d'ajouter une condition.
Cas pro 2 : conditions + boucles (tailles de composants)
Combiner @each et @if pour générer plusieurs tailles d'un même composant.
SCSS :
$sizes: sm, md, lg;
@each $size in $sizes {
.card--#{$size} {
border: 1px solid #e2e8f0;
border-radius: 12px;
@if $size == sm {
padding: 12px;
font-size: 14px;
} @else if $size == md {
padding: 16px;
font-size: 16px;
} @else if $size == lg {
padding: 24px;
font-size: 18px;
}
// Styles conditionnels pour le titre selon la taille
.card__title {
@if $size == sm {
font-size: 16px;
margin-bottom: 8px;
} @else if $size == md {
font-size: 18px;
margin-bottom: 12px;
} @else if $size == lg {
font-size: 20px;
margin-bottom: 16px;
}
}
}
}
CSS généré (extrait pour .card--lg) :
.card--lg {
border: 1px solid #e2e8f0;
border-radius: 12px;
padding: 24px;
font-size: 18px;
}
.card--lg .card__title {
font-size: 20px;
margin-bottom: 16px;
}
Conseil terrain
Si tu empiles trop de @if, pense aux maps SCSS.
Elles seront vues au chapitre suivant et rendent ce code encore plus propre et maintenable.