# Radix UI: Accessible Headless Components für React **Meta-Description:** Radix UI Primitives für barrierefreie React-Komponenten. Headless Architecture, WAI-ARIA Compliance und shadcn/ui Integration. **Keywords:** Radix UI, Headless Components, Accessibility, WAI-ARIA, React Components, shadcn/ui, Unstyled Components --- ## Einführung Radix UI ist eine **Headless Component Library** für React. Statt vorgestylter Komponenten liefert sie zugängliche, ungestylte Bausteine – perfekte Grundlage für Design Systems mit voller Accessibility out-of-the-box. --- ## Warum Radix UI? ``` ┌─────────────────────────────────────────────────────────────┐ │ RADIX UI VORTEILE │ ├─────────────────────────────────────────────────────────────┤ │ │ │ Accessibility (A11Y): │ │ ├── WAI-ARIA Design Patterns │ │ ├── Keyboard Navigation │ │ ├── Focus Management │ │ ├── Screen Reader Support │ │ └── Reduced Motion Support │ │ │ │ Headless Architecture: │ │ ├── Zero Styles (volle Kontrolle) │ │ ├── Jedes Styling möglich (CSS, Tailwind, CSS-in-JS) │ │ ├── Kein UI Lock-in │ │ └── Perfekt für Design Systems │ │ │ │ Developer Experience: │ │ ├── Composable APIs │ │ ├── TypeScript Support │ │ ├── SSR Compatible │ │ └── Tree-Shakeable │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## Installation ```bash # Einzelne Primitives installieren npm install @radix-ui/react-dialog npm install @radix-ui/react-dropdown-menu npm install @radix-ui/react-tabs npm install @radix-ui/react-tooltip # Oder alle Primitives npm install @radix-ui/primitives ``` --- ## Dialog (Modal) ```typescript import * as Dialog from '@radix-ui/react-dialog'; import { X } from 'lucide-react'; function ConfirmDialog({ trigger, title, description, onConfirm }: { trigger: React.ReactNode; title: string; description: string; onConfirm: () => void; }) { return ( {trigger} {title} {description}
); } // Verwendung Löschen} title="Eintrag löschen?" description="Diese Aktion kann nicht rückgängig gemacht werden." onConfirm={() => deleteItem(id)} /> ``` --- ## Dropdown Menu ```typescript import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; import { Check, ChevronRight, Circle } from 'lucide-react'; function UserMenu({ user }: { user: User }) { const [bookmarksChecked, setBookmarksChecked] = useState(true); const [person, setPerson] = useState('pedro'); return ( {/* Regular Items */} Profil Einstellungen {/* Checkbox Item */} Lesezeichen anzeigen {/* Radio Group */} Personen Pedro Maria {/* Sub Menu */} Mehr Hilfe Über uns {/* Destructive Item */} Abmelden ); } ``` --- ## Tabs ```typescript import * as Tabs from '@radix-ui/react-tabs'; function SettingsTabs() { return ( Account Passwort Benachrichtigungen

Account-Einstellungen

Passwort ändern

{/* Passwort Form */}

Benachrichtigungen

{/* Notification Settings */}
); } ``` --- ## Tooltip ```typescript import * as Tooltip from '@radix-ui/react-tooltip'; function IconButton({ icon, label, onClick }: { icon: React.ReactNode; label: string; onClick: () => void; }) { return ( {label} ); } // Verwendung } label="Einstellungen" onClick={() => openSettings()} /> ``` --- ## Accordion ```typescript import * as Accordion from '@radix-ui/react-accordion'; import { ChevronDown } from 'lucide-react'; interface FAQItem { question: string; answer: string; } function FAQ({ items }: { items: FAQItem[] }) { return ( {items.map((item, index) => ( {item.question}
{item.answer}
))}
); } ``` --- ## Select ```typescript import * as Select from '@radix-ui/react-select'; import { Check, ChevronDown, ChevronUp } from 'lucide-react'; interface Option { value: string; label: string; } function CustomSelect({ options, value, onChange, placeholder = 'Auswählen...' }: { options: Option[]; value: string; onChange: (value: string) => void; placeholder?: string; }) { return ( {options.map((option) => ( {option.label} ))} ); } ``` --- ## shadcn/ui Integration shadcn/ui baut auf Radix Primitives und Tailwind CSS: ```bash # shadcn/ui initialisieren npx shadcn@latest init # Komponenten hinzufügen npx shadcn@latest add button npx shadcn@latest add dialog npx shadcn@latest add dropdown-menu ``` ```typescript // components/ui/dialog.tsx (generiert von shadcn/ui) import * as DialogPrimitive from '@radix-ui/react-dialog'; import { cn } from '@/lib/utils'; const Dialog = DialogPrimitive.Root; const DialogTrigger = DialogPrimitive.Trigger; const DialogContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => ( {children} )); ``` --- ## Accessibility Best Practices ```typescript // 1. Keyboard Navigation // Radix handled automatisch: // - Tab: Fokus zwischen interaktiven Elementen // - Enter/Space: Aktivierung // - Escape: Schließen von Overlays // - Arrow Keys: Navigation in Listen/Menüs // 2. ARIA Attributes // Automatisch gesetzt von Radix: // - aria-expanded // - aria-controls // - aria-labelledby // - role="dialog", role="menu", etc. // 3. Focus Management // Radix handled: // - Focus Trap in Modals // - Focus Restore beim Schließen // - Focus auf erstes interaktives Element // 4. Reduced Motion import * as Dialog from '@radix-ui/react-dialog'; // CSS mit prefers-reduced-motion const styles = ` .dialog-content { animation: slideIn 200ms ease-out; } @media (prefers-reduced-motion: reduce) { .dialog-content { animation: none; } } `; ``` --- ## Fazit Radix UI bietet: 1. **Volle Accessibility**: WAI-ARIA compliant out-of-the-box 2. **Styling-Freiheit**: Headless Architecture, kein UI Lock-in 3. **Composable**: Flexible, zusammensetzbare APIs 4. **shadcn/ui Basis**: Foundation für moderne Design Systems Für barrierefreie React-Anwendungen ist Radix UI die beste Grundlage. --- ## Bildprompts 1. "Accessibility symbols surrounding React components, inclusive design concept" 2. "Unstyled building blocks transforming into styled components, headless architecture" 3. "Keyboard navigation flow through UI components, accessibility visualization" --- ## Quellen - [Radix UI Documentation](https://www.radix-ui.com/) - [Radix Primitives](https://www.radix-ui.com/primitives) - [shadcn/ui](https://ui.shadcn.com/) - [WAI-ARIA Design Patterns](https://www.w3.org/WAI/ARIA/apg/patterns/)