Skip to content

fix(x-pro): swap the message-scroller rail preview without a crossfade - #259

Merged
cc-hearts merged 1 commit into
mainfrom
fix/x-pro-message-scroller-rail-preview-swap
Oct 19, 2026
Merged

cc-hearts merged 1 commit into
mainfrom
fix/x-pro-message-scroller-rail-preview-swap

Conversation

@cc-hearts

Copy link
Copy Markdown
Member

🤔 本次变更属于 ...

  • 🐞 Bug 修复
  • 🆕 新功能
  • 📝 站点 / 文档改进
  • 📽️ Demo 改进
  • 💄 组件样式改进
  • 🤖 TypeScript 类型定义改进
  • 📦 包体积优化
  • ⚡️ 性能优化
  • ⭐️ 功能增强
  • 🌐 国际化
  • 🛠 重构
  • 🎨 代码风格优化
  • ✅ 测试用例
  • 🔀 分支合并
  • ⏩ 工作流
  • ⌨️ 无障碍改进
  • ❓ 其他(请说明)

🔗 相关 Issue

无 Issue。参考实现:https://beui.dev/components/agents/message-scroller

💡 背景与方案

问题:MessageScroller 开启 navigation="rail" 后,悬停 / 触屏 / 聚焦切换刻度时,预览浮层的文案出现重影——半透明的新卡片透出旧文案,两个标题同时可读。

根因:预览卡片用 <Transition> 默认模式做交叉淡入淡出,新旧两张卡片在切换期间同帧共存,且都钉在预览轨道同一个网格单元里(#238 的钉格正是为此服务),位置完全重合。

方案:逐帧实测参考实现 beUI MessageScroller 的 rail 行为后对齐之——全程只有一张卡片,文案在一帧内直接落到新激活项,卡片位置由轨道 transform 连续滑行,没有叠字。因此:

  • message-scroller/index.tsx:去掉预览卡片的 <Transition>(及随行的 key),内容即换即走;translateY 滑行保持不变。
  • message-scroller/style/index.ts:删除 preview-motion 的 enter/leave/active 规则、reduced-motion 对应项、只为「两张卡不叠行」存在的 grid-area: 1 / 1 钉格,以及不再使用的 previewMotionCls 与 FOLLOW_MOTION_EASE import。
  • tests/theme.test.ts:删除 pin 网格单元的主题测试——它存在的唯一理由(交叉淡入淡出会叠行)已消失。

验证(浏览器 rAF 逐帧实测,修复前 / 后同场景对比):

指标 修复前 修复后
同帧预览卡片数 2(旧 opacity 0.14 + blur 3.4px 垫在新 0.72 + blur 1.7px 下) 1
文案切换 ~180ms 交叉淡入淡出,重影可读 一帧内落到新激活项(opacity 1、无 filter)
位置滑行 保留 保留(transform 35 → 10.9 → -3.4 → -18 → -19.4 → -20.6,卡片 top 186 → 130)

vp test packages/x-pro 148/148 通过;vue-tsc --project tsconfig.build.json 无错。jsdom 中 Transition 被 test-utils stub,叠字这类纯视觉缺陷无法用单测固化,故以上为浏览器实测证据。

📝 变更日志

语言 变更日志
🇺🇸 英文 fix(x-pro): MessageScroller rail preview swaps its text instantly between entries instead of crossfading two stacked cards, matching the reference implementation
🇨🇳 中文 fix(x-pro): MessageScroller 导轨预览卡片切换时即时更换文案,不再交叉淡入淡出两张叠放的卡片,与参考实现一致

`Transition` 默认模式在切换期间同时保留新旧两张预览卡片,二者钉在轨道同一个
网格单元里交叉淡入淡出:半透明的新卡片透出旧文案,切换瞬间浮层出现重影。

逐帧实测参考实现 beUI MessageScroller 的 rail:全程只有一张卡片,文案在一帧内
直接落到新激活项,卡片位置由轨道连续滑行——没有叠字。这里对齐该行为:去掉预览
卡片的 `Transition`,内容即换即走,`translateY` 滑行保留。

随之删除只为「两张卡不叠行」服务的 `grid-area: 1 / 1` 钉格(#238 引入,交叉淡入
淡出消失后该约束已无对象)、`preview-motion` 的 enter/leave 样式、reduced-motion
对应项,以及 pin 该钉格的主题测试。
@pkg-pr-new

pkg-pr-new Bot commented Oct 19, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/antdv-next/x/@antdv-next/x@259
npm i https://pkg.pr.new/antdv-next/x/@antdv-next/x-markdown@259
npm i https://pkg.pr.new/antdv-next/x/@antdv-next/x-sdk@259

commit: 03ce83f

@codecov

codecov Bot commented Oct 19, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@cc-hearts
cc-hearts merged commit 6a32216 into main Oct 19, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant