Developer Page Specifications
Details + Submit
Details with 12 sections + cross-module sidebar + coverage list. Submit form with 3-gate verification.
مكتمل
مساران آخران: /:lang/calendar/events/{slug} (التفاصيل) و /:lang/calendar/submit (نموذج تقديم عام → طابور تحقّق admin). صفحة التفاصيل ثقيلة-المحتوى مع شريط جانبي cross-module؛ صفحة التقديم نموذج 30-حقل مع عقيدة التحقّق 3-بوّابات مُبرَزة كتوثيق.
أقسام صفحة التفاصيل
- A · Breadcrumb (Home → Calendar → Events → {العنوان})
- B · Hero (شارة الحالة + إيقونة الفئة + العنوان H1 + المدينة/الدولة + نطاق تاريخ البداية-النهاية + tag الوضع)
- C · صفّ الفعل (2 CTAs: Register/Apply أساسي، ثانوي "Add to calendar" تَحميل .ics + أزرار المشاركة)
- D · banner Postponed/Cancelled (فقط حين Status === postponed أو cancelled)
- E · ShortDescription → FullDescription → فقرة WhyItMatters تحريرية
- F · جدول التواريخ الأساسية (Registration deadline، Application deadline، Start، End — فقط التواريخ الموجودة)
- G · المكان + الخريطة (فقط حين إحداثيات geo حاضرة)
- H · كرت المنظِّم (logo + الاسم + النوع + رابط الموقع)
- I · شريط جانبي: إشارات cross-module (related founders / related startups / related editorial / related opportunities / related files)
- J · قسم Coverage (كل CoverageArticle بـ parentEventId = this.id)
- K · صفّ المصدر (sourceUrl + lastVerifiedAt + شارة verificationStatus — إشارة شفافية)
- L · Footer
C · عقد صفّ الفعل
- CTA الأساسي (متغيّر)
- التسمية تَتبدَّل بـ Event.Category: "Register" للمؤتمرات/الورش/اللقاءات، "Apply" لـ accelerator/incubator/pitch-competition/hackathon. الفعل: window.open(registrationUrl أو applyUrl، _blank، noopener,noreferrer). ترقية closing-soon: التسمية تُصبح "Apply (closing soon)" مع صبغة warning حين days_to(applicationDeadline) ≤ 7.
- "Add to calendar" — توليد .ics
- جانب-العميل: يُوَلِّد iCalendar VEVENT من Event.StartDate، EndDate?، Title، Location، Description (مُقَصَّص لـ 500 حرف)، Url. يُحَمَّل كـ {slug}.ics. يُطلق calendar_ics_download.
- أزرار المشاركة
- navigator.share عند التوفّر (موبايل)، وإلا copy-to-clipboard. deep-links لـ Twitter + LinkedIn. يُطلق calendar_share_click مع خاصية channel.
صفحة التقديم (/:lang/calendar/submit)
- الحقول المطلوبة: organizerName، organizerType، title (EN + AR)، shortDescription (EN + AR)، category، country، city، venue (حين mode=physical)، onlineUrl (حين mode=online)، mode، startDate، endDate?، timezone، audiences[] (≥1)، stageRelevance[] (≥1)، sourceUrl، submitterEmail، submitterName.
- اختياري: applicationDeadline، registrationDeadline، websiteUrl، registrationUrl، applyUrl، contactEmail، socialLinks، coverImageUrl.
- التحقّق: على الأقل واحد من registrationUrl/applyUrl/websiteUrl/contactEmail. endDate >= startDate. applicationDeadline <= startDate. sourceUrl يجب أن يَكون HTTPS.
- عند الإرسال: POST /api/calendar/events/submissions. الخادم يَكتب صف CalendarEvent مع verificationStatus=pending + يُرسل بريد تأكيد للمُقدِّم. طابور فرز admin (§10.6) يَتعامل مع التحقّق.
- حد المعدّل: 3 تقديمات/IP/يوم. تحدّي CAPTCHA بعد التقديم الـ 2 ضمن يوم.
