# pixel2motion
**Repository Path**: K_a1/pixel2motion
## Basic Information
- **Project Name**: pixel2motion
- **Description**: pixel2motion的Motion only网页操作版
配合UI组件库使用
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-20
- **Last Updated**: 2026-08-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Pixel2Motion Motion Studio Web
Motion Studio 是 Pixel2Motion Motion-Only 的本地 Web 工作台。内置规则式特色编排,
可选接入 OpenAI 兼容协议的 AI 模型生成 Motion;所有产物统一过 Motion 契约校验。
## 运行
要求 Node.js 20.19 或更高版本。
```bash
npm install
npm run dev
```
访问 `http://127.0.0.1:4178`。
生产模式:
```bash
npm run build
npm start
```
可通过 `P2M_HOST` 和 `P2M_PORT` 环境变量调整监听地址。
## 架构
```text
Browser UI
→ POST /api/svg/analyze
→ POST /api/motion/generate(可选 options.style)
→ POST /api/motion/ai(可选,OpenAI 兼容协议)
→ motion_engine/(规则 / AI → contract.mjs 校验)
→ DLC MotionDefinition[]
```
- `motion_engine/svg.mjs`:SVG XML 解析、静态化、结构分析、目标清单和 SHA-256 hash。
- `motion_engine/generate.mjs`:规则式、无事件绑定的 CSS Motion 候选;`options.style` 支持集合特色编排。
- `motion_engine/set_styles.mjs`:flexpop / freehand / plump / colos 四套集合特色编排与 auto 推断。
- `motion_engine/contract.mjs`:Motion 契约校验器(镜像 dlc-icon `normalizeIconMotion`)。
- `web/backend/ai.mjs`:OpenAI 兼容协议的 AI 生成路径(可选)。
- `schemas/dlc-motion.schema.json`:稳定的 DLC MotionDefinition JSON Schema。
- `docs/MOTION_CONTRACT.md`:Motion 创作契约(单一事实来源)。
- `web/backend/server.mjs`:开发/生产共用 API 和静态服务入口。
- `web/frontend/`:上传、粘贴、预览、速度/次数、事件映射和导出。
原来的 `scripts/` 保持独立,仍可用于 Motion-Only 检查、gallery 和确定性 QA。
## API
### `POST /api/svg/analyze`
```json
{
"svg": ""
}
```
响应包含:
- `sanitizedSvg`:移除主动内容后的静态 SVG;不改 path、viewBox、fill、stroke。
- `svgHash`:安全静态 SVG 的 SHA-256。
- `analysis`:尺寸、path/group 数量、ID、可动画目标和警告。
### `POST /api/motion/generate`
```json
{
"svg": "",
"options": { "count": 3, "style": "auto" }
}
```
`count` 支持 1~5(仅经典预设生效)。`options.style` 支持:
| style | 说明 |
| --- | --- |
| `auto` | 按 SVG 特征自动推断(渐变→plump、≥3 色槽→colos、描边主导→freehand、其余→flexpop)。 |
| `flexpop` | 整体 squash-and-stretch 弹跳 + 部件错峰弹入。 |
| `freehand` | 手绘感小幅旋转抖动 + 部件级联。 |
| `plump` | 软果冻挤压回弹 + `filter` 微光感。 |
| `colos` | 多部件级联入场 + 轻微 `hue-rotate` 点缀。 |
| `legacy` / 不传 | 经典五预设(默认行为不变)。 |
集合特色路径输出单个针对性 Motion,选择器使用 dlc-icon 原生 gate(见
`docs/MOTION_CONTRACT.md`),可直接烘焙进组件库。响应额外包含解析后的 `style`。
### `GET /api/ai/config`
返回 AI 是否已配置(环境变量层)与默认模型提示,不泄露 API key。
### `POST /api/motion/ai`
```json
{
"svg": "",
"options": { "style": "colos" },
"ai": { "baseUrl": "...", "apiKey": "...", "model": "..." }
}
```
走 OpenAI 兼容 Chat Completions 协议。配置优先级:请求体 `ai`(前端面板,
仅存浏览器 localStorage)> 环境变量 `P2M_AI_BASE_URL` / `P2M_AI_API_KEY` /
`P2M_AI_MODEL`。示例:
- DeepSeek:`https://api.deepseek.com/v1`
- 阿里百炼:`https://dashscope.aliyuncs.com/compatible-mode/v1`
- Anthropic 原生协议不在内置支持之列,请通过网关转成 OpenAI 兼容协议后接入。
AI 原文解析后先过 `contract.mjs` 校验;校验失败会返回明确错误与模型原文,便于重试。
## MotionDefinition
```json
{
"id": "expressive-nod",
"name": "Expressive Nod",
"kind": "css",
"source": "pixel2motion",
"activation": "expressive-nod",
"css": "...",
"duration": 820,
"iterations": 1,
"targets": [
{ "selector": "#face", "name": "face", "role": "primary" }
],
"suggestedEvents": ["hover", "click"],
"svgHash": "..."
}
```
`kind: "css"` 是现有 `dlc-icon` 的必填字段。`suggestedEvents` 仅提供建议,Motion CSS 不包含 `:hover`、点击监听或自动挂载逻辑。
Web 候选区的“预览速度 / 预览次数”会通过 `--p2m-duration` 与
`--p2m-iterations` 真实控制 iframe 中的 CSS 播放,但不会修改或覆盖导出的
`duration / iterations / css`。最终接入 `dlc-icon` 时,应在对应事件上配置:
```js
clickAnm: { anm: defineIconMotion(motionJson), speed: 1.5, count: 2 }
```
`targets`、`suggestedEvents`、`svgHash` 属于生成、推荐和结构校验元数据;可以随整份
Motion JSON 一起传给 `defineIconMotion()`,但不参与动画播放。单 Motion JSON 是
`defineIconMotion()` 的输入;`04 / ROUTE & EXPORT` 的 bundle manifest 则是多 Motion
交付清单,不能把整个 manifest 当成一个 MotionDefinition。
### ID 唯一性
生成 ID 使用 `<动作特征>-