Developer Page Specifications
Listing Page
/:lang/founders — search, filters, sort, founder card grid.
Complete
Route: /:lang/founders. Grid of all published founder cards with search, filters (country, sector, role, verified flag, claimed/founder-led flag), and a sort dropdown. Most-connected entity-type on the platform — every card surfaces a thumbnail of the founder’s startups + speaking history badge counts.
Page sections (top → bottom)
- A · Hero (eyebrow + H1 + lede + 2 CTAs)
- B · Stat strip (total founders, verified count, founder-led count)
- C · Search + filter rail (country, sector, role, verified, founder-led)
- D · Sort dropdown (most-relevant, newest, alphabetical, most-mentioned)
- E · Founder cards grid (canonical <app-founder-card>)
- F · Claim-your-profile CTA banner (for unauthenticated)
- G · Cross-module rail (Founder Files / Calendar speakers / Editorial profile spotlight)
- H · Global footer
C · Filter contract
- q (search)
- Debounced 300ms · matches across: FounderLang.DisplayName, FounderLang.Bio, FounderLang.Headline, Country.Name, Startup.Name (joined). Min 2 chars.
- country (multi-select)
- Source: Founder.CountryCode. Filter value: ISO 3166-1 alpha-2. Query param: country=eg,sa.
- sector (multi-select)
- Source: aggregated from Founder.relatedStartupIds → Startup.industries[]. A founder with startups across multiple sectors appears under any selected sector.
- role (multi-select)
- Source: Founder.PrimaryRole. Values: ceo, cto, cofounder, founder, operator. Driven by Founder.PrimaryRole lookup table.
- verified (bool)
- Source: Founder.IsVerified. Single checkbox. When true, only Founder.IsVerified=true rows.
- flavor (single-select)
- Values: all | editorial | founder-led. Source: Founder.Flavor. Editorial = staff-authored, never self-claimed; founder-led = self-claimed via account.
- sort (single-select)
- Values: most-relevant (default with q) | newest (Founder.PublishedAt DESC) | alphabetical (DisplayName ASC, locale-aware collation) | most-mentioned (count of cross-module mention references DESC).
E · Founder card fields
- avatarUrl
- Source: Founder.AvatarUrl. Square 96×96 (2x = 192×192). Fallback: generated SVG initial-on-tinted-bg. Required: yes (visual).
- displayName
- Source: FounderLang.DisplayName. Bilingual. Required: yes.
- headline
- Source: FounderLang.Headline. Single-line 80 chars max. "CEO at Paymob" / "Co-founder, Climatech Africa". Required: yes.
- role chip
- Source: Founder.PrimaryRole (lookup → label). Display: small uppercase chip.
- country chip
- Flag emoji + Country.NameLang. Source: Founder.CountryCode + Country.NameLang.
- verified badge
- Source: Founder.IsVerified. Small green ✓ icon. Tooltip: "Editorially verified".
- flavor badge
- Source: Founder.Flavor. "Editorial" pill (purple) or "Founder-led" pill (blue). Hidden when flavor=editorial AND IsVerified=true (default state, no badge needed).
- startup thumbnails (up to 3)
- Source: Founder.relatedStartupIds → Startup.LogoUrl[0..2]. Stacked horizontally with negative margin overlap. "+N" overflow when ≥4 startups.
- mention count chip
- Source: COUNT(EcosystemEntityLinks WHERE RelatedEntityType='founder' AND RelatedEntityId=Founder.Id). Display: "Mentioned in {N}" when N ≥ 1. Hide otherwise.
- CTA — View Profile
- routerLink: /:lang/founders/{Founder.Slug}. Fires founder_card_click.
UI states
- Loading: 12 skeleton cards (matches default page size).
- Empty: documented empty state with "Clear filters" CTA + link to /:lang/founders.
- Error: toast + retry CTA, preserves loaded cards.
- Pagination: infinite scroll via IntersectionObserver. 24 cards/batch.
