Skip to main content

Accelevents Class List for the Unified Registration Form

Written by Ariane Ramirez

The Unified Registration Page is coming soon, stay tuned for updates!

CSS and Javascript for the New Unified Registration Page

These are the CSS classes and element IDs you can use when creating Custom CSS and Javascript for the new Unified Registration Page.

  • Applies to: the events with the unified registration form enabled. Events on the classic flow use different class names, so this list does not apply to them.

  • Covers: the attendee checkout, host / staff checkout, embedded and widget checkout, and the order-form preview. All of these render the same form.

  • Scope your rules: start every selector with .registration-form so it can't affect other parts of the page.

.registration-form .registration-field__label {   font-weight: 600; }

Form structure

The form contains one section per person: the buyer, each attendee, and each add-on. Every section is an .attendee-form with its own header and body.

Class

Element

.registration-form

Outer wrapper of the whole form

.registration-form-header

Form header

.registration-form-header__top, __subtitle, __subtitle-text

Parts of the form header

.registration-sign-in

"Sign in" prompt, shown to buyers who aren't logged in

.registration-sign-in__text, __button

Sign-in prompt text and button

.attendee-form

One section (buyer, attendee or add-on)

.attendee-form--primary

The buyer's section

.attendee-form--collapsible

A section that can be collapsed

.attendee-form--collapsed

A section that is currently collapsed

.attendee-form__header

Section header

.attendee-form__header-title, __header-right

Section title and right-hand area

.attendee-form__toggle, __toggle-label, __toggle-icon

Expand / collapse control

.attendee-form__toggle-icon--open

Toggle icon while the section is open

.attendee-form__body

Section body that holds the questions

.registration-attendees-title

"Attendees" heading

.copy-from, __label, __select

"Copy from" selector on attendee sections

.registering-for, __label, __trigger, __option

"Registering for" picker

.registration-not-attending-banner

Not-attending notice

.attendee-visibility

Attendee visibility checkbox

.registration-vat, __options, __fields

VAT / "Invoice to" block

Layout grid

The questions in each section sit in a grid. Every question is full width except First Name and Last Name, which share a row.

Class

Element

.registration-field-grid

Grid that holds a section's questions

.registration-field-grid__item

One grid cell (one question)

.registration-field-grid__item--full

Full-width cell: every question except First Name and Last Name

Field wrapper

Every question is wrapped in .registration-field. The wrapper also gets a class for the question type and an error class while the answer is invalid.

Class

Element

.registration-field

Wrapper around every question

.registration-field--{type}

Question type (values below)

.registration-field--error

The question currently shows a validation error

.registration-field__label

Question label

.registration-field__required

The required-field asterisk (*)

.registration-field__error

Error message under the question

.registration-field__error-icon

Icon in the error message

Type values for {type}:

Modifier class

Question type

.registration-field--text

Short text

.registration-field--email

Email

.registration-field--number

Number

.registration-field--phone

Phone number with country code

.registration-field--textarea

Long text

.registration-field--cc_email

CC email

.registration-field--dropdown

Dropdown (one choice)

.registration-field--multiple_choice

Multiple choice

.registration-field--single_checkbox

Single checkbox

.registration-field--date

Date

.registration-field--upload

File upload

.registration-field--image

Image upload

.registration-field--address

Address, country or state

.registration-field--conditional

Conditional question (radio options that reveal follow-up questions)

.registration-field--interest

Interest tags

.registration-field--text_block

Text block (display only, no answer)

.registration-field--vat

VAT ID / company (inside the VAT block)

.registration-form .registration-field--error .registration-field__label {   color: #b42318; }

Inside specific question types

Some question types contain their own inner elements. Several of these classes are also used outside the registration form, so always scope them under .registration-form.

Question type

Classes

Notes

Single checkbox

.check-button, .check-button__input, .check-button__control, .check-button__label

__control is the visible box, __label the checkbox text

Dropdown and multiple choice

.multiple-option-attribute-field, .attribute-dropdown-root, .dropdown-question-option, .dropdown-attribute-option, .multiple-checkbox, .ae-option-label

The menu also gets .attr-menu-open-up or .attr-menu-open-down depending on the space available

Conditional question

.registration-field__conditional, .registration-field__radio-group, .conditional-radioBtn-inner

.registration-field__conditional adds .has-error on error

Date

.dateTime-dropdown-popup

Adds .error-border on error

Phone

.intl-tel-input, .intl-tel

Country-code picker and number input

Image upload

.registration-field__image, .checkout-image-preview

Upload area and preview

Interest tags

.interest-tag-attendee

Inner tag container adds .interest-tag-error on error

Text block

.registration-field__text-block

The admin's rich-text content

Long text

.error-textArea

Added to the text area on error

Targeting one specific question

Questions don't have their own class, so you target one by its ID. Each question's input ID, and its label's for attribute, follow the pattern {section}-{Question Name}. The question name appears exactly as you entered it, spaces included. Each section has the ID form-{section}.

Because the ID contains spaces, use an attribute selector that matches the end of the ID rather than a #id selector.

CSS: style one question in every section

/* The input for the "Company" question */ .registration-form [id$="-Company"] {   text-transform: uppercase; }  /* The whole wrapper of the "Job Title" question, label included */ .registration-form .registration-field:has([id$="-Job Title"]) {   background: #f6f7f9;   padding: 12px;   border-radius: 8px; }

JavaScript: read or react to one question

document.querySelectorAll('.registration-form [id$="-Company"]').forEach((input) => {   input.addEventListener('blur', () => {     console.log('Company entered:', input.value);   }); });

The form appears after the page loads and re-renders as buyers add attendees or open sections. Code that runs once on page load may find no fields. Use a MutationObserver on .registration-form, or delegated listeners on document, so your code also reaches fields that appear later.

document.addEventListener('focusout', (event) => {   if (event.target.matches('.registration-form [id$="-Company"]')) {     console.log('Company entered:', event.target.value);   } });

Best practices

  • Stick to the classes in this document. The registration-*, attendee-form* and check-button* names are meant for styling. Short utility classes you may see in the page, such as m-b-0, d-flex, font-w500 or w-fit, are layout helpers and can change without notice.

  • Always scope under .registration-form. Shared classes like .attribute-dropdown-root, .multiple-option-attribute-field and .dateTime-dropdown-popup also appear elsewhere on the page.

  • Renaming a question breaks ID selectors. A rule that targets [id$="-Company"] stops matching if the question is renamed. Update your custom code whenever you rename a question.

  • Questions with the same ending can collide. [id$="-Name"] also matches "First Name" and "Last Name". Make the end of the selector specific enough to match only the question you want.

  • Don't hide required questions with CSS. The question stays required, so the buyer can't continue and can't see why.

  • Test on the live checkout and on a phone. Custom CSS shows in the admin preview, but saved Custom JS doesn't run there. On mobile, checkout scrolls inside its own container, so fixed or sticky positioning can behave differently.

Did this answer your question?