关于 base-ui
Base UI 是一套 React 组件库及配套技能,提供无样式、可组合的原语来构建无障碍界面。它指导开发者组装组件、使用 render 属性组合元素并落实无障碍实践,视觉样式则由应用自行提供。
主要功能
- 01无样式、可组合的 React 原语
- 02多部分组件结构
- 03通过 render 属性自定义元素
- 04基于状态的样式属性
- 05无障碍表单与叠层指南
适用场景
- 01构建带标签和验证的表单
- 02组合菜单、弹出框和叠层
- 03依据公开状态设置组件样式
- 04支持 RTL 和严格 CSP 要求
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ itechmeat/ llm-code --skill base-ui安装后在 Claude Code 中输入/base-ui确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/csp-provider.mddirection-provider.mddrawer.mdfieldset.mdform.mdinput.mdmenu.mdmenubar.mdmerge-props.mdmeter.mdnavigation-menu.mdnumber-field.mdotp-field.mdpopover.mdpreview-card.mdprogress.mdradio.mdscroll-area.mdselect.mdseparator.mdslider.mdswitch.mdtabs.mdtoast.mdtoggle-group.mdtoggle.mdtoolbar.mdtooltip.mduse-render.md详细介绍
Base UI (React)
Base UI 提供无样式、可组合的 React 组件。本技能侧重于组装多部分组件、使用 render prop 进行组合,并在你自行提供样式的同时满足无障碍要求。
快速导航(参考)
工具
- references/csp-provider.md
- references/direction-provider.md
- references/merge-props.md
- references/use-render.md
表单与输入
- references/form.md
- references/fieldset.md
- references/input.md
- references/number-field.md
- references/otp-field.md
- references/radio.md
- references/select.md
- references/slider.md
- references/switch.md
反馈与状态
- references/meter.md
- references/progress.md
- references/toast.md
菜单、导航、浮层
- references/drawer.md
- references/menu.md
- references/menubar.md
- references/navigation-menu.md
- references/popover.md
- references/preview-card.md
- references/tooltip.md
开关与控件
- references/toggle.md
- references/toggle-group.md
- references/toolbar.md
布局与分隔符
- references/scroll-area.md
- references/separator.md
v1.7.0 - v1.8.0 亮点
Combobox新增createItems集合 API,用于以编程方式构建选项集合。Avatar.Image新增keepMountedprop,使图像子树保持挂载(有助于避免重新挂载时的闪烁)。Toast接受基于当前 toast 派生的函数式更新,并且Toast.Title、Toast.Description和Toast.Action均支持renderprop。Autocomplete和Combobox会发出input-press和cancel-open变更事件详情;内联Combobox暴露expanded状态。Combobox.Item和Select.Item会从各自的根组件继承禁用状态。Form会按文档顺序聚焦第一个无效字段;在异步验证进行期间,Field会发布中性有效性状态。- 主要是无障碍修复、弹窗/浮层行为修复,以及抽屉、菜单、工具提示和滚动区域的包体积缩减。
v1.4.1 亮点
mergeProps现在能正确转发多参数事件处理函数,这对除事件外还接收额外详情/状态的包装回调很重要。- 修复了
display: contents下的可 Tab 聚焦性;请重新测试会扁平化 DOM 结构的自定义包装器和 render-prop 组合。 - 修复了快速悬停触发器时的弹窗尺寸问题,滚动容器内被裁剪项的高亮清除也更可靠。
v1.6.0 亮点
OTPFieldPreview命名空间重命名为OTPField;请更新引用了该预览命名空间的导入。- 对 Accordion、Alert Dialog、Autocomplete、Avatar、Checkbox、Dialog、Drawer、Field、Menu、Number Field、OTP Field 及其他组件进行了大量行为缺陷修复。
v1.5.0 亮点
OTPField用normalizeValue()取代了sanitizeValue(),并改进了键盘快捷键以及验证组合行为。- 基于弹窗的组件现在更一致地遵循受控
open状态,这会影响Popover、Menu、PreviewCard及相关浮层。 Form、Field和OTPField不再使用旧的flushSync式验证时序模式;在保留任何本地验证调度变通方案之前,请重新测试。- 修正了
NavigationMenu、Popover和ScrollArea的 RTL 行为。 Drawer.Viewport现在会转发style,这对自定义视口尺寸和动画布局约束很有用。
v1.4.0 亮点
OTPField作为预览原语推出,用于一次性密码和验证码输入。- 隐藏输入暴露
form和suppressHydrationWarning,这在控件提交到外部表单或跨 SSR 边界水合时很重要。 - 在组合组件中,
render警告和preventBaseUIHandler()的运行时行为更加可靠。 Drawer、NavigationMenu、Select、Slider、Toast和Switch中的浮层/输入原语获得了重要的行为修复。
v1.3.0 亮点
- Drawer 现已稳定(不再是预览版),应将其视为一等公民的浮层基础组件。
- Autocomplete 和 Combobox 新增
InputGroup;Combobox、Select 和 Slider 新增Label部分。 - Drawer 新增
SwipeArea,用于明确的手势滑动交互区域。 - Tooltip 新增
closeOnClick;Toast 可关闭所有 toast。 - Checkbox、Radio Group 和 Switch 改进了对
aria-labelledby的自动支持。 - v1.2.0 引入的
renderprop 支持依然适用,包括惰性元素。
需要掌握的核心概念
- 无样式基础组件:所有视觉效果均来自你的 CSS/Tailwind/CSS Modules。Base UI 负责行为与无障碍。
- 多部分结构:大多数组件遵循
Root+ 子部分(Trigger、Popup、Item等)的模式。需显式地将它们组装起来。 renderprop:替换默认元素,或用自己的组件进行包裹;使用函数形式时,需通过mergeProps手动合并 props。- 状态驱动样式:许多部分会暴露数据属性,例如
data-[popup-open]、data-[highlighted]、data-[pressed]、data-[checked]、data-[invalid]等。 - 浮层使用 Portal:对于弹出框、菜单、工具提示、select、导航菜单内容和预览卡片,请使用
Portal+Positioner+Popup。
实践方案
1) 快速构建无障碍表单
- 用
Form包裹输入项,以处理提交和错误汇总。 - 使用带
name的Field.Root,再用Field.Label、Field.Control和Field.Error处理标签和错误。 - 用
Fieldset.Root+Fieldset.Legend对相关字段进行分组。 - 对于
Radio组,可使用带aria-labelledby的RadioGroup,或通过Fieldset.Root渲染RadioGroup,并为每个选项使用Field.Label。 - 确保每个表单控件都有可访问名称(标签或
Field/Fieldset标注模式)。
2) 使用 render + mergeProps 进行组合
- 将 React 元素传给
render时,Base UI 会自动合并 props。 - 将函数传给
render时,需用mergeProps合并 Base UI 的 props 和你自己的 props。 - 在合并后的事件处理函数内,可使用
event.preventBaseUIHandler()在需要时阻止 Base UI 的内部行为(仅限合成事件)。
3) 浮层与菜单(通过 Portal 渲染的 UI)
- 使用
Root+Trigger+Portal+Positioner+Popup构建弹出层。 - 对于菜单和导航,按需添加
Item、Separator、Arrow以及列表/视口部分。 NavigationMenu.Link支持render,可用于框架路由链接。
4) Toast
- 用
Toast.Provider包裹应用(或子树)。 - 使用
Toast.useToastManager()创建 toast。 - 在
Toast.Portal内渲染Toast.Viewport,然后将toasts映射为Toast.Root条目,并搭配Toast.Content、Toast.Title、Toast.Description和Toast.Close。
5) RTL 与 CSP 约束
- 对于 RTL 行为,请用
DirectionProvider包裹,同时设置dir="rtl"(provider 不会设置 DOM 方向)。 - 对于严格 CSP,请用
CSPProvider包裹并传入nonce,或者如果你的应用提供外部样式,则禁用内联样式元素。注意内联样式属性不受CSPProvider控制。
6) Slider 与范围
- 单值滑块:一个
Slider.Thumb。 - 范围滑块:传入数组,并为每个值渲染一个
Slider.Thumb;添加index以对齐 SSR。 - 在需要边缘对齐时,使用
thumbAlignment调整滑块手柄对齐方式。
关键禁止事项
- 不要遗漏输入框、滑块、开关或单选组的无障碍标签。
- 不要期望 Base UI 提供默认样式;请自行应用样式。
- 对于需要脱离层叠/溢出上下文的浮层,不要忘记使用
Portal。 - 使用
render的函数形式时,不要跳过mergeProps。
输出预期
回复用户时,请提供:
- 应使用的具体 Base UI 组件(及其关键部分)。
- 简要的组装方案(Root + 各部分 + 相关时的 portal/positioner)。
- 一份关于无障碍和状态驱动样式的简短检查清单。
Links
评论
支持 Markdown