Native Solid 2 fork. Original documentation and designs © WorkOS; historical posts retain their original context.

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 DOM-rendering parts accept a class prop. This class is passed through to the DOM element.

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 class that you provide.

import { Accordion } from "@radix-solid/primitives";
import "./styles.css";
export const AccordionDemo = () => <Accordion.Root type="single">
<Accordion.Item class="AccordionItem" value="item-1" />
{/* … */}
</Accordion.Root>;

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 JavaScript

Native Solid supports style objects. Use them for dynamic values and CSS classes for selectors or state-dependent rules; React-only styling wrappers cannot render native Solid primitives.

Styling a part

import { Accordion } from "@radix-solid/primitives";
export const AccordionDemo = () => <Accordion.Root type="single">
<Accordion.Item class="AccordionItem" value="item-1" style={{ "border-bottom": "var(--accordion-border-width, 1px) solid gainsboro" }} />
</Accordion.Root>;

Styling a state

You can style a component state by targeting its data-state attribute.

.AccordionItem[data-state="open"] {
--accordion-border-width: 2px;
}

Extending a primitive

Extend a primitive with a native Solid component. Preserve its reactive props and forward them to the semantic host:

import { type ComponentProps } from "solid-js";
import { Accordion as AccordionPrimitive } from "@radix-solid/primitives";
const AccordionItem = (p: Extract<ComponentProps<typeof AccordionPrimitive.Item>, {
asChild?: false;
}>) => <AccordionPrimitive.Item {...p} ref={p.ref} />;

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.