Passer au contenu principal

WaitlistJoinForm

Planned

Waitlist join form for sold-out events — email input, notification preference, and join button.

Categorymolecules
Sourcepatterns/molecules/waitlistjoinform.html
AI HintSold-out event waitlist join — event-scoped queue with position on success. NOT a Newsletter variant: Newsletter is the global marketing list (unscoped, Promise result); shared surface is atom-level reuse only. Composes with sold-out ticket rows (QuickBuyBar adjacency). Figma node 9:1009.

Sold-out event waitlist signup with email + notification preference.

WaitlistJoinForm

Form & Choice — Family 3

Sold-out event waitlist signup with email + notification preference. Event-scoped via eventId, with an SMS-preference checkbox and a queue-position success state.

Status

Planned — React component not yet implemented. This molecule is a catalog entry only; nothing is exported from the barrel yet, so no live preview renders above and the intended API below is not importable today.

Usage

Sold-out event waitlist signup with email + notification preference. Render it when a ticket type is sold out — in the slot where QuickBuyBar would otherwise offer "Buy Now". Not a Newsletter variant: Newsletter is the site-wide marketing list subscription, while this form is event-scoped (eventId), carries an SMS preference, and its onJoin callback returns void — the parent owns the async join, errors, and queue-position display.

// NOT YET EXPORTED — intended API once the component ships (status: planned).
// import { WaitlistJoinForm } from '@epasslive/design-system'

<WaitlistJoinForm
  eventId={event.id}
  onJoin={(email, notifySms) => joinWaitlist(event.id, email, notifySms)}
/>

Props

Prop
Type
Default
Description
eventId*
string
—

Backend id of the event (or ticket type) whose waitlist this join targets; scopes the submission and the returned queue position.

onJoin*
(email: string, notifySms: boolean) => void
—

Fires on submit with the entered email and the SMS-preference checkbox state. Returns void — the parent owns the async join call, error state, and success/position display.

Accessibility

  • Visible label bound to the email input via label htmlFor — never aria-label-only (WCAG 1.3.1 / 4.1.2).
  • Validation errors: aria-invalid on the input, error wired via aria-describedby with role="alert" (WCAG 3.3.1).
  • Success announced in a role="status" / aria-live="polite" region including the queue position as text — never color or position alone (WCAG 4.1.3).
  • aria-busy + disabled submit with a "Joining…" label while the join is in flight.
  • Focus order: email → SMS-preference checkbox → submit; focus moves to the success announcement after joining.
  • All controls meet the 44×44 tap minimum via --ep-tap-min (WCAG 2.5.5).

Internationalization

No waitlist i18n keys exist yet; the full copy set (email label/placeholder, SMS-preference label, submit/submitting, success + queue position, error variants) needs locale-aware strings. The queue-position sentence is the ordinal trap — EN "You are 42nd in line" vs FR "Vous êtes 42e dans la file" — and must come from a locale-aware ordinal formatter (next-intl select-ordinal or Intl.PluralRules), never string concatenation.

Props

Preview

WaitlistJoinForm

Prop
Type
Required
Default
Description
eventId
string
Required
—

Event (or ticket type) identifier scoping the waitlist join.

onJoin
(email: string, notifySms: boolean) => void
Required
—

Called when the visitor joins — receives the email and the SMS notification preference.

Quick use:<WaitlistJoinForm />

Accessibility

ARIA roleform

validation

1 rule

NASA Rule 7

email must be valid format

ARIA

4 rules

WCAG 4.1.2

Form must have aria-label describing purpose

WCAG 3.3.1

Errors linked via aria-describedby with aria-invalid on the input

WCAG 4.1.3

Success state and queue position announced in an aria-live="polite" region

WCAG 4.1.2

Submit sets aria-busy="true" while the join request is in flight

label

1 rule

WCAG 3.3.2

Email input must have a visible label bound via htmlFor (never aria-label only)

Keyboard

1 rule

WCAG 2.4.3

Focus order: email → notification preference → submit

target

1 rule

WCAG 2.5.8

Input and submit meet the 44x44px minimum (--ep-tap-min)

sr

1 rule

WCAG 1.3.1

Queue position conveyed as screen-reader-readable text (not color or layout position alone)

Usage

Import

tsxSnippet
import { WaitlistJoinForm } from "@epasslive/design-system"

Example 1

tsxSnippet
<WaitlistJoinForm eventId={event.id} onJoin={handleJoin} />

Anti-patterns

— Do not hardcode data in molecules

— Avoid complex business logic in molecules

Design System v4.1.0 | ePassLive