Files
ttstd-infinite-canvas/web/src/lib/aceternity-motion.ts
sikongyue d2741f39f3 feat(canvas): 动效系统与响应式适配 - token落地+断点体系+无障碍 #99
基于 Wayfinder #99 决议,完成动效/响应式/无障碍三大维度落地:

1. 动效 token 迁移(CSS 动画)
   - 33 处 easing 替换为 var(--motion-ease-out/in-out/linear)
   - 7 处有限动画 duration 替换为 var(--motion-dur-*-calc)
     (含 motion-scale 降级,自动联动 prefers-reduced-motion)
   - canvas-node batch 动画内联值替换为 token

2. aceternityMotion 对齐 + motion/react 硬编码替换
   - 添加 JS↔CSS token 映射文档注释
   - 3 处 motion/react 硬编码 duration 替换为 aceternityMotion.* 引用

3. infinite 装饰动画 reduced-motion 降级
   - L1 (prefers-reduced-motion): 缩短至 0.01ms + 单次播放
   - L2 (.no-motion): animation: none 完全禁用
   - 覆盖 9 个 infinite 动画类(连线流光/边框流光/极光标题等)

4. 响应式断点体系
   - @theme 新增 3 断点 token: --breakpoint-tablet(768)/desktop(1024)/wide(1440)
   - 修复 canvas-toolbar 外观面板缺 max-w 导致移动端溢出

5. 无障碍
   - 画布页新增 skip-to-content 链接(键盘用户跳过侧栏直达画布)
   - 任务进度面板 aria-live="polite"(屏幕阅读器播报任务数变化)

Closes #99
2026-08-03 22:38:31 +08:00

32 lines
1003 B
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 动效配置(对应 #99 动效系统)
*
* JS 侧 duration(秒)与 CSS token(毫秒)映射关系:
* instant 0.12s ≈ --motion-dur-fast (150ms)
* state 0.20s ≈ --motion-dur-fast (150ms)
* panel 0.32s ≈ --motion-dur-base (250ms)
*
* easing 与 CSS token 映射:
* enter [0.2, 0.85, 0.18, 1] ≈ --motion-ease-out
* exit [0.4, 0, 1, 1] ≈ --motion-ease-in
*
* prefers-reduced-motion 由组件层 useReducedMotion() 控制,
* CSS 层由 --motion-scale 联动(L0=1 / L1=0.3 / L2=0)。
*/
export const aceternityMotion = {
duration: {
instant: 0.12,
state: 0.2,
panel: 0.32,
},
spring: {
dock: { mass: 0.12, stiffness: 220, damping: 18 },
surface: { mass: 0.32, stiffness: 280, damping: 26 },
panel: { mass: 0.42, stiffness: 320, damping: 28 },
},
easing: {
enter: [0.2, 0.85, 0.18, 1] as const,
exit: [0.4, 0, 1, 1] as const,
},
} as const;