Atomic Design.
Objectif : Eviter les problèmes de communication entre la phase de design et la phase de développement.
L’alignement sur un vocabulaire partagé est essentiel pour la collaboration entre les équipes produits. Pour cela nous utiliserons la méthodologie de l'Atomic Design de Brad Frost pour nommer notre framework UI. Il est impératif que nos conventions de nommage utilisées dans Sketch correspondent à celles de notre base de code. C’est la garantie que nos ingénieurs, nos designers et nos chefs de produits utilisent tous le même jargon.
Nous utilisons la convention de nommage BEMIT (BEM + ITCSS), pour nommer les composants d'une manière facile et compréhensible.
ITCSS (Inverted triangle CSS : Cette convention nous permet de définir la structure des fichiers SCSS selon la méthodologie de l’Atomic design de la manière suivante :
_functions
// Fonctions gobales
_helpers
// « Class » utilitaire, idéalement préfixés avec h-
_mixins
// Vous définissez ici des fonctions et des mixins globalement utilisés, tel que des mixins de taille de police, des fonctions d'assistance rem… etc.
_settings
// C'est là que se trouvent tous les paramètres spécifiques au projet. Vous définissez ici les couleurs, les tailles de police, les familles de polices… etc.
@fonts
// Déclarations @font-face
base
// Normaliser, réinitialiser les styles… etc.
grid
// Pour le système de grille… etc.
atoms
// Éléments HTML de base et tout ce qui ne peut pas être réduit, idéalement préfixés avec a-
molecules
// Combinaisons d’atomes, idéalement préfixés avec m-
organisms
// Combinaisons d'atomes et de molécules, idéalement préfixés avec o-
layouts
// Partie générique de l’interface
vendor
// Fichier CSS où Sass provenant de librairies externes comme Bootstrap où jQuery par exemple.
Chaque « class » est préfixé par un préfixe général : amui-
(Cela permet d’éviter tout conflits avec du CSS provenant de librairies externes).
En plus d'un nom global, nous pouvons ajouter des préfixes à chaque « class » pour les rendre plus clair :
is--
pour les états, comme par exemple .amui-alert .is--active
ou .amui-alert .is--disabled
.js--
pour cibler les fonctionnalités JavaScript, comme par exemple .js--modal-trigger
.Présentation officielle de la méthodologie BEM
Cette méthodologie nous permet de nommer nos composants et ainsi de créer un lien entre le code et la méthodologie de l’Atomic Design.
L’idée est de suivre des conventions pour rendre tous les éléments de la page modulaire, ce qui facilite la réutilisation et la maintenance des éléments ainsi que d’être plus descriptif et compréhensible.
Suivant la méthodologie BEM nos Blocks, Elements et Modifiers sont écrits de la manière suivante (x représente le préfixe des dossiers) :
NB : Notre syntaxe SCSS utilise la version modifiée suivante de BEM pour créer les « modifier » :
.block--modifier
.block.is--modifier
.amui-x-block {}
block représente la racine de l’élément
.amui-x-block__element {}
block__element représente l’enfant d’un block
.amui-x-block.is--modifier {}
is--modifier représente une variation du block. Un modifier n’est jamais préfixé
Suivant le préfixe général, il y a les préfixes des dossiers :
a-
: pour les atomesm-
: pour les moléculeso-
: pour les organismesl-
: pour les layouts (template)h-
: pour les helpersCela permet de savoir rapidement ou le code SCSS de la class CSS se situe.
La combinaison d'un « name spacing global », de préfixes de catégorie et d'une syntaxe BEM donne une chaîne de class explicite qui permet aux développeurs de déduire sa fonctionnalité dans la création de l'interface utilisateur.
Voici un exemple :
.amui-a-btn .is--secondary
amui-
est le « name spacing global » pour tous les styles issus du Guide de Stylea-
est la catégorie de la class, qui signifie atomsbtn
est le nom du block (Block est le B dans BEM)is--secondary
est le modifier, indiquant une varation du block (Modifier est le M dans BEM)Un autre exemple :
.amui-l-primary-nav__submenu
amui-
est le « name spacing global » pour tous les styles issus du Guide de Stylel-
est la catégorie de la class, qui signifie layoutprimary-nav
est le nom du block (Block est le B dans BEM)__submenu
est un élément indiquant qu’il est un enfant du block (Element est le E dans BEM)Example
<div class="amui-m-panel">
<div class="amui-m-panel__heading">
<h3 class="amui-m-panel__heading-title">Panel title</h3>
</div>
<div class="amui-m-panel__body">
<button type="button" class="amui-a-btn is--primary btn">Primary</button>
</div>
<div class="amui-m-panel__footer">
Panel footer
</div>
</div>
Nous utilisons le rem, unité relative pour assurer une meilleure accessibilité pour le plus grand nombre (accessible aux personnes à la vue déficiente) ainsi qu’une meilleure intégration pour tous les supports (Mobile, tablette, ordinateur…etc.).
Pour utiliser les rem plus facilement, nous utilisons une fonction rem()
permettant de convertir les valeurs pixels en rem.
exemple : font-size: rem(12);
Abréviation | Taille |
---|---|
none | 0px |
xxxs | 4px |
xxs | 8px |
xs | 12px |
sm | 16px |
ms | 20px |
md | 24px |
ml | 28px |
lg | 32px |
xl | 36px |
xxl | 40px |
xxxl | 48px |