SuperAPI AI 工具集

ss-motion

前端与建站

查看项目

更新于 10-15 14:43

技能介绍

用途

ss-motion 是 StyleSeed 体系中的一个动效应用技能,用于把一套命名动效(motion)套用到 React 组件上。它面向使用 framer-motion 的项目,帮助开发者按统一的「个性」和「动作」来添加交互动效,而不是每次手写参数。

主要能力

五套个性种子(Seeds)

技能内置五套种子,每套代表一种动效性格:

  • Spring:bouncy、springy、playful、energetic、alive
  • Silk:smooth、silky、fluid、elegant、composed、continuous
  • Snap:snappy、quick、instant、decisive、sharp、precise
  • Float:floaty、gentle、weightless、dreamy、ambient、drifting
  • Pulse:rhythmic、punchy、pulsing、heartbeat、beat

技能会先把用户的描述词或品牌名映射到其中一套种子。例如「Toss style」「Arc style」对应 Spring,「Stripe style」「Notion style」对应 Silk,「Linear style」「Raycast style」「Vercel style」对应 Snap。若用户明确说出种子名,则按原样采用。

关键词动作库(Named motion keywords)

除种子外,动作库还提供带唯一关键词的专属动作,每个关键词都有可直接运行的代码片段:

  • toggle-flip:3D Y 轴卡片翻转
  • toggle-slide:滑动堆叠切换
  • toggle-morph:胶囊 ⇄ 圆形形变
  • toggle-curtain:自上而下 clip-path 擦除
  • reveal-blur:blur(12px)→0 聚焦进入
  • reveal-rise:遮罩 clip-path 文字上升
  • reveal-unfold:从顶边 scaleY 展开
  • pop-in:从 0 弹性过冲
  • press-squish:缩小 + 倾斜
  • tap-ripple:点击处径向涟漪
  • pulse-beat:循环缩放脉冲
  • wiggle:快速水平抖动
  • shimmer:骨架屏加载扫光
  • stagger-cascade:子元素依次淡入上升

使用场景推荐(Recommend mode)

当用户描述的是「这是什么」(如点赞按钮、弹窗、加载状态、信息流条目)而非感觉时,技能会从使用场景映射表中推荐动效,例如:主按钮/CTA 按下用 spring·press;弹窗/对话框进入用 silk·entrance;下拉/弹出菜单用 snap·entrance;列表/信息流条目出现用 stagger-cascade;点赞/收藏用 like-burst;加载/骨架屏用 shimmer;成功/确认用 pop-in;开关/标签切换用 toggle-flip;页面/路由切换用 silk·entrance;数字/余额/KPI/价格展示则不做动画。

两条反规则

  • 一个产品只用一套种子:若项目已使用某套种子,应保持一致,不引入第二种性格。
  • 绝不延迟内容:不要给余额、价格或搜索结果加进入动画;动效用于可感知的交互提示,而非内容本身。

使用方式

技能按以下步骤应用动效:

  1. 读取目标文件,定位用户所指的 JSX 元素(通常是 button、div、Card 等)。
  2. 确认导入路径:组件文件需能从 "framer-motion" 导入 motion(退出动效还需 AnimatePresence),并从 "@engine/motion" 导入所选种子;若项目未使用 @engine/* 别名,则用指向 engine/motion 的相对路径。
  3. 把目标标签替换为 <motion.X> 并展开种子的配方,例如:
// hover 示例
<motion.button {...spring.hover}>Save</motion.button>

// press + hover 组合
<motion.button {...spring.press} {...spring.hover}>Save</motion.button>

// entrance(挂载)
<motion.div {...silk.entrance}>...</motion.div>

// exit(需在树上某处有 AnimatePresence 包裹)
<AnimatePresence>
  {open && <motion.div {...silk.entrance} {...silk.exit} />}
</AnimatePresence>

// layout(FLIP)
<motion.div {...snap.layout}>...</motion.div>

注意:不要把参数内联展开,始终以展开(spread)方式引用配方。

  1. 在长时间运行的界面上尊重 prefers-reduced-motion:一次性交互(hover/press)framer-motion 已做节流;对于长驻页面的挂载/退出/布局序列,从 @engine/motion 导入 usePrefersReducedMotion 和 REDUCED_TRANSITION,在开启减弱动效时覆盖 transition。
  2. 重新读取文件校验 JSX 仍可解析(括号匹配、motion 标签闭合、若用了 exit 则 AnimatePresence 就位)。
  3. 告知用户所应用的种子与上下文,并推荐一个可能想接着加的关联上下文。

上下文检测

技能会从提示中推断五种上下文之一:hover(悬停)、press(按下/点击)、entrance(出现/挂载)、exit(离开/关闭,需 AnimatePresence)、layout(布局变化/FLIP)。若含糊则默认 entrance;若多种合理(如按钮同时需要 hover 和 press),则两者都应用。

注册表优先的产物边界

当 .styleseed/project.json 与 .styleseed/artifacts/index.json 存在时,先解析请求的 artifact ID,然后只读取 .styleseed/bundles/<artifact-id>.md 和 .styleseed/manifests/<artifact-id>.json。注册表项目绝不回退到全局旧版 bundle。仅当不存在注册表时,旧版项目才可使用 .styleseed/effective-rules.md。

默认处理

  • 未给文件 → 询问「哪个文件?」
  • 无感觉词 → 询问「有感觉词、品牌或种子名吗?」
  • 感觉为「natural」或「像真实应用」→ 默认 Silk(五套中最稳妥)
  • 元素是 CTA 按钮 → 同时应用 press

适用场景

适用于使用 framer-motion 的 React 项目,需要为单个组件添加统一风格的进入、悬停、按下、退出或布局动效时。也适用于用户给出感觉词、品牌名或具体动作关键词,希望快速套用一致动效的场景。

限制

  • 不适用于通用 framer-motion 文档或学习,请访问 framer-motion 官网。
  • 不处理非 React 动效(纯 CSS 过渡、GSAP)。本技能只针对 motion.X JSX。
  • 不处理完整滚动联动时间线或视差效果(超出范围)。这类效果在营销/落地/品牌页允许(DESIGN-LANGUAGE §43 Cinematic tier),但需用滚动库直接构建,而非本技能;在应用/数据界面则禁止。
  • 不用于微调已有的 FadeIn/FadeUp/Stagger 包装器,那应直接编辑 engine/components/ui/motion.tsx。
  • 禁止发明新种子名(恰好只有五套)。
  • 禁止从本技能编辑 engine/motion/seeds/*.ts(这些是手工校准的)。
  • 禁止引入第三方动画库(gsap、anime.js)。StyleSeed 只针对 framer-motion。
  • 禁止通过本技能添加滚动联动、视差或无限动画(骨架脉冲除外)。
  • 若用户说的关键词不存在,应建议表中最近的真实关键词,绝不发明关键词。

其他说明

使用本工作流前,需先执行每会话一次的更新预检(update preflight)。