foliko 1.1.38 → 1.1.39

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.
Files changed (165) hide show
  1. package/.agent/agents/network-requester.md +44 -0
  2. package/.agent/agents/poster-designer.md +52 -0
  3. package/.agent/agents/ui-designer.md +1 -1
  4. package/.agent/data/default.json +23 -407
  5. package/.agent/data/email/processed-emails.json +1 -0
  6. package/.agent/data/plugins-state.json +103 -200
  7. package/.agent/data/web/web-config.json +5 -0
  8. package/.agent/data/weixin/images/file_1776188148383jpg +0 -0
  9. package/.agent/data/weixin/images/file_1776188458326.jpg +0 -0
  10. package/.agent/data/weixin/images/file_1776188689423.jpg +0 -0
  11. package/.agent/data/weixin/images/file_1776188813604.jpg +0 -0
  12. package/.agent/data/weixin/images/file_1776189097450.jpg +0 -0
  13. package/.agent/data/weixin/videos/file_1776188318431.mp4 +0 -0
  14. package/.agent/mcp_config.json +4 -17
  15. package/.agent/memory/user/mof6gk94-kneeuh.md +9 -0
  16. package/.agent/package.json +8 -0
  17. package/.agent/plugins/marknative/README.md +134 -0
  18. package/.agent/plugins/marknative/fonts/SegoeUI Emoji.ttf +0 -0
  19. package/.agent/plugins/marknative/fonts.zip +0 -0
  20. package/.agent/plugins/marknative/index.js +256 -0
  21. package/.agent/plugins/marknative/package.json +12 -0
  22. package/.agent/plugins/test-plugin.py +99 -0
  23. package/.agent/plugins.json +11 -5
  24. package/.agent/python-scripts/test_sample.py +24 -0
  25. package/.agent/sessions/cli_default.json +2890 -18
  26. package/.agent/sessions/default.json +82 -0
  27. package/.agent/sessions/qq_c2c_D960F12877541624D7B2C836110B3D0F.json +25 -0
  28. package/.agent/sessions/test-clean.json +26 -0
  29. package/.agent/sessions/test-compress.json +1462 -0
  30. package/.agent/sessions/test-session.json +13 -0
  31. package/.agent/sessions/weixin_test.json +22 -0
  32. package/.agent/sessions/weixin_test_user_123.json +11 -0
  33. package/.agent/skills/agent-browser/SKILL.md +311 -0
  34. package/.agent/skills/agent-browser/TEST_PLAN.md +200 -0
  35. package/.agent/skills/sysinfo/SKILL.md +38 -0
  36. package/.agent/skills/sysinfo/system-info.sh +130 -0
  37. package/.agent/skills/workflow/SKILL.md +324 -0
  38. package/.agent/test-agent.js +35 -0
  39. package/.agent/weixin.json +6 -0
  40. package/.agent/workflows/email-digest.json +50 -0
  41. package/.agent/workflows/file-backup.json +21 -0
  42. package/.agent/workflows/get-ip-notify.json +32 -0
  43. package/.agent/workflows/news-aggregator.json +93 -0
  44. package/.agent/workflows/news-dashboard-v2.json +94 -0
  45. package/.agent/workflows/notification-batch.json +32 -0
  46. package/.claude/settings.local.json +2 -1
  47. package/.env.example +56 -56
  48. package/README.md +441 -441
  49. package/cli/src/utils/debounce.js +6 -3
  50. package/docs/qq-bot.md +976 -0
  51. package/package.json +2 -1
  52. package/plugins/qq-plugin.js +939 -0
  53. package/skills/find-skills/AGENTS.md +162 -162
  54. package/skills/find-skills/SKILL.md +133 -133
  55. package/temp_img.md +1 -0
  56. package/website_v2/styles/animations.css +7 -7
  57. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +0 -26
  58. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +0 -97
  59. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +0 -101
  60. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +0 -31
  61. package/.agent/.shared/ui-ux-pro-max/data/products.csv +0 -97
  62. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +0 -24
  63. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +0 -45
  64. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  65. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  66. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  67. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  68. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -51
  69. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  70. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  71. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +0 -54
  72. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  73. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  74. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  75. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  76. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +0 -59
  77. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +0 -58
  78. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
  79. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  80. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +0 -31
  81. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  82. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  83. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +0 -258
  84. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +0 -1067
  85. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +0 -106
  86. package/.agent/ARCHITECTURE.md +0 -288
  87. package/.agent/data/ambient/goals.json +0 -1
  88. package/.agent/data/puppeteer-sessions/undefined.json +0 -6
  89. package/.agent/data/weixin-media/2026-04-08/img_1775618677512.jpg +0 -0
  90. package/.agent/data/weixin-media/2026-04-08/img_1775619073340.jpg +0 -0
  91. package/.agent/data/weixin-media/2026-04-08/img_1775619097536.jpg +0 -0
  92. package/.agent/data/weixin-media/2026-04-08/img_1775619209388.jpg +0 -0
  93. package/.agent/memory/feedback/mnygjgox-ualjip.md +0 -11
  94. package/.agent/memory/feedback/mnzugpej-esdwsr.md +0 -9
  95. package/.agent/memory/feedback/mo2quxke-saxs56.md +0 -9
  96. package/.agent/memory/feedback/mo9l6nw9-sm1ye2.md +0 -13
  97. package/.agent/memory/feedback/mo9uxkb3-bbxz3x.md +0 -9
  98. package/.agent/memory/feedback/mo9wpqy0-ftsez9.md +0 -13
  99. package/.agent/memory/feedback/mo9x2ps4-p7huqq.md +0 -11
  100. package/.agent/memory/feedback/mo9x2uay-z7ndjn.md +0 -9
  101. package/.agent/memory/feedback/mo9x2y7d-9wecyx.md +0 -9
  102. package/.agent/memory/feedback/mo9x39q3-nn7myt.md +0 -9
  103. package/.agent/memory/feedback/mo9xfir9-4g8a8j.md +0 -9
  104. package/.agent/memory/feedback/mo9xfui8-ujqrc6.md +0 -9
  105. package/.agent/memory/feedback/mocnx1wx-qtxxlh.md +0 -9
  106. package/.agent/memory/project/mnqx54u5-loqtoe.md +0 -9
  107. package/.agent/memory/project/mnqx84cv-mx6dmd.md +0 -9
  108. package/.agent/memory/project/mnsacuyr-hgtk5n.md +0 -20
  109. package/.agent/memory/project/mnu5hy2x-bjsg7u.md +0 -9
  110. package/.agent/memory/project/mny28ot4-8qe9au.md +0 -9
  111. package/.agent/memory/project/mnztftxj-af82rh.md +0 -9
  112. package/.agent/memory/project/mo0y04d0-bmaefl.md +0 -9
  113. package/.agent/memory/project/mo2iztxb-3c7v81.md +0 -9
  114. package/.agent/memory/project/mo2ssa5x-tpi1p3.md +0 -9
  115. package/.agent/memory/reference/mnre3cww-penbo1.md +0 -9
  116. package/.agent/memory/reference/mns9wn48-luerua.md +0 -14
  117. package/.agent/memory/reference/mns9yz5c-thc2s0.md +0 -16
  118. package/.agent/memory/reference/mnsfy4um-910f1o.md +0 -23
  119. package/.agent/memory/reference/mnsg37dp-lmfj18.md +0 -32
  120. package/.agent/memory/reference/mnsll60q-0j911u.md +0 -36
  121. package/.agent/memory/reference/mnsmlb5y-nej31u.md +0 -16
  122. package/.agent/memory/reference/mnssle72-yrot96.md +0 -9
  123. package/.agent/memory/reference/mnygj8nb-bjthmc.md +0 -20
  124. package/.agent/memory/reference/mnzfvs4m-ufyg9a.md +0 -12
  125. package/.agent/memory/user/mnsfuon6-l416q1.md +0 -21
  126. package/.agent/memory/user/mnsg9kut-95m7rf.md +0 -20
  127. package/.agent/memory/user/mnu2eo1v-yy6fhe.md +0 -9
  128. package/.agent/memory/user/mnu2etuo-8u8jk8.md +0 -9
  129. package/.agent/memory/user/mnx0rk6g-gsznjj.md +0 -9
  130. package/.agent/memory/user/mnyf1riz-4yo5yz.md +0 -9
  131. package/.agent/memory/user/mnzuh4cw-zvee8w.md +0 -13
  132. package/.agent/memory/user/mnzvewyj-jl67cq.md +0 -9
  133. package/.agent/memory/user/mnzwh9xo-43ys3f.md +0 -9
  134. package/.agent/memory/user/mo0ycvpn-eebsxc.md +0 -9
  135. package/.agent/memory/user/mo2k8c8n-132r2u.md +0 -9
  136. package/.agent/memory/user/mo6y2dei-5cf537.md +0 -13
  137. package/.agent/memory/user/mo9xsdo6-8vylww.md +0 -13
  138. package/.agent/plugins/puppeteer-plugin/README.md +0 -147
  139. package/.agent/plugins/puppeteer-plugin/index.js +0 -1422
  140. package/.agent/plugins/puppeteer-plugin/package.json +0 -9
  141. package/.agent/rules/GEMINI.md +0 -273
  142. package/.agent/rules/allow-rule.md +0 -77
  143. package/.agent/rules/log-rule.md +0 -83
  144. package/.agent/rules/security-rule.md +0 -93
  145. package/.agent/scripts/auto_preview.py +0 -148
  146. package/.agent/scripts/checklist.py +0 -217
  147. package/.agent/scripts/session_manager.py +0 -120
  148. package/.agent/scripts/verify_all.py +0 -327
  149. package/.agent/skills/doc.md +0 -177
  150. package/.agent/skills/fk-poster/SKILL.md +0 -1129
  151. package/.agent/skills/fkbuilder/SKILL.md +0 -730
  152. package/.agent/skills/mmx-cli/SKILL.md +0 -431
  153. package/.agent/workflows/brainstorm.md +0 -113
  154. package/.agent/workflows/create.md +0 -59
  155. package/.agent/workflows/debug.md +0 -103
  156. package/.agent/workflows/deploy.md +0 -176
  157. package/.agent/workflows/enhance.md +0 -63
  158. package/.agent/workflows/orchestrate.md +0 -237
  159. package/.agent/workflows/plan.md +0 -89
  160. package/.agent/workflows/preview.md +0 -81
  161. package/.agent/workflows/simple-test.md +0 -42
  162. package/.agent/workflows/status.md +0 -86
  163. package/.agent/workflows/structured-orchestrate.md +0 -180
  164. package/.agent/workflows/test.md +0 -144
  165. package/.agent/workflows/ui-ux-pro-max.md +0 -296
@@ -1,730 +0,0 @@
1
- ---
2
- name: fkbuilder
3
- description: fkbuilder 视频构建技能。当用户说"创建视频"、"构建视频"、"使用 fkbuilder"、"视频配置"时调用此技能。
4
- allowed-tools: Read, Write, Edit, Glob, Grep, Bash
5
- license: MIT
6
- ---
7
-
8
- # fkbuilder Skill
9
-
10
- **fkbuilder** - Node.js 程序化视频创作库,通过代码 API 创建视频。
11
-
12
- ---
13
-
14
- ## 1. 快速开始
15
-
16
- ### 安装
17
- ```bash
18
- npm install fkbuilder
19
- ```
20
-
21
- ### 代码渲染
22
- ```javascript
23
- import { VideoBuilder } from 'fkbuilder';
24
-
25
- const builder = new VideoBuilder({
26
- width: 1280,
27
- height: 720,
28
- fps: 30,
29
- });
30
-
31
- const track = builder.createTrack({ zIndex: 1 });
32
-
33
- const scene = track.createScene({ duration: 3, startTime: 0 });
34
- scene.addBackground({ color: '#0f0f23' });
35
- scene.addText({
36
- text: 'Hello World',
37
- x: '50%', y: '50%',
38
- fontSize: 72, fontFamily: 'Arial',
39
- color: '#ffffff', textAlign: 'center', textBaseline: 'middle',
40
- duration: 3,
41
- });
42
-
43
- const outputPath = './output/video.mp4';
44
- await builder.render(outputPath);
45
- ```
46
-
47
- ---
48
-
49
- ## 2. VideoBuilder 主类
50
-
51
- ### 构造函数
52
- ```javascript
53
- const builder = new VideoBuilder({
54
- width: 1920, // 视频宽度,默认 1920
55
- height: 1080, // 视频高度,默认 1080
56
- fps: 30, // 帧率,默认 30
57
- });
58
- ```
59
-
60
- ### 核心方法
61
-
62
- | 方法 | 说明 |
63
- |------|------|
64
- | `createTrack(config)` | 创建轨道 |
65
- | `render(outputPath, options)` | 渲染并导出视频 |
66
- | `initialize()` | 预加载异步资源(SVG等) |
67
- | `destroy()` | 销毁构建器 |
68
-
69
- ### render 选项
70
- ```javascript
71
- await builder.render(outputPath, {
72
- parallel: false, // 是否并行渲染,默认 true
73
- usePipe: true, // 使用管道模式(不保存中间帧),默认 true
74
- });
75
- ```
76
-
77
- ---
78
-
79
- ## 3. Track 轨道
80
-
81
- ### 创建轨道
82
- ```javascript
83
- const track = builder.createTrack({
84
- zIndex: 1, // 层级顺序,数字越大越上层
85
- name: 'main', // 轨道名称(可选)
86
- });
87
- ```
88
-
89
- ### 轨道方法
90
-
91
- | 方法 | 说明 |
92
- |------|------|
93
- | `createScene(config)` | 创建场景 |
94
- | `addTransition(config)` | 添加转场 |
95
- | `getTotalDuration()` | 获取总时长 |
96
-
97
- ---
98
-
99
- ## 4. Scene 场景
100
-
101
- ### 创建场景
102
- ```javascript
103
- const scene = track.createScene({
104
- duration: 3, // 持续时间(秒)
105
- startTime: 0, // 开始时间(秒),可选
106
- });
107
- ```
108
-
109
- ### 场景方法
110
-
111
- | 方法 | 说明 |
112
- |------|------|
113
- | `addBackground(config)` | 添加背景 |
114
- | `addText(config)` | 添加文本 |
115
- | `addRect(config)` | 添加矩形 |
116
- | `addCircle(config)` | 添加圆形 |
117
- | `addImage(config)` | 添加图片 |
118
- | `addVideo(config)` | 添加视频 |
119
- | `addSVG(config)` | 添加 SVG |
120
- | `addAudio(config)` | 添加音频 |
121
- | `addSubtitles(config)` | 添加字幕 |
122
-
123
- ### 背景配置
124
- ```javascript
125
- scene.addBackground({ color: '#0f0f23' });
126
- // 或
127
- scene.addBackground({ image: './bg.png' });
128
- ```
129
-
130
- ---
131
-
132
- ## 5. 元素通用属性
133
-
134
- 所有元素都支持以下属性:
135
-
136
- | 属性 | 类型 | 默认值 | 说明 |
137
- |------|------|--------|------|
138
- | `x` | number/string | 0 | X坐标,支持 "50%" 百分比 |
139
- | `y` | number/string | 0 | Y坐标,支持 "50%" 百分比 |
140
- | `width` | number | - | 宽度 |
141
- | `height` | number | - | 高度 |
142
- | `opacity` | number | 1 | 透明度 (0-1) |
143
- | `rotation` | number | 0 | 旋转角度(度) |
144
- | `scaleX` | number | 1 | X方向缩放 |
145
- | `scaleY` | number | 1 | Y方向缩放 |
146
- | `anchor` | array | [0.5, 0.5] | 锚点 [x, y],0-1 |
147
- | `duration` | number | - | 持续时间(秒) |
148
- | `startTime` | number | 0 | 开始时间(秒),相对于场景 |
149
- | `animations` | array | [] | 预设动画数组 |
150
- | `onFrame` | function | - | 帧回调 |
151
-
152
- ### 坐标系统
153
- - 原点在画布左上角 (0, 0)
154
- - 使用 "50%" 可以相对于画布中心定位
155
- - anchor 影响旋转和缩放的中心点
156
-
157
- ---
158
-
159
- ## 6. 文本元素 (Text)
160
-
161
- ```javascript
162
- scene.addText({
163
- text: 'FOLIKO',
164
- x: '50%', y: '40%',
165
- fontSize: 120,
166
- fontFamily: 'Arial Black',
167
- fontWeight: 'bold',
168
- fontStyle: 'normal',
169
- color: '#ffffff',
170
- textAlign: 'center', // left/center/right
171
- textBaseline: 'middle', // top/middle/bottom
172
- lineHeight: 1.2,
173
- duration: 3,
174
- startTime: 0,
175
- animations: ['zoomIn'],
176
-
177
- // 文字阴影
178
- textShadow: true,
179
- textShadowColor: '#6366f1',
180
- textShadowBlur: 30,
181
- textShadowOffsetX: 2,
182
- textShadowOffsetY: 2,
183
-
184
- // 文字描边
185
- stroke: true,
186
- strokeColor: '#000000',
187
- strokeWidth: 2,
188
-
189
- // 渐变
190
- gradient: true,
191
- gradientColors: ['#FF6B6B', '#4ECDC4'],
192
- gradientDirection: 'horizontal',
193
-
194
- // 拆分动画
195
- split: 'letter', // letter/word/line
196
- splitDelay: 0.1,
197
- splitDuration: 0.3,
198
- });
199
- ```
200
-
201
- ---
202
-
203
- ## 7. 矩形元素 (Rect)
204
-
205
- ```javascript
206
- scene.addRect({
207
- x: '50%', y: '50%',
208
- width: 600,
209
- height: 60,
210
- bgcolor: '#1e1b4b',
211
- borderRadius: 10,
212
- borderWidth: 2,
213
- borderColor: '#22c55e',
214
- shadowBlur: 25,
215
- shadowColor: '#6366f1',
216
- shadowOffsetX: 0,
217
- shadowOffsetY: 0,
218
- opacity: 0.9,
219
- rotation: 0,
220
- anchor: [0.5, 0.5],
221
- duration: 3,
222
- startTime: 0,
223
- animations: ['fadeIn'],
224
- });
225
- ```
226
-
227
- ---
228
-
229
- ## 8. 圆形元素 (Circle)
230
-
231
- ```javascript
232
- scene.addCircle({
233
- x: '50%', y: '50%',
234
- radius: 100,
235
- color: '#ffffff',
236
- fill: true,
237
- borderWidth: 2,
238
- borderColor: '#8b5cf6',
239
- opacity: 0.8,
240
- rotation: 0,
241
- anchor: [0.5, 0.5],
242
- duration: 3,
243
- startTime: 0,
244
- animations: ['zoomIn'],
245
- });
246
- ```
247
-
248
- ---
249
-
250
- ## 9. 图片元素 (Image)
251
-
252
- ```javascript
253
- scene.addImage({
254
- src: './assets/logo.png',
255
- x: '50%', y: '50%',
256
- width: 200,
257
- height: 200,
258
- fit: 'cover', // cover/contain/fill/none
259
- borderRadius: 0,
260
- flipX: false,
261
- flipY: false,
262
- brightness: 1, // 0-2
263
- contrast: 1, // 0-2
264
- saturation: 1, // 0-2
265
- duration: 3,
266
- startTime: 0,
267
- animations: ['fadeIn'],
268
- });
269
- ```
270
-
271
- ---
272
-
273
- ## 10. 视频元素 (Video)
274
-
275
- ```javascript
276
- scene.addVideo({
277
- src: './assets/clip.mp4',
278
- x: 0, y: 0,
279
- width: 1920,
280
- height: 1080,
281
- cutFrom: 0, // 裁剪起始(秒)
282
- cutTo: undefined, // 裁剪结束(秒)
283
- speedFactor: 1, // 播放速度
284
- loop: false,
285
- mute: true,
286
- volume: 1,
287
- duration: 10,
288
- startTime: 0,
289
- });
290
- ```
291
-
292
- ---
293
-
294
- ## 11. SVG 元素
295
-
296
- ```javascript
297
- scene.addSVG({
298
- src: './assets/icon.svg',
299
- x: '50%', y: '50%',
300
- width: 100,
301
- height: 100,
302
- fit: 'contain',
303
- preserveAspectRatio: true,
304
- enableSVGAnimations: true,
305
- duration: 3,
306
- startTime: 0,
307
- animations: ['zoomIn'],
308
- });
309
- ```
310
-
311
- ---
312
-
313
- ## 12. 音频元素 (Audio)
314
-
315
- ```javascript
316
- scene.addAudio({
317
- src: './assets/music.mp3',
318
- volume: 0.8,
319
- fadeIn: 2, // 淡入时长(秒)
320
- fadeOut: 2, // 淡出时长(秒)
321
- cutFrom: 0,
322
- cutTo: undefined,
323
- loop: false,
324
- startTime: 0,
325
- duration: 30,
326
- });
327
- ```
328
-
329
- ---
330
-
331
- ## 13. 歌词字幕 (LRC)
332
-
333
- 从 LRC 文件加载歌词字幕,支持多时间标签格式 `[03:06.90][02:33.64]歌词内容`。
334
-
335
- ```javascript
336
- // 方式1:从 LRC 文件加载(推荐)
337
- scene.addLRC('./assets/lyrics.lrc', {
338
- x: '50%', y: '85%',
339
- fontSize: 48,
340
- fontFamily: 'Microsoft YaHei',
341
- textColor: '#ffffff',
342
- textAlign: 'center',
343
- split: 'line',
344
- splitDuration: 0.3,
345
- });
346
-
347
- // 方式2:使用 addSubtitles 加载 LRC
348
- scene.addSubtitles({
349
- src: './assets/lyrics.lrc',
350
- x: '50%', y: '85%',
351
- fontSize: 48,
352
- fontFamily: 'Microsoft YaHei',
353
- textColor: '#ffffff',
354
- textAlign: 'center',
355
- });
356
- ```
357
-
358
- ### LRC 字幕选项
359
-
360
- | 选项 | 类型 | 默认值 | 说明 |
361
- |------|------|--------|------|
362
- | `x` | number/string | '50%' | X坐标 |
363
- | `y` | number/string | '85%' | Y坐标 |
364
- | `fontSize` | number | 48 | 字体大小 |
365
- | `fontFamily` | string | 'PatuaOne' | 字体名称 |
366
- | `textColor` | string | '#ffffff' | 文字颜色 |
367
- | `textAlign` | string | 'center' | 对齐方式 |
368
- | `split` | string | 'line' | 拆分类型: letter/word/line |
369
- | `splitDuration` | number | 0.3 | 拆分动画时长 |
370
- | `maxLength` | number | 20 | 每行最大字符数 |
371
-
372
- ---
373
-
374
- ## 14. 示波器元素 (Oscilloscope)
375
-
376
- 音频可视化波形显示,支持多种样式。
377
-
378
- ```javascript
379
- scene.addOscilloscope({
380
- audioPath: './assets/music.mp3', // 音频文件路径
381
- x: '50%', y: '50%',
382
- width: 400,
383
- height: 200,
384
- waveColor: '#00ff00', // 波形颜色
385
- backgroundColor: 'rgba(0, 0, 0, 0.3)', // 背景颜色
386
- lineWidth: 2, // 线条宽度
387
- smoothing: 0.3, // 平滑度 (0-1)
388
- mirror: true, // 是否镜像显示
389
- style: 'line', // 样式类型
390
- sensitivity: 1.0, // 灵敏度
391
- cutFrom: 0, // 裁剪起始(秒)
392
- cutTo: undefined, // 裁剪结束(秒)
393
- windowSize: 0.1, // 显示窗口大小(秒)
394
- scrollSpeed: 1.0, // 滚动速度
395
- duration: 30, // 持续时间
396
- startTime: 0,
397
- });
398
- ```
399
-
400
- ### 示波器样式
401
-
402
- | 样式 | 说明 |
403
- |------|------|
404
- | `line` | 线条波形 |
405
- | `bars` | 柱状图 |
406
- | `circle` | 圆形波形 |
407
- | `spectrum` | 频谱 |
408
- | `particles` | 粒子效果 |
409
- | `waterfall` | 瀑布图 |
410
- | `spiral` | 螺旋形 |
411
- | `ripple` | 涟漪效果 |
412
- | `grid` | 网格 |
413
- | `explosion` | 爆炸效果 |
414
- | `blob` | 变形效果 |
415
- | `rotating3d` | 3D旋转 |
416
- | `trail` | 轨迹效果 |
417
- | `weave` | 编织效果 |
418
- | `lightwave` | 光波效果 |
419
- | `particleflow` | 粒子流 |
420
-
421
- ---
422
-
423
- ## 15. 字幕元素 (Subtitles)
424
-
425
- ```javascript
426
- scene.addSubtitles({
427
- text: 'Hello World', // 直接文本内容
428
- x: '50%', y: '85%',
429
- fontSize: 72,
430
- fontFamily: 'PatuaOne',
431
- textColor: '#ffffff',
432
- position: 'center',
433
- textAlign: 'center',
434
- split: 'letter',
435
- splitDelay: 0.1,
436
- splitDuration: 0.3,
437
- maxLength: 20,
438
- duration: 5,
439
- startTime: 0,
440
- });
441
- ```
442
-
443
- ---
444
-
445
- ## 16. 预设动画
446
-
447
- 使用字符串数组形式:
448
-
449
- ```javascript
450
- animations: ['zoomIn']
451
- animations: ['fadeInUp']
452
- animations: ['bigIn', 'bigOut'] // 多个动画组合
453
- ```
454
-
455
- ### 淡入/淡出
456
-
457
- | 名称 | 效果 |
458
- |------|------|
459
- | `fadeIn` | opacity 0→1 |
460
- | `fadeOut` | opacity 1→0(在结束前1秒自动应用) |
461
- | `fadeInUp` | opacity 0 + Y偏移50 → opacity 1 |
462
- | `fadeInDown` | opacity 0 + Y偏移-50 → opacity 1 |
463
- | `fadeOutUp` | opacity 1 → opacity 0 + Y偏移-50 |
464
- | `fadeOutDown` | opacity 1 → opacity 0 + Y偏移50 |
465
-
466
- ### 缩放
467
-
468
- | 名称 | 效果 |
469
- |------|------|
470
- | `zoomIn` | scale 0→1 |
471
- | `zoomOut` | scale 1→0 |
472
- | `bigIn` | scale 2+opacity 0 → scale 1+opacity 1 |
473
- | `bigOut` | scale 1+opacity 1 → scale 2+opacity 0 |
474
- | `zoomInLeft` | 左上角缩放进入 |
475
- | `zoomInFade` | scale 0.5+opacity 0 → scale 1+opacity 1 |
476
- | `zoomRotateIn` | 缩放+旋转组合 |
477
-
478
- ### 旋转
479
-
480
- | 名称 | 效果 |
481
- |------|------|
482
- | `rotateIn` | rotation -180→0 |
483
- | `rotateOut` | rotation 0→180 |
484
- | `rotateInLeft` | 左旋+淡入 |
485
- | `rotateInRight` | 右旋+淡入 |
486
-
487
- ### 滑动
488
-
489
- | 名称 | 效果 |
490
- |------|------|
491
- | `slideInTop` | 从顶部滑入 |
492
- | `slideInBottom` | 从底部滑入 |
493
- | `slideInLeft` | 从左侧滑入 |
494
- | `slideInRight` | 从右侧滑入 |
495
-
496
- ### 弹跳
497
-
498
- | 名称 | 效果 |
499
- |------|------|
500
- | `bounceIn` | 弹跳进入 |
501
- | `bounceOut` | 弹跳出 |
502
- | `bounceInUp` | 向上弹跳 |
503
- | `bounceInLeft` | 向左弹跳 |
504
-
505
- ### 其他
506
-
507
- | 名称 | 效果 |
508
- |------|------|
509
- | `flipInX` | X轴翻转淡入 |
510
- | `flipInY` | Y轴翻转淡入 |
511
- | `pulse` | 脉动缩放 |
512
- | `shake` | 水平抖动 |
513
- | `flash` | 闪烁 |
514
- | `swing` | 摇摆 |
515
-
516
- ---
517
-
518
- ## 17. 转场效果 (Transition)
519
-
520
- ### 基本用法
521
- ```javascript
522
- // 不指定 startTime,系统自动推断转场位置
523
- track.addTransition({ name: 'CrossZoom', duration: 0.5 });
524
- track.addTransition({ name: 'Dreamy', duration: 0.5 });
525
- track.addTransition({ name: 'fade', duration: 0.5 });
526
-
527
- // 指定 startTime(可选)
528
- track.addTransition({ name: 'CrossZoom', duration: 0.5, startTime: 2.5 });
529
- ```
530
-
531
- ### 转场行为要点
532
-
533
- **重要**:转场在 GL 层面预渲染 fromFrame 和 toFrame,然后混合。
534
-
535
- - `fromScene` 元素的 endTime 会被调整为 `transitionStartTime`(转场开始时间)
536
- - `toScene` 的 startTime 会被覆盖为 `transitionEndTime`(转场结束时间)
537
- - 转场期间(transitionStartTime ~ transitionEndTime),两个场景元素都不在主时间轴显示,由预渲染帧负责视觉混合
538
-
539
- ### 转场位置计算
540
-
541
- 当不指定 `startTime` 时:
542
- - 转场居中在两个场景的交界处
543
- - `transitionStartTime = sceneEndTime - duration/2`
544
- - `transitionEndTime = sceneEndTime + duration/2`
545
-
546
- 例如:场景1 (0-3s) + 转场 (0.5s) + 场景2 (3-6s)
547
- - 转场1: 2.75-3.25s
548
- - 场景1 元素 endTime = 2.75
549
- - 场景2 元素 startTime = 3.25
550
-
551
- ### 可用转场
552
-
553
- | 转场 | 说明 |
554
- |------|------|
555
- | `CrossZoom` | 缩放交叉 |
556
- | `Dreamy` | 梦幻效果 |
557
- | `GridFlip` | 网格翻转 |
558
- | `CircleOpen` | 圆形展开 |
559
- | `fade` | 淡入淡出 |
560
- | `wipeRight` | 向右扫出 |
561
- | `wipeLeft` | 向左扫出 |
562
- | `wipeUp` | 向上扫出 |
563
- | `wipeDown` | 向下扫出 |
564
- | `Swirl` | 漩涡效果 |
565
- | `ZoomInCircles` | 圆形缩放 |
566
- | `Mosaic` | 马赛克 |
567
-
568
- ---
569
-
570
- ## 18. onFrame 回调
571
-
572
- ```javascript
573
- scene.addCircle({
574
- x: '50%', y: '50%',
575
- radius: 100,
576
- duration: 5,
577
- onFrame: (el, ev, item) => {
578
- // el: 元素实例
579
- // ev: 事件对象 { time, delta, count }
580
- // item: Paper.js 渲染项
581
-
582
- // 旋转
583
- item.rotation = ev.time * 30;
584
-
585
- // 脉冲缩放
586
- const scale = 1 + Math.sin(ev.time * 4) * 0.1;
587
- item.scaleX = scale;
588
- item.scaleY = scale;
589
-
590
- // 闪烁
591
- item.opacity = 0.3 + Math.sin(ev.time * 5) * 0.4;
592
- },
593
- });
594
- ```
595
-
596
- ---
597
-
598
- ## 19. 重要细节
599
-
600
- ### 1. 元素可见性判断
601
-
602
- 元素使用 `<` 而非 `<=` 判断结束:
603
- ```javascript
604
- isActiveAtTime(time) {
605
- return this.visible && time >= this.startTime && time < this.endTime;
606
- }
607
- ```
608
- 这意味着元素在 `endTime` 时刻不再可见。
609
-
610
- ### 2. 元素时间系统
611
-
612
- - `scene.startTime`: 场景开始时间(绝对时间)
613
- - `element.startTime`: 元素相对于场景的开始时间
614
- - `element.duration`: 元素的持续时间
615
- - `element.endTime`: 元素的结束时间 = sceneStartTime + elementStartTime + duration
616
-
617
- ### 3. 百分比坐标
618
-
619
- 坐标支持 "50%" 形式,表示画布中心:
620
- ```javascript
621
- x: '50%', y: '50%' // 画布中心
622
- x: '0%', y: '0%' // 左上角
623
- x: '100%', y: '100%' // 右下角
624
- ```
625
-
626
- ### 4. Scene.startTime 的影响
627
-
628
- - 如果不设置 `scene.startTime`,系统会基于前一个场景的结束时间自动推断
629
- - 当添加转场时,`toScene.startTime` 会被强制覆盖为 `transitionEndTime`
630
-
631
- ### 5. 音频需要特殊处理
632
-
633
- 音频元素通常应该添加到独立的音频轨道,或者在场景外添加:
634
- ```javascript
635
- // 方式1:全局音频
636
- composition.addAudio({ src: './music.mp3', startTime: 0, volume: 0.5 });
637
-
638
- // 方式2:通过 builder 的 audioTracks
639
- builder.audioTracks = [{ src: './music.mp3', startTime: 0, volume: 0.5 }];
640
- ```
641
-
642
- ### 6. SVG 异步加载
643
-
644
- SVG 元素需要异步加载,如果渲染时 SVG 还未加载完成,会导致问题。使用 `initialize()` 预加载:
645
- ```javascript
646
- await builder.initialize(); // 预加载所有资源
647
- await builder.render(outputPath);
648
- ```
649
-
650
- ### 7. 字体注册
651
-
652
- 如果使用自定义字体,需要先注册:
653
- ```javascript
654
- import { registerFont } from 'fkbuilder';
655
- registerFont('./fonts/CustomFont.ttf', 'CustomFont');
656
- ```
657
-
658
- ---
659
-
660
- ## 20. 完整示例
661
-
662
- ### 促销视频
663
- ```javascript
664
- import { VideoBuilder } from '../src/index.js';
665
- import path from 'path';
666
-
667
- async function createPromoVideo() {
668
- const builder = new VideoBuilder({
669
- width: 1280,
670
- height: 720,
671
- fps: 30,
672
- });
673
-
674
- const track = builder.createTrack({ zIndex: 1 });
675
-
676
- // 场景 1: 标题 (0s - 3s)
677
- const scene1 = track.createScene({ duration: 3, startTime: 0 });
678
- scene1.addBackground({ color: '#0f0f23' });
679
- scene1.addText({
680
- text: 'FOLIKO',
681
- x: '50%', y: '40%',
682
- fontSize: 120, fontFamily: 'Arial Black', fontWeight: 'bold',
683
- color: '#ffffff', textAlign: 'center', textBaseline: 'middle',
684
- duration: 3,
685
- animations: ['zoomIn'],
686
- textShadow: true, textShadowColor: '#6366f1', textShadowBlur: 30,
687
- });
688
-
689
- // 场景 2: 特性展示 (3s - 6s)
690
- const scene2 = track.createScene({ duration: 3, startTime: 3 });
691
- scene2.addBackground({ color: '#1a1a2e' });
692
- scene2.addText({
693
- text: '40+ 插件',
694
- x: '50%', y: '30%',
695
- fontSize: 48, fontFamily: 'Arial', fontWeight: 'bold',
696
- color: '#8b5cf6', textAlign: 'center',
697
- duration: 3, animations: ['fadeInUp'],
698
- });
699
-
700
- // 转场(不指定 startTime,系统自动推断)
701
- track.addTransition({ name: 'CrossZoom', duration: 0.5 });
702
- track.addTransition({ name: 'Dreamy', duration: 0.5 });
703
-
704
- const outputPath = './output/promo.mp4';
705
- const result = await builder.render(outputPath, {
706
- parallel: false,
707
- usePipe: true,
708
- });
709
-
710
- console.log(`渲染完成: ${result}`);
711
- }
712
-
713
- createPromoVideo().catch(console.error);
714
- ```
715
-
716
- ---
717
-
718
- ## 21. 目录结构
719
-
720
- ```
721
- project/
722
- ├── output/
723
- │ └── video.mp4
724
- ├── examples/
725
- │ └── render-video.mjs
726
- └── assets/
727
- ├── music.mp3
728
- ├── image.png
729
- └── icon.svg
730
- ```