All skills
onmax avatar

/reka-ui

@1059cab official
by Maxonmax/nuxt-skills715 stars
38

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.

Use this Skill: https://skilld.dev/gh/onmax/nuxt-skills/reka-ui

This session only. Nothing lands on disk.

SKILL.md

≈58 tokens always: the name and description. ≈1.3k when used: this file. ≈29k more on demand in 53 files.

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:

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 hideShiftedArrow prop (v2.8.0)
  • TimeField: Added stepSnapping support (v2.8.0)
  • Breaking: weekStartsOn now locale-independent for date components (v2.8.0)
  • Virtualization: estimateSize accepts function for Listbox/Tree (v2.7.0)
  • Composables: useLocale, useDirection exposed (v2.6.0)
  • Select: disableOutsidePointerEvents prop on Content (v2.7.0)
  • Toast: disableSwipe prop (v2.6.0)

Resources


Token efficiency: ~350 tokens base, components.md index ~100 tokens, per-component ~50-150 tokens

Source: SKILL.md on GitHub

1 alert10d4 checks · Risk CRITICAL
  • Gen Agent Trust Hub10d

    This skill provides documentation and API references for the Reka UI library. It includes a utility script to synchronize documentation with the official GitHub repository, which presents a surface for indirect prompt injection if the external source were compromised.

  • Socket10d

    No alerts

  • Snyk10d

    Risk: LOW · No issues

  • Runlayer7mo

    54 files scanned · No issues

Signed by skilld at 1059cab. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 2 days ago.

Activeupdated 8 months ago
  • Vue
  • Nuxt
  • reka-ui
  • components
  • headless
  • accessible
  • aria
  • forms
  • dialogs

README badge

README badge for onmax/nuxt-skills/reka-ui

Unstyled, WAI-ARIA compliant Vue 3 component primitives with support for controlled/uncontrolled state, composition patterns, and virtualization. Use when building headless components from scratch or integrating with Reka-based libraries like Nuxt UI or shadcn-vue.

Generated from the current SKILL.md.

Does Reka UI include styling?
No. Reka UI provides unstyled, WAI-ARIA compliant component primitives. You apply styling yourself or use a styled wrapper library like Nuxt UI or shadcn-vue.
Can I use Reka UI with Nuxt?
Yes. Install the `reka-ui/nuxt` module in nuxt.config.ts for auto-imports of all components, or use the unplugin-vue-components resolver in a standard Vite setup.
How do I control component state?
Use `v-model:open` or `v-model` for controlled state, or `default*` props (like `default-value`) for uncontrolled state.
Does this skill cover styled component libraries built on Reka?
For Nuxt UI and other styled Reka-based components, use the nuxt-ui skill instead. This skill focuses on the unstyled primitives.
What is the `asChild` prop?
It merges the component's behavior and props onto a child element instead of wrapping it, letting you use your own custom element while maintaining accessibility and state management.

Generated from the current SKILL.md. These answers refresh after source changes.