Branding & White-Label
Module de personnalisation visuelle multi-tenant. Chaque tenant peut adapter son instance Kaltiv ERP à son identité de marque sans affecter les autres clients SaaS. Conçu pour les organisations soucieuses de leur image (plantations agro-industrielles, coopératives, intégrateurs revendeurs).
Surface utilisateur
L'écran Paramètres > Branding (/settings/branding) propose 2 sections principales :
- Palette de couleurs — 3 couleurs HSL (primaire, sidebar, accent)
- Logo de l'entreprise — upload PNG/SVG (max 2 Mo)
Plus une zone d'actions : Sauvegarder | Réinitialiser aux défauts.
Modèle de données
Configuration stockée dans tenants.settings.brand (JSONB) :
{
"brand": {
"primaryColor": "142.8 64.2% 24.1%",
"sidebarColor": "30 30% 8%",
"accentColor": "45 80% 50%",
"logoUrl": "https://[bucket].supabase.co/.../logo.png"
}
}
Format HSL (Hue Saturation Lightness) plutôt que HEX pour faciliter les variations dark/light mode et l'interpolation de couleurs dérivées (hover, active, muted).
Le hook useBranding lit cette config + applique les CSS variables au runtime via document.documentElement.style.setProperty(...).
Couleurs
| Slot | Usage | Variable CSS |
|---|---|---|
| Primaire | Boutons d'action, accents, badges actifs | --primary |
| Sidebar | Navigation latérale, fond sidebar mobile | --sidebar-background |
| Accent | Highlights, badges secondaires, hover | --accent |
L'éditeur convertit automatiquement HEX ↔ HSL pour confort utilisateur (input couleur natif HTML5 = HEX), mais persiste en HSL.
Aperçu en temps réel
Avant sauvegarde, les changements sont appliqués au DOM via document.documentElement.style.setProperty() — l'utilisateur voit l'effet instantanément. La sauvegarde déclenche tenant.settings.brand write + invalidation de cache.
Logo
Stocké dans Supabase Storage (brand-logos bucket), partitionné par tenant via RLS sur le storage path ${tenant_id}/logo.{ext}.
Contraintes :
- Formats : PNG, SVG (préféré pour scalabilité)
- Taille max : 2 Mo
- Affiché dans :
- Sidebar (header, ~32 px de haut)
- Écran de connexion (centre, ~120 px)
- Exports PDF (entête bulletins de paie, factures, rapports)
- Email transactionnels (welcome, reset password, payroll notifications)
Drag-and-drop supporté ; fallback au bouton "Parcourir".
Multi-tenant et isolation
- Storage : RLS sur
storage.objectsfiltrant parpath LIKE '${tenant_id}/%' - DB :
tenants.settings.brandaccessible uniquement aux admins du tenant - Cache :
useBrandinginvalide à chaque modification ; bust automatique du cache CDN sur le logo - Aucun fallback global : un tenant sans config explicite hérite des défauts Kaltiv (vert plantation primaire, gris foncé sidebar)
Réinitialisation
Le bouton "Réinitialiser" :
- Restaure les 3 couleurs HSL aux défauts Kaltiv
- Supprime le logo du Storage (optionnel)
- Vide
tenants.settings.brandou y écrit les défauts explicites - Recharge l'app pour réappliquer les CSS variables
Cas d'usage métier
| Persona | Usage |
|---|---|
| PDG / Admin | Aligne l'ERP à la charte graphique de l'entreprise (acceptation interne) |
| Intégrateur revendeur | Personnalise une instance pour un sous-client (branding white-label) |
| Coopérative | Affiche son logo sur les bulletins/factures envoyés aux adhérents |
| Multi-site | Chaque filiale sur un tenant distinct = branding distinct |
Conformité
- Pas de PII dans le logo (responsabilité tenant)
- Logos stockés en Supabase EU (région
eu-west-1) — RGPD compatible - Pas de tracking tiers (pas de Google Fonts CDN, fonts auto-hébergées)
- Le mode clair/sombre dérive automatiquement des couleurs HSL primaires
Liens utiles
- Page Branding : /settings/branding
- Page Paramètres : /settings
- Module Documents (logos exports) : Documents
- FAQ : Foire aux questions