Developer Page Specifications
Details Page
/:lang/opportunity-radar/{slug} — 16-section breakdown.
المسار: /:lang/opportunity-radar/{slug}. يَرسم فرصة واحدة كاملة — header، مساعد قرار، جسم، منظِّم، related، إشارات متّصلة. 16 قسم بترتيب قياسي. كل قسم شرطي: لو البيانات الأساسية مفقودة، القسم يَختفي بدلاً من الرسم فارغاً.
ترتيب الأقسام
- A · Breadcrumb
- B · header الفرصة (شارات الحالة، العنوان، meta أساسية)
- C · صندوق Apply via Official Source
- D · Should You Apply (مساعد قرار)
- E · What Is This Opportunity (وصف كامل)
- F · Who Is It For
- G · Why It Matters (رؤية تحريرية)
- H · Benefits
- I · Eligibility Criteria
- J · Application Requirements
- K · Timeline
- L · Organizer
- M · Related Opportunities
- N · Connected Signals (cross-module)
- O · كتلة اشتراك Opportunity Signals
- 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 لكل صفحة.
