LanderLab lets you design quizzes visually, but if you need more control, you can use Custom CSS to style your quiz beyond the built-in settings.
This is useful when you want to fine-tune the appearance of quiz elements or apply styles that are not available in the editor.
How it works
LanderLab lets you inject custom CSS into your flow. Your CSS is automatically scoped inside the .ll-quiz root container, so styles only affect your quiz and never bleed into the rest of the page.
Where to add CSS
In your LanderLab editor, open Settings → Custom CSS and paste your rules there. Every selector you write is already inside .ll-quiz — you don’t need to prefix anything.
You cannot style the .ll-quiz root element itself (e.g. background, font-family). These are controlled by the theme engine. Target child elements instead.
Scoping rules
All your CSS lives inside .ll-quiz. Theme variables (like --colorPrimary) are read-only — they’re set by the theme engine and can’t be overridden. To change how something looks, write regular CSS rules targeting the selectors described in this guide.
✓ Do this
✗ Not this - variables are read-only
Selector reference
Use these selectors to target the elements you want to style. All of them are scoped inside .ll-quiz automatically.
Layout & structure
.ll-quiz-step
All steps (visible + hidden)
.ll-quiz-step[data-active-step=“true”]
Only the currently visible step
.ll-quiz-header
Fixed top header area
.ll-quiz-footer
Fixed bottom footer area
.ll-quiz-block
Every block, any type
.ll-quiz-block—[type]
A specific block type (e.g. --text-field)
.ll-quiz-block__input
All text inputs and selects
.ll-quiz-block__input-wrapper
Wrapper div around inputs
.ll-quiz-block__label
Field labels
.ll-quiz-block__decorator
Prefix / suffix icons or text
.ll-quiz-continue-button
Continue button
.ll-quiz-previous-button
Previous / back button
.ll-quiz-submit-button
Submit button
.ll-quiz-default-button
Generic action button
.ll-quiz-button-text
Label inside any button
.ll-quiz-button-description
Sub-label inside any button
Choice blocks
.ll-choice-option
A single multiple-choice option
.ll-choice-option:has(input:checked)
A selected option
.ll-choice-option__text
Text label inside an option
.ll-img-choice-option
An image choice option card
.ll-img-choice-option:has(input:checked)
Selected image choice card
.ll-choice-label
Choice block group label
Progress & feedback
.ll-quiz-progress__fill
The filled bar portion
.ll-quiz-header__progress-fill
Header progress bar fill
.ll-quiz-block—has-error
A block that failed validation
.ll-quiz-block-error
The error message text
.ll-quiz-variable
Dynamic variables in text (e.g. first name)
All text inputs, selects, textareas, and similar fields share the same class structure. Target .ll-quiz-block__input to style them all at once, or narrow by block type for individual control.
CSS
Target a specific block by ID
Find the block ID from the URL when editing a block in LanderLab (e.g. text-field-abc123).
Style prefix / suffix decorators
Labels
Buttons in LanderLab render as <a> elements, not <button>. Use the specific selector for each button type, or target all buttons at once with a shared class.
Choice blocks
Multiple-choice and image-choice options can be styled in their default, hover, and selected states.
Style options
Image choice cards
Hide the radio / checkbox icon
Progress bars
There are two progress bar locations — one inline in steps, and one in the header. Style them independently or together.
Inline progress bar
Responsive design
LanderLab uses CSS container queries, not media queries. Always use the container syntax below — standard @media queries won’t work as expected inside the quiz container.
The breakpoint is 490px: anything wider is treated as desktop, anything narrower as mobile.
Container query syntax
Do not use @media queries
Use @container quiz-container (...) instead of @media (...). The quiz is a container component and media queries won’t reflect its actual width.
States & validation
When a field fails validation, it receives the class .ll-quiz-block--has-error. Use this to style error states consistently with your design.
Error styling
Dynamic text variables
Text blocks can include live variables like {{firstName}} that update as the user types. These render as .ll-quiz-variable spans.
Full examples
Paste any of these into your Custom CSS panel to get started quickly.
Example 1 — Clean minimal theme
Example 2 — Rounded colorful theme
Example 3 — Mobile-first layout adjustments
Block type class list
Use these modifiers on .ll-quiz-block to target individual block types.