انتقل إلى المقال
Aniq-UI

SaaS Landing Pageاجعله خاصًا بك

اجعله خاصًا بك

أين تغيّر الاسم، والنصوص، والصور، والأسعار، والألوان، والخطوط، والأقسام، والروابط.

شغّل الموقع بالأمر yarn dev أثناء التعديل: تُعاد تحميل الصفحة في كل مرة تحفظ فيها. كل المسارات أدناه نسبية إلى المجلد landing-page-template-2.

لتغييرعدّل
اسم العلامة التجاريةname في src/config/site.ts
أي نص في الصفحةmessages/en.json وmessages/ar.json
الصور والشعاراتpublic/ ومجلد constants/ في كل قسم
الأسعار والخططsrc/features/home/Pricing/constants/plans.ts وsrc/features/home/ComparisonTable/constants/
الألوانsrc/styles/globals.css وأصناف Tailwind في المكونات
الخطوطsrc/lib/fonts.ts
الأقسام الظاهرة وترتيبهاsrc/app/[locale]/page.tsx
روابط القائمة والتذييل والتواصل الاجتماعيsrc/layouts/Header/constants/, src/layouts/Footer/constants/footer.ts, src/config/site.ts
عنوان الموقع لمحركات البحث والمشاركةNEXT_PUBLIC_SITE_URL

الإعدادان

المتغيرالقيمة الافتراضيةوظيفته
NEXT_PUBLIC_SITE_URLhttp://localhost:3030العنوان العام للموقع. يُبنى منه رابط canonical، وروابط اللغات البديلة، وبطاقات المشاركة الاجتماعية. اضبطه على نطاقك قبل الإطلاق.
NEXT_PUBLIC_API_BASE_URLفارغواجهة API التي تستقبل اشتراكات النشرة البريدية. يستخدمها قسم النشرة البريدية فقط.

من دون Docker، ضعهما في .env.local (انسخ .env.example). مع Docker، مرّرهما كوسيطَي بناء: بناء الصورة لا يقرأ ملفات .env أو .env.local.

.env.local
NEXT_PUBLIC_SITE_URL=https://www.your-domain.com
الطرفيةفي landing-page-template-2
docker build -t saas-landing --build-arg NEXT_PUBLIC_SITE_URL=https://www.your-domain.com .

تُضمَّن القيمتان في الصفحة عند بنائها. بعد أي تغيير، أعد تشغيل yarn dev، أو شغّل yarn build مجددًا، أو ابنِ صورة Docker مجددًا. لا تضع أي سر في قيمة NEXT_PUBLIC_: يستطيع كل زائر قراءتها.

اسم العلامة التجارية والشعار

name في src/config/site.ts هو اسم العلامة التجارية. الشعار في الترويسة والتذييل هو حرفه الأول داخل مربع ملوّن، يليه الاسم، ويرسمه src/components/Logo.tsx. والنصوص التي تحتوي على {brand} في ملفات الرسائل تستخدمه أيضًا.

src/config/site.ts
name: "SaasPro",

والقيمة نفسها تملأ عنوان الصفحة، وبطاقة المشاركة على الشبكات الاجتماعية، وقائمة «الموارد»، وبيان تطبيق الويب الذي يبنيه src/app/manifest.ts بألوان الصفحة الداكنة. تغيّر الاسم في مكان واحد فقط.

وcreator في الملف نفسه هو المؤلف المذكور في البيانات الوصفية للصفحة. غيّره أيضًا.

النصوص

كل كلمة ظاهرة، وكل وصف صورة، وعنوان الصفحة موجودة في messages/en.json وmessages/ar.json. لكل قسم كتلته الخاصة التي تحمل اسمه: Header وHero وSocialProof وFeatures وHowItWorks وTestimonials وPricing وComparison وIntegrations وFaq وBlog وCta وNewsletter وFooter.

  • غيّر القيمة، وأبقِ المفتاح كما هو، وغيّرها في الملفين. المفتاح المفقود من أحد الملفين يظهر كخطأ رسالة مفقودة في صفحة تلك اللغة.
  • الكلمات بين الأقواس المعقوصة، مثل {brand} و{year}، يملؤها التطبيق. أبقِها كما هي.
  • في HowItWorks.title، تُرسم الكلمات الواقعة بين <highlight> و</highlight> بلون متدرّج. أبقِ الوسمين.

الصور

الصورةالملفمكان الضبط
صورة القسم الرئيسيpublic/images/hero.webpsrc/features/home/Hero/constants/hero.ts
كيف يعمل، صورة لكل خطوةpublic/images/dashboard.png, team.png, webinar.png, automation.pngsrc/features/home/HowItWorks/constants/steps.ts
صور قوائم الترويسةpublic/images/dashboard.png, webinar.pngsrc/layouts/Header/constants/mega-menus.ts
شعارات الشركاتpublic/images/logos/*.svgsrc/features/home/SocialProof/constants/companies.ts
شعارات التكاملاتpublic/images/logos/*.svgsrc/features/home/Integrations/constants/integrations.ts
صور آراء العملاءimages.unsplash.comsrc/features/home/Testimonials/constants/testimonials.ts
صور بطاقات المدونةimages.unsplash.comsrc/features/home/BlogPreview/constants/articles.ts
أيقونات الموقعpublic/favicon.svg, favicon.ico, favicon-96x96.png, apple-touch-icon.png, web-app-manifest-*.pngsrc/app/[locale]/layout.tsx, src/app/manifest.ts
صورة المشاركة الاجتماعية، 1200 في 630public/image.pngogImage في src/config/site.ts

أسهل تغيير هو استبدال ملف بملف خاص بك بالاسم نفسه. للملف الجديد، ضعه في public/ واستخدم مساره من جذر الموقع، مثل /images/your-photo.jpg.

لا تُحمَّل صورة من موقع آخر إلا إذا كان مضيفها مدرجًا تحت images.remotePatterns في next.config.js. المضيف المدرج الوحيد هو images.unsplash.com. أضف مضيفك هناك، أو انسخ الملفات إلى public/.

next.config.js
remotePatterns: [
  { protocol: "https", hostname: "images.unsplash.com" },
  { protocol: "https", hostname: "cdn.your-domain.com" },
],

الأسعار والخطط

الأسعار موجودة في مكانين، مكان لكل قسم. غيّر الاثنين حتى يتطابقا:

القسمالأسعار والمزاياالنصوص
بطاقات الأسعارsrc/features/home/Pricing/constants/plans.ts: price وfeatureIds وpopular لكل خطةPricing.plans في ملفات الرسائل
جدول المقارنةsrc/features/home/ComparisonTable/constants/pricing-tiers.ts للأسعار، وcomparison-features.ts لما تتضمنه كل خطةComparison.tiers وComparison.features في ملفات الرسائل

تُدرج مزايا الخطة بمعرّفاتها في featureIds، ويحتاج كل معرّف إلى نصه تحت الخطة في ملفَّي الرسائل. القيمة popular: true تَسِم الخطة بشارة «الأكثر شعبية».

الأسعار شهرية، بالدولار الأمريكي، ويُنسّقها src/hooks/usePriceFormatter.ts بحسب لغة الصفحة. لعرض عملة أخرى، غيّر قيمتها الافتراضية currency = "USD" إلى رمز عملتك، مثل "EUR".

الألوان

  • الألوان المميزة: أصناف Tailwind البنفسجية والوردية (purple-* وpink-*) في المكونات، مثل from-purple-600 to-pink-500 على الأزرار والشعار. ابحث في المجلد src عن purple- وpink- لتغييرها كلها.
  • خلفية الصفحة: bg-gray-950 على العنصر الخارجي للصفحة في src/app/[locale]/page.tsx. وتستخدم الأقسام أصناف gray-* فوقها.
  • الزر وحقل الإدخال المشتركان: متغيرات CSS في src/styles/globals.css، مثل --primary و--ring. الكتلة .dark هي المستخدمة.

الصفحة داكنة دائمًا: يضبط src/app/[locale]/layout.tsx الصنف dark ويشغّل مزوّد السمة مع defaultTheme="dark". لا توجد سمة فاتحة ولا مبدّل للسمة.

الخطوط

يحمّل src/lib/fonts.ts خط Inter للإنجليزية وخط Noto Sans Arabic للعربية من Google Fonts، عبر next/font. تُنزَّل الخطوط عند بناء الموقع ثم يقدّمها الموقع بنفسه. ويختار src/app/[locale]/layout.tsx الخط بحسب اللغة.

src/lib/fonts.ts
import { Inter, Noto_Sans_Arabic } from "next/font/google";

export const inter = Inter({ subsets: ["latin"] });
export const notoSansArabic = Noto_Sans_Arabic({ subsets: ["arabic"] });

لاستخدام خط آخر من Google Fonts، استورده من next/font/google بدلًا من أحد هذين الخطين وأبقِ الاسم المُصدَّر، أو غيّر الاسم حيث يستخدمه layout.tsx.

الأقسام

يسرد src/app/[locale]/page.tsx الأقسام بترتيب ظهورها. احذف سطرًا لإخفاء قسم، أو انقله لتغيير الترتيب. يقع كل قسم في مجلده الخاص تحت src/features/home/.

src/app/[locale]/page.tsx
<Header />
<Hero />
<SocialProof />
<Features />
<HowItWorks />
<Testimonials />
<Pricing />
<ComparisonTable />
<Integrations />
<Faq />
<BlogPreview />
<Cta />
<Footer />

تربط الترويسة بالأقسام عبر معرّفاتها، مثل #pricing و#testimonials. إذا حذفت قسمًا، فاحذف رابطه أيضًا.

لإضافة قسم:

  1. أنشئ src/features/home/<Section>/ مع ملف index.tsx، ومجلدَي components/ وconstants/ كما في الأقسام الأخرى.
  2. أضف نصوصه تحت مفتاح جديد في ملفَّي الرسائل واقرأها باستخدام useTranslations.
  3. صدّره من src/features/home/index.ts وضعه في src/app/[locale]/page.tsx.

قسم النشرة البريدية

يأتي مع القالب قسم للنشرة البريدية فيه نموذج للبريد الإلكتروني، في src/features/home/Newsletter/، لكنه ليس على الصفحة. لإظهاره، استورده مع الأقسام الأخرى وضعه في مكانه، مثلًا قبل قسم الدعوة إلى الإجراء:

src/app/[locale]/page.tsx
import {
  …
  BlogPreview,
  Newsletter,
  Cta,
} from "@/features/home";

<BlogPreview />
<Newsletter />
<Cta />

يحتاج النموذج إلى واجهة API خاصة بك. اضبط NEXT_PUBLIC_API_BASE_URL على عنوانها؛ يرسل النموذج { "email": "…" } بصيغة JSON في طلب POST إلى <NEXT_PUBLIC_API_BASE_URL>/newsletter/subscribe، مباشرة من متصفح الزائر.

  • الاستجابة 2xx تعرض رسالة النجاح وتفرغ النموذج.
  • أي استجابة أخرى، أو خطأ في الشبكة، أو قيمة فارغة لـ NEXT_PUBLIC_API_BASE_URL تعرض رسالة الخطأ. لا يُرسَل شيء ما دام المتغير فارغًا.
  • لأن المتصفح هو من يرسل الطلب، يجب أن تسمح واجهة API الخاصة بك بعنوان موقعك في إعدادات CORS.

النصوص موجودة تحت Newsletter في ملفات الرسائل.

تشير معظم الروابط في القالب إلى # حتى تعطيها وجهة:

الروابطعدّل
روابط الترويسة (الأسعار، آراء العملاء)src/layouts/Header/constants/nav-links.ts
قائمتا المنتجات والمواردsrc/layouts/Header/constants/mega-menus.ts
قائمة الجوالsrc/layouts/Header/constants/mobile-menu.ts
أعمدة التذييلfooterColumns في src/layouts/Footer/constants/footer.ts
أيقونات التواصل الاجتماعي في التذييلlinks في src/config/site.ts
زر «تسجيل الدخول» في الترويسةsrc/layouts/Header/components/HeaderActions.tsx
زر قسم «كيف يعمل» وروابط الخطواتsrc/features/home/HowItWorks/components/CtaButton.tsx وStepDetails.tsx
بطاقات المدونةsrc/features/home/BlogPreview/components/ArticleCard.tsx

أزرار «ابدأ الآن» و«ابدأ تجربة مجانية» و«احجز عرضًا توضيحيًا»، والأزرار في بطاقات الأسعار، أزرار عادية بلا وجهة. لتحويل أحدها إلى رابط، أعطِ Button الخاصية asChild وضع Link داخله، كما يفعل src/components/LocaleSwitcher.tsx:

TypeScript
import { Link } from "@/i18n/navigation";

<Button asChild className="…">
  <Link href="/signup">{common("getStarted")}</Link>
</Button>

يحافظ Link القادم من @/i18n/navigation على لغة الزائر في العنوان. لموقع آخر، استخدم <a href="https://…"> عاديًا بدلًا منه.

التواريخ وسنة حقوق النشر

  • سنة حقوق النشر في التذييل هي سنة بناء الموقع، وتأتي من COPYRIGHT_YEAR في src/layouts/Footer/constants/footer.ts. أعد البناء في السنة الجديدة لتحديثها.
  • تاريخ كل بطاقة مدونة ومدة قراءتها هما publishedAt وreadMinutes في src/features/home/BlogPreview/constants/articles.ts؛ أما عنوانها وملخصها فتحت Blog في ملفات الرسائل.

محركات البحث والمشاركة

  • عنوان الصفحة ووصفها هما Metadata.title وMetadata.description في كل ملف رسائل، فلكل لغة عنوانها ووصفها.
  • يعطي NEXT_PUBLIC_SITE_URL كل صفحة عنوانها الأساسي (/en أو /ar) والروابط بين اللغتين. اضبطه على نطاقك قبل البناء للإنتاج، وإلا ستشير محركات البحث والبطاقات الاجتماعية إلى localhost.
  • تستخدم بطاقة المشاركة الاجتماعية public/image.png (1200 في 630) مع العنوان والوصف نفسيهما.
  • لا يأتي القالب مع sitemap.xml ولا robots.txt.

توقفت عند خطوة؟

ابحث عن الحل قبل أن تبدأ من جديد.

حل المشكلات

تفضيلات ملفات تعريف الارتباط

نستخدم ملفات تعريف الارتباط لتعزيز تجربة التصفح الخاصة بك وتحليل حركة المرور على الموقع وتخصيص المحتوى. بالنقر على "قبول الكل"، فإنك توافق على استخدامنا لملفات تعريف الارتباط للتحليلات والإعلانات المخصصة.