Compare commits

...

2 Commits

Author SHA1 Message Date
Cursor Agent 9104c554be docs: add survey-ui CSS class reference table
Co-authored-by: Johannes <jobenjada@users.noreply.github.com>
2026-05-15 20:01:18 +00:00
Cursor Agent fb554bfc21 docs: add website app surveys custom css guide
Co-authored-by: Johannes <jobenjada@users.noreply.github.com>
2026-05-15 19:52:45 +00:00
2 changed files with 146 additions and 0 deletions
+1
View File
@@ -118,6 +118,7 @@
"xm-and-surveys/surveys/website-app-surveys/workspace-id-migration",
"xm-and-surveys/surveys/website-app-surveys/framework-guides",
"xm-and-surveys/surveys/website-app-surveys/google-tag-manager",
"xm-and-surveys/surveys/website-app-surveys/custom-css",
{
"group": "Features",
"icon": "wrench",
@@ -0,0 +1,145 @@
---
title: "Custom CSS"
description: "Use scoped global CSS to customize Website & App Surveys without breaking your app styles."
icon: "palette"
---
Yes, custom CSS for Website & App Surveys is supported.
Use this when the Styling UI is not enough and you need tighter brand control.
<Note>
Start with the built-in [Styling Theme](/xm-and-surveys/core-features/styling-theme) first. Use custom CSS only for advanced overrides.
</Note>
## Problem
Website & App Surveys are rendered inside your product, so your app's global CSS can compete with survey styles.
Common examples:
- A global rule like `button { ... !important; }` changes survey buttons.
- Typography resets change survey text spacing and sizing.
- Utility-heavy global styles create unexpected visual differences between pages.
## Solution
Scope your overrides to the survey root (`#fbjs`) and use `!important` for the exact targets you want to control.
This gives you two important guarantees:
1. Your custom rules apply only to the survey.
2. Your rules reliably win against conflicting global styles.
## Add Scoped Overrides In Global CSS
<Steps>
<Step title="Open your global stylesheet">
Use the stylesheet that is loaded on pages where surveys are shown (for example `globals.css`).
</Step>
<Step title="Add scoped rules under #fbjs">
Keep all custom rules prefixed with `#fbjs`.
</Step>
<Step title="Use !important only where needed">
Add `!important` to properties that are still being overridden by your app-wide CSS.
</Step>
</Steps>
```css globals.css
/* 1) Theme-level variables */
#fbjs {
--fb-brand-color: #0ea5e9 !important;
--fb-brand-text-color: #ffffff !important;
--fb-heading-color: #0f172a !important;
--fb-subheading-color: #334155 !important;
--fb-survey-background-color: #ffffff !important;
--fb-border-radius: 12px !important;
}
/* 2) Targeted component overrides */
#fbjs .button-custom,
#fbjs button.button-custom {
border: 1px solid #0284c7 !important;
box-shadow: none !important;
}
#fbjs .label-headline,
#fbjs .label-headline * {
font-size: 1.125rem !important;
font-weight: 700 !important;
}
#fbjs .bg-input-bg,
#fbjs .border-input-border,
#fbjs .text-input-text {
background: #f8fafc !important;
border-color: #cbd5e1 !important;
color: #0f172a !important;
}
```
<Info>
Internal Tailwind utility classes are implementation details and may change over time. Prefer CSS variables and stable survey selectors scoped under `#fbjs`.
</Info>
## Best Practices
- Keep all survey overrides in one section or file for easier maintenance.
- Avoid global selectors without `#fbjs` (for example `button`, `input`, `p`) when styling surveys.
- Document why each `!important` exists so future cleanup is easy.
- After changes, hard refresh your page to clear cached SDK assets.
## Troubleshooting
**My app styles still win over survey styles**
- Increase selector specificity under `#fbjs`.
- Add `!important` only on the conflicting property.
- Check the browser inspector to confirm which rule is winning.
**Survey styles are affecting the rest of my app**
- This usually means a selector is missing `#fbjs`.
- Prefix every rule with `#fbjs` to keep styles isolated.
## Survey UI CSS Class Reference
The following classes are used by `packages/survey-ui` and are safe to target when scoped with `#fbjs`.
| CSS class | Element(s) it styles | Notes |
| --- | --- | --- |
| `.button-custom` | Survey action buttons (submit, CTA, navigation buttons with custom variant) | Applies `--fb-button-*` styling tokens. |
| `.label-headline` | Question headlines and headline HTML content | Used by `Label` variant `headline`. |
| `.label-description` | Question descriptions and helper copy | Used by `Label` variant `description`. |
| `.label-default` | Default label text content | Used by `Label` variant `default`. |
| `.label-card` | Upper labels (for example, required label text) | Used by `Label` variant `card`. |
| `.progress-track` | Progress bar track container | Uses `--fb-progress-track-*` tokens. |
| `.progress-indicator` | Progress bar fill indicator | Uses `--fb-progress-indicator-*` tokens. |
| `.rounded-input` | Input-like controls (text inputs, dropdown triggers, date inputs, rating/NPS options) | Controls input border radius token. |
| `.bg-input-bg` | Input-like control backgrounds | Maps to `--fb-input-bg-color`. |
| `.border-input-border` | Input-like control borders | Maps to `--fb-input-border-color`. |
| `.text-input` | Input-like text size | Maps to `--fb-input-font-size`. |
| `.text-input-text` | Input text and some input icons | Maps to `--fb-input-color`. |
| `.text-input-placeholder` | Placeholder and empty-state text | Maps to `--fb-input-placeholder-color`. |
| `.font-input` | Input-like font family | Maps to `--fb-input-font-family`. |
| `.font-input-weight` | Input-like font weight | Maps to `--fb-input-font-weight`. |
| `.w-input` | Input width | Maps to `--fb-input-width`. |
| `.min-h-input` | Input minimum height | Maps to `--fb-input-height`. |
| `.px-input-x` | Input horizontal padding | Maps to `--fb-input-padding-x`. |
| `.py-input-y` | Input vertical padding | Maps to `--fb-input-padding-y`. |
| `.shadow-input` | Input shadow | Maps to `--fb-input-shadow`. |
| `.rounded-option` | Select/multi-select/ranking/picture-select option containers | Controls option border radius token. |
| `.bg-option-bg` | Unselected option backgrounds | Maps to `--fb-option-bg-color`. |
| `.bg-option-selected-bg` | Selected option backgrounds | Used for selected states. |
| `.bg-option-hover-bg` | Option hover background | Used for hover states. |
| `.border-option-border` | Option borders and dropdown search divider | Maps to option border token. |
| `.text-option` | Option label font size | Maps to `--fb-option-font-size`. |
| `.text-option-label` | Option label text color | Maps to `--fb-option-label-color`. |
| `.font-option` | Option label font family | Maps to `--fb-option-font-family`. |
| `.font-option-weight` | Option label font weight | Maps to `--fb-option-font-weight`. |
| `.px-option-x` | Option horizontal padding | Maps to `--fb-option-padding-x`. |
| `.py-option-y` | Option vertical padding | Maps to `--fb-option-padding-y`. |
| `.rounded-button` | Button radius (base button component) | Maps to `--fb-button-border-radius`. |
| `.text-button` | Button text size | Maps to `--fb-button-font-size`. |
| `.font-button-weight` | Button font weight | Maps to `--fb-button-font-weight`. |
| `.border-brand` | Selected/active option borders | Uses survey brand color token. |