dsh-motion 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,82 @@
1
+ # 确认门清单
2
+
3
+ 在写完整场景、出全片之前,逐项确认。每一轮只推进一项;用户改了哪项,就回到哪项重确认。
4
+
5
+ ## 0. 选模式
6
+
7
+ | 模式 | 适用 | 阶段 |
8
+ |---|---|---|
9
+ | `light` | ≤15 s、无旁白、一个结论 | 需求 → 脚本+分镜 → 视觉 → 开工 |
10
+ | `standard` | 15–60 s,或有旁白 | 需求 → 脚本 → 分镜 → 视觉 → 交付 → 开工 |
11
+ | `full` | >60 s、多段、复杂旁白 | 需求 → 脚本 → 分镜 → animatic → 视觉 → 交付 → 开工 |
12
+
13
+ `light` 把“脚本”和“分镜”合成一张表:每个镜头一行,写秒数、画面、上屏文字/公式。
14
+
15
+ ## 1. 需求
16
+
17
+ - [ ] 画幅与像素:16:9 / 9:16 / 1:1
18
+ - [ ] 时长
19
+ - [ ] 交付:先出帧 / 静音 mp4 / 旁白 + 字幕(HF)
20
+ - [ ] 风格(或“你决定”)
21
+ - [ ] 受众(数学/科学题材)
22
+ - [ ] 旁白语言与声音(仅旁白交付)
23
+
24
+ ## 2. 脚本 / 文案
25
+
26
+ | # | 旁白(逐句) | 上屏文字 | 公式 | 备注 |
27
+ |---|---|---|---|---|
28
+ | 1 | | | | |
29
+
30
+ - 公式先过 `formula_check`;
31
+ - 旁白按“一句一个意思”拆,标出预计秒数;
32
+ - 没有旁白就只填上屏文字与公式。
33
+
34
+ ## 3. 分镜
35
+
36
+ | # | 起止秒 | 画面 | 运动 | 字幕 / 旁白 | 验收点 |
37
+ |---|---|---|---|---|---|
38
+ | 1 | 0.0–2.0 | | | | |
39
+
40
+ - 镜头数按内容定,不为了凑时长加镜头;
41
+ - 每个镜头写清“观众看到什么变化”;
42
+ - 结论镜头要留够阅读时间(≥1.2 s)。
43
+
44
+ ## 4. 视觉
45
+
46
+ - [ ] `DESIGN.md`:颜色、字体、禁用项、参考
47
+ - [ ] 3 张风格帧:开场 / 转折 / 结论(真实代码出帧,不渲染视频)
48
+ - [ ] 风格帧通过 `motion_frames` 的 layout 检查
49
+
50
+ ## 5. 交付清单
51
+
52
+ - [ ] 尺寸 / fps / 时长
53
+ - [ ] 文件:mp4 / `.srt` / 场景源码 / DESIGN.md / 分镜表
54
+ - [ ] 音频:无 / 旁白 / 音乐;响度目标
55
+ - [ ] 字幕:烧录 / 外挂 / 两者
56
+
57
+ ## 6. 账本
58
+
59
+ ```bash
60
+ node scripts/approvals.mjs init <project> --mode light
61
+ node scripts/approvals.mjs set <project> <stage> approved --note "用户确认"
62
+ node scripts/approvals.mjs check <project>
63
+ ```
64
+
65
+ `check` 未全部 approved 时退出 1;不能跳过前置阶段;`start` 必须是用户明确授权。
66
+
67
+ ## 7. 开工指令
68
+
69
+ 只有用户**明确**说出下面这类话,才进入执行:
70
+
71
+ - “可以开始”
72
+ - “开始做”
73
+ - “按这个执行”
74
+ - “开工”
75
+
76
+ 以下**不算**整体开工:
77
+
78
+ - 对某个选项说“好 / 可以 / 行”;
79
+ - 确认了脚本或分镜;
80
+ - 说“看着办”但没有明确授权执行。
81
+
82
+ 不确定时问一句:“脚本、分镜、风格帧都确认了,现在开始执行吗?”
@@ -19,6 +19,16 @@ HyperFrames 的 look 文档原话:**不给外部输入,相同的 brief 每
19
19
  | 4 | 主题自身的世界 | ✅ 年代、材质、展示场景 |
20
20
  | 5 | 官方预设(preset) | ⚠️ 幻灯片语言,仅点名或做 deck 时用 |
21
21
 
22
+ ## 先路由
23
+
24
+ 写 spec 之前先过需求卡点:`node scripts/plan-questions.mjs "<brief>" --json`。它会推断画幅、交付、风格的候选项(选项来自 `styles/registry.json`,不是固定清单),能推断的不问。
25
+
26
+ 风格:点名优先;没有点名就按 `styles/registry.json` 打分;`high` 才直接写,`medium`/`low` 先给用户 top 2–3 确认。
27
+
28
+ ## 确认门
29
+
30
+ `DESIGN.md` 和 3 张风格帧属于确认门的“视觉”阶段:先有确认过的脚本与分镜,再做视觉。按 `gateMode` 分档(`light` 合并脚本+分镜,`standard` 分开,`full` 加 animatic)。用户明确说“可以开始”之前,不要写完整场景、不要渲染成片。流程与账本见 [animation-router](../animation-router/SKILL.md) 的 §4。
31
+
22
32
  ## 最小形态
23
33
 
24
34
  ```markdown
@@ -60,7 +70,7 @@ DESIGN.md 写完不等于风格成立。挑 3 个关键时刻(开场、转折
60
70
  - 三张里至少一张是 signature shot;
61
71
  - 两轮还不对,就换更接近的参考语法,而不是继续调参。
62
72
 
63
- ## 六种已验证的语言
73
+ ## 八种已验证的语言
64
74
 
65
75
  | 语言 | 适合 | 关键手段 |
66
76
  |---|---|---|
@@ -70,15 +80,19 @@ DESIGN.md 写完不等于风格成立。挑 3 个关键时刻(开场、转折
70
80
  | 瑞士动态排版 | 公式 / 概念 | 12 栏网格、单一信号色、精确缓动 |
71
81
  | 数据叙事 | 数据 / 科学 | 图表操作即转场、注释钉在数据上、蓝红语义 |
72
82
  | 蓝图工程制图 | 几何 / 工程 | 青晒纸、白线、制图顺序、一次红印章 |
83
+ | 白板讲解 | 科学 / 课程 | 暖白板、三色马克笔、书写顺序 |
84
+ | 3b1b 暗场数学 | 线代 / 微积分 | 近黑底、蓝黄语义、先直觉后公式 |
73
85
 
74
- 本仓库现有三套,全部改编自 [Lemo-Opuscar](https://github.com/lemomo-ai/lemo-opuscar)(MIT):
86
+ 本仓库现有五套,除 `3b1b` 外均改编自 [Lemo-Opuscar](https://github.com/lemomo-ai/lemo-opuscar)(MIT):
75
87
 
76
88
  - [`styles/swiss-motion/`](../../styles/swiss-motion/):公式/排版,默认;
77
89
  - [`styles/dataviz/`](../../styles/dataviz/):图表/数据;
78
- - [`styles/blueprint/`](../../styles/blueprint/):几何/工程。
90
+ - [`styles/blueprint/`](../../styles/blueprint/):几何/工程;
91
+ - [`styles/whiteboard/`](../../styles/whiteboard/):科学/白板讲解;
92
+ - [`styles/3b1b/`](../../styles/3b1b/):暗场数学(Manim 社区 3b1b skill)。
79
93
 
80
94
  规范在 `STYLE.md`,数值在 `tokens.json`,`theme.py` 提供 `apply_config()` 与 `backdrop()`。
81
- 项目 `DESIGN.md` 里写 `style: swiss-motion`(或 `dataviz` / `blueprint`)与 `style_version: 1.0.0`。
95
+ 项目 `DESIGN.md` 里写 `style: swiss-motion`(或 `dataviz` / `blueprint` / `whiteboard` / `3b1b`)与 `style_version: 1.0.0`。
82
96
 
83
97
  参考与示例统一从 HyperFrames 取:[examples](https://hyperframes.heygen.com/examples)、
84
98
  [catalog](https://hyperframes.heygen.com/catalog)、[frame.md](https://hyperframes.heygen.com/prompting/design-systems)。
@@ -5,6 +5,15 @@ description: 代码动画的自检清单:环境、公式、画面、音频、
5
5
 
6
6
  # 交付前自检
7
7
 
8
+ ## 0. 迭代预算
9
+
10
+ - 首帧 ≤60 s;总时长 ≤400 s(30 s 片);
11
+ - 输出 tokens ≤30k,上下文 ≤100k;
12
+ - 每次迭代 1 张 contact sheet,读图 ≤10 次;
13
+ - 全文件重写 0 次;`motion_probe` 1 次、`motion_render` 2 次。
14
+
15
+ 详见 [performance-budget.md](../../docs/performance-budget.md)。
16
+
8
17
  ## 1. 环境
9
18
 
10
19
  先跑 `motion_doctor`,`ready.math` 与 `ready.delivery` 都为 true 再继续。
@@ -34,6 +43,8 @@ npx hyperframes check
34
43
  ```
35
44
 
36
45
  - 返回的 storyboard PNG 逐张看过:无叠字、无出画、字号可读;
46
+ - sheet 每格顶部是 caption 条,不是画面;不要把 caption 当成"上沿被裁";
47
+ - 中文文本没有用字符级 `Transform` / `ReplacementTransform`;换词用 FadeOut + FadeIn;
37
48
  - `layoutProblems` 每一条都要处理或明确接受;
38
49
  - 已经生成了 mp4 时,才用 `motion_probe` 抽 contact sheet + 查 `blankFrames`;
39
50
  - 用了 HyperFrames 的项目,用 `npx hyperframes snapshot <project> --at 2.9,10.4` 抽帧,不要先 render 再截图。
@@ -53,3 +64,5 @@ npx hyperframes check
53
64
  ## 7. 交付
54
65
 
55
66
  mp4 + `.srt` + 场景源码 + `DESIGN.md` + 分镜表。
67
+
68
+ 开工前跑过 `node scripts/approvals.mjs check <project>`;确保 `APPROVALS.json` 里 `start` 是用户明确授权,而不是 agent 自己填的。
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: 3b1b
3
+ version: 1.0.0
4
+ source: https://github.com/subinium/3b1b-style-animation-skill
5
+ license: MIT(上游风格 skill);非 3Blue1Brown 官方项目
6
+ status: adapted
7
+ ---
8
+
9
+ # 3Blue1Brown Style · 3b1b
10
+
11
+ > 配色表取自 [subinium/3b1b-style-animation-skill](https://github.com/subinium/3b1b-style-animation-skill)(MIT);
12
+ > 教学法与动画模式参考 [adithya-s-k/manim_skill](https://github.com/adithya-s-k/manim_skill)(MIT,约 1.2k stars,是这类 skill 里用得最多的)。
13
+ > 本文件是改编,不是原样复制;只保留不变量,实现换成 manimgx。
14
+
15
+ ## 1. 定位
16
+
17
+ 先建立直觉,再给公式。画面为“暗场 + 蓝黄高亮”的数学解释:
18
+
19
+ - 适合:线性代数、微积分、概率、神经网络、算法;
20
+ - 不适合:没有“为什么”的产品宣传、角色叙事。
21
+
22
+ ## 2. 不变量
23
+
24
+ | 项 | 规则 |
25
+ |---|---|
26
+ | 底色 | `#1c1c1c`(近黑灰,**不用纯黑**) |
27
+ | 主色 | 蓝 `#3b82f6`:主对象、向量、节点 |
28
+ | 强调 | 黄 `#fbbf24`:高亮、结论、公式 |
29
+ | 语义色 | 绿 `#22c55e` 正 / 红 `#ef4444` 负 / 灰 `#9ca3af` 非活动 |
30
+ | 公式 | 黄色 `#fde047` 或白色;一屏最多 4–5 种颜色 |
31
+ | 字体 | 无衬线(Noto Sans);公式 New Computer Modern |
32
+ | 运动 | `Create` / `FadeIn` / `Transform`;相关元素**同时**出现(`LaggedStartMap` 式级联),不要一个个 `play()` |
33
+ | 收尾 | 结尾至少 `wait(2)`,给结论停留 |
34
+
35
+ ## 3. 教学法
36
+
37
+ 1. **Hook**:先问一个有意思的问题;
38
+ 2. **Intuition**:用图形建立直觉,先不写公式;
39
+ 3. **Concrete**:用一个具体数字走一遍;
40
+ 4. **Formalization**:最后才给公式/命名。
41
+
42
+ ## 4. manimgx 映射
43
+
44
+ - `theme.py`:`apply_config()` 设 `#1c1c1c`、`backdrop()` 返回平涂底;
45
+ - 用 `Axes`、`Dot`、`Arrow`、`Line`、`always_redraw` 做旋转/投影/变换;
46
+ - 用 `MathTex` 排版公式,`Text` 做标题与注释;
47
+ - manimgx 的 `Write` 已经足够接近 Manim 的 `Write`;不需要 LaTeX 环境。
48
+
49
+ ## 5. Do / Don't
50
+
51
+ **Do**
52
+
53
+ - 先画“正在发生什么”,再写“它叫什么”;
54
+ - 蓝=对象,黄=高亮/结论;颜色有语义;
55
+ - 一次只讲一个变换;结尾停 2 秒。
56
+
57
+ **Don't**
58
+
59
+ - 不用纯黑 `#000000`;
60
+ - 不用高饱和纯红/纯绿/纯蓝;
61
+ - 不在建立直觉前抛公式;
62
+ - 不把每个元素拆成单独的 `play()`。
63
+
64
+ ## 6. 与上游的差异
65
+
66
+ - 上游是 ManimCE/ManimGL skill,包含 40+ 条规则;这里只抽取配色、运动与教学法;
67
+ - 上游使用 Manim 的 `LaggedStartMap` 等 API;manimgx 用 `AnimationGroup`/`LaggedStart` 近似;
68
+ - 不是 3Blue1Brown 官方风格指南,只是社区通行做法的整理。
Binary file
@@ -0,0 +1,50 @@
1
+ {
2
+ "slug": "3b1b",
3
+ "en": "3Blue1Brown Style",
4
+ "cn": "3b1b 数学动画",
5
+ "category_en": "Math explainer",
6
+ "category_cn": "数学讲解",
7
+ "uses": [
8
+ "Linear algebra",
9
+ "Calculus",
10
+ "Probability",
11
+ "Neural networks"
12
+ ],
13
+ "source": "https://github.com/subinium/3b1b-style-animation-skill",
14
+ "secondary_source": "https://github.com/adithya-s-k/manim_skill",
15
+ "license": "MIT (style skills); unofficial tribute",
16
+ "implementation": "manimgx (theme.py + tokens.json)",
17
+ "num": "05",
18
+ "film": "Rotation on the Unit Circle",
19
+ "line": "A rotation on the unit circle that lands on e^{iθ} = cosθ + i sinθ.",
20
+ "line_cn": "单位圆上的一次旋转,收束到 e^{iθ} = cosθ + i sinθ。",
21
+ "uses_cn": [
22
+ "线代",
23
+ "微积分",
24
+ "概率",
25
+ "神经网络"
26
+ ],
27
+ "keywords": [
28
+ "向量",
29
+ "矩阵",
30
+ "特征值",
31
+ "旋转",
32
+ "复数",
33
+ "单位圆",
34
+ "线代",
35
+ "概率",
36
+ "微积分",
37
+ "神经网络"
38
+ ],
39
+ "avoid": [
40
+ "产品发布",
41
+ "纯排版"
42
+ ],
43
+ "demo": "showcase/3b1b-unit-circle",
44
+ "demo_duration_sec": 10.3,
45
+ "aspect": [
46
+ "16:9"
47
+ ],
48
+ "fps": 30,
49
+ "complexity": "medium"
50
+ }
@@ -0,0 +1,46 @@
1
+ """3b1b 1.0.0 — 3Blue1Brown 风格(Manim 社区通行做法)的 manimgx 实现层。
2
+
3
+ 来源与许可:subinium/3b1b-style-animation-skill(MIT),配色表取自其 color-scheme.md;
4
+ 方法论参考 adithya-s-k/manim_skill(MIT,1.2k stars)。不是 3Blue1Brown 官方项目。
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ from pathlib import Path
11
+
12
+ import manimgx as m
13
+
14
+ TOKENS = json.loads(Path(__file__).with_name("tokens.json").read_text(encoding="utf-8"))
15
+
16
+ # inspect 在 import 时读 config.frame_rate;必须放在模块层,不能只在 construct 里。
17
+ m.config.frame_rate = int(TOKENS["motion"]["fps"])
18
+
19
+ BG = TOKENS["colors"]["bg"]
20
+ TEXT = TOKENS["colors"]["text"]
21
+ LABEL = TOKENS["colors"]["label"]
22
+ BLUE = TOKENS["colors"]["blue"]
23
+ YELLOW = TOKENS["colors"]["yellow"]
24
+ TEAL = TOKENS["colors"]["teal"]
25
+ GREEN = TOKENS["colors"]["green"]
26
+ RED = TOKENS["colors"]["red"]
27
+ GRAY = TOKENS["colors"]["gray"]
28
+ MATH = TOKENS["colors"]["math"]
29
+ AXIS = TOKENS["colors"]["axis"]
30
+ LAYOUT = TOKENS["layout"]
31
+
32
+
33
+ def apply_config(width: int = 1920, height: int = 1080, fps: int = 30) -> None:
34
+ m.config.pixel_width = width
35
+ m.config.pixel_height = height
36
+ m.config.frame_rate = fps
37
+ m.config.background_color = BG
38
+
39
+
40
+ def backdrop() -> m.Rectangle:
41
+ """近黑灰底;3b1b 规定不用纯黑。"""
42
+ return (
43
+ m.Rectangle(width=LAYOUT["frame"]["width"], height=LAYOUT["frame"]["height"], color=BG)
44
+ .set_fill(BG, 1)
45
+ .set_stroke(width=0)
46
+ )
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "3b1b",
3
+ "version": "1.0.0",
4
+ "source": "https://github.com/subinium/3b1b-style-animation-skill",
5
+ "license": "MIT (style skill); unofficial tribute to 3Blue1Brown",
6
+ "colors": {
7
+ "bg": "#1c1c1c",
8
+ "text": "#FFFFFF",
9
+ "label": "#E5E5E5",
10
+ "blue": "#3b82f6",
11
+ "yellow": "#fbbf24",
12
+ "teal": "#14b8a6",
13
+ "green": "#22c55e",
14
+ "red": "#ef4444",
15
+ "gray": "#9ca3af",
16
+ "math": "#fde047",
17
+ "axis": "#5A5A5A"
18
+ },
19
+ "typography": {
20
+ "display": { "family": "Noto Sans", "weight": "BOLD", "size": 46 },
21
+ "body": { "family": "Noto Sans", "size": 28 },
22
+ "mono": { "family": "Menlo", "size": 18 },
23
+ "math": { "family": "New Computer Modern", "size": 64 }
24
+ },
25
+ "layout": {
26
+ "aspect": "16:9",
27
+ "frame": { "width": 14.222, "height": 8.0 },
28
+ "margin": 0.5
29
+ },
30
+ "motion": { "fps": 30, "easing": "smooth", "hold_min_seconds": 2.0 },
31
+ "audio": { "target_lufs": -14, "true_peak_db": -1 }
32
+ }
package/styles/README.md CHANGED
@@ -1,23 +1,30 @@
1
1
  # 风格库
2
2
 
3
- 可复用的视觉语言。当前有 3 套,全部**改编自 Lemo-Opuscar** 的公开风格(MIT),不是自创:
3
+ 可复用的视觉语言。当前有 5 套:4 套改编自 [Lemo-Opuscar](https://github.com/lemomo-ai/lemo-opuscar)(MIT),1 套来自 Manim 社区的 3b1b skill。都不是自创。`style.json` 是唯一事实来源;下面的表和 `registry.json` 由 `node scripts/build-style-index.mjs` 生成,不手改:
4
4
 
5
+ <!-- styles:start -->
5
6
  | 风格 | 适合 | 来源 | 入口 |
6
7
  |---|---|---|---|
7
- | `swiss-motion` / 瑞士动态排版(默认) | 公式、定义、数据结论 | [Lemo](https://github.com/lemomo-ai/lemo-opuscar/tree/main/styles/swiss-motion) | [STYLE](swiss-motion/STYLE.md) · [tokens](swiss-motion/tokens.json) · [theme](swiss-motion/theme.py) |
8
- | `dataviz` / 数据叙事 | 趋势、比较、分布、科学数据 | [Lemo](https://github.com/lemomo-ai/lemo-opuscar/tree/main/styles/dataviz) | [STYLE](dataviz/STYLE.md) · [tokens](dataviz/tokens.json) · [theme](dataviz/theme.py) |
9
- | `blueprint` / 蓝图工程制图 | 几何证明、结构、尺寸关系 | [Lemo](https://github.com/lemomo-ai/lemo-opuscar/tree/main/styles/blueprint) | [STYLE](blueprint/STYLE.md) · [tokens](blueprint/tokens.json) · [theme](blueprint/theme.py) |
8
+ | `swiss-motion` / 瑞士动态排版(默认) | 公式、定义、数据结论、排版 | Lemo-Opuscar | [STYLE](swiss-motion/STYLE.md) · [tokens](swiss-motion/tokens.json) · [theme](swiss-motion/theme.py) |
9
+ | `dataviz` / 数据叙事 | 趋势、比较、分布、科学数据 | Lemo-Opuscar | [STYLE](dataviz/STYLE.md) · [tokens](dataviz/tokens.json) · [theme](dataviz/theme.py) |
10
+ | `blueprint` / 蓝图工程制图 | 几何证明、结构、尺寸关系 | Lemo-Opuscar | [STYLE](blueprint/STYLE.md) · [tokens](blueprint/tokens.json) · [theme](blueprint/theme.py) |
11
+ | `whiteboard` / 白板讲解 | 科学解释、课程、机制说明 | Lemo-Opuscar | [STYLE](whiteboard/STYLE.md) · [tokens](whiteboard/tokens.json) · [theme](whiteboard/theme.py) |
12
+ | `3b1b` / 3b1b 数学动画 | 线代、微积分、概率、神经网络 | subinium + manim_skill | [STYLE](3b1b/STYLE.md) · [tokens](3b1b/tokens.json) · [theme](3b1b/theme.py) |
13
+ <!-- styles:end -->
10
14
 
11
15
  ## 约定
12
16
 
13
17
  - 每个风格目录:`style.json`(元数据)+ `STYLE.md`(不变量)+ `tokens.json` + `theme.py` + `preview.jpg`;
14
18
  - `STYLE.md` 是**改编**,必须在上游基础上写清楚差异;不复制 demo 代码;
15
19
  - 颜色、字体、时间表、音频以 `tokens.json` 为准;版面坐标与组件配方写在 `STYLE.md`;
16
- - 新片在自己的项目目录写 `DESIGN.md`,头部 `style: swiss-motion` + `style_version: 1.0.0`;
20
+ - 中文文本不做字符级 `ReplacementTransform` / `Transform`(会出字形碎片);用 Fade/Write/Indicate,换词用 FadeOut+FadeIn;
21
+ - `theme.py` 必须在**模块 import 时**设置 `m.config.frame_rate`(不能只在 `construct` 里),否则 `manimgx inspect` 会按默认 60fps 取帧,30fps 场景的后半段会报 no frame;
22
+ - 路由:`styles/registry.json` 是元数据,`node scripts/route-style.mjs "<题材>"` 打分;点名优先,低置信度/并列先问用户;
23
+ - 新片在自己的项目目录写 `DESIGN.md`,头部 `style: <slug>` + `style_version: 1.0.0`;
17
24
  - 参考与示例统一用 HyperFrames 的 [examples](https://hyperframes.heygen.com/examples) / [catalog](https://hyperframes.heygen.com/catalog),不在仓库里放样片(`showcase/` 只放可复现的演示)。
18
25
 
19
26
  ## 许可
20
27
 
21
- - 上游风格文档:MIT,署名 LemoLab;
28
+ - 上游风格文档:Lemo-Opuscar / subinium / adithya-s-k 均为 MIT,分别署名;
22
29
  - 上游 demo 静帧:CC BY 4.0,商用需署名;
23
30
  - 本仓库的 `theme.py` / `tokens.json` / 场景代码:MIT。
@@ -1,11 +1,47 @@
1
1
  {
2
2
  "slug": "blueprint",
3
3
  "en": "Blueprint",
4
- "cn": "蓝图 / 工程制图",
4
+ "cn": "蓝图工程制图",
5
5
  "category_en": "Graphic & Type",
6
6
  "category_cn": "图形与排版",
7
- "uses": ["Engineering", "Hardware launches", "Tech explainers"],
7
+ "uses": [
8
+ "Geometry proof",
9
+ "Structures",
10
+ "Dimensions"
11
+ ],
8
12
  "source": "https://github.com/lemomo-ai/lemo-opuscar/tree/main/styles/blueprint",
9
13
  "license": "style doc MIT; demo stills CC BY 4.0 (LemoLab)",
10
- "implementation": "manimgx (theme.py + tokens.json)"
14
+ "implementation": "manimgx (theme.py + tokens.json)",
15
+ "num": "03",
16
+ "film": "Pythagorean Triple",
17
+ "line": "A 3-4-5 triangle drawn in drafting order, stamped Q.E.D.",
18
+ "line_cn": "按制图顺序画出的 3-4-5 三角形,最后盖上 Q.E.D.",
19
+ "uses_cn": [
20
+ "几何证明",
21
+ "结构",
22
+ "尺寸关系"
23
+ ],
24
+ "keywords": [
25
+ "几何",
26
+ "证明",
27
+ "三角形",
28
+ "圆",
29
+ "角度",
30
+ "尺寸",
31
+ "工程",
32
+ "结构",
33
+ "作图",
34
+ "勾股"
35
+ ],
36
+ "avoid": [
37
+ "图表",
38
+ "手绘"
39
+ ],
40
+ "demo": "showcase/blueprint-pythagoras",
41
+ "demo_duration_sec": 6.9,
42
+ "aspect": [
43
+ "16:9"
44
+ ],
45
+ "fps": 30,
46
+ "complexity": "medium"
11
47
  }
@@ -15,6 +15,9 @@ import manimgx as m
15
15
 
16
16
  TOKENS = json.loads(Path(__file__).with_name("tokens.json").read_text(encoding="utf-8"))
17
17
 
18
+ # inspect 在 import 时读 config.frame_rate;必须放在模块层,不能只在 construct 里。
19
+ m.config.frame_rate = int(TOKENS["motion"]["fps"])
20
+
18
21
  TABLE = TOKENS["colors"]["table"]
19
22
  PAPER = TOKENS["colors"]["paper"]
20
23
  PAPER_LIGHT = TOKENS["colors"]["paper_light"]
@@ -4,8 +4,48 @@
4
4
  "cn": "数据叙事",
5
5
  "category_en": "Information & Keynote",
6
6
  "category_cn": "信息与发布",
7
- "uses": ["Data journalism", "Reports", "Climate & science"],
7
+ "uses": [
8
+ "Trends",
9
+ "Comparison",
10
+ "Distribution",
11
+ "Scientific data"
12
+ ],
8
13
  "source": "https://github.com/lemomo-ai/lemo-opuscar/tree/main/styles/dataviz",
9
14
  "license": "style doc MIT; demo stills CC BY 4.0 (LemoLab)",
10
- "implementation": "manimgx (theme.py + tokens.json)"
15
+ "implementation": "manimgx (theme.py + tokens.json)",
16
+ "num": "02",
17
+ "film": "Secant to Tangent",
18
+ "line": "A secant slides into a tangent; the slope reading falls from 2.50 to 2.00.",
19
+ "line_cn": "割线滑成切线,斜率读数从 2.50 落到 2.00。",
20
+ "uses_cn": [
21
+ "趋势",
22
+ "比较",
23
+ "分布",
24
+ "科学数据"
25
+ ],
26
+ "keywords": [
27
+ "数据",
28
+ "图表",
29
+ "趋势",
30
+ "比较",
31
+ "分布",
32
+ "导数",
33
+ "斜率",
34
+ "切线",
35
+ "割线",
36
+ "函数",
37
+ "变化率",
38
+ "统计"
39
+ ],
40
+ "avoid": [
41
+ "纯文字排版",
42
+ "角色叙事"
43
+ ],
44
+ "demo": "showcase/dataviz-secant",
45
+ "demo_duration_sec": 10.1,
46
+ "aspect": [
47
+ "16:9"
48
+ ],
49
+ "fps": 30,
50
+ "complexity": "low"
11
51
  }
@@ -13,6 +13,9 @@ import manimgx as m
13
13
 
14
14
  TOKENS = json.loads(Path(__file__).with_name("tokens.json").read_text(encoding="utf-8"))
15
15
 
16
+ # inspect 在 import 时读 config.frame_rate;必须放在模块层,不能只在 construct 里。
17
+ m.config.frame_rate = int(TOKENS["motion"]["fps"])
18
+
16
19
  PAPER = TOKENS["colors"]["paper"]
17
20
  PAPER_SHADOW = TOKENS["colors"]["paper_shadow"]
18
21
  INK = TOKENS["colors"]["ink"]