Aller au contenu principal

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éfautVariable d'environnement
NomHeartCoNEXT_PUBLIC_APP_NAME
Nom courtHCNEXT_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
URLhttp://localhost:3000NEXT_PUBLIC_APP_URL
Domaineheartco.frNEXT_PUBLIC_APP_DOMAIN

Emails

PropriétéPar défautVariable d'environnement
Email principalhello@heartco.frNEXT_PUBLIC_APP_EMAIL
Supportsupport@heartco.frNEXT_PUBLIC_SUPPORT_EMAIL
No-replynoreply@heartco.frNEXT_PUBLIC_NOREPLY_EMAIL

Couleurs

PropriétéValeurUsage
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 socialeNEXT_PUBLIC_COMPANY_NAME
N° d'immatriculationNEXT_PUBLIC_REGISTRATION_NUMBER
N° TVANEXT_PUBLIC_VAT_NUMBER
AdresseNEXT_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 :

SectionCouleurIcône
DashboardIndigoLayoutDashboard
Copilote IAVioletSparkles
CommercialEmeraldUsers
FacturationAmberReceipt
FinanceSkyTrendingUp
OpérationsOrangeWrench
ÉquipeTealUserCog

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

BadgeAffichageUsage
coreModule inclus dans le plan
addonBadge payantModule à la carte
verticalBadge verticalModule vertical (BTP)
tag: NEWPastille "NEW"Nouveau module
tag: BETAPastille "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)/ :

PageCheminFichier
CGU/cgusrc/app/(legal)/cgu/page.tsx
CGV/cgvsrc/app/(legal)/cgv/page.tsx
Mentions légales/mentions-legalessrc/app/(legal)/mentions-legales/page.tsx
Politique cookies/politique-cookiessrc/app/(legal)/politique-cookies/page.tsx
Politique confidentialité/politique-confidentialitesrc/app/(legal)/politique-confidentialite/page.tsx

Personnalisation

  1. Ouvrez chaque fichier et remplacez le contenu textuel par vos mentions légales réelles
  2. Les informations légales dynamiques (raison sociale, adresse, SIRET) sont tirées de APP_CONFIG.legal — configurez-les via les variables d'environnement NEXT_PUBLIC_LEGAL_*
  3. Pour supprimer le bandeau d'avertissement, retirez la prop showBoilerplateDisclaimer du composant
  4. 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 :

TemplateDéclencheurDescription
email-verification.tsInscriptionLien de vérification (24h)
trial-welcome.tsDébut trialBienvenue + 3 features à essayer
trial-reminder-7days.tsJ-7 trialRappel avec incitation upgrade
trial-reminder-2days.tsJ-2 trialRappel urgent conversion
trial-expired.tsFin trialStats d'usage + plans payants
newsletter-onboarding.tsJ+3 inscriptionTips personnalisés par feature

Personnaliser un template

Les templates utilisent Resend avec du HTML inline. Pour modifier :

  1. Ouvrir le fichier template dans src/lib/emails/templates/
  2. Modifier le HTML, les textes, les couleurs
  3. 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 :

VariableDescription
{{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.

  1. 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"
  1. 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
  1. 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).

  1. Remplacer les 3 fichiers SVG par les vôtres (mêmes noms, mêmes dimensions cibles)
  2. Si format différent (PNG/JPG), modifier apps/web/src/components/layout/logo.tsx pour pointer vers le nouveau chemin
  3. 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é :

  1. Ouvrir apps/web/src/lib/navigation/nav-config.ts
  2. Commenter l'item dans le tableau children de la section concernée
  3. Le router tRPC peut rester en place — il devient simplement inaccessible via la sidebar

◀ Paiements · Sommaire · Sécurité ▶