Developer Page Specifications
Details + Submit
Details with 12 sections + cross-module sidebar + coverage list. Submit form with 3-gate verification.
Complete
Two more routes: /:lang/calendar/events/{slug} (details) and /:lang/calendar/submit (public submit form → admin verification queue). Details page is content-heavy with cross-module sidebar; submit page is a 30-field form with the 3-gate verification doctrine surfaced as documentation.
Details page sections (/:lang/calendar/events/{slug})
- A · Breadcrumb (Home → Calendar → Events → {title})
- B · Hero (status badge + category icon + title H1 + city/country + start-end date range + mode tag)
- C · Action row (2 CTAs: Register/Apply primary, secondary "Add to calendar" .ics download + share buttons)
- D · Postponed/Cancelled banner (only when Status === postponed or cancelled)
- E · ShortDescription → FullDescription → WhyItMatters editorial paragraph
- F · Key dates table (Registration deadline, Application deadline, Start, End — only the dates that exist)
- G · Venue + map (only when geo coordinates present)
- H · Organizer card (logo + name + type + website link)
- I · Sidebar: cross-module signals (related founders / related startups / related editorial / related opportunities / related files)
- J · Coverage section (every CoverageArticle with parentEventId = this.id)
- K · Source row (sourceUrl + lastVerifiedAt + verificationStatus badge — transparency signal)
- L · Footer
C · Action row contract
- Primary CTA (variable)
- Label switches by Event.Category: "Register" for conferences/workshops/meetups, "Apply" for accelerator/incubator/pitch-competition/hackathon. Action: window.open(registrationUrl OR applyUrl, _blank, noopener,noreferrer). Closing-soon upgrade: label becomes "Apply (closing soon)" with warning tint when days_to(applicationDeadline) ≤ 7.
- "Add to calendar" — .ics generation
- Client-side: generates an iCalendar VEVENT from Event.StartDate, EndDate?, Title, Location, Description (truncated to 500 chars), Url. Downloads as {slug}.ics. Fires calendar_ics_download.
- Share buttons
- navigator.share when available (mobile), else copy-to-clipboard. Twitter + LinkedIn deep-links. Fires calendar_share_click with channel property.
Submit page (/:lang/calendar/submit)
- Required fields: organizerName, organizerType, title (EN + AR), shortDescription (EN + AR), category, country, city, venue (when mode=physical), onlineUrl (when mode=online), mode, startDate, endDate?, timezone, audiences[] (≥1), stageRelevance[] (≥1), sourceUrl, submitterEmail, submitterName.
- Optional: applicationDeadline, registrationDeadline, websiteUrl, registrationUrl, applyUrl, contactEmail, socialLinks, coverImageUrl.
- Validation: at least one of registrationUrl/applyUrl/websiteUrl/contactEmail. endDate >= startDate. applicationDeadline <= startDate. sourceUrl must be HTTPS.
- On submit: POST /api/calendar/events/submissions. Server writes CalendarEvent row with verificationStatus=pending + sends submitter confirmation email. Admin triage queue (§10.6) handles verification.
- Rate limit: 3 submissions/IP/day. CAPTCHA challenge after the 2nd submission within a day.
