Developer Page Specifications
Article Details
/:lang/insights/{slug-id} — premium 11-section reading experience: breadcrumb, header, hero, body, tags, author, related, most-read sidebar, ecosystem signals, newsletter, footer.
Route: /:lang/editorial/{slug}. The article reading experience. Magazine-style typography, Arabic RTL-first parity, sticky sidebar with most-read + share, cross-module connected-signals rail. Each section is conditional — sections with no data hide rather than rendering empty.
Section order (top → bottom)
- A · Breadcrumb (Home → Editorial → Category → {title})
- B · Article header (type chip + category badge + topic badges + H1 title + dek + byline row)
- C · Featured image (16:9, with alt + caption + credit)
- D · Reading-controls bar (share + save + font-size + translation switch when applicable)
- E · Article body (sanitised HTML, prose-editorial typography)
- F · Author card (avatar + name + role + bio + author-page link + social)
- G · Tags row (topic chips, routing to topic pages)
- H · Connected ecosystem signals (cross-module rail — Founders, Startups, Opportunities, Files, Events, Coverage)
- I · Related articles (same category + same topic + manual editor picks)
- J · Most-read sidebar (sticky on desktop, inline-below on mobile)
- K · Newsletter block (context-aware: preselects article category, tracks article_id)
- L · Footer (global)
B · Header fields
- Type chip
- Source: EditorialArticle.type. Display: small uppercase chip with type-specific tint (news=red/news, analysis=blue, commentary=amber, interview=green, profile=purple, guide=primary). Translated label via i18n key editorial.type.{type}.
- Category badge
- Source: EditorialCategory.NameLang via CategoryId FK. Routes to /:lang/editorial/categories/{categorySlug} on click. Distinct from type chip — category is the editorial bucket, type is the article format.
- Title (H1)
- Source: EditorialArticleLang.Title. ONLY H1 on the page. Type scale: t-page-h1 (clamp 1.75rem → 2.5rem).
- Dek (standfirst)
- Source: EditorialArticleLang.Dek. 1-3 sentences. Display: t-body-lg, muted-foreground tint. Required: yes.
- Byline row
- Fields: author avatar (32×32) + author name (clickable → author page) + author role + "·" separator + publishedAt (localised) + "·" + readingTimeMinutes ("{N} min read") + "·" + isUpdated chip when updatedAt > publishedAt + 7 days.
C · Featured image rules
- Aspect ratio: 16:9 desktop, 4:3 mobile (via aspect-ratio CSS, not pixel heights).
- Source: EditorialArticleImage.Url, AltLang, CaptionLang, Credit, DisplayOrder=0 (the first image is the featured one).
- Fallback when no image: generated branded SVG (article title + category icon composite). NEVER an empty grey box.
- Caption rendered as <figcaption> below image, with credit attribution prefix italicised.
- Click-to-expand on mobile when image is portrait-oriented (rare for cover, common for inline figures).
E · Article body — reading experience contract
- Max-width: 720px (66 chars per line target for English, 60 chars for Arabic).
- Typography: prose-editorial class. font-size 18px desktop / 16px mobile. line-height 1.7 LTR / 1.85 RTL (Arabic needs more leading for diacritics).
- Allowed body tags (sanitised): h2-h4 (h1 is reserved for article title), p, ul, ol, li, blockquote, figure + figcaption, a, em, strong, code, pre.
- Pull-quotes (custom data-pullquote="true" attribute on <blockquote>) render with distinct typography: larger, primary-tinted, italic.
- Inline images: 4:3 default, with figcaption support, click-to-expand on mobile.
- Inline links: underline always (not just on hover), with primary tint. External links open in new tab with rel=noopener,noreferrer.
F · Author card
- Source: EditorialAuthorLang via AuthorId FK. Fields: avatar (64×64), name, role, short bio (max 200 chars), social links (LinkedIn, Twitter), "View all articles by {name}" CTA → /:lang/editorial/authors/{authorSlug}.
- Card design: distinct from article body — bordered panel, slight background tint.
H · Connected ecosystem signals (cross-module rail)
The strategically critical section. Surfaces every entity across Founders, Startups, Opportunities, Founder Files, Calendar Events, Coverage that the article mentions OR is contextually relevant to. Source: EcosystemEntityLinks WHERE entityType='editorial' AND entityId=:articleId, supplemented by mentionedFounderIds + mentionedStartupIds + mentionedEventIds + mentionedOpportunityIds explicit references.
- Per signal card: { sourceEntityType, sourceTitle, sourceCoverUrl?, reasonLang, sourceRoute, relationType, displayOrder }. reasonLang is the short editorial explanation — "Founder mentioned in this story" / "Funding opportunity for this sector" / "Recent event covering this topic".
- Cap: 8 cards displayed (horizontal scroll-snap on mobile, 3-col grid on desktop). "See all connected signals →" when more exist.
- isPractical=true articles SUPPRESS the Files sub-rail (the article itself IS the practical reference).
I · Related articles
- Sourcing priority: (1) Manual links via EditorialArticleRelated table (editor-curated); (2) Same category + same topic, sorted by publishedAt DESC; (3) Same topic across categories.
- Cap 6 articles. Display: <app-editorial-card variant="compact"> in 3-col grid.
- Exclude self. Section hides when 0 related articles.
