File: styling.md | Updated: 11/15/2025
ThemesThemes PrimitivesPrimitives IconsIcons ColorsColors
Documentation Case studies Blog
Search
/
Introduction Getting started Accessibility Releases
Styling Animation Composition Server-side rendering
Accordion
Alert Dialog
Aspect Ratio
Avatar
Checkbox
Collapsible
Context Menu
Dialog
Dropdown Menu
Form
Preview
Hover Card
Label
Menubar
Navigation Menu
One-Time Password Field
Preview
Password Toggle Field
Preview
Popover
Progress
Radio Group
Scroll Area
Select
Separator
Slider
Switch
Tabs
Toast
Toggle
Toggle Group
Toolbar
Tooltip
Accessible Icon Direction Provider Portal Slot Visually Hidden
Guides
Radix Primitives are unstyled—and compatible with any styling solution—giving you complete control over styling.
You are in control of all aspects of styling, including functional styles. For example—by default—a Dialog Overlay won't cover the entire viewport. You're responsible for adding those styles, plus any presentation styles.
All components and their parts accept a className prop. This class will be passed through to the DOM element. You can use it in CSS as expected.
When components are stateful, their state will be exposed in a data-state attribute. For example, when an Accordion Item
is opened, it includes a data-state="open" attribute.
You can style a component part by targeting the className that you provide.
import * as React from "react";
import { Accordion } from "radix-ui";
import "./styles.css";
const AccordionDemo = () => (
<Accordion.Root>
<Accordion.Item className="AccordionItem" value="item-1" />
{/* … */}
</Accordion.Root>
);
export default AccordionDemo;
You can style a component state by targeting its data-state attribute.
.AccordionItem {
border-bottom: 1px solid gainsboro;
}
.AccordionItem[data-state="open"] {
border-bottom-width: 2px;
}
The examples below are using styled-components , but you can use any CSS-in-JS library of your choice.
Most CSS-in-JS libraries export a function for passing components and their styles. You can provide the Radix primitive component directly.
import * as React from "react";
import { Accordion } from "radix-ui";
import styled from "styled-components";
const StyledItem = styled(Accordion.Item)`
border-bottom: 1px solid gainsboro;
`;
const AccordionDemo = () => (
<Accordion.Root>
<StyledItem value="item-1" />
{/* … */}
</Accordion.Root>
);
export default AccordionDemo;
You can style a component state by targeting its data-state attribute.
import { Accordion } from "radix-ui";
import styled from "styled-components";
const StyledItem = styled(Accordion.Item)`
border-bottom: 1px solid gainsboro;
&[data-state="open"] {
border-bottom-width: 2px;
}
`;
Extending a primitive is done the same way you extend any React component.
import * as React from "react";
import { Accordion as AccordionPrimitive } from "radix-ui";
const AccordionItem = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
>((props, forwardedRef) => (
<AccordionPrimitive.Item {...props} ref={forwardedRef} />
));
AccordionItem.displayName = "AccordionItem";
Radix Primitives were designed to encapsulate accessibility concerns and other complex functionalities, while ensuring you retain complete control over styling.
For convenience, stateful components include a data-state attribute.
PreviousReleases
NextAnimation