Styling
Learn how to customize component styles using data-slot, className, and Tailwind CSS.
className Prop
Every Ninna UI component accepts a className prop for direct Tailwind CSS customization.
All components spread ...props on their root element, so any standard HTML attribute works — including className,style,id, and event handlers.
import { Button , Code } from "@ninna-ui/primitives";
// Override or extend styles with className<Button className="rounded-full shadow-lg">Rounded Button</Button>
// Compose with Tailwind utilities<Button className="w-full sm:w-auto">Responsive Width</Button>data-slot API
Target component internals with CSS using data-slot attributes — no component code modification needed.
Every Ninna UI component renders data-slot attributes on its root and meaningful sub-elements. There are 98 data-slot attributes across all components. This gives you deep CSS customization without modifying component internals.
CSS Targeting
Style inner elements with data-slot selectors
/* Target component internals with data-slot */
/* Style the alert close button */[data-slot="close"] { opacity: 0.5; transition: opacity 0.2s;}[data-slot="close"]:hover { opacity: 1;}
/* Style the checkbox indicator */[data-slot="indicator"] { border-radius: var(--radius-sm);}
/* Style all button icons */[data-slot="icon"] { width: 1.25rem; height: 1.25rem;}Slot Structure Examples
data-slot attribute structure
<!-- Available data-slot values per component -->
<!-- Button --><button data-slot="button"> <span data-slot="icon">...</span> Click me</button>
<!-- Alert --><div data-slot="alert"> <div data-slot="icon">...</div> <div data-slot="content"> <div data-slot="title">Title</div> <div data-slot="description">Description</div> </div> <button data-slot="close">×</button></div>
<!-- Checkbox --><label data-slot="checkbox"> <input class="sr-only peer" /> <div data-slot="control"> <svg data-slot="indicator">...</svg> </div></label>Common slots: icon, content, title, description, indicator, track, thumb, close, label
Tailwind Integration
Ninna UI's CSS variables work seamlessly with Tailwind CSS v4.
The @theme inline block in each theme exposes all 31 CSS variables as Tailwind utilities. Use them anywhere in your Tailwind classes.
Use Ninna UI variables in your own styles
/* Your app's CSS file */@import "tailwindcss";@import "@ninna-ui/core/theme/presets/default.css";
/* Use Ninna UI CSS variables in custom Tailwind utilities */.my-card { background: var(--color-base-100); border: 1px solid var(--color-base-300); border-radius: 0.5rem; color: var(--color-base-content);}
/* Or use the semantic Tailwind classes directly */.my-card { @apply bg-base-100 border border-base-300 rounded-lg text-base-content;}Custom Variants
Create custom component variants using data-slot and CSS.
Combine data-slot with other data attributes to create custom variants without modifying component source code.
Custom variant examples
/* Create custom component styles using data-slot + data-* */
/* Custom "pill" button variant */[data-slot="button"][data-variant="pill"] { border-radius: 9999px; padding-left: 1.5rem; padding-right: 1.5rem;}
/* Custom alert with left accent bar */[data-slot="alert"] { border-left: 4px solid var(--color-primary); border-radius: 0 0.5rem 0.5rem 0;}
/* Style disabled state across all form inputs */[data-slot="input"]:disabled,[data-slot="textarea"]:disabled { background: var(--color-base-50); cursor: not-allowed;}