v3.2.7
React Aria 1.22.1、全新 Sheet 组件、Slider 步进指示点与刻度标签、渲染性能与无障碍改进、响应式 Storybook 示例,以及浮层与表单控件修复。
2026 年 10 月 28 日
React Aria 升级:HeroUI 将 react-aria-components 升级至 1.22.1(react-aria@3.53.1)。全新 Sheet 组件提供可滑动浮层,支持四种放置方向、吸附点、嵌套 Sheet、受控状态、限定在视口内的分离式布局,以及协调拖动、滚动与 handle 关闭。Slider 新增适用于水平、垂直、单值与范围控件的可组合步进指示点和刻度标签,同时降低组件渲染开销。无障碍改进新增装饰性 Separator 支持,在日期选择器浮层中保留对话框名称,移除无效的地标与分组属性,并改进 Storybook 示例语义。本版本还让重新打开的浮层保持可见,并修复 Slider RTL 填充、Switch 滑块抖动、Tabs 水合时的指示器偏移、取消的 Drawer 拖动、残留的 ScrollShadow 边缘阴影、窄屏菜单、自动填充字段与 Toast 布局。
安装
升级到最新版本:
npm i @heroui/styles@latest @heroui/react@latest对等依赖。 本版本需要 react-aria-components@^1.22.1 与 react-aria@^3.53.1。升级时请与应用中已安装的版本对齐。
正在使用 AI 助手? 对它说「Hey Cursor,把 HeroUI 升级到最新版本」。它会自动对比版本并应用必要变更。了解更多请参阅 HeroUI MCP 服务器。
依赖
- React Aria:升级至 React Aria 1.22.1 —
react-aria-components@1.22.1、react-aria@3.53.1、react-stately@3.51.0、@react-types/shared@3.37.0与@internationalized/number@3.6.9(#6939、#6949)。 - Avatar 原语:将
@radix-ui/react-avatar升级至1.3.1(#6979)。 - 安全:修补传递依赖中的 Dependabot 告警 (#6938)。
新功能
- Sheet:新增可滑动的 React Aria 浮层,支持
bottom、top、left与right放置方向;像素、CSS 长度和百分比吸附点;连续吸附;多种 backdrop 样式;分离式与不可关闭模式;受控状态;嵌套 Sheet;以及协调面板拖动、内容滚动与 handle 关闭。分离式 Sheet 在所有放置方向下都会让各吸附点保持在视口范围内。复合 API 包含 trigger、backdrop、content、dialog、handle、header、body、footer 与 close 部件 (#6974、fba503c、#6979)。 - Slider 步进与刻度:在
Slider.Track内组合Slider.Steps,即可为每个配置的步进显示装饰性圆点;在轨道后添加Slider.Marks与Slider.Mark,即可在任意数值位置显示标签。步进与刻度支持小数值、垂直方向、RTL、禁用状态、单值与范围 Slider、本地化默认标签,以及data-filled样式钩子 (#6965)。
错误修复
- CloseButton:不再在 React Aria
Button上硬编码aria-label="Close"。显式传入的aria-label与 slot 上下文标签(Toast 的close、SearchField 的clear、Tag 的remove)不再被覆盖 (#6946)。 - Toast:在 iOS Safari 上收起底部区域锚点,使堆叠 Toast 与安全区域对齐 (#6936)。用 CSS Grid 布局替代
useMediaQuery操作区定位 (#6932)。用offsetHeight代替scrollHeight测量堆叠高度,在已展开堆叠内动态新增 Toast 时指示器与标题保持对齐 (#6952)。 - Dropdown:子菜单项起始内边距与菜单内边距刻度对齐 (#6941)。居中 with-sections 示例中的触发器图标 (#6944)。在窄屏上让菜单保持足以容纳选项与图标的宽度,同时不超过视口可用宽度 (#6957)。
- ComboBox:将滚动保留在受输入框控制的列表框上,而不是外层浮层,使键盘导航与虚拟焦点能够显示所有选项 (#6959)。
- Slider:水平填充区域从行内起始侧定位,使 RTL 语言环境中的填充轨道与 React Aria 的滑块位置一致 (#6964)。
- Switch:通过不改变 flex 布局的位置动画消除切换时的滑块抖动,同时保留 RTL 对齐与自定义轨道宽度支持 (#6970)。
- Tabs:在首个客户端帧之前禁用指示器过渡,避免水合期间的临时布局位置导致指示器偏离初始选中的 Tab,同时保留后续切换选中项时的正常动画 (#6988)。
- Drawer:取消滑动后不再让面板停在偏移位置或卡在拖动状态。命中子元素触发的
lostpointercapture会被忽略;当对话框自身失去捕获时面板会弹回;消费者传入的style会与touch-action: none合并,而不会把它覆盖掉。打开滑入动画改在Drawer.Content上运行,因为 React Aria 会在绘制前清除对话框上的data-entering(#6968)。 - ScrollShadow:当
isEnabled变为false时清除自动可见性属性,避免边缘残留阴影 (#6964)。 - Calendar:星期标题标签保持等宽列 (#6925)。
- 浮层:在中端手机上加快打开与关闭。进入与退出动画仅使用 opacity 与 transform(不再使用
filter关键帧);触控设备上带模糊的 Modal 与 Drawer 遮罩跳过backdrop-filter;WebKit 在关闭动画真正运行前保持 Popover 挂载;粗指针设备在 Dropdown 定位完成后立即显示菜单,而不再等待键盘检测;滑走关闭的 Drawer 会清除内联transition: none,使退出过渡正常播放 (#6934)。基于 Popover 的组件现在也会保留转发 ref 的清理函数,遵循本地与 slot 上下文中的shouldSkipAnimation偏好,并在选择性导入 CSS 时保留浮层动画样式 (6f0678c)。重新打开保留的 Modal 或 Popover 内容时,现在会恢复原有或新传入的 opacity,不再保持不可见 (1b64b24)。 - 列表浮层:Select、Dropdown、Autocomplete 与 ComboBox 的外层圆角与选项内边距对齐 (#6916)。
- 选择指示器:Select、ComboBox 与 Autocomplete 浮层中的勾选标记不再压住标签 (#6908)。
- AvatarGroup:裁切重叠跟随头像圆角 (#6884)。
- Checkbox:勾选 SVG 保持挂载,切换 Table 中不确定状态时绘制动画不再闪烁 (#6890)。
- ScrollShadow:移除非整数设备像素比下的遮罩接缝 (#6914)。
- Radio:为 Radio 现有的
data-*状态规则补上:focus-visible、:hover与:active(#6879)。 - Toast 样式:为现有的
:focus-visible与:hover规则补上对应的data-*属性 (#6879)。
样式
- 字段自动填充:浏览器自动填充时,Input、TextArea、InputGroup、SearchField、NumberField 与 ComboBox 的
variant="secondary"(及其他变体)仍保留各自的底色。自动填充规则读取各变体的填充 token,并在 Chromium 中用内嵌box-shadow覆盖,而不再硬编码主色字段颜色 (#6943)。 - Disclosure:从
disclosure.css中移除误放的.accordion__heading规则 (#6904)。 - Chip:清空
.chip--md— 它重复声明了基础.chip上已有的text-xs(#6879)。
组件
- Separator:新增
isDecorative,用于纯视觉分隔线。装饰性分隔线使用呈现性语义并对辅助技术隐藏,同时保留视觉样式与自定义渲染支持 (#6959)。 - 渲染性能:静态类名不再经过 render prop 解析,并缓存变体输出与合并后的类名,同时将 children 直接传给 React Aria 原语。这在保留函数形式
className与 children API 的同时,减少了按钮、表单、选择控件、浮层、日期与颜色输入、集合、导航和展示组件中的额外工作 (#6947)。 - displayName:将组件各部分的
displayName设为HeroUI.Component.SubPart,并修正 7 个不一致的名称 (#6879)。 - EmptyState:补上缺失的
"use client"指令 (#6879)。
无障碍
- 浮层与日期选择器:保留自定义渲染行为,同时移除通用浮层容器上失去关联的无障碍名称属性。DatePicker 与 DateRangePicker 现在会把对话框标签传给 React Aria 自动生成的对话框容器 (#6959)。
- 日历与分组:Calendar 与 RangeCalendar 的标题区域改用中性容器,避免创建嵌套的 banner 地标。嵌套的 ToggleButtonGroup 不再为
grouprole 暴露不支持的aria-orientation(#6959)。 - 示例:改进 Storybook stories 中的无障碍名称与语义,将纯视觉分隔线标记为装饰性,并把标签页与其内容面板关联起来 (#6959)。
Storybook
- 响应式示例:通过响应式尺寸、间距、换行与布局行为,让组件和颜色示例适配更小的视口 (#6958)。
链接
贡献者
感谢所有为本次发布做出贡献的人!