Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Build accessible, unstyled Vue 3 components using Reka UI (formerly Radix Vue) with WAI-ARIA compliance.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
SKILL.md
1---2name: reka-ui3description: Use when building with Reka UI (headless Vue components) - provides component API, accessibility patterns, composition (asChild), controlled/uncontrolled state, virtualization, and styling integration. Formerly Radix Vue.4license: MIT5---67# Reka UI89Unstyled, accessible Vue 3 component primitives. WAI-ARIA compliant. Previously Radix Vue.1011**Current version:** v2.8.0 (January 2026)1213## When to Use1415- Building headless/unstyled components from scratch16- Need WAI-ARIA compliant components17- Using Nuxt UI, shadcn-vue, or other Reka-based libraries18- Implementing accessible forms, dialogs, menus, popovers1920**For Vue patterns:** use `vue` skill2122## Available Guidance2324| File | Topics |25| -------------------------------------------------------- | ------------------------------------------------------------------- |26| **[references/components.md](references/components.md)** | Component index by category (Form, Date, Overlay, Menu, Data, etc.) |27| **components/\*.md** | Per-component details (dialog.md, select.md, etc.) |2829**Guides** (see [reka-ui.com](https://reka-ui.com)): Styling, Animation, Composition, SSR, Namespaced, Dates, i18n, Controlled State, Inject Context, Virtualization, Migration3031## Loading Files3233**Consider loading these reference files based on your task:**3435- [ ] [references/components.md](references/components.md) - if browsing component index by category or searching for specific components3637**DO NOT load all files at once.** Load only what's relevant to your current task.3839**For styled Nuxt components built on Reka UI:** use **nuxt-ui** skill4041## Key Concepts4243| Concept | Description |44| ----------------------- | --------------------------------------------------------------------- |45| `asChild` | Render as child element instead of wrapper, merging props/behavior |46| Controlled/Uncontrolled | Use `v-model` for controlled, `default*` props for uncontrolled |47| Parts | Components split into Root, Trigger, Content, Portal, etc. |48| `forceMount` | Keep element in DOM for animation libraries |49| Virtualization | Optimize large lists (Combobox, Listbox, Tree) with virtual scrolling |50| Context Injection | Access component context from child components |5152## Installation5354```ts55// nuxt.config.ts (auto-imports all components)56export default defineNuxtConfig({57modules: ['reka-ui/nuxt']58})59```6061```ts62import { RekaResolver } from 'reka-ui/resolver'63// vite.config.ts (with auto-import resolver)64import Components from 'unplugin-vue-components/vite'6566export default defineConfig({67plugins: [68vue(),69Components({ resolvers: [RekaResolver()] })70]71})72```7374## Basic Patterns7576```vue77<!-- Dialog with controlled state -->78<script setup>79import { DialogRoot, DialogTrigger, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose } from 'reka-ui'80const open = ref(false)81</script>8283<template>84<DialogRoot v-model:open="open">85<DialogTrigger>Open</DialogTrigger>86<DialogPortal>87<DialogOverlay class="fixed inset-0 bg-black/50" />88<DialogContent class="fixed left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 bg-white p-6 rounded">89<DialogTitle>Title</DialogTitle>90<DialogDescription>Description</DialogDescription>91<DialogClose>Close</DialogClose>92</DialogContent>93</DialogPortal>94</DialogRoot>95</template>96```9798```vue99<!-- Select with uncontrolled default -->100<SelectRoot default-value="apple">101<SelectTrigger>102<SelectValue placeholder="Pick fruit" />103</SelectTrigger>104<SelectPortal>105<SelectContent>106<SelectViewport>107<SelectItem value="apple"><SelectItemText>Apple</SelectItemText></SelectItem>108<SelectItem value="banana"><SelectItemText>Banana</SelectItemText></SelectItem>109</SelectViewport>110</SelectContent>111</SelectPortal>112</SelectRoot>113```114115```vue116<!-- asChild for custom trigger element -->117<DialogTrigger as-child>118<button class="my-custom-button">Open</button>119</DialogTrigger>120```121122## Recent Updates (v2.6.0-v2.8.0)123124- **New component**: Rating (v2.8.0)125- **ScrollArea**: Added "glimpse" scrollbar mode (v2.8.0)126- **PopperContent**: Added `hideShiftedArrow` prop (v2.8.0)127- **TimeField**: Added `stepSnapping` support (v2.8.0)128- **Breaking**: `weekStartsOn` now locale-independent for date components (v2.8.0)129- **Virtualization**: `estimateSize` accepts function for Listbox/Tree (v2.7.0)130- **Composables**: `useLocale`, `useDirection` exposed (v2.6.0)131- **Select**: `disableOutsidePointerEvents` prop on Content (v2.7.0)132- **Toast**: `disableSwipe` prop (v2.6.0)133134## Resources135136- [Reka UI Docs](https://reka-ui.com)137- [GitHub](https://github.com/unovue/reka-ui)138- [Nuxt UI](https://ui.nuxt.com) (styled Reka components)139- [shadcn-vue](https://www.shadcn-vue.com) (styled Reka components)140141---142143_Token efficiency: ~350 tokens base, components.md index ~100 tokens, per-component ~50-150 tokens_144