Adaptez-le à votre marque
Modifiez les textes, les saveurs et leurs canettes 3D, les couleurs, les images, les polices et le titre de la page.
Où se trouve chaque chose
| Élément | Emplacement |
|---|---|
| Tous les textes, dans les deux langues | messages/en.json et messages/ar.json |
| Titre et description de la page | les clés metadata dans ces deux mêmes fichiers |
| Les saveurs et leurs canettes 3D | src/features/carousel/constants/juiceCans.ts, modèles dans public/assets/3d/can/ |
| Les couleurs de chaque saveur | src/features/product-showcase/constants/themes.ts |
| Éclairage des canettes | public/assets/hdri/forest_slope_1k.hdr, nommé dans src/features/carousel/constants/environment.ts |
| Images de fruits | public/assets/images/fruit/, listés dans src/features/floating-fruits/constants/fruitImages.ts |
| Glaçons, feuilles, goutte d'eau | public/assets/images/ice/, public/assets/images/leaf/, public/assets/images/drop.png |
| Articles d'exemple du panier | src/features/navigation/constants/sampleCartItems.ts, images dans public/assets/images/can/ |
| Tailles de bouteille | src/features/product-showcase/constants/sizes.ts |
| Liens de contact | src/features/product-showcase/constants/contactLinks.ts |
| Éléments du menu | src/features/navigation/constants/navItems.ts |
| Polices | src/app/[locale]/layout.tsx et src/app/globals.css |
| Favicon | src/app/favicon.ico |
Lancez yarn dev pendant que vous travaillez : la page se recharge à chaque enregistrement.
Textes
Chaque mot de la page vient de messages/en.json et messages/ar.json. Modifiez la valeur, jamais la clé, et gardez les mêmes clés dans les deux fichiers.
| Clé | Description |
|---|---|
brand.name | Le nom au début de la barre de menu |
brand.wordmark | Le mot géant derrière les canettes |
juices.<id>.name, juices.<id>.description | Le titre et le texte de chaque saveur |
nav.items | Les libellés du menu |
cart.items | Les noms des produits dans le panneau du panier |
scroll.firstLine, scroll.secondLine | Les deux mots du bouton rond en bas, qui ouvre le menu de contact |
contact | Le titre du menu de contact et les libellés de ses liens |
metadata | Le titre et la description de la page |
Le mot géant est dessiné avec la police Thunder, en majuscules, et vaut JUICY dans les deux langues. Gardez-le en lettres latines, ou changez aussi sa police.
Remplacer une saveur
Une saveur est un identifiant qui relie une canette 3D, un thème de couleurs, une image de fruit et ses textes. Les étapes ci-dessous remplacent Mango Burst par une nouvelle saveur, Peach Fizz, avec l'identifiant peachFizz. Procédez de la même façon pour n'importe laquelle des quatre.
La roue contient exactement quatre canettes : quatre positions dans src/features/carousel/constants/positionConfigs.ts, et un quart de tour par étape. Remplacez une saveur plutôt que d'en ajouter une cinquième.
Renommez l'identifiant
Dans
src/types/juice.ts, remplacez l'ancien identifiant par le nouveau. À partir de là, TypeScript signale chaque fichier qui utilise encore l'ancien identifiant.src/types/juice.tsexport type JuiceId = | "lemonGinger" | "blueberryAcai" | "peachFizz" | "raspberryRose";Créez le modèle de la canette
Chaque canette est un fichier
.glbavec un maillage et deux matériaux :M_Aluminum, le corps en métal, etM_Cola, l'étiquette. L'étiquette est une image enroulée autour de la canette, de 2048 sur 958 pixels, stockée dans le.glb. Pour créer votre canette, ouvrez-en une existante dans Blender (File > Import > glTF 2.0), remplacez l'image du matériauM_Colapar votre propre étiquette à la même taille, et exportez-la avec File > Export > glTF 2.0, au format glTF Binary (.glb). Gardez la taille et la position du modèle pour qu'il se place sur la roue comme les autres.Enregistrez-le sous
public/assets/3d/can/peach.glb. Le code rend chaque matériau métallique et brillant quand il charge le modèle (metalnessetroughnessdanssrc/features/carousel/hooks/useCanModel.ts), changez donc la finition là plutôt que dans Blender.Faites pointer la roue vers le modèle
Dans
src/features/carousel/constants/juiceCans.ts, modifiez l'entrée. L'ordre de cette liste est l'ordre sur la roue, et la première canette est celle sur laquelle la page s'ouvre.src/features/carousel/constants/juiceCans.ts{ id: "peachFizz", model: "/assets/3d/can/peach.glb" },Donnez-lui ses couleurs
Dans
src/features/product-showcase/constants/themes.ts, renommez l'entrée et définissez ses couleurs. Ce que chacune colore est décrit dans Couleurs.src/features/product-showcase/constants/themes.tspeachFizz: { mainBgColor: "#F4A27B", blurColor: "#FFE1D2", textColor: "white", accentColor: "rgba(255, 255, 255, 0.9)", buttonBgColor: "white", buttonTextColor: "#F4A27B", },Ajoutez son image de fruit
Placez un PNG à fond transparent dans
public/assets/images/fruit/, de 400 sur 600 pixels comme les autres, et indiquez son nom danssrc/features/floating-fruits/constants/fruitImages.ts. La page l'affiche quatre fois autour de la canette, à différentes tailles et sous différents angles.src/features/floating-fruits/constants/fruitImages.tspeachFizz: "peach.png",Écrivez ses textes
Dans
messages/en.jsoncomme dansmessages/ar.json, renommez les clés de la saveur sousjuicesetcart.itemset écrivez les nouveaux textes.messages/en.json"juices": { "peachFizz": { "name": "Peach Fizz", "description": "Ripe peaches and a light sparkle, cold from the can." } }Mettez à jour le panier, si la saveur y figure
Le panneau du panier affiche les articles de
src/features/navigation/constants/sampleCartItems.ts: Lemon Ginger et Blueberry Açai. Si la vôtre en fait partie, changez sonjuiceId, sonpriceet sonimage, une photo de la canette danspublic/assets/images/can/.Vérifiez
Terminaldansjuicyyarn typecheck yarn devRésultat attendu:
Un problème ?yarn typecheckne signale aucune erreur, et la nouvelle canette tourne en place avec ses couleurs, son fruit et ses textes.
Quand vous remplacez la première saveur, Lemon Ginger, changez aussi DEFAULT_JUICE_ID à la fin de themes.ts, et le background de body dans src/app/globals.css par son mainBgColor. Cette couleur s'affiche un instant avant que la page ait fini de charger.
Couleurs
Chaque saveur a un thème dans src/features/product-showcase/constants/themes.ts. La page passe en douceur d'un thème à l'autre quand la roue tourne.
| Champ | Ce qu'il colore |
|---|---|
mainBgColor | Le fond de la page, les boutons de taille non sélectionnés, et les boutons des panneaux du panier, du compte et de contact |
blurColor | Le halo doux derrière la canette |
buttonBgColor | Le remplissage du bouton See More et de la taille sélectionnée |
buttonTextColor | Le texte du bouton See More |
textColor et accentColor font partie de chaque thème, mais aucun composant ne les lit. Le texte de la page est blanc.
Pendant que la page tourne, useBodyBackground dans src/features/landing/hooks/ peint le fond de la page avec le mainBgColor de la saveur active. Le fond de body dans src/app/globals.css, #82AF38, ne couvre que l'instant avant le chargement de la page : changez-le en même temps que la première saveur.
La lumière reflétée sur les canettes vient de public/assets/hdri/forest_slope_1k.hdr, l'image Forest Slope de Poly Haven (CC0). Pour la changer, placez un autre fichier .hdr dans ce dossier et indiquez son nom dans src/features/carousel/constants/environment.ts.
Images
Remplacez un fichier par le vôtre sous le même nom, ou changez le nom là où le tableau l'indique.
| Image | Fichier | Nommée dans |
|---|---|---|
| Fruits | public/assets/images/fruit/*.png | src/features/floating-fruits/constants/fruitImages.ts |
| Glaçon | public/assets/images/ice/cube.webp | src/features/ice-cubes/utils/getImagePath.ts |
| Feuilles | public/assets/images/leaf/1.png, 2.png | src/features/ice-cubes/utils/getImagePath.ts |
| Ondulation d'eau | public/assets/images/drop.png | src/features/landing/constants/stage.ts |
| Canettes du panier | public/assets/images/can/*.webp | src/features/navigation/constants/sampleCartItems.ts |
Le nombre de glaçons et de feuilles, sur téléphone et sur les écrans plus grands, est défini dans src/features/ice-cubes/constants/layout.ts.
Polices
- Thunder, le mot géant : ses fichiers sont dans
src/app/fonts/etsrc/app/[locale]/layout.tsxles charge aveclocalFont. Pour utiliser une autre police, placez ses fichiers là et changez les cheminssrc. - Cairo, le texte arabe : chargée depuis Google Fonts dans le même fichier avec
next/font/google. RemplacezCairopar une autre police Google qui a le sous-ensemblearabic. - Le texte latin utilise Arial, défini sur
bodydanssrc/app/globals.css.
Parties de la page
La page tient dans un seul fichier, src/app/[locale]/page.tsx, qui place chaque partie. Pour en retirer une, supprimez son élément à cet endroit.
| Élément | Description |
|---|---|
<IceCubes> | Les glaçons et les feuilles sur les côtés |
<NavBar> | La barre de menu, avec le changement de langue, le compte et le panier |
<WaterWaveStage> | L'ondulation d'eau sous le pointeur, autour de tout le reste |
<ProductLogo> | Le mot géant derrière les canettes |
<JuiceCarousel> | La roue 3D, ses flèches et les fruits flottants |
<SizeSelector> | Les boutons ronds de taille |
<ProductInfo> | Le titre de la saveur, son texte et le bouton See More |
<ScrollDownButton> | Le bouton rond en bas qui ouvre le menu de contact |
Liens et boutons
Les liens du menu de contact sont dans src/features/product-showcase/constants/contactLinks.ts. Chacun a un id, une url et une icon de react-icons, et son libellé se trouve sous contact.links.<id> dans les fichiers de messages. Remplacez les deux liens d'exemple par les vôtres.
import { FaInstagram } from "react-icons/fa6";
{ id: "instagram", url: "https://www.instagram.com/your-brand", icon: FaInstagram },- Les éléments du menu sont listés par identifiant dans
src/features/navigation/constants/navItems.ts, avec leurs libellés sousnav.items. Ce ne sont que des libellés qui ne mènent encore nulle part : pour en transformer un en lien, affichez un<a>avec votre adresse danssrc/features/navigation/components/NavLinks.tsx. - See More, Checkout et View Cart n'ont encore aucune action. Ajoutez un
onClickou transformez-les en liens là où ils sont dessinés :src/features/product-showcase/components/ProductInfo.tsxetsrc/features/navigation/components/CartSummary.tsx. - Le formulaire de connexion vérifie ses champs puis les vide. Pour connecter des personnes, envoyez les valeurs depuis
onSubmitdanssrc/features/navigation/hooks/useSignInForm.tsvers votre propre back-end.
Tailles de bouteille
Les boutons ronds de taille viennent de src/features/product-showcase/constants/sizes.ts. Appuyer sur un bouton le sélectionne ; selected: true marque celui qui est choisi à l'ouverture de la page. Le libellé de l'unité se trouve sous units dans les fichiers de messages.
{ value: "355", unit: "ml", selected: true },Titre, description de la page et référencement
Le titre de l'onglet du navigateur et la description affichée par les moteurs de recherche sont metadata.title et metadata.description dans chaque fichier de messages, chaque langue a donc les siens. L'icône de l'onglet est src/app/favicon.ico : remplacez-la par la vôtre sous le même nom.
Le template ne définit ni adresse du site, ni image de partage, ni sitemap, ni robots.txt. Une fois votre domaine connu, ajoutez-les dans generateMetadata dans src/app/[locale]/layout.tsx, par exemple :
return {
metadataBase: new URL("https://www.your-domain.com"),
title: t("title"),
description: t("description"),
openGraph: { images: "/og.png" },
};Placez l'image de partage dans public/og.png, en 1200 sur 630 pixels.