Skip to content

No.169 · Heroes

Waitlist Hero

A launch hero whose sign-up works like a ticket dispenser: join, and a stub feeds out of the form with your place in line rolling into view and an honest estimate of the wait.

The prompt

The design brief behind this component — reuse it to regenerate, remix, or explain it.

Build a centred launch hero: a pill eyebrow ('Vitrine for iPhone · Private beta'), a serif headline, a short paragraph, then a single-field form (email + 'Join the waitlist') with a quiet line beneath: '1,283 people ahead of you · 200 let in every Monday'. Validate on submit with specific messages (empty: 'Enter your email so we can let you in'; malformed: 'Check for a missing @ or dot'); the field's ring turns red and the hint becomes the error, announced politely. Submitting swaps the button label to 'Joining…' and then 'Joined' with a check (labels cross with a short rise). The confirmation is a ticket that feeds out from under the form: a slot opens (grid-template-rows 0fr → 1fr) while a cream paper stub slides down from behind the form (translateY −100% → 0, 900ms expo-out), with a dashed perforation along its top. On the ticket: 'Your place in line' and a large serif '#1,284' whose digits roll like reels into place, staggered 110ms; an estimate computed from the queue ('About 7 weeks at 200 a week. We'll email you the day you're in'); and a tear-off stub, separated by a dashed line with two semicircle notches cut by a CSS mask, offering 'Move up 100 places for each friend who joins with your link' and a copyable link. Focus moves to the ticket's heading, whose accessible name includes the number. onJoin(email) resolves to the real position.

Notes

Interaction
Type an email and press Enter or the button. Errors are specific; the ticket appears on success and its link can be copied.
Motion
Slot opens and ticket feeds 900ms; digits roll 1.4s staggered 110ms; button labels cross 200–400ms.
Accessibility
A labelled email input with aria-invalid and an aria-live hint that carries errors. On success focus moves to the ticket heading, which reads 'Your place in line, number 1,284'. The reel digits are aria-hidden. The ticket is inert until it appears. Reduced motion shows everything immediately.
Responsive
Below 520px the field and button stack and the stub moves under the ticket with a horizontal perforation.

Featured

301 components