Reka UI
Unstyled, accessible Vue 3 component primitives. WAI-ARIA compliant. Previously Radix Vue.
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.) |
Usage Pattern
Load based on context:
- Component index → references/components.md
- Specific component → components/dialog.md, components/select.md, etc.
- 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 |
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>
Resources
Token efficiency: ~300 tokens base, components.md index ~100 tokens, per-component ~50-150 tokens
1---2name: reka-ui-23description: Use when building with Reka UI (headless Vue components) - provides component API, accessibility patterns, composition (asChild), controlled/uncontrolled state, and styling integration. Formerly Radix Vue.4license: MIT5---67# Reka UI89Unstyled, accessible Vue 3 component primitives. WAI-ARIA compliant. Previously Radix Vue.1011## When to Use1213- Building headless/unstyled components from scratch14- Need WAI-ARIA compliant components15- Using Nuxt UI, shadcn-vue, or other Reka-based libraries16- Implementing accessible forms, dialogs, menus, popovers1718**For Vue patterns:** use `vue` skill1920## Available Guidance2122| File | Topics |23| -------------------------------------------------------- | ------------------------------------------------------------------- |24| **[references/components.md](references/components.md)** | Component index by category (Form, Date, Overlay, Menu, Data, etc.) |25| **components/\*.md** | Per-component details (dialog.md, select.md, etc.) |2627## Usage Pattern2829**Load based on context:**3031- Component index → [references/components.md](references/components.md)32- Specific component → [components/dialog.md](components/dialog.md), [components/select.md](components/select.md), etc.33- For styled Nuxt components built on Reka UI → use **nuxt-ui** skill3435## Key Concepts3637| Concept | Description |38| ----------------------- | ------------------------------------------------------------------ |39| `asChild` | Render as child element instead of wrapper, merging props/behavior |40| Controlled/Uncontrolled | Use `v-model` for controlled, `default*` props for uncontrolled |41| Parts | Components split into Root, Trigger, Content, Portal, etc. |42| `forceMount` | Keep element in DOM for animation libraries |4344## Installation4546```ts47// nuxt.config.ts (auto-imports all components)48export default defineNuxtConfig({49 modules: ['reka-ui/nuxt']50})51```5253```ts54import { RekaResolver } from 'reka-ui/resolver'55// vite.config.ts (with auto-import resolver)56import Components from 'unplugin-vue-components/vite'5758export default defineConfig({59 plugins: [60 vue(),61 Components({ resolvers: [RekaResolver()] })62 ]63})64```6566## Basic Patterns6768```vue69<!-- Dialog with controlled state -->70<script setup>71import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose } from 'reka-ui'72const open = ref(false)73</script>7475<template>76 <DialogRoot v-model:open="open">77 <DialogTrigger>Open</DialogTrigger>78 <DialogPortal>79 <DialogOverlay class="fixed inset-0 bg-black/50" />80 <DialogContent class="fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 bg-white p-6 rounded">81 <DialogTitle>Title</DialogTitle>82 <DialogDescription>Description</DialogDescription>83 <DialogClose>Close</DialogClose>84 </DialogContent>85 </DialogPortal>86 </DialogRoot>87</template>88```8990```vue91<!-- Select with uncontrolled default -->92<SelectRoot default-value="apple">93 <SelectTrigger>94 <SelectValue placeholder="Pick fruit" />95 </SelectTrigger>96 <SelectPortal>97 <SelectContent>98 <SelectViewport>99 <SelectItem value="apple"><SelectItemText>Apple</SelectItemText></SelectItem>100 <SelectItem value="banana"><SelectItemText>Banana</SelectItemText></SelectItem>101 </SelectViewport>102 </SelectContent>103 </SelectPortal>104</SelectRoot>105```106107```vue108<!-- asChild for custom trigger element -->109<DialogTrigger as-child>110 <button class="my-custom-button">Open</button>111</DialogTrigger>112```113114## Resources115116- [Reka UI Docs](https://reka-ui.com)117- [GitHub](https://github.com/unovue/reka-ui)118- [Nuxt UI](https://ui.nuxt.com) (styled Reka components)119- [shadcn-vue](https://www.shadcn-vue.com) (styled Reka components)120121---122123_Token efficiency: ~300 tokens base, components.md index ~100 tokens, per-component ~50-150 tokens_