Scentree Design System

Guide de référence UI — composants partagés entre pages publiques et back-office.

scentree-design-system.css ingredient.css user_account.css Bootstrap 5.3.2 Public Sans + Funnel Display

Architecture CSS — Qui charge quoi

Fichier CSS Contenu Chargé sur
scentree-design-system.css Variables :root, déclarations de polices, classes typographiques, et tous les composants .scentree-*. Tronc commun de toute l'UI. Toutes les pages
ingredient.css Styles propres aux pages publiques : layout carte, header public, animations, composants sans équivalent back-office. Pages publiques
user_account.css Styles propres au back-office : dashboard, sidebar, upload, tableaux de données. Back-office
Règles absolues

1. Couleurs

--orange-dark
--orange-hover-dark-bg
--orange-main
--orange-hover-light-bg
--orange-light
--orange-hover-light-alpha
--grey-dark
--grey-medium
--border
--grey-light
--white
--success
--success-light
--danger
--danger-light
--warning
--warning-light
--botanical-green
--cta-user
Ombre
--shadow

2. Typographie

Polices de caractères
Public Sans
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
Funnel Display
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
Échelle de titres

h1 — Nom de l'ingrédient

h2 — Section principale

h3 — Sous-section

h4 — Titre de bloc

h5 — Titre tertiaire
Labels — Funnel Display
.label — Titre de colonne, rubrique
.labelsmall — Lien de navigation
Corps de texte
body — Texte courant de la page
body — Texte courant de la page en gras
.body2regular — Texte compact, métadonnée
.body2bold — Texte compact accentué
.caption — Très petite annotation, légende visuelle (10px, grey-medium)
Liens
Utilitaires couleur
.textgrey-medium — Texte secondaire atténué
.textorange-dark — Accentuation orange foncé
.textorange — Accentuation orange principal
Metrics variations
+12,4 %
= 0,0 %
−5,2 %

3. Boutons

default.button | .buttonIcon
actif
actif --sm
disabled
disabled --sm
Primary.buttonPrimary | .buttonIconPrimary
actif
actif --sm
disabled
disabled --sm
Secondary.buttonSecondary | .buttonIconSecondary
actif
actif --sm
disabled
disabled --sm
Ghost.buttonGhost
actif
actif --sm
disabled
disabled --sm
Speed dial — .nav-cta-users > .nav-cta-users-item — items 1&2 : label à droite / item 3 : label à gauche (.nav-cta-users--fixed = position:fixed bas centre)

4. Badges

.scentree-badge — Variantes couleur
.scentree-badge--orange .scentree-badge--green .scentree-badge--red .scentree-badge--grey
.rank-badge — Classement
1 2 3
.pill-tag — Tag suggestion
Lavande Rose absolue Vétiver
.classification-path — Chemin taxonomique
Floral Rose

5. Alertes

.alert .alert-* — surcharge palette Scentree

6. Mise en page et navigation

.scentree-tabs / .scentree-tab / .scentree-tab-content

.scentree-tab-content.active — contenu visible quand l'onglet est actif.

.scentree-tab-content — caché par défaut, affiché par le JS au clic.

.scentree-tab-content — troisième panneau.

.scentree-pagination

7. Formulaires

input type="text".form-control .label-info
actif
disabled
is-invalid
Format CAS invalide — attendu : 000-00-0
.scentree-input-groupwrapper input + icône | addon | bouton
--icon-left
--icon-right
--with-prefix
https://
--with-suffix
mg/kg
--with-button
textarea.form-control .auto-resize-textarea
actif
disabled
selectselect.scentree-select
actif
disabled
radio.form-check-input[type=radio]
unchecked
checked
disabled
checkbox.form-check-input[type=checkbox]
unchecked
checked
disabled
.scentree-descriptor-checkboxcarte radio olfactive
unchecked
checked

8. Infobulles

.scentree-tooltip .custom-tooltip
Vues organiques — 30 jours
Nombre de pages vues issues du trafic naturel sur la période sélectionnée.
Vues organiques — 30 jours
Nombre de pages vues issues du trafic naturel sur la période sélectionnée.
.info-icon-wrapper — icône info inline (survol → opacité pleine)
Vues organiques

9. Tables

table.scentree-table — th[data-sort] = triable par défaut (th sans data-sort = non-triable)
Ingrédient Famille Statut Actions
Linalol Terpène Actif
Citronellol Alcool Bêta
Géraniol Alcool Inactif
scentree-table--no-sort — opt-out tri total (table à 1 seule ligne de données)
Catégorie Limite (%) Note
Fine fragrance 0.5 IFRA 49th
scentree-table--editable — cellules éditables inline (visuel seulement — logique HTMX côté serveur)
Ingrédient CAS Famille Sauv.
Terpène
Alcool
scentree-table--sticky-header — en-tête fixe au scroll (wrapper : max-height + overflow-y:auto)
Ingrédient Famille Statut
LinalolTerpèneActif
CitronellolAlcoolActif
GéraniolAlcoolInactif
AmbretteMacrolideBêta
HédioneEsterActif
Iso E SuperSesquiterpèneActif
scentree-table--heatmap + .scentree-table-cell + .scentree-table-intensity-N (1 = absent → 5 = très fort)
1
2
3
4
5
Partenaire FR DE US JP UK
Givaudan
5
4
5
3
4
Firmenich
4
5
3
2
3
IFF
2
1
5
1
2
.flash-saved / .flash-error — feedback inline appliqué sur le <form> parent
Ingrédient sauvegardé
Erreur de validation
.scentree-file-queue — tableau de suivi de fichiers (en-tête, lignes de statut, corps masqué si .collapsed)
Fichier
Taille
Progression
Actions
rapport_IFRA_2024.pdf 2,4 Mo
liste_matieres.xlsx 480 Ko
.scentree-file-queue.collapsed — corps masqué, caret pivoté

10. Cards

.user-accounts-card — carte de base (fond blanc, ombre portée)

Titre de section

Contenu de la carte — texte explicatif, données, ou composants enfants.

.user-accounts-card + .user-accounts-card-disabled
🔒

Titre de section

Contenu de la carte — texte explicatif, données, ou composants enfants.

.scentree-upload-card — dropzone : icon + bloc texte + bouton, flex horizontal

Déposer vos fichiers ici, ou parcourir

PDF uniquement, jusqu'à 20 Mo par fichier, 20 fichiers max.

.user-accounts-card + .user-accounts-card-hover — cliquable, centré, effet de lévitation au survol
📊

Audiences

🧪

Ingrédients

🤝

Partenaires

.user-accounts-card + .scentree-empty-state — contenu vide (default) | .scentree-empty-state--error
🔍

Aucun résultat

Aucun élément ne correspond à votre recherche. Essayez avec un autre terme ou réinitialisez les filtres.

Erreur de chargement

Impossible de récupérer les données. Vérifiez votre connexion et réessayez.

11. Listes

ul / ol natifs — surcharge Scentree (marqueurs orange, espacement entre items)
  • Linalol
  • Citronellol
  • Géraniol
  1. Terpène
  2. Alcool
  3. Ester
ul.scentree-data-list — liste zebra orange, h3 sémantique inline
  • Famille IFRA :

    Terpènes acycliques
  • Statut REACH :

    Enregistré
  • CAS :

    78-70-6
  • Origine :

    Synthèse / Naturel

12. Progress bar

.scentree-progress-bar — états (défaut, .ok, .err, .indet)
En cours — défaut
.ok — Succès
.err — Erreur
.indet — Progression indéterminée (animée)

13. Images

.scentree-img-ingredient — conteneur desktop (flex colonne, centré). Légende : .caption
🌿 Linalol — Lavandula angustifolia
.scentree-img-map img — carte de répartition géographique (hauteur contrainte par la classe)
Zones de production principales
.scentree-img-sponsor — logo partenaire (hauteur contrainte par la classe)
A B C

14. Timeline

.scentree-timeline > .scentree-timeline-bloc — fil chronologique avec bulle icône et carte contenu
Lancement du projet

Première étape — fondation du projet et définition des objectifs initiaux. Le mb-0 sur le paragraphe est obligatoire pour que le JS de centrage de la bulle fonctionne correctement.

Deuxième étape

La bulle .scentree-timeline-img se positionne via la variable CSS --content-center injectée par JS — elle se centre verticalement avec la carte, quelle que soit la hauteur du contenu.

Dernière étape — .pb-0 obligatoire

Le dernier .scentree-timeline-bloc doit toujours porter .pb-0 pour stopper la ligne verticale proprement au niveau du dernier point.

16. Toast

.scentree-toast — 4 variantes (double signal couleur + icône)
Succès
Les modifications ont été sauvegardées.
Information
La synchronisation est en cours.

17. Spinner

.scentree-spinner — tailles et contextes de couleur
--sm
défaut
--lg

18. Skeleton

.scentree-skeleton — formes disponibles

19. Slider — Échelle sur 10

.scentree-slider — snap à chaque entier (0–10), track gris, thumb --cta-user, valeur dans un carré à droite
5
5
5

20. Newsroom card

.scentree-newsroom-card--up/down/new/disabled — 4 variantes
🚀
Cashmeran® +64%
Strongest impressions jump this period (+1.2k impressions vs prior period).
📉
Oxane -63%
Lost 980 impressions versus prior period — worth checking position on its main ingredient pages.
Linalool — new in top 10
Joined your top 10 products this period (rank 8, 420 impressions).
🔒
Anomaly detection
Statistically significant spikes & dips — coming soon.

21. Anatomie des pages

Page publique — Page ingrédient (extends base.html → {% block ingredient_template %})
Voir le squelette
① SHELL  base.html — NE PAS RÉPLIQUER
   header                                    position:fixed
     a#logo
     .searchBar                              → search_bar.html
     button.openMenu                         → active nav#main-menu.rightMenu
   nav#main-menu.rightMenu                   slide-in/out, JS dans general.js
   main#content.container-fluid

② BLOCK  {% block ingredient_template %}
   .scentree-page-wrapper.d-flex
     .scentree-page-card

       .scentree-header-ingredient
         .scentree-header-body
           .scentree-block-title             border-color = couleur ingrédient (inline ok)
             .scentree-img-ingredient-mobile ← visible < 1080px
             .scentree-header-top
               h1                            Nom ingrédient
               p.textorange-dark             Filiation taxonomique
               .d-flex                       Boutons carte (buttonIcon buttonIconSecondary)
         .scentree-img-ingredient.col-2      ← visible ≥ 1080px

③ INCLUDE  _partners_block.html             entre header et body

       .scentree-page-body.d-flex.align-items-start
         aside.scentree-side-nav
           ul.labelsmall
             li > a[href="#general"]         toujours présent
             li > a[href="#physical"]        toujours présent
             li > a[href="#botanics"]        natural seulement
             li > a[href="#utilisation"]     natural seulement
             li > a[href="#chemistry"]       synthetic seulement
             li > a[href="#legal"]           toujours présent

         .flex-fill.mt-4
           section#general
             .scentree-section-header
             .d-flex > .scentree-data-list (×2)

           section#physical
             .scentree-section-header
             .d-flex > .scentree-data-list

           section#botanics                  natural seulement
             .scentree-section-header
             .row.col-12 > .scentree-info-block (×2)
             .scentree-info-block

           section#chemistry                 synthetic seulement
             .scentree-section-header
             .scentree-info-block (×8)

           section#utilisation               natural seulement
             .scentree-section-header
             .scentree-info-block (×3)
             .d-flex > .scentree-info-block + .scentree-img-ingredient.scentree-img-map
             .scentree-info-block

           section#legal                     toujours présent
             .scentree-section-header
             .scentree-info-block            allergens

③ INCLUDE  _CLP_block.html                  dans section#legal
③ INCLUDE  _IFRA_block.html                 dans section#legal
            
Page back-office (extends back_office_base.html → {% block content %})
Voir le squelette
① SHELL  back_office_base.html extends base.html — NE PAS RÉPLIQUER
   [base.html] header (logo, .openMenu — searchbar vidé)
   [back_office_base.html] {% block back_office_menu %}
     .back-office-wrapper
       .col-2.sidebar-dashboard              position:fixed
         nav.sidebar-nav
           ul > li > a.navdashboard          7 entrées (Accueil → My Account)
         .sidebar-footer
           a.logout-link
   main#content.container-fluid

② BLOCK  {% block content %}
   .col-12.pagebackoffice

     .user-accounts-header
       .flex-fill
         span.user-accounts-breadcrumb > a
       [boutons d'action optionnels]

     .user-accounts-title
       h1

     .user-accounts-content
       [composants DS au choix : tabs, cards, tables, forms…]

③ INCLUDES  variables selon la page