Documentation — Thèmes / White-label

Branding par instance ou client : variables exposées, modèle JSON d'un thème, application au DOM et résolution multi-tenant.

Variables exposées

Un thème expose un petit jeu de variables, volontairement réduit pour rester maintenable. Tout le reste (états hover, ombres, contrastes) est dérivé de ces valeurs.

  • couleurAppnom d'application affiché dans la barre (les initiales servent de logo de repli).
  • accentcouleur primaire (boutons, badges, liens) ; la couleur du texte posé dessus est dérivée par luminance.
  • fondarrière-plan général de l'interface.
  • surfacefond des cartes, panneaux et champs.
  • textecouleur de texte principale ; les bordures sont dérivées (texte à ~15 % d'opacité).
  • rayonrayon de bordure en px (0–16), appliqué uniformément.

Modèle JSON d'un thème

C'est exactement le format produit par « Exporter JSON » dans le simulateur, et celui attendu côté serveur pour provisionner une instance.

{
  "id": "theme-acme",
  "nom": "ACME Corp",
  "couleurApp": "ACME Portail",
  "accent": "#e11d48",
  "fond": "#faf6f6",
  "surface": "#ffffff",
  "texte": "#1c1917",
  "rayon": 4
}

Application au DOM

En production, le thème résolu est appliqué une seule fois, en injectant les variables CSS sur un conteneur racine — jamais champ par champ dans les composants. Dans le simulateur, l'aperçu est scopé : les valeurs sont posées en style inline sur le conteneur de prévisualisation, sans jamais muter les variables globales du document (elles restent la propriété du ThemeProvider de l'application).

// Application scopée (aperçu ou app embarquée) — pas de document.documentElement
function appliquerTheme(racine: HTMLElement, theme: Theme) {
  racine.style.setProperty("--bpm-accent", theme.accent);
  racine.style.setProperty("--bpm-bg", theme.fond);
  racine.style.setProperty("--bpm-surface", theme.surface);
  racine.style.setProperty("--bpm-text", theme.texte);
  racine.style.setProperty("--bpm-radius", theme.rayon + "px");
}

Multi-tenant

La résolution du thème suit l'ordre : thème explicitement assigné à l'instance → thème du client (tenant) → thème par défaut de la plateforme. Recommandations :

  • Persister les thèmes dans une table themes et référencer theme_id sur chaque tenant ; ne jamais dupliquer les valeurs.
  • Résoudre le tenant côté serveur (sous-domaine ou en-tête d'instance) et servir les variables dès le premier rendu pour éviter tout flash de thème.
  • Conserver un thème par défaut non supprimable : c'est le repli de toute instance dont le thème a été retiré (comportement reproduit dans le simulateur).
  • Tracer les déploiements de branding via le champ exporteLe ajouté à chaque export JSON.

Ouvrir le simulateur