reka-ui

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Reka UI

Reka UI

Unstyled, accessible Vue 3 component primitives. WAI-ARIA compliant. Previously Radix Vue.
Current version: v2.8.0 (January 2026)
无样式、支持无障碍访问的Vue 3组件原语。符合WAI-ARIA标准。前身为Radix Vue。
当前版本: v2.8.0(2026年1月)

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
  • 从头构建无头/无样式组件
  • 需要符合WAI-ARIA标准的组件
  • 使用Nuxt UI、shadcn-vue或其他基于Reka的库
  • 实现无障碍表单、对话框、菜单、弹出层
如需Vue相关模式: 使用
vue
技能

Available Guidance

可用指南

FileTopics
references/components.mdComponent index by category (Form, Date, Overlay, Menu, Data, etc.)
components/*.mdPer-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
文件主题
references/components.md按类别划分的组件索引(表单、日期、浮层、菜单、数据等)
components/*.md各组件详细说明(dialog.md、select.md等)
指南(查看reka-ui.com):样式、动画、组合、SSR、命名空间、日期、国际化、受控状态、注入上下文、虚拟化、迁移

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
请根据任务加载相关的参考文件:
  • references/components.md - 如需按类别浏览组件索引或查找特定组件
请勿一次性加载所有文件。 仅加载与当前任务相关的文件。
如需基于Reka UI的样式化Nuxt组件: 使用nuxt-ui技能

Key Concepts

核心概念

ConceptDescription
asChild
Render as child element instead of wrapper, merging props/behavior
Controlled/UncontrolledUse
v-model
for controlled,
default*
props for uncontrolled
PartsComponents split into Root, Trigger, Content, Portal, etc.
forceMount
Keep element in DOM for animation libraries
VirtualizationOptimize large lists (Combobox, Listbox, Tree) with virtual scrolling
Context InjectionAccess component context from child components
概念说明
asChild
渲染为子元素而非包装器,合并属性/行为
受控/非受控状态使用
v-model
实现受控状态,
default*
属性实现非受控状态
组件拆分组件拆分为Root、Trigger、Content、Portal等部分
forceMount
保持元素在DOM中以支持动画库
虚拟化通过虚拟滚动优化大型列表(Combobox、Listbox、Tree)
上下文注入从子组件中访问组件上下文

Installation

安装

ts
// nuxt.config.ts (auto-imports all components)
export default defineNuxtConfig({
  modules: ['reka-ui/nuxt']
})
ts
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()] })
  ]
})
ts
// nuxt.config.ts (自动导入所有组件)
export default defineNuxtConfig({
  modules: ['reka-ui/nuxt']
})
ts
import { RekaResolver } from 'reka-ui/resolver'
// vite.config.ts (搭配自动导入解析器)
import Components from 'unplugin-vue-components/vite'

export default defineConfig({
  plugins: [
    vue(),
    Components({ resolvers: [RekaResolver()] })
  ]
})

Basic Patterns

基础示例

vue
<!-- 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>
vue
<!-- 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>
vue
<!-- asChild for custom trigger element -->
<DialogTrigger as-child>
  <button class="my-custom-button">Open</button>
</DialogTrigger>
vue
<!-- 带受控状态的对话框 -->
<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>打开</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>标题</DialogTitle>
        <DialogDescription>描述</DialogDescription>
        <DialogClose>关闭</DialogClose>
      </DialogContent>
    </DialogPortal>
  </DialogRoot>
</template>
vue
<!-- 带默认非受控状态的选择器 -->
<SelectRoot default-value="apple">
  <SelectTrigger>
    <SelectValue placeholder="选择水果" />
  </SelectTrigger>
  <SelectPortal>
    <SelectContent>
      <SelectViewport>
        <SelectItem value="apple"><SelectItemText>苹果</SelectItemText></SelectItem>
        <SelectItem value="banana"><SelectItemText>香蕉</SelectItemText></SelectItem>
      </SelectViewport>
    </SelectContent>
  </SelectPortal>
</SelectRoot>
vue
<!-- 使用asChild自定义触发元素 -->
<DialogTrigger as-child>
  <button class="my-custom-button">打开</button>
</DialogTrigger>

Recent Updates (v2.6.0-v2.8.0)

近期更新(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)
  • 新增组件:Rating(v2.8.0)
  • ScrollArea:新增"glimpse"滚动条模式(v2.8.0)
  • PopperContent:新增
    hideShiftedArrow
    属性(v2.8.0)
  • TimeField:新增
    stepSnapping
    支持(v2.8.0)
  • 破坏性变更:日期组件的
    weekStartsOn
    现在与区域设置无关(v2.8.0)
  • 虚拟化:Listbox/Tree的
    estimateSize
    支持函数形式(v2.7.0)
  • 组合式函数:暴露
    useLocale
    useDirection
    (v2.6.0)
  • Select:Content新增
    disableOutsidePointerEvents
    属性(v2.7.0)
  • Toast:新增
    disableSwipe
    属性(v2.6.0)

Resources

资源


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

令牌效率:基础内容约350令牌,components.md索引约100令牌,单个组件约50-150令牌