Hero
ImplementedFull-bleed marketing hero — background image/video + gradient overlay + headline + subtitle + HeroSearch + featured badges. Used on /, /landing/* pages.
components/organisms/Hero/Hero.tsxFull-bleed marketing hero — background image/video + gradient overlay + headline + subtitle + HeroSearch + featured badges. Used on /, /landing/* pages.
Hero
design-system
Full-width marketing banner over an image or video background with a gradient scrim. i18n-via-props: no hardcoded strings — every visible label arrives through props, and ariaLabel defaults to EN "Hero" (FR callers override via prop). a11y: <section> landmark named by its <h1> (aria-labelledby), decorative media and scrim aria-hidden, badge links at the --ep-tap-min (44px) floor with focus rings. Overlay text uses theme-stable --ep-overlay-text-* tokens in both light and dark.
Props
headline*stringPrimary <h1> headline. Required — all copy arrives via props (i18n-via-props).
background*HeroBackgroundBackground media: { type: "image" | "video"; url: string; alt: string; posterUrl?: string } — posterUrl (video only) is the poster frame shown before playback.
search*React.ReactNodeSearch element rendered under the subheadline. Any ReactNode — the storefront passes its own HeroSearch twin; the DS HeroSearch molecule also fits.
subheadlinestringSupporting line under the headline. Not rendered when omitted.
featuredBadgesHeroFeaturedBadge[]Pill links — { label: string; href: string; icon?: React.ReactNode }[]. Each renders a ≥44×44px (--ep-tap-min) tap-target link with a focus ring. Defaults to [].
alignment"left" | "center"Text and content alignment. Defaults to 'left'.
height"sm" | "md" | "lg" | "full"Min-height preset: 20rem / 28rem / 36rem / full viewport. Defaults to 'lg'.
ariaLabelstringAccessible name for the <section> landmark (aria-labelledby points at the <h1>). Defaults to EN 'Hero' — FR callers override via prop.
classNamestringAdditional classes appended to the section root.
idstringSection id; defaults to hero-<useId> (also derives the headline anchor id).
Props
Hero
headlinestring—Primary `<h1>` headline. No hardcoded strings — all copy arrives via props (i18n-via-props).
backgroundHeroBackground—Background media: { type: 'image' | 'video'; url: string; alt: string; posterUrl?: string } — posterUrl (video only) is the poster frame shown before playback.
searchReact.ReactNode—Search element rendered under the subheadline. Any ReactNode — the storefront passes its own HeroSearch twin; the DS HeroSearch molecule also fits.
subheadlinestring—Supporting line under the headline. Not rendered when omitted.
featuredBadgesHeroFeaturedBadge[][]Pill links: { label: string; href: string; icon?: React.ReactNode }[]. Each renders a ≥44×44px (--ep-tap-min) tap-target link with a focus ring.
alignment"left" | "center"'left'Text and content alignment.
height"sm" | "md" | "lg" | "full"'lg'Min-height preset: 20rem / 28rem / 36rem / full viewport.
ariaLabelstring'Hero'Accessible name for the <section> landmark (aria-labelledby points at the <h1>). EN default — FR callers override via prop.
classNamestring—Additional classes appended to the section root.
idstringautoSection id; defaults to hero-<useId> (also derives the headline anchor id).
<Hero />Accessibility
Type
1 ruleARIA
1 ruleUsage
Import
import { Hero } from "@epasslive/design-system"Example 1
<Hero headline={t("headline")} subheadline={t("subheadline")} background={background} search={<HeroSearch />} featuredBadges={badges} alignment="left" height="lg" ariaLabel="Hero" />Example 2
<Hero headline="En vedette" background={{ type: "video", url: heroVideo, alt: "Ambiance du festival", posterUrl: heroPoster }} search={<HeroSearch />} alignment="center" height="full" ariaLabel="Hero" />Anti-patterns
— Do not fetch data directly in organisms
— Avoid tight coupling to specific data sources