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

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-بوّابات مُبرَزة كتوثيق.

أقسام صفحة التفاصيل

  1. A · Breadcrumb (Home → Calendar → Events → {العنوان})
  2. B · Hero (شارة الحالة + إيقونة الفئة + العنوان H1 + المدينة/الدولة + نطاق تاريخ البداية-النهاية + tag الوضع)
  3. C · صفّ الفعل (2 CTAs: Register/Apply أساسي، ثانوي "Add to calendar" تَحميل .ics + أزرار المشاركة)
  4. D · banner Postponed/Cancelled (فقط حين Status === postponed أو cancelled)
  5. E · ShortDescription → FullDescription → فقرة WhyItMatters تحريرية
  6. F · جدول التواريخ الأساسية (Registration deadline، Application deadline، Start، End — فقط التواريخ الموجودة)
  7. G · المكان + الخريطة (فقط حين إحداثيات geo حاضرة)
  8. H · كرت المنظِّم (logo + الاسم + النوع + رابط الموقع)
  9. I · شريط جانبي: إشارات cross-module (related founders / related startups / related editorial / related opportunities / related files)
  10. J · قسم Coverage (كل CoverageArticle بـ parentEventId = this.id)
  11. K · صفّ المصدر (sourceUrl + lastVerifiedAt + شارة verificationStatus — إشارة شفافية)
  12. 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 ضمن يوم.