Start here

Arrows to move, enter to open, escape to close.

Ship/Now

Pour commencer · 3 min

Configuration

Un fichier contient chaque décision sur votre produit. Tout le reste y puise.

src/config.ts est le seul fichier que vous devez modifier pour transformer le kit en votre produit. La navigation, les titres de page, les e-mails, l'image sociale et les noms d'offres y puisent tous.

export const config = {
  name: "Acme",
  domain: "acme.com",
  description: "Ce que vous construisez, en une phrase.",

  email: {
    from: "Acme <hello@acme.com>",
    support: "hello@acme.com",
  },

  locales: ["en", "fr"] as const,
  defaultLocale: "en",

  billing: {
    currency: "eur",
    plans: [
      { id: "starter", name: "Starter", priceId: "price_starter_replace_me" },
      { id: "pro", name: "Pro", priceId: "price_pro_replace_me" },
    ],
  },

  brand: {
    ink: "#0b0c0f",
    accent: "#f8430a",
    font: "Host Grotesk",
  },
} as const;

Des décisions, pas des secrets

La distinction compte. config.ts est commité et lisible par quiconque a votre code. .env ne l'est pas, et contient tout ce qui serait dangereux entre d'autres mains.

Un price id Stripe est une décision : il est public, il apparaît dans l'URL de paiement, sa place est ici. Une clé secrète Stripe est un secret et sa place est dans .env. Si vous avez envie de mettre une clé dans config.ts, c'est le signe que vous avez ouvert le mauvais fichier.

Le as const

config est déclaré as const pour que les types se réduisent aux valeurs littérales. C'est ce qui fait fonctionner ceci :

export type PlanId = Config["billing"]["plans"][number]["id"];
// "starter" | "pro"

Ajoutez une offre au tableau et PlanId s'élargit tout seul. Chaque fonction qui prend un identifiant d'offre refuse désormais ceux qui n'existent pas, à la compilation, sans liste à maintenir. Retirez le as const et vous obtenez string : cette garantie disparaît sans bruit.

Changer la marque

brand.accent est lu par src/app/globals.css comme token d'accent. Changez-le et tout suit : boutons, anneaux de focus, élément de navigation actif, image sociale. Voir Tokens de design.

brand.font est la police d'affichage. Elle est chargée via next/font/google dans src/app/layout.tsx, donc en changer signifie modifier la valeur de config et l'import, puisque next/font a besoin d'un nom statique à la compilation.

Retirer une langue

Mettez locales: ["en"] as const et supprimez messages/fr.json. Rien d'autre à changer : le sélecteur affiche ce qui est dans locales, et avec une seule entrée il n'affiche rien. Voir Internationalisation.

Une erreur ou un manque sur cette page ? Dites-le-nous.