Personnaliser le template
Où modifier le nom, les textes, les images, les prix, les couleurs, les polices, les sections et les liens.
Lancez le site avec yarn dev pendant vos modifications : la page se recharge à chaque enregistrement. Tous les chemins ci-dessous sont relatifs au dossier landing-page-template-2.
| Pour changer | Modifiez |
|---|---|
| Le nom de la marque | name dans src/config/site.ts |
| N'importe quel texte de la page | messages/en.json et messages/ar.json |
| Images et logos | public/ et le dossier constants/ de chaque section |
| Prix et formules | src/features/home/Pricing/constants/plans.ts et src/features/home/ComparisonTable/constants/ |
| Couleurs | src/styles/globals.css et les classes Tailwind des composants |
| Polices | src/lib/fonts.ts |
| Les sections affichées, et leur ordre | src/app/[locale]/page.tsx |
| Liens du menu, du pied de page et des réseaux sociaux | src/layouts/Header/constants/, src/layouts/Footer/constants/footer.ts, src/config/site.ts |
| L'adresse du site pour les moteurs de recherche et le partage | NEXT_PUBLIC_SITE_URL |
Les deux paramètres
| Variable | Par défaut | Rôle |
|---|---|---|
NEXT_PUBLIC_SITE_URL | http://localhost:3030 | L'adresse publique du site. Le lien canonical, les alternatives de langue et les cartes de partage social sont construits à partir d'elle. Réglez-la sur votre domaine avant la mise en ligne. |
NEXT_PUBLIC_API_BASE_URL | vide | L'API qui reçoit les inscriptions à la newsletter. Utilisée uniquement par la section newsletter. |
Sans Docker, placez-les dans .env.local (copiez .env.example). Avec Docker, passez-les en arguments de build : le build de l'image ne lit pas les fichiers .env ni .env.local.
NEXT_PUBLIC_SITE_URL=https://www.your-domain.comlanding-page-template-2docker build -t saas-landing --build-arg NEXT_PUBLIC_SITE_URL=https://www.your-domain.com .Les deux valeurs sont compilées dans la page au moment du build. Après une modification, redémarrez yarn dev, relancez yarn build, ou reconstruisez l'image Docker. Ne mettez jamais de secret dans une valeur NEXT_PUBLIC_ : tout visiteur peut la lire.
Le nom et le logo de la marque
name dans src/config/site.ts est la marque. Le logo de l'en-tête et du pied de page est sa première lettre dans un carré coloré, suivie du nom, dessiné par src/components/Logo.tsx. Les textes qui contiennent {brand} dans les fichiers de messages l'utilisent aussi.
name: "SaasPro",La même valeur remplit le titre de la page, la carte de partage sur les réseaux sociaux, le menu Resources et le manifeste de l'application web, que src/app/manifest.ts génère dans les couleurs sombres de la page. Vous changez le nom à un seul endroit.
creator, dans le même fichier, est l'auteur indiqué dans les métadonnées de la page. Changez-le aussi.
Texte
Chaque mot visible, chaque description d'image et le titre de la page se trouvent dans messages/en.json et messages/ar.json. Chaque section a son propre bloc, qui porte son nom : Header, Hero, SocialProof, Features, HowItWorks, Testimonials, Pricing, Comparison, Integrations, Faq, Blog, Cta, Newsletter et Footer.
- Modifiez la valeur, gardez la clé, et faites la modification dans les deux fichiers. Une clé absente d'un fichier s'affiche comme une erreur de message manquant sur la page de cette langue.
- Les mots entre accolades, comme
{brand}et{year}, sont remplis par l'application. Gardez-les tels quels. - Dans
HowItWorks.title, les mots entre<highlight>et</highlight>sont affichés dans la couleur en dégradé. Gardez les deux balises.
Images
| Image | Fichier | Définie dans |
|---|---|---|
| Image du hero | public/images/hero.webp | src/features/home/Hero/constants/hero.ts |
| Comment ça marche, une par étape | public/images/dashboard.png, team.png, webinar.png, automation.png | src/features/home/HowItWorks/constants/steps.ts |
| Images des menus de l'en-tête | public/images/dashboard.png, webinar.png | src/layouts/Header/constants/mega-menus.ts |
| Logos d'entreprises | public/images/logos/*.svg | src/features/home/SocialProof/constants/companies.ts |
| Logos d'intégrations | public/images/logos/*.svg | src/features/home/Integrations/constants/integrations.ts |
| Photos des témoignages | images.unsplash.com | src/features/home/Testimonials/constants/testimonials.ts |
| Images des cartes du blog | images.unsplash.com | src/features/home/BlogPreview/constants/articles.ts |
| Favicons | public/favicon.svg, favicon.ico, favicon-96x96.png, apple-touch-icon.png, web-app-manifest-*.png | src/app/[locale]/layout.tsx, src/app/manifest.ts |
| Image de partage social, 1200 par 630 | public/image.png | ogImage dans src/config/site.ts |
Le plus simple est de remplacer un fichier par le vôtre sous le même nom. Pour un nouveau fichier, placez-le dans public/ et utilisez son chemin depuis la racine du site, comme /images/your-photo.jpg.
Une image d'un autre site web ne se charge que si son hôte figure sous images.remotePatterns dans next.config.js. Seul images.unsplash.com y figure. Ajoutez-y votre hôte, ou copiez les fichiers dans public/.
remotePatterns: [
{ protocol: "https", hostname: "images.unsplash.com" },
{ protocol: "https", hostname: "cdn.your-domain.com" },
],Prix et formules
Les prix se trouvent à deux endroits, un par section. Modifiez les deux pour qu'ils concordent :
| Section | Prix et fonctionnalités | Texte |
|---|---|---|
| Cartes de tarifs | src/features/home/Pricing/constants/plans.ts : price, featureIds et popular pour chaque formule | Pricing.plans dans les fichiers de messages |
| Tableau comparatif | src/features/home/ComparisonTable/constants/pricing-tiers.ts pour les prix, comparison-features.ts pour ce que comprend chaque formule | Comparison.tiers et Comparison.features dans les fichiers de messages |
Les fonctionnalités d'une formule sont listées par identifiant dans featureIds, et chaque identifiant a besoin de son texte sous la formule dans les deux fichiers de messages. popular: true marque la formule avec le badge Most Popular.
Les prix sont mensuels, en dollars américains, et formatés selon la langue de la page par src/hooks/usePriceFormatter.ts. Pour afficher une autre devise, remplacez sa valeur par défaut currency = "USD" par votre code de devise, comme "EUR".
Couleurs
- Les couleurs d'accent : les classes Tailwind violettes et roses (
purple-*,pink-*) dans les composants, commefrom-purple-600 to-pink-500sur les boutons et le logo. Cherchezpurple-etpink-dans le dossiersrcpour toutes les changer. - Le fond de la page :
bg-gray-950sur l'élément extérieur de la page danssrc/app/[locale]/page.tsx. Les sections utilisent des classesgray-*par-dessus. - Le bouton et le champ partagés : les variables CSS de
src/styles/globals.css, comme--primaryet--ring. C'est le bloc.darkqui est utilisé.
La page est toujours sombre : src/app/[locale]/layout.tsx définit la classe dark et démarre le fournisseur de thème avec defaultTheme="dark". Il n'y a ni thème clair ni sélecteur de thème.
Polices
src/lib/fonts.ts charge Inter pour l'anglais et Noto Sans Arabic pour l'arabe depuis Google Fonts, via next/font. Les polices sont téléchargées au moment du build du site, puis servies par le site lui-même. src/app/[locale]/layout.tsx choisit la police selon la langue.
import { Inter, Noto_Sans_Arabic } from "next/font/google";
export const inter = Inter({ subsets: ["latin"] });
export const notoSansArabic = Noto_Sans_Arabic({ subsets: ["arabic"] });Pour utiliser une autre police Google, importez-la depuis next/font/google à la place de l'une de celles-ci et gardez le nom exporté, ou changez le nom là où layout.tsx l'utilise.
Sections
src/app/[locale]/page.tsx liste les sections dans leur ordre d'affichage. Supprimez une ligne pour masquer une section, ou déplacez-la pour changer l'ordre. Chaque section se trouve dans son propre dossier sous src/features/home/.
<Header />
<Hero />
<SocialProof />
<Features />
<HowItWorks />
<Testimonials />
<Pricing />
<ComparisonTable />
<Integrations />
<Faq />
<BlogPreview />
<Cta />
<Footer />L'en-tête pointe vers les sections par leur id, comme #pricing et #testimonials. Si vous supprimez une section, supprimez aussi son lien.
Pour ajouter une section :
- Créez
src/features/home/<Section>/avec unindex.tsx, et des dossierscomponents/etconstants/comme les autres sections. - Ajoutez ses textes sous une nouvelle clé dans les deux fichiers de messages et lisez-les avec
useTranslations. - Exportez-la depuis
src/features/home/index.tset placez-la danssrc/app/[locale]/page.tsx.
La section newsletter
Une section newsletter avec un formulaire d'e-mail est livrée dans src/features/home/Newsletter/, mais elle n'est pas sur la page. Pour l'afficher, importez-la avec les autres et placez-la, par exemple avant l'appel à l'action :
import {
…
BlogPreview,
Newsletter,
Cta,
} from "@/features/home";
<BlogPreview />
<Newsletter />
<Cta />Le formulaire a besoin de votre propre API. Réglez NEXT_PUBLIC_API_BASE_URL sur son adresse ; le formulaire envoie { "email": "…" } en JSON dans un POST vers <NEXT_PUBLIC_API_BASE_URL>/newsletter/subscribe, directement depuis le navigateur du visiteur.
- Une réponse
2xxaffiche le message de succès et vide le formulaire. - Toute autre réponse, une erreur réseau ou un
NEXT_PUBLIC_API_BASE_URLvide affiche le message d'erreur. Rien n'est envoyé tant que la variable est vide. - Comme c'est le navigateur qui envoie la requête, votre API doit autoriser l'adresse de votre site dans ses paramètres CORS.
Les textes se trouvent sous Newsletter dans les fichiers de messages.
Liens et boutons
La plupart des liens du template pointent vers # tant que vous ne leur donnez pas de destination :
| Liens | Modifiez |
|---|---|
| Liens de l'en-tête (Pricing, Testimonials) | src/layouts/Header/constants/nav-links.ts |
| Menus Products et Resources | src/layouts/Header/constants/mega-menus.ts |
| Menu mobile | src/layouts/Header/constants/mobile-menu.ts |
| Colonnes du pied de page | footerColumns dans src/layouts/Footer/constants/footer.ts |
| Icônes sociales du pied de page | links dans src/config/site.ts |
| Log in dans l'en-tête | src/layouts/Header/components/HeaderActions.tsx |
| Bouton et liens des étapes de Comment ça marche | src/features/home/HowItWorks/components/CtaButton.tsx et StepDetails.tsx |
| Cartes du blog | src/features/home/BlogPreview/components/ArticleCard.tsx |
Les boutons Get Started, Start Free Trial et Book a Demo, ainsi que les boutons des cartes de tarifs, sont de simples boutons sans destination. Pour transformer l'un d'eux en lien, donnez au Button la prop asChild et placez un Link à l'intérieur, comme le fait src/components/LocaleSwitcher.tsx :
import { Link } from "@/i18n/navigation";
<Button asChild className="…">
<Link href="/signup">{common("getStarted")}</Link>
</Button>Le Link de @/i18n/navigation conserve la langue du visiteur dans l'adresse. Pour un autre site web, utilisez plutôt un simple <a href="https://…">.
Dates et année du copyright
- L'année du copyright dans le pied de page est l'année du build du site, tirée de
COPYRIGHT_YEARdanssrc/layouts/Footer/constants/footer.ts. Relancez un build dans la nouvelle année pour la mettre à jour. - La date et le temps de lecture de chaque carte du blog sont
publishedAtetreadMinutesdanssrc/features/home/BlogPreview/constants/articles.ts; son titre et son résumé se trouvent sousBlogdans les fichiers de messages.
Moteurs de recherche et partage
- Le titre et la description de la page sont
Metadata.titleetMetadata.descriptiondans chaque fichier de messages : chaque langue a donc les siens. NEXT_PUBLIC_SITE_URLdonne à chaque page son adresse canonical (/enou/ar) et les liens entre les deux langues. Réglez-la sur votre domaine avant le build de production, sinon les moteurs de recherche et les cartes sociales pointent verslocalhost.- La carte de partage social utilise
public/image.png(1200 par 630) avec le même titre et la même description. - Le template ne fournit ni
sitemap.xmlnirobots.txt.