Catalogue: ghost-content and ghost-video

What the content and video component packages each own, with representative components linking to Storybook.

2026-11-07

@v4/ghost-content

@v4/ghost-content owns the editorial content estate — 72 components (plus 6 internal layouts: article-card-by-format, article-header, article-page, carousel-block, listing-header, listing-page): article and rich-text blocks, embeds, promos, cards, headers and the listing / article page templates. It composes @v4/ghost-core components rather than duplicating them, and binds its own g.components.content.* token namespace from day one.

Content components carry the same story shape as core — grouped as Ghost-Content/{Category} in Storybook. A representative selection:

Component What it is Storybook
article-body The article body content well /?path=/docs/ghost-content-organisms-articlebody--docs
content-block-rich-text Rich-text (RTE) block /?path=/docs/ghost-content-molecules-contentblockrichtext--docs
accordion-block Expandable accordion block /?path=/docs/ghost-content-organisms-accordionblock--docs
block-scroller Horizontal scroller block /?path=/docs/ghost-content-organisms-blockscroller--docs
embed-video Embedded video block /?path=/docs/ghost-content-organisms-embedvideo--docs
embed-gallery Image gallery embed /?path=/docs/ghost-content-organisms-embedgallery--docs
embed-pull-quote Pull-quote embed /?path=/docs/ghost-content-organisms-embedpullquote--docs
card-news-article News article card /?path=/docs/ghost-content-organisms-cardnewsarticle--docs
card-video-article Video article card /?path=/docs/ghost-content-organisms-cardvideoarticle--docs
news-carousel Carousel of article cards /?path=/docs/ghost-content-organisms-newscarousel--docs
promo-block-simple Simple promotional block /?path=/docs/ghost-content-organisms-promoblocksimple--docs
stats-block Editorial stats block /?path=/docs/ghost-content-organisms-statsblock--docs
table-block Data table block /?path=/docs/ghost-content-organisms-tableblock--docs
text-image-block Text-and-image layout block /?path=/docs/ghost-content-organisms-textimageblock--docs
base-page-news-article Full news article page template /?path=/docs/ghost-content-templates-basepagenewsarticle--docs
base-page-news-listing News listing page template /?path=/docs/ghost-content-templates-basepagenewslisting--docs
clips-block The WSC Stories / Moments row's well (@v4/wsc mounts into it) /?path=/docs/ghost-content-organisms-clipsblock--docs
scroller-block-navigation-panel-sidebar The content scroller's navigation panel /?path=/docs/ghost-content-molecules-scrollerblocknavigationpanelsidebar--docs

The ELB fork

Every @v4/ghost-content component is built against ELB – Web – Content (9iz5GeR9syO68cmPr1ppE1), ELB's fork of Ghost – Content 2.0, except clips-block, whose bridge names the WSC Strip page of the EXT – ELB – Web – Structure file. Because the fork preserves Ghost's node ids, a bridge still naming the Ghost file resolves perfectly and measures the wrong design. As of 25 September 2026, 40 bridges still named Ghost – Content and were unaudited, and seven record no node ids at all (card-gallery-article, card-news-article, card-podcast-article, card-video-article, hero-thumbnail-card, promo-block-full-image, scroller-block-navigation-panel-expanding). Run /fork-status before refactoring any of them; the method is .claude/rules/frontend/fork-refactor.md.

Two ELB-specific behaviours worth knowing:

  • The content scroller renders one scroller per Content Scroller Block, its navigation rows naming the blocks it contains, and takes ONE colour way for the whole scroller from the block's Theme field — the contained blocks cannot deviate.
  • Competition marks on cards and headers use ghost-core's competition-marker (/?path=/docs/ghost-core-atoms-competitionmarker--docs): EuroLeague, EuroCup or NextGen, each in its own brand colour.

@v4/ghost-video

@v4/ghost-video owns the video domain surfaces — 27 components (plus 4 internal layouts: video-block, video-page, video-page-details, video-panel-card): video landing / detail / collection / playlist / match pages, the landing's blocks, video cards and carousels. Its page templates back the @v4/video-app route factories. The surfaces design has drawn are rebuilt against ELB's own video design rather than Ghost's.

Component What it is Storybook
base-page-video Video detail page template /?path=/docs/ghost-video-templates-basepagevideo--docs
base-page-video-landing Video landing page template /?path=/docs/ghost-video-templates-basepagevideolanding--docs
base-page-collection Video collection page template /?path=/docs/ghost-video-templates-basepagecollection--docs
base-page-playlist Playlist page template /?path=/docs/ghost-video-templates-basepageplaylist--docs
block-featured-video Featured video block /?path=/docs/ghost-video-organisms-blockfeaturedvideo--docs
block-playlist Playlist block /?path=/docs/ghost-video-organisms-blockplaylist--docs
block-related-videos Related-videos rail /?path=/docs/ghost-video-organisms-blockrelatedvideos--docs
card-video Video card /?path=/docs/ghost-video-organisms-cardvideo--docs
card-featured-video Featured video card /?path=/docs/ghost-video-organisms-cardfeaturedvideo--docs
header-video-hero Video hero header /?path=/docs/ghost-video-organisms-headervideohero--docs
livestream-frame Livestream well + states (code-only, ELTV) /?path=/docs/ghost-video-organisms-livestreamframe--docs
overlay-availability "Stream starts" notice /?path=/docs/ghost-video-molecules-overlayavailability--docs
base-page-match A game's video page template /?path=/docs/ghost-video-templates-basepagematch--docs
block-category A category's block on the landing /?path=/docs/ghost-video-organisms-blockcategory--docs
block-collections Rail of collection cards /?path=/docs/ghost-video-organisms-blockcollections--docs
block-numbered-list Numbered ("top ten") rail /?path=/docs/ghost-video-organisms-blocknumberedlist--docs
block-play-next A playlist's play-next queue /?path=/docs/ghost-video-organisms-blockplaynext--docs
block-players-list Players rail with its tab set /?path=/docs/ghost-video-organisms-blockplayerslist--docs
block-progress-list Rail or grid of progress or game cards /?path=/docs/ghost-video-organisms-blockprogresslist--docs
card-video-category Category card /?path=/docs/ghost-video-molecules-cardvideocategory--docs
card-video-collection Collection card /?path=/docs/ghost-video-molecules-cardvideocollection--docs
card-video-match Game card with its score box /?path=/docs/ghost-video-organisms-cardvideomatch--docs
card-video-numbered Numbered video card /?path=/docs/ghost-video-organisms-cardvideonumbered--docs
card-video-player Player card /?path=/docs/ghost-video-molecules-cardvideoplayer--docs
card-video-progress Video card with watch progress /?path=/docs/ghost-video-organisms-cardvideoprogress--docs
video-hero-thumbnail-card Thumbnail tile in the hero's panel /?path=/docs/ghost-video-organisms-videoherothumbnailcard--docs
video-up-next Panel over a playlist's player when a video ends /?path=/docs/ghost-video-organisms-videoupnext--docs

Rails and playback

The rails page by a fraction of their column rather than by the card's own width, so two cards fill a row on tablet and three on laptop — see Responsive rungs.

The actual video PLAYBACK lives outside this package — @v4/ghost-video is the presentation layer:

  • @v4/media (the only importer of the platform video SDK) owns the MediaPlayer at @v4/media/player — Brightcove, YouTube and Mux (the hosted player.mux.com frame by the playback's videoId) — and the VideoPreview at @v4/media/preview, a muted inline <video> of the Mux HLS stream behind the hero's autoplay and the card's hover.
  • @v4/eltv (EuroLeague TV) owns the livestream: its LivestreamPlayer at @v4/eltv/player mounts the Vesper player inside the code-only livestream-frame.