Two shortcuts before you write any CSS: build a theme visually in the Theme Playground, or have the UI Customization Plugin extract the values from your Figma design and write the overrides for you.
Make your CSS reach Velt
Velt can render inside a shadow DOM, which blocks your stylesheets.- CSS variables (
--velt-*) always cross the boundary. Theming with variables alone needs nothing here. - Class and element selectors don’t. Pick one of these:
- React / Next.js
- Other Frameworks
type: "styles" for a CSS string, type: "link" for a stylesheet URL.
- React / Next.js
- Other Frameworks
Wireframes change this. Registering a component’s root wireframe (e.g.
VeltCommentDialogWireframe) removes that component’s shadow DOM automatically, so your class CSS reaches it. A nested-only wireframe doesn’t: set shadowDom={false} yourself. Inline style="" always works either way.Theme with variables
Put all Velt CSS in one stylesheet and override the tokens you need:CSS variables; don’t invent names. Older surfaces read a few --legacy-velt-* tokens, which are listed there too.
Dark mode
Velt setsdata-velt-theme="dark" on the document root when dark mode is on. You supply the values:
darkMode prop (also dialogDarkMode, pinDarkMode, … for components Velt injects for you), with setDarkMode() app-wide, or by wiring your own prefers-color-scheme listener to it:
- React / Next.js
- Other Frameworks
Fonts
One global token sets the font across every Velt surface:--velt-font-size-* scale. Line-height and weight are per-component.
Override classes
For anything variables don’t cover, target Velt’s classes. Velt’s own styles are high-specificity, so your overrides need!important. That’s the supported way to do class-based Velt CSS, not a hack.
- Run with
shadowDom={false}and inspect the element. - Prefer its
velt-*BEM class over the short legacy twin:velt-comment-dialog--selected, notselected. - Write the rule with
!important:
Unstyled mode
Restyling most of the UI anyway? Strip Velt’s visual styling withsetUnstyledMode() (v6.0.0-beta.10+) and bring your own CSS. Layout and positioning styles are kept so components stay functional. It covers styles in the page head and inside shadow roots, and is reversible.
- React / Next.js
- Other Frameworks
globalStyles: false in your config:
- React / Next.js
- Other Frameworks
What CSS can and can’t do
Writing
display:none to remove parts, or wishing you could move a button? You’ve hit CSS’s ceiling: escalate to wireframes to restructure, or primitives to toggle features.
Checklist
-
shadowDom={false}on components you style with classes. - All Velt CSS in one stylesheet.
- Only token names that exist in
CSS variables. - Dark values under
:root[data-velt-theme="dark"]. - No
display:noneto remove features: toggle them with a prop.

