اجعله خاصًا بك
غيّر النصوص، والنكهات وعلبها ثلاثية الأبعاد، والألوان، والصور، والخطوط، وعنوان الصفحة.
مكان كل شيء
| العنصر | المكان |
|---|---|
| كل النصوص، باللغتين | messages/en.json وmessages/ar.json |
| عنوان الصفحة ووصفها | مفاتيح metadata في الملفين نفسيهما |
| النكهات وعلبها ثلاثية الأبعاد | src/features/carousel/constants/juiceCans.ts، والنماذج في public/assets/3d/can/ |
| ألوان كل نكهة | src/features/product-showcase/constants/themes.ts |
| الإضاءة على العلب | public/assets/hdri/forest_slope_1k.hdr، ويُذكر في src/features/carousel/constants/environment.ts |
| صور الفواكه | public/assets/images/fruit/، ومذكورة في src/features/floating-fruits/constants/fruitImages.ts |
| مكعبات الثلج والأوراق وقطرة الماء | public/assets/images/ice/, public/assets/images/leaf/, public/assets/images/drop.png |
| منتجات السلة النموذجية | src/features/navigation/constants/sampleCartItems.ts، والصور في public/assets/images/can/ |
| أحجام العبوات | src/features/product-showcase/constants/sizes.ts |
| روابط التواصل | src/features/product-showcase/constants/contactLinks.ts |
| عناصر القائمة | src/features/navigation/constants/navItems.ts |
| الخطوط | src/app/[locale]/layout.tsx وsrc/app/globals.css |
| أيقونة الموقع | src/app/favicon.ico |
شغّل yarn dev أثناء العمل: تُعاد تحميل الصفحة مع كل حفظ.
النصوص
كل كلمة في الصفحة تأتي من messages/en.json وmessages/ar.json. غيّر القيمة ولا تغيّر المفتاح أبدًا، وأبقِ المفاتيح نفسها في الملفين.
| المفتاح | ما هو |
|---|---|
brand.name | الاسم في بداية شريط القائمة |
brand.wordmark | الكلمة الضخمة خلف العلب |
juices.<id>.name, juices.<id>.description | عنوان كل نكهة ونصها |
nav.items | تسميات القائمة |
cart.items | أسماء المنتجات في لوحة السلة |
scroll.firstLine, scroll.secondLine | الكلمتان على الزر الدائري في الأسفل، الذي يفتح قائمة التواصل |
contact | عنوان قائمة التواصل وتسميات روابطها |
metadata | عنوان الصفحة ووصفها |
تُرسم الكلمة الضخمة بخط Thunder، بأحرف كبيرة، وهي JUICY في اللغتين. أبقِها بأحرف لاتينية، أو غيّر خطها أيضًا.
استبدل نكهة
النكهة معرّف يربط بين علبة ثلاثية الأبعاد ومظهر لوني وصورة فاكهة ونصوصها. تستبدل الخطوات أدناه انفجار المانجو بنكهة جديدة، Peach Fizz، بالمعرّف peachFizz. واتبع الخطوات نفسها لأي من النكهات الأربع.
تتسع العجلة لأربع علب بالضبط: أربعة مواضع في src/features/carousel/constants/positionConfigs.ts، وربع دورة لكل خطوة. استبدل نكهة بدلًا من إضافة خامسة.
غيّر اسم المعرّف
في
src/types/juice.ts، استبدل المعرّف القديم بالجديد. ومن هنا، يشير TypeScript إلى كل ملف ما زال يستخدم المعرّف القديم.src/types/juice.tsexport type JuiceId = | "lemonGinger" | "blueberryAcai" | "peachFizz" | "raspberryRose";اصنع نموذج العلبة
كل علبة ملف
.glbفيه شبكة واحدة ومادتان:M_Aluminumلجسم العلبة المعدني، وM_Colaللملصق. الملصق صورة واحدة ملفوفة حول العلبة، بحجم 2048 في 958 بكسل، ومخزّنة داخل ملف.glb. لصنع علبتك، افتح علبة موجودة في Blender (File > Import > glTF 2.0)، واستبدل الصورة في المادةM_Colaبملصقك بالحجم نفسه، ثم صدّرها عبر File > Export > glTF 2.0 بصيغة glTF Binary (.glb). حافظ على حجم النموذج وموضعه حتى يستقر على العجلة مثل غيره.احفظه باسم
public/assets/3d/can/peach.glb. تجعل الشيفرة كل مادة معدنًا لامعًا عند تحميل النموذج (metalnessوroughnessفيsrc/features/carousel/hooks/useCanModel.ts)، لذا غيّر اللمسة النهائية هناك وليس في Blender.اربط العجلة بالنموذج
في
src/features/carousel/constants/juiceCans.ts، غيّر العنصر. ترتيب هذه القائمة هو الترتيب على العجلة، والعلبة الأولى هي التي تفتح عليها الصفحة.src/features/carousel/constants/juiceCans.ts{ id: "peachFizz", model: "/assets/3d/can/peach.glb" },أعطها ألوانها
في
src/features/product-showcase/constants/themes.ts، غيّر اسم العنصر واضبط ألوانه. ما يلوّنه كل لون موضّح في الألوان.src/features/product-showcase/constants/themes.tspeachFizz: { mainBgColor: "#F4A27B", blurColor: "#FFE1D2", textColor: "white", accentColor: "rgba(255, 255, 255, 0.9)", buttonBgColor: "white", buttonTextColor: "#F4A27B", },أضف صورة فاكهتها
ضع صورة PNG بخلفية شفافة في
public/assets/images/fruit/، بحجم 400 في 600 بكسل مثل الصور الأخرى، واذكر اسمها فيsrc/features/floating-fruits/constants/fruitImages.ts. تعرضها الصفحة أربع مرات حول العلبة، بأحجام وزوايا مختلفة.src/features/floating-fruits/constants/fruitImages.tspeachFizz: "peach.png",اكتب نصوصها
في
messages/en.jsonوmessages/ar.jsonكليهما، غيّر أسماء مفاتيح النكهة تحتjuicesوcart.itemsواكتب النص الجديد.messages/en.json"juices": { "peachFizz": { "name": "Peach Fizz", "description": "Ripe peaches and a light sparkle, cold from the can." } }حدّث السلة، إن كانت النكهة فيها
تعرض لوحة السلة المنتجات الموجودة في
src/features/navigation/constants/sampleCartItems.ts: ليمون وزنجبيل، وتوت أزرق وأساي. إذا كانت نكهتك إحداهما، فغيّرjuiceIdوpriceوimageالخاصة بها، وهي صورة للعلبة فيpublic/assets/images/can/.تحقّق
الطرفيةفيjuicyyarn typecheck yarn devالنتيجة المتوقعة: لا يُبلغ
تواجه مشكلة؟yarn typecheckعن أي أخطاء، وتدور العلبة الجديدة إلى مكانها بألوانها وفاكهتها ونصوصها.
عندما تستبدل النكهة الأولى، ليمون وزنجبيل، غيّر أيضًا DEFAULT_JUICE_ID في نهاية themes.ts، وقيمة background الخاصة بـ body في src/app/globals.css إلى قيمة mainBgColor الخاصة بها. يظهر ذلك اللون لحظة قبل اكتمال تحميل الصفحة.
الألوان
لكل نكهة مظهر في src/features/product-showcase/constants/themes.ts. تنتقل الصفحة بسلاسة من مظهر إلى الذي يليه مع دوران العجلة.
| الحقل | ما يلوّنه |
|---|---|
mainBgColor | خلفية الصفحة، وأزرار الأحجام غير المختارة، والأزرار في لوحات السلة والحساب والتواصل |
blurColor | التوهج الناعم خلف العلبة |
buttonBgColor | تعبئة زر اعرف المزيد والحجم المختار |
buttonTextColor | نص زر اعرف المزيد |
textColor وaccentColor جزء من كل مظهر لكن لا يقرؤهما أي مكوّن. نصوص الصفحة بيضاء.
أثناء عمل الصفحة، يلوّن useBodyBackground في src/features/landing/hooks/ خلفية الصفحة بلون mainBgColor للنكهة النشطة. أما خلفية body في src/app/globals.css، أي #82AF38، فلا تظهر إلا لحظة قبل تحميل الصفحة، لذا غيّرها مع النكهة الأولى.
يأتي الضوء المنعكس على العلب من public/assets/hdri/forest_slope_1k.hdr، وهي صورة Forest Slope من Poly Haven (CC0). لتغييره، ضع ملف .hdr آخر في المجلد نفسه واذكر اسمه في src/features/carousel/constants/environment.ts.
الصور
استبدل ملفًا بملفك تحت الاسم نفسه، أو غيّر الاسم في المكان الذي يذكره الجدول.
| الصورة | الملف | مذكورة في |
|---|---|---|
| الفواكه | public/assets/images/fruit/*.png | src/features/floating-fruits/constants/fruitImages.ts |
| مكعب الثلج | public/assets/images/ice/cube.webp | src/features/ice-cubes/utils/getImagePath.ts |
| الأوراق | public/assets/images/leaf/1.png, 2.png | src/features/ice-cubes/utils/getImagePath.ts |
| التموّج المائي | public/assets/images/drop.png | src/features/landing/constants/stage.ts |
| العلب في السلة | public/assets/images/can/*.webp | src/features/navigation/constants/sampleCartItems.ts |
عدد مكعبات الثلج والأوراق، على الهواتف والشاشات الأكبر، مضبوط في src/features/ice-cubes/constants/layout.ts.
الخطوط
- Thunder، للكلمة الضخمة: ملفاته في
src/app/fonts/ويحمّلهاsrc/app/[locale]/layout.tsxباستخدامlocalFont. لاستخدام خط آخر، ضع ملفاته هناك وغيّر مساراتsrc. - Cairo، للنص العربي: يُحمَّل من Google Fonts في الملف نفسه باستخدام
next/font/google. استبدلCairoبخط آخر من Google يتضمن المجموعة الفرعيةarabic. - النص اللاتيني يستخدم Arial، المضبوط على
bodyفيsrc/app/globals.css.
أجزاء الصفحة
الصفحة ملف واحد، src/app/[locale]/page.tsx، يضع كل جزء في مكانه. لإزالة جزء، احذف عنصره من هناك.
| العنصر | ما هو |
|---|---|
<IceCubes> | مكعبات الثلج والأوراق على الجانبين |
<NavBar> | شريط القائمة، مع مبدّل اللغة والحساب والسلة |
<WaterWaveStage> | التموّج المائي تحت المؤشر، المحيط بكل ما عداه |
<ProductLogo> | الكلمة الضخمة خلف العلب |
<JuiceCarousel> | العجلة ثلاثية الأبعاد وأسهمها والفواكه العائمة |
<SizeSelector> | أزرار الأحجام الدائرية |
<ProductInfo> | عنوان النكهة ونصها وزر اعرف المزيد |
<ScrollDownButton> | الزر الدائري في الأسفل الذي يفتح قائمة التواصل |
الروابط والأزرار
روابط قائمة التواصل موجودة في src/features/product-showcase/constants/contactLinks.ts. لكل رابط id وurl وicon من react-icons، وتسميته تحت contact.links.<id> في ملفات الرسائل. استبدل الرابطين النموذجيين بروابطك.
import { FaInstagram } from "react-icons/fa6";
{ id: "instagram", url: "https://www.instagram.com/your-brand", icon: FaInstagram },- عناصر القائمة مذكورة بمعرّفاتها في
src/features/navigation/constants/navItems.ts، وتسمياتها تحتnav.items. هي تسميات فقط ولا تؤدي إلى أي مكان بعد: لتحويل أحدها إلى رابط، اعرض<a>بعنوانك فيsrc/features/navigation/components/NavLinks.tsx. - اعرف المزيد وإتمام الشراء وعرض السلة لا تؤدي أي إجراء بعد. أضف
onClickأو حوّلها إلى روابط حيث تُرسم:src/features/product-showcase/components/ProductInfo.tsxوsrc/features/navigation/components/CartSummary.tsx. - نموذج تسجيل الدخول يتحقق من حقوله ثم يفرّغها. لتسجيل دخول المستخدمين فعلًا، أرسل القيم من
onSubmitفيsrc/features/navigation/hooks/useSignInForm.tsإلى واجهتك الخلفية.
أحجام العبوات
تأتي أزرار الأحجام الدائرية من src/features/product-showcase/constants/sizes.ts. الضغط على زر يختاره، ويحدد selected: true الحجم المختار عند فتح الصفحة. تسمية الوحدة موجودة تحت units في ملفات الرسائل.
{ value: "355", unit: "ml", selected: true },عنوان الصفحة ووصفها ومحركات البحث
عنوان تبويب المتصفح والوصف الذي تعرضه محركات البحث هما metadata.title وmetadata.description في كل ملف رسائل، فلكل لغة عنوانها ووصفها. وأيقونة التبويب هي src/app/favicon.ico: استبدلها بأيقونتك تحت الاسم نفسه.
لا يضبط القالب عنوان الموقع، ولا صورة المشاركة على الشبكات الاجتماعية، ولا خريطة الموقع، ولا robots.txt. عندما تعرف نطاقك، أضفها في generateMetadata داخل src/app/[locale]/layout.tsx، مثلًا:
return {
metadataBase: new URL("https://www.your-domain.com"),
title: t("title"),
description: t("description"),
openGraph: { images: "/og.png" },
};ضع صورة المشاركة في public/og.png، بحجم 1200 في 630 بكسل.