📄 radixui/primitives/docs/guides/styling

File: styling.md | Updated: 11/15/2025

Source: https://www.radix-ui.com/primitives/docs/guides/styling

Radix Homepage

Made by WorkOS

Radix Homepage

Made by WorkOS

ThemesThemes PrimitivesPrimitives IconsIcons ColorsColors

Documentation Case studies Blog

Search

/

Overview

Introduction Getting started Accessibility Releases

Guides

Styling Animation Composition Server-side rendering

Components

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

Utilities

Accessible Icon Direction Provider Portal Slot Visually Hidden

Guides

Styling

Radix Primitives are unstyled—and compatible with any styling solution—giving you complete control over styling.

Styling overview


Functional styles

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.

Classes

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.

Data attributes

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.

Styling with CSS


Styling a part

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;

Styling a state

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;
}

Styling with CSS-in-JS


The examples below are using styled-components , but you can use any CSS-in-JS library of your choice.

Styling a part

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;

Styling a state

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


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";

Summary


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

Edit this page on GitHub.