maxesisnclaw/dsh-force-motion

dsh-force-motion

Keep DeepSeek Harness UI animations running despite prefers-reduced-motion / 强制开启 dsh 界面动效

待分类animationdeepseekdeepseek-harness

dsh-force-motion

English | 中文

即使浏览器报告 prefers-reduced-motion: reduce,也让 DeepSeek Harness(dsh)的界面动效照常播放。

问题

dsh 在两处遵守"减少动态效果"偏好,于是只要系统/浏览器报告了它,所有动效都会静住:

  1. CSS —— 每个动效元素都带一条守卫:

    @media (prefers-reduced-motion: reduce) {
      .turnStatus { background-position: 0 0; background-size: 100% 100%; animation: none }
    }
    

    这样的规则共 7 条,覆盖「深度求索中…」的状态 shimmer、命令行 sweep、turn mark、推理行扫描、重试 shimmer。结果就是那行状态变成静态渐变——看着像发光,但永远不动。

  2. JS —— 部分渲染逻辑会读 matchMedia("(prefers-reduced-motion: reduce)").matches 走静态分支。

这个插件做什么

不改 node_modules 下任何文件。只在服务端渲染的 index 页注入一段脚本:

  • 包装 matchMedia,让 reduced-motion 查询永不匹配;
  • 从所有同源样式表里删除 prefers-reduced-motion 规则(并在新的 <style>/<link> 出现时重跑),于是基础动画声明重新生效。

效果:全部动效恢复,且不依赖 dsh 打包后的类名/关键帧哈希,升级后依然有效。

安装

dsh plugin --profile web add github:maxesisnclaw/dsh-force-motion

手工安装:把本目录拷到 <dsh 安装目录>/plugins/,在 $DSH_HOME/cordis.patch.yml 追加:

- insert:
    - id: force-motion
      name: /绝对路径/dsh-force-motion/index.js

然后重启 dsh。

取舍

这是有意覆盖无障碍偏好的做法,适用于"机器上开了减少动态效果但本人想要动效"的场景。 卸载插件,或在应用启动前设 window.__dshForceMotion = false,即可恢复标准行为。

验证

  • 模型思考时那行状态应该是流动的 shimmer,而不是静止渐变。
  • Console:matchMedia('(prefers-reduced-motion: reduce)').matches 返回 false,并可见插件日志 dsh-force-motion: reduced-motion suppression neutralised。
  • 单元测试:npm test。

License

MIT