📚 Cours SCSS (Sass) 📍 Chapitre 14 / 21

Gestion avancée des couleurs avec SCSS

Les couleurs sont au cœur de l'identité visuelle d'un site. Avec SCSS, tu peux aller bien plus loin que "mettre des hex codes" partout : tu peux construire des palettes, générer des variantes (hover/active), gérer des thèmes et garder une cohérence visuelle sur tout un projet. Ce chapitre te donne des méthodes simples mais professionnelles.

Objectifs du chapitre

  • Comprendre comment structurer une palette de couleurs en SCSS.
  • Utiliser les fonctions Sass pour manipuler les couleurs.
  • Générer des variantes (hover, active, border) de manière cohérente.
  • Organiser les couleurs avec des maps (design tokens).
  • Mettre en place les bases d'un système de thèmes.
À retenir

Les couleurs "au hasard" donnent un rendu incohérent. SCSS t'aide à formaliser une palette et à la faire vivre dans tout le projet.

Explications théoriques détaillées

Problème classique : valeurs répétées et incohérentes

Dans un projet CSS classique, tu finis souvent avec plusieurs bleus proches : #7aa7ff, #79a6ff, #7ca8ff… juste parce que quelqu'un a "ajusté".

Résultat : le design perd sa cohérence, et les changements deviennent pénibles.

Conseil terrain

En pro, on évite les "couleurs sauvages" dans les composants. On centralise des tokens (couleurs) et on dérive des variantes.

Les grandes familles de fonctions de couleur

Sass propose plusieurs fonctions pour manipuler des couleurs :

  • Éclaircir / assombrir : lighten(), darken()
  • Mélanger : mix()
  • Transparence : rgba(), transparentize(), opacify()
  • Composantes : red(), green(), blue()
À retenir

Ces fonctions s'exécutent à la compilation SCSS. Le navigateur ne reçoit que des valeurs finales.

Palette et "design tokens"

Une bonne pratique consiste à définir une palette :

  • Couleurs "brand" (primary, secondary)
  • Couleurs d'état (success, warning, danger)
  • Couleurs neutres (fond, texte, bordures)

Ensuite, tu construis tes composants à partir de ces tokens.

Exemples simples

Créer une couleur principale + variante hover

SCSS :

SCSS
$primary: #7aa7ff;

.button {
  background: $primary;
  color: white;

  &:hover {
    background: darken($primary, 8%);
  }
}

CSS généré (extrait) :

CSS
.button {
  background: #7aa7ff;
  color: white;
}

.button:hover {
  background: #5b95ff; /* valeur calculée par Sass */
}
Important

Le navigateur reçoit une couleur finale. La valeur exacte dépend du calcul Sass. Ce qui compte ici : tu n'écris pas une nouvelle couleur "à la main".

Ajouter une transparence proprement

Pour des overlays, des ombres ou des bordures "soft", la transparence est très utile.

SCSS :

SCSS
$primary: #7aa7ff;

.card {
  border: 1px solid rgba($primary, .35);
  background: rgba($primary, .08);
}

Utiliser mix() pour créer une couleur intermédiaire

mix() mélange deux couleurs. Très utile pour créer des teintes "neutres" cohérentes.

SCSS :

SCSS
$primary: #7aa7ff;
$black: #000;

$primary-dark: mix($primary, $black, 80%);

.title {
  color: $primary-dark;
}

Exemples concrets et professionnels

Cas pro 1 : map de couleurs + fonction d'accès

On structure les couleurs dans une map, puis on crée une fonction pour les récupérer. Ça évite d'utiliser map-get partout.

SCSS :

SCSS
$colors: (
  primary: #7aa7ff,
  secondary: #ffb703,
  success: #22c55e,
  warning: #f59e0b,
  danger:  #ef4444,
  text:    #ffffff,
  bg:      #0b1020
);

@function color($name) {
  @if map-has-key($colors, $name) {
    @return map-get($colors, $name);
  } @else {
    @warn "Couleur inconnue : #{$name}";
    @return #ffffff;
  }
}

body {
  background: color(bg);
  color: color(text);
}

.btn {
  background: color(primary);
  color: color(text);
}
Conseil terrain

Cette approche te permet de contrôler toutes les couleurs du projet depuis un seul fichier. C'est une base solide pour un design system.

Cas pro 2 : générer automatiquement des variantes (hover, active, border)

Plutôt que de définir à la main toutes les variantes, on les dérive.

SCSS :

SCSS
$colors: (
  primary: #7aa7ff,
  success: #22c55e,
  danger:  #ef4444
);

@function variant($c, $type) {
  @if $type == hover {
    @return darken($c, 8%);
  } @else if $type == active {
    @return darken($c, 14%);
  } @else if $type == soft {
    @return rgba($c, .12);
  } @else if $type == border {
    @return rgba($c, .35);
  } @else {
    @return $c;
  }
}

@each $name, $value in $colors {
  .btn--#{$name} {
    background: $value;
    color: white;
    border: 1px solid transparent;

    &:hover { background: variant($value, hover); }
    &:active { background: variant($value, active); }

    &.is-soft {
      background: variant($value, soft);
      color: $value;
      border-color: variant($value, border);
    }
  }
}

Tu obtiens un système cohérent : chaque couleur a les mêmes variantes calculées.

Cas pro 3 : thèmes (dark/light) avec tokens couleur

Un pattern fréquent : deux thèmes avec les mêmes tokens (bg, text, etc.).

SCSS :

SCSS
$themes: (
  dark: (
    bg: #0b1020,
    text: #ffffff,
    surface: rgba(255,255,255,.08)
  ),
  light: (
    bg: #ffffff,
    text: #111827,
    surface: rgba(17,24,39,.06)
  )
);

@function theme($mode, $token) {
  @return map-get(map-get($themes, $mode), $token);
}

body[data-theme="dark"] {
  background: theme(dark, bg);
  color: theme(dark, text);
}

body[data-theme="light"] {
  background: theme(light, bg);
  color: theme(light, text);
}

.card {
  background: theme(dark, surface);
}
À retenir

L'idée : on ne change pas le code des composants, on change juste les tokens du thème.

Bonnes pratiques

  • Centraliser les couleurs dans une map (tokens).
  • Créer des fonctions d'accès (color(), theme()) pour éviter les répétitions.
  • Dériver les variantes (hover/active/border) plutôt que créer des nouvelles couleurs "à la main".
  • Limiter le nombre de couleurs "brand" : mieux vaut une palette courte et cohérente.
  • Penser contraste et accessibilité (texte lisible sur fond).
Conseil terrain

Quand tu doutes d'une couleur, n'invente pas une teinte au hasard : reviens aux tokens et dérive une variante (darken/lighten/mix/rgba).

Erreurs courantes

Erreur 1 : multiplier les couleurs légèrement différentes

C'est le piège numéro 1 : tu perds la cohérence visuelle et tu compliques la maintenance.

Erreur 2 : calculer des variantes partout, sans centraliser

Si tu fais darken(...) dans tous les composants, tu recrées de la duplication. Centralise la logique dans une fonction (ex. variant()).

Erreur 3 : oublier le contraste

Une belle couleur ne suffit pas : il faut un texte lisible. Prévois des tokens text et bg cohérents.

Résumé du chapitre

Ce que vous avez appris
SCSS permet de construire des palettes cohérentes et maintenables.
Les fonctions de couleur (darken, mix, rgba…) servent à dériver des variantes.
Les maps permettent de centraliser les tokens (design tokens).
Les thèmes reposent sur des tokens partagés, pas sur des composants dupliqués.

Prochain chapitre : Typographie avec SCSS

Dans le prochain chapitre, nous aborderons la typographie avec SCSS : tailles, line-height, échelles typographiques, responsive, et organisation propre des styles de texte.

  • Variables typographiques et échelles de taille
  • Gestion des line-height et des marges typographiques
  • Responsive typography avec mixins
  • Organisation des styles de texte dans un système de design