Fondations
Composants
Patterns & Layouts
Utiliser le système
Couleurs
Quatre couleurs ont un rôle. Le violet #8A3AAF porte toutes les
actions. Le rouge #E2006E est réservé au menu gauche et au wordmark. Le bleu
#3B82F6 ne sert qu'au focus des champs de saisie. Le rouge sombre #B42318
signale le destructif. Tout le reste est neutre.
Typographie
Nous utilisons l'Inter pour tous les corps de texte et les composants, et la Geist pour les titres de page, assurant une esthétique moderne et épurée. Voici les styles extraits des fichiers de production.
Dropdowns
Deux styles de dropdowns : le bouton élégant w-dd-btn (gradient blanc) et le système w-filter-btn (filtres en ligne). Testez l'interaction ci-dessous.
Style 1 — Dropdown bouton élégant (w-dd-wrap)
Style 2 — Boutons de filtres en ligne
Badges & Status
Utilisés pour indiquer un état (Terminé, En cours, Non commencé) ou une catégorie (SA, Siège Social).
Blocs & Cartes (Widgets)
Les widgets de reporting utilisent des icônes colorées avec backgrounds spécifiques. Chaque thème a sa propre couleur d'accent pour une meilleure organisation visuelle.
Variantes d'icônes de widgets
Palette d'icônes par contexte
| Contexte | Background | Couleur SVG | Usage |
|---|---|---|---|
| Stats / Modules | #E0F8EF | #10B981 | Graphiques à barres vert |
| Inscriptions / Utilisateurs | #EDE9FE | #7C3AED | Données de comptes violettes |
| Répartition / Groupes | #FEF3C7 | #B45309 | Donut chart ambre — seule teinte chaude, aucune collision avec le violet de marque |
| Thèmes / Catégories | #EFF6FF | #3B82F6 | Barres horizontales bleu |
| Activité / Temps | #E0F2FE | #0EA5E9 | Line charts cyan |
| Profils / Utilisateurs | #F3E8FF | #A855F7 | Données de profils violet clair |
Formulaires
Pages de réglages longues, découpées en sections, sur deux colonnes. Motifs extraits de la page Paramètres → Carte de visite.
1 — Anatomie d'un champ
| Élément | Traitement | Règle |
|---|---|---|
| Label | 12.5px · 700 · --t2 | Toujours au-dessus, jamais à l'intérieur : un placeholder qui sert de label disparaît à la saisie |
| Obligatoire | <span class="req">*</span> | Astérisque violet collé au label. Quand une majorité de champs est obligatoire, marquer plutôt les champs facultatifs — moins de bruit |
| Champ | 38px · --r · bordure --bd | Plus haut que les boutons sm (30px) : la cible de saisie doit être confortable |
| Aide | .form-hint | Sous le champ, 12px --t3. Pour le format attendu, jamais pour répéter le label |
| Erreur | .form-error | Remplace l'aide, avec l'icône. Dit quoi corriger, pas seulement qu'il y a une erreur |
| Espacement | gap 8px | Entre le label et le champ, et entre le champ et son aide |
2 — Contrôles & états
| État | Sélecteur | Traitement |
|---|---|---|
| Repos | .form-input | Fond blanc, bordure --bd |
| Survol | :hover | Bordure #D6DAE1 — signale la cible avant le clic |
| Focus | :focus | Bordure --s + anneau 3px --s1 : le bleu est réservé à cet usage |
| Lecture seule | [readonly] | Fond --ps, texte --t1 conservé — la valeur reste lisible et sélectionnable |
| Désactivé | :disabled | Fond --bg, texte --t3 — même traitement que les boutons désactivés |
| Erreur | .has-error | Bordure et anneau --d, message sous le champ |
Lecture seule n'est pas désactivé. Lecture seule : la valeur compte et doit rester lisible et
copiable — texte en #0F172A, poids 500. Désactivé : le champ ne s'applique pas au contexte —
texte en --t3.
3 — Groupement en sections
Toujours regrouper en .fs-block : un en-tête à
icône, puis une .fs-card blanche qui contient les grilles. Les sections se posent sur deux
colonnes — un bloc qui prend toute la largeur de la page étire les champs et casse la lecture.
<div class="fs-header">
<div class="fs-icon"><svg>…</svg></div>
<div class="fs-title">Informations générales</div>
</div>
<div class="fs-card">
<div class="form-grid col-full">…</div>
<div class="form-grid">…</div>
</div>
</div>
Sur toute la largeur, un champ court comme « Code postal » s'étire sur 300px et les libellés s'éloignent de leurs valeurs. En deux colonnes, chaque section reste sous 560px : l'œil balaie une carte sans se déplacer.
4 — Import de fichier
Contraintes de poids et de format écrites avant la sélection.
5 — Choix & bascules
| Contrôle | Classe | Quand l'utiliser |
|---|---|---|
| Carte de choix | .form-card-check | 2 à 4 options exclusives dont chacune demande une phrase d'explication |
| Sélecteur | .w-dd-wrap.block | Au-delà de 5 options, ou quand les libellés se passent d'explication — le dropdown du système, en pleine largeur et à 38px |
| Bascule | .form-switch | Un réglage binaire qui prend effet immédiatement, sans enregistrer |
| Case à cocher | .form-check-inline | Une option secondaire qui n'est appliquée qu'à l'enregistrement du formulaire |
6 — Plage de dates
Le déclencheur a le gabarit d'un dropdown de widget, icône
calendrier en --a. Le panneau : les deux bornes en champs, un calendrier mensuel, une colonne de
suggestions. La plage se lit en --a1, ses bornes en --a. Rien n'est appliqué avant
« Appliquer ».
| Élément | Classe | Traitement |
|---|---|---|
| Déclencheur | .drp-btn | 32px · même fond que .w-dd-btn · icône calendrier --a · chevron |
| Panneau | .drp-pop | 640px · radius 14px · ombre 0 12px 32px |
| Bornes | .drp-head .form-input | 36px · 150px · lecture seule, remplies par le calendrier |
| Jour | .drp-day | 46px · 13px · autre mois en --t3 |
| Dans la plage | .drp-day.in | fond --a1, texte --a |
| Bornes de la plage | .drp-day.start / .end | disque --a de 36px centré, texte blanc 600 |
| Suggestions | .drp-sug-item | libellé 13.5px + dates en 11.5px --t3, calculées à l'ouverture |
| Pied | .drp-foot | Annuler puis Appliquer en .primary, filet haut |
<button class="drp-btn" onclick="drpOpen(this)"><svg class="cal">…</svg>
<span class="lbl">janv. 1, 2025</span><span class="arr">→</span><span class="lbl2">déc. 31, 2025</span><svg class="chev">…</svg>
</button>
<div class="drp-pop" data-y="2025" data-m="11" data-start="2025-01-01" data-end="2025-12-31">…</div>
</div>
7 — Layout d'une page de réglages
Deux colonnes de sections, réparties par fréquence de modification : ce qui change souvent à gauche, ce qui est stable (références légales, signature) à droite.
<div class="col"><!-- sections modifiées souvent --></div>
<div class="col"><!-- sections stables --></div>
</div>
Iconographie
Jeu de référence : Eva Icons, variante outline, grille 24 × 24, rendu
en currentColor. Les icônes ci-dessous sont celles du jeu, chargées depuis le paquet officiel —
187 sur les 490. Cliquer une icône copie son nom.
eva-icons n'a pas pu être chargé
depuis jsDelivr — vérifiez l'accès réseau. Les noms restent valides.Navigation
Actions
Contenu & fichiers
Personnes
Communication
Statut & feedback
Données & temps
Média & apparence
| Règle | Détail |
|---|---|
| Variante | outline partout. La variante fill n'est utilisée que pour un état actif de navigation |
| Tailles | 13 / 14 / 16 / 18px dans les boutons selon xs / sm / md / lg ; 15px dans le menu gauche ; 18px en topbar ; 22px seul dans une cellule |
| Couleur | fill: currentColor — l'icône prend la couleur du texte du composant qui la porte |
| Intégration | <i data-eva="trash-2-outline"></i> puis eva.replace() au chargement,
ou le SVG inline exporté depuis le site |
| Icône seule | aria-label sur le bouton, aria-hidden="true" sur l'icône |
<button class="btn tertiary neutral icon-only" aria-label="Supprimer la formation">
<i data-eva="trash-2-outline" aria-hidden="true"></i>
</button>
<script>eva.replace({ width: 16, height: 16 });</script>
Widgets Stats
Gabarit de widget utilisé dans la section Reporting → Stats pré-formatées : icône colorée + titre + ⓘ dans le header, contrôles à droite, corps vide avec empty-state.
Variante 1 — Badge + Unité + Période
Variante 2 — Ligne de filtres sous le header
Tableaux
Le tableau est la vue principale du produit. En-tête sur deux lignes — libellés puis filtres —, actions au survol de la ligne, pied de tableau avec pagination.
1 — Tableau complet
| Nom | Statut | Groupe | Inscription | ||
|---|---|---|---|---|---|
|
Colonnes
Apprenant
État
E-mail
Identifiant
Groupes
Département
Rôle
Profil formations
Dernière connexion
Date de création
|
|||||
|
MG
Michèle GUERRIN
PDG
|
m.guerrin@onlineformapro.com | Actif | RH Central3 | 12 mars 2026 | |
|
AD
Alan DRABCZYNSKI
Designer
|
a.drabczynski@onlineformapro.com | Actif | Produit | 9 mars 2026 | |
|
JD
Jean DUPONT
Formateur
|
j.dupont@onlineformapro.com | Inactif | Sécurité au travail | 2 févr. 2026 | |
|
SL
Sophie LEROY
Gestionnaire
|
s.leroy@onlineformapro.com | Actif | Management2 | 28 janv. 2026 | |
|
TB
Thomas BERNARD
Formateur
|
t.bernard@onlineformapro.com | Actif | Sécurité au travail | 21 janv. 2026 | |
|
CM
Claire MOREAU
Responsable RH
|
c.moreau@onlineformapro.com | Actif | RH Central | 14 janv. 2026 | |
|
PR
Paul ROUSSEAU
Apprenant
|
p.rousseau@onlineformapro.com | Inactif | Management | 8 janv. 2026 | |
|
NL
Nadia LAMBERT
Gestionnaire
|
n.lambert@onlineformapro.com | Actif | Produit5 | 19 déc. 2025 | |
|
KB
Karim BENALI
Formateur
|
k.benali@onlineformapro.com | Actif | RGPD | 11 déc. 2025 | |
|
EF
Émilie FONTAINE
Apprenante
|
e.fontaine@onlineformapro.com | Inactif | Sécurité au travail | 3 déc. 2025 | |
|
LG
Lucas GIRARD
Apprenant
|
l.girard@onlineformapro.com | Actif | RGPD | 26 nov. 2025 | |
|
AP
Anaïs PETIT
Responsable formation
|
a.petit@onlineformapro.com | Actif | Management | 18 nov. 2025 |
2 — Couleurs de ligne
Les fonds de ligne sont neutres : une teinte colorée au survol entre en concurrence avec les statuts, qui eux portent du sens.
| Ligne impaire | Fond blanc | #FFFFFF |
| Ligne paire | --row-even | #F9FAFB |
| Survol | --row-hover | #F1F3F5 |
| Clic maintenu | --row-active | #E3E6EA |
| Token | Valeur | Usage |
|---|---|---|
| --row-even | #F9FAFB | Zébrure une ligne sur deux, assez faible pour ne pas hacher la lecture |
| --row-hover | #F1F3F5 | Survol — lisible aussi bien sur une ligne blanche que sur une ligne paire |
| --row-active | #E3E6EA | Clic maintenu, un cran plus foncé |
3 — En-tête sur deux lignes
| Élément | Classe | Traitement |
|---|---|---|
| Fond | thead tr | --ps · 11.5px · 600 · --t2 · casse normale |
| Ligne 1 — libellés | .thr th | padding 10px 14px, padding-bottom 6px, sans filet |
| Ligne 2 — filtres | .thr-filter th | padding-top 0, padding-bottom 12px, filet bas --bd |
| Champ de filtre | .th-search | 30px · radius 6px · focus --a + anneau 2px --a1 |
| Colonne triable | th.srt | curseur pointer, texte --t1 au survol |
| Redimensionnement | .rez | 8px de large, filet 2px qui passe en --a et grandit au survol |
| Groupement | .gsth / .gbtn | colonne 44px, bouton 36px, actif sur --a1 |
| Colonnes | .cgear-th | colonne 44px en fin de ligne, porte la roue crantée — voir 4 |
4 — Édition des colonnes
La roue crantée ferme la ligne de filtres, dans la colonne
.cgear-th de 44px. Elle ouvre le panneau des colonnes : une case affiche ou masque la colonne
dans le tableau, une poignée la réordonne par glisser-déposer. La première colonne est verrouillée.
« Réinitialiser » rétablit l'ordre et la visibilité par défaut. Le panneau se ferme au clic en dehors ou avec
Échap.
| Apprenant | État | Identifiant | Groupes | Département | Rôle | Profil formations | Dernière connexion | Date de création | ||
|---|---|---|---|---|---|---|---|---|---|---|
|
Colonnes
Apprenant
État
E-mail
Identifiant
Groupes
Département
Rôle
Profil formations
Dernière connexion
Date de création
|
||||||||||
| Michèle GUERRIN | Actif | m.guerrin@onlineformapro.com | USR-4821 | RH Central | Direction | Administrateur | Management | Aujourd'hui | 12 mars 2026 | |
| Alan DRABCZYNSKI | Actif | a.drabczynski@onlineformapro.com | USR-4977 | Produit | Design | Gestionnaire | RGPD | Hier | 9 mars 2026 | |
| Jean DUPONT | Inactif | j.dupont@onlineformapro.com | USR-3310 | Sécurité | Formation | Formateur | Sécurité au travail | 2 févr. 2026 | 2 févr. 2026 | |
| Sophie LEROY | Actif | s.leroy@onlineformapro.com | USR-3985 | Management | RH | Gestionnaire | Management | Il y a 3 jours | 28 janv. 2026 |
| Élément | Classe | Traitement |
|---|---|---|
| Roue crantée | .cgear / .cgear.on | 30px · --t3 · ouvert sur --a1 et --a |
| Panneau | .cpanel | 248px · ancré à droite sous la roue · ombre 0 8px 28px |
| En-tête | .cph / .cprst | « Colonnes » en 11.5px capitales, « Réinitialiser » en --a |
| Ligne | .crow | poignée --bd · case --a · libellé 13px · curseur grab |
| En déplacement | .crow.dg | fond --a1, opacité .7 |
| Verrouillée | .crow.lk | poignée et case atténuées, pas de glisser |
5 — Actions de ligne
Le bouton .rdots occupe la dernière colonne
.catd et n'apparaît qu'au survol de la ligne. Il ouvre le menu .rmenu, ancré à
droite : les actions courantes d'abord, puis, après un filet, les actions d'état et le destructif en rouge.
| Élément | Classe | Traitement |
|---|---|---|
| Colonne | td.catd | 44px en fin de ligne, position: relative pour ancrer le menu |
| Bouton | .rdots | 28px · bordure --bd · visible au survol de la ligne ou quand le menu est ouvert |
| Menu | .rmenu / .rmenu.oo | 220px min · ancré à droite · ombre 0 8px 30px |
| Entrée | .rmi | 13.5px · icône 17px --t2 · survol --ps |
| Séparateur | .rmdiv | 1px --bg, isole les actions d'état |
| Destructif | .rmi.dn | texte et icône en --d, toujours en dernier |
6 — Pied de tableau & densité
| Élément | Classe | Traitement |
|---|---|---|
| Pied | .tfoot | padding 10px 14px · fond --ps · filet haut --bg |
| Compteur | .fi | 12.5px --t3 |
| Pagination | .pb / .pb.on | 28px · radius 7px · page courante sur --t1 |
| Par page | .lpp-btn | 28px, même gabarit que la pagination |
| Mode compact | .tcard.cmp | cellules à 5px de padding, avatars et sous-titres masqués |
<div class="tw">
<table>
<thead>
<tr class="thr"><th class="srt">Nom<span class="rez"></span></th>…</tr>
<tr class="thr-filter"><th><input class="th-search"></th>…</tr>
</thead>
<tbody>…</tbody>
</table>
</div>
<div class="tfoot">compteur + pagination + par page</div>
</div>
L'application source cible les deux lignes d'en-tête par id (#thr,
#thr-filter). Le système les expose en classes, un identifiant ne pouvant pas se répéter sur
plusieurs tableaux d'une même page.
Layouts & Grilles
Systèmes de grille et de layout pour composer les pages. Tous les layouts incluent sidebar + main content area.
Layout 1 — Grid 1 col (Full)
Layout 2 — Grid 2 col (1:1)
Layout 3 — Grid 2 col (1:2) + Full
Layout 4 — Grid 3 col (1:1:1)
Templates de Pages
Le squelette d'une page : la topbar, le menu gauche, et le contenu vide. Seule l'entrée active du menu change d'une page à l'autre.
1 — Liste · une entrée de premier niveau active
2 — Réglages · une sous-entrée active, son groupe ouvert
3 — Dashboard · une entrée du bloc Reporting active
| Zone | Classe | Traitement |
|---|---|---|
| Page | body.app | 100vh · fond --bg · colonne flex · overflow hidden |
| Corps | .layout > .sidebar + .main | .main défile seul, padding-top 56px sous la topbar |
| Contenu | .content | padding 24px 32px · tout le contenu de la page vit ici |
| Entrée active | .ni.act · .ni-sub.act | une seule par page · le groupe d'une sous-entrée porte .open |
<header class="topbar">…</header>
<div class="layout">
<aside class="sidebar">…</aside>
<main class="main">
<div class="content"><!-- la page --></div>
</main>
</div>
<script src="components.js" defer></script>
</body>
Modales & Overlays
Patterns pour les dialogs, popovers, date pickers et autres overlays.
Exemple : Import de photo
Modal Structure (Code)
États & Feedback
Tous les états des composants : hover, active, disabled, loading, error, success.
États des Boutons
États des Inputs
États des Badges
Messages & Notifications
| Type | Couleur | Icône | Usage |
|---|---|---|---|
| Success | ✓ #059669 | Check circle | Action réussie |
| Error | ✕ #DC2626 | Alert circle | Action échouée |
| Warning | ⚠ #D97706 | Alert triangle | Attention requise |
| Info | ℹ #3B82F6 | Info circle | Information |
Transitions & Animations
| Élément | Transition | Timing | Use case |
|---|---|---|---|
| Boutons | background 0.2s | Easing: ease-out | Hover / Active |
| Dropdown chevron | transform 0.2s | Easing: ease | Rotation 180° |
| Charts bars | height 0.4s | Easing: ease | Data load animation |
| Page transitions | opacity 0.3s | Easing: ease-in-out | Route change |
Ressources & téléchargements
Deux fichiers à importer dans une page, et les règles à donner à un assistant.
v1.0.0 mise en ligne le 15 septembre 2026 Les trois fichiers sortent ensemble et portent le même numéro. Vérifiez celui de votre copie dans l'en-tête du fichier.
<script src="components.js" defer></script>