Vocals • Jazz
ArtistCard
PlannedPerformer/artist card — circular image, name, role, follow button. Used in event detail and artist pages.
patterns/molecules/artistcard.htmlPerformer/artist card — circular image, name, role, follow button. Used in event detail and artist pages.
ArtistCard
Display molecule (planned)
Performer/artist card: circular avatar, name (links to the artist page), role line and a follow toggle.
Status
Planned molecule — the React component is not yet implemented. Nothing is exported from the DS barrel; the render above is a design reference mock typed to the planned interface, not the component.
Planned API
Sketch of the intended contract. Until the component ships, this is not importable code.
interface ArtistCardProps {
id: string;
name: string;
role: string;
image: { url: string; alt: string };
href: string;
isFollowing?: boolean;
onFollowToggle?: () => void;
}
// Sketch — ArtistCard is planned and NOT exported from the barrel yet.
<ArtistCard
id="marie-tremblay"
name="Marie Tremblay"
role="Vocals • Jazz"
image={{ url: '/artists/marie.webp', alt: 'Portrait of Marie Tremblay' }}
href="/artists/marie-tremblay"
isFollowing={false}
onFollowToggle={() => follow('marie-tremblay')}
/>When to use
- Lineup sections in event detail pages.
- Search results filtered by artist.
- Dedicated artist profile pages.
Accessibility
Planned contract (no implementation exists to audit yet): the avatar is a real <img> whose alt text comes from image.alt (WCAG 1.1.1); the follow toggle is a <button aria-pressed={isFollowing}> whose visible label reflects the state (Follow / Following) per WCAG 4.1.2 (Name, Role, Value); the card root is an <article> (implicit role="article"); the follow button keeps a 44×44px tap target (--ep-tap-min) per WCAG 2.5.5.
Props
id*stringStable artist identifier (consumed by the follow handler).
name*stringArtist display name.
role*stringRole / instrument / genre line (e.g. “Vocals • Jazz”).
image*{ url: string; alt: string }Circular avatar — URL plus alt text (alt is required by the a11y contract).
href*stringLink to the artist page (wraps the name).
isFollowingbooleanfalseWhether the current user already follows this artist.
onFollowToggle() => voidFollow/unfollow handler; the button exposes aria-pressed={isFollowing}.
Props
ArtistCard
idstring—Stable artist identifier (backend row id).
namestring—Artist display name (already localized by the caller).
rolestring—Role / instrument / genre line (e.g. 'Voix • Jazz'). Translated by the caller.
image{ url: string; alt: string }—Circular avatar image. alt MUST be provided in the user's locale (WCAG 1.1.1).
hrefstring—Link to the artist profile page.
isFollowingbooleanfalseWhether the current user already follows this artist; drives follow-button state.
onFollowToggle() => void—Follow/unfollow handler. When omitted the follow button is not rendered.
<ArtistCard />Accessibility
Type
1 ruleARIA
1 rulea11y
1 ruleUsage
Import
import { ArtistCard } from "@epasslive/design-system"Example 1
<ArtistCard id={a.id} name={a.name} role={a.role} image={a.image} href={`/artists/${a.slug}`} isFollowing={a.followed} onFollowToggle={() => toggle(a.id)} />Anti-patterns
— Do not hardcode artist names/roles — accept them as props (caller translates)
— Do not render the follow button without onFollowToggle
— Do not use a div onClick for the card link — anchor or button semantics only