CSS Editor
Fully customise the look of your quiz with your own CSS — change colours, fonts, spacing, sizes and animations without needing !important.
Updated: April 2026
Comfort+ Available on Comfort and Premium plans.
What is the CSS Editor?#
The CSS Editor lets you write arbitrary CSS that is injected directly into your public quiz page. Change colours, fonts, padding, border-radius, animations — anything possible in CSS.
Unlike other quiz builders that require !important on every rule, Qwizoo is built around CSS custom properties (variables). Change --qz-primary once and every button, selection highlight and progress bar updates automatically.
CSS Variables
Override colours, border-radius, fonts and shadows globally with a single line — no !important needed.
Stable selectors
Target exact elements with data-quiz-* attributes that never change, unlike Tailwind class names.
Ready snippets
Dark mode, gradient buttons, Google Fonts, custom cards — one click to insert.
Variable reference
Built-in panel shows all CSS variables with their current values and a copy button.
How to Open the CSS Editor#
- 1Open your quiz in the builder.
- 2Click the Design tab in the right-hand panel.
- 3Switch to the CSS sub-tab (fourth tab, after Layout).
- 4Write or paste your CSS into the editor.
- 5Changes are saved automatically — open your quiz in a new tab to preview.
The editor has CSS syntax highlighting, bracket auto-close and supports the Tab key for indentation.
CSS Variables#
These variables are set on the quiz root element and cascade to all child components. Override them in :root or directly on [data-quiz="container"].
| Variable | Default | What it controls |
|---|---|---|
| --qz-primary | #FF7A00 | Buttons, selected choice highlight, progress bar, links |
| --qz-bg | #F4F5F7 | Page background (outside the card) |
| --qz-card-bg | #FFFFFF | Card / content area background |
| --qz-text | #111827 | Main text colour |
| --qz-font | Inter, sans-serif | Font family for the entire quiz |
| --qz-btn-radius | 14px | Border-radius of all buttons (0 = square, 9999px = pill) |
| --qz-q-size | 18px | Font size of question titles |
| --qz-shadow | 0 24px 60px … | Card drop shadow |
Copy any variable name from the CSS Variables panel inside the editor — it copies as var(--qz-primary) ready to paste.
Targeting Elements — data-quiz-* Selectors#
Every key element in the quiz has a stable data-quiz or data-quiz-btn attribute. Attribute selectors have higher CSS specificity than class selectors, so they override Tailwind utility classes without !important.
Layout & Navigation
| Selector | Element |
|---|---|
| [data-quiz="container"] | Outermost wrapper — root of all CSS vars |
| [data-quiz="page"] | Page area — vertical centering & padding |
| [data-quiz="wrapper"] | Max-width wrapper (max-w-lg / 1000px split) |
| [data-quiz="card"] | White content card |
| [data-quiz="columns"] | CSS Grid container for split layout |
| [data-quiz="cover-image"] | Cover panel (split layout only) |
| [data-quiz="cover-video"] | Cover video iframe (split layout) |
| [data-quiz="cover-image-img"] | Cover image element (split layout) |
| [data-quiz="hero-image"] | Mobile hero image/video (split layout) |
| [data-quiz="bottom-nav"] | Bottom navigation bar in split layout |
| [data-quiz="logo"] | Quiz logo image |
| [data-quiz="branding-link"] | Qwizoo branding link |
| [data-quiz="step-header"] | Row with the back button and step counter |
| [data-quiz="step-counter"] | Step counter label (e.g. 2 / 6) |
| [data-quiz="step-content"] | Inner content padding wrapper |
| [data-quiz="step"] | Step root element (all step types) |
| [data-quiz-btn="next"] | All Continue / Next / Submit buttons |
| [data-quiz-btn="back"] | All Back buttons |
Progress bar
| Selector | Element |
|---|---|
| [data-quiz="progress"] | Progress bar wrapper |
| [data-quiz="progress-fill"] | Fill bar (bar style) |
| [data-quiz="progress-dot"] | Individual dot (dots style) |
| [data-quiz="progress-step"] | Step circle (steps style) |
| [data-quiz="progress-line"] | Connector line between steps |
Welcome step
| Selector | Element |
|---|---|
| [data-quiz="welcome-media"] | Image / video wrapper |
| [data-quiz="welcome-video"] | Video iframe |
| [data-quiz="welcome-image"] | Image element |
| [data-quiz="welcome-content"] | Text & button area |
| [data-quiz="title"] | Step title — Welcome, Lead form, Thank you |
| [data-quiz="description"] | Step description paragraph — all step types |
Question & Choices
| Selector | Element |
|---|---|
| [data-quiz="question"] | Question title (h2) |
| [data-quiz="question-media"] | Question image / video wrapper |
| [data-quiz="question-video"] | Question video iframe |
| [data-quiz="question-image"] | Question image |
| [data-quiz="choices"] | Choices list wrapper |
| [data-quiz="choice"] | Answer choice button — the whole row |
| [data-quiz-choice="indicator"] | Radio / checkbox circle inside a choice |
| [data-quiz-choice="label"] | Label text inside a choice |
| [data-quiz-choice="explanation"] | Explanation text under a choice label |
| [data-quiz="picture-grid"] | Picture choice 2-column grid |
| [data-quiz-choice="image"] | Image inside a picture choice |
| [data-quiz-choice="placeholder"] | Placeholder when picture choice has no image |
| [data-quiz-choice="badge"] | Checkmark badge on a selected picture choice |
| [data-quiz="text-input"] | Text, email, number, date, and address inputs |
| [data-quiz="slider"] | Slider root wrapper |
| [data-quiz-slider="labels"] | Min / current / max labels row |
| [data-quiz-slider="min"] | Min value label |
| [data-quiz-slider="current"] | Current value label (large, coloured) |
| [data-quiz-slider="max"] | Max value label |
| [data-quiz-slider="track"] | Range <input> track — style with ::webkit-slider-thumb etc. |
| [data-quiz="rating"] | Rating input wrapper (stars, numbers, emoji) |
| [data-quiz="rating-button"] | Individual star / number button inside rating |
| [data-quiz="tags"] | Tags input root wrapper |
| [data-quiz="tags-count"] | Tags selection count label |
| [data-quiz="tags-list"] | Tags buttons row wrapper |
| [data-quiz="tag"] | Individual tag button |
Lead form
| Selector | Element |
|---|---|
| [data-quiz="lead-form"] | Lead form <form> element |
| [data-quiz="form-progress"] | Multi-step form progress dots |
| [data-quiz="lead-field"] | Field wrapper (label + input) |
| [data-quiz="lead-label"] | Label above each field |
| [data-quiz="lead-input"] | Text input field |
| [data-quiz="field-error"] | Validation error message below a field |
| [data-quiz="otp-block"] | SMS OTP verification section |
| [data-quiz-btn="otp-send"] | Send OTP code button |
| [data-quiz-btn="otp-resend"] | Resend OTP code button |
| [data-quiz-btn="otp-verify"] | Verify OTP button |
| [data-quiz="captcha-container"] | Turnstile captcha widget wrapper |
| [data-quiz="captcha-alert"] | Captcha expired / not verified alert |
| [data-quiz="submit-error"] | Submission error alert banner |
| [data-quiz="privacy-notice"] | Privacy policy consent text |
| [data-quiz="privacy-link"] | Privacy policy link inside consent text |
Result step
| Selector | Element |
|---|---|
| [data-quiz="result-body"] | Result root content wrapper |
| [data-quiz="result-media"] | Result image / video wrapper |
| [data-quiz="result-video"] | Result video iframe |
| [data-quiz="result-image"] | Result image element |
| [data-quiz="result-icon"] | Result emoji icon (🎉) |
| [data-quiz="result-title"] | Result headline |
| [data-quiz="result-description"] | Result description paragraph |
| [data-quiz="score-badge"] | Score badge (total points) |
| [data-quiz="ai-result"] | AI-generated result text block |
| [data-quiz="ai-result-text"] | AI result text content div |
| [data-quiz-btn="ai-retry"] | Retry AI analysis button |
| [data-quiz="formula-results"] | Formula results wrapper |
| [data-quiz="formula-result"] | Individual formula result card |
| [data-quiz="formula-label"] | Formula result label (above the number) |
| [data-quiz="result-value"] | Formula result value (the large coloured number) |
| [data-quiz="formula-breakdown"] | Formula inputs breakdown table |
| [data-quiz="conditional-message"] | Conditional message block inside formula result |
| [data-quiz="conditional-cta"] | CTA link inside conditional message |
| [data-quiz="benchmark"] | Benchmark comparison bar wrapper |
| [data-quiz="benchmark-fill"] | Benchmark bar fill element |
| [data-quiz="formula-narrative"] | AI narrative text inside formula result |
| [data-quiz="result-actions"] | Result action buttons wrapper |
| [data-quiz-btn="pdf"] | PDF download button |
Formula calculator
| Selector | Element |
|---|---|
| [data-quiz="formula-fields"] | Formula step fields group wrapper |
| [data-quiz="formula-field"] | Individual formula field (slider or number) |
| [data-quiz="formula-field-header"] | Formula slider: label + value row |
| [data-quiz="formula-field-label"] | Formula field label |
| [data-quiz="formula-field-value"] | Formula slider current value display |
| [data-quiz="formula-slider"] | Formula slider <input type=range> |
| [data-quiz="formula-extent"] | Formula slider min/max extent labels |
| [data-quiz="formula-prefix"] | Currency / unit prefix inside number field |
| [data-quiz="formula-number-input"] | Formula number <input> |
| [data-quiz="formula-suffix"] | Unit suffix inside number field |
| [data-quiz="range-field"] | Two-handle range field root wrapper |
| [data-quiz="range-labels"] | Range field label + display row |
| [data-quiz="range-label"] | Range field label |
| [data-quiz="range-display"] | Range field min–max value display |
| [data-quiz="range-track"] | Range field background track |
| [data-quiz="range-fill"] | Range field filled bar |
| [data-quiz="range-thumb-min"] | Range field min thumb input |
| [data-quiz="range-thumb-max"] | Range field max thumb input |
| [data-quiz="range-extent"] | Range field min/max extent labels |
Thank You & Share
| Selector | Element |
|---|---|
| [data-quiz="step-divider"] | Decorative dots divider on Thank You step |
| [data-quiz="share-row"] | Share section on Thank You step |
| [data-quiz="share-label"] | Share section heading |
| [data-quiz="share-icons"] | Social share icon buttons row |
| [data-quiz-btn="share-native"] | Native share button (mobile) |
| [data-quiz-btn="share-platform"] | Individual social platform share button (X, FB, etc.) |
| [data-quiz-btn="share-copy"] | Copy link button in share row |
Video & Calendar
| Selector | Element |
|---|---|
| [data-quiz="video-embed"] | Video step iframe wrapper |
| [data-quiz="video-iframe"] | Video step iframe element |
| [data-quiz="video-media"] | Video step image (fallback) |
| [data-quiz="video-image"] | Video step image element |
| [data-quiz="video-content"] | Video step title & description area |
| [data-quiz="video-placeholder"] | Video step placeholder (no URL set) |
| [data-quiz="calendar-embed"] | Calendar iframe wrapper |
| [data-quiz="calendar-iframe"] | Calendar iframe element |
Code Examples#
Change brand colour
:root {
--qz-primary: #7B61FF;
}Dark mode
:root {
--qz-bg: #1A1A2E;
--qz-card-bg: #16213E;
--qz-text: #F9FAFB;
--qz-shadow: 0 24px 60px rgba(0,0,0,0.40);
}Pill-shaped buttons
:root {
--qz-btn-radius: 9999px;
}Gradient Next button
[data-quiz-btn="next"] {
background: linear-gradient(135deg, #FF7A00, #FF4500) !important;
letter-spacing: 0.04em;
}Custom card
[data-quiz="card"] {
border-radius: 24px;
border: 2px solid var(--qz-primary);
padding: 40px;
}Custom Google Font
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;700&display=swap');
:root {
--qz-font: Montserrat, sans-serif;
}Larger question text
:root {
--qz-q-size: 26px;
}Style text inputs
[data-quiz="text-input"] {
border-radius: 8px;
border: 2px solid var(--qz-primary);
font-size: 16px;
}Style step titles
[data-quiz="title"] {
font-size: 2rem;
letter-spacing: -0.02em;
}
[data-quiz="result-value"] {
font-size: 3rem;
}Built-in Snippets#
Click any snippet in the right-hand panel to insert it. Snippets are appended to existing CSS — they never overwrite what you have already written.
- Dark mode — dark background and card with light text
- Purple accent — switches the primary colour to purple
- No card shadow — removes the card drop shadow
- Larger question text — increases question font size to 26px
- Google Font — Montserrat — imports and applies Montserrat
- Gradient Next button — orange-to-red gradient on the continue button
- Custom card — rounded card with a coloured border and extra padding
Tips & Limitations#
- Copy selectors from the panel — the Element Selectors panel inside the editor lists all 16 selectors with a one-click copy button, so you never have to type them manually.
- CSS variables override inline styles — even though colours are set with inline styles internally, they use
var(--qz-primary), so changing the variable overrides them everywhere. - Attribute selectors beat Tailwind classes —
[data-quiz="card"]has specificity (0,1,0,0) vs a Tailwind class (0,0,1,0), so spacing and size overrides just work. - Choice selection tint uses hex-alpha (e.g.
#FF7A0012) — use!importantif you need to change it. - 50 000 character limit — more than enough for any real-world use.
@importfor Google Fonts works — the style tag is injected into the page head, so@font-faceis also fully supported.
CSS Editor is a Comfort+ feature. On the Standard plan the tab is visible but locked — upgrade to unlock it.
