变更日志
@plaud/design 的发布历史,按发布版本组织(最新在前)。每个版本内部按 ✨ 新功能 与 🐛 缺陷修复 二级标题分组,并按组件逐条列出。版本号取自包的 changeset 变更日志。早于首次发版的变更归入 Pre-release 分组。
v0.10.0
✨ 新功能
- ImageViewer — 新增
resolveExportSrc,在缺省导出前解析下载地址 (WEB-1541) (详情)- 导出此前只有「缺省内置下载」与「
onExport完全接管」两档粒度,地址有时效的场景(预签名过期换签)只能接管后重新编排一遍下载,把 blob /cache:'reload'/ 跨域回退 / 文件名推断的处理复制一份到消费方 - 新增可选
resolveExportSrc(image, index)只回答「下哪个地址」;返回空值或抛错时回退image.src,与既有 blob fetch 失败回退原地址同一口径,下载实现仍留在组件内 - 传了
onExport时resolveExportSrc不生效(接管即完全跳过);解析期间导出按钮无 loading 态,与缺省路径现有的fetch等待窗口一致 - 纯新增:不传该 prop 时,缺省下载路径与
onExport接管路径行为均零变化;downloadImageBySrc保持模块内私有,不进公开 API - 新增 4 条测试,覆盖解析后用新地址下载、解析为空回退、解析抛错回退,以及
onExport接管时不调用该回调
- 导出此前只有「缺省内置下载」与「
- Segmented — 新增 Segmented 组件 (WEB-1501) (详情)
- 互斥值选择器,用于在少量选项间切换(如视图模式切换、筛选维度切换);与
Tabs不同,它不绑定内容面板 - 直接基于
@radix-ui/react-toggle-group(type="single")封装,不经过ui/toggle-group——其默认toggleVariants视觉与 Segmented 冲突,复用前需先给整个 toggle 系列补齐unstyledVisual支持,不在本次范围 - 声明式
optionsAPI,支持裸字符串简写('a'等价于{ value: 'a', label: 'a' }),覆盖纯文字 / 图标+文字 / 纯图标三种内容形态,图标与 Item、同排文字保持垂直居中;纯图标选项在类型层面强制要求同时提供icon与aria-label - 同时支持受控(
value)与非受控(defaultValue);非受控模式下,只要当前值不在options中(含初次挂载未提供、options异步到达或动态变化),即回退到首项,并提供block(撑满、选项等分)与整体 / 单项disabled——整体禁用时,已选中项保留白底药丸与阴影,但文字色降级为Labels-Disabled灰,表达「这是当前选中项,但不可更改」 - 点击已选中项被拦截为无操作——Radix
type="single"原本会以空字符串触发onValueChange,Segmented 语义上不允许清空选中 - 选中态使用
Foregrounds-White/Foregrounds-Black而非Backgrounds-Primary/Labels-Primary等语义 token,使选中药丸保持纯白/纯黑、不随主题翻转 - Root 显式声明
role="radiogroup"——Radix 在type="single"模式下给 Root 硬编码role="group",同时给 Item 渲染role="radio",二者语义不完整匹配;radiogroup+radio才是 W3C 对 segmented control 推荐的 ARIA 模式 - 未选中态文字采用
Labels/Secondary,明暗主题下均满足 WCAG 2.1 AA 对比度要求
- 互斥值选择器,用于在少量选项间切换(如视图模式切换、筛选维度切换);与
🐛 缺陷修复
- Dialog,Sheet — 点击外部关闭的判定范围收紧为「只认蒙层元素」,不再是整个视口 (WEB-1497) (详情)
- Radix 的
onPointerDownOutside只判断 pointerdown 的 target 是否落在 Content 子树内,不看 z-index 与视觉层叠——任何浮在弹层之上且可交互的全局元素(如 web4 的ContactSupportWidget,下游 USE-88)被点到时都会被误判为「点了外部」而关闭弹窗 / 面板 - 新增
overlay-dismiss.ts工具函数shouldDismissOnOutsidePointerDown:现在只有 pointerdown 的 target 被蒙层元素本身包含才会关闭;非模态(modal={false},不渲染蒙层)下保持「点任意外部即关」的既有语义 Dialog的closeOnOverlayClick默认值仍为false(行为不变);Sheet新增同名closeOnOverlayClick开关,但默认true以匹配其既有的「点外部即关」行为,同时把生效范围收紧到蒙层- 新增单测覆盖:点击浮于弹层之上的元素不再关闭弹窗 / 面板,非模态弹窗 / 面板仍会在点击外部时关闭
- Radix 的
- Toast — 悬停中的 Toast 栈清空后恢复自动消失 (WEB-1537) (详情)
- 关闭后已无可见 Toast 时立即清除 manager 的暂停态,不再等待宿主卸载后不可能触发的
mouseleave - 由 manager 的暂停快照统一驱动计时暂停与 Toast 堆叠展开,避免后续 Toast 继承陈旧的展开状态
- 新增回归测试,覆盖正常自动消失、悬停暂停/恢复、悬停中关闭最后一条、退场动画期间创建新 Toast,以及折叠堆叠布局恢复
- 关闭后已无可见 Toast 时立即清除 manager 的暂停态,不再等待宿主卸载后不可能触发的
- Tree — 自动超长标题 Tooltip 支持安全配置 (WEB-1539) (详情)
- 新增
TreeDataNode.tooltip,按节点开放 Tooltip 行为与展示属性,同时由 Tree 管理内容、Trigger 结构和受控开关 - 新增 12 个
placement预设,覆盖四个方向的居中、start 和 end 对齐,解析为 Tooltip 的side/align并固定sideOffset为8 - 未传配置时保持现有 Tooltip 默认值,左侧导航 Tree 可选择优先向右展示
- 补充单元测试与真实浏览器覆盖,同步 Tree DesignSpec 和双语文档,并将 Tooltip 文档中的
sideOffset默认值订正为0
- 新增
v0.9.1
🐛 缺陷修复
- Breadcrumb — 折叠下拉打开时不再锁住整页滚动 (WEB-1496) (详情)
BreadcrumbEllipsisMenu渲染DropdownMenu时未传modal,落到 Radix 默认的modal={true},会挂载react-remove-scroll并在折叠菜单打开期间拦截页面级wheel/touchmove- 显式传入
modal={false}——折叠下拉本质是导航辅助菜单而非 modal 交互,不应锁定页面其余部分 - 新增单测,断言打开下拉后渲染容器不带
aria-hidden:Radix modal 路径会对兄弟元素调用hideOthers,非 modal 路径不会
- Button — destructive 文字色改绑 Foregrounds/White,不再用 Labels/Reverse (WEB-1326) (详情)
variant="destructive"在暗色模式下红底黑字:BUTTON_VARIANT_CLASS.destructive写的是text-(--Labels-Reverse),该 token 浅色为#FFFFFF、深色翻转为#000000,而底色--Labels-Error不随模式变化- destructive 文字改用
text-(--Foregrounds-White)(明暗均#FFFFFF)。已与 Figma 设计系统文件(5ssRkvUdqpsRwwW59ooQCp)核对:Destructive 文字填充在 Default(147:15406/147:15409/147:15412/20935:1635)与 Hover / Clicked(147:15424/147:15433)上绑定的都是Foregrounds/White(VariableID:17:7) primary保留text-(--Labels-Reverse):Figma 里 Primary 文字绑定的就是Labels/Reverse(VariableID:14:5,节点147:15379),其底色随模式反转,文字必须跟着反转- 在
ButtonDesignSpec.md中补记Foregrounds/White与按变体的文字色 token 表;此前规范只列了Labels/Reverse,这正是实现时把两个 token 混用的原因 - 新增单测,断言 destructive 按钮带
text-(--Foregrounds-White)且不再带text-(--Labels-Reverse)
- Calendar — 年份下拉范围改为按 fromDate/toDate 推导,默认下界 1970 (WEB-1312) (详情)
- 年份下拉范围此前写死为「当前年 ± 50」,完全无视
fromDate/toDate——传入fromDate={today}后下拉里仍列出几十年的历史年份,看起来可选,实际选中后当月格子全部被禁用 CalendarMonthCaption现在从fromDate推导年份下界(未传时回退1970)、从toDate推导上界(未传时回退「当前年 + 50」),按此裁剪列表而非禁用条目;下界高于上界时退化为只保留下界这一年,不抛错也不生成空列表- 在边界年份,月份下拉会禁用早于
fromDate所在月或晚于toDate所在月的项,但仍保持 12 项不裁剪;切换年份时会把目标月份 clamp 到合法范围内,避免跳进全禁用的月份 Calendar现在把fromDate/toDate透传给CalendarMonthCaption(此前仅用于禁用日期格子)- 新增单测覆盖默认 1970 下界、fromDate/toDate 推导的范围边界、边界年月份禁用、切换年份时的月份 clamp
- 同样的推导逻辑扩展到了
disabledmatcher 入口(DatePicker的disabledDate透传到这里):disabled的{ before }/{ after }形式现在也会像fromDate/toDate一样收敛年份/月份下拉范围——由于isDateDisabled对多个 matcher 取并集,可选范围就是各约束的交集,因此下界取fromDate与所有{ before }值中的最大值,上界取toDate与所有{ after }值中的最小值;非单调的 matcher(裸Date、{ from, to }、函数式)无法推导出可靠边界,有意忽略不参与计算 - 翻页箭头新增越界禁用:显示的月份范围到达归一后的
minDate/maxDate时自动禁用(按年月粒度比较)——上一月箭头在第一个显示月已到达或早于minDate所在月时禁用,下一月箭头在最后一个显示月(RangePicker双日历场景下会考虑numberOfMonths)已到达或晚于maxDate所在月时禁用;goToPrevMonth/goToNextMonth同步加上越界早退守卫,防止键盘或编程式调用绕过disabled属性
- 年份下拉范围此前写死为「当前年 ± 50」,完全无视
- Progress — 把
value透传给 Radix Root,进度条不再恒为 indeterminate,可正确报出aria-valuenow(WEB-1381) (详情)value被从 props 里解构出来后只喂给了 Indicator 的translateX,从未传给ProgressPrimitive.Root——Radix 因此认为每个进度条都没有值,输出data-state="indeterminate"且没有aria-valuenow/aria-valuetext,读屏用户只听到「进度条」而听不到百分比,明眼用户看到的填充却是对的- 把
value一并传给ProgressPrimitive.Root;Indicator 的位移计算不变,视觉零变化 - 对使用方的行为差异:
aria-valuenow/aria-valuetext/data-value从无到有,data-state从恒定的indeterminate变为loading/complete。Radix 现在还会校验value,传入非数字 / NaN /< 0/> max时会console.error;此时渲染结果不受影响,因为视觉仍由组件自身的 transform 决定
- Tabs — 选中态字重改用 Body/Emphasized semibold(600),不再是 medium(500) (WEB-1352) (详情)
- 选中标签字重偏轻一档:
TABS_TRIGGER_BASE_CLASS写的是data-[state=active]:font-medium(500),而 Figma Tabs 节点(522:53227)标注为Inter-SemiBold600 / 14 / 20,即Body/Emphasized文字 token(--Font-Weight-Emphasized: "Semibold") - 选中态字重改为
font-semibold;字号与行高本来就取自--Font-Size-Body/--Line-Height-Body,不变 - 修正
TabsDesignSpec.md与文档站排版表(中英)中陈旧的行高(22px → 20px)与选中字重;实现一直用的是 token,错的只有文档 - 新增单测,断言 trigger 带
data-[state=active]:font-semibold且不再带data-[state=active]:font-medium
- 选中标签字重偏轻一档:
- Toast — 无断点长串正常换行,不再溢出行盒 (WEB-1350) (详情)
- 文案中出现无天然断点的长串时(典型是文件名,如
320X240(1)_rmv8_904kbps_15fps_rma_44100hz_96.5kbps)会溢出所在行盒、与相邻文本视觉重叠——CSS 默认的overflow-wrap: normal只在空格与 CJK 字符之间断行,下划线不是断点 - 给
TOAST_TITLE_CLASS与TOAST_DESCRIPTION_CLASS增加wrap-anywhere;break-words不够用,因为overflow-wrap: break-word不参与 min-content 尺寸计算,在文本容器min-w-0下长串照样溢出,而break-all会把正常英文单词从中间劈开 - 新增单测,用含长文件名的 title / description 渲染并断言两个文本节点均带
wrap-anywhere
- 文案中出现无天然断点的长串时(典型是文件名,如
- Tree — 拖拽源行 actions 区域上下描边不再被 hover 按钮遮挡 (WEB-1323) (详情)
- 拖拽源行的描边是 1px
inset-ring(画在行元素自身的 box-shadow);hover-only actions 容器是absolute inset-y-0 bg-inherit,作为带背景子元素绘制层级高于行的 inset 阴影,满高铺满时盖住了按钮区域内描边的上下横边——拖拽时描边在+/⋯按钮处看起来被截断 - 仅在拖拽态给 actions 容器上下各内收 1px(
group-data-[dragging]/pd-tree-item:inset-y-px),并在拖拽源行输出data-dragging作为 group 开关;正常(非拖拽)态遮罩满高不变 - 新增单测,断言拖拽源行带
data-dragging且 actions 容器带内收 variant
- 拖拽源行的描边是 1px
v0.9.0
✨ 新功能
- Select — 新增 ghost 触发器变体 (WEB-1277) (详情)
Select新增variantprop('outline' | 'ghost'),默认'outline',现有用法零回归。对外通过<Select variant="ghost" />使用;内部SelectTrigger子组件消费该 prop,但保持内部实现、不从包出口导出ghost为无边框、内容自适应、值右对齐的触发器,带尾部 sort(上下)双向箭头与 hover/open 灰底,用于行内 / 工具栏选择场景ui/select.tsx的SelectTrigger新增可选iconprop,覆盖默认 chevron(内部能力透传)SortIcon中性态(sortDirection === null)改用currentColor,跟随父级文字色(使 ghost disabled 态图标正确变灰);asc/desc 激活态高亮不变- (WEB-1277) fix(Select): 修复 ghost 触发器的 WCAG AA 对比度问题
- hover/open 态文字从
Labels/Tertiary加深为Labels/Secondary(叠加Grays/Gray-1背景),对比度从 4.47:1(不达标)提升到 9.11:1 - 键盘焦点指示不再单独依赖低对比度灰底(相对白色仅 1.19:1,不满足非文本对比度 3:1 要求),改为可见的
Labels/Primary焦点环(21:1) - (WEB-1277) fix(Select): 修复 ghost 触发器宽度撑满整行的 bug
- ghost base class 此前只覆盖了宽度(
w-full→w-auto),未覆盖display;底层ui/select.tsxprimitive 是块级flex容器,仅width: auto在普通文档流(非 flex/grid 父容器)中仍会撑满父宽度,导致 hover/focus 灰底横跨整行而非贴合内容 - 在 ghost base class 中于
w-auto旁追加inline-flex,使触发器变为行内级 flex 盒子,在任意布局上下文中都能真正按内容宽度收缩
- (WEB-1310) feat(Select)!: 单选 Select 支持左置对勾选项变体,并把
MultiSelect.menuItemVariant改名为optionItemVariant(详情)- 破坏性变更:
MultiSelect.menuItemVariant重命名为optionItemVariant(含义、取值、默认值'checkmark'均不变)——下拉里的一行是SelectOptionItem,不是「菜单项」,改名对齐领域词汇,并让Select与MultiSelect共用同一个 prop 名 SelectContent(组合式子组件)新增optionItemVariant?: 'checkmark' | 'checkmark-right'prop,默认'checkmark-right'(零回归),通过 context 下发给面板内渲染的每个SelectItemSelect新增同名optionItemVariantprop,透传到声明式非 searchableoptions分支渲染的SelectContent- 刻意不放在
SelectItem自身上:同一下拉面板内所有行必须共享同一个对勾位置(Figma 没有同一菜单内左右混搭的变体),若做成 per-item prop,调用方漏设一项就会静默产生左右不一致的菜单 checkmark把选中态指示器从文案右侧移到左侧,对齐 Ghost trigger 菜单项 Figma 变体;item 内边距相应从预留右侧空间改为预留左侧空间- 范围:仅组合式
SelectContent/SelectItem与声明式非 searchable 分支——searchable单选已通过SearchableOptionItem支持左/右置对勾
- 破坏性变更:
🐛 缺陷修复
- Calendar — 月/年下拉打开时定位并聚焦到当前月/年 (WEB-1295) (详情)
- 月/年下拉(
CalendarMonthCaption)用 RadixDropdownMenu渲染,打开时默认聚焦列表首项,年份下拉(当前年 ±50 共 101 项)停在最早的 1976 而非当前选中年份(如 2026);月份下拉存在同样的潜在问题 - 给当前月/年项打
data-current="true"标记,并给两个下拉的内容容器加pd-calendar__scroll-menu标记类 - 新增
useEffect:下拉打开时(一个requestAnimationFrame后)对[data-current]项focus({ preventScroll: true }),并仅调整容器scrollTop把它在滚动容器内居中(不触发页面滚动) - 新增 2 条单测,锁定当前年 / 当前月的
data-current标记契约
- 月/年下拉(
- DropdownMenu — 修复 modal Dialog/Popover 内 portal 浮层列表无法滚动 (WEB-1286) (详情)
useStopWheelPropagation之前用useEffect读ref.current且依赖稳定,只在挂载时跑一次;而 RadixContent的 DOM 经 Portal/Presence 延迟挂载,effect 首次运行时节点尚为 null 便 early-return,wheel 监听器从未绑定,面板真正打开后也不会重绑- 结果:modal Dialog 内 portal 到
document.body的DropdownMenu(如日历的月/年选择器)无法滚动——Dialog 的react-remove-scroll隔离逻辑会preventDefault掉所有目标不在其 shards 白名单内的 wheel,而(从未绑定的)stopPropagation守卫无法阻止事件冒泡到该 document 级监听器 - 将
useStopWheelPropagation重写为返回稳定的 ref 回调,在节点挂载/卸载的精确时刻绑定/解绑wheel的stopPropagation监听,从而兼容延迟挂载的 portal 内容 - 在所有调用方改用 ref 回调形态:
DropdownMenu、ContextMenu、Menubar(Content + SubContent)、Popover、Select - 新增单测:断言 hook 在挂载时绑定、收到
null时解绑
v0.8.0
✨ 新功能
- Tree — 修复 light/dark 主题切换时行颜色过渡延迟 (WEB-1207) (详情)
- Tree item 的
transition-colors(本为 hover/selected 背景服务)会把主题切换时整套 CSS 变量的翻转也做插值动画,导致行背景/边框在 light↔dark 切换时"慢慢过渡"(颜色切换延迟观感) - 新增并导出共享工具
suppressThemeTransition(apply):自行注入一次性<style>(.pd-theme-switching * { transition: none !important },无需 import globals.css),在执行apply前加 class、apply后强制一次同步样式计算让变量翻转在过渡禁用状态下提交,再于下一帧移除 class——主题瞬时切换,hover/selected 等交互过渡不受影响 DesignProvider改用suppressThemeTransition包裹data-theme/.dark翻转;在DesignProvider之外自行切换主题的消费方(如 design-site 的 Docusaurus 桥接、web4 的darkMode.ts)可复用该工具- 补充工具单测
- Tree item 的
🐛 缺陷修复
- Dialog — Modal 背景改用 Grays/White token,dark mode 从近黑恢复为 #292929 (WEB-1244) (详情)
- Select — 修复下拉自动滚到选中项时顶部首项被裁切 (WEB-1194) (详情)
- Radix
SelectPrimitive.Viewport自带 inlineoverflow: hidden auto且flex: 1,是真正的滚动容器(撑满到 content 的max-h-[268px])。下拉的上下py-(--Spacing_8)此前落在 viewport 上、即位于滚动区之内——当列表自动滚动以显示靠后的选中项(如显示语言选到「中文(简体)」,index 8)时,顶部 padding 随列表滚走,首个可见项(「Español」)紧贴面板顶边被裁切 - 将
SELECT_VIEWPORT_TOKEN_CLASS精简为仅保留语义标识pd-select__viewport(移除滚动区内的py-(--Spacing_8)及冗余的overflow-y-auto,后者 Radix inline 样式已提供) - 改把
py-(--Spacing_8)加在SelectContent外框上;Radix 给 popper content 强制display:flex; flex-direction:column,padding 落在不滚动的 flex 容器上恒定显示。未改动被 searchable Popover / MultiSelect 复用的共享SELECT_CONTENT_TOKEN_CLASS SELECT_DROPDOWN_MAX_HEIGHT由max-h-[268px]修正为max-h-[270px]:content 带 1px border,Tailwind preflight 下box-sizing: border-box,max-height 含 border。268px 时 viewport 实际只有 268 − 2(border) − 16(padding) = 250px(< 7×36 = 252px),滚动时首项仍被裁切约 2px;计入上下 2px border 后 viewport 恰为 252px = 正好 7 × 36px,滚动按整项对齐- 新增回归测试:断言 padding 落在 content 外框(listbox)而非 viewport 上,且 listbox 为
max-h-[270px]
- Radix
- Toast — 修复 variant 背景透明,更新到重命名后的 Accent token (WEB-1208) (详情)
v0.7.0
✨ 新功能
- MultiSelect — 开放 menuItemVariant='checkmark' 并设为默认(左侧对勾) (WEB-1201) (详情)
- 将
MultiSelect.menuItemVariant从'checkmark-right' | 'checkbox'拓宽为'checkmark' | 'checkmark-right' | 'checkbox',放开SearchableOptionItem已支持的左侧对勾 - 将默认
menuItemVariant从'checkmark-right'改为'checkmark'(左置对勾),对齐 Figma 默认;此前依赖隐式右置对勾的调用方需显式传menuItemVariant="checkmark-right" - 无渲染改动:
'checkmark'在左侧渲染对勾,菜单项带前导icon时按既有 Figma 规则自动移到右侧 - 补充单测与文档站示例(中英)覆盖左侧对勾变体
- 将
🐛 缺陷修复
- Button — 禁用按钮点击/悬停时不显示视觉效果 (WEB-1203) (详情)
- 为所有按钮变体(primary、secondary、tertiary、quaternary、destructive、destructive-outline、link-color、link-gray)添加
disabled:hover:和disabled:active:防护类 - 确保禁用按钮在点击或悬停时保持一致的样式,防止边框/背景意外变化
- 覆盖启用
pointer-events-auto的禁用状态下可能泄露的任何 hover/active 伪类效果
- 为所有按钮变体(primary、secondary、tertiary、quaternary、destructive、destructive-outline、link-color、link-gray)添加
- Dialog — DialogTitle 字重对齐 Figma Modal(font-normal → font-semibold) (WEB-1193) (详情)
ui/dialog的DialogTitle原为font-normal(400);Figma DS Modal 标题(节点21231:6298,Size=Default)为 H3/Emphasized:18px / 24px / 字重 600(token--Font-Weight-Emphasized= Semibold)- 将
font-normal改为font-semibold(600);字号(18px)与行高(--Line-Height-H3,24px)不变 - 所有使用结构化
titleprop 的弹窗标题字重统一变为 600,向设计稿收敛
- DropdownMenu — 禁用项图标/箭头置灰为 Labels/Disabled,并显示 not-allowed 光标 (WEB-1190) (详情)
- 新增共享类
DROPDOWN_ICON_DISABLED_COLOR_CLASS,通过祖先[data-disabled]选择器让图标容器在父项禁用时跟随Labels/Disabled(图标颜色为显式声明,不会自动继承 Item 文字的 disabled 色) - 应用到
DropdownMenuItem前置图标(经getDropdownMenuItemIconColorClass)、DropdownMenuSubTrigger前置图标以及尾部级联箭头(DROPDOWN_SUB_ARROW_COLOR_CLASS) - 在共享 item base 追加
data-disabled:pointer-events-auto+data-disabled:cursor-not-allowed,覆盖 ui 层的pointer-events-none,让禁用项显示 not-allowed 光标(对齐 Button)
- 新增共享类
v0.6.8
🐛 缺陷修复
- DropdownMenu — 级联子菜单指示箭头颜色改为 Grays/Gray-4(设计规范 labels-gray4) (WEB-1183) (详情)
- 箭头图标(icon_list_chevron_right)已在 WEB-1129 替换,本次仅改颜色,此前为 Labels/Primary
- 通过新增 DROPDOWN_SUB_ARROW_COLOR_CLASS 将箭头颜色与前置图标解耦,前置图标仍保持 Labels/Primary
v0.6.7
🐛 缺陷修复
- Toast — action 支持透传 actionProps 到底层 action 按钮 (WEB-1181) (详情)
- actionProps 在默认 variant/size 之后展开(使调用方可覆盖),但在组合 onClick 之前,因此点击 + 自动关闭行为不可被覆盖
- 排除 children(由 label 承担)与 onClick(由 Toast 组合);data-* 索引签名沿用 Dialog okButtonProps 既有约定
v0.6.6
🐛 缺陷修复
- AiButton — 新增 Loading 与 Disabled(预留)状态 (WEB-1176) (详情)
- loading 以 16px Spinner 替换 sparkle 图标、文字转灰,保留白底 + 渐变描边,并以原生 disabled 阻断交互(aria-busy + not-allowed 光标)
- disabled(预留)将按钮置为灰底(
--Grays-Gray-2)、去除渐变描边并灰显 sparkle 图标
v0.6.5
🐛 缺陷修复
- Select — 菜单项存在前导 icon 时,选中 indicator 移到右侧 (WEB-1174) (详情)
- 将「有 icon → indicator 在右」的布局规则从
checkbox变体泛化到checkmark变体(SearchableOptionItem),对齐 Figma 规范(Show Icon=True→[icon][text][indicator])
- 将「有 icon → indicator 在右」的布局规则从
v0.6.4
🐛 缺陷修复
- Toast — 带标题(Alert)变体顶部 padding 由 8px 调整为 12px (WEB-1128) (详情)
- 仅 Alert 形态顶部;Message 形态与左右/底部 padding 不变
v0.6.3
🐛 缺陷修复
- DropdownMenu — 级联子菜单样式调优 (WEB-1129) (详情)
- 向
IconRegistry新增必填 keylistChevronRight(破坏性:图标 registry 必须补icon_list_chevron_right实现) - 级联箭头改用
ListChevronRightIcon,20px 容器,Labels/Primary SubContent默认sideOffset={-8}/alignOffset={-8}(叠在父菜单之上 + 首项对齐父级选项)SubTrigger展开态背景覆盖为 Grays/Gray-1(修复展开时黑底)- 前置图标容器默认 Labels/Primary(业务传入 node 可覆盖)
- 向
v0.6.2
🐛 缺陷修复
- Dialog — 点击蒙层默认不再关闭 Dialog;
DialogProps/DialogOpenOptions新增closeOnOverlayClick?: boolean(默认false);ESC 与关闭按钮的关闭行为不变(WEB-1125) - Tooltip — hover 延迟默认值由 0 改为 500ms;
delayDuration默认值由0改为500;消失行为不变;移除Tree组件里的本地 300ms hack(WEB-1124)
v0.6.1
🐛 缺陷修复
- Button — 字重更新为 Medium(对齐 Figma 规范);
Primary/Secondary/Tertiary/Quaternary/Destructive/Destructive Outline文字字重由 Regular(400) 改为 Emphasized/Medium(500);Link Color/Link Gray保持 Regular(400) 不变(WEB-1119)
v0.6.0
✨ 新功能
- Select / MultiSelect — 新增图标支持、menuItemVariant 与搜索图标开关;
SearchableOptionItem新增variantprop('checkmark-right' | 'checkmark' | 'checkbox')及可选前导icon;MultiSelect新增menuItemVariant切换下拉项视觉风格,Chip 新增 hover/active/focus-visible 状态;Select新增showSearchIcon(默认true),checkbox变体改为复用Checkbox组件;Input边框新增 hover 态;下拉项默认文字色由Labels-Secondary调整为Labels-Primary(WEB-1075、WEB-1076、WEB-1118)
🐛 缺陷修复
- DropdownMenu — group label 样式对齐 Select;
font-semibold→font-normal,text-(--Labels-Secondary)→text-(--Labels-Tertiary),py-(--Spacing_8)→pt-(--Spacing_8)(消除 shadcn 默认py-1.5导致的 6px 底部 padding 泄漏)(WEB-1116) - Select — 修复条件渲染写法并为装饰性图标补充 aria-hidden;
MultiSelect、SearchableOptionItem、Select中的&&JSX 条件渲染替换为显式三元表达式;装饰性图标 span 补充aria-hidden="true"(WEB-1118)
v0.5.0
✨ 新功能
- ImageViewer — 放大后支持鼠标拖拽平移;zoom > 1 时可拖拽图片定位局部区域,光标自动切换为 grab / grabbing;含边界约束,图片不会被拖出视口;切图、缩小到默认倍率或关闭时平移量自动复位(WEB-1062)
🐛 缺陷修复
- Toast — 修复 top-center 定位下 Message 形态水平偏左问题;将
left: 50%改为translateX(calc(210px - 50%)),避免w-fit宽度被压缩(WEB-1105)
v0.4.6
🐛 缺陷修复
- ui — Tailwind v4 CSS 变量任意值类语法从方括号迁移为括号写法;将
popover、hover-card、tooltip、navigation-menu、dropdown-menu、context-menu、menubar、select中所有xxx-[--radix-yyy]替换为xxx-(--radix-yyy),修复 v4 消费方下max-height、transform-origin、视口尺寸类静默失效问题(WEB-1108) - ui / Popover / DropdownMenu / ContextMenu / Select — 修复弹层内容在 Dialog 中被 react-remove-scroll 拦截导致滚轮失效;新增
useStopWheelPropagationhook,为 portal 化弹层内容节点挂载原生wheel监听并stopPropagation(WEB-1109) - Dialog — 内容区改用
flex-1填充 header 与 footer 之间的空间,内容溢出时 footer 保持固定在底部
v0.4.5
🐛 缺陷修复
v0.4.4
🐛 缺陷修复
- Breadcrumb — 折叠下拉项透传
itemRender,新增placement字段区分下拉与内联渲染,修复折叠项整页刷新(WEB-1044)。折叠项此前绕过itemRender写死<a href>,现已正确以placement: 'dropdown'调用itemRender。 - Calendar — 修复暗黑模式下选中态日期数字不可见(WEB-1041)。文字色由
--Foregrounds-White(始终白色)改为--Labels-Reverse(light 白 / dark 黑),始终与--Labels-Primary选中背景色形成对比。
v0.4.3
🐛 缺陷修复
- Dialog —
showClose为true(默认)时,DialogTitle增加右侧留白(--Spacing_40),防止长标题被关闭按钮遮挡。
v0.4.2
🐛 缺陷修复
- Tooltip / HoverCard — focus 触发打开收窄为仅
:focus-visible(DES-134)。鼠标点击触发的焦点与编程式焦点还原(如嵌套 DropdownMenu 关闭后)不再重新打开浮层,键盘可见焦点行为不变。
v0.4.1
🐛 缺陷修复
- ImageViewer —— ImageViewer: 默认导出改为先
fetch成 blob 再用同源 objectURL 下载,跨域 CDN 图片也能真正下载而非跳转新页面;fetch失败或 HTTP 非 2xx 时回退到原始地址,objectURL 延迟回收(DES-133)。
v0.4.0
✨ 新功能
- Tree —— Tree title 溢出检测改为按需测量(DES-132)。
useTitleOverflow改为在指针进入 / 聚焦该行时按需测量,不再挂载即测,消除大数据量列表的布局抖动。契约变化:超长 title 仅在首次 hover/focus 后才包成 Tooltip trigger,并移除ResizeObserver。
v0.3.1
🐛 缺陷修复
- ImageViewer —— 单图工具栏优化 + 无障碍修复(DES-130)。单图隐藏上一张/下一张导航,禁用图标光标恢复
not-allowed,新增role="status"/aria-live="polite"缩放播报,支持键盘缩放(+/=/-)。
v0.3.0
✨ 新功能
- Overlay —— Tooltip / DropdownMenu / Popover / HoverCard 可组合 trigger(DES-128)。四个 children-as-trigger overlay 改为
forwardRef,通过extractForwardableTriggerProps将事件 / aria 关系 / 条件 id 转发给内部 Trigger,支持<Tooltip><DropdownMenu>…</DropdownMenu></Tooltip>这类嵌套组合。
v0.2.2
🐛 缺陷修复
- Input —— Input 家族 PR review 修复,记录在 Input 新增 allowClear + 补充 visual case。
useClearableInput改用原生 value setter + 真实input事件派发(完整SyntheticEvent);InputSearch清空按钮补focus-visible焦点环;仅allowClear时托管聚焦态;新增可本地化的clearButtonAriaLabelprop。
v0.2.1
🐛 缺陷修复
- Input —— 清空按钮(
allowClear)补充focus-visible键盘焦点环(ring-1+Labels/Primary,WCAG 2.4.7)。详见 Input 新增 allowClear + 补充 visual case。
v0.2.0
✨ 新功能
- Input —— 新增
allowClear一键清除能力。 - Skeleton —— 重构支持
items多块渲染,以及圆角/颜色挂 token + 卡片级SkeletonGroup扫光。 - useFilePicker —— 新增原语并接入 ChatInput。(无文档站详情页。)
- 无障碍 —— a11y 自动化:vitest-axe 单测层 + Playwright 集成层 + 49 组件审计。
- Button —— icon-only 交互状态对齐。
- Dialog —— 可滚动内容 + flex 布局。
- Toast —— 新增单条
closeButtonprop。
🐛 缺陷修复
- Button / Checkbox —— 禁用态 label 颜色改用
:has()修复。 - Typography —— token 对齐 Figma 设计系统。
v0.1.0
Skeleton 重构与若干组件细化(大部分已被上方更详细的 v0.2.0 条目覆盖)。
✨ 新功能
- Skeleton —— 重构支持
items多块渲染,新增SkeletonGroup卡片级扫光。 - Button —— 对齐 icon-only 状态。
- Dialog —— 支持可滚动内容。
- Checkbox / RadioGroup / Menu / Slider —— 样式与行为细化。
- utils —— 新增
merge-refshelper,并从包入口导出。
🐛 缺陷修复
- Button —— 修复 disabled label 样式。
v0.0.1
首次发布 —— 将 design 包发布到私有源。@plaud/design-tokens 与 @plaud/design 以构建产物 dist 形态发布(0.0.1)。
Pre-release
早于 changeset 发布流程的变更 —— 未单独发版。
✨ 新功能
- 2026-06-12 —— Radio & Checkbox 热区扩至 20×20 + 补充 visual case(DES-96 / DES-97)
- 2026-06-12 —— Breadcrumb title 超长截断(DES-93)
- 2026-06-12 —— Tree 拖拽视觉与行布局对齐新版 Figma(DES-89)
- 2026-06-08 —— Tree item 间距 4px + title/action 布局重构 + 渐变遮罩
- 2026-06-03 —— RadioGroup & Checkbox 新增
labelprop 扩大点击区域(DES-68) - 2026-06-03 —— Dialog
okButtonProps/cancelButtonProps+ 纯内容模式 + 移除 AlertDialog - 2026-06-02 —— 同步 2026/06/01 组件更新(DES-40)
- 2026-06-02 —— Dialog 新增 Size=Emphasized 变体(DES-37)
🐛 缺陷修复
- 2026-06-10 —— Toast title 字重改为 Emphasized(Semibold)
- 2026-06-03 —— Switch Toggle On 颜色更新为蓝色 #1573D1(light mode)(DES-69)
- 2026-06-03 —— Typography 字号与行高 token 更新(DES-67)
- 2026-06-03 —— Typography Font-Weight-Emphasized token 更新(DES-66)
- 2026-06-03 —— PageControls Dot 颜色 token 更新(DES-65)
- 2026-05-06 —— 第二轮修复(设计师反馈)(WEB-377)
- 2026-04-28 —— 第一轮批量修复(WEB-377)
关联
- Linear 项目:Plaud Design