About this set
Two heroes built around an email field, for waitlists, early access and newsletters. Centred waitlist is a private beta hero with a status badge, a headline, an email field and a Join the waitlist button inside one rounded bar, a hint line underneath and a count of people already waiting. Split newsletter sign-up puts a photo beside a serif headline and a short form: an optional first name, a required email address and a choice between a weekly and a monthly email made from two radio cards. Validation needs no JavaScript. The email field is required and typed, so the browser blocks an empty or malformed submit, and :user-invalid only turns the field red after the visitor has typed and moved on, never on page load. At that point :has() swaps the hint for a written error that says what a valid address looks like. Both messages are tied to the field with aria-describedby. On phones the waitlist bar stacks the field over the button and the newsletter photo becomes a short banner.
What’s included
- Visible labels on every field, with the optional one marked as optional
- Hint and error text linked to the field with aria-describedby
- Errors shown through :user-invalid only after interaction
- Frequency choice built from native radio buttons in a fieldset
- Bootstrap version uses .form-control, .form-text and .invalid-feedback without JavaScript
Accessibility
Each field has a visible label, the email field is type="email" and required, and the hint and error are referenced by aria-describedby. The error is written text with an icon, not only a red border. The radio choices sit in a fieldset with a legend, every control shows a 3px focus outline, and button transitions stop under prefers-reduced-motion.
Customise it
Change --wl-accent, --wl-accent-hover, --wl-field and --wl-error on .wl, or the .wl-split modifier for the warm palette. In Bootstrap the same variables restyle .form-control and .btn; in Tailwind swap the #6d28d9 and #92400e values and the user-invalid: colours.






