From nuxt-skills
Guides building accessible, unstyled Vue 3 component primitives with Reka UI (formerly Radix Vue). Covers component API, asChild composition, controlled/uncontrolled state, virtualization, and WAI-ARIA patterns.
How this skill is triggered — by the user, by Claude, or both
Slash command
/nuxt-skills:reka-uiThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Unstyled, accessible Vue 3 component primitives. WAI-ARIA compliant. Previously Radix Vue.
components.mdcomponents/accordion.mdcomponents/alert-dialog.mdcomponents/aspect-ratio.mdcomponents/avatar.mdcomponents/calendar.mdcomponents/checkbox.mdcomponents/collapsible.mdcomponents/combobox.mdcomponents/config-provider.mdcomponents/context-menu.mdcomponents/date-field.mdcomponents/date-picker.mdcomponents/date-range-field.mdcomponents/date-range-picker.mdcomponents/dialog.mdcomponents/dropdown-menu.mdcomponents/editable.mdcomponents/focus-scope.mdcomponents/hover-card.mdUnstyled, accessible Vue 3 component primitives. WAI-ARIA compliant. Previously Radix Vue.
Current version: v2.8.0 (January 2026)
For Vue patterns: use vue skill
| 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
Consider loading these reference files based on your task:
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
| 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 |
// 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()] })
]
})
<!-- 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>
hideShiftedArrow prop (v2.8.0)stepSnapping support (v2.8.0)weekStartsOn now locale-independent for date components (v2.8.0)estimateSize accepts function for Listbox/Tree (v2.7.0)useLocale, useDirection exposed (v2.6.0)disableOutsidePointerEvents prop on Content (v2.7.0)disableSwipe prop (v2.6.0)Token efficiency: ~350 tokens base, components.md index ~100 tokens, per-component ~50-150 tokens
npx claudepluginhub jasubal/nuxt-skills2plugins reuse this skill
First indexed Jun 29, 2026
Guides building accessible, unstyled Vue 3 component primitives with Reka UI (formerly Radix Vue). Covers component API, asChild composition, controlled/uncontrolled state, virtualization, and WAI-ARIA patterns.
Sets up production-ready shadcn-vue UI components in Vue/Nuxt apps with Tailwind CSS and Reka UI. Use for accessible forms, data tables, charts, dark mode, and component imports.
Provides patterns for Vue components including props validation with TypeScript, defaults, emits, slots, and provide/inject. Use when building reusable Vue components.