reka-ui▌
onmax/nuxt-skills · updated Apr 24, 2026
Unstyled, accessible Vue 3 component primitives with WAI-ARIA compliance and composition patterns.
- ›Provides 30+ headless components across forms, overlays, menus, data tables, and date pickers, each split into composable parts (Root, Trigger, Content, Portal)
- ›Supports controlled state via v-model and uncontrolled via default* props; includes asChild for rendering as child elements without wrapper overhead
- ›Built-in virtualization for large lists, context injection for child access, an
Reka UI
Unstyled, accessible Vue 3 component primitives. WAI-ARIA compliant. Previously Radix Vue.
Current version: v2.8.0 (January 2026)
When to Use
- Building headless/unstyled components from scratch
- Need WAI-ARIA compliant components
- Using Nuxt UI, shadcn-vue, or other Reka-based libraries
- Implementing accessible forms, dialogs, menus, popovers
For Vue patterns: use vue skill
Available Guidance
| File | Topics |
|---|---|
| references/components.md | Component index by category (Form, Date, Overlay, Menu, Data, etc.) |
| components/*.md | Per-component details (dialog.md, select.md, etc.) |
Guides (see reka-ui.com): Styling, Animation, Composition, SSR, Namespaced, Dates, i18n, Controlled State, Inject Context, Virtualization, Migration
Loading Files
Consider loading these reference files based on your task:
- references/components.md - if browsing component index by category or searching for specific components
DO NOT load all files at once. Load only what's relevant to your current task.
For styled Nuxt components built on Reka UI: use nuxt-ui skill
Key Concepts
| Concept | Description |
|---|---|
asChild |
Render as child element instead of wrapper, merging props/behavior |
| Controlled/Uncontrolled | Use v-model for controlled, default* props for uncontrolled |
| Parts | Components split into Root, Trigger, Content, Portal, etc. |
forceMount |
Keep element in DOM for animation libraries |
| Virtualization | Optimize large lists (Combobox, Listbox, Tree) with virtual scrolling |
| Context Injection | Access component context from child components |
Installation
// nuxt.config.ts (auto-imports all components)
export default defineNuxtConfig({
modules: ['reka-ui/nuxt']
})
import { RekaResolver } from 'reka-ui/resolver'
// vite.config.ts (with auto-import resolver)
import Components from 'unplugin-vue-components/vite'
export default defineConfig({
plugins: [
vue(),
Components({ resolvers: [RekaResolver()] })
]
})
Basic Patterns
<!-- Dialog with controlled state -->
<script setup>
import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose } from 'reka-ui'
const open = ref(false)
</script>
<template>
<DialogRoot v-model:open="open">
<DialogTrigger>Open</DialogTrigger>
<DialogPortal>
<DialogOverlay class="fixed inset-0 bg-black/50" />
<DialogContent class="fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 bg-white p-6 rounded">
<DialogTitle>Title</DialogTitle>
<DialogDescription>Description</DialogDescription>
<DialogClose>Close</DialogClose>
</DialogContent>
</DialogPortal>
</DialogRoot>
</template>
<!-- Select with uncontrolled default -->
<SelectRoot default-value="apple">
<SelectTrigger>
<SelectValue placeholder="Pick fruit" />
</SelectTrigger>
<SelectPortal>
<SelectContent>
<SelectViewport>
<SelectItem value="apple"><SelectItemText>Apple</SelectItemText></SelectItem>
<SelectItem value="banana"><SelectItemText>Banana</SelectItemText></SelectItem>
</SelectViewport>
</SelectContent>
</SelectPortal>
</SelectRoot>
<!-- asChild for custom trigger element -->
<DialogTrigger as-child>
<button class="my-custom-button">Open</button>
</DialogTrigger>
Recent Updates (v2.6.0-v2.8.0)
- New component: Rating (v2.8.0)
- ScrollArea: Added "glimpse" scrollbar mode (v2.8.0)
- PopperContent: Added
hideShiftedArrowprop (v2.8.0) - TimeField: Added
stepSnappingsupport (v2.8.0) - Breaking:
weekStartsOnnow locale-independent for date components (v2.8.0) - Virtualization:
estimateSizeaccepts function for Listbox/Tree (v2.7.0) - Composables:
useLocale,useDirectionexposed (v2.6.0) - Select:
disableOutsidePointerEventsprop on Content (v2.7.0) - Toast:
disableSwipeprop (v2.6.0)
Resources
- Reka UI Docs
- GitHub
- Nuxt UI (styled Reka components)
- shadcn-vue (styled Reka components)
Token efficiency: ~350 tokens base, components.md index ~100 tokens, per-component ~50-150 tokens
Discussion
Product Hunt–style comments (not star reviews)- No comments yet — start the thread.
Ratings
4.6★★★★★64 reviews- ★★★★★Pratham Ware· Dec 16, 2024
reka-ui reduced setup friction for our internal harness; good balance of opinion and flexibility.
- ★★★★★Omar Iyer· Dec 16, 2024
Useful defaults in reka-ui — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
- ★★★★★Aanya Park· Dec 4, 2024
We added reka-ui from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
- ★★★★★Ava Singh· Dec 4, 2024
I recommend reka-ui for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
- ★★★★★Noor Okafor· Nov 23, 2024
Keeps context tight: reka-ui is the kind of skill you can hand to a new teammate without a long onboarding doc.
- ★★★★★Isabella Chen· Nov 23, 2024
Solid pick for teams standardizing on skills: reka-ui is focused, and the summary matches what you get after install.
- ★★★★★Yusuf Chawla· Nov 7, 2024
reka-ui has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ★★★★★Layla Mensah· Oct 26, 2024
Solid pick for teams standardizing on skills: reka-ui is focused, and the summary matches what you get after install.
- ★★★★★Isabella Brown· Oct 14, 2024
reka-ui has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ★★★★★Mia Okafor· Sep 25, 2024
reka-ui reduced setup friction for our internal harness; good balance of opinion and flexibility.
showing 1-10 of 64