Content and publishing
The page types, article formats, listings and editorial blocks the site publishes, and how an editor's change goes live.
Content types & pages
This is the core of the site and it is all Available today. Editors author in Contentful (Euro League's space, 12gd2cvfgb6b); the app renders typed pages from that content. Everything below ships in the content domain, which every page of the site builds on.
Every address carries the locale first — /en/… — and competitions other than EuroLeague have their own sections (/en/eurocup/…, /en/news/eurocup). See Competition sections.
Page types
| Page | What it is | URL shape | Status | Detail |
|---|---|---|---|---|
| Home page | A competition's configurable front page — hero (with live widgets), carousels, promo blocks | /en, /en/eurocup |
Available | App & rendering |
| News article | A single editorial article with rich body content | /en/news/{article} |
Available | Content model |
| News listing | The paginated index of articles | /en/news, /en/news/page/2 |
Available | Pagination & filtering |
| Filtered news | The news narrowed by season, then format and team, each its own page | /en/news/season/2025-26/format/video/page/2 |
Available | Pagination & filtering |
| Competition news | A competition's news — an editor's listing, or one generated from the articles tagged with it | /en/news/eurocup, /en/news/eurocup/category/{category} |
Available | Competition sections |
| Category listing | Articles in one category (an editor's listing for the category takes it over) | /en/news/category/{category} |
Available | Pagination & filtering |
| Tag listing | Articles with one tag | /en/news/tag/{tag} |
Available | Pagination & filtering |
| Editor's listing page | A news listing an editor sets up with its own header, featured article and blocks | /en/news/{listing} |
Available | Competition sections |
| Content page | A free-form page built from editorial blocks, at any path | /en/{...path}, /en/eurocup/{...path} |
Available | App & rendering |
| Code of Conduct report | The In-Arena Code of Conduct incident report, for fans signed in with their EuroLeague ID | /en/code-of-conduct |
In development (email delivery not set up) | @v4/code-of-conduct |
Articles and listings share the /en/news/… space: when an editor's listing and an article could answer the same address, the listing wins. Older addresses (/news/listing/{listing}, …/filter/…) redirect permanently to the current ones.
Article formats
Articles are not just text. The card and page layer recognises several editorial formats, each with its own presentation — Euro League uses standard news, gallery and video articles. (The components also have a podcast format; ELB has no podcasts, so it is not used here.) An article can lead a listing, appear in a rail, or be promoted on the home page, and it renders appropriately in each place.
Articles also carry basketball facts an editor sets — the competition (required), the season, the teams involved and the game or round it is about. They decide which competition's news an article appears in, the news rails on team pages, and the live widgets in the article's header (see Widgets across the site).
Listings & filtering
Listings are path-based — /en/news/page/2, /en/news/category/interviews — so every page is individually cacheable and fast. Filters are part of the address too: after the listing's base come key/value pairs in a fixed order — season, format (on the main news listing only) and team — then an optional page number, and each filter narrows the others (they combine with AND). Every filtered view is a static page with exactly one address; pairs in another order redirect to it. There is no free-text search.
See Pagination & filtering for the full model.
Rich editorial blocks
A content page, home page or article body is composed from reusable blocks that editors arrange in Contentful. All of the following are Available:
| Block | Purpose |
|---|---|
| Rich text | Headings, lists, links, quotes, inline media — the article body |
| Text & text-with-image | Copy blocks, optionally paired with an image |
| Accordion | Expandable Q&A / disclosure sections |
| Table | Structured tabular data |
| Stats | Highlighted statistics |
| Carousels | Promo, news, gateway, tabbed and content scrollers |
| Promo & countdown | Promo blocks, including a countdown banner (a Promo Block of type countdown) |
| Clips (WSC Sports) | A row of WSC Stories / Moments clips (when WSC is switched on) |
| Gallery | Image galleries |
| Embeds | Social posts, YouTube, script embeds and third-party embeds |
| Pull quote | Emphasised editorial quotes |
| Download | Downloadable file links |
| Gateway cards | Signpost cards linking onward |
| Header blocks & heroes | Page mastheads and hero slides |
Rich text is rendered through a dedicated pipeline that maps Contentful's document format onto themed components — see Rich text rendering. The blocks themselves come from the content component package (72 components); browse them in the UI catalogue.
Images
Euro League's images are served through Scoreplay's image CDN, which crops each picture to the size and shape a surface needs; an image uploaded to Contentful instead is served through Contentful's own image service. Editorial images support focal points — an editor marks the important part of an image, and every crop across breakpoints keeps it in frame. See Images & focal points and @v4/image.
Editorial workflow
How an editor's change reaches the live site. The whole loop is Available and automatic — editors work in Contentful and never touch a deploy.
The loop
- Author. Editors create and edit content in Contentful, the CMS. Content types (articles, pages, blocks, navigation, settings) are defined in code (
@v4/model), so editors get typed, validated fields — not a blank canvas. - Publish. Publishing an entry in Contentful fires a webhook to the live app.
- Revalidate. The app translates "this article changed" into exactly the pages that need refreshing — the article itself, any listing it appears in, the home page if it is promoted — and refreshes only those. The same request clears those pages from the Cloudflare edge in front of the site (where the edge is configured), and, because the app's shared cache lives in Redis when one is configured, the refresh reaches every running copy of the app at once. No full rebuild, no manual cache clear.
- Live. Readers see the change within seconds; unaffected pages stay cached and fast.
Because invalidation follows the data, editors never think about caching or URLs. A navigation edit refreshes site chrome everywhere; an article edit refreshes just that article and its listings.
| Step | Status | Detail |
|---|---|---|
| Typed authoring model | Available | Content model |
| Publish webhook & targeted revalidation | Available | Caching & revalidation |
| Self-healing fallback (time-based) | Available | Caching & revalidation |
| Edge purge on publish (Cloudflare) | Available, switched on by environment | Caching & revalidation |
| Draft preview | Available, off unless configured | Caching & revalidation |
Previewing drafts
Editors can preview unpublished changes on the site when an environment is given Contentful's preview token and a preview secret (CONTENTFUL_PREVIEW_TOKEN, CONTENTFUL_PREVIEW_SECRET); the site then enters draft mode through /api/preview and leaves it through /api/disable-preview. Preview is off by default — without the token every page reads published content only. The basketball data pages never preview: they hold nothing an editor drafts.
The editor's tools in Contentful
Alongside Contentful's own fields, editors use Contentful apps installed into the space: Mux Video (uploading and managing video on a Video Item), the video picker, social embed, the ticker editor (the site does not yet draw the ticker), downloads, path generator, image geo rules, auto-save date, social channels, player profile details and match data. They are declared in packages/model/apps/registry.json and installed by the model's sync-apps step; their source lives in the Publishing Hub template, which builds and releases them.
Localised content
Euro League runs in one locale, en-US. Content is authored in that locale in Contentful, and the interface copy (button labels, section titles) is managed through a dictionary: the code owns the set of labels and their default wording, and editors can change the wording in Contentful without a deploy. The site can serve more locales when ELB wants them. See Internationalisation.
What editors do not author
The basketball data pages — teams, players, coaches, games, standings and stats — come from the Competition Engine, not Contentful. Editors can set a few things on a team or player entry (an editorial name, crest, pictures, socials, biography), and where they do, the editor's value wins; everything else is the engine's. See Sport.
What editors do not do
- No deploys. Content changes never require a code deploy.
- No cache management. Revalidation is automatic and targeted.
- No layout code. Pages are composed from blocks the site provides; editors arrange them.