تخطَّ إلى المحتوى الرئيسي

Developer Page Specifications

Details Page

/:lang/opportunity-radar/{slug} — 16-section breakdown.

مكتمل

المسار: /:lang/opportunity-radar/{slug}. يَرسم فرصة واحدة كاملة — header، مساعد قرار، جسم، منظِّم، related، إشارات متّصلة. 16 قسم بترتيب قياسي. كل قسم شرطي: لو البيانات الأساسية مفقودة، القسم يَختفي بدلاً من الرسم فارغاً.

ترتيب الأقسام

  1. A · Breadcrumb
  2. B · header الفرصة (شارات الحالة، العنوان، meta أساسية)
  3. C · صندوق Apply via Official Source
  4. D · Should You Apply (مساعد قرار)
  5. E · What Is This Opportunity (وصف كامل)
  6. F · Who Is It For
  7. G · Why It Matters (رؤية تحريرية)
  8. H · Benefits
  9. I · Eligibility Criteria
  10. J · Application Requirements
  11. K · Timeline
  12. L · Organizer
  13. M · Related Opportunities
  14. N · Connected Signals (cross-module)
  15. O · كتلة اشتراك Opportunity Signals
  16. P · Footer (عام)

A · Breadcrumb

  • المسار: Home → Opportunity Radar → {العنوان الحالي}. العنوان الحالي غير قابل للنقر.
  • المصدر: شرائح المسار + OpportunityLang.Title للمحلّية الحالية.
  • يُصدر BreadcrumbList JSON-LD (انظر sub-topic SEO).

B · header الفرصة — الحقول

تسمية الموديول
ثابت: "Opportunity Radar". خط eyebrow.
رقم الفرصة
المصدر: Opportunity.DisplayOrder أو ترتيب تحريري. العرض: "#1" / "#42" إلخ. اختياري.
صفّ شارات الحالة
ارسم بالترتيب: { Status, Type, Sponsored (لو true), Verified (لو true) }. كل واحدة pill chip.
العنوان (H1)
المصدر: OpportunityLang.Title. الـ H1 الوحيد على الصفحة.
الوصف القصير
المصدر: OpportunityLang.ShortDescription. ≤ 200 حرف، يُرسم كفقرة lede.
pill الموعد
المصدر: Opportunity.DeadlineDate (أو IsRolling). نفس التسمية المحتسبة كـ كرت القائمة (انظر E القائمة).
pill الدولة
المصدر: Country.Code + Country.NameLang. علم emoji + اسم.
pill(s) المرحلة
المصدر: join OpportunityStage. كل المراحل معروضة، لا تقطيع overflow على صفحة التفاصيل (بخلاف الكرت).
pill قيمة الإشارة
المصدر: Opportunity.ValueSignal. أمثلة: "Funding available" / "Equity-free" / "Up to $100K". اختياري.

C · صندوق Apply via Official Source

عنوان الصندوق
ثابت: "Apply via Official Source".
نص الإفصاح
ثابت: "StartupHub does not collect applications. You apply directly with the organizer." مُترجَم لكل محلّية.
زر Official Apply
CTA أساسي. المصدر: Opportunity.OfficialUrl. السلوك: window.open(url, '_blank', 'noopener,noreferrer'). الحالة: مُعطَّل حين OfficialUrl null أو Status === Closed.
زر Share
يُحاول navigator.share أولاً (موبايل)، يَعود إلى copy-to-clipboard. يُطلق opportunity_share_click.
زر Save
مُعطَّل حالياً (تدفّق تسجيل الدخول لم يُوصَل بعد). حين يُفعَّل: POST /api/users/:userId/saved-items { type: 'opportunity', id }.
ملاحظة آخر تحقّق
footer الصندوق. "Last verified {N} days ago by {VerifiedBy.Name}". المصدر: Opportunity.LastVerifiedAt + Opportunity.VerifiedByUserId → User.DisplayName.

D · Should You Apply — مساعد قرار

الإلحاح
محتسب من DeadlineDate + Status. القيم: "Apply today" / "Apply this week" / "Plan ahead" / "No deadline (rolling)" / "Closed".
Best for
المصدر: Opportunity.BestForStages (نص حرّ bilingual). العرض: ملخّص 1-2 سطر. مثال: "Pre-seed B2B SaaS founders in MENA".
الوقت المطلوب
المصدر: Opportunity.TimeRequired. أمثلة: "15 minutes" / "2 hours" / "1 day (full application)". اختياري لكن مُفضَّل بشدة.
قيمة الإشارة
نفس الحقل كقسم header B. مُكرَّر هنا في سياق مساعد القرار.
متطلّبات نموذج التقديم
المصدر: Opportunity.ApplicationRequirements (نص حرّ bilingual). أمثلة: "Pitch deck, team CV, demo video".
عدد معايير الأهلية
مُجَمَّع: SELECT COUNT(*) FROM OpportunityEligibilityCriteria WHERE OpportunityId = :id. اعرض كـ "{N} eligibility criteria — see section I below".

E · What Is This Opportunity

  • الوصف الكامل — المصدر: OpportunityLang.FullDescription. يُرسم كـ HTML مُعَقَّم مُسبَقاً (markdown مُحَوَّل جانب-الخادم وقت التحرير). مطلوب: نعم.
  • بنية البرنامج — المصدر: OpportunityLang.ProgramStructure. اختياري. يُرسم كـ sub-heading + قائمة مُهَيكلة عند الوجود. أخفِ القسم عند الغياب.

F · Who Is It For

المراحل المُسْتَهدَفة
المصدر: join OpportunityStage. اعرض كمجموعة chip مُعَلَّمة.
القطاعات المُسْتَهدَفة
المصدر: join OpportunitySector. نفس عرض chip-group.
ملف المؤسّس / الفريق
المصدر: OpportunityLang.FounderProfile (نص حرّ). مثال: "Solo or 2-person teams, MENA-resident".
أهلية الدولة
المصدر: join OpportunityCountry (دعم متعدّد-الدول — بعض الفرص تَمتدّ عبر 16 دولة MENA، أخرى single-country).
الحد الأدنى من المتطلّبات
المصدر: OpportunityLang.MinimumRequirements (نص حرّ). أمثلة: "Incorporated entity" / "Working prototype" / "Revenue stage".

G · Why It Matters — رؤية تحريرية

المصدر: OpportunityLang.WhyItMatters. فقرة قصيرة مكتوبة تحريرياً (2-4 جمل) تشرح الأهمية الاستراتيجية للمنظومة — ليست وصف تسويقي، ليست إعادة-بيان للبرنامج. أمثلة: "Numu Demo Day is the first GCC demo day to publicly disclose term sheet outcomes." اختياري لكن مُفضَّل بشدّة لـ editorialPriority='featured' أو 'spotlight'. أخفِ القسم تماماً عند null.

H · Benefits

  • لكل benefit: { title, description, type, displayOrder, iconKey }.
  • المصدر: جدول join OpportunityBenefits. اعرض كشبكة كروت (2 أعمدة سطح المكتب، 1 موبايل).
  • الأنواع الشائعة: funding · mentorship · investor-access · workspace · corporate-pilots · legal-support · cloud-credits · network-access. النوع يَقود بحث iconKey.
  • مفروز بـ displayOrder ASC.

I · Eligibility Criteria

  • لكل معيار: { title, isRequired, notes, displayOrder }.
  • المصدر: جدول OpportunityEligibilityCriteria.
  • العرض: قائمة عمودية. المعايير المطلوبة تحصل على بادئة نقطة حمراء، الاختيارية على نقطة رمادية. الملاحظات (عند الوجود) تُرسم كنص صغير خفيف تحت العنوان.
  • مفروز بـ displayOrder ASC؛ المطلوب-أولاً حين displayOrder متساوي.

J · Application Requirements

المستندات المطلوبة[]
المصدر: OpportunityApplicationRequirements.RequiredDocs (مصفوفة سلاسل). العرض: قائمة نقطية.
المستندات الاختيارية[]
المصدر: OpportunityApplicationRequirements.OptionalDocs (مصفوفة سلاسل). العرض: قائمة فرعية "Optional" منفصلة.
Pitch deck مطلوب (bool)
المصدر: OpportunityApplicationRequirements.PitchDeckRequired. يُرسم كإيقونة inline ✓ + تسمية.
ملف المؤسس مطلوب (bool)
المصدر: OpportunityApplicationRequirements.FounderProfileRequired. نفس العرض inline.
عرض المنتج مطلوب (bool)
المصدر: OpportunityApplicationRequirements.ProductDemoRequired. نفس العرض inline.
رابط نموذج التقديم
المصدر: OpportunityApplicationRequirements.FormUrl. لو مختلف عن OfficialUrl، ارسم كزر ثانوي. وإلا أخفِ (مُزال التكرار).

K · Timeline

  • لكل عنصر: { date (ISO 8601), label, description, status, displayOrder }.
  • المصدر: جدول OpportunityTimeline.
  • العرض: timeline عمودي مع عمود التاريخ (يسار LTR، يمين RTL) + تسمية + وصف.
  • مفروز بـ date ASC، يَرجع لـ displayOrder حين التواريخ متساوية.
  • حالة العنصر (past / current / upcoming) محتسبة وقت الرسم من item.date مقابل NOW(). العناصر الماضية تَستخدم صبغة فاقدة-التشبّع.
  • أمثلة لكل عنصر: { date: "2026-04-15", label: "Applications open", status: "past" } / { date: "2026-05-31", label: "Deadline" } / { date: "2026-07-01", label: "Program start" } / { date: "2026-12-15", label: "Demo day" }.

L · Organizer

اسم المنظِّم + logo
المصدر: Organizer.Name + Organizer.LogoUrl. الـ logo: 80×80 مع object-contain.
نوع المنظِّم
المصدر: Organizer.Type. القيم: Accelerator / Incubator / VC / Corporate / Government / University / Community / Media / Other. يُرآة §9.6 OrganizerType.
دولة المنظِّم
المصدر: Organizer.CountryCode + Country.NameLang.
وصف المنظِّم
المصدر: Organizer.DescriptionLang. حد أقصى 2-4 سطور. أخفِ لو null.
شارة المنظِّم المُتحقَّق منه
المصدر: Organizer.IsVerified. يُرسم كـ ✓ chip صغير بجوار الاسم.
رابط موقع المنظِّم
المصدر: Organizer.WebsiteUrl. target="_blank" rel="noopener". إيقونة external-link inline.

M · Related Opportunities

  • نفس مكوّن <app-opportunity-card>، متغيّر compact.
  • حتى 6 كروت معروضة. عمودَيْن سطح المكتب، عمود واحد موبايل.
  • ترتيب المصدر: (1) روابط يدوية (جدول OpportunityRelatedOpportunity) مفروز بـ displayOrder؛ (2) ملء تلقائي من نفس Country + نفس Sector + Status ∈ { Open, ClosingSoon, Rolling }، مفروز بالحداثة.
  • الروابط اليدوية تَأتي دائماً أولاً. القسم يَختفي تماماً حين كلا المصدرَيْن يُرجعان صفر نتائج.

N · Connected Signals — شريط cross-module

أهم قسم استراتيجياً على الصفحة. يُبرز كل entity عبر Founder Files، Editorial، Startup Showcase، Founder Profiles، Events Coverage، و MENA Calendar الذي يَتصل بهذه الفرصة. المصدر: جدول EcosystemEntityLinks بالاستعلام entityType='opportunity' AND entityId=:id.

لكل إشارة متّصلة
الحقول: { sourceEntityType, sourceEntityId, sourceTitle, sourceCoverUrl, reasonLang, sourceRoute, relationType, displayOrder }. reasonLang هو الشرح التحريري القصير لسبب وجود الرابط — "Read this before applying" / "Adds market context" / "Startup in the same country".
قيم relationType
recommended-reading · context · related-entity · companion-event · companion-coverage · founder-mention. يَقود بادئة chip على كل كرت.
العرض
شريط scroll-snap أفقي على الموبايل؛ شبكة 3-أعمدة على سطح المكتب. كل كرت يَرسم sourceCoverUrl (أو SVG مُتولَّد احتياطي)، sourceTitle، شريحة reasonLang، ويُوَجِّه عبر sourceRoute عند النقر.

O · كتلة اشتراك Opportunity Signals

  • نفس المكوّن كقائمة F. تَجاوزات مدركة-للسياق: source='details', opportunity_id=current.
  • يَختار مُسبَقاً مربع اهتمام Opportunity Radar.
  • يَتتبَّع source_page=opportunity_details + target_opportunity_id في حدث submit.

P · Footer

<app-site-footer> عام فقط. لا footer لكل صفحة.