Personnalisation
Adapter HeartCo à votre marque : nom, couleurs, emails, sidebar, pages légales.
Branding
Fichier : src/lib/config/branding.ts
Toute la configuration de marque est centralisée dans l'objet APP_CONFIG. Chaque valeur est configurable via variable d'environnement :
Identité
| Propriété | Par défaut | Variable d'environnement |
|---|---|---|
| Nom | HeartCo | NEXT_PUBLIC_APP_NAME |
| Nom court | HC | NEXT_PUBLIC_APP_SHORT_NAME |
| Tagline | "Lancez votre SaaS en 1 semaine" | NEXT_PUBLIC_APP_TAGLINE |
| Description | "Le boilerplate SaaS production-ready..." | NEXT_PUBLIC_APP_DESCRIPTION |
| URL | http://localhost:3000 | NEXT_PUBLIC_APP_URL |
| Domaine | heartco.fr | NEXT_PUBLIC_APP_DOMAIN |
Emails
| Propriété | Par défaut | Variable d'environnement |
|---|---|---|
| Email principal | hello@heartco.fr | NEXT_PUBLIC_APP_EMAIL |
| Support | support@heartco.fr | NEXT_PUBLIC_SUPPORT_EMAIL |
| No-reply | noreply@heartco.fr | NEXT_PUBLIC_NOREPLY_EMAIL |
Couleurs
| Propriété | Valeur | Usage |
|---|---|---|
| Primary | #6366f1 (Indigo) | Boutons, liens, accents |
| Secondary | #8b5cf6 (Violet) | Gradients, éléments secondaires |
Réseaux sociaux
Configurables via APP_CONFIG.social : twitter, linkedin, github, discord, instagram, youtube (vides par défaut).
Informations légales
| Propriété | Variable d'environnement |
|---|---|
| Raison sociale | NEXT_PUBLIC_COMPANY_NAME |
| N° d'immatriculation | NEXT_PUBLIC_REGISTRATION_NUMBER |
| N° TVA | NEXT_PUBLIC_VAT_NUMBER |
| Adresse | NEXT_PUBLIC_COMPANY_ADDRESS |
Exemple de personnalisation
Pour rebaptiser l'app "MonSaaS" :
NEXT_PUBLIC_APP_NAME="MonSaaS"
NEXT_PUBLIC_APP_SHORT_NAME="MS"
NEXT_PUBLIC_APP_TAGLINE="La solution tout-en-un pour votre business"
NEXT_PUBLIC_APP_DOMAIN="monsaas.fr"
NEXT_PUBLIC_APP_EMAIL="contact@monsaas.fr"
NEXT_PUBLIC_SUPPORT_EMAIL="support@monsaas.fr"
NEXT_PUBLIC_NOREPLY_EMAIL="noreply@monsaas.fr"
NEXT_PUBLIC_COMPANY_NAME="MonSaaS SAS"Tailwind et thème
Fichier principal
src/styles/globals.css contient les tokens CSS et la configuration Tailwind v4.
Tokens CSS sémantiques
HeartCo utilise des custom properties CSS pour le thème clair et sombre :
:root {
--background: ...;
--foreground: ...;
--primary: ...;
--primary-foreground: ...;
--secondary: ...;
--card: ...;
--border: ...;
--ring: ...;
/* ... */
}
.dark {
--background: ...;
--foreground: ...;
/* ... variantes sombres */
}Couleurs personnalisées
:root {
--color-brand: #6366f1;
--color-deep-navy: #0d1b2a;
--color-ai-blue: ...;
--color-ai-cyan: ...;
}Dark mode
Le dark mode est géré par next-themes. Utiliser toujours les tokens CSS sémantiques, jamais de couleurs hardcodées :
// ✅ Correct — utilise les tokens
<div className="bg-background text-foreground border-border">
// ❌ INTERDIT — couleurs hardcodées
<div className="bg-white text-gray-900 border-gray-200">Fusion de classes
Utiliser cn() (clsx + tailwind-merge) pour merger les classes :
import { cn } from "~/lib/utils";
<button className={cn(
"px-4 py-2 rounded-md",
variant === "primary" && "bg-primary text-primary-foreground",
variant === "outline" && "border border-input",
className
)} />Navigation (Sidebar)
Fichier : src/lib/navigation/nav-config.ts
Structure
La sidebar est organisée en 8 sections avec des couleurs sémantiques :
| Section | Couleur | Icône |
|---|---|---|
| Dashboard | Indigo | LayoutDashboard |
| Copilote IA | Violet | Sparkles |
| Commercial | Emerald | Users |
| Facturation | Amber | Receipt |
| Finance | Sky | TrendingUp |
| Opérations | Orange | Wrench |
| Équipe | Teal | UserCog |
Modifier un item
Pour changer le label, l'icône ou le chemin d'un module :
// src/lib/navigation/nav-config.ts
{
id: "crm",
label: "Mon CRM", // ← Modifier le label
path: "/dashboard/crm",
icon: Target, // ← Changer l'icône (Lucide)
badge: "core",
moduleId: "MODULE_CRM",
}Items du footer
3 items fixes en bas de la sidebar :
- Marketplace —
/dashboard/marketplace - Aide —
/help - Paramètres —
/dashboard/parametres
Badges
| Badge | Affichage | Usage |
|---|---|---|
core | — | Module inclus dans le plan |
addon | Badge payant | Module à la carte |
vertical | Badge vertical | Module vertical (BTP) |
tag: NEW | Pastille "NEW" | Nouveau module |
tag: BETA | Pastille "BETA" | Module en bêta |
Pages légales
Important : les 5 pages légales fournies sont des templates génériques. Vous devez remplacer leur contenu par vos propres textes avant toute mise en production. Un bandeau d'avertissement (
showBoilerplateDisclaimer) s'affiche tant que vous n'avez pas personnalisé le contenu.
Les pages légales sont dans le route group src/app/(legal)/ :
| Page | Chemin | Fichier |
|---|---|---|
| CGU | /cgu | src/app/(legal)/cgu/page.tsx |
| CGV | /cgv | src/app/(legal)/cgv/page.tsx |
| Mentions légales | /mentions-legales | src/app/(legal)/mentions-legales/page.tsx |
| Politique cookies | /politique-cookies | src/app/(legal)/politique-cookies/page.tsx |
| Politique confidentialité | /politique-confidentialite | src/app/(legal)/politique-confidentialite/page.tsx |
Personnalisation
- Ouvrez chaque fichier et remplacez le contenu textuel par vos mentions légales réelles
- Les informations légales dynamiques (raison sociale, adresse, SIRET) sont tirées de
APP_CONFIG.legal— configurez-les via les variables d'environnementNEXT_PUBLIC_LEGAL_* - Pour supprimer le bandeau d'avertissement, retirez la prop
showBoilerplateDisclaimerdu composant - Faites relire vos textes par un juriste avant la mise en production
Templates d'emails
Dossier : src/lib/emails/templates/
6 templates lifecycle prêts à l'emploi :
| Template | Déclencheur | Description |
|---|---|---|
email-verification.ts | Inscription | Lien de vérification (24h) |
trial-welcome.ts | Début trial | Bienvenue + 3 features à essayer |
trial-reminder-7days.ts | J-7 trial | Rappel avec incitation upgrade |
trial-reminder-2days.ts | J-2 trial | Rappel urgent conversion |
trial-expired.ts | Fin trial | Stats d'usage + plans payants |
newsletter-onboarding.ts | J+3 inscription | Tips personnalisés par feature |
Personnaliser un template
Les templates utilisent Resend avec du HTML inline. Pour modifier :
- Ouvrir le fichier template dans
src/lib/emails/templates/ - Modifier le HTML, les textes, les couleurs
- Les variables dynamiques (nom, lien, etc.) sont passées en paramètre
Templates de relance
Les relances (src/lib/emails/relances.ts) utilisent des variables de substitution :
| Variable | Description |
|---|---|
{{clientName}} | Nom du client |
{{invoiceNumber}} | Numéro de facture |
{{amount}} | Montant dû |
{{dueDate}} | Date d'échéance |
{{daysPastDue}} | Jours de retard |
{{orgName}} | Nom de l'organisation |
{{signature}} | Signature configurée |
Recettes (recipes)
Quatre opérations classiques de personnalisation, prêtes à coller.
1. Renommer la marque "HeartCo" en "MonSaaS"
La marque est centralisée dans apps/web/src/lib/config/branding.ts et exposée via les variables d'environnement NEXT_PUBLIC_APP_*. Règle d'or : toujours utiliser APP_CONFIG.name côté code, jamais "HeartCo" en dur.
- Mettre à jour le
.env(ou les variables Vercel en prod) :
NEXT_PUBLIC_APP_NAME="MonSaaS"
NEXT_PUBLIC_APP_DOMAIN="monsaas.fr"
NEXT_PUBLIC_APP_URL="https://app.monsaas.fr"- Rechercher les références hardcodées résiduelles (rares — à corriger si trouvées) :
# Avec ripgrep
rg -i "heartco" apps/web/src --type ts --type tsx- Fichiers à inspecter manuellement (peuvent contenir le nom hors
APP_CONFIG) :apps/web/src/lib/config/branding.ts(centralise la marque)- Pages légales
apps/web/src/app/(legal)/*.tsx(à personnaliser de toute façon) - Templates emails
apps/web/src/lib/emails/templates/(HTML inline, signature, footer)
2. Remplacer le logo
Le logo est servi via apps/web/public/ (3 fichiers SVG : logo.svg, logo-dark.svg, logo-mark.svg).
- Remplacer les 3 fichiers SVG par les vôtres (mêmes noms, mêmes dimensions cibles)
- Si format différent (PNG/JPG), modifier
apps/web/src/components/layout/logo.tsxpour pointer vers le nouveau chemin - En production Vercel, redéployer pour invalider le cache CDN
3. Changer la couleur primary
La couleur de marque est un token CSS dans apps/web/src/styles/globals.css. Tous les composants utilisant bg-primary, text-primary, border-primary héritent automatiquement.
/* apps/web/src/styles/globals.css */
:root {
--color-brand: #VOTRE_COULEUR; /* Remplacer #6366f1 */
}Hot reload immédiat en dev (pnpm dev), pnpm build requis en prod.
4. Désactiver un module de la sidebar sans le supprimer
Voir la procédure complète dans 05-modules.md — résumé :
- Ouvrir
apps/web/src/lib/navigation/nav-config.ts - Commenter l'item dans le tableau
childrende la section concernée - Le router tRPC peut rester en place — il devient simplement inaccessible via la sidebar