跳到主要内容

变更日志

@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 支持,不在本次范围
    • 声明式 options API,支持裸字符串简写('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 以匹配其既有的「点外部即关」行为,同时把生效范围收紧到蒙层
    • 新增单测覆盖:点击浮于弹层之上的元素不再关闭弹窗 / 面板,非模态弹窗 / 面板仍会在点击外部时关闭
  • Toast — 悬停中的 Toast 栈清空后恢复自动消失 (WEB-1537) (详情)
    • 关闭后已无可见 Toast 时立即清除 manager 的暂停态,不再等待宿主卸载后不可能触发的 mouseleave
    • 由 manager 的暂停快照统一驱动计时暂停与 Toast 堆叠展开,避免后续 Toast 继承陈旧的展开状态
    • 新增回归测试,覆盖正常自动消失、悬停暂停/恢复、悬停中关闭最后一条、退场动画期间创建新 Toast,以及折叠堆叠布局恢复
  • 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
    • 同样的推导逻辑扩展到了 disabled matcher 入口(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 属性
  • 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-SemiBold 600 / 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

v0.9.0​

✨ 新功能​

  • Select — 新增 ghost 触发器变体 (WEB-1277) (详情)
    • Select 新增 variant prop('outline' | 'ghost'),默认 'outline',现有用法零回归。对外通过 <Select variant="ghost" /> 使用;内部 SelectTrigger 子组件消费该 prop,但保持内部实现、不从包出口导出
    • ghost 为无边框、内容自适应、值右对齐的触发器,带尾部 sort(上下)双向箭头与 hover/open 灰底,用于行内 / 工具栏选择场景
    • ui/select.tsx 的 SelectTrigger 新增可选 icon prop,覆盖默认 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.tsx primitive 是块级 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 下发给面板内渲染的每个 SelectItem
    • Select 新增同名 optionItemVariant prop,透传到声明式非 searchable options 分支渲染的 SelectContent
    • 刻意不放在 SelectItem 自身上:同一下拉面板内所有行必须共享同一个对勾位置(Figma 没有同一菜单内左右混搭的变体),若做成 per-item prop,调用方漏设一项就会静默产生左右不一致的菜单
    • checkmark 把选中态指示器从文案右侧移到左侧,对齐 Ghost trigger 菜单项 Figma 变体;item 内边距相应从预留右侧空间改为预留左侧空间
    • 范围:仅组合式 SelectContent/SelectItem 与声明式非 searchable 分支——searchable 单选已通过 SearchableOptionItem 支持左/右置对勾

🐛 缺陷修复​

  • Calendar — 月/年下拉打开时定位并聚焦到当前月/年 (WEB-1295) (详情)
    • 月/年下拉(CalendarMonthCaption)用 Radix DropdownMenu 渲染,打开时默认聚焦列表首项,年份下拉(当前年 ±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 且依赖稳定,只在挂载时跑一次;而 Radix Content 的 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)可复用该工具
    • 补充工具单测

🐛 缺陷修复​

  • Dialog — Modal 背景改用 Grays/White token,dark mode 从近黑恢复为 #292929 (WEB-1244) (详情)
  • Select — 修复下拉自动滚到选中项时顶部首项被裁切 (WEB-1194) (详情)
    • Radix SelectPrimitive.Viewport 自带 inline overflow: 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]
  • 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 伪类效果
  • 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)不变
    • 所有使用结构化 title prop 的弹窗标题字重统一变为 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])

v0.6.4​

🐛 缺陷修复​

  • Toast — 带标题(Alert)变体顶部 padding 由 8px 调整为 12px (WEB-1128) (详情)
    • 仅 Alert 形态顶部;Message 形态与左右/底部 padding 不变

v0.6.3​

🐛 缺陷修复​

  • DropdownMenu — 级联子菜单样式调优 (WEB-1129) (详情)
    • 向 IconRegistry 新增必填 key listChevronRight(破坏性:图标 registry 必须补 icon_list_chevron_right 实现)
    • 级联箭头改用 ListChevronRightIcon,20px 容器,Labels/Primary
    • SubContent 默认 sideOffset={-8} / alignOffset={-8}(叠在父菜单之上 + 首项对齐父级选项)
    • SubTrigger 展开态背景覆盖为 Grays/Gray-1(修复展开时黑底)
    • 前置图标容器默认 Labels/Primary(业务传入 node 可覆盖)

v0.6.2​

🐛 缺陷修复​

v0.6.1​

🐛 缺陷修复​

v0.6.0​

✨ 新功能​

  • Select / MultiSelect — 新增图标支持、menuItemVariant 与搜索图标开关;SearchableOptionItem 新增 variant prop('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)

🐛 缺陷修复​

v0.5.0​

✨ 新功能​

  • ImageViewer — 放大后支持鼠标拖拽平移;zoom > 1 时可拖拽图片定位局部区域,光标自动切换为 grab / grabbing;含边界约束,图片不会被拖出视口;切图、缩小到默认倍率或关闭时平移量自动复位(WEB-1062)

🐛 缺陷修复​

v0.4.6​

🐛 缺陷修复​

v0.4.5​

🐛 缺陷修复​

v0.4.4​

🐛 缺陷修复​

v0.4.3​

🐛 缺陷修复​

  • Dialog — showClose 为 true(默认)时,DialogTitle 增加右侧留白(--Spacing_40),防止长标题被关闭按钮遮挡。

v0.4.2​

🐛 缺陷修复​

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​

✨ 新功能​

v0.2.2​

🐛 缺陷修复​

  • Input —— Input 家族 PR review 修复,记录在 Input 新增 allowClear + 补充 visual case。useClearableInput 改用原生 value setter + 真实 input 事件派发(完整 SyntheticEvent);InputSearch 清空按钮补 focus-visible 焦点环;仅 allowClear 时托管聚焦态;新增可本地化的 clearButtonAriaLabel prop。

v0.2.1​

🐛 缺陷修复​

v0.2.0​

✨ 新功能​

🐛 缺陷修复​

v0.1.0​

Skeleton 重构与若干组件细化(大部分已被上方更详细的 v0.2.0 条目覆盖)。

✨ 新功能​

  • Skeleton —— 重构支持 items 多块渲染,新增 SkeletonGroup 卡片级扫光。
  • Button —— 对齐 icon-only 状态。
  • Dialog —— 支持可滚动内容。
  • Checkbox / RadioGroup / Menu / Slider —— 样式与行为细化。
  • utils —— 新增 merge-refs helper,并从包入口导出。

🐛 缺陷修复​

  • Button —— 修复 disabled label 样式。

v0.0.1​

首次发布 —— 将 design 包发布到私有源。@plaud/design-tokens 与 @plaud/design 以构建产物 dist 形态发布(0.0.1)。

Pre-release​

早于 changeset 发布流程的变更 —— 未单独发版。

✨ 新功能​

🐛 缺陷修复​

关联​